diff --git a/.mvn/wrapper/maven-wrapper.jar b/.mvn/wrapper/maven-wrapper.jar
deleted file mode 100644
index e69de29..0000000
diff --git a/.mvn/wrapper/maven-wrapper.properties b/.mvn/wrapper/maven-wrapper.properties
deleted file mode 100644
index c315043..0000000
--- a/.mvn/wrapper/maven-wrapper.properties
+++ /dev/null
@@ -1 +0,0 @@
-distributionUrl=https://repo1.maven.org/maven2/org/apache/maven/apache-maven/3.5.0/apache-maven-3.5.0-bin.zip
diff --git a/json b/json
new file mode 100644
index 0000000..c50d5ac
--- /dev/null
+++ b/json
@@ -0,0 +1 @@
+[{"id":"7","projectObjectId":1,"name":"wbs2","code":"wbs_code2","parentId":0,"indexNumber":1,"cost":null,"w2ui":{"children":[{"id":"8","projectObjectId":1,"name":"wbs3","code":"wbs_code3","parentId":7,"indexNumber":1,"cost":null,"w2ui":{"children":[{"id":"9","projectObjectId":1,"name":"wbs4","code":"wbs_code4","parentId":8,"indexNumber":1,"cost":null,"w2ui":{"children":[{"id":"_14","projectObjectId":1,"name":"act_name4","code":null,"parentId":null,"indexNumber":null,"cost":5,"w2ui":null,"type":"act"}]},"type":"wbs"},{"id":"10","projectObjectId":1,"name":"wbs5","code":"wbs_code5","parentId":8,"indexNumber":1,"cost":null,"w2ui":{"children":[{"id":"_15","projectObjectId":1,"name":"act_name5","code":null,"parentId":null,"indexNumber":null,"cost":5,"w2ui":null,"type":"act"}]},"type":"wbs"},{"id":"_12","projectObjectId":1,"name":"act_name2","code":null,"parentId":null,"indexNumber":null,"cost":5,"w2ui":null,"type":"act"},{"id":"_13","projectObjectId":1,"name":"act_name3","code":null,"parentId":null,"indexNumber":null,"cost":5,"w2ui":null,"type":"act"}]},"type":"wbs"},{"id":"_11","projectObjectId":1,"name":"act_name1","code":null,"parentId":null,"indexNumber":null,"cost":5,"w2ui":null,"type":"act"}]},"type":"wbs"},{"id":"11","projectObjectId":1,"name":"wbs6","code":"wbs_code6","parentId":0,"indexNumber":1,"cost":null,"w2ui":null,"type":"wbs"}]
diff --git a/pom.xml b/pom.xml
index bcaea09..e466d4d 100644
--- a/pom.xml
+++ b/pom.xml
@@ -4,11 +4,11 @@
4.0.0
com.ibcon
- factage_web
+ sproject
0.0.1-SNAPSHOT
- jar
+ war
- factage_web
+ sproject
@@ -21,7 +21,7 @@
UTF-8
UTF-8
- com.ibcon.factage_web.FactageWebApplication
+ com.ibcon.sproject.SprojectWebApplication
1.8
@@ -109,6 +109,44 @@
1.16.16
provided
+
+
+
+ org.jdom
+ jdom2
+ 2.0.6
+
+
+
+
+ bsh
+ bsh
+ 2.0b4
+
+
+
+ joda-time
+ joda-time
+ 2.9.9
+
+
+
+ org.jadira.usertype
+ usertype.core
+ 5.0.0.GA
+
+
+
+
+ com.fasterxml.jackson.jaxrs
+ jackson-jaxrs-json-provider
+ 2.2.1
+
+
+
+ com.fasterxml.jackson.datatype
+ jackson-datatype-joda
+
diff --git a/src/main/java/com/ibcon/factage_web/bootstrap/SpringJpaBootstrap.java b/src/main/java/com/ibcon/factage_web/bootstrap/SpringJpaBootstrap.java
deleted file mode 100644
index a92e579..0000000
--- a/src/main/java/com/ibcon/factage_web/bootstrap/SpringJpaBootstrap.java
+++ /dev/null
@@ -1,148 +0,0 @@
-package com.ibcon.factage_web.bootstrap;
-
-import com.ibcon.factage_web.domain.Project;
-import com.ibcon.factage_web.domain.Role;
-import com.ibcon.factage_web.domain.User;
-import com.ibcon.factage_web.services.crud.project.ProjectService;
-import com.ibcon.factage_web.services.crud.user.UserServiceCrud;
-import com.ibcon.factage_web.services.crud.role.RoleService;
-import org.apache.log4j.Logger;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.context.ApplicationListener;
-import org.springframework.context.event.ContextRefreshedEvent;
-import org.springframework.stereotype.Component;
-
-import java.util.Date;
-import java.time.LocalDate;
-import java.util.List;
-
-@Component
-public class SpringJpaBootstrap implements ApplicationListener {
- private UserServiceCrud userServiceCrud;
- private RoleService roleService;
- private ProjectService projectService;
-
- private Logger log = Logger.getLogger(SpringJpaBootstrap.class);
-
- @Autowired
- public void setUserServiceCrud(UserServiceCrud userServiceCrud) {
- this.userServiceCrud = userServiceCrud;
- }
-
- @Autowired
- public void setRoleService(RoleService roleService) {
- this.roleService = roleService;
- }
-
- @Autowired
- public void setProjectService(ProjectService projectService) {
- this.projectService = projectService;
- }
-
- @Override
- public void onApplicationEvent(ContextRefreshedEvent event) {
-// loadUsers();
-// loadRoles();
-// assignUsersToUserRole();
-// assignUsersToAdminRole();
-// loadProjects();
-// assignProjectsToRole();
- }
-
- private void loadUsers() {
- User user1 = new User();
- user1.setName("user");
- user1.setPassword("user");
- user1.setExpirationDate(new Date());
- user1.setActive(true);
- userServiceCrud.saveOrUpdate(user1);
-
- User user2 = new User();
- user2.setName("admin");
- user2.setPassword("admin");
- user2.setExpirationDate(new Date());
- user2.setActive(true);
- userServiceCrud.saveOrUpdate(user2);
- }
-
- private void loadRoles() {
- Role role = new Role();
- role.setName("USER");
- roleService.saveOrUpdate(role);
- log.info("Saved role" + role.getName());
- Role adminRole = new Role();
- adminRole.setName("ADMIN");
- roleService.saveOrUpdate(adminRole);
- log.info("Saved role" + adminRole.getName());
- }
-
- private void loadProjects() {
- Project project1 = new Project();
- project1.setProjectObjectId(1);
- project1.setPrimaveraId("prim");
- project1.setProjectName("First Project");
- project1.setProjectDbName("3SWEB");
- project1.setProjectWbsId(1);
- project1.setProjectCode("code");
- project1.setConfigId(1);
- project1.setIndexNumber(1);
- projectService.saveOrUpdate(project1);
-
- Project project2 = new Project();
- project2.setProjectObjectId(2);
- project2.setPrimaveraId("prim2");
- project2.setProjectName("Second Project");
- project2.setProjectDbName("3SWEB");
- project2.setProjectWbsId(2);
- project2.setProjectCode("code2");
- project2.setConfigId(2);
- project2.setIndexNumber(2);
- projectService.saveOrUpdate(project2);
- }
-
- private void assignUsersToUserRole() {
- List roles = (List) roleService.listAll();
- List users = (List) userServiceCrud.listAll();
-
- roles.forEach(role -> {
- if (role.getName().equalsIgnoreCase("USER")) {
- users.forEach(user -> {
- if (user.getName().equals("user")) {
- user.addRole(role);
- userServiceCrud.saveOrUpdate(user);
- }
- });
- }
- });
- }
-
- private void assignUsersToAdminRole() {
- List roles = (List) roleService.listAll();
- List users = (List) userServiceCrud.listAll();
-
- roles.forEach(role -> {
- if (role.getName().equalsIgnoreCase("ADMIN")) {
- users.forEach(user -> {
- if (user.getName().equals("admin")) {
- user.addRole(role);
- userServiceCrud.saveOrUpdate(user);
- }
- });
- }
- });
- }
-
- private void assignProjectsToRole() {
- List roles = (List) roleService.listAll();
- List projects = (List) projectService.listAll();
-
-
- Project project1 = projectService.findByProjectObjectId(1);
- project1.addRole(roles.get(0));
- projectService.saveOrUpdate(project1);
-
- Project project2 = projectService.findByProjectObjectId(2);
- project2.addRole(roles.get(2));
- projectService.saveOrUpdate(project2);
- }
-}
diff --git a/src/main/java/com/ibcon/factage_web/controllers/ProjectController.java b/src/main/java/com/ibcon/factage_web/controllers/ProjectController.java
deleted file mode 100644
index b0dda95..0000000
--- a/src/main/java/com/ibcon/factage_web/controllers/ProjectController.java
+++ /dev/null
@@ -1,55 +0,0 @@
-package com.ibcon.factage_web.controllers;
-
-import com.ibcon.factage_web.domain.Project;
-import com.ibcon.factage_web.services.crud.project.ProjectService;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.stereotype.Controller;
-import org.springframework.ui.Model;
-import org.springframework.web.bind.annotation.PathVariable;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RequestMethod;
-
-@Controller
-public class ProjectController {
- ProjectService projectService;
-
- @Autowired
- public void setProjectService(ProjectService projectService) {
- this.projectService = projectService;
- }
-
- @RequestMapping(value = "/projects", method = RequestMethod.GET)
- public String listAllProjects(Model model) {
- model.addAttribute("projects", projectService.listAll());
- return "projects";
- }
- @RequestMapping("project/new")
- public String create(Model model) {
- model.addAttribute("project", new Project());
- return "projectform";
- }
-
- @RequestMapping(value = "project", method = RequestMethod.POST)
- public String save(Project project) {
- projectService.saveOrUpdate(project);
- return "redirect:/project/" + project.getId();
- }
-
- @RequestMapping("project/{id}")
- public String showUser(@PathVariable Integer id, Model model) {
- model.addAttribute("project", projectService.getById(id));
- return "projectshow";
- }
-
- @RequestMapping("project/edit/{id}")
- public String edit(@PathVariable Integer id, Model model) {
- model.addAttribute("project", projectService.getById(id));
- return "projectform";
- }
-
- @RequestMapping("project/delete/{id}")
- public String delete(@PathVariable Integer id) {
- projectService.delete(id);
- return "redirect:/projects";
- }
-}
diff --git a/src/main/java/com/ibcon/factage_web/creators/UserFormModelCreator.java b/src/main/java/com/ibcon/factage_web/creators/UserFormModelCreator.java
deleted file mode 100644
index 6e6d0da..0000000
--- a/src/main/java/com/ibcon/factage_web/creators/UserFormModelCreator.java
+++ /dev/null
@@ -1,8 +0,0 @@
-package com.ibcon.factage_web.creators;
-
-import com.ibcon.factage_web.domain.User;
-import com.ibcon.factage_web.services.crud.role.RoleService;
-
-public interface UserFormModelCreator {
- User createUser(RoleService roleService);
-}
diff --git a/src/main/java/com/ibcon/factage_web/services/crud/project/ProjectService.java b/src/main/java/com/ibcon/factage_web/services/crud/project/ProjectService.java
deleted file mode 100644
index e2826ca..0000000
--- a/src/main/java/com/ibcon/factage_web/services/crud/project/ProjectService.java
+++ /dev/null
@@ -1,8 +0,0 @@
-package com.ibcon.factage_web.services.crud.project;
-
-import com.ibcon.factage_web.domain.Project;
-import com.ibcon.factage_web.services.crud.CrudService;
-
-public interface ProjectService extends CrudService {
- Project findByProjectObjectId(Integer projectObjectId);
-}
diff --git a/src/main/java/com/ibcon/factage_web/services/crud/role/RoleService.java b/src/main/java/com/ibcon/factage_web/services/crud/role/RoleService.java
deleted file mode 100644
index da51513..0000000
--- a/src/main/java/com/ibcon/factage_web/services/crud/role/RoleService.java
+++ /dev/null
@@ -1,7 +0,0 @@
-package com.ibcon.factage_web.services.crud.role;
-
-import com.ibcon.factage_web.domain.Role;
-import com.ibcon.factage_web.services.crud.CrudService;
-
-public interface RoleService extends CrudService {
-}
diff --git a/src/main/java/com/ibcon/factage_web/services/crud/user/UserServiceCrud.java b/src/main/java/com/ibcon/factage_web/services/crud/user/UserServiceCrud.java
deleted file mode 100644
index 924c7b5..0000000
--- a/src/main/java/com/ibcon/factage_web/services/crud/user/UserServiceCrud.java
+++ /dev/null
@@ -1,8 +0,0 @@
-package com.ibcon.factage_web.services.crud.user;
-
-import com.ibcon.factage_web.domain.User;
-import com.ibcon.factage_web.services.crud.CrudService;
-
-public interface UserServiceCrud extends CrudService {
- User findByUserName(String username);
-}
diff --git a/src/main/java/com/ibcon/factage_web/FactageWebApplication.java b/src/main/java/com/ibcon/sproject/SprojectWebApplication.java
similarity index 60%
rename from src/main/java/com/ibcon/factage_web/FactageWebApplication.java
rename to src/main/java/com/ibcon/sproject/SprojectWebApplication.java
index f1337d5..f07c989 100644
--- a/src/main/java/com/ibcon/factage_web/FactageWebApplication.java
+++ b/src/main/java/com/ibcon/sproject/SprojectWebApplication.java
@@ -1,12 +1,12 @@
-package com.ibcon.factage_web;
+package com.ibcon.sproject;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
-public class FactageWebApplication {
+public class SprojectWebApplication {
public static void main(String[] args) {
- SpringApplication.run(FactageWebApplication.class, args);
+ SpringApplication.run(SprojectWebApplication.class, args);
}
}
diff --git a/src/main/java/com/ibcon/factage_web/configuration/CommonBeanConfig.java b/src/main/java/com/ibcon/sproject/configuration/CommonBeanConfig.java
similarity index 51%
rename from src/main/java/com/ibcon/factage_web/configuration/CommonBeanConfig.java
rename to src/main/java/com/ibcon/sproject/configuration/CommonBeanConfig.java
index 8afb993..0bb0e1c 100644
--- a/src/main/java/com/ibcon/factage_web/configuration/CommonBeanConfig.java
+++ b/src/main/java/com/ibcon/sproject/configuration/CommonBeanConfig.java
@@ -1,9 +1,9 @@
-package com.ibcon.factage_web.configuration;
+package com.ibcon.sproject.configuration;
-import com.ibcon.factage_web.services.crud.role.RoleService;
-import com.ibcon.factage_web.services.crud.role.RoleServiceImpl;
-import com.ibcon.factage_web.services.crud.user.UserServiceCrud;
-import com.ibcon.factage_web.services.crud.user.UserServiceCrudImp;
+import com.ibcon.sproject.services.crud.role.RoleService;
+import com.ibcon.sproject.services.crud.role.RoleServiceImpl;
+import com.ibcon.sproject.services.crud.user.UserServiceCrud;
+import com.ibcon.sproject.services.crud.user.UserServiceCrudImp;
import org.jasypt.util.password.StrongPasswordEncryptor;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@@ -21,8 +21,4 @@ public RoleService roleService() {
return new RoleServiceImpl();
}
- @Bean
- public UserServiceCrud userServiceCrud() {
- return new UserServiceCrudImp();
- }
}
diff --git a/src/main/java/com/ibcon/factage_web/configuration/SecurityConfiguration.java b/src/main/java/com/ibcon/sproject/configuration/SecurityConfiguration.java
similarity index 92%
rename from src/main/java/com/ibcon/factage_web/configuration/SecurityConfiguration.java
rename to src/main/java/com/ibcon/sproject/configuration/SecurityConfiguration.java
index bed7b47..e78ed29 100644
--- a/src/main/java/com/ibcon/factage_web/configuration/SecurityConfiguration.java
+++ b/src/main/java/com/ibcon/sproject/configuration/SecurityConfiguration.java
@@ -1,4 +1,4 @@
-package com.ibcon.factage_web.configuration;
+package com.ibcon.sproject.configuration;
import org.jasypt.springsecurity3.authentication.encoding.PasswordEncoder;
import org.jasypt.util.password.StrongPasswordEncryptor;
@@ -8,7 +8,6 @@
import org.springframework.context.annotation.Configuration;
import org.springframework.security.authentication.AuthenticationProvider;
import org.springframework.security.authentication.dao.DaoAuthenticationProvider;
-import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
import org.springframework.security.core.userdetails.UserDetailsService;
@@ -43,6 +42,7 @@ public DaoAuthenticationProvider daoAuthenticationProvider(PasswordEncoder passw
@Override
protected void configure(HttpSecurity http) throws Exception {
+ //TODO access to resources?
http.authorizeRequests().antMatchers("/").permitAll()
.antMatchers("/user*").hasAuthority("ADMIN")
.anyRequest().authenticated()
@@ -52,7 +52,7 @@ protected void configure(HttpSecurity http) throws Exception {
.logout().permitAll();
// http.authorizeRequests().antMatchers("/users/**").hasAuthority("ADMIN");
-// http.csrf().disable();
+ http.csrf().disable();
http.headers().frameOptions().disable();
}
diff --git a/src/main/java/com/ibcon/sproject/controllers/EntityCreatorController.java b/src/main/java/com/ibcon/sproject/controllers/EntityCreatorController.java
new file mode 100644
index 0000000..4f74725
--- /dev/null
+++ b/src/main/java/com/ibcon/sproject/controllers/EntityCreatorController.java
@@ -0,0 +1,157 @@
+package com.ibcon.sproject.controllers;
+
+import com.ibcon.sproject.controllers.mainview.dto.Activity;
+import com.ibcon.sproject.controllers.mainview.dto.Id;
+import com.ibcon.sproject.controllers.mainview.dto.WBS;
+import com.ibcon.sproject.domain.Link;
+import com.ibcon.sproject.domain.Project;
+import com.ibcon.sproject.repositories.LinkRepository;
+import com.ibcon.sproject.services.crud.activity.ActivityService;
+import com.ibcon.sproject.services.crud.project.ProjectService;
+import com.ibcon.sproject.services.crud.role.RoleService;
+import com.ibcon.sproject.services.crud.user.UserServiceCrud;
+import com.ibcon.sproject.services.crud.wbs.WBSService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.ResponseEntity;
+import org.springframework.validation.Errors;
+import org.springframework.web.bind.annotation.*;
+
+import javax.validation.Valid;
+import java.util.List;
+import java.util.stream.Collectors;
+
+@RestController
+public class EntityCreatorController {
+ private UserServiceCrud userServiceCrud;
+ private RoleService roleService;
+ private ProjectService projectService;
+ private WBSService wbsService;
+ private ActivityService activityService;
+ private LinkRepository linkRepository;
+
+ @Autowired
+ public void setUserServiceCrud(UserServiceCrud userServiceCrud) {
+ this.userServiceCrud = userServiceCrud;
+ }
+
+ @Autowired
+ public void setRoleService(RoleService roleService) {
+ this.roleService = roleService;
+ }
+
+ @Autowired
+ public void setProjectService(ProjectService projectService) {
+ this.projectService = projectService;
+ }
+
+ @Autowired
+ public void setWbsService(WBSService wbsService) {
+ this.wbsService = wbsService;
+ }
+
+ @Autowired
+ public void setActivityService(ActivityService activityService) {
+ this.activityService = activityService;
+ }
+
+ @Autowired
+ public void setLinkRepository(LinkRepository linkRepository) {
+ this.linkRepository = linkRepository;
+ }
+
+ @PostMapping("/add_wbs")
+ public ResponseEntity> createWBS(@Valid @RequestBody WBS wbs, Errors errors) {
+ String result = "";
+
+ if (errors.hasErrors()) {
+
+ result.join(errors.getAllErrors()
+ .stream().map(x -> x.getDefaultMessage())
+ .collect(Collectors.joining(",")));
+
+ return ResponseEntity.badRequest().body(result);
+
+ }
+
+ com.ibcon.sproject.domain.WBS wbsEntity = new com.ibcon.sproject.domain.WBS();
+ //TODO лишнее?
+ Project project = projectService.getById(wbs.getProjectId());
+
+ if (wbs.getId() != null) {
+ wbsEntity = wbsService.getById(wbs.getId());
+ }
+ wbsEntity.setName(wbs.getName());
+ wbsEntity.setCode(wbs.getCode());
+ wbsEntity.setProject(project);
+ wbsEntity.setProjectObjectId(project.getProjectObjectId());
+ wbsEntity.setParentId(0);
+ wbsEntity.setIndexNumber(1);
+
+ result = String.valueOf(wbsService.saveOrUpdate(wbsEntity).getId());
+
+ return ResponseEntity.ok(result);
+ }
+
+ @PostMapping("/delete_wbs")
+ public ResponseEntity> deleteWBS(@Valid @RequestBody Id id, Errors errors) {
+ id.getIdList().forEach(wbsService::delete);
+// wbsService.delete(id.getId());
+ return ResponseEntity.ok("");
+ }
+
+ //TODO USE JSON
+ //TODO какой маппинг?
+ @GetMapping(value = "/edit_wbs", produces = "application/json")
+ public ResponseEntity> editWBS(@RequestParam("id") String str) {
+ com.ibcon.sproject.domain.WBS wbs = wbsService.getById(Integer.valueOf(str));
+
+ WBS wbsResult = new WBS();
+ wbsResult.setId(Integer.valueOf(str));
+ wbsResult.setProjectId(wbs.getProject().getId());
+ wbsResult.setName(wbs.getName());
+ wbsResult.setCode(wbs.getCode());
+ return ResponseEntity.ok(wbsResult);
+ }
+
+ //TODO not finished
+ @PostMapping("/add_act")
+ public ResponseEntity> createAct(@Valid @RequestBody Activity activity, Errors errors) {
+ String result = "";
+
+ List link = linkRepository.findAllByActivity_Id(activity.getActId());
+
+ if (errors.hasErrors()) {
+
+ result.join(errors.getAllErrors()
+ .stream().map(x -> x.getDefaultMessage())
+ .collect(Collectors.joining(",")));
+
+ return ResponseEntity.badRequest().body(result);
+
+ }
+
+ com.ibcon.sproject.domain.Activity activityEntity= new com.ibcon.sproject.domain.Activity();
+ com.ibcon.sproject.domain.WBS wbs = wbsService.getById(activity.getWbsId());
+
+ if (activity.getActId() != null) {
+ activityEntity = activityService.getById(activity.getActId());
+ }
+ activityEntity.setActivityName(activity.getName());
+// activityEntity.setCost(activity.getCost());
+ activityEntity.setWbs(wbs);
+ activityEntity.setProjectObjectId(wbs.getProject().getProjectObjectId());
+ activityEntity.setProjectId(wbs.getProject().getId());
+
+ //TODO populate
+ activityEntity.setActivityId("act_id");
+ activityEntity.setActivityName(activity.getName());
+ activityEntity.setTypeId(1);
+ activityEntity.setStatusId(1);
+ activityEntity.setPercentageCompletion(0);
+ activityEntity.setIsCritical(false);
+
+ result = String.valueOf(activityService.saveOrUpdate(activityEntity).getId());
+
+ return ResponseEntity.ok(result);
+ }
+}
diff --git a/src/main/java/com/ibcon/factage_web/controllers/IndexController.java b/src/main/java/com/ibcon/sproject/controllers/IndexController.java
similarity index 84%
rename from src/main/java/com/ibcon/factage_web/controllers/IndexController.java
rename to src/main/java/com/ibcon/sproject/controllers/IndexController.java
index 496e4c0..ff0a169 100644
--- a/src/main/java/com/ibcon/factage_web/controllers/IndexController.java
+++ b/src/main/java/com/ibcon/sproject/controllers/IndexController.java
@@ -1,4 +1,4 @@
-package com.ibcon.factage_web.controllers;
+package com.ibcon.sproject.controllers;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
diff --git a/src/main/java/com/ibcon/sproject/controllers/MainTableController.java b/src/main/java/com/ibcon/sproject/controllers/MainTableController.java
new file mode 100644
index 0000000..7736551
--- /dev/null
+++ b/src/main/java/com/ibcon/sproject/controllers/MainTableController.java
@@ -0,0 +1,172 @@
+package com.ibcon.sproject.controllers;
+
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.databind.SerializationFeature;
+import com.fasterxml.jackson.datatype.joda.JodaModule;
+import com.ibcon.sproject.converters.smettojson.SmetJsonTree;
+import com.ibcon.sproject.converters.smettojson.SmetTypeJson;
+import com.ibcon.sproject.converters.wbstojson.WBSJSONTree;
+import com.ibcon.sproject.converters.wbstojson.WBSJson;
+import com.ibcon.sproject.domain.Link;
+import com.ibcon.sproject.domain.Project;
+import com.ibcon.sproject.domain.WBS;
+import com.ibcon.sproject.domain.mixins.WBSInnerObjectsMixin;
+import com.ibcon.sproject.domain.smet.EstimateSmet;
+import com.ibcon.sproject.services.crud.activity.ActivityService;
+import com.ibcon.sproject.services.crud.estimatesmet.EstimateSmetService;
+import com.ibcon.sproject.services.crud.link.LinkService;
+import com.ibcon.sproject.services.crud.project.ProjectService;
+import com.ibcon.sproject.services.crud.role.RoleService;
+import com.ibcon.sproject.services.crud.user.UserServiceCrud;
+import com.ibcon.sproject.services.crud.wbs.WBSService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.ResponseEntity;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.ArrayList;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+
+@RestController
+public class MainTableController {
+ private UserServiceCrud userServiceCrud;
+ private RoleService roleService;
+ private ProjectService projectService;
+ private WBSService wbsService;
+ private ActivityService activityService;
+ private EstimateSmetService estimateSmetService;
+ private LinkService linkService;
+
+ private WBSJSONTree wbsJsonTree;
+ private SmetJsonTree smetJsonTree;
+
+ @Autowired
+ public void setUserServiceCrud(UserServiceCrud userServiceCrud) {
+ this.userServiceCrud = userServiceCrud;
+ }
+
+ @Autowired
+ public void setRoleService(RoleService roleService) {
+ this.roleService = roleService;
+ }
+
+ @Autowired
+ public void setProjectService(ProjectService projectService) {
+ this.projectService = projectService;
+ }
+
+ @Autowired
+ public void setWbsService(WBSService wbsService) {
+ this.wbsService = wbsService;
+ }
+
+ @Autowired
+ public void setActivityService(ActivityService activityService) {
+ this.activityService = activityService;
+ }
+
+ @Autowired
+ public void setEstimateSmetService(EstimateSmetService estimateSmetService) {
+ this.estimateSmetService = estimateSmetService;
+ }
+
+ @Autowired
+ public void setLinkService(LinkService linkService) {
+ this.linkService = linkService;
+ }
+
+ @Autowired
+ public void setWBSJSONTree(WBSJSONTree wbsJsonTree) {
+ this.wbsJsonTree = wbsJsonTree;
+ }
+
+ @Autowired
+ public void setSmetJsonTree(SmetJsonTree smetJsonTree) {
+ this.smetJsonTree = smetJsonTree;
+ }
+
+ @GetMapping(value = "/get_project", produces = "application/json")
+ public ResponseEntity> editWBS(@RequestParam("id") String id) throws JsonProcessingException {
+ List wbsList = wbsService.findByProjectId(Integer.valueOf(id));
+ ObjectMapper mapper = new ObjectMapper();
+ String result = mapper.writeValueAsString(wbsList);
+
+ return ResponseEntity.ok(result);
+ }
+
+ @RequestMapping(value = "/get_wbs_list", produces = "application/json")
+ public ResponseEntity> getWbsList(@RequestParam("id") String id) throws JsonProcessingException {
+ List wbsJsonList = wbsJsonTree.convertProjectWBSList(Integer.valueOf(id));
+
+ ObjectMapper mapper = new ObjectMapper();
+
+ mapper.registerModule(new JodaModule());
+ mapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);
+ mapper.addMixIn(Object.class, WBSInnerObjectsMixin.class);
+
+ String result = mapper.writeValueAsString(wbsJsonList);
+
+ return ResponseEntity.ok(result);
+ }
+
+ @RequestMapping(value = "/get_smet", produces = "application/json")
+ public ResponseEntity> getSmet(@RequestParam("id") String id) throws JsonProcessingException {
+ //TODO replace hardcoded values with tests
+ List smetTypeJsonList = new ArrayList<>();
+ smetTypeJsonList.add(smetJsonTree.convertSmetToJson(Integer.valueOf(id)));
+
+ ObjectMapper mapper = new ObjectMapper();
+
+ mapper.registerModule(new JodaModule());
+ mapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);
+
+ String result = mapper.writeValueAsString(smetTypeJsonList);
+
+ return ResponseEntity.ok(result);
+ }
+
+ @RequestMapping(value = "/get_smet_by_project", produces = "application/json")
+ public ResponseEntity> getSmetByProject(@RequestParam("id") String id) throws JsonProcessingException {
+ Project project = projectService.getById(Integer.valueOf(id));
+
+ if (project == null) {
+ //TODO
+ }
+
+ Set smets = new HashSet<>();
+ Set wbsSet = project.getWbsSet();
+ if (wbsSet != null) {
+ wbsSet.forEach(wbs -> smets.addAll(estimateSmetService.findByWbsSetId(wbs.getId())));
+ }
+
+ if (smets == null) {
+ //TODO
+ }
+
+ List smetTypeJsonList = new ArrayList<>();
+ smets.forEach(smet -> smetTypeJsonList.add(smetJsonTree.convertSmetToJson(smet.getId())));
+
+ ObjectMapper mapper = new ObjectMapper();
+
+ mapper.registerModule(new JodaModule());
+ mapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);
+
+ String result = mapper.writeValueAsString(smetTypeJsonList);
+
+ return ResponseEntity.ok(result);
+ }
+
+ @GetMapping(value = "/links/{activityId}/{smrId}", produces = "application/json")
+ public ResponseEntity> getLink(@PathVariable("activityId") String activityId,
+ @PathVariable("smrId") String smrId) throws JsonProcessingException {
+ Link link = linkService.findByActivityIdAndSmrId(Integer.valueOf(activityId), Integer.valueOf(smrId));
+
+ ObjectMapper mapper = new ObjectMapper();
+
+ String result = mapper.writeValueAsString(link);
+
+ return ResponseEntity.ok(result);
+ }
+}
diff --git a/src/main/java/com/ibcon/sproject/controllers/ProjectController.java b/src/main/java/com/ibcon/sproject/controllers/ProjectController.java
new file mode 100644
index 0000000..8ac36ac
--- /dev/null
+++ b/src/main/java/com/ibcon/sproject/controllers/ProjectController.java
@@ -0,0 +1,78 @@
+package com.ibcon.sproject.controllers;
+
+import com.ibcon.sproject.controllers.mainview.dto.ProjectDTO;
+import com.ibcon.sproject.creators.project.EmptyProjectFormCreatorImpl;
+import com.ibcon.sproject.creators.project.ProjectFormModelCreator;
+import com.ibcon.sproject.creators.project.ProjectFormModelCreatorImpl;
+import com.ibcon.sproject.domain.Project;
+import com.ibcon.sproject.domain.Role;
+import com.ibcon.sproject.services.crud.project.ProjectService;
+import com.ibcon.sproject.services.crud.role.RoleService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.Model;
+import org.springframework.web.bind.annotation.ModelAttribute;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
+
+import java.util.ArrayList;
+import java.util.List;
+
+@Controller
+public class ProjectController {
+ ProjectService projectService;
+ RoleService roleService;
+
+ @Autowired
+ public void setProjectService(ProjectService projectService) {
+ this.projectService = projectService;
+ }
+
+ @Autowired
+ public void setRoleService(RoleService roleService) {
+ this.roleService = roleService;
+ }
+
+ @RequestMapping(value = "/projects", method = RequestMethod.GET)
+ public String listAllProjects(Model model) {
+ //TODO где должно располагаться преобразование?
+ List projects = (List) projectService.listAll();
+ List projectDTOs = new ArrayList<>();
+ projects.forEach(project -> projectDTOs.add(new ProjectDTO(project)));
+ model.addAttribute("projects", projectDTOs);
+ return "projects";
+ }
+ @RequestMapping("project/new")
+ public String create(Model model) {
+ ProjectFormModelCreator emptyProjectFormCreator = new EmptyProjectFormCreatorImpl(roleService.listAll());
+ model.addAttribute("project", emptyProjectFormCreator);
+ return "projectform";
+ }
+
+ @RequestMapping(value = "project", method = RequestMethod.POST)
+ public String save(@ModelAttribute("project") ProjectFormModelCreatorImpl projectFormModelCreator) {
+ Project project = projectFormModelCreator.createProject(roleService);
+ projectService.saveOrUpdate(project);
+ return "redirect:/project/" + project.getId();
+ }
+
+ @RequestMapping("project/{id}")
+ public String showUser(@PathVariable Integer id, Model model) {
+ model.addAttribute("project", projectService.getById(id));
+ return "projectshow";
+ }
+
+ @RequestMapping("project/edit/{id}")
+ public String edit(@PathVariable Integer id, Model model) {
+ ProjectFormModelCreator ProjectFormCreator = new ProjectFormModelCreatorImpl(projectService.getById(id), (List) roleService.listAll());
+ model.addAttribute("project", ProjectFormCreator);
+ return "projectform";
+ }
+
+ @RequestMapping("project/delete/{id}")
+ public String delete(@PathVariable Integer id) {
+ projectService.delete(id);
+ return "redirect:/projects";
+ }
+}
diff --git a/src/main/java/com/ibcon/factage_web/controllers/UserController.java b/src/main/java/com/ibcon/sproject/controllers/UserController.java
similarity index 70%
rename from src/main/java/com/ibcon/factage_web/controllers/UserController.java
rename to src/main/java/com/ibcon/sproject/controllers/UserController.java
index d4a8b73..ff27550 100644
--- a/src/main/java/com/ibcon/factage_web/controllers/UserController.java
+++ b/src/main/java/com/ibcon/sproject/controllers/UserController.java
@@ -1,9 +1,12 @@
-package com.ibcon.factage_web.controllers;
+package com.ibcon.sproject.controllers;
-import com.ibcon.factage_web.creators.UserFormModelCreatorImpl;
-import com.ibcon.factage_web.domain.User;
-import com.ibcon.factage_web.services.crud.role.RoleService;
-import com.ibcon.factage_web.services.crud.user.UserServiceCrud;
+import com.ibcon.sproject.creators.user.EmptyUserFormCreatorImpl;
+import com.ibcon.sproject.creators.user.UserFormModelCreator;
+import com.ibcon.sproject.creators.user.UserFormModelCreatorImpl;
+import com.ibcon.sproject.domain.Role;
+import com.ibcon.sproject.domain.User;
+import com.ibcon.sproject.services.crud.role.RoleService;
+import com.ibcon.sproject.services.crud.user.UserServiceCrud;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.propertyeditors.CustomDateEditor;
import org.springframework.stereotype.Controller;
@@ -13,6 +16,7 @@
import java.text.SimpleDateFormat;
import java.util.Date;
+import java.util.List;
@Controller
public class UserController {
@@ -36,17 +40,15 @@ protected void initBinder(WebDataBinder binder) {
}
@RequestMapping("user/new")
public String create(Model model) {
- UserFormModelCreatorImpl userFormModelCreator = new UserFormModelCreatorImpl(roleService.listAll());
- userFormModelCreator.getUser().setExpirationDate(new Date());
- model.addAttribute("createUserFormModel", userFormModelCreator);
+ EmptyUserFormCreatorImpl emptyUserFormCreatorImpl = new EmptyUserFormCreatorImpl(roleService.listAll());
+ model.addAttribute("createUserFormModel", emptyUserFormCreatorImpl);
return "userform";
}
@RequestMapping(value = "user", method = RequestMethod.POST)
- public String save(@ModelAttribute("createUserFormModel") UserFormModelCreatorImpl userFormModelCreatorImpl) {
- User user = userFormModelCreatorImpl.createUser(roleService);
- userServiceCrud.saveOrUpdate(user);
- return "redirect:/user/" + user.getId();
+ public String save(@ModelAttribute("createUserFormModel") UserFormModelCreatorImpl userFormModelCreator) {
+ userServiceCrud.saveOrUpdate(userFormModelCreator);
+ return "redirect:/user/" + userFormModelCreator.getUser().getId();
}
@RequestMapping("user/{id}")
@@ -63,7 +65,8 @@ public String listAllUsers(Model model) {
@RequestMapping("user/edit/{id}")
public String edit(@PathVariable Integer id, Model model) {
- model.addAttribute("user", userServiceCrud.getById(id));
+ UserFormModelCreatorImpl userFormModelCreator = new UserFormModelCreatorImpl(userServiceCrud.getById(id), (List) roleService.listAll());
+ model.addAttribute("createUserFormModel", userFormModelCreator);
return "userform";
}
diff --git a/src/main/java/com/ibcon/sproject/controllers/mainview/MainViewController.java b/src/main/java/com/ibcon/sproject/controllers/mainview/MainViewController.java
new file mode 100644
index 0000000..e7a004f
--- /dev/null
+++ b/src/main/java/com/ibcon/sproject/controllers/mainview/MainViewController.java
@@ -0,0 +1,18 @@
+package com.ibcon.sproject.controllers.mainview;
+
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.Model;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
+
+@Controller
+public class MainViewController {
+
+ @RequestMapping(value = "/project_view/{id}", method = RequestMethod.GET)
+ public String viewProject(@PathVariable Integer id, Model model) {
+ //TODO проверить списки с activities для каждой wbs
+// model.addAttribute("wbsList", wbsService.findByProjectId(id));
+ return "project_view";
+ }
+}
\ No newline at end of file
diff --git a/src/main/java/com/ibcon/sproject/controllers/mainview/dto/Activity.java b/src/main/java/com/ibcon/sproject/controllers/mainview/dto/Activity.java
new file mode 100644
index 0000000..2f945d7
--- /dev/null
+++ b/src/main/java/com/ibcon/sproject/controllers/mainview/dto/Activity.java
@@ -0,0 +1,12 @@
+package com.ibcon.sproject.controllers.mainview.dto;
+
+import lombok.Data;
+
+import java.math.BigDecimal;
+
+public @Data class Activity {
+ private Integer actId;
+ private Integer wbsId;
+ private String name;
+ private BigDecimal cost;
+}
diff --git a/src/main/java/com/ibcon/sproject/controllers/mainview/dto/Id.java b/src/main/java/com/ibcon/sproject/controllers/mainview/dto/Id.java
new file mode 100644
index 0000000..cce9253
--- /dev/null
+++ b/src/main/java/com/ibcon/sproject/controllers/mainview/dto/Id.java
@@ -0,0 +1,9 @@
+package com.ibcon.sproject.controllers.mainview.dto;
+
+import lombok.Data;
+
+import java.util.List;
+
+public @Data class Id {
+ private List idList;
+}
diff --git a/src/main/java/com/ibcon/sproject/controllers/mainview/dto/ProjectDTO.java b/src/main/java/com/ibcon/sproject/controllers/mainview/dto/ProjectDTO.java
new file mode 100644
index 0000000..03c1c1f
--- /dev/null
+++ b/src/main/java/com/ibcon/sproject/controllers/mainview/dto/ProjectDTO.java
@@ -0,0 +1,41 @@
+package com.ibcon.sproject.controllers.mainview.dto;
+
+import com.ibcon.sproject.domain.*;
+import lombok.Data;
+import org.springframework.security.core.authority.SimpleGrantedAuthority;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Set;
+
+public @Data class ProjectDTO {
+ private Integer id;
+ private Integer projectObjectId;
+ private String primaveraId;
+ private String projectName;
+ private String projectDbName;
+ private Integer projectWbsId;
+ private String projectCode;
+ private Integer configId;
+ private Integer indexNumber;
+ private Set roles;
+ private Set wbsSet;
+
+ private List authorities = new ArrayList<>();
+
+ public ProjectDTO(Project project) {
+ this.id = project.getId();
+ this.projectObjectId = project.getProjectObjectId();
+ this.primaveraId = project.getPrimaveraId();
+ this.projectName = project.getProjectName();
+ this.projectDbName = project.getProjectDbName();
+ this.projectWbsId = project.getProjectWbsId();
+ this.projectCode = project.getProjectCode();
+ this.configId = project.getConfigId();
+ this.indexNumber = project.getIndexNumber();
+ this.roles = project.getRoles();
+ this.wbsSet = project.getWbsSet();
+
+ roles.forEach(role -> authorities.add(new SimpleGrantedAuthority(role.getName())));
+ }
+}
diff --git a/src/main/java/com/ibcon/sproject/controllers/mainview/dto/WBS.java b/src/main/java/com/ibcon/sproject/controllers/mainview/dto/WBS.java
new file mode 100644
index 0000000..10f3398
--- /dev/null
+++ b/src/main/java/com/ibcon/sproject/controllers/mainview/dto/WBS.java
@@ -0,0 +1,11 @@
+package com.ibcon.sproject.controllers.mainview.dto;
+
+import lombok.Data;
+
+public @Data
+class WBS {
+ Integer id;
+ Integer projectId;
+ String name;
+ String code;
+}
diff --git a/src/main/java/com/ibcon/sproject/controllers/mainview/dto/WBSId.java b/src/main/java/com/ibcon/sproject/controllers/mainview/dto/WBSId.java
new file mode 100644
index 0000000..9a52fb1
--- /dev/null
+++ b/src/main/java/com/ibcon/sproject/controllers/mainview/dto/WBSId.java
@@ -0,0 +1,7 @@
+package com.ibcon.sproject.controllers.mainview.dto;
+
+import lombok.Data;
+
+public @Data class WBSId {
+ String id;
+}
diff --git a/src/main/java/com/ibcon/sproject/controllers/mainview/dto/WBSRow.java b/src/main/java/com/ibcon/sproject/controllers/mainview/dto/WBSRow.java
new file mode 100644
index 0000000..3150338
--- /dev/null
+++ b/src/main/java/com/ibcon/sproject/controllers/mainview/dto/WBSRow.java
@@ -0,0 +1,9 @@
+package com.ibcon.sproject.controllers.mainview.dto;
+
+import lombok.Data;
+
+public @Data class WBSRow {
+ Integer id;
+ String name;
+ String code;
+}
diff --git a/src/main/java/com/ibcon/factage_web/converters/UserToUserDetails.java b/src/main/java/com/ibcon/sproject/converters/UserToUserDetails.java
similarity index 85%
rename from src/main/java/com/ibcon/factage_web/converters/UserToUserDetails.java
rename to src/main/java/com/ibcon/sproject/converters/UserToUserDetails.java
index 8843f14..ad2b28a 100644
--- a/src/main/java/com/ibcon/factage_web/converters/UserToUserDetails.java
+++ b/src/main/java/com/ibcon/sproject/converters/UserToUserDetails.java
@@ -1,7 +1,7 @@
-package com.ibcon.factage_web.converters;
+package com.ibcon.sproject.converters;
-import com.ibcon.factage_web.domain.User;
-import com.ibcon.factage_web.services.crud.user.UserDetailsImpl;
+import com.ibcon.sproject.domain.User;
+import com.ibcon.sproject.services.crud.user.UserDetailsImpl;
import org.springframework.core.convert.converter.Converter;
import org.springframework.security.core.authority.SimpleGrantedAuthority;
import org.springframework.security.core.userdetails.UserDetails;
@@ -15,12 +15,12 @@
public class UserToUserDetails implements Converter {
@Override
public UserDetails convert(User user) {
+ //TODO bean?
UserDetailsImpl userDetails = new UserDetailsImpl();
if (user != null) {
userDetails.setUsername(user.getName());
userDetails.setPassword(user.getEncryptedPassword());
- //TODO работает?
userDetails.setActive(user.isActive());
Collection authorities = new ArrayList<>();
user.getRoles().forEach(role -> {
diff --git a/src/main/java/com/ibcon/sproject/converters/smettojson/SmetJsonTree.java b/src/main/java/com/ibcon/sproject/converters/smettojson/SmetJsonTree.java
new file mode 100644
index 0000000..840f633
--- /dev/null
+++ b/src/main/java/com/ibcon/sproject/converters/smettojson/SmetJsonTree.java
@@ -0,0 +1,124 @@
+package com.ibcon.sproject.converters.smettojson;
+
+import com.ibcon.sproject.domain.smet.*;
+import com.ibcon.sproject.services.crud.estimatechapter.EstimateChapterService;
+import com.ibcon.sproject.services.crud.estimateheader.EstimateHeaderService;
+import com.ibcon.sproject.services.crud.estimateregion.EstimateRegionService;
+import com.ibcon.sproject.services.crud.estimatesmet.EstimateSmetService;
+import com.ibcon.sproject.services.crud.estimatesmr.EstimateSmrService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.annotation.ComponentScan;
+import org.springframework.stereotype.Component;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+@ComponentScan
+@Component
+public class SmetJsonTree {
+ private EstimateSmetService estimateSmetService;
+ private EstimateRegionService estimateRegionService;
+ private EstimateChapterService estimateChapterService;
+ private EstimateHeaderService estimateHeaderService;
+ private EstimateSmrService estimateSmrService;
+
+ private EstimateSmet smet = new EstimateSmet();
+ private EstimateRegion region = new EstimateRegion();
+ private List chapters = new ArrayList<>();
+ private Map> headers = new HashMap<>();
+ private List smrs = new ArrayList<>();
+
+ @Autowired
+ public void setEstimateSmetService(EstimateSmetService estimateSmetService) {
+ this.estimateSmetService = estimateSmetService;
+ }
+
+ @Autowired
+ public void setEstimateRegionService(EstimateRegionService estimateRegionService) {
+ this.estimateRegionService = estimateRegionService;
+ }
+
+ @Autowired
+ public void setEstimateChapterService(EstimateChapterService estimateChapterService) {
+ this.estimateChapterService = estimateChapterService;
+ }
+
+ @Autowired
+ public void setEstimateHeaderService(EstimateHeaderService estimateHeaderService) {
+ this.estimateHeaderService = estimateHeaderService;
+ }
+
+ @Autowired
+ public void setEstimateSmrService(EstimateSmrService estimateSmrService) {
+ this.estimateSmrService = estimateSmrService;
+ }
+
+ //TODO refactor
+ public SmetTypeJson convertSmetToJson(Integer smetId) {
+ smet = estimateSmetService.getById(smetId);
+ if (smet.getRegion() == null) {
+ region = new EstimateRegion();
+ } else {
+ region = estimateRegionService.getById(smet.getRegion().getId());
+ }
+ chapters = estimateChapterService.findAllBySmetId(smetId);
+ List headerList = estimateHeaderService.findAllBySmetId(smetId);
+ smrs = estimateSmrService.findAllBySmetId(smetId);
+
+ headers.put(null, new ArrayList<>());
+ headerList.forEach(header -> {
+ if (header.getChapter() == null) {
+ headers.get(null).add(header);
+ } else if (headers.containsKey(header.getChapter().getId())) {
+ headers.get(header.getChapter().getId()).add(header);
+ } else {
+ List list = new ArrayList<>();
+ list.add(header);
+ headers.put(header.getChapter().getId(), list);
+ }
+ });
+
+ SmetTypeJson root = new SmetTypeJson(smet);
+ if (!chapters.isEmpty()) {
+ chapters.forEach(chapter -> {
+ SmetTypeJson chapterJson = new SmetTypeJson(chapter);
+ root.addChildren(chapterJson);
+ if (headers.containsKey(chapter.getId())) {
+ headers.get(chapter.getId()).forEach(header -> {
+ SmetTypeJson headerJson = new SmetTypeJson(header);
+ chapterJson.addChildren(headerJson);
+ List headerAndChapterSmrs = estimateSmrService.
+ findAllByChapterIdAndHeaderId(chapter.getId(), header.getId());
+ headerAndChapterSmrs.forEach(smr -> headerJson.addChildren(new SmetTypeJson(smr)));
+ });
+ headers.remove(chapter.getId());
+ } else {
+ List chapterSmrs = estimateSmrService.findAllByChapterId(chapter.getId());
+ chapterSmrs.forEach(smr -> chapterJson.addChildren(new SmetTypeJson(smr)));
+ }
+ });
+// } else {
+// if (!headers.isEmpty()) {
+// headers.get(null).forEach(header -> {
+// SmetTypeJson headerJson = new SmetTypeJson(header);
+// root.addChildren(headerJson);
+// List headerSmrs = estimateSmrService.findAllByHeaderId(header.getId());
+// headerSmrs.forEach(smr -> headerJson.addChildren(new SmetTypeJson(smr)));
+// });
+// }
+ }
+ if (!headers.isEmpty()) {
+ headers.get(null).forEach(header -> {
+ SmetTypeJson headerJson = new SmetTypeJson(header);
+ root.addChildren(headerJson);
+ List headerSmrs = estimateSmrService.findAllByHeaderId(header.getId());
+ headerSmrs.forEach(smr -> headerJson.addChildren(new SmetTypeJson(smr)));
+ });
+ }
+
+
+ return root;
+ }
+}
diff --git a/src/main/java/com/ibcon/sproject/converters/smettojson/SmetTypeJson.java b/src/main/java/com/ibcon/sproject/converters/smettojson/SmetTypeJson.java
new file mode 100644
index 0000000..483e85b
--- /dev/null
+++ b/src/main/java/com/ibcon/sproject/converters/smettojson/SmetTypeJson.java
@@ -0,0 +1,125 @@
+package com.ibcon.sproject.converters.smettojson;
+
+import com.ibcon.sproject.domain.smet.EstimateChapter;
+import com.ibcon.sproject.domain.smet.EstimateHeader;
+import com.ibcon.sproject.domain.smet.EstimateSmet;
+import com.ibcon.sproject.domain.smet.EstimateSmr;
+import lombok.Data;
+import org.joda.time.DateTime;
+
+import java.math.BigDecimal;
+
+public @Data class SmetTypeJson {
+ private String id;
+ private String parentId;
+ private String type;
+ private String name;
+ private String num;
+ private Integer isVirtual;
+ private String comment;
+ private String status;
+ private DateTime dateCreated;
+ private DateTime dataChanged;
+ private String userCreated;
+ private String userChanged;
+ private String region;
+ private String code;
+ private String units;
+ private BigDecimal quantity;
+ private BigDecimal oz;
+ private BigDecimal em;
+ private BigDecimal zm;
+ private BigDecimal mt;
+ private BigDecimal pz;
+ private BigDecimal nr;
+ private BigDecimal sp;
+ private BigDecimal sum;
+ private BigDecimal tzr;
+ private BigDecimal tzm;
+ private BigDecimal ozCost;
+ private BigDecimal emCost;
+ private BigDecimal zmCost;
+ private BigDecimal mtCost;
+ private BigDecimal pzCost;
+ private BigDecimal nrCost;
+ private BigDecimal spCost;
+ private BigDecimal tzrCost;
+ private BigDecimal tzmCost;
+ private W2uiChildren w2ui;
+
+ public SmetTypeJson(EstimateSmr smr) {
+ this.id = "r" + smr.getId();
+ this.type = "smr";
+ this.name = smr.getName();
+ this.num = String.valueOf(smr.getNum());
+ this.units = smr.getUnits();
+ this.quantity = smr.getQuantity();
+ this.oz = smr.getOz();
+ this.em = smr.getEm();
+ this.zm = smr.getZm();
+ this.mt = smr.getMt();
+ this.pz = smr.getPz();
+ this.nr = smr.getNr();
+ this.sp = smr.getSp();
+ this.sum = smr.getSum();
+ this.tzr = smr.getTzr();
+ this.tzm = smr.getTzm();
+ this.ozCost = smr.getOzCost();
+ this.emCost = smr.getEmCost();
+ this.zmCost = smr.getZmCost();
+ this.mtCost = smr.getMtCost();
+ this.pzCost = smr.getPzCost();
+ this.nrCost = smr.getNrCost();
+ this.spCost = smr.getSpCost();
+ this.tzrCost = smr.getTzrCost();
+ this.tzmCost = smr.getTzmCost();
+ }
+
+ public SmetTypeJson(EstimateChapter chapter) {
+ this.id = "c" + chapter.getId();
+ this.type = "chapter";
+ this.name = chapter.getName();
+ this.num = chapter.getNum();
+ }
+
+ public SmetTypeJson(EstimateHeader header) {
+ this.id = "h" + header.getId();
+ this.type = "header";
+ this.name = header.getName();
+ this.num = header.getNum();
+ }
+
+ public SmetTypeJson(EstimateSmet smet) {
+ this.id = "s" + smet.getId();
+ this.type = "smet";
+ this.name = smet.getName();
+ this.num = smet.getNum();
+ this.isVirtual = smet.getIsVirtual();
+ this.comment = smet.getComment();
+ this.status = smet.getStatus();
+ this.dateCreated = smet.getDateCreate();
+ this.dataChanged = smet.getDateChange();
+ this.userCreated = smet.getUserCreated().getName();
+ if (smet.getUserChanged() != null) {
+ this.userChanged = smet.getUserChanged().getName();
+ }
+ this.oz = smet.getOz();
+ this.em = smet.getEm();
+ this.zm = smet.getZm();
+ this.mt = smet.getMt();
+ this.pz = smet.getPz();
+ this.nr = smet.getNr();
+ this.sp = smet.getSp();
+ this.sum = smet.getSum();
+ this.tzr = smet.getTzr();
+ this.tzm = smet.getTzm();
+ }
+
+ public void addChildren(SmetTypeJson smetTypeJson) {
+ smetTypeJson.setParentId(this.id);
+ if (this.w2ui == null) {
+ this.w2ui = new W2uiChildren();
+ }
+ w2ui.addChildren(smetTypeJson);
+ }
+}
diff --git a/src/main/java/com/ibcon/sproject/converters/smettojson/W2uiChildren.java b/src/main/java/com/ibcon/sproject/converters/smettojson/W2uiChildren.java
new file mode 100644
index 0000000..da978b1
--- /dev/null
+++ b/src/main/java/com/ibcon/sproject/converters/smettojson/W2uiChildren.java
@@ -0,0 +1,18 @@
+package com.ibcon.sproject.converters.smettojson;
+
+import lombok.Data;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public @Data class W2uiChildren {
+ private List children = new ArrayList<>();
+
+ public W2uiChildren() {
+ }
+
+
+ public void addChildren(SmetTypeJson smetTypeJson) {
+ children.add(smetTypeJson);
+ }
+}
diff --git a/src/main/java/com/ibcon/sproject/converters/wbstojson/W2uiChildren.java b/src/main/java/com/ibcon/sproject/converters/wbstojson/W2uiChildren.java
new file mode 100644
index 0000000..d539d93
--- /dev/null
+++ b/src/main/java/com/ibcon/sproject/converters/wbstojson/W2uiChildren.java
@@ -0,0 +1,28 @@
+package com.ibcon.sproject.converters.wbstojson;
+
+import com.ibcon.sproject.domain.Activity;
+import com.ibcon.sproject.domain.WBS;
+import lombok.Data;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Set;
+
+public @Data class W2uiChildren {
+ private List children = new ArrayList<>();
+
+ public W2uiChildren() {
+ }
+
+ public W2uiChildren(Set wbsSet) {
+ wbsSet.forEach(wbs -> children.add(new WBSJson(wbs)));
+ }
+
+ public void addChildren(Set activities) {
+ activities.forEach(activity -> children.add(new WBSJson(activity)));
+ }
+
+ public void setChildren(Set activities) {
+ activities.forEach(activity -> children.add(new WBSJson(activity)));
+ }
+}
diff --git a/src/main/java/com/ibcon/sproject/converters/wbstojson/WBSJSONTree.java b/src/main/java/com/ibcon/sproject/converters/wbstojson/WBSJSONTree.java
new file mode 100644
index 0000000..93a3765
--- /dev/null
+++ b/src/main/java/com/ibcon/sproject/converters/wbstojson/WBSJSONTree.java
@@ -0,0 +1,28 @@
+package com.ibcon.sproject.converters.wbstojson;
+
+import com.ibcon.sproject.domain.WBS;
+import com.ibcon.sproject.services.crud.wbs.WBSService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.annotation.ComponentScan;
+import org.springframework.stereotype.Component;
+
+import java.util.ArrayList;
+import java.util.List;
+
+@ComponentScan
+@Component
+public class WBSJSONTree {
+ private WBSService wbsService;
+
+ @Autowired
+ private void setWbsService(WBSService wbsService) {
+ this.wbsService = wbsService;
+ }
+
+ public List convertProjectWBSList(Integer projectId) {
+ List wbsList = wbsService.findByProjectId(projectId);
+ List wbsJsonList = new ArrayList<>();
+ wbsList.stream().filter(wbs -> wbs.getParentId() == 0).forEach(wbs -> wbsJsonList.add(new WBSJson(wbs)));
+ return wbsJsonList;
+ }
+}
diff --git a/src/main/java/com/ibcon/sproject/converters/wbstojson/WBSJson.java b/src/main/java/com/ibcon/sproject/converters/wbstojson/WBSJson.java
new file mode 100644
index 0000000..9f75cc3
--- /dev/null
+++ b/src/main/java/com/ibcon/sproject/converters/wbstojson/WBSJson.java
@@ -0,0 +1,51 @@
+package com.ibcon.sproject.converters.wbstojson;
+
+import com.ibcon.sproject.domain.Activity;
+import com.ibcon.sproject.domain.WBS;
+import lombok.Data;
+
+import java.math.BigDecimal;
+
+public @Data class WBSJson {
+ private String id;
+ private Integer projectObjectId;
+ private String name;
+ private String code;
+ private Integer parentId;
+ private Integer indexNumber;
+ private BigDecimal cost;
+ private W2uiChildren w2ui;
+
+ private String type;
+
+ public WBSJson(WBS wbs) {
+ this.id = String.valueOf(wbs.getId());
+ this.parentId = wbs.getParentId();
+ this.name = wbs.getName();
+ this.code = wbs.getCode();
+ this.projectObjectId = wbs.getProjectObjectId();
+ this.indexNumber = wbs.getIndexNumber();
+ this.type = "wbs";
+
+ if (wbs.getWbsSet().size() > 0) {
+ w2ui = new W2uiChildren(wbs.getWbsSet());
+ }
+
+ if (wbs.getActivities().size() > 0) {
+ if (w2ui != null) {
+ w2ui.addChildren(wbs.getActivities());
+ } else {
+ w2ui = new W2uiChildren();
+ w2ui.setChildren(wbs.getActivities());
+ }
+ }
+ }
+
+ public WBSJson(Activity activity) {
+ this.id = "_" + activity.getId();
+ this.name = activity.getActivityName();
+ this.projectObjectId = activity.getProjectObjectId();
+ this.cost = new BigDecimal(5);
+ this.type = "act";
+ }
+}
\ No newline at end of file
diff --git a/src/main/java/com/ibcon/sproject/converters/xmlsmet/XmlSmetToDomainConverter.java b/src/main/java/com/ibcon/sproject/converters/xmlsmet/XmlSmetToDomainConverter.java
new file mode 100644
index 0000000..00f2768
--- /dev/null
+++ b/src/main/java/com/ibcon/sproject/converters/xmlsmet/XmlSmetToDomainConverter.java
@@ -0,0 +1,178 @@
+package com.ibcon.sproject.converters.xmlsmet;
+
+import com.ibcon.sproject.domain.smet.*;
+import com.ibcon.sproject.services.crud.estimateregion.EstimateRegionService;
+import com.ibcon.sproject.services.crud.user.UserServiceCrud;
+import com.ibcon.sproject.smet.model.objects.ChapterNode;
+import com.ibcon.sproject.smet.model.objects.SmetNode;
+import com.ibcon.sproject.smet.model.objects.SmetTreeNode;
+import com.ibcon.sproject.smet.model.objects.SmrNode;
+import com.ibcon.sproject.smet.model.xml.HeaderNode;
+import com.ibcon.sproject.smet.model.xml.XmlSmet;
+import org.joda.time.DateTime;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.security.core.Authentication;
+import org.springframework.security.core.context.SecurityContextHolder;
+import org.springframework.security.core.userdetails.UserDetails;
+import org.springframework.stereotype.Component;
+
+import java.math.BigDecimal;
+import java.util.List;
+
+@Component
+public class XmlSmetToDomainConverter {
+ private static EstimateHeader lastHeader;
+ private static EstimateChapter lastChapter;
+
+ private static UserServiceCrud userServiceCrud;
+ private static EstimateRegionService estimateRegionService;
+
+ @Autowired
+ public void setUserService(UserServiceCrud userServiceCrud) {
+ this.userServiceCrud = userServiceCrud;
+ }
+
+ @Autowired
+ public void setEstimateRegionService(EstimateRegionService estimateRegionService) {
+ this.estimateRegionService = estimateRegionService;
+ }
+
+ private EstimateSmet smet;
+ private List chapters;
+ private List headers;
+ private List regions;
+ private List smrs;
+
+ public static EstimateSmet convert(XmlSmet xmlSmet) {
+ if (xmlSmet.getSmet() == null) {
+ //TODO throw exception
+ }
+
+ SmetNode root = xmlSmet.getSmet();
+ EstimateSmet smet = new EstimateSmet();
+
+ updateEstimateSmet(root, smet);
+
+ if (root.getChildren() != null) {
+ List childrens = root.getChildren();
+ childrens.forEach(smetTreeNode -> addChild(smet, smetTreeNode));
+ }
+
+ return smet;
+ }
+
+ private static void addChild(EstimateSmet smet, SmetTreeNode smetTreeNode) {
+ if (smetTreeNode.isChapter()) {
+ addChapter(smet, smetTreeNode);
+ } else if (smetTreeNode.isHeader()) {
+ addHeader(smet, smetTreeNode);
+ } else if (smetTreeNode.isSmr()) {
+ addSmr(smet, smetTreeNode);
+ }
+ if (smetTreeNode.getChildren() != null) {
+ smetTreeNode.getChildren().forEach(child -> addChild(smet, child));
+ }
+ }
+
+ private static void addChapter(EstimateSmet smet, SmetTreeNode smetTreeNode) {
+ EstimateChapter chapter = new EstimateChapter();
+ ChapterNode chapterNode = (ChapterNode) smetTreeNode;
+ chapter.setName(chapterNode.getName());
+ chapter.setNum(String.valueOf(chapterNode.getNum()));
+ smet.addChapter(chapter);
+ lastChapter = chapter;
+ }
+
+ private static void addHeader(EstimateSmet smet, SmetTreeNode smetTreeNode) {
+ EstimateHeader header = new EstimateHeader();
+ HeaderNode headerNode = (HeaderNode) smetTreeNode;
+ header.setName(headerNode.getName());
+// header.setNum(headerNode.getNum());
+ header.addChapter(lastChapter);
+ smet.addHeader(header, Integer.valueOf(((ChapterNode) headerNode.getParent()).getSysId()));
+ lastHeader = header;
+ }
+
+ private static void addSmr(EstimateSmet smet, SmetTreeNode smetTreeNode) {
+ EstimateSmr smr = new EstimateSmr();
+ SmrNode smrNode = (SmrNode) smetTreeNode;
+
+ smr.setName(smrNode.getName());
+ smr.setNum(smrNode.getNum());
+ smr.setUnits(smrNode.getUnits());
+ smr.setQuantity(BigDecimal.valueOf(smrNode.getQuantity()));
+ smr.setOz(BigDecimal.valueOf(smrNode.getOz()));
+ smr.setEm(BigDecimal.valueOf(smrNode.getEm()));
+ smr.setZm(BigDecimal.valueOf(smrNode.getZm()));
+ smr.setMt(BigDecimal.valueOf(smrNode.getMt()));
+ smr.setPz(BigDecimal.valueOf(smrNode.getPz()));
+ smr.setNr(BigDecimal.valueOf(smrNode.getNr()));
+ smr.setSp(BigDecimal.valueOf(smrNode.getSp()));
+ smr.setSum(BigDecimal.valueOf(smrNode.getSum()));
+ smr.setTzr(BigDecimal.valueOf(smrNode.getTzr()));
+ smr.setTzm(BigDecimal.valueOf(smrNode.getTzm()));
+ smr.setOzCost(BigDecimal.valueOf(smrNode.getOzCost()));
+ smr.setEmCost(BigDecimal.valueOf(smrNode.getEmCost()));
+ smr.setZmCost(BigDecimal.valueOf(smrNode.getZmCost()));
+ smr.setMtCost(BigDecimal.valueOf(smrNode.getMtCost()));
+ smr.setPzCost(BigDecimal.valueOf(smrNode.getPzCost()));
+ smr.setNrCost(BigDecimal.valueOf(smrNode.getNrCost()));
+ smr.setSpCost(BigDecimal.valueOf(smrNode.getSpCost()));
+ smr.setTzrCost(BigDecimal.valueOf(smrNode.getTzrCost()));
+ smr.setTzmCost(BigDecimal.valueOf(smrNode.getTzmCost()));
+
+ smet.addSmr(smr);
+ if (lastHeader != null) {
+ smr.addHeader(lastHeader);
+ }
+ if (lastChapter != null) {
+ smr.addChapter(lastChapter);
+ }
+ }
+
+ private static void updateEstimateSmet(SmetNode root, EstimateSmet smet) {
+ smet.setName(root.getName());
+ smet.setNum(root.getNum());
+ if (root.getVirtual()) {
+ smet.setIsVirtual(1);
+ } else {
+ smet.setIsVirtual(0);
+ }
+ smet.setComment(root.getComment());
+ smet.setStatus(root.getStatus());
+ smet.setDateCreate(DateTime.now());
+ //TODO check
+ Authentication auth = SecurityContextHolder.getContext().getAuthentication();
+ String name = auth.getName();
+ smet.setUserCreated(userServiceCrud.findByUserName(name));
+ smet.setRegion(estimateRegionService.getById(root.getRegionId()));
+ smet.setFilePath(root.getFilePath());
+ smet.setOz(BigDecimal.valueOf(root.getOz()));
+ smet.setEm(BigDecimal.valueOf(root.getEm()));
+ smet.setZm(BigDecimal.valueOf(root.getZm()));
+ smet.setMt(BigDecimal.valueOf(root.getMt()));
+ smet.setPz(BigDecimal.valueOf(root.getPz()));
+ smet.setNr(BigDecimal.valueOf(root.getNr()));
+ smet.setSp(BigDecimal.valueOf(root.getSp()));
+ smet.setSum(BigDecimal.valueOf(root.getSum()));
+ smet.setTzr(BigDecimal.valueOf(root.getTzr()));
+ smet.setTzm(BigDecimal.valueOf(root.getTzm()));
+ }
+
+ private static EstimateChapter convertToEstimateChapter(SmetTreeNode smetTreeNode) {
+ EstimateChapter chapter = new EstimateChapter();
+ ChapterNode chapterNode = (ChapterNode) smetTreeNode;
+ chapter.setName(chapterNode.getName());
+ chapter.setNum(String.valueOf(chapterNode.getNum()));
+
+ return chapter;
+ }
+
+ private static EstimateHeader convertToEstimateHeader(SmetTreeNode smetTreeNode) {
+ EstimateHeader header = new EstimateHeader();
+ HeaderNode headerNode = (HeaderNode) smetTreeNode;
+ header.setName(headerNode.getName());
+
+ return header;
+ }
+}
diff --git a/src/main/java/com/ibcon/sproject/creators/project/AbstractProjectFormModelCreator.java b/src/main/java/com/ibcon/sproject/creators/project/AbstractProjectFormModelCreator.java
new file mode 100644
index 0000000..f6c6104
--- /dev/null
+++ b/src/main/java/com/ibcon/sproject/creators/project/AbstractProjectFormModelCreator.java
@@ -0,0 +1,48 @@
+package com.ibcon.sproject.creators.project;
+
+import com.ibcon.sproject.domain.Project;
+import com.ibcon.sproject.domain.Role;
+import com.ibcon.sproject.services.crud.role.RoleService;
+
+import java.util.ArrayList;
+import java.util.HashSet;
+import java.util.List;
+
+public class AbstractProjectFormModelCreator implements ProjectFormModelCreator {
+ protected Project project = new Project();
+ protected List allRoles = new ArrayList<>();
+ protected List roleIds = new ArrayList<>();
+
+ @Override
+ public Project createProject(RoleService roleService) {
+ project.setRoles(new HashSet<>());
+ for (Integer roleId : roleIds) {
+ project.addRole(roleService.getById(roleId));
+ }
+ return project;
+ }
+
+ public Project getProject() {
+ return project;
+ }
+
+ public void setProject(Project project) {
+ this.project = project;
+ }
+
+ public List getAllRoles() {
+ return allRoles;
+ }
+
+ public void setAllRoles(List allRoles) {
+ this.allRoles = allRoles;
+ }
+
+ public List getRoleIds() {
+ return roleIds;
+ }
+
+ public void setRoleIds(List roleIds) {
+ this.roleIds = roleIds;
+ }
+}
diff --git a/src/main/java/com/ibcon/sproject/creators/project/EmptyProjectFormCreatorImpl.java b/src/main/java/com/ibcon/sproject/creators/project/EmptyProjectFormCreatorImpl.java
new file mode 100644
index 0000000..11f7743
--- /dev/null
+++ b/src/main/java/com/ibcon/sproject/creators/project/EmptyProjectFormCreatorImpl.java
@@ -0,0 +1,14 @@
+package com.ibcon.sproject.creators.project;
+
+import com.ibcon.sproject.domain.Role;
+
+import java.util.List;
+
+public class EmptyProjectFormCreatorImpl extends AbstractProjectFormModelCreator {
+ public EmptyProjectFormCreatorImpl() {
+ }
+
+ public EmptyProjectFormCreatorImpl(List> objects) {
+ this.allRoles = (List) objects;
+ }
+}
diff --git a/src/main/java/com/ibcon/sproject/creators/project/ProjectFormModelCreator.java b/src/main/java/com/ibcon/sproject/creators/project/ProjectFormModelCreator.java
new file mode 100644
index 0000000..44f65b7
--- /dev/null
+++ b/src/main/java/com/ibcon/sproject/creators/project/ProjectFormModelCreator.java
@@ -0,0 +1,8 @@
+package com.ibcon.sproject.creators.project;
+
+import com.ibcon.sproject.domain.Project;
+import com.ibcon.sproject.services.crud.role.RoleService;
+
+public interface ProjectFormModelCreator {
+ Project createProject(RoleService roleService);
+}
diff --git a/src/main/java/com/ibcon/sproject/creators/project/ProjectFormModelCreatorImpl.java b/src/main/java/com/ibcon/sproject/creators/project/ProjectFormModelCreatorImpl.java
new file mode 100644
index 0000000..a928b63
--- /dev/null
+++ b/src/main/java/com/ibcon/sproject/creators/project/ProjectFormModelCreatorImpl.java
@@ -0,0 +1,22 @@
+package com.ibcon.sproject.creators.project;
+
+import com.ibcon.sproject.domain.Project;
+import com.ibcon.sproject.domain.Role;
+
+import java.util.List;
+
+public class ProjectFormModelCreatorImpl extends AbstractProjectFormModelCreator {
+
+ public ProjectFormModelCreatorImpl() {
+ }
+
+ public ProjectFormModelCreatorImpl(Project project, List allRoles) {
+ this.project = project;
+ this.allRoles = allRoles;
+ fillRoleIds();
+ }
+
+ private void fillRoleIds() {
+ project.getRoles().forEach(role -> roleIds.add(role.getId()));
+ }
+}
diff --git a/src/main/java/com/ibcon/factage_web/creators/UserFormModelCreatorImpl.java b/src/main/java/com/ibcon/sproject/creators/user/AbstractUserFormCreator.java
similarity index 56%
rename from src/main/java/com/ibcon/factage_web/creators/UserFormModelCreatorImpl.java
rename to src/main/java/com/ibcon/sproject/creators/user/AbstractUserFormCreator.java
index 3b9ca53..84fbab2 100644
--- a/src/main/java/com/ibcon/factage_web/creators/UserFormModelCreatorImpl.java
+++ b/src/main/java/com/ibcon/sproject/creators/user/AbstractUserFormCreator.java
@@ -1,28 +1,24 @@
-package com.ibcon.factage_web.creators;
+package com.ibcon.sproject.creators.user;
-import com.ibcon.factage_web.domain.Role;
-import com.ibcon.factage_web.domain.User;
-import com.ibcon.factage_web.services.crud.role.RoleService;
+import com.ibcon.sproject.domain.Role;
+import com.ibcon.sproject.domain.User;
+import com.ibcon.sproject.services.crud.role.RoleService;
import java.util.ArrayList;
+import java.util.HashSet;
import java.util.List;
-public class UserFormModelCreatorImpl implements UserFormModelCreator {
- private User user = new User();
- private List allRoles;
- private List roleIds = new ArrayList<>();
-
- public UserFormModelCreatorImpl() {
- }
-
- public UserFormModelCreatorImpl(List> objects) {
- this.allRoles = (List) objects;
- }
+public abstract class AbstractUserFormCreator implements UserFormModelCreator {
+ protected User user = new User();
+ protected List allRoles = new ArrayList<>();
+ protected List roleIds = new ArrayList<>();
@Override
public User createUser(RoleService roleService) {
+ user.setRoles(new HashSet<>());
for (Integer roleId : roleIds) {
user.addRole(roleService.getById(roleId));
+ roleService.getById(roleId).addUser(user);
}
return user;
}
diff --git a/src/main/java/com/ibcon/sproject/creators/user/EmptyUserFormCreatorImpl.java b/src/main/java/com/ibcon/sproject/creators/user/EmptyUserFormCreatorImpl.java
new file mode 100644
index 0000000..c6f3b0d
--- /dev/null
+++ b/src/main/java/com/ibcon/sproject/creators/user/EmptyUserFormCreatorImpl.java
@@ -0,0 +1,16 @@
+package com.ibcon.sproject.creators.user;
+
+import com.ibcon.sproject.domain.Role;
+
+import java.util.Date;
+import java.util.List;
+
+public class EmptyUserFormCreatorImpl extends AbstractUserFormCreator {
+ public EmptyUserFormCreatorImpl() {
+ }
+
+ public EmptyUserFormCreatorImpl(List> objects) {
+ this.allRoles = (List) objects;
+ getUser().setExpirationDate(new Date());
+ }
+}
diff --git a/src/main/java/com/ibcon/sproject/creators/user/UserFormModelCreator.java b/src/main/java/com/ibcon/sproject/creators/user/UserFormModelCreator.java
new file mode 100644
index 0000000..7599519
--- /dev/null
+++ b/src/main/java/com/ibcon/sproject/creators/user/UserFormModelCreator.java
@@ -0,0 +1,9 @@
+package com.ibcon.sproject.creators.user;
+
+import com.ibcon.sproject.domain.User;
+import com.ibcon.sproject.services.crud.role.RoleService;
+
+public interface UserFormModelCreator {
+ User createUser(RoleService roleService);
+ User getUser();
+}
diff --git a/src/main/java/com/ibcon/sproject/creators/user/UserFormModelCreatorImpl.java b/src/main/java/com/ibcon/sproject/creators/user/UserFormModelCreatorImpl.java
new file mode 100644
index 0000000..33e4544
--- /dev/null
+++ b/src/main/java/com/ibcon/sproject/creators/user/UserFormModelCreatorImpl.java
@@ -0,0 +1,26 @@
+package com.ibcon.sproject.creators.user;
+
+import com.ibcon.sproject.domain.Role;
+import com.ibcon.sproject.domain.User;
+import com.ibcon.sproject.services.crud.role.RoleService;
+import com.ibcon.sproject.services.crud.user.UserServiceCrud;
+import org.springframework.stereotype.Component;
+
+import java.util.List;
+
+@Component
+public class UserFormModelCreatorImpl extends AbstractUserFormCreator {
+
+ public UserFormModelCreatorImpl() {
+ }
+
+ public UserFormModelCreatorImpl(User user, List allRoles) {
+ this.user = user;
+ this.allRoles = allRoles;
+ fillRoleIds();
+ }
+
+ private void fillRoleIds() {
+ user.getRoles().forEach(role -> roleIds.add(role.getId()));
+ }
+}
diff --git a/src/main/java/com/ibcon/factage_web/domain/AbstractDomainClass.java b/src/main/java/com/ibcon/sproject/domain/AbstractDomainClass.java
similarity index 92%
rename from src/main/java/com/ibcon/factage_web/domain/AbstractDomainClass.java
rename to src/main/java/com/ibcon/sproject/domain/AbstractDomainClass.java
index eae1c18..d4231f7 100644
--- a/src/main/java/com/ibcon/factage_web/domain/AbstractDomainClass.java
+++ b/src/main/java/com/ibcon/sproject/domain/AbstractDomainClass.java
@@ -1,4 +1,4 @@
-package com.ibcon.factage_web.domain;
+package com.ibcon.sproject.domain;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
diff --git a/src/main/java/com/ibcon/sproject/domain/Activity.java b/src/main/java/com/ibcon/sproject/domain/Activity.java
new file mode 100644
index 0000000..0733a86
--- /dev/null
+++ b/src/main/java/com/ibcon/sproject/domain/Activity.java
@@ -0,0 +1,65 @@
+package com.ibcon.sproject.domain;
+
+import com.fasterxml.jackson.annotation.JsonBackReference;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.ToString;
+import org.joda.time.DateTime;
+import org.springframework.boot.autoconfigure.domain.EntityScan;
+
+import javax.persistence.*;
+
+@EntityScan
+@Entity
+@Table(name = "activities")
+@EqualsAndHashCode(exclude = "wbs")
+@ToString(exclude = "wbs")
+public @Data class Activity extends AbstractDomainClass {
+ private Integer projectObjectId;
+ private Integer projectId;
+// private Integer wbsId;
+ private String activityId;
+ private String activityName;
+ private Double duration;
+ private Double remainingDuration;
+ private DateTime actualStartDate;
+ private DateTime earlyStartDate;
+ private DateTime lateStartDate;
+ private DateTime plannedStartDate;
+ private DateTime actualFinishDate;
+ private DateTime earlyFinishDate;
+ private DateTime lateFinishDate;
+ private DateTime plannedFinishDate;
+ private Integer typeId;
+ private Integer statusId;
+ private Integer percentageCompletion;
+ private Boolean isCritical;
+
+ @ManyToOne(cascade = CascadeType.MERGE, fetch = FetchType.LAZY)
+ @JoinTable(name = "rsrc_assignment", joinColumns = @JoinColumn(name = "activity_id"),
+ inverseJoinColumns = @JoinColumn(name = "rsrc_id"))
+ private Resource resource;
+
+ @ManyToOne(cascade = CascadeType.MERGE, fetch = FetchType.LAZY)
+ @JoinColumn(name = "wbs_id")
+// @JoinTable(name = "wbs", joinColumns = @JoinColumn(name = "id"),
+// inverseJoinColumns = @JoinColumn(name = "wbs_id"))
+ @JsonBackReference
+ private WBS wbs;
+
+// @ManyToOne(cascade = CascadeType.MERGE, fetch = FetchType.LAZY)
+// @JoinColumn(name = "project_id")
+//// @JoinTable(name = "wbs", joinColumns = @JoinColumn(name = "id"),
+//// inverseJoinColumns = @JoinColumn(name = "wbs_id"))
+// @JsonBackReference
+// private Project project;
+
+
+ public void setPercentageCompletion(Integer percentageCompletion) {
+ if (percentageCompletion < 0 && percentageCompletion > 100) {
+ throw new IllegalArgumentException();
+ } else {
+ this.percentageCompletion = percentageCompletion;
+ }
+ }
+}
diff --git a/src/main/java/com/ibcon/factage_web/domain/DomainObject.java b/src/main/java/com/ibcon/sproject/domain/DomainObject.java
similarity index 69%
rename from src/main/java/com/ibcon/factage_web/domain/DomainObject.java
rename to src/main/java/com/ibcon/sproject/domain/DomainObject.java
index 35cc1b6..dd5fc1c 100644
--- a/src/main/java/com/ibcon/factage_web/domain/DomainObject.java
+++ b/src/main/java/com/ibcon/sproject/domain/DomainObject.java
@@ -1,4 +1,4 @@
-package com.ibcon.factage_web.domain;
+package com.ibcon.sproject.domain;
public interface DomainObject {
Integer getId();
diff --git a/src/main/java/com/ibcon/sproject/domain/Link.java b/src/main/java/com/ibcon/sproject/domain/Link.java
new file mode 100644
index 0000000..f68750a
--- /dev/null
+++ b/src/main/java/com/ibcon/sproject/domain/Link.java
@@ -0,0 +1,110 @@
+package com.ibcon.sproject.domain;
+
+import com.fasterxml.jackson.annotation.JsonBackReference;
+import com.ibcon.sproject.domain.smet.EstimateSmr;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import org.springframework.boot.autoconfigure.domain.EntityScan;
+
+import javax.persistence.*;
+import java.math.BigDecimal;
+
+@EntityScan
+@Entity
+@Table(name = "link")
+@EqualsAndHashCode(exclude = {"project", "activity", "smr"})
+public @Data class Link extends AbstractDomainClass {
+
+ public Link() {}
+
+ public Link(Activity activity, EstimateSmr smr) {
+ this.actual = true;
+ this.activity = activity;
+ this.smr = smr;
+ this.projectId = activity.getProjectId();
+ this.factor = smr.getFactor();
+ this.fullFactor = smr.getFullFactor();
+ this.pvApply = false;
+ this.volume = smr.getQuantity().divide(fullFactor, 6).multiply(factor);
+ this.tzrVolume = smr.getTzr().divide(fullFactor, 6).multiply(factor);
+ this.mechVolume = smr.getTzm().divide(fullFactor, 6).multiply(factor);
+ this.costEm = smr.getEmCost() == null ? BigDecimal.ZERO : smr.getEmCost();
+ this.costEmm = smr.getCostEmm() == null ? BigDecimal.ZERO : smr.getCostEmm();
+ this.costFot = smr.getCostFot() == null ? BigDecimal.ZERO : smr.getCostFot();
+ this.costKon = smr.getCostKon() == null ? BigDecimal.ZERO : smr.getCostKon();
+ this.costMat = smr.getMtCost() == null ? BigDecimal.ZERO : smr.getMtCost();
+ this.costMtr = smr.getCostMtr() == null ? BigDecimal.ZERO : smr.getCostMtr();
+ this.costSum = smr.getSum() == null ? BigDecimal.ZERO : smr.getSum();
+ this.costOz = smr.getOzCost() == null ? BigDecimal.ZERO : smr.getOzCost();
+ this.costZm = smr.getZmCost() == null ? BigDecimal.ZERO : smr.getZmCost();
+ this.costNr = smr.getNrCost() == null ? BigDecimal.ZERO : smr.getNrCost();
+ this.costSp = smr.getSpCost() == null ? BigDecimal.ZERO : smr.getSpCost();
+ this.rsrcInnerType = 0;
+ }
+
+ private Boolean actual;
+
+ private Integer projectId;
+
+ @Column(name = "factor", columnDefinition = "decimal")
+ private BigDecimal factor;
+
+ @Column(name = "fullFactor", columnDefinition = "decimal")
+ private BigDecimal fullFactor;
+
+ private Boolean pvApply;
+
+ @Column(name = "volume", columnDefinition = "decimal")
+ private BigDecimal volume;
+
+ @Column(name = "tzrVolume", columnDefinition = "decimal")
+ private BigDecimal tzrVolume;
+
+ @Column(name = "mechVolume", columnDefinition = "decimal")
+ private BigDecimal mechVolume;
+
+ @Column(name = "costOz", columnDefinition = "decimal")
+ private BigDecimal costOz;
+
+ @Column(name = "costEm", columnDefinition = "decimal")
+ private BigDecimal costEm;
+
+ @Column(name = "costZm", columnDefinition = "decimal")
+ private BigDecimal costZm;
+
+ @Column(name = "costMat", columnDefinition = "decimal")
+ private BigDecimal costMat;
+
+ @Column(name = "costNr", columnDefinition = "decimal")
+ private BigDecimal costNr;
+
+ @Column(name = "costSp", columnDefinition = "decimal")
+ private BigDecimal costSp;
+
+ @Column(name = "costEmm", columnDefinition = "decimal")
+ private BigDecimal costEmm;
+
+ @Column(name = "costFot", columnDefinition = "decimal")
+ private BigDecimal costFot;
+
+ @Column(name = "costMtr", columnDefinition = "decimal")
+ private BigDecimal costMtr;
+
+ @Column(name = "costKon", columnDefinition = "decimal")
+ private BigDecimal costKon;
+
+ @Column(name = "costSum", columnDefinition = "decimal")
+ private BigDecimal costSum;
+
+ private Integer rsrcInnerType;
+
+ @ManyToOne(cascade = CascadeType.MERGE, fetch = FetchType.LAZY)
+ @JoinColumn(name = "activity_id")
+// @JsonBackReference
+ private Activity activity;
+
+ @ManyToOne(cascade = CascadeType.MERGE, fetch = FetchType.LAZY)
+ @JoinColumn(name = "smet_row_id")
+// @JsonBackReference
+ private EstimateSmr smr;
+}
diff --git a/src/main/java/com/ibcon/factage_web/domain/Project.java b/src/main/java/com/ibcon/sproject/domain/Project.java
similarity index 79%
rename from src/main/java/com/ibcon/factage_web/domain/Project.java
rename to src/main/java/com/ibcon/sproject/domain/Project.java
index caec4fc..b3d2b46 100644
--- a/src/main/java/com/ibcon/factage_web/domain/Project.java
+++ b/src/main/java/com/ibcon/sproject/domain/Project.java
@@ -1,5 +1,6 @@
-package com.ibcon.factage_web.domain;
+package com.ibcon.sproject.domain;
+import com.fasterxml.jackson.annotation.JsonManagedReference;
import lombok.Data;
import org.springframework.boot.autoconfigure.domain.EntityScan;
@@ -11,6 +12,7 @@
@Entity
@Table(name = "projects")
public @Data class Project extends AbstractDomainClass {
+// private Integer id;
private Integer projectObjectId;
private String primaveraId;
private String projectName;
@@ -23,8 +25,13 @@
@ManyToMany(fetch = FetchType.EAGER)
@JoinTable(name = "projects_roles", joinColumns = @JoinColumn(name = "project_id"),
inverseJoinColumns = @JoinColumn(name = "role_id"))
+ @JsonManagedReference
private Set roles = new HashSet<>();
+ @OneToMany(cascade = CascadeType.MERGE, mappedBy = "project")
+ @JsonManagedReference
+ private Set wbsSet = new HashSet<>();
+
public void addRole(Role role) {
if (!this.getRoles().contains(role)) {
this.getRoles().add(role);
diff --git a/src/main/java/com/ibcon/sproject/domain/Resource.java b/src/main/java/com/ibcon/sproject/domain/Resource.java
new file mode 100644
index 0000000..0ef63bd
--- /dev/null
+++ b/src/main/java/com/ibcon/sproject/domain/Resource.java
@@ -0,0 +1,34 @@
+package com.ibcon.sproject.domain;
+
+import lombok.Data;
+import org.springframework.boot.autoconfigure.domain.EntityScan;
+
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.Table;
+
+@EntityScan
+@Entity
+@Table(name = "rsrc")
+public @Data class Resource extends AbstractDomainClass{
+ @Column(name = "rsrc_id")
+ private Integer resourceId;
+
+ @Column(name = "rsrc_short_name")
+ private String resourceShortName;
+
+ @Column(name = "rsrc_name")
+ private String resourceName;
+
+ @Column(name = "rsrc_type")
+ private String resourceType;
+
+ private Integer parentId;
+
+ private String uom;
+
+ private Integer innerType;
+
+ @Column(name = "dbname")
+ private String dnName;
+}
diff --git a/src/main/java/com/ibcon/factage_web/domain/Role.java b/src/main/java/com/ibcon/sproject/domain/Role.java
similarity index 92%
rename from src/main/java/com/ibcon/factage_web/domain/Role.java
rename to src/main/java/com/ibcon/sproject/domain/Role.java
index 8e764cf..51e4033 100644
--- a/src/main/java/com/ibcon/factage_web/domain/Role.java
+++ b/src/main/java/com/ibcon/sproject/domain/Role.java
@@ -1,8 +1,9 @@
-package com.ibcon.factage_web.domain;
+package com.ibcon.sproject.domain;
+
+import com.fasterxml.jackson.annotation.JsonBackReference;
import javax.persistence.*;
import java.util.HashSet;
-import java.util.List;
import java.util.Set;
@Entity
@@ -11,9 +12,11 @@ public class Role extends AbstractDomainClass {
private String name;
@ManyToMany(fetch = FetchType.EAGER, mappedBy = "roles")
+ @JsonBackReference
private Set users = new HashSet<>();
@ManyToMany(fetch = FetchType.EAGER, mappedBy = "roles")
+ @JsonBackReference
private Set projects = new HashSet<>();
public String getName() {
diff --git a/src/main/java/com/ibcon/factage_web/domain/User.java b/src/main/java/com/ibcon/sproject/domain/User.java
similarity index 95%
rename from src/main/java/com/ibcon/factage_web/domain/User.java
rename to src/main/java/com/ibcon/sproject/domain/User.java
index bc32e8e..5f17962 100644
--- a/src/main/java/com/ibcon/factage_web/domain/User.java
+++ b/src/main/java/com/ibcon/sproject/domain/User.java
@@ -1,12 +1,12 @@
-package com.ibcon.factage_web.domain;
+package com.ibcon.sproject.domain;
+import com.fasterxml.jackson.annotation.JsonManagedReference;
import org.springframework.boot.autoconfigure.domain.EntityScan;
import org.springframework.format.annotation.DateTimeFormat;
import javax.persistence.*;
import java.util.Date;
import java.util.HashSet;
-import java.util.List;
import java.util.Set;
@EntityScan
@@ -30,6 +30,7 @@ public class User extends AbstractDomainClass {
@ManyToMany(fetch = FetchType.EAGER)
@JoinTable(name = "users_roles", joinColumns = @JoinColumn(name = "user_id"),
inverseJoinColumns = @JoinColumn(name = "role_id"))
+ @JsonManagedReference
private Set roles = new HashSet<>();
public User() {
diff --git a/src/main/java/com/ibcon/sproject/domain/WBS.java b/src/main/java/com/ibcon/sproject/domain/WBS.java
new file mode 100644
index 0000000..2021ceb
--- /dev/null
+++ b/src/main/java/com/ibcon/sproject/domain/WBS.java
@@ -0,0 +1,50 @@
+package com.ibcon.sproject.domain;
+
+import com.fasterxml.jackson.annotation.JsonBackReference;
+import com.fasterxml.jackson.annotation.JsonFilter;
+import com.fasterxml.jackson.annotation.JsonManagedReference;
+import com.ibcon.sproject.domain.smet.EstimateSmet;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.ToString;
+import org.hibernate.annotations.Proxy;
+import org.springframework.boot.autoconfigure.domain.EntityScan;
+
+import javax.persistence.*;
+import java.util.HashSet;
+import java.util.Set;
+
+//TODO брать проект из toString()
+@EntityScan
+@Entity
+@Table(name = "wbs")
+@EqualsAndHashCode(exclude = {"project", "activities", "wbsSet", "estimateSmets"})
+@ToString(exclude = {"project", "activities", "wbsSet", "estimateSmets"})
+public @Data class WBS extends AbstractDomainClass {
+// private Integer projectId;
+ private Integer projectObjectId;
+ private String name;
+ private String code;
+ private Integer parentId;
+ private Integer indexNumber;
+
+ //TODO ПОСМОТРЕТЬ ПРИМЕР
+ @OneToMany(cascade = CascadeType.MERGE, mappedBy = "wbs")
+ @JsonManagedReference
+ private Set activities = new HashSet<>();
+
+ @OneToMany
+ @JoinColumn(name="parentId")
+ private Set wbsSet = new HashSet<>();
+
+ @ManyToOne(cascade = CascadeType.MERGE, fetch = FetchType.LAZY)
+// @JoinTable(name = "projects", joinColumns = @JoinColumn(name = "id"),
+// inverseJoinColumns = @JoinColumn(name = "project_id"))
+ @JoinColumn(name = "project_id")
+ @JsonBackReference
+ private Project project = new Project();
+
+ @ManyToMany(fetch = FetchType.EAGER, mappedBy = "wbsSet")
+ @JsonManagedReference
+ private Set estimateSmets = new HashSet<>();
+}
diff --git a/src/main/java/com/ibcon/sproject/domain/mixins/WBSInnerObjectsMixin.java b/src/main/java/com/ibcon/sproject/domain/mixins/WBSInnerObjectsMixin.java
new file mode 100644
index 0000000..eb6be85
--- /dev/null
+++ b/src/main/java/com/ibcon/sproject/domain/mixins/WBSInnerObjectsMixin.java
@@ -0,0 +1,7 @@
+package com.ibcon.sproject.domain.mixins;
+
+import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
+
+@JsonIgnoreProperties(value = {"activities", "project", "estimateSmets"})
+public class WBSInnerObjectsMixin {
+}
diff --git a/src/main/java/com/ibcon/sproject/domain/smet/EstimateChapter.java b/src/main/java/com/ibcon/sproject/domain/smet/EstimateChapter.java
new file mode 100644
index 0000000..7fe9f83
--- /dev/null
+++ b/src/main/java/com/ibcon/sproject/domain/smet/EstimateChapter.java
@@ -0,0 +1,32 @@
+package com.ibcon.sproject.domain.smet;
+
+import com.ibcon.sproject.domain.AbstractDomainClass;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import org.springframework.boot.autoconfigure.domain.EntityScan;
+
+import javax.persistence.*;
+import java.util.HashSet;
+import java.util.Set;
+
+@EntityScan
+@Entity
+@Table(name = "estimate_Chapter")
+@EqualsAndHashCode(exclude = {"smet"})
+public @Data
+class EstimateChapter extends AbstractDomainClass {
+ private String name;
+ private String num;
+
+ @ManyToOne(cascade = CascadeType.MERGE, fetch = FetchType.LAZY)
+ @JoinColumn(name = "smet_id")
+ private EstimateSmet smet;
+
+ @OneToMany(mappedBy = "chapter")
+ private Set headerSet = new HashSet<>();
+
+ public void addHeader(EstimateHeader header) {
+ this.getHeaderSet().add(header);
+ header.setChapter(this);
+ }
+}
diff --git a/src/main/java/com/ibcon/sproject/domain/smet/EstimateHeader.java b/src/main/java/com/ibcon/sproject/domain/smet/EstimateHeader.java
new file mode 100644
index 0000000..b422ce8
--- /dev/null
+++ b/src/main/java/com/ibcon/sproject/domain/smet/EstimateHeader.java
@@ -0,0 +1,73 @@
+package com.ibcon.sproject.domain.smet;
+
+import com.ibcon.sproject.domain.AbstractDomainClass;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import org.hibernate.annotations.NotFound;
+import org.hibernate.annotations.NotFoundAction;
+import org.springframework.boot.autoconfigure.domain.EntityScan;
+
+import javax.persistence.*;
+
+@EntityScan
+@Entity
+@Table(name = "estimate_Header")
+public class EstimateHeader extends AbstractDomainClass {
+ private String name;
+ private String num;
+
+ @ManyToOne(cascade = CascadeType.MERGE, fetch = FetchType.LAZY)
+ @JoinColumn(name = "smet_id")
+ private EstimateSmet smet;
+
+ @ManyToOne(cascade = CascadeType.MERGE, fetch = FetchType.LAZY)
+ @JoinColumn(name = "chapter_id")
+ private EstimateChapter chapter;
+
+ public void addChapter(EstimateChapter lastChapter) {
+ if (lastChapter != null) {
+ this.chapter = lastChapter;
+ lastChapter.getHeaderSet().add(this);
+ }
+ }
+
+ public Integer getId() {
+ return super.getId();
+ }
+
+ public void setId(Integer id) {
+ super.setId(id);
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ public String getNum() {
+ return num;
+ }
+
+ public void setNum(String num) {
+ this.num = num;
+ }
+
+ public EstimateSmet getSmet() {
+ return smet;
+ }
+
+ public void setSmet(EstimateSmet smet) {
+ this.smet = smet;
+ }
+
+ public EstimateChapter getChapter() {
+ return chapter;
+ }
+
+ public void setChapter(EstimateChapter chapter) {
+ this.chapter = chapter;
+ }
+}
diff --git a/src/main/java/com/ibcon/sproject/domain/smet/EstimateRegion.java b/src/main/java/com/ibcon/sproject/domain/smet/EstimateRegion.java
new file mode 100644
index 0000000..5122952
--- /dev/null
+++ b/src/main/java/com/ibcon/sproject/domain/smet/EstimateRegion.java
@@ -0,0 +1,15 @@
+package com.ibcon.sproject.domain.smet;
+
+import com.ibcon.sproject.domain.AbstractDomainClass;
+import lombok.Data;
+import org.springframework.boot.autoconfigure.domain.EntityScan;
+
+import javax.persistence.Entity;
+import javax.persistence.Table;
+
+@EntityScan
+@Entity
+@Table(name = "estimate_Region")
+public @Data class EstimateRegion extends AbstractDomainClass {
+ private String name;
+}
diff --git a/src/main/java/com/ibcon/sproject/domain/smet/EstimateSmet.java b/src/main/java/com/ibcon/sproject/domain/smet/EstimateSmet.java
new file mode 100644
index 0000000..c4981c5
--- /dev/null
+++ b/src/main/java/com/ibcon/sproject/domain/smet/EstimateSmet.java
@@ -0,0 +1,128 @@
+package com.ibcon.sproject.domain.smet;
+
+import com.fasterxml.jackson.annotation.JsonBackReference;
+import com.ibcon.sproject.domain.AbstractDomainClass;
+import com.ibcon.sproject.domain.User;
+import com.ibcon.sproject.domain.WBS;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import org.joda.time.DateTime;
+import org.springframework.boot.autoconfigure.domain.EntityScan;
+
+import javax.persistence.*;
+import java.math.BigDecimal;
+import java.util.HashSet;
+import java.util.Objects;
+import java.util.Set;
+
+@EntityScan
+@Entity
+@Table(name = "estimate_Smet")
+@EqualsAndHashCode(exclude = {"userCreated", "userChanged", "region", "wbsSet", "smrSet"})
+public @Data
+class EstimateSmet extends AbstractDomainClass {
+ private String name;
+
+ private String num;
+
+ @Column(columnDefinition = "tinyint")
+ private Integer isVirtual;
+
+ private String filePath;
+
+ private String comment;
+
+ private String status;
+
+ private DateTime dateCreate;
+
+ private DateTime dateChange;
+
+ @Column(name = "oz", columnDefinition = "decimal")
+ private BigDecimal oz;
+
+ @Column(name = "em", columnDefinition = "decimal")
+ private BigDecimal em;
+
+ @Column(name = "zm", columnDefinition = "decimal")
+ private BigDecimal zm;
+
+ @Column(name = "mt", columnDefinition = "decimal")
+ private BigDecimal mt;
+
+ @Column(name = "pz", columnDefinition = "decimal")
+ private BigDecimal pz;
+
+ @Column(name = "nr", columnDefinition = "decimal")
+ private BigDecimal nr;
+
+ @Column(name = "sp", columnDefinition = "decimal")
+ private BigDecimal sp;
+
+ @Column(name = "sum", columnDefinition = "decimal")
+ private BigDecimal sum;
+
+ @Column(name = "tzr", columnDefinition = "decimal")
+ private BigDecimal tzr;
+
+ @Column(name = "tzm", columnDefinition = "decimal")
+ private BigDecimal tzm;
+
+ @OneToMany(mappedBy = "smet", cascade = CascadeType.PERSIST)
+ private Set chapters = new HashSet<>();
+
+ @OneToMany(mappedBy = "smet", cascade = CascadeType.PERSIST)
+ private Set headers = new HashSet<>();
+
+ @OneToOne(cascade = CascadeType.MERGE, fetch = FetchType.LAZY)
+ @JoinColumn(name = "user_create")
+ private User userCreated;
+
+ @OneToOne(cascade = CascadeType.MERGE, fetch = FetchType.LAZY)
+ @JoinColumn(name = "user_change")
+ private User userChanged;
+
+ @OneToOne(cascade = CascadeType.MERGE, fetch = FetchType.LAZY)
+ @JoinColumn(name = "region_id")
+ private EstimateRegion region;
+
+ @ManyToMany(fetch = FetchType.EAGER)
+ @JoinTable(name = "estimate_smet_wbs", joinColumns = @JoinColumn(name = "smet_id"),
+ inverseJoinColumns = @JoinColumn(name = "wbs_id"))
+ @JsonBackReference
+ private Set wbsSet = new HashSet<>();
+
+ @OneToMany(mappedBy = "smet", cascade = CascadeType.PERSIST)
+ private Set smrSet = new HashSet<>();
+
+ public void addChapter(EstimateChapter chapter) {
+ this.chapters.add(chapter);
+ chapter.setSmet(this);
+ }
+
+ public void addHeader(EstimateHeader header, Integer chapterId) {
+ this.headers.add(header);
+ header.setSmet(this);
+
+ EstimateChapter chapter = findChapterById(chapterId);
+ if (chapter != null) {
+ chapter.addHeader(header);
+ }
+
+ }
+
+ private EstimateChapter findChapterById(Integer chapterId) {
+ for(EstimateChapter chapter : chapters) {
+ if (chapterId.equals(chapter.getId())) {
+ return chapter;
+ }
+ }
+
+ return null;
+ }
+
+ public void addSmr(EstimateSmr smr) {
+ this.smrSet.add(smr);
+ smr.setSmet(this);
+ }
+}
diff --git a/src/main/java/com/ibcon/sproject/domain/smet/EstimateSmr.java b/src/main/java/com/ibcon/sproject/domain/smet/EstimateSmr.java
new file mode 100644
index 0000000..cfccc10
--- /dev/null
+++ b/src/main/java/com/ibcon/sproject/domain/smet/EstimateSmr.java
@@ -0,0 +1,130 @@
+package com.ibcon.sproject.domain.smet;
+
+import com.fasterxml.jackson.annotation.JsonBackReference;
+import com.ibcon.sproject.domain.AbstractDomainClass;
+import com.ibcon.sproject.domain.User;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import org.joda.time.DateTime;
+import org.springframework.boot.autoconfigure.domain.EntityScan;
+
+import javax.persistence.*;
+import java.math.BigDecimal;
+
+@EntityScan
+@Entity
+@Table(name = "estimate_Smr")
+@EntityListeners(EstimateSmrToPersistListener.class)
+@EqualsAndHashCode(exclude = {"chapter", "header", "smet"})
+public @Data class EstimateSmr extends AbstractDomainClass {
+ private String name;
+
+ @Column(name = "num", columnDefinition = "smallint")
+ private Integer num;
+
+ private String code;
+
+ private String units;
+
+ @Column(name = "quantity", columnDefinition = "decimal")
+ private BigDecimal quantity;
+
+ @Column(name = "oz", columnDefinition = "decimal")
+ private BigDecimal oz;
+
+ @Column(name = "em", columnDefinition = "decimal")
+ private BigDecimal em;
+
+ @Column(name = "zm", columnDefinition = "decimal")
+ private BigDecimal zm;
+
+ @Column(name = "mt", columnDefinition = "decimal")
+ private BigDecimal mt;
+
+ @Column(name = "pz", columnDefinition = "decimal")
+ private BigDecimal pz;
+
+ @Column(name = "nr", columnDefinition = "decimal")
+ private BigDecimal nr;
+
+ @Column(name = "sp", columnDefinition = "decimal")
+ private BigDecimal sp;
+
+ @Column(name = "sum", columnDefinition = "decimal")
+ private BigDecimal sum;
+
+ @Column(name = "tzr", columnDefinition = "decimal")
+ private BigDecimal tzr;
+
+ @Column(name = "tzm", columnDefinition = "decimal")
+ private BigDecimal tzm;
+
+
+ @Column(name = "oz_cost", columnDefinition = "decimal")
+ private BigDecimal ozCost;
+
+ @Column(name = "em_cost", columnDefinition = "decimal")
+ private BigDecimal emCost;
+
+ @Column(name = "zm_cost", columnDefinition = "decimal")
+ private BigDecimal zmCost;
+
+ @Column(name = "mt_cost", columnDefinition = "decimal")
+ private BigDecimal mtCost;
+
+ @Column(name = "pz_cost", columnDefinition = "decimal")
+ private BigDecimal pzCost;
+
+ @Column(name = "nr_cost", columnDefinition = "decimal")
+ private BigDecimal nrCost;
+
+ @Column(name = "sp_cost", columnDefinition = "decimal")
+ private BigDecimal spCost;
+
+ @Column(name = "tzr_cost", columnDefinition = "decimal")
+ private BigDecimal tzrCost;
+
+ @Column(name = "tzm_cost", columnDefinition = "decimal")
+ private BigDecimal tzmCost;
+
+ @Column(name = "emm_cost", columnDefinition = "decimal")
+ private BigDecimal costEmm;
+
+ @Column(name = "fot_cost", columnDefinition = "decimal")
+ private BigDecimal costFot;
+
+ @Column(name = "mtr_cost", columnDefinition = "decimal")
+ private BigDecimal costMtr;
+
+ @Column(name = "kon_cost", columnDefinition = "decimal")
+ private BigDecimal costKon;
+
+ @Column(name = "factor", columnDefinition = "decimal")
+ private BigDecimal factor = BigDecimal.ZERO;
+
+ @Column(name = "full_factor", columnDefinition = "decimal")
+ private BigDecimal fullFactor = BigDecimal.ONE;
+
+ @ManyToOne(cascade = CascadeType.PERSIST, fetch = FetchType.LAZY)
+ @JoinColumn(name = "chapter_id")
+ @JsonBackReference
+ private EstimateChapter chapter;
+
+ @ManyToOne(cascade = CascadeType.PERSIST, fetch = FetchType.LAZY)
+ @JoinColumn(name = "header_id")
+ @JsonBackReference
+ private EstimateHeader header;
+
+ @ManyToOne(cascade = CascadeType.MERGE, fetch = FetchType.LAZY)
+ @JoinColumn(name = "smet_id")
+ @JsonBackReference
+ private EstimateSmet smet;
+
+ public void addHeader(EstimateHeader header) {
+ this.header = header;
+ }
+
+ public void addChapter(EstimateChapter chapter) {
+ this.chapter = chapter;
+ }
+}
diff --git a/src/main/java/com/ibcon/sproject/domain/smet/EstimateSmrToPersistListener.java b/src/main/java/com/ibcon/sproject/domain/smet/EstimateSmrToPersistListener.java
new file mode 100644
index 0000000..83e1e4e
--- /dev/null
+++ b/src/main/java/com/ibcon/sproject/domain/smet/EstimateSmrToPersistListener.java
@@ -0,0 +1,33 @@
+package com.ibcon.sproject.domain.smet;
+
+import javax.persistence.PrePersist;
+import javax.persistence.PreUpdate;
+import java.math.BigDecimal;
+
+public class EstimateSmrToPersistListener {
+
+ @PrePersist
+ @PreUpdate
+ public void checkCalculatedCostBeforeSave(final EstimateSmr smr) {
+ if (smr.getCostEmm() == null) {
+ smr.setCostEmm(smr.getEmCost().subtract(smr.getZmCost() != null ?
+ smr.getZmCost() : BigDecimal.ZERO));
+ } else {
+ smr.setCostEmm(BigDecimal.ZERO);
+ }
+
+ if (smr.getCostFot() == null) {
+ smr.setCostFot((smr.getOzCost() != null ? smr.getOzCost() : BigDecimal.ZERO)
+ .add(smr.getZmCost() != null ? smr.getZmCost() : BigDecimal.ZERO));
+ }
+
+ if (smr.getCostMtr() == null) {
+ smr.setCostMtr(smr.getMtCost());
+ }
+
+ if (smr.getCostKon() == null) {
+ smr.setCostKon((smr.getNrCost() != null ? smr.getNrCost() : BigDecimal.ZERO)
+ .add(smr.getSpCost() != null ? smr.getSpCost() : BigDecimal.ZERO));
+ }
+ }
+}
diff --git a/src/main/java/com/ibcon/sproject/repositories/ActivityRepository.java b/src/main/java/com/ibcon/sproject/repositories/ActivityRepository.java
new file mode 100644
index 0000000..475d15c
--- /dev/null
+++ b/src/main/java/com/ibcon/sproject/repositories/ActivityRepository.java
@@ -0,0 +1,7 @@
+package com.ibcon.sproject.repositories;
+
+import com.ibcon.sproject.domain.Activity;
+import org.springframework.data.repository.CrudRepository;
+
+public interface ActivityRepository extends CrudRepository {
+}
diff --git a/src/main/java/com/ibcon/sproject/repositories/EstimateChapterRepository.java b/src/main/java/com/ibcon/sproject/repositories/EstimateChapterRepository.java
new file mode 100644
index 0000000..aa57936
--- /dev/null
+++ b/src/main/java/com/ibcon/sproject/repositories/EstimateChapterRepository.java
@@ -0,0 +1,11 @@
+package com.ibcon.sproject.repositories;
+
+import com.ibcon.sproject.domain.smet.EstimateChapter;
+import com.ibcon.sproject.domain.smet.EstimateSmet;
+import org.springframework.data.repository.CrudRepository;
+
+import java.util.List;
+
+public interface EstimateChapterRepository extends CrudRepository {
+ List findAllBySmetId(Integer smetId);
+}
diff --git a/src/main/java/com/ibcon/sproject/repositories/EstimateHeaderRepository.java b/src/main/java/com/ibcon/sproject/repositories/EstimateHeaderRepository.java
new file mode 100644
index 0000000..6c3bcb7
--- /dev/null
+++ b/src/main/java/com/ibcon/sproject/repositories/EstimateHeaderRepository.java
@@ -0,0 +1,12 @@
+package com.ibcon.sproject.repositories;
+
+import com.ibcon.sproject.domain.smet.EstimateHeader;
+import com.ibcon.sproject.domain.smet.EstimateSmet;
+import org.springframework.data.repository.CrudRepository;
+
+import java.util.List;
+
+public interface EstimateHeaderRepository extends CrudRepository {
+ List findAllBySmetId(Integer smetId);
+ List findAllBySmet(EstimateSmet smet);
+}
diff --git a/src/main/java/com/ibcon/sproject/repositories/EstimateRegionRepository.java b/src/main/java/com/ibcon/sproject/repositories/EstimateRegionRepository.java
new file mode 100644
index 0000000..54a27c4
--- /dev/null
+++ b/src/main/java/com/ibcon/sproject/repositories/EstimateRegionRepository.java
@@ -0,0 +1,7 @@
+package com.ibcon.sproject.repositories;
+
+import com.ibcon.sproject.domain.smet.EstimateRegion;
+import org.springframework.data.repository.CrudRepository;
+
+public interface EstimateRegionRepository extends CrudRepository {
+}
diff --git a/src/main/java/com/ibcon/sproject/repositories/EstimateSmetRepository.java b/src/main/java/com/ibcon/sproject/repositories/EstimateSmetRepository.java
new file mode 100644
index 0000000..7d06e29
--- /dev/null
+++ b/src/main/java/com/ibcon/sproject/repositories/EstimateSmetRepository.java
@@ -0,0 +1,12 @@
+package com.ibcon.sproject.repositories;
+
+import com.ibcon.sproject.domain.WBS;
+import com.ibcon.sproject.domain.smet.EstimateSmet;
+import org.springframework.data.repository.CrudRepository;
+
+import java.util.List;
+import java.util.Set;
+
+public interface EstimateSmetRepository extends CrudRepository {
+ List findByWbsSet_Id(Integer id);
+}
diff --git a/src/main/java/com/ibcon/sproject/repositories/EstimateSmrRepository.java b/src/main/java/com/ibcon/sproject/repositories/EstimateSmrRepository.java
new file mode 100644
index 0000000..4bf9f5d
--- /dev/null
+++ b/src/main/java/com/ibcon/sproject/repositories/EstimateSmrRepository.java
@@ -0,0 +1,13 @@
+package com.ibcon.sproject.repositories;
+
+import com.ibcon.sproject.domain.smet.EstimateSmr;
+import org.springframework.data.repository.CrudRepository;
+
+import java.util.List;
+
+public interface EstimateSmrRepository extends CrudRepository {
+ List findAllBySmetId(Integer smetId);
+ List findAllByChapterIdAndHeaderId(Integer chapterId, Integer headerId);
+ List findAllByChapterId(Integer chapterId);
+ List findAllByHeaderId(Integer headerId);
+}
diff --git a/src/main/java/com/ibcon/sproject/repositories/LinkRepository.java b/src/main/java/com/ibcon/sproject/repositories/LinkRepository.java
new file mode 100644
index 0000000..f72ee4f
--- /dev/null
+++ b/src/main/java/com/ibcon/sproject/repositories/LinkRepository.java
@@ -0,0 +1,11 @@
+package com.ibcon.sproject.repositories;
+
+import com.ibcon.sproject.domain.Link;
+import org.springframework.data.repository.CrudRepository;
+
+import java.util.List;
+
+public interface LinkRepository extends CrudRepository {
+ List findAllByActivity_Id(Integer activityId);
+ Link findByActivity_IdAndSmr_Id(Integer activityId, Integer smrId);
+}
diff --git a/src/main/java/com/ibcon/factage_web/repositories/ProjectRepository.java b/src/main/java/com/ibcon/sproject/repositories/ProjectRepository.java
similarity index 69%
rename from src/main/java/com/ibcon/factage_web/repositories/ProjectRepository.java
rename to src/main/java/com/ibcon/sproject/repositories/ProjectRepository.java
index ff2a10a..2f7d304 100644
--- a/src/main/java/com/ibcon/factage_web/repositories/ProjectRepository.java
+++ b/src/main/java/com/ibcon/sproject/repositories/ProjectRepository.java
@@ -1,6 +1,6 @@
-package com.ibcon.factage_web.repositories;
+package com.ibcon.sproject.repositories;
-import com.ibcon.factage_web.domain.Project;
+import com.ibcon.sproject.domain.Project;
import org.springframework.data.repository.CrudRepository;
public interface ProjectRepository extends CrudRepository {
diff --git a/src/main/java/com/ibcon/factage_web/repositories/RoleRepository.java b/src/main/java/com/ibcon/sproject/repositories/RoleRepository.java
similarity index 61%
rename from src/main/java/com/ibcon/factage_web/repositories/RoleRepository.java
rename to src/main/java/com/ibcon/sproject/repositories/RoleRepository.java
index 6b0dd66..ec32373 100644
--- a/src/main/java/com/ibcon/factage_web/repositories/RoleRepository.java
+++ b/src/main/java/com/ibcon/sproject/repositories/RoleRepository.java
@@ -1,6 +1,6 @@
-package com.ibcon.factage_web.repositories;
+package com.ibcon.sproject.repositories;
-import com.ibcon.factage_web.domain.Role;
+import com.ibcon.sproject.domain.Role;
import org.springframework.data.repository.CrudRepository;
public interface RoleRepository extends CrudRepository {
diff --git a/src/main/java/com/ibcon/factage_web/repositories/UserRepository.java b/src/main/java/com/ibcon/sproject/repositories/UserRepository.java
similarity index 66%
rename from src/main/java/com/ibcon/factage_web/repositories/UserRepository.java
rename to src/main/java/com/ibcon/sproject/repositories/UserRepository.java
index 576444f..0494694 100644
--- a/src/main/java/com/ibcon/factage_web/repositories/UserRepository.java
+++ b/src/main/java/com/ibcon/sproject/repositories/UserRepository.java
@@ -1,6 +1,6 @@
-package com.ibcon.factage_web.repositories;
+package com.ibcon.sproject.repositories;
-import com.ibcon.factage_web.domain.User;
+import com.ibcon.sproject.domain.User;
import org.springframework.data.repository.CrudRepository;
public interface UserRepository extends CrudRepository {
diff --git a/src/main/java/com/ibcon/sproject/repositories/WBSRepository.java b/src/main/java/com/ibcon/sproject/repositories/WBSRepository.java
new file mode 100644
index 0000000..cdc50da
--- /dev/null
+++ b/src/main/java/com/ibcon/sproject/repositories/WBSRepository.java
@@ -0,0 +1,16 @@
+package com.ibcon.sproject.repositories;
+
+import com.ibcon.sproject.domain.WBS;
+import com.ibcon.sproject.domain.smet.EstimateSmet;
+import org.springframework.data.jpa.repository.Query;
+import org.springframework.data.repository.CrudRepository;
+import org.springframework.data.repository.query.Param;
+
+import java.util.List;
+
+public interface WBSRepository extends CrudRepository {
+ List findAllByProjectId(Integer id);
+
+// @Query("SELECT w.smets FROM WBS w WHERE w.id = :id")
+// List findEstimateSmetsByWbsId(@Param("id") int id);
+}
diff --git a/src/main/java/com/ibcon/factage_web/services/UserService1.java b/src/main/java/com/ibcon/sproject/services/UserService1.java
similarity index 66%
rename from src/main/java/com/ibcon/factage_web/services/UserService1.java
rename to src/main/java/com/ibcon/sproject/services/UserService1.java
index fb639f8..8727583 100644
--- a/src/main/java/com/ibcon/factage_web/services/UserService1.java
+++ b/src/main/java/com/ibcon/sproject/services/UserService1.java
@@ -1,6 +1,6 @@
-package com.ibcon.factage_web.services;
+package com.ibcon.sproject.services;
-import com.ibcon.factage_web.domain.User;
+import com.ibcon.sproject.domain.User;
public interface UserService1 {
Iterable listAllUsers();
diff --git a/src/main/java/com/ibcon/factage_web/services/UserServiceImpl.java b/src/main/java/com/ibcon/sproject/services/UserServiceImpl.java
similarity index 84%
rename from src/main/java/com/ibcon/factage_web/services/UserServiceImpl.java
rename to src/main/java/com/ibcon/sproject/services/UserServiceImpl.java
index d9f8cf6..d118ab1 100644
--- a/src/main/java/com/ibcon/factage_web/services/UserServiceImpl.java
+++ b/src/main/java/com/ibcon/sproject/services/UserServiceImpl.java
@@ -1,8 +1,8 @@
-package com.ibcon.factage_web.services;
+package com.ibcon.sproject.services;
-import com.ibcon.factage_web.domain.User;
-import com.ibcon.factage_web.repositories.UserRepository;
+import com.ibcon.sproject.domain.User;
+import com.ibcon.sproject.repositories.UserRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
diff --git a/src/main/java/com/ibcon/factage_web/services/crud/CrudService.java b/src/main/java/com/ibcon/sproject/services/crud/CrudService.java
similarity index 79%
rename from src/main/java/com/ibcon/factage_web/services/crud/CrudService.java
rename to src/main/java/com/ibcon/sproject/services/crud/CrudService.java
index 53d7b10..c575461 100644
--- a/src/main/java/com/ibcon/factage_web/services/crud/CrudService.java
+++ b/src/main/java/com/ibcon/sproject/services/crud/CrudService.java
@@ -1,4 +1,4 @@
-package com.ibcon.factage_web.services.crud;
+package com.ibcon.sproject.services.crud;
import java.util.List;
diff --git a/src/main/java/com/ibcon/sproject/services/crud/activity/ActivityService.java b/src/main/java/com/ibcon/sproject/services/crud/activity/ActivityService.java
new file mode 100644
index 0000000..c04141e
--- /dev/null
+++ b/src/main/java/com/ibcon/sproject/services/crud/activity/ActivityService.java
@@ -0,0 +1,7 @@
+package com.ibcon.sproject.services.crud.activity;
+
+import com.ibcon.sproject.domain.Activity;
+import com.ibcon.sproject.services.crud.CrudService;
+
+public interface ActivityService extends CrudService {
+}
diff --git a/src/main/java/com/ibcon/sproject/services/crud/activity/ActivityServiceImpl.java b/src/main/java/com/ibcon/sproject/services/crud/activity/ActivityServiceImpl.java
new file mode 100644
index 0000000..80aba26
--- /dev/null
+++ b/src/main/java/com/ibcon/sproject/services/crud/activity/ActivityServiceImpl.java
@@ -0,0 +1,45 @@
+package com.ibcon.sproject.services.crud.activity;
+
+import com.ibcon.sproject.domain.Activity;
+import com.ibcon.sproject.repositories.ActivityRepository;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.ArrayList;
+import java.util.List;
+
+@Service
+public class ActivityServiceImpl implements ActivityService {
+ private ActivityRepository activityRepository;
+
+ @Autowired
+ public void setActivityRepository(ActivityRepository activityRepository) {
+ this.activityRepository = activityRepository;
+ }
+
+ @Override
+ public List> listAll() {
+ List activityList = new ArrayList<>();
+ activityRepository.findAll().forEach(activityList::add);
+ return activityList;
+ }
+
+ @Override
+ public Activity getById(Integer id) {
+ return activityRepository.findOne(id);
+ }
+
+ @Override
+ public Activity saveOrUpdate(Activity domainObject) {
+ if (domainObject.getProjectId() == null) {
+ Integer projectId = domainObject.getWbs().getProject().getId();
+ domainObject.setProjectId(projectId);
+ }
+ return activityRepository.save(domainObject);
+ }
+
+ @Override
+ public void delete(Integer id) {
+ activityRepository.delete(id);
+ }
+}
diff --git a/src/main/java/com/ibcon/sproject/services/crud/estimatechapter/EstimateChapterService.java b/src/main/java/com/ibcon/sproject/services/crud/estimatechapter/EstimateChapterService.java
new file mode 100644
index 0000000..a120081
--- /dev/null
+++ b/src/main/java/com/ibcon/sproject/services/crud/estimatechapter/EstimateChapterService.java
@@ -0,0 +1,10 @@
+package com.ibcon.sproject.services.crud.estimatechapter;
+
+import com.ibcon.sproject.domain.smet.EstimateChapter;
+import com.ibcon.sproject.services.crud.CrudService;
+
+import java.util.List;
+
+public interface EstimateChapterService extends CrudService {
+ List findAllBySmetId(Integer smetId);
+}
diff --git a/src/main/java/com/ibcon/sproject/services/crud/estimatechapter/EstimateChapterServiceImpl.java b/src/main/java/com/ibcon/sproject/services/crud/estimatechapter/EstimateChapterServiceImpl.java
new file mode 100644
index 0000000..fc3187d
--- /dev/null
+++ b/src/main/java/com/ibcon/sproject/services/crud/estimatechapter/EstimateChapterServiceImpl.java
@@ -0,0 +1,47 @@
+package com.ibcon.sproject.services.crud.estimatechapter;
+
+import com.ibcon.sproject.domain.smet.EstimateChapter;
+import com.ibcon.sproject.repositories.EstimateChapterRepository;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.ArrayList;
+import java.util.List;
+
+@Service
+public class EstimateChapterServiceImpl implements EstimateChapterService {
+
+ private EstimateChapterRepository estimateChapterRepository;
+
+ @Autowired
+ public void setEstimateChapterRepository(EstimateChapterRepository estimateChapterRepository) {
+ this.estimateChapterRepository = estimateChapterRepository;
+ }
+
+ @Override
+ public List> listAll() {
+ List estimateChapterList = new ArrayList<>();
+ estimateChapterRepository.findAll().forEach(estimateChapterList::add);
+ return estimateChapterList;
+ }
+
+ @Override
+ public EstimateChapter getById(Integer id) {
+ return estimateChapterRepository.findOne(id);
+ }
+
+ @Override
+ public EstimateChapter saveOrUpdate(EstimateChapter domainObject) {
+ return estimateChapterRepository.save(domainObject);
+ }
+
+ @Override
+ public void delete(Integer id) {
+ estimateChapterRepository.delete(id);
+ }
+
+ @Override
+ public List findAllBySmetId(Integer smetId) {
+ return estimateChapterRepository.findAllBySmetId(smetId);
+ }
+}
diff --git a/src/main/java/com/ibcon/sproject/services/crud/estimateheader/EstimateHeaderService.java b/src/main/java/com/ibcon/sproject/services/crud/estimateheader/EstimateHeaderService.java
new file mode 100644
index 0000000..b624520
--- /dev/null
+++ b/src/main/java/com/ibcon/sproject/services/crud/estimateheader/EstimateHeaderService.java
@@ -0,0 +1,12 @@
+package com.ibcon.sproject.services.crud.estimateheader;
+
+import com.ibcon.sproject.domain.smet.EstimateHeader;
+import com.ibcon.sproject.domain.smet.EstimateSmet;
+import com.ibcon.sproject.services.crud.CrudService;
+
+import java.util.List;
+
+public interface EstimateHeaderService extends CrudService {
+ List findAllBySmetId(Integer smetId);
+ List findAllBySmet(EstimateSmet smet);
+}
diff --git a/src/main/java/com/ibcon/sproject/services/crud/estimateheader/EstimateHeaderServiceImpl.java b/src/main/java/com/ibcon/sproject/services/crud/estimateheader/EstimateHeaderServiceImpl.java
new file mode 100644
index 0000000..b111684
--- /dev/null
+++ b/src/main/java/com/ibcon/sproject/services/crud/estimateheader/EstimateHeaderServiceImpl.java
@@ -0,0 +1,53 @@
+package com.ibcon.sproject.services.crud.estimateheader;
+
+import com.ibcon.sproject.domain.smet.EstimateHeader;
+import com.ibcon.sproject.domain.smet.EstimateSmet;
+import com.ibcon.sproject.repositories.EstimateHeaderRepository;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.ArrayList;
+import java.util.List;
+
+@Service
+public class EstimateHeaderServiceImpl implements EstimateHeaderService {
+
+ private EstimateHeaderRepository estimateHeaderRepository;
+
+ @Autowired
+ public void setEstimateHeaderRepository(EstimateHeaderRepository estimateHeaderRepository) {
+ this.estimateHeaderRepository = estimateHeaderRepository;
+ }
+
+ @Override
+ public List> listAll() {
+ List estimateHeaderList = new ArrayList<>();
+ estimateHeaderRepository.findAll().forEach(estimateHeaderList::add);
+ return estimateHeaderList;
+ }
+
+ @Override
+ public EstimateHeader getById(Integer id) {
+ return estimateHeaderRepository.findOne(id);
+ }
+
+ @Override
+ public EstimateHeader saveOrUpdate(EstimateHeader domainObject) {
+ return estimateHeaderRepository.save(domainObject);
+ }
+
+ @Override
+ public void delete(Integer id) {
+ estimateHeaderRepository.delete(id);
+ }
+
+ @Override
+ public List findAllBySmetId(Integer smetId) {
+ return estimateHeaderRepository.findAllBySmetId(smetId);
+ }
+
+ @Override
+ public List findAllBySmet(EstimateSmet smet) {
+ return estimateHeaderRepository.findAllBySmet(smet);
+ }
+}
diff --git a/src/main/java/com/ibcon/sproject/services/crud/estimateregion/EstimateRegionService.java b/src/main/java/com/ibcon/sproject/services/crud/estimateregion/EstimateRegionService.java
new file mode 100644
index 0000000..cd56005
--- /dev/null
+++ b/src/main/java/com/ibcon/sproject/services/crud/estimateregion/EstimateRegionService.java
@@ -0,0 +1,7 @@
+package com.ibcon.sproject.services.crud.estimateregion;
+
+import com.ibcon.sproject.domain.smet.EstimateRegion;
+import com.ibcon.sproject.services.crud.CrudService;
+
+public interface EstimateRegionService extends CrudService {
+}
diff --git a/src/main/java/com/ibcon/sproject/services/crud/estimateregion/EstimateRegionServiceImpl.java b/src/main/java/com/ibcon/sproject/services/crud/estimateregion/EstimateRegionServiceImpl.java
new file mode 100644
index 0000000..8d75672
--- /dev/null
+++ b/src/main/java/com/ibcon/sproject/services/crud/estimateregion/EstimateRegionServiceImpl.java
@@ -0,0 +1,42 @@
+package com.ibcon.sproject.services.crud.estimateregion;
+
+import com.ibcon.sproject.domain.smet.EstimateRegion;
+import com.ibcon.sproject.repositories.EstimateRegionRepository;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.ArrayList;
+import java.util.List;
+
+@Service
+public class EstimateRegionServiceImpl implements EstimateRegionService {
+
+ private EstimateRegionRepository estimateRegionRepository;
+
+ @Autowired
+ public void setEstimateRegionRepository(EstimateRegionRepository estimateRegionRepository) {
+ this.estimateRegionRepository = estimateRegionRepository;
+ }
+
+ @Override
+ public List> listAll() {
+ List estimateRegionList = new ArrayList<>();
+ estimateRegionRepository.findAll().forEach(estimateRegionList::add);
+ return estimateRegionList;
+ }
+
+ @Override
+ public EstimateRegion getById(Integer id) {
+ return estimateRegionRepository.findOne(id);
+ }
+
+ @Override
+ public EstimateRegion saveOrUpdate(EstimateRegion domainObject) {
+ return estimateRegionRepository.save(domainObject);
+ }
+
+ @Override
+ public void delete(Integer id) {
+ estimateRegionRepository.delete(id);
+ }
+}
diff --git a/src/main/java/com/ibcon/sproject/services/crud/estimatesmet/EstimateSmetService.java b/src/main/java/com/ibcon/sproject/services/crud/estimatesmet/EstimateSmetService.java
new file mode 100644
index 0000000..7ffb6f8
--- /dev/null
+++ b/src/main/java/com/ibcon/sproject/services/crud/estimatesmet/EstimateSmetService.java
@@ -0,0 +1,10 @@
+package com.ibcon.sproject.services.crud.estimatesmet;
+
+import com.ibcon.sproject.domain.smet.EstimateSmet;
+import com.ibcon.sproject.services.crud.CrudService;
+
+import java.util.List;
+
+public interface EstimateSmetService extends CrudService {
+ List findByWbsSetId(Integer id);
+}
diff --git a/src/main/java/com/ibcon/sproject/services/crud/estimatesmet/EstimateSmetServiceImpl.java b/src/main/java/com/ibcon/sproject/services/crud/estimatesmet/EstimateSmetServiceImpl.java
new file mode 100644
index 0000000..009ca94
--- /dev/null
+++ b/src/main/java/com/ibcon/sproject/services/crud/estimatesmet/EstimateSmetServiceImpl.java
@@ -0,0 +1,50 @@
+package com.ibcon.sproject.services.crud.estimatesmet;
+
+import com.ibcon.sproject.domain.WBS;
+import com.ibcon.sproject.domain.smet.EstimateSmet;
+import com.ibcon.sproject.repositories.EstimateSmetRepository;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Set;
+
+@Service
+public class EstimateSmetServiceImpl implements EstimateSmetService {
+
+ private EstimateSmetRepository estimateSmetRepository;
+
+ @Autowired
+ public void setEstimateSmetRepository(EstimateSmetRepository estimateSmetRepository) {
+ this.estimateSmetRepository = estimateSmetRepository;
+ }
+
+ @Override
+ public List> listAll() {
+ List estimateSmetList = new ArrayList<>();
+ estimateSmetRepository.findAll().forEach(estimateSmetList::add);
+ return estimateSmetList;
+ }
+
+ @Override
+ public EstimateSmet getById(Integer id) {
+ return estimateSmetRepository.findOne(id);
+ }
+
+ @Override
+ public EstimateSmet saveOrUpdate(EstimateSmet domainObject) {
+ return estimateSmetRepository.save(domainObject);
+ }
+
+ @Override
+ public void delete(Integer id) {
+ estimateSmetRepository.delete(id);
+ }
+
+
+ @Override
+ public List findByWbsSetId(Integer id) {
+ return estimateSmetRepository.findByWbsSet_Id(id);
+ }
+}
diff --git a/src/main/java/com/ibcon/sproject/services/crud/estimatesmr/EstimateSmrService.java b/src/main/java/com/ibcon/sproject/services/crud/estimatesmr/EstimateSmrService.java
new file mode 100644
index 0000000..6fdfeaf
--- /dev/null
+++ b/src/main/java/com/ibcon/sproject/services/crud/estimatesmr/EstimateSmrService.java
@@ -0,0 +1,13 @@
+package com.ibcon.sproject.services.crud.estimatesmr;
+
+import com.ibcon.sproject.domain.smet.EstimateSmr;
+import com.ibcon.sproject.services.crud.CrudService;
+
+import java.util.List;
+
+public interface EstimateSmrService extends CrudService {
+ List findAllBySmetId(Integer smetId);
+ List findAllByChapterIdAndHeaderId(Integer chapterId, Integer headerId);
+ List findAllByChapterId(Integer chapterId);
+ List findAllByHeaderId(Integer headerId);
+}
diff --git a/src/main/java/com/ibcon/sproject/services/crud/estimatesmr/EstimateSmrServiceImpl.java b/src/main/java/com/ibcon/sproject/services/crud/estimatesmr/EstimateSmrServiceImpl.java
new file mode 100644
index 0000000..3d2dde7
--- /dev/null
+++ b/src/main/java/com/ibcon/sproject/services/crud/estimatesmr/EstimateSmrServiceImpl.java
@@ -0,0 +1,63 @@
+package com.ibcon.sproject.services.crud.estimatesmr;
+
+import com.ibcon.sproject.domain.smet.EstimateSmr;
+import com.ibcon.sproject.repositories.EstimateSmrRepository;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.math.BigDecimal;
+import java.util.ArrayList;
+import java.util.List;
+
+@Service
+public class EstimateSmrServiceImpl implements EstimateSmrService {
+
+ private EstimateSmrRepository estimateSmrRepository;
+
+ @Autowired
+ public void setEstimateSmrRepository(EstimateSmrRepository estimateSmrRepository) {
+ this.estimateSmrRepository = estimateSmrRepository;
+ }
+
+ @Override
+ public List> listAll() {
+ List estimateSmrList = new ArrayList<>();
+ estimateSmrRepository.findAll().forEach(estimateSmrList::add);
+ return estimateSmrList;
+ }
+
+ @Override
+ public EstimateSmr getById(Integer id) {
+ return estimateSmrRepository.findOne(id);
+ }
+
+ @Override
+ public EstimateSmr saveOrUpdate(EstimateSmr domainObject) {
+ return estimateSmrRepository.save(domainObject);
+ }
+
+ @Override
+ public void delete(Integer id) {
+ estimateSmrRepository.delete(id);
+ }
+
+ @Override
+ public List findAllBySmetId(Integer smetId) {
+ return estimateSmrRepository.findAllBySmetId(smetId);
+ }
+
+ @Override
+ public List findAllByChapterIdAndHeaderId(Integer chapterId, Integer headerId) {
+ return estimateSmrRepository.findAllByChapterIdAndHeaderId(chapterId, headerId);
+ }
+
+ @Override
+ public List findAllByChapterId(Integer chapterId) {
+ return estimateSmrRepository.findAllByChapterId(chapterId);
+ }
+
+ @Override
+ public List findAllByHeaderId(Integer headerId) {
+ return estimateSmrRepository.findAllByHeaderId(headerId);
+ }
+}
diff --git a/src/main/java/com/ibcon/sproject/services/crud/link/LinkService.java b/src/main/java/com/ibcon/sproject/services/crud/link/LinkService.java
new file mode 100644
index 0000000..d532b29
--- /dev/null
+++ b/src/main/java/com/ibcon/sproject/services/crud/link/LinkService.java
@@ -0,0 +1,11 @@
+package com.ibcon.sproject.services.crud.link;
+
+import com.ibcon.sproject.domain.Link;
+import com.ibcon.sproject.services.crud.CrudService;
+
+import java.util.List;
+
+public interface LinkService extends CrudService {
+ List findAllByActivityId(Integer activityId);
+ Link findByActivityIdAndSmrId(Integer activityId, Integer smrId);
+}
diff --git a/src/main/java/com/ibcon/sproject/services/crud/link/LinkServiceImpl.java b/src/main/java/com/ibcon/sproject/services/crud/link/LinkServiceImpl.java
new file mode 100644
index 0000000..fb4b5d9
--- /dev/null
+++ b/src/main/java/com/ibcon/sproject/services/crud/link/LinkServiceImpl.java
@@ -0,0 +1,77 @@
+package com.ibcon.sproject.services.crud.link;
+
+import com.ibcon.sproject.domain.Activity;
+import com.ibcon.sproject.domain.Link;
+import com.ibcon.sproject.domain.smet.EstimateSmr;
+import com.ibcon.sproject.repositories.ActivityRepository;
+import com.ibcon.sproject.repositories.EstimateSmrRepository;
+import com.ibcon.sproject.repositories.LinkRepository;
+import com.ibcon.sproject.services.crud.activity.ActivityService;
+import com.ibcon.sproject.services.crud.estimatesmr.EstimateSmrService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.ArrayList;
+import java.util.List;
+
+@Service
+public class LinkServiceImpl implements LinkService {
+
+ private LinkRepository linkRepository;
+ private ActivityService activityService;
+ private EstimateSmrService estimateSmrService;
+
+ @Autowired
+ public void setLinkRepository(LinkRepository linkRepository) {
+ this.linkRepository = linkRepository;
+ }
+
+ @Autowired
+ public void setActivityService(ActivityService activityService) {
+ this.activityService = activityService;
+ }
+
+ @Autowired
+ public void setEstimateSmrService(EstimateSmrService estimateSmrService) {
+ this.estimateSmrService = estimateSmrService;
+ }
+
+ @Override
+ public List> listAll() {
+ List linkList = new ArrayList<>();
+ linkRepository.findAll().forEach(linkList::add);
+ return linkList;
+ }
+
+ @Override
+ public Link getById(Integer id) {
+ return linkRepository.findOne(id);
+ }
+
+ @Override
+ public Link saveOrUpdate(Link domainObject) {
+ return linkRepository.save(domainObject);
+ }
+
+ @Override
+ public void delete(Integer id) {
+ linkRepository.delete(id);
+ }
+
+ @Override
+ public List findAllByActivityId(Integer activityId) {
+ return linkRepository.findAllByActivity_Id(activityId);
+ }
+
+ @Override
+ public Link findByActivityIdAndSmrId(Integer activityId, Integer smrId) {
+ Link link = linkRepository.findByActivity_IdAndSmr_Id(activityId, smrId);
+ if (link == null) {
+ Activity activity = activityService.getById(activityId);
+ EstimateSmr smr = estimateSmrService.getById(smrId);
+ link = new Link(activity, smr);
+ }
+
+ return link;
+ }
+}
diff --git a/src/main/java/com/ibcon/sproject/services/crud/project/ProjectService.java b/src/main/java/com/ibcon/sproject/services/crud/project/ProjectService.java
new file mode 100644
index 0000000..d8444bb
--- /dev/null
+++ b/src/main/java/com/ibcon/sproject/services/crud/project/ProjectService.java
@@ -0,0 +1,8 @@
+package com.ibcon.sproject.services.crud.project;
+
+import com.ibcon.sproject.domain.Project;
+import com.ibcon.sproject.services.crud.CrudService;
+
+public interface ProjectService extends CrudService {
+ Project findByProjectObjectId(Integer projectObjectId);
+}
diff --git a/src/main/java/com/ibcon/factage_web/services/crud/project/ProjectServiceImpl.java b/src/main/java/com/ibcon/sproject/services/crud/project/ProjectServiceImpl.java
similarity index 87%
rename from src/main/java/com/ibcon/factage_web/services/crud/project/ProjectServiceImpl.java
rename to src/main/java/com/ibcon/sproject/services/crud/project/ProjectServiceImpl.java
index b3e4edf..621c191 100644
--- a/src/main/java/com/ibcon/factage_web/services/crud/project/ProjectServiceImpl.java
+++ b/src/main/java/com/ibcon/sproject/services/crud/project/ProjectServiceImpl.java
@@ -1,7 +1,7 @@
-package com.ibcon.factage_web.services.crud.project;
+package com.ibcon.sproject.services.crud.project;
-import com.ibcon.factage_web.domain.Project;
-import com.ibcon.factage_web.repositories.ProjectRepository;
+import com.ibcon.sproject.domain.Project;
+import com.ibcon.sproject.repositories.ProjectRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
diff --git a/src/main/java/com/ibcon/sproject/services/crud/role/RoleService.java b/src/main/java/com/ibcon/sproject/services/crud/role/RoleService.java
new file mode 100644
index 0000000..5f228e5
--- /dev/null
+++ b/src/main/java/com/ibcon/sproject/services/crud/role/RoleService.java
@@ -0,0 +1,7 @@
+package com.ibcon.sproject.services.crud.role;
+
+import com.ibcon.sproject.domain.Role;
+import com.ibcon.sproject.services.crud.CrudService;
+
+public interface RoleService extends CrudService {
+}
diff --git a/src/main/java/com/ibcon/factage_web/services/crud/role/RoleServiceImpl.java b/src/main/java/com/ibcon/sproject/services/crud/role/RoleServiceImpl.java
similarity index 84%
rename from src/main/java/com/ibcon/factage_web/services/crud/role/RoleServiceImpl.java
rename to src/main/java/com/ibcon/sproject/services/crud/role/RoleServiceImpl.java
index 0aae809..6ba201a 100644
--- a/src/main/java/com/ibcon/factage_web/services/crud/role/RoleServiceImpl.java
+++ b/src/main/java/com/ibcon/sproject/services/crud/role/RoleServiceImpl.java
@@ -1,7 +1,7 @@
-package com.ibcon.factage_web.services.crud.role;
+package com.ibcon.sproject.services.crud.role;
-import com.ibcon.factage_web.domain.Role;
-import com.ibcon.factage_web.repositories.RoleRepository;
+import com.ibcon.sproject.domain.Role;
+import com.ibcon.sproject.repositories.RoleRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Profile;
import org.springframework.stereotype.Service;
@@ -10,7 +10,6 @@
import java.util.List;
@Service
-@Profile("springdatajpa")
public class RoleServiceImpl implements RoleService {
private RoleRepository roleRepository;
diff --git a/src/main/java/com/ibcon/factage_web/services/crud/user/UserDetailsImpl.java b/src/main/java/com/ibcon/sproject/services/crud/user/UserDetailsImpl.java
similarity index 90%
rename from src/main/java/com/ibcon/factage_web/services/crud/user/UserDetailsImpl.java
rename to src/main/java/com/ibcon/sproject/services/crud/user/UserDetailsImpl.java
index 5f8a8a2..89a9b85 100644
--- a/src/main/java/com/ibcon/factage_web/services/crud/user/UserDetailsImpl.java
+++ b/src/main/java/com/ibcon/sproject/services/crud/user/UserDetailsImpl.java
@@ -1,4 +1,4 @@
-package com.ibcon.factage_web.services.crud.user;
+package com.ibcon.sproject.services.crud.user;
import org.springframework.security.core.GrantedAuthority;
import org.springframework.security.core.authority.SimpleGrantedAuthority;
@@ -44,6 +44,7 @@ public String getUsername() {
return name;
}
+ //TODO здесь проверять дату
@Override
public boolean isAccountNonExpired() {
return true;
@@ -54,6 +55,7 @@ public boolean isAccountNonLocked() {
return true;
}
+ //TODO здесь проверять дату
@Override
public boolean isCredentialsNonExpired() {
return true;
diff --git a/src/main/java/com/ibcon/factage_web/services/crud/user/UserDetailsServiceImpl.java b/src/main/java/com/ibcon/sproject/services/crud/user/UserDetailsServiceImpl.java
similarity index 93%
rename from src/main/java/com/ibcon/factage_web/services/crud/user/UserDetailsServiceImpl.java
rename to src/main/java/com/ibcon/sproject/services/crud/user/UserDetailsServiceImpl.java
index c20c229..e4dbb92 100644
--- a/src/main/java/com/ibcon/factage_web/services/crud/user/UserDetailsServiceImpl.java
+++ b/src/main/java/com/ibcon/sproject/services/crud/user/UserDetailsServiceImpl.java
@@ -1,6 +1,6 @@
-package com.ibcon.factage_web.services.crud.user;
+package com.ibcon.sproject.services.crud.user;
-import com.ibcon.factage_web.domain.User;
+import com.ibcon.sproject.domain.User;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.core.convert.converter.Converter;
diff --git a/src/main/java/com/ibcon/sproject/services/crud/user/UserServiceCrud.java b/src/main/java/com/ibcon/sproject/services/crud/user/UserServiceCrud.java
new file mode 100644
index 0000000..8116c27
--- /dev/null
+++ b/src/main/java/com/ibcon/sproject/services/crud/user/UserServiceCrud.java
@@ -0,0 +1,10 @@
+package com.ibcon.sproject.services.crud.user;
+
+import com.ibcon.sproject.creators.user.UserFormModelCreator;
+import com.ibcon.sproject.domain.User;
+import com.ibcon.sproject.services.crud.CrudService;
+
+public interface UserServiceCrud extends CrudService {
+ User findByUserName(String username);
+ User saveOrUpdate(UserFormModelCreator userFormModelCreator);
+}
diff --git a/src/main/java/com/ibcon/factage_web/services/crud/user/UserServiceCrudImp.java b/src/main/java/com/ibcon/sproject/services/crud/user/UserServiceCrudImp.java
similarity index 61%
rename from src/main/java/com/ibcon/factage_web/services/crud/user/UserServiceCrudImp.java
rename to src/main/java/com/ibcon/sproject/services/crud/user/UserServiceCrudImp.java
index 478b6d0..cc1822c 100644
--- a/src/main/java/com/ibcon/factage_web/services/crud/user/UserServiceCrudImp.java
+++ b/src/main/java/com/ibcon/sproject/services/crud/user/UserServiceCrudImp.java
@@ -1,8 +1,11 @@
-package com.ibcon.factage_web.services.crud.user;
+package com.ibcon.sproject.services.crud.user;
-import com.ibcon.factage_web.domain.User;
-import com.ibcon.factage_web.repositories.UserRepository;
-import com.ibcon.factage_web.services.encryption.EncryptionService;
+import com.ibcon.sproject.creators.user.UserFormModelCreator;
+import com.ibcon.sproject.domain.User;
+import com.ibcon.sproject.repositories.RoleRepository;
+import com.ibcon.sproject.repositories.UserRepository;
+import com.ibcon.sproject.services.crud.role.RoleService;
+import com.ibcon.sproject.services.encryption.EncryptionService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Profile;
import org.springframework.stereotype.Service;
@@ -11,17 +14,23 @@
import java.util.ArrayList;
import java.util.List;
-@Service
-@Profile("springdatajpa")
+@Service("userServiceCrud")
public class UserServiceCrudImp implements UserServiceCrud {
private UserRepository userRepository;
+ private RoleService roleService;
+
+ private EncryptionService encryptionService;
+
@Autowired
public void setUserRepository(UserRepository userRepository) {
this.userRepository = userRepository;
}
- private EncryptionService encryptionService;
+ @Autowired
+ public void setRoleService(RoleService roleService) {
+ this.roleService = roleService;
+ }
@Autowired
public void setEncryptionService(EncryptionService encryptionService) {
@@ -48,6 +57,18 @@ public User saveOrUpdate(User domainObject) {
}
return userRepository.save(domainObject);
}
+
+ public User saveOrUpdate(UserFormModelCreator userFormModelCreator) {
+ User newUser = userFormModelCreator.createUser(roleService);
+ if (newUser.getId() != null) {
+ User oldUser = getById(newUser.getId());
+ newUser.setEncryptedPassword(oldUser.getEncryptedPassword());
+ }
+
+
+ return saveOrUpdate(newUser);
+ }
+
@Override
@Transactional
public void delete(Integer id) {
diff --git a/src/main/java/com/ibcon/sproject/services/crud/wbs/WBSService.java b/src/main/java/com/ibcon/sproject/services/crud/wbs/WBSService.java
new file mode 100644
index 0000000..ba73615
--- /dev/null
+++ b/src/main/java/com/ibcon/sproject/services/crud/wbs/WBSService.java
@@ -0,0 +1,12 @@
+package com.ibcon.sproject.services.crud.wbs;
+
+import com.ibcon.sproject.domain.WBS;
+import com.ibcon.sproject.domain.smet.EstimateSmet;
+import com.ibcon.sproject.services.crud.CrudService;
+
+import java.util.List;
+
+public interface WBSService extends CrudService {
+ List findByProjectId(Integer id);
+// List findEstimateSmetsByWbsId(Integer id);
+}
diff --git a/src/main/java/com/ibcon/sproject/services/crud/wbs/WBSServiceImpl.java b/src/main/java/com/ibcon/sproject/services/crud/wbs/WBSServiceImpl.java
new file mode 100644
index 0000000..d427ce7
--- /dev/null
+++ b/src/main/java/com/ibcon/sproject/services/crud/wbs/WBSServiceImpl.java
@@ -0,0 +1,52 @@
+package com.ibcon.sproject.services.crud.wbs;
+
+import com.ibcon.sproject.domain.WBS;
+import com.ibcon.sproject.domain.smet.EstimateSmet;
+import com.ibcon.sproject.repositories.WBSRepository;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.ArrayList;
+import java.util.List;
+
+@Service
+public class WBSServiceImpl implements WBSService {
+ private WBSRepository wbsRepository;
+
+ @Autowired
+ public void setWbsRepository(WBSRepository wbsRepository) {
+ this.wbsRepository = wbsRepository;
+ }
+
+ @Override
+ public List> listAll() {
+ List wbsList = new ArrayList<>();
+ wbsRepository.findAll().forEach(wbsList::add);
+ return wbsList;
+ }
+
+ @Override
+ public WBS getById(Integer id) {
+ return wbsRepository.findOne(id);
+ }
+
+ @Override
+ public WBS saveOrUpdate(WBS domainObject) {
+ return wbsRepository.save(domainObject);
+ }
+
+ @Override
+ public void delete(Integer id) {
+ wbsRepository.delete(id);
+ }
+
+ @Override
+ public List findByProjectId(Integer id) {
+ return wbsRepository.findAllByProjectId(id);
+ }
+
+// @Override
+// public List findEstimateSmetsByWbsId(Integer id) {
+// return wbsRepository.findEstimateSmetsByWbsId(id);
+// }
+}
diff --git a/src/main/java/com/ibcon/factage_web/services/encryption/EncryptionService.java b/src/main/java/com/ibcon/sproject/services/encryption/EncryptionService.java
similarity index 75%
rename from src/main/java/com/ibcon/factage_web/services/encryption/EncryptionService.java
rename to src/main/java/com/ibcon/sproject/services/encryption/EncryptionService.java
index 38fbb89..0ac1266 100644
--- a/src/main/java/com/ibcon/factage_web/services/encryption/EncryptionService.java
+++ b/src/main/java/com/ibcon/sproject/services/encryption/EncryptionService.java
@@ -1,4 +1,4 @@
-package com.ibcon.factage_web.services.encryption;
+package com.ibcon.sproject.services.encryption;
public interface EncryptionService {
String encryptString(String input);
diff --git a/src/main/java/com/ibcon/factage_web/services/encryption/EncryptionServiceImpl.java b/src/main/java/com/ibcon/sproject/services/encryption/EncryptionServiceImpl.java
similarity index 93%
rename from src/main/java/com/ibcon/factage_web/services/encryption/EncryptionServiceImpl.java
rename to src/main/java/com/ibcon/sproject/services/encryption/EncryptionServiceImpl.java
index 4a9af8b..9a0ad60 100644
--- a/src/main/java/com/ibcon/factage_web/services/encryption/EncryptionServiceImpl.java
+++ b/src/main/java/com/ibcon/sproject/services/encryption/EncryptionServiceImpl.java
@@ -1,4 +1,4 @@
-package com.ibcon.factage_web.services.encryption;
+package com.ibcon.sproject.services.encryption;
import org.jasypt.util.password.StrongPasswordEncryptor;
import org.springframework.beans.factory.annotation.Autowired;
diff --git a/src/main/java/com/ibcon/sproject/smet/controller/FileUploadController.java b/src/main/java/com/ibcon/sproject/smet/controller/FileUploadController.java
new file mode 100644
index 0000000..5d7a2b8
--- /dev/null
+++ b/src/main/java/com/ibcon/sproject/smet/controller/FileUploadController.java
@@ -0,0 +1,69 @@
+package com.ibcon.sproject.smet.controller;
+
+import com.ibcon.sproject.converters.xmlsmet.XmlSmetToDomainConverter;
+import com.ibcon.sproject.domain.smet.EstimateSmet;
+import com.ibcon.sproject.services.crud.estimatesmet.EstimateSmetService;
+import com.ibcon.sproject.smet.model.xml.XmlSmet;
+import com.ibcon.sproject.smet.service.UploadedFile;
+import org.jdom2.JDOMException;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.Model;
+import org.springframework.validation.BindingResult;
+import org.springframework.web.bind.annotation.ModelAttribute;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
+import org.springframework.web.bind.annotation.ResponseBody;
+import org.springframework.web.multipart.MultipartFile;
+
+import javax.servlet.http.HttpServletRequest;
+import java.io.File;
+import java.io.IOException;
+
+@Controller
+public class FileUploadController {
+
+ private EstimateSmetService estimateSmetService;
+
+ @Autowired
+ public void setEstimateSmetService(EstimateSmetService estimateSmetService) {
+ this.estimateSmetService = estimateSmetService;
+ }
+
+ @RequestMapping(value = "/save_file")
+ @ResponseBody
+ public void saveFile(HttpServletRequest servletRequest,
+ @ModelAttribute UploadedFile uploadedFile,
+ BindingResult bindingResult, Model model) {
+
+ try {
+ MultipartFile multipartFile = uploadedFile.getMultipartFile();
+ String fileName = multipartFile.getOriginalFilename();
+ File file = new File("D:\\test", fileName);
+ multipartFile.transferTo(file);
+ if (fileName.contains(".xml")) try {
+ XmlSmet xmlSmet = new XmlSmet(file, 0);
+
+ EstimateSmet smet = XmlSmetToDomainConverter.convert(xmlSmet);
+
+ smet.setName("testSmet");
+
+ estimateSmetService.saveOrUpdate(smet);
+
+ System.out.println("uploadDone");
+ } catch (JDOMException e) {
+ e.printStackTrace();
+ }
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ }
+
+ //todo upload
+ @RequestMapping(value = "/test", method = RequestMethod.GET)
+ public String upload(Model model) {
+ return "test";
+ }
+
+
+}
diff --git a/src/main/java/com/ibcon/sproject/smet/model/objects/ChapterNode.java b/src/main/java/com/ibcon/sproject/smet/model/objects/ChapterNode.java
new file mode 100644
index 0000000..217b43b
--- /dev/null
+++ b/src/main/java/com/ibcon/sproject/smet/model/objects/ChapterNode.java
@@ -0,0 +1,30 @@
+package com.ibcon.sproject.smet.model.objects;
+
+import org.jdom2.Element;
+
+public class ChapterNode extends SmetTreeNode {
+
+ private int num;
+ private String sysId;
+ private Double progress = 0.0;
+
+ public ChapterNode(Element e, Integer num) {
+ this.name = e.getAttributeValue("Caption");
+ this.sysId = e.getAttributeValue("SysID");
+ this.num = num;
+ this.isChapter = true;
+ }
+
+
+ public int getNum() {
+ return num;
+ }
+
+ public String getSysId() {
+ return sysId;
+ }
+
+ public Double getProgress() {
+ return progress;
+ }
+}
diff --git a/src/main/java/com/ibcon/sproject/smet/model/objects/Norm.java b/src/main/java/com/ibcon/sproject/smet/model/objects/Norm.java
new file mode 100644
index 0000000..662e4e3
--- /dev/null
+++ b/src/main/java/com/ibcon/sproject/smet/model/objects/Norm.java
@@ -0,0 +1,69 @@
+package com.ibcon.sproject.smet.model.objects;
+
+import com.ibcon.sproject.smet.model.objects.smr.SmrMask;
+import org.jdom2.Element;
+
+public class Norm {
+
+ private String caption;
+ private Double nr, sp;
+ private String nrMask, spMask;
+ private String normId;
+
+ public Norm(String caption) {
+ this.caption = caption;
+ }
+
+ //Расчет НР по общему нормативу
+ public Norm(String caption, Double nr, String nrMask) {
+ this.caption = caption;
+ this.nr = nr;
+ this.nrMask = nrMask;
+ }
+
+ public Norm(Element e) {
+
+ if (e.getAttribute("PlanMask") != null && e.getAttribute("Plan") != null) {
+ sp = (e.getAttributeValue("Plan").length() > 0 ? Double.parseDouble(e.getAttributeValue("Plan").replace(",", ".")) / 100 : 0);
+ spMask = SmrMask.getMask(e.getAttribute("PlanMask"));
+ }
+
+ if (e.getAttribute("NaclMask") != null && e.getAttribute("Nacl") != null) {
+ nr = (e.getAttributeValue("Nacl").length() > 0 ? Double.parseDouble(e.getAttributeValue("Nacl").replace(",", ".")) / 100 : 0);
+ nrMask = SmrMask.getMask(e.getAttribute("NaclMask"));
+ }
+
+ }
+
+ public String getCaption() {
+ return caption;
+ }
+
+ public Double getNr() {
+ return nr;
+ }
+
+ public Double getSp() {
+ return sp;
+ }
+
+ public String getNrMask() {
+ return nrMask;
+ }
+
+ public String getSpMask() {
+ return spMask;
+ }
+
+ public String getNormId() {
+ return normId;
+ }
+
+ public void setSp(Double sp) {
+ this.sp = sp;
+ }
+
+ public void setSpMask(String spMask) {
+ this.spMask = spMask;
+ }
+}
diff --git a/src/main/java/com/ibcon/sproject/smet/model/objects/SmetNode.java b/src/main/java/com/ibcon/sproject/smet/model/objects/SmetNode.java
new file mode 100644
index 0000000..8ad53ab
--- /dev/null
+++ b/src/main/java/com/ibcon/sproject/smet/model/objects/SmetNode.java
@@ -0,0 +1,148 @@
+package com.ibcon.sproject.smet.model.objects;
+
+import com.ibcon.sproject.smet.model.xml.XMLParameters;
+import com.ibcon.sproject.smet.model.xml.XMLRegionInfo;
+import org.jdom2.Element;
+
+import java.util.Date;
+import java.util.HashMap;
+
+public class SmetNode extends SmetTreeNode {
+
+ private String userChange = "default";
+ private String userCreate = "default";
+ private String filePath = "";
+
+ private String num = "";
+ private String status = "Действующая";
+ private String comment = "";
+ private int version = 0;
+
+ private Date dateCreate;
+ private Date dateChange;
+
+ private Boolean isVirtual = false;
+ private int epsId, epsObjectId;
+
+ private int tzDigits = 6;
+ private int matDigits = 6;
+ private Boolean isRoundSum = false;
+
+ private int regionId = 0;
+ private String regionName = "";
+
+ private String base = "";
+
+ private HashMap smetRowsByNum = new HashMap<>();
+
+
+ public SmetNode(String name, Element rootNode, XMLRegionInfo regionInfo, XMLParameters params, int epsId) {
+ if (rootNode.getChild("DbInfo")!= null) {
+ Element smetHeader = rootNode.getChild("DbInfo").getChild("Document");
+ this.name = smetHeader.getAttributeValue("Caption");
+ this.num = smetHeader.getAttributeValue("LocalNumber") != null ? smetHeader.getAttributeValue("LocalNumber") : smetHeader.getAttributeValue("Caption");
+ } else {
+ this.name = name;
+ }
+
+ if (num.equals("") && rootNode.getChild("Properties") != null && rootNode.getChild("Properties").getAttribute("LocNum")!= null) {
+ this.num = rootNode.getChild("Properties").getAttributeValue("LocNum");
+ }
+
+ this.isSmet = true;
+ this.epsId = epsId;
+
+ if (regionInfo.getRegionId() != null) this.regionId = regionInfo.getRegionId();
+ if (regionInfo.getRegionName() != null) this.regionName = regionInfo.getRegionName();
+
+ this.isRoundSum = params.getRoundSum();
+ this.tzDigits = params.getTzDigits();
+ this.matDigits = params.getMatDigits();
+
+ this.userCreate = System.getProperty("user.name");
+ }
+
+ public void addSmetRow(SmrNode smetRow) {
+ if (smetRowsByNum != null) smetRowsByNum.put(smetRow.getNum(), smetRow);
+ }
+
+ public void insert() {
+ String sql = "INSERT INTO ";
+ }
+
+ public String getUserChange() {
+ return userChange;
+ }
+
+ public String getUserCreate() {
+ return userCreate;
+ }
+
+ public String getFilePath() {
+ return filePath;
+ }
+
+ public String getNum() {
+ return num;
+ }
+
+ public String getStatus() {
+ return status;
+ }
+
+ public String getComment() {
+ return comment;
+ }
+
+ public int getVersion() {
+ return version;
+ }
+
+ public Date getDateCreate() {
+ return dateCreate;
+ }
+
+ public Date getDateChange() {
+ return dateChange;
+ }
+
+ public Boolean getVirtual() {
+ return isVirtual;
+ }
+
+ public int getEpsId() {
+ return epsId;
+ }
+
+ public int getEpsObjectId() {
+ return epsObjectId;
+ }
+
+ public int getTzDigits() {
+ return tzDigits;
+ }
+
+ public int getMatDigits() {
+ return matDigits;
+ }
+
+ public Boolean getRoundSum() {
+ return isRoundSum;
+ }
+
+ public int getRegionId() {
+ return regionId;
+ }
+
+ public String getRegionName() {
+ return regionName;
+ }
+
+ public String getBase() {
+ return base;
+ }
+
+ public HashMap getSmetRowsByNum() {
+ return smetRowsByNum;
+ }
+}
diff --git a/src/main/java/com/ibcon/sproject/smet/model/objects/SmetResource.java b/src/main/java/com/ibcon/sproject/smet/model/objects/SmetResource.java
new file mode 100644
index 0000000..c7cbf14
--- /dev/null
+++ b/src/main/java/com/ibcon/sproject/smet/model/objects/SmetResource.java
@@ -0,0 +1,44 @@
+package com.ibcon.sproject.smet.model.objects;
+
+public class SmetResource {
+
+ private int id;
+ private int titulId;
+ private String name;
+ private String code;
+ private String type;
+ private String units;
+
+ public SmetResource(String name, String code, String type, String units) {
+ this.name = (name != null) ? name.replace("'", "") : "";
+ this.code = (code != null) ? code.replace("'", "") : "";
+ this.type = (type != null) ? type : "";
+ this.units = units;
+ //todo create
+ }
+
+
+ public int getId() {
+ return id;
+ }
+
+ public int getTitulId() {
+ return titulId;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public String getCode() {
+ return code;
+ }
+
+ public String getType() {
+ return type;
+ }
+
+ public String getUnits() {
+ return units;
+ }
+}
diff --git a/src/main/java/com/ibcon/sproject/smet/model/objects/SmetResourceAssignment.java b/src/main/java/com/ibcon/sproject/smet/model/objects/SmetResourceAssignment.java
new file mode 100644
index 0000000..d6b2db0
--- /dev/null
+++ b/src/main/java/com/ibcon/sproject/smet/model/objects/SmetResourceAssignment.java
@@ -0,0 +1,289 @@
+package com.ibcon.sproject.smet.model.objects;
+
+import bsh.EvalError;
+import bsh.Interpreter;
+import com.ibcon.sproject.smet.model.xml.XMLCoefficient;
+import com.ibcon.sproject.smet.model.xml.XMLCoefficients;
+import com.ibcon.sproject.smet.model.xml.XMLParameters;
+import org.jdom2.Element;
+
+import java.util.HashMap;
+
+public class SmetResourceAssignment {
+
+ private int id;
+ private int resourceId;
+ private int smrId;
+ private int smetId;
+ private int titulId;
+ private String name;
+ private String code;
+ private String type;
+ private String units;
+ private String attrib = "";
+ public HashMap raEdits;
+ private Double quantity = 0.0;
+
+ private Double em = 0.0;
+ private Double zm = 0.0;
+ private Double oz = 0.0;
+ private Double mt = 0.0;
+ private Double tzr = 0.0;
+ private Double tzm = 0.0;
+
+ private HashMap costs, levelSum;
+
+ //region Конструктор для парсинга XML
+ public SmetResourceAssignment(SmetResource rsrc, Element rsrcElement, XMLParameters params) {
+
+ Double value = 0.0;
+
+ if (rsrcElement.getAttribute("Quantity") != null ) quantity = Double.parseDouble(rsrcElement.getAttributeValue("Quantity").replace(",", "."));
+
+ if (rsrcElement.getChild("PriceBase") != null
+ && rsrcElement.getChild("PriceBase").getAttribute("Value")!= null
+ && !rsrcElement.getChild("PriceBase").getAttributeValue("Value").equals(""))
+ value = Double.parseDouble(rsrcElement.getChild("PriceBase").getAttributeValue("Value").replace(",", "."));
+
+ if (rsrcElement.getChild("PriceBase") != null
+ && rsrcElement.getChild("PriceBase").getAttribute("ZM") != null
+ && !rsrcElement.getChild("PriceBase").getAttributeValue("ZM").equals(""))
+ zm = Double.parseDouble(rsrcElement.getChild("PriceBase").getAttributeValue("ZM").replace(",","."));
+
+ if (rsrcElement.getAttribute("Attribs") != null)
+ attrib = rsrcElement.getAttributeValue("Attribs").replace("SnipSet", "").replace(" ", "");
+
+ this.costs = new HashMap<>();
+
+ switch (rsrc.getType()) {
+ case "T":
+ this.oz = value * quantity;
+ this.costs.put("OZ", this.oz);
+ this.costs.put("TZR", quantity);
+ break;
+
+ case "Tzm":
+ this.costs.put("TZM", quantity);
+ this.zm = value * quantity;
+ this.costs.put("ZM", this.zm);
+ break;
+
+ case "Mech":
+ this.em = value * quantity;
+ this.zm = zm * quantity;
+ this.costs.put("EM", this.em);
+ this.costs.put("ZM", this.zm);
+ this.costs.put("EMR", this.em - this.zm);
+ break;
+
+ case "Mat":
+ this.mt = value * quantity;
+ this.costs.put("MT", this.mt);
+ break;
+
+ default:
+ return;
+ }
+
+ this.resourceId = rsrc.getId();
+ this.name = rsrc.getName();
+ this.code = rsrc.getCode();
+ this.type = rsrc.getType();
+ this.units = rsrc.getUnits();
+ }
+
+ //region Применение коэфф-та при парсинге XML
+ public void applyCoeff(XMLCoefficients coeffs) {
+
+ if (coeffs == null) return;
+ raEdits = new HashMap<>();
+
+ for (int lev : coeffs.getLevels()) {
+
+ HashMap levSum = new HashMap<>();
+ for (XMLCoefficient coeff : coeffs.getCoeffs().get(lev)) {
+
+ //region Расчет показателей по формулам
+ if (coeff.getKind().equals("Formula")) {
+
+ Interpreter interpreter = new Interpreter();
+ Double eval = 0.0;
+
+ String rawFormula = coeff.getFormula().substring(coeff.getFormula().indexOf("=")+1);
+
+ if (costs.keySet().contains("PZ") && rawFormula.contains("ПЗ")) rawFormula = rawFormula.replace("ПЗ", costs.get("PZ").toString());
+ if (costs.keySet().contains("OZ") && rawFormula.contains("ОЗП")) rawFormula = rawFormula.replace("ОЗП", costs.get("OZ").toString());
+ if (costs.keySet().contains("EM") && rawFormula.contains("ЭМ")) rawFormula = rawFormula.replace("ЭМ", costs.get("EM").toString());
+ if (costs.keySet().contains("MT") && rawFormula.contains("МАТ")) rawFormula = rawFormula.replace("МАТ", costs.get("MT").toString());
+
+ String value = coeff.getFormulaValue();
+ String formula = value + "=" + rawFormula;
+
+ try {
+ interpreter.eval(formula);
+ eval = Double.parseDouble(interpreter.get(value).toString());
+ } catch (EvalError evalError) {
+ evalError.printStackTrace();
+ }
+
+ value = value.replace("ПЗ", "PZ").replace("ОЗП", "OZ").replace("ЭМ", "EM").replace("ЗПМ", "ZM").replace("МАТ", "MT");
+
+ levSum.put(value, (levSum.containsKey(value) ? levSum.get(value) : 0) + eval);
+ if (value.equals("ZM")) levSum.put("EM", (levSum.containsKey("EM") ? levSum.get("EM") : 0) + eval);
+ if (!value.equals("PZ")) levSum.put("PZ", (levSum.containsKey("PZ") ? levSum.get("PZ"): 0) + eval);
+
+ continue;
+
+ }
+ //endregion
+
+ //region Расчет по коэффициентам
+ for (String key : coeff.getValues().keySet()) {
+
+ if (!costs.containsKey(key)) {
+ System.out.println("Ошибка расчет коэффициента для ресурса: " + key );
+ } else {
+
+ Double calc = costs.get(key) * (coeff.getValues().get(key) - 1);
+
+ if (key.equals("EM") && coeff.isSeparEm())
+ calc = (costs.get("EM") - costs.get("ZM") * (coeff.getValues().get("EM")-1));
+
+ levSum.put(key, (levSum.containsKey(key) ? levSum.get(key) : 0) + calc);
+
+ if (key.equals("ZM")
+ && (!coeff.getValues().keySet().contains("EM") || coeff.isSeparEm()))
+ levSum.put("EM", (levSum.containsKey("EM") ? levSum.get("EM") : 0) + calc);
+ }
+
+ }
+ //endregion
+
+ }
+
+ //region Суммирование показателей по уровням
+ for (String key : levSum.keySet()) {
+ raEdits.put(key, (raEdits.containsKey(key) ? raEdits.get(key) : 0) + levSum.get(key));
+ costs.put(key, (costs.containsKey(key) ? costs.get(key) : 0) + levSum.get(key));
+ }
+ //endregion
+
+ }
+
+ costs.put("EMR",
+ (costs.containsKey("EM") ? costs.get("EM") : 0) - (costs.containsKey("ZM") ? costs.get("ZM") : 0));
+
+ }
+
+ public int getId() {
+ return id;
+ }
+
+ public int getResourceId() {
+ return resourceId;
+ }
+
+ public int getSmrId() {
+ return smrId;
+ }
+
+ public int getSmetId() {
+ return smetId;
+ }
+
+ public int getTitulId() {
+ return titulId;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public String getCode() {
+ return code;
+ }
+
+ public String getType() {
+ return type;
+ }
+
+ public String getUnits() {
+ return units;
+ }
+
+ public String getAttrib() {
+ return attrib;
+ }
+
+ public HashMap getRaEdits() {
+ return raEdits;
+ }
+
+ public Double getQuantity() {
+ return quantity;
+ }
+
+ public Double getEm() {
+ return em;
+ }
+
+ public Double getZm() {
+ return zm;
+ }
+
+ public Double getOz() {
+ return oz;
+ }
+
+ public Double getMt() {
+ return mt;
+ }
+
+ public Double getTzr() {
+ return tzr;
+ }
+
+ public Double getTzm() {
+ return tzm;
+ }
+
+ public HashMap getCosts() {
+ return costs;
+ }
+
+ public HashMap getLevelSum() {
+ return levelSum;
+ }
+
+ public void setQuantity(Double quantity) {
+ this.quantity = quantity;
+ }
+
+ public void setEm(Double em) {
+ this.em = em;
+ }
+
+ public void setZm(Double zm) {
+ this.zm = zm;
+ }
+
+ public void setOz(Double oz) {
+ this.oz = oz;
+ }
+
+ public void setMt(Double mt) {
+ this.mt = mt;
+ }
+
+ public void setTzr(Double tzr) {
+ this.tzr = tzr;
+ }
+
+ public void setTzm(Double tzm) {
+ this.tzm = tzm;
+ }
+
+ public void setLevelSum(HashMap levelSum) {
+ this.levelSum = levelSum;
+ }
+}
diff --git a/src/main/java/com/ibcon/sproject/smet/model/objects/SmetTreeNode.java b/src/main/java/com/ibcon/sproject/smet/model/objects/SmetTreeNode.java
new file mode 100644
index 0000000..644e026
--- /dev/null
+++ b/src/main/java/com/ibcon/sproject/smet/model/objects/SmetTreeNode.java
@@ -0,0 +1,231 @@
+package com.ibcon.sproject.smet.model.objects;
+
+import javax.swing.tree.DefaultMutableTreeNode;
+import java.util.List;
+
+public class SmetTreeNode extends DefaultMutableTreeNode{
+
+ private int id;
+ private int smetId;
+ protected String name;
+
+ //TODO change to BigDecimal
+ protected double oz = 0.0;
+ protected double em = 0.0;
+ protected double zm = 0.0;
+ protected double mt = 0.0;
+ protected double pz = 0.0;
+ protected double nr = 0.0;
+ protected double sp = 0.0;
+ protected double sum = 0.0;
+ protected double tzr = 0.0;
+ protected double tzm = 0.0;
+
+ protected boolean isSmet = false;
+ protected boolean isChapter = false;
+ protected boolean isHeader = false;
+ protected boolean isSmr = false;
+ protected boolean isRoot = false;
+ protected boolean isHeadSmet = false;
+ protected boolean isHeadSmr = false;
+ public boolean smetUnderExpanded = false;
+ private boolean isDummyChapter = false;
+
+ private int indexId;
+ private int indexType;
+
+ private String indexCode = "";
+ private String indexName = "";
+
+ private double indexSum;
+ private double index;
+
+ public SmetTreeNode() {
+ }
+
+ //Конструктор для ROOT
+ public SmetTreeNode(int id, String name) {
+
+ this.id = id;
+ this.name = name;
+ this.isRoot = true;
+ setUserObject(id + "__" + name);
+
+ }
+ //Конструктор для шапок
+ public SmetTreeNode(String userObject) {
+
+ if (userObject.equals("smethead")) {
+
+ setUserObject("smethead");
+ this.isHeadSmet = true;
+
+ } else if (userObject.equals("smrhead")) {
+
+ setUserObject("smrhead");
+ this.isHeadSmr = true;
+
+ } else if (userObject.equals("dummyChapter")) {
+
+ setUserObject("dummyChapter");
+ this.isDummyChapter = true;
+
+ }
+
+ }
+
+ public List getChildren() {return children; }
+
+ public int getId() {
+ return id;
+ }
+
+ public int getSmetId() {
+ return smetId;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public Double getOz() {
+ return oz;
+ }
+
+ public Double getEm() {
+ return em;
+ }
+
+ public Double getZm() {
+ return zm;
+ }
+
+ public Double getMt() {
+ return mt;
+ }
+
+ public Double getPz() {
+ return pz;
+ }
+
+ public Double getNr() {
+ return nr;
+ }
+
+ public Double getSp() {
+ return sp;
+ }
+
+ public Double getSum() {
+ return sum;
+ }
+
+ public Double getTzr() {
+ return tzr;
+ }
+
+ public Double getTzm() {
+ return tzm;
+ }
+
+ public boolean isSmet() {
+ return isSmet;
+ }
+
+ public boolean isChapter() {
+ return isChapter;
+ }
+
+ public boolean isHeader() {
+ return isHeader;
+ }
+
+ public boolean isSmr() {
+ return isSmr;
+ }
+
+ @Override
+ public boolean isRoot() {
+ return isRoot;
+ }
+
+ public boolean isHeadSmet() {
+ return isHeadSmet;
+ }
+
+ public boolean isHeadSmr() {
+ return isHeadSmr;
+ }
+
+ public boolean isSmetUnderExpanded() {
+ return smetUnderExpanded;
+ }
+
+ public boolean isDummyChapter() {
+ return isDummyChapter;
+ }
+
+ public int getIndexId() {
+ return indexId;
+ }
+
+ public int getIndexType() {
+ return indexType;
+ }
+
+ public String getIndexCode() {
+ return indexCode;
+ }
+
+ public String getIndexName() {
+ return indexName;
+ }
+
+ public double getIndexSum() {
+ return indexSum;
+ }
+
+ public double getIndex() {
+ return index;
+ }
+
+ public void setOz(double oz) {
+ this.oz = oz;
+ }
+
+ public void setEm(double em) {
+ this.em = em;
+ }
+
+ public void setZm(double zm) {
+ this.zm = zm;
+ }
+
+ public void setMt(double mt) {
+ this.mt = mt;
+ }
+
+ public void setPz(double pz) {
+ this.pz = pz;
+ }
+
+ public void setNr(double nr) {
+ this.nr = nr;
+ }
+
+ public void setSp(double sp) {
+ this.sp = sp;
+ }
+
+ public void setSum(double sum) {
+ this.sum = sum;
+ }
+
+ public void setTzr(double tzr) {
+ this.tzr = tzr;
+ }
+
+ public void setTzm(double tzm) {
+ this.tzm = tzm;
+ }
+}
diff --git a/src/main/java/com/ibcon/sproject/smet/model/objects/SmrNode.java b/src/main/java/com/ibcon/sproject/smet/model/objects/SmrNode.java
new file mode 100644
index 0000000..4e9fbb2
--- /dev/null
+++ b/src/main/java/com/ibcon/sproject/smet/model/objects/SmrNode.java
@@ -0,0 +1,279 @@
+package com.ibcon.sproject.smet.model.objects;
+
+import com.ibcon.sproject.smet.model.objects.smr.SmrWork;
+import com.ibcon.sproject.smet.model.utilits.CheckValue;
+import com.ibcon.sproject.smet.model.xml.XMLVidRabGroup;
+import com.ibcon.sproject.smet.model.xml.XMLVidRabGroups;
+import org.jdom2.Element;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+
+public class SmrNode extends SmetTreeNode {
+
+ private int num;
+ private String code;
+ private String units;
+
+ private double quantity;
+
+ private double ozCost;
+ private double emCost;
+ private double zmCost;
+ private double mtCost;
+ private double pzCost;
+ private double tzrCost;
+ private double tzmCost;
+
+ private double ozIndex;
+ private double emIndex;
+ private double zmIndex;
+ private double mtIndex;
+ private double nrIndex;
+ private double spIndex;
+
+ private double nrCost;
+ private double spCost;
+ private String nrMask = "";
+ private String spMask = "";
+
+ private int chapterId;
+
+ private int headerId;
+
+ private int vidRabGroupId;
+ private int vidRabId;
+
+ private ArrayList works = new ArrayList<>();
+
+ //todo smrAttribute
+// private SmrAttributesCollection attributes = new SmrAttributesCollection();
+
+ boolean isLast = false;
+ private boolean disabled;
+
+ private ArrayList smetRa = new ArrayList<>();
+
+ private SmetNode smet;
+
+ private String osColumn;
+
+ private boolean isEqui;
+ private boolean isSMR;
+ private boolean localNorm;
+
+
+ public SmrNode(Element child, XMLVidRabGroups vrg) {
+
+ if (CheckValue.isInteger(child.getAttributeValue("Number"))) this.num = Integer.valueOf(child.getAttributeValue("Number"));
+ else {
+ this.num = Integer.valueOf(child.getAttributeValue("Number").substring(0, child.getAttributeValue("Number").indexOf(".")));
+ }
+ this.name = (child.getAttributeValue("Caption") != null ) ? child.getAttributeValue("Caption") : "";
+ this.code = (child.getAttributeValue("Code") != null ) ? child.getAttributeValue("Code") : "";
+ this.units = (child.getAttributeValue("Units") != null ) ? child.getAttributeValue("Units") : "";
+ this.disabled = child.getAttribute("Options") != null && child.getAttributeValue("Options").contains("Inactive");
+
+ this.vidRabId = Integer.valueOf(child.getAttribute("Vr2001") != null ? child.getAttributeValue("Vr2001") : "0");
+
+ for (XMLVidRabGroup g : vrg.values()) {
+ if (!g.containsKey(vidRabId)) continue;
+ this.vidRabGroupId = g.getId();
+ if (g.get(vidRabId).getOsColumn() != null) {
+
+ this.osColumn = g.get(vidRabId).getOsColumn();
+ this.isEqui = osColumn.equals("О");
+ this.isSMR = osColumn.equals("М");
+
+ } else {
+
+ this.osColumn = "М";
+ this.isEqui = false;
+ this.isSMR = true;
+
+ }
+ break;
+ }
+
+ this.isSmr = true;
+ }
+
+ public void updateValues (
+ HashMap smrValues,
+ HashMap smrCosts,
+ HashMap smrMasks,
+ ArrayList smetRaList) {
+
+ this.quantity = smrValues.get("quantity");
+
+ this.tzrCost = smrCosts.containsKey("TZR") ? smrCosts.get("TZR"): 0.0;
+ this.ozCost = smrCosts.containsKey("OZ") ? smrCosts.get("OZ"): 0.0;
+ this.tzmCost = smrCosts.containsKey("TZM") ? smrCosts.get("TZM"): 0.0;
+ this.emCost = smrCosts.containsKey("EM") ? smrCosts.get("EM"): 0.0;
+ this.zmCost = smrCosts.containsKey("ZM") ? smrCosts.get("ZM"): 0.0;
+ this.mtCost = smrCosts.containsKey("MT") ? smrCosts.get("MT"): 0.0;
+ this.pzCost = smrCosts.containsKey("PZ") ? smrCosts.get("PZ"): 0.0;
+
+ this.nrCost = smrCosts.containsKey("NR") ? smrCosts.get("NR"): 0.0;
+ this.spCost = smrCosts.containsKey("SP") ? smrCosts.get("SP"): 0.0;
+
+ this.tzr = smrValues.containsKey("TZR") ? smrValues.get("TZR"): 0.0;
+ this.oz = smrValues.containsKey("OZ") ? smrValues.get("OZ"): 0.0;
+ this.tzm = smrValues.containsKey("TZM") ? smrValues.get("TZM"): 0.0;
+ this.em = smrValues.containsKey("EM") ? smrValues.get("EM"): 0.0;
+ this.zm = smrValues.containsKey("ZM") ? smrValues.get("ZM"): 0.0;
+ this.mt = smrValues.containsKey("MT") ? smrValues.get("MT"): 0.0;
+ this.pz = smrValues.containsKey("PZ") ? smrValues.get("PZ"): 0.0;
+
+ this.nrMask = smrMasks.get("NR");
+ this.spMask = smrMasks.get("SP");
+ this.nr = smrValues.containsKey("NR") ? smrValues.get("NR"): 0.0;
+ this.sp = smrValues.containsKey("SP") ? smrValues.get("SP"): 0.0;
+ this.sum = smrValues.containsKey("SUM") && smrValues.get("SUM") != null ? smrValues.get("SUM"): 0.0;
+
+ this.smetRa = smetRaList;
+
+ //create();
+
+ }
+
+ public int getNum() {
+ return num;
+ }
+
+ public String getCode() {
+ return code;
+ }
+
+ public String getUnits() {
+ return units;
+ }
+
+ public double getQuantity() {
+ return quantity;
+ }
+
+ public double getOzCost() {
+ return ozCost;
+ }
+
+ public double getEmCost() {
+ return emCost;
+ }
+
+ public double getZmCost() {
+ return zmCost;
+ }
+
+ public double getMtCost() {
+ return mtCost;
+ }
+
+ public double getPzCost() {
+ return pzCost;
+ }
+
+ public double getTzrCost() {
+ return tzrCost;
+ }
+
+ public double getTzmCost() {
+ return tzmCost;
+ }
+
+ public double getOzIndex() {
+ return ozIndex;
+ }
+
+ public double getEmIndex() {
+ return emIndex;
+ }
+
+ public double getZmIndex() {
+ return zmIndex;
+ }
+
+ public double getMtIndex() {
+ return mtIndex;
+ }
+
+ public double getNrIndex() {
+ return nrIndex;
+ }
+
+ public double getSpIndex() {
+ return spIndex;
+ }
+
+ public double getNrCost() {
+ return nrCost;
+ }
+
+ public double getSpCost() {
+ return spCost;
+ }
+
+ public String getNrMask() {
+ return nrMask;
+ }
+
+ public String getSpMask() {
+ return spMask;
+ }
+
+ public int getChapterId() {
+ return chapterId;
+ }
+
+ public int getHeaderId() {
+ return headerId;
+ }
+
+ public int getVidRabGroupId() {
+ return vidRabGroupId;
+ }
+
+ public int getVidRabId() {
+ return vidRabId;
+ }
+
+ public ArrayList getWorks() {
+ return works;
+ }
+
+ public boolean isLast() {
+ return isLast;
+ }
+
+ public boolean isDisabled() {
+ return disabled;
+ }
+
+ public ArrayList getSmetRa() {
+ return smetRa;
+ }
+
+ public SmetNode getSmet() {
+ return smet;
+ }
+
+ public String getOsColumn() {
+ return osColumn;
+ }
+
+ public boolean isEqui() {
+ return isEqui;
+ }
+
+ public boolean isSMR() {
+ return isSMR;
+ }
+
+ public boolean isLocalNorm() {
+ return localNorm;
+ }
+
+ public void setLocalNorm(boolean localNorm) {
+ this.localNorm = localNorm;
+ }
+}
diff --git a/src/main/java/com/ibcon/sproject/smet/model/objects/smr/SmrMask.java b/src/main/java/com/ibcon/sproject/smet/model/objects/smr/SmrMask.java
new file mode 100644
index 0000000..772656d
--- /dev/null
+++ b/src/main/java/com/ibcon/sproject/smet/model/objects/smr/SmrMask.java
@@ -0,0 +1,43 @@
+package com.ibcon.sproject.smet.model.objects.smr;
+
+import org.jdom2.Attribute;
+
+import java.util.HashSet;
+
+public class SmrMask {
+
+ public static String getMask(Attribute attr) {
+ HashSet maskHash = new HashSet<>();
+ String mask = "";
+ String a = attr.getValue();
+
+ if (a.contains("ПЗ")) {
+ maskHash.add("OZ");
+ maskHash.add("ZM");
+ maskHash.add("EM");
+ maskHash.add("MT");
+ }
+
+ if (a.contains("ЭМ")) {
+ maskHash.add("ZM");
+ maskHash.add("EM");
+ }
+
+ if (a.contains("ФОТ")) {
+ maskHash.add("OZ");
+ maskHash.add("ZM");
+ }
+
+ if (a.contains("ОЗП")) maskHash.add("OZ");
+
+ if (a.contains("ЗПМ")) maskHash.add("ZM");
+
+ if (a.contains("МАТ")) maskHash.add("MT");
+
+ for (String k : maskHash) {
+ mask = mask + (!mask.equals("") ? "," : "" )+ k;
+ }
+
+ return mask;
+ }
+}
diff --git a/src/main/java/com/ibcon/sproject/smet/model/objects/smr/SmrWork.java b/src/main/java/com/ibcon/sproject/smet/model/objects/smr/SmrWork.java
new file mode 100644
index 0000000..319638a
--- /dev/null
+++ b/src/main/java/com/ibcon/sproject/smet/model/objects/smr/SmrWork.java
@@ -0,0 +1,30 @@
+package com.ibcon.sproject.smet.model.objects.smr;
+
+import com.ibcon.sproject.smet.model.objects.SmrNode;
+
+public class SmrWork {
+
+ private String caption = "";
+ private int smrId = 0;
+
+ public SmrWork(String caption) {
+ this.caption = caption;
+ }
+
+ public SmrWork(SmrWork smrWork, SmrNode smrNode) {
+ this.caption = smrWork.getCaption();
+ this.smrId = smrNode.getId();
+ }
+
+ public void setSmrId(int smrId) {
+ this.smrId = smrId;
+ }
+
+ public String getCaption() {
+ return caption;
+ }
+
+ public int getSmrId() {
+ return smrId;
+ }
+}
diff --git a/src/main/java/com/ibcon/sproject/smet/model/utilits/CheckValue.java b/src/main/java/com/ibcon/sproject/smet/model/utilits/CheckValue.java
new file mode 100644
index 0000000..de21eec
--- /dev/null
+++ b/src/main/java/com/ibcon/sproject/smet/model/utilits/CheckValue.java
@@ -0,0 +1,24 @@
+package com.ibcon.sproject.smet.model.utilits;
+
+public class CheckValue {
+
+ public static boolean isDouble(String s) {
+ try {
+ Double.parseDouble(s.replace(",", "."));
+ } catch(NumberFormatException e) {
+ return false;
+ }
+ return true;
+ }
+
+// @SuppressWarnings("ResultOfMethodCallIgnored")
+ public static boolean isInteger(String s) {
+ try {
+ //noinspection ResultOfMethodCallIgnored
+ Integer.parseInt(s);
+ } catch(NumberFormatException e) {
+ return false;
+ }
+ return true;
+ }
+}
diff --git a/src/main/java/com/ibcon/sproject/smet/model/xml/HeaderNode.java b/src/main/java/com/ibcon/sproject/smet/model/xml/HeaderNode.java
new file mode 100644
index 0000000..587a1ab
--- /dev/null
+++ b/src/main/java/com/ibcon/sproject/smet/model/xml/HeaderNode.java
@@ -0,0 +1,18 @@
+package com.ibcon.sproject.smet.model.xml;
+
+import com.ibcon.sproject.smet.model.objects.SmetTreeNode;
+
+public class HeaderNode extends SmetTreeNode {
+
+ private int chapterId;
+
+ public HeaderNode(String caption) {
+ this.name = (caption != null) ? caption : "";
+ this.isHeader = true;
+ }
+
+
+ public int getChapterId() {
+ return chapterId;
+ }
+}
diff --git a/src/main/java/com/ibcon/sproject/smet/model/xml/NRSP.java b/src/main/java/com/ibcon/sproject/smet/model/xml/NRSP.java
new file mode 100644
index 0000000..11019ed
--- /dev/null
+++ b/src/main/java/com/ibcon/sproject/smet/model/xml/NRSP.java
@@ -0,0 +1,84 @@
+package com.ibcon.sproject.smet.model.xml;
+
+import com.ibcon.sproject.smet.model.objects.Norm;
+import com.ibcon.sproject.smet.model.objects.smr.SmrMask;
+import org.jdom2.Element;
+
+import java.util.HashMap;
+
+public class NRSP {
+
+ private boolean globalSP, globalNR;
+ private Norm globalNorm;
+ private HashMap norms;
+ private double NRK;
+ private double SPK;
+
+ public NRSP(Element parameters) {
+ if (parameters.getChild("CommonNK") != null
+ && parameters.getChild("CommonNK").getAttributeValue("CommonK") != null
+ && parameters.getChild("CommonNK").getAttributeValue("ActiveItems") != null
+ && parameters.getChild("CommonNK").getAttributeValue("ActiveItems").contains("Ck"))
+ this.NRK = Double.parseDouble(parameters.getChild("CommonNK").getAttributeValue
+ ("CommonK").replace(",", "."));
+
+ if (parameters.getChild("CommonNK") != null
+ && parameters.getChild("CommonNK").getAttributeValue("MethodKB") != null
+ && parameters.getChild("CommonNK").getAttributeValue("ActiveItems") != null
+ && parameters.getChild("CommonNK").getAttributeValue("ActiveItems").contains("Mk"))
+ this.NRK = Double.parseDouble(parameters.getChild("CommonNK").getAttributeValue("MethodKB").replace(",", "."));
+
+
+ if (parameters.getChild("CommonPK") != null
+ && parameters.getChild("CommonPK").getAttributeValue("CommonK") != null
+ && parameters.getChild("CommonPK").getAttributeValue("ActiveItems") != null
+ && parameters.getChild("CommonPK").getAttributeValue("ActiveItems").contains("Ck"))
+ this.SPK = Double.parseDouble(parameters.getChild("CommonPK").getAttributeValue("CommonK").replace(",", "."));
+
+ if (parameters.getChild("CommonPK") != null
+ && parameters.getChild("CommonPK").getAttributeValue("MethodKB") != null
+ && parameters.getChild("CommonPK").getAttributeValue("ActiveItems") != null
+ && parameters.getChild("CommonPK").getAttributeValue("ActiveItems").contains("Mk"))
+ this.SPK = Double.parseDouble(parameters.getChild("CommonPK").getAttributeValue
+ ("MethodKB").replace(",", "."));
+
+ //Расчет НР по общему нормативу
+ if (globalNR) {
+ this.globalNorm = new Norm("Общий норматив", Double.parseDouble(parameters.getChild("CommonNPCurr")
+ .getAttributeValue("Nacl").replace(",", ".")) / 100,
+ SmrMask.getMask(parameters.getChild("CommonNPCurr").getAttribute("NaclMask")));
+ }
+
+ //Расчет СП по общему нормативу
+ if (globalSP) {
+ if (globalNorm == null) globalNorm = new Norm("Общий норматив");
+ globalNorm.setSp(Double.parseDouble(parameters.getChild("CommonNPCurr")
+ .getAttributeValue("Plan").replace(",", ".")) / 100);
+ globalNorm.setSpMask(SmrMask.getMask(parameters.getChild("CommonNPCurr").getAttribute("PlanMask")));
+ }
+ }
+
+ public boolean isGlobalSP() {
+ return globalSP;
+ }
+
+ public boolean isGlobalNR() {
+ return globalNR;
+ }
+
+ public Norm getGlobalNorm() {
+ return globalNorm;
+ }
+
+ public HashMap getNorms() {
+ return norms;
+ }
+
+ public Double getNRK() {
+ return NRK;
+ }
+
+ public Double getSPK() {
+ return SPK;
+ }
+}
diff --git a/src/main/java/com/ibcon/sproject/smet/model/xml/SmetResourceCollection.java b/src/main/java/com/ibcon/sproject/smet/model/xml/SmetResourceCollection.java
new file mode 100644
index 0000000..f718f77
--- /dev/null
+++ b/src/main/java/com/ibcon/sproject/smet/model/xml/SmetResourceCollection.java
@@ -0,0 +1,16 @@
+package com.ibcon.sproject.smet.model.xml;
+
+import com.ibcon.sproject.smet.model.objects.SmetResource;
+
+import java.util.HashMap;
+
+public class SmetResourceCollection extends HashMap {
+
+ public SmetResourceCollection() {
+ //todo заполнить коллекцию
+ }
+
+ public boolean containsRes(String resourceName) {
+ return containsKey(resourceName);
+ }
+}
diff --git a/src/main/java/com/ibcon/sproject/smet/model/xml/XMLCoefficient.java b/src/main/java/com/ibcon/sproject/smet/model/xml/XMLCoefficient.java
new file mode 100644
index 0000000..cabc5d1
--- /dev/null
+++ b/src/main/java/com/ibcon/sproject/smet/model/xml/XMLCoefficient.java
@@ -0,0 +1,267 @@
+package com.ibcon.sproject.smet.model.xml;
+
+import org.jdom2.Element;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.HashMap;
+
+public class XMLCoefficient {
+
+ private boolean allVidRabs = true;
+ private boolean allChapters = true;
+
+ private ArrayList vrsLink = new ArrayList<>();
+ private ArrayList chaptersLink = new ArrayList<>();
+
+ private String formula;
+ private String formulaValue;
+
+ private boolean disabled;
+
+ private boolean PzAll; //Распространять коэффициент к прямым затратам на все статьи
+ private boolean EmAll; //Распространять коэффициент к экспл. машин на зарплату машинистов
+ private boolean SeparEm; //Начислять коэффициент к чистой ЭМ в виде К*(ЭМ-ЗПМ)
+ private boolean EmQty; //Применять коэффициент не только к стоимости, но и к расходу машин и механизмов
+ private boolean MatQty; //Применять коэффициент не только к стоимости, но и к расходу материалов
+ private boolean OzpTz; //Применять коэффициент не только к зарплате, но и к трудозатратам рабочих
+ private boolean ZpmTz; //Применять коэффициент не только к зарплате машинистов, но и к трудозатратам машинистов
+
+ private boolean inPos; //Признак применения коэф-та в позиции сметы
+ private String kind = "Multiply";
+
+ private Double pz;
+ private Double oz;
+ private Double em;
+ private Double zm;
+ private Double mt;
+
+ HashMap values = new HashMap<>();
+
+ /** Конструктор для глобальных коэффициентов*/
+ public XMLCoefficient(Element k, Element coeffsElement) {
+ this.chaptersLink = new ArrayList<>();
+
+ //Разбор параметров коэффициента
+ if (k.getAttribute("Options") != null) {
+ String opt = k.getAttributeValue("Options");
+ inPos = opt.contains("InPos");
+ disabled = opt.contains("Disabled");
+
+ PzAll = opt.contains("PzAll");
+ EmAll = opt.contains("EmAll");
+ OzpTz = opt.contains("OzpTz");
+ ZpmTz = opt.contains("ZpmTz");
+ SeparEm = opt.contains("SeparEm");
+ EmQty = opt.contains("EmQty");
+ MatQty = opt.contains("MatQty");
+ }
+
+ //Разбор коэффициента с формулой
+ if (k.getAttribute("Kind") != null
+ && k.getAttributeValue("Kind").equals("Formula")
+ && k.getAttribute("Formula") != null
+ && !k.getAttributeValue("Formula").equals("")) {
+
+ String formula = k.getAttributeValue("Formula").replace(" ", "").replace(",", ".");
+ String value = (formula.contains("=")) ? formula.substring(0, formula.indexOf("=")) : formula;
+ kind = "Formula";
+ this.formula = formula;
+ this.formulaValue = value;
+ }
+
+ //Коэффициент с заданными видами работ
+ if (k.getAttribute("AllVidRabs") != null && k.getAttributeValue("AllVidRabs").equals("No")) {
+ this.allVidRabs = false;
+ this.vrsLink = new ArrayList<>();
+
+ //Ссылки по видам работ
+ if (k.getAttribute("VrsLinks") != null) {
+ ArrayList links = new ArrayList<>(Arrays.asList(k.getAttributeValue("VrsLinks").replace("(", "").replace(")", "").replace(" ", "").split(",")));
+ for (String link : links) {
+ this.vrsLink.add(link);
+ }
+ }
+
+ //Ссылки по группам видов работ
+ if (k.getAttribute("VrGroupsLinks") != null) {
+ ArrayList VrGroups = new ArrayList<>(Arrays.asList(k.getAttributeValue("VrGroupsLinks").replace("(", "").replace(")", "").replace(" ", "").split(",")));
+ Element VidRabCatalog = coeffsElement.getParentElement().getChild("VidRab_Catalog");
+
+ for (Element catChild : VidRabCatalog.getChildren()) {
+ if (catChild.getAttribute("Type") == null || !catChild.getAttributeValue("Type").equals("Виды работ 2001г")) continue;
+
+ for (Element XMLVidRabGroup : catChild.getChildren()) {
+ if (XMLVidRabGroup != null && XMLVidRabGroup.getAttribute("ID") != null && VrGroups.contains(XMLVidRabGroup.getAttributeValue("ID"))) {
+
+ for (Element XMLVidRab : XMLVidRabGroup.getChildren()) {
+ if (XMLVidRab.getAttribute("ID") != null)
+ this.vrsLink.add(XMLVidRab.getAttributeValue("ID"));
+ }
+ }
+ }
+ }
+ }
+ }
+
+ //region Коэффициент с заданными разделами
+ if (k.getAttribute("AllChapters") != null && k.getAttributeValue("AllChapters").equals("No")) {
+ allChapters = false;
+ chaptersLink = new ArrayList<>();
+
+ if (k.getAttribute("ChaptersLinks") != null) {
+ String[] links = k.getAttributeValue("ChaptersLinks").replace("(", "").replace(")", "").replace(" ", "").split(",");
+ Collections.addAll(chaptersLink, links);
+ }
+ }
+ //endregion
+
+ if (k.getAttribute("Value_PZ") != null && !k.getAttributeValue("Value_PZ").equals("")) {
+ this.pz = Double.parseDouble(k.getAttributeValue("Value_PZ").replace(",", "."));
+ }
+
+ if (k.getAttribute("Value_EM") != null && !k.getAttributeValue("Value_EM").equals("")) {
+ this.em = Double.parseDouble(k.getAttributeValue("Value_EM").replace(",", "."));
+ }
+
+ if (k.getAttribute("Value_OZ") != null && !k.getAttributeValue("Value_OZ").equals("")) {
+ this.oz = Double.parseDouble(k.getAttributeValue("Value_OZ").replace(",", "."));
+ }
+
+ if (k.getAttribute("Value_MT") != null && !k.getAttributeValue("Value_MT").equals("")) {
+ this.mt = Double.parseDouble(k.getAttributeValue("Value_MT").replace(",", "."));
+ }
+
+ if (k.getAttribute("Value_ZM") != null && !k.getAttributeValue("Value_ZM").equals("")) {
+ this.zm = Double.parseDouble(k.getAttributeValue("Value_ZM").replace(",", "."));
+ }
+ }
+
+ /** Конструктор для локальных коэффициентов*/
+ public XMLCoefficient(Element k) {
+ //region Разбор параметров коэффициента
+ if (k.getAttribute("Options") != null) {
+ String opt = k.getAttributeValue("Options");
+ inPos = opt.contains("InPos");
+ disabled = opt.contains("Disabled");
+
+ PzAll = opt.contains("PzAll");
+ EmAll = opt.contains("EmAll");
+ OzpTz = opt.contains("OzpTz");
+ ZpmTz = opt.contains("ZpmTz");
+ SeparEm = opt.contains("SeparEm");
+ EmQty = opt.contains("EmQty");
+ MatQty = opt.contains("MatQty");
+ }
+ //endregion
+
+ if (k.getAttribute("Value_PZ") != null && !k.getAttributeValue("Value_PZ").equals("")) {
+ this.pz = Double.parseDouble(k.getAttributeValue("Value_PZ").replace(",", "."));
+ }
+
+ if (k.getAttribute("Value_EM") != null && !k.getAttributeValue("Value_EM").equals("")) {
+ this.em = Double.parseDouble(k.getAttributeValue("Value_EM").replace(",", "."));
+ }
+
+ if (k.getAttribute("Value_OZ") != null && !k.getAttributeValue("Value_OZ").equals("")) {
+ this.oz = Double.parseDouble(k.getAttributeValue("Value_OZ").replace(",", "."));
+ }
+
+ if (k.getAttribute("Value_MT") != null && !k.getAttributeValue("Value_MT").equals("")) {
+ this.mt = Double.parseDouble(k.getAttributeValue("Value_MT").replace(",", "."));
+ }
+
+ if (k.getAttribute("Value_ZM") != null && !k.getAttributeValue("Value_ZM").equals("")) {
+ this.zm = Double.parseDouble(k.getAttributeValue("Value_ZM").replace(",", "."));
+ }
+ }
+
+ public boolean isAllVidRabs() {
+ return allVidRabs;
+ }
+
+ public boolean isAllChapters() {
+ return allChapters;
+ }
+
+ public ArrayList getVrsLink() {
+ return vrsLink;
+ }
+
+ public ArrayList getChaptersLink() {
+ return chaptersLink;
+ }
+
+ public String getFormula() {
+ return formula;
+ }
+
+ public String getFormulaValue() {
+ return formulaValue;
+ }
+
+ public boolean isDisabled() {
+ return disabled;
+ }
+
+ public boolean isPzAll() {
+ return PzAll;
+ }
+
+ public boolean isEmAll() {
+ return EmAll;
+ }
+
+ public boolean isSeparEm() {
+ return SeparEm;
+ }
+
+ public boolean isEmQty() {
+ return EmQty;
+ }
+
+ public boolean isMatQty() {
+ return MatQty;
+ }
+
+ public boolean isOzpTz() {
+ return OzpTz;
+ }
+
+ public boolean isZpmTz() {
+ return ZpmTz;
+ }
+
+ public boolean isInPos() {
+ return inPos;
+ }
+
+ public String getKind() {
+ return kind;
+ }
+
+ public Double getPz() {
+ return pz;
+ }
+
+ public Double getOz() {
+ return oz;
+ }
+
+ public Double getEm() {
+ return em;
+ }
+
+ public Double getZm() {
+ return zm;
+ }
+
+ public Double getMt() {
+ return mt;
+ }
+
+ public HashMap getValues() {
+ return values;
+ }
+}
diff --git a/src/main/java/com/ibcon/sproject/smet/model/xml/XMLCoefficients.java b/src/main/java/com/ibcon/sproject/smet/model/xml/XMLCoefficients.java
new file mode 100644
index 0000000..f6438d0
--- /dev/null
+++ b/src/main/java/com/ibcon/sproject/smet/model/xml/XMLCoefficients.java
@@ -0,0 +1,60 @@
+package com.ibcon.sproject.smet.model.xml;
+
+import org.jdom2.Element;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.HashMap;
+
+public class XMLCoefficients {
+
+ private ArrayList levels = new ArrayList<>();
+ private ArrayList coeffList = new ArrayList<>();
+ private HashMap> coeffs = new HashMap<>();
+
+ public XMLCoefficients() {
+ }
+
+ public XMLCoefficients(Element coefficients) {
+ for (Element k : coefficients.getChildren()) {
+
+ if (k.getAttribute("Options") == null
+ || (k.getAttribute("Options") != null &&
+ !k.getAttributeValue("Options").contains("Base"))) continue;
+
+ int lev = 0;
+ if (k.getAttribute("Level") != null) lev = Integer.valueOf(k.getAttributeValue("Level"));
+ if (!levels.contains(lev)) levels.add(lev);
+
+ ArrayList ks;
+ if (!coeffs.containsKey(lev)) {
+ ks = new ArrayList<>();
+ coeffs.put(lev, ks);
+ } else {
+ ks = coeffs.get(lev);
+ }
+
+ XMLCoefficient coeff = new XMLCoefficient(k, coefficients);
+ ks.add(coeff);
+ coeffList.add(coeff);
+ }
+ sortLevels();
+ }
+
+ //todo проверить сортировку
+ public void sortLevels() {
+ Collections.sort(levels, Integer::compareTo);
+ }
+
+ public ArrayList getLevels() {
+ return levels;
+ }
+
+ public ArrayList getCoeffList() {
+ return coeffList;
+ }
+
+ public HashMap> getCoeffs() {
+ return coeffs;
+ }
+}
diff --git a/src/main/java/com/ibcon/sproject/smet/model/xml/XMLIndex.java b/src/main/java/com/ibcon/sproject/smet/model/xml/XMLIndex.java
new file mode 100644
index 0000000..02c9d10
--- /dev/null
+++ b/src/main/java/com/ibcon/sproject/smet/model/xml/XMLIndex.java
@@ -0,0 +1,42 @@
+package com.ibcon.sproject.smet.model.xml;
+
+import org.jdom2.Element;
+
+import java.util.HashMap;
+import java.util.Map;
+
+public class XMLIndex {
+
+ private String code;
+ private Map values;
+
+ public XMLIndex(Element index) {
+ this.code = index.getAttribute("Code") != null ? index.getAttributeValue("Code") : "";
+ this.values = new HashMap<>();
+
+ if (index.getAttribute("EM") != null && !index.getAttributeValue("EM").equals("")) {
+ this.values.put("EM", Double.parseDouble(index.getAttributeValue("EM").replace(",", ".")));
+ }
+
+ if (index.getAttribute("OZ") != null && !index.getAttributeValue("OZ").equals("")) {
+ this.values.put("OZ", Double.parseDouble(index.getAttributeValue("OZ").replace(",", ".")));
+ }
+
+ if (index.getAttribute("MT") != null && !index.getAttributeValue("MT").equals("")) {
+ this.values.put("MT", Double.parseDouble(index.getAttributeValue("MT").replace(",", ".")));
+ }
+
+
+ if (index.getAttribute("ZM") != null && !index.getAttributeValue("ZM").equals("")) {
+ this.values.put("ZM", Double.parseDouble(index.getAttributeValue("ZM").replace(",", ".")));
+ }
+ }
+
+ public String getCode() {
+ return code;
+ }
+
+ public Map getValues() {
+ return values;
+ }
+}
diff --git a/src/main/java/com/ibcon/sproject/smet/model/xml/XMLIndexes.java b/src/main/java/com/ibcon/sproject/smet/model/xml/XMLIndexes.java
new file mode 100644
index 0000000..6d2f8d6
--- /dev/null
+++ b/src/main/java/com/ibcon/sproject/smet/model/xml/XMLIndexes.java
@@ -0,0 +1,35 @@
+package com.ibcon.sproject.smet.model.xml;
+
+import org.jdom2.Element;
+
+import java.util.HashMap;
+import java.util.Map;
+
+public class XMLIndexes {
+
+ private Map indexesCode;
+ private String indexMode;
+
+ public XMLIndexes(Element index) {
+ this.indexesCode = new HashMap<>();
+
+ if (index.getAttribute("IndexesMode") != null && !index.getAttributeValue("IndexesMode").equals("")) {
+ this.indexMode = index.getAttributeValue("IndexesMode");
+ }
+
+ for (Element in : index.getChildren()) {
+ if (!in.getName().equals("IndexesPos")) continue;
+ for (Element i : in.getChildren()) {
+ this.indexesCode.put(i.getAttribute("Code") != null ? i.getAttributeValue("Code") : "", new XMLIndex(i));
+ }
+ }
+ }
+
+ public String getIndexMode() {
+ return (indexMode != null) ? indexMode : "";
+ }
+
+ public Map getIndexesCode() {
+ return indexesCode;
+ }
+}
diff --git a/src/main/java/com/ibcon/sproject/smet/model/xml/XMLParameters.java b/src/main/java/com/ibcon/sproject/smet/model/xml/XMLParameters.java
new file mode 100644
index 0000000..3fafde8
--- /dev/null
+++ b/src/main/java/com/ibcon/sproject/smet/model/xml/XMLParameters.java
@@ -0,0 +1,82 @@
+package com.ibcon.sproject.smet.model.xml;
+
+import org.jdom2.Attribute;
+import org.jdom2.Element;
+
+public class XMLParameters {
+
+ private Boolean roundSum = false;
+
+ private boolean tempRound; //Промежуточное округление до копеек при расчете единичной стоимости позиций
+ private Boolean roundNPBase = false;
+ private Boolean addZatr = false;
+ private Boolean globalNR = false;
+ private Boolean globalSP = false;
+ private String basePrices, baseCalcVrs;
+ private int matDigits, tzDigits, posKDigits;
+
+ public XMLParameters(Element param) {
+
+ basePrices = param.getAttributeValue("BasePrices");
+ baseCalcVrs = param.getAttributeValue("BaseCalcVrs");
+
+ Attribute attrOptions = param.getAttribute("Options");
+
+ if (attrOptions != null) {
+ roundSum = attrOptions.getValue().contains("RoundPos");
+ tempRound = attrOptions.getValue().contains("TempRound");
+ roundNPBase = attrOptions.getValue().contains("RoundNPBase");
+ addZatr = attrOptions.getValue().contains("AddZatr");
+ globalNR = attrOptions.getValue().contains("CommonNakl");
+ globalSP = attrOptions.getValue().contains("CommonPlan");
+ if (param.getAttribute("TzDigits") != null) tzDigits = Integer.valueOf(param.getAttributeValue("TzDigits"));
+ if (param.getAttribute("MatDigits") != null) matDigits = Integer.valueOf(param.getAttributeValue("MatDigits"));
+ }
+
+ if (param.getAttribute("PosKDigits") != null) posKDigits = Integer.valueOf(param.getAttributeValue("PosKDigits"));
+ }
+
+ public Boolean getRoundSum() {
+ return roundSum;
+ }
+
+ public boolean isTempRound() {
+ return tempRound;
+ }
+
+ public Boolean getRoundNPBase() {
+ return roundNPBase;
+ }
+
+ public Boolean getAddZatr() {
+ return addZatr;
+ }
+
+ public Boolean getGlobalNR() {
+ return globalNR;
+ }
+
+ public Boolean getGlobalSP() {
+ return globalSP;
+ }
+
+ public String getBasePrices() {
+ return basePrices;
+ }
+
+ public String getBaseCalcVrs() {
+ return baseCalcVrs;
+ }
+
+ public int getMatDigits() {
+ return matDigits;
+ }
+
+ public int getTzDigits() {
+ return tzDigits;
+ }
+
+ public int getPosKDigits() {
+ return posKDigits;
+ }
+}
diff --git a/src/main/java/com/ibcon/sproject/smet/model/xml/XMLRegionInfo.java b/src/main/java/com/ibcon/sproject/smet/model/xml/XMLRegionInfo.java
new file mode 100644
index 0000000..aded83e
--- /dev/null
+++ b/src/main/java/com/ibcon/sproject/smet/model/xml/XMLRegionInfo.java
@@ -0,0 +1,27 @@
+package com.ibcon.sproject.smet.model.xml;
+
+import org.jdom2.Element;
+
+public class XMLRegionInfo {
+
+ private String regionName;
+ private Integer regionId;
+
+ public XMLRegionInfo(Element region) {
+
+ if (region.getAttribute("RegionName") != null) {
+ regionName = region.getAttributeValue("RegionName");
+ }
+ if (region.getAttribute("RegionID") != null) {
+ regionId = Integer.valueOf(region.getAttributeValue("RegionID"));
+ }
+ }
+
+ public String getRegionName() {
+ return regionName;
+ }
+
+ public Integer getRegionId() {
+ return regionId;
+ }
+}
diff --git a/src/main/java/com/ibcon/sproject/smet/model/xml/XMLSmr.java b/src/main/java/com/ibcon/sproject/smet/model/xml/XMLSmr.java
new file mode 100644
index 0000000..41684f6
--- /dev/null
+++ b/src/main/java/com/ibcon/sproject/smet/model/xml/XMLSmr.java
@@ -0,0 +1,1233 @@
+package com.ibcon.sproject.smet.model.xml;
+
+import bsh.EvalError;
+import bsh.Interpreter;
+import com.ibcon.sproject.smet.model.objects.*;
+import com.ibcon.sproject.smet.model.objects.smr.SmrWork;
+import com.ibcon.sproject.smet.model.utilits.CheckValue;
+import org.jdom2.Element;
+
+import java.math.BigDecimal;
+import java.util.*;
+
+public class XMLSmr {
+
+ private XmlSmet xmlSmet;
+ private Element smrElement;
+ private Norm localNorm;
+
+ private HashMap smrMasks;
+ private HashMap smrValues;
+
+ private HashMap smrCosts, smrEdits;
+ private List baseVals = Arrays.asList("PZ", "ZM", "EM", "OZ", "MT");
+ private boolean pzSync = true;
+ private ArrayList resourceAssignments;
+
+ private XMLCoefficients localK;
+ private HashMap levSum;
+
+ private boolean isNoRegK;
+
+ private SmrNode smrNode;
+ private ChapterNode chapterNode;
+
+ private SmetResourceCollection resourceCollection;
+
+ public XMLSmr(XmlSmet xmlSmet, Element smrElement, ChapterNode chapter) {
+ this.xmlSmet = xmlSmet;
+ this.smrElement = smrElement;
+ this.chapterNode = chapter;
+ this.smrNode = xmlSmet.getSmrNode();
+
+ this.resourceAssignments = new ArrayList<>();
+ this.smrCosts = new HashMap<>();
+ this.smrValues = new HashMap<>();
+ this.smrEdits = new HashMap<>();
+ this.smrMasks = new HashMap<>();
+
+ //todo заполнить коллекцию
+ resourceCollection = new SmetResourceCollection();
+
+ parseLocalNorm();
+ parseSmrValues();
+ parseWorks();
+ smrNode.updateValues(smrValues, smrCosts, smrMasks, resourceAssignments);
+ }
+
+ private void parseLocalNorm() {
+ smrNode.setLocalNorm(smrElement.getAttribute("Options") != null && smrElement.getAttributeValue("Options").contains("CustNaclCurr"));
+ if (smrElement.getChild("CustomNPCurr") != null) {
+ localNorm = new Norm(smrElement.getChild("CustomNPCurr"));
+ }
+ this.pzSync = smrElement.getAttribute("PzSync") != null && !smrElement.getAttributeValue("PzSync").equals
+ ("") && !smrElement.getAttributeValue("PzSync").equals("No");
+
+ this.isNoRegK = smrElement.getAttribute("Options") != null && smrElement.getAttributeValue("Options").contains("NoRegK");
+ }
+
+ //region Расчет и парсинг показателей расценки
+ private void parseSmrValues() {
+ localK = null;
+
+ parseResourceAssignments();
+ parseLocalK();
+
+ parseQuantity();
+ parseValues();
+
+ if (!xmlSmet.getIndexes().getIndexMode().equals("None")) applyIndexes();
+ if (xmlSmet.getTerZoneK() != null && !smrNode.isEqui()) applyTerZoneK();
+ if (localK != null) applyLocalCoefficients();
+
+ sumValues();
+
+ //region Округление стоимостей расценки до двух разрядов
+ for (String key : smrValues.keySet()) {
+ if (key.equals("TZR") || key.equals("TZM") || key.equals("quantity")) continue;
+ BigDecimal a = new BigDecimal(String.valueOf(smrValues.get(key))).setScale(xmlSmet.getParameters().getRoundSum() ? 0 : 2, BigDecimal.ROUND_HALF_UP);
+ smrValues.put(key, a.doubleValue());
+ }
+ //endregion
+
+ if (xmlSmet.getRegionalK() != 1 && !isNoRegK) applyRegionalK();
+ applyGlobalCoefficients();
+
+ smrValues.put("SUM", smrValues.get("PZ"));
+ applyNrSp(smrElement);
+
+ //TODO Чмошный костыль для КИНЕФа
+ if (smrNode.getVidRabId() == 10087 && smrValues.containsKey("PZ") && !smrValues.containsKey("OZ") &&
+ !smrValues.containsKey("MT") && !smrValues.containsKey("EM") && !smrValues.containsKey("ZM")) {
+ smrValues.put("MT", smrValues.get("PZ"));
+ }
+
+ if (smrNode.isDisabled()) return;
+
+ xmlSmet.getSmet().setPz((xmlSmet.getSmet().getPz() != null ? xmlSmet.getSmet().getPz() : 0) +
+ (smrValues.containsKey("PZ") ? smrValues.get("PZ") : 0));
+ if (smrValues.containsKey("OZ")) xmlSmet.getSmet().setOz(xmlSmet.getSmet().getOz() + smrValues.get("OZ"));
+ if (smrValues.containsKey("TZR")) xmlSmet.getSmet().setTzr(xmlSmet.getSmet().getTzr() + smrValues.get("TZR"));
+ if (smrValues.containsKey("EM")) xmlSmet.getSmet().setEm(xmlSmet.getSmet().getEm() + smrValues.get("EM"));
+ if (smrValues.containsKey("ZM")) xmlSmet.getSmet().setZm(xmlSmet.getSmet().getZm() + smrValues.get("ZM"));
+ if (smrValues.containsKey("TZM")) xmlSmet.getSmet().setTzm(xmlSmet.getSmet().getTzm() + smrValues.get("TZM"));
+ if (smrValues.containsKey("MT")) xmlSmet.getSmet().setMt(xmlSmet.getSmet().getMt() + smrValues.get("MT"));
+
+ xmlSmet.getSmet().setNr(xmlSmet.getSmet().getNr() + (smrValues.get("NR")));
+ xmlSmet.getSmet().setSp(xmlSmet.getSmet().getSp() + (smrValues.get("SP")));
+ xmlSmet.getSmet().setSum(xmlSmet.getSmet().getPz() + xmlSmet.getSmet().getNr() + xmlSmet.getSmet().getSp());
+ }
+ //endregion
+
+
+ //Расчет и парсинг назначений ресурсов
+ private void parseResourceAssignments() {
+ if (smrElement.getChild("Resources") == null || smrElement.getChild("Resources").getChildren().isEmpty()) return;
+
+ Element rsrcs = smrElement.getChild("Resources");
+ for (Element rsrcElement : rsrcs.getChildren() ) {
+
+ SmetResource rsrc = parseResource(rsrcElement);
+ if (rsrc == null) continue;
+ SmetResourceAssignment smetRa = new SmetResourceAssignment(
+ rsrc,
+ rsrcElement,
+ xmlSmet.getParameters());
+
+ resourceAssignments.add(smetRa);
+
+ XMLCoefficients kRA = null;
+ if (rsrcElement.getChild("Koefficients") != null) kRA = new XMLCoefficients(rsrcElement.getChild("Koefficients"));
+ if (kRA!= null
+ && (rsrcElement.getAttribute("Attribs") == null
+ || (rsrcElement.getAttribute("Attribs") != null
+ && !rsrcElement.getAttributeValue("Attribs").contains("Deleted")))) smetRa.applyCoeff(kRA);
+
+ for (String key : smetRa.getCosts().keySet()) {
+ if (key.equals("TZR") || key.equals("TZM")) {
+ smrCosts.put(key, smrCosts.containsKey(key)? smrCosts.get(key) + smetRa.getCosts().get(key)
+ : smetRa.getCosts().get(key));
+ }
+
+ if (rsrcElement.getAttribute("Attribs") != null
+ && rsrcElement.getAttributeValue("Attribs").contains("Deleted")
+ && (rsrcElement.getAttribute("Options") == null || !rsrcElement.getAttributeValue("Options").contains("NotCount"))) {
+ smrEdits.put(key, smrEdits.containsKey(key)
+ ? smrEdits.get(key) - (smetRa.getCosts().get(key))
+ : smetRa.getCosts().get(key)* (-1));
+
+ } else if ((rsrcElement.getAttribute("Attribs") != null
+ && rsrcElement.getAttributeValue("Attribs").contains("Replaced"))
+ || (rsrcElement.getAttribute("Attribs") != null
+ && rsrcElement.getAttributeValue("Attribs").contains("Added"))
+ || (rsrcElement.getAttribute("Options") != null && rsrcElement.getAttributeValue("Options").contains("NotCount")
+ && rsrcElement.getAttributeValue("Options").contains("CountInPlace"))) {
+
+ smrEdits.put(key, smrEdits.containsKey(key)
+ ? smrEdits.get(key) + (smetRa.getCosts().get(key))
+ : smetRa.getCosts().get(key));
+
+ } else if (smetRa.raEdits != null && smetRa.raEdits.containsKey(key)) {
+
+ smrEdits.put(key, smrEdits.containsKey(key)
+ ? smrEdits.get(key) + (smetRa.raEdits.get(key))
+ : smetRa.raEdits.get(key));
+
+ }
+ }
+
+ if (rsrcElement.getAttribute("Attribs") != null
+ && smetRa.getAttrib().contains("Replaced")
+ && rsrcElement.getChild("Replaced") != null
+ && ((rsrcElement.getChild("Replaced").getAttribute("Options") != null
+ && !rsrcElement.getAttributeValue("Options").contains("NotCount")
+ && !rsrcElement.getChild("Replaced").getAttributeValue("Options").contains("CountInPlace"))
+ || rsrcElement.getChild("Replaced").getAttribute("Options") == null)) {
+
+ Element tempEl = rsrcElement.getChild("Replaced");
+ SmetResource rsrcDeleted = parseResource(tempEl);
+
+ SmetResourceAssignment smetRaDeleted = new SmetResourceAssignment(
+ rsrcDeleted,
+ tempEl,
+ xmlSmet.getParameters());
+
+ for (String key : smetRaDeleted.getCosts().keySet()) {
+ smrEdits.put(key, smrEdits.containsKey(key)
+ ? smrEdits.get(key) - smetRaDeleted.getCosts().get(key)
+ : smetRaDeleted.getCosts().get(key) * (-1));
+ }
+ }
+ }
+ }
+
+ private void parseLocalK() {
+ localK = null;
+
+ //Разбираем коэффициенты сметной строки
+ if (smrElement.getChild("Koefficients") != null
+ && !smrElement.getChild("Koefficients").getChildren().isEmpty()) {
+ localK = new XMLCoefficients(smrElement.getChild("Koefficients"));
+ }
+
+ //Если групповые коэффициенты не заданы, возвращаемся
+ if (xmlSmet.getGlobalK() == null) return;
+
+ for (int l : xmlSmet.getGlobalK().getLevels()) {
+ for (XMLCoefficient k : xmlSmet.getGlobalK().getCoeffs().get(l)) {
+ if (!k.isInPos()) continue;
+
+ //Проверяем не попадает ли коэффициент в список отмененных
+ Boolean excluded = false;
+ if (smrElement.getChild("ExcludedKfs") != null
+ && smrElement.getChild("ExcludedKfs").getAttribute("Value") != null) {
+
+ String excludedKfs = smrElement.getChild("ExcludedKfs").getAttributeValue("Value").replace("(", "").replace(")", "").replace(" ", "");
+ for (String kStr : excludedKfs.split(",")) excluded = xmlSmet.getGlobalK().getCoeffList().get(Integer.parseInt(kStr)).equals(k);
+ }
+ if (excluded) continue;
+
+ if (isApplyK(k)) {
+ if (localK == null) localK = new XMLCoefficients();
+ if (!localK.getLevels().contains(l)) {
+ localK.getLevels().add(l);
+ localK.getCoeffs().put(l, new ArrayList());
+ }
+ localK.getCoeffs().get(l).add(k);
+ }
+ }
+ }
+ if (localK != null) localK.sortLevels();
+ }
+
+ private void parseWorks() {
+ if (smrElement.getChild("WorksList") == null || smrElement.getChild("WorksList").getChildren().isEmpty() ) return;
+
+ for (Element w : smrElement.getChild("WorksList").getChildren()) {
+ if (!w.getName().equals("Work") || w.getAttribute("Caption") == null
+ || w.getAttributeValue("Caption").equals("")) continue;
+ smrNode.getWorks().add(new SmrWork(w.getAttributeValue("Caption")));
+ }
+ }
+
+ private void parseQuantity() {
+ double quantity = 0.0;
+ if (smrElement.getChild("Quantity") != null
+ && smrElement.getChild("Quantity").getAttribute("Result") != null)
+ quantity = Double.parseDouble(smrElement.getChild("Quantity").getAttributeValue("Result").replace(",", "."));
+ else if (smrElement.getAttribute("Quantity") != null) {
+ if (CheckValue.isDouble(smrElement.getAttributeValue("Quantity").replace(",", "."))) {
+ quantity = Double.parseDouble(smrElement.getAttributeValue("Quantity").replace(",", "."));
+
+ } else {
+ if (xmlSmet.getIdentifierValues().containsKey(smrElement.getAttributeValue("Quantity"))) {
+ quantity = xmlSmet.getIdentifierValues().get(smrElement.getAttributeValue("Quantity"));
+ } else {
+ String stringQuantity = smrElement.getAttributeValue("Quantity").toLowerCase();
+ ArrayList identList = new ArrayList<>(xmlSmet.getIdentifierValues().keySet());
+
+ Collections.sort(identList, new Comparator() {
+ @Override
+ public int compare(String string1, String string2) {
+ if (string1.length() > string2.length()) {
+ return -1;
+ } else if (string1.length() < string2.length()) {
+ return 1;
+ }
+ return 0;
+ }
+ });
+
+ for (String i : identList) {
+ if (stringQuantity.contains(i)) {
+ stringQuantity = stringQuantity.replace(i, xmlSmet.getIdentifierValues().get(i).toString());
+ }
+ }
+ try {
+ Interpreter interpreter = new Interpreter();
+ stringQuantity = stringQuantity.replace(",", ".");
+ int rounding = -1;
+ stringQuantity = stringQuantity.replace(" ", "");
+ String toRound = stringQuantity.substring(stringQuantity.indexOf(";") + 1);
+ if (toRound.contains(")")) toRound = stringQuantity.substring(stringQuantity.indexOf(";")+1, stringQuantity.indexOf(";")+2);
+
+ if (stringQuantity.contains("окр(")) {
+ stringQuantity = stringQuantity.replace("окр(", "");
+ rounding = Integer.valueOf(toRound);
+ stringQuantity = stringQuantity.substring(0, stringQuantity.indexOf(";"));
+ } else if (stringQuantity.contains("округл(")) {
+ stringQuantity = stringQuantity.replace("округл(", "");
+ rounding = Integer.valueOf(toRound);
+ stringQuantity = stringQuantity.substring(0, stringQuantity.indexOf(";"));
+ }
+ interpreter.eval("quantity=" + "0.1*10*" + stringQuantity);
+ BigDecimal bdQuantity = new BigDecimal(interpreter.get("quantity").toString());
+ if (rounding > -1) bdQuantity = bdQuantity.setScale(rounding, BigDecimal.ROUND_HALF_UP);
+ quantity = bdQuantity.doubleValue();
+ } catch (EvalError evalError) {
+ System.out.println("bad Formula2: " + smrElement.getAttributeValue("Quantity").replace(",", "."));
+ }
+ }
+ }
+ }
+ smrValues.put("quantity", quantity);
+ }
+
+ private void parseValues() {
+ for (String val : baseVals) {
+ String stringValue;
+
+ if (smrElement.getAttribute("BaseCalcMode") == null || !smrElement.getAttributeValue("BaseCalcMode").equals("ForceRes")) {
+
+ if (smrElement.getChild("PriceBase") != null){
+ Element elementPrice = smrElement.getChild("PriceBase");
+
+ if (elementPrice.getAttribute(val) != null && !elementPrice.getAttributeValue(val).equals("")) {
+ stringValue = smrElement.getChild("PriceBase").getAttributeValue(val).replace(",", ".");
+ smrCosts.put(val, Double.parseDouble(stringValue));
+ }
+
+ } else if ((!smrCosts.containsKey(val) || smrCosts.get(val) == 0)
+ && smrElement.getChild("PriceCurr") != null) {
+ Element elementPrice = smrElement.getChild("PriceCurr");
+ if (elementPrice.getAttribute(val) != null && !elementPrice.getAttributeValue(val).equals("")) {
+ stringValue = smrElement.getChild("PriceCurr").getAttributeValue(val).replace(",", ".");
+ smrCosts.put(val, Double.parseDouble(stringValue));
+ if (!val.equals("PZ") && !val.equals("ZM") && pzSync)
+ smrCosts.put("PZ", (smrCosts.containsKey("PZ") ? smrCosts.get("PZ") : 0.0) + smrCosts.get(val));
+ }
+ }
+ } else if (!smrCosts.containsKey(val)) {
+ smrCosts.put(val, 0.0);
+ }
+ }
+
+ smrCosts.put("EMR",
+ ((smrCosts.containsKey("EM")) ? smrCosts.get("EM") : 0) - ((smrCosts.containsKey("ZM")) ? smrCosts.get("ZM") : 0));
+
+ smrValues.put("TZR", smrCosts.containsKey("TZR") ? smrCosts.get("TZR") : 0.0);
+ smrValues.put("TZM", smrCosts.containsKey("TZM") ? smrCosts.get("TZM") : 0.0);
+
+ for (String val : baseVals) {
+ if (smrEdits.containsKey(val)) {
+ smrCosts.put(val, (smrCosts.containsKey(val) ? smrCosts.get(val) : 0) + (smrEdits.get(val)));
+ if (val.equals("ZM") && smrEdits.containsKey("EM")) continue;
+ if (smrCosts.containsKey("PZ")) smrCosts.put("PZ", smrCosts.get("PZ") + (smrEdits.get(val)));
+ }
+ }
+
+ if ((smrElement.getAttribute("BaseCalcMode") != null
+ && smrElement.getAttributeValue("BaseCalcMode").equals("ForceRes")) || pzSync) {
+ double sum = smrCosts.containsKey("OZ") ? smrCosts.get("OZ") : 0;
+ sum = sum + (smrCosts.containsKey("MT") ? smrCosts.get("MT") : 0);
+ sum = sum + (smrCosts.containsKey("EM") ? smrCosts.get("EM") : smrCosts.containsKey("ZM") ? smrCosts.get
+ ("ZM") : 0);
+ if (sum > 0 && !smrCosts.containsKey("PZ")) smrCosts.put("PZ", sum);
+ }
+
+ //Округление стоимостей расценки до двух разрядов
+ for (String key : smrCosts.keySet()) {
+ if (key.equals("TZR") || key.equals("TZM")) continue;
+ BigDecimal a = new BigDecimal(String.valueOf(smrCosts.get(key))).setScale(2, BigDecimal.ROUND_HALF_UP);
+ smrCosts.put(key, a.doubleValue());
+ }
+
+ if (smrEdits.containsKey("EMR")) smrCosts.put("EMR", smrCosts.get("EMR")+(smrEdits.get("EMR")));
+ }
+
+ private void applyIndexes() {
+// Для применения индексов к текущим ценам
+ if (smrElement.getAttribute("Index8401Code") == null || smrElement.getAttributeValue("Index8401Code").equals("")) return;
+
+
+ String indexCode = "";
+ if (smrElement.getAttribute("Index8401Code") != null && !smrElement.getAttributeValue("Index8401Code").equals("")) {
+ indexCode = smrElement.getAttributeValue("Index8401Code");
+ }
+ if (xmlSmet.getIndexes().getIndexesCode().containsKey(indexCode)) {
+
+ XMLIndex i = xmlSmet.getIndexes().getIndexesCode().get(indexCode);
+ for (String key : i.getValues().keySet()) {
+ if (!smrValues.containsKey(key)) continue;
+ Double calc = smrValues.get(key) * (i.getValues().get(key)-1);
+ calc = new BigDecimal(String.valueOf(calc)).setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue();
+
+ smrValues.put(key, (smrValues.containsKey(key) ? smrValues.get(key) : 0) + calc);
+
+ if (!key.equals("ZM"))
+ smrValues.put("PZ", (smrValues.containsKey("PZ") ? smrValues.get("PZ") : 0) + calc);
+
+ if (key.equals("ZM") && !i.getValues().keySet().contains("EM")) {
+ smrValues.put("EM", smrValues.get("EM") + calc);
+ smrValues.put("PZ", smrValues.get("PZ") + calc);
+ }
+ }
+ }
+ }
+
+ //Применение территориальной поправки
+ private void applyTerZoneK() {
+ XMLCoefficient coeff = xmlSmet.getTerZoneK();
+
+ //Применение коэффициента ПЗ
+ if (coeff.getPz() != null && smrCosts.containsKey("PZ")) {
+ smrCosts.put("PZ", smrCosts.get("PZ")*coeff.getPz());
+ }
+ //Применение коэффициента ОЗ
+ if (coeff.getOz() != null || (coeff.isPzAll() && coeff.getPz() != null)) {
+
+ double k = 1;
+ if (coeff.getOz() != null) k = coeff.getOz();
+ if (coeff.isPzAll() && coeff.getPz() != null) k = k * coeff.getPz();
+
+ if (smrCosts.containsKey("OZ")) {
+ Double calc = smrCosts.get("OZ")*(k-1);
+ smrCosts.put("OZ", smrCosts.get("OZ") + calc);
+ if (coeff.getPz() == null || (coeff.isPzAll() && !smrCosts.containsKey("PZ"))) {
+ smrCosts.put("PZ", ((smrCosts.containsKey("PZ")) ? smrCosts.get("PZ") : 0) + calc);
+ }
+ if (coeff.getPz() != null && coeff.getOz() != null && coeff.isPzAll() && smrCosts.containsKey("PZ")) {
+ smrCosts.put("PZ", smrCosts.get("PZ") + calc - smrCosts.get("OZ")*(coeff.getPz() - 1));
+ }
+ }
+ if (coeff.isOzpTz() && smrCosts.containsKey("TZR")) smrCosts.put("TZR", smrCosts.get("TZR")*k);
+
+ for (SmetResourceAssignment ra : resourceAssignments) {
+ if (!ra.getType().equals("T")) continue;
+ ra.getCosts().put("OZ", (ra.getCosts().containsKey("OZ") ? ra.getCosts().get("OZ") : 0) * k);
+ if (coeff.isOzpTz()) ra.getCosts().put("TZR", (ra.getCosts().containsKey("TZR") ? ra.getCosts().get
+ ("TZR") : 0) * k);
+ }
+ }
+ //Применение коэффициента ЭМ
+ if (coeff.getEm() != null || (coeff.isPzAll() && coeff.getPz() != null)) {
+
+ double k = 1;
+ if (coeff.getEm() != null) k = coeff.getEm();
+ if (coeff.isPzAll() && coeff.getPz() != null) k = k * coeff.getPz();
+
+ if (smrCosts.containsKey("EM")) {
+ Double calc;
+ if (coeff.isSeparEm() && !coeff.isEmAll() && smrCosts.containsKey("ZM")){
+ calc = (smrCosts.get("EM") - smrCosts.get("ZM"))*(k - 1);
+ } else {
+ calc = smrCosts.get("EM")*(k - 1);
+ }
+ smrCosts.put("EM", smrCosts.get("EM") + calc);
+
+ if (coeff.getPz() == null || (coeff.isPzAll() && !smrCosts.containsKey("PZ"))) {
+ smrCosts.put("PZ", ((smrCosts.containsKey("PZ")) ? smrCosts.get("PZ") : 0) + calc);
+ }
+ }
+
+ for (SmetResourceAssignment ra : resourceAssignments) {
+ if (!ra.getType().equals("Mech")) continue;
+ Double calc;
+ if (coeff.isSeparEm() && !coeff.isEmAll()){
+ calc = ((ra.getCosts().containsKey("EM") ? ra.getCosts().get("EM") : 0) - (ra.getCosts()
+ .containsKey("ZM") ? ra.getCosts().get("ZM") : 0))*(k-1);
+ } else {
+ calc = (ra.getCosts().containsKey("EM") ? ra.getCosts().get("EM") : 0)*(k-1);
+ }
+ ra.getCosts().put("EM", (ra.getCosts().containsKey("EM") ? ra.getCosts().get("EM") : 0) + calc);
+ }
+ }
+ //Применение коэффициента ЗМ
+ if (coeff.getZm() != null
+ || (coeff.isEmAll() && coeff.getEm() != null)
+ || (coeff.isPzAll() && coeff.getPz() != null)) {
+
+ double k = 1;
+ if (coeff.getZm() != null) k = coeff.getZm();
+ if (coeff.isEmAll() && coeff.getEm() != null) k = k * coeff.getEm();
+ if (coeff.isPzAll() && coeff.getPz() != null) k = k * coeff.getPz();
+
+ if (smrCosts.containsKey("ZM")) {
+ Double calc = smrCosts.get("ZM") * (k - 1);
+ smrCosts.put("ZM", smrCosts.get("ZM") + calc);
+ if ((coeff.getEm() == null && coeff.getZm() != null && !coeff.isPzAll()) || (coeff.isEmAll() &&
+ !smrCosts.containsKey("EM"))) {
+ smrCosts.put("EM", ((smrCosts.containsKey("EM")) ? smrCosts.get("EM") : 0) + calc);
+ if (coeff.getPz() == null || (coeff.isPzAll() && !smrCosts.containsKey("PZ"))) {
+ smrCosts.put("PZ", ((smrCosts.containsKey("PZ")) ? smrCosts.get("PZ") : 0) + calc);
+ }
+ }
+ }
+ if (coeff.isZpmTz() && smrCosts.containsKey("TZM")) smrCosts.put("TZM", smrCosts.get("TZM") * k);
+
+ for (SmetResourceAssignment ra : resourceAssignments) {
+ if (coeff.isZpmTz() && ra.getType().equals("Tzm")) {
+ ra.getCosts().put("TZM", (ra.getCosts().containsKey("TZM") ? ra.getCosts().get("TZM") : 0) * k);
+ } else if (ra.getType().equals("Mech")) {
+ ra.getCosts().put("ZM", (ra.getCosts().containsKey("ZM") ? ra.getCosts().get("ZM") : 0) * k);
+ }
+ }
+ }
+ //Применение коэффициента МАТ
+ if (coeff.getMt() != null || (coeff.isPzAll() && coeff.getPz() != null)) {
+
+ double k = 1;
+ if (coeff.getMt() != null) k = coeff.getMt();
+ if (coeff.isPzAll() && coeff.getPz() != null) k = k * coeff.getPz();
+
+ if (smrCosts.containsKey("MT")) {
+ Double calc = smrCosts.get("MT")*(k-1);
+ smrCosts.put("MT", smrCosts.get("MT") + calc);
+ if (coeff.getPz() == null || (coeff.isPzAll() && !smrCosts.containsKey("PZ"))) {
+ smrCosts.put("PZ", ((smrCosts.containsKey("PZ")) ? smrCosts.get("PZ") : 0) + calc);
+ }
+ }
+ for (SmetResourceAssignment ra : resourceAssignments) {
+ if (!ra.getType().equals("Mat")) continue;
+ ra.getCosts().put("MT", (ra.getCosts().containsKey("MT") ? ra.getCosts().get("MT") : 0) * k);
+ if (coeff.isMatQty()) ra.setQuantity(ra.getQuantity() * k);
+ }
+ }
+
+ smrCosts.put("EMR",
+ (smrCosts.containsKey("EM") ? smrCosts.get("EM") : 0)
+ - (smrCosts.containsKey("ZM") ? smrCosts.get("ZM") : 0));
+
+ for (SmetResourceAssignment smRa : resourceAssignments) {
+ if (!smRa.getCosts().containsKey("EM")) continue;
+ smRa.getCosts().put("EM", smRa.getCosts().get("ZM")+(smRa.getCosts().get("EMR")));
+ }
+ }
+
+ //Применение группы локальных коэффициентов
+ private void applyLocalCoefficients() {
+
+ if (localK == null) return;
+
+ for (int lev : localK.getLevels()) {
+
+ levSum = new HashMap<>();
+ for (SmetResourceAssignment smRa : resourceAssignments) {
+ smRa.setLevelSum(new HashMap());
+ }
+
+ Element chapter = smrElement.getParentElement();
+
+ for (XMLCoefficient coeff : localK.getCoeffs().get(lev)) {
+
+ if (coeff.isDisabled()) continue;
+
+ //Расчет показателей по формулам
+ if (coeff.getKind().equals("Formula")) {
+
+ Interpreter interpreter = new Interpreter();
+ Double eval = 0.0;
+
+ String rawFormula = coeff.getFormula().substring(coeff.getFormula().indexOf("=")+1);
+
+ if (smrNode.isEqui() && CheckValue.isDouble(rawFormula.replace(",","."))) continue;
+
+ if (smrNode.isEqui() && rawFormula.contains("МАТ")) {
+ String s = /*rawFormula.contains("ПЗ") ? "ПЗ" : */"МАТ";
+ String r = rawFormula.substring(rawFormula.indexOf(s) - 1, rawFormula.indexOf(s) + s.length());
+ rawFormula = rawFormula.replace(r, "");
+ }
+
+ if (rawFormula.contains("ПЗ")) {
+ if (smrCosts.keySet().contains("PZ")) {
+ rawFormula=rawFormula.replace("ПЗ", smrCosts.get("PZ").toString());
+ } else {
+ rawFormula=rawFormula.replace("ПЗ", "0");
+ }
+ }
+
+ if (rawFormula.contains("ОЗП")) {
+ if (smrCosts.keySet().contains("OZ")) {
+ rawFormula=rawFormula.replace("ОЗП", smrCosts.get("OZ").toString());
+ } else {
+ rawFormula=rawFormula.replace("ОЗП", "0");
+ }
+ }
+
+ if (rawFormula.contains("ЭМ")) {
+ if (smrCosts.keySet().contains("EM")) {
+ rawFormula = rawFormula.replace("ЭМ", smrCosts.get("EM").toString());
+ } else {
+ rawFormula = rawFormula.replace("ЭМ", "0");
+ }
+ }
+
+ if (rawFormula.contains("МАТ")) {
+ if (smrCosts.keySet().contains("MT")) {
+ rawFormula = rawFormula.replace("МАТ", smrCosts.get("MT").toString());
+ } else {
+ rawFormula = rawFormula.replace("МАТ", "0");
+ }
+ }
+
+ String value = coeff.getFormulaValue();
+ String formula = value + "=" + rawFormula.replace("/", "*1.0/");
+ int rounding = -1;
+
+ //region Если формула не вычисляется пробуем подставить переменные
+ if (!isFormulaOk(formula, value)) {
+ rawFormula = rawFormula.toLowerCase();
+ ArrayList identList = new ArrayList<>(xmlSmet.getIdentifierValues().keySet());
+ Collections.sort(identList, new Comparator() {
+ @Override
+ public int compare(String string1, String string2) {
+ if (string1.length() > string2.length()) {
+ return -1;
+ } else if (string1.length() < string2.length()) {
+ return 1;
+ }
+ return 0;
+ }
+ });
+
+ for (String i : identList) {
+ if (!rawFormula.contains(i)) continue;
+ rawFormula = rawFormula.replace(i, xmlSmet.getIdentifierValues().get(i).toString());
+ }
+
+ rawFormula = rawFormula.replace(",", ".");
+
+ if (rawFormula.contains("окр(")) {
+ rawFormula = rawFormula.replace("окр(", "");
+ rounding = Integer.valueOf(rawFormula.substring(rawFormula.indexOf(";")+1));
+ rawFormula = rawFormula.substring(0, rawFormula.indexOf(";"));
+ }
+ }
+
+ try {
+ formula = value + "=" + rawFormula.replace("/", "*1.0/");
+ interpreter.eval(formula);
+ BigDecimal bdQuantity = new BigDecimal(interpreter.get(value).toString());
+ if (rounding > -1) bdQuantity = bdQuantity.setScale(rounding, BigDecimal.ROUND_HALF_UP);
+ eval = bdQuantity.doubleValue();
+ } catch (EvalError evalError) {
+ System.out.println("bad Formula : " + formula);
+ }
+
+ value = value.replace("ПЗ", "PZ").replace("ОЗП", "OZ").replace("ЭМ", "EM").replace("ЗПМ", "ZM").replace("МАТ", "MT");
+
+ if (xmlSmet.getParameters().isTempRound()) {
+ eval = new BigDecimal(String.valueOf(eval)).setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue();
+ }
+
+ levSum.put(value, (levSum.containsKey(value) ? levSum.get(value) : 0) + eval);
+ if (value.equals("ZM")) levSum.put("EM", (levSum.containsKey("EM") ? levSum.get("EM") : 0) + eval);
+ if (!value.equals("PZ")) levSum.put("PZ", (levSum.containsKey("PZ") ? levSum.get("PZ") : 0) + eval);
+
+ continue;
+
+ }
+
+ //Расчет по коэффициентам
+ if ((coeff.isAllChapters() && coeff.isAllVidRabs())
+ || (!coeff.isAllChapters() && chapter.getName().equals("Chapter") && chapter.getAttribute("SysID") != null
+ && coeff.getChaptersLink().contains(chapter.getAttributeValue("SysID")))
+ || (!coeff.isAllVidRabs() && smrElement.getAttribute("Vr2001")!=null && coeff.getVrsLink().contains(smrElement.getAttributeValue("Vr2001")))) {
+
+ applyGroupK(coeff, smrCosts);
+ }
+
+ if (xmlSmet.getParameters().isTempRound()) {
+ for (String k : levSum.keySet()) {
+ BigDecimal a = new BigDecimal(String.valueOf(levSum.get(k))).setScale(2, BigDecimal.ROUND_HALF_UP);
+ levSum.put(k, a.doubleValue());
+ }
+ }
+ }
+ //Суммирование показателей по уровням
+ for (String key : levSum.keySet()) {
+ BigDecimal a = new BigDecimal(String.valueOf((smrCosts.containsKey(key) ? smrCosts.get(key) : 0) +
+ levSum.get(key)));
+ if (xmlSmet.getParameters().isTempRound()) a = a.setScale(2, BigDecimal.ROUND_HALF_UP);
+ smrCosts.put(key, a.doubleValue());
+
+ for (SmetResourceAssignment smRa : resourceAssignments) {
+ if (!smRa.getCosts().containsKey(key)) continue;
+ smRa.getCosts().put(key, smRa.getCosts().get(key) + (smRa.getLevelSum().containsKey(key) ? smRa.getLevelSum().get(key) : 0));
+ }
+ }
+ }
+
+ for (String k : smrCosts.keySet()) {
+ smrCosts.put(k, new BigDecimal(String.valueOf(smrCosts.get(k))).setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue());
+ }
+
+ smrCosts.put("EMR",
+ (smrCosts.containsKey("EM") ? smrCosts.get("EM") : 0)
+ - (smrCosts.containsKey("ZM") ? smrCosts.get("ZM") : 0));
+
+ for (SmetResourceAssignment smRa : resourceAssignments) {
+ smRa.setLevelSum(null);
+ if (!smRa.getCosts().containsKey("EM")) continue;
+ smRa.getCosts().put("EM", smRa.getCosts().get("ZM")+(smRa.getCosts().get("EMR")));
+ }
+ }
+
+ //Суммирование показателей
+ private void sumValues() {
+ for (String key : smrCosts.keySet()) {
+ smrValues.put(key, smrCosts.get(key) * (smrValues.get("quantity")));
+ }
+
+ if (!smrValues.containsKey("PZ") && pzSync) {
+ smrValues.put("PZ", (smrValues.containsKey("OZ") ? smrValues.get("OZ") : 0)
+ + (smrValues.containsKey("EM") ? smrValues.get("EM") : 0)
+ + (smrValues.containsKey("MT") ? smrValues.get("MT") : 0));
+ }
+
+ smrValues.put("EMR", (smrCosts.containsKey("EM") ? smrCosts.get("EM") : 0)-(smrValues.containsKey("ZM") ? smrValues.get("ZM") : 0));
+ }
+
+ //Применение группы глобальных коэффициентов
+ private void applyGlobalCoefficients() {
+
+ if (xmlSmet.getGlobalK() == null) return;
+
+ for (int lev : xmlSmet.getGlobalK().getLevels()) {
+
+ levSum = new HashMap<>();
+ for (SmetResourceAssignment smRa : resourceAssignments) {
+ smRa.setLevelSum(new HashMap());
+ }
+
+ for (XMLCoefficient koeff : xmlSmet.getGlobalK().getCoeffs().get(lev)) {
+ if (isExcludedK(koeff) || koeff.isInPos() || !isApplyK(koeff) || koeff.isDisabled()) continue;
+ //Расчет показателей по формулам
+ if (koeff.getKind().equals("Formula")) {
+
+ Interpreter interpreter = new Interpreter();
+ Double eval = 0.0;
+
+ String rawFormula = koeff.getFormula().substring(koeff.getFormula().indexOf("=")+1);
+
+ if (smrNode.isEqui() && CheckValue.isDouble(rawFormula.replace(",","."))) continue;
+
+ if (smrNode.isEqui() && rawFormula.contains("МАТ")) {
+ String s = "МАТ";
+ String r = rawFormula.substring(rawFormula.indexOf(s) - 1, rawFormula.indexOf(s) + s.length());
+ rawFormula = rawFormula.replace(r, "");
+ }
+
+ if (rawFormula.contains("ПЗ")) {
+ if (smrValues.keySet().contains("PZ")) {
+ rawFormula=rawFormula.replace("ПЗ", smrValues.get("PZ").toString());
+ } else {
+ rawFormula=rawFormula.replace("ПЗ", "0");
+ }
+ }
+
+ if (rawFormula.contains("ОЗП")) {
+ if (smrValues.keySet().contains("OZ")) {
+ rawFormula=rawFormula.replace("ОЗП", smrValues.get("OZ").toString());
+ } else {
+ rawFormula=rawFormula.replace("ОЗП", "0");
+ }
+ }
+
+ if (rawFormula.contains("ЭМ")) {
+ if (smrValues.keySet().contains("EM")) {
+ rawFormula = rawFormula.replace("ЭМ", smrValues.get("EM").toString());
+ } else {
+ rawFormula = rawFormula.replace("ЭМ", "0");
+ }
+ }
+
+ if (rawFormula.contains("МАТ")) {
+ if (smrValues.keySet().contains("MT")) {
+ rawFormula = rawFormula.replace("МАТ", smrValues.get("MT").toString());
+ } else {
+ rawFormula = rawFormula.replace("МАТ", "0");
+ }
+ }
+
+ String value = koeff.getFormulaValue();
+ String formula = value + "=" + rawFormula.replace("/", "*1.0/");
+ int rounding = -1;
+
+ //Если формула не вычисляется пробуем подставить переменные
+ if (!isFormulaOk(formula, value)) {
+ rawFormula = rawFormula.toLowerCase();
+ ArrayList identList = new ArrayList<>(xmlSmet.getIdentifierValues().keySet());
+ Collections.sort(identList, new Comparator() {
+ @Override
+ public int compare(String string1, String string2) {
+ if (string1.length() > string2.length()) {
+ return -1;
+ } else if (string1.length() < string2.length()) {
+ return 1;
+ }
+ return 0;
+ }
+ });
+
+ for (String i : identList) {
+ if (!rawFormula.contains(i)) continue;
+ rawFormula = rawFormula.replace(i, xmlSmet.getIdentifierValues().get(i).toString());
+ }
+
+ rawFormula = rawFormula.replace(",", ".");
+
+ if (rawFormula.contains("окр(")) {
+ rawFormula = rawFormula.replace("окр(", "");
+ rounding = Integer.valueOf(rawFormula.substring(rawFormula.indexOf(";")+1));
+ rawFormula = rawFormula.substring(0, rawFormula.indexOf(";"));
+ }
+ }
+
+ try {
+ formula = value + "=" + rawFormula.replace("/", "*1.0/");
+ interpreter.eval(formula);
+ BigDecimal bdQuantity = new BigDecimal(interpreter.get(value).toString());
+ if (rounding > -1) bdQuantity = bdQuantity.setScale(rounding, BigDecimal.ROUND_HALF_UP);
+ eval = bdQuantity.doubleValue();
+ } catch (EvalError evalError) {
+ System.out.println("bad Formula : " + formula);
+ }
+
+ value = value.replace("ПЗ", "PZ").replace("ОЗП", "OZ").replace("ЭМ", "EM").replace("ЗПМ", "ZM").replace("МАТ", "MT");
+
+ if (xmlSmet.getParameters().isTempRound()) {
+ eval = new BigDecimal(String.valueOf(eval)).setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue();
+ }
+
+ levSum.put(value, (levSum.containsKey(value) ? levSum.get(value) : 0) + eval);
+ if (value.equals("ZM")) levSum.put("EM", (levSum.containsKey("EM") ? levSum.get("EM") : 0) + eval);
+ if (!value.equals("PZ")) levSum.put("PZ", (levSum.containsKey("PZ") ? levSum.get("PZ") : 0) + eval);
+
+ } else {
+ applyGroupK(koeff, smrValues);
+ }
+
+ }
+
+ for (String key : levSum.keySet()) {
+ BigDecimal a = new BigDecimal(smrValues.containsKey(key) ? smrValues.get(key) : 0.0).add(new
+ BigDecimal(levSum.get(key))).setScale(xmlSmet.getParameters().getRoundSum() ? 0 : 2, BigDecimal.ROUND_HALF_UP);
+ smrValues.put(key, a.doubleValue());
+
+ for (SmetResourceAssignment smRa : resourceAssignments) {
+ if (!smRa.getCosts().containsKey(key)) continue;
+ smRa.getCosts().put(key, ((smRa.getCosts().containsKey(key)) ? smRa.getCosts().get(key) : 0)
+ + ((smRa.getLevelSum().containsKey(key)) ? smRa.getLevelSum().get(key) : 0));
+ }
+ }
+ }
+
+ smrValues.put("EMR", (smrValues.containsKey("EM") ? smrValues.get("EM") : 0)
+ - (smrValues.containsKey("ZM") ? smrValues.get("ZM") : 0));
+
+ for (SmetResourceAssignment smRa : resourceAssignments) {
+ smRa.setLevelSum(null);
+ if (!smRa.getCosts().containsKey("EM")) continue;
+ Double ZMCost = (smRa.getCosts().containsKey("ZM") ? smRa.getCosts().get("ZM") : 0.00);
+ Double EMRCost = (smRa.getCosts().containsKey("EMR") ? smRa.getCosts().get("EMR") : 0.00);
+ smRa.getCosts().put("EM", ZMCost + EMRCost);
+ }
+ }
+
+ //Применение регионального коэффициента
+ private void applyRegionalK() {
+
+ List keys = Arrays.asList("ZM", "OZ");
+ for (String key : keys) {
+
+ if (!smrValues.containsKey(key)) continue;
+
+ Double calc = new BigDecimal(smrValues.get(key) * (xmlSmet.getRegionalK() - 1)).setScale(xmlSmet.getParameters().getRoundSum() ? 0 : 2, BigDecimal.ROUND_HALF_UP).doubleValue();
+ smrValues.put(key, smrValues.get(key) + calc);
+
+ if (key.equals("ZM") && smrValues.containsKey("EM")) {
+ smrValues.put("EM", smrValues.get("EM")+calc);
+ }
+ smrValues.put("PZ", smrValues.containsKey("PZ") ? smrValues.get("PZ") + calc : calc);
+
+ for (SmetResourceAssignment smRa : resourceAssignments) {
+
+ if (!smRa.getCosts().containsKey(key)) continue;
+ smRa.getCosts().put(key, smRa.getCosts().get(key) * xmlSmet.getRegionalK());
+ if (key.equals("ZM")) {
+ Double keyCost = (smRa.getCosts().containsKey(key) ? smRa.getCosts().get(key) : 0.00);
+ Double EMRCost = (smRa.getCosts().containsKey("EMR") ? smRa.getCosts().get("EMR") : 0.00);
+ smRa.getCosts().put("EM", keyCost + EMRCost);
+ }
+ }
+ }
+ }
+
+ private void applyNrSp(Element smrElement) {
+
+ smrValues.put("NR", 0.0);
+ smrValues.put("SP", 0.0);
+
+ //region Инициализация общего норматива
+ Norm globNorm = xmlSmet.getNrsp().getGlobalNorm();
+ //endregion
+
+ //region Инициализация норматива по видам работ
+ XMLVidRab vr = null;
+ if (smrElement.getAttribute("Vr2001")!=null && !smrElement.getAttributeValue("Vr2001").equals("")) {
+
+ Integer smrVr = Integer.parseInt(smrElement.getAttributeValue("Vr2001"));
+ for (XMLVidRabGroup vrg : xmlSmet.getVrgs().values()) {
+ if (!vrg.containsKey(smrVr)) continue;
+ vr = vrg.get(smrVr);
+ break;
+
+ }
+
+ }
+ //endregion
+
+ String maskNR = "";
+ String maskSP = "";
+ Double NR = 0.0;
+ Double SP = 0.0;
+
+ if (smrNode.isLocalNorm()) {
+ if (localNorm != null && localNorm.getNr() != null) {
+ maskNR = localNorm.getNrMask();
+ NR = localNorm.getNr();
+ }
+ } else if (xmlSmet.getNrsp().isGlobalNR()) {
+ maskNR = globNorm.getNrMask();
+ NR = globNorm.getNr();
+ } else if ( vr!= null ){
+ maskNR = vr.getNaclMask();
+ NR = vr.getNacl();
+ }
+
+ if (maskNR != null && !maskNR.equals("") && NR != null && NR != 0) {
+ smrCosts.put("NR", NR);
+ smrMasks.put("NR", maskNR);
+
+ if (xmlSmet.getNrsp().getNRK() != null && xmlSmet.getNrsp().getNRK() != 0) smrCosts.put("NRK", xmlSmet.getNrsp().getNRK());
+ else if (vr.getNaclK() != null) smrCosts.put("NRK", vr.getNaclK());
+ else if (smrElement.getAttribute("NKB") != null) smrCosts.put("NRK", Double.parseDouble(smrElement.getAttributeValue("NKB").replace(",", ".")));
+
+ applyNorm("NR");
+ }
+ if (smrNode.isLocalNorm()) {
+ if (localNorm != null && localNorm.getSp() != null) {
+ maskSP = localNorm.getSpMask();
+ SP = localNorm.getSp();
+ }
+ } else if (xmlSmet.getNrsp().isGlobalSP()) {
+ maskSP = globNorm.getSpMask();
+ SP = globNorm.getSp();
+ } else if ( vr!= null ){
+ maskSP = vr.getPlanMask();
+ SP = vr.getPlan();
+ }
+
+ if (maskSP != null &&!maskSP.equals("") && SP != null && SP != 0) {
+ smrCosts.put("SP", SP);
+ smrMasks.put("SP", maskSP);
+
+ if (xmlSmet.getNrsp().getSPK() != null && xmlSmet.getNrsp().getSPK() != 0) smrCosts.put("SPK", xmlSmet.getNrsp().getSPK());
+ else if (vr.getPlanK() != null) smrCosts.put("SPK", vr.getPlanK());
+ else if (smrElement.getAttribute("PNB") != null) smrCosts.put("SPK", Double.parseDouble(smrElement.getAttributeValue("PNB").replace(",",".")));
+ applyNorm("SP");
+ }
+ }
+
+ //Парсинг ресурсов
+ private SmetResource parseResource(Element rsrcElement) {
+
+ SmetResource rsrc = null;
+ String name = rsrcElement.getName();
+
+ if (rsrcElement.getName().equals("Replaced")) name = rsrcElement.getParentElement().getName();
+
+ switch (name) {
+ case "Tzr":
+ if (resourceCollection.containsRes("T")) {
+ rsrc = resourceCollection.get("T");
+ } else {
+ rsrc = new SmetResource("Затраты труда рабочих", "T", "T", "чел.час");
+ }
+ break;
+ case "Tzm":
+ if (resourceCollection.containsRes("Tzm")) {
+ rsrc = resourceCollection.get("Tzm");
+ } else {
+ rsrc = new SmetResource("Затраты труда машинистов", "Tzm", "Tzm", "чел.час");
+ }
+ break;
+ case "Mch": {
+
+ String rsrcCode = rsrcElement.getAttributeValue("Code");
+ if (rsrcCode == null) break;
+
+ if (resourceCollection.containsRes(rsrcCode)) {
+ rsrc = resourceCollection.get(rsrcCode);
+ } else {
+ rsrc = new SmetResource(rsrcElement.getAttributeValue("Caption"), rsrcCode,"Mech","маш.-ч");
+ }
+ break;
+ }
+ case "Mat": {
+ String rsrcCode = rsrcElement.getAttributeValue("Code");
+ if (rsrcCode == null) break;
+
+ if (resourceCollection.containsRes(rsrcCode)) {
+ rsrc = resourceCollection.get(rsrcCode);
+ } else {
+ rsrc = new SmetResource(rsrcElement.getAttributeValue("Caption"), rsrcCode, "Mat", rsrcElement.getAttributeValue("Units"));
+ }
+ break;
+ }
+ }
+ return rsrc;
+ }
+
+ private boolean isApplyK(XMLCoefficient k) {
+ boolean apply = false;
+
+ if ((k.isAllChapters() && k.isAllVidRabs())) {
+ apply = true;
+ } else if (!k.isAllChapters()
+ && k.isAllVidRabs()
+ && k.getChaptersLink().contains(chapterNode.getSysId())) {
+ apply = true;
+ } else if (!k.isAllVidRabs()
+ && k.isAllChapters()
+ && smrElement.getAttribute("Vr2001")!=null
+ && k.getVrsLink().contains(smrElement.getAttributeValue("Vr2001"))) {
+ apply = true;
+ } else if (!k.isAllChapters()
+ && k.getChaptersLink() != null
+ && k.getChaptersLink().contains(chapterNode.getSysId())
+ && !k.isAllVidRabs()
+ && smrElement.getAttribute("Vr2001")!=null
+ && k.getVrsLink().contains(smrElement.getAttributeValue("Vr2001"))) {
+ apply = true;
+ }
+ return apply;
+ }
+
+ private boolean isFormulaOk(String formula, String value) {
+ Interpreter interpreter = new Interpreter();
+ try {
+ interpreter.eval(formula);
+ Double.parseDouble(interpreter.get(value).toString());
+ return true;
+ } catch (EvalError evalError) {
+ return false;
+ }
+ }
+
+ //Применение группового коэффициента
+ private void applyGroupK(XMLCoefficient koeff, HashMap smrValues) {
+ //Применение коэффициента ПЗ
+ if (koeff.getPz() != null && smrValues.containsKey("PZ")) {
+ levSum.put("PZ", ((levSum.containsKey("PZ")) ? levSum.get("PZ") : 0) + smrValues.get("PZ") * (koeff.getPz() - 1));
+ }
+
+ //Применение коэффициента ОЗ
+ if (koeff.getOz() != null || (koeff.isPzAll() && koeff.getPz() != null)) {
+
+ double k = 1;
+ if (koeff.getOz() != null) k = koeff.getOz();
+ if (koeff.isPzAll() && koeff.getPz() != null) k = k * koeff.getPz();
+
+ if (smrValues.containsKey("OZ")) {
+ Double calc = smrValues.get("OZ") * (k - 1);
+ levSum.put("OZ", ((levSum.containsKey("OZ")) ? levSum.get("OZ") : 0) + calc);
+ if (koeff.getPz() == null || (koeff.isPzAll() && !smrValues.containsKey("PZ"))) {
+ levSum.put("PZ", ((levSum.containsKey("PZ")) ? levSum.get("PZ") : 0) + calc);
+ }
+ if (koeff.getPz() != null && koeff.getOz() != null && koeff.isPzAll() && levSum.containsKey("PZ")) {
+ levSum.put("PZ", levSum.get("PZ") + calc - smrValues.get("OZ")*(koeff.getPz() - 1));
+ }
+ }
+ if (koeff.isOzpTz() && smrValues.containsKey("TZR")) levSum.put("TZR", smrValues.get("TZR") * (k - 1));
+
+ for (SmetResourceAssignment ra : resourceAssignments) {
+ if (!ra.getType().equals("T")) continue;
+ double raCalc = (ra.getCosts().containsKey("OZ") ? ra.getCosts().get("OZ") : 0) * (k - 1);
+ ra.getLevelSum().put("OZ", (ra.getLevelSum().containsKey("OZ") ? ra.getLevelSum().get("OZ") : 0) + raCalc);
+ if (koeff.isOzpTz()) {
+ double tzCalc = (ra.getCosts().containsKey("TZR") ? ra.getCosts().get("TZR") : 0) * (k - 1);
+ ra.getLevelSum().put("TZR", (ra.getLevelSum().containsKey("TZR") ? ra.getLevelSum().get("TZR") : 0) + tzCalc);
+ }
+ }
+ }
+
+ //Применение коэффициента ЭМ
+ if (koeff.getEm() != null || (koeff.isPzAll() && koeff.getPz() != null)) {
+
+ double k = 1;
+ if (koeff.getEm() != null) k = koeff.getEm();
+ if (koeff.isPzAll() && koeff.getPz() != null) k = k * koeff.getPz();
+
+ if (smrValues.containsKey("EM")) {
+ Double calc;
+ if (koeff.isSeparEm() && !koeff.isEmAll() && smrValues.containsKey("ZM")){
+ if (koeff.getEm() != null && koeff.getZm() != null && koeff.isSeparEm()) {
+ calc = smrValues.get("EM")*(k - 1);
+ } else {
+ calc = (smrValues.get("EM") - smrValues.get("ZM"))*(k - 1);
+ }
+ } else {
+ calc = smrValues.get("EM")*(k - 1);
+ }
+
+ levSum.put("EM", ((levSum.containsKey("EM")) ? levSum.get("EM") : 0) + calc);
+
+ if (koeff.getPz() == null || (koeff.isPzAll() && !smrValues.containsKey("PZ"))) {
+ levSum.put("PZ", ((levSum.containsKey("PZ")) ? levSum.get("PZ") : 0) + calc);
+ }
+ }
+
+ for (SmetResourceAssignment ra : resourceAssignments) {
+ if (!ra.getType().equals("Mech")) continue;
+ Double calc;
+ if (koeff.isSeparEm()){
+ calc = ((ra.getCosts().containsKey("EM") ? ra.getCosts().get("EM") : 0) - (ra.getCosts()
+ .containsKey("ZM") ? ra.getCosts().get("ZM") : 0))*(k - 1);
+ } else {
+ calc = (ra.getCosts().containsKey("EM") ? ra.getCosts().get("EM") : 0)*(k - 1);
+ }
+ ra.getCosts().put("EM", ((ra.getCosts().containsKey("EM")) ? ra.getCosts().get("EM") : 0) + calc);
+ }
+ }
+
+ //Применение коэффициента ЗМ
+ if (koeff.getZm() != null || (koeff.isEmAll() && (koeff.getEm() != null || (koeff.isPzAll() && koeff.getPz() != null)))) {
+
+ double k = 1;
+ if (koeff.getZm() != null) k = koeff.getZm();
+ if (koeff.isEmAll() && koeff.getEm() != null) k = k * koeff.getEm();
+ if (koeff.isEmAll() && koeff.isPzAll() && koeff.getPz() != null) k = k * koeff.getPz();
+
+ if (smrValues.containsKey("ZM")) {
+ Double calc = smrValues.get("ZM")*(k-1);
+ levSum.put("ZM", ((levSum.containsKey("ZM")) ? levSum.get("ZM") : 0) + calc);
+
+ if ((koeff.getEm() == null && !koeff.isPzAll() )|| (koeff.isEmAll() && !smrValues.containsKey("EM"))
+ || (koeff.getEm() == null && koeff.getPz() == null && koeff.isPzAll())
+ || (koeff.getPz() == null && koeff.isPzAll() && koeff.getEm() != null && koeff.isSeparEm() && koeff.getZm() != null)) {
+ levSum.put("EM", ((levSum.containsKey("EM")) ? levSum.get("EM") : 0) + calc);
+ if (koeff.getPz() == null || (koeff.isPzAll() && !smrValues.containsKey("PZ"))) {
+ levSum.put("PZ", ((levSum.containsKey("PZ")) ? levSum.get("PZ") : 0) + calc);
+ }
+ }
+ }
+
+ if (koeff.isZpmTz() && smrValues.containsKey("TZM")) {
+ levSum.put("TZM", ((levSum.containsKey("TZM")) ? levSum.get("TZM") : 0) + smrValues.get("TZM") * (k - 1));
+ }
+ for (SmetResourceAssignment ra : resourceAssignments) {
+ if (koeff.isZpmTz() && ra.getType().equals("Tzm")) {
+ double tzmCalc = (ra.getCosts().containsKey("TZM") ? ra.getCosts().get("TZM") : 0) * (k -1);
+ ra.getLevelSum().put("TZM", ((ra.getLevelSum().containsKey("TZM")) ? ra.getLevelSum().get("TZM") :
+ 0) + tzmCalc);
+ } else if (ra.getType().equals("Mech")) {
+ double mechCalc = ((ra.getCosts().containsKey("ZM")) ? ra.getCosts().get("ZM") : 0) * (k -1);
+ ra.getLevelSum().put("ZM", (ra.getLevelSum().containsKey("ZM") ? ra.getLevelSum().get("ZM") :
+ 0) + mechCalc);
+ }
+ }
+ }
+
+ //Применение коэффициента МАТ
+ if (koeff.getMt() != null && !smrNode.isEqui() || (koeff.isPzAll() && koeff.getPz() != null)) {
+
+ double k = 1;
+ if (koeff.getMt() != null) k = koeff.getMt();
+ if (koeff.isPzAll() && koeff.getPz() != null) k = k * koeff.getPz();
+
+ if (smrValues.containsKey("MT")) {
+ Double calc = smrValues.get("MT")*(k - 1);
+ levSum.put("MT", ((levSum.containsKey("MT")) ? levSum.get("MT") : 0) + calc);
+ if (koeff.getPz() == null || (koeff.isPzAll() && !smrValues.containsKey("PZ"))) {
+ levSum.put("PZ", ((levSum.containsKey("PZ")) ? levSum.get("PZ") : 0) + calc);
+ }
+ if (koeff.getPz() != null && koeff.isPzAll() && levSum.containsKey("PZ")) {
+ levSum.put("PZ", levSum.get("PZ") + calc - smrValues.get("MT")*(koeff.getPz() - 1));
+ }
+ }
+ for (SmetResourceAssignment ra : resourceAssignments) {
+ if (!ra.getType().equals("Mat")) continue;
+ double raCalc = (ra.getCosts().containsKey("MT") ? ra.getCosts().get("MT") : 0)
+ * (k - 1);
+ ra.getLevelSum().put("MT", (ra.getLevelSum().containsKey("MT") ? ra.getLevelSum().get("MT") :
+ 0) + raCalc);
+ if (koeff.isMatQty()) ra.setQuantity(ra.getQuantity() * k);
+ }
+ }
+ }
+
+ private boolean isExcludedK(XMLCoefficient koeff) {
+ Boolean excluded = false;
+ if (smrElement.getChild("ExcludedKfs") != null
+ && smrElement.getChild("ExcludedKfs").getAttribute("Value") != null) {
+
+ String excludedKfs = smrElement.getChild("ExcludedKfs").getAttributeValue("Value").replace("(", "").replace(")", "").replace(" ", "");
+ for (String k : excludedKfs.split(",")) {
+ if (xmlSmet.getGlobalK().getCoeffList().get(Integer.parseInt(k)).equals(koeff)) excluded = true;
+ }
+ }
+ return excluded;
+ }
+
+ private void applyNorm(String v) {
+ Double sum = 0.0;
+ Double commonK = 1.0;
+
+ if (smrCosts.containsKey(v+"K")) commonK = smrCosts.get(v + "K");
+
+ for (String a : smrMasks.get(v).split(",")) {
+ if (a.equals("")) continue;
+ sum += (smrValues.containsKey(a)) ? smrValues.get(a) : 0;
+ }
+
+ double k = new BigDecimal(String.valueOf(smrCosts.get(v) * commonK)).setScale(xmlSmet.getParameters().getRoundNPBase() ? 2 : 6, BigDecimal.ROUND_HALF_UP).doubleValue();
+ Double calc = new BigDecimal(String.valueOf(sum * k)).setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue();
+
+ if (xmlSmet.getParameters().getRoundSum()) calc = new BigDecimal(String.valueOf(calc)).setScale(0, BigDecimal.ROUND_HALF_UP).doubleValue();
+
+ smrValues.put(v, (smrValues.containsKey(v) ? smrValues.get(v) : 0) + calc);
+ smrValues.put("SUM", ((smrValues.get("SUM") != null) ? smrValues.get("SUM") : 0) + calc);
+ }
+}
diff --git a/src/main/java/com/ibcon/sproject/smet/model/xml/XMLVidRab.java b/src/main/java/com/ibcon/sproject/smet/model/xml/XMLVidRab.java
new file mode 100644
index 0000000..15e9744
--- /dev/null
+++ b/src/main/java/com/ibcon/sproject/smet/model/xml/XMLVidRab.java
@@ -0,0 +1,88 @@
+package com.ibcon.sproject.smet.model.xml;
+
+import com.ibcon.sproject.smet.model.objects.smr.SmrMask;
+import org.jdom2.Element;
+
+public class XMLVidRab {
+
+ private String caption, naclMask, planMask;
+ private String osColumn;
+
+ private int id;
+ private int vrGroupId;
+
+ private Double nacl, plan;
+ private Double naclK, planK;
+
+ public XMLVidRab(Element XMLVidRab, int vrGroupId, Element root) {
+
+ boolean nkApply = root.getChild("Parameters").getChild("CommonNK") != null
+ && root.getChild("Parameters").getChild("CommonNK").getAttributeValue("ActiveItems") != null
+ && root.getChild("Parameters").getChild("CommonNK").getAttributeValue("ActiveItems").contains("Vk");
+
+ boolean spApply = root.getChild("Parameters").getChild("CommonPK") != null
+ && root.getChild("Parameters").getChild("CommonPK").getAttributeValue("ActiveItems") != null
+ && root.getChild("Parameters").getChild("CommonPK").getAttributeValue("ActiveItems").contains("Vk");
+
+ this.id = Integer.parseInt(XMLVidRab.getAttributeValue("ID"));
+ this.caption = XMLVidRab.getAttributeValue("Caption");
+ this.vrGroupId = vrGroupId;
+
+ if (XMLVidRab.getAttribute("Nacl") != null) {
+
+ this.nacl = Double.parseDouble(XMLVidRab.getAttributeValue("Nacl").replace(",", ".")) / 100;
+ this.naclMask = SmrMask.getMask(XMLVidRab.getAttribute("NaclMask"));
+ if (XMLVidRab.getAttribute("NKB") != null && nkApply) this.naclK = Double.parseDouble(XMLVidRab.getAttributeValue("NKB").replace(",", "."));
+ }
+
+ if (XMLVidRab.getAttribute("Plan") != null) {
+
+ this.plan = Double.parseDouble(XMLVidRab.getAttributeValue("Plan").replace(",", ".")) / 100;
+ this.planMask = SmrMask.getMask(XMLVidRab.getAttribute("PlanMask"));
+ if (XMLVidRab.getAttribute("PNB") != null && spApply) this.planK = Double.parseDouble(XMLVidRab.getAttributeValue("PNB").replace(",", "."));
+ }
+
+ if (XMLVidRab.getAttribute("OsColumn") != null) this.osColumn = XMLVidRab.getAttributeValue("OsColumn");
+
+ }
+
+ public String getCaption() {
+ return caption;
+ }
+
+ public String getNaclMask() {
+ return naclMask;
+ }
+
+ public String getPlanMask() {
+ return planMask;
+ }
+
+ public String getOsColumn() {
+ return osColumn;
+ }
+
+ public int getId() {
+ return id;
+ }
+
+ public int getVrGroupId() {
+ return vrGroupId;
+ }
+
+ public Double getNacl() {
+ return nacl;
+ }
+
+ public Double getPlan() {
+ return plan;
+ }
+
+ public Double getNaclK() {
+ return naclK;
+ }
+
+ public Double getPlanK() {
+ return planK;
+ }
+}
diff --git a/src/main/java/com/ibcon/sproject/smet/model/xml/XMLVidRabGroup.java b/src/main/java/com/ibcon/sproject/smet/model/xml/XMLVidRabGroup.java
new file mode 100644
index 0000000..6b22dfb
--- /dev/null
+++ b/src/main/java/com/ibcon/sproject/smet/model/xml/XMLVidRabGroup.java
@@ -0,0 +1,32 @@
+package com.ibcon.sproject.smet.model.xml;
+
+import org.jdom2.Element;
+
+import java.util.HashMap;
+
+public class XMLVidRabGroup extends HashMap {
+
+ private int id;
+ private String caption;
+
+ public XMLVidRabGroup(Element eVrg, Element r) {
+
+ if (eVrg.getChildren().size() < 1) return;
+
+ this.id = Integer.parseInt(eVrg.getAttributeValue("ID"));
+ this.caption = eVrg.getAttributeValue("Caption");
+
+ for (Element eVr : eVrg.getChildren()) {
+ put (Integer.parseInt(eVr.getAttributeValue("ID")), new XMLVidRab(eVr, id, r));
+ }
+
+ }
+
+ public int getId() {
+ return id;
+ }
+
+ public String getCaption() {
+ return caption;
+ }
+}
diff --git a/src/main/java/com/ibcon/sproject/smet/model/xml/XMLVidRabGroups.java b/src/main/java/com/ibcon/sproject/smet/model/xml/XMLVidRabGroups.java
new file mode 100644
index 0000000..224b4b6
--- /dev/null
+++ b/src/main/java/com/ibcon/sproject/smet/model/xml/XMLVidRabGroups.java
@@ -0,0 +1,33 @@
+package com.ibcon.sproject.smet.model.xml;
+
+import org.jdom2.Element;
+
+import java.util.HashMap;
+
+public class XMLVidRabGroups extends HashMap {
+
+ private int id;
+ private String caption;
+
+ public XMLVidRabGroups(Element r) {
+
+ Element e = r.getChild("VidRab_Catalog");
+
+ for (Element eChild : e.getChildren("Vids_Rab")) {
+ if (!eChild.getAttributeValue("Type").contains("2001") || eChild.getChildren().size() < 1) continue;
+
+ for (Element eVrg : eChild.getChildren()) {
+ if (!eVrg.getName().equals("VidRab_Group")) continue;
+ put(Integer.parseInt(eVrg.getAttributeValue("ID")), new XMLVidRabGroup(eVrg, r));
+ }
+ }
+ }
+
+ public int getId() {
+ return id;
+ }
+
+ public String getCaption() {
+ return caption;
+ }
+}
diff --git a/src/main/java/com/ibcon/sproject/smet/model/xml/XmlSmet.java b/src/main/java/com/ibcon/sproject/smet/model/xml/XmlSmet.java
new file mode 100644
index 0000000..3281cc8
--- /dev/null
+++ b/src/main/java/com/ibcon/sproject/smet/model/xml/XmlSmet.java
@@ -0,0 +1,238 @@
+package com.ibcon.sproject.smet.model.xml;
+
+import bsh.EvalError;
+import bsh.Interpreter;
+import com.ibcon.sproject.smet.model.objects.ChapterNode;
+import com.ibcon.sproject.smet.model.objects.SmetNode;
+import com.ibcon.sproject.smet.model.objects.SmetTreeNode;
+import com.ibcon.sproject.smet.model.objects.SmrNode;
+import com.ibcon.sproject.smet.model.utilits.CheckValue;
+import org.jdom2.Document;
+import org.jdom2.Element;
+import org.jdom2.JDOMException;
+import org.jdom2.input.SAXBuilder;
+
+import java.io.File;
+import java.io.IOException;
+import java.math.BigDecimal;
+import java.util.HashMap;
+
+/**
+ * Created by s_shmakov on 07.07.2017.
+ */
+public class XmlSmet {
+ private String name;
+ private Element rootElement;
+ private XMLRegionInfo regionInfo;
+ private XMLParameters parameters;
+ private XMLIndexes indexes;
+ private NRSP nrsp;
+ private XMLVidRabGroups vrgs;
+
+ private double regionalK;
+ private XMLCoefficient terZoneK;
+ private XMLCoefficients globalK;
+
+ private SmetNode smet;
+
+ private int chapNum = 0;
+
+ private HashMap identifierValues;
+
+ private SmrNode smrNode;
+
+ public XmlSmet(File file, int epsId) throws JDOMException, IOException {
+
+ SAXBuilder builder = new SAXBuilder();
+ Document xmlDocument = builder.build(file);
+ rootElement = xmlDocument.getRootElement();
+
+ getHeader(epsId);
+ getNRSPCalc();
+ getGroupCoeff();
+ getStructure();
+ System.out.println("xmlSmet");
+ }
+
+ private void getHeader(int epsId) {
+ if (rootElement.getChild("RegionInfo") != null) {
+ this.regionInfo = new XMLRegionInfo(rootElement.getChild("RegionInfo"));
+ }
+ if (rootElement.getChild("Parameters") != null) {
+ this.parameters = new XMLParameters(rootElement.getChild("Parameters"));
+ }
+ if (rootElement.getChild("Indexes") != null) {
+ this.indexes = new XMLIndexes(rootElement.getChild("Indexes"));
+ }
+
+ smet = new SmetNode(name, rootElement, regionInfo, parameters, epsId);
+ }
+
+ private void getNRSPCalc() {
+ this.nrsp = new NRSP(rootElement.getChild("Parameters"));
+
+ if (rootElement.getChild("VidRab_Catalog") != null &&
+ rootElement.getChild("VidRab_Catalog").getChild("Vids_Rab") != null &&
+ rootElement.getChild("VidRab_Catalog").getChild("Vids_Rab").getChildren().size() > 0) {
+ this.vrgs = new XMLVidRabGroups(rootElement);
+ } else {
+ System.out.println("nrsp error");
+ }
+ }
+
+ private void getGroupCoeff() {
+ if (rootElement.getChild("RegionalK") != null
+ && rootElement.getChild("RegionalK").getAttribute("Value") != null ) this.regionalK = Double.parseDouble
+ (rootElement.getChild("RegionalK").getAttributeValue("Value").replace(",", "."));
+ else this.regionalK = 1.0;
+
+ if (rootElement.getChild("TerZoneK") != null &&
+ (rootElement.getChild("TerZoneK").getAttribute("Value_OZ") != null
+ || rootElement.getChild("TerZoneK").getAttribute("Value_EM") != null
+ || rootElement.getChild("TerZoneK").getAttribute("Value_ZM") != null
+ || rootElement.getChild("TerZoneK").getAttribute("Value_MT") != null
+ || rootElement.getChild("TerZoneK").getAttribute("Value_PZ") != null) ) terZoneK = new XMLCoefficient(rootElement.getChild("TerZoneK"));
+
+ if (rootElement.getChild("Koefficients") != null
+ && !rootElement.getChild("Koefficients").getChildren().isEmpty())
+ globalK = new XMLCoefficients(rootElement.getChild("Koefficients"));
+ }
+
+ private void getStructure() {
+ if (rootElement.getChild("Chapters") == null || rootElement.getChild("Chapters").getChildren().size() < 1) {
+ System.out.println("XmlSmet-getStructure-error");
+ return;
+ }
+
+ parseIdentifierValues();
+
+ for (Element chapterElement: rootElement.getChild("Chapters").getChildren()) {
+ ChapterNode curChapter = new ChapterNode(chapterElement, chapNum++);
+ smet.add(curChapter);
+
+ HeaderNode curHeader;
+ SmetTreeNode parent = curChapter;
+
+ for (Element child : chapterElement.getChildren()) {
+ if (child.getName().equals("Header")) {
+ curHeader = new HeaderNode(child.getAttributeValue("Caption"));
+ curChapter.add(curHeader);
+ parent = curHeader;
+ } else if (child.getName().equals("Position")) {
+ if (child.getAttribute("Number") != null && !child.getAttributeValue("Number").equals("")) {
+ smrNode = new SmrNode(child, vrgs);
+ new XMLSmr(this, child, curChapter);
+ if (parent.getChildren() == null || parent.getChildren().isEmpty()) {
+ //todo а вот эту сомнительную вещь вообще проверить нужно
+// parent.add(MainFrame.ALL_SMET.get("smrhead"));
+ }
+ parent.add(smrNode);
+ smet.addSmetRow(smrNode);
+ }
+ }
+ }
+ }
+ }
+
+ private void parseIdentifierValues() {
+ identifierValues = new HashMap<>();
+
+ for (Element chapterElement: rootElement.getChild("Chapters").getChildren()) {
+ for (Element child : chapterElement.getChildren()) {
+ if (child.getName().equals("Position") && child.getAttribute("Identifier") != null
+ && !child.getAttributeValue("Identifier").equals("")) {
+ parseIdentifierQuantity(child);
+ }
+ }
+ }
+ }
+
+ private void parseIdentifierQuantity(Element smrElement) {
+ double quantity = 0.0;
+ if (smrElement.getChild("Quantity") != null
+ && smrElement.getChild("Quantity").getAttribute("Result") != null)
+ quantity = Double.parseDouble(smrElement.getChild("Quantity").getAttributeValue("Result").replace(",", "."));
+ else if (smrElement.getAttribute("Quantity") != null) {
+ if (CheckValue.isDouble(smrElement.getAttributeValue("Quantity").replace(",", "."))) {
+ quantity = Double.parseDouble(smrElement.getAttributeValue("Quantity").replace(",", "."));
+ } else {
+ try {
+ Interpreter interpreter = new Interpreter();
+ String stringQuantity = smrElement.getAttributeValue("Quantity").replace(",", ".");
+ int rounding = -1;
+
+ if (stringQuantity.contains("окр(")) {
+ stringQuantity = stringQuantity.replace("окр(", "");
+ rounding = Integer.valueOf(stringQuantity.substring(stringQuantity.indexOf(";")+1));
+ stringQuantity = stringQuantity.substring(0, stringQuantity.indexOf(";"));
+ }
+ interpreter.eval("quantity=" + "0.1*10*" + stringQuantity);
+ BigDecimal bdQuantity = new BigDecimal(interpreter.get("quantity").toString());
+ if (rounding > -1) bdQuantity = bdQuantity.setScale(rounding, BigDecimal.ROUND_HALF_UP);
+ quantity = bdQuantity.doubleValue();
+ } catch (EvalError evalError) {
+ System.out.println("bad Formula 1: " + smrElement.getAttributeValue("Quantity").replace(",", "."));
+ }
+ }
+ }
+ identifierValues.put(smrElement.getAttributeValue("Identifier").toLowerCase(), quantity);
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public Element getRootElement() {
+ return rootElement;
+ }
+
+ public XMLRegionInfo getRegionInfo() {
+ return regionInfo;
+ }
+
+ public XMLParameters getParameters() {
+ return parameters;
+ }
+
+ public XMLIndexes getIndexes() {
+ return indexes;
+ }
+
+ public NRSP getNrsp() {
+ return nrsp;
+ }
+
+ public XMLVidRabGroups getVrgs() {
+ return vrgs;
+ }
+
+ public double getRegionalK() {
+ return regionalK;
+ }
+
+ public XMLCoefficient getTerZoneK() {
+ return terZoneK;
+ }
+
+ public XMLCoefficients getGlobalK() {
+ return globalK;
+ }
+
+ public SmetNode getSmet() {
+ return smet;
+ }
+
+ public int getChapNum() {
+ return chapNum;
+ }
+
+ public HashMap getIdentifierValues() {
+ return identifierValues;
+ }
+
+ public SmrNode getSmrNode() {
+ return smrNode;
+ }
+
+
+}
diff --git a/src/main/java/com/ibcon/sproject/smet/service/UploadedFile.java b/src/main/java/com/ibcon/sproject/smet/service/UploadedFile.java
new file mode 100644
index 0000000..6030b2f
--- /dev/null
+++ b/src/main/java/com/ibcon/sproject/smet/service/UploadedFile.java
@@ -0,0 +1,19 @@
+package com.ibcon.sproject.smet.service;
+
+import org.springframework.web.multipart.MultipartFile;
+
+/**
+ * Created by s_shmakov on 24.06.2017.
+ */
+public class UploadedFile {
+ private static final long serialVersionUID = 13L;
+ private MultipartFile multipartFile;
+
+ public MultipartFile getMultipartFile() {
+ return multipartFile;
+ }
+
+ public void setMultipartFile(MultipartFile multipartFile) {
+ this.multipartFile = multipartFile;
+ }
+}
diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties
index abca851..6da5334 100644
--- a/src/main/resources/application.properties
+++ b/src/main/resources/application.properties
@@ -6,4 +6,6 @@ spring.jpa.show-sql=true
spring.jpa.hibernate.ddl-auto = validate
#spring.thymeleaf.prefix=${project.base-dir}/src/main/resources/templates/
-spring.thymeleaf.cache=false
\ No newline at end of file
+spring.thymeleaf.cache=false
+spring.jpa.properties.jadira.usertype.autoRegisterUserTypes = true
+spring.jpa.properties.hibernate.enable_lazy_load_no_trans=true
\ No newline at end of file
diff --git a/src/main/resources/static/css/datatables.min.css b/src/main/resources/static/css/datatables.min.css
new file mode 100644
index 0000000..1c1a991
--- /dev/null
+++ b/src/main/resources/static/css/datatables.min.css
@@ -0,0 +1,42 @@
+/*
+ * This combined file was created by the DataTables downloader builder:
+ * https://datatables.net/download
+ *
+ * To rebuild or modify this file with the latest versions of the included
+ * software please visit:
+ * https://datatables.net/download/#bs/dt-1.10.15/b-1.3.1/b-colvis-1.3.1/cr-1.3.3/fc-3.2.2/fh-3.1.2/r-2.1.1/rg-1.0.0/rr-1.2.0/sc-1.4.2/se-1.2.2
+ *
+ * Included libraries:
+ * DataTables 1.10.15, Buttons 1.3.1, Column visibility 1.3.1, ColReorder 1.3.3, FixedColumns 3.2.2, FixedHeader 3.1.2, Responsive 2.1.1, RowGroup 1.0.0, RowReorder 1.2.0, Scroller 1.4.2, Select 1.2.2
+ */
+
+table.dataTable{clear:both;margin-top:6px !important;margin-bottom:6px !important;max-width:none !important;border-collapse:separate !important}table.dataTable td,table.dataTable th{-webkit-box-sizing:content-box;box-sizing:content-box}table.dataTable td.dataTables_empty,table.dataTable th.dataTables_empty{text-align:center}table.dataTable.nowrap th,table.dataTable.nowrap td{white-space:nowrap}div.dataTables_wrapper div.dataTables_length label{font-weight:normal;text-align:left;white-space:nowrap}div.dataTables_wrapper div.dataTables_length select{width:75px;display:inline-block}div.dataTables_wrapper div.dataTables_filter{text-align:right}div.dataTables_wrapper div.dataTables_filter label{font-weight:normal;white-space:nowrap;text-align:left}div.dataTables_wrapper div.dataTables_filter input{margin-left:0.5em;display:inline-block;width:auto}div.dataTables_wrapper div.dataTables_info{padding-top:8px;white-space:nowrap}div.dataTables_wrapper div.dataTables_paginate{margin:0;white-space:nowrap;text-align:right}div.dataTables_wrapper div.dataTables_paginate ul.pagination{margin:2px 0;white-space:nowrap}div.dataTables_wrapper div.dataTables_processing{position:absolute;top:50%;left:50%;width:200px;margin-left:-100px;margin-top:-26px;text-align:center;padding:1em 0}table.dataTable thead>tr>th.sorting_asc,table.dataTable thead>tr>th.sorting_desc,table.dataTable thead>tr>th.sorting,table.dataTable thead>tr>td.sorting_asc,table.dataTable thead>tr>td.sorting_desc,table.dataTable thead>tr>td.sorting{padding-right:30px}table.dataTable thead>tr>th:active,table.dataTable thead>tr>td:active{outline:none}table.dataTable thead .sorting,table.dataTable thead .sorting_asc,table.dataTable thead .sorting_desc,table.dataTable thead .sorting_asc_disabled,table.dataTable thead .sorting_desc_disabled{cursor:pointer;position:relative}table.dataTable thead .sorting:after,table.dataTable thead .sorting_asc:after,table.dataTable thead .sorting_desc:after,table.dataTable thead .sorting_asc_disabled:after,table.dataTable thead .sorting_desc_disabled:after{position:absolute;bottom:8px;right:8px;display:block;font-family:'Glyphicons Halflings';opacity:0.5}table.dataTable thead .sorting:after{opacity:0.2;content:"\e150"}table.dataTable thead .sorting_asc:after{content:"\e155"}table.dataTable thead .sorting_desc:after{content:"\e156"}table.dataTable thead .sorting_asc_disabled:after,table.dataTable thead .sorting_desc_disabled:after{color:#eee}div.dataTables_scrollHead table.dataTable{margin-bottom:0 !important}div.dataTables_scrollBody>table{border-top:none;margin-top:0 !important;margin-bottom:0 !important}div.dataTables_scrollBody>table>thead .sorting:after,div.dataTables_scrollBody>table>thead .sorting_asc:after,div.dataTables_scrollBody>table>thead .sorting_desc:after{display:none}div.dataTables_scrollBody>table>tbody>tr:first-child>th,div.dataTables_scrollBody>table>tbody>tr:first-child>td{border-top:none}div.dataTables_scrollFoot>table{margin-top:0 !important;border-top:none}@media screen and (max-width: 767px){div.dataTables_wrapper div.dataTables_length,div.dataTables_wrapper div.dataTables_filter,div.dataTables_wrapper div.dataTables_info,div.dataTables_wrapper div.dataTables_paginate{text-align:center}}table.dataTable.table-condensed>thead>tr>th{padding-right:20px}table.dataTable.table-condensed .sorting:after,table.dataTable.table-condensed .sorting_asc:after,table.dataTable.table-condensed .sorting_desc:after{top:6px;right:6px}table.table-bordered.dataTable th,table.table-bordered.dataTable td{border-left-width:0}table.table-bordered.dataTable th:last-child,table.table-bordered.dataTable th:last-child,table.table-bordered.dataTable td:last-child,table.table-bordered.dataTable td:last-child{border-right-width:0}table.table-bordered.dataTable tbody th,table.table-bordered.dataTable tbody td{border-bottom-width:0}div.dataTables_scrollHead table.table-bordered{border-bottom-width:0}div.table-responsive>div.dataTables_wrapper>div.row{margin:0}div.table-responsive>div.dataTables_wrapper>div.row>div[class^="col-"]:first-child{padding-left:0}div.table-responsive>div.dataTables_wrapper>div.row>div[class^="col-"]:last-child{padding-right:0}
+
+
+@keyframes dtb-spinner{100%{transform:rotate(360deg)}}@-o-keyframes dtb-spinner{100%{-o-transform:rotate(360deg);transform:rotate(360deg)}}@-ms-keyframes dtb-spinner{100%{-ms-transform:rotate(360deg);transform:rotate(360deg)}}@-webkit-keyframes dtb-spinner{100%{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}@-moz-keyframes dtb-spinner{100%{-moz-transform:rotate(360deg);transform:rotate(360deg)}}div.dt-button-info{position:fixed;top:50%;left:50%;width:400px;margin-top:-100px;margin-left:-200px;background-color:white;border:2px solid #111;box-shadow:3px 3px 8px rgba(0,0,0,0.3);border-radius:3px;text-align:center;z-index:21}div.dt-button-info h2{padding:0.5em;margin:0;font-weight:normal;border-bottom:1px solid #ddd;background-color:#f3f3f3}div.dt-button-info>div{padding:1em}ul.dt-button-collection.dropdown-menu{display:block;z-index:2002;-webkit-column-gap:8px;-moz-column-gap:8px;-ms-column-gap:8px;-o-column-gap:8px;column-gap:8px}ul.dt-button-collection.dropdown-menu.fixed{position:fixed;top:50%;left:50%;margin-left:-75px;border-radius:0}ul.dt-button-collection.dropdown-menu.fixed.two-column{margin-left:-150px}ul.dt-button-collection.dropdown-menu.fixed.three-column{margin-left:-225px}ul.dt-button-collection.dropdown-menu.fixed.four-column{margin-left:-300px}ul.dt-button-collection.dropdown-menu>*{-webkit-column-break-inside:avoid;break-inside:avoid}ul.dt-button-collection.dropdown-menu.two-column{width:300px;padding-bottom:1px;-webkit-column-count:2;-moz-column-count:2;-ms-column-count:2;-o-column-count:2;column-count:2}ul.dt-button-collection.dropdown-menu.three-column{width:450px;padding-bottom:1px;-webkit-column-count:3;-moz-column-count:3;-ms-column-count:3;-o-column-count:3;column-count:3}ul.dt-button-collection.dropdown-menu.four-column{width:600px;padding-bottom:1px;-webkit-column-count:4;-moz-column-count:4;-ms-column-count:4;-o-column-count:4;column-count:4}div.dt-button-background{position:fixed;top:0;left:0;width:100%;height:100%;z-index:2001}@media screen and (max-width: 767px){div.dt-buttons{float:none;width:100%;text-align:center;margin-bottom:0.5em}div.dt-buttons a.btn{float:none}}div.dt-buttons button.btn.processing,div.dt-buttons div.btn.processing,div.dt-buttons a.btn.processing{color:rgba(0,0,0,0.2)}div.dt-buttons button.btn.processing:after,div.dt-buttons div.btn.processing:after,div.dt-buttons a.btn.processing:after{position:absolute;top:50%;left:50%;width:16px;height:16px;margin:-8px 0 0 -8px;box-sizing:border-box;display:block;content:' ';border:2px solid #282828;border-radius:50%;border-left-color:transparent;border-right-color:transparent;animation:dtb-spinner 1500ms infinite linear;-o-animation:dtb-spinner 1500ms infinite linear;-ms-animation:dtb-spinner 1500ms infinite linear;-webkit-animation:dtb-spinner 1500ms infinite linear;-moz-animation:dtb-spinner 1500ms infinite linear}
+
+
+table.DTCR_clonedTable.dataTable{position:absolute !important;background-color:rgba(255,255,255,0.7);z-index:202}div.DTCR_pointer{width:1px;background-color:#337ab7;z-index:201}
+
+
+table.DTFC_Cloned tr{background-color:white;margin-bottom:0}div.DTFC_LeftHeadWrapper table,div.DTFC_RightHeadWrapper table{border-bottom:none !important;margin-bottom:0 !important;background-color:white}div.DTFC_LeftBodyWrapper table,div.DTFC_RightBodyWrapper table{border-top:none;margin:0 !important}div.DTFC_LeftBodyWrapper table thead .sorting:after,div.DTFC_LeftBodyWrapper table thead .sorting_asc:after,div.DTFC_LeftBodyWrapper table thead .sorting_desc:after,div.DTFC_LeftBodyWrapper table thead .sorting:after,div.DTFC_LeftBodyWrapper table thead .sorting_asc:after,div.DTFC_LeftBodyWrapper table thead .sorting_desc:after,div.DTFC_RightBodyWrapper table thead .sorting:after,div.DTFC_RightBodyWrapper table thead .sorting_asc:after,div.DTFC_RightBodyWrapper table thead .sorting_desc:after,div.DTFC_RightBodyWrapper table thead .sorting:after,div.DTFC_RightBodyWrapper table thead .sorting_asc:after,div.DTFC_RightBodyWrapper table thead .sorting_desc:after{display:none}div.DTFC_LeftBodyWrapper table tbody tr:first-child th,div.DTFC_LeftBodyWrapper table tbody tr:first-child td,div.DTFC_RightBodyWrapper table tbody tr:first-child th,div.DTFC_RightBodyWrapper table tbody tr:first-child td{border-top:none}div.DTFC_LeftFootWrapper table,div.DTFC_RightFootWrapper table{border-top:none;margin-top:0 !important;background-color:white}
+
+
+table.dataTable.fixedHeader-floating,table.dataTable.fixedHeader-locked{background-color:white;margin-top:0 !important;margin-bottom:0 !important}table.dataTable.fixedHeader-floating{position:fixed !important}table.dataTable.fixedHeader-locked{position:absolute !important}@media print{table.fixedHeader-floating{display:none}}
+
+
+table.dataTable.dtr-inline.collapsed>tbody>tr>td.child,table.dataTable.dtr-inline.collapsed>tbody>tr>th.child,table.dataTable.dtr-inline.collapsed>tbody>tr>td.dataTables_empty{cursor:default !important}table.dataTable.dtr-inline.collapsed>tbody>tr>td.child:before,table.dataTable.dtr-inline.collapsed>tbody>tr>th.child:before,table.dataTable.dtr-inline.collapsed>tbody>tr>td.dataTables_empty:before{display:none !important}table.dataTable.dtr-inline.collapsed>tbody>tr>td:first-child,table.dataTable.dtr-inline.collapsed>tbody>tr>th:first-child{position:relative;padding-left:30px;cursor:pointer}table.dataTable.dtr-inline.collapsed>tbody>tr>td:first-child:before,table.dataTable.dtr-inline.collapsed>tbody>tr>th:first-child:before{top:9px;left:4px;height:14px;width:14px;display:block;position:absolute;color:white;border:2px solid white;border-radius:14px;box-shadow:0 0 3px #444;box-sizing:content-box;text-align:center;font-family:'Courier New', Courier, monospace;line-height:14px;content:'+';background-color:#337ab7}table.dataTable.dtr-inline.collapsed>tbody>tr.parent>td:first-child:before,table.dataTable.dtr-inline.collapsed>tbody>tr.parent>th:first-child:before{content:'-';background-color:#d33333}table.dataTable.dtr-inline.collapsed>tbody>tr.child td:before{display:none}table.dataTable.dtr-inline.collapsed.compact>tbody>tr>td:first-child,table.dataTable.dtr-inline.collapsed.compact>tbody>tr>th:first-child{padding-left:27px}table.dataTable.dtr-inline.collapsed.compact>tbody>tr>td:first-child:before,table.dataTable.dtr-inline.collapsed.compact>tbody>tr>th:first-child:before{top:5px;left:4px;height:14px;width:14px;border-radius:14px;line-height:14px;text-indent:3px}table.dataTable.dtr-column>tbody>tr>td.control,table.dataTable.dtr-column>tbody>tr>th.control{position:relative;cursor:pointer}table.dataTable.dtr-column>tbody>tr>td.control:before,table.dataTable.dtr-column>tbody>tr>th.control:before{top:50%;left:50%;height:16px;width:16px;margin-top:-10px;margin-left:-10px;display:block;position:absolute;color:white;border:2px solid white;border-radius:14px;box-shadow:0 0 3px #444;box-sizing:content-box;text-align:center;font-family:'Courier New', Courier, monospace;line-height:14px;content:'+';background-color:#337ab7}table.dataTable.dtr-column>tbody>tr.parent td.control:before,table.dataTable.dtr-column>tbody>tr.parent th.control:before{content:'-';background-color:#d33333}table.dataTable>tbody>tr.child{padding:0.5em 1em}table.dataTable>tbody>tr.child:hover{background:transparent !important}table.dataTable>tbody>tr.child ul.dtr-details{display:inline-block;list-style-type:none;margin:0;padding:0}table.dataTable>tbody>tr.child ul.dtr-details li{border-bottom:1px solid #efefef;padding:0.5em 0}table.dataTable>tbody>tr.child ul.dtr-details li:first-child{padding-top:0}table.dataTable>tbody>tr.child ul.dtr-details li:last-child{border-bottom:none}table.dataTable>tbody>tr.child span.dtr-title{display:inline-block;min-width:75px;font-weight:bold}div.dtr-modal{position:fixed;box-sizing:border-box;top:0;left:0;height:100%;width:100%;z-index:100;padding:10em 1em}div.dtr-modal div.dtr-modal-display{position:absolute;top:0;left:0;bottom:0;right:0;width:50%;height:50%;overflow:auto;margin:auto;z-index:102;overflow:auto;background-color:#f5f5f7;border:1px solid black;border-radius:0.5em;box-shadow:0 12px 30px rgba(0,0,0,0.6)}div.dtr-modal div.dtr-modal-content{position:relative;padding:1em}div.dtr-modal div.dtr-modal-close{position:absolute;top:6px;right:6px;width:22px;height:22px;border:1px solid #eaeaea;background-color:#f9f9f9;text-align:center;border-radius:3px;cursor:pointer;z-index:12}div.dtr-modal div.dtr-modal-close:hover{background-color:#eaeaea}div.dtr-modal div.dtr-modal-background{position:fixed;top:0;left:0;right:0;bottom:0;z-index:101;background:rgba(0,0,0,0.6)}@media screen and (max-width: 767px){div.dtr-modal div.dtr-modal-display{width:95%}}div.dtr-bs-modal table.table tr:first-child td{border-top:none}
+
+
+table.dataTable tr.group td{font-weight:bold;background-color:#e0e0e0}
+
+
+table.dt-rowReorder-float{position:absolute !important;opacity:0.8;table-layout:fixed;outline:2px solid #337ab7;outline-offset:-2px;z-index:2001}tr.dt-rowReorder-moving{outline:2px solid #888;outline-offset:-2px}body.dt-rowReorder-noOverflow{overflow-x:hidden}table.dataTable td.reorder{text-align:center;cursor:move}
+
+
+div.DTS{display:block !important}div.DTS tbody th,div.DTS tbody td{white-space:nowrap}div.DTS div.DTS_Loading{z-index:1}div.DTS div.dataTables_scrollBody{background:repeating-linear-gradient(45deg, #edeeff, #edeeff 10px, #fff 10px, #fff 20px)}div.DTS div.dataTables_scrollBody table{z-index:2}div.DTS div.dataTables_paginate,div.DTS div.dataTables_length{display:none}div.DTS tbody tr.even{background-color:white}
+
+
+table.dataTable tbody>tr.selected,table.dataTable tbody>tr>.selected{background-color:#08C}table.dataTable.stripe tbody>tr.odd.selected,table.dataTable.stripe tbody>tr.odd>.selected,table.dataTable.display tbody>tr.odd.selected,table.dataTable.display tbody>tr.odd>.selected{background-color:#0085c7}table.dataTable.hover tbody>tr.selected:hover,table.dataTable.hover tbody>tr>.selected:hover,table.dataTable.display tbody>tr.selected:hover,table.dataTable.display tbody>tr>.selected:hover{background-color:#0083c5}table.dataTable.order-column tbody>tr.selected>.sorting_1,table.dataTable.order-column tbody>tr.selected>.sorting_2,table.dataTable.order-column tbody>tr.selected>.sorting_3,table.dataTable.order-column tbody>tr>.selected,table.dataTable.display tbody>tr.selected>.sorting_1,table.dataTable.display tbody>tr.selected>.sorting_2,table.dataTable.display tbody>tr.selected>.sorting_3,table.dataTable.display tbody>tr>.selected{background-color:#0085c8}table.dataTable.display tbody>tr.odd.selected>.sorting_1,table.dataTable.order-column.stripe tbody>tr.odd.selected>.sorting_1{background-color:#0081c1}table.dataTable.display tbody>tr.odd.selected>.sorting_2,table.dataTable.order-column.stripe tbody>tr.odd.selected>.sorting_2{background-color:#0082c2}table.dataTable.display tbody>tr.odd.selected>.sorting_3,table.dataTable.order-column.stripe tbody>tr.odd.selected>.sorting_3{background-color:#0083c4}table.dataTable.display tbody>tr.even.selected>.sorting_1,table.dataTable.order-column.stripe tbody>tr.even.selected>.sorting_1{background-color:#0085c8}table.dataTable.display tbody>tr.even.selected>.sorting_2,table.dataTable.order-column.stripe tbody>tr.even.selected>.sorting_2{background-color:#0086ca}table.dataTable.display tbody>tr.even.selected>.sorting_3,table.dataTable.order-column.stripe tbody>tr.even.selected>.sorting_3{background-color:#0087cb}table.dataTable.display tbody>tr.odd>.selected,table.dataTable.order-column.stripe tbody>tr.odd>.selected{background-color:#0081c1}table.dataTable.display tbody>tr.even>.selected,table.dataTable.order-column.stripe tbody>tr.even>.selected{background-color:#0085c8}table.dataTable.display tbody>tr.selected:hover>.sorting_1,table.dataTable.order-column.hover tbody>tr.selected:hover>.sorting_1{background-color:#007dbb}table.dataTable.display tbody>tr.selected:hover>.sorting_2,table.dataTable.order-column.hover tbody>tr.selected:hover>.sorting_2{background-color:#007ebd}table.dataTable.display tbody>tr.selected:hover>.sorting_3,table.dataTable.order-column.hover tbody>tr.selected:hover>.sorting_3{background-color:#007fbf}table.dataTable.display tbody>tr:hover>.selected,table.dataTable.display tbody>tr>.selected:hover,table.dataTable.order-column.hover tbody>tr:hover>.selected,table.dataTable.order-column.hover tbody>tr>.selected:hover{background-color:#007dbb}table.dataTable tbody td.select-checkbox,table.dataTable tbody th.select-checkbox{position:relative}table.dataTable tbody td.select-checkbox:before,table.dataTable tbody td.select-checkbox:after,table.dataTable tbody th.select-checkbox:before,table.dataTable tbody th.select-checkbox:after{display:block;position:absolute;top:1.2em;left:50%;width:12px;height:12px;box-sizing:border-box}table.dataTable tbody td.select-checkbox:before,table.dataTable tbody th.select-checkbox:before{content:' ';margin-top:-6px;margin-left:-6px;border:1px solid black;border-radius:3px}table.dataTable tr.selected td.select-checkbox:after,table.dataTable tr.selected th.select-checkbox:after{content:'\2714';margin-top:-11px;margin-left:-4px;text-align:center;text-shadow:1px 1px #B0BED9, -1px -1px #B0BED9, 1px -1px #B0BED9, -1px 1px #B0BED9}div.dataTables_wrapper span.select-info,div.dataTables_wrapper span.select-item{margin-left:0.5em}@media screen and (max-width: 640px){div.dataTables_wrapper span.select-info,div.dataTables_wrapper span.select-item{margin-left:0;display:block}}table.dataTable tbody tr.selected,table.dataTable tbody th.selected,table.dataTable tbody td.selected{color:white}table.dataTable tbody tr.selected a,table.dataTable tbody th.selected a,table.dataTable tbody td.selected a{color:#a2d4ed}
+
+
diff --git a/src/main/resources/static/css/font-awesome.css b/src/main/resources/static/css/font-awesome.css
new file mode 100644
index 0000000..ee906a8
--- /dev/null
+++ b/src/main/resources/static/css/font-awesome.css
@@ -0,0 +1,2337 @@
+/*!
+ * Font Awesome 4.7.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.7.0');
+ src: url('../fonts/fontawesome-webfont.eot?#iefix&v=4.7.0') format('embedded-opentype'), url('../fonts/fontawesome-webfont.woff2?v=4.7.0') format('woff2'), url('../fonts/fontawesome-webfont.woff?v=4.7.0') format('woff'), url('../fonts/fontawesome-webfont.ttf?v=4.7.0') format('truetype'), url('../fonts/fontawesome-webfont.svg?v=4.7.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;
+}
+/* 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;
+}
+.fa-pull-left {
+ float: left;
+}
+.fa-pull-right {
+ float: right;
+}
+.fa.fa-pull-left {
+ margin-right: .3em;
+}
+.fa.fa-pull-right {
+ margin-left: .3em;
+}
+/* Deprecated as of 4.4.0 */
+.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 {
+ -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=1)";
+ -webkit-transform: rotate(90deg);
+ -ms-transform: rotate(90deg);
+ transform: rotate(90deg);
+}
+.fa-rotate-180 {
+ -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=2)";
+ -webkit-transform: rotate(180deg);
+ -ms-transform: rotate(180deg);
+ transform: rotate(180deg);
+}
+.fa-rotate-270 {
+ -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=3)";
+ -webkit-transform: rotate(270deg);
+ -ms-transform: rotate(270deg);
+ transform: rotate(270deg);
+}
+.fa-flip-horizontal {
+ -ms-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 {
+ -ms-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-feed:before,
+.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-pp: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-resistance: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-y-combinator-square:before,
+.fa-yc-square:before,
+.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-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-intersex:before,
+.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-genderless:before {
+ content: "\f22d";
+}
+.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";
+}
+.fa-yc:before,
+.fa-y-combinator:before {
+ content: "\f23b";
+}
+.fa-optin-monster:before {
+ content: "\f23c";
+}
+.fa-opencart:before {
+ content: "\f23d";
+}
+.fa-expeditedssl:before {
+ content: "\f23e";
+}
+.fa-battery-4:before,
+.fa-battery:before,
+.fa-battery-full:before {
+ content: "\f240";
+}
+.fa-battery-3:before,
+.fa-battery-three-quarters:before {
+ content: "\f241";
+}
+.fa-battery-2:before,
+.fa-battery-half:before {
+ content: "\f242";
+}
+.fa-battery-1:before,
+.fa-battery-quarter:before {
+ content: "\f243";
+}
+.fa-battery-0:before,
+.fa-battery-empty:before {
+ content: "\f244";
+}
+.fa-mouse-pointer:before {
+ content: "\f245";
+}
+.fa-i-cursor:before {
+ content: "\f246";
+}
+.fa-object-group:before {
+ content: "\f247";
+}
+.fa-object-ungroup:before {
+ content: "\f248";
+}
+.fa-sticky-note:before {
+ content: "\f249";
+}
+.fa-sticky-note-o:before {
+ content: "\f24a";
+}
+.fa-cc-jcb:before {
+ content: "\f24b";
+}
+.fa-cc-diners-club:before {
+ content: "\f24c";
+}
+.fa-clone:before {
+ content: "\f24d";
+}
+.fa-balance-scale:before {
+ content: "\f24e";
+}
+.fa-hourglass-o:before {
+ content: "\f250";
+}
+.fa-hourglass-1:before,
+.fa-hourglass-start:before {
+ content: "\f251";
+}
+.fa-hourglass-2:before,
+.fa-hourglass-half:before {
+ content: "\f252";
+}
+.fa-hourglass-3:before,
+.fa-hourglass-end:before {
+ content: "\f253";
+}
+.fa-hourglass:before {
+ content: "\f254";
+}
+.fa-hand-grab-o:before,
+.fa-hand-rock-o:before {
+ content: "\f255";
+}
+.fa-hand-stop-o:before,
+.fa-hand-paper-o:before {
+ content: "\f256";
+}
+.fa-hand-scissors-o:before {
+ content: "\f257";
+}
+.fa-hand-lizard-o:before {
+ content: "\f258";
+}
+.fa-hand-spock-o:before {
+ content: "\f259";
+}
+.fa-hand-pointer-o:before {
+ content: "\f25a";
+}
+.fa-hand-peace-o:before {
+ content: "\f25b";
+}
+.fa-trademark:before {
+ content: "\f25c";
+}
+.fa-registered:before {
+ content: "\f25d";
+}
+.fa-creative-commons:before {
+ content: "\f25e";
+}
+.fa-gg:before {
+ content: "\f260";
+}
+.fa-gg-circle:before {
+ content: "\f261";
+}
+.fa-tripadvisor:before {
+ content: "\f262";
+}
+.fa-odnoklassniki:before {
+ content: "\f263";
+}
+.fa-odnoklassniki-square:before {
+ content: "\f264";
+}
+.fa-get-pocket:before {
+ content: "\f265";
+}
+.fa-wikipedia-w:before {
+ content: "\f266";
+}
+.fa-safari:before {
+ content: "\f267";
+}
+.fa-chrome:before {
+ content: "\f268";
+}
+.fa-firefox:before {
+ content: "\f269";
+}
+.fa-opera:before {
+ content: "\f26a";
+}
+.fa-internet-explorer:before {
+ content: "\f26b";
+}
+.fa-tv:before,
+.fa-television:before {
+ content: "\f26c";
+}
+.fa-contao:before {
+ content: "\f26d";
+}
+.fa-500px:before {
+ content: "\f26e";
+}
+.fa-amazon:before {
+ content: "\f270";
+}
+.fa-calendar-plus-o:before {
+ content: "\f271";
+}
+.fa-calendar-minus-o:before {
+ content: "\f272";
+}
+.fa-calendar-times-o:before {
+ content: "\f273";
+}
+.fa-calendar-check-o:before {
+ content: "\f274";
+}
+.fa-industry:before {
+ content: "\f275";
+}
+.fa-map-pin:before {
+ content: "\f276";
+}
+.fa-map-signs:before {
+ content: "\f277";
+}
+.fa-map-o:before {
+ content: "\f278";
+}
+.fa-map:before {
+ content: "\f279";
+}
+.fa-commenting:before {
+ content: "\f27a";
+}
+.fa-commenting-o:before {
+ content: "\f27b";
+}
+.fa-houzz:before {
+ content: "\f27c";
+}
+.fa-vimeo:before {
+ content: "\f27d";
+}
+.fa-black-tie:before {
+ content: "\f27e";
+}
+.fa-fonticons:before {
+ content: "\f280";
+}
+.fa-reddit-alien:before {
+ content: "\f281";
+}
+.fa-edge:before {
+ content: "\f282";
+}
+.fa-credit-card-alt:before {
+ content: "\f283";
+}
+.fa-codiepie:before {
+ content: "\f284";
+}
+.fa-modx:before {
+ content: "\f285";
+}
+.fa-fort-awesome:before {
+ content: "\f286";
+}
+.fa-usb:before {
+ content: "\f287";
+}
+.fa-product-hunt:before {
+ content: "\f288";
+}
+.fa-mixcloud:before {
+ content: "\f289";
+}
+.fa-scribd:before {
+ content: "\f28a";
+}
+.fa-pause-circle:before {
+ content: "\f28b";
+}
+.fa-pause-circle-o:before {
+ content: "\f28c";
+}
+.fa-stop-circle:before {
+ content: "\f28d";
+}
+.fa-stop-circle-o:before {
+ content: "\f28e";
+}
+.fa-shopping-bag:before {
+ content: "\f290";
+}
+.fa-shopping-basket:before {
+ content: "\f291";
+}
+.fa-hashtag:before {
+ content: "\f292";
+}
+.fa-bluetooth:before {
+ content: "\f293";
+}
+.fa-bluetooth-b:before {
+ content: "\f294";
+}
+.fa-percent:before {
+ content: "\f295";
+}
+.fa-gitlab:before {
+ content: "\f296";
+}
+.fa-wpbeginner:before {
+ content: "\f297";
+}
+.fa-wpforms:before {
+ content: "\f298";
+}
+.fa-envira:before {
+ content: "\f299";
+}
+.fa-universal-access:before {
+ content: "\f29a";
+}
+.fa-wheelchair-alt:before {
+ content: "\f29b";
+}
+.fa-question-circle-o:before {
+ content: "\f29c";
+}
+.fa-blind:before {
+ content: "\f29d";
+}
+.fa-audio-description:before {
+ content: "\f29e";
+}
+.fa-volume-control-phone:before {
+ content: "\f2a0";
+}
+.fa-braille:before {
+ content: "\f2a1";
+}
+.fa-assistive-listening-systems:before {
+ content: "\f2a2";
+}
+.fa-asl-interpreting:before,
+.fa-american-sign-language-interpreting:before {
+ content: "\f2a3";
+}
+.fa-deafness:before,
+.fa-hard-of-hearing:before,
+.fa-deaf:before {
+ content: "\f2a4";
+}
+.fa-glide:before {
+ content: "\f2a5";
+}
+.fa-glide-g:before {
+ content: "\f2a6";
+}
+.fa-signing:before,
+.fa-sign-language:before {
+ content: "\f2a7";
+}
+.fa-low-vision:before {
+ content: "\f2a8";
+}
+.fa-viadeo:before {
+ content: "\f2a9";
+}
+.fa-viadeo-square:before {
+ content: "\f2aa";
+}
+.fa-snapchat:before {
+ content: "\f2ab";
+}
+.fa-snapchat-ghost:before {
+ content: "\f2ac";
+}
+.fa-snapchat-square:before {
+ content: "\f2ad";
+}
+.fa-pied-piper:before {
+ content: "\f2ae";
+}
+.fa-first-order:before {
+ content: "\f2b0";
+}
+.fa-yoast:before {
+ content: "\f2b1";
+}
+.fa-themeisle:before {
+ content: "\f2b2";
+}
+.fa-google-plus-circle:before,
+.fa-google-plus-official:before {
+ content: "\f2b3";
+}
+.fa-fa:before,
+.fa-font-awesome:before {
+ content: "\f2b4";
+}
+.fa-handshake-o:before {
+ content: "\f2b5";
+}
+.fa-envelope-open:before {
+ content: "\f2b6";
+}
+.fa-envelope-open-o:before {
+ content: "\f2b7";
+}
+.fa-linode:before {
+ content: "\f2b8";
+}
+.fa-address-book:before {
+ content: "\f2b9";
+}
+.fa-address-book-o:before {
+ content: "\f2ba";
+}
+.fa-vcard:before,
+.fa-address-card:before {
+ content: "\f2bb";
+}
+.fa-vcard-o:before,
+.fa-address-card-o:before {
+ content: "\f2bc";
+}
+.fa-user-circle:before {
+ content: "\f2bd";
+}
+.fa-user-circle-o:before {
+ content: "\f2be";
+}
+.fa-user-o:before {
+ content: "\f2c0";
+}
+.fa-id-badge:before {
+ content: "\f2c1";
+}
+.fa-drivers-license:before,
+.fa-id-card:before {
+ content: "\f2c2";
+}
+.fa-drivers-license-o:before,
+.fa-id-card-o:before {
+ content: "\f2c3";
+}
+.fa-quora:before {
+ content: "\f2c4";
+}
+.fa-free-code-camp:before {
+ content: "\f2c5";
+}
+.fa-telegram:before {
+ content: "\f2c6";
+}
+.fa-thermometer-4:before,
+.fa-thermometer:before,
+.fa-thermometer-full:before {
+ content: "\f2c7";
+}
+.fa-thermometer-3:before,
+.fa-thermometer-three-quarters:before {
+ content: "\f2c8";
+}
+.fa-thermometer-2:before,
+.fa-thermometer-half:before {
+ content: "\f2c9";
+}
+.fa-thermometer-1:before,
+.fa-thermometer-quarter:before {
+ content: "\f2ca";
+}
+.fa-thermometer-0:before,
+.fa-thermometer-empty:before {
+ content: "\f2cb";
+}
+.fa-shower:before {
+ content: "\f2cc";
+}
+.fa-bathtub:before,
+.fa-s15:before,
+.fa-bath:before {
+ content: "\f2cd";
+}
+.fa-podcast:before {
+ content: "\f2ce";
+}
+.fa-window-maximize:before {
+ content: "\f2d0";
+}
+.fa-window-minimize:before {
+ content: "\f2d1";
+}
+.fa-window-restore:before {
+ content: "\f2d2";
+}
+.fa-times-rectangle:before,
+.fa-window-close:before {
+ content: "\f2d3";
+}
+.fa-times-rectangle-o:before,
+.fa-window-close-o:before {
+ content: "\f2d4";
+}
+.fa-bandcamp:before {
+ content: "\f2d5";
+}
+.fa-grav:before {
+ content: "\f2d6";
+}
+.fa-etsy:before {
+ content: "\f2d7";
+}
+.fa-imdb:before {
+ content: "\f2d8";
+}
+.fa-ravelry:before {
+ content: "\f2d9";
+}
+.fa-eercast:before {
+ content: "\f2da";
+}
+.fa-microchip:before {
+ content: "\f2db";
+}
+.fa-snowflake-o:before {
+ content: "\f2dc";
+}
+.fa-superpowers:before {
+ content: "\f2dd";
+}
+.fa-wpexplorer:before {
+ content: "\f2de";
+}
+.fa-meetup:before {
+ content: "\f2e0";
+}
+.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;
+}
diff --git a/src/main/resources/static/css/font-awesome.min.css b/src/main/resources/static/css/font-awesome.min.css
new file mode 100644
index 0000000..540440c
--- /dev/null
+++ b/src/main/resources/static/css/font-awesome.min.css
@@ -0,0 +1,4 @@
+/*!
+ * Font Awesome 4.7.0 by @davegandy - http://fontawesome.io - @fontawesome
+ * License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License)
+ */@font-face{font-family:'FontAwesome';src:url('../fonts/fontawesome-webfont.eot?v=4.7.0');src:url('../fonts/fontawesome-webfont.eot?#iefix&v=4.7.0') format('embedded-opentype'),url('../fonts/fontawesome-webfont.woff2?v=4.7.0') format('woff2'),url('../fonts/fontawesome-webfont.woff?v=4.7.0') format('woff'),url('../fonts/fontawesome-webfont.ttf?v=4.7.0') format('truetype'),url('../fonts/fontawesome-webfont.svg?v=4.7.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}.fa-lg{font-size:1.33333333em;line-height:.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:.14285714em;text-align:center}.fa-li.fa-lg{left:-1.85714286em}.fa-border{padding:.2em .25em .15em;border:solid .08em #eee;border-radius:.1em}.fa-pull-left{float:left}.fa-pull-right{float:right}.fa.fa-pull-left{margin-right:.3em}.fa.fa-pull-right{margin-left:.3em}.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{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=1)";-webkit-transform:rotate(90deg);-ms-transform:rotate(90deg);transform:rotate(90deg)}.fa-rotate-180{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2)";-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg)}.fa-rotate-270{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=3)";-webkit-transform:rotate(270deg);-ms-transform:rotate(270deg);transform:rotate(270deg)}.fa-flip-horizontal{-ms-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{-ms-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:#fff}.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-feed:before,.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-pp: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-resistance: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-y-combinator-square:before,.fa-yc-square:before,.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-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-intersex:before,.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-genderless:before{content:"\f22d"}.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"}.fa-yc:before,.fa-y-combinator:before{content:"\f23b"}.fa-optin-monster:before{content:"\f23c"}.fa-opencart:before{content:"\f23d"}.fa-expeditedssl:before{content:"\f23e"}.fa-battery-4:before,.fa-battery:before,.fa-battery-full:before{content:"\f240"}.fa-battery-3:before,.fa-battery-three-quarters:before{content:"\f241"}.fa-battery-2:before,.fa-battery-half:before{content:"\f242"}.fa-battery-1:before,.fa-battery-quarter:before{content:"\f243"}.fa-battery-0:before,.fa-battery-empty:before{content:"\f244"}.fa-mouse-pointer:before{content:"\f245"}.fa-i-cursor:before{content:"\f246"}.fa-object-group:before{content:"\f247"}.fa-object-ungroup:before{content:"\f248"}.fa-sticky-note:before{content:"\f249"}.fa-sticky-note-o:before{content:"\f24a"}.fa-cc-jcb:before{content:"\f24b"}.fa-cc-diners-club:before{content:"\f24c"}.fa-clone:before{content:"\f24d"}.fa-balance-scale:before{content:"\f24e"}.fa-hourglass-o:before{content:"\f250"}.fa-hourglass-1:before,.fa-hourglass-start:before{content:"\f251"}.fa-hourglass-2:before,.fa-hourglass-half:before{content:"\f252"}.fa-hourglass-3:before,.fa-hourglass-end:before{content:"\f253"}.fa-hourglass:before{content:"\f254"}.fa-hand-grab-o:before,.fa-hand-rock-o:before{content:"\f255"}.fa-hand-stop-o:before,.fa-hand-paper-o:before{content:"\f256"}.fa-hand-scissors-o:before{content:"\f257"}.fa-hand-lizard-o:before{content:"\f258"}.fa-hand-spock-o:before{content:"\f259"}.fa-hand-pointer-o:before{content:"\f25a"}.fa-hand-peace-o:before{content:"\f25b"}.fa-trademark:before{content:"\f25c"}.fa-registered:before{content:"\f25d"}.fa-creative-commons:before{content:"\f25e"}.fa-gg:before{content:"\f260"}.fa-gg-circle:before{content:"\f261"}.fa-tripadvisor:before{content:"\f262"}.fa-odnoklassniki:before{content:"\f263"}.fa-odnoklassniki-square:before{content:"\f264"}.fa-get-pocket:before{content:"\f265"}.fa-wikipedia-w:before{content:"\f266"}.fa-safari:before{content:"\f267"}.fa-chrome:before{content:"\f268"}.fa-firefox:before{content:"\f269"}.fa-opera:before{content:"\f26a"}.fa-internet-explorer:before{content:"\f26b"}.fa-tv:before,.fa-television:before{content:"\f26c"}.fa-contao:before{content:"\f26d"}.fa-500px:before{content:"\f26e"}.fa-amazon:before{content:"\f270"}.fa-calendar-plus-o:before{content:"\f271"}.fa-calendar-minus-o:before{content:"\f272"}.fa-calendar-times-o:before{content:"\f273"}.fa-calendar-check-o:before{content:"\f274"}.fa-industry:before{content:"\f275"}.fa-map-pin:before{content:"\f276"}.fa-map-signs:before{content:"\f277"}.fa-map-o:before{content:"\f278"}.fa-map:before{content:"\f279"}.fa-commenting:before{content:"\f27a"}.fa-commenting-o:before{content:"\f27b"}.fa-houzz:before{content:"\f27c"}.fa-vimeo:before{content:"\f27d"}.fa-black-tie:before{content:"\f27e"}.fa-fonticons:before{content:"\f280"}.fa-reddit-alien:before{content:"\f281"}.fa-edge:before{content:"\f282"}.fa-credit-card-alt:before{content:"\f283"}.fa-codiepie:before{content:"\f284"}.fa-modx:before{content:"\f285"}.fa-fort-awesome:before{content:"\f286"}.fa-usb:before{content:"\f287"}.fa-product-hunt:before{content:"\f288"}.fa-mixcloud:before{content:"\f289"}.fa-scribd:before{content:"\f28a"}.fa-pause-circle:before{content:"\f28b"}.fa-pause-circle-o:before{content:"\f28c"}.fa-stop-circle:before{content:"\f28d"}.fa-stop-circle-o:before{content:"\f28e"}.fa-shopping-bag:before{content:"\f290"}.fa-shopping-basket:before{content:"\f291"}.fa-hashtag:before{content:"\f292"}.fa-bluetooth:before{content:"\f293"}.fa-bluetooth-b:before{content:"\f294"}.fa-percent:before{content:"\f295"}.fa-gitlab:before{content:"\f296"}.fa-wpbeginner:before{content:"\f297"}.fa-wpforms:before{content:"\f298"}.fa-envira:before{content:"\f299"}.fa-universal-access:before{content:"\f29a"}.fa-wheelchair-alt:before{content:"\f29b"}.fa-question-circle-o:before{content:"\f29c"}.fa-blind:before{content:"\f29d"}.fa-audio-description:before{content:"\f29e"}.fa-volume-control-phone:before{content:"\f2a0"}.fa-braille:before{content:"\f2a1"}.fa-assistive-listening-systems:before{content:"\f2a2"}.fa-asl-interpreting:before,.fa-american-sign-language-interpreting:before{content:"\f2a3"}.fa-deafness:before,.fa-hard-of-hearing:before,.fa-deaf:before{content:"\f2a4"}.fa-glide:before{content:"\f2a5"}.fa-glide-g:before{content:"\f2a6"}.fa-signing:before,.fa-sign-language:before{content:"\f2a7"}.fa-low-vision:before{content:"\f2a8"}.fa-viadeo:before{content:"\f2a9"}.fa-viadeo-square:before{content:"\f2aa"}.fa-snapchat:before{content:"\f2ab"}.fa-snapchat-ghost:before{content:"\f2ac"}.fa-snapchat-square:before{content:"\f2ad"}.fa-pied-piper:before{content:"\f2ae"}.fa-first-order:before{content:"\f2b0"}.fa-yoast:before{content:"\f2b1"}.fa-themeisle:before{content:"\f2b2"}.fa-google-plus-circle:before,.fa-google-plus-official:before{content:"\f2b3"}.fa-fa:before,.fa-font-awesome:before{content:"\f2b4"}.fa-handshake-o:before{content:"\f2b5"}.fa-envelope-open:before{content:"\f2b6"}.fa-envelope-open-o:before{content:"\f2b7"}.fa-linode:before{content:"\f2b8"}.fa-address-book:before{content:"\f2b9"}.fa-address-book-o:before{content:"\f2ba"}.fa-vcard:before,.fa-address-card:before{content:"\f2bb"}.fa-vcard-o:before,.fa-address-card-o:before{content:"\f2bc"}.fa-user-circle:before{content:"\f2bd"}.fa-user-circle-o:before{content:"\f2be"}.fa-user-o:before{content:"\f2c0"}.fa-id-badge:before{content:"\f2c1"}.fa-drivers-license:before,.fa-id-card:before{content:"\f2c2"}.fa-drivers-license-o:before,.fa-id-card-o:before{content:"\f2c3"}.fa-quora:before{content:"\f2c4"}.fa-free-code-camp:before{content:"\f2c5"}.fa-telegram:before{content:"\f2c6"}.fa-thermometer-4:before,.fa-thermometer:before,.fa-thermometer-full:before{content:"\f2c7"}.fa-thermometer-3:before,.fa-thermometer-three-quarters:before{content:"\f2c8"}.fa-thermometer-2:before,.fa-thermometer-half:before{content:"\f2c9"}.fa-thermometer-1:before,.fa-thermometer-quarter:before{content:"\f2ca"}.fa-thermometer-0:before,.fa-thermometer-empty:before{content:"\f2cb"}.fa-shower:before{content:"\f2cc"}.fa-bathtub:before,.fa-s15:before,.fa-bath:before{content:"\f2cd"}.fa-podcast:before{content:"\f2ce"}.fa-window-maximize:before{content:"\f2d0"}.fa-window-minimize:before{content:"\f2d1"}.fa-window-restore:before{content:"\f2d2"}.fa-times-rectangle:before,.fa-window-close:before{content:"\f2d3"}.fa-times-rectangle-o:before,.fa-window-close-o:before{content:"\f2d4"}.fa-bandcamp:before{content:"\f2d5"}.fa-grav:before{content:"\f2d6"}.fa-etsy:before{content:"\f2d7"}.fa-imdb:before{content:"\f2d8"}.fa-ravelry:before{content:"\f2d9"}.fa-eercast:before{content:"\f2da"}.fa-microchip:before{content:"\f2db"}.fa-snowflake-o:before{content:"\f2dc"}.fa-superpowers:before{content:"\f2dd"}.fa-wpexplorer:before{content:"\f2de"}.fa-meetup:before{content:"\f2e0"}.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}
diff --git a/src/main/resources/static/css/jquery.treetable.css b/src/main/resources/static/css/jquery.treetable.css
new file mode 100644
index 0000000..4e95bfd
--- /dev/null
+++ b/src/main/resources/static/css/jquery.treetable.css
@@ -0,0 +1,28 @@
+table.treetable span.indenter {
+ display: inline-block;
+ margin: 0;
+ padding: 0;
+ text-align: right;
+
+ /* Disable text selection of nodes (for better D&D UX) */
+ user-select: none;
+ -khtml-user-select: none;
+ -moz-user-select: none;
+ -o-user-select: none;
+ -webkit-user-select: none;
+
+ /* Force content-box box model for indenter (Bootstrap compatibility) */
+ -webkit-box-sizing: content-box;
+ -moz-box-sizing: content-box;
+ box-sizing: content-box;
+
+ width: 19px;
+}
+
+table.treetable span.indenter a {
+ background-position: left center;
+ background-repeat: no-repeat;
+ display: inline-block;
+ text-decoration: none;
+ width: 19px;
+}
diff --git a/src/main/resources/static/css/jquery.treetable.theme.default.css b/src/main/resources/static/css/jquery.treetable.theme.default.css
new file mode 100644
index 0000000..ddbec8b
--- /dev/null
+++ b/src/main/resources/static/css/jquery.treetable.theme.default.css
@@ -0,0 +1,87 @@
+table.treetable {
+ border: 1px solid #888;
+ border-collapse: collapse;
+ font-size: .8em;
+ line-height: 1;
+ margin: .6em 0 1.8em 0;
+ width: 100%;
+}
+
+table.treetable caption {
+ font-size: .9em;
+ font-weight: bold;
+ margin-bottom: .2em;
+}
+
+table.treetable thead {
+ background: #aaa url(data:image/png;base64,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) repeat-x top left;
+ font-size: .9em;
+}
+
+table.treetable thead tr th {
+ border: 1px solid #888;
+ font-weight: normal;
+ padding: .3em 1em .1em 1em;
+ text-align: left;
+}
+
+table.treetable tbody tr td {
+ cursor: default;
+ padding: .3em 1em;
+}
+
+table.treetable span {
+ background-position: center left;
+ background-repeat: no-repeat;
+ padding: .2em 0 .2em 1.5em;
+}
+
+table.treetable span.file {
+ background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAQAAAC1+jfqAAAABGdBTUEAAK/INwWK6QAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAADoSURBVBgZBcExblNBGAbA2ceegTRBuIKOgiihSZNTcC5LUHAihNJR0kGKCDcYJY6D3/77MdOinTvzAgCw8ysThIvn/VojIyMjIyPP+bS1sUQIV2s95pBDDvmbP/mdkft83tpYguZq5Jh/OeaYh+yzy8hTHvNlaxNNczm+la9OTlar1UdA/+C2A4trRCnD3jS8BB1obq2Gk6GU6QbQAS4BUaYSQAf4bhhKKTFdAzrAOwAxEUAH+KEM01SY3gM6wBsEAQB0gJ+maZoC3gI6iPYaAIBJsiRmHU0AALOeFC3aK2cWAACUXe7+AwO0lc9eTHYTAAAAAElFTkSuQmCC);
+}
+
+table.treetable span.folder {
+ background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAAK/INwWK6QAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAGrSURBVDjLxZO7ihRBFIa/6u0ZW7GHBUV0UQQTZzd3QdhMQxOfwMRXEANBMNQX0MzAzFAwEzHwARbNFDdwEd31Mj3X7a6uOr9BtzNjYjKBJ6nicP7v3KqcJFaxhBVtZUAK8OHlld2st7Xl3DJPVONP+zEUV4HqL5UDYHr5xvuQAjgl/Qs7TzvOOVAjxjlC+ePSwe6DfbVegLVuT4r14eTr6zvA8xSAoBLzx6pvj4l+DZIezuVkG9fY2H7YRQIMZIBwycmzH1/s3F8AapfIPNF3kQk7+kw9PWBy+IZOdg5Ug3mkAATy/t0usovzGeCUWTjCz0B+Sj0ekfdvkZ3abBv+U4GaCtJ1iEm6ANQJ6fEzrG/engcKw/wXQvEKxSEKQxRGKE7Izt+DSiwBJMUSm71rguMYhQKrBygOIRStf4TiFFRBvbRGKiQLWP29yRSHKBTtfdBmHs0BUpgvtgF4yRFR+NUKi0XZcYjCeCG2smkzLAHkbRBmP0/Uk26O5YnUActBp1GsAI+S5nRJJJal5K1aAMrq0d6Tm9uI6zjyf75dAe6tx/SsWeD//o2/Ab6IH3/h25pOAAAAAElFTkSuQmCC);
+}
+
+table.treetable tr.collapsed span.indenter a {
+ background-image: url(data:image/png;base64,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);
+}
+
+table.treetable tr.expanded span.indenter a {
+ background-image: url(data:image/png;base64,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);
+}
+
+table.treetable tr.branch {
+ background-color: #f9f9f9;
+}
+
+table.treetable tr.selected {
+ background-color: #3875d7;
+ color: #fff;
+}
+
+table.treetable tr span.indenter a {
+ outline: none; /* Expander shows outline after upgrading to 3.0 (#141) */
+}
+
+table.treetable tr.collapsed.selected span.indenter a {
+ background-image: url(data:image/png;base64,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);
+}
+
+table.treetable tr.expanded.selected span.indenter a {
+ background-image: url(data:image/png;base64,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);
+}
+
+table.treetable tr.accept {
+ background-color: #a3bce4;
+ color: #fff
+}
+
+table.treetable tr.collapsed.accept td span.indenter a {
+ background-image: url(data:image/x-png;base64,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);
+}
+
+table.treetable tr.expanded.accept td span.indenter a {
+ background-image: url(data:image/x-png;base64,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);
+}
diff --git a/src/main/resources/static/css/style.css b/src/main/resources/static/css/style.css
index e69de29..9cd5b94 100644
--- a/src/main/resources/static/css/style.css
+++ b/src/main/resources/static/css/style.css
@@ -0,0 +1,23 @@
+.hiddenRow {
+ padding: 0 !important;
+}
+
+table.dataTable.select tbody tr,
+table.dataTable thead th:first-child {
+ cursor: pointer;
+}
+
+tr.group,
+tr.group:hover {
+ background-color: #ddd !important;
+ cursor:pointer;
+}
+
+.w2ui-grid .w2ui-grid-body .w2ui-grid-records .w2ui-expanded1 > div,
+.w2ui-grid .w2ui-grid-body .w2ui-grid-frecords .w2ui-expanded1 > div {
+ height: 300px !important;
+}
+
+.w2ui-icon-empty .w2ui-icon-expand .w2ui-icon-collapse {
+ display: none;
+}
\ No newline at end of file
diff --git a/src/main/resources/static/css/treeTable.bootstrap.css b/src/main/resources/static/css/treeTable.bootstrap.css
new file mode 100644
index 0000000..641cc47
--- /dev/null
+++ b/src/main/resources/static/css/treeTable.bootstrap.css
@@ -0,0 +1,10 @@
+table.dt-treetable tr.branch.collapsed .indenter a:before {
+ font-family: 'Glyphicons Halflings';
+ /* content: "\e158"; */
+ content: "\e250";
+}
+table.dt-treetable tr.branch.expanded .indenter a:before {
+ font-family: 'Glyphicons Halflings';
+ /* content: "\e159"; */
+ content: "\e252";
+}
diff --git a/src/main/resources/static/css/treeTable.dataTables.css b/src/main/resources/static/css/treeTable.dataTables.css
new file mode 100644
index 0000000..88df734
--- /dev/null
+++ b/src/main/resources/static/css/treeTable.dataTables.css
@@ -0,0 +1,6 @@
+table.dt-treetable tr.branch.collapsed .indenter a:before {
+ content: "►"
+}
+table.dt-treetable tr.branch.expanded .indenter a:before {
+ content: "▾"
+}
diff --git a/src/main/resources/static/css/w2ui-1.5.rc1.css b/src/main/resources/static/css/w2ui-1.5.rc1.css
new file mode 100644
index 0000000..1c356ee
--- /dev/null
+++ b/src/main/resources/static/css/w2ui-1.5.rc1.css
@@ -0,0 +1,3247 @@
+/* w2ui 1.5.rc1 (nightly) (c) http://w2ui.com, vitmalina@gmail.com */
+@font-face {
+ font-family: "w2ui-font";
+ src: url("data:application/x-font-woff;charset=utf-8;base64,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") format("woff");
+ font-weight: normal;
+ font-style: normal;
+}
+[class^="w2ui-icon-"]:before,
+[class*=" w2ui-icon-"]:before {
+ font-family: "w2ui-font";
+ display: inline-block;
+ vertical-align: middle;
+ line-height: 1;
+ font-weight: normal;
+ font-style: normal;
+ speak: none;
+ text-decoration: inherit;
+ text-transform: none;
+ text-rendering: optimizeLegibility;
+ -webkit-font-smoothing: antialiased;
+ -moz-osx-font-smoothing: grayscale;
+}
+/* Icons */
+.w2ui-icon-check:before {
+ content: "\f101";
+}
+.w2ui-icon-columns:before {
+ content: "\f102";
+}
+.w2ui-icon-cross:before {
+ content: "\f103";
+}
+.w2ui-icon-empty:before {
+ content: "\f104";
+}
+.w2ui-icon-info:before {
+ content: "\f105";
+}
+.w2ui-icon-pencil:before {
+ content: "\f106";
+}
+.w2ui-icon-plus:before {
+ content: "\f107";
+}
+.w2ui-icon-reload:before {
+ content: "\f108";
+}
+.w2ui-icon-search:before {
+ content: "\f109";
+}
+/*************************************************
+* --- Reset (used for all w2ui widgets)
+* --- The reset is needed to coexist with other CSS
+* --- on the same page (for example bootstrap)
+*/
+.w2ui-reset {
+ -webkit-box-sizing: border-box;
+ -moz-box-sizing: border-box;
+ -ms-box-sizing: border-box;
+ -o-box-sizing: border-box;
+ box-sizing: border-box;
+ font-family: Verdana, Arial, sans-serif;
+ font-size: 11px;
+}
+.w2ui-reset * {
+ color: default;
+ line-height: 100%;
+ -webkit-box-sizing: border-box;
+ -moz-box-sizing: border-box;
+ -ms-box-sizing: border-box;
+ -o-box-sizing: border-box;
+ box-sizing: border-box;
+ margin: 0px;
+ padding: 0px;
+}
+.w2ui-reset table {
+ max-width: none;
+ background-color: transparent;
+ border-collapse: separate;
+ border-spacing: 0;
+ border: none;
+}
+.w2ui-reset table tr th,
+.w2ui-reset table tr td {
+ font-family: Verdana, Arial, sans-serif;
+ font-size: 11px;
+}
+.w2ui-reset input:not([type=button]):not([type=submit]):not([type=checkbox]):not([type=radio]),
+.w2ui-reset select,
+.w2ui-reset textarea {
+ display: inline-block;
+ width: auto;
+ height: auto;
+ vertical-align: baseline;
+ padding: 4px;
+ margin: 0;
+ font-size: 11px;
+}
+.w2ui-reset select {
+ padding: 1px;
+ height: 23px;
+ font-size: 11px;
+}
+.w2ui-centered {
+ position: absolute;
+ left: 0px;
+ right: 0px;
+ top: 50%;
+ -webkit-transform: translateY(-50%);
+ -moz-transform: translateY(-50%);
+ -ms-transform: translateY(-50%);
+ -o-transform: translateY(-50%);
+ transform: translateY(-50%);
+ max-height: 100%;
+ margin: 0px;
+ padding: 0px 10px;
+ text-align: center;
+}
+.w2ui-disabled,
+.w2ui-readonly {
+ background-color: #f1f1f1 !important;
+ color: #777 !important;
+}
+.w2ui-message {
+ font-size: 12px;
+ position: absolute;
+ z-index: 250;
+ background-color: #f9f9f9;
+ border: 1px solid #999999;
+ box-shadow: 0px 0px 15px #aaaaaa;
+ -webkit-box-sizing: border-box;
+ -moz-box-sizing: border-box;
+ -ms-box-sizing: border-box;
+ -o-box-sizing: border-box;
+ box-sizing: border-box;
+ border-top: 0px;
+ border-radius: 0px 0px 6px 6px;
+ overflow: auto;
+}
+.w2ui-message .w2ui-message-body {
+ position: absolute;
+ top: 0px;
+ bottom: 45px;
+ left: 0px;
+ right: 0px;
+ overflow: auto;
+ line-height: 1.5;
+ font-size: 14px;
+}
+.w2ui-message .w2ui-message-body .w2ui-centered {
+ line-height: 1.5;
+}
+.w2ui-message .w2ui-message-buttons {
+ position: absolute;
+ height: 45px;
+ bottom: 0px;
+ left: 0px;
+ right: 0px;
+ border-top: 1px solid #e5e5e5;
+ text-align: center;
+ padding: 8px;
+}
+/*************************************************
+* ---- Input Controls ----
+*/
+input:not([type=button]):not([type=submit]).w2ui-input,
+textarea.w2ui-input {
+ padding: 4px;
+ border: 1px solid #cacaca;
+ border-radius: 3px;
+ color: #000000;
+ background-color: #ffffff;
+ line-height: normal;
+}
+input:not([type=button]):not([type=submit]).w2ui-input:focus,
+textarea.w2ui-input:focus {
+ outline-color: #72b2ff;
+}
+input:not([type=button]):not([type=submit]).w2ui-input:disabled,
+textarea.w2ui-input:disabled,
+input:not([type=button]):not([type=submit]).w2ui-input[readonly],
+textarea.w2ui-input[readonly] {
+ background-color: #f1f1f1;
+ color: #777;
+}
+/* IE9-11 specific classes */
+/* needs doblue :: */
+input.w2ui-input::-ms-clear {
+ display: none;
+}
+input.w2ui-input:-ms-input-placeholder {
+ color: #aaa !important;
+}
+select.w2ui-input {
+ color: #000000;
+ padding: 0px 15px 0px 7px;
+ line-height: 1.8;
+ border-radius: 3px;
+ border: 1px solid #cacaca;
+ -webkit-appearance: none;
+ background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACgAAAALCAQAAACnzwd+AAAAcklEQVR4AcXMsQFBQQDG4P9tAgC0gJYRQJZgKQMwCqCku6vVAAAA+NJHP4KHOk0aV2pRw61n4BBmyOxKQ8I4ehZeuhd3HTx6DQEGZ7sBfr2OOOOj3Yi43kMKs9sZknofOexqZ8npMygwWZTX51CipP+YA1OiZJbYYg9lAAAAAElFTkSuQmCC'), -webkit-linear-gradient(top, #ffffff 20%, #f6f6f6 50%, #eeeeee 52%, #f4f4f4 100%);
+ background-size: 17px 6px, 100% 100%;
+ background-position: right center, left top;
+ background-repeat: no-repeat, no-repeat;
+}
+.w2ui-icon-expand:before {
+ position: relative;
+ top: 1px;
+ left: 1px;
+ content: ' ';
+ width: 6px;
+ height: 6px;
+ border: 2px solid rgba(150, 150, 150, 0.8);
+ border-bottom: 0;
+ border-left: 0;
+ transform: rotateZ(45deg);
+}
+.w2ui-icon-collapse:before {
+ position: relative;
+ top: -1px;
+ left: 3px;
+ content: ' ';
+ width: 6px;
+ height: 6px;
+ border: 2px solid rgba(150, 150, 150, 0.8);
+ border-bottom: 0;
+ border-left: 0;
+ transform: rotateZ(135deg);
+}
+/* On/Off switch */
+input[type="checkbox"].w2ui-toggle {
+ position: absolute;
+ opacity: 0;
+ width: 46px;
+ height: 22px;
+ padding: 0px;
+ margin: 0px;
+ margin-left: 2px;
+}
+/* Track */
+input[type="checkbox"].w2ui-toggle + div {
+ display: inline-block;
+ width: 46px;
+ height: 22px;
+ border: 1px solid #bbb;
+ border-radius: 30px;
+ background-color: #eee;
+ -webkit-transition-duration: .3s;
+ -webkit-transition-property: background-color, box-shadow;
+ -moz-transition-duration: .3s;
+ -moz-transition-property: background-color, box-shadow;
+ box-shadow: inset 0 0 0 0px rgba(0, 0, 0, 0.4);
+ margin-left: 2px;
+}
+input[type="checkbox"].w2ui-toggle:disabled + div {
+ opacity: 0.3;
+}
+/* Knob */
+input[type="checkbox"].w2ui-toggle + div > div {
+ float: left;
+ width: 22px;
+ height: 22px;
+ border-radius: inherit;
+ background: #f5f5f5;
+ -webkit-transition-duration: 0.3s;
+ -webkit-transition-property: transform, background-color, box-shadow;
+ -moz-transition-duration: 0.3s;
+ -moz-transition-property: transform, background-color;
+ box-shadow: 0px 0px 1px #323232, 0 0 0 1px rgba(200, 200, 200, 0.6);
+ pointer-events: none;
+ margin-top: -1px;
+ margin-left: -1px;
+}
+/* Default Green */
+input[type="checkbox"].w2ui-toggle:checked + div {
+ border: 1px solid #00a23f;
+ box-shadow: inset 0 0 0 12px #54B350;
+}
+input[type="checkbox"].w2ui-toggle:checked + div > div {
+ -webkit-transform: translate3d(24px, 0, 0);
+ -moz-transform: translate3d(24px, 0, 0);
+ background-color: #ffffff;
+ box-shadow: 0px 2px 5px rgba(0, 0, 0, 0.3), 0 0 0 1px #00a23f;
+}
+/* Blue */
+input[type="checkbox"].w2ui-toggle.blue:checked + div {
+ border: 1px solid #206FAD;
+ box-shadow: inset 0 0 0 12px #35A6EB;
+}
+input[type="checkbox"].w2ui-toggle.blue:checked + div > div {
+ box-shadow: 0px 2px 5px rgba(0, 0, 0, 0.3), 0px 0px 0 1px #206fad;
+}
+input[type=checkbox].w2ui-toggle:focus {
+ outline: none;
+}
+/*************************************************
+* ---- Overlay and Bubble ----
+*/
+.w2ui-overlay {
+ position: absolute;
+ margin-top: 4px;
+ margin-left: -17px;
+ display: none;
+ z-index: 1300;
+ color: inherit;
+ background-color: #fbfbfb;
+ border-color: #fbfbfb;
+ box-shadow: 0px 2px 10px #999999;
+ border-radius: 4px;
+ text-align: left;
+}
+.w2ui-overlay > div {
+ border-radius: 4px;
+ position: relative;
+ border: 3px solid #777777;
+}
+.w2ui-overlay table td {
+ color: inherit;
+}
+.w2ui-overlay:before {
+ content: "";
+ position: absolute;
+ border-color: inherit;
+}
+.w2ui-overlay:after {
+ content: "";
+ position: absolute;
+ border-color: inherit;
+ bottom: 100%;
+ left: 4px;
+}
+.w2ui-overlay.top-arrow:before {
+ border-bottom: 12px solid #6f6f6f;
+ border-right: 12px solid transparent;
+ border-left: 12px solid transparent;
+ bottom: 100%;
+ margin-bottom: -3px;
+}
+.w2ui-overlay.top-arrow:after {
+ border-bottom: 8px solid #000000;
+ border-bottom-color: inherit;
+ border-right: 8px solid transparent;
+ border-left: 8px solid transparent;
+ bottom: 100%;
+ margin-bottom: -3px;
+}
+.w2ui-overlay.bottom-arrow:before {
+ border-top: 12px solid #6f6f6f;
+ border-right: 12px solid transparent;
+ border-left: 12px solid transparent;
+ top: 100%;
+ margin-top: -3px;
+}
+.w2ui-overlay.bottom-arrow:after {
+ border-top: 8px solid #000000;
+ border-top-color: inherit;
+ border-right: 8px solid transparent;
+ border-left: 8px solid transparent;
+ top: 100%;
+ margin-top: -3px;
+}
+.w2ui-overlay.w2ui-overlay-popup {
+ z-index: 1700;
+}
+.w2ui-overlay .w2ui-grid-searches {
+ border-top: 3px solid #777777 !important;
+}
+.w2ui-overlay .no-color {
+ border: 1px solid #eee;
+ background: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAABlBMVEX/////TgCFoIUYAAAAGUlEQVR42uXHIQEAAACDsNO/NJ4Kn9uC8wsJkAARUrXAjwAAAABJRU5ErkJggg==');
+ background-size: 15px 15px;
+}
+.w2ui-tag {
+ position: absolute;
+ z-index: 1300;
+ opacity: 0;
+ -webkit-transition: opacity 0.3s;
+ -moz-transition: opacity 0.3s;
+ -ms-transition: opacity 0.3s;
+ -o-transition: opacity 0.3s;
+ transition: opacity 0.3s;
+}
+.w2ui-tag .w2ui-tag-body {
+ box-sizing: border-box;
+ display: inline-block;
+ position: absolute;
+ border-radius: 3px;
+ padding: 6px 10px;
+ margin-left: 10px;
+ margin-top: 0px;
+ background-color: rgba(60, 60, 60, 0.9);
+ color: #ffffff !important;
+ font-size: 11px;
+ font-family: verdana;
+ text-shadow: 1px 1px 3px #000;
+ line-height: 1.4;
+ letter-spacing: 0.1px;
+}
+.w2ui-tag .w2ui-tag-body.w2ui-tag-right:before {
+ content: "";
+ position: absolute;
+ width: 0;
+ height: 0;
+ border-top: 6px solid transparent;
+ border-right: 6px solid rgba(60, 60, 60, 0.9);
+ border-bottom: 6px solid transparent;
+ margin: 0px 0 0 -16px;
+}
+.w2ui-tag .w2ui-tag-body.w2ui-tag-left:after {
+ content: "";
+ position: absolute;
+ top: 5px;
+ width: 0;
+ height: 0;
+ border-top: 6px solid transparent;
+ border-left: 6px solid rgba(60, 60, 60, 0.9);
+ border-bottom: 6px solid transparent;
+ margin: 0px 0 0 10px;
+}
+.w2ui-tag .w2ui-tag-body.w2ui-tag-bottom:before {
+ content: "";
+ position: absolute;
+ width: 0;
+ height: 0;
+ border-right: 6px solid transparent;
+ border-left: 6px solid transparent;
+ border-bottom: 6px solid rgba(60, 60, 60, 0.9);
+ margin: -12px 0 0 2px;
+}
+.w2ui-tag .w2ui-tag-body.w2ui-tag-top:after {
+ content: "";
+ position: absolute;
+ left: 12px;
+ bottom: -6px;
+ width: 0;
+ height: 0;
+ border-right: 6px solid transparent;
+ border-left: 6px solid transparent;
+ border-top: 6px solid rgba(60, 60, 60, 0.9);
+}
+.w2ui-tag.w2ui-tag-popup {
+ z-index: 1700;
+}
+/*
+* Drop down menu
+*/
+.w2ui-overlay table.w2ui-drop-menu {
+ width: 100%;
+ color: #000000;
+ background-color: #ffffff;
+ padding: 5px 0px;
+ cursor: default;
+}
+.w2ui-overlay table.w2ui-drop-menu td {
+ white-space: nowrap;
+}
+.w2ui-overlay table.w2ui-drop-menu .w2ui-item-even {
+ color: inherit;
+ background-color: #ffffff;
+}
+.w2ui-overlay table.w2ui-drop-menu .w2ui-item-odd {
+ color: inherit;
+ background-color: #f3f6fa;
+}
+.w2ui-overlay table.w2ui-drop-menu .w2ui-item-group {
+ color: #444;
+ font-weight: bold;
+ background-color: #ECEDF0;
+ border-bottom: 1px solid #D3D2D4;
+}
+.w2ui-overlay table.w2ui-drop-menu td.menu-icon {
+ padding: 3px 0px 4px 6px;
+ width: 20px;
+}
+.w2ui-overlay table.w2ui-drop-menu td.menu-icon > span {
+ height: 20px;
+ width: 18px;
+}
+.w2ui-overlay table.w2ui-drop-menu td.menu-text {
+ padding: 8px 10px 8px 5px;
+ width: auto;
+}
+.w2ui-overlay table.w2ui-drop-menu td.menu-count {
+ text-align: right;
+}
+.w2ui-overlay table.w2ui-drop-menu td.menu-count > span {
+ border: 1px solid #f6fcf4;
+ border-radius: 20px;
+ width: auto;
+ height: 18px;
+ padding: 2px 7px;
+ margin: 3px 5px 0px 5px;
+ background-color: #f2f8f0;
+ color: #666666;
+ box-shadow: 0px 0px 2px #474545;
+ text-shadow: 1px 1px 0px #ffffff;
+}
+.w2ui-overlay table.w2ui-drop-menu td.menu-count > span.hotkey {
+ border: none;
+ border-radius: 0px;
+ background-color: transparent !important;
+ color: #888;
+ box-shadow: none;
+ text-shadow: none;
+}
+.w2ui-overlay table.w2ui-drop-menu tr:hover {
+ color: inherit;
+ background-color: #e6f0ff;
+}
+.w2ui-overlay table.w2ui-drop-menu tr.w2ui-selected {
+ background-color: #b6d5fb;
+}
+.w2ui-overlay table.w2ui-drop-menu tr.w2ui-selected td {
+ color: inherit;
+}
+.w2ui-overlay table.w2ui-drop-menu tr.w2ui-disabled {
+ opacity: 0.4;
+ background-color: white !important;
+}
+.w2ui-overlay table.w2ui-drop-menu .w2ui-icon {
+ font-size: 14px;
+ color: #8d99a7;
+ display: inline-block;
+ padding-top: 4px;
+}
+/*************************************************
+* ---- Common Classes ----
+*/
+.w2ui-marker {
+ color: #444;
+ background-color: rgba(252, 244, 161, 0.48);
+}
+.w2ui-spinner {
+ display: inline-block;
+ background-size: 100%;
+ background-repeat: no-repeat;
+ background-image: url(data:image/gif;base64,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);
+}
+/* common icons */
+.w2ui-icon {
+ background-repeat: no-repeat;
+ height: 16px;
+ width: 16px;
+ overflow: hidden;
+ margin: 2px 2px;
+ display: inline-block;
+}
+.w2ui-icon.icon-search,
+.w2ui-icon.icon-search-down {
+ background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACYAAAAgCAYAAAB+ZAqzAAACuElEQVRYw9WXSWhTQRjHR0UKLqhFaV0OUih68GAOWjyJKypCpAoV8aIiioIICiKiB1GMtE3MYmry2moXDz1UDx7sUXHBhQpSaRVxrYpWcMO9avx/8AJh/CbznHkxdeB3Cd/8589kvuUJkWcdjCTHghUgAi6DJ+AVeAqugSQIggniXywcNBJsB70g44EHYBcYXUhTM8EFj4ZkboKqQpiqAv2GprK8o7/f75t6pjn0M3gNPmri3vtycxAZA64qDvkJ2kENqAQTQQWoBg74qth3B4y3NbZDIX4fzNfsnQtuK/YfsjFVCh4pMq3Co0Y5uMVoUGkpy8aFT5xaeSzVEo45bXdBt4LeaLq1k0RXMYJfdDfFmAuAD4zWlty4UNyZEkm19MUb2zMw8Sfp1u+IWSrcIimLnTG8/SijdU6OO5poDESdtgHZVBzUHm/amhW7zoitMTS2mNHqASPk2FDCCcLMYK6p+obmulyxfiYLA4bGKFvfSnrUvkq5+Lpk8z4yRH8r3l/X4WiqJFfspSQ0CGYZGpsMnkt6L+h31Z76hpMdeOwPQ7H0NFnssST0C8wxNDaDKb6kP06150gsHahNNlVzYheZd7HJ0BiX4VRGhpmIhRixKyZilM2M1mnTArtIUbU3/qVO0H0GvmQ4CY4C3YopYYlHjXlggNG4R33Ypi2tVtwaPeTdNMkq9pVQZQdvFPs32zbx4aAjzxhDRfIAWAeWg7VgrzsY5ht/zoNJtubKwA3LITGjSKRyW3NTwaUCmKOSMd3WHH0ZJRQZZkOP1zFKZ3CB++4+aQ6kEeksWAb2a2L7qDv49S1Q6T72MOgEXa6RGFhP3wpS/B6NOWpRs0UxFg7eqTFHjX1hscxtAz/ymEuIYi0cvgF8Y0w5Ro3dZ3M1boJkTaXEUFlug6fsdsRQWzTj0cey+N/Xb2sj5lTh2M6OAAAAAElFTkSuQmCC) no-repeat center !important;
+ background-size: 14px 12px !important;
+ opacity: 0.9;
+}
+.w2ui-icon.icon-folder {
+ background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAAK/INwWK6QAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAGrSURBVDjLxZO7ihRBFIa/6u0ZW7GHBUV0UQQTZzd3QdhMQxOfwMRXEANBMNQX0MzAzFAwEzHwARbNFDdwEd31Mj3X7a6uOr9BtzNjYjKBJ6nicP7v3KqcJFaxhBVtZUAK8OHlld2st7Xl3DJPVONP+zEUV4HqL5UDYHr5xvuQAjgl/Qs7TzvOOVAjxjlC+ePSwe6DfbVegLVuT4r14eTr6zvA8xSAoBLzx6pvj4l+DZIezuVkG9fY2H7YRQIMZIBwycmzH1/s3F8AapfIPNF3kQk7+kw9PWBy+IZOdg5Ug3mkAATy/t0usovzGeCUWTjCz0B+Sj0ekfdvkZ3abBv+U4GaCtJ1iEm6ANQJ6fEzrG/engcKw/wXQvEKxSEKQxRGKE7Izt+DSiwBJMUSm71rguMYhQKrBygOIRStf4TiFFRBvbRGKiQLWP29yRSHKBTtfdBmHs0BUpgvtgF4yRFR+NUKi0XZcYjCeCG2smkzLAHkbRBmP0/Uk26O5YnUActBp1GsAI+S5nRJJJal5K1aAMrq0d6Tm9uI6zjyf75dAe6tx/SsWeD//o2/Ab6IH3/h25pOAAAAAElFTkSuQmCC) no-repeat center !important;
+}
+.w2ui-icon.icon-page {
+ background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAAK/INwWK6QAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAINSURBVBgZBcG/r55zGAfg6/4+z3va01NHlYgzEfE7MdCIGISFgS4Gk8ViYyM2Mdlsko4GSf8Do0FLRCIkghhYJA3aVBtEz3nP89wf11VJvPDepdd390+8Nso5nESBQoq0pfvXm9fzWf19453LF85vASqJlz748vInb517dIw6EyYBIIG49u+xi9/c9MdvR//99MPPZ7+4cP4IZhhTPbwzT2d+vGoaVRRp1rRliVvHq+cfvM3TD82+7mun0o/ceO7NT+/4/KOXjwZU1ekk0840bAZzMQ2mooqh0A72d5x/6sB9D5zYnff3PoYBoWBgFKPKqDKqjCpjKr//dcu9p489dra88cydps30KswACfNEKanSaxhlntjJ8Mv12Paie+vZ+0+oeSwwQ0Iw1xAR1CiFNJkGO4wu3ZMY1AAzBI0qSgmCNJsJUEOtJSMaCTBDLyQ0CknAGOgyTyFFiLI2awMzdEcSQgSAAKVUmAeNkxvWJWCGtVlDmgYQ0GFtgg4pNtOwbBcwQy/Rife/2yrRRVI0qYCEBly8Z+P4qMEMy7JaVw72N568e+iwhrXoECQkfH91kY7jwwXMsBx1L93ZruqrK6uuiAIdSnTIKKPLPFcvay8ww/Hh+ufeznTXu49v95IMoQG3784gYXdTqvRmqn/Wpa/ADFX58MW3L71SVU9ETgEIQQQIOOzub+fhIvwPRDgeVjWDahIAAAAASUVORK5CYII=) no-repeat center !important;
+}
+/*************************************************
+* ---- Locking portion of the screen (in grid, form, layout)
+*/
+.w2ui-lock {
+ display: none;
+ position: absolute;
+ z-index: 1400;
+ top: 0px;
+ left: 0px;
+ width: 100%;
+ height: 100%;
+ opacity: 0.15;
+ filter: alpha(opacity=15);
+ background-color: #333333;
+}
+.w2ui-lock-msg {
+ display: none;
+ position: absolute;
+ z-index: 1400;
+ top: 45%;
+ left: 50%;
+ -webkit-transform: translateX(-50%) translateY(-50%);
+ -moz-transform: translateX(-50%) translateY(-50%);
+ -ms-transform: translateX(-50%) translateY(-50%);
+ -o-transform: translateX(-50%) translateY(-50%);
+ transform: translateX(-50%) translateY(-50%);
+ width: 200px;
+ height: 80px;
+ padding: 30px 8px;
+ white-space: nowrap;
+ text-overflow: ellipsis;
+ overflow: hidden;
+ font-size: 13px;
+ font-family: Verdana, Arial, sans-serif;
+ opacity: 0.8;
+ filter: alpha(opacity=80);
+ background-color: #555555;
+ color: #ffffff;
+ text-align: center;
+ border-radius: 5px;
+ border: 2px solid #444444;
+}
+.w2ui-lock-msg .w2ui-spinner {
+ display: inline-block;
+ width: 24px;
+ height: 24px;
+ margin: -3px 8px -7px -10px;
+}
+/*************************************************
+* ---- Scroll contet, used in toolbar and tabs ----
+*/
+.w2ui-scroll-wrapper {
+ overflow: hidden;
+}
+.w2ui-scroll-left,
+.w2ui-scroll-right {
+ top: 0;
+ width: 18px;
+ height: 100%;
+ cursor: default !important;
+ z-index: 10;
+ display: none;
+ position: absolute;
+}
+.w2ui-scroll-left:hover,
+.w2ui-scroll-right:hover {
+ background-color: #dddddd;
+}
+.w2ui-scroll-left {
+ left: 0;
+ box-shadow: 0px 0px 7px #5F5F5F;
+ background: #f7f7f7 url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAQAAADZc7J/AAAAzklEQVR4Ae2THRDEMBCFzy1ucatb3eJ2uhi3uNUtbnGrW9zi1rOdNzdvdl7nDpvYt/9/r7+/51myZZf/zXkD2iMHHRSb0x3oskwMieK05PwEXqP4ExSL0wp0ROao2OOuMPOMdUL6XU1/oGLcFWb+NqyTd2W/P/2qTr9h+nFXhOkHXRHiNyjrgp/U/V+WaQcaNY13zZI0A1JvcVqAnrGDTdtDtZUHjHIJhxxVLN0iqXgCP1l/7h8U9kc6abyJ4/eNWPpGdBv+XdUK0K8cnvcBly2rDr7C1HQAAAAASUVORK5CYII=') center center no-repeat;
+ background-size: 15px 12px;
+}
+.w2ui-scroll-right {
+ right: 0;
+ box-shadow: 0px 0px 7px #5F5F5F;
+ background: #f7f7f7 url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAQAAADZc7J/AAAAz0lEQVR4Ae2UG7TGMBCEr1vd4la3uMUtuli3utWtbnGLW9zi9l/bDMzJG7u12cfJfLunf1+UEC9Bv0vVQwJ8hjRCaZafflb1C9RQf4OD0gSDE+i+PiJAabFhQc1y1AYYsJGLY3lgxM17uWPO56yPiFDqVPWgRtpIHSd1zPnwkBsdI58OlNwx4fP2X0TgfMTOoHSdKOXkpyNvEyQh7ul+4swxJSTQuwNDxz68l/ukVNbu0Neen5Z+KvzWxBAqHds349uPFJ/jVOrPjxUq++OLf+20q5+noXo0AAAAAElFTkSuQmCC') center center no-repeat;
+ background-size: 15px 13px;
+}
+button.w2ui-btn {
+ position: relative;
+ display: inline-block;
+ border-radius: 4px;
+ margin: 0px 5px;
+ padding: 6px 12px;
+ color: #666;
+ font-size: 12px;
+ border: 1px solid #B6B6B6;
+ background-image: -webkit-linear-gradient(#ffffff 0%, #e7e7e7 100%);
+ background-image: -moz-linear-gradient(#ffffff 0%, #e7e7e7 100%);
+ background-image: -ms-linear-gradient(#ffffff 0%, #e7e7e7 100%);
+ background-image: -o-linear-gradient(#ffffff 0%, #e7e7e7 100%);
+ background-image: linear-gradient(#ffffff 0%, #e7e7e7 100%);
+ filter: progid:dximagetransform.microsoft.gradient(startColorstr='#ffe7e7e7', endColorstr='#ffffffff', GradientType=0);
+ outline: none;
+ box-shadow: 0px 1px 0px white;
+ cursor: default;
+ min-width: 75px;
+ line-height: 110%;
+ user-select: none;
+ -webkit-user-select: none;
+ -moz-user-select: none;
+ -ms-user-select: none;
+ -o-user-select: none;
+ -webkit-tap-highlight-color: rgba(0, 0, 0, 0);
+}
+button.w2ui-btn:hover {
+ text-decoration: none;
+ border: 1px solid #bbb;
+ background-image: -webkit-linear-gradient(#f7f7f7 0%, #dddddd 100%);
+ background-image: -moz-linear-gradient(#f7f7f7 0%, #dddddd 100%);
+ background-image: -ms-linear-gradient(#f7f7f7 0%, #dddddd 100%);
+ background-image: -o-linear-gradient(#f7f7f7 0%, #dddddd 100%);
+ background-image: linear-gradient(#f7f7f7 0%, #dddddd 100%);
+ filter: progid:dximagetransform.microsoft.gradient(startColorstr='#ffdddddd', endColorstr='#fff7f7f7', GradientType=0);
+ color: #333;
+}
+button.w2ui-btn:active,
+button.w2ui-btn.clicked {
+ border: 1px solid #999;
+ background-image: -webkit-linear-gradient(#cccccc 0%, #cccccc 100%);
+ background-image: -moz-linear-gradient(#cccccc 0%, #cccccc 100%);
+ background-image: -ms-linear-gradient(#cccccc 0%, #cccccc 100%);
+ background-image: -o-linear-gradient(#cccccc 0%, #cccccc 100%);
+ background-image: linear-gradient(#cccccc 0%, #cccccc 100%);
+ filter: progid:dximagetransform.microsoft.gradient(startColorstr='#ffcccccc', endColorstr='#ffcccccc', GradientType=0);
+ text-shadow: 1px 1px 1px #eee;
+}
+button.w2ui-btn:disabled {
+ border: 1px solid #bbb !important;
+ background: #f7f7f7 !important;
+ color: #bdbcbc !important;
+ text-shadow: none !important;
+}
+button.w2ui-btn:focus:before {
+ content: "";
+ border: 1px dashed #aaa;
+ border-radius: 3px;
+ position: absolute;
+ top: 2px;
+ bottom: 2px;
+ left: 2px;
+ right: 2px;
+ pointer-events: none;
+}
+button.w2ui-btn::-moz-focus-inner {
+ border: 0;
+}
+button.w2ui-btn-blue {
+ color: white;
+ background-image: -webkit-linear-gradient(#80c0f7 0%, #269df0 100%);
+ background-image: -moz-linear-gradient(#80c0f7 0%, #269df0 100%);
+ background-image: -ms-linear-gradient(#80c0f7 0%, #269df0 100%);
+ background-image: -o-linear-gradient(#80c0f7 0%, #269df0 100%);
+ background-image: linear-gradient(#80c0f7 0%, #269df0 100%);
+ filter: progid:dximagetransform.microsoft.gradient(startColorstr='#ff269df0', endColorstr='#ff80c0f7', GradientType=0);
+ border: 1px solid #538AB7;
+ text-shadow: 0px 0px 1px #111111;
+}
+button.w2ui-btn-blue:hover {
+ color: white;
+ background-image: -webkit-linear-gradient(#73b6f0 0%, #2391dd 100%);
+ background-image: -moz-linear-gradient(#73b6f0 0%, #2391dd 100%);
+ background-image: -ms-linear-gradient(#73b6f0 0%, #2391dd 100%);
+ background-image: -o-linear-gradient(#73b6f0 0%, #2391dd 100%);
+ background-image: linear-gradient(#73b6f0 0%, #2391dd 100%);
+ filter: progid:dximagetransform.microsoft.gradient(startColorstr='#ff2391dd', endColorstr='#ff73b6f0', GradientType=0);
+ border: 1px solid #497BA3;
+ text-shadow: 0px 0px 1px #111111;
+}
+button.w2ui-btn-blue:active,
+button.w2ui-btn-blue.clicked {
+ color: white;
+ background-image: -webkit-linear-gradient(#1e83c9 0%, #1e83c9 100%);
+ background-image: -moz-linear-gradient(#1e83c9 0%, #1e83c9 100%);
+ background-image: -ms-linear-gradient(#1e83c9 0%, #1e83c9 100%);
+ background-image: -o-linear-gradient(#1e83c9 0%, #1e83c9 100%);
+ background-image: linear-gradient(#1e83c9 0%, #1e83c9 100%);
+ filter: progid:dximagetransform.microsoft.gradient(startColorstr='#ff1e83c9', endColorstr='#ff1e83c9', GradientType=0);
+ border: 1px solid #1268A6;
+ text-shadow: 0px 0px 1px #111111;
+}
+button.w2ui-btn-blue:focus:before {
+ border: 1px dashed #e8e8e8;
+}
+button.w2ui-btn-green {
+ color: white;
+ background-image: -webkit-linear-gradient(#81cf81 0%, #52a452 100%);
+ background-image: -moz-linear-gradient(#81cf81 0%, #52a452 100%);
+ background-image: -ms-linear-gradient(#81cf81 0%, #52a452 100%);
+ background-image: -o-linear-gradient(#81cf81 0%, #52a452 100%);
+ background-image: linear-gradient(#81cf81 0%, #52a452 100%);
+ filter: progid:dximagetransform.microsoft.gradient(startColorstr='#ff52a452', endColorstr='#ff81cf81', GradientType=0);
+ border: 1px solid #479247;
+ text-shadow: 0px 0px 1px #111111;
+}
+button.w2ui-btn-green:hover {
+ color: white;
+ background-image: -webkit-linear-gradient(#6abe68 0%, #3f8f3d 100%);
+ background-image: -moz-linear-gradient(#6abe68 0%, #3f8f3d 100%);
+ background-image: -ms-linear-gradient(#6abe68 0%, #3f8f3d 100%);
+ background-image: -o-linear-gradient(#6abe68 0%, #3f8f3d 100%);
+ background-image: linear-gradient(#6abe68 0%, #3f8f3d 100%);
+ filter: progid:dximagetransform.microsoft.gradient(startColorstr='#ff3f8f3d', endColorstr='#ff6abe68', GradientType=0);
+ border: 1px solid #479247;
+ text-shadow: 0px 0px 1px #111111;
+}
+button.w2ui-btn-green:active,
+button.w2ui-btn-green.clicked {
+ color: white;
+ background-image: -webkit-linear-gradient(#377d36 0%, #377d36 100%);
+ background-image: -moz-linear-gradient(#377d36 0%, #377d36 100%);
+ background-image: -ms-linear-gradient(#377d36 0%, #377d36 100%);
+ background-image: -o-linear-gradient(#377d36 0%, #377d36 100%);
+ background-image: linear-gradient(#377d36 0%, #377d36 100%);
+ filter: progid:dximagetransform.microsoft.gradient(startColorstr='#ff377d36', endColorstr='#ff377d36', GradientType=0);
+ border: 1px solid #555 !important;
+ text-shadow: 0px 0px 1px #111111;
+}
+button.w2ui-btn-green:focus:before {
+ border: 1px dashed #e8e8e8;
+}
+button.w2ui-btn-orange {
+ color: white;
+ background-image: -webkit-linear-gradient(#fcc272 0%, #fb8822 100%);
+ background-image: -moz-linear-gradient(#fcc272 0%, #fb8822 100%);
+ background-image: -ms-linear-gradient(#fcc272 0%, #fb8822 100%);
+ background-image: -o-linear-gradient(#fcc272 0%, #fb8822 100%);
+ background-image: linear-gradient(#fcc272 0%, #fb8822 100%);
+ filter: progid:dximagetransform.microsoft.gradient(startColorstr='#fffb8822', endColorstr='#fffcc272', GradientType=0);
+ border: 1px solid #B68B4C;
+ text-shadow: 0px 0px 1px #111111;
+}
+button.w2ui-btn-orange:hover {
+ color: white;
+ background-image: -webkit-linear-gradient(#f4ad59 0%, #f1731f 100%);
+ background-image: -moz-linear-gradient(#f4ad59 0%, #f1731f 100%);
+ background-image: -ms-linear-gradient(#f4ad59 0%, #f1731f 100%);
+ background-image: -o-linear-gradient(#f4ad59 0%, #f1731f 100%);
+ background-image: linear-gradient(#f4ad59 0%, #f1731f 100%);
+ filter: progid:dximagetransform.microsoft.gradient(startColorstr='#fff1731f', endColorstr='#fff4ad59', GradientType=0);
+ border: 1px solid #B68B4C;
+ text-shadow: 0px 0px 1px #111111;
+}
+button.w2ui-btn-orange:active,
+button.w2ui-btn-orange.clicked {
+ color: white;
+ border: 1px solid #666;
+ background-image: -webkit-linear-gradient(#b98747 0%, #b98747 100%);
+ background-image: -moz-linear-gradient(#b98747 0%, #b98747 100%);
+ background-image: -ms-linear-gradient(#b98747 0%, #b98747 100%);
+ background-image: -o-linear-gradient(#b98747 0%, #b98747 100%);
+ background-image: linear-gradient(#b98747 0%, #b98747 100%);
+ filter: progid:dximagetransform.microsoft.gradient(startColorstr='#ffb98747', endColorstr='#ffb98747', GradientType=0);
+ text-shadow: 0px 0px 1px #111111;
+}
+button.w2ui-btn-orange:focus:before {
+ border: 1px dashed #f9f9f9;
+}
+button.w2ui-btn-red {
+ color: white;
+ background-image: -webkit-linear-gradient(#ff6e70 0%, #c72d2d 100%);
+ background-image: -moz-linear-gradient(#ff6e70 0%, #c72d2d 100%);
+ background-image: -ms-linear-gradient(#ff6e70 0%, #c72d2d 100%);
+ background-image: -o-linear-gradient(#ff6e70 0%, #c72d2d 100%);
+ background-image: linear-gradient(#ff6e70 0%, #c72d2d 100%);
+ filter: progid:dximagetransform.microsoft.gradient(startColorstr='#ffc72d2d', endColorstr='#ffff6e70', GradientType=0);
+ border: 1px solid #BB3C3E;
+ text-shadow: 0px 0px 1px #111111;
+}
+button.w2ui-btn-red:hover {
+ color: white;
+ background-image: -webkit-linear-gradient(#ee696c 0%, #ae2527 100%);
+ background-image: -moz-linear-gradient(#ee696c 0%, #ae2527 100%);
+ background-image: -ms-linear-gradient(#ee696c 0%, #ae2527 100%);
+ background-image: -o-linear-gradient(#ee696c 0%, #ae2527 100%);
+ background-image: linear-gradient(#ee696c 0%, #ae2527 100%);
+ filter: progid:dximagetransform.microsoft.gradient(startColorstr='#ffae2527', endColorstr='#ffee696c', GradientType=0);
+ border: 1px solid #BB3C3E;
+ text-shadow: 0px 0px 1px #111111;
+}
+button.w2ui-btn-red:active,
+button.w2ui-btn-red.clicked {
+ color: white;
+ border: 1px solid #861C1E;
+ background-image: -webkit-linear-gradient(#9c2123 0%, #9c2123 100%);
+ background-image: -moz-linear-gradient(#9c2123 0%, #9c2123 100%);
+ background-image: -ms-linear-gradient(#9c2123 0%, #9c2123 100%);
+ background-image: -o-linear-gradient(#9c2123 0%, #9c2123 100%);
+ background-image: linear-gradient(#9c2123 0%, #9c2123 100%);
+ filter: progid:dximagetransform.microsoft.gradient(startColorstr='#ff9c2123', endColorstr='#ff9c2123', GradientType=0);
+ text-shadow: 0px 0px 1px #111111;
+}
+button.w2ui-btn-red:focus:before {
+ border: 1px dashed #ddd;
+}
+button.w2ui-btn-small {
+ padding: 5px !important;
+ margin: 0px;
+ min-width: 0px;
+}
+button.w2ui-btn-small:focus:before {
+ border-radius: 2px;
+ top: 2px;
+ bottom: 2px;
+ left: 2px;
+ right: 2px;
+}
+/*************************************************
+* ---- Forms ----
+*/
+.w2ui-form {
+ position: relative;
+ color: #000000;
+ background-color: #f2f2f2;
+ border: 1px solid #c0c0c0;
+ border-radius: 3px;
+ padding: 0px;
+ overflow: hidden !important;
+}
+.w2ui-form > div {
+ position: absolute;
+ overflow: hidden;
+}
+.w2ui-form .w2ui-form-header {
+ position: absolute;
+ left: 0;
+ right: 0;
+ border-bottom: 1px solid #99bbe8 !important;
+ overflow: hidden;
+ color: #444444;
+ font-size: 13px;
+ text-align: center;
+ padding: 8px;
+ background-image: -webkit-linear-gradient(#dae6f3, #c2d5ed);
+ background-image: -moz-linear-gradient(#dae6f3, #c2d5ed);
+ background-image: -ms-linear-gradient(#dae6f3, #c2d5ed);
+ background-image: -o-linear-gradient(#dae6f3, #c2d5ed);
+ background-image: linear-gradient(#dae6f3, #c2d5ed);
+ filter: progid:dximagetransform.microsoft.gradient(startColorstr='#ffdae6f3', endColorstr='#ffc2d5ed', GradientType=0);
+ border-top-left-radius: 3px;
+ border-top-right-radius: 3px;
+}
+.w2ui-form .w2ui-form-toolbar {
+ position: absolute;
+ left: 0px;
+ right: 0px;
+ margin: 0px;
+ padding: 6px 3px;
+ border-bottom: 1px solid #d5d8d8;
+}
+.w2ui-form .w2ui-form-tabs {
+ margin: 0px;
+ padding: 0px;
+}
+.w2ui-form .w2ui-tabs {
+ position: absolute;
+ left: 0;
+ right: 0;
+ border-top-left-radius: 3px;
+ border-top-right-radius: 3px;
+ padding-top: 5px !important;
+ background-color: #fafafa;
+}
+.w2ui-form .w2ui-tabs .w2ui-tab.active {
+ background-color: #f2f2f2;
+}
+.w2ui-form .w2ui-page {
+ position: absolute;
+ left: 0;
+ right: 0;
+ overflow: auto;
+ padding: 10px;
+ border-left: 1px solid inherit;
+ border-right: 1px solid inherit;
+ background-color: inherit;
+ border-radius: 3px;
+}
+.w2ui-form .w2ui-buttons {
+ position: absolute;
+ left: 0;
+ right: 0;
+ bottom: 0;
+ text-align: center;
+ border-top: 1px solid #d5d8d8;
+ border-bottom: 0px solid #d5d8d8;
+ background-color: #fafafa;
+ padding: 15px 0px !important;
+ border-bottom-left-radius: 3px;
+ border-bottom-right-radius: 3px;
+}
+.w2ui-form .w2ui-buttons input[type="button"],
+.w2ui-form .w2ui-buttons button {
+ min-width: 80px;
+ margin-right: 5px;
+}
+.w2ui-form input[type=checkbox],
+.w2ui-form input[type=radio] {
+ margin-top: 4px;
+ margin-bottom: 4px;
+}
+.w2ui-form input[type=checkbox].w2ui-toggle {
+ margin: 0px;
+}
+.w2ui-group-title {
+ padding: 5px 2px;
+ color: #8D96A2;
+ text-shadow: 1px 1px 2px #fdfdfd;
+ font-size: 120%;
+}
+.w2ui-group {
+ background-color: #f9f9f9;
+ margin: 5px 0px 10px 0px;
+ padding: 10px 5px;
+ border-top: 1px solid #dcdcdc;
+ border-bottom: 1px solid #dcdcdc;
+}
+.w2ui-field > label {
+ display: block;
+ float: left;
+ margin-top: 7px;
+ margin-bottom: 3px;
+ width: 120px;
+ padding: 0px;
+ white-space: nowrap;
+ overflow: hidden;
+ text-overflow: ellipsis;
+ text-align: right;
+ min-height: 20px;
+ color: #666;
+}
+.w2ui-field > div {
+ /* do not include width */
+ margin-bottom: 3px;
+ margin-left: 128px;
+ padding: 3px;
+ min-height: 28px;
+ float: none;
+}
+.w2ui-field.w2ui-required > div {
+ position: relative;
+}
+.w2ui-field.w2ui-required > div::before {
+ content: '*';
+ position: absolute;
+ margin-top: 5px;
+ margin-left: -9px;
+ color: #ff0000;
+}
+.w2ui-field.w2ui-span1 > label {
+ width: 20px;
+}
+.w2ui-field.w2ui-span1 > div {
+ margin-left: 28px;
+}
+.w2ui-field.w2ui-span2 > label {
+ width: 40px;
+}
+.w2ui-field.w2ui-span2 > div {
+ margin-left: 48px;
+}
+.w2ui-field.w2ui-span3 > label {
+ width: 60px;
+}
+.w2ui-field.w2ui-span3 > div {
+ margin-left: 68px;
+}
+.w2ui-field.w2ui-span4 > label {
+ width: 80px;
+}
+.w2ui-field.w2ui-span4 > div {
+ margin-left: 88px;
+}
+.w2ui-field.w2ui-span5 > label {
+ width: 100px;
+}
+.w2ui-field.w2ui-span5 > div {
+ margin-left: 108px;
+}
+.w2ui-field.w2ui-span6 > label {
+ width: 120px;
+}
+.w2ui-field.w2ui-span6 > div {
+ margin-left: 128px;
+}
+.w2ui-field.w2ui-span7 > label {
+ width: 140px;
+}
+.w2ui-field.w2ui-span7 > div {
+ margin-left: 148px;
+}
+.w2ui-field.w2ui-span8 > label {
+ width: 160px;
+}
+.w2ui-field.w2ui-span8 > div {
+ margin-left: 168px;
+}
+.w2ui-field.w2ui-span9 > label {
+ width: 180px;
+}
+.w2ui-field.w2ui-span9 > div {
+ margin-left: 188px;
+}
+.w2ui-field.w2ui-span10 > label {
+ width: 200px;
+}
+.w2ui-field.w2ui-span10 > div {
+ margin-left: 208px;
+}
+.w2ui-error {
+ border: 1px solid #ffa8a8 !important;
+ background-color: #fff4eb !important;
+}
+.w2field {
+ padding: 3px;
+ border-radius: 3px;
+ border: 1px solid silver;
+}
+.w2ui-field-helper {
+ position: absolute;
+ display: inline-block;
+ line-height: 100%;
+ /* pointer-events: none; - do not use as IE does not support it */
+ user-select: none;
+ -webkit-user-select: none;
+ -moz-user-select: none;
+ -ms-user-select: none;
+ -o-user-select: none;
+}
+.w2ui-field-helper .w2ui-field-up {
+ position: absolute;
+ top: 0px;
+ padding: 2px 3px;
+}
+.w2ui-field-helper .w2ui-field-down {
+ position: absolute;
+ bottom: 0px;
+ padding: 2px 3px;
+}
+.w2ui-field-helper .arrow-up:hover {
+ border-bottom-color: #81C6FF;
+}
+.w2ui-field-helper .arrow-down:hover {
+ border-top-color: #81C6FF;
+}
+/*
+* ARROWS
+*/
+.arrow-up {
+ background: none;
+ width: 0;
+ height: 0;
+ border-left: 4px solid transparent;
+ /* left arrow slant */
+ border-right: 4px solid transparent;
+ /* right arrow slant */
+ border-bottom: 5px solid #777;
+ /* bottom, add background color here */
+ font-size: 0;
+ line-height: 0;
+}
+.arrow-down {
+ background: none;
+ width: 0;
+ height: 0;
+ border-left: 4px solid transparent;
+ border-right: 4px solid transparent;
+ border-top: 5px solid #777;
+ font-size: 0;
+ line-height: 0;
+}
+.arrow-left {
+ background: none;
+ width: 0;
+ height: 0;
+ border-bottom: 4px solid transparent;
+ /* left arrow slant */
+ border-top: 4px solid transparent;
+ /* right arrow slant */
+ border-right: 5px solid #777;
+ /* bottom, add background color here */
+ font-size: 0;
+ line-height: 0;
+}
+.arrow-right {
+ background: none;
+ width: 0;
+ height: 0;
+ border-bottom: 4px solid transparent;
+ /* left arrow slant */
+ border-top: 4px solid transparent;
+ /* right arrow slant */
+ border-left: 5px solid #777;
+ /* bottom, add background color here */
+ font-size: 0;
+ line-height: 0;
+}
+/*
+* COLOR overlay
+*/
+.w2ui-color {
+ padding: 5px;
+ padding-top: 8px;
+ background-color: white;
+ border-radius: 3px;
+}
+.w2ui-color > table {
+ table-layout: fixed;
+ width: 160px;
+}
+.w2ui-color > table td {
+ width: 20px;
+ height: 20px;
+ text-align: center;
+}
+.w2ui-color > table td div {
+ cursor: pointer;
+ display: inline-block;
+ width: 16px;
+ height: 17px;
+ padding: 1px 4px;
+ border: 1px solid transparent;
+ color: white;
+ text-shadow: 0px 0px 2px #000;
+}
+.w2ui-color > table td div:hover {
+ outline: 1px solid #666;
+ border: 1px solid #fff;
+}
+/*
+* DATE overlay
+*/
+.w2ui-calendar {
+ margin: 0px;
+ padding: 1px;
+ line-height: 108%;
+}
+.w2ui-calendar .w2ui-calendar-title {
+ margin: 0px -1px;
+ padding: 7px 2px;
+ background-image: -webkit-linear-gradient(#f6f6f6, #d9d9d9);
+ background-image: -moz-linear-gradient(#f6f6f6, #d9d9d9);
+ background-image: -ms-linear-gradient(#f6f6f6, #d9d9d9);
+ background-image: -o-linear-gradient(#f6f6f6, #d9d9d9);
+ background-image: linear-gradient(#f6f6f6, #d9d9d9);
+ filter: progid:dximagetransform.microsoft.gradient(startColorstr='#fff6f6f6', endColorstr='#ffd9d9d9', GradientType=0);
+ border-bottom: 1px solid #bbbbbb;
+ color: #555555;
+ text-align: center;
+ text-shadow: 1px 1px 1px #eeeeee;
+ cursor: pointer;
+}
+.w2ui-calendar .w2ui-calendar-jump {
+ position: absolute;
+ top: 27px;
+ left: 0px;
+ right: 0px;
+ bottom: 0px;
+ background-color: #FaFaFa;
+}
+.w2ui-calendar .w2ui-calendar-jump > :first-child {
+ position: absolute;
+ top: 0px;
+ left: 0px;
+ bottom: 0px;
+ width: 110px;
+ overflow: hidden;
+ padding-top: 5px;
+ border-right: 1px solid #c0c0c0;
+}
+.w2ui-calendar .w2ui-calendar-jump > :last-child {
+ position: absolute;
+ top: 0px;
+ right: 0px;
+ bottom: 0px;
+ width: 88px;
+ overflow-x: hidden;
+ overflow-y: auto;
+ padding-top: 5px;
+ text-align: center;
+}
+.w2ui-calendar .w2ui-calendar-jump .w2ui-jump-month,
+.w2ui-calendar .w2ui-calendar-jump .w2ui-jump-year {
+ display: inline-block;
+ padding: 5px 0px;
+ text-align: center;
+ float: left;
+ margin: 2px;
+ width: 50px;
+ cursor: default;
+ border: 1px solid transparent;
+ border-radius: 2px;
+}
+.w2ui-calendar .w2ui-calendar-jump .w2ui-jump-year {
+ float: none;
+ width: 95%;
+}
+.w2ui-calendar .w2ui-calendar-jump .w2ui-jump-month:hover,
+.w2ui-calendar .w2ui-calendar-jump .w2ui-jump-year:hover {
+ border: 1px solid #cccccc;
+ color: #000000;
+ background-color: #efefef;
+}
+.w2ui-calendar .w2ui-calendar-jump .w2ui-jump-month.selected,
+.w2ui-calendar .w2ui-calendar-jump .w2ui-jump-year.selected {
+ border: 1px solid #cccccc;
+ color: #000000;
+ background-color: #dadada;
+}
+.w2ui-calendar .w2ui-calendar-previous,
+.w2ui-calendar .w2ui-calendar-next {
+ width: 24px;
+ height: 20px;
+ color: #666666;
+ border: 1px solid transparent;
+ border-radius: 3px;
+ padding: 2px 3px 1px 2px;
+ margin: -4px 0px 0px 0px;
+ cursor: default;
+}
+.w2ui-calendar .w2ui-calendar-previous:hover,
+.w2ui-calendar .w2ui-calendar-next:hover {
+ border: 1px solid #c0c0c0;
+ background-color: #efefef;
+}
+.w2ui-calendar .w2ui-calendar-previous > div,
+.w2ui-calendar .w2ui-calendar-next > div {
+ position: absolute;
+ border-left: 4px solid #888;
+ border-top: 4px solid #888;
+ border-right: 4px solid transparent;
+ border-bottom: 4px solid transparent;
+ width: 0px;
+ height: 0px;
+ padding: 0px;
+ margin: 3px 0px 0px 0px;
+}
+.w2ui-calendar .w2ui-calendar-previous {
+ float: left;
+}
+.w2ui-calendar .w2ui-calendar-previous > div {
+ -webkit-transform: rotate(-45deg);
+ -moz-transform: rotate(-45deg);
+ -ms-transform: rotate(-45deg);
+ -o-transform: rotate(-45deg);
+ transform: rotate(-45deg);
+ margin-left: 6px;
+}
+.w2ui-calendar .w2ui-calendar-next {
+ float: right;
+}
+.w2ui-calendar .w2ui-calendar-next > div {
+ -webkit-transform: rotate(135deg);
+ -moz-transform: rotate(135deg);
+ -ms-transform: rotate(135deg);
+ -o-transform: rotate(135deg);
+ transform: rotate(135deg);
+ margin-left: 2px;
+ margin-right: 2px;
+}
+.w2ui-calendar .w2ui-calendar-now {
+ cursor: pointer;
+ margin-bottom: 10px;
+ text-align: center;
+}
+.w2ui-calendar .w2ui-calendar-now:hover {
+ color: #0A96DE;
+}
+.w2ui-calendar table.w2ui-calendar-days {
+ padding: 0px;
+}
+.w2ui-calendar table.w2ui-calendar-days td {
+ border: 1px solid #ffffff;
+ color: #000000;
+ background-color: #f9f9f9;
+ padding: 6px;
+ cursor: default;
+ text-align: right;
+}
+.w2ui-calendar table.w2ui-calendar-days td.w2ui-saturday,
+.w2ui-calendar table.w2ui-calendar-days td.w2ui-sunday {
+ border: 1px solid #ffffff;
+ color: #c8493b;
+ background-color: #f9f9f9;
+}
+.w2ui-calendar table.w2ui-calendar-days td.w2ui-saturday:hover,
+.w2ui-calendar table.w2ui-calendar-days td.w2ui-sunday:hover {
+ border: 1px solid #cccccc;
+ color: #000000;
+ background-color: #e9e9e9;
+}
+.w2ui-calendar table.w2ui-calendar-days td.w2ui-saturday.w2ui-blocked,
+.w2ui-calendar table.w2ui-calendar-days td.w2ui-sunday.w2ui-blocked {
+ text-decoration: line-through;
+ border: 1px solid #ffffff;
+ color: #cccccc;
+ background-color: #ffffff;
+}
+.w2ui-calendar table.w2ui-calendar-days td.w2ui-today {
+ color: #000000;
+ background-color: #e2f7cd;
+}
+.w2ui-calendar table.w2ui-calendar-days td:hover {
+ border: 1px solid #cccccc;
+ color: #000000;
+ background-color: #e9e9e9;
+}
+.w2ui-calendar table.w2ui-calendar-days td.w2ui-date-selected {
+ border: 1px solid #8cb067;
+}
+.w2ui-calendar table.w2ui-calendar-days td.w2ui-blocked {
+ text-decoration: line-through;
+ border: 1px solid #ffffff;
+ color: #cccccc;
+ background-color: #ffffff;
+}
+.w2ui-calendar table.w2ui-calendar-days td.w2ui-day-empty {
+ border: 1px solid #ffffff;
+ background-color: #fdfdfd;
+}
+.w2ui-calendar table.w2ui-calendar-days tr.w2ui-day-title td {
+ border: 1px solid #ffffff;
+ color: #808080;
+ background-color: #ffffff;
+ text-align: center;
+ padding: 6px;
+}
+/*
+* Time
+*/
+.w2ui-calendar-time {
+ padding: 5px;
+ cursor: default;
+}
+.w2ui-calendar-time td div {
+ padding: 7px 10px;
+ text-align: center;
+ border: 1px solid transparent;
+ white-space: nowrap;
+}
+.w2ui-calendar-time td:nth-child(even) {
+ background-color: #f6f6f6;
+}
+.w2ui-calendar-time td div:hover {
+ border: 1px solid #cccccc;
+ color: #000000;
+ background-color: #e9e9e9;
+}
+.w2ui-calendar-time td div.w2ui-blocked {
+ text-decoration: line-through;
+ border: 1px solid #ffffff;
+ color: #cccccc;
+ background-color: #ffffff;
+}
+.w2ui-select {
+ cursor: default;
+ color: black !important;
+ background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACgAAAALCAQAAACnzwd+AAAAcklEQVR4AcXMsQFBQQDG4P9tAgC0gJYRQJZgKQMwCqCku6vVAAAA+NJHP4KHOk0aV2pRw61n4BBmyOxKQ8I4ehZeuhd3HTx6DQEGZ7sBfr2OOOOj3Yi43kMKs9sZknofOexqZ8npMygwWZTX51CipP+YA1OiZJbYYg9lAAAAAElFTkSuQmCC'), -webkit-linear-gradient(top, #ffffff 20%, #f6f6f6 50%, #eeeeee 52%, #f4f4f4 100%);
+ background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACgAAAALCAQAAACnzwd+AAAAcklEQVR4AcXMsQFBQQDG4P9tAgC0gJYRQJZgKQMwCqCku6vVAAAA+NJHP4KHOk0aV2pRw61n4BBmyOxKQ8I4ehZeuhd3HTx6DQEGZ7sBfr2OOOOj3Yi43kMKs9sZknofOexqZ8npMygwWZTX51CipP+YA1OiZJbYYg9lAAAAAElFTkSuQmCC'), -moz-linear-gradient(top, #ffffff 20%, #f6f6f6 50%, #eeeeee 52%, #f4f4f4 100%);
+ background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACgAAAALCAQAAACnzwd+AAAAcklEQVR4AcXMsQFBQQDG4P9tAgC0gJYRQJZgKQMwCqCku6vVAAAA+NJHP4KHOk0aV2pRw61n4BBmyOxKQ8I4ehZeuhd3HTx6DQEGZ7sBfr2OOOOj3Yi43kMKs9sZknofOexqZ8npMygwWZTX51CipP+YA1OiZJbYYg9lAAAAAElFTkSuQmCC'), -ms-linear-gradient(top, #ffffff 20%, #f6f6f6 50%, #eeeeee 52%, #f4f4f4 100%);
+ background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACgAAAALCAQAAACnzwd+AAAAcklEQVR4AcXMsQFBQQDG4P9tAgC0gJYRQJZgKQMwCqCku6vVAAAA+NJHP4KHOk0aV2pRw61n4BBmyOxKQ8I4ehZeuhd3HTx6DQEGZ7sBfr2OOOOj3Yi43kMKs9sZknofOexqZ8npMygwWZTX51CipP+YA1OiZJbYYg9lAAAAAElFTkSuQmCC'), -o-linear-gradient(top, #ffffff 20%, #f6f6f6 50%, #eeeeee 52%, #f4f4f4 100%);
+ background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACgAAAALCAQAAACnzwd+AAAAcklEQVR4AcXMsQFBQQDG4P9tAgC0gJYRQJZgKQMwCqCku6vVAAAA+NJHP4KHOk0aV2pRw61n4BBmyOxKQ8I4ehZeuhd3HTx6DQEGZ7sBfr2OOOOj3Yi43kMKs9sZknofOexqZ8npMygwWZTX51CipP+YA1OiZJbYYg9lAAAAAElFTkSuQmCC'), linear-gradient(top, #ffffff 20%, #f6f6f6 50%, #eeeeee 52%, #f4f4f4 100%);
+ background-size: 17px 6px, 100% 100%;
+ background-position: right center, left top;
+ background-repeat: no-repeat, no-repeat;
+}
+.w2ui-select[readonly],
+.w2ui-select[disabled] {
+ background-image: none;
+ background-color: #f1f1f1 !important;
+ color: #777 !important;
+}
+/*
+* ENUM items
+*/
+.w2ui-list {
+ color: inherit;
+ position: absolute;
+ padding: 0px;
+ margin: 0px;
+ min-height: 25px;
+ overflow: auto;
+ border: 1px solid #c0c0c0;
+ border-radius: 3px;
+ font-size: 6px;
+ line-height: 100%;
+ -webkit-box-sizing: border-box;
+ -moz-box-sizing: border-box;
+ -ms-box-sizing: border-box;
+ -o-box-sizing: border-box;
+ box-sizing: border-box;
+ background-color: #ffffff;
+}
+.w2ui-list input[type=text] {
+ -webkit-box-shadow: none;
+ -moz-box-shadow: none;
+ -ms-box-shadow: none;
+ -o-box-shadow: none;
+ box-shadow: none;
+}
+.w2ui-list ul {
+ list-style-type: none;
+ background-color: black;
+ margin: 0px;
+ padding: 0px;
+}
+.w2ui-list ul li {
+ float: left;
+ margin: 2px 1px 0px 2px;
+ border-radius: 3px;
+ width: auto;
+ padding: 3px 10px 1px 7px;
+ border: 1px solid #88b0d6;
+ background-color: #eff3f5;
+ white-space: nowrap;
+ cursor: default;
+ font-family: verdana;
+ font-size: 11px;
+ line-height: 100%;
+ height: 20px;
+ overflow: hidden;
+ text-overflow: ellipsis;
+ -webkit-box-sizing: border-box;
+ -moz-box-sizing: border-box;
+ -ms-box-sizing: border-box;
+ -o-box-sizing: border-box;
+ box-sizing: border-box;
+}
+.w2ui-list ul li:hover {
+ background-color: #d0dbe1;
+}
+.w2ui-list ul li:last-child {
+ border-radius: 0px;
+ border: 1px solid transparent;
+ background-color: transparent;
+}
+.w2ui-list ul li:last-child input {
+ padding: 1px;
+ padding-top: 0px;
+ margin: 0px;
+ border: 0px;
+ outline: none;
+ height: auto;
+ line-height: 100%;
+ font-size: inherit;
+ font-family: inherit;
+ background-color: transparent;
+}
+.w2ui-list ul li .w2ui-list-remove {
+ float: right;
+ width: 15px;
+ height: 14px;
+ margin: -1px -9px 0px 3px;
+ border-radius: 15px;
+}
+.w2ui-list ul li .w2ui-list-remove:hover {
+ background-color: #D77F7F;
+ color: white;
+}
+.w2ui-list ul li .w2ui-list-remove:before {
+ position: relative;
+ top: 0px;
+ padding: 0px;
+ margin: 0px;
+ left: 5px;
+ color: inherit;
+ opacity: 0.7;
+ text-shadow: inherit;
+ font-size: inherit;
+ font-variant: small-caps;
+ content: 'x';
+ line-height: 100%;
+}
+.w2ui-list ul li > span.file-size {
+ pointer-events: none;
+ color: #777;
+}
+.w2ui-list .w2ui-enum-placeholder {
+ display: inline;
+ position: absolute;
+ pointer-events: none;
+ color: #999;
+ -webkit-box-sizing: border-box;
+ -moz-box-sizing: border-box;
+ -ms-box-sizing: border-box;
+ -o-box-sizing: border-box;
+ box-sizing: border-box;
+}
+.w2ui-list.w2ui-file-dragover {
+ background-color: #E4FFDA;
+ border: 1px solid #93E07D;
+}
+/*************************************************
+* ---- Layout ----
+*/
+.w2ui-layout {
+ overflow: hidden !important;
+ -webkit-box-sizing: border-box;
+ -moz-box-sizing: border-box;
+ -ms-box-sizing: border-box;
+ -o-box-sizing: border-box;
+ box-sizing: border-box;
+}
+.w2ui-layout * {
+ -webkit-box-sizing: border-box;
+ -moz-box-sizing: border-box;
+ -ms-box-sizing: border-box;
+ -o-box-sizing: border-box;
+ box-sizing: border-box;
+}
+.w2ui-layout > div {
+ position: absolute;
+ overflow: hidden;
+ border: 0px;
+ margin: 0px;
+ padding: 0px;
+ outline: 0px;
+ -webkit-box-sizing: border-box;
+ -moz-box-sizing: border-box;
+ -ms-box-sizing: border-box;
+ -o-box-sizing: border-box;
+ box-sizing: border-box;
+}
+.w2ui-layout > div .w2ui-panel {
+ display: none;
+ position: absolute;
+ z-index: 120;
+}
+.w2ui-layout > div .w2ui-panel .w2ui-panel-title {
+ position: absolute;
+ left: 0px;
+ top: 0px;
+ right: 0px;
+ padding: 5px;
+ background-image: -webkit-linear-gradient(#dae6f3, #c2d5ed);
+ background-image: -moz-linear-gradient(#dae6f3, #c2d5ed);
+ background-image: -ms-linear-gradient(#dae6f3, #c2d5ed);
+ background-image: -o-linear-gradient(#dae6f3, #c2d5ed);
+ background-image: linear-gradient(#dae6f3, #c2d5ed);
+ filter: progid:dximagetransform.microsoft.gradient(startColorstr='#ffdae6f3', endColorstr='#ffc2d5ed', GradientType=0);
+ border: 1px solid #b9cee9;
+ border-bottom: 1px solid #99bbe8;
+}
+.w2ui-layout > div .w2ui-panel .w2ui-panel-tabs {
+ position: absolute;
+ left: 0px;
+ top: 0px;
+ right: 0px;
+ z-index: 2;
+ display: none;
+ overflow: hidden;
+ background-color: #fafafa;
+ padding: 4px 0px;
+}
+.w2ui-layout > div .w2ui-panel .w2ui-panel-tabs > .w2ui-tab.active {
+ background-color: #f2f2f2;
+}
+.w2ui-layout > div .w2ui-panel .w2ui-panel-toolbar {
+ position: absolute;
+ left: 0px;
+ top: 0px;
+ right: 0px;
+ z-index: 2;
+ display: none;
+ overflow: hidden;
+ background-color: #fafafa;
+ border-bottom: 1px solid silver;
+ padding: 4px;
+}
+.w2ui-layout > div .w2ui-panel .w2ui-panel-content {
+ position: absolute;
+ left: 0px;
+ top: 0px;
+ right: 0px;
+ bottom: 0px;
+ z-index: 1;
+ color: inherit;
+ background-color: #f2f2f2;
+}
+.w2ui-layout > div .w2ui-resizer {
+ display: none;
+ position: absolute;
+ z-index: 121;
+ background-color: transparent;
+}
+.w2ui-layout > div .w2ui-resizer:hover,
+.w2ui-layout > div .w2ui-resizer.active {
+ background-color: #c8cad1;
+}
+/*************************************************
+* ---- Grid ----
+*/
+.w2ui-grid {
+ position: relative;
+ border: 1px solid #c0c0c0;
+ border-radius: 2px;
+ overflow: hidden !important;
+}
+.w2ui-grid > div {
+ position: absolute;
+ overflow: hidden;
+}
+.w2ui-grid .w2ui-grid-header {
+ position: absolute;
+ border-bottom: 1px solid #99bbe8 !important;
+ height: 28px;
+ overflow: hidden;
+ color: #444444;
+ font-size: 13px;
+ text-align: center;
+ padding: 7px;
+ background-image: -webkit-linear-gradient(#dae6f3, #c2d5ed);
+ background-image: -moz-linear-gradient(#dae6f3, #c2d5ed);
+ background-image: -ms-linear-gradient(#dae6f3, #c2d5ed);
+ background-image: -o-linear-gradient(#dae6f3, #c2d5ed);
+ background-image: linear-gradient(#dae6f3, #c2d5ed);
+ filter: progid:dximagetransform.microsoft.gradient(startColorstr='#ffdae6f3', endColorstr='#ffc2d5ed', GradientType=0);
+ border-top-left-radius: 2px;
+ border-top-right-radius: 2px;
+}
+.w2ui-grid .w2ui-grid-toolbar {
+ position: absolute;
+ border-bottom: 1px solid #c0c0c0;
+ background-color: #eaeaea;
+ height: 38px;
+ padding: 6px 1px 4px 1px;
+ margin: 0px;
+ box-shadow: 0px 1px 2px #dddddd;
+}
+.w2ui-grid .w2ui-toolbar-search {
+ width: 160px;
+ margin-right: 3px;
+}
+.w2ui-grid .w2ui-toolbar-search .w2ui-search-all {
+ outline: none !important;
+ width: 160px !important;
+ border-radius: 3px !important;
+ line-height: normal !important;
+ height: 23px !important;
+ border: 1px solid #b9b9b9 !important;
+ color: #000000 !important;
+ background-color: #ffffff !important;
+ padding: 3px 18px 3px 21px !important;
+ margin: 0px !important;
+ margin-top: 1px !important;
+}
+.w2ui-grid .w2ui-toolbar-search .w2ui-search-down {
+ position: absolute;
+ margin-top: -7px;
+ margin-left: 4px;
+}
+.w2ui-grid .w2ui-toolbar-search .w2ui-search-clear {
+ position: absolute;
+ width: 16px;
+ height: 16px;
+ margin-top: -8px;
+ margin-left: -20px;
+ border-radius: 15px;
+ cursor: default;
+}
+.w2ui-grid .w2ui-toolbar-search .w2ui-search-clear:hover {
+ background-color: #D77F7F;
+ color: white;
+}
+.w2ui-grid .w2ui-toolbar-search .w2ui-search-clear:before {
+ position: relative;
+ top: 2px;
+ left: 5px;
+ opacity: 0.6;
+ color: inherit;
+ text-shadow: inherit;
+ content: 'x';
+ cursor: default;
+}
+.w2ui-grid .w2ui-grid-body {
+ position: absolute;
+ overflow: hidden;
+ padding: 0px;
+ background-color: #ffffff;
+ -webkit-user-select: none;
+ -moz-user-select: none;
+ -ms-user-select: none;
+ -o-user-select: none;
+ user-select: none;
+}
+.w2ui-grid .w2ui-grid-body input,
+.w2ui-grid .w2ui-grid-body select,
+.w2ui-grid .w2ui-grid-body textarea {
+ user-select: text;
+ -webkit-user-select: text;
+ -moz-user-select: text;
+ -ms-user-select: text;
+ -o-user-select: text;
+}
+.w2ui-grid .w2ui-grid-body div.w2ui-input {
+ user-select: tex;
+ -webkit-user-select: tex;
+ -moz-user-select: tex;
+ -ms-user-select: tex;
+ -o-user-select: tex;
+ background-color: white;
+ padding: 4px 2px;
+ border: 1px solid transparent;
+ width: 100%;
+ height: 100%;
+ pointer-events: auto;
+ outline: none;
+ white-space: pre;
+ overflow: hidden;
+}
+.w2ui-grid .w2ui-grid-body .w2ui-grid-columns,
+.w2ui-grid .w2ui-grid-body .w2ui-grid-fcolumns {
+ overflow: hidden;
+ position: absolute;
+ left: 0px;
+ top: 0px;
+ right: 0px;
+ box-shadow: 0px 1px 4px #dddddd;
+ height: auto;
+}
+.w2ui-grid .w2ui-grid-body .w2ui-grid-columns table,
+.w2ui-grid .w2ui-grid-body .w2ui-grid-fcolumns table {
+ height: auto;
+}
+.w2ui-grid .w2ui-grid-body .w2ui-grid-columns .w2ui-resizer,
+.w2ui-grid .w2ui-grid-body .w2ui-grid-fcolumns .w2ui-resizer {
+ position: absolute;
+ z-index: 1000;
+ display: block;
+ background-image: none;
+ background-color: rgba(0, 0, 0, 0);
+ /* needed for IE */
+ padding: 0px;
+ margin: 0px;
+ width: 6px;
+ height: 12px;
+ cursor: col-resize;
+}
+.w2ui-grid .w2ui-grid-body .w2ui-grid-records,
+.w2ui-grid .w2ui-grid-body .w2ui-grid-frecords {
+ position: absolute;
+ left: 0px;
+ right: 0px;
+ top: 0px;
+ bottom: 0px;
+}
+.w2ui-grid .w2ui-grid-body .w2ui-grid-records table tr.w2ui-odd,
+.w2ui-grid .w2ui-grid-body .w2ui-grid-frecords table tr.w2ui-odd {
+ color: inherit;
+ background-color: #ffffff;
+}
+.w2ui-grid .w2ui-grid-body .w2ui-grid-records table tr.w2ui-odd:hover,
+.w2ui-grid .w2ui-grid-body .w2ui-grid-frecords table tr.w2ui-odd:hover,
+.w2ui-grid .w2ui-grid-body .w2ui-grid-records table tr.w2ui-odd.w2ui-record-hover,
+.w2ui-grid .w2ui-grid-body .w2ui-grid-frecords table tr.w2ui-odd.w2ui-record-hover {
+ color: inherit;
+ background-color: #e6f0ff;
+}
+.w2ui-grid .w2ui-grid-body .w2ui-grid-records table tr.w2ui-odd.w2ui-empty-record:hover,
+.w2ui-grid .w2ui-grid-body .w2ui-grid-frecords table tr.w2ui-odd.w2ui-empty-record:hover {
+ background-color: #ffffff;
+}
+.w2ui-grid .w2ui-grid-body .w2ui-grid-records table tr.w2ui-even,
+.w2ui-grid .w2ui-grid-body .w2ui-grid-frecords table tr.w2ui-even {
+ color: inherit;
+ background-color: #f3f6fa;
+}
+.w2ui-grid .w2ui-grid-body .w2ui-grid-records table tr.w2ui-even:hover,
+.w2ui-grid .w2ui-grid-body .w2ui-grid-frecords table tr.w2ui-even:hover,
+.w2ui-grid .w2ui-grid-body .w2ui-grid-records table tr.w2ui-even.w2ui-record-hover,
+.w2ui-grid .w2ui-grid-body .w2ui-grid-frecords table tr.w2ui-even.w2ui-record-hover {
+ color: inherit;
+ background-color: #e6f0ff;
+}
+.w2ui-grid .w2ui-grid-body .w2ui-grid-records table tr.w2ui-even.w2ui-empty-record:hover,
+.w2ui-grid .w2ui-grid-body .w2ui-grid-frecords table tr.w2ui-even.w2ui-empty-record:hover {
+ background-color: #f3f6fa;
+}
+.w2ui-grid .w2ui-grid-body .w2ui-grid-records table tr.w2ui-selected,
+.w2ui-grid .w2ui-grid-body .w2ui-grid-frecords table tr.w2ui-selected,
+.w2ui-grid .w2ui-grid-body .w2ui-grid-records table tr td.w2ui-selected,
+.w2ui-grid .w2ui-grid-body .w2ui-grid-frecords table tr td.w2ui-selected {
+ color: #000000 !important;
+ background-color: #b6d5ff !important;
+}
+.w2ui-grid .w2ui-grid-body .w2ui-grid-records table tr.w2ui-inactive,
+.w2ui-grid .w2ui-grid-body .w2ui-grid-frecords table tr.w2ui-inactive,
+.w2ui-grid .w2ui-grid-body .w2ui-grid-records table tr td.w2ui-inactive,
+.w2ui-grid .w2ui-grid-body .w2ui-grid-frecords table tr td.w2ui-inactive {
+ background-color: #d8dee7 !important;
+}
+.w2ui-grid .w2ui-grid-body .w2ui-grid-records .w2ui-expanded1,
+.w2ui-grid .w2ui-grid-body .w2ui-grid-frecords .w2ui-expanded1 {
+ height: 0px;
+ border-bottom: 1px solid #b2bac0;
+}
+.w2ui-grid .w2ui-grid-body .w2ui-grid-records .w2ui-expanded1 > div,
+.w2ui-grid .w2ui-grid-body .w2ui-grid-frecords .w2ui-expanded1 > div {
+ height: 0px;
+ border: 0px;
+ transition: height .3s, opacity .3s;
+}
+.w2ui-grid .w2ui-grid-body .w2ui-grid-records .w2ui-expanded2,
+.w2ui-grid .w2ui-grid-body .w2ui-grid-frecords .w2ui-expanded2 {
+ height: 0px;
+ border-radius: 0px;
+ border-bottom: 1px solid #b2bac0;
+}
+.w2ui-grid .w2ui-grid-body .w2ui-grid-records .w2ui-expanded2 > div,
+.w2ui-grid .w2ui-grid-body .w2ui-grid-frecords .w2ui-expanded2 > div {
+ height: 0px;
+ border: 0px;
+ transition: height .3s, opacity .3s;
+}
+.w2ui-grid .w2ui-grid-body .w2ui-grid-records .w2ui-load-more,
+.w2ui-grid .w2ui-grid-body .w2ui-grid-frecords .w2ui-load-more {
+ border-top: 1px solid #d6d5d7;
+ cursor: pointer;
+}
+.w2ui-grid .w2ui-grid-body .w2ui-grid-records .w2ui-load-more > div,
+.w2ui-grid .w2ui-grid-body .w2ui-grid-frecords .w2ui-load-more > div {
+ text-align: center;
+ color: #777777;
+ background-color: rgba(233, 237, 243, 0.5);
+ padding: 10px 0px 15px 0px;
+ border-top: 1px solid #ffffff;
+}
+.w2ui-grid .w2ui-grid-body .w2ui-grid-records .w2ui-load-more > div:hover,
+.w2ui-grid .w2ui-grid-body .w2ui-grid-frecords .w2ui-load-more > div:hover {
+ color: inherit;
+ background-color: #e6f0ff;
+}
+.w2ui-grid .w2ui-grid-body table {
+ border-spacing: 0px;
+ border-collapse: collapse;
+ table-layout: fixed;
+ width: 1px;
+}
+.w2ui-grid .w2ui-grid-body table .w2ui-head {
+ margin: 0px;
+ padding: 0px;
+ border-right: 1px solid #c5c5c5;
+ border-bottom: 1px solid #c5c5c5;
+ color: #000000;
+ background-image: -webkit-linear-gradient(#f9f9f9, #e4e4e4);
+ background-image: -moz-linear-gradient(#f9f9f9, #e4e4e4);
+ background-image: -ms-linear-gradient(#f9f9f9, #e4e4e4);
+ background-image: -o-linear-gradient(#f9f9f9, #e4e4e4);
+ background-image: linear-gradient(#f9f9f9, #e4e4e4);
+ filter: progid:dximagetransform.microsoft.gradient(startColorstr='#fff9f9f9', endColorstr='#ffe4e4e4', GradientType=0);
+}
+.w2ui-grid .w2ui-grid-body table .w2ui-head > div {
+ padding: 7px 3px;
+ white-space: nowrap;
+ text-overflow: ellipsis;
+ overflow: hidden;
+ position: relative;
+}
+.w2ui-grid .w2ui-grid-body table .w2ui-head.w2ui-col-intersection {
+ border-right-color: #72b2ff;
+}
+.w2ui-grid .w2ui-grid-body table .w2ui-head.w2ui-reorder-cols-head:hover {
+ cursor: move;
+}
+.w2ui-grid .w2ui-grid-body table .w2ui-head .col-intersection-marker {
+ padding: 0;
+ position: absolute;
+ height: 100%;
+ top: 0;
+}
+.w2ui-grid .w2ui-grid-body table .w2ui-head .col-intersection-marker.left {
+ left: 0;
+ margin-left: -5px;
+}
+.w2ui-grid .w2ui-grid-body table .w2ui-head .col-intersection-marker.right {
+ right: 0;
+ margin-right: -5px;
+}
+.w2ui-grid .w2ui-grid-body table .w2ui-head .col-intersection-marker .top-marker {
+ position: absolute;
+ top: 0;
+ height: 0;
+ width: 0;
+ border-top: 5px solid #72b2ff;
+ border-left: 5px solid transparent;
+ border-right: 5px solid transparent;
+}
+.w2ui-grid .w2ui-grid-body table .w2ui-head .col-intersection-marker .bottom-marker {
+ position: absolute;
+ bottom: 0;
+ height: 0;
+ width: 0;
+ border-bottom: 5px solid #72b2ff;
+ border-left: 5px solid transparent;
+ border-right: 5px solid transparent;
+}
+.w2ui-grid .w2ui-grid-body table td {
+ border-right: 1px solid #d6d5d7;
+ border-bottom: 0px solid #d6d5d7;
+ cursor: default;
+ overflow: hidden;
+}
+.w2ui-grid .w2ui-grid-body table td.w2ui-soft-span,
+.w2ui-grid .w2ui-grid-body table td.w2ui-soft-hidden {
+ border-right-color: transparent;
+}
+.w2ui-grid .w2ui-grid-body table td.w2ui-grid-data {
+ margin: 0px;
+ padding: 0px;
+}
+.w2ui-grid .w2ui-grid-body table td.w2ui-grid-data .w2ui-info {
+ position: relative;
+ top: 1px;
+ font-size: 14px;
+ color: #8D99A7;
+ cursor: pointer;
+ width: 16px;
+ display: inline-block;
+ margin-right: 2px;
+ text-align: center;
+}
+.w2ui-grid .w2ui-grid-body table td.w2ui-grid-data > div {
+ padding: 3px 3px 3px 3px;
+ overflow: hidden;
+ white-space: nowrap;
+ text-overflow: ellipsis;
+}
+.w2ui-grid .w2ui-grid-body table td.w2ui-grid-data > div.flexible-record {
+ height: auto;
+ overflow: visible;
+ white-space: normal;
+}
+.w2ui-grid .w2ui-grid-body table td.w2ui-grid-data .w2ui-show-children {
+ width: 16px;
+ height: 10px;
+ display: inline-block;
+ position: relative;
+ top: -1px;
+ cursor: pointer;
+}
+.w2ui-grid .w2ui-grid-body table td:last-child {
+ border-right: 0px;
+}
+.w2ui-grid .w2ui-grid-body table .w2ui-col-number {
+ width: 34px;
+ color: #777777;
+ background-color: rgba(233, 237, 243, 0.5);
+}
+.w2ui-grid .w2ui-grid-body table .w2ui-col-number div {
+ padding: 0px 7px 0px 3px;
+ text-align: right;
+}
+.w2ui-grid .w2ui-grid-body table .w2ui-col-number.w2ui-head {
+ cursor: pointer;
+}
+.w2ui-grid .w2ui-grid-body table .w2ui-col-select {
+ width: 26px;
+}
+.w2ui-grid .w2ui-grid-body table .w2ui-col-select div {
+ padding: 0px 0px;
+ text-align: center;
+ overflow: hidden;
+}
+.w2ui-grid .w2ui-grid-body table .w2ui-col-select div input[type=checkbox] {
+ margin-top: 0px;
+ margin-bottom: 0px;
+ position: relative;
+}
+.w2ui-grid .w2ui-grid-body table .w2ui-col-expand {
+ width: 26px;
+}
+.w2ui-grid .w2ui-grid-body table .w2ui-col-expand div {
+ padding: 0px 0px;
+ text-align: center;
+ font-weight: bold;
+}
+.w2ui-grid .w2ui-grid-body table .w2ui-col-selected {
+ background-color: #d1d1d1 !important;
+}
+.w2ui-grid .w2ui-grid-body table .w2ui-row-selected {
+ background-color: #d1d1d1 !important;
+}
+.w2ui-grid .w2ui-grid-body div.w2ui-col-header {
+ height: auto !important;
+ width: 100%;
+ overflow: hidden;
+ padding-right: 10px !important;
+}
+.w2ui-grid .w2ui-grid-body div.w2ui-col-header > div.w2ui-sort-up {
+ border: 4px solid transparent;
+ border-bottom: 5px solid #8D99A7;
+ margin-top: -2px;
+ margin-right: -7px;
+ float: right;
+}
+.w2ui-grid .w2ui-grid-body div.w2ui-col-header > div.w2ui-sort-down {
+ border: 4px solid transparent;
+ border-top: 5px solid #8D99A7;
+ margin-top: 2px;
+ margin-right: -7px;
+ float: right;
+}
+.w2ui-grid .w2ui-grid-body .w2ui-col-group {
+ text-align: center;
+}
+.w2ui-grid .w2ui-grid-body .w2ui-grid-scroll1 {
+ position: absolute;
+ left: 0px;
+ bottom: 0px;
+ border-top: 1px solid #ddd;
+ border-right: 1px solid #ddd;
+ background-color: #FAFAFA;
+}
+.w2ui-grid .w2ui-grid-empty-msg {
+ position: absolute;
+ top: 27px;
+ left: 0;
+ right: 0;
+ bottom: 0;
+ background-color: rgba(255, 255, 255, 0.65);
+}
+.w2ui-grid .w2ui-grid-empty-msg > div {
+ position: absolute;
+ left: 0;
+ right: 0;
+ top: 45%;
+ transform: translateY(-45%);
+ text-align: center;
+ font-size: 13px;
+ color: #666;
+}
+.w2ui-grid .w2ui-changed {
+ background: url(data:image/gif;base64,R0lGODlhCgAKAJEAALAABf///wAAAAAAACH5BAEAAAIALAAAAAAKAAoAAAIPlI8Hy8mbxIsSUnup3rQAADs=) no-repeat top right;
+}
+.w2ui-grid .w2ui-edit-box {
+ position: absolute;
+ z-index: 1001;
+ border: 2px solid #6299DA;
+ pointer-events: auto;
+}
+.w2ui-grid .w2ui-editable {
+ overflow: hidden;
+ height: 100% !important;
+ margin: 0px !important;
+ padding: 0px !important;
+}
+.w2ui-grid .w2ui-editable input {
+ border: 0px;
+ border-radius: 0px;
+ margin: 0px;
+ padding: 4px 3px;
+ width: 100%;
+ height: 100%;
+}
+.w2ui-grid .w2ui-editable input.w2ui-select {
+ outline: none !important;
+ background: #fff;
+}
+.w2ui-grid .w2ui-grid-summary {
+ position: absolute;
+ box-shadow: 0px -1px 4px #aaaaaa;
+}
+.w2ui-grid .w2ui-grid-summary table {
+ color: inherit;
+}
+.w2ui-grid .w2ui-grid-summary table .w2ui-odd {
+ background-color: #eef5eb;
+}
+.w2ui-grid .w2ui-grid-summary table .w2ui-even {
+ background-color: #f8fff5;
+}
+.w2ui-grid .w2ui-grid-footer {
+ position: absolute;
+ margin: 0px;
+ padding: 0px;
+ text-align: center;
+ height: 24px;
+ overflow: hidden;
+ user-select: text;
+ -webkit-user-select: text;
+ -moz-user-select: text;
+ -ms-user-select: text;
+ -o-user-select: text;
+ box-shadow: 0px -1px 4px #eeeeee;
+ color: #444444;
+ background-color: #f8f8f8;
+ border-top: 1px solid #dddddd;
+ border-bottom-left-radius: 2px;
+ border-bottom-right-radius: 2px;
+}
+.w2ui-grid .w2ui-grid-footer .w2ui-footer-left {
+ float: left;
+ padding-top: 5px;
+ padding-left: 5px;
+}
+.w2ui-grid .w2ui-grid-footer .w2ui-footer-right {
+ float: right;
+ padding-top: 5px;
+ padding-right: 5px;
+}
+.w2ui-grid .w2ui-grid-footer .w2ui-footer-center {
+ padding: 2px;
+ text-align: center;
+}
+.w2ui-grid .w2ui-grid-footer .w2ui-footer-center .w2ui-footer-nav {
+ width: 110px;
+ margin: 0 auto;
+ padding: 0px;
+ text-align: center;
+}
+.w2ui-grid .w2ui-grid-footer .w2ui-footer-center .w2ui-footer-nav input[type=text] {
+ padding: 1px 2px 2px 2px;
+ border-radius: 3px;
+ width: 40px;
+ text-align: center;
+}
+.w2ui-grid .w2ui-grid-footer .w2ui-footer-center .w2ui-footer-nav a.w2ui-footer-btn {
+ display: inline-block;
+ border-radius: 3px;
+ cursor: pointer;
+ font-size: 11px;
+ line-height: 16px;
+ padding: 1px 5px;
+ width: 30px;
+ height: 18px;
+ margin-top: -1px;
+ color: #000000;
+ background-color: transparent;
+}
+.w2ui-grid .w2ui-grid-footer .w2ui-footer-center .w2ui-footer-nav a.w2ui-footer-btn:hover {
+ color: #000000;
+ background-color: #aec8ff;
+}
+.w2ui-grid .w2ui-grid-focus-input {
+ position: absolute;
+ top: 0;
+ right: 0;
+ z-index: -1;
+ opacity: 0;
+ overflow: hidden;
+ padding: 0px;
+ margin: 0px;
+ width: 1px;
+ height: 1px;
+ resize: none;
+ border: 0px;
+}
+/* SpeadSheet */
+.w2ui-ss .w2ui-grid-body .w2ui-grid-records table tr td.w2ui-selected {
+ background-color: #EEF4FE !important;
+}
+.w2ui-ss .w2ui-grid-body .w2ui-grid-records table tr td.w2ui-inactive {
+ background-color: #F4F6F9 !important;
+}
+.w2ui-ss .w2ui-grid-body .w2ui-grid-records table td {
+ border-right-width: 1px;
+ border-bottom: 1px solid #efefef;
+}
+.w2ui-ss .w2ui-grid-body .w2ui-grid-records table tr.w2ui-odd,
+.w2ui-ss .w2ui-grid-body .w2ui-grid-records table tr.w2ui-even,
+.w2ui-ss .w2ui-grid-body .w2ui-grid-records table tr.w2ui-odd:hover,
+.w2ui-ss .w2ui-grid-body .w2ui-grid-records table tr.w2ui-even:hover {
+ background-color: inherit;
+}
+.w2ui-ss .w2ui-grid-body .w2ui-grid-records table tr:first-child td {
+ border-top: 0px;
+ border-bottom: 0px;
+}
+.w2ui-ss .w2ui-grid-body .w2ui-grid-frecords table tr td.w2ui-selected {
+ background-color: #EEF4FE !important;
+}
+.w2ui-ss .w2ui-grid-body .w2ui-grid-frecords table tr td.w2ui-inactive {
+ background-color: #F4F6F9 !important;
+}
+.w2ui-ss .w2ui-grid-body .w2ui-grid-frecords table td {
+ border-right-width: 1px;
+ border-bottom: 1px solid #efefef;
+}
+.w2ui-ss .w2ui-grid-body .w2ui-grid-frecords table tr.w2ui-odd,
+.w2ui-ss .w2ui-grid-body .w2ui-grid-frecords table tr.w2ui-even,
+.w2ui-ss .w2ui-grid-body .w2ui-grid-frecords table tr.w2ui-odd:hover,
+.w2ui-ss .w2ui-grid-body .w2ui-grid-frecords table tr.w2ui-even:hover {
+ background-color: inherit;
+}
+.w2ui-ss .w2ui-grid-body .w2ui-grid-frecords table tr:first-child td {
+ border-bottom: 0px;
+}
+.w2ui-ss .w2ui-grid-body .w2ui-selection {
+ position: absolute;
+ z-index: 1000;
+ border: 2px solid #6299DA;
+ /* #457FC2; */
+ pointer-events: none;
+}
+.w2ui-ss .w2ui-grid-body .w2ui-selection .w2ui-selection-resizer {
+ cursor: crosshair;
+ position: absolute;
+ bottom: 0px;
+ right: 0px;
+ width: 6px;
+ height: 6px;
+ margin-right: -3px;
+ margin-bottom: -3px;
+ background-color: #457FC2;
+ border: 0.5px solid #fff;
+ outline: 1px solid white;
+ pointer-events: auto;
+}
+.w2ui-ss .w2ui-grid-body .w2ui-selection.w2ui-inactive {
+ border: 2px solid #C0C2C5;
+}
+.w2ui-ss .w2ui-grid-body .w2ui-selection.w2ui-inactive .w2ui-selection-resizer {
+ background-color: #B0B0B0;
+}
+.w2ui-ss .w2ui-grid-body .w2ui-soft-range {
+ position: absolute;
+ pointer-events: none;
+ white-space: nowrap;
+ overflow: hidden;
+ text-overflow: ellipsis;
+}
+.w2ui-ss .w2ui-grid-body .w2ui-changed {
+ background: inherit;
+ /* do not show changed for spreadsheet */
+}
+.w2ui-info-bubble table {
+ font-size: 11px;
+ font-family: Verdana, Arial, sans-serif;
+ color: white;
+ text-shadow: 1px 1px solid #999;
+}
+.w2ui-info-bubble table tr td:first-child {
+ white-space: nowrap;
+ padding: 2px;
+ padding-right: 10px;
+ color: #ddd;
+ vertical-align: top;
+}
+.w2ui-info-bubble table tr td:last-child {
+ white-space: pre;
+ padding: 2px;
+}
+.w2ui-overlay .w2ui-select-field {
+ padding: 4px 0px;
+ cursor: default;
+}
+.w2ui-overlay .w2ui-select-field table {
+ font-size: 11px;
+ font-family: Verdana, Arial, sans-serif;
+ border-spacing: 0px;
+ border-collapse: border-collapse;
+}
+.w2ui-overlay .w2ui-select-field table tr {
+ height: 27px;
+}
+.w2ui-overlay .w2ui-select-field table tr:hover {
+ background-color: #b6d5ff;
+}
+.w2ui-overlay .w2ui-select-field table tr td:nth-child(1) {
+ width: 26px;
+ padding-right: 6px;
+ text-align: right;
+ color: #888;
+}
+.w2ui-overlay .w2ui-select-field table tr td:nth-child(2) {
+ padding: 3px 20px 3px 0px;
+}
+.w2ui-overlay .w2ui-col-on-off {
+ padding: 4px 0px;
+}
+.w2ui-overlay .w2ui-col-on-off table {
+ border-spacing: 0px;
+ border-collapse: border-collapse;
+}
+.w2ui-overlay .w2ui-col-on-off table tr:hover {
+ background-color: #b6d5ff;
+}
+.w2ui-overlay .w2ui-col-on-off table td input[type=checkbox] {
+ margin: 3px 2px 2px 2px;
+}
+.w2ui-overlay .w2ui-col-on-off table td label {
+ display: block;
+ padding: 3px 0px;
+ padding-right: 10px;
+}
+.w2ui-overlay .w2ui-col-on-off table td:first-child {
+ padding: 4px 0px 4px 6px;
+}
+.w2ui-overlay .w2ui-col-on-off table td:last-child {
+ padding: 4px 6px 4px 0px;
+}
+.w2ui-overlay .w2ui-grid-searches {
+ text-align: left;
+ padding: 0px;
+ border-top: 0px;
+ background-color: #f7f6f0;
+}
+.w2ui-overlay .w2ui-grid-searches table {
+ padding: 4px;
+ padding-top: 12px;
+ border-collapse: border-collapse;
+}
+.w2ui-overlay .w2ui-grid-searches table td {
+ padding: 4px;
+ /* for IE */
+}
+.w2ui-overlay .w2ui-grid-searches table td.close-btn {
+ width: 20px;
+ padding-right: 20px;
+}
+.w2ui-overlay .w2ui-grid-searches table td.close-btn button {
+ min-width: 24px;
+ height: 24px;
+ padding-top: 5px !important;
+}
+.w2ui-overlay .w2ui-grid-searches table td.caption {
+ text-align: right;
+ padding-right: 5px;
+ border-right: 1px solid #e8e8e3;
+}
+.w2ui-overlay .w2ui-grid-searches table td.operator {
+ text-align: left;
+ padding: 0px 10px;
+ padding-right: 5px;
+ border-right: 1px solid #e8e8e3;
+ height: 31px;
+}
+.w2ui-overlay .w2ui-grid-searches table td.operator select {
+ width: 100%;
+ color: black;
+}
+.w2ui-overlay .w2ui-grid-searches table td.operator select::-ms-expand {
+ display: none;
+}
+.w2ui-overlay .w2ui-grid-searches table td.value {
+ padding-right: 5px;
+ padding-left: 5px;
+}
+.w2ui-overlay .w2ui-grid-searches table td.value input[type=text] {
+ border-radius: 3px;
+ padding: 3px;
+ margin-right: 3px;
+ height: 23px;
+}
+.w2ui-overlay .w2ui-grid-searches table td.value select {
+ padding: 3px;
+ margin-right: 3px;
+ height: 23px;
+}
+.w2ui-overlay .w2ui-grid-searches table td.actions {
+ border-right: 0px;
+}
+.w2ui-overlay .w2ui-grid-searches table td.actions > div {
+ margin: -7px;
+ margin-top: 15px;
+ padding: 13px 0px;
+ text-align: center;
+ background-color: #efefe9;
+ border-top: 1px solid #e8e8e3;
+}
+/*************************************************
+* ---- Popup ----
+*/
+.w2ui-popup {
+ position: fixed;
+ z-index: 1600;
+ overflow: hidden;
+ font-family: Verdana, Arial, sans-serif;
+ border-radius: 6px;
+ padding: 0px;
+ margin: 0px;
+ border: 1px solid #777777;
+ background-color: #eeeeee;
+ box-shadow: 0px 0px 25px #555555;
+}
+.w2ui-popup,
+.w2ui-popup * {
+ -webkit-box-sizing: border-box;
+ -moz-box-sizing: border-box;
+ -ms-box-sizing: border-box;
+ -o-box-sizing: border-box;
+ box-sizing: border-box;
+}
+.w2ui-popup .w2ui-popup-title {
+ padding: 6px;
+ border-radius: 6px 6px 0px 0px;
+ background-image: -webkit-linear-gradient(#ececec, #dfdfdf);
+ background-image: -moz-linear-gradient(#ececec, #dfdfdf);
+ background-image: -ms-linear-gradient(#ececec, #dfdfdf);
+ background-image: -o-linear-gradient(#ececec, #dfdfdf);
+ background-image: linear-gradient(#ececec, #dfdfdf);
+ filter: progid:dximagetransform.microsoft.gradient(startColorstr='#ffececec', endColorstr='#ffdfdfdf', GradientType=0);
+ border-bottom: 2px solid #bfbfbf;
+ position: absolute;
+ overflow: hidden;
+ height: 32px;
+ left: 0px;
+ right: 0px;
+ top: 0px;
+ text-overflow: ellipsis;
+ text-align: center;
+ -webkit-user-select: none;
+ -moz-user-select: none;
+ -ms-user-select: none;
+ -o-user-select: none;
+ user-select: none;
+ cursor: move;
+ font-size: 15px;
+ color: #555555;
+ z-index: 300;
+}
+.w2ui-popup .w2ui-popup-button {
+ float: right;
+ width: 18px;
+ height: 18px;
+ cursor: pointer;
+ overflow: hidden;
+ padding: 0px;
+ margin: 0px 3px 0px 0px;
+ background: url(data:image/png;base64,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) no-repeat center left;
+ background-position: 0px 0px;
+ color: transparent !important;
+ border-radius: 3px;
+ border: 1px solid transparent;
+}
+.w2ui-popup .w2ui-popup-close {
+ margin-top: 0px;
+ background-position: -32px 0px;
+}
+.w2ui-popup .w2ui-popup-close:hover {
+ background-color: #cccccc;
+ border: 1px solid #aaaaaa;
+}
+.w2ui-popup .w2ui-popup-max {
+ background-position: -16px 0px;
+}
+.w2ui-popup .w2ui-popup-max:hover {
+ background-color: #cccccc;
+ border: 1px solid #aaaaaa;
+}
+.w2ui-popup .w2ui-box,
+.w2ui-popup .w2ui-box-temp {
+ position: absolute;
+ left: 0px;
+ right: 0px;
+ top: 32px;
+ bottom: 52px;
+ z-index: 100;
+}
+.w2ui-popup .w2ui-popup-body {
+ font-size: 12px;
+ line-height: 130%;
+ padding: 0px 7px 7px 7px;
+ color: #000000;
+ background-color: #eeeeee;
+ position: absolute;
+ overflow: auto;
+ width: 100%;
+ height: 100%;
+}
+.w2ui-popup .w2ui-popup-buttons {
+ padding: 12px;
+ border-radius: 0px 0px 6px 6px;
+ border-top: 1px solid #d5d8d8;
+ background-color: #f1f1f1;
+ text-align: center;
+ position: absolute;
+ overflow: hidden;
+ height: 52px;
+ left: 0px;
+ right: 0px;
+ bottom: 0px;
+ z-index: 200;
+}
+.w2ui-popup .w2ui-popup-no-title {
+ border-top-left-radius: 6px;
+ border-top-right-radius: 6px;
+ top: 0px !important;
+}
+.w2ui-popup .w2ui-popup-no-buttons {
+ border-bottom-left-radius: 6px;
+ border-bottom-right-radius: 6px;
+ bottom: 0px !important;
+}
+.w2ui-popup .w2ui-alert-msg,
+.w2ui-popup .w2ui-confirm-msg {
+ font-size: 13px;
+ line-height: 1.5;
+}
+/*************************************************
+* ---- Sidebar ----
+*/
+.w2ui-sidebar {
+ position: relative;
+ cursor: default;
+ overflow: hidden !important;
+ background-color: #edf1f6 !important;
+ -webkit-box-sizing: border-box;
+ -moz-box-sizing: border-box;
+ -ms-box-sizing: border-box;
+ -o-box-sizing: border-box;
+ box-sizing: border-box;
+}
+.w2ui-sidebar * {
+ -webkit-box-sizing: border-box;
+ -moz-box-sizing: border-box;
+ -ms-box-sizing: border-box;
+ -o-box-sizing: border-box;
+ box-sizing: border-box;
+}
+.w2ui-sidebar > div {
+ position: absolute;
+ overflow: hidden;
+}
+.w2ui-sidebar .w2ui-sidebar-top {
+ position: absolute;
+ z-index: 2;
+ top: 0px;
+ left: 0px;
+ right: 0px;
+}
+.w2ui-sidebar .w2ui-sidebar-top .w2ui-flat-left,
+.w2ui-sidebar .w2ui-sidebar-top .w2ui-flat-right {
+ position: absolute;
+ right: 2px;
+ top: 2px;
+ height: 24px;
+ padding: 5px;
+ border-radius: 2px;
+ background-size: 16px 12px;
+ background-position: center center;
+ background-repeat: no-repeat;
+ background-color: #edf1f6;
+}
+.w2ui-sidebar .w2ui-sidebar-top .w2ui-flat-left:hover,
+.w2ui-sidebar .w2ui-sidebar-top .w2ui-flat-right:hover {
+ background-color: #d7e1ef;
+}
+.w2ui-sidebar .w2ui-sidebar-top .w2ui-flat-left {
+ left: auto;
+ width: 25px;
+ background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAQAAADZc7J/AAAAzklEQVR4Ae2THRDEMBCFzy1ucatb3eJ2uhi3uNUtbnGrW9zi1rOdNzdvdl7nDpvYt/9/r7+/51myZZf/zXkD2iMHHRSb0x3oskwMieK05PwEXqP4ExSL0wp0ROao2OOuMPOMdUL6XU1/oGLcFWb+NqyTd2W/P/2qTr9h+nFXhOkHXRHiNyjrgp/U/V+WaQcaNY13zZI0A1JvcVqAnrGDTdtDtZUHjHIJhxxVLN0iqXgCP1l/7h8U9kc6abyJ4/eNWPpGdBv+XdUK0K8cnvcBly2rDr7C1HQAAAAASUVORK5CYII=');
+}
+.w2ui-sidebar .w2ui-sidebar-top .w2ui-flat-right {
+ left: 2px;
+ width: auto;
+ background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAQAAADZc7J/AAAAz0lEQVR4Ae2UG7TGMBCEr1vd4la3uMUtuli3utWtbnGLW9zi9l/bDMzJG7u12cfJfLunf1+UEC9Bv0vVQwJ8hjRCaZafflb1C9RQf4OD0gSDE+i+PiJAabFhQc1y1AYYsJGLY3lgxM17uWPO56yPiFDqVPWgRtpIHSd1zPnwkBsdI58OlNwx4fP2X0TgfMTOoHSdKOXkpyNvEyQh7ul+4swxJSTQuwNDxz68l/ukVNbu0Neen5Z+KvzWxBAqHds349uPFJ/jVOrPjxUq++OLf+20q5+noXo0AAAAAElFTkSuQmCC');
+}
+.w2ui-sidebar .w2ui-sidebar-bottom {
+ position: absolute;
+ z-index: 2;
+ bottom: 0px;
+ left: 0px;
+ right: 0px;
+}
+.w2ui-sidebar .w2ui-sidebar-div {
+ position: absolute;
+ z-index: 1;
+ overflow: auto;
+ top: 0px;
+ bottom: 0px;
+ left: 0px;
+ right: 0px;
+ padding: 2px 0px;
+ -webkit-user-select: none;
+ -moz-user-select: none;
+ -ms-user-select: none;
+ -o-user-select: none;
+ user-select: none;
+}
+.w2ui-sidebar .w2ui-sidebar-div table {
+ width: 100%;
+}
+.w2ui-sidebar .w2ui-sidebar-div .w2ui-node {
+ background-color: #edf1f6;
+ border-top: 1px solid transparent;
+ border-bottom: 1px solid transparent;
+ margin: 0px;
+ padding: 1px 0px;
+}
+.w2ui-sidebar .w2ui-sidebar-div .w2ui-node table {
+ pointer-events: none;
+}
+.w2ui-sidebar .w2ui-sidebar-div .w2ui-node .w2ui-node-caption,
+.w2ui-sidebar .w2ui-sidebar-div .w2ui-node .w2ui-node-image,
+.w2ui-sidebar .w2ui-sidebar-div .w2ui-node .w2ui-node-image > span,
+.w2ui-sidebar .w2ui-sidebar-div .w2ui-node td.w2ui-node-dots {
+ color: #000000;
+ text-shadow: 0px 0px 0px #ffffff;
+ pointer-events: none;
+}
+.w2ui-sidebar .w2ui-sidebar-div .w2ui-node .w2ui-node-caption:hover,
+.w2ui-sidebar .w2ui-sidebar-div .w2ui-node .w2ui-node-image:hover,
+.w2ui-sidebar .w2ui-sidebar-div .w2ui-node .w2ui-node-image > span:hover,
+.w2ui-sidebar .w2ui-sidebar-div .w2ui-node td.w2ui-node-dots:hover {
+ color: inherit;
+}
+.w2ui-sidebar .w2ui-sidebar-div .w2ui-node:hover {
+ border-top: 1px solid #f9f9f9;
+ border-bottom: 1px solid #f9f9f9;
+ background-color: #d7e1ef;
+}
+.w2ui-sidebar .w2ui-sidebar-div .w2ui-node .w2ui-node-image {
+ width: 22px;
+ text-align: center;
+ pointer-events: none;
+}
+.w2ui-sidebar .w2ui-sidebar-div .w2ui-node .w2ui-node-image > span {
+ color: #516173 !important;
+}
+.w2ui-sidebar .w2ui-sidebar-div .w2ui-node input,
+.w2ui-sidebar .w2ui-sidebar-div .w2ui-node button {
+ pointer-events: auto;
+}
+.w2ui-sidebar .w2ui-sidebar-div .w2ui-selected,
+.w2ui-sidebar .w2ui-sidebar-div .w2ui-selected:hover {
+ position: relative;
+ background-image: -webkit-linear-gradient(#69b1e0, #4a96d3);
+ background-image: -moz-linear-gradient(#69b1e0, #4a96d3);
+ background-image: -ms-linear-gradient(#69b1e0, #4a96d3);
+ background-image: -o-linear-gradient(#69b1e0, #4a96d3);
+ background-image: linear-gradient(#69b1e0, #4a96d3);
+ filter: progid:dximagetransform.microsoft.gradient(startColorstr='#ff69b1e0', endColorstr='#ff4a96d3', GradientType=0);
+ border-top: 1px solid #5295cd;
+ border-bottom: 1px solid #2661a6;
+}
+.w2ui-sidebar .w2ui-sidebar-div .w2ui-selected .w2ui-node-caption,
+.w2ui-sidebar .w2ui-sidebar-div .w2ui-selected:hover .w2ui-node-caption,
+.w2ui-sidebar .w2ui-sidebar-div .w2ui-selected .w2ui-node-image,
+.w2ui-sidebar .w2ui-sidebar-div .w2ui-selected:hover .w2ui-node-image,
+.w2ui-sidebar .w2ui-sidebar-div .w2ui-selected .w2ui-node-image > span,
+.w2ui-sidebar .w2ui-sidebar-div .w2ui-selected:hover .w2ui-node-image > span,
+.w2ui-sidebar .w2ui-sidebar-div .w2ui-selected td.w2ui-node-dots,
+.w2ui-sidebar .w2ui-sidebar-div .w2ui-selected:hover td.w2ui-node-dots {
+ color: #ffffff !important;
+ text-shadow: 1px 1px 2px #666666 !important;
+}
+.w2ui-sidebar .w2ui-sidebar-div .w2ui-selected:before {
+ content: "";
+ border: 1px dashed #eee;
+ border-radius: 3px;
+ position: absolute;
+ top: 2px;
+ bottom: 2px;
+ left: 2px;
+ right: 2px;
+ pointer-events: none;
+}
+.w2ui-sidebar .w2ui-sidebar-div .w2ui-selected.w2ui-inactive:before {
+ border: 1px dashed transparent !important;
+}
+.w2ui-sidebar .w2ui-sidebar-div .w2ui-disabled,
+.w2ui-sidebar .w2ui-sidebar-div .w2ui-disabled:hover {
+ background: transparent !important;
+ border-top: 1px solid transparent;
+ border-bottom: 1px solid transparent;
+}
+.w2ui-sidebar .w2ui-sidebar-div .w2ui-disabled .w2ui-node-caption,
+.w2ui-sidebar .w2ui-sidebar-div .w2ui-disabled:hover .w2ui-node-caption,
+.w2ui-sidebar .w2ui-sidebar-div .w2ui-disabled .w2ui-node-image,
+.w2ui-sidebar .w2ui-sidebar-div .w2ui-disabled:hover .w2ui-node-image,
+.w2ui-sidebar .w2ui-sidebar-div .w2ui-disabled .w2ui-node-image > span,
+.w2ui-sidebar .w2ui-sidebar-div .w2ui-disabled:hover .w2ui-node-image > span,
+.w2ui-sidebar .w2ui-sidebar-div .w2ui-disabled td.w2ui-node-dots,
+.w2ui-sidebar .w2ui-sidebar-div .w2ui-disabled:hover td.w2ui-node-dots {
+ opacity: 0.4;
+ filter: alpha(opacity=40);
+ color: #000000 !important;
+ text-shadow: 0px 0px 0px #ffffff !important;
+}
+.w2ui-sidebar .w2ui-sidebar-div .w2ui-node-caption {
+ white-space: nowrap;
+ padding: 5px 0px 5px 3px;
+ margin: 1px 0px 1px 22px;
+ position: relative;
+ z-index: 1;
+ font-size: 12px;
+}
+.w2ui-sidebar .w2ui-sidebar-div .w2ui-node-group {
+ white-space: nowrap;
+ overflow: hidden;
+ padding: 10px 0px 10px 10px;
+ margin: 0px;
+ cursor: default;
+ color: #868b92;
+ background-color: transparent;
+}
+.w2ui-sidebar .w2ui-sidebar-div .w2ui-node-group :nth-child(1) {
+ /* show / hide link */
+ margin-right: 10px;
+ float: right;
+ color: transparent;
+}
+.w2ui-sidebar .w2ui-sidebar-div .w2ui-node-group :nth-child(2) {
+ /* title text */
+ font-weight: normal;
+ text-transform: uppercase;
+}
+.w2ui-sidebar .w2ui-sidebar-div .w2ui-node-sub {
+ overflow: hidden;
+}
+.w2ui-sidebar .w2ui-sidebar-div .w2ui-node-flat {
+ padding: 6px 0px;
+ text-align: center;
+}
+.w2ui-sidebar .w2ui-sidebar-div .w2ui-node-flat .w2ui-node-image {
+ text-align: center;
+ width: auto;
+}
+.w2ui-sidebar .w2ui-sidebar-div .w2ui-node-flat .w2ui-node-image > span {
+ font-size: 16px;
+ color: #000000;
+ text-shadow: 0px 0px 0px #ffffff;
+}
+.w2ui-sidebar .w2ui-sidebar-div .w2ui-node-flat .w2ui-node-image.w2ui-icon {
+ width: 21px;
+}
+.w2ui-sidebar .w2ui-sidebar-div td.w2ui-node-dots {
+ width: 18px;
+ padding: 0px 0px 1px 7px;
+ text-align: center;
+}
+.w2ui-sidebar .w2ui-sidebar-div td.w2ui-node-dots .w2ui-expand {
+ width: 16px;
+ margin-top: -3px;
+ pointer-events: auto;
+}
+.w2ui-sidebar .w2ui-sidebar-div td.w2ui-node-data {
+ padding: 1px 1px 3px 1px;
+}
+.w2ui-sidebar .w2ui-sidebar-div td.w2ui-node-data .w2ui-node-image {
+ padding: 3px 0px 0px 0px;
+ float: left;
+}
+.w2ui-sidebar .w2ui-sidebar-div td.w2ui-node-data .w2ui-node-image > span {
+ font-size: 16px;
+ color: #000000;
+ text-shadow: 0px 0px 0px #ffffff;
+}
+.w2ui-sidebar .w2ui-sidebar-div td.w2ui-node-data .w2ui-node-image.w2ui-icon {
+ margin-top: 3px;
+}
+.w2ui-sidebar .w2ui-sidebar-div td.w2ui-node-data .w2ui-node-count {
+ float: right;
+ border: 1px solid #6f9dc7;
+ border-radius: 20px;
+ width: auto;
+ height: 18px;
+ padding: 2px 7px;
+ margin: 3px 4px -2px 0;
+ background-color: #e7f0fc;
+ color: #667274;
+ box-shadow: 0 0 0px #ffffff;
+ text-shadow: 1px 1px 1px #e6e6e6;
+ position: relative;
+ z-index: 2;
+}
+/*************************************************
+* ---- Tabs ----
+*/
+.w2ui-tabs {
+ cursor: default;
+ overflow: hidden !important;
+ position: relative;
+ background-color: #fafafa;
+ padding: 3px 0px;
+}
+.w2ui-tabs:not(.w2ui-tabs-up) {
+ padding-bottom: 0px !important;
+}
+.w2ui-tabs.w2ui-tabs-up {
+ padding-top: 0px !important;
+}
+.w2ui-tabs table {
+ border-bottom: 1px solid silver;
+ padding: 0px 7px;
+}
+.w2ui-tabs .w2ui-tab {
+ padding: 6px 20px;
+ text-align: center;
+ color: #000000;
+ background-color: transparent;
+ border: 1px solid #c0c0c0;
+ border-bottom: 1px solid silver;
+ white-space: nowrap;
+ margin: 1px 1px -1px 0px;
+ border-top-left-radius: 4px;
+ border-top-right-radius: 4px;
+ cursor: default;
+ -webkit-user-select: none;
+ -moz-user-select: none;
+ -ms-user-select: none;
+ -o-user-select: none;
+ user-select: none;
+}
+.w2ui-tabs .w2ui-tab.active {
+ color: #000000;
+ background-color: #ffffff;
+ border: 1px solid #c0c0c0;
+ border-bottom: 1px solid transparent;
+}
+.w2ui-tabs .w2ui-tab.closable {
+ padding: 6px 28px 6px 20px;
+}
+.w2ui-tabs .w2ui-tab-close {
+ color: #555;
+ text-shadow: 1px 1px 1px #bbb;
+ float: right;
+ margin: 6px 4px 0px 0px;
+ padding: 0px 0px 0px 5px;
+ width: 16px;
+ height: 16px;
+ opacity: 0.9;
+ border: 0px;
+ border-top: 3px solid transparent;
+ border-radius: 9px;
+}
+.w2ui-tabs .w2ui-tab-close:hover {
+ background-color: #D77F7F;
+ color: white;
+}
+.w2ui-tabs .w2ui-tab-close:before {
+ position: relative;
+ top: -2px;
+ left: 0px;
+ opacity: 0.6;
+ color: inherit;
+ text-shadow: inherit;
+ content: 'x';
+}
+.w2ui-tabs.w2ui-tabs-up table {
+ border-top: 1px solid #c0c0c0;
+ border-bottom: 0px;
+}
+.w2ui-tabs.w2ui-tabs-up .w2ui-tab {
+ border-top: 1px solid #C0C0C0;
+ margin: -1px 1px 0px 0px;
+ border-radius: 0px;
+ border-bottom-left-radius: 4px;
+ border-bottom-right-radius: 4px;
+}
+.w2ui-tabs.w2ui-tabs-up .w2ui-tab.active {
+ border: 1px solid #c0c0c0;
+ border-top: 1px solid transparent;
+}
+.w2ui-tabs.w2ui-tabs-up .w2ui-tab-close {
+ margin-top: 4px;
+}
+/*************************************************
+* ---- Toolbar ----
+*/
+.w2ui-toolbar {
+ margin: 0px;
+ padding: 2px;
+ outline: 0px;
+ position: relative;
+ background-color: #efefef;
+ overflow: hidden !important;
+ -webkit-user-select: none;
+ -moz-user-select: none;
+ -ms-user-select: none;
+ -o-user-select: none;
+ user-select: none;
+}
+.w2ui-toolbar .disabled {
+ opacity: 0.3;
+ filter: alpha(opacity=30);
+}
+.w2ui-toolbar table {
+ table-layout: auto !important;
+}
+.w2ui-toolbar table td {
+ border: 0px !important;
+}
+.w2ui-toolbar table.w2ui-button {
+ margin: 0 1px 0 0;
+ border-radius: 4px;
+ height: 24px;
+ min-width: 24px;
+ border: 1px solid transparent;
+ background-color: transparent;
+}
+.w2ui-toolbar table.w2ui-button .w2ui-tb-image {
+ width: 22px;
+ height: 16px;
+ padding: 0;
+ margin: 5px 1px 3px 1px!important;
+ border: 0!important;
+ text-align: center;
+}
+.w2ui-toolbar table.w2ui-button .w2ui-tb-image > span {
+ font-size: 15px;
+ display: block;
+ color: #8d99a7;
+}
+.w2ui-toolbar table.w2ui-button .w2ui-tb-image > span:before {
+ vertical-align: top !important;
+}
+.w2ui-toolbar table.w2ui-button .w2ui-tb-caption {
+ color: #000000;
+ padding: 0px 4px 0px 2px;
+}
+.w2ui-toolbar table.w2ui-button .w2ui-tb-count {
+ padding: 0px 3px 0px 1px;
+}
+.w2ui-toolbar table.w2ui-button .w2ui-tb-count > span {
+ border: 1px solid #f6fcf4;
+ border-radius: 11px;
+ width: auto;
+ height: 18px;
+ padding: 0px 6px 1px 6px;
+ background-color: #f2f8f0;
+ color: #666666;
+ box-shadow: 0px 0px 2px #474545;
+ text-shadow: 1px 1px 0px #ffffff;
+}
+.w2ui-toolbar table.w2ui-button .w2ui-tb-down {
+ padding: 1px 3px 1px 1px;
+}
+.w2ui-toolbar table.w2ui-button .w2ui-tb-down > div {
+ border: 4px solid transparent;
+ border-top: 5px solid #8D99A7;
+ margin-top: 5px;
+}
+.w2ui-toolbar table.w2ui-button.over {
+ border: 1px solid #cccccc;
+ background-color: #eeeeee;
+}
+.w2ui-toolbar table.w2ui-button.over .w2ui-tb-caption {
+ color: #000000;
+}
+.w2ui-toolbar table.w2ui-button.down {
+ border: 1px solid #aaaaaa;
+ background-color: #dddddd;
+}
+.w2ui-toolbar table.w2ui-button.down .w2ui-tb-caption {
+ color: #666666;
+}
+.w2ui-toolbar table.w2ui-button.checked {
+ border: 1px solid #aaaaaa;
+ background-color: #ffffff;
+}
+.w2ui-toolbar table.w2ui-button.checked .w2ui-tb-caption {
+ color: #000000;
+}
+.w2ui-toolbar table.w2ui-button table {
+ height: 17px;
+ border-radius: 4px;
+ cursor: default;
+}
+.w2ui-toolbar .w2ui-break {
+ background-image: -webkit-linear-gradient(top, rgba(153, 153, 153, 0.1) 0%, #999999 40%, #999999 60%, rgba(153, 153, 153, 0.1) 100%);
+ background-image: -moz-linear-gradient(top, rgba(153, 153, 153, 0.1) 0%, #999999 40%, #999999 60%, rgba(153, 153, 153, 0.1) 100%);
+ background-image: -ms-linear-gradient(top, rgba(153, 153, 153, 0.1) 0%, #999999 40%, #999999 60%, rgba(153, 153, 153, 0.1) 100%);
+ background-image: -o-linear-gradient(top, rgba(153, 153, 153, 0.1) 0%, #999999 40%, #999999 60%, rgba(153, 153, 153, 0.1) 100%);
+ background-image: linear-gradient(top, rgba(153, 153, 153, 0.1) 0%, #999999 40%, #999999 60%, rgba(153, 153, 153, 0.1) 100%);
+ filter: progid:dximagetransform.microsoft.gradient(startColorstr='#ff999999', endColorstr='#ff999999', GradientType=0);
+ width: 1px !important;
+ height: 22px;
+ padding: 0px;
+ margin: 0px 6px;
+}
+.w2ui-listview {
+ overflow: auto !important;
+ background-color: #ffffff !important;
+ -webkit-box-sizing: border-box;
+ -moz-box-sizing: border-box;
+ -ms-box-sizing: border-box;
+ -o-box-sizing: border-box;
+ box-sizing: border-box;
+}
+.w2ui-listview * {
+ -webkit-box-sizing: border-box;
+ -moz-box-sizing: border-box;
+ -ms-box-sizing: border-box;
+ -o-box-sizing: border-box;
+ box-sizing: border-box;
+}
+.w2ui-listview > ul {
+ list-style-type: none;
+ margin: 0;
+ cursor: default;
+}
+.w2ui-listview > ul > li {
+ display: inline-block;
+ vertical-align: top;
+ overflow: hidden;
+ -webkit-user-select: none;
+ -moz-user-select: none;
+ -ms-user-select: none;
+ -o-user-select: none;
+ user-select: none;
+ border: 1px solid transparent;
+ border-radius: 4px;
+}
+.w2ui-listview > ul > li.w2ui-focused {
+ border: 1px solid #2661a6;
+}
+.w2ui-listview > ul > li.w2ui-selected {
+ border: 1px solid #2661a6;
+}
+.w2ui-listview > ul > li.w2ui-selected,
+.w2ui-listview > ul > li.w2ui-selected.hover {
+ background-image: -webkit-linear-gradient(#69b1e0, #4a96d3);
+ background-image: -moz-linear-gradient(#69b1e0, #4a96d3);
+ background-image: -ms-linear-gradient(#69b1e0, #4a96d3);
+ background-image: -o-linear-gradient(#69b1e0, #4a96d3);
+ background-image: linear-gradient(#69b1e0, #4a96d3);
+ filter: progid:dximagetransform.microsoft.gradient(startColorstr='#ff69b1e0', endColorstr='#ff4a96d3', GradientType=0);
+}
+.w2ui-listview > ul > li.w2ui-selected > div > div.caption,
+.w2ui-listview > ul > li.w2ui-selected.hover > div > div.caption {
+ color: #ffffff;
+}
+.w2ui-listview > ul > li.w2ui-selected > div > div.description,
+.w2ui-listview > ul > li.w2ui-selected.hover > div > div.description {
+ color: #dddddd;
+}
+.w2ui-listview > ul > li.w2ui-selected > div > div.extra > div > div,
+.w2ui-listview > ul > li.w2ui-selected.hover > div > div.extra > div > div {
+ color: #dddddd;
+}
+.w2ui-listview > ul > li.hover {
+ background-color: #d7e1ef;
+ border: 1px solid #2661a6;
+}
+.w2ui-listview > ul > li div {
+ vertical-align: middle;
+}
+.w2ui-listview > ul > li > div > div.caption {
+ display: block;
+ text-align: center;
+ word-wrap: break-word;
+ max-height: 50px;
+ color: #000000;
+ font-size: 12px;
+}
+.w2ui-listview > ul > li > div > div.description {
+ display: none;
+ text-align: left;
+ color: #777777;
+ font-size: 12px;
+}
+.w2ui-listview > ul > li > div > div.extra {
+ display: none;
+}
+.w2ui-listview > ul > li > div > div.extra > div > div {
+ color: #777777;
+}
+.w2ui-icon-small > ul {
+ padding: 1px 0px 0px 1px;
+}
+.w2ui-icon-small > ul > li {
+ margin: 0px 1px 1px 0px;
+ padding: 2px;
+ width: 250px;
+ white-space: nowrap;
+}
+.w2ui-icon-small > ul > li > div > div.w2ui-listview-img {
+ display: inline-block;
+ width: 26px;
+ height: 22px;
+ font-size: 21px;
+ margin-right: 2px;
+}
+.w2ui-icon-small > ul > li > div > div.caption {
+ display: inline-block;
+}
+.w2ui-icon-medium > ul {
+ padding: 4px 0px 0px 4px;
+}
+.w2ui-icon-medium > ul > li {
+ margin: 0px 4px 4px 0px;
+ padding: 4px;
+ width: 100px;
+}
+.w2ui-icon-medium > ul > li > div > div.w2ui-listview-img {
+ display: block;
+ width: 92px;
+ height: 60px;
+ font-size: 57px;
+ margin-left: auto;
+ margin-right: auto;
+ background-position: center;
+}
+.w2ui-icon-large > ul {
+ padding: 4px 0px 0px 4px;
+}
+.w2ui-icon-large > ul > li {
+ margin: 0px 4px 4px 0px;
+ padding: 4px;
+ width: 160px;
+}
+.w2ui-icon-large > ul > li > div > div.w2ui-listview-img {
+ display: block;
+ width: 152px;
+ height: 120px;
+ font-size: 114px;
+ margin-left: auto;
+ margin-right: auto;
+ background-position: center;
+}
+.w2ui-icon-tile > ul {
+ padding: 1px 0px 0px 1px;
+}
+.w2ui-icon-tile > ul > li {
+ margin: 0px 1px 1px 0px;
+ padding: 4px;
+ width: 250px;
+ white-space: nowrap;
+}
+.w2ui-icon-tile > ul > li > div > div.w2ui-listview-img {
+ display: inline-block;
+ width: 72px;
+ height: 60px;
+ font-size: 57px;
+ float: left;
+ margin-right: 4px;
+}
+.w2ui-icon-tile > ul > li > div > div.caption {
+ text-align: left;
+}
+.w2ui-icon-tile > ul > li > div > div.description {
+ display: block;
+}
+.w2ui-table > ul {
+ padding: 0;
+}
+.w2ui-table > ul > li {
+ width: 100%;
+ padding: 2px;
+ border-radius: 0px;
+ border-bottom: 1px dotted lightgray;
+}
+.w2ui-table > ul > li > div {
+ display: inline-block;
+ position: relative;
+ width: 100%;
+ white-space: nowrap;
+ overflow: hidden;
+}
+.w2ui-table > ul > li > div > div.w2ui-listview-img {
+ display: inline-block;
+ width: 38px;
+ height: 32px;
+ font-size: 31px;
+ margin-right: 2px;
+}
+.w2ui-table > ul > li > div > div.caption {
+ display: inline-block;
+}
+.w2ui-table > ul > li > div > div.extra {
+ display: inline-block;
+ position: absolute;
+ right: 0;
+ height: 100%;
+ background-color: #ffffff;
+}
+.w2ui-table > ul > li > div > div.extra > div:before {
+ display: inline-block;
+ height: 100%;
+ width: 0;
+ content: '';
+ vertical-align: middle;
+}
+.w2ui-table > ul > li > div > div.extra > div {
+ display: inline;
+}
+.w2ui-table > ul > li > div > div.extra > div > div {
+ display: inline-block;
+ font-size: 12px;
+}
+.w2ui-table > ul > li.w2ui-selected div.extra,
+.w2ui-table > ul > li.w2ui-selected.hover div.extra {
+ background-image: -webkit-linear-gradient(#69b1e0, #4a96d3);
+ background-image: -moz-linear-gradient(#69b1e0, #4a96d3);
+ background-image: -ms-linear-gradient(#69b1e0, #4a96d3);
+ background-image: -o-linear-gradient(#69b1e0, #4a96d3);
+ background-image: linear-gradient(#69b1e0, #4a96d3);
+ filter: progid:dximagetransform.microsoft.gradient(startColorstr='#ff69b1e0', endColorstr='#ff4a96d3', GradientType=0);
+}
+.w2ui-table > ul > li.hover div.extra {
+ background-color: #d7e1ef;
+}
+.w2ui-listview > ul > li div.icon-none {
+ border: 1px solid rgba(102, 102, 102, 0.35);
+}
diff --git a/src/main/resources/static/css/w2ui-1.5.rc1.min.css b/src/main/resources/static/css/w2ui-1.5.rc1.min.css
new file mode 100644
index 0000000..74ec451
--- /dev/null
+++ b/src/main/resources/static/css/w2ui-1.5.rc1.min.css
@@ -0,0 +1,2 @@
+/* w2ui 1.5.rc1 (nightly) (c) http://w2ui.com, vitmalina@gmail.com */
+@font-face{font-family:w2ui-font;src:url("data:application/x-font-woff;charset=utf-8;base64,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") format("woff");font-weight:400;font-style:normal}[class^=w2ui-icon-]:before,[class*=" w2ui-icon-"]:before{font-family:w2ui-font;display:inline-block;vertical-align:middle;line-height:1;font-weight:400;font-style:normal;speak:none;text-decoration:inherit;text-transform:none;text-rendering:optimizeLegibility;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.w2ui-icon-check:before{content:"\f101"}.w2ui-icon-columns:before{content:"\f102"}.w2ui-icon-cross:before{content:"\f103"}.w2ui-icon-empty:before{content:"\f104"}.w2ui-icon-info:before{content:"\f105"}.w2ui-icon-pencil:before{content:"\f106"}.w2ui-icon-plus:before{content:"\f107"}.w2ui-icon-reload:before{content:"\f108"}.w2ui-icon-search:before{content:"\f109"}.w2ui-reset{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;-ms-box-sizing:border-box;-o-box-sizing:border-box;box-sizing:border-box;font-family:Verdana,Arial,sans-serif;font-size:11px}.w2ui-reset *{color:default;line-height:100%;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;-ms-box-sizing:border-box;-o-box-sizing:border-box;box-sizing:border-box;margin:0;padding:0}.w2ui-reset table{max-width:none;background-color:transparent;border-collapse:separate;border-spacing:0;border:0}.w2ui-reset table tr th,.w2ui-reset table tr td{font-family:Verdana,Arial,sans-serif;font-size:11px}.w2ui-reset input:not([type=button]):not([type=submit]):not([type=checkbox]):not([type=radio]),.w2ui-reset select,.w2ui-reset textarea{display:inline-block;width:auto;height:auto;vertical-align:baseline;padding:4px;margin:0;font-size:11px}.w2ui-reset select{padding:1px;height:23px;font-size:11px}.w2ui-centered{position:absolute;left:0;right:0;top:50%;-webkit-transform:translateY(-50%);-moz-transform:translateY(-50%);-ms-transform:translateY(-50%);-o-transform:translateY(-50%);transform:translateY(-50%);max-height:100%;margin:0;padding:0 10px;text-align:center}.w2ui-disabled,.w2ui-readonly{background-color:#f1f1f1!important;color:#777!important}.w2ui-message{font-size:12px;position:absolute;z-index:250;background-color:#f9f9f9;border:1px solid #999;box-shadow:0 0 15px #aaa;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;-ms-box-sizing:border-box;-o-box-sizing:border-box;box-sizing:border-box;border-top:0;border-radius:0 0 6px 6px;overflow:auto}.w2ui-message .w2ui-message-body{position:absolute;top:0;bottom:45px;left:0;right:0;overflow:auto;line-height:1.5;font-size:14px}.w2ui-message .w2ui-message-body .w2ui-centered{line-height:1.5}.w2ui-message .w2ui-message-buttons{position:absolute;height:45px;bottom:0;left:0;right:0;border-top:1px solid #e5e5e5;text-align:center;padding:8px}input:not([type=button]):not([type=submit]).w2ui-input,textarea.w2ui-input{padding:4px;border:1px solid #cacaca;border-radius:3px;color:#000;background-color:#fff;line-height:normal}input:not([type=button]):not([type=submit]).w2ui-input:focus,textarea.w2ui-input:focus{outline-color:#72b2ff}input:not([type=button]):not([type=submit]).w2ui-input:disabled,textarea.w2ui-input:disabled,input:not([type=button]):not([type=submit]).w2ui-input[readonly],textarea.w2ui-input[readonly]{background-color:#f1f1f1;color:#777}input.w2ui-input::-ms-clear{display:none}input.w2ui-input:-ms-input-placeholder{color:#aaa!important}select.w2ui-input{color:#000;padding:0 15px 0 7px;line-height:1.8;border-radius:3px;border:1px solid #cacaca;-webkit-appearance:none;background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACgAAAALCAQAAACnzwd+AAAAcklEQVR4AcXMsQFBQQDG4P9tAgC0gJYRQJZgKQMwCqCku6vVAAAA+NJHP4KHOk0aV2pRw61n4BBmyOxKQ8I4ehZeuhd3HTx6DQEGZ7sBfr2OOOOj3Yi43kMKs9sZknofOexqZ8npMygwWZTX51CipP+YA1OiZJbYYg9lAAAAAElFTkSuQmCC),-webkit-linear-gradient(top,#fff 20%,#f6f6f6 50%,#eee 52%,#f4f4f4 100%);background-size:17px 6px,100% 100%;background-position:right center,left top;background-repeat:no-repeat,no-repeat}.w2ui-icon-expand:before{position:relative;top:1px;left:1px;content:' ';width:6px;height:6px;border:2px solid rgba(150,150,150,.8);border-bottom:0;border-left:0;transform:rotateZ(45deg)}.w2ui-icon-collapse:before{position:relative;top:-1px;left:3px;content:' ';width:6px;height:6px;border:2px solid rgba(150,150,150,.8);border-bottom:0;border-left:0;transform:rotateZ(135deg)}input[type=checkbox].w2ui-toggle{position:absolute;opacity:0;width:46px;height:22px;padding:0;margin:0;margin-left:2px}input[type=checkbox].w2ui-toggle+div{display:inline-block;width:46px;height:22px;border:1px solid #bbb;border-radius:30px;background-color:#eee;-webkit-transition-duration:.3s;-webkit-transition-property:background-color,box-shadow;-moz-transition-duration:.3s;-moz-transition-property:background-color,box-shadow;box-shadow:inset 0 0 0 0 rgba(0,0,0,.4);margin-left:2px}input[type=checkbox].w2ui-toggle:disabled+div{opacity:.3}input[type=checkbox].w2ui-toggle+div>div{float:left;width:22px;height:22px;border-radius:inherit;background:#f5f5f5;-webkit-transition-duration:.3s;-webkit-transition-property:transform,background-color,box-shadow;-moz-transition-duration:.3s;-moz-transition-property:transform,background-color;box-shadow:0 0 1px #323232,0 0 0 1px rgba(200,200,200,.6);pointer-events:none;margin-top:-1px;margin-left:-1px}input[type=checkbox].w2ui-toggle:checked+div{border:1px solid #00a23f;box-shadow:inset 0 0 0 12px #54B350}input[type=checkbox].w2ui-toggle:checked+div>div{-webkit-transform:translate3d(24px,0,0);-moz-transform:translate3d(24px,0,0);background-color:#fff;box-shadow:0 2px 5px rgba(0,0,0,.3),0 0 0 1px #00a23f}input[type=checkbox].w2ui-toggle.blue:checked+div{border:1px solid #206FAD;box-shadow:inset 0 0 0 12px #35A6EB}input[type=checkbox].w2ui-toggle.blue:checked+div>div{box-shadow:0 2px 5px rgba(0,0,0,.3),0 0 0 1px #206fad}input[type=checkbox].w2ui-toggle:focus{outline:0}.w2ui-overlay{position:absolute;margin-top:4px;margin-left:-17px;display:none;z-index:1300;color:inherit;background-color:#fbfbfb;border-color:#fbfbfb;box-shadow:0 2px 10px #999;border-radius:4px;text-align:left}.w2ui-overlay>div{border-radius:4px;position:relative;border:3px solid #777}.w2ui-overlay table td{color:inherit}.w2ui-overlay:before{content:"";position:absolute;border-color:inherit}.w2ui-overlay:after{content:"";position:absolute;border-color:inherit;bottom:100%;left:4px}.w2ui-overlay.top-arrow:before{border-bottom:12px solid #6f6f6f;border-right:12px solid transparent;border-left:12px solid transparent;bottom:100%;margin-bottom:-3px}.w2ui-overlay.top-arrow:after{border-bottom:8px solid #000;border-bottom-color:inherit;border-right:8px solid transparent;border-left:8px solid transparent;bottom:100%;margin-bottom:-3px}.w2ui-overlay.bottom-arrow:before{border-top:12px solid #6f6f6f;border-right:12px solid transparent;border-left:12px solid transparent;top:100%;margin-top:-3px}.w2ui-overlay.bottom-arrow:after{border-top:8px solid #000;border-top-color:inherit;border-right:8px solid transparent;border-left:8px solid transparent;top:100%;margin-top:-3px}.w2ui-overlay.w2ui-overlay-popup{z-index:1700}.w2ui-overlay .w2ui-grid-searches{border-top:3px solid #777!important}.w2ui-overlay .no-color{border:1px solid #eee;background:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAABlBMVEX/////TgCFoIUYAAAAGUlEQVR42uXHIQEAAACDsNO/NJ4Kn9uC8wsJkAARUrXAjwAAAABJRU5ErkJggg==);background-size:15px 15px}.w2ui-tag{position:absolute;z-index:1300;opacity:0;-webkit-transition:opacity .3s;-moz-transition:opacity .3s;-ms-transition:opacity .3s;-o-transition:opacity .3s;transition:opacity .3s}.w2ui-tag .w2ui-tag-body{box-sizing:border-box;display:inline-block;position:absolute;border-radius:3px;padding:6px 10px;margin-left:10px;margin-top:0;background-color:rgba(60,60,60,.9);color:#fff!important;font-size:11px;font-family:verdana;text-shadow:1px 1px 3px #000;line-height:1.4;letter-spacing:.1px}.w2ui-tag .w2ui-tag-body.w2ui-tag-right:before{content:"";position:absolute;width:0;height:0;border-top:6px solid transparent;border-right:6px solid rgba(60,60,60,.9);border-bottom:6px solid transparent;margin:0 0 0 -16px}.w2ui-tag .w2ui-tag-body.w2ui-tag-left:after{content:"";position:absolute;top:5px;width:0;height:0;border-top:6px solid transparent;border-left:6px solid rgba(60,60,60,.9);border-bottom:6px solid transparent;margin:0 0 0 10px}.w2ui-tag .w2ui-tag-body.w2ui-tag-bottom:before{content:"";position:absolute;width:0;height:0;border-right:6px solid transparent;border-left:6px solid transparent;border-bottom:6px solid rgba(60,60,60,.9);margin:-12px 0 0 2px}.w2ui-tag .w2ui-tag-body.w2ui-tag-top:after{content:"";position:absolute;left:12px;bottom:-6px;width:0;height:0;border-right:6px solid transparent;border-left:6px solid transparent;border-top:6px solid rgba(60,60,60,.9)}.w2ui-tag.w2ui-tag-popup{z-index:1700}.w2ui-overlay table.w2ui-drop-menu{width:100%;color:#000;background-color:#fff;padding:5px 0;cursor:default}.w2ui-overlay table.w2ui-drop-menu td{white-space:nowrap}.w2ui-overlay table.w2ui-drop-menu .w2ui-item-even{color:inherit;background-color:#fff}.w2ui-overlay table.w2ui-drop-menu .w2ui-item-odd{color:inherit;background-color:#f3f6fa}.w2ui-overlay table.w2ui-drop-menu .w2ui-item-group{color:#444;font-weight:700;background-color:#ECEDF0;border-bottom:1px solid #D3D2D4}.w2ui-overlay table.w2ui-drop-menu td.menu-icon{padding:3px 0 4px 6px;width:20px}.w2ui-overlay table.w2ui-drop-menu td.menu-icon>span{height:20px;width:18px}.w2ui-overlay table.w2ui-drop-menu td.menu-text{padding:8px 10px 8px 5px;width:auto}.w2ui-overlay table.w2ui-drop-menu td.menu-count{text-align:right}.w2ui-overlay table.w2ui-drop-menu td.menu-count>span{border:1px solid #f6fcf4;border-radius:20px;width:auto;height:18px;padding:2px 7px;margin:3px 5px 0;background-color:#f2f8f0;color:#666;box-shadow:0 0 2px #474545;text-shadow:1px 1px 0 #fff}.w2ui-overlay table.w2ui-drop-menu td.menu-count>span.hotkey{border:0;border-radius:0;background-color:transparent!important;color:#888;box-shadow:none;text-shadow:none}.w2ui-overlay table.w2ui-drop-menu tr:hover{color:inherit;background-color:#e6f0ff}.w2ui-overlay table.w2ui-drop-menu tr.w2ui-selected{background-color:#b6d5fb}.w2ui-overlay table.w2ui-drop-menu tr.w2ui-selected td{color:inherit}.w2ui-overlay table.w2ui-drop-menu tr.w2ui-disabled{opacity:.4;background-color:#fff!important}.w2ui-overlay table.w2ui-drop-menu .w2ui-icon{font-size:14px;color:#8d99a7;display:inline-block;padding-top:4px}.w2ui-marker{color:#444;background-color:rgba(252,244,161,.48)}.w2ui-spinner{display:inline-block;background-size:100%;background-repeat:no-repeat;background-image:url(data:image/gif;base64,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)}.w2ui-icon{background-repeat:no-repeat;height:16px;width:16px;overflow:hidden;margin:2px;display:inline-block}.w2ui-icon.icon-search,.w2ui-icon.icon-search-down{background:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACYAAAAgCAYAAAB+ZAqzAAACuElEQVRYw9WXSWhTQRjHR0UKLqhFaV0OUih68GAOWjyJKypCpAoV8aIiioIICiKiB1GMtE3MYmry2moXDz1UDx7sUXHBhQpSaRVxrYpWcMO9avx/8AJh/CbznHkxdeB3Cd/8589kvuUJkWcdjCTHghUgAi6DJ+AVeAqugSQIggniXywcNBJsB70g44EHYBcYXUhTM8EFj4ZkboKqQpiqAv2GprK8o7/f75t6pjn0M3gNPmri3vtycxAZA64qDvkJ2kENqAQTQQWoBg74qth3B4y3NbZDIX4fzNfsnQtuK/YfsjFVCh4pMq3Co0Y5uMVoUGkpy8aFT5xaeSzVEo45bXdBt4LeaLq1k0RXMYJfdDfFmAuAD4zWlty4UNyZEkm19MUb2zMw8Sfp1u+IWSrcIimLnTG8/SijdU6OO5poDESdtgHZVBzUHm/amhW7zoitMTS2mNHqASPk2FDCCcLMYK6p+obmulyxfiYLA4bGKFvfSnrUvkq5+Lpk8z4yRH8r3l/X4WiqJFfspSQ0CGYZGpsMnkt6L+h31Z76hpMdeOwPQ7H0NFnssST0C8wxNDaDKb6kP06150gsHahNNlVzYheZd7HJ0BiX4VRGhpmIhRixKyZilM2M1mnTArtIUbU3/qVO0H0GvmQ4CY4C3YopYYlHjXlggNG4R33Ypi2tVtwaPeTdNMkq9pVQZQdvFPs32zbx4aAjzxhDRfIAWAeWg7VgrzsY5ht/zoNJtubKwA3LITGjSKRyW3NTwaUCmKOSMd3WHH0ZJRQZZkOP1zFKZ3CB++4+aQ6kEeksWAb2a2L7qDv49S1Q6T72MOgEXa6RGFhP3wpS/B6NOWpRs0UxFg7eqTFHjX1hscxtAz/ymEuIYi0cvgF8Y0w5Ro3dZ3M1boJkTaXEUFlug6fsdsRQWzTj0cey+N/Xb2sj5lTh2M6OAAAAAElFTkSuQmCC) no-repeat center!important;background-size:14px 12px!important;opacity:.9}.w2ui-icon.icon-folder{background:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAAK/INwWK6QAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAGrSURBVDjLxZO7ihRBFIa/6u0ZW7GHBUV0UQQTZzd3QdhMQxOfwMRXEANBMNQX0MzAzFAwEzHwARbNFDdwEd31Mj3X7a6uOr9BtzNjYjKBJ6nicP7v3KqcJFaxhBVtZUAK8OHlld2st7Xl3DJPVONP+zEUV4HqL5UDYHr5xvuQAjgl/Qs7TzvOOVAjxjlC+ePSwe6DfbVegLVuT4r14eTr6zvA8xSAoBLzx6pvj4l+DZIezuVkG9fY2H7YRQIMZIBwycmzH1/s3F8AapfIPNF3kQk7+kw9PWBy+IZOdg5Ug3mkAATy/t0usovzGeCUWTjCz0B+Sj0ekfdvkZ3abBv+U4GaCtJ1iEm6ANQJ6fEzrG/engcKw/wXQvEKxSEKQxRGKE7Izt+DSiwBJMUSm71rguMYhQKrBygOIRStf4TiFFRBvbRGKiQLWP29yRSHKBTtfdBmHs0BUpgvtgF4yRFR+NUKi0XZcYjCeCG2smkzLAHkbRBmP0/Uk26O5YnUActBp1GsAI+S5nRJJJal5K1aAMrq0d6Tm9uI6zjyf75dAe6tx/SsWeD//o2/Ab6IH3/h25pOAAAAAElFTkSuQmCC) no-repeat center!important}.w2ui-icon.icon-page{background:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAAK/INwWK6QAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAINSURBVBgZBcG/r55zGAfg6/4+z3va01NHlYgzEfE7MdCIGISFgS4Gk8ViYyM2Mdlsko4GSf8Do0FLRCIkghhYJA3aVBtEz3nP89wf11VJvPDepdd390+8Nso5nESBQoq0pfvXm9fzWf19453LF85vASqJlz748vInb517dIw6EyYBIIG49u+xi9/c9MdvR//99MPPZ7+4cP4IZhhTPbwzT2d+vGoaVRRp1rRliVvHq+cfvM3TD82+7mun0o/ceO7NT+/4/KOXjwZU1ekk0840bAZzMQ2mooqh0A72d5x/6sB9D5zYnff3PoYBoWBgFKPKqDKqjCpjKr//dcu9p489dra88cydps30KswACfNEKanSaxhlntjJ8Mv12Paie+vZ+0+oeSwwQ0Iw1xAR1CiFNJkGO4wu3ZMY1AAzBI0qSgmCNJsJUEOtJSMaCTBDLyQ0CknAGOgyTyFFiLI2awMzdEcSQgSAAKVUmAeNkxvWJWCGtVlDmgYQ0GFtgg4pNtOwbBcwQy/Rife/2yrRRVI0qYCEBly8Z+P4qMEMy7JaVw72N568e+iwhrXoECQkfH91kY7jwwXMsBx1L93ZruqrK6uuiAIdSnTIKKPLPFcvay8ww/Hh+ufeznTXu49v95IMoQG3784gYXdTqvRmqn/Wpa/ADFX58MW3L71SVU9ETgEIQQQIOOzub+fhIvwPRDgeVjWDahIAAAAASUVORK5CYII=) no-repeat center!important}.w2ui-lock{display:none;position:absolute;z-index:1400;top:0;left:0;width:100%;height:100%;opacity:.15;filter:alpha(opacity=15);background-color:#333}.w2ui-lock-msg{display:none;position:absolute;z-index:1400;top:45%;left:50%;-webkit-transform:translateX(-50%) translateY(-50%);-moz-transform:translateX(-50%) translateY(-50%);-ms-transform:translateX(-50%) translateY(-50%);-o-transform:translateX(-50%) translateY(-50%);transform:translateX(-50%) translateY(-50%);width:200px;height:80px;padding:30px 8px;white-space:nowrap;text-overflow:ellipsis;overflow:hidden;font-size:13px;font-family:Verdana,Arial,sans-serif;opacity:.8;filter:alpha(opacity=80);background-color:#555;color:#fff;text-align:center;border-radius:5px;border:2px solid #444}.w2ui-lock-msg .w2ui-spinner{display:inline-block;width:24px;height:24px;margin:-3px 8px -7px -10px}.w2ui-scroll-wrapper{overflow:hidden}.w2ui-scroll-left,.w2ui-scroll-right{top:0;width:18px;height:100%;cursor:default!important;z-index:10;display:none;position:absolute}.w2ui-scroll-left:hover,.w2ui-scroll-right:hover{background-color:#ddd}.w2ui-scroll-left{left:0;box-shadow:0 0 7px #5F5F5F;background:#f7f7f7 url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAQAAADZc7J/AAAAzklEQVR4Ae2THRDEMBCFzy1ucatb3eJ2uhi3uNUtbnGrW9zi1rOdNzdvdl7nDpvYt/9/r7+/51myZZf/zXkD2iMHHRSb0x3oskwMieK05PwEXqP4ExSL0wp0ROao2OOuMPOMdUL6XU1/oGLcFWb+NqyTd2W/P/2qTr9h+nFXhOkHXRHiNyjrgp/U/V+WaQcaNY13zZI0A1JvcVqAnrGDTdtDtZUHjHIJhxxVLN0iqXgCP1l/7h8U9kc6abyJ4/eNWPpGdBv+XdUK0K8cnvcBly2rDr7C1HQAAAAASUVORK5CYII=) center center no-repeat;background-size:15px 12px}.w2ui-scroll-right{right:0;box-shadow:0 0 7px #5F5F5F;background:#f7f7f7 url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAQAAADZc7J/AAAAz0lEQVR4Ae2UG7TGMBCEr1vd4la3uMUtuli3utWtbnGLW9zi9l/bDMzJG7u12cfJfLunf1+UEC9Bv0vVQwJ8hjRCaZafflb1C9RQf4OD0gSDE+i+PiJAabFhQc1y1AYYsJGLY3lgxM17uWPO56yPiFDqVPWgRtpIHSd1zPnwkBsdI58OlNwx4fP2X0TgfMTOoHSdKOXkpyNvEyQh7ul+4swxJSTQuwNDxz68l/ukVNbu0Neen5Z+KvzWxBAqHds349uPFJ/jVOrPjxUq++OLf+20q5+noXo0AAAAAElFTkSuQmCC) center center no-repeat;background-size:15px 13px}button.w2ui-btn{position:relative;display:inline-block;border-radius:4px;margin:0 5px;padding:6px 12px;color:#666;font-size:12px;border:1px solid #B6B6B6;background-image:-webkit-linear-gradient(#fff 0,#e7e7e7 100%);background-image:-moz-linear-gradient(#fff 0,#e7e7e7 100%);background-image:-ms-linear-gradient(#fff 0,#e7e7e7 100%);background-image:-o-linear-gradient(#fff 0,#e7e7e7 100%);background-image:linear-gradient(#fff 0,#e7e7e7 100%);filter:progid:dximagetransform.microsoft.gradient(startColorstr='#ffe7e7e7', endColorstr='#ffffffff', GradientType=0);outline:0;box-shadow:0 1px 0 #fff;cursor:default;min-width:75px;line-height:110%;user-select:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;-o-user-select:none;-webkit-tap-highlight-color:rgba(0,0,0,0)}button.w2ui-btn:hover{text-decoration:none;border:1px solid #bbb;background-image:-webkit-linear-gradient(#f7f7f7 0,#ddd 100%);background-image:-moz-linear-gradient(#f7f7f7 0,#ddd 100%);background-image:-ms-linear-gradient(#f7f7f7 0,#ddd 100%);background-image:-o-linear-gradient(#f7f7f7 0,#ddd 100%);background-image:linear-gradient(#f7f7f7 0,#ddd 100%);filter:progid:dximagetransform.microsoft.gradient(startColorstr='#ffdddddd', endColorstr='#fff7f7f7', GradientType=0);color:#333}button.w2ui-btn:active,button.w2ui-btn.clicked{border:1px solid #999;background-image:-webkit-linear-gradient(#ccc 0,#ccc 100%);background-image:-moz-linear-gradient(#ccc 0,#ccc 100%);background-image:-ms-linear-gradient(#ccc 0,#ccc 100%);background-image:-o-linear-gradient(#ccc 0,#ccc 100%);background-image:linear-gradient(#ccc 0,#ccc 100%);filter:progid:dximagetransform.microsoft.gradient(startColorstr='#ffcccccc', endColorstr='#ffcccccc', GradientType=0);text-shadow:1px 1px 1px #eee}button.w2ui-btn:disabled{border:1px solid #bbb!important;background:#f7f7f7!important;color:#bdbcbc!important;text-shadow:none!important}button.w2ui-btn:focus:before{content:"";border:1px dashed #aaa;border-radius:3px;position:absolute;top:2px;bottom:2px;left:2px;right:2px;pointer-events:none}button.w2ui-btn::-moz-focus-inner{border:0}button.w2ui-btn-blue{color:#fff;background-image:-webkit-linear-gradient(#80c0f7 0,#269df0 100%);background-image:-moz-linear-gradient(#80c0f7 0,#269df0 100%);background-image:-ms-linear-gradient(#80c0f7 0,#269df0 100%);background-image:-o-linear-gradient(#80c0f7 0,#269df0 100%);background-image:linear-gradient(#80c0f7 0,#269df0 100%);filter:progid:dximagetransform.microsoft.gradient(startColorstr='#ff269df0', endColorstr='#ff80c0f7', GradientType=0);border:1px solid #538AB7;text-shadow:0 0 1px #111}button.w2ui-btn-blue:hover{color:#fff;background-image:-webkit-linear-gradient(#73b6f0 0,#2391dd 100%);background-image:-moz-linear-gradient(#73b6f0 0,#2391dd 100%);background-image:-ms-linear-gradient(#73b6f0 0,#2391dd 100%);background-image:-o-linear-gradient(#73b6f0 0,#2391dd 100%);background-image:linear-gradient(#73b6f0 0,#2391dd 100%);filter:progid:dximagetransform.microsoft.gradient(startColorstr='#ff2391dd', endColorstr='#ff73b6f0', GradientType=0);border:1px solid #497BA3;text-shadow:0 0 1px #111}button.w2ui-btn-blue:active,button.w2ui-btn-blue.clicked{color:#fff;background-image:-webkit-linear-gradient(#1e83c9 0,#1e83c9 100%);background-image:-moz-linear-gradient(#1e83c9 0,#1e83c9 100%);background-image:-ms-linear-gradient(#1e83c9 0,#1e83c9 100%);background-image:-o-linear-gradient(#1e83c9 0,#1e83c9 100%);background-image:linear-gradient(#1e83c9 0,#1e83c9 100%);filter:progid:dximagetransform.microsoft.gradient(startColorstr='#ff1e83c9', endColorstr='#ff1e83c9', GradientType=0);border:1px solid #1268A6;text-shadow:0 0 1px #111}button.w2ui-btn-blue:focus:before{border:1px dashed #e8e8e8}button.w2ui-btn-green{color:#fff;background-image:-webkit-linear-gradient(#81cf81 0,#52a452 100%);background-image:-moz-linear-gradient(#81cf81 0,#52a452 100%);background-image:-ms-linear-gradient(#81cf81 0,#52a452 100%);background-image:-o-linear-gradient(#81cf81 0,#52a452 100%);background-image:linear-gradient(#81cf81 0,#52a452 100%);filter:progid:dximagetransform.microsoft.gradient(startColorstr='#ff52a452', endColorstr='#ff81cf81', GradientType=0);border:1px solid #479247;text-shadow:0 0 1px #111}button.w2ui-btn-green:hover{color:#fff;background-image:-webkit-linear-gradient(#6abe68 0,#3f8f3d 100%);background-image:-moz-linear-gradient(#6abe68 0,#3f8f3d 100%);background-image:-ms-linear-gradient(#6abe68 0,#3f8f3d 100%);background-image:-o-linear-gradient(#6abe68 0,#3f8f3d 100%);background-image:linear-gradient(#6abe68 0,#3f8f3d 100%);filter:progid:dximagetransform.microsoft.gradient(startColorstr='#ff3f8f3d', endColorstr='#ff6abe68', GradientType=0);border:1px solid #479247;text-shadow:0 0 1px #111}button.w2ui-btn-green:active,button.w2ui-btn-green.clicked{color:#fff;background-image:-webkit-linear-gradient(#377d36 0,#377d36 100%);background-image:-moz-linear-gradient(#377d36 0,#377d36 100%);background-image:-ms-linear-gradient(#377d36 0,#377d36 100%);background-image:-o-linear-gradient(#377d36 0,#377d36 100%);background-image:linear-gradient(#377d36 0,#377d36 100%);filter:progid:dximagetransform.microsoft.gradient(startColorstr='#ff377d36', endColorstr='#ff377d36', GradientType=0);border:1px solid #555!important;text-shadow:0 0 1px #111}button.w2ui-btn-green:focus:before{border:1px dashed #e8e8e8}button.w2ui-btn-orange{color:#fff;background-image:-webkit-linear-gradient(#fcc272 0,#fb8822 100%);background-image:-moz-linear-gradient(#fcc272 0,#fb8822 100%);background-image:-ms-linear-gradient(#fcc272 0,#fb8822 100%);background-image:-o-linear-gradient(#fcc272 0,#fb8822 100%);background-image:linear-gradient(#fcc272 0,#fb8822 100%);filter:progid:dximagetransform.microsoft.gradient(startColorstr='#fffb8822', endColorstr='#fffcc272', GradientType=0);border:1px solid #B68B4C;text-shadow:0 0 1px #111}button.w2ui-btn-orange:hover{color:#fff;background-image:-webkit-linear-gradient(#f4ad59 0,#f1731f 100%);background-image:-moz-linear-gradient(#f4ad59 0,#f1731f 100%);background-image:-ms-linear-gradient(#f4ad59 0,#f1731f 100%);background-image:-o-linear-gradient(#f4ad59 0,#f1731f 100%);background-image:linear-gradient(#f4ad59 0,#f1731f 100%);filter:progid:dximagetransform.microsoft.gradient(startColorstr='#fff1731f', endColorstr='#fff4ad59', GradientType=0);border:1px solid #B68B4C;text-shadow:0 0 1px #111}button.w2ui-btn-orange:active,button.w2ui-btn-orange.clicked{color:#fff;border:1px solid #666;background-image:-webkit-linear-gradient(#b98747 0,#b98747 100%);background-image:-moz-linear-gradient(#b98747 0,#b98747 100%);background-image:-ms-linear-gradient(#b98747 0,#b98747 100%);background-image:-o-linear-gradient(#b98747 0,#b98747 100%);background-image:linear-gradient(#b98747 0,#b98747 100%);filter:progid:dximagetransform.microsoft.gradient(startColorstr='#ffb98747', endColorstr='#ffb98747', GradientType=0);text-shadow:0 0 1px #111}button.w2ui-btn-orange:focus:before{border:1px dashed #f9f9f9}button.w2ui-btn-red{color:#fff;background-image:-webkit-linear-gradient(#ff6e70 0,#c72d2d 100%);background-image:-moz-linear-gradient(#ff6e70 0,#c72d2d 100%);background-image:-ms-linear-gradient(#ff6e70 0,#c72d2d 100%);background-image:-o-linear-gradient(#ff6e70 0,#c72d2d 100%);background-image:linear-gradient(#ff6e70 0,#c72d2d 100%);filter:progid:dximagetransform.microsoft.gradient(startColorstr='#ffc72d2d', endColorstr='#ffff6e70', GradientType=0);border:1px solid #BB3C3E;text-shadow:0 0 1px #111}button.w2ui-btn-red:hover{color:#fff;background-image:-webkit-linear-gradient(#ee696c 0,#ae2527 100%);background-image:-moz-linear-gradient(#ee696c 0,#ae2527 100%);background-image:-ms-linear-gradient(#ee696c 0,#ae2527 100%);background-image:-o-linear-gradient(#ee696c 0,#ae2527 100%);background-image:linear-gradient(#ee696c 0,#ae2527 100%);filter:progid:dximagetransform.microsoft.gradient(startColorstr='#ffae2527', endColorstr='#ffee696c', GradientType=0);border:1px solid #BB3C3E;text-shadow:0 0 1px #111}button.w2ui-btn-red:active,button.w2ui-btn-red.clicked{color:#fff;border:1px solid #861C1E;background-image:-webkit-linear-gradient(#9c2123 0,#9c2123 100%);background-image:-moz-linear-gradient(#9c2123 0,#9c2123 100%);background-image:-ms-linear-gradient(#9c2123 0,#9c2123 100%);background-image:-o-linear-gradient(#9c2123 0,#9c2123 100%);background-image:linear-gradient(#9c2123 0,#9c2123 100%);filter:progid:dximagetransform.microsoft.gradient(startColorstr='#ff9c2123', endColorstr='#ff9c2123', GradientType=0);text-shadow:0 0 1px #111}button.w2ui-btn-red:focus:before{border:1px dashed #ddd}button.w2ui-btn-small{padding:5px!important;margin:0;min-width:0}button.w2ui-btn-small:focus:before{border-radius:2px;top:2px;bottom:2px;left:2px;right:2px}.w2ui-form{position:relative;color:#000;background-color:#f2f2f2;border:1px solid silver;border-radius:3px;padding:0;overflow:hidden!important}.w2ui-form>div{position:absolute;overflow:hidden}.w2ui-form .w2ui-form-header{position:absolute;left:0;right:0;border-bottom:1px solid #99bbe8!important;overflow:hidden;color:#444;font-size:13px;text-align:center;padding:8px;background-image:-webkit-linear-gradient(#dae6f3,#c2d5ed);background-image:-moz-linear-gradient(#dae6f3,#c2d5ed);background-image:-ms-linear-gradient(#dae6f3,#c2d5ed);background-image:-o-linear-gradient(#dae6f3,#c2d5ed);background-image:linear-gradient(#dae6f3,#c2d5ed);filter:progid:dximagetransform.microsoft.gradient(startColorstr='#ffdae6f3', endColorstr='#ffc2d5ed', GradientType=0);border-top-left-radius:3px;border-top-right-radius:3px}.w2ui-form .w2ui-form-toolbar{position:absolute;left:0;right:0;margin:0;padding:6px 3px;border-bottom:1px solid #d5d8d8}.w2ui-form .w2ui-form-tabs{margin:0;padding:0}.w2ui-form .w2ui-tabs{position:absolute;left:0;right:0;border-top-left-radius:3px;border-top-right-radius:3px;padding-top:5px!important;background-color:#fafafa}.w2ui-form .w2ui-tabs .w2ui-tab.active{background-color:#f2f2f2}.w2ui-form .w2ui-page{position:absolute;left:0;right:0;overflow:auto;padding:10px;border-left:1px solid inherit;border-right:1px solid inherit;background-color:inherit;border-radius:3px}.w2ui-form .w2ui-buttons{position:absolute;left:0;right:0;bottom:0;text-align:center;border-top:1px solid #d5d8d8;border-bottom:0 solid #d5d8d8;background-color:#fafafa;padding:15px 0!important;border-bottom-left-radius:3px;border-bottom-right-radius:3px}.w2ui-form .w2ui-buttons input[type=button],.w2ui-form .w2ui-buttons button{min-width:80px;margin-right:5px}.w2ui-form input[type=checkbox],.w2ui-form input[type=radio]{margin-top:4px;margin-bottom:4px}.w2ui-form input[type=checkbox].w2ui-toggle{margin:0}.w2ui-group-title{padding:5px 2px;color:#8D96A2;text-shadow:1px 1px 2px #fdfdfd;font-size:120%}.w2ui-group{background-color:#f9f9f9;margin:5px 0 10px;padding:10px 5px;border-top:1px solid #dcdcdc;border-bottom:1px solid #dcdcdc}.w2ui-field>label{display:block;float:left;margin-top:7px;margin-bottom:3px;width:120px;padding:0;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;text-align:right;min-height:20px;color:#666}.w2ui-field>div{margin-bottom:3px;margin-left:128px;padding:3px;min-height:28px;float:none}.w2ui-field.w2ui-required>div{position:relative}.w2ui-field.w2ui-required>div::before{content:'*';position:absolute;margin-top:5px;margin-left:-9px;color:red}.w2ui-field.w2ui-span1>label{width:20px}.w2ui-field.w2ui-span1>div{margin-left:28px}.w2ui-field.w2ui-span2>label{width:40px}.w2ui-field.w2ui-span2>div{margin-left:48px}.w2ui-field.w2ui-span3>label{width:60px}.w2ui-field.w2ui-span3>div{margin-left:68px}.w2ui-field.w2ui-span4>label{width:80px}.w2ui-field.w2ui-span4>div{margin-left:88px}.w2ui-field.w2ui-span5>label{width:100px}.w2ui-field.w2ui-span5>div{margin-left:108px}.w2ui-field.w2ui-span6>label{width:120px}.w2ui-field.w2ui-span6>div{margin-left:128px}.w2ui-field.w2ui-span7>label{width:140px}.w2ui-field.w2ui-span7>div{margin-left:148px}.w2ui-field.w2ui-span8>label{width:160px}.w2ui-field.w2ui-span8>div{margin-left:168px}.w2ui-field.w2ui-span9>label{width:180px}.w2ui-field.w2ui-span9>div{margin-left:188px}.w2ui-field.w2ui-span10>label{width:200px}.w2ui-field.w2ui-span10>div{margin-left:208px}.w2ui-error{border:1px solid #ffa8a8!important;background-color:#fff4eb!important}.w2field{padding:3px;border-radius:3px;border:1px solid silver}.w2ui-field-helper{position:absolute;display:inline-block;line-height:100%;user-select:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;-o-user-select:none}.w2ui-field-helper .w2ui-field-up{position:absolute;top:0;padding:2px 3px}.w2ui-field-helper .w2ui-field-down{position:absolute;bottom:0;padding:2px 3px}.w2ui-field-helper .arrow-up:hover{border-bottom-color:#81C6FF}.w2ui-field-helper .arrow-down:hover{border-top-color:#81C6FF}.arrow-up{background:0 0;width:0;height:0;border-left:4px solid transparent;border-right:4px solid transparent;border-bottom:5px solid #777;font-size:0;line-height:0}.arrow-down{background:0 0;width:0;height:0;border-left:4px solid transparent;border-right:4px solid transparent;border-top:5px solid #777;font-size:0;line-height:0}.arrow-left{background:0 0;width:0;height:0;border-bottom:4px solid transparent;border-top:4px solid transparent;border-right:5px solid #777;font-size:0;line-height:0}.arrow-right{background:0 0;width:0;height:0;border-bottom:4px solid transparent;border-top:4px solid transparent;border-left:5px solid #777;font-size:0;line-height:0}.w2ui-color{padding:5px;padding-top:8px;background-color:#fff;border-radius:3px}.w2ui-color>table{table-layout:fixed;width:160px}.w2ui-color>table td{width:20px;height:20px;text-align:center}.w2ui-color>table td div{cursor:pointer;display:inline-block;width:16px;height:17px;padding:1px 4px;border:1px solid transparent;color:#fff;text-shadow:0 0 2px #000}.w2ui-color>table td div:hover{outline:1px solid #666;border:1px solid #fff}.w2ui-calendar{margin:0;padding:1px;line-height:108%}.w2ui-calendar .w2ui-calendar-title{margin:0 -1px;padding:7px 2px;background-image:-webkit-linear-gradient(#f6f6f6,#d9d9d9);background-image:-moz-linear-gradient(#f6f6f6,#d9d9d9);background-image:-ms-linear-gradient(#f6f6f6,#d9d9d9);background-image:-o-linear-gradient(#f6f6f6,#d9d9d9);background-image:linear-gradient(#f6f6f6,#d9d9d9);filter:progid:dximagetransform.microsoft.gradient(startColorstr='#fff6f6f6', endColorstr='#ffd9d9d9', GradientType=0);border-bottom:1px solid #bbb;color:#555;text-align:center;text-shadow:1px 1px 1px #eee;cursor:pointer}.w2ui-calendar .w2ui-calendar-jump{position:absolute;top:27px;left:0;right:0;bottom:0;background-color:#FaFaFa}.w2ui-calendar .w2ui-calendar-jump>:first-child{position:absolute;top:0;left:0;bottom:0;width:110px;overflow:hidden;padding-top:5px;border-right:1px solid silver}.w2ui-calendar .w2ui-calendar-jump>:last-child{position:absolute;top:0;right:0;bottom:0;width:88px;overflow-x:hidden;overflow-y:auto;padding-top:5px;text-align:center}.w2ui-calendar .w2ui-calendar-jump .w2ui-jump-month,.w2ui-calendar .w2ui-calendar-jump .w2ui-jump-year{display:inline-block;padding:5px 0;text-align:center;float:left;margin:2px;width:50px;cursor:default;border:1px solid transparent;border-radius:2px}.w2ui-calendar .w2ui-calendar-jump .w2ui-jump-year{float:none;width:95%}.w2ui-calendar .w2ui-calendar-jump .w2ui-jump-month:hover,.w2ui-calendar .w2ui-calendar-jump .w2ui-jump-year:hover{border:1px solid #ccc;color:#000;background-color:#efefef}.w2ui-calendar .w2ui-calendar-jump .w2ui-jump-month.selected,.w2ui-calendar .w2ui-calendar-jump .w2ui-jump-year.selected{border:1px solid #ccc;color:#000;background-color:#dadada}.w2ui-calendar .w2ui-calendar-previous,.w2ui-calendar .w2ui-calendar-next{width:24px;height:20px;color:#666;border:1px solid transparent;border-radius:3px;padding:2px 3px 1px 2px;margin:-4px 0 0 0;cursor:default}.w2ui-calendar .w2ui-calendar-previous:hover,.w2ui-calendar .w2ui-calendar-next:hover{border:1px solid silver;background-color:#efefef}.w2ui-calendar .w2ui-calendar-previous>div,.w2ui-calendar .w2ui-calendar-next>div{position:absolute;border-left:4px solid #888;border-top:4px solid #888;border-right:4px solid transparent;border-bottom:4px solid transparent;width:0;height:0;padding:0;margin:3px 0 0}.w2ui-calendar .w2ui-calendar-previous{float:left}.w2ui-calendar .w2ui-calendar-previous>div{-webkit-transform:rotate(-45deg);-moz-transform:rotate(-45deg);-ms-transform:rotate(-45deg);-o-transform:rotate(-45deg);transform:rotate(-45deg);margin-left:6px}.w2ui-calendar .w2ui-calendar-next{float:right}.w2ui-calendar .w2ui-calendar-next>div{-webkit-transform:rotate(135deg);-moz-transform:rotate(135deg);-ms-transform:rotate(135deg);-o-transform:rotate(135deg);transform:rotate(135deg);margin-left:2px;margin-right:2px}.w2ui-calendar .w2ui-calendar-now{cursor:pointer;margin-bottom:10px;text-align:center}.w2ui-calendar .w2ui-calendar-now:hover{color:#0A96DE}.w2ui-calendar table.w2ui-calendar-days{padding:0}.w2ui-calendar table.w2ui-calendar-days td{border:1px solid #fff;color:#000;background-color:#f9f9f9;padding:6px;cursor:default;text-align:right}.w2ui-calendar table.w2ui-calendar-days td.w2ui-saturday,.w2ui-calendar table.w2ui-calendar-days td.w2ui-sunday{border:1px solid #fff;color:#c8493b;background-color:#f9f9f9}.w2ui-calendar table.w2ui-calendar-days td.w2ui-saturday:hover,.w2ui-calendar table.w2ui-calendar-days td.w2ui-sunday:hover{border:1px solid #ccc;color:#000;background-color:#e9e9e9}.w2ui-calendar table.w2ui-calendar-days td.w2ui-saturday.w2ui-blocked,.w2ui-calendar table.w2ui-calendar-days td.w2ui-sunday.w2ui-blocked{text-decoration:line-through;border:1px solid #fff;color:#ccc;background-color:#fff}.w2ui-calendar table.w2ui-calendar-days td.w2ui-today{color:#000;background-color:#e2f7cd}.w2ui-calendar table.w2ui-calendar-days td:hover{border:1px solid #ccc;color:#000;background-color:#e9e9e9}.w2ui-calendar table.w2ui-calendar-days td.w2ui-date-selected{border:1px solid #8cb067}.w2ui-calendar table.w2ui-calendar-days td.w2ui-blocked{text-decoration:line-through;border:1px solid #fff;color:#ccc;background-color:#fff}.w2ui-calendar table.w2ui-calendar-days td.w2ui-day-empty{border:1px solid #fff;background-color:#fdfdfd}.w2ui-calendar table.w2ui-calendar-days tr.w2ui-day-title td{border:1px solid #fff;color:gray;background-color:#fff;text-align:center;padding:6px}.w2ui-calendar-time{padding:5px;cursor:default}.w2ui-calendar-time td div{padding:7px 10px;text-align:center;border:1px solid transparent;white-space:nowrap}.w2ui-calendar-time td:nth-child(even){background-color:#f6f6f6}.w2ui-calendar-time td div:hover{border:1px solid #ccc;color:#000;background-color:#e9e9e9}.w2ui-calendar-time td div.w2ui-blocked{text-decoration:line-through;border:1px solid #fff;color:#ccc;background-color:#fff}.w2ui-select{cursor:default;color:#000!important;background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACgAAAALCAQAAACnzwd+AAAAcklEQVR4AcXMsQFBQQDG4P9tAgC0gJYRQJZgKQMwCqCku6vVAAAA+NJHP4KHOk0aV2pRw61n4BBmyOxKQ8I4ehZeuhd3HTx6DQEGZ7sBfr2OOOOj3Yi43kMKs9sZknofOexqZ8npMygwWZTX51CipP+YA1OiZJbYYg9lAAAAAElFTkSuQmCC),-webkit-linear-gradient(top,#fff 20%,#f6f6f6 50%,#eee 52%,#f4f4f4 100%);background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACgAAAALCAQAAACnzwd+AAAAcklEQVR4AcXMsQFBQQDG4P9tAgC0gJYRQJZgKQMwCqCku6vVAAAA+NJHP4KHOk0aV2pRw61n4BBmyOxKQ8I4ehZeuhd3HTx6DQEGZ7sBfr2OOOOj3Yi43kMKs9sZknofOexqZ8npMygwWZTX51CipP+YA1OiZJbYYg9lAAAAAElFTkSuQmCC),-moz-linear-gradient(top,#fff 20%,#f6f6f6 50%,#eee 52%,#f4f4f4 100%);background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACgAAAALCAQAAACnzwd+AAAAcklEQVR4AcXMsQFBQQDG4P9tAgC0gJYRQJZgKQMwCqCku6vVAAAA+NJHP4KHOk0aV2pRw61n4BBmyOxKQ8I4ehZeuhd3HTx6DQEGZ7sBfr2OOOOj3Yi43kMKs9sZknofOexqZ8npMygwWZTX51CipP+YA1OiZJbYYg9lAAAAAElFTkSuQmCC),-ms-linear-gradient(top,#fff 20%,#f6f6f6 50%,#eee 52%,#f4f4f4 100%);background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACgAAAALCAQAAACnzwd+AAAAcklEQVR4AcXMsQFBQQDG4P9tAgC0gJYRQJZgKQMwCqCku6vVAAAA+NJHP4KHOk0aV2pRw61n4BBmyOxKQ8I4ehZeuhd3HTx6DQEGZ7sBfr2OOOOj3Yi43kMKs9sZknofOexqZ8npMygwWZTX51CipP+YA1OiZJbYYg9lAAAAAElFTkSuQmCC),-o-linear-gradient(top,#fff 20%,#f6f6f6 50%,#eee 52%,#f4f4f4 100%);background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACgAAAALCAQAAACnzwd+AAAAcklEQVR4AcXMsQFBQQDG4P9tAgC0gJYRQJZgKQMwCqCku6vVAAAA+NJHP4KHOk0aV2pRw61n4BBmyOxKQ8I4ehZeuhd3HTx6DQEGZ7sBfr2OOOOj3Yi43kMKs9sZknofOexqZ8npMygwWZTX51CipP+YA1OiZJbYYg9lAAAAAElFTkSuQmCC),linear-gradient(top,#fff 20%,#f6f6f6 50%,#eee 52%,#f4f4f4 100%);background-size:17px 6px,100% 100%;background-position:right center,left top;background-repeat:no-repeat,no-repeat}.w2ui-select[readonly],.w2ui-select[disabled]{background-image:none;background-color:#f1f1f1!important;color:#777!important}.w2ui-list{color:inherit;position:absolute;padding:0;margin:0;min-height:25px;overflow:auto;border:1px solid silver;border-radius:3px;font-size:6px;line-height:100%;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;-ms-box-sizing:border-box;-o-box-sizing:border-box;box-sizing:border-box;background-color:#fff}.w2ui-list input[type=text]{-webkit-box-shadow:none;-moz-box-shadow:none;-ms-box-shadow:none;-o-box-shadow:none;box-shadow:none}.w2ui-list ul{list-style-type:none;background-color:#000;margin:0;padding:0}.w2ui-list ul li{float:left;margin:2px 1px 0 2px;border-radius:3px;width:auto;padding:3px 10px 1px 7px;border:1px solid #88b0d6;background-color:#eff3f5;white-space:nowrap;cursor:default;font-family:verdana;font-size:11px;line-height:100%;height:20px;overflow:hidden;text-overflow:ellipsis;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;-ms-box-sizing:border-box;-o-box-sizing:border-box;box-sizing:border-box}.w2ui-list ul li:hover{background-color:#d0dbe1}.w2ui-list ul li:last-child{border-radius:0;border:1px solid transparent;background-color:transparent}.w2ui-list ul li:last-child input{padding:1px;padding-top:0;margin:0;border:0;outline:0;height:auto;line-height:100%;font-size:inherit;font-family:inherit;background-color:transparent}.w2ui-list ul li .w2ui-list-remove{float:right;width:15px;height:14px;margin:-1px -9px 0 3px;border-radius:15px}.w2ui-list ul li .w2ui-list-remove:hover{background-color:#D77F7F;color:#fff}.w2ui-list ul li .w2ui-list-remove:before{position:relative;top:0;padding:0;margin:0;left:5px;color:inherit;opacity:.7;text-shadow:inherit;font-size:inherit;font-variant:small-caps;content:'x';line-height:100%}.w2ui-list ul li>span.file-size{pointer-events:none;color:#777}.w2ui-list .w2ui-enum-placeholder{display:inline;position:absolute;pointer-events:none;color:#999;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;-ms-box-sizing:border-box;-o-box-sizing:border-box;box-sizing:border-box}.w2ui-list.w2ui-file-dragover{background-color:#E4FFDA;border:1px solid #93E07D}.w2ui-layout{overflow:hidden!important;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;-ms-box-sizing:border-box;-o-box-sizing:border-box;box-sizing:border-box}.w2ui-layout *{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;-ms-box-sizing:border-box;-o-box-sizing:border-box;box-sizing:border-box}.w2ui-layout>div{position:absolute;overflow:hidden;border:0;margin:0;padding:0;outline:0;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;-ms-box-sizing:border-box;-o-box-sizing:border-box;box-sizing:border-box}.w2ui-layout>div .w2ui-panel{display:none;position:absolute;z-index:120}.w2ui-layout>div .w2ui-panel .w2ui-panel-title{position:absolute;left:0;top:0;right:0;padding:5px;background-image:-webkit-linear-gradient(#dae6f3,#c2d5ed);background-image:-moz-linear-gradient(#dae6f3,#c2d5ed);background-image:-ms-linear-gradient(#dae6f3,#c2d5ed);background-image:-o-linear-gradient(#dae6f3,#c2d5ed);background-image:linear-gradient(#dae6f3,#c2d5ed);filter:progid:dximagetransform.microsoft.gradient(startColorstr='#ffdae6f3', endColorstr='#ffc2d5ed', GradientType=0);border:1px solid #b9cee9;border-bottom:1px solid #99bbe8}.w2ui-layout>div .w2ui-panel .w2ui-panel-tabs{position:absolute;left:0;top:0;right:0;z-index:2;display:none;overflow:hidden;background-color:#fafafa;padding:4px 0}.w2ui-layout>div .w2ui-panel .w2ui-panel-tabs>.w2ui-tab.active{background-color:#f2f2f2}.w2ui-layout>div .w2ui-panel .w2ui-panel-toolbar{position:absolute;left:0;top:0;right:0;z-index:2;display:none;overflow:hidden;background-color:#fafafa;border-bottom:1px solid silver;padding:4px}.w2ui-layout>div .w2ui-panel .w2ui-panel-content{position:absolute;left:0;top:0;right:0;bottom:0;z-index:1;color:inherit;background-color:#f2f2f2}.w2ui-layout>div .w2ui-resizer{display:none;position:absolute;z-index:121;background-color:transparent}.w2ui-layout>div .w2ui-resizer:hover,.w2ui-layout>div .w2ui-resizer.active{background-color:#c8cad1}.w2ui-grid{position:relative;border:1px solid silver;border-radius:2px;overflow:hidden!important}.w2ui-grid>div{position:absolute;overflow:hidden}.w2ui-grid .w2ui-grid-header{position:absolute;border-bottom:1px solid #99bbe8!important;height:28px;overflow:hidden;color:#444;font-size:13px;text-align:center;padding:7px;background-image:-webkit-linear-gradient(#dae6f3,#c2d5ed);background-image:-moz-linear-gradient(#dae6f3,#c2d5ed);background-image:-ms-linear-gradient(#dae6f3,#c2d5ed);background-image:-o-linear-gradient(#dae6f3,#c2d5ed);background-image:linear-gradient(#dae6f3,#c2d5ed);filter:progid:dximagetransform.microsoft.gradient(startColorstr='#ffdae6f3', endColorstr='#ffc2d5ed', GradientType=0);border-top-left-radius:2px;border-top-right-radius:2px}.w2ui-grid .w2ui-grid-toolbar{position:absolute;border-bottom:1px solid silver;background-color:#eaeaea;height:38px;padding:6px 1px 4px;margin:0;box-shadow:0 1px 2px #ddd}.w2ui-grid .w2ui-toolbar-search{width:160px;margin-right:3px}.w2ui-grid .w2ui-toolbar-search .w2ui-search-all{outline:0!important;width:160px!important;border-radius:3px!important;line-height:normal!important;height:23px!important;border:1px solid #b9b9b9!important;color:#000!important;background-color:#fff!important;padding:3px 18px 3px 21px!important;margin:0!important;margin-top:1px!important}.w2ui-grid .w2ui-toolbar-search .w2ui-search-down{position:absolute;margin-top:-7px;margin-left:4px}.w2ui-grid .w2ui-toolbar-search .w2ui-search-clear{position:absolute;width:16px;height:16px;margin-top:-8px;margin-left:-20px;border-radius:15px;cursor:default}.w2ui-grid .w2ui-toolbar-search .w2ui-search-clear:hover{background-color:#D77F7F;color:#fff}.w2ui-grid .w2ui-toolbar-search .w2ui-search-clear:before{position:relative;top:2px;left:5px;opacity:.6;color:inherit;text-shadow:inherit;content:'x';cursor:default}.w2ui-grid .w2ui-grid-body{position:absolute;overflow:hidden;padding:0;background-color:#fff;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;-o-user-select:none;user-select:none}.w2ui-grid .w2ui-grid-body input,.w2ui-grid .w2ui-grid-body select,.w2ui-grid .w2ui-grid-body textarea{user-select:text;-webkit-user-select:text;-moz-user-select:text;-ms-user-select:text;-o-user-select:text}.w2ui-grid .w2ui-grid-body div.w2ui-input{user-select:tex;-webkit-user-select:tex;-moz-user-select:tex;-ms-user-select:tex;-o-user-select:tex;background-color:#fff;padding:4px 2px;border:1px solid transparent;width:100%;height:100%;pointer-events:auto;outline:0;white-space:pre;overflow:hidden}.w2ui-grid .w2ui-grid-body .w2ui-grid-columns,.w2ui-grid .w2ui-grid-body .w2ui-grid-fcolumns{overflow:hidden;position:absolute;left:0;top:0;right:0;box-shadow:0 1px 4px #ddd;height:auto}.w2ui-grid .w2ui-grid-body .w2ui-grid-columns table,.w2ui-grid .w2ui-grid-body .w2ui-grid-fcolumns table{height:auto}.w2ui-grid .w2ui-grid-body .w2ui-grid-columns .w2ui-resizer,.w2ui-grid .w2ui-grid-body .w2ui-grid-fcolumns .w2ui-resizer{position:absolute;z-index:1000;display:block;background-image:none;background-color:rgba(0,0,0,0);padding:0;margin:0;width:6px;height:12px;cursor:col-resize}.w2ui-grid .w2ui-grid-body .w2ui-grid-records,.w2ui-grid .w2ui-grid-body .w2ui-grid-frecords{position:absolute;left:0;right:0;top:0;bottom:0}.w2ui-grid .w2ui-grid-body .w2ui-grid-records table tr.w2ui-odd,.w2ui-grid .w2ui-grid-body .w2ui-grid-frecords table tr.w2ui-odd{color:inherit;background-color:#fff}.w2ui-grid .w2ui-grid-body .w2ui-grid-records table tr.w2ui-odd:hover,.w2ui-grid .w2ui-grid-body .w2ui-grid-frecords table tr.w2ui-odd:hover,.w2ui-grid .w2ui-grid-body .w2ui-grid-records table tr.w2ui-odd.w2ui-record-hover,.w2ui-grid .w2ui-grid-body .w2ui-grid-frecords table tr.w2ui-odd.w2ui-record-hover{color:inherit;background-color:#e6f0ff}.w2ui-grid .w2ui-grid-body .w2ui-grid-records table tr.w2ui-odd.w2ui-empty-record:hover,.w2ui-grid .w2ui-grid-body .w2ui-grid-frecords table tr.w2ui-odd.w2ui-empty-record:hover{background-color:#fff}.w2ui-grid .w2ui-grid-body .w2ui-grid-records table tr.w2ui-even,.w2ui-grid .w2ui-grid-body .w2ui-grid-frecords table tr.w2ui-even{color:inherit;background-color:#f3f6fa}.w2ui-grid .w2ui-grid-body .w2ui-grid-records table tr.w2ui-even:hover,.w2ui-grid .w2ui-grid-body .w2ui-grid-frecords table tr.w2ui-even:hover,.w2ui-grid .w2ui-grid-body .w2ui-grid-records table tr.w2ui-even.w2ui-record-hover,.w2ui-grid .w2ui-grid-body .w2ui-grid-frecords table tr.w2ui-even.w2ui-record-hover{color:inherit;background-color:#e6f0ff}.w2ui-grid .w2ui-grid-body .w2ui-grid-records table tr.w2ui-even.w2ui-empty-record:hover,.w2ui-grid .w2ui-grid-body .w2ui-grid-frecords table tr.w2ui-even.w2ui-empty-record:hover{background-color:#f3f6fa}.w2ui-grid .w2ui-grid-body .w2ui-grid-records table tr.w2ui-selected,.w2ui-grid .w2ui-grid-body .w2ui-grid-frecords table tr.w2ui-selected,.w2ui-grid .w2ui-grid-body .w2ui-grid-records table tr td.w2ui-selected,.w2ui-grid .w2ui-grid-body .w2ui-grid-frecords table tr td.w2ui-selected{color:#000!important;background-color:#b6d5ff!important}.w2ui-grid .w2ui-grid-body .w2ui-grid-records table tr.w2ui-inactive,.w2ui-grid .w2ui-grid-body .w2ui-grid-frecords table tr.w2ui-inactive,.w2ui-grid .w2ui-grid-body .w2ui-grid-records table tr td.w2ui-inactive,.w2ui-grid .w2ui-grid-body .w2ui-grid-frecords table tr td.w2ui-inactive{background-color:#d8dee7!important}.w2ui-grid .w2ui-grid-body .w2ui-grid-records .w2ui-expanded1,.w2ui-grid .w2ui-grid-body .w2ui-grid-frecords .w2ui-expanded1{height:0;border-bottom:1px solid #b2bac0}.w2ui-grid .w2ui-grid-body .w2ui-grid-records .w2ui-expanded1>div,.w2ui-grid .w2ui-grid-body .w2ui-grid-frecords .w2ui-expanded1>div{height:0;border:0;transition:height .3s,opacity .3s}.w2ui-grid .w2ui-grid-body .w2ui-grid-records .w2ui-expanded2,.w2ui-grid .w2ui-grid-body .w2ui-grid-frecords .w2ui-expanded2{height:0;border-radius:0;border-bottom:1px solid #b2bac0}.w2ui-grid .w2ui-grid-body .w2ui-grid-records .w2ui-expanded2>div,.w2ui-grid .w2ui-grid-body .w2ui-grid-frecords .w2ui-expanded2>div{height:0;border:0;transition:height .3s,opacity .3s}.w2ui-grid .w2ui-grid-body .w2ui-grid-records .w2ui-load-more,.w2ui-grid .w2ui-grid-body .w2ui-grid-frecords .w2ui-load-more{border-top:1px solid #d6d5d7;cursor:pointer}.w2ui-grid .w2ui-grid-body .w2ui-grid-records .w2ui-load-more>div,.w2ui-grid .w2ui-grid-body .w2ui-grid-frecords .w2ui-load-more>div{text-align:center;color:#777;background-color:rgba(233,237,243,.5);padding:10px 0 15px;border-top:1px solid #fff}.w2ui-grid .w2ui-grid-body .w2ui-grid-records .w2ui-load-more>div:hover,.w2ui-grid .w2ui-grid-body .w2ui-grid-frecords .w2ui-load-more>div:hover{color:inherit;background-color:#e6f0ff}.w2ui-grid .w2ui-grid-body table{border-spacing:0;border-collapse:collapse;table-layout:fixed;width:1px}.w2ui-grid .w2ui-grid-body table .w2ui-head{margin:0;padding:0;border-right:1px solid #c5c5c5;border-bottom:1px solid #c5c5c5;color:#000;background-image:-webkit-linear-gradient(#f9f9f9,#e4e4e4);background-image:-moz-linear-gradient(#f9f9f9,#e4e4e4);background-image:-ms-linear-gradient(#f9f9f9,#e4e4e4);background-image:-o-linear-gradient(#f9f9f9,#e4e4e4);background-image:linear-gradient(#f9f9f9,#e4e4e4);filter:progid:dximagetransform.microsoft.gradient(startColorstr='#fff9f9f9', endColorstr='#ffe4e4e4', GradientType=0)}.w2ui-grid .w2ui-grid-body table .w2ui-head>div{padding:7px 3px;white-space:nowrap;text-overflow:ellipsis;overflow:hidden;position:relative}.w2ui-grid .w2ui-grid-body table .w2ui-head.w2ui-col-intersection{border-right-color:#72b2ff}.w2ui-grid .w2ui-grid-body table .w2ui-head.w2ui-reorder-cols-head:hover{cursor:move}.w2ui-grid .w2ui-grid-body table .w2ui-head .col-intersection-marker{padding:0;position:absolute;height:100%;top:0}.w2ui-grid .w2ui-grid-body table .w2ui-head .col-intersection-marker.left{left:0;margin-left:-5px}.w2ui-grid .w2ui-grid-body table .w2ui-head .col-intersection-marker.right{right:0;margin-right:-5px}.w2ui-grid .w2ui-grid-body table .w2ui-head .col-intersection-marker .top-marker{position:absolute;top:0;height:0;width:0;border-top:5px solid #72b2ff;border-left:5px solid transparent;border-right:5px solid transparent}.w2ui-grid .w2ui-grid-body table .w2ui-head .col-intersection-marker .bottom-marker{position:absolute;bottom:0;height:0;width:0;border-bottom:5px solid #72b2ff;border-left:5px solid transparent;border-right:5px solid transparent}.w2ui-grid .w2ui-grid-body table td{border-right:1px solid #d6d5d7;border-bottom:0 solid #d6d5d7;cursor:default;overflow:hidden}.w2ui-grid .w2ui-grid-body table td.w2ui-soft-span,.w2ui-grid .w2ui-grid-body table td.w2ui-soft-hidden{border-right-color:transparent}.w2ui-grid .w2ui-grid-body table td.w2ui-grid-data{margin:0;padding:0}.w2ui-grid .w2ui-grid-body table td.w2ui-grid-data .w2ui-info{position:relative;top:1px;font-size:14px;color:#8D99A7;cursor:pointer;width:16px;display:inline-block;margin-right:2px;text-align:center}.w2ui-grid .w2ui-grid-body table td.w2ui-grid-data>div{padding:3px;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.w2ui-grid .w2ui-grid-body table td.w2ui-grid-data>div.flexible-record{height:auto;overflow:visible;white-space:normal}.w2ui-grid .w2ui-grid-body table td.w2ui-grid-data .w2ui-show-children{width:16px;height:10px;display:inline-block;position:relative;top:-1px;cursor:pointer}.w2ui-grid .w2ui-grid-body table td:last-child{border-right:0}.w2ui-grid .w2ui-grid-body table .w2ui-col-number{width:34px;color:#777;background-color:rgba(233,237,243,.5)}.w2ui-grid .w2ui-grid-body table .w2ui-col-number div{padding:0 7px 0 3px;text-align:right}.w2ui-grid .w2ui-grid-body table .w2ui-col-number.w2ui-head{cursor:pointer}.w2ui-grid .w2ui-grid-body table .w2ui-col-select{width:26px}.w2ui-grid .w2ui-grid-body table .w2ui-col-select div{padding:0;text-align:center;overflow:hidden}.w2ui-grid .w2ui-grid-body table .w2ui-col-select div input[type=checkbox]{margin-top:0;margin-bottom:0;position:relative}.w2ui-grid .w2ui-grid-body table .w2ui-col-expand{width:26px}.w2ui-grid .w2ui-grid-body table .w2ui-col-expand div{padding:0;text-align:center;font-weight:700}.w2ui-grid .w2ui-grid-body table .w2ui-col-selected{background-color:#d1d1d1!important}.w2ui-grid .w2ui-grid-body table .w2ui-row-selected{background-color:#d1d1d1!important}.w2ui-grid .w2ui-grid-body div.w2ui-col-header{height:auto!important;width:100%;overflow:hidden;padding-right:10px!important}.w2ui-grid .w2ui-grid-body div.w2ui-col-header>div.w2ui-sort-up{border:4px solid transparent;border-bottom:5px solid #8D99A7;margin-top:-2px;margin-right:-7px;float:right}.w2ui-grid .w2ui-grid-body div.w2ui-col-header>div.w2ui-sort-down{border:4px solid transparent;border-top:5px solid #8D99A7;margin-top:2px;margin-right:-7px;float:right}.w2ui-grid .w2ui-grid-body .w2ui-col-group{text-align:center}.w2ui-grid .w2ui-grid-body .w2ui-grid-scroll1{position:absolute;left:0;bottom:0;border-top:1px solid #ddd;border-right:1px solid #ddd;background-color:#FAFAFA}.w2ui-grid .w2ui-grid-empty-msg{position:absolute;top:27px;left:0;right:0;bottom:0;background-color:rgba(255,255,255,.65)}.w2ui-grid .w2ui-grid-empty-msg>div{position:absolute;left:0;right:0;top:45%;transform:translateY(-45%);text-align:center;font-size:13px;color:#666}.w2ui-grid .w2ui-changed{background:url(data:image/gif;base64,R0lGODlhCgAKAJEAALAABf///wAAAAAAACH5BAEAAAIALAAAAAAKAAoAAAIPlI8Hy8mbxIsSUnup3rQAADs=) no-repeat top right}.w2ui-grid .w2ui-edit-box{position:absolute;z-index:1001;border:2px solid #6299DA;pointer-events:auto}.w2ui-grid .w2ui-editable{overflow:hidden;height:100%!important;margin:0!important;padding:0!important}.w2ui-grid .w2ui-editable input{border:0;border-radius:0;margin:0;padding:4px 3px;width:100%;height:100%}.w2ui-grid .w2ui-editable input.w2ui-select{outline:0!important;background:#fff}.w2ui-grid .w2ui-grid-summary{position:absolute;box-shadow:0 -1px 4px #aaa}.w2ui-grid .w2ui-grid-summary table{color:inherit}.w2ui-grid .w2ui-grid-summary table .w2ui-odd{background-color:#eef5eb}.w2ui-grid .w2ui-grid-summary table .w2ui-even{background-color:#f8fff5}.w2ui-grid .w2ui-grid-footer{position:absolute;margin:0;padding:0;text-align:center;height:24px;overflow:hidden;user-select:text;-webkit-user-select:text;-moz-user-select:text;-ms-user-select:text;-o-user-select:text;box-shadow:0 -1px 4px #eee;color:#444;background-color:#f8f8f8;border-top:1px solid #ddd;border-bottom-left-radius:2px;border-bottom-right-radius:2px}.w2ui-grid .w2ui-grid-footer .w2ui-footer-left{float:left;padding-top:5px;padding-left:5px}.w2ui-grid .w2ui-grid-footer .w2ui-footer-right{float:right;padding-top:5px;padding-right:5px}.w2ui-grid .w2ui-grid-footer .w2ui-footer-center{padding:2px;text-align:center}.w2ui-grid .w2ui-grid-footer .w2ui-footer-center .w2ui-footer-nav{width:110px;margin:0 auto;padding:0;text-align:center}.w2ui-grid .w2ui-grid-footer .w2ui-footer-center .w2ui-footer-nav input[type=text]{padding:1px 2px 2px;border-radius:3px;width:40px;text-align:center}.w2ui-grid .w2ui-grid-footer .w2ui-footer-center .w2ui-footer-nav a.w2ui-footer-btn{display:inline-block;border-radius:3px;cursor:pointer;font-size:11px;line-height:16px;padding:1px 5px;width:30px;height:18px;margin-top:-1px;color:#000;background-color:transparent}.w2ui-grid .w2ui-grid-footer .w2ui-footer-center .w2ui-footer-nav a.w2ui-footer-btn:hover{color:#000;background-color:#aec8ff}.w2ui-grid .w2ui-grid-focus-input{position:absolute;top:0;right:0;z-index:-1;opacity:0;overflow:hidden;padding:0;margin:0;width:1px;height:1px;resize:none;border:0}.w2ui-ss .w2ui-grid-body .w2ui-grid-records table tr td.w2ui-selected{background-color:#EEF4FE!important}.w2ui-ss .w2ui-grid-body .w2ui-grid-records table tr td.w2ui-inactive{background-color:#F4F6F9!important}.w2ui-ss .w2ui-grid-body .w2ui-grid-records table td{border-right-width:1px;border-bottom:1px solid #efefef}.w2ui-ss .w2ui-grid-body .w2ui-grid-records table tr.w2ui-odd,.w2ui-ss .w2ui-grid-body .w2ui-grid-records table tr.w2ui-even,.w2ui-ss .w2ui-grid-body .w2ui-grid-records table tr.w2ui-odd:hover,.w2ui-ss .w2ui-grid-body .w2ui-grid-records table tr.w2ui-even:hover{background-color:inherit}.w2ui-ss .w2ui-grid-body .w2ui-grid-records table tr:first-child td{border-top:0;border-bottom:0}.w2ui-ss .w2ui-grid-body .w2ui-grid-frecords table tr td.w2ui-selected{background-color:#EEF4FE!important}.w2ui-ss .w2ui-grid-body .w2ui-grid-frecords table tr td.w2ui-inactive{background-color:#F4F6F9!important}.w2ui-ss .w2ui-grid-body .w2ui-grid-frecords table td{border-right-width:1px;border-bottom:1px solid #efefef}.w2ui-ss .w2ui-grid-body .w2ui-grid-frecords table tr.w2ui-odd,.w2ui-ss .w2ui-grid-body .w2ui-grid-frecords table tr.w2ui-even,.w2ui-ss .w2ui-grid-body .w2ui-grid-frecords table tr.w2ui-odd:hover,.w2ui-ss .w2ui-grid-body .w2ui-grid-frecords table tr.w2ui-even:hover{background-color:inherit}.w2ui-ss .w2ui-grid-body .w2ui-grid-frecords table tr:first-child td{border-bottom:0}.w2ui-ss .w2ui-grid-body .w2ui-selection{position:absolute;z-index:1000;border:2px solid #6299DA;pointer-events:none}.w2ui-ss .w2ui-grid-body .w2ui-selection .w2ui-selection-resizer{cursor:crosshair;position:absolute;bottom:0;right:0;width:6px;height:6px;margin-right:-3px;margin-bottom:-3px;background-color:#457FC2;border:.5px solid #fff;outline:1px solid #fff;pointer-events:auto}.w2ui-ss .w2ui-grid-body .w2ui-selection.w2ui-inactive{border:2px solid #C0C2C5}.w2ui-ss .w2ui-grid-body .w2ui-selection.w2ui-inactive .w2ui-selection-resizer{background-color:#B0B0B0}.w2ui-ss .w2ui-grid-body .w2ui-soft-range{position:absolute;pointer-events:none;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.w2ui-ss .w2ui-grid-body .w2ui-changed{background:inherit}.w2ui-info-bubble table{font-size:11px;font-family:Verdana,Arial,sans-serif;color:#fff;text-shadow:1px 1px solid #999}.w2ui-info-bubble table tr td:first-child{white-space:nowrap;padding:2px;padding-right:10px;color:#ddd;vertical-align:top}.w2ui-info-bubble table tr td:last-child{white-space:pre;padding:2px}.w2ui-overlay .w2ui-select-field{padding:4px 0;cursor:default}.w2ui-overlay .w2ui-select-field table{font-size:11px;font-family:Verdana,Arial,sans-serif;border-spacing:0;border-collapse:border-collapse}.w2ui-overlay .w2ui-select-field table tr{height:27px}.w2ui-overlay .w2ui-select-field table tr:hover{background-color:#b6d5ff}.w2ui-overlay .w2ui-select-field table tr td:nth-child(1){width:26px;padding-right:6px;text-align:right;color:#888}.w2ui-overlay .w2ui-select-field table tr td:nth-child(2){padding:3px 20px 3px 0}.w2ui-overlay .w2ui-col-on-off{padding:4px 0}.w2ui-overlay .w2ui-col-on-off table{border-spacing:0;border-collapse:border-collapse}.w2ui-overlay .w2ui-col-on-off table tr:hover{background-color:#b6d5ff}.w2ui-overlay .w2ui-col-on-off table td input[type=checkbox]{margin:3px 2px 2px}.w2ui-overlay .w2ui-col-on-off table td label{display:block;padding:3px 0;padding-right:10px}.w2ui-overlay .w2ui-col-on-off table td:first-child{padding:4px 0 4px 6px}.w2ui-overlay .w2ui-col-on-off table td:last-child{padding:4px 6px 4px 0}.w2ui-overlay .w2ui-grid-searches{text-align:left;padding:0;border-top:0;background-color:#f7f6f0}.w2ui-overlay .w2ui-grid-searches table{padding:4px;padding-top:12px;border-collapse:border-collapse}.w2ui-overlay .w2ui-grid-searches table td{padding:4px}.w2ui-overlay .w2ui-grid-searches table td.close-btn{width:20px;padding-right:20px}.w2ui-overlay .w2ui-grid-searches table td.close-btn button{min-width:24px;height:24px;padding-top:5px!important}.w2ui-overlay .w2ui-grid-searches table td.caption{text-align:right;padding-right:5px;border-right:1px solid #e8e8e3}.w2ui-overlay .w2ui-grid-searches table td.operator{text-align:left;padding:0 10px;padding-right:5px;border-right:1px solid #e8e8e3;height:31px}.w2ui-overlay .w2ui-grid-searches table td.operator select{width:100%;color:#000}.w2ui-overlay .w2ui-grid-searches table td.operator select::-ms-expand{display:none}.w2ui-overlay .w2ui-grid-searches table td.value{padding-right:5px;padding-left:5px}.w2ui-overlay .w2ui-grid-searches table td.value input[type=text]{border-radius:3px;padding:3px;margin-right:3px;height:23px}.w2ui-overlay .w2ui-grid-searches table td.value select{padding:3px;margin-right:3px;height:23px}.w2ui-overlay .w2ui-grid-searches table td.actions{border-right:0}.w2ui-overlay .w2ui-grid-searches table td.actions>div{margin:-7px;margin-top:15px;padding:13px 0;text-align:center;background-color:#efefe9;border-top:1px solid #e8e8e3}.w2ui-popup{position:fixed;z-index:1600;overflow:hidden;font-family:Verdana,Arial,sans-serif;border-radius:6px;padding:0;margin:0;border:1px solid #777;background-color:#eee;box-shadow:0 0 25px #555}.w2ui-popup,.w2ui-popup *{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;-ms-box-sizing:border-box;-o-box-sizing:border-box;box-sizing:border-box}.w2ui-popup .w2ui-popup-title{padding:6px;border-radius:6px 6px 0 0;background-image:-webkit-linear-gradient(#ececec,#dfdfdf);background-image:-moz-linear-gradient(#ececec,#dfdfdf);background-image:-ms-linear-gradient(#ececec,#dfdfdf);background-image:-o-linear-gradient(#ececec,#dfdfdf);background-image:linear-gradient(#ececec,#dfdfdf);filter:progid:dximagetransform.microsoft.gradient(startColorstr='#ffececec', endColorstr='#ffdfdfdf', GradientType=0);border-bottom:2px solid #bfbfbf;position:absolute;overflow:hidden;height:32px;left:0;right:0;top:0;text-overflow:ellipsis;text-align:center;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;-o-user-select:none;user-select:none;cursor:move;font-size:15px;color:#555;z-index:300}.w2ui-popup .w2ui-popup-button{float:right;width:18px;height:18px;cursor:pointer;overflow:hidden;padding:0;margin:0 3px 0 0;background:url(data:image/png;base64,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) no-repeat center left;background-position:0 0;color:transparent!important;border-radius:3px;border:1px solid transparent}.w2ui-popup .w2ui-popup-close{margin-top:0;background-position:-32px 0}.w2ui-popup .w2ui-popup-close:hover{background-color:#ccc;border:1px solid #aaa}.w2ui-popup .w2ui-popup-max{background-position:-16px 0}.w2ui-popup .w2ui-popup-max:hover{background-color:#ccc;border:1px solid #aaa}.w2ui-popup .w2ui-box,.w2ui-popup .w2ui-box-temp{position:absolute;left:0;right:0;top:32px;bottom:52px;z-index:100}.w2ui-popup .w2ui-popup-body{font-size:12px;line-height:130%;padding:0 7px 7px;color:#000;background-color:#eee;position:absolute;overflow:auto;width:100%;height:100%}.w2ui-popup .w2ui-popup-buttons{padding:12px;border-radius:0 0 6px 6px;border-top:1px solid #d5d8d8;background-color:#f1f1f1;text-align:center;position:absolute;overflow:hidden;height:52px;left:0;right:0;bottom:0;z-index:200}.w2ui-popup .w2ui-popup-no-title{border-top-left-radius:6px;border-top-right-radius:6px;top:0!important}.w2ui-popup .w2ui-popup-no-buttons{border-bottom-left-radius:6px;border-bottom-right-radius:6px;bottom:0!important}.w2ui-popup .w2ui-alert-msg,.w2ui-popup .w2ui-confirm-msg{font-size:13px;line-height:1.5}.w2ui-sidebar{position:relative;cursor:default;overflow:hidden!important;background-color:#edf1f6!important;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;-ms-box-sizing:border-box;-o-box-sizing:border-box;box-sizing:border-box}.w2ui-sidebar *{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;-ms-box-sizing:border-box;-o-box-sizing:border-box;box-sizing:border-box}.w2ui-sidebar>div{position:absolute;overflow:hidden}.w2ui-sidebar .w2ui-sidebar-top{position:absolute;z-index:2;top:0;left:0;right:0}.w2ui-sidebar .w2ui-sidebar-top .w2ui-flat-left,.w2ui-sidebar .w2ui-sidebar-top .w2ui-flat-right{position:absolute;right:2px;top:2px;height:24px;padding:5px;border-radius:2px;background-size:16px 12px;background-position:center center;background-repeat:no-repeat;background-color:#edf1f6}.w2ui-sidebar .w2ui-sidebar-top .w2ui-flat-left:hover,.w2ui-sidebar .w2ui-sidebar-top .w2ui-flat-right:hover{background-color:#d7e1ef}.w2ui-sidebar .w2ui-sidebar-top .w2ui-flat-left{left:auto;width:25px;background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAQAAADZc7J/AAAAzklEQVR4Ae2THRDEMBCFzy1ucatb3eJ2uhi3uNUtbnGrW9zi1rOdNzdvdl7nDpvYt/9/r7+/51myZZf/zXkD2iMHHRSb0x3oskwMieK05PwEXqP4ExSL0wp0ROao2OOuMPOMdUL6XU1/oGLcFWb+NqyTd2W/P/2qTr9h+nFXhOkHXRHiNyjrgp/U/V+WaQcaNY13zZI0A1JvcVqAnrGDTdtDtZUHjHIJhxxVLN0iqXgCP1l/7h8U9kc6abyJ4/eNWPpGdBv+XdUK0K8cnvcBly2rDr7C1HQAAAAASUVORK5CYII=)}.w2ui-sidebar .w2ui-sidebar-top .w2ui-flat-right{left:2px;width:auto;background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAQAAADZc7J/AAAAz0lEQVR4Ae2UG7TGMBCEr1vd4la3uMUtuli3utWtbnGLW9zi9l/bDMzJG7u12cfJfLunf1+UEC9Bv0vVQwJ8hjRCaZafflb1C9RQf4OD0gSDE+i+PiJAabFhQc1y1AYYsJGLY3lgxM17uWPO56yPiFDqVPWgRtpIHSd1zPnwkBsdI58OlNwx4fP2X0TgfMTOoHSdKOXkpyNvEyQh7ul+4swxJSTQuwNDxz68l/ukVNbu0Neen5Z+KvzWxBAqHds349uPFJ/jVOrPjxUq++OLf+20q5+noXo0AAAAAElFTkSuQmCC)}.w2ui-sidebar .w2ui-sidebar-bottom{position:absolute;z-index:2;bottom:0;left:0;right:0}.w2ui-sidebar .w2ui-sidebar-div{position:absolute;z-index:1;overflow:auto;top:0;bottom:0;left:0;right:0;padding:2px 0;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;-o-user-select:none;user-select:none}.w2ui-sidebar .w2ui-sidebar-div table{width:100%}.w2ui-sidebar .w2ui-sidebar-div .w2ui-node{background-color:#edf1f6;border-top:1px solid transparent;border-bottom:1px solid transparent;margin:0;padding:1px 0}.w2ui-sidebar .w2ui-sidebar-div .w2ui-node table{pointer-events:none}.w2ui-sidebar .w2ui-sidebar-div .w2ui-node .w2ui-node-caption,.w2ui-sidebar .w2ui-sidebar-div .w2ui-node .w2ui-node-image,.w2ui-sidebar .w2ui-sidebar-div .w2ui-node .w2ui-node-image>span,.w2ui-sidebar .w2ui-sidebar-div .w2ui-node td.w2ui-node-dots{color:#000;text-shadow:0 0 0 #fff;pointer-events:none}.w2ui-sidebar .w2ui-sidebar-div .w2ui-node .w2ui-node-caption:hover,.w2ui-sidebar .w2ui-sidebar-div .w2ui-node .w2ui-node-image:hover,.w2ui-sidebar .w2ui-sidebar-div .w2ui-node .w2ui-node-image>span:hover,.w2ui-sidebar .w2ui-sidebar-div .w2ui-node td.w2ui-node-dots:hover{color:inherit}.w2ui-sidebar .w2ui-sidebar-div .w2ui-node:hover{border-top:1px solid #f9f9f9;border-bottom:1px solid #f9f9f9;background-color:#d7e1ef}.w2ui-sidebar .w2ui-sidebar-div .w2ui-node .w2ui-node-image{width:22px;text-align:center;pointer-events:none}.w2ui-sidebar .w2ui-sidebar-div .w2ui-node .w2ui-node-image>span{color:#516173!important}.w2ui-sidebar .w2ui-sidebar-div .w2ui-node input,.w2ui-sidebar .w2ui-sidebar-div .w2ui-node button{pointer-events:auto}.w2ui-sidebar .w2ui-sidebar-div .w2ui-selected,.w2ui-sidebar .w2ui-sidebar-div .w2ui-selected:hover{position:relative;background-image:-webkit-linear-gradient(#69b1e0,#4a96d3);background-image:-moz-linear-gradient(#69b1e0,#4a96d3);background-image:-ms-linear-gradient(#69b1e0,#4a96d3);background-image:-o-linear-gradient(#69b1e0,#4a96d3);background-image:linear-gradient(#69b1e0,#4a96d3);filter:progid:dximagetransform.microsoft.gradient(startColorstr='#ff69b1e0', endColorstr='#ff4a96d3', GradientType=0);border-top:1px solid #5295cd;border-bottom:1px solid #2661a6}.w2ui-sidebar .w2ui-sidebar-div .w2ui-selected .w2ui-node-caption,.w2ui-sidebar .w2ui-sidebar-div .w2ui-selected:hover .w2ui-node-caption,.w2ui-sidebar .w2ui-sidebar-div .w2ui-selected .w2ui-node-image,.w2ui-sidebar .w2ui-sidebar-div .w2ui-selected:hover .w2ui-node-image,.w2ui-sidebar .w2ui-sidebar-div .w2ui-selected .w2ui-node-image>span,.w2ui-sidebar .w2ui-sidebar-div .w2ui-selected:hover .w2ui-node-image>span,.w2ui-sidebar .w2ui-sidebar-div .w2ui-selected td.w2ui-node-dots,.w2ui-sidebar .w2ui-sidebar-div .w2ui-selected:hover td.w2ui-node-dots{color:#fff!important;text-shadow:1px 1px 2px #666!important}.w2ui-sidebar .w2ui-sidebar-div .w2ui-selected:before{content:"";border:1px dashed #eee;border-radius:3px;position:absolute;top:2px;bottom:2px;left:2px;right:2px;pointer-events:none}.w2ui-sidebar .w2ui-sidebar-div .w2ui-selected.w2ui-inactive:before{border:1px dashed transparent!important}.w2ui-sidebar .w2ui-sidebar-div .w2ui-disabled,.w2ui-sidebar .w2ui-sidebar-div .w2ui-disabled:hover{background:transparent!important;border-top:1px solid transparent;border-bottom:1px solid transparent}.w2ui-sidebar .w2ui-sidebar-div .w2ui-disabled .w2ui-node-caption,.w2ui-sidebar .w2ui-sidebar-div .w2ui-disabled:hover .w2ui-node-caption,.w2ui-sidebar .w2ui-sidebar-div .w2ui-disabled .w2ui-node-image,.w2ui-sidebar .w2ui-sidebar-div .w2ui-disabled:hover .w2ui-node-image,.w2ui-sidebar .w2ui-sidebar-div .w2ui-disabled .w2ui-node-image>span,.w2ui-sidebar .w2ui-sidebar-div .w2ui-disabled:hover .w2ui-node-image>span,.w2ui-sidebar .w2ui-sidebar-div .w2ui-disabled td.w2ui-node-dots,.w2ui-sidebar .w2ui-sidebar-div .w2ui-disabled:hover td.w2ui-node-dots{opacity:.4;filter:alpha(opacity=40);color:#000!important;text-shadow:0 0 0 #fff!important}.w2ui-sidebar .w2ui-sidebar-div .w2ui-node-caption{white-space:nowrap;padding:5px 0 5px 3px;margin:1px 0 1px 22px;position:relative;z-index:1;font-size:12px}.w2ui-sidebar .w2ui-sidebar-div .w2ui-node-group{white-space:nowrap;overflow:hidden;padding:10px 0 10px 10px;margin:0;cursor:default;color:#868b92;background-color:transparent}.w2ui-sidebar .w2ui-sidebar-div .w2ui-node-group :nth-child(1){margin-right:10px;float:right;color:transparent}.w2ui-sidebar .w2ui-sidebar-div .w2ui-node-group :nth-child(2){font-weight:400;text-transform:uppercase}.w2ui-sidebar .w2ui-sidebar-div .w2ui-node-sub{overflow:hidden}.w2ui-sidebar .w2ui-sidebar-div .w2ui-node-flat{padding:6px 0;text-align:center}.w2ui-sidebar .w2ui-sidebar-div .w2ui-node-flat .w2ui-node-image{text-align:center;width:auto}.w2ui-sidebar .w2ui-sidebar-div .w2ui-node-flat .w2ui-node-image>span{font-size:16px;color:#000;text-shadow:0 0 0 #fff}.w2ui-sidebar .w2ui-sidebar-div .w2ui-node-flat .w2ui-node-image.w2ui-icon{width:21px}.w2ui-sidebar .w2ui-sidebar-div td.w2ui-node-dots{width:18px;padding:0 0 1px 7px;text-align:center}.w2ui-sidebar .w2ui-sidebar-div td.w2ui-node-dots .w2ui-expand{width:16px;margin-top:-3px;pointer-events:auto}.w2ui-sidebar .w2ui-sidebar-div td.w2ui-node-data{padding:1px 1px 3px}.w2ui-sidebar .w2ui-sidebar-div td.w2ui-node-data .w2ui-node-image{padding:3px 0 0;float:left}.w2ui-sidebar .w2ui-sidebar-div td.w2ui-node-data .w2ui-node-image>span{font-size:16px;color:#000;text-shadow:0 0 0 #fff}.w2ui-sidebar .w2ui-sidebar-div td.w2ui-node-data .w2ui-node-image.w2ui-icon{margin-top:3px}.w2ui-sidebar .w2ui-sidebar-div td.w2ui-node-data .w2ui-node-count{float:right;border:1px solid #6f9dc7;border-radius:20px;width:auto;height:18px;padding:2px 7px;margin:3px 4px -2px 0;background-color:#e7f0fc;color:#667274;box-shadow:0 0 0 #fff;text-shadow:1px 1px 1px #e6e6e6;position:relative;z-index:2}.w2ui-tabs{cursor:default;overflow:hidden!important;position:relative;background-color:#fafafa;padding:3px 0}.w2ui-tabs:not(.w2ui-tabs-up){padding-bottom:0!important}.w2ui-tabs.w2ui-tabs-up{padding-top:0!important}.w2ui-tabs table{border-bottom:1px solid silver;padding:0 7px}.w2ui-tabs .w2ui-tab{padding:6px 20px;text-align:center;color:#000;background-color:transparent;border:1px solid silver;border-bottom:1px solid silver;white-space:nowrap;margin:1px 1px -1px 0;border-top-left-radius:4px;border-top-right-radius:4px;cursor:default;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;-o-user-select:none;user-select:none}.w2ui-tabs .w2ui-tab.active{color:#000;background-color:#fff;border:1px solid silver;border-bottom:1px solid transparent}.w2ui-tabs .w2ui-tab.closable{padding:6px 28px 6px 20px}.w2ui-tabs .w2ui-tab-close{color:#555;text-shadow:1px 1px 1px #bbb;float:right;margin:6px 4px 0 0;padding:0 0 0 5px;width:16px;height:16px;opacity:.9;border:0;border-top:3px solid transparent;border-radius:9px}.w2ui-tabs .w2ui-tab-close:hover{background-color:#D77F7F;color:#fff}.w2ui-tabs .w2ui-tab-close:before{position:relative;top:-2px;left:0;opacity:.6;color:inherit;text-shadow:inherit;content:'x'}.w2ui-tabs.w2ui-tabs-up table{border-top:1px solid silver;border-bottom:0}.w2ui-tabs.w2ui-tabs-up .w2ui-tab{border-top:1px solid silver;margin:-1px 1px 0 0;border-radius:0;border-bottom-left-radius:4px;border-bottom-right-radius:4px}.w2ui-tabs.w2ui-tabs-up .w2ui-tab.active{border:1px solid silver;border-top:1px solid transparent}.w2ui-tabs.w2ui-tabs-up .w2ui-tab-close{margin-top:4px}.w2ui-toolbar{margin:0;padding:2px;outline:0;position:relative;background-color:#efefef;overflow:hidden!important;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;-o-user-select:none;user-select:none}.w2ui-toolbar .disabled{opacity:.3;filter:alpha(opacity=30)}.w2ui-toolbar table{table-layout:auto!important}.w2ui-toolbar table td{border:0!important}.w2ui-toolbar table.w2ui-button{margin:0 1px 0 0;border-radius:4px;height:24px;min-width:24px;border:1px solid transparent;background-color:transparent}.w2ui-toolbar table.w2ui-button .w2ui-tb-image{width:22px;height:16px;padding:0;margin:5px 1px 3px!important;border:0!important;text-align:center}.w2ui-toolbar table.w2ui-button .w2ui-tb-image>span{font-size:15px;display:block;color:#8d99a7}.w2ui-toolbar table.w2ui-button .w2ui-tb-image>span:before{vertical-align:top!important}.w2ui-toolbar table.w2ui-button .w2ui-tb-caption{color:#000;padding:0 4px 0 2px}.w2ui-toolbar table.w2ui-button .w2ui-tb-count{padding:0 3px 0 1px}.w2ui-toolbar table.w2ui-button .w2ui-tb-count>span{border:1px solid #f6fcf4;border-radius:11px;width:auto;height:18px;padding:0 6px 1px;background-color:#f2f8f0;color:#666;box-shadow:0 0 2px #474545;text-shadow:1px 1px 0 #fff}.w2ui-toolbar table.w2ui-button .w2ui-tb-down{padding:1px 3px 1px 1px}.w2ui-toolbar table.w2ui-button .w2ui-tb-down>div{border:4px solid transparent;border-top:5px solid #8D99A7;margin-top:5px}.w2ui-toolbar table.w2ui-button.over{border:1px solid #ccc;background-color:#eee}.w2ui-toolbar table.w2ui-button.over .w2ui-tb-caption{color:#000}.w2ui-toolbar table.w2ui-button.down{border:1px solid #aaa;background-color:#ddd}.w2ui-toolbar table.w2ui-button.down .w2ui-tb-caption{color:#666}.w2ui-toolbar table.w2ui-button.checked{border:1px solid #aaa;background-color:#fff}.w2ui-toolbar table.w2ui-button.checked .w2ui-tb-caption{color:#000}.w2ui-toolbar table.w2ui-button table{height:17px;border-radius:4px;cursor:default}.w2ui-toolbar .w2ui-break{background-image:-webkit-linear-gradient(top,rgba(153,153,153,.1) 0,#999 40%,#999 60%,rgba(153,153,153,.1) 100%);background-image:-moz-linear-gradient(top,rgba(153,153,153,.1) 0,#999 40%,#999 60%,rgba(153,153,153,.1) 100%);background-image:-ms-linear-gradient(top,rgba(153,153,153,.1) 0,#999 40%,#999 60%,rgba(153,153,153,.1) 100%);background-image:-o-linear-gradient(top,rgba(153,153,153,.1) 0,#999 40%,#999 60%,rgba(153,153,153,.1) 100%);background-image:linear-gradient(top,rgba(153,153,153,.1) 0,#999 40%,#999 60%,rgba(153,153,153,.1) 100%);filter:progid:dximagetransform.microsoft.gradient(startColorstr='#ff999999', endColorstr='#ff999999', GradientType=0);width:1px!important;height:22px;padding:0;margin:0 6px}.w2ui-listview{overflow:auto!important;background-color:#fff!important;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;-ms-box-sizing:border-box;-o-box-sizing:border-box;box-sizing:border-box}.w2ui-listview *{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;-ms-box-sizing:border-box;-o-box-sizing:border-box;box-sizing:border-box}.w2ui-listview>ul{list-style-type:none;margin:0;cursor:default}.w2ui-listview>ul>li{display:inline-block;vertical-align:top;overflow:hidden;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;-o-user-select:none;user-select:none;border:1px solid transparent;border-radius:4px}.w2ui-listview>ul>li.w2ui-focused{border:1px solid #2661a6}.w2ui-listview>ul>li.w2ui-selected{border:1px solid #2661a6}.w2ui-listview>ul>li.w2ui-selected,.w2ui-listview>ul>li.w2ui-selected.hover{background-image:-webkit-linear-gradient(#69b1e0,#4a96d3);background-image:-moz-linear-gradient(#69b1e0,#4a96d3);background-image:-ms-linear-gradient(#69b1e0,#4a96d3);background-image:-o-linear-gradient(#69b1e0,#4a96d3);background-image:linear-gradient(#69b1e0,#4a96d3);filter:progid:dximagetransform.microsoft.gradient(startColorstr='#ff69b1e0', endColorstr='#ff4a96d3', GradientType=0)}.w2ui-listview>ul>li.w2ui-selected>div>div.caption,.w2ui-listview>ul>li.w2ui-selected.hover>div>div.caption{color:#fff}.w2ui-listview>ul>li.w2ui-selected>div>div.description,.w2ui-listview>ul>li.w2ui-selected.hover>div>div.description{color:#ddd}.w2ui-listview>ul>li.w2ui-selected>div>div.extra>div>div,.w2ui-listview>ul>li.w2ui-selected.hover>div>div.extra>div>div{color:#ddd}.w2ui-listview>ul>li.hover{background-color:#d7e1ef;border:1px solid #2661a6}.w2ui-listview>ul>li div{vertical-align:middle}.w2ui-listview>ul>li>div>div.caption{display:block;text-align:center;word-wrap:break-word;max-height:50px;color:#000;font-size:12px}.w2ui-listview>ul>li>div>div.description{display:none;text-align:left;color:#777;font-size:12px}.w2ui-listview>ul>li>div>div.extra{display:none}.w2ui-listview>ul>li>div>div.extra>div>div{color:#777}.w2ui-icon-small>ul{padding:1px 0 0 1px}.w2ui-icon-small>ul>li{margin:0 1px 1px 0;padding:2px;width:250px;white-space:nowrap}.w2ui-icon-small>ul>li>div>div.w2ui-listview-img{display:inline-block;width:26px;height:22px;font-size:21px;margin-right:2px}.w2ui-icon-small>ul>li>div>div.caption{display:inline-block}.w2ui-icon-medium>ul{padding:4px 0 0 4px}.w2ui-icon-medium>ul>li{margin:0 4px 4px 0;padding:4px;width:100px}.w2ui-icon-medium>ul>li>div>div.w2ui-listview-img{display:block;width:92px;height:60px;font-size:57px;margin-left:auto;margin-right:auto;background-position:center}.w2ui-icon-large>ul{padding:4px 0 0 4px}.w2ui-icon-large>ul>li{margin:0 4px 4px 0;padding:4px;width:160px}.w2ui-icon-large>ul>li>div>div.w2ui-listview-img{display:block;width:152px;height:120px;font-size:114px;margin-left:auto;margin-right:auto;background-position:center}.w2ui-icon-tile>ul{padding:1px 0 0 1px}.w2ui-icon-tile>ul>li{margin:0 1px 1px 0;padding:4px;width:250px;white-space:nowrap}.w2ui-icon-tile>ul>li>div>div.w2ui-listview-img{display:inline-block;width:72px;height:60px;font-size:57px;float:left;margin-right:4px}.w2ui-icon-tile>ul>li>div>div.caption{text-align:left}.w2ui-icon-tile>ul>li>div>div.description{display:block}.w2ui-table>ul{padding:0}.w2ui-table>ul>li{width:100%;padding:2px;border-radius:0;border-bottom:1px dotted #d3d3d3}.w2ui-table>ul>li>div{display:inline-block;position:relative;width:100%;white-space:nowrap;overflow:hidden}.w2ui-table>ul>li>div>div.w2ui-listview-img{display:inline-block;width:38px;height:32px;font-size:31px;margin-right:2px}.w2ui-table>ul>li>div>div.caption{display:inline-block}.w2ui-table>ul>li>div>div.extra{display:inline-block;position:absolute;right:0;height:100%;background-color:#fff}.w2ui-table>ul>li>div>div.extra>div:before{display:inline-block;height:100%;width:0;content:'';vertical-align:middle}.w2ui-table>ul>li>div>div.extra>div{display:inline}.w2ui-table>ul>li>div>div.extra>div>div{display:inline-block;font-size:12px}.w2ui-table>ul>li.w2ui-selected div.extra,.w2ui-table>ul>li.w2ui-selected.hover div.extra{background-image:-webkit-linear-gradient(#69b1e0,#4a96d3);background-image:-moz-linear-gradient(#69b1e0,#4a96d3);background-image:-ms-linear-gradient(#69b1e0,#4a96d3);background-image:-o-linear-gradient(#69b1e0,#4a96d3);background-image:linear-gradient(#69b1e0,#4a96d3);filter:progid:dximagetransform.microsoft.gradient(startColorstr='#ff69b1e0', endColorstr='#ff4a96d3', GradientType=0)}.w2ui-table>ul>li.hover div.extra{background-color:#d7e1ef}.w2ui-listview>ul>li div.icon-none{border:1px solid rgba(102,102,102,.35)}
\ No newline at end of file
diff --git a/src/main/resources/static/fonts/FontAwesome.otf b/src/main/resources/static/fonts/FontAwesome.otf
new file mode 100644
index 0000000..401ec0f
Binary files /dev/null and b/src/main/resources/static/fonts/FontAwesome.otf differ
diff --git a/src/main/resources/static/fonts/fontawesome-webfont.eot b/src/main/resources/static/fonts/fontawesome-webfont.eot
new file mode 100644
index 0000000..e9f60ca
Binary files /dev/null and b/src/main/resources/static/fonts/fontawesome-webfont.eot differ
diff --git a/src/main/resources/static/fonts/fontawesome-webfont.svg b/src/main/resources/static/fonts/fontawesome-webfont.svg
new file mode 100644
index 0000000..855c845
--- /dev/null
+++ b/src/main/resources/static/fonts/fontawesome-webfont.svg
@@ -0,0 +1,2671 @@
+
+
+
diff --git a/src/main/resources/static/fonts/fontawesome-webfont.ttf b/src/main/resources/static/fonts/fontawesome-webfont.ttf
new file mode 100644
index 0000000..35acda2
Binary files /dev/null and b/src/main/resources/static/fonts/fontawesome-webfont.ttf differ
diff --git a/src/main/resources/static/fonts/fontawesome-webfont.woff b/src/main/resources/static/fonts/fontawesome-webfont.woff
new file mode 100644
index 0000000..400014a
Binary files /dev/null and b/src/main/resources/static/fonts/fontawesome-webfont.woff differ
diff --git a/src/main/resources/static/fonts/fontawesome-webfont.woff2 b/src/main/resources/static/fonts/fontawesome-webfont.woff2
new file mode 100644
index 0000000..4d13fc6
Binary files /dev/null and b/src/main/resources/static/fonts/fontawesome-webfont.woff2 differ
diff --git a/src/main/resources/static/js/.jscsrc b/src/main/resources/static/js/.jscsrc
new file mode 100644
index 0000000..982676e
--- /dev/null
+++ b/src/main/resources/static/js/.jscsrc
@@ -0,0 +1,36 @@
+{
+ "disallowEmptyBlocks": true,
+ "disallowKeywords": ["with"],
+ "disallowMixedSpacesAndTabs": true,
+ "disallowMultipleLineStrings": true,
+ "disallowMultipleVarDecl": true,
+ "disallowQuotedKeysInObjects": "allButReserved",
+ "disallowSpaceAfterPrefixUnaryOperators": ["++", "--", "+", "-", "~", "!"],
+ "disallowSpaceBeforeBinaryOperators": [","],
+ "disallowSpaceBeforePostfixUnaryOperators": ["++", "--"],
+ "disallowSpacesInNamedFunctionExpression": { "beforeOpeningRoundBrace": true },
+ "disallowSpacesInsideArrayBrackets": true,
+ "disallowSpacesInsideParentheses": true,
+ "disallowTrailingComma": true,
+ "disallowTrailingWhitespace": true,
+ "requireCamelCaseOrUpperCaseIdentifiers": true,
+ "requireCapitalizedConstructors": true,
+ "requireCommaBeforeLineBreak": true,
+ "requireDotNotation": true,
+ "requireLineFeedAtFileEnd": true,
+ "requireSpaceAfterBinaryOperators": ["+", "-", "/", "*", "=", "==", "===", "!=", "!==", ">", "<", ">=", "<="],
+ "requireSpaceAfterKeywords": ["if", "else", "for", "while", "do", "switch", "return", "try", "catch"],
+ "requireSpaceAfterLineComment": true,
+ "requireSpaceBeforeBinaryOperators": ["+", "-", "/", "*", "=", "==", "===", "!=", "!==", ">", "<", ">=", "<="],
+ "requireSpaceBetweenArguments": true,
+ "requireSpacesInAnonymousFunctionExpression": { "beforeOpeningCurlyBrace": true, "beforeOpeningRoundBrace": true },
+ "requireSpacesInConditionalExpression": true,
+ "requireSpacesInForStatement": true,
+ "requireSpacesInFunctionDeclaration": { "beforeOpeningCurlyBrace": true },
+ "requireSpacesInFunctionExpression": { "beforeOpeningCurlyBrace": true },
+ "requireSpacesInNamedFunctionExpression": { "beforeOpeningCurlyBrace": true },
+ "requireSpacesInsideObjectBrackets": "allButNested",
+ "validateIndentation": 2,
+ "validateLineBreaks": "LF",
+ "validateQuoteMarks": "'"
+}
diff --git a/src/main/resources/static/js/.jshintrc b/src/main/resources/static/js/.jshintrc
new file mode 100644
index 0000000..a59e1d0
--- /dev/null
+++ b/src/main/resources/static/js/.jshintrc
@@ -0,0 +1,15 @@
+{
+ "asi" : true,
+ "browser" : true,
+ "eqeqeq" : false,
+ "eqnull" : true,
+ "es3" : true,
+ "expr" : true,
+ "jquery" : true,
+ "latedef" : true,
+ "laxbreak" : true,
+ "nonbsp" : true,
+ "strict" : true,
+ "undef" : true,
+ "unused" : true
+}
diff --git a/src/main/resources/static/js/bootstrap-treefy.js b/src/main/resources/static/js/bootstrap-treefy.js
new file mode 100644
index 0000000..8848ce4
--- /dev/null
+++ b/src/main/resources/static/js/bootstrap-treefy.js
@@ -0,0 +1,278 @@
++function ($) {
+ 'use strict';
+
+ var Node = function (row) {
+ var template = /treetable-/;
+ var parentTemplate = /treetable-parent-/;
+ this.row = row;
+ this.id = null;
+ if (template.test(this.row.attr('data-node'))) {
+ this.id = this.row.attr('data-node').substring(this.row.attr('data-node').lastIndexOf('-')+1);
+ }
+
+ this.parentId = null;
+ if (parentTemplate.test(this.row.attr('data-pnode'))) {
+ this.parentId = this.row.attr('data-pnode').substring(this.row.attr('data-pnode').lastIndexOf('-')+1);
+ }
+ this.children = [];
+ this.status = true;
+ }
+
+
+ Node.prototype.addChildren = function(treeContainer) {
+ var self = this;
+ var templateData = "treetable-parent-" + self.id;
+ var $children = treeContainer.find('[data-pnode="' + templateData + '"]');
+ if ($children.length != 0) {
+ $.each($children, function(i, child) {
+ var childNode = new Node($(child));
+ self.children.splice(0, 0, childNode);
+ childNode.addChildren(treeContainer);
+ });
+ }
+ }
+
+ Node.prototype.initIndent = function(treeFy) {
+ this.row.find('.treetable-indent').remove();
+ var expander = this.row.find('.treetable-expander');
+ var depth = this.getDepth(treeFy.$table);
+ for (var i = 0; i < depth; i++) {
+ var indentTemplate = treeFy.options.indentTemplate;
+ $(indentTemplate).insertBefore(expander);
+ }
+ }
+
+ Node.prototype.initExpander = function(treeFy) {
+ var self = this;
+ var element = self.row.find('td').get(treeFy.options.treeColumn);
+ var $expander = self.row.find('.treetable-expander');
+ if ($expander) {
+ $expander.remove();
+ }
+ var expanderTemplate = treeFy.options.expanderTemplate;
+ $(expanderTemplate).prependTo(element).click(function(event) {
+ //self.toggle($(this).closest('tr'));
+ self.toggle();
+ });
+ }
+
+ Node.prototype.renderExpand = function(treeFy) {
+ var $expander = this.row.find('.treetable-expander');
+ if ($expander) {
+ if (!this.row.hasClass('treetable-collapsed')) {
+ $expander.removeClass(treeFy.options.expanderCollapsedClass);
+ $expander.addClass(treeFy.options.expanderExpandedClass);
+ } else {
+ $expander.removeClass(treeFy.options.expanderExpandedClass);
+ $expander.addClass(treeFy.options.expanderCollapsedClass);
+ }
+ } else {
+ this.initExpander(treeFy);
+ this.renderExpand(treeFy);
+ }
+ }
+
+ Node.prototype.toggle = function() {
+ if (this.row.hasClass('treetable-expanded')) {
+ if (!this.isLeaf() && !this.row.hasClass('treetable-collapsed')) {
+ this.row.removeClass('treetable-expanded');
+ this.row.addClass('treetable-collapsed');
+ }
+ } else {
+ if (!this.isLeaf() && !this.row.hasClass('treetable-expanded')) {
+ this.row.removeClass('treetable-collapsed');
+ this.row.addClass('treetable-expanded');
+ }
+ }
+ }
+
+
+ /* 是否为叶子节点 */
+ Node.prototype.isLeaf = function() {
+ return this.children.length === 0;
+ }
+
+ Node.prototype.isCollapsed = function(treeContainer) {
+ var isRoot = (this.getDepth(treeContainer) === 0);
+ if (isRoot) {
+ return false;
+ } else {
+ if (this.getParentNode(treeContainer).row.hasClass('treetable-collapsed')) {
+ return true;
+ } else {
+ return this.getParentNode(treeContainer).isCollapsed(treeContainer);
+ }
+ }
+ }
+
+ Node.prototype.getDepth = function(treeContainer) {
+ if (this.getParentNode(treeContainer) === null) {
+ return 0;
+ }
+ return this.getParentNode(treeContainer).getDepth(treeContainer) + 1;
+ }
+
+ Node.prototype.getParentNode = function(treeContainer) {
+ if (this.parentId === null) {
+ return null;
+ } else {
+ return this.getNodeById(this.parentId, treeContainer);
+ }
+ }
+
+ Node.prototype.getNodeById = function(id, treeContainer) {
+ var templateData = "treetable-" + id;
+ var $row = treeContainer.find('[data-node="' + templateData + '"]');
+ var node = new Node($row);
+ node.addChildren(treeContainer);
+ return node;
+ }
+
+ var TreeFy = function (element, options) {
+ this.options = options;
+
+ this.$table = $(element);
+
+ var allNodes = this.getAllNodes();
+ this.initTree(allNodes);
+
+ }
+
+ TreeFy.VERSION = '0.0.1'
+
+ TreeFy.prototype.getAllNodes = function() {
+ var self = this;
+ var result = $.grep(self.$table.find('tr'), function(trElement) {
+ var nodeData = $(trElement).attr('data-node');
+ var template = /treetable-/;
+ return template.test(nodeData);
+ });
+ var $allNodes = $(result);
+ var allNodes = [];
+ $.each($allNodes, function() {
+ var node = new Node($(this));
+ node.addChildren(self.$table);
+ allNodes.push(node);
+ });
+ return allNodes;
+ }
+
+ TreeFy.prototype.initTree = function(allNodes) {
+ var self = this;
+ var rootNodes = [];
+ $.each(allNodes, function() {
+ var noChildren = this.children.length === 0;
+ if (!noChildren) {
+ this.row.addClass(self.options.initStatusClass);
+ }
+ if (!this.parentId) {
+ rootNodes.push(this);
+ }
+ });
+ self.initNode(rootNodes);
+ self.render(rootNodes);
+ }
+
+ TreeFy.prototype.initNode = function(nodes) {
+ var self = this;
+ $.each(nodes, function() {
+ var rootNode = this.row;
+ $.each(this.children, function() {
+ rootNode.after(this.row);
+ });
+ self.initNode(this.children);
+ this.initExpander(self);
+ this.initIndent(self);
+ var $row = this.row;
+ var click_nodes = [];
+ click_nodes.push(this);
+ $row.find('.treetable-expander').on("click", function(event) {
+ event.stopPropagation();
+ self.render(click_nodes);
+ });
+ });
+ }
+
+ TreeFy.prototype.render = function(nodes) {
+ var self = this;
+ $.each(nodes, function(node) {
+ //若父节点折叠, 隐藏子节点
+ if (this.isCollapsed(self.$table)) {
+ this.row.hide();
+ } else {
+ this.row.show();
+ }
+ if (!this.isLeaf()) {
+ this.renderExpand(self);
+ self.render(this.children);
+ }
+ })
+ }
+
+
+ // PLUGIN DEFINITION
+ // =======================
+
+ function Plugin(option) {
+ var args = arguments;
+ var ret;
+ return this.each(function () {
+ var $this = $(this)
+ var data = $this.data('treeFy')
+
+ if (!data) {
+ var options = $.extend(true, {}, $.fn.treeFy.defaults, typeof option == 'object' && option);
+ $this.data('treeFy', (data = new TreeFy(this, options)));
+ }
+ if (typeof option == 'string') data[option].call($this)
+ })
+
+ if (typeof option == 'string') {
+ if (args.length == 1) {
+ var _ret = data[option].call(data);
+ if (typeof _ret != 'undefined') {
+ ret = _ret;
+ }
+ } else {
+ var _ret = data[option].apply(data, Array.prototype.slice.call(args, 1));
+ if (typeof _ret != 'undefined') {
+ ret = _ret;
+ }
+ }
+ }
+
+ if (typeof ret != 'undefined') {
+ return ret;
+ }
+ return this;
+ }
+
+ var old = $.fn.treeFy
+
+ $.fn.treeFy = Plugin
+ $.fn.treeFy.Constructor = TreeFy
+ $.fn.treeFy.defaults = {
+
+ expanderTemplate: '',
+
+ indentTemplate: '',
+
+ expanderExpandedClass: 'fa fa-angle-down',
+
+ expanderCollapsedClass: 'fa fa-angle-right',
+
+ treeColumn: 0,
+
+ initStatusClass: 'treetable-expanded'
+ }
+
+
+ // ALERT NO CONFLICT
+ // =================
+
+ $.fn.treeFy.noConflict = function () {
+ $.fn.treeFy = old
+ return this
+ }
+
+}(jQuery);
\ No newline at end of file
diff --git a/src/main/resources/static/js/dataTables.treeTable.js b/src/main/resources/static/js/dataTables.treeTable.js
new file mode 100644
index 0000000..9ec4325
--- /dev/null
+++ b/src/main/resources/static/js/dataTables.treeTable.js
@@ -0,0 +1,331 @@
+/*! TreeTable 0.0.1-dev
+ */
+
+/**
+ * @summary TreeTable
+ * @description
+ * @version 0.0.1-dev
+ * @file dataTables.treeTable.js
+ * @author Shingo Sugimoto
+ * @contact http://
+ *
+ * This source file is free software, available under the following license:
+ * MIT license
+ *
+ * This source file is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE. See the license files for details.
+ *
+ */
+
+(function(window, document, $) {
+
+var factory = function($, DataTable) {
+"use strict";
+
+var TreeTable = function(settings, opts) {
+
+ if (!DataTable.versionCheck || !DataTable.versionCheck('1.10.8')) {
+ throw 'DataTables TreeTable requires DataTables 1.10.8 or newer';
+ }
+
+ this.s = {
+ dt: new DataTable.Api(settings)
+ };
+
+ if (settings._treeTable) {
+ return this.s.dt.settings()[0]._treeTable;
+ }
+
+ if (opts && typeof opts.details === 'string') {
+ opts.details = { type: opts.details };
+ }
+
+ this.c = $.extend(true, {}, TreeTable.defaults, DataTable.defaults.treetable, opts);
+ settings._treeTable = this;
+
+ this.dom = {
+ table: null,
+ treetable: null,
+ };
+
+ this.pls = {};
+
+ this._constructor();
+};
+
+$.extend(TreeTable.prototype, {
+
+ _constructor: function ()
+ {
+ var self = this;
+ var dt = this.s.dt;
+ var dtSettings = self.s.dt.settings()[0];
+
+ self.dom.table = $('table', dt.table().container()).addClass('dt-treetable');
+
+ var table = dtSettings.oInstance;
+ var $table = self.dom.table;
+
+ // sourced data
+ $(dtSettings.aoData.reverse()).each(function() {
+ var data = this;
+ var rowdata = self._arrayToObject(data._aData);
+ rowdata = self._getTTData(rowdata, data.nTr);
+
+ if (self._has(self.pls, rowdata[self.c.nodeIdAttr]))
+ rowdata[self.c.branchAttr] = true;
+
+ var parent = rowdata[self.c.parentIdAttr];
+ if (!parent) parent = null;
+ if (!self._has(self.pls, parent)) self.pls[parent] = [];
+ self.pls[parent].unshift(rowdata);
+ } );
+
+ dt.clear();
+
+ // new tree node (tr)
+ var createdRow = function (row, data) {
+ var $row = $(row);
+ var parent = $table.treetable('node', data[self.c.parentIdAttr]);
+ if (!parent) parent = null;
+
+ if (self._has(data, self.c.nodeIdAttr)) {
+
+ $row.attr(self._attrName(self.c.nodeIdAttr), data[self.c.nodeIdAttr]);
+
+ if (data[self.c.parentIdAttr])
+ $row.attr(self._attrName(self.c.parentIdAttr), data[self.c.parentIdAttr]);
+
+ if (data[self.c.branchAttr])
+ $row.attr(self._attrName(self.c.branchAttr), data[self.c.branchAttr]);
+
+ $table.treetable('loadBranch', parent, row);
+ }
+ };
+ dtSettings.aoRowCreatedCallback.push({fn: createdRow, sName: "treetable"});
+
+ // treetable
+ var ttopts = self.c;
+ //ttopts['_onNodeInitialized'] = ttopts['onNodeInitialized'];
+ ttopts['_onNodeCollapse'] = ttopts['onNodeCollapse'];
+ ttopts['_onNodeExpand'] = ttopts['onNodeExpand'];
+
+ // treetable #collapse
+ var removeRow = function (idx, child) {
+ if (self._isArray(child.children) && child.children) $.each(child.children, removeRow);
+ table.fnDeleteRow(child.row);
+ };
+ ttopts['onNodeCollapse'] = function () {
+ var node = this;
+ var page = table.fnTreePagingInfo().iPage;
+ $.each(node.children, removeRow);
+ if (typeof ttopts['_onNodeCollapse'] === 'function') ttopts['_onNodeCollapse'].apply(this, arguments);
+ table.fnPageChange(page);
+ };
+
+ // treetable #expand
+ ttopts['onNodeExpand'] = function () {
+ var node = this;
+ if (self._has(self.pls, node.id))
+ {
+ var items = self.pls[node.id];
+ self.addChildren(node, items);
+ }
+ if (typeof ttopts['_onNodeExpand'] === 'function') ttopts['_onNodeExpand'].apply(this, arguments);
+ };
+
+ // init treetable
+ this.dom.treetable = $table.treetable(ttopts);
+
+ // root nodes restore
+ if (self._has(self.pls, null) && self._isArray(self.pls[null])) {
+ dt.rows.add(self.pls[null]);
+ }
+ },
+
+ addChildren: function (node, items)
+ {
+ var self = this;
+ var dtSettings = self.s.dt.settings()[0];
+ var table = dtSettings.oInstance;
+
+ if (self._isArray(items) && items.length) {
+ var page = table.fnTreePagingInfo().iPage;
+ $.each(items, function (idx, item) {
+ table.fnAddTreeDataAndDisplayPosition(item, node);
+ } );
+ table.fnPageChange(page);
+ }
+ },
+
+ _getTTData: function(data, row) {
+ data = data || {};
+ var self = this;
+ var $row = $(row);
+
+ if (!data[self.c.nodeIdAttr] && $row.data(self.c.nodeIdAttr)) {
+ data[self.c.nodeIdAttr] = $row.data(self.c.nodeIdAttr).toString();
+ }
+
+ if (self._has(data, self.c.nodeIdAttr))
+ {
+ if (!data[self.c.parentIdAttr] && $row.data(self.c.parentIdAttr)) {
+ data[self.c.parentIdAttr] = $row.data(self.c.parentIdAttr).toString();
+ }
+
+ if ($row.data(self.c.branchAttr)) {
+ data[self.c.branchAttr] = ($row.data(self.c.branchAttr) === 'true' || $row.data(self.c.branchAttr) === true);
+ }
+ else if (data[self.c.branchAttr]) {
+ data[self.c.branchAttr] = (data[self.c.branchAttr] === 'true' || data[self.c.branchAttr] === true);
+ }
+ }
+
+ return data;
+ },
+
+ _has: function(obj, key) {
+ return obj != null && hasOwnProperty.call(obj, key);
+ },
+
+ _isArray: function(obj) {
+ return toString.call(obj) === '[object Array]';
+ },
+
+ _isObject: function(obj) {
+ var type = typeof obj;
+ return type === 'function' || type === 'object' && !!obj;
+ },
+
+ _attrName: function(key) {
+ return "data-" + key.replace(/([A-Z])/g, "-$1").toLowerCase();
+ },
+
+ _arrayToObject: function(array) {
+ return (this._isArray(array)) ? array.reduce(function(o, v, i) { o[i] = v; return o; }, {}) : array;
+ }
+
+} );
+
+TreeTable.defaults = {
+ branchAttr: "ttBranch",
+ expandable: true,
+ nodeIdAttr: "id",
+ parentIdAttr: "parentId",
+};
+
+var Api = $.fn.dataTable.Api;
+
+Api.register('treeTable.addChildren()', function (node, data) {
+ return this.iterator('table', function (ctx) {
+ if (ctx._treeTable._isArray(data))
+ ctx._treeTable.addChildren(node, data);
+ } );
+} );
+
+Api.register('treeTable.addChild()', function (node, data) {
+ return this.iterator('table', function (ctx) {
+ if (ctx._treeTable._isObject(data))
+ ctx._treeTable.addChildren(node, [data]);
+ } );
+} );
+
+TreeTable.version = '0.0.1-dev';
+
+//$.fn.dataTable.TreeTable = TreeTable;
+//$.fn.DataTable.TreeTable = TreeTable;
+
+$(document).on('preInit.dt.dtr', function (e, settings) {
+ if (e.namespace !== 'dt') return;
+
+ if ($(settings.nTable).hasClass('treetable') ||
+ $(settings.nTable).hasClass('dt-treetable') ||
+ settings.oInit.treetable ||
+ DataTable.defaults.treetable
+ ) {
+ var init = settings.oInit.treetable;
+
+ if (init !== false) {
+ new TreeTable(settings, $.isPlainObject(init) ? init : {});
+ }
+ }
+});
+
+return TreeTable;
+}; // /factory
+
+ if (typeof define === 'function' && define.amd) {
+ define(['jquery', 'datatables', 'treetable'], factory);
+ }
+ else if (typeof exports === 'object') {
+ factory(require('jquery'), require('datatables'), require('treetable'));
+ }
+ else if (jQuery && !jQuery.fn.dataTable.TreeTable) {
+ factory(jQuery, jQuery.fn.dataTable);
+ }
+
+})(window, document);
+
+if (jQuery)
+{
+jQuery.fn.dataTableExt.oApi.fnAddTreeDataDisplayPosition = function (oSettings, aDataIn, iPos) {
+ var iRow = oSettings.aoData.length;
+ var oData = $.extend( true, {}, $.fn.dataTable.models.oRow, {
+ src: 'data'
+ } );
+ oData._aData = aDataIn;
+ oSettings.aoData.push(oData);
+ oSettings.aiDisplayMaster.splice(iPos, 0, iRow);
+ return iRow;
+};
+
+jQuery.fn.dataTableExt.oApi.fnAddTreeDataAndDisplayPosition = function (oSettings, aData, aParent) {
+ var tt = oSettings._treeTable;
+ var aPos = -1;
+ for (var i=0, iLen=oSettings.aoData.length ; i= 0)
+ {
+ oSettings._iDisplayStart = (Math.floor(i / oSettings._iDisplayLength)) * oSettings._iDisplayLength;
+ if (this.oApi._fnCalculateEnd)
+ this.oApi._fnCalculateEnd(oSettings);
+ }
+
+ this.oApi._fnDraw(oSettings);
+ return {
+ "nTr": nAdded,
+ "iPos": iAdded
+ };
+};
+
+jQuery.fn.dataTableExt.oApi.fnTreePagingInfo = function (oSettings) {
+ return {
+ "iStart": oSettings._iDisplayStart,
+ "iEnd": oSettings.fnDisplayEnd(),
+ "iLength": oSettings._iDisplayLength,
+ "iTotal": oSettings.fnRecordsTotal(),
+ "iFilteredTotal": oSettings.fnRecordsDisplay(),
+ "iPage": Math.ceil( oSettings._iDisplayStart / oSettings._iDisplayLength ),
+ "iTotalPages": Math.ceil( oSettings.fnRecordsDisplay() / oSettings._iDisplayLength )
+ };
+};
+
+}
diff --git a/src/main/resources/static/js/datatables.min.js b/src/main/resources/static/js/datatables.min.js
new file mode 100644
index 0000000..56c459a
--- /dev/null
+++ b/src/main/resources/static/js/datatables.min.js
@@ -0,0 +1,457 @@
+/*
+ * This combined file was created by the DataTables downloader builder:
+ * https://datatables.net/download
+ *
+ * To rebuild or modify this file with the latest versions of the included
+ * software please visit:
+ * https://datatables.net/download/#bs/dt-1.10.15/b-1.3.1/b-colvis-1.3.1/cr-1.3.3/fc-3.2.2/fh-3.1.2/r-2.1.1/rg-1.0.0/rr-1.2.0/sc-1.4.2/se-1.2.2
+ *
+ * Included libraries:
+ * DataTables 1.10.15, Buttons 1.3.1, Column visibility 1.3.1, ColReorder 1.3.3, FixedColumns 3.2.2, FixedHeader 3.1.2, Responsive 2.1.1, RowGroup 1.0.0, RowReorder 1.2.0, Scroller 1.4.2, Select 1.2.2
+ */
+
+/*!
+ DataTables 1.10.15
+ ©2008-2017 SpryMedia Ltd - datatables.net/license
+*/
+(function(h){"function"===typeof define&&define.amd?define(["jquery"],function(E){return h(E,window,document)}):"object"===typeof exports?module.exports=function(E,H){E||(E=window);H||(H="undefined"!==typeof window?require("jquery"):require("jquery")(E));return h(H,E,E.document)}:h(jQuery,window,document)})(function(h,E,H,k){function Y(a){var b,c,d={};h.each(a,function(e){if((b=e.match(/^([^A-Z]+?)([A-Z])/))&&-1!=="a aa ai ao as b fn i m o s ".indexOf(b[1]+" "))c=e.replace(b[0],b[2].toLowerCase()),
+d[c]=e,"o"===b[1]&&Y(a[e])});a._hungarianMap=d}function J(a,b,c){a._hungarianMap||Y(a);var d;h.each(b,function(e){d=a._hungarianMap[e];if(d!==k&&(c||b[d]===k))"o"===d.charAt(0)?(b[d]||(b[d]={}),h.extend(!0,b[d],b[e]),J(a[d],b[d],c)):b[d]=b[e]})}function Fa(a){var b=m.defaults.oLanguage,c=a.sZeroRecords;!a.sEmptyTable&&(c&&"No data available in table"===b.sEmptyTable)&&F(a,a,"sZeroRecords","sEmptyTable");!a.sLoadingRecords&&(c&&"Loading..."===b.sLoadingRecords)&&F(a,a,"sZeroRecords","sLoadingRecords");
+a.sInfoThousands&&(a.sThousands=a.sInfoThousands);(a=a.sDecimal)&&fb(a)}function gb(a){A(a,"ordering","bSort");A(a,"orderMulti","bSortMulti");A(a,"orderClasses","bSortClasses");A(a,"orderCellsTop","bSortCellsTop");A(a,"order","aaSorting");A(a,"orderFixed","aaSortingFixed");A(a,"paging","bPaginate");A(a,"pagingType","sPaginationType");A(a,"pageLength","iDisplayLength");A(a,"searching","bFilter");"boolean"===typeof a.sScrollX&&(a.sScrollX=a.sScrollX?"100%":"");"boolean"===typeof a.scrollX&&(a.scrollX=
+a.scrollX?"100%":"");if(a=a.aoSearchCols)for(var b=0,c=a.length;b").css({position:"fixed",top:0,left:-1*h(E).scrollLeft(),height:1,width:1,overflow:"hidden"}).append(h("").css({position:"absolute",
+top:1,left:1,width:100,overflow:"scroll"}).append(h("").css({width:"100%",height:10}))).appendTo("body"),d=c.children(),e=d.children();b.barWidth=d[0].offsetWidth-d[0].clientWidth;b.bScrollOversize=100===e[0].offsetWidth&&100!==d[0].clientWidth;b.bScrollbarLeft=1!==Math.round(e.offset().left);b.bBounding=c[0].getBoundingClientRect().width?!0:!1;c.remove()}h.extend(a.oBrowser,m.__browser);a.oScroll.iBarWidth=m.__browser.barWidth}function jb(a,b,c,d,e,f){var g,j=!1;c!==k&&(g=c,j=!0);for(;d!==
+e;)a.hasOwnProperty(d)&&(g=j?b(g,a[d],d,a):a[d],j=!0,d+=f);return g}function Ga(a,b){var c=m.defaults.column,d=a.aoColumns.length,c=h.extend({},m.models.oColumn,c,{nTh:b?b:H.createElement("th"),sTitle:c.sTitle?c.sTitle:b?b.innerHTML:"",aDataSort:c.aDataSort?c.aDataSort:[d],mData:c.mData?c.mData:d,idx:d});a.aoColumns.push(c);c=a.aoPreSearchCols;c[d]=h.extend({},m.models.oSearch,c[d]);la(a,d,h(b).data())}function la(a,b,c){var b=a.aoColumns[b],d=a.oClasses,e=h(b.nTh);if(!b.sWidthOrig){b.sWidthOrig=
+e.attr("width")||null;var f=(e.attr("style")||"").match(/width:\s*(\d+[pxem%]+)/);f&&(b.sWidthOrig=f[1])}c!==k&&null!==c&&(hb(c),J(m.defaults.column,c),c.mDataProp!==k&&!c.mData&&(c.mData=c.mDataProp),c.sType&&(b._sManualType=c.sType),c.className&&!c.sClass&&(c.sClass=c.className),h.extend(b,c),F(b,c,"sWidth","sWidthOrig"),c.iDataSort!==k&&(b.aDataSort=[c.iDataSort]),F(b,c,"aDataSort"));var g=b.mData,j=R(g),i=b.mRender?R(b.mRender):null,c=function(a){return"string"===typeof a&&-1!==a.indexOf("@")};
+b._bAttrSrc=h.isPlainObject(g)&&(c(g.sort)||c(g.type)||c(g.filter));b._setter=null;b.fnGetData=function(a,b,c){var d=j(a,b,k,c);return i&&b?i(d,b,a,c):d};b.fnSetData=function(a,b,c){return S(g)(a,b,c)};"number"!==typeof g&&(a._rowReadObject=!0);a.oFeatures.bSort||(b.bSortable=!1,e.addClass(d.sSortableNone));a=-1!==h.inArray("asc",b.asSorting);c=-1!==h.inArray("desc",b.asSorting);!b.bSortable||!a&&!c?(b.sSortingClass=d.sSortableNone,b.sSortingClassJUI=""):a&&!c?(b.sSortingClass=d.sSortableAsc,b.sSortingClassJUI=
+d.sSortJUIAscAllowed):!a&&c?(b.sSortingClass=d.sSortableDesc,b.sSortingClassJUI=d.sSortJUIDescAllowed):(b.sSortingClass=d.sSortable,b.sSortingClassJUI=d.sSortJUI)}function Z(a){if(!1!==a.oFeatures.bAutoWidth){var b=a.aoColumns;Ha(a);for(var c=0,d=b.length;cq[f])d(l.length+q[f],n);else if("string"===typeof q[f]){j=0;for(i=l.length;jb&&a[e]--; -1!=d&&c===k&&a.splice(d,1)}function da(a,b,c,d){var e=a.aoData[b],f,g=function(c,d){for(;c.childNodes.length;)c.removeChild(c.firstChild);
+c.innerHTML=B(a,b,d,"display")};if("dom"===c||(!c||"auto"===c)&&"dom"===e.src)e._aData=Ka(a,e,d,d===k?k:e._aData).data;else{var j=e.anCells;if(j)if(d!==k)g(j[d],d);else{c=0;for(f=j.length;c").appendTo(g));b=0;for(c=l.length;btr").attr("role","row");h(g).find(">tr>th, >tr>td").addClass(n.sHeaderTH);h(j).find(">tr>th, >tr>td").addClass(n.sFooterTH);
+if(null!==j){a=a.aoFooter[0];b=0;for(c=a.length;b=a.fnRecordsDisplay()?0:g,a.iInitDisplayStart=
+-1);var g=a._iDisplayStart,n=a.fnDisplayEnd();if(a.bDeferLoading)a.bDeferLoading=!1,a.iDraw++,C(a,!1);else if(j){if(!a.bDestroying&&!nb(a))return}else a.iDraw++;if(0!==i.length){f=j?a.aoData.length:n;for(j=j?0:g;j",{"class":e?d[0]:""}).append(h(" | ",{valign:"top",colSpan:ba(a),"class":a.oClasses.sRowEmpty}).html(c))[0];s(a,"aoHeaderCallback","header",[h(a.nTHead).children("tr")[0],Ma(a),g,n,i]);s(a,"aoFooterCallback","footer",[h(a.nTFoot).children("tr")[0],Ma(a),g,n,i]);d=h(a.nTBody);d.children().detach();d.append(h(b));s(a,"aoDrawCallback","draw",[a]);a.bSorted=!1;a.bFiltered=!1;a.bDrawing=!1}}function T(a,b){var c=a.oFeatures,d=c.bFilter;
+c.bSort&&ob(a);d?ga(a,a.oPreviousSearch):a.aiDisplay=a.aiDisplayMaster.slice();!0!==b&&(a._iDisplayStart=0);a._drawHold=b;O(a);a._drawHold=!1}function pb(a){var b=a.oClasses,c=h(a.nTable),c=h("").insertBefore(c),d=a.oFeatures,e=h("",{id:a.sTableId+"_wrapper","class":b.sWrapper+(a.nTFoot?"":" "+b.sNoFooter)});a.nHolding=c[0];a.nTableWrapper=e[0];a.nTableReinsertBefore=a.nTable.nextSibling;for(var f=a.sDom.split(""),g,j,i,n,l,q,k=0;k")[0];
+n=f[k+1];if("'"==n||'"'==n){l="";for(q=2;f[k+q]!=n;)l+=f[k+q],q++;"H"==l?l=b.sJUIHeader:"F"==l&&(l=b.sJUIFooter);-1!=l.indexOf(".")?(n=l.split("."),i.id=n[0].substr(1,n[0].length-1),i.className=n[1]):"#"==l.charAt(0)?i.id=l.substr(1,l.length-1):i.className=l;k+=q}e.append(i);e=h(i)}else if(">"==j)e=e.parent();else if("l"==j&&d.bPaginate&&d.bLengthChange)g=qb(a);else if("f"==j&&d.bFilter)g=rb(a);else if("r"==j&&d.bProcessing)g=sb(a);else if("t"==j)g=tb(a);else if("i"==j&&d.bInfo)g=ub(a);else if("p"==
+j&&d.bPaginate)g=vb(a);else if(0!==m.ext.feature.length){i=m.ext.feature;q=0;for(n=i.length;q',j=d.sSearch,j=j.match(/_INPUT_/)?j.replace("_INPUT_",g):j+g,b=h("",{id:!f.f?c+"_filter":null,"class":b.sFilter}).append(h("").append(j)),f=function(){var b=!this.value?
+"":this.value;b!=e.sSearch&&(ga(a,{sSearch:b,bRegex:e.bRegex,bSmart:e.bSmart,bCaseInsensitive:e.bCaseInsensitive}),a._iDisplayStart=0,O(a))},g=null!==a.searchDelay?a.searchDelay:"ssp"===y(a)?400:0,i=h("input",b).val(e.sSearch).attr("placeholder",d.sSearchPlaceholder).on("keyup.DT search.DT input.DT paste.DT cut.DT",g?Qa(f,g):f).on("keypress.DT",function(a){if(13==a.keyCode)return!1}).attr("aria-controls",c);h(a.nTable).on("search.dt.DT",function(b,c){if(a===c)try{i[0]!==H.activeElement&&i.val(e.sSearch)}catch(d){}});
+return b[0]}function ga(a,b,c){var d=a.oPreviousSearch,e=a.aoPreSearchCols,f=function(a){d.sSearch=a.sSearch;d.bRegex=a.bRegex;d.bSmart=a.bSmart;d.bCaseInsensitive=a.bCaseInsensitive};Ia(a);if("ssp"!=y(a)){yb(a,b.sSearch,c,b.bEscapeRegex!==k?!b.bEscapeRegex:b.bRegex,b.bSmart,b.bCaseInsensitive);f(b);for(b=0;b=b.length)a.aiDisplay=
+g.slice();else{if(j||c||f.length>b.length||0!==b.indexOf(f)||a.bSorted)a.aiDisplay=g.slice();b=a.aiDisplay;for(c=0;c",{"class":a.oClasses.sInfo,id:!c?b+"_info":null});c||(a.aoDrawCallback.push({fn:Eb,sName:"information"}),d.attr("role","status").attr("aria-live","polite"),h(a.nTable).attr("aria-describedby",b+"_info"));return d[0]}function Eb(a){var b=a.aanFeatures.i;if(0!==b.length){var c=a.oLanguage,d=a._iDisplayStart+
+1,e=a.fnDisplayEnd(),f=a.fnRecordsTotal(),g=a.fnRecordsDisplay(),j=g?c.sInfo:c.sInfoEmpty;g!==f&&(j+=" "+c.sInfoFiltered);j+=c.sInfoPostFix;j=Fb(a,j);c=c.fnInfoCallback;null!==c&&(j=c.call(a.oInstance,a,d,e,f,g,j));h(b).html(j)}}function Fb(a,b){var c=a.fnFormatNumber,d=a._iDisplayStart+1,e=a._iDisplayLength,f=a.fnRecordsDisplay(),g=-1===e;return b.replace(/_START_/g,c.call(a,d)).replace(/_END_/g,c.call(a,a.fnDisplayEnd())).replace(/_MAX_/g,c.call(a,a.fnRecordsTotal())).replace(/_TOTAL_/g,c.call(a,
+f)).replace(/_PAGE_/g,c.call(a,g?1:Math.ceil(d/e))).replace(/_PAGES_/g,c.call(a,g?1:Math.ceil(f/e)))}function ha(a){var b,c,d=a.iInitDisplayStart,e=a.aoColumns,f;c=a.oFeatures;var g=a.bDeferLoading;if(a.bInitialised){pb(a);mb(a);fa(a,a.aoHeader);fa(a,a.aoFooter);C(a,!0);c.bAutoWidth&&Ha(a);b=0;for(c=e.length;b",{name:c+"_length","aria-controls":c,"class":b.sLengthSelect}),g=0,j=f.length;g").addClass(b.sLength);a.aanFeatures.l||(i[0].id=c+"_length");i.children().append(a.oLanguage.sLengthMenu.replace("_MENU_",e[0].outerHTML));h("select",i).val(a._iDisplayLength).on("change.DT",function(){Ta(a,h(this).val());O(a)});h(a.nTable).on("length.dt.DT",function(b,c,d){a===c&&h("select",i).val(d)});return i[0]}function vb(a){var b=a.sPaginationType,c=m.ext.pager[b],d="function"===typeof c,e=function(a){O(a)},b=h("").addClass(a.oClasses.sPaging+
+b)[0],f=a.aanFeatures;d||c.fnInit(a,b,e);f.p||(b.id=a.sTableId+"_paginate",a.aoDrawCallback.push({fn:function(a){if(d){var b=a._iDisplayStart,i=a._iDisplayLength,h=a.fnRecordsDisplay(),l=-1===i,b=l?0:Math.ceil(b/i),i=l?1:Math.ceil(h/i),h=c(b,i),k,l=0;for(k=f.p.length;lf&&
+(d=0)):"first"==b?d=0:"previous"==b?(d=0<=e?d-e:0,0>d&&(d=0)):"next"==b?d+e",{id:!a.aanFeatures.r?a.sTableId+"_processing":null,"class":a.oClasses.sProcessing}).html(a.oLanguage.sProcessing).insertBefore(a.nTable)[0]}function C(a,b){a.oFeatures.bProcessing&&h(a.aanFeatures.r).css("display",b?"block":"none");
+s(a,null,"processing",[a,b])}function tb(a){var b=h(a.nTable);b.attr("role","grid");var c=a.oScroll;if(""===c.sX&&""===c.sY)return a.nTable;var d=c.sX,e=c.sY,f=a.oClasses,g=b.children("caption"),j=g.length?g[0]._captionSide:null,i=h(b[0].cloneNode(!1)),n=h(b[0].cloneNode(!1)),l=b.children("tfoot");l.length||(l=null);i=h("",{"class":f.sScrollWrapper}).append(h("",{"class":f.sScrollHead}).css({overflow:"hidden",position:"relative",border:0,width:d?!d?null:v(d):"100%"}).append(h("",
+{"class":f.sScrollHeadInner}).css({"box-sizing":"content-box",width:c.sXInner||"100%"}).append(i.removeAttr("id").css("margin-left",0).append("top"===j?g:null).append(b.children("thead"))))).append(h("",{"class":f.sScrollBody}).css({position:"relative",overflow:"auto",width:!d?null:v(d)}).append(b));l&&i.append(h("",{"class":f.sScrollFoot}).css({overflow:"hidden",border:0,width:d?!d?null:v(d):"100%"}).append(h("",{"class":f.sScrollFootInner}).append(n.removeAttr("id").css("margin-left",
+0).append("bottom"===j?g:null).append(b.children("tfoot")))));var b=i.children(),k=b[0],f=b[1],r=l?b[2]:null;if(d)h(f).on("scroll.DT",function(){var a=this.scrollLeft;k.scrollLeft=a;l&&(r.scrollLeft=a)});h(f).css(e&&c.bCollapse?"max-height":"height",e);a.nScrollHead=k;a.nScrollBody=f;a.nScrollFoot=r;a.aoDrawCallback.push({fn:ma,sName:"scrolling"});return i[0]}function ma(a){var b=a.oScroll,c=b.sX,d=b.sXInner,e=b.sY,b=b.iBarWidth,f=h(a.nScrollHead),g=f[0].style,j=f.children("div"),i=j[0].style,n=j.children("table"),
+j=a.nScrollBody,l=h(j),q=j.style,r=h(a.nScrollFoot).children("div"),m=r.children("table"),p=h(a.nTHead),o=h(a.nTable),t=o[0],s=t.style,u=a.nTFoot?h(a.nTFoot):null,x=a.oBrowser,U=x.bScrollOversize,ac=D(a.aoColumns,"nTh"),P,L,Q,w,Wa=[],y=[],z=[],A=[],B,C=function(a){a=a.style;a.paddingTop="0";a.paddingBottom="0";a.borderTopWidth="0";a.borderBottomWidth="0";a.height=0};L=j.scrollHeight>j.clientHeight;if(a.scrollBarVis!==L&&a.scrollBarVis!==k)a.scrollBarVis=L,Z(a);else{a.scrollBarVis=L;o.children("thead, tfoot").remove();
+u&&(Q=u.clone().prependTo(o),P=u.find("tr"),Q=Q.find("tr"));w=p.clone().prependTo(o);p=p.find("tr");L=w.find("tr");w.find("th, td").removeAttr("tabindex");c||(q.width="100%",f[0].style.width="100%");h.each(ta(a,w),function(b,c){B=$(a,b);c.style.width=a.aoColumns[B].sWidth});u&&I(function(a){a.style.width=""},Q);f=o.outerWidth();if(""===c){s.width="100%";if(U&&(o.find("tbody").height()>j.offsetHeight||"scroll"==l.css("overflow-y")))s.width=v(o.outerWidth()-b);f=o.outerWidth()}else""!==d&&(s.width=
+v(d),f=o.outerWidth());I(C,L);I(function(a){z.push(a.innerHTML);Wa.push(v(h(a).css("width")))},L);I(function(a,b){if(h.inArray(a,ac)!==-1)a.style.width=Wa[b]},p);h(L).height(0);u&&(I(C,Q),I(function(a){A.push(a.innerHTML);y.push(v(h(a).css("width")))},Q),I(function(a,b){a.style.width=y[b]},P),h(Q).height(0));I(function(a,b){a.innerHTML=''+z[b]+"
";a.style.width=Wa[b]},L);u&&I(function(a,b){a.innerHTML=''+
+A[b]+"
";a.style.width=y[b]},Q);if(o.outerWidth()j.offsetHeight||"scroll"==l.css("overflow-y")?f+b:f;if(U&&(j.scrollHeight>j.offsetHeight||"scroll"==l.css("overflow-y")))s.width=v(P-b);(""===c||""!==d)&&K(a,1,"Possible column misalignment",6)}else P="100%";q.width=v(P);g.width=v(P);u&&(a.nScrollFoot.style.width=v(P));!e&&U&&(q.height=v(t.offsetHeight+b));c=o.outerWidth();n[0].style.width=v(c);i.width=v(c);d=o.height()>j.clientHeight||"scroll"==l.css("overflow-y");e="padding"+
+(x.bScrollbarLeft?"Left":"Right");i[e]=d?b+"px":"0px";u&&(m[0].style.width=v(c),r[0].style.width=v(c),r[0].style[e]=d?b+"px":"0px");o.children("colgroup").insertBefore(o.children("thead"));l.scroll();if((a.bSorted||a.bFiltered)&&!a._drawHold)j.scrollTop=0}}function I(a,b,c){for(var d=0,e=0,f=b.length,g,j;e").appendTo(j.find("tbody"));
+j.find("thead, tfoot").remove();j.append(h(a.nTHead).clone()).append(h(a.nTFoot).clone());j.find("tfoot th, tfoot td").css("width","");n=ta(a,j.find("thead")[0]);for(m=0;m").css({width:p.sWidthOrig,margin:0,padding:0,border:0,height:1}));if(a.aoData.length)for(m=0;m").css(f||e?{position:"absolute",top:0,left:0,height:1,right:0,overflow:"hidden"}:{}).append(j).appendTo(k);f&&g?j.width(g):f?(j.css("width","auto"),j.removeAttr("width"),j.width()").css("width",v(a)).appendTo(b||H.body),d=c[0].offsetWidth;c.remove();return d}function Hb(a,b){var c=Ib(a,b);if(0>c)return null;var d=a.aoData[c];return!d.nTr?h(" | ").html(B(a,c,b,"display"))[0]:d.anCells[b]}function Ib(a,b){for(var c,d=-1,e=-1,f=0,g=a.aoData.length;fd&&(d=c.length,e=f);return e}function v(a){return null===a?"0px":"number"==typeof a?0>a?"0px":a+"px":a.match(/\d$/)?a+"px":a}function W(a){var b,c,d=[],e=a.aoColumns,f,g,j,i;b=a.aaSortingFixed;c=h.isPlainObject(b);var n=[];f=function(a){a.length&&!h.isArray(a[0])?n.push(a):h.merge(n,a)};h.isArray(b)&&f(b);c&&b.pre&&f(b.pre);f(a.aaSorting);c&&b.post&&f(b.post);for(a=0;ae?1:0,0!==c)return"asc"===j.dir?c:-c;c=d[a];e=d[b];return ce?1:0}):i.sort(function(a,b){var c,g,j,i,k=h.length,m=f[a]._aSortData,p=f[b]._aSortData;for(j=0;jg?1:0})}a.bSorted=!0}function Kb(a){for(var b,c,d=a.aoColumns,e=W(a),a=a.oLanguage.oAria,f=0,g=d.length;f/g,
+"");var i=c.nTh;i.removeAttribute("aria-sort");c.bSortable&&(0e?e+1:3));e=0;for(f=d.length;ee?e+1:3))}a.aLastSort=d}function Jb(a,b){var c=a.aoColumns[b],d=m.ext.order[c.sSortDataType],e;d&&(e=d.call(a.oInstance,a,b,aa(a,b)));for(var f,g=m.ext.type.order[c.sType+"-pre"],j=0,i=a.aoData.length;j=f.length?[0,c[1]]:c)}));b.search!==
+k&&h.extend(a.oPreviousSearch,Db(b.search));if(b.columns){d=0;for(e=b.columns.length;d=c&&(b=c-d);b-=b%d;if(-1===d||0>b)b=0;a._iDisplayStart=b}function Pa(a,b){var c=a.renderer,d=m.ext.renderer[b];return h.isPlainObject(c)&&c[b]?d[c[b]]||d._:"string"===typeof c?d[c]||d._:d._}function y(a){return a.oFeatures.bServerSide?"ssp":a.ajax||a.sAjaxSource?"ajax":"dom"}function ia(a,b){var c=[],c=Nb.numbers_length,d=Math.floor(c/2);b<=c?c=X(0,b):a<=d?(c=X(0,
+c-2),c.push("ellipsis"),c.push(b-1)):(a>=b-1-d?c=X(b-(c-2),b):(c=X(a-d+2,a+d-1),c.push("ellipsis"),c.push(b-1)),c.splice(0,0,"ellipsis"),c.splice(0,0,0));c.DT_el="span";return c}function fb(a){h.each({num:function(b){return Ba(b,a)},"num-fmt":function(b){return Ba(b,a,Za)},"html-num":function(b){return Ba(b,a,Ca)},"html-num-fmt":function(b){return Ba(b,a,Ca,Za)}},function(b,c){x.type.order[b+a+"-pre"]=c;b.match(/^html\-/)&&(x.type.search[b+a]=x.type.search.html)})}function Ob(a){return function(){var b=
+[Aa(this[m.ext.iApiIndex])].concat(Array.prototype.slice.call(arguments));return m.ext.internal[a].apply(this,b)}}var m=function(a){this.$=function(a,b){return this.api(!0).$(a,b)};this._=function(a,b){return this.api(!0).rows(a,b).data()};this.api=function(a){return a?new t(Aa(this[x.iApiIndex])):new t(this)};this.fnAddData=function(a,b){var c=this.api(!0),d=h.isArray(a)&&(h.isArray(a[0])||h.isPlainObject(a[0]))?c.rows.add(a):c.row.add(a);(b===k||b)&&c.draw();return d.flatten().toArray()};this.fnAdjustColumnSizing=
+function(a){var b=this.api(!0).columns.adjust(),c=b.settings()[0],d=c.oScroll;a===k||a?b.draw(!1):(""!==d.sX||""!==d.sY)&&ma(c)};this.fnClearTable=function(a){var b=this.api(!0).clear();(a===k||a)&&b.draw()};this.fnClose=function(a){this.api(!0).row(a).child.hide()};this.fnDeleteRow=function(a,b,c){var d=this.api(!0),a=d.rows(a),e=a.settings()[0],h=e.aoData[a[0][0]];a.remove();b&&b.call(this,e,h);(c===k||c)&&d.draw();return h};this.fnDestroy=function(a){this.api(!0).destroy(a)};this.fnDraw=function(a){this.api(!0).draw(a)};
+this.fnFilter=function(a,b,c,d,e,h){e=this.api(!0);null===b||b===k?e.search(a,c,d,h):e.column(b).search(a,c,d,h);e.draw()};this.fnGetData=function(a,b){var c=this.api(!0);if(a!==k){var d=a.nodeName?a.nodeName.toLowerCase():"";return b!==k||"td"==d||"th"==d?c.cell(a,b).data():c.row(a).data()||null}return c.data().toArray()};this.fnGetNodes=function(a){var b=this.api(!0);return a!==k?b.row(a).node():b.rows().nodes().flatten().toArray()};this.fnGetPosition=function(a){var b=this.api(!0),c=a.nodeName.toUpperCase();
+return"TR"==c?b.row(a).index():"TD"==c||"TH"==c?(a=b.cell(a).index(),[a.row,a.columnVisible,a.column]):null};this.fnIsOpen=function(a){return this.api(!0).row(a).child.isShown()};this.fnOpen=function(a,b,c){return this.api(!0).row(a).child(b,c).show().child()[0]};this.fnPageChange=function(a,b){var c=this.api(!0).page(a);(b===k||b)&&c.draw(!1)};this.fnSetColumnVis=function(a,b,c){a=this.api(!0).column(a).visible(b);(c===k||c)&&a.columns.adjust().draw()};this.fnSettings=function(){return Aa(this[x.iApiIndex])};
+this.fnSort=function(a){this.api(!0).order(a).draw()};this.fnSortListener=function(a,b,c){this.api(!0).order.listener(a,b,c)};this.fnUpdate=function(a,b,c,d,e){var h=this.api(!0);c===k||null===c?h.row(b).data(a):h.cell(b,c).data(a);(e===k||e)&&h.columns.adjust();(d===k||d)&&h.draw();return 0};this.fnVersionCheck=x.fnVersionCheck;var b=this,c=a===k,d=this.length;c&&(a={});this.oApi=this.internal=x.internal;for(var e in m.ext.internal)e&&(this[e]=Ob(e));this.each(function(){var e={},g=1t<"F"ip>'),o.renderer)?h.isPlainObject(o.renderer)&&
+!o.renderer.header&&(o.renderer.header="jqueryui"):o.renderer="jqueryui":h.extend(u,m.ext.classes,g.oClasses);q.addClass(u.sTable);o.iInitDisplayStart===k&&(o.iInitDisplayStart=g.iDisplayStart,o._iDisplayStart=g.iDisplayStart);null!==g.iDeferLoading&&(o.bDeferLoading=!0,e=h.isArray(g.iDeferLoading),o._iRecordsDisplay=e?g.iDeferLoading[0]:g.iDeferLoading,o._iRecordsTotal=e?g.iDeferLoading[1]:g.iDeferLoading);var v=o.oLanguage;h.extend(!0,v,g.oLanguage);v.sUrl&&(h.ajax({dataType:"json",url:v.sUrl,success:function(a){Fa(a);
+J(l.oLanguage,a);h.extend(true,v,a);ha(o)},error:function(){ha(o)}}),n=!0);null===g.asStripeClasses&&(o.asStripeClasses=[u.sStripeOdd,u.sStripeEven]);var e=o.asStripeClasses,x=q.children("tbody").find("tr").eq(0);-1!==h.inArray(!0,h.map(e,function(a){return x.hasClass(a)}))&&(h("tbody tr",this).removeClass(e.join(" ")),o.asDestroyStripes=e.slice());e=[];r=this.getElementsByTagName("thead");0!==r.length&&(ea(o.aoHeader,r[0]),e=ta(o));if(null===g.aoColumns){r=[];j=0;for(i=e.length;j").appendTo(q));
+o.nTHead=b[0];b=q.children("tbody");b.length===0&&(b=h("").appendTo(q));o.nTBody=b[0];b=q.children("tfoot");if(b.length===0&&a.length>0&&(o.oScroll.sX!==""||o.oScroll.sY!==""))b=h("").appendTo(q);if(b.length===0||b.children().length===0)q.addClass(u.sNoFooter);else if(b.length>0){o.nTFoot=b[0];ea(o.aoFooter,o.nTFoot)}if(g.aaData)for(j=0;j/g,cc=/^\d{2,4}[\.\/\-]\d{1,2}[\.\/\-]\d{1,2}([T ]{1}\d{1,2}[:\.]\d{2}([\.:]\d{2})?)?$/,dc=RegExp("(\\/|\\.|\\*|\\+|\\?|\\||\\(|\\)|\\[|\\]|\\{|\\}|\\\\|\\$|\\^|\\-)","g"),Za=/[',$£€¥%\u2009\u202F\u20BD\u20a9\u20BArfk]/gi,M=function(a){return!a||!0===a||"-"===a?!0:!1},Qb=function(a){var b=parseInt(a,10);return!isNaN(b)&&
+isFinite(a)?b:null},Rb=function(a,b){$a[b]||($a[b]=RegExp(Sa(b),"g"));return"string"===typeof a&&"."!==b?a.replace(/\./g,"").replace($a[b],"."):a},ab=function(a,b,c){var d="string"===typeof a;if(M(a))return!0;b&&d&&(a=Rb(a,b));c&&d&&(a=a.replace(Za,""));return!isNaN(parseFloat(a))&&isFinite(a)},Sb=function(a,b,c){return M(a)?!0:!(M(a)||"string"===typeof a)?null:ab(a.replace(Ca,""),b,c)?!0:null},D=function(a,b,c){var d=[],e=0,f=a.length;if(c!==k)for(;ea.length)){b=a.slice().sort();for(var c=b[0],d=1,e=b.length;d")[0],$b=xa.textContent!==k,bc=
+/<.*?>/g,Qa=m.util.throttle,Ub=[],w=Array.prototype,ec=function(a){var b,c,d=m.settings,e=h.map(d,function(a){return a.nTable});if(a){if(a.nTable&&a.oApi)return[a];if(a.nodeName&&"table"===a.nodeName.toLowerCase())return b=h.inArray(a,e),-1!==b?[d[b]]:null;if(a&&"function"===typeof a.settings)return a.settings().toArray();"string"===typeof a?c=h(a):a instanceof h&&(c=a)}else return[];if(c)return c.map(function(){b=h.inArray(this,e);return-1!==b?d[b]:null}).toArray()};t=function(a,b){if(!(this instanceof
+t))return new t(a,b);var c=[],d=function(a){(a=ec(a))&&(c=c.concat(a))};if(h.isArray(a))for(var e=0,f=a.length;ea?new t(b[a],this[a]):null},filter:function(a){var b=[];if(w.filter)b=w.filter.call(this,a,this);else for(var c=0,d=this.length;c | ").addClass(b),h("td",c).addClass(b).html(a)[0].colSpan=ba(d),e.push(c[0]))};f(a,b);c._details&&c._details.detach();c._details=h(e);c._detailsShow&&c._details.insertAfter(c.nTr)}return this});p(["row().child.show()","row().child().show()"],function(){Wb(this,!0);return this});p(["row().child.hide()","row().child().hide()"],function(){Wb(this,!1);
+return this});p(["row().child.remove()","row().child().remove()"],function(){eb(this);return this});p("row().child.isShown()",function(){var a=this.context;return a.length&&this.length?a[0].aoData[this[0]]._detailsShow||!1:!1});var fc=/^([^:]+):(name|visIdx|visible)$/,Xb=function(a,b,c,d,e){for(var c=[],d=0,f=e.length;d=0?b:g.length+b];if(typeof a==="function"){var e=Da(c,f);return h.map(g,function(b,f){return a(f,Xb(c,f,0,0,e),i[f])?f:null})}var k=typeof a==="string"?a.match(fc):"";if(k)switch(k[2]){case "visIdx":case "visible":b=parseInt(k[1],10);if(b<0){var m=h.map(g,function(a,b){return a.bVisible?b:null});return[m[m.length+b]]}return[$(c,b)];case "name":return h.map(j,function(a,b){return a===
+k[1]?b:null});default:return[]}if(a.nodeName&&a._DT_CellIndex)return[a._DT_CellIndex.column];b=h(i).filter(a).map(function(){return h.inArray(this,i)}).toArray();if(b.length||!a.nodeName)return b;b=h(a).closest("*[data-dt-column]");return b.length?[b.data("dt-column")]:[]},c,f)},1);c.selector.cols=a;c.selector.opts=b;return c});u("columns().header()","column().header()",function(){return this.iterator("column",function(a,b){return a.aoColumns[b].nTh},1)});u("columns().footer()","column().footer()",
+function(){return this.iterator("column",function(a,b){return a.aoColumns[b].nTf},1)});u("columns().data()","column().data()",function(){return this.iterator("column-rows",Xb,1)});u("columns().dataSrc()","column().dataSrc()",function(){return this.iterator("column",function(a,b){return a.aoColumns[b].mData},1)});u("columns().cache()","column().cache()",function(a){return this.iterator("column-rows",function(b,c,d,e,f){return ja(b.aoData,f,"search"===a?"_aFilterData":"_aSortData",c)},1)});u("columns().nodes()",
+"column().nodes()",function(){return this.iterator("column-rows",function(a,b,c,d,e){return ja(a.aoData,e,"anCells",b)},1)});u("columns().visible()","column().visible()",function(a,b){var c=this.iterator("column",function(b,c){if(a===k)return b.aoColumns[c].bVisible;var f=b.aoColumns,g=f[c],j=b.aoData,i,n,l;if(a!==k&&g.bVisible!==a){if(a){var m=h.inArray(!0,D(f,"bVisible"),c+1);i=0;for(n=j.length;id;return!0};m.isDataTable=m.fnIsDataTable=function(a){var b=h(a).get(0),c=!1;if(a instanceof m.Api)return!0;h.each(m.settings,function(a,e){var f=e.nScrollHead?h("table",e.nScrollHead)[0]:null,g=e.nScrollFoot?h("table",e.nScrollFoot)[0]:null;if(e.nTable===b||f===b||g===b)c=!0});return c};m.tables=m.fnTables=function(a){var b=!1;h.isPlainObject(a)&&(b=a.api,a=a.visible);var c=h.map(m.settings,
+function(b){if(!a||a&&h(b.nTable).is(":visible"))return b.nTable});return b?new t(c):c};m.camelToHungarian=J;p("$()",function(a,b){var c=this.rows(b).nodes(),c=h(c);return h([].concat(c.filter(a).toArray(),c.find(a).toArray()))});h.each(["on","one","off"],function(a,b){p(b+"()",function(){var a=Array.prototype.slice.call(arguments);a[0]=h.map(a[0].split(/\s/),function(a){return!a.match(/\.dt\b/)?a+".dt":a}).join(" ");var d=h(this.tables().nodes());d[b].apply(d,a);return this})});p("clear()",function(){return this.iterator("table",
+function(a){pa(a)})});p("settings()",function(){return new t(this.context,this.context)});p("init()",function(){var a=this.context;return a.length?a[0].oInit:null});p("data()",function(){return this.iterator("table",function(a){return D(a.aoData,"_aData")}).flatten()});p("destroy()",function(a){a=a||!1;return this.iterator("table",function(b){var c=b.nTableWrapper.parentNode,d=b.oClasses,e=b.nTable,f=b.nTBody,g=b.nTHead,j=b.nTFoot,i=h(e),f=h(f),k=h(b.nTableWrapper),l=h.map(b.aoData,function(a){return a.nTr}),
+p;b.bDestroying=!0;s(b,"aoDestroyCallback","destroy",[b]);a||(new t(b)).columns().visible(!0);k.off(".DT").find(":not(tbody *)").off(".DT");h(E).off(".DT-"+b.sInstance);e!=g.parentNode&&(i.children("thead").detach(),i.append(g));j&&e!=j.parentNode&&(i.children("tfoot").detach(),i.append(j));b.aaSorting=[];b.aaSortingFixed=[];ya(b);h(l).removeClass(b.asStripeClasses.join(" "));h("th, td",g).removeClass(d.sSortable+" "+d.sSortableAsc+" "+d.sSortableDesc+" "+d.sSortableNone);b.bJUI&&(h("th span."+d.sSortIcon+
+", td span."+d.sSortIcon,g).detach(),h("th, td",g).each(function(){var a=h("div."+d.sSortJUIWrapper,this);h(this).append(a.contents());a.detach()}));f.children().detach();f.append(l);g=a?"remove":"detach";i[g]();k[g]();!a&&c&&(c.insertBefore(e,b.nTableReinsertBefore),i.css("width",b.sDestroyWidth).removeClass(d.sTable),(p=b.asDestroyStripes.length)&&f.children().each(function(a){h(this).addClass(b.asDestroyStripes[a%p])}));c=h.inArray(b,m.settings);-1!==c&&m.settings.splice(c,1)})});h.each(["column",
+"row","cell"],function(a,b){p(b+"s().every()",function(a){var d=this.selector.opts,e=this;return this.iterator(b,function(f,g,h,i,m){a.call(e[b](g,"cell"===b?h:d,"cell"===b?d:k),g,h,i,m)})})});p("i18n()",function(a,b,c){var d=this.context[0],a=R(a)(d.oLanguage);a===k&&(a=b);c!==k&&h.isPlainObject(a)&&(a=a[c]!==k?a[c]:a._);return a.replace("%d",c)});m.version="1.10.15";m.settings=[];m.models={};m.models.oSearch={bCaseInsensitive:!0,sSearch:"",bRegex:!1,bSmart:!0};m.models.oRow={nTr:null,anCells:null,
+_aData:[],_aSortData:null,_aFilterData:null,_sFilterRow:null,_sRowStripe:"",src:null,idx:-1};m.models.oColumn={idx:null,aDataSort:null,asSorting:null,bSearchable:null,bSortable:null,bVisible:null,_sManualType:null,_bAttrSrc:!1,fnCreatedCell:null,fnGetData:null,fnSetData:null,mData:null,mRender:null,nTh:null,nTf:null,sClass:null,sContentPadding:null,sDefaultContent:null,sName:null,sSortDataType:"std",sSortingClass:null,sSortingClassJUI:null,sTitle:null,sType:null,sWidth:null,sWidthOrig:null};m.defaults=
+{aaData:null,aaSorting:[[0,"asc"]],aaSortingFixed:[],ajax:null,aLengthMenu:[10,25,50,100],aoColumns:null,aoColumnDefs:null,aoSearchCols:[],asStripeClasses:null,bAutoWidth:!0,bDeferRender:!1,bDestroy:!1,bFilter:!0,bInfo:!0,bJQueryUI:!1,bLengthChange:!0,bPaginate:!0,bProcessing:!1,bRetrieve:!1,bScrollCollapse:!1,bServerSide:!1,bSort:!0,bSortMulti:!0,bSortCellsTop:!1,bSortClasses:!0,bStateSave:!1,fnCreatedRow:null,fnDrawCallback:null,fnFooterCallback:null,fnFormatNumber:function(a){return a.toString().replace(/\B(?=(\d{3})+(?!\d))/g,
+this.oLanguage.sThousands)},fnHeaderCallback:null,fnInfoCallback:null,fnInitComplete:null,fnPreDrawCallback:null,fnRowCallback:null,fnServerData:null,fnServerParams:null,fnStateLoadCallback:function(a){try{return JSON.parse((-1===a.iStateDuration?sessionStorage:localStorage).getItem("DataTables_"+a.sInstance+"_"+location.pathname))}catch(b){}},fnStateLoadParams:null,fnStateLoaded:null,fnStateSaveCallback:function(a,b){try{(-1===a.iStateDuration?sessionStorage:localStorage).setItem("DataTables_"+a.sInstance+
+"_"+location.pathname,JSON.stringify(b))}catch(c){}},fnStateSaveParams:null,iStateDuration:7200,iDeferLoading:null,iDisplayLength:10,iDisplayStart:0,iTabIndex:0,oClasses:{},oLanguage:{oAria:{sSortAscending:": activate to sort column ascending",sSortDescending:": activate to sort column descending"},oPaginate:{sFirst:"First",sLast:"Last",sNext:"Next",sPrevious:"Previous"},sEmptyTable:"No data available in table",sInfo:"Showing _START_ to _END_ of _TOTAL_ entries",sInfoEmpty:"Showing 0 to 0 of 0 entries",
+sInfoFiltered:"(filtered from _MAX_ total entries)",sInfoPostFix:"",sDecimal:"",sThousands:",",sLengthMenu:"Show _MENU_ entries",sLoadingRecords:"Loading...",sProcessing:"Processing...",sSearch:"Search:",sSearchPlaceholder:"",sUrl:"",sZeroRecords:"No matching records found"},oSearch:h.extend({},m.models.oSearch),sAjaxDataProp:"data",sAjaxSource:null,sDom:"lfrtip",searchDelay:null,sPaginationType:"simple_numbers",sScrollX:"",sScrollXInner:"",sScrollY:"",sServerMethod:"GET",renderer:null,rowId:"DT_RowId"};
+Y(m.defaults);m.defaults.column={aDataSort:null,iDataSort:-1,asSorting:["asc","desc"],bSearchable:!0,bSortable:!0,bVisible:!0,fnCreatedCell:null,mData:null,mRender:null,sCellType:"td",sClass:"",sContentPadding:"",sDefaultContent:null,sName:"",sSortDataType:"std",sTitle:null,sType:null,sWidth:null};Y(m.defaults.column);m.models.oSettings={oFeatures:{bAutoWidth:null,bDeferRender:null,bFilter:null,bInfo:null,bLengthChange:null,bPaginate:null,bProcessing:null,bServerSide:null,bSort:null,bSortMulti:null,
+bSortClasses:null,bStateSave:null},oScroll:{bCollapse:null,iBarWidth:0,sX:null,sXInner:null,sY:null},oLanguage:{fnInfoCallback:null},oBrowser:{bScrollOversize:!1,bScrollbarLeft:!1,bBounding:!1,barWidth:0},ajax:null,aanFeatures:[],aoData:[],aiDisplay:[],aiDisplayMaster:[],aIds:{},aoColumns:[],aoHeader:[],aoFooter:[],oPreviousSearch:{},aoPreSearchCols:[],aaSorting:null,aaSortingFixed:[],asStripeClasses:null,asDestroyStripes:[],sDestroyWidth:0,aoRowCallback:[],aoHeaderCallback:[],aoFooterCallback:[],
+aoDrawCallback:[],aoRowCreatedCallback:[],aoPreDrawCallback:[],aoInitComplete:[],aoStateSaveParams:[],aoStateLoadParams:[],aoStateLoaded:[],sTableId:"",nTable:null,nTHead:null,nTFoot:null,nTBody:null,nTableWrapper:null,bDeferLoading:!1,bInitialised:!1,aoOpenRows:[],sDom:null,searchDelay:null,sPaginationType:"two_button",iStateDuration:0,aoStateSave:[],aoStateLoad:[],oSavedState:null,oLoadedState:null,sAjaxSource:null,sAjaxDataProp:null,bAjaxDataGet:!0,jqXHR:null,json:k,oAjaxData:k,fnServerData:null,
+aoServerParams:[],sServerMethod:null,fnFormatNumber:null,aLengthMenu:null,iDraw:0,bDrawing:!1,iDrawError:-1,_iDisplayLength:10,_iDisplayStart:0,_iRecordsTotal:0,_iRecordsDisplay:0,bJUI:null,oClasses:{},bFiltered:!1,bSorted:!1,bSortCellsTop:null,oInit:null,aoDestroyCallback:[],fnRecordsTotal:function(){return"ssp"==y(this)?1*this._iRecordsTotal:this.aiDisplayMaster.length},fnRecordsDisplay:function(){return"ssp"==y(this)?1*this._iRecordsDisplay:this.aiDisplay.length},fnDisplayEnd:function(){var a=
+this._iDisplayLength,b=this._iDisplayStart,c=b+a,d=this.aiDisplay.length,e=this.oFeatures,f=e.bPaginate;return e.bServerSide?!1===f||-1===a?b+d:Math.min(b+a,this._iRecordsDisplay):!f||c>d||-1===a?d:c},oInstance:null,sInstance:null,iTabIndex:0,nScrollHead:null,nScrollFoot:null,aLastSort:[],oPlugins:{},rowIdFn:null,rowId:null};m.ext=x={buttons:{},classes:{},build:"bs/dt-1.10.15/b-1.3.1/b-colvis-1.3.1/cr-1.3.3/fc-3.2.2/fh-3.1.2/r-2.1.1/rg-1.0.0/rr-1.2.0/sc-1.4.2/se-1.2.2",errMode:"alert",feature:[],search:[],selector:{cell:[],column:[],row:[]},internal:{},legacy:{ajax:null},pager:{},renderer:{pageButton:{},
+header:{}},order:{},type:{detect:[],search:{},order:{}},_unique:0,fnVersionCheck:m.fnVersionCheck,iApiIndex:0,oJUIClasses:{},sVersion:m.version};h.extend(x,{afnFiltering:x.search,aTypes:x.type.detect,ofnSearch:x.type.search,oSort:x.type.order,afnSortData:x.order,aoFeatures:x.feature,oApi:x.internal,oStdClasses:x.classes,oPagination:x.pager});h.extend(m.ext.classes,{sTable:"dataTable",sNoFooter:"no-footer",sPageButton:"paginate_button",sPageButtonActive:"current",sPageButtonDisabled:"disabled",sStripeOdd:"odd",
+sStripeEven:"even",sRowEmpty:"dataTables_empty",sWrapper:"dataTables_wrapper",sFilter:"dataTables_filter",sInfo:"dataTables_info",sPaging:"dataTables_paginate paging_",sLength:"dataTables_length",sProcessing:"dataTables_processing",sSortAsc:"sorting_asc",sSortDesc:"sorting_desc",sSortable:"sorting",sSortableAsc:"sorting_asc_disabled",sSortableDesc:"sorting_desc_disabled",sSortableNone:"sorting_disabled",sSortColumn:"sorting_",sFilterInput:"",sLengthSelect:"",sScrollWrapper:"dataTables_scroll",sScrollHead:"dataTables_scrollHead",
+sScrollHeadInner:"dataTables_scrollHeadInner",sScrollBody:"dataTables_scrollBody",sScrollFoot:"dataTables_scrollFoot",sScrollFootInner:"dataTables_scrollFootInner",sHeaderTH:"",sFooterTH:"",sSortJUIAsc:"",sSortJUIDesc:"",sSortJUI:"",sSortJUIAscAllowed:"",sSortJUIDescAllowed:"",sSortJUIWrapper:"",sSortIcon:"",sJUIHeader:"",sJUIFooter:""});var Ea="",Ea="",G=Ea+"ui-state-default",ka=Ea+"css_right ui-icon ui-icon-",Yb=Ea+"fg-toolbar ui-toolbar ui-widget-header ui-helper-clearfix";h.extend(m.ext.oJUIClasses,
+m.ext.classes,{sPageButton:"fg-button ui-button "+G,sPageButtonActive:"ui-state-disabled",sPageButtonDisabled:"ui-state-disabled",sPaging:"dataTables_paginate fg-buttonset ui-buttonset fg-buttonset-multi ui-buttonset-multi paging_",sSortAsc:G+" sorting_asc",sSortDesc:G+" sorting_desc",sSortable:G+" sorting",sSortableAsc:G+" sorting_asc_disabled",sSortableDesc:G+" sorting_desc_disabled",sSortableNone:G+" sorting_disabled",sSortJUIAsc:ka+"triangle-1-n",sSortJUIDesc:ka+"triangle-1-s",sSortJUI:ka+"carat-2-n-s",
+sSortJUIAscAllowed:ka+"carat-1-n",sSortJUIDescAllowed:ka+"carat-1-s",sSortJUIWrapper:"DataTables_sort_wrapper",sSortIcon:"DataTables_sort_icon",sScrollHead:"dataTables_scrollHead "+G,sScrollFoot:"dataTables_scrollFoot "+G,sHeaderTH:G,sFooterTH:G,sJUIHeader:Yb+" ui-corner-tl ui-corner-tr",sJUIFooter:Yb+" ui-corner-bl ui-corner-br"});var Nb=m.ext.pager;h.extend(Nb,{simple:function(){return["previous","next"]},full:function(){return["first","previous","next","last"]},numbers:function(a,b){return[ia(a,
+b)]},simple_numbers:function(a,b){return["previous",ia(a,b),"next"]},full_numbers:function(a,b){return["first","previous",ia(a,b),"next","last"]},first_last_numbers:function(a,b){return["first",ia(a,b),"last"]},_numbers:ia,numbers_length:7});h.extend(!0,m.ext.renderer,{pageButton:{_:function(a,b,c,d,e,f){var g=a.oClasses,j=a.oLanguage.oPaginate,i=a.oLanguage.oAria.paginate||{},m,l,p=0,r=function(b,d){var k,t,u,s,v=function(b){Va(a,b.data.action,true)};k=0;for(t=d.length;k").appendTo(b);r(u,s)}else{m=null;l="";switch(s){case "ellipsis":b.append('…');break;case "first":m=j.sFirst;l=s+(e>0?"":" "+g.sPageButtonDisabled);break;case "previous":m=j.sPrevious;l=s+(e>0?"":" "+g.sPageButtonDisabled);break;case "next":m=j.sNext;l=s+(e",{"class":g.sPageButton+
+" "+l,"aria-controls":a.sTableId,"aria-label":i[s],"data-dt-idx":p,tabindex:a.iTabIndex,id:c===0&&typeof s==="string"?a.sTableId+"_"+s:null}).html(m).appendTo(b);Ya(u,{action:s},v);p++}}}},t;try{t=h(b).find(H.activeElement).data("dt-idx")}catch(u){}r(h(b).empty(),d);t!==k&&h(b).find("[data-dt-idx="+t+"]").focus()}}});h.extend(m.ext.type.detect,[function(a,b){var c=b.oLanguage.sDecimal;return ab(a,c)?"num"+c:null},function(a){if(a&&!(a instanceof Date)&&!cc.test(a))return null;var b=Date.parse(a);
+return null!==b&&!isNaN(b)||M(a)?"date":null},function(a,b){var c=b.oLanguage.sDecimal;return ab(a,c,!0)?"num-fmt"+c:null},function(a,b){var c=b.oLanguage.sDecimal;return Sb(a,c)?"html-num"+c:null},function(a,b){var c=b.oLanguage.sDecimal;return Sb(a,c,!0)?"html-num-fmt"+c:null},function(a){return M(a)||"string"===typeof a&&-1!==a.indexOf("<")?"html":null}]);h.extend(m.ext.type.search,{html:function(a){return M(a)?a:"string"===typeof a?a.replace(Pb," ").replace(Ca,""):""},string:function(a){return M(a)?
+a:"string"===typeof a?a.replace(Pb," "):a}});var Ba=function(a,b,c,d){if(0!==a&&(!a||"-"===a))return-Infinity;b&&(a=Rb(a,b));a.replace&&(c&&(a=a.replace(c,"")),d&&(a=a.replace(d,"")));return 1*a};h.extend(x.type.order,{"date-pre":function(a){return Date.parse(a)||-Infinity},"html-pre":function(a){return M(a)?"":a.replace?a.replace(/<.*?>/g,"").toLowerCase():a+""},"string-pre":function(a){return M(a)?"":"string"===typeof a?a.toLowerCase():!a.toString?"":a.toString()},"string-asc":function(a,b){return a<
+b?-1:a>b?1:0},"string-desc":function(a,b){return ab?-1:0}});fb("");h.extend(!0,m.ext.renderer,{header:{_:function(a,b,c,d){h(a.nTable).on("order.dt.DT",function(e,f,g,h){if(a===f){e=c.idx;b.removeClass(c.sSortingClass+" "+d.sSortAsc+" "+d.sSortDesc).addClass(h[e]=="asc"?d.sSortAsc:h[e]=="desc"?d.sSortDesc:c.sSortingClass)}})},jqueryui:function(a,b,c,d){h("").addClass(d.sSortJUIWrapper).append(b.contents()).append(h("").addClass(d.sSortIcon+" "+c.sSortingClassJUI)).appendTo(b);
+h(a.nTable).on("order.dt.DT",function(e,f,g,h){if(a===f){e=c.idx;b.removeClass(d.sSortAsc+" "+d.sSortDesc).addClass(h[e]=="asc"?d.sSortAsc:h[e]=="desc"?d.sSortDesc:c.sSortingClass);b.find("span."+d.sSortIcon).removeClass(d.sSortJUIAsc+" "+d.sSortJUIDesc+" "+d.sSortJUI+" "+d.sSortJUIAscAllowed+" "+d.sSortJUIDescAllowed).addClass(h[e]=="asc"?d.sSortJUIAsc:h[e]=="desc"?d.sSortJUIDesc:c.sSortingClassJUI)}})}}});var Zb=function(a){return"string"===typeof a?a.replace(//g,">").replace(/"/g,
+"""):a};m.render={number:function(a,b,c,d,e){return{display:function(f){if("number"!==typeof f&&"string"!==typeof f)return f;var g=0>f?"-":"",h=parseFloat(f);if(isNaN(h))return Zb(f);h=h.toFixed(c);f=Math.abs(h);h=parseInt(f,10);f=c?b+(f-h).toFixed(c).substring(2):"";return g+(d||"")+h.toString().replace(/\B(?=(\d{3})+(?!\d))/g,a)+f+(e||"")}}},text:function(){return{display:Zb}}};h.extend(m.ext.internal,{_fnExternApiFunc:Ob,_fnBuildAjax:ua,_fnAjaxUpdate:nb,_fnAjaxParameters:wb,_fnAjaxUpdateDraw:xb,
+_fnAjaxDataSrc:va,_fnAddColumn:Ga,_fnColumnOptions:la,_fnAdjustColumnSizing:Z,_fnVisibleToColumnIndex:$,_fnColumnIndexToVisible:aa,_fnVisbleColumns:ba,_fnGetColumns:na,_fnColumnTypes:Ia,_fnApplyColumnDefs:kb,_fnHungarianMap:Y,_fnCamelToHungarian:J,_fnLanguageCompat:Fa,_fnBrowserDetect:ib,_fnAddData:N,_fnAddTr:oa,_fnNodeToDataIndex:function(a,b){return b._DT_RowIndex!==k?b._DT_RowIndex:null},_fnNodeToColumnIndex:function(a,b,c){return h.inArray(c,a.aoData[b].anCells)},_fnGetCellData:B,_fnSetCellData:lb,
+_fnSplitObjNotation:La,_fnGetObjectDataFn:R,_fnSetObjectDataFn:S,_fnGetDataMaster:Ma,_fnClearTable:pa,_fnDeleteIndex:qa,_fnInvalidate:da,_fnGetRowElements:Ka,_fnCreateTr:Ja,_fnBuildHead:mb,_fnDrawHead:fa,_fnDraw:O,_fnReDraw:T,_fnAddOptionsHtml:pb,_fnDetectHeader:ea,_fnGetUniqueThs:ta,_fnFeatureHtmlFilter:rb,_fnFilterComplete:ga,_fnFilterCustom:Ab,_fnFilterColumn:zb,_fnFilter:yb,_fnFilterCreateSearch:Ra,_fnEscapeRegex:Sa,_fnFilterData:Bb,_fnFeatureHtmlInfo:ub,_fnUpdateInfo:Eb,_fnInfoMacros:Fb,_fnInitialise:ha,
+_fnInitComplete:wa,_fnLengthChange:Ta,_fnFeatureHtmlLength:qb,_fnFeatureHtmlPaginate:vb,_fnPageChange:Va,_fnFeatureHtmlProcessing:sb,_fnProcessingDisplay:C,_fnFeatureHtmlTable:tb,_fnScrollDraw:ma,_fnApplyToChildren:I,_fnCalculateColumnWidths:Ha,_fnThrottle:Qa,_fnConvertToWidth:Gb,_fnGetWidestNode:Hb,_fnGetMaxLenString:Ib,_fnStringToCss:v,_fnSortFlatten:W,_fnSort:ob,_fnSortAria:Kb,_fnSortListener:Xa,_fnSortAttachListener:Oa,_fnSortingClasses:ya,_fnSortData:Jb,_fnSaveState:za,_fnLoadState:Lb,_fnSettingsFromNode:Aa,
+_fnLog:K,_fnMap:F,_fnBindAction:Ya,_fnCallbackReg:z,_fnCallbackFire:s,_fnLengthOverflow:Ua,_fnRenderer:Pa,_fnDataSource:y,_fnRowAttributes:Na,_fnCalculateEnd:function(){}});h.fn.dataTable=m;m.$=h;h.fn.dataTableSettings=m.settings;h.fn.dataTableExt=m.ext;h.fn.DataTable=function(a){return h(this).dataTable(a).api()};h.each(m,function(a,b){h.fn.DataTable[a]=b});return h.fn.dataTable});
+
+
+/*!
+ DataTables Bootstrap 3 integration
+ ©2011-2015 SpryMedia Ltd - datatables.net/license
+*/
+(function(b){"function"===typeof define&&define.amd?define(["jquery","datatables.net"],function(a){return b(a,window,document)}):"object"===typeof exports?module.exports=function(a,d){a||(a=window);if(!d||!d.fn.dataTable)d=require("datatables.net")(a,d).$;return b(d,a,a.document)}:b(jQuery,window,document)})(function(b,a,d,m){var f=b.fn.dataTable;b.extend(!0,f.defaults,{dom:"<'row'<'col-sm-6'l><'col-sm-6'f>><'row'<'col-sm-12'tr>><'row'<'col-sm-5'i><'col-sm-7'p>>",renderer:"bootstrap"});b.extend(f.ext.classes,
+{sWrapper:"dataTables_wrapper form-inline dt-bootstrap",sFilterInput:"form-control input-sm",sLengthSelect:"form-control input-sm",sProcessing:"dataTables_processing panel panel-default"});f.ext.renderer.pageButton.bootstrap=function(a,h,r,s,j,n){var o=new f.Api(a),t=a.oClasses,k=a.oLanguage.oPaginate,u=a.oLanguage.oAria.paginate||{},e,g,p=0,q=function(d,f){var l,h,i,c,m=function(a){a.preventDefault();!b(a.currentTarget).hasClass("disabled")&&o.page()!=a.data.action&&o.page(a.data.action).draw("page")};
+l=0;for(h=f.length;l",{"class":t.sPageButton+" "+g,id:0===r&&"string"===typeof c?a.sTableId+"_"+c:null}).append(b("",{href:"#",
+"aria-controls":a.sTableId,"aria-label":u[c],"data-dt-idx":p,tabindex:a.iTabIndex}).html(e)).appendTo(d),a.oApi._fnBindAction(i,{action:c},m),p++)}},i;try{i=b(h).find(d.activeElement).data("dt-idx")}catch(v){}q(b(h).empty().html('').children("ul"),s);i!==m&&b(h).find("[data-dt-idx="+i+"]").focus()};return f});
+
+
+/*!
+ Buttons for DataTables 1.3.1
+ ©2016 SpryMedia Ltd - datatables.net/license
+*/
+(function(d){"function"===typeof define&&define.amd?define(["jquery","datatables.net"],function(n){return d(n,window,document)}):"object"===typeof exports?module.exports=function(n,o){n||(n=window);if(!o||!o.fn.dataTable)o=require("datatables.net")(n,o).$;return d(o,n,n.document)}:d(jQuery,window,document)})(function(d,n,o,l){var i=d.fn.dataTable,u=0,v=0,j=i.ext.buttons,m=function(a,b){"undefined"===typeof b&&(b={});!0===b&&(b={});d.isArray(b)&&(b={buttons:b});this.c=d.extend(!0,{},m.defaults,b);
+b.buttons&&(this.c.buttons=b.buttons);this.s={dt:new i.Api(a),buttons:[],listenKeys:"",namespace:"dtb"+u++};this.dom={container:d("<"+this.c.dom.container.tag+"/>").addClass(this.c.dom.container.className)};this._constructor()};d.extend(m.prototype,{action:function(a,b){var c=this._nodeToButton(a);if(b===l)return c.conf.action;c.conf.action=b;return this},active:function(a,b){var c=this._nodeToButton(a),e=this.c.dom.button.active,c=d(c.node);if(b===l)return c.hasClass(e);c.toggleClass(e,b===l?!0:
+b);return this},add:function(a,b){var c=this.s.buttons;if("string"===typeof b){for(var e=b.split("-"),c=this.s,d=0,h=e.length-1;d").addClass(s.className).attr("role","menu");p.conf._collection=p.collection;this._expandButton(p.buttons,p.conf.buttons,!0,e)}k.init&&k.init.call(g.button(p.node),g,d(p.node),k);h++}}}},_buildButton:function(a,b){var c=this.c.dom.button,
+e=this.c.dom.buttonLiner,g=this.c.dom.collection,h=this.s.dt,f=function(b){return"function"===typeof b?b(h,k,a):b};b&&g.button&&(c=g.button);b&&g.buttonLiner&&(e=g.buttonLiner);if(a.available&&!a.available(h,a))return!1;var r=function(a,b,c,e){e.action.call(b.button(c),a,b,c,e);d(b.table().node()).triggerHandler("buttons-action.dt",[b.button(c),b,c,e])},k=d("<"+c.tag+"/>").addClass(c.className).attr("tabindex",this.s.dt.settings()[0].iTabIndex).attr("aria-controls",this.s.dt.table().node().id).on("click.dtb",
+function(b){b.preventDefault();!k.hasClass(c.disabled)&&a.action&&r(b,h,k,a);k.blur()}).on("keyup.dtb",function(b){b.keyCode===13&&!k.hasClass(c.disabled)&&a.action&&r(b,h,k,a)});"a"===c.tag.toLowerCase()&&k.attr("href","#");e.tag?(g=d("<"+e.tag+"/>").html(f(a.text)).addClass(e.className),"a"===e.tag.toLowerCase()&&g.attr("href","#"),k.append(g)):k.html(f(a.text));!1===a.enabled&&k.addClass(c.disabled);a.className&&k.addClass(a.className);a.titleAttr&&k.attr("title",f(a.titleAttr));a.namespace||(a.namespace=
+".dt-button-"+v++);e=(e=this.c.dom.buttonContainer)&&e.tag?d("<"+e.tag+"/>").addClass(e.className).append(k):k;this._addKey(a);return{conf:a,node:k.get(0),inserter:e,buttons:[],inCollection:b,collection:null}},_nodeToButton:function(a,b){b||(b=this.s.buttons);for(var c=0,e=b.length;c").addClass(b).css("display",
+"none").appendTo("body").fadeIn(c):d("body > div."+b).fadeOut(c,function(){d(this).removeClass(b).remove()})};m.instanceSelector=function(a,b){if(!a)return d.map(b,function(a){return a.inst});var c=[],e=d.map(b,function(a){return a.name}),g=function(a){if(d.isArray(a))for(var f=0,r=a.length;fg&&e._collection.css("left",a.left-(c-g))):(a=e._collection.height()/2,a>d(n).height()/2&&(a=d(n).height()/2),e._collection.css("marginTop",-1*a));e.background&&m.background(!0,e.backgroundClassName,e.fade);setTimeout(function(){d("div.dt-button-background").on("click.dtb-collection",function(){});d("body").on("click.dtb-collection",function(a){var c=d.fn.addBack?"addBack":"andSelf";if(!d(a.target).parents()[c]().filter(e._collection).length){e._collection.fadeOut(e.fade,function(){e._collection.detach()});
+d("div.dt-button-background").off("click.dtb-collection");m.background(false,e.backgroundClassName,e.fade);d("body").off("click.dtb-collection");b.off("buttons-action.b-internal")}})},10);if(e.autoClose)b.on("buttons-action.b-internal",function(){d("div.dt-button-background").click()})},background:!0,collectionLayout:"",backgroundClassName:"dt-button-background",autoClose:!1,fade:400},copy:function(a,b){if(j.copyHtml5)return"copyHtml5";if(j.copyFlash&&j.copyFlash.available(a,b))return"copyFlash"},
+csv:function(a,b){if(j.csvHtml5&&j.csvHtml5.available(a,b))return"csvHtml5";if(j.csvFlash&&j.csvFlash.available(a,b))return"csvFlash"},excel:function(a,b){if(j.excelHtml5&&j.excelHtml5.available(a,b))return"excelHtml5";if(j.excelFlash&&j.excelFlash.available(a,b))return"excelFlash"},pdf:function(a,b){if(j.pdfHtml5&&j.pdfHtml5.available(a,b))return"pdfHtml5";if(j.pdfFlash&&j.pdfFlash.available(a,b))return"pdfFlash"},pageLength:function(a){var a=a.settings()[0].aLengthMenu,b=d.isArray(a[0])?a[0]:a,
+c=d.isArray(a[0])?a[1]:a,e=function(a){return a.i18n("buttons.pageLength",{"-1":"Show all rows",_:"Show %d rows"},a.page.len())};return{extend:"collection",text:e,className:"buttons-page-length",autoClose:!0,buttons:d.map(b,function(a,b){return{text:c[b],className:"button-page-length",action:function(b,c){c.page.len(a).draw()},init:function(b,c,d){var e=this,c=function(){e.active(b.page.len()===a)};b.on("length.dt"+d.namespace,c);c()},destroy:function(a,b,c){a.off("length.dt"+c.namespace)}}}),init:function(a,
+b,c){var d=this;a.on("length.dt"+c.namespace,function(){d.text(e(a))})},destroy:function(a,b,c){a.off("length.dt"+c.namespace)}}}});i.Api.register("buttons()",function(a,b){b===l&&(b=a,a=l);this.selector.buttonGroup=a;var c=this.iterator(!0,"table",function(c){if(c._buttons)return m.buttonSelector(m.instanceSelector(a,c._buttons),b)},!0);c._groupSelector=a;return c});i.Api.register("button()",function(a,b){var c=this.buttons(a,b);1').html(a?""+a+"
":"").append(d("")["string"===typeof b?"html":"append"](b)).css("display","none").appendTo("body").fadeIn();c!==l&&0!==c&&(q=setTimeout(function(){e.buttons.info(!1)},c));return this});
+i.Api.register("buttons.exportData()",function(a){if(this.context.length){for(var b=new i.Api(this.context[0]),c=d.extend(!0,{},{rows:null,columns:"",modifier:{search:"applied",order:"applied"},orthogonal:"display",stripHtml:!0,stripNewlines:!0,decodeEntities:!0,trim:!0,format:{header:function(a){return e(a)},footer:function(a){return e(a)},body:function(a){return e(a)}}},a),e=function(a){if("string"!==typeof a)return a;a=a.replace(/
+
diff --git a/src/main/resources/templates/project_view.html b/src/main/resources/templates/project_view.html
new file mode 100644
index 0000000..b28e5b8
--- /dev/null
+++ b/src/main/resources/templates/project_view.html
@@ -0,0 +1,663 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/main/resources/templates/projectform.html b/src/main/resources/templates/projectform.html
index c70ac00..866fd3e 100644
--- a/src/main/resources/templates/projectform.html
+++ b/src/main/resources/templates/projectform.html
@@ -11,56 +11,64 @@
Project Details
-
-
- | Id |
- Name |
- User rule |
- View |
- Edit |
- Delete |
-
-
- | Project Name |
- Project DB Name |
- |
- View |
- Edit |
- Delete |
-
-
-
+
+
+ | Id |
+ Name |
+ User rule |
+ Open |
+ View |
+ Edit |
+ Delete |
+
+
+
+
+
+
+
+
Test Progress Bar
+
+
+
+
+
+
diff --git a/src/main/resources/templates/projectshow.html b/src/main/resources/templates/projectshow.html
index 7efe9ae..e3b18d3 100644
--- a/src/main/resources/templates/projectshow.html
+++ b/src/main/resources/templates/projectshow.html
@@ -55,6 +55,18 @@
diff --git a/src/main/resources/templates/test.html b/src/main/resources/templates/test.html
new file mode 100644
index 0000000..255bb6c
--- /dev/null
+++ b/src/main/resources/templates/test.html
@@ -0,0 +1,116 @@
+
+
+