From 9f87819fc754c941ae44dad149322330a8df8736 Mon Sep 17 00:00:00 2001 From: Ahmed Tawila Date: Mon, 12 Jun 2017 07:22:05 +0200 Subject: [PATCH 001/236] Evaluation article: Different Types of Bean Injection in Spring --- .../java/com/baeldung/ConstructorApp.java | 15 ++++++ .../src/main/java/com/baeldung/SetterApp.java | 15 ++++++ .../main/java/com/baeldung/model/College.java | 32 +++++++++++++ .../main/java/com/baeldung/model/Student.java | 46 +++++++++++++++++++ .../main/resources/constructor-context.xml | 17 +++++++ .../src/main/resources/setter-context.xml | 19 ++++++++ 6 files changed, 144 insertions(+) create mode 100644 spring-core/src/main/java/com/baeldung/ConstructorApp.java create mode 100644 spring-core/src/main/java/com/baeldung/SetterApp.java create mode 100644 spring-core/src/main/java/com/baeldung/model/College.java create mode 100644 spring-core/src/main/java/com/baeldung/model/Student.java create mode 100644 spring-core/src/main/resources/constructor-context.xml create mode 100644 spring-core/src/main/resources/setter-context.xml diff --git a/spring-core/src/main/java/com/baeldung/ConstructorApp.java b/spring-core/src/main/java/com/baeldung/ConstructorApp.java new file mode 100644 index 0000000000..89aa55d3b1 --- /dev/null +++ b/spring-core/src/main/java/com/baeldung/ConstructorApp.java @@ -0,0 +1,15 @@ +package com.baeldung; + +import org.springframework.context.ApplicationContext; +import org.springframework.context.support.ClassPathXmlApplicationContext; + +import com.baeldung.model.Student; + +public class ConstructorApp { + public static void main(String[] args) { + ApplicationContext context = new ClassPathXmlApplicationContext("constructor-context.xml"); + + Student student = (Student) context.getBean("student"); + student.introduceMyself(); + } +} diff --git a/spring-core/src/main/java/com/baeldung/SetterApp.java b/spring-core/src/main/java/com/baeldung/SetterApp.java new file mode 100644 index 0000000000..17de7db6dd --- /dev/null +++ b/spring-core/src/main/java/com/baeldung/SetterApp.java @@ -0,0 +1,15 @@ +package com.baeldung; + +import org.springframework.context.ApplicationContext; +import org.springframework.context.support.ClassPathXmlApplicationContext; + +import com.baeldung.model.Student; + +public class SetterApp { + public static void main(String[] args) { + ApplicationContext context = new ClassPathXmlApplicationContext("setter-context.xml"); + + Student student = (Student) context.getBean("student"); + student.introduceMyself(); + } +} diff --git a/spring-core/src/main/java/com/baeldung/model/College.java b/spring-core/src/main/java/com/baeldung/model/College.java new file mode 100644 index 0000000000..0e55561fe7 --- /dev/null +++ b/spring-core/src/main/java/com/baeldung/model/College.java @@ -0,0 +1,32 @@ +package com.baeldung.model; + +public class College { + + private int id; + private String name; + + public College() { + } + + public College(int id, String name) { + this.id = id; + this.name = name; + } + + public int getId() { + return id; + } + + public void setId(int id) { + this.id = id; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + +} diff --git a/spring-core/src/main/java/com/baeldung/model/Student.java b/spring-core/src/main/java/com/baeldung/model/Student.java new file mode 100644 index 0000000000..46f01cd32d --- /dev/null +++ b/spring-core/src/main/java/com/baeldung/model/Student.java @@ -0,0 +1,46 @@ +package com.baeldung.model; + +public class Student { + + private int id; + private String name; + private College college; + + public Student() { + } + + public Student(int id, String name, College college) { + this.id = id; + this.name = name; + this.college = college; + } + + public int getId() { + return id; + } + + public void setId(int id) { + this.id = id; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public College getCollege() { + return college; + } + + public void setCollege(College college) { + this.college = college; + } + + public void introduceMyself() { + System.out.println("My ID is " + id + " and my name is " + name + ". I am a student at " + college.getName() + " College."); + } + +} diff --git a/spring-core/src/main/resources/constructor-context.xml b/spring-core/src/main/resources/constructor-context.xml new file mode 100644 index 0000000000..67d492a0d6 --- /dev/null +++ b/spring-core/src/main/resources/constructor-context.xml @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + diff --git a/spring-core/src/main/resources/setter-context.xml b/spring-core/src/main/resources/setter-context.xml new file mode 100644 index 0000000000..e97bfb4b11 --- /dev/null +++ b/spring-core/src/main/resources/setter-context.xml @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + \ No newline at end of file From ac2ce9636c1fef94bc0357bacc7b0283141c3f78 Mon Sep 17 00:00:00 2001 From: Ahmed Tawila Date: Fri, 16 Jun 2017 13:57:37 +0200 Subject: [PATCH 002/236] added tests & changed configuration to Java-based config --- .../java/com/baeldung/ConstructorApp.java | 7 +++-- .../src/main/java/com/baeldung/SetterApp.java | 10 +++---- .../configuration/ConstructorConfig.java | 21 ++++++++++++++ .../baeldung/configuration/SetterConfig.java | 28 +++++++++++++++++++ .../configuration/ConstructorConfigTest.java | 22 +++++++++++++++ .../configuration/SetterConfigTest.java | 22 +++++++++++++++ 6 files changed, 101 insertions(+), 9 deletions(-) create mode 100644 spring-core/src/main/java/com/baeldung/configuration/ConstructorConfig.java create mode 100644 spring-core/src/main/java/com/baeldung/configuration/SetterConfig.java create mode 100644 spring-core/src/test/java/com/baeldung/configuration/ConstructorConfigTest.java create mode 100644 spring-core/src/test/java/com/baeldung/configuration/SetterConfigTest.java diff --git a/spring-core/src/main/java/com/baeldung/ConstructorApp.java b/spring-core/src/main/java/com/baeldung/ConstructorApp.java index 89aa55d3b1..3c66f74a36 100644 --- a/spring-core/src/main/java/com/baeldung/ConstructorApp.java +++ b/spring-core/src/main/java/com/baeldung/ConstructorApp.java @@ -1,15 +1,16 @@ package com.baeldung; import org.springframework.context.ApplicationContext; +import org.springframework.context.annotation.AnnotationConfigApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; +import com.baeldung.configuration.ConstructorConfig; import com.baeldung.model.Student; public class ConstructorApp { public static void main(String[] args) { - ApplicationContext context = new ClassPathXmlApplicationContext("constructor-context.xml"); - - Student student = (Student) context.getBean("student"); + AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(ConstructorConfig.class); + Student student = context.getBean(Student.class); student.introduceMyself(); } } diff --git a/spring-core/src/main/java/com/baeldung/SetterApp.java b/spring-core/src/main/java/com/baeldung/SetterApp.java index 17de7db6dd..202f557f44 100644 --- a/spring-core/src/main/java/com/baeldung/SetterApp.java +++ b/spring-core/src/main/java/com/baeldung/SetterApp.java @@ -1,15 +1,13 @@ package com.baeldung; -import org.springframework.context.ApplicationContext; -import org.springframework.context.support.ClassPathXmlApplicationContext; - +import org.springframework.context.annotation.AnnotationConfigApplicationContext; +import com.baeldung.configuration.SetterConfig; import com.baeldung.model.Student; public class SetterApp { public static void main(String[] args) { - ApplicationContext context = new ClassPathXmlApplicationContext("setter-context.xml"); - - Student student = (Student) context.getBean("student"); + AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(SetterConfig.class); + Student student = context.getBean(Student.class); student.introduceMyself(); } } diff --git a/spring-core/src/main/java/com/baeldung/configuration/ConstructorConfig.java b/spring-core/src/main/java/com/baeldung/configuration/ConstructorConfig.java new file mode 100644 index 0000000000..e1ebdcedca --- /dev/null +++ b/spring-core/src/main/java/com/baeldung/configuration/ConstructorConfig.java @@ -0,0 +1,21 @@ +package com.baeldung.configuration; + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +import com.baeldung.model.College; +import com.baeldung.model.Student; + +@Configuration +public class ConstructorConfig { + + @Bean + public Student student() { + return new Student(1, "John", college()); + } + + @Bean + public College college() { + return new College(1, "New York"); + } +} diff --git a/spring-core/src/main/java/com/baeldung/configuration/SetterConfig.java b/spring-core/src/main/java/com/baeldung/configuration/SetterConfig.java new file mode 100644 index 0000000000..caaa70ee46 --- /dev/null +++ b/spring-core/src/main/java/com/baeldung/configuration/SetterConfig.java @@ -0,0 +1,28 @@ +package com.baeldung.configuration; + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +import com.baeldung.model.College; +import com.baeldung.model.Student; + +@Configuration +public class SetterConfig { + + @Bean + public Student student() { + Student student = new Student(); + student.setId(2); + student.setName("Tom"); + student.setCollege(college()); + return student; + } + + @Bean + public College college() { + College college = new College(); + college.setId(2); + college.setName("Pittsburgh"); + return college; + } +} diff --git a/spring-core/src/test/java/com/baeldung/configuration/ConstructorConfigTest.java b/spring-core/src/test/java/com/baeldung/configuration/ConstructorConfigTest.java new file mode 100644 index 0000000000..a9f5165704 --- /dev/null +++ b/spring-core/src/test/java/com/baeldung/configuration/ConstructorConfigTest.java @@ -0,0 +1,22 @@ +package com.baeldung.configuration; + +import static org.junit.Assert.assertEquals; + +import org.junit.Test; +import org.springframework.context.ApplicationContext; +import org.springframework.context.annotation.AnnotationConfigApplicationContext; + +import com.baeldung.model.Student; + +public class ConstructorConfigTest { + + @Test + public void testConstructorDependencyInjection() { + ApplicationContext context = new AnnotationConfigApplicationContext(ConstructorConfig.class); + Student student = context.getBean(Student.class); + assertEquals(1, student.getId()); + assertEquals("John", student.getName()); + assertEquals(1, student.getCollege().getId()); + assertEquals("New York", student.getCollege().getName()); + } +} diff --git a/spring-core/src/test/java/com/baeldung/configuration/SetterConfigTest.java b/spring-core/src/test/java/com/baeldung/configuration/SetterConfigTest.java new file mode 100644 index 0000000000..5d687d0272 --- /dev/null +++ b/spring-core/src/test/java/com/baeldung/configuration/SetterConfigTest.java @@ -0,0 +1,22 @@ +package com.baeldung.configuration; + +import static org.junit.Assert.assertEquals; + +import org.junit.Test; +import org.springframework.context.ApplicationContext; +import org.springframework.context.annotation.AnnotationConfigApplicationContext; + +import com.baeldung.model.Student; + +public class SetterConfigTest { + + @Test + public void testConstructorDependencyInjection() { + ApplicationContext context = new AnnotationConfigApplicationContext(SetterConfig.class); + Student student = context.getBean(Student.class); + assertEquals(2, student.getId()); + assertEquals("Tom", student.getName()); + assertEquals(2, student.getCollege().getId()); + assertEquals("Pittsburgh", student.getCollege().getName()); + } +} From 5a8ec66b5dbf34d7c8ec5ec638d809a1bb759c09 Mon Sep 17 00:00:00 2001 From: Ahmed Tawila Date: Fri, 16 Jun 2017 14:16:41 +0200 Subject: [PATCH 003/236] removed xml config files --- .../main/resources/constructor-context.xml | 17 ----------------- .../src/main/resources/setter-context.xml | 19 ------------------- 2 files changed, 36 deletions(-) delete mode 100644 spring-core/src/main/resources/constructor-context.xml delete mode 100644 spring-core/src/main/resources/setter-context.xml diff --git a/spring-core/src/main/resources/constructor-context.xml b/spring-core/src/main/resources/constructor-context.xml deleted file mode 100644 index 67d492a0d6..0000000000 --- a/spring-core/src/main/resources/constructor-context.xml +++ /dev/null @@ -1,17 +0,0 @@ - - - - - - - - - - - - - - diff --git a/spring-core/src/main/resources/setter-context.xml b/spring-core/src/main/resources/setter-context.xml deleted file mode 100644 index e97bfb4b11..0000000000 --- a/spring-core/src/main/resources/setter-context.xml +++ /dev/null @@ -1,19 +0,0 @@ - - - - - - - - - - - - - - - - \ No newline at end of file From ee8bf9f7112e66f0cdc59a3b75942c982956df1c Mon Sep 17 00:00:00 2001 From: Ahmed Tawila Date: Fri, 16 Jun 2017 14:38:54 +0200 Subject: [PATCH 004/236] rename unit tests --- .../java/com/baeldung/configuration/ConstructorConfigTest.java | 2 +- .../test/java/com/baeldung/configuration/SetterConfigTest.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/spring-core/src/test/java/com/baeldung/configuration/ConstructorConfigTest.java b/spring-core/src/test/java/com/baeldung/configuration/ConstructorConfigTest.java index a9f5165704..5a80b8266b 100644 --- a/spring-core/src/test/java/com/baeldung/configuration/ConstructorConfigTest.java +++ b/spring-core/src/test/java/com/baeldung/configuration/ConstructorConfigTest.java @@ -11,7 +11,7 @@ import com.baeldung.model.Student; public class ConstructorConfigTest { @Test - public void testConstructorDependencyInjection() { + public void whenContextLoaded_thenDependencyInjected() { ApplicationContext context = new AnnotationConfigApplicationContext(ConstructorConfig.class); Student student = context.getBean(Student.class); assertEquals(1, student.getId()); diff --git a/spring-core/src/test/java/com/baeldung/configuration/SetterConfigTest.java b/spring-core/src/test/java/com/baeldung/configuration/SetterConfigTest.java index 5d687d0272..3d11c42e50 100644 --- a/spring-core/src/test/java/com/baeldung/configuration/SetterConfigTest.java +++ b/spring-core/src/test/java/com/baeldung/configuration/SetterConfigTest.java @@ -11,7 +11,7 @@ import com.baeldung.model.Student; public class SetterConfigTest { @Test - public void testConstructorDependencyInjection() { + public void whenContextLoaded_thenDependencyInjected() { ApplicationContext context = new AnnotationConfigApplicationContext(SetterConfig.class); Student student = context.getBean(Student.class); assertEquals(2, student.getId()); From 94fc522f7fd896ce44b84e28d08c13e20646c381 Mon Sep 17 00:00:00 2001 From: Ahmed Tawila Date: Fri, 30 Jun 2017 03:34:57 +0200 Subject: [PATCH 005/236] BAEL-972 - Apache Commons Text --- libraries/pom.xml | 6 +++++ .../test/java/com/baeldung/text/DiffTest.java | 18 +++++++++++++ .../text/LongestCommonSubsequenceTest.java | 25 +++++++++++++++++++ .../com/baeldung/text/StrBuilderTest.java | 24 ++++++++++++++++++ .../com/baeldung/text/StrSubstitutorTest.java | 23 +++++++++++++++++ .../java/com/baeldung/text/WordUtilsTest.java | 23 +++++++++++++++++ 6 files changed, 119 insertions(+) create mode 100644 libraries/src/test/java/com/baeldung/text/DiffTest.java create mode 100644 libraries/src/test/java/com/baeldung/text/LongestCommonSubsequenceTest.java create mode 100644 libraries/src/test/java/com/baeldung/text/StrBuilderTest.java create mode 100644 libraries/src/test/java/com/baeldung/text/StrSubstitutorTest.java create mode 100644 libraries/src/test/java/com/baeldung/text/WordUtilsTest.java diff --git a/libraries/pom.xml b/libraries/pom.xml index 56c94e013e..2aec319cbf 100644 --- a/libraries/pom.xml +++ b/libraries/pom.xml @@ -76,6 +76,11 @@ commons-lang3 ${commons-lang.version} + + org.apache.commons + commons-text + ${commons-text.version} + org.jasypt jasypt @@ -292,6 +297,7 @@ 0.7.0 3.2.4 3.5 + 1.1 1.9.2 1.2 3.21.0-GA diff --git a/libraries/src/test/java/com/baeldung/text/DiffTest.java b/libraries/src/test/java/com/baeldung/text/DiffTest.java new file mode 100644 index 0000000000..95370013b6 --- /dev/null +++ b/libraries/src/test/java/com/baeldung/text/DiffTest.java @@ -0,0 +1,18 @@ +package com.baeldung.text; + +import org.apache.commons.text.diff.EditScript; +import org.apache.commons.text.diff.StringsComparator; +import org.junit.Assert; +import org.junit.Test; + +public class DiffTest { + + @Test + public void whenEditScript_thenCorrect() { + StringsComparator cmp = new StringsComparator("ABCFGH", "BCDEFG"); + EditScript script = cmp.getScript(); + int mod = script.getModifications(); + + Assert.assertEquals(4, mod); + } +} diff --git a/libraries/src/test/java/com/baeldung/text/LongestCommonSubsequenceTest.java b/libraries/src/test/java/com/baeldung/text/LongestCommonSubsequenceTest.java new file mode 100644 index 0000000000..80ca0cfbba --- /dev/null +++ b/libraries/src/test/java/com/baeldung/text/LongestCommonSubsequenceTest.java @@ -0,0 +1,25 @@ +package com.baeldung.text; + +import org.apache.commons.text.similarity.LongestCommonSubsequence; +import org.apache.commons.text.similarity.LongestCommonSubsequenceDistance; +import org.junit.Assert; +import org.junit.Test; + +public class LongestCommonSubsequenceTest { + + @Test + public void whenCompare_thenCorrect() { + LongestCommonSubsequence lcs = new LongestCommonSubsequence(); + int countLcs = lcs.apply("New York", "New Hampshire"); + + Assert.assertEquals(5, countLcs); + } + + @Test + public void whenCalculateDistance_thenCorrect() { + LongestCommonSubsequenceDistance lcsd = new LongestCommonSubsequenceDistance(); + int countLcsd = lcsd.apply("New York", "New Hampshire"); + + Assert.assertEquals(11, countLcsd); + } +} diff --git a/libraries/src/test/java/com/baeldung/text/StrBuilderTest.java b/libraries/src/test/java/com/baeldung/text/StrBuilderTest.java new file mode 100644 index 0000000000..a8dbaadc5a --- /dev/null +++ b/libraries/src/test/java/com/baeldung/text/StrBuilderTest.java @@ -0,0 +1,24 @@ +package com.baeldung.text; + +import org.apache.commons.text.StrBuilder; +import org.junit.Assert; +import org.junit.Test; + +public class StrBuilderTest { + + @Test + public void whenReplaced_thenCorrect() { + StrBuilder strBuilder = new StrBuilder("example StrBuilder!"); + strBuilder.replaceAll("example", "new"); + + Assert.assertEquals(new StrBuilder("new StrBuilder!"), strBuilder); + } + + @Test + public void whenCleared_thenEmpty() { + StrBuilder strBuilder = new StrBuilder("example StrBuilder!"); + strBuilder.clear(); + + Assert.assertEquals(new StrBuilder(""), strBuilder); + } +} diff --git a/libraries/src/test/java/com/baeldung/text/StrSubstitutorTest.java b/libraries/src/test/java/com/baeldung/text/StrSubstitutorTest.java new file mode 100644 index 0000000000..24e6ff59c8 --- /dev/null +++ b/libraries/src/test/java/com/baeldung/text/StrSubstitutorTest.java @@ -0,0 +1,23 @@ +package com.baeldung.text; + +import java.util.HashMap; +import java.util.Map; + +import org.apache.commons.text.StrSubstitutor; +import org.junit.Assert; +import org.junit.Test; + +public class StrSubstitutorTest { + + @Test + public void whenSubstituted_thenCorrect() { + Map substitutes = new HashMap<>(); + substitutes.put("name", "John"); + substitutes.put("college", "University of Stanford"); + String templateString = "My name is ${name} and I am a student at the ${college}."; + StrSubstitutor sub = new StrSubstitutor(substitutes); + String result = sub.replace(templateString); + + Assert.assertEquals("My name is John and I am a student at the University of Stanford.", result); + } +} diff --git a/libraries/src/test/java/com/baeldung/text/WordUtilsTest.java b/libraries/src/test/java/com/baeldung/text/WordUtilsTest.java new file mode 100644 index 0000000000..b9268d67b3 --- /dev/null +++ b/libraries/src/test/java/com/baeldung/text/WordUtilsTest.java @@ -0,0 +1,23 @@ +package com.baeldung.text; + +import org.apache.commons.text.WordUtils; +import org.junit.Assert; +import org.junit.Test; + +public class WordUtilsTest { + + @Test + public void whenCapitalized_thenCorrect() { + String toBeCapitalized = "to be capitalized!"; + String result = WordUtils.capitalize(toBeCapitalized); + + Assert.assertEquals("To Be Capitalized!", result); + } + + @Test + public void whenContainsWords_thenCorrect() { + boolean containsWords = WordUtils.containsAllWords("String to search", "to", "search"); + + Assert.assertTrue(containsWords); + } +} From e76cf9ca2630b7443e7346dd60886bce6eb03b34 Mon Sep 17 00:00:00 2001 From: Ahmed Tawila Date: Fri, 30 Jun 2017 04:05:00 +0200 Subject: [PATCH 006/236] remove code from evaluation article --- .../configuration/ConstructorConfig.java | 21 --------- .../baeldung/configuration/SetterConfig.java | 28 ----------- .../main/java/com/baeldung/model/College.java | 32 ------------- .../main/java/com/baeldung/model/Student.java | 46 ------------------- .../configuration/ConstructorConfigTest.java | 22 --------- .../configuration/SetterConfigTest.java | 22 --------- 6 files changed, 171 deletions(-) delete mode 100644 spring-core/src/main/java/com/baeldung/configuration/ConstructorConfig.java delete mode 100644 spring-core/src/main/java/com/baeldung/configuration/SetterConfig.java delete mode 100644 spring-core/src/main/java/com/baeldung/model/College.java delete mode 100644 spring-core/src/main/java/com/baeldung/model/Student.java delete mode 100644 spring-core/src/test/java/com/baeldung/configuration/ConstructorConfigTest.java delete mode 100644 spring-core/src/test/java/com/baeldung/configuration/SetterConfigTest.java diff --git a/spring-core/src/main/java/com/baeldung/configuration/ConstructorConfig.java b/spring-core/src/main/java/com/baeldung/configuration/ConstructorConfig.java deleted file mode 100644 index e1ebdcedca..0000000000 --- a/spring-core/src/main/java/com/baeldung/configuration/ConstructorConfig.java +++ /dev/null @@ -1,21 +0,0 @@ -package com.baeldung.configuration; - -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; - -import com.baeldung.model.College; -import com.baeldung.model.Student; - -@Configuration -public class ConstructorConfig { - - @Bean - public Student student() { - return new Student(1, "John", college()); - } - - @Bean - public College college() { - return new College(1, "New York"); - } -} diff --git a/spring-core/src/main/java/com/baeldung/configuration/SetterConfig.java b/spring-core/src/main/java/com/baeldung/configuration/SetterConfig.java deleted file mode 100644 index caaa70ee46..0000000000 --- a/spring-core/src/main/java/com/baeldung/configuration/SetterConfig.java +++ /dev/null @@ -1,28 +0,0 @@ -package com.baeldung.configuration; - -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; - -import com.baeldung.model.College; -import com.baeldung.model.Student; - -@Configuration -public class SetterConfig { - - @Bean - public Student student() { - Student student = new Student(); - student.setId(2); - student.setName("Tom"); - student.setCollege(college()); - return student; - } - - @Bean - public College college() { - College college = new College(); - college.setId(2); - college.setName("Pittsburgh"); - return college; - } -} diff --git a/spring-core/src/main/java/com/baeldung/model/College.java b/spring-core/src/main/java/com/baeldung/model/College.java deleted file mode 100644 index 0e55561fe7..0000000000 --- a/spring-core/src/main/java/com/baeldung/model/College.java +++ /dev/null @@ -1,32 +0,0 @@ -package com.baeldung.model; - -public class College { - - private int id; - private String name; - - public College() { - } - - public College(int id, String name) { - this.id = id; - this.name = name; - } - - public int getId() { - return id; - } - - public void setId(int id) { - this.id = id; - } - - public String getName() { - return name; - } - - public void setName(String name) { - this.name = name; - } - -} diff --git a/spring-core/src/main/java/com/baeldung/model/Student.java b/spring-core/src/main/java/com/baeldung/model/Student.java deleted file mode 100644 index 46f01cd32d..0000000000 --- a/spring-core/src/main/java/com/baeldung/model/Student.java +++ /dev/null @@ -1,46 +0,0 @@ -package com.baeldung.model; - -public class Student { - - private int id; - private String name; - private College college; - - public Student() { - } - - public Student(int id, String name, College college) { - this.id = id; - this.name = name; - this.college = college; - } - - public int getId() { - return id; - } - - public void setId(int id) { - this.id = id; - } - - public String getName() { - return name; - } - - public void setName(String name) { - this.name = name; - } - - public College getCollege() { - return college; - } - - public void setCollege(College college) { - this.college = college; - } - - public void introduceMyself() { - System.out.println("My ID is " + id + " and my name is " + name + ". I am a student at " + college.getName() + " College."); - } - -} diff --git a/spring-core/src/test/java/com/baeldung/configuration/ConstructorConfigTest.java b/spring-core/src/test/java/com/baeldung/configuration/ConstructorConfigTest.java deleted file mode 100644 index 5a80b8266b..0000000000 --- a/spring-core/src/test/java/com/baeldung/configuration/ConstructorConfigTest.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.baeldung.configuration; - -import static org.junit.Assert.assertEquals; - -import org.junit.Test; -import org.springframework.context.ApplicationContext; -import org.springframework.context.annotation.AnnotationConfigApplicationContext; - -import com.baeldung.model.Student; - -public class ConstructorConfigTest { - - @Test - public void whenContextLoaded_thenDependencyInjected() { - ApplicationContext context = new AnnotationConfigApplicationContext(ConstructorConfig.class); - Student student = context.getBean(Student.class); - assertEquals(1, student.getId()); - assertEquals("John", student.getName()); - assertEquals(1, student.getCollege().getId()); - assertEquals("New York", student.getCollege().getName()); - } -} diff --git a/spring-core/src/test/java/com/baeldung/configuration/SetterConfigTest.java b/spring-core/src/test/java/com/baeldung/configuration/SetterConfigTest.java deleted file mode 100644 index 3d11c42e50..0000000000 --- a/spring-core/src/test/java/com/baeldung/configuration/SetterConfigTest.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.baeldung.configuration; - -import static org.junit.Assert.assertEquals; - -import org.junit.Test; -import org.springframework.context.ApplicationContext; -import org.springframework.context.annotation.AnnotationConfigApplicationContext; - -import com.baeldung.model.Student; - -public class SetterConfigTest { - - @Test - public void whenContextLoaded_thenDependencyInjected() { - ApplicationContext context = new AnnotationConfigApplicationContext(SetterConfig.class); - Student student = context.getBean(Student.class); - assertEquals(2, student.getId()); - assertEquals("Tom", student.getName()); - assertEquals(2, student.getCollege().getId()); - assertEquals("Pittsburgh", student.getCollege().getName()); - } -} From c26eaf869650ae634df2256cba6bd95789c5c026 Mon Sep 17 00:00:00 2001 From: Ahmed Tawila Date: Fri, 30 Jun 2017 04:06:35 +0200 Subject: [PATCH 007/236] remove code from evaluation article --- .../main/java/com/baeldung/ConstructorApp.java | 16 ---------------- .../src/main/java/com/baeldung/SetterApp.java | 13 ------------- 2 files changed, 29 deletions(-) delete mode 100644 spring-core/src/main/java/com/baeldung/ConstructorApp.java delete mode 100644 spring-core/src/main/java/com/baeldung/SetterApp.java diff --git a/spring-core/src/main/java/com/baeldung/ConstructorApp.java b/spring-core/src/main/java/com/baeldung/ConstructorApp.java deleted file mode 100644 index 3c66f74a36..0000000000 --- a/spring-core/src/main/java/com/baeldung/ConstructorApp.java +++ /dev/null @@ -1,16 +0,0 @@ -package com.baeldung; - -import org.springframework.context.ApplicationContext; -import org.springframework.context.annotation.AnnotationConfigApplicationContext; -import org.springframework.context.support.ClassPathXmlApplicationContext; - -import com.baeldung.configuration.ConstructorConfig; -import com.baeldung.model.Student; - -public class ConstructorApp { - public static void main(String[] args) { - AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(ConstructorConfig.class); - Student student = context.getBean(Student.class); - student.introduceMyself(); - } -} diff --git a/spring-core/src/main/java/com/baeldung/SetterApp.java b/spring-core/src/main/java/com/baeldung/SetterApp.java deleted file mode 100644 index 202f557f44..0000000000 --- a/spring-core/src/main/java/com/baeldung/SetterApp.java +++ /dev/null @@ -1,13 +0,0 @@ -package com.baeldung; - -import org.springframework.context.annotation.AnnotationConfigApplicationContext; -import com.baeldung.configuration.SetterConfig; -import com.baeldung.model.Student; - -public class SetterApp { - public static void main(String[] args) { - AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(SetterConfig.class); - Student student = context.getBean(Student.class); - student.introduceMyself(); - } -} From 760d4e1a913be06e80b5081faf384212e810d367 Mon Sep 17 00:00:00 2001 From: Ahmed Tawila Date: Sat, 1 Jul 2017 02:50:24 +0200 Subject: [PATCH 008/236] BAEL-972 - Apache Commons Text - added another example --- .../com/baeldung/text/UnicodeEscaperTest.java | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) create mode 100644 libraries/src/test/java/com/baeldung/text/UnicodeEscaperTest.java diff --git a/libraries/src/test/java/com/baeldung/text/UnicodeEscaperTest.java b/libraries/src/test/java/com/baeldung/text/UnicodeEscaperTest.java new file mode 100644 index 0000000000..5a52bfd0db --- /dev/null +++ b/libraries/src/test/java/com/baeldung/text/UnicodeEscaperTest.java @@ -0,0 +1,16 @@ +package com.baeldung.text; + +import org.apache.commons.text.translate.UnicodeEscaper; +import org.junit.Assert; +import org.junit.Test; + +public class UnicodeEscaperTest { + + @Test + public void whenTranslate_thenCorrect() { + UnicodeEscaper ue = UnicodeEscaper.above(0); + String result = ue.translate("ABCD"); + + Assert.assertEquals("\\u0041\\u0042\\u0043\\u0044", result); + } +} From 7d87b3aeb7ac35b2721f0e02b10a127b02d16e50 Mon Sep 17 00:00:00 2001 From: Ahmed Tawila Date: Sun, 2 Jul 2017 19:44:44 +0200 Subject: [PATCH 009/236] BAEL-972 - Apache Commons Text - just indentation --- .../src/test/java/com/baeldung/text/StrBuilderTest.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/libraries/src/test/java/com/baeldung/text/StrBuilderTest.java b/libraries/src/test/java/com/baeldung/text/StrBuilderTest.java index a8dbaadc5a..38cc6de052 100644 --- a/libraries/src/test/java/com/baeldung/text/StrBuilderTest.java +++ b/libraries/src/test/java/com/baeldung/text/StrBuilderTest.java @@ -5,20 +5,20 @@ import org.junit.Assert; import org.junit.Test; public class StrBuilderTest { - + @Test public void whenReplaced_thenCorrect() { StrBuilder strBuilder = new StrBuilder("example StrBuilder!"); strBuilder.replaceAll("example", "new"); - + Assert.assertEquals(new StrBuilder("new StrBuilder!"), strBuilder); } - + @Test public void whenCleared_thenEmpty() { StrBuilder strBuilder = new StrBuilder("example StrBuilder!"); strBuilder.clear(); - + Assert.assertEquals(new StrBuilder(""), strBuilder); } } From d184aa3920b541bd1b8b9f292226aa1bf3004055 Mon Sep 17 00:00:00 2001 From: Ahmed Tawila Date: Sat, 8 Jul 2017 04:45:52 +0200 Subject: [PATCH 010/236] BAEL-994 - TemporalAdjuster in Java --- .../CustomTemporalAdjuster.java | 23 +++++++ .../TemporalAdjusterUtil.java | 31 +++++++++ .../CustomTemporalAdjusterTest.java | 63 +++++++++++++++++++ .../TemporalAdjustersTest.java | 29 +++++++++ 4 files changed, 146 insertions(+) create mode 100644 core-java/src/main/java/com/baeldung/temporaladjuster/CustomTemporalAdjuster.java create mode 100644 core-java/src/main/java/com/baeldung/temporaladjuster/TemporalAdjusterUtil.java create mode 100644 core-java/src/test/java/com/baeldung/temporaladjusters/CustomTemporalAdjusterTest.java create mode 100644 core-java/src/test/java/com/baeldung/temporaladjusters/TemporalAdjustersTest.java diff --git a/core-java/src/main/java/com/baeldung/temporaladjuster/CustomTemporalAdjuster.java b/core-java/src/main/java/com/baeldung/temporaladjuster/CustomTemporalAdjuster.java new file mode 100644 index 0000000000..ab491bee66 --- /dev/null +++ b/core-java/src/main/java/com/baeldung/temporaladjuster/CustomTemporalAdjuster.java @@ -0,0 +1,23 @@ +package com.baeldung.temporaladjuster; + +import java.time.DayOfWeek; +import java.time.temporal.ChronoField; +import java.time.temporal.ChronoUnit; +import java.time.temporal.Temporal; +import java.time.temporal.TemporalAdjuster; + +public class CustomTemporalAdjuster implements TemporalAdjuster { + + @Override + public Temporal adjustInto(Temporal temporal) { + DayOfWeek dayOfWeek = DayOfWeek.of(temporal.get(ChronoField.DAY_OF_WEEK)); + int daysToAdd; + if (dayOfWeek == DayOfWeek.FRIDAY) + daysToAdd = 3; + else if (dayOfWeek == DayOfWeek.SATURDAY) + daysToAdd = 2; + else + daysToAdd = 1; + return temporal.plus(daysToAdd, ChronoUnit.DAYS); + } +} diff --git a/core-java/src/main/java/com/baeldung/temporaladjuster/TemporalAdjusterUtil.java b/core-java/src/main/java/com/baeldung/temporaladjuster/TemporalAdjusterUtil.java new file mode 100644 index 0000000000..1a1528456e --- /dev/null +++ b/core-java/src/main/java/com/baeldung/temporaladjuster/TemporalAdjusterUtil.java @@ -0,0 +1,31 @@ +package com.baeldung.temporaladjuster; + +import java.text.SimpleDateFormat; +import java.util.Calendar; + +public class TemporalAdjusterUtil { + + public static Calendar nextDayOfWeek(int dayOfWeek) { + Calendar date = Calendar.getInstance(); + int difference = dayOfWeek - date.get(Calendar.DAY_OF_WEEK); + if (!(difference > 0)) { + difference += 7; + } + date.add(Calendar.DAY_OF_MONTH, difference); + return date; + } + + @SuppressWarnings("static-access") + public static String getNextWorkingDay() { + Calendar calendar = Calendar.getInstance(); + SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd"); + format.setCalendar(calendar); + if (calendar.DAY_OF_WEEK == Calendar.FRIDAY) + calendar.add(Calendar.DATE, 3); + if (calendar.DAY_OF_WEEK == Calendar.SATURDAY) + calendar.add(Calendar.DATE, 2); + else + calendar.add(Calendar.DATE, 1); + return format.format(calendar.getTime()); + } +} diff --git a/core-java/src/test/java/com/baeldung/temporaladjusters/CustomTemporalAdjusterTest.java b/core-java/src/test/java/com/baeldung/temporaladjusters/CustomTemporalAdjusterTest.java new file mode 100644 index 0000000000..10dce5c498 --- /dev/null +++ b/core-java/src/test/java/com/baeldung/temporaladjusters/CustomTemporalAdjusterTest.java @@ -0,0 +1,63 @@ +package com.baeldung.temporaladjusters; + +import java.text.SimpleDateFormat; +import java.time.DayOfWeek; +import java.time.LocalDate; +import java.time.Period; +import java.time.temporal.TemporalAdjuster; +import java.time.temporal.TemporalAdjusters; +import java.util.Calendar; + +import org.junit.Assert; +import org.junit.Test; + +import com.baeldung.temporaladjuster.CustomTemporalAdjuster; +import com.baeldung.temporaladjuster.TemporalAdjusterUtil; + +public class CustomTemporalAdjusterTest { + + @Test + public void whenAdjustAndImplementInterface_thenNextWorkingDay() { + LocalDate localDate = LocalDate.now(); + CustomTemporalAdjuster temporalAdjuster = new CustomTemporalAdjuster(); + LocalDate nextWorkingDay = localDate.with(temporalAdjuster); + + Assert.assertEquals(TemporalAdjusterUtil.getNextWorkingDay(), nextWorkingDay.toString()); + } + + @Test + public void whenAdjust_thenNextWorkingDay() { + LocalDate localDate = LocalDate.now(); + TemporalAdjuster temporalAdjuster = NEXT_WORKING_DAY; + LocalDate date = localDate.with(temporalAdjuster); + + Assert.assertEquals(TemporalAdjusterUtil.getNextWorkingDay(), date.toString()); + } + + @Test + public void whenAdjust_thenFourteenDaysFromToday() { + LocalDate localDate = LocalDate.now(); + TemporalAdjuster temporalAdjuster = (t) -> t.plus(Period.ofDays(14)); + LocalDate result = localDate.with(temporalAdjuster); + + Calendar calendar = Calendar.getInstance(); + SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd"); + format.setCalendar(calendar); + calendar.add(Calendar.DATE, 14); + String fourteenDaysFromToday = format.format(calendar.getTime()); + + Assert.assertEquals(fourteenDaysFromToday, result.toString()); + } + + static TemporalAdjuster NEXT_WORKING_DAY = TemporalAdjusters.ofDateAdjuster(today -> { + DayOfWeek dayOfWeek = today.getDayOfWeek(); + int daysToAdd; + if (dayOfWeek == DayOfWeek.FRIDAY) + daysToAdd = 3; + else if (dayOfWeek == DayOfWeek.SATURDAY) + daysToAdd = 2; + else + daysToAdd = 1; + return today.plusDays(daysToAdd); + }); +} diff --git a/core-java/src/test/java/com/baeldung/temporaladjusters/TemporalAdjustersTest.java b/core-java/src/test/java/com/baeldung/temporaladjusters/TemporalAdjustersTest.java new file mode 100644 index 0000000000..f21da5cf75 --- /dev/null +++ b/core-java/src/test/java/com/baeldung/temporaladjusters/TemporalAdjustersTest.java @@ -0,0 +1,29 @@ +package com.baeldung.temporaladjusters; + +import java.text.SimpleDateFormat; +import java.time.DayOfWeek; +import java.time.LocalDate; +import java.time.temporal.TemporalAdjusters; +import java.util.Calendar; + +import org.junit.Assert; +import org.junit.Test; + +import com.baeldung.temporaladjuster.TemporalAdjusterUtil; + +public class TemporalAdjustersTest { + + @Test + public void whenAdjust_thenNextSunday() { + LocalDate localDate = LocalDate.now(); + LocalDate nextSunday = localDate.with(TemporalAdjusters.next(DayOfWeek.SUNDAY)); + + Calendar calendar = TemporalAdjusterUtil.nextDayOfWeek(Calendar.SUNDAY); + SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd"); + format.setCalendar(calendar); + String formattedDate = format.format(calendar.getTime()); + + Assert.assertEquals(formattedDate, nextSunday.toString()); + } + +} From 236ac77db11ef38a62f71cf4e8e19039254dc89a Mon Sep 17 00:00:00 2001 From: Ahmed Tawila Date: Sat, 8 Jul 2017 14:31:29 +0200 Subject: [PATCH 011/236] BAEL-994 - TemporalAdjuster in Java --- .../temporaladjusters/CustomTemporalAdjusterTest.java | 10 ++-------- .../temporaladjusters/TemporalAdjustersTest.java | 11 ++--------- 2 files changed, 4 insertions(+), 17 deletions(-) diff --git a/core-java/src/test/java/com/baeldung/temporaladjusters/CustomTemporalAdjusterTest.java b/core-java/src/test/java/com/baeldung/temporaladjusters/CustomTemporalAdjusterTest.java index 10dce5c498..9e5ba5b158 100644 --- a/core-java/src/test/java/com/baeldung/temporaladjusters/CustomTemporalAdjusterTest.java +++ b/core-java/src/test/java/com/baeldung/temporaladjusters/CustomTemporalAdjusterTest.java @@ -1,12 +1,10 @@ package com.baeldung.temporaladjusters; -import java.text.SimpleDateFormat; import java.time.DayOfWeek; import java.time.LocalDate; import java.time.Period; import java.time.temporal.TemporalAdjuster; import java.time.temporal.TemporalAdjusters; -import java.util.Calendar; import org.junit.Assert; import org.junit.Test; @@ -24,7 +22,7 @@ public class CustomTemporalAdjusterTest { Assert.assertEquals(TemporalAdjusterUtil.getNextWorkingDay(), nextWorkingDay.toString()); } - + @Test public void whenAdjust_thenNextWorkingDay() { LocalDate localDate = LocalDate.now(); @@ -40,11 +38,7 @@ public class CustomTemporalAdjusterTest { TemporalAdjuster temporalAdjuster = (t) -> t.plus(Period.ofDays(14)); LocalDate result = localDate.with(temporalAdjuster); - Calendar calendar = Calendar.getInstance(); - SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd"); - format.setCalendar(calendar); - calendar.add(Calendar.DATE, 14); - String fourteenDaysFromToday = format.format(calendar.getTime()); + String fourteenDaysFromToday = "2017-07-22"; Assert.assertEquals(fourteenDaysFromToday, result.toString()); } diff --git a/core-java/src/test/java/com/baeldung/temporaladjusters/TemporalAdjustersTest.java b/core-java/src/test/java/com/baeldung/temporaladjusters/TemporalAdjustersTest.java index f21da5cf75..b80668e09b 100644 --- a/core-java/src/test/java/com/baeldung/temporaladjusters/TemporalAdjustersTest.java +++ b/core-java/src/test/java/com/baeldung/temporaladjusters/TemporalAdjustersTest.java @@ -1,16 +1,12 @@ package com.baeldung.temporaladjusters; -import java.text.SimpleDateFormat; import java.time.DayOfWeek; import java.time.LocalDate; import java.time.temporal.TemporalAdjusters; -import java.util.Calendar; import org.junit.Assert; import org.junit.Test; -import com.baeldung.temporaladjuster.TemporalAdjusterUtil; - public class TemporalAdjustersTest { @Test @@ -18,12 +14,9 @@ public class TemporalAdjustersTest { LocalDate localDate = LocalDate.now(); LocalDate nextSunday = localDate.with(TemporalAdjusters.next(DayOfWeek.SUNDAY)); - Calendar calendar = TemporalAdjusterUtil.nextDayOfWeek(Calendar.SUNDAY); - SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd"); - format.setCalendar(calendar); - String formattedDate = format.format(calendar.getTime()); + String expected = "2017-07-09"; - Assert.assertEquals(formattedDate, nextSunday.toString()); + Assert.assertEquals(expected, nextSunday.toString()); } } From 62efeccfd090ec683f2b236d2bd115233f552f6b Mon Sep 17 00:00:00 2001 From: Ahmed Tawila Date: Sat, 8 Jul 2017 23:24:05 +0200 Subject: [PATCH 012/236] BAEL-994 - TemporalAdjuster in Java --- .../TemporalAdjusterUtil.java | 31 ------------------- 1 file changed, 31 deletions(-) delete mode 100644 core-java/src/main/java/com/baeldung/temporaladjuster/TemporalAdjusterUtil.java diff --git a/core-java/src/main/java/com/baeldung/temporaladjuster/TemporalAdjusterUtil.java b/core-java/src/main/java/com/baeldung/temporaladjuster/TemporalAdjusterUtil.java deleted file mode 100644 index 1a1528456e..0000000000 --- a/core-java/src/main/java/com/baeldung/temporaladjuster/TemporalAdjusterUtil.java +++ /dev/null @@ -1,31 +0,0 @@ -package com.baeldung.temporaladjuster; - -import java.text.SimpleDateFormat; -import java.util.Calendar; - -public class TemporalAdjusterUtil { - - public static Calendar nextDayOfWeek(int dayOfWeek) { - Calendar date = Calendar.getInstance(); - int difference = dayOfWeek - date.get(Calendar.DAY_OF_WEEK); - if (!(difference > 0)) { - difference += 7; - } - date.add(Calendar.DAY_OF_MONTH, difference); - return date; - } - - @SuppressWarnings("static-access") - public static String getNextWorkingDay() { - Calendar calendar = Calendar.getInstance(); - SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd"); - format.setCalendar(calendar); - if (calendar.DAY_OF_WEEK == Calendar.FRIDAY) - calendar.add(Calendar.DATE, 3); - if (calendar.DAY_OF_WEEK == Calendar.SATURDAY) - calendar.add(Calendar.DATE, 2); - else - calendar.add(Calendar.DATE, 1); - return format.format(calendar.getTime()); - } -} From dc9ee11a796e81cc21c6d7b11900925fdd300ea8 Mon Sep 17 00:00:00 2001 From: Ahmed Tawila Date: Sat, 8 Jul 2017 23:26:40 +0200 Subject: [PATCH 013/236] BAEL-994 - TemporalAdjuster in Java --- .../CustomTemporalAdjusterTest.java | 23 +++++++++---------- .../TemporalAdjustersTest.java | 2 +- 2 files changed, 12 insertions(+), 13 deletions(-) diff --git a/core-java/src/test/java/com/baeldung/temporaladjusters/CustomTemporalAdjusterTest.java b/core-java/src/test/java/com/baeldung/temporaladjusters/CustomTemporalAdjusterTest.java index 9e5ba5b158..a7acc9f743 100644 --- a/core-java/src/test/java/com/baeldung/temporaladjusters/CustomTemporalAdjusterTest.java +++ b/core-java/src/test/java/com/baeldung/temporaladjusters/CustomTemporalAdjusterTest.java @@ -10,41 +10,40 @@ import org.junit.Assert; import org.junit.Test; import com.baeldung.temporaladjuster.CustomTemporalAdjuster; -import com.baeldung.temporaladjuster.TemporalAdjusterUtil; public class CustomTemporalAdjusterTest { @Test public void whenAdjustAndImplementInterface_thenNextWorkingDay() { - LocalDate localDate = LocalDate.now(); + LocalDate localDate = LocalDate.of(2017, 07, 8); CustomTemporalAdjuster temporalAdjuster = new CustomTemporalAdjuster(); LocalDate nextWorkingDay = localDate.with(temporalAdjuster); - Assert.assertEquals(TemporalAdjusterUtil.getNextWorkingDay(), nextWorkingDay.toString()); + Assert.assertEquals("2017-07-10", nextWorkingDay.toString()); } @Test public void whenAdjust_thenNextWorkingDay() { - LocalDate localDate = LocalDate.now(); + LocalDate localDate = LocalDate.of(2017, 07, 8); TemporalAdjuster temporalAdjuster = NEXT_WORKING_DAY; LocalDate date = localDate.with(temporalAdjuster); - Assert.assertEquals(TemporalAdjusterUtil.getNextWorkingDay(), date.toString()); + Assert.assertEquals("2017-07-10", date.toString()); } @Test - public void whenAdjust_thenFourteenDaysFromToday() { - LocalDate localDate = LocalDate.now(); + public void whenAdjust_thenFourteenDaysAfterDate() { + LocalDate localDate = LocalDate.of(2017, 07, 8); TemporalAdjuster temporalAdjuster = (t) -> t.plus(Period.ofDays(14)); LocalDate result = localDate.with(temporalAdjuster); - String fourteenDaysFromToday = "2017-07-22"; + String fourteenDaysAfterDate = "2017-07-22"; - Assert.assertEquals(fourteenDaysFromToday, result.toString()); + Assert.assertEquals(fourteenDaysAfterDate, result.toString()); } - static TemporalAdjuster NEXT_WORKING_DAY = TemporalAdjusters.ofDateAdjuster(today -> { - DayOfWeek dayOfWeek = today.getDayOfWeek(); + static TemporalAdjuster NEXT_WORKING_DAY = TemporalAdjusters.ofDateAdjuster(date -> { + DayOfWeek dayOfWeek = date.getDayOfWeek(); int daysToAdd; if (dayOfWeek == DayOfWeek.FRIDAY) daysToAdd = 3; @@ -52,6 +51,6 @@ public class CustomTemporalAdjusterTest { daysToAdd = 2; else daysToAdd = 1; - return today.plusDays(daysToAdd); + return date.plusDays(daysToAdd); }); } diff --git a/core-java/src/test/java/com/baeldung/temporaladjusters/TemporalAdjustersTest.java b/core-java/src/test/java/com/baeldung/temporaladjusters/TemporalAdjustersTest.java index b80668e09b..d06da5a782 100644 --- a/core-java/src/test/java/com/baeldung/temporaladjusters/TemporalAdjustersTest.java +++ b/core-java/src/test/java/com/baeldung/temporaladjusters/TemporalAdjustersTest.java @@ -11,7 +11,7 @@ public class TemporalAdjustersTest { @Test public void whenAdjust_thenNextSunday() { - LocalDate localDate = LocalDate.now(); + LocalDate localDate = LocalDate.of(2017, 07, 8); LocalDate nextSunday = localDate.with(TemporalAdjusters.next(DayOfWeek.SUNDAY)); String expected = "2017-07-09"; From 0b60c211222eef04ddc78cf854c6c269395ff1f4 Mon Sep 17 00:00:00 2001 From: Ahmed Tawila Date: Sun, 9 Jul 2017 00:46:20 +0200 Subject: [PATCH 014/236] BAEL-994 - TemporalAdjuster in Java - fix problems --- .../temporaladjusters/CustomTemporalAdjusterTest.java | 4 ---- .../baeldung/temporaladjusters/TemporalAdjustersTest.java | 6 ------ 2 files changed, 10 deletions(-) diff --git a/core-java/src/test/java/com/baeldung/temporaladjusters/CustomTemporalAdjusterTest.java b/core-java/src/test/java/com/baeldung/temporaladjusters/CustomTemporalAdjusterTest.java index 8ac57a8816..a7acc9f743 100644 --- a/core-java/src/test/java/com/baeldung/temporaladjusters/CustomTemporalAdjusterTest.java +++ b/core-java/src/test/java/com/baeldung/temporaladjusters/CustomTemporalAdjusterTest.java @@ -1,15 +1,11 @@ package com.baeldung.temporaladjusters; -import java.text.SimpleDateFormat; - import java.time.DayOfWeek; import java.time.LocalDate; import java.time.Period; import java.time.temporal.TemporalAdjuster; import java.time.temporal.TemporalAdjusters; -import java.util.Calendar; - import org.junit.Assert; import org.junit.Test; diff --git a/core-java/src/test/java/com/baeldung/temporaladjusters/TemporalAdjustersTest.java b/core-java/src/test/java/com/baeldung/temporaladjusters/TemporalAdjustersTest.java index 707ba7a5c0..d06da5a782 100644 --- a/core-java/src/test/java/com/baeldung/temporaladjusters/TemporalAdjustersTest.java +++ b/core-java/src/test/java/com/baeldung/temporaladjusters/TemporalAdjustersTest.java @@ -4,15 +4,9 @@ import java.time.DayOfWeek; import java.time.LocalDate; import java.time.temporal.TemporalAdjusters; -import java.text.SimpleDateFormat; - -import java.util.Calendar; - import org.junit.Assert; import org.junit.Test; -import com.baeldung.temporaladjuster.TemporalAdjusterUtil; - public class TemporalAdjustersTest { @Test From 344fdce2a0bb632a20ac4ac4e850709508c9ea70 Mon Sep 17 00:00:00 2001 From: Ahmed Tawila Date: Sun, 30 Jul 2017 02:35:46 +0200 Subject: [PATCH 015/236] BAEL-1033 Introduction to StreamUtils --- .../com/baeldung/streamutils/DrainStream.java | 11 ++ .../baeldung/streamutils/CopyStreamTest.java | 110 ++++++++++++++++++ libraries/src/test/resources/input.txt | 1 + libraries/src/test/resources/output.txt | 1 + 4 files changed, 123 insertions(+) create mode 100644 libraries/src/main/java/com/baeldung/streamutils/DrainStream.java create mode 100644 libraries/src/test/java/com/baeldung/streamutils/CopyStreamTest.java create mode 100644 libraries/src/test/resources/input.txt create mode 100644 libraries/src/test/resources/output.txt diff --git a/libraries/src/main/java/com/baeldung/streamutils/DrainStream.java b/libraries/src/main/java/com/baeldung/streamutils/DrainStream.java new file mode 100644 index 0000000000..6ee4a1ef3a --- /dev/null +++ b/libraries/src/main/java/com/baeldung/streamutils/DrainStream.java @@ -0,0 +1,11 @@ +package com.baeldung.streamutils; + +import java.io.InputStream; + +import org.springframework.util.StreamUtils; + +public class DrainStream { + public InputStream getInputStream() { + return StreamUtils.emptyInput(); + } +} diff --git a/libraries/src/test/java/com/baeldung/streamutils/CopyStreamTest.java b/libraries/src/test/java/com/baeldung/streamutils/CopyStreamTest.java new file mode 100644 index 0000000000..fd57b602d6 --- /dev/null +++ b/libraries/src/test/java/com/baeldung/streamutils/CopyStreamTest.java @@ -0,0 +1,110 @@ +package com.baeldung.streamutils; + +import static org.junit.Assert.assertTrue; + +import java.io.File; +import java.io.FileInputStream; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.io.StringWriter; +import java.nio.charset.StandardCharsets; + +import org.apache.commons.io.IOUtils; +import org.junit.Assert; +import org.junit.Test; +import org.springframework.util.StreamUtils; + +public class CopyStreamTest { + + @Test + public void whenCopyInputStreamToOutputStream_thenCorrect() throws IOException { + String inputFileName = "src/test/resources/input.txt"; + String outputFileName = "src/test/resources/output.txt"; + File outputFile = new File(outputFileName); + InputStream in = new FileInputStream(inputFileName); + OutputStream out = new FileOutputStream(outputFileName); + + StreamUtils.copy(in, out); + + assertTrue(outputFile.exists()); + String inputFileContent = getStringFromInputStream(new FileInputStream(inputFileName)); + String outputFileContent = getStringFromInputStream(new FileInputStream(outputFileName)); + Assert.assertEquals(inputFileContent, outputFileContent); + } + + @Test + public void whenCopyRangeOfInputStreamToOutputStream_thenCorrect() throws IOException { + String inputFileName = "src/test/resources/input.txt"; + String outputFileName = "src/test/resources/output.txt"; + File outputFile = new File(outputFileName); + InputStream in = new FileInputStream(inputFileName); + OutputStream out = new FileOutputStream(outputFileName); + + StreamUtils.copyRange(in, out, 1, 10); + + assertTrue(outputFile.exists()); + String inputFileContent = getStringFromInputStream(new FileInputStream(inputFileName)); + String outputFileContent = getStringFromInputStream(new FileInputStream(outputFileName)); + Assert.assertEquals(inputFileContent.substring(1, 11), outputFileContent); + } + + @Test + public void whenCopyStringToOutputStream_thenCorrect() throws IOException { + String string = "Should be copied to OutputStream."; + String outputFileName = "src/test/resources/output.txt"; + File outputFile = new File(outputFileName); + OutputStream out = new FileOutputStream("src/test/resources/output.txt"); + + StreamUtils.copy(string, StandardCharsets.UTF_8, out); + + assertTrue(outputFile.exists()); + String outputFileContent = getStringFromInputStream(new FileInputStream(outputFileName)); + Assert.assertEquals(outputFileContent, string); + } + + @Test + public void whenCopyInputStreamToString_thenCorrect() throws IOException { + String inputFileName = "src/test/resources/input.txt"; + InputStream is = new FileInputStream(inputFileName); + String content = StreamUtils.copyToString(is, StandardCharsets.UTF_8); + + String inputFileContent = getStringFromInputStream(new FileInputStream(inputFileName)); + Assert.assertEquals(inputFileContent, content); + } + + @Test + public void whenCopyByteArrayToOutputStream_thenCorrect() throws IOException { + String outputFileName = "src/test/resources/output.txt"; + String string = "Should be copied to OutputStream."; + byte[] byteArray = string.getBytes(); + OutputStream out = new FileOutputStream("src/test/resources/output.txt"); + + StreamUtils.copy(byteArray, out); + String outputFileContent = getStringFromInputStream(new FileInputStream(outputFileName)); + Assert.assertEquals(outputFileContent, string); + } + + @Test + public void whenCopyInputStreamToByteArray_thenCorrect() throws IOException { + String inputFileName = "src/test/resources/input.txt"; + InputStream in = new FileInputStream(inputFileName); + byte[] out = StreamUtils.copyToByteArray(in); + + String content = new String(out); + String inputFileContent = getStringFromInputStream(new FileInputStream(inputFileName)); + Assert.assertEquals(inputFileContent, content); + } + + public static String getStringFromInputStream(InputStream input) throws IOException { + StringWriter writer = new StringWriter(); + IOUtils.copy(input, writer, "UTF-8"); + return writer.toString(); + } + + public InputStream getNonClosingInputStream() throws IOException { + InputStream in = new FileInputStream("src/test/resources/input.txt"); + return StreamUtils.nonClosing(in); + } +} diff --git a/libraries/src/test/resources/input.txt b/libraries/src/test/resources/input.txt new file mode 100644 index 0000000000..811232fa1f --- /dev/null +++ b/libraries/src/test/resources/input.txt @@ -0,0 +1 @@ +This file is merely for testing. \ No newline at end of file diff --git a/libraries/src/test/resources/output.txt b/libraries/src/test/resources/output.txt new file mode 100644 index 0000000000..34e1e27d5a --- /dev/null +++ b/libraries/src/test/resources/output.txt @@ -0,0 +1 @@ +Should be copied to OutputStream. \ No newline at end of file From ece39cb6891185a3c30d3a8a6c7fda00b35b56fd Mon Sep 17 00:00:00 2001 From: Ahmed Tawila Date: Sun, 30 Jul 2017 03:13:37 +0200 Subject: [PATCH 016/236] BAEL-1033 Introduction to StreamUtils --- .../com/baeldung/streamutils/CopyStream.java | 22 +++++++++++++++++++ .../baeldung/streamutils/CopyStreamTest.java | 14 ++---------- 2 files changed, 24 insertions(+), 12 deletions(-) create mode 100644 libraries/src/main/java/com/baeldung/streamutils/CopyStream.java diff --git a/libraries/src/main/java/com/baeldung/streamutils/CopyStream.java b/libraries/src/main/java/com/baeldung/streamutils/CopyStream.java new file mode 100644 index 0000000000..430759f3a0 --- /dev/null +++ b/libraries/src/main/java/com/baeldung/streamutils/CopyStream.java @@ -0,0 +1,22 @@ +package com.baeldung.streamutils; + +import java.io.FileInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.StringWriter; + +import org.apache.commons.io.IOUtils; +import org.springframework.util.StreamUtils; + +public class CopyStream { + public static String getStringFromInputStream(InputStream input) throws IOException { + StringWriter writer = new StringWriter(); + IOUtils.copy(input, writer, "UTF-8"); + return writer.toString(); + } + + public InputStream getNonClosingInputStream() throws IOException { + InputStream in = new FileInputStream("src/test/resources/input.txt"); + return StreamUtils.nonClosing(in); + } +} diff --git a/libraries/src/test/java/com/baeldung/streamutils/CopyStreamTest.java b/libraries/src/test/java/com/baeldung/streamutils/CopyStreamTest.java index fd57b602d6..9a65075e5b 100644 --- a/libraries/src/test/java/com/baeldung/streamutils/CopyStreamTest.java +++ b/libraries/src/test/java/com/baeldung/streamutils/CopyStreamTest.java @@ -8,14 +8,14 @@ import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; -import java.io.StringWriter; import java.nio.charset.StandardCharsets; -import org.apache.commons.io.IOUtils; import org.junit.Assert; import org.junit.Test; import org.springframework.util.StreamUtils; +import static com.baeldung.streamutils.CopyStream.getStringFromInputStream; + public class CopyStreamTest { @Test @@ -97,14 +97,4 @@ public class CopyStreamTest { Assert.assertEquals(inputFileContent, content); } - public static String getStringFromInputStream(InputStream input) throws IOException { - StringWriter writer = new StringWriter(); - IOUtils.copy(input, writer, "UTF-8"); - return writer.toString(); - } - - public InputStream getNonClosingInputStream() throws IOException { - InputStream in = new FileInputStream("src/test/resources/input.txt"); - return StreamUtils.nonClosing(in); - } } From 52745f2a1c24608cba3549c95ba0a72b27ac4f16 Mon Sep 17 00:00:00 2001 From: Ahmed Tawila Date: Sun, 30 Jul 2017 19:26:24 +0200 Subject: [PATCH 017/236] BAEL-1033 Introduction to StreamUtils --- spring-core/pom.xml | 260 +++++++++--------- .../com/baeldung/streamutils/CopyStream.java | 0 .../com/baeldung/streamutils/DrainStream.java | 0 .../baeldung/streamutils/CopyStreamTest.java | 0 .../src/test/resources/input.txt | 0 .../src/test/resources/output.txt | 0 6 files changed, 133 insertions(+), 127 deletions(-) rename {libraries => spring-core}/src/main/java/com/baeldung/streamutils/CopyStream.java (100%) rename {libraries => spring-core}/src/main/java/com/baeldung/streamutils/DrainStream.java (100%) rename {libraries => spring-core}/src/test/java/com/baeldung/streamutils/CopyStreamTest.java (100%) rename {libraries => spring-core}/src/test/resources/input.txt (100%) rename {libraries => spring-core}/src/test/resources/output.txt (100%) diff --git a/spring-core/pom.xml b/spring-core/pom.xml index 85cf4573aa..9d9e9838d3 100644 --- a/spring-core/pom.xml +++ b/spring-core/pom.xml @@ -1,141 +1,147 @@ + xmlns="http://maven.apache.org/POM/4.0.0" + xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> - 4.0.0 + 4.0.0 - com.baeldung - spring-core - 0.0.1-SNAPSHOT - war + com.baeldung + spring-core + 0.0.1-SNAPSHOT + war - spring-core + spring-core - - com.baeldung - parent-modules - 1.0.0-SNAPSHOT - + + com.baeldung + parent-modules + 1.0.0-SNAPSHOT + - - - org.mockito - mockito-all - ${mockito.version} - - - org.springframework - spring-test - ${spring.version} - - - org.springframework - spring-core - ${spring.version} - - - org.springframework - spring-beans - ${spring.version} - - - org.springframework - spring-context - ${spring.version} - - - javax.inject - javax.inject - ${javax.inject.version} - - - com.google.guava - guava - ${guava.version} - - - org.projectlombok - lombok - ${lombok.version} - - - org.springframework.boot - spring-boot-starter - 1.5.2.RELEASE - - - org.springframework.boot - spring-boot-test - ${mockito.spring.boot.version} - test - - + + + org.mockito + mockito-all + ${mockito.version} + + + org.springframework + spring-test + ${spring.version} + + + org.springframework + spring-core + ${spring.version} + + + org.springframework + spring-beans + ${spring.version} + + + org.springframework + spring-context + ${spring.version} + + + javax.inject + javax.inject + ${javax.inject.version} + + + com.google.guava + guava + ${guava.version} + + + org.projectlombok + lombok + ${lombok.version} + + + org.springframework.boot + spring-boot-starter + 1.5.2.RELEASE + + + org.springframework.boot + spring-boot-test + ${mockito.spring.boot.version} + test + + + commons-io + commons-io + ${commons.io.version} + + - - - - org.apache.maven.plugins - maven-war-plugin - ${maven-war-plugin.version} - - false - - + + + + org.apache.maven.plugins + maven-war-plugin + ${maven-war-plugin.version} + + false + + - + - + - - - integration - - - - org.apache.maven.plugins - maven-surefire-plugin - - - integration-test - - test - - - - **/*LiveTest.java - - - **/*IntegrationTest.java - - - - - - - json - - - - - - - + + + integration + + + + org.apache.maven.plugins + maven-surefire-plugin + + + integration-test + + test + + + + **/*LiveTest.java + + + **/*IntegrationTest.java + + + + + + + json + + + + + + + - - 1.10.19 - 1.4.4.RELEASE - 4.3.4.RELEASE - 1 - 20.0 - 2.6 - 1.16.12 - + + 1.10.19 + 1.4.4.RELEASE + 4.3.4.RELEASE + 1 + 20.0 + 2.6 + 1.16.12 + 2.5 + - - - java.net - https://maven.java.net/content/repositories/releases/ - - + + + java.net + https://maven.java.net/content/repositories/releases/ + + diff --git a/libraries/src/main/java/com/baeldung/streamutils/CopyStream.java b/spring-core/src/main/java/com/baeldung/streamutils/CopyStream.java similarity index 100% rename from libraries/src/main/java/com/baeldung/streamutils/CopyStream.java rename to spring-core/src/main/java/com/baeldung/streamutils/CopyStream.java diff --git a/libraries/src/main/java/com/baeldung/streamutils/DrainStream.java b/spring-core/src/main/java/com/baeldung/streamutils/DrainStream.java similarity index 100% rename from libraries/src/main/java/com/baeldung/streamutils/DrainStream.java rename to spring-core/src/main/java/com/baeldung/streamutils/DrainStream.java diff --git a/libraries/src/test/java/com/baeldung/streamutils/CopyStreamTest.java b/spring-core/src/test/java/com/baeldung/streamutils/CopyStreamTest.java similarity index 100% rename from libraries/src/test/java/com/baeldung/streamutils/CopyStreamTest.java rename to spring-core/src/test/java/com/baeldung/streamutils/CopyStreamTest.java diff --git a/libraries/src/test/resources/input.txt b/spring-core/src/test/resources/input.txt similarity index 100% rename from libraries/src/test/resources/input.txt rename to spring-core/src/test/resources/input.txt diff --git a/libraries/src/test/resources/output.txt b/spring-core/src/test/resources/output.txt similarity index 100% rename from libraries/src/test/resources/output.txt rename to spring-core/src/test/resources/output.txt From 65e2f5968158dc579030e3f9476c8dccdd58963d Mon Sep 17 00:00:00 2001 From: Jose Carvajal Date: Sun, 30 Jul 2017 22:27:38 +0200 Subject: [PATCH 018/236] Matchers is now deprecated in Mockito 2, it's now replaced by ArgumentMatchers --- .../baeldung/mocks/mockito/LoginControllerIntegrationTest.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/mocks/mock-comparisons/src/test/java/org/baeldung/mocks/mockito/LoginControllerIntegrationTest.java b/mocks/mock-comparisons/src/test/java/org/baeldung/mocks/mockito/LoginControllerIntegrationTest.java index 8f8918ab22..9d47b2f5d4 100644 --- a/mocks/mock-comparisons/src/test/java/org/baeldung/mocks/mockito/LoginControllerIntegrationTest.java +++ b/mocks/mock-comparisons/src/test/java/org/baeldung/mocks/mockito/LoginControllerIntegrationTest.java @@ -8,6 +8,7 @@ import org.junit.Assert; import org.junit.Before; import org.junit.Test; import org.mockito.ArgumentMatcher; +import org.mockito.ArgumentMatchers; import org.mockito.InjectMocks; import org.mockito.Mock; import org.mockito.Mockito; @@ -120,7 +121,7 @@ public class LoginControllerIntegrationTest { .login(userForm); // complex matcher Mockito.verify(loginService) - .setCurrentUser(Mockito.argThat(new ArgumentMatcher() { + .setCurrentUser(ArgumentMatchers.argThat(new ArgumentMatcher() { @Override public boolean matches(String argument) { return argument.startsWith("foo"); From 4f2857deb5d31e577fe88c695bf742fbff7eff1e Mon Sep 17 00:00:00 2001 From: Ahmed Tawila Date: Sun, 30 Jul 2017 23:04:14 +0200 Subject: [PATCH 019/236] fix formatting --- libraries/pom.xml | 986 +++++++++--------- spring-core/pom.xml | 2 +- .../com/baeldung/streamutils/CopyStream.java | 18 +- .../com/baeldung/streamutils/DrainStream.java | 6 +- .../baeldung/streamutils/CopyStreamTest.java | 128 +-- 5 files changed, 570 insertions(+), 570 deletions(-) diff --git a/libraries/pom.xml b/libraries/pom.xml index a655f5267a..795f255f36 100644 --- a/libraries/pom.xml +++ b/libraries/pom.xml @@ -1,497 +1,497 @@ - - parent-modules - com.baeldung - 1.0.0-SNAPSHOT - - 4.0.0 - libraries - libraries - - - - org.apache.maven.plugins - maven-dependency-plugin - - - org.apache.felix - maven-bundle-plugin - 3.3.0 - maven-plugin + xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> + + parent-modules + com.baeldung + 1.0.0-SNAPSHOT + + 4.0.0 + libraries + libraries + + + + org.apache.maven.plugins + maven-dependency-plugin + + + org.apache.felix + maven-bundle-plugin + 3.3.0 + maven-plugin - - - true - - - maven-failsafe-plugin - 2.20 - - - chromedriver - - - - - net.serenity-bdd.maven.plugins - serenity-maven-plugin - ${serenity.plugin.version} - - - serenity-reports - post-integration-test - - aggregate - - - - - - - org.datanucleus - datanucleus-maven-plugin - 5.0.2 - - JDO - ${basedir}/datanucleus.properties - ${basedir}/log4j.properties - true - false - - - - - process-classes - - enhance - - - - - - - org.apache.maven.plugins - maven-jar-plugin - 3.0.2 - - - **/log4j.properties - - - - com.baeldung.neuroph.NeurophXOR - - - - - - org.apache.maven.plugins - maven-surefire-plugin - 2.18.1 - - - test - test - - test - - - - test/java/com/baeldung/neuroph/XORTest.java - - - - - - - - - - - - org.beykery - neuroph - ${neuroph.version} - - - - cglib - cglib - ${cglib.version} - - - commons-beanutils - commons-beanutils - ${commons-beanutils.version} - - - org.apache.commons - commons-lang3 - ${commons-lang.version} - - - org.apache.commons - commons-text - ${commons-text.version} - - - org.apache.commons - commons-collections4 - ${commons.collections.version} - - - org.jasypt - jasypt - ${jasypt.version} - - - org.javatuples - javatuples - ${javatuples.version} - - - org.javassist - javassist - ${javaassist.version} - - - - org.assertj - assertj-core - ${assertj.version} - - - org.skyscreamer - jsonassert - ${jsonassert.version} - - - org.javers - javers-core - ${javers.version} - - - org.eclipse.jetty - jetty-server - ${jetty.version} - - - org.eclipse.jetty - jetty-servlet - ${jetty.version} - - - org.apache.httpcomponents - httpclient - ${httpclient.version} - - - commons-logging - commons-logging - - - - - commons-io - commons-io - ${commons.io.version} - - - commons-chain - commons-chain - ${commons-chain.version} - - - commons-dbutils - commons-dbutils - ${commons.dbutils.version} - - - org.apache.flink - flink-core - ${flink.version} - - - commons-logging - commons-logging - - - - - org.apache.flink - flink-java - ${flink.version} - - - commons-logging - commons-logging - - - - - org.apache.flink - flink-test-utils_2.10 - ${flink.version} - test - - - org.apache.commons - commons-math3 - 3.6.1 - - - net.serenity-bdd - serenity-core - ${serenity.version} - test - - - net.serenity-bdd - serenity-junit - ${serenity.version} - test - - - net.serenity-bdd - serenity-jbehave - ${serenity.jbehave.version} - test - - - net.serenity-bdd - serenity-rest-assured - ${serenity.version} - test - - - net.serenity-bdd - serenity-jira-requirements-provider - ${serenity.jira.version} - test - - - com.fasterxml.jackson.core - jackson-databind - ${jackson.version} - - - - org.datanucleus - javax.jdo - 3.2.0-m6 - - - org.datanucleus - datanucleus-core - 5.1.0-m1 - - - org.datanucleus - datanucleus-api-jdo - 5.1.0-m1 - - - org.datanucleus - datanucleus-rdbms - 5.1.0-m1 - - - org.datanucleus - datanucleus-maven-plugin - 5.0.2 - - - org.datanucleus - datanucleus-xml - 5.0.0-release - - - net.openhft - chronicle - 3.6.4 - - - org.springframework - spring-web - 4.3.8.RELEASE - - - net.serenity-bdd - serenity-spring - ${serenity.version} - test - - - net.serenity-bdd - serenity-screenplay - ${serenity.version} - test - - - net.serenity-bdd - serenity-screenplay-webdriver - ${serenity.version} - test - - - io.rest-assured - spring-mock-mvc - 3.0.3 - test - - - org.multiverse - multiverse-core - ${multiverse.version} - - - com.zaxxer - HikariCP - 2.6.1 - compile - - - com.h2database - h2 - ${h2.version} - - - pl.pragmatists - JUnitParams - ${jUnitParams.version} - test - - - org.quartz-scheduler - quartz - 2.3.0 - - - one.util - streamex - 0.6.5 - - - org.jooq - jool - 0.9.12 - - - org.openjdk.jmh - jmh-core - 1.19 - - - org.openjdk.jmh - jmh-generator-annprocess - 1.19 - - - io.netty - netty-all - ${netty.version} - - - junit - junit - ${junit.version} - test - - - info.debatty - java-lsh - ${java-lsh.version} - - - au.com.dius - pact-jvm-consumer-junit_2.11 - ${pact.version} - test - - - org.codehaus.groovy - groovy-all - 2.4.10 - - - org.awaitility - awaitility - ${awaitility.version} - test - - - org.awaitility - awaitility-proxy - ${awaitility.version} - test - - - org.hamcrest - java-hamcrest - ${org.hamcrest.java-hamcrest.version} - test - - - net.agkn - hll - ${hll.version} - - - net.bytebuddy - byte-buddy - ${bytebuddy.version} - - - net.bytebuddy - byte-buddy-agent - ${bytebuddy.version} - - - org.pcollections - pcollections - ${pcollections.version} - - - - 0.7.0 - 3.2.4 - 3.5 - 1.1 - 1.9.3 - 1.2 - 1.9.2 - 1.2 - 3.21.0-GA - 3.6.2 - 1.5.0 - 3.1.0 - 9.4.3.v20170317 - 4.5.3 - 2.5 - 1.6 - 1.4.196 - 9.4.2.v20170220 - 4.5.3 - 2.5 - 1.2.0 - 2.8.5 - 2.92 - 1.4.0 - 1.24.0 - 1.1.3-rc.5 - 1.4.0 - 1.1.0 - 4.1.10.Final - 4.1 - 4.12 - 0.10 - 3.5.0 - 3.0.0 - 2.0.0.0 - 1.6.0 - 1.7.1 - 2.1.2 - + + + true + + + maven-failsafe-plugin + 2.20 + + + chromedriver + + + + + net.serenity-bdd.maven.plugins + serenity-maven-plugin + ${serenity.plugin.version} + + + serenity-reports + post-integration-test + + aggregate + + + + + + + org.datanucleus + datanucleus-maven-plugin + 5.0.2 + + JDO + ${basedir}/datanucleus.properties + ${basedir}/log4j.properties + true + false + + + + + process-classes + + enhance + + + + + + + org.apache.maven.plugins + maven-jar-plugin + 3.0.2 + + + **/log4j.properties + + + + com.baeldung.neuroph.NeurophXOR + + + + + + org.apache.maven.plugins + maven-surefire-plugin + 2.18.1 + + + test + test + + test + + + + test/java/com/baeldung/neuroph/XORTest.java + + + + + + + + + + + + org.beykery + neuroph + ${neuroph.version} + + + + cglib + cglib + ${cglib.version} + + + commons-beanutils + commons-beanutils + ${commons-beanutils.version} + + + org.apache.commons + commons-lang3 + ${commons-lang.version} + + + org.apache.commons + commons-text + ${commons-text.version} + + + org.apache.commons + commons-collections4 + ${commons.collections.version} + + + org.jasypt + jasypt + ${jasypt.version} + + + org.javatuples + javatuples + ${javatuples.version} + + + org.javassist + javassist + ${javaassist.version} + + + + org.assertj + assertj-core + ${assertj.version} + + + org.skyscreamer + jsonassert + ${jsonassert.version} + + + org.javers + javers-core + ${javers.version} + + + org.eclipse.jetty + jetty-server + ${jetty.version} + + + org.eclipse.jetty + jetty-servlet + ${jetty.version} + + + org.apache.httpcomponents + httpclient + ${httpclient.version} + + + commons-logging + commons-logging + + + + + commons-io + commons-io + ${commons.io.version} + + + commons-chain + commons-chain + ${commons-chain.version} + + + commons-dbutils + commons-dbutils + ${commons.dbutils.version} + + + org.apache.flink + flink-core + ${flink.version} + + + commons-logging + commons-logging + + + + + org.apache.flink + flink-java + ${flink.version} + + + commons-logging + commons-logging + + + + + org.apache.flink + flink-test-utils_2.10 + ${flink.version} + test + + + org.apache.commons + commons-math3 + 3.6.1 + + + net.serenity-bdd + serenity-core + ${serenity.version} + test + + + net.serenity-bdd + serenity-junit + ${serenity.version} + test + + + net.serenity-bdd + serenity-jbehave + ${serenity.jbehave.version} + test + + + net.serenity-bdd + serenity-rest-assured + ${serenity.version} + test + + + net.serenity-bdd + serenity-jira-requirements-provider + ${serenity.jira.version} + test + + + com.fasterxml.jackson.core + jackson-databind + ${jackson.version} + + + + org.datanucleus + javax.jdo + 3.2.0-m6 + + + org.datanucleus + datanucleus-core + 5.1.0-m1 + + + org.datanucleus + datanucleus-api-jdo + 5.1.0-m1 + + + org.datanucleus + datanucleus-rdbms + 5.1.0-m1 + + + org.datanucleus + datanucleus-maven-plugin + 5.0.2 + + + org.datanucleus + datanucleus-xml + 5.0.0-release + + + net.openhft + chronicle + 3.6.4 + + + org.springframework + spring-web + 4.3.8.RELEASE + + + net.serenity-bdd + serenity-spring + ${serenity.version} + test + + + net.serenity-bdd + serenity-screenplay + ${serenity.version} + test + + + net.serenity-bdd + serenity-screenplay-webdriver + ${serenity.version} + test + + + io.rest-assured + spring-mock-mvc + 3.0.3 + test + + + org.multiverse + multiverse-core + ${multiverse.version} + + + com.zaxxer + HikariCP + 2.6.1 + compile + + + com.h2database + h2 + ${h2.version} + + + pl.pragmatists + JUnitParams + ${jUnitParams.version} + test + + + org.quartz-scheduler + quartz + 2.3.0 + + + one.util + streamex + 0.6.5 + + + org.jooq + jool + 0.9.12 + + + org.openjdk.jmh + jmh-core + 1.19 + + + org.openjdk.jmh + jmh-generator-annprocess + 1.19 + + + io.netty + netty-all + ${netty.version} + + + junit + junit + ${junit.version} + test + + + info.debatty + java-lsh + ${java-lsh.version} + + + au.com.dius + pact-jvm-consumer-junit_2.11 + ${pact.version} + test + + + org.codehaus.groovy + groovy-all + 2.4.10 + + + org.awaitility + awaitility + ${awaitility.version} + test + + + org.awaitility + awaitility-proxy + ${awaitility.version} + test + + + org.hamcrest + java-hamcrest + ${org.hamcrest.java-hamcrest.version} + test + + + net.agkn + hll + ${hll.version} + + + net.bytebuddy + byte-buddy + ${bytebuddy.version} + + + net.bytebuddy + byte-buddy-agent + ${bytebuddy.version} + + + org.pcollections + pcollections + ${pcollections.version} + + + + 0.7.0 + 3.2.4 + 3.5 + 1.1 + 1.9.3 + 1.2 + 1.9.2 + 1.2 + 3.21.0-GA + 3.6.2 + 1.5.0 + 3.1.0 + 9.4.3.v20170317 + 4.5.3 + 2.5 + 1.6 + 1.4.196 + 9.4.2.v20170220 + 4.5.3 + 2.5 + 1.2.0 + 2.8.5 + 2.92 + 1.4.0 + 1.24.0 + 1.1.3-rc.5 + 1.4.0 + 1.1.0 + 4.1.10.Final + 4.1 + 4.12 + 0.10 + 3.5.0 + 3.0.0 + 2.0.0.0 + 1.6.0 + 1.7.1 + 2.1.2 + diff --git a/spring-core/pom.xml b/spring-core/pom.xml index 9d9e9838d3..deffaf41db 100644 --- a/spring-core/pom.xml +++ b/spring-core/pom.xml @@ -144,4 +144,4 @@ - + \ No newline at end of file diff --git a/spring-core/src/main/java/com/baeldung/streamutils/CopyStream.java b/spring-core/src/main/java/com/baeldung/streamutils/CopyStream.java index 430759f3a0..d9097188b3 100644 --- a/spring-core/src/main/java/com/baeldung/streamutils/CopyStream.java +++ b/spring-core/src/main/java/com/baeldung/streamutils/CopyStream.java @@ -9,14 +9,14 @@ import org.apache.commons.io.IOUtils; import org.springframework.util.StreamUtils; public class CopyStream { - public static String getStringFromInputStream(InputStream input) throws IOException { - StringWriter writer = new StringWriter(); - IOUtils.copy(input, writer, "UTF-8"); - return writer.toString(); - } + public static String getStringFromInputStream(InputStream input) throws IOException { + StringWriter writer = new StringWriter(); + IOUtils.copy(input, writer, "UTF-8"); + return writer.toString(); + } - public InputStream getNonClosingInputStream() throws IOException { - InputStream in = new FileInputStream("src/test/resources/input.txt"); - return StreamUtils.nonClosing(in); - } + public InputStream getNonClosingInputStream() throws IOException { + InputStream in = new FileInputStream("src/test/resources/input.txt"); + return StreamUtils.nonClosing(in); + } } diff --git a/spring-core/src/main/java/com/baeldung/streamutils/DrainStream.java b/spring-core/src/main/java/com/baeldung/streamutils/DrainStream.java index 6ee4a1ef3a..1ce67a075a 100644 --- a/spring-core/src/main/java/com/baeldung/streamutils/DrainStream.java +++ b/spring-core/src/main/java/com/baeldung/streamutils/DrainStream.java @@ -5,7 +5,7 @@ import java.io.InputStream; import org.springframework.util.StreamUtils; public class DrainStream { - public InputStream getInputStream() { - return StreamUtils.emptyInput(); - } + public InputStream getInputStream() { + return StreamUtils.emptyInput(); + } } diff --git a/spring-core/src/test/java/com/baeldung/streamutils/CopyStreamTest.java b/spring-core/src/test/java/com/baeldung/streamutils/CopyStreamTest.java index 9a65075e5b..3ed797ccaa 100644 --- a/spring-core/src/test/java/com/baeldung/streamutils/CopyStreamTest.java +++ b/spring-core/src/test/java/com/baeldung/streamutils/CopyStreamTest.java @@ -18,83 +18,83 @@ import static com.baeldung.streamutils.CopyStream.getStringFromInputStream; public class CopyStreamTest { - @Test - public void whenCopyInputStreamToOutputStream_thenCorrect() throws IOException { - String inputFileName = "src/test/resources/input.txt"; - String outputFileName = "src/test/resources/output.txt"; - File outputFile = new File(outputFileName); - InputStream in = new FileInputStream(inputFileName); - OutputStream out = new FileOutputStream(outputFileName); + @Test + public void whenCopyInputStreamToOutputStream_thenCorrect() throws IOException { + String inputFileName = "src/test/resources/input.txt"; + String outputFileName = "src/test/resources/output.txt"; + File outputFile = new File(outputFileName); + InputStream in = new FileInputStream(inputFileName); + OutputStream out = new FileOutputStream(outputFileName); - StreamUtils.copy(in, out); + StreamUtils.copy(in, out); - assertTrue(outputFile.exists()); - String inputFileContent = getStringFromInputStream(new FileInputStream(inputFileName)); - String outputFileContent = getStringFromInputStream(new FileInputStream(outputFileName)); - Assert.assertEquals(inputFileContent, outputFileContent); - } + assertTrue(outputFile.exists()); + String inputFileContent = getStringFromInputStream(new FileInputStream(inputFileName)); + String outputFileContent = getStringFromInputStream(new FileInputStream(outputFileName)); + Assert.assertEquals(inputFileContent, outputFileContent); + } - @Test - public void whenCopyRangeOfInputStreamToOutputStream_thenCorrect() throws IOException { - String inputFileName = "src/test/resources/input.txt"; - String outputFileName = "src/test/resources/output.txt"; - File outputFile = new File(outputFileName); - InputStream in = new FileInputStream(inputFileName); - OutputStream out = new FileOutputStream(outputFileName); + @Test + public void whenCopyRangeOfInputStreamToOutputStream_thenCorrect() throws IOException { + String inputFileName = "src/test/resources/input.txt"; + String outputFileName = "src/test/resources/output.txt"; + File outputFile = new File(outputFileName); + InputStream in = new FileInputStream(inputFileName); + OutputStream out = new FileOutputStream(outputFileName); - StreamUtils.copyRange(in, out, 1, 10); + StreamUtils.copyRange(in, out, 1, 10); - assertTrue(outputFile.exists()); - String inputFileContent = getStringFromInputStream(new FileInputStream(inputFileName)); - String outputFileContent = getStringFromInputStream(new FileInputStream(outputFileName)); - Assert.assertEquals(inputFileContent.substring(1, 11), outputFileContent); - } + assertTrue(outputFile.exists()); + String inputFileContent = getStringFromInputStream(new FileInputStream(inputFileName)); + String outputFileContent = getStringFromInputStream(new FileInputStream(outputFileName)); + Assert.assertEquals(inputFileContent.substring(1, 11), outputFileContent); + } - @Test - public void whenCopyStringToOutputStream_thenCorrect() throws IOException { - String string = "Should be copied to OutputStream."; - String outputFileName = "src/test/resources/output.txt"; - File outputFile = new File(outputFileName); - OutputStream out = new FileOutputStream("src/test/resources/output.txt"); + @Test + public void whenCopyStringToOutputStream_thenCorrect() throws IOException { + String string = "Should be copied to OutputStream."; + String outputFileName = "src/test/resources/output.txt"; + File outputFile = new File(outputFileName); + OutputStream out = new FileOutputStream("src/test/resources/output.txt"); - StreamUtils.copy(string, StandardCharsets.UTF_8, out); + StreamUtils.copy(string, StandardCharsets.UTF_8, out); - assertTrue(outputFile.exists()); - String outputFileContent = getStringFromInputStream(new FileInputStream(outputFileName)); - Assert.assertEquals(outputFileContent, string); - } + assertTrue(outputFile.exists()); + String outputFileContent = getStringFromInputStream(new FileInputStream(outputFileName)); + Assert.assertEquals(outputFileContent, string); + } - @Test - public void whenCopyInputStreamToString_thenCorrect() throws IOException { - String inputFileName = "src/test/resources/input.txt"; - InputStream is = new FileInputStream(inputFileName); - String content = StreamUtils.copyToString(is, StandardCharsets.UTF_8); + @Test + public void whenCopyInputStreamToString_thenCorrect() throws IOException { + String inputFileName = "src/test/resources/input.txt"; + InputStream is = new FileInputStream(inputFileName); + String content = StreamUtils.copyToString(is, StandardCharsets.UTF_8); - String inputFileContent = getStringFromInputStream(new FileInputStream(inputFileName)); - Assert.assertEquals(inputFileContent, content); - } + String inputFileContent = getStringFromInputStream(new FileInputStream(inputFileName)); + Assert.assertEquals(inputFileContent, content); + } - @Test - public void whenCopyByteArrayToOutputStream_thenCorrect() throws IOException { - String outputFileName = "src/test/resources/output.txt"; - String string = "Should be copied to OutputStream."; - byte[] byteArray = string.getBytes(); - OutputStream out = new FileOutputStream("src/test/resources/output.txt"); + @Test + public void whenCopyByteArrayToOutputStream_thenCorrect() throws IOException { + String outputFileName = "src/test/resources/output.txt"; + String string = "Should be copied to OutputStream."; + byte[] byteArray = string.getBytes(); + OutputStream out = new FileOutputStream("src/test/resources/output.txt"); - StreamUtils.copy(byteArray, out); - String outputFileContent = getStringFromInputStream(new FileInputStream(outputFileName)); - Assert.assertEquals(outputFileContent, string); - } + StreamUtils.copy(byteArray, out); + String outputFileContent = getStringFromInputStream(new FileInputStream(outputFileName)); + Assert.assertEquals(outputFileContent, string); + } - @Test - public void whenCopyInputStreamToByteArray_thenCorrect() throws IOException { - String inputFileName = "src/test/resources/input.txt"; - InputStream in = new FileInputStream(inputFileName); - byte[] out = StreamUtils.copyToByteArray(in); + @Test + public void whenCopyInputStreamToByteArray_thenCorrect() throws IOException { + String inputFileName = "src/test/resources/input.txt"; + InputStream in = new FileInputStream(inputFileName); + byte[] out = StreamUtils.copyToByteArray(in); - String content = new String(out); - String inputFileContent = getStringFromInputStream(new FileInputStream(inputFileName)); - Assert.assertEquals(inputFileContent, content); - } + String content = new String(out); + String inputFileContent = getStringFromInputStream(new FileInputStream(inputFileName)); + Assert.assertEquals(inputFileContent, content); + } } From af4a8eb10122eb0637abe19d0a68972d7aed8621 Mon Sep 17 00:00:00 2001 From: Ahmed Tawila Date: Sun, 30 Jul 2017 23:09:06 +0200 Subject: [PATCH 020/236] BAEL-1033 minor refactor --- .../com/baeldung/streamutils/CopyStreamTest.java | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/spring-core/src/test/java/com/baeldung/streamutils/CopyStreamTest.java b/spring-core/src/test/java/com/baeldung/streamutils/CopyStreamTest.java index 3ed797ccaa..9fe2f00a77 100644 --- a/spring-core/src/test/java/com/baeldung/streamutils/CopyStreamTest.java +++ b/spring-core/src/test/java/com/baeldung/streamutils/CopyStreamTest.java @@ -10,7 +10,7 @@ import java.io.InputStream; import java.io.OutputStream; import java.nio.charset.StandardCharsets; -import org.junit.Assert; +import static org.junit.Assert.assertEquals; import org.junit.Test; import org.springframework.util.StreamUtils; @@ -31,7 +31,7 @@ public class CopyStreamTest { assertTrue(outputFile.exists()); String inputFileContent = getStringFromInputStream(new FileInputStream(inputFileName)); String outputFileContent = getStringFromInputStream(new FileInputStream(outputFileName)); - Assert.assertEquals(inputFileContent, outputFileContent); + assertEquals(inputFileContent, outputFileContent); } @Test @@ -47,7 +47,7 @@ public class CopyStreamTest { assertTrue(outputFile.exists()); String inputFileContent = getStringFromInputStream(new FileInputStream(inputFileName)); String outputFileContent = getStringFromInputStream(new FileInputStream(outputFileName)); - Assert.assertEquals(inputFileContent.substring(1, 11), outputFileContent); + assertEquals(inputFileContent.substring(1, 11), outputFileContent); } @Test @@ -61,7 +61,7 @@ public class CopyStreamTest { assertTrue(outputFile.exists()); String outputFileContent = getStringFromInputStream(new FileInputStream(outputFileName)); - Assert.assertEquals(outputFileContent, string); + assertEquals(outputFileContent, string); } @Test @@ -71,7 +71,7 @@ public class CopyStreamTest { String content = StreamUtils.copyToString(is, StandardCharsets.UTF_8); String inputFileContent = getStringFromInputStream(new FileInputStream(inputFileName)); - Assert.assertEquals(inputFileContent, content); + assertEquals(inputFileContent, content); } @Test @@ -83,7 +83,7 @@ public class CopyStreamTest { StreamUtils.copy(byteArray, out); String outputFileContent = getStringFromInputStream(new FileInputStream(outputFileName)); - Assert.assertEquals(outputFileContent, string); + assertEquals(outputFileContent, string); } @Test @@ -94,7 +94,7 @@ public class CopyStreamTest { String content = new String(out); String inputFileContent = getStringFromInputStream(new FileInputStream(inputFileName)); - Assert.assertEquals(inputFileContent, content); + assertEquals(inputFileContent, content); } } From 207f88b597bee2111c328c98c08771c0ba2ebb35 Mon Sep 17 00:00:00 2001 From: Ahmed Tawila Date: Wed, 9 Aug 2017 06:42:13 +0200 Subject: [PATCH 021/236] BAEL-1035 Introduction to Eclipse Collections --- libraries/pom.xml | 7 +++ .../ConvertContainerToAnother.java | 20 +++++++ .../baeldung/eclipsecollections/Student.java | 20 +++++++ .../AllSatisfyPatternTest.java | 28 ++++++++++ .../AnySatisfyPatternTest.java | 28 ++++++++++ .../CollectPatternTest.java | 22 ++++++++ .../ConvertContainerToAnotherTest.java | 19 +++++++ .../eclipsecollections/DetectPatternTest.java | 27 ++++++++++ .../ForEachPatternTest.java | 32 +++++++++++ .../InjectIntoPatternTest.java | 23 ++++++++ .../eclipsecollections/LazyIterationTest.java | 26 +++++++++ .../eclipsecollections/RejectPatternTest.java | 32 +++++++++++ .../eclipsecollections/SelectPatternTest.java | 54 +++++++++++++++++++ 13 files changed, 338 insertions(+) create mode 100644 libraries/src/main/java/com/baeldung/eclipsecollections/ConvertContainerToAnother.java create mode 100644 libraries/src/main/java/com/baeldung/eclipsecollections/Student.java create mode 100644 libraries/src/test/java/com/baeldung/eclipsecollections/AllSatisfyPatternTest.java create mode 100644 libraries/src/test/java/com/baeldung/eclipsecollections/AnySatisfyPatternTest.java create mode 100644 libraries/src/test/java/com/baeldung/eclipsecollections/CollectPatternTest.java create mode 100644 libraries/src/test/java/com/baeldung/eclipsecollections/ConvertContainerToAnotherTest.java create mode 100644 libraries/src/test/java/com/baeldung/eclipsecollections/DetectPatternTest.java create mode 100644 libraries/src/test/java/com/baeldung/eclipsecollections/ForEachPatternTest.java create mode 100644 libraries/src/test/java/com/baeldung/eclipsecollections/InjectIntoPatternTest.java create mode 100644 libraries/src/test/java/com/baeldung/eclipsecollections/LazyIterationTest.java create mode 100644 libraries/src/test/java/com/baeldung/eclipsecollections/RejectPatternTest.java create mode 100644 libraries/src/test/java/com/baeldung/eclipsecollections/SelectPatternTest.java diff --git a/libraries/pom.xml b/libraries/pom.xml index 795f255f36..3d00a61cf0 100644 --- a/libraries/pom.xml +++ b/libraries/pom.xml @@ -453,6 +453,12 @@ pcollections ${pcollections.version} + + org.eclipse.collections + eclipse-collections + ${eclipse-collections.version} + + 0.7.0 @@ -493,5 +499,6 @@ 1.6.0 1.7.1 2.1.2 + 8.2.0 diff --git a/libraries/src/main/java/com/baeldung/eclipsecollections/ConvertContainerToAnother.java b/libraries/src/main/java/com/baeldung/eclipsecollections/ConvertContainerToAnother.java new file mode 100644 index 0000000000..069baeab9f --- /dev/null +++ b/libraries/src/main/java/com/baeldung/eclipsecollections/ConvertContainerToAnother.java @@ -0,0 +1,20 @@ +package com.baeldung.eclipsecollections; + +import java.util.List; + +import org.eclipse.collections.api.list.MutableList; +import org.eclipse.collections.impl.set.mutable.UnifiedSet; + +public class ConvertContainerToAnother { + + @SuppressWarnings("rawtypes") + public static List convertToList() { + UnifiedSet cars = new UnifiedSet<>(); + + cars.add("Toyota"); + cars.add("Mercedes"); + cars.add("Volkswagen"); + + return cars.toList(); + } +} diff --git a/libraries/src/main/java/com/baeldung/eclipsecollections/Student.java b/libraries/src/main/java/com/baeldung/eclipsecollections/Student.java new file mode 100644 index 0000000000..2c634a28d9 --- /dev/null +++ b/libraries/src/main/java/com/baeldung/eclipsecollections/Student.java @@ -0,0 +1,20 @@ +package com.baeldung.eclipsecollections; + +public class Student { + + private String firstName; + private String lastName; + + public Student(String firstName, String lastName) { + this.firstName = firstName; + this.lastName = lastName; + } + + public String getFirstName() { + return this.firstName; + } + + public String getLastName() { + return this.lastName; + } +} \ No newline at end of file diff --git a/libraries/src/test/java/com/baeldung/eclipsecollections/AllSatisfyPatternTest.java b/libraries/src/test/java/com/baeldung/eclipsecollections/AllSatisfyPatternTest.java new file mode 100644 index 0000000000..9f66fee0a8 --- /dev/null +++ b/libraries/src/test/java/com/baeldung/eclipsecollections/AllSatisfyPatternTest.java @@ -0,0 +1,28 @@ +package com.baeldung.eclipsecollections; + +import static org.junit.Assert.assertTrue; + +import org.eclipse.collections.api.list.MutableList; +import org.eclipse.collections.impl.block.factory.Predicates; +import org.eclipse.collections.impl.list.mutable.FastList; +import org.junit.Test; + +public class AllSatisfyPatternTest { + + @Test + public void whenAnySatisfiesCondition_thenCorrect() { + MutableList list = new FastList<>(); + list.add(1); + list.add(8); + list.add(5); + list.add(41); + list.add(31); + list.add(17); + list.add(23); + list.add(38); + + boolean result = list.allSatisfy(Predicates.greaterThan(0)); + + assertTrue(result); + } +} diff --git a/libraries/src/test/java/com/baeldung/eclipsecollections/AnySatisfyPatternTest.java b/libraries/src/test/java/com/baeldung/eclipsecollections/AnySatisfyPatternTest.java new file mode 100644 index 0000000000..c3ab83abdc --- /dev/null +++ b/libraries/src/test/java/com/baeldung/eclipsecollections/AnySatisfyPatternTest.java @@ -0,0 +1,28 @@ +package com.baeldung.eclipsecollections; + +import static org.junit.Assert.assertTrue; + +import org.eclipse.collections.api.list.MutableList; +import org.eclipse.collections.impl.block.factory.Predicates; +import org.eclipse.collections.impl.list.mutable.FastList; +import org.junit.Test; + +public class AnySatisfyPatternTest { + + @Test + public void whenAnySatisfiesCondition_thenCorrect() { + MutableList list = new FastList<>(); + list.add(1); + list.add(8); + list.add(5); + list.add(41); + list.add(31); + list.add(17); + list.add(23); + list.add(38); + + boolean result = list.anySatisfy(Predicates.greaterThan(30)); + + assertTrue(result); + } +} diff --git a/libraries/src/test/java/com/baeldung/eclipsecollections/CollectPatternTest.java b/libraries/src/test/java/com/baeldung/eclipsecollections/CollectPatternTest.java new file mode 100644 index 0000000000..51591cd08c --- /dev/null +++ b/libraries/src/test/java/com/baeldung/eclipsecollections/CollectPatternTest.java @@ -0,0 +1,22 @@ +package com.baeldung.eclipsecollections; + +import org.eclipse.collections.api.list.MutableList; +import org.eclipse.collections.impl.list.mutable.FastList; +import static org.junit.Assert.assertEquals; +import org.junit.Test; + +public class CollectPatternTest { + + @Test + public void whenCollect_thenCorrect() { + Student student1 = new Student("John", "Hopkins"); + Student student2 = new Student("George", "Adams"); + + MutableList students = FastList.newListWith(student1, student2); + + MutableList lastNames = students.collect(Student::getLastName); + + assertEquals(lastNames.get(0), "Hopkins"); + assertEquals(lastNames.get(1), "Adams"); + } +} diff --git a/libraries/src/test/java/com/baeldung/eclipsecollections/ConvertContainerToAnotherTest.java b/libraries/src/test/java/com/baeldung/eclipsecollections/ConvertContainerToAnotherTest.java new file mode 100644 index 0000000000..d8cee898a2 --- /dev/null +++ b/libraries/src/test/java/com/baeldung/eclipsecollections/ConvertContainerToAnotherTest.java @@ -0,0 +1,19 @@ +package com.baeldung.eclipsecollections; + +import static org.junit.Assert.assertTrue; + +import org.eclipse.collections.api.list.MutableList; +import org.eclipse.collections.impl.block.factory.Predicates; +import org.junit.Test; + +public class ConvertContainerToAnotherTest { + + @SuppressWarnings({ "unchecked", "rawtypes" }) + @Test + public void whenConvertContainerToAnother_thenCorrect() { + MutableList cars = (MutableList) ConvertContainerToAnother.convertToList(); + assertTrue(cars.anySatisfy(Predicates.equal("Toyota"))); + assertTrue(cars.anySatisfy(Predicates.equal("Mercedes"))); + assertTrue(cars.anySatisfy(Predicates.equal("Volkswagen"))); + } +} diff --git a/libraries/src/test/java/com/baeldung/eclipsecollections/DetectPatternTest.java b/libraries/src/test/java/com/baeldung/eclipsecollections/DetectPatternTest.java new file mode 100644 index 0000000000..39d77498ca --- /dev/null +++ b/libraries/src/test/java/com/baeldung/eclipsecollections/DetectPatternTest.java @@ -0,0 +1,27 @@ +package com.baeldung.eclipsecollections; + +import org.eclipse.collections.api.list.MutableList; +import org.eclipse.collections.impl.block.factory.Predicates; +import org.eclipse.collections.impl.list.mutable.FastList; +import static org.junit.Assert.assertEquals; +import org.junit.Test; + +public class DetectPatternTest { + + @Test + public void whenDetect_thenCorrect() { + MutableList list = new FastList<>(); + list.add(1); + list.add(8); + list.add(5); + list.add(41); + list.add(31); + list.add(17); + list.add(23); + list.add(38); + + Integer result = list.detect(Predicates.greaterThan(30)); + + assertEquals((int) result, 41); + } +} diff --git a/libraries/src/test/java/com/baeldung/eclipsecollections/ForEachPatternTest.java b/libraries/src/test/java/com/baeldung/eclipsecollections/ForEachPatternTest.java new file mode 100644 index 0000000000..e8d93a2af6 --- /dev/null +++ b/libraries/src/test/java/com/baeldung/eclipsecollections/ForEachPatternTest.java @@ -0,0 +1,32 @@ +package com.baeldung.eclipsecollections; + +import org.eclipse.collections.api.block.procedure.Procedure; +import org.eclipse.collections.api.tuple.Pair; +import org.eclipse.collections.impl.map.mutable.UnifiedMap; +import org.eclipse.collections.impl.tuple.Tuples; +import static org.junit.Assert.assertEquals; + +import java.util.Map; + +import org.junit.Test; + +public class ForEachPatternTest { + + @SuppressWarnings("unchecked") + @Test + public void whenInstantiateAndChangeValues_thenCorrect() { + Pair pair1 = Tuples.pair(1, "One"); + Pair pair2 = Tuples.pair(2, "Two"); + Pair pair3 = Tuples.pair(3, "Three"); + + UnifiedMap map = UnifiedMap.newMapWith(pair1, pair2, pair3); + + for (int i = 0; i < map.size(); i++) { + map.put(i + 1, "New Value"); + } + + for (int i = 0; i < map.size(); i++) { + assertEquals("New Value", map.get(i + 1)); + } + } +} diff --git a/libraries/src/test/java/com/baeldung/eclipsecollections/InjectIntoPatternTest.java b/libraries/src/test/java/com/baeldung/eclipsecollections/InjectIntoPatternTest.java new file mode 100644 index 0000000000..bcd34021b1 --- /dev/null +++ b/libraries/src/test/java/com/baeldung/eclipsecollections/InjectIntoPatternTest.java @@ -0,0 +1,23 @@ +package com.baeldung.eclipsecollections; + +import static org.junit.Assert.assertEquals; + +import java.util.List; + +import org.eclipse.collections.impl.factory.Lists; +import org.junit.Test; + +public class InjectIntoPatternTest { + + @Test + public void whenInjectInto_thenCorrect() { + List list = Lists.mutable.of(1, 2, 3, 4); + int result = 5; + for (int i = 0; i < list.size(); i++) { + Integer v = list.get(i); + result = result + v.intValue(); + } + + assertEquals(15, result); + } +} diff --git a/libraries/src/test/java/com/baeldung/eclipsecollections/LazyIterationTest.java b/libraries/src/test/java/com/baeldung/eclipsecollections/LazyIterationTest.java new file mode 100644 index 0000000000..8fe1286d41 --- /dev/null +++ b/libraries/src/test/java/com/baeldung/eclipsecollections/LazyIterationTest.java @@ -0,0 +1,26 @@ +package com.baeldung.eclipsecollections; + +import org.eclipse.collections.api.LazyIterable; +import org.eclipse.collections.api.list.MutableList; +import org.eclipse.collections.impl.block.factory.Predicates; +import org.eclipse.collections.impl.factory.Lists; +import static org.junit.Assert.assertTrue; +import org.junit.Test; + +public class LazyIterationTest { + + @Test + public void whenLazyIteration_thenCorrect() { + Student student1 = new Student("John", "Hopkins"); + Student student2 = new Student("George", "Adams"); + Student student3 = new Student("Jennifer", "Rodriguez"); + + MutableList students = Lists.mutable.with(student1, student2, student3); + LazyIterable lazyStudents = students.asLazy(); + LazyIterable lastNames = lazyStudents.collect(Student::getLastName); + + assertTrue(lastNames.anySatisfy(Predicates.equal("Hopkins"))); + assertTrue(lastNames.anySatisfy(Predicates.equal("Adams"))); + assertTrue(lastNames.anySatisfy(Predicates.equal("Rodriguez"))); + } +} diff --git a/libraries/src/test/java/com/baeldung/eclipsecollections/RejectPatternTest.java b/libraries/src/test/java/com/baeldung/eclipsecollections/RejectPatternTest.java new file mode 100644 index 0000000000..2cc1cdb945 --- /dev/null +++ b/libraries/src/test/java/com/baeldung/eclipsecollections/RejectPatternTest.java @@ -0,0 +1,32 @@ +package com.baeldung.eclipsecollections; + +import org.eclipse.collections.api.list.MutableList; +import org.eclipse.collections.impl.block.factory.Predicates; +import org.eclipse.collections.impl.list.mutable.FastList; +import org.junit.Assert; +import org.junit.Test; + +public class RejectPatternTest { + + @Test + public void whenReject_thenCorrect() { + MutableList list = new FastList<>(); + list.add(1); + list.add(8); + list.add(5); + list.add(41); + list.add(31); + list.add(17); + list.add(23); + list.add(38); + + MutableList notGreaterThanThirty = list.reject(Predicates.greaterThan(30)) + .sortThis(); + + Assert.assertEquals(1, (int) notGreaterThanThirty.getFirst()); + Assert.assertEquals(5, (int) notGreaterThanThirty.get(1)); + Assert.assertEquals(8, (int) notGreaterThanThirty.get(2)); + Assert.assertEquals(17, (int) notGreaterThanThirty.get(3)); + Assert.assertEquals(23, (int) notGreaterThanThirty.getLast()); + } +} diff --git a/libraries/src/test/java/com/baeldung/eclipsecollections/SelectPatternTest.java b/libraries/src/test/java/com/baeldung/eclipsecollections/SelectPatternTest.java new file mode 100644 index 0000000000..c5e3af3a3f --- /dev/null +++ b/libraries/src/test/java/com/baeldung/eclipsecollections/SelectPatternTest.java @@ -0,0 +1,54 @@ +package com.baeldung.eclipsecollections; + +import org.eclipse.collections.api.list.MutableList; +import org.eclipse.collections.impl.block.factory.Predicates; +import org.eclipse.collections.impl.list.mutable.FastList; +import org.junit.Assert; +import org.junit.Test; + +public class SelectPatternTest { + + @Test + public void whenSelect_thenCorrect() { + MutableList list = new FastList<>(); + list.add(1); + list.add(8); + list.add(5); + list.add(41); + list.add(31); + list.add(17); + list.add(23); + list.add(38); + + MutableList greaterThanThirty = list.select(Predicates.greaterThan(30)) + .sortThis(); + + Assert.assertEquals(31, (int) greaterThanThirty.getFirst()); + Assert.assertEquals(38, (int) greaterThanThirty.get(1)); + Assert.assertEquals(41, (int) greaterThanThirty.getLast()); + } + + public MutableList selectUsingLambda() { + MutableList list = new FastList<>(); + list.add(1); + list.add(8); + list.add(5); + list.add(41); + list.add(31); + list.add(17); + list.add(23); + list.add(38); + + return list.select(each -> each > 30) + .sortThis(); + } + + @Test + public void whenSelectUsingLambda_thenCorrect() { + MutableList greaterThanThirty = selectUsingLambda(); + + Assert.assertEquals(31, (int) greaterThanThirty.getFirst()); + Assert.assertEquals(38, (int) greaterThanThirty.get(1)); + Assert.assertEquals(41, (int) greaterThanThirty.getLast()); + } +} From 66eea4cc80f86345273f9969c3f3b5eb2305e487 Mon Sep 17 00:00:00 2001 From: Ahmed Tawila Date: Wed, 9 Aug 2017 06:57:59 +0200 Subject: [PATCH 022/236] format --- .../eclipsecollections/ConvertContainerToAnotherTest.java | 1 + 1 file changed, 1 insertion(+) diff --git a/libraries/src/test/java/com/baeldung/eclipsecollections/ConvertContainerToAnotherTest.java b/libraries/src/test/java/com/baeldung/eclipsecollections/ConvertContainerToAnotherTest.java index d8cee898a2..b538abfa6e 100644 --- a/libraries/src/test/java/com/baeldung/eclipsecollections/ConvertContainerToAnotherTest.java +++ b/libraries/src/test/java/com/baeldung/eclipsecollections/ConvertContainerToAnotherTest.java @@ -12,6 +12,7 @@ public class ConvertContainerToAnotherTest { @Test public void whenConvertContainerToAnother_thenCorrect() { MutableList cars = (MutableList) ConvertContainerToAnother.convertToList(); + assertTrue(cars.anySatisfy(Predicates.equal("Toyota"))); assertTrue(cars.anySatisfy(Predicates.equal("Mercedes"))); assertTrue(cars.anySatisfy(Predicates.equal("Volkswagen"))); From c8a691395673b1db52315b6008cec3c7959acfb2 Mon Sep 17 00:00:00 2001 From: Ahmed Tawila Date: Wed, 9 Aug 2017 23:06:04 +0200 Subject: [PATCH 023/236] BAEL-1035 Introduction to Eclipse Collections --- .../AllSatisfyPatternTest.java | 12 +++- .../AnySatisfyPatternTest.java | 12 +++- .../eclipsecollections/DetectPatternTest.java | 13 +++- .../PartitionPatternTest.java | 61 +++++++++++++++++++ .../eclipsecollections/RejectPatternTest.java | 24 +++++--- .../eclipsecollections/SelectPatternTest.java | 40 ++++++------ 6 files changed, 123 insertions(+), 39 deletions(-) create mode 100644 libraries/src/test/java/com/baeldung/eclipsecollections/PartitionPatternTest.java diff --git a/libraries/src/test/java/com/baeldung/eclipsecollections/AllSatisfyPatternTest.java b/libraries/src/test/java/com/baeldung/eclipsecollections/AllSatisfyPatternTest.java index 9f66fee0a8..1ea10317c7 100644 --- a/libraries/src/test/java/com/baeldung/eclipsecollections/AllSatisfyPatternTest.java +++ b/libraries/src/test/java/com/baeldung/eclipsecollections/AllSatisfyPatternTest.java @@ -5,13 +5,16 @@ import static org.junit.Assert.assertTrue; import org.eclipse.collections.api.list.MutableList; import org.eclipse.collections.impl.block.factory.Predicates; import org.eclipse.collections.impl.list.mutable.FastList; +import org.junit.Before; import org.junit.Test; public class AllSatisfyPatternTest { - @Test - public void whenAnySatisfiesCondition_thenCorrect() { - MutableList list = new FastList<>(); + MutableList list; + + @Before + public void getList() { + this.list = new FastList<>(); list.add(1); list.add(8); list.add(5); @@ -20,7 +23,10 @@ public class AllSatisfyPatternTest { list.add(17); list.add(23); list.add(38); + } + @Test + public void whenAnySatisfiesCondition_thenCorrect() { boolean result = list.allSatisfy(Predicates.greaterThan(0)); assertTrue(result); diff --git a/libraries/src/test/java/com/baeldung/eclipsecollections/AnySatisfyPatternTest.java b/libraries/src/test/java/com/baeldung/eclipsecollections/AnySatisfyPatternTest.java index c3ab83abdc..58f8ad40af 100644 --- a/libraries/src/test/java/com/baeldung/eclipsecollections/AnySatisfyPatternTest.java +++ b/libraries/src/test/java/com/baeldung/eclipsecollections/AnySatisfyPatternTest.java @@ -5,13 +5,16 @@ import static org.junit.Assert.assertTrue; import org.eclipse.collections.api.list.MutableList; import org.eclipse.collections.impl.block.factory.Predicates; import org.eclipse.collections.impl.list.mutable.FastList; +import org.junit.Before; import org.junit.Test; public class AnySatisfyPatternTest { - @Test - public void whenAnySatisfiesCondition_thenCorrect() { - MutableList list = new FastList<>(); + MutableList list; + + @Before + public void getList() { + this.list = new FastList<>(); list.add(1); list.add(8); list.add(5); @@ -20,7 +23,10 @@ public class AnySatisfyPatternTest { list.add(17); list.add(23); list.add(38); + } + @Test + public void whenAnySatisfiesCondition_thenCorrect() { boolean result = list.anySatisfy(Predicates.greaterThan(30)); assertTrue(result); diff --git a/libraries/src/test/java/com/baeldung/eclipsecollections/DetectPatternTest.java b/libraries/src/test/java/com/baeldung/eclipsecollections/DetectPatternTest.java index 39d77498ca..fc643f2840 100644 --- a/libraries/src/test/java/com/baeldung/eclipsecollections/DetectPatternTest.java +++ b/libraries/src/test/java/com/baeldung/eclipsecollections/DetectPatternTest.java @@ -4,13 +4,17 @@ import org.eclipse.collections.api.list.MutableList; import org.eclipse.collections.impl.block.factory.Predicates; import org.eclipse.collections.impl.list.mutable.FastList; import static org.junit.Assert.assertEquals; + +import org.junit.Before; import org.junit.Test; public class DetectPatternTest { - @Test - public void whenDetect_thenCorrect() { - MutableList list = new FastList<>(); + MutableList list; + + @Before + public void getList() { + this.list = new FastList<>(); list.add(1); list.add(8); list.add(5); @@ -19,7 +23,10 @@ public class DetectPatternTest { list.add(17); list.add(23); list.add(38); + } + @Test + public void whenDetect_thenCorrect() { Integer result = list.detect(Predicates.greaterThan(30)); assertEquals((int) result, 41); diff --git a/libraries/src/test/java/com/baeldung/eclipsecollections/PartitionPatternTest.java b/libraries/src/test/java/com/baeldung/eclipsecollections/PartitionPatternTest.java new file mode 100644 index 0000000000..3e52829824 --- /dev/null +++ b/libraries/src/test/java/com/baeldung/eclipsecollections/PartitionPatternTest.java @@ -0,0 +1,61 @@ +package com.baeldung.eclipsecollections; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertTrue; + +import org.eclipse.collections.api.block.predicate.Predicate; +import org.eclipse.collections.api.list.MutableList; +import org.eclipse.collections.api.partition.list.PartitionMutableList; +import org.eclipse.collections.impl.block.factory.Predicates; +import org.eclipse.collections.impl.list.mutable.FastList; +import org.junit.Before; +import org.junit.Test; + +public class PartitionPatternTest { + + MutableList list; + + @Before + public void getList() { + this.list = new FastList<>(); + list.add(1); + list.add(8); + list.add(5); + list.add(41); + list.add(31); + list.add(17); + list.add(23); + list.add(38); + } + + @SuppressWarnings({ "unused" }) + @Test + public void whenAnySatisfiesCondition_thenCorrect() { + MutableList numbers = list; + PartitionMutableList partitionedFolks = numbers.partition(new Predicate() { + + /** + * + */ + private static final long serialVersionUID = -1551138743683678406L; + + public boolean accept(Integer each) { + return each > 30; + } + }); + MutableList greaterThanThirty = partitionedFolks.getSelected() + .sortThis(); + MutableList smallerThanThirty = partitionedFolks.getRejected() + .sortThis(); + + assertEquals(1, (int) smallerThanThirty.getFirst()); + assertTrue(smallerThanThirty.anySatisfy(Predicates.equal(5))); + assertTrue(smallerThanThirty.anySatisfy(Predicates.equal(8))); + assertTrue(smallerThanThirty.anySatisfy(Predicates.equal(17))); + assertTrue(smallerThanThirty.anySatisfy(Predicates.equal(23))); + + assertTrue(greaterThanThirty.anySatisfy(Predicates.equal(31))); + assertTrue(greaterThanThirty.anySatisfy(Predicates.equal(38))); + assertTrue(greaterThanThirty.anySatisfy(Predicates.equal(41))); + } +} diff --git a/libraries/src/test/java/com/baeldung/eclipsecollections/RejectPatternTest.java b/libraries/src/test/java/com/baeldung/eclipsecollections/RejectPatternTest.java index 2cc1cdb945..044a8203d6 100644 --- a/libraries/src/test/java/com/baeldung/eclipsecollections/RejectPatternTest.java +++ b/libraries/src/test/java/com/baeldung/eclipsecollections/RejectPatternTest.java @@ -3,14 +3,17 @@ package com.baeldung.eclipsecollections; import org.eclipse.collections.api.list.MutableList; import org.eclipse.collections.impl.block.factory.Predicates; import org.eclipse.collections.impl.list.mutable.FastList; -import org.junit.Assert; +import static org.junit.Assert.assertEquals; +import org.junit.Before; import org.junit.Test; public class RejectPatternTest { - @Test - public void whenReject_thenCorrect() { - MutableList list = new FastList<>(); + MutableList list; + + @Before + public void getList() { + this.list = new FastList<>(); list.add(1); list.add(8); list.add(5); @@ -19,14 +22,17 @@ public class RejectPatternTest { list.add(17); list.add(23); list.add(38); + } + @Test + public void whenReject_thenCorrect() { MutableList notGreaterThanThirty = list.reject(Predicates.greaterThan(30)) .sortThis(); - Assert.assertEquals(1, (int) notGreaterThanThirty.getFirst()); - Assert.assertEquals(5, (int) notGreaterThanThirty.get(1)); - Assert.assertEquals(8, (int) notGreaterThanThirty.get(2)); - Assert.assertEquals(17, (int) notGreaterThanThirty.get(3)); - Assert.assertEquals(23, (int) notGreaterThanThirty.getLast()); + assertEquals(1, (int) notGreaterThanThirty.getFirst()); + assertEquals(5, (int) notGreaterThanThirty.get(1)); + assertEquals(8, (int) notGreaterThanThirty.get(2)); + assertEquals(17, (int) notGreaterThanThirty.get(3)); + assertEquals(23, (int) notGreaterThanThirty.getLast()); } } diff --git a/libraries/src/test/java/com/baeldung/eclipsecollections/SelectPatternTest.java b/libraries/src/test/java/com/baeldung/eclipsecollections/SelectPatternTest.java index c5e3af3a3f..20c94f6028 100644 --- a/libraries/src/test/java/com/baeldung/eclipsecollections/SelectPatternTest.java +++ b/libraries/src/test/java/com/baeldung/eclipsecollections/SelectPatternTest.java @@ -3,14 +3,17 @@ package com.baeldung.eclipsecollections; import org.eclipse.collections.api.list.MutableList; import org.eclipse.collections.impl.block.factory.Predicates; import org.eclipse.collections.impl.list.mutable.FastList; -import org.junit.Assert; +import static org.junit.Assert.assertEquals; +import org.junit.Before; import org.junit.Test; public class SelectPatternTest { - @Test - public void whenSelect_thenCorrect() { - MutableList list = new FastList<>(); + MutableList list; + + @Before + public void getList() { + this.list = new FastList<>(); list.add(1); list.add(8); list.add(5); @@ -19,36 +22,31 @@ public class SelectPatternTest { list.add(17); list.add(23); list.add(38); + } + @Test + public void givenListwhenSelect_thenCorrect() { MutableList greaterThanThirty = list.select(Predicates.greaterThan(30)) .sortThis(); - Assert.assertEquals(31, (int) greaterThanThirty.getFirst()); - Assert.assertEquals(38, (int) greaterThanThirty.get(1)); - Assert.assertEquals(41, (int) greaterThanThirty.getLast()); + assertEquals(31, (int) greaterThanThirty.getFirst()); + assertEquals(38, (int) greaterThanThirty.get(1)); + assertEquals(41, (int) greaterThanThirty.getLast()); } + @SuppressWarnings("rawtypes") public MutableList selectUsingLambda() { - MutableList list = new FastList<>(); - list.add(1); - list.add(8); - list.add(5); - list.add(41); - list.add(31); - list.add(17); - list.add(23); - list.add(38); - return list.select(each -> each > 30) .sortThis(); } + @SuppressWarnings("unchecked") @Test - public void whenSelectUsingLambda_thenCorrect() { + public void givenListwhenSelectUsingLambda_thenCorrect() { MutableList greaterThanThirty = selectUsingLambda(); - Assert.assertEquals(31, (int) greaterThanThirty.getFirst()); - Assert.assertEquals(38, (int) greaterThanThirty.get(1)); - Assert.assertEquals(41, (int) greaterThanThirty.getLast()); + assertEquals(31, (int) greaterThanThirty.getFirst()); + assertEquals(38, (int) greaterThanThirty.get(1)); + assertEquals(41, (int) greaterThanThirty.getLast()); } } From 4c2447ebf2eefb0e2901650e8eb879d3688999d7 Mon Sep 17 00:00:00 2001 From: Ahmed Tawila Date: Fri, 11 Aug 2017 20:40:39 +0200 Subject: [PATCH 024/236] BAEL-1035 Introduction to Eclipse Collections --- .../baeldung/eclipsecollections/Student.java | 26 ++++++++++++ .../CollectPatternTest.java | 4 +- .../eclipsecollections/FlatCollectTest.java | 42 +++++++++++++++++++ .../ForEachPatternTest.java | 32 -------------- .../InjectIntoPatternTest.java | 23 ---------- .../PartitionPatternTest.java | 1 - .../baeldung/eclipsecollections/ZipTest.java | 22 ++++++++++ .../eclipsecollections/ZipWithIndexTest.java | 22 ++++++++++ 8 files changed, 114 insertions(+), 58 deletions(-) create mode 100644 libraries/src/test/java/com/baeldung/eclipsecollections/FlatCollectTest.java delete mode 100644 libraries/src/test/java/com/baeldung/eclipsecollections/ForEachPatternTest.java delete mode 100644 libraries/src/test/java/com/baeldung/eclipsecollections/InjectIntoPatternTest.java create mode 100644 libraries/src/test/java/com/baeldung/eclipsecollections/ZipTest.java create mode 100644 libraries/src/test/java/com/baeldung/eclipsecollections/ZipWithIndexTest.java diff --git a/libraries/src/main/java/com/baeldung/eclipsecollections/Student.java b/libraries/src/main/java/com/baeldung/eclipsecollections/Student.java index 2c634a28d9..cf6c06cec0 100644 --- a/libraries/src/main/java/com/baeldung/eclipsecollections/Student.java +++ b/libraries/src/main/java/com/baeldung/eclipsecollections/Student.java @@ -1,15 +1,25 @@ package com.baeldung.eclipsecollections; +import java.util.List; + public class Student { private String firstName; private String lastName; + private List addresses; public Student(String firstName, String lastName) { this.firstName = firstName; this.lastName = lastName; } + public Student(String firstName, String lastName, List addresses) { + super(); + this.firstName = firstName; + this.lastName = lastName; + this.addresses = addresses; + } + public String getFirstName() { return this.firstName; } @@ -17,4 +27,20 @@ public class Student { public String getLastName() { return this.lastName; } + + public List getAddresses() { + return addresses; + } + + public void setAddresses(List addresses) { + this.addresses = addresses; + } + + public void setFirstName(String firstName) { + this.firstName = firstName; + } + + public void setLastName(String lastName) { + this.lastName = lastName; + } } \ No newline at end of file diff --git a/libraries/src/test/java/com/baeldung/eclipsecollections/CollectPatternTest.java b/libraries/src/test/java/com/baeldung/eclipsecollections/CollectPatternTest.java index 51591cd08c..5fb63794a1 100644 --- a/libraries/src/test/java/com/baeldung/eclipsecollections/CollectPatternTest.java +++ b/libraries/src/test/java/com/baeldung/eclipsecollections/CollectPatternTest.java @@ -16,7 +16,7 @@ public class CollectPatternTest { MutableList lastNames = students.collect(Student::getLastName); - assertEquals(lastNames.get(0), "Hopkins"); - assertEquals(lastNames.get(1), "Adams"); + assertEquals("Hopkins", lastNames.get(0)); + assertEquals("Adams", lastNames.get(1)); } } diff --git a/libraries/src/test/java/com/baeldung/eclipsecollections/FlatCollectTest.java b/libraries/src/test/java/com/baeldung/eclipsecollections/FlatCollectTest.java new file mode 100644 index 0000000000..3d1453e557 --- /dev/null +++ b/libraries/src/test/java/com/baeldung/eclipsecollections/FlatCollectTest.java @@ -0,0 +1,42 @@ +package com.baeldung.eclipsecollections; + +import org.eclipse.collections.api.list.MutableList; +import org.eclipse.collections.impl.list.mutable.FastList; +import static org.junit.Assert.assertEquals; +import org.junit.Before; +import org.junit.Test; + +public class FlatCollectTest { + + MutableList addresses1; + MutableList addresses2; + MutableList addresses3; + MutableList addresses4; + + MutableList students; + + @Before + public void setup() { + String address1 = "73 Pacific St., Forest Hills, NY 11375"; + String address2 = "93 Bayport Ave., South Richmond Hill, NY 11419"; + String address3 = "548 Market St, San Francisco, CA 94104"; + String address4 = "8605 Santa Monica Blvd, West Hollywood, CA 90069"; + + this.addresses1 = FastList.newListWith(address1, address2); + this.addresses2 = FastList.newListWith(address3, address4); + Student student1 = new Student("John", "Hopkins", addresses1); + Student student2 = new Student("George", "Adams", addresses2); + this.addresses2 = FastList.newListWith(address3, address4); + this.students = FastList.newListWith(student1, student2); + } + + @Test + public void whenFlatCollect_thenCorrect() { + MutableList addresses = students.flatCollect(Student::getAddresses); + + assertEquals("73 Pacific St., Forest Hills, NY 11375", addresses.get(0)); + assertEquals("93 Bayport Ave., South Richmond Hill, NY 11419", addresses.get(1)); + assertEquals("548 Market St, San Francisco, CA 94104", addresses.get(2)); + assertEquals("8605 Santa Monica Blvd, West Hollywood, CA 90069", addresses.get(3)); + } +} diff --git a/libraries/src/test/java/com/baeldung/eclipsecollections/ForEachPatternTest.java b/libraries/src/test/java/com/baeldung/eclipsecollections/ForEachPatternTest.java deleted file mode 100644 index e8d93a2af6..0000000000 --- a/libraries/src/test/java/com/baeldung/eclipsecollections/ForEachPatternTest.java +++ /dev/null @@ -1,32 +0,0 @@ -package com.baeldung.eclipsecollections; - -import org.eclipse.collections.api.block.procedure.Procedure; -import org.eclipse.collections.api.tuple.Pair; -import org.eclipse.collections.impl.map.mutable.UnifiedMap; -import org.eclipse.collections.impl.tuple.Tuples; -import static org.junit.Assert.assertEquals; - -import java.util.Map; - -import org.junit.Test; - -public class ForEachPatternTest { - - @SuppressWarnings("unchecked") - @Test - public void whenInstantiateAndChangeValues_thenCorrect() { - Pair pair1 = Tuples.pair(1, "One"); - Pair pair2 = Tuples.pair(2, "Two"); - Pair pair3 = Tuples.pair(3, "Three"); - - UnifiedMap map = UnifiedMap.newMapWith(pair1, pair2, pair3); - - for (int i = 0; i < map.size(); i++) { - map.put(i + 1, "New Value"); - } - - for (int i = 0; i < map.size(); i++) { - assertEquals("New Value", map.get(i + 1)); - } - } -} diff --git a/libraries/src/test/java/com/baeldung/eclipsecollections/InjectIntoPatternTest.java b/libraries/src/test/java/com/baeldung/eclipsecollections/InjectIntoPatternTest.java deleted file mode 100644 index bcd34021b1..0000000000 --- a/libraries/src/test/java/com/baeldung/eclipsecollections/InjectIntoPatternTest.java +++ /dev/null @@ -1,23 +0,0 @@ -package com.baeldung.eclipsecollections; - -import static org.junit.Assert.assertEquals; - -import java.util.List; - -import org.eclipse.collections.impl.factory.Lists; -import org.junit.Test; - -public class InjectIntoPatternTest { - - @Test - public void whenInjectInto_thenCorrect() { - List list = Lists.mutable.of(1, 2, 3, 4); - int result = 5; - for (int i = 0; i < list.size(); i++) { - Integer v = list.get(i); - result = result + v.intValue(); - } - - assertEquals(15, result); - } -} diff --git a/libraries/src/test/java/com/baeldung/eclipsecollections/PartitionPatternTest.java b/libraries/src/test/java/com/baeldung/eclipsecollections/PartitionPatternTest.java index 3e52829824..4d9619817b 100644 --- a/libraries/src/test/java/com/baeldung/eclipsecollections/PartitionPatternTest.java +++ b/libraries/src/test/java/com/baeldung/eclipsecollections/PartitionPatternTest.java @@ -28,7 +28,6 @@ public class PartitionPatternTest { list.add(38); } - @SuppressWarnings({ "unused" }) @Test public void whenAnySatisfiesCondition_thenCorrect() { MutableList numbers = list; diff --git a/libraries/src/test/java/com/baeldung/eclipsecollections/ZipTest.java b/libraries/src/test/java/com/baeldung/eclipsecollections/ZipTest.java new file mode 100644 index 0000000000..9dfab8f32d --- /dev/null +++ b/libraries/src/test/java/com/baeldung/eclipsecollections/ZipTest.java @@ -0,0 +1,22 @@ +package com.baeldung.eclipsecollections; + +import org.eclipse.collections.api.list.MutableList; +import org.eclipse.collections.api.tuple.Pair; +import org.eclipse.collections.impl.factory.Lists; +import org.eclipse.collections.impl.tuple.Tuples; +import static org.junit.Assert.assertEquals; +import org.junit.Test; + +public class ZipTest { + + @Test + public void whenZip_thenCorrect() { + MutableList numbers = Lists.mutable.with("1", "2", "3", "Ignored"); + MutableList cars = Lists.mutable.with("Porsche", "Volvo", "Toyota"); + MutableList> pairs = numbers.zip(cars); + + assertEquals(Tuples.pair("1", "Porsche"), pairs.get(0)); + assertEquals(Tuples.pair("2", "Volvo"), pairs.get(1)); + assertEquals(Tuples.pair("3", "Toyota"), pairs.get(2)); + } +} diff --git a/libraries/src/test/java/com/baeldung/eclipsecollections/ZipWithIndexTest.java b/libraries/src/test/java/com/baeldung/eclipsecollections/ZipWithIndexTest.java new file mode 100644 index 0000000000..3e8fe9b410 --- /dev/null +++ b/libraries/src/test/java/com/baeldung/eclipsecollections/ZipWithIndexTest.java @@ -0,0 +1,22 @@ +package com.baeldung.eclipsecollections; + +import static org.junit.Assert.assertEquals; + +import org.eclipse.collections.api.list.MutableList; +import org.eclipse.collections.api.tuple.Pair; +import org.eclipse.collections.impl.list.mutable.FastList; +import org.eclipse.collections.impl.tuple.Tuples; +import org.junit.Test; + +public class ZipWithIndexTest { + + @Test + public void whenZip_thenCorrect() { + MutableList cars = FastList.newListWith("Porsche", "Volvo", "Toyota"); + MutableList> pairs = cars.zipWithIndex(); + + assertEquals(Tuples.pair("Porsche", 0), pairs.get(0)); + assertEquals(Tuples.pair("Volvo", 1), pairs.get(1)); + assertEquals(Tuples.pair("Toyota", 2), pairs.get(2)); + } +} From 81cdec14d771d596348a155e15e5ff5899226c1b Mon Sep 17 00:00:00 2001 From: Ahmed Tawila Date: Sat, 12 Aug 2017 15:33:46 +0200 Subject: [PATCH 025/236] BAEL-1035 Introduction to Eclipse Collections --- .../AllSatisfyPatternTest.java | 10 +------ .../AnySatisfyPatternTest.java | 10 +------ .../CollectPatternTest.java | 6 ++-- .../ConvertContainerToAnotherTest.java | 12 ++++---- .../eclipsecollections/DetectPatternTest.java | 14 +++------- .../eclipsecollections/FlatCollectTest.java | 17 ++++++++--- .../eclipsecollections/LazyIterationTest.java | 7 +++-- .../PartitionPatternTest.java | 28 ++++--------------- .../eclipsecollections/RejectPatternTest.java | 26 ++++++++--------- .../eclipsecollections/SelectPatternTest.java | 22 +++++---------- .../baeldung/eclipsecollections/ZipTest.java | 19 +++++++++++-- .../eclipsecollections/ZipWithIndexTest.java | 19 +++++++++++-- 12 files changed, 88 insertions(+), 102 deletions(-) diff --git a/libraries/src/test/java/com/baeldung/eclipsecollections/AllSatisfyPatternTest.java b/libraries/src/test/java/com/baeldung/eclipsecollections/AllSatisfyPatternTest.java index 1ea10317c7..ee369fc75b 100644 --- a/libraries/src/test/java/com/baeldung/eclipsecollections/AllSatisfyPatternTest.java +++ b/libraries/src/test/java/com/baeldung/eclipsecollections/AllSatisfyPatternTest.java @@ -14,15 +14,7 @@ public class AllSatisfyPatternTest { @Before public void getList() { - this.list = new FastList<>(); - list.add(1); - list.add(8); - list.add(5); - list.add(41); - list.add(31); - list.add(17); - list.add(23); - list.add(38); + this.list = FastList.newListWith(1, 8, 5, 41, 31, 17, 23, 38); } @Test diff --git a/libraries/src/test/java/com/baeldung/eclipsecollections/AnySatisfyPatternTest.java b/libraries/src/test/java/com/baeldung/eclipsecollections/AnySatisfyPatternTest.java index 58f8ad40af..a3314ebee6 100644 --- a/libraries/src/test/java/com/baeldung/eclipsecollections/AnySatisfyPatternTest.java +++ b/libraries/src/test/java/com/baeldung/eclipsecollections/AnySatisfyPatternTest.java @@ -14,15 +14,7 @@ public class AnySatisfyPatternTest { @Before public void getList() { - this.list = new FastList<>(); - list.add(1); - list.add(8); - list.add(5); - list.add(41); - list.add(31); - list.add(17); - list.add(23); - list.add(38); + this.list = FastList.newListWith(1, 8, 5, 41, 31, 17, 23, 38); } @Test diff --git a/libraries/src/test/java/com/baeldung/eclipsecollections/CollectPatternTest.java b/libraries/src/test/java/com/baeldung/eclipsecollections/CollectPatternTest.java index 5fb63794a1..f1c665f085 100644 --- a/libraries/src/test/java/com/baeldung/eclipsecollections/CollectPatternTest.java +++ b/libraries/src/test/java/com/baeldung/eclipsecollections/CollectPatternTest.java @@ -3,6 +3,8 @@ package com.baeldung.eclipsecollections; import org.eclipse.collections.api.list.MutableList; import org.eclipse.collections.impl.list.mutable.FastList; import static org.junit.Assert.assertEquals; + +import org.assertj.core.api.Assertions; import org.junit.Test; public class CollectPatternTest { @@ -16,7 +18,7 @@ public class CollectPatternTest { MutableList lastNames = students.collect(Student::getLastName); - assertEquals("Hopkins", lastNames.get(0)); - assertEquals("Adams", lastNames.get(1)); + Assertions.assertThat(lastNames) + .containsExactly("Hopkins", "Adams"); } } diff --git a/libraries/src/test/java/com/baeldung/eclipsecollections/ConvertContainerToAnotherTest.java b/libraries/src/test/java/com/baeldung/eclipsecollections/ConvertContainerToAnotherTest.java index b538abfa6e..4655431872 100644 --- a/libraries/src/test/java/com/baeldung/eclipsecollections/ConvertContainerToAnotherTest.java +++ b/libraries/src/test/java/com/baeldung/eclipsecollections/ConvertContainerToAnotherTest.java @@ -1,9 +1,8 @@ package com.baeldung.eclipsecollections; -import static org.junit.Assert.assertTrue; - +import org.assertj.core.api.Assertions; import org.eclipse.collections.api.list.MutableList; -import org.eclipse.collections.impl.block.factory.Predicates; +import org.eclipse.collections.impl.list.mutable.FastList; import org.junit.Test; public class ConvertContainerToAnotherTest { @@ -12,9 +11,8 @@ public class ConvertContainerToAnotherTest { @Test public void whenConvertContainerToAnother_thenCorrect() { MutableList cars = (MutableList) ConvertContainerToAnother.convertToList(); - - assertTrue(cars.anySatisfy(Predicates.equal("Toyota"))); - assertTrue(cars.anySatisfy(Predicates.equal("Mercedes"))); - assertTrue(cars.anySatisfy(Predicates.equal("Volkswagen"))); + + Assertions.assertThat(cars) + .containsExactlyElementsOf(FastList.newListWith("Volkswagen", "Toyota", "Mercedes")); } } diff --git a/libraries/src/test/java/com/baeldung/eclipsecollections/DetectPatternTest.java b/libraries/src/test/java/com/baeldung/eclipsecollections/DetectPatternTest.java index fc643f2840..36ebf7609d 100644 --- a/libraries/src/test/java/com/baeldung/eclipsecollections/DetectPatternTest.java +++ b/libraries/src/test/java/com/baeldung/eclipsecollections/DetectPatternTest.java @@ -5,6 +5,7 @@ import org.eclipse.collections.impl.block.factory.Predicates; import org.eclipse.collections.impl.list.mutable.FastList; import static org.junit.Assert.assertEquals; +import org.assertj.core.api.Assertions; import org.junit.Before; import org.junit.Test; @@ -14,21 +15,14 @@ public class DetectPatternTest { @Before public void getList() { - this.list = new FastList<>(); - list.add(1); - list.add(8); - list.add(5); - list.add(41); - list.add(31); - list.add(17); - list.add(23); - list.add(38); + this.list = FastList.newListWith(1, 8, 5, 41, 31, 17, 23, 38); } @Test public void whenDetect_thenCorrect() { Integer result = list.detect(Predicates.greaterThan(30)); - assertEquals((int) result, 41); + Assertions.assertThat(result) + .isEqualTo(41); } } diff --git a/libraries/src/test/java/com/baeldung/eclipsecollections/FlatCollectTest.java b/libraries/src/test/java/com/baeldung/eclipsecollections/FlatCollectTest.java index 3d1453e557..9190625993 100644 --- a/libraries/src/test/java/com/baeldung/eclipsecollections/FlatCollectTest.java +++ b/libraries/src/test/java/com/baeldung/eclipsecollections/FlatCollectTest.java @@ -1,8 +1,13 @@ package com.baeldung.eclipsecollections; +import org.assertj.core.api.Assertions; import org.eclipse.collections.api.list.MutableList; import org.eclipse.collections.impl.list.mutable.FastList; import static org.junit.Assert.assertEquals; + +import java.util.ArrayList; +import java.util.List; + import org.junit.Before; import org.junit.Test; @@ -13,6 +18,7 @@ public class FlatCollectTest { MutableList addresses3; MutableList addresses4; + List expectedAddresses; MutableList students; @Before @@ -28,15 +34,18 @@ public class FlatCollectTest { Student student2 = new Student("George", "Adams", addresses2); this.addresses2 = FastList.newListWith(address3, address4); this.students = FastList.newListWith(student1, student2); + this.expectedAddresses = new ArrayList<>(); + this.expectedAddresses.add("73 Pacific St., Forest Hills, NY 11375"); + this.expectedAddresses.add("93 Bayport Ave., South Richmond Hill, NY 11419"); + this.expectedAddresses.add("548 Market St, San Francisco, CA 94104"); + this.expectedAddresses.add("8605 Santa Monica Blvd, West Hollywood, CA 90069"); } @Test public void whenFlatCollect_thenCorrect() { MutableList addresses = students.flatCollect(Student::getAddresses); - assertEquals("73 Pacific St., Forest Hills, NY 11375", addresses.get(0)); - assertEquals("93 Bayport Ave., South Richmond Hill, NY 11419", addresses.get(1)); - assertEquals("548 Market St, San Francisco, CA 94104", addresses.get(2)); - assertEquals("8605 Santa Monica Blvd, West Hollywood, CA 90069", addresses.get(3)); + Assertions.assertThat(addresses) + .containsExactlyElementsOf(this.expectedAddresses); } } diff --git a/libraries/src/test/java/com/baeldung/eclipsecollections/LazyIterationTest.java b/libraries/src/test/java/com/baeldung/eclipsecollections/LazyIterationTest.java index 8fe1286d41..25e119ddb4 100644 --- a/libraries/src/test/java/com/baeldung/eclipsecollections/LazyIterationTest.java +++ b/libraries/src/test/java/com/baeldung/eclipsecollections/LazyIterationTest.java @@ -5,6 +5,8 @@ import org.eclipse.collections.api.list.MutableList; import org.eclipse.collections.impl.block.factory.Predicates; import org.eclipse.collections.impl.factory.Lists; import static org.junit.Assert.assertTrue; + +import org.assertj.core.api.Assertions; import org.junit.Test; public class LazyIterationTest { @@ -19,8 +21,7 @@ public class LazyIterationTest { LazyIterable lazyStudents = students.asLazy(); LazyIterable lastNames = lazyStudents.collect(Student::getLastName); - assertTrue(lastNames.anySatisfy(Predicates.equal("Hopkins"))); - assertTrue(lastNames.anySatisfy(Predicates.equal("Adams"))); - assertTrue(lastNames.anySatisfy(Predicates.equal("Rodriguez"))); + Assertions.assertThat(lastNames) + .containsAll(Lists.mutable.with("Hopkins", "Adams", "Rodriguez")); } } diff --git a/libraries/src/test/java/com/baeldung/eclipsecollections/PartitionPatternTest.java b/libraries/src/test/java/com/baeldung/eclipsecollections/PartitionPatternTest.java index 4d9619817b..c055413cd9 100644 --- a/libraries/src/test/java/com/baeldung/eclipsecollections/PartitionPatternTest.java +++ b/libraries/src/test/java/com/baeldung/eclipsecollections/PartitionPatternTest.java @@ -1,12 +1,9 @@ package com.baeldung.eclipsecollections; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertTrue; - +import org.assertj.core.api.Assertions; import org.eclipse.collections.api.block.predicate.Predicate; import org.eclipse.collections.api.list.MutableList; import org.eclipse.collections.api.partition.list.PartitionMutableList; -import org.eclipse.collections.impl.block.factory.Predicates; import org.eclipse.collections.impl.list.mutable.FastList; import org.junit.Before; import org.junit.Test; @@ -17,15 +14,7 @@ public class PartitionPatternTest { @Before public void getList() { - this.list = new FastList<>(); - list.add(1); - list.add(8); - list.add(5); - list.add(41); - list.add(31); - list.add(17); - list.add(23); - list.add(38); + this.list = FastList.newListWith(1, 8, 5, 41, 31, 17, 23, 38); } @Test @@ -47,14 +36,9 @@ public class PartitionPatternTest { MutableList smallerThanThirty = partitionedFolks.getRejected() .sortThis(); - assertEquals(1, (int) smallerThanThirty.getFirst()); - assertTrue(smallerThanThirty.anySatisfy(Predicates.equal(5))); - assertTrue(smallerThanThirty.anySatisfy(Predicates.equal(8))); - assertTrue(smallerThanThirty.anySatisfy(Predicates.equal(17))); - assertTrue(smallerThanThirty.anySatisfy(Predicates.equal(23))); - - assertTrue(greaterThanThirty.anySatisfy(Predicates.equal(31))); - assertTrue(greaterThanThirty.anySatisfy(Predicates.equal(38))); - assertTrue(greaterThanThirty.anySatisfy(Predicates.equal(41))); + Assertions.assertThat(smallerThanThirty) + .containsExactly(1, 5, 8, 17, 23); + Assertions.assertThat(greaterThanThirty) + .containsExactly(31, 38, 41); } } diff --git a/libraries/src/test/java/com/baeldung/eclipsecollections/RejectPatternTest.java b/libraries/src/test/java/com/baeldung/eclipsecollections/RejectPatternTest.java index 044a8203d6..0dc9942cbd 100644 --- a/libraries/src/test/java/com/baeldung/eclipsecollections/RejectPatternTest.java +++ b/libraries/src/test/java/com/baeldung/eclipsecollections/RejectPatternTest.java @@ -4,24 +4,23 @@ import org.eclipse.collections.api.list.MutableList; import org.eclipse.collections.impl.block.factory.Predicates; import org.eclipse.collections.impl.list.mutable.FastList; import static org.junit.Assert.assertEquals; + +import java.util.ArrayList; +import java.util.List; + +import org.assertj.core.api.Assertions; import org.junit.Before; import org.junit.Test; public class RejectPatternTest { MutableList list; + MutableList expectedList; @Before - public void getList() { - this.list = new FastList<>(); - list.add(1); - list.add(8); - list.add(5); - list.add(41); - list.add(31); - list.add(17); - list.add(23); - list.add(38); + public void setup() { + this.list = FastList.newListWith(1, 8, 5, 41, 31, 17, 23, 38); + this.expectedList = FastList.newListWith(1, 5, 8, 17, 23); } @Test @@ -29,10 +28,7 @@ public class RejectPatternTest { MutableList notGreaterThanThirty = list.reject(Predicates.greaterThan(30)) .sortThis(); - assertEquals(1, (int) notGreaterThanThirty.getFirst()); - assertEquals(5, (int) notGreaterThanThirty.get(1)); - assertEquals(8, (int) notGreaterThanThirty.get(2)); - assertEquals(17, (int) notGreaterThanThirty.get(3)); - assertEquals(23, (int) notGreaterThanThirty.getLast()); + Assertions.assertThat(notGreaterThanThirty) + .containsExactlyElementsOf(this.expectedList); } } diff --git a/libraries/src/test/java/com/baeldung/eclipsecollections/SelectPatternTest.java b/libraries/src/test/java/com/baeldung/eclipsecollections/SelectPatternTest.java index 20c94f6028..acd0a78840 100644 --- a/libraries/src/test/java/com/baeldung/eclipsecollections/SelectPatternTest.java +++ b/libraries/src/test/java/com/baeldung/eclipsecollections/SelectPatternTest.java @@ -4,6 +4,8 @@ import org.eclipse.collections.api.list.MutableList; import org.eclipse.collections.impl.block.factory.Predicates; import org.eclipse.collections.impl.list.mutable.FastList; import static org.junit.Assert.assertEquals; + +import org.assertj.core.api.Assertions; import org.junit.Before; import org.junit.Test; @@ -13,15 +15,7 @@ public class SelectPatternTest { @Before public void getList() { - this.list = new FastList<>(); - list.add(1); - list.add(8); - list.add(5); - list.add(41); - list.add(31); - list.add(17); - list.add(23); - list.add(38); + this.list = FastList.newListWith(1, 8, 5, 41, 31, 17, 23, 38); } @Test @@ -29,9 +23,8 @@ public class SelectPatternTest { MutableList greaterThanThirty = list.select(Predicates.greaterThan(30)) .sortThis(); - assertEquals(31, (int) greaterThanThirty.getFirst()); - assertEquals(38, (int) greaterThanThirty.get(1)); - assertEquals(41, (int) greaterThanThirty.getLast()); + Assertions.assertThat(greaterThanThirty) + .containsExactly(31, 38, 41); } @SuppressWarnings("rawtypes") @@ -45,8 +38,7 @@ public class SelectPatternTest { public void givenListwhenSelectUsingLambda_thenCorrect() { MutableList greaterThanThirty = selectUsingLambda(); - assertEquals(31, (int) greaterThanThirty.getFirst()); - assertEquals(38, (int) greaterThanThirty.get(1)); - assertEquals(41, (int) greaterThanThirty.getLast()); + Assertions.assertThat(greaterThanThirty) + .containsExactly(31, 38, 41); } } diff --git a/libraries/src/test/java/com/baeldung/eclipsecollections/ZipTest.java b/libraries/src/test/java/com/baeldung/eclipsecollections/ZipTest.java index 9dfab8f32d..56ae8d2133 100644 --- a/libraries/src/test/java/com/baeldung/eclipsecollections/ZipTest.java +++ b/libraries/src/test/java/com/baeldung/eclipsecollections/ZipTest.java @@ -5,18 +5,31 @@ import org.eclipse.collections.api.tuple.Pair; import org.eclipse.collections.impl.factory.Lists; import org.eclipse.collections.impl.tuple.Tuples; import static org.junit.Assert.assertEquals; + +import org.assertj.core.api.Assertions; +import org.junit.Before; import org.junit.Test; public class ZipTest { + MutableList> expectedPairs; + + @SuppressWarnings("unchecked") + @Before + public void setup() { + Pair pair1 = Tuples.pair("1", "Porsche"); + Pair pair2 = Tuples.pair("2", "Volvo"); + Pair pair3 = Tuples.pair("3", "Toyota"); + expectedPairs = Lists.mutable.of(pair1, pair2, pair3); + } + @Test public void whenZip_thenCorrect() { MutableList numbers = Lists.mutable.with("1", "2", "3", "Ignored"); MutableList cars = Lists.mutable.with("Porsche", "Volvo", "Toyota"); MutableList> pairs = numbers.zip(cars); - assertEquals(Tuples.pair("1", "Porsche"), pairs.get(0)); - assertEquals(Tuples.pair("2", "Volvo"), pairs.get(1)); - assertEquals(Tuples.pair("3", "Toyota"), pairs.get(2)); + Assertions.assertThat(pairs) + .containsExactlyElementsOf(this.expectedPairs); } } diff --git a/libraries/src/test/java/com/baeldung/eclipsecollections/ZipWithIndexTest.java b/libraries/src/test/java/com/baeldung/eclipsecollections/ZipWithIndexTest.java index 3e8fe9b410..d6f9846fe0 100644 --- a/libraries/src/test/java/com/baeldung/eclipsecollections/ZipWithIndexTest.java +++ b/libraries/src/test/java/com/baeldung/eclipsecollections/ZipWithIndexTest.java @@ -2,21 +2,34 @@ package com.baeldung.eclipsecollections; import static org.junit.Assert.assertEquals; +import org.assertj.core.api.Assertions; import org.eclipse.collections.api.list.MutableList; import org.eclipse.collections.api.tuple.Pair; +import org.eclipse.collections.impl.factory.Lists; import org.eclipse.collections.impl.list.mutable.FastList; import org.eclipse.collections.impl.tuple.Tuples; +import org.junit.Before; import org.junit.Test; public class ZipWithIndexTest { + MutableList> expectedPairs; + + @SuppressWarnings("unchecked") + @Before + public void setup() { + Pair pair1 = Tuples.pair("Porsche", 0); + Pair pair2 = Tuples.pair("Volvo", 1); + Pair pair3 = Tuples.pair("Toyota", 2); + expectedPairs = Lists.mutable.of(pair1, pair2, pair3); + } + @Test public void whenZip_thenCorrect() { MutableList cars = FastList.newListWith("Porsche", "Volvo", "Toyota"); MutableList> pairs = cars.zipWithIndex(); - assertEquals(Tuples.pair("Porsche", 0), pairs.get(0)); - assertEquals(Tuples.pair("Volvo", 1), pairs.get(1)); - assertEquals(Tuples.pair("Toyota", 2), pairs.get(2)); + Assertions.assertThat(pairs) + .containsExactlyElementsOf(this.expectedPairs); } } From c5433e833be6cb10e8c93fd9915131b1a17872a9 Mon Sep 17 00:00:00 2001 From: Ahmed Tawila Date: Sat, 12 Aug 2017 15:41:09 +0200 Subject: [PATCH 026/236] cleanup --- .../com/baeldung/eclipsecollections/CollectPatternTest.java | 1 - .../java/com/baeldung/eclipsecollections/FlatCollectTest.java | 1 - .../src/test/java/com/baeldung/eclipsecollections/ZipTest.java | 1 - .../java/com/baeldung/eclipsecollections/ZipWithIndexTest.java | 2 -- 4 files changed, 5 deletions(-) diff --git a/libraries/src/test/java/com/baeldung/eclipsecollections/CollectPatternTest.java b/libraries/src/test/java/com/baeldung/eclipsecollections/CollectPatternTest.java index f1c665f085..ee384c2f9d 100644 --- a/libraries/src/test/java/com/baeldung/eclipsecollections/CollectPatternTest.java +++ b/libraries/src/test/java/com/baeldung/eclipsecollections/CollectPatternTest.java @@ -2,7 +2,6 @@ package com.baeldung.eclipsecollections; import org.eclipse.collections.api.list.MutableList; import org.eclipse.collections.impl.list.mutable.FastList; -import static org.junit.Assert.assertEquals; import org.assertj.core.api.Assertions; import org.junit.Test; diff --git a/libraries/src/test/java/com/baeldung/eclipsecollections/FlatCollectTest.java b/libraries/src/test/java/com/baeldung/eclipsecollections/FlatCollectTest.java index 9190625993..021c72e91e 100644 --- a/libraries/src/test/java/com/baeldung/eclipsecollections/FlatCollectTest.java +++ b/libraries/src/test/java/com/baeldung/eclipsecollections/FlatCollectTest.java @@ -3,7 +3,6 @@ package com.baeldung.eclipsecollections; import org.assertj.core.api.Assertions; import org.eclipse.collections.api.list.MutableList; import org.eclipse.collections.impl.list.mutable.FastList; -import static org.junit.Assert.assertEquals; import java.util.ArrayList; import java.util.List; diff --git a/libraries/src/test/java/com/baeldung/eclipsecollections/ZipTest.java b/libraries/src/test/java/com/baeldung/eclipsecollections/ZipTest.java index 56ae8d2133..29f0c23954 100644 --- a/libraries/src/test/java/com/baeldung/eclipsecollections/ZipTest.java +++ b/libraries/src/test/java/com/baeldung/eclipsecollections/ZipTest.java @@ -4,7 +4,6 @@ import org.eclipse.collections.api.list.MutableList; import org.eclipse.collections.api.tuple.Pair; import org.eclipse.collections.impl.factory.Lists; import org.eclipse.collections.impl.tuple.Tuples; -import static org.junit.Assert.assertEquals; import org.assertj.core.api.Assertions; import org.junit.Before; diff --git a/libraries/src/test/java/com/baeldung/eclipsecollections/ZipWithIndexTest.java b/libraries/src/test/java/com/baeldung/eclipsecollections/ZipWithIndexTest.java index d6f9846fe0..a2d8be44ec 100644 --- a/libraries/src/test/java/com/baeldung/eclipsecollections/ZipWithIndexTest.java +++ b/libraries/src/test/java/com/baeldung/eclipsecollections/ZipWithIndexTest.java @@ -1,7 +1,5 @@ package com.baeldung.eclipsecollections; -import static org.junit.Assert.assertEquals; - import org.assertj.core.api.Assertions; import org.eclipse.collections.api.list.MutableList; import org.eclipse.collections.api.tuple.Pair; From a1b7c270dd41c5a5da60c1ad1995a603d30b7092 Mon Sep 17 00:00:00 2001 From: Ahmed Tawila Date: Sat, 12 Aug 2017 15:51:43 +0200 Subject: [PATCH 027/236] cleanup --- .../com/baeldung/eclipsecollections/DetectPatternTest.java | 4 +--- .../baeldung/eclipsecollections/ForEachPatternTest.java | 7 ++----- .../com/baeldung/eclipsecollections/LazyIterationTest.java | 5 +---- .../com/baeldung/eclipsecollections/RejectPatternTest.java | 7 +------ .../com/baeldung/eclipsecollections/SelectPatternTest.java | 4 +--- 5 files changed, 6 insertions(+), 21 deletions(-) diff --git a/libraries/src/test/java/com/baeldung/eclipsecollections/DetectPatternTest.java b/libraries/src/test/java/com/baeldung/eclipsecollections/DetectPatternTest.java index 36ebf7609d..c5b5e1c412 100644 --- a/libraries/src/test/java/com/baeldung/eclipsecollections/DetectPatternTest.java +++ b/libraries/src/test/java/com/baeldung/eclipsecollections/DetectPatternTest.java @@ -1,11 +1,9 @@ package com.baeldung.eclipsecollections; +import org.assertj.core.api.Assertions; import org.eclipse.collections.api.list.MutableList; import org.eclipse.collections.impl.block.factory.Predicates; import org.eclipse.collections.impl.list.mutable.FastList; -import static org.junit.Assert.assertEquals; - -import org.assertj.core.api.Assertions; import org.junit.Before; import org.junit.Test; diff --git a/libraries/src/test/java/com/baeldung/eclipsecollections/ForEachPatternTest.java b/libraries/src/test/java/com/baeldung/eclipsecollections/ForEachPatternTest.java index e8d93a2af6..8cea575222 100644 --- a/libraries/src/test/java/com/baeldung/eclipsecollections/ForEachPatternTest.java +++ b/libraries/src/test/java/com/baeldung/eclipsecollections/ForEachPatternTest.java @@ -1,13 +1,10 @@ package com.baeldung.eclipsecollections; -import org.eclipse.collections.api.block.procedure.Procedure; +import static org.junit.Assert.assertEquals; + import org.eclipse.collections.api.tuple.Pair; import org.eclipse.collections.impl.map.mutable.UnifiedMap; import org.eclipse.collections.impl.tuple.Tuples; -import static org.junit.Assert.assertEquals; - -import java.util.Map; - import org.junit.Test; public class ForEachPatternTest { diff --git a/libraries/src/test/java/com/baeldung/eclipsecollections/LazyIterationTest.java b/libraries/src/test/java/com/baeldung/eclipsecollections/LazyIterationTest.java index 25e119ddb4..9c216ecc87 100644 --- a/libraries/src/test/java/com/baeldung/eclipsecollections/LazyIterationTest.java +++ b/libraries/src/test/java/com/baeldung/eclipsecollections/LazyIterationTest.java @@ -1,12 +1,9 @@ package com.baeldung.eclipsecollections; +import org.assertj.core.api.Assertions; import org.eclipse.collections.api.LazyIterable; import org.eclipse.collections.api.list.MutableList; -import org.eclipse.collections.impl.block.factory.Predicates; import org.eclipse.collections.impl.factory.Lists; -import static org.junit.Assert.assertTrue; - -import org.assertj.core.api.Assertions; import org.junit.Test; public class LazyIterationTest { diff --git a/libraries/src/test/java/com/baeldung/eclipsecollections/RejectPatternTest.java b/libraries/src/test/java/com/baeldung/eclipsecollections/RejectPatternTest.java index 0dc9942cbd..1666c86333 100644 --- a/libraries/src/test/java/com/baeldung/eclipsecollections/RejectPatternTest.java +++ b/libraries/src/test/java/com/baeldung/eclipsecollections/RejectPatternTest.java @@ -1,14 +1,9 @@ package com.baeldung.eclipsecollections; +import org.assertj.core.api.Assertions; import org.eclipse.collections.api.list.MutableList; import org.eclipse.collections.impl.block.factory.Predicates; import org.eclipse.collections.impl.list.mutable.FastList; -import static org.junit.Assert.assertEquals; - -import java.util.ArrayList; -import java.util.List; - -import org.assertj.core.api.Assertions; import org.junit.Before; import org.junit.Test; diff --git a/libraries/src/test/java/com/baeldung/eclipsecollections/SelectPatternTest.java b/libraries/src/test/java/com/baeldung/eclipsecollections/SelectPatternTest.java index acd0a78840..d79c864fc5 100644 --- a/libraries/src/test/java/com/baeldung/eclipsecollections/SelectPatternTest.java +++ b/libraries/src/test/java/com/baeldung/eclipsecollections/SelectPatternTest.java @@ -1,11 +1,9 @@ package com.baeldung.eclipsecollections; +import org.assertj.core.api.Assertions; import org.eclipse.collections.api.list.MutableList; import org.eclipse.collections.impl.block.factory.Predicates; import org.eclipse.collections.impl.list.mutable.FastList; -import static org.junit.Assert.assertEquals; - -import org.assertj.core.api.Assertions; import org.junit.Before; import org.junit.Test; From 3a4cddb740638446496efc906e2d71d2b0d74c4a Mon Sep 17 00:00:00 2001 From: Dassi Orleando Date: Sat, 19 Aug 2017 20:41:55 +0100 Subject: [PATCH 028/236] Different types of bean injection in Spring --- pom.xml | 1 + spring-types-bean-injection/README.md | 3 + spring-types-bean-injection/pom.xml | 81 +++++++++++++++++++ .../java/com/baeldung/config/AppConfig.java | 25 ++++++ .../com/baeldung/service/MegaTestService.java | 22 +++++ .../baeldung/service/SuperTestService.java | 22 +++++ .../com/baeldung/service/TestService.java | 14 ++++ .../MegaTestServiceIntegrationTest.java | 32 ++++++++ .../SuperTestServiceIntegrationTest.java | 32 ++++++++ .../service/TestServiceIntegrationTest.java | 32 ++++++++ 10 files changed, 264 insertions(+) create mode 100644 spring-types-bean-injection/README.md create mode 100644 spring-types-bean-injection/pom.xml create mode 100644 spring-types-bean-injection/src/main/java/com/baeldung/config/AppConfig.java create mode 100644 spring-types-bean-injection/src/main/java/com/baeldung/service/MegaTestService.java create mode 100644 spring-types-bean-injection/src/main/java/com/baeldung/service/SuperTestService.java create mode 100644 spring-types-bean-injection/src/main/java/com/baeldung/service/TestService.java create mode 100644 spring-types-bean-injection/src/test/java/com/baeldung/service/MegaTestServiceIntegrationTest.java create mode 100644 spring-types-bean-injection/src/test/java/com/baeldung/service/SuperTestServiceIntegrationTest.java create mode 100644 spring-types-bean-injection/src/test/java/com/baeldung/service/TestServiceIntegrationTest.java diff --git a/pom.xml b/pom.xml index b76c9b8ddd..eef32f884e 100644 --- a/pom.xml +++ b/pom.xml @@ -170,6 +170,7 @@ spring-social-login spring-spel spring-thymeleaf + spring-types-bean-injection spring-userservice spring-zuul spring-reactor diff --git a/spring-types-bean-injection/README.md b/spring-types-bean-injection/README.md new file mode 100644 index 0000000000..45f8216849 --- /dev/null +++ b/spring-types-bean-injection/README.md @@ -0,0 +1,3 @@ +## Relevant articles: + +- [Constructor Dependency Injection in Spring](http://www.baeldung.com/constructor-injection-in-spring) \ No newline at end of file diff --git a/spring-types-bean-injection/pom.xml b/spring-types-bean-injection/pom.xml new file mode 100644 index 0000000000..75fee65d80 --- /dev/null +++ b/spring-types-bean-injection/pom.xml @@ -0,0 +1,81 @@ + + + 4.0.0 + + com.baeldung + spring-types-bean-injection + 0.0.1-SNAPSHOT + jar + + spring-types-bean-injection + Types of bean injection in spring + + + com.baeldung + parent-modules + 1.0.0-SNAPSHOT + + + + + org.springframework + spring-context + ${spring.version} + + + org.springframework + spring-test + ${spring.version} + test + + + junit + junit + ${junit.version} + test + + + + + + integration + + + + org.apache.maven.plugins + maven-surefire-plugin + + + integration-test + + test + + + + **/*LiveTest.java + + + **/*IntegrationTest.java + + + + + + + json + + + + + + + + + + 1.8 + 4.3.10.RELEASE + 4.12 + + + diff --git a/spring-types-bean-injection/src/main/java/com/baeldung/config/AppConfig.java b/spring-types-bean-injection/src/main/java/com/baeldung/config/AppConfig.java new file mode 100644 index 0000000000..45be32fa06 --- /dev/null +++ b/spring-types-bean-injection/src/main/java/com/baeldung/config/AppConfig.java @@ -0,0 +1,25 @@ +package com.baeldung.config; + +import com.baeldung.service.MegaTestService; +import com.baeldung.service.SuperTestService; +import com.baeldung.service.TestService; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +@Configuration +public class AppConfig { + @Bean + public TestService TestService() { + return new TestService(); + } + + @Bean + public SuperTestService SuperTestService() { + return new SuperTestService(new TestService()); + } + + @Bean + public MegaTestService MegaTestService() { + return new MegaTestService(); + } +} diff --git a/spring-types-bean-injection/src/main/java/com/baeldung/service/MegaTestService.java b/spring-types-bean-injection/src/main/java/com/baeldung/service/MegaTestService.java new file mode 100644 index 0000000000..45deeb8592 --- /dev/null +++ b/spring-types-bean-injection/src/main/java/com/baeldung/service/MegaTestService.java @@ -0,0 +1,22 @@ +package com.baeldung.service; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +@Service +public class MegaTestService { + private TestService testService; + + @Autowired + public void setTestService(TestService testService) { + this.testService = testService; + } + + public String getMegaTestOne() { + return "Mega" + testService.getTestOne(); + } + + public String getMegaTestTwo() { + return "Mega" + testService.getTestTwo(); + } +} diff --git a/spring-types-bean-injection/src/main/java/com/baeldung/service/SuperTestService.java b/spring-types-bean-injection/src/main/java/com/baeldung/service/SuperTestService.java new file mode 100644 index 0000000000..edf1f2b1c5 --- /dev/null +++ b/spring-types-bean-injection/src/main/java/com/baeldung/service/SuperTestService.java @@ -0,0 +1,22 @@ +package com.baeldung.service; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +@Service +public class SuperTestService { + private TestService testService; + + @Autowired + public SuperTestService(TestService testService) { + this.testService = testService; + } + + public String getSuperTestOne() { + return "Super" + testService.getTestOne(); + } + + public String getSuperTestTwo() { + return "Super" + testService.getTestTwo(); + } +} diff --git a/spring-types-bean-injection/src/main/java/com/baeldung/service/TestService.java b/spring-types-bean-injection/src/main/java/com/baeldung/service/TestService.java new file mode 100644 index 0000000000..3e7c327dbd --- /dev/null +++ b/spring-types-bean-injection/src/main/java/com/baeldung/service/TestService.java @@ -0,0 +1,14 @@ +package com.baeldung.service; + +import org.springframework.stereotype.Service; + +@Service +public class TestService { + public String getTestOne() { + return "TestOne"; + } + + public String getTestTwo() { + return "TestTwo"; + } +} diff --git a/spring-types-bean-injection/src/test/java/com/baeldung/service/MegaTestServiceIntegrationTest.java b/spring-types-bean-injection/src/test/java/com/baeldung/service/MegaTestServiceIntegrationTest.java new file mode 100644 index 0000000000..ced897c70c --- /dev/null +++ b/spring-types-bean-injection/src/test/java/com/baeldung/service/MegaTestServiceIntegrationTest.java @@ -0,0 +1,32 @@ +package com.baeldung.service; + +import com.baeldung.config.AppConfig; +import org.junit.Assert; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.test.context.ContextConfiguration; +import org.springframework.test.context.junit4.SpringRunner; + +import static org.hamcrest.CoreMatchers.is; + +@RunWith(SpringRunner.class) +@ContextConfiguration(classes = {AppConfig.class}) +public class MegaTestServiceIntegrationTest { + @Autowired + MegaTestService megaTestService; + + @Test + public void whenCallingGetMegaTestOne_thenWeGetMegaTestOneString() { + String resultOne = megaTestService.getMegaTestOne(); + + Assert.assertThat(resultOne, is("MegaTestOne")); + } + + @Test + public void whenCallingGetMegaTestTwo_thenWeGetMegaTestTwoString() { + String resultTwo = megaTestService.getMegaTestTwo(); + + Assert.assertThat(resultTwo, is("MegaTestTwo")); + } +} diff --git a/spring-types-bean-injection/src/test/java/com/baeldung/service/SuperTestServiceIntegrationTest.java b/spring-types-bean-injection/src/test/java/com/baeldung/service/SuperTestServiceIntegrationTest.java new file mode 100644 index 0000000000..a037d70c40 --- /dev/null +++ b/spring-types-bean-injection/src/test/java/com/baeldung/service/SuperTestServiceIntegrationTest.java @@ -0,0 +1,32 @@ +package com.baeldung.service; + +import com.baeldung.config.AppConfig; +import org.junit.Assert; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.test.context.ContextConfiguration; +import org.springframework.test.context.junit4.SpringRunner; + +import static org.hamcrest.CoreMatchers.is; + +@RunWith(SpringRunner.class) +@ContextConfiguration(classes = {AppConfig.class}) +public class SuperTestServiceIntegrationTest { + @Autowired + SuperTestService superTestService; + + @Test + public void whenCallingGetSuperTestOne_thenWeGetSuperTestOneString() { + String resultOne = superTestService.getSuperTestOne(); + + Assert.assertThat(resultOne, is("SuperTestOne")); + } + + @Test + public void whenCallingGetSuperTestTwo_thenWeGetSuperTestTwoString() { + String resultTwo = superTestService.getSuperTestTwo(); + + Assert.assertThat(resultTwo, is("SuperTestTwo")); + } +} diff --git a/spring-types-bean-injection/src/test/java/com/baeldung/service/TestServiceIntegrationTest.java b/spring-types-bean-injection/src/test/java/com/baeldung/service/TestServiceIntegrationTest.java new file mode 100644 index 0000000000..2059e87e04 --- /dev/null +++ b/spring-types-bean-injection/src/test/java/com/baeldung/service/TestServiceIntegrationTest.java @@ -0,0 +1,32 @@ +package com.baeldung.service; + +import com.baeldung.config.AppConfig; +import org.junit.Assert; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.test.context.ContextConfiguration; +import org.springframework.test.context.junit4.SpringRunner; + +import static org.hamcrest.CoreMatchers.is; + +@RunWith(SpringRunner.class) +@ContextConfiguration(classes = { AppConfig.class }) +public class TestServiceIntegrationTest { + @Autowired + TestService testService; + + @Test + public void whenCallingGetTestOne_thenWeGetTestOneString() { + String resultOne = testService.getTestOne(); + + Assert.assertThat(resultOne, is("TestOne")); + } + + @Test + public void whenCallingGetTestTwo_thenWeGetTestTwoString() { + String resultTwo = testService.getTestTwo(); + + Assert.assertThat(resultTwo, is("TestTwo")); + } +} \ No newline at end of file From 28bb7fc8d3ed564e3260d339a830797d09b7bb51 Mon Sep 17 00:00:00 2001 From: Dassi Orleando Date: Thu, 24 Aug 2017 21:04:23 +0100 Subject: [PATCH 029/236] Difference between two dates in java --- java-difference-date/README.md | 3 + java-difference-date/pom.xml | 58 ++++++++++++++++++ .../src/main/java/com/baeldung/DateDiff.java | 30 ++++++++++ .../test/java/com/baeldung/DateDiffTest.java | 60 +++++++++++++++++++ pom.xml | 1 + 5 files changed, 152 insertions(+) create mode 100644 java-difference-date/README.md create mode 100644 java-difference-date/pom.xml create mode 100644 java-difference-date/src/main/java/com/baeldung/DateDiff.java create mode 100644 java-difference-date/src/test/java/com/baeldung/DateDiffTest.java diff --git a/java-difference-date/README.md b/java-difference-date/README.md new file mode 100644 index 0000000000..45f8216849 --- /dev/null +++ b/java-difference-date/README.md @@ -0,0 +1,3 @@ +## Relevant articles: + +- [Constructor Dependency Injection in Spring](http://www.baeldung.com/constructor-injection-in-spring) \ No newline at end of file diff --git a/java-difference-date/pom.xml b/java-difference-date/pom.xml new file mode 100644 index 0000000000..388753de90 --- /dev/null +++ b/java-difference-date/pom.xml @@ -0,0 +1,58 @@ + + + 4.0.0 + + com.baeldung + java-difference-date + 0.0.1-SNAPSHOT + jar + + java-difference-date + Difference between two dates in java + + + com.baeldung + parent-modules + 1.0.0-SNAPSHOT + + + + + joda-time + joda-time + ${joda-time.version} + + + com.darwinsys + hirondelle-date4j + ${hirondelle-date4j.version} + + + junit + junit + ${junit.version} + test + + + + + + + org.apache.maven.plugins + maven-compiler-plugin + + 1.8 + 1.8 + + + + + + + 1.8 + 4.12 + 2.9.9 + 1.5.1 + + diff --git a/java-difference-date/src/main/java/com/baeldung/DateDiff.java b/java-difference-date/src/main/java/com/baeldung/DateDiff.java new file mode 100644 index 0000000000..08fc02fab7 --- /dev/null +++ b/java-difference-date/src/main/java/com/baeldung/DateDiff.java @@ -0,0 +1,30 @@ +package com.baeldung; + +import org.joda.time.DateTime; + +import java.time.Duration; +import java.time.ZonedDateTime; +import java.util.Date; +import java.util.concurrent.TimeUnit; + +public class DateDiff { + public long beforeJava8diff(Date firstDate, Date secondDate){ + long diffInMillies = Math.abs(secondDate.getTime() - firstDate.getTime()); + return TimeUnit.DAYS.convert(diffInMillies, TimeUnit.MILLISECONDS); + } + + public long fromJava8Diff(ZonedDateTime firstDate, ZonedDateTime secondDate){ + Duration duration = Duration.between(firstDate, secondDate); + return Math.abs(duration.toDays()); + } + + public long fromJodaTime(DateTime firstDate, DateTime secondDate){ + org.joda.time.Duration duration = new org.joda.time.Duration(firstDate, secondDate); + return Math.abs(duration.getStandardDays()); + } + + public long fromDate4j(hirondelle.date4j.DateTime firstDate, hirondelle.date4j.DateTime secondDate){ + long diff = firstDate.numDaysFrom(secondDate); + return Math.abs(diff); + } +} \ No newline at end of file diff --git a/java-difference-date/src/test/java/com/baeldung/DateDiffTest.java b/java-difference-date/src/test/java/com/baeldung/DateDiffTest.java new file mode 100644 index 0000000000..fe2b507cf3 --- /dev/null +++ b/java-difference-date/src/test/java/com/baeldung/DateDiffTest.java @@ -0,0 +1,60 @@ +package com.baeldung; + +import org.joda.time.DateTime; +import org.junit.Test; + +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.time.ZonedDateTime; +import java.util.Date; +import java.util.Locale; +import java.util.TimeZone; + +import static org.junit.Assert.assertEquals; + +public class DateDiffTest { + @Test + public void givenTwoDatesBeforeJava8SeparatedBySixDays_whenCallingDiffOnThem_thenWeGetSix() throws ParseException { + SimpleDateFormat sdf = new SimpleDateFormat("MM/dd/yyyy", Locale.ENGLISH); + Date firstDate = sdf.parse("06/24/2017"); + Date secondDate = sdf.parse("06/30/2017"); + + DateDiff dateDiff = new DateDiff(); + long diff = dateDiff.beforeJava8diff(firstDate, secondDate); + + assertEquals(diff, 6); + } + + @Test + public void givenTheCurrentDateAndSixDaysBehindInJava8_whenCallingDiffOnThem_thenWeGetSix() { + ZonedDateTime now = ZonedDateTime.now(); + ZonedDateTime sixDaysBehind = now.minusDays(6); + + DateDiff dateDiff = new DateDiff(); + long diff = dateDiff.fromJava8Diff(now, sixDaysBehind); + + assertEquals(diff, 6); + } + + @Test + public void givenTheCurrentDateAndSixDaysBehindInJodaTime_whenCallingDiffOnThem_thenWeGetSix() { + DateTime now = DateTime.now(); + DateTime sixDaysBehind = now.minusDays(6); + + DateDiff dateDiff = new DateDiff(); + long diff = dateDiff.fromJodaTime(now, sixDaysBehind); + + assertEquals(diff, 6); + } + + @Test + public void givenTheCurrentDateAndSixDaysBehindInDate4j_whenCallingDiffOnThem_thenWeGetSix() { + hirondelle.date4j.DateTime now = hirondelle.date4j.DateTime.now(TimeZone.getDefault()); + hirondelle.date4j.DateTime sixDaysBehind = now.minusDays(6); + + DateDiff dateDiff = new DateDiff(); + long diff = dateDiff.fromDate4j(now, sixDaysBehind); + + assertEquals(diff, 6); + } +} \ No newline at end of file diff --git a/pom.xml b/pom.xml index eef32f884e..d2d9ae3987 100644 --- a/pom.xml +++ b/pom.xml @@ -55,6 +55,7 @@ immutables jackson + java-difference-date java-cassandra javaslang javax-servlets From 348ff5d403c3ebae00ea8ef7e5a681d1cdb5cb03 Mon Sep 17 00:00:00 2001 From: Dassi Orleando Date: Thu, 24 Aug 2017 21:36:52 +0100 Subject: [PATCH 030/236] Update README.md --- java-difference-date/README.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/java-difference-date/README.md b/java-difference-date/README.md index 45f8216849..2a024c27a2 100644 --- a/java-difference-date/README.md +++ b/java-difference-date/README.md @@ -1,3 +1,5 @@ ## Relevant articles: -- [Constructor Dependency Injection in Spring](http://www.baeldung.com/constructor-injection-in-spring) \ No newline at end of file +- [Period and Duration in Java](http://www.baeldung.com/java-period-duration) +- [Introduction to the Java 8 Date/Time API](http://www.baeldung.com/java-8-date-time-intro) +- [Migrating to the New Java 8 Date Time API](http://www.baeldung.com/migrating-to-java-8-date-time-api) \ No newline at end of file From a663b3ccde9fdbab1c8d2f8f3e0d13d11294b0d8 Mon Sep 17 00:00:00 2001 From: Dassi Orleando Date: Fri, 25 Aug 2017 09:46:35 +0100 Subject: [PATCH 031/236] Simple clean of difference between dates --- core-java/README.md | 3 + core-java/pom.xml | 14 ++++- .../java/com/baeldung/DateDiffUnitTest.java | 63 +++++++++++++++++++ .../src/main/java/com/baeldung/DateDiff.java | 30 --------- .../test/java/com/baeldung/DateDiffTest.java | 25 ++++---- pom.xml | 1 - 6 files changed, 92 insertions(+), 44 deletions(-) create mode 100644 core-java/src/test/java/com/baeldung/DateDiffUnitTest.java delete mode 100644 java-difference-date/src/main/java/com/baeldung/DateDiff.java diff --git a/core-java/README.md b/core-java/README.md index dabf6f39be..a4b5127e98 100644 --- a/core-java/README.md +++ b/core-java/README.md @@ -141,3 +141,6 @@ - [Guide to UUID in Java](http://www.baeldung.com/java-uuid) - [How to Get the Last Element of a Stream in Java?](http://www.baeldung.com/java-stream-last-element) - [Guide to Escaping Characters in Java RegExps](http://www.baeldung.com/java-regexp-escape-char) +- [Period and Duration in Java](http://www.baeldung.com/java-period-duration) +- [Introduction to the Java 8 Date/Time API](http://www.baeldung.com/java-8-date-time-intro) +- [Migrating to the New Java 8 Date Time API](http://www.baeldung.com/migrating-to-java-8-date-time-api) diff --git a/core-java/pom.xml b/core-java/pom.xml index 422965a0ed..586486027a 100644 --- a/core-java/pom.xml +++ b/core-java/pom.xml @@ -186,6 +186,16 @@ fscontext ${fscontext.version} + + joda-time + joda-time + ${joda-time.version} + + + com.darwinsys + hirondelle-date4j + ${hirondelle-date4j.version} + @@ -408,6 +418,8 @@ 1.8.7 1.16.12 4.6-b01 + 2.9.9 + 1.5.1 1.3 @@ -416,9 +428,9 @@ 3.6.1 1.7.0 + 3.6.0 2.19.1 - diff --git a/core-java/src/test/java/com/baeldung/DateDiffUnitTest.java b/core-java/src/test/java/com/baeldung/DateDiffUnitTest.java new file mode 100644 index 0000000000..40b7fac30d --- /dev/null +++ b/core-java/src/test/java/com/baeldung/DateDiffUnitTest.java @@ -0,0 +1,63 @@ +package com.baeldung; + +import org.joda.time.DateTime; +import org.junit.Test; + +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.time.Duration; +import java.time.ZonedDateTime; +import java.util.Date; +import java.util.Locale; +import java.util.TimeZone; +import java.util.concurrent.TimeUnit; + +import static org.junit.Assert.assertEquals; + +public class DateDiffUnitTest { + + @Test + public void givenTwoDatesBeforeJava8_whenDifferentiating_thenWeGetSix() throws ParseException { + SimpleDateFormat sdf = new SimpleDateFormat("MM/dd/yyyy", Locale.ENGLISH); + Date firstDate = sdf.parse("06/24/2017"); + Date secondDate = sdf.parse("06/30/2017"); + + long diffInMillies = Math.abs(secondDate.getTime() - firstDate.getTime()); + long diff = TimeUnit.DAYS.convert(diffInMillies, TimeUnit.MILLISECONDS); + + assertEquals(diff, 6); + } + + @Test + public void givenTwoDatesInJava8_whenDifferentiating_thenWeGetSix() { + ZonedDateTime now = ZonedDateTime.now(); + ZonedDateTime sixDaysBehind = now.minusDays(6); + + Duration duration = Duration.between(now, sixDaysBehind); + long diff = Math.abs(duration.toDays()); + + assertEquals(diff, 6); + } + + @Test + public void givenTwoDatesInJodaTime_whenDifferentiating_thenWeGetSix() { + DateTime now = DateTime.now(); + DateTime sixDaysBehind = now.minusDays(6); + + org.joda.time.Duration duration = new org.joda.time.Duration(now, sixDaysBehind); + long diff = Math.abs(duration.getStandardDays()); + + assertEquals(diff, 6); + } + + @Test + public void givenTwoDatesInDate4j_whenDifferentiating_thenWeGetSix() { + hirondelle.date4j.DateTime now = hirondelle.date4j.DateTime.now(TimeZone.getDefault()); + hirondelle.date4j.DateTime sixDaysBehind = now.minusDays(6); + + long diff = Math.abs(now.numDaysFrom(sixDaysBehind)); + + assertEquals(diff, 6); + } + +} \ No newline at end of file diff --git a/java-difference-date/src/main/java/com/baeldung/DateDiff.java b/java-difference-date/src/main/java/com/baeldung/DateDiff.java deleted file mode 100644 index 08fc02fab7..0000000000 --- a/java-difference-date/src/main/java/com/baeldung/DateDiff.java +++ /dev/null @@ -1,30 +0,0 @@ -package com.baeldung; - -import org.joda.time.DateTime; - -import java.time.Duration; -import java.time.ZonedDateTime; -import java.util.Date; -import java.util.concurrent.TimeUnit; - -public class DateDiff { - public long beforeJava8diff(Date firstDate, Date secondDate){ - long diffInMillies = Math.abs(secondDate.getTime() - firstDate.getTime()); - return TimeUnit.DAYS.convert(diffInMillies, TimeUnit.MILLISECONDS); - } - - public long fromJava8Diff(ZonedDateTime firstDate, ZonedDateTime secondDate){ - Duration duration = Duration.between(firstDate, secondDate); - return Math.abs(duration.toDays()); - } - - public long fromJodaTime(DateTime firstDate, DateTime secondDate){ - org.joda.time.Duration duration = new org.joda.time.Duration(firstDate, secondDate); - return Math.abs(duration.getStandardDays()); - } - - public long fromDate4j(hirondelle.date4j.DateTime firstDate, hirondelle.date4j.DateTime secondDate){ - long diff = firstDate.numDaysFrom(secondDate); - return Math.abs(diff); - } -} \ No newline at end of file diff --git a/java-difference-date/src/test/java/com/baeldung/DateDiffTest.java b/java-difference-date/src/test/java/com/baeldung/DateDiffTest.java index fe2b507cf3..4203f7ef38 100644 --- a/java-difference-date/src/test/java/com/baeldung/DateDiffTest.java +++ b/java-difference-date/src/test/java/com/baeldung/DateDiffTest.java @@ -5,55 +5,56 @@ import org.junit.Test; import java.text.ParseException; import java.text.SimpleDateFormat; +import java.time.Duration; import java.time.ZonedDateTime; import java.util.Date; import java.util.Locale; import java.util.TimeZone; +import java.util.concurrent.TimeUnit; import static org.junit.Assert.assertEquals; public class DateDiffTest { @Test - public void givenTwoDatesBeforeJava8SeparatedBySixDays_whenCallingDiffOnThem_thenWeGetSix() throws ParseException { + public void givenTwoDatesBeforeJava8_whenDifferentiating_thenWeGetSix() throws ParseException { SimpleDateFormat sdf = new SimpleDateFormat("MM/dd/yyyy", Locale.ENGLISH); Date firstDate = sdf.parse("06/24/2017"); Date secondDate = sdf.parse("06/30/2017"); - DateDiff dateDiff = new DateDiff(); - long diff = dateDiff.beforeJava8diff(firstDate, secondDate); + long diffInMillies = Math.abs(secondDate.getTime() - firstDate.getTime()); + long diff = TimeUnit.DAYS.convert(diffInMillies, TimeUnit.MILLISECONDS); assertEquals(diff, 6); } @Test - public void givenTheCurrentDateAndSixDaysBehindInJava8_whenCallingDiffOnThem_thenWeGetSix() { + public void givenTwoDatesInJava8_whenDifferentiating_thenWeGetSix() { ZonedDateTime now = ZonedDateTime.now(); ZonedDateTime sixDaysBehind = now.minusDays(6); - DateDiff dateDiff = new DateDiff(); - long diff = dateDiff.fromJava8Diff(now, sixDaysBehind); + Duration duration = Duration.between(now, sixDaysBehind); + long diff = Math.abs(duration.toDays()); assertEquals(diff, 6); } @Test - public void givenTheCurrentDateAndSixDaysBehindInJodaTime_whenCallingDiffOnThem_thenWeGetSix() { + public void givenTwoDatesInJodaTime_whenDifferentiating_thenWeGetSix() { DateTime now = DateTime.now(); DateTime sixDaysBehind = now.minusDays(6); - DateDiff dateDiff = new DateDiff(); - long diff = dateDiff.fromJodaTime(now, sixDaysBehind); + org.joda.time.Duration duration = new org.joda.time.Duration(now, sixDaysBehind); + long diff = Math.abs(duration.getStandardDays()); assertEquals(diff, 6); } @Test - public void givenTheCurrentDateAndSixDaysBehindInDate4j_whenCallingDiffOnThem_thenWeGetSix() { + public void givenTwoDatesInDate4j_whenDifferentiating_thenWeGetSix() { hirondelle.date4j.DateTime now = hirondelle.date4j.DateTime.now(TimeZone.getDefault()); hirondelle.date4j.DateTime sixDaysBehind = now.minusDays(6); - DateDiff dateDiff = new DateDiff(); - long diff = dateDiff.fromDate4j(now, sixDaysBehind); + long diff = Math.abs(now.numDaysFrom(sixDaysBehind)); assertEquals(diff, 6); } diff --git a/pom.xml b/pom.xml index 40e7fda4a3..b5dee350ca 100644 --- a/pom.xml +++ b/pom.xml @@ -76,7 +76,6 @@ immutables jackson - java-difference-date vavr javax-servlets From 4f827b93ed171cfa26035d8a9e7897489111abed Mon Sep 17 00:00:00 2001 From: Dassi Orleando Date: Fri, 25 Aug 2017 12:36:28 +0100 Subject: [PATCH 032/236] Clean my test article --- pom.xml | 1 - spring-types-bean-injection/README.md | 3 - spring-types-bean-injection/pom.xml | 81 ------------------- .../java/com/baeldung/config/AppConfig.java | 25 ------ .../com/baeldung/service/MegaTestService.java | 22 ----- .../baeldung/service/SuperTestService.java | 22 ----- .../com/baeldung/service/TestService.java | 14 ---- .../MegaTestServiceIntegrationTest.java | 32 -------- .../SuperTestServiceIntegrationTest.java | 32 -------- .../service/TestServiceIntegrationTest.java | 32 -------- 10 files changed, 264 deletions(-) delete mode 100644 spring-types-bean-injection/README.md delete mode 100644 spring-types-bean-injection/pom.xml delete mode 100644 spring-types-bean-injection/src/main/java/com/baeldung/config/AppConfig.java delete mode 100644 spring-types-bean-injection/src/main/java/com/baeldung/service/MegaTestService.java delete mode 100644 spring-types-bean-injection/src/main/java/com/baeldung/service/SuperTestService.java delete mode 100644 spring-types-bean-injection/src/main/java/com/baeldung/service/TestService.java delete mode 100644 spring-types-bean-injection/src/test/java/com/baeldung/service/MegaTestServiceIntegrationTest.java delete mode 100644 spring-types-bean-injection/src/test/java/com/baeldung/service/SuperTestServiceIntegrationTest.java delete mode 100644 spring-types-bean-injection/src/test/java/com/baeldung/service/TestServiceIntegrationTest.java diff --git a/pom.xml b/pom.xml index b5dee350ca..f2dd0ae48c 100644 --- a/pom.xml +++ b/pom.xml @@ -212,7 +212,6 @@ spring-spel spring-state-machine spring-thymeleaf - spring-types-bean-injection spring-userservice spring-zuul spring-reactor diff --git a/spring-types-bean-injection/README.md b/spring-types-bean-injection/README.md deleted file mode 100644 index 45f8216849..0000000000 --- a/spring-types-bean-injection/README.md +++ /dev/null @@ -1,3 +0,0 @@ -## Relevant articles: - -- [Constructor Dependency Injection in Spring](http://www.baeldung.com/constructor-injection-in-spring) \ No newline at end of file diff --git a/spring-types-bean-injection/pom.xml b/spring-types-bean-injection/pom.xml deleted file mode 100644 index 75fee65d80..0000000000 --- a/spring-types-bean-injection/pom.xml +++ /dev/null @@ -1,81 +0,0 @@ - - - 4.0.0 - - com.baeldung - spring-types-bean-injection - 0.0.1-SNAPSHOT - jar - - spring-types-bean-injection - Types of bean injection in spring - - - com.baeldung - parent-modules - 1.0.0-SNAPSHOT - - - - - org.springframework - spring-context - ${spring.version} - - - org.springframework - spring-test - ${spring.version} - test - - - junit - junit - ${junit.version} - test - - - - - - integration - - - - org.apache.maven.plugins - maven-surefire-plugin - - - integration-test - - test - - - - **/*LiveTest.java - - - **/*IntegrationTest.java - - - - - - - json - - - - - - - - - - 1.8 - 4.3.10.RELEASE - 4.12 - - - diff --git a/spring-types-bean-injection/src/main/java/com/baeldung/config/AppConfig.java b/spring-types-bean-injection/src/main/java/com/baeldung/config/AppConfig.java deleted file mode 100644 index 45be32fa06..0000000000 --- a/spring-types-bean-injection/src/main/java/com/baeldung/config/AppConfig.java +++ /dev/null @@ -1,25 +0,0 @@ -package com.baeldung.config; - -import com.baeldung.service.MegaTestService; -import com.baeldung.service.SuperTestService; -import com.baeldung.service.TestService; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; - -@Configuration -public class AppConfig { - @Bean - public TestService TestService() { - return new TestService(); - } - - @Bean - public SuperTestService SuperTestService() { - return new SuperTestService(new TestService()); - } - - @Bean - public MegaTestService MegaTestService() { - return new MegaTestService(); - } -} diff --git a/spring-types-bean-injection/src/main/java/com/baeldung/service/MegaTestService.java b/spring-types-bean-injection/src/main/java/com/baeldung/service/MegaTestService.java deleted file mode 100644 index 45deeb8592..0000000000 --- a/spring-types-bean-injection/src/main/java/com/baeldung/service/MegaTestService.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.baeldung.service; - -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Service; - -@Service -public class MegaTestService { - private TestService testService; - - @Autowired - public void setTestService(TestService testService) { - this.testService = testService; - } - - public String getMegaTestOne() { - return "Mega" + testService.getTestOne(); - } - - public String getMegaTestTwo() { - return "Mega" + testService.getTestTwo(); - } -} diff --git a/spring-types-bean-injection/src/main/java/com/baeldung/service/SuperTestService.java b/spring-types-bean-injection/src/main/java/com/baeldung/service/SuperTestService.java deleted file mode 100644 index edf1f2b1c5..0000000000 --- a/spring-types-bean-injection/src/main/java/com/baeldung/service/SuperTestService.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.baeldung.service; - -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Service; - -@Service -public class SuperTestService { - private TestService testService; - - @Autowired - public SuperTestService(TestService testService) { - this.testService = testService; - } - - public String getSuperTestOne() { - return "Super" + testService.getTestOne(); - } - - public String getSuperTestTwo() { - return "Super" + testService.getTestTwo(); - } -} diff --git a/spring-types-bean-injection/src/main/java/com/baeldung/service/TestService.java b/spring-types-bean-injection/src/main/java/com/baeldung/service/TestService.java deleted file mode 100644 index 3e7c327dbd..0000000000 --- a/spring-types-bean-injection/src/main/java/com/baeldung/service/TestService.java +++ /dev/null @@ -1,14 +0,0 @@ -package com.baeldung.service; - -import org.springframework.stereotype.Service; - -@Service -public class TestService { - public String getTestOne() { - return "TestOne"; - } - - public String getTestTwo() { - return "TestTwo"; - } -} diff --git a/spring-types-bean-injection/src/test/java/com/baeldung/service/MegaTestServiceIntegrationTest.java b/spring-types-bean-injection/src/test/java/com/baeldung/service/MegaTestServiceIntegrationTest.java deleted file mode 100644 index ced897c70c..0000000000 --- a/spring-types-bean-injection/src/test/java/com/baeldung/service/MegaTestServiceIntegrationTest.java +++ /dev/null @@ -1,32 +0,0 @@ -package com.baeldung.service; - -import com.baeldung.config.AppConfig; -import org.junit.Assert; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.test.context.ContextConfiguration; -import org.springframework.test.context.junit4.SpringRunner; - -import static org.hamcrest.CoreMatchers.is; - -@RunWith(SpringRunner.class) -@ContextConfiguration(classes = {AppConfig.class}) -public class MegaTestServiceIntegrationTest { - @Autowired - MegaTestService megaTestService; - - @Test - public void whenCallingGetMegaTestOne_thenWeGetMegaTestOneString() { - String resultOne = megaTestService.getMegaTestOne(); - - Assert.assertThat(resultOne, is("MegaTestOne")); - } - - @Test - public void whenCallingGetMegaTestTwo_thenWeGetMegaTestTwoString() { - String resultTwo = megaTestService.getMegaTestTwo(); - - Assert.assertThat(resultTwo, is("MegaTestTwo")); - } -} diff --git a/spring-types-bean-injection/src/test/java/com/baeldung/service/SuperTestServiceIntegrationTest.java b/spring-types-bean-injection/src/test/java/com/baeldung/service/SuperTestServiceIntegrationTest.java deleted file mode 100644 index a037d70c40..0000000000 --- a/spring-types-bean-injection/src/test/java/com/baeldung/service/SuperTestServiceIntegrationTest.java +++ /dev/null @@ -1,32 +0,0 @@ -package com.baeldung.service; - -import com.baeldung.config.AppConfig; -import org.junit.Assert; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.test.context.ContextConfiguration; -import org.springframework.test.context.junit4.SpringRunner; - -import static org.hamcrest.CoreMatchers.is; - -@RunWith(SpringRunner.class) -@ContextConfiguration(classes = {AppConfig.class}) -public class SuperTestServiceIntegrationTest { - @Autowired - SuperTestService superTestService; - - @Test - public void whenCallingGetSuperTestOne_thenWeGetSuperTestOneString() { - String resultOne = superTestService.getSuperTestOne(); - - Assert.assertThat(resultOne, is("SuperTestOne")); - } - - @Test - public void whenCallingGetSuperTestTwo_thenWeGetSuperTestTwoString() { - String resultTwo = superTestService.getSuperTestTwo(); - - Assert.assertThat(resultTwo, is("SuperTestTwo")); - } -} diff --git a/spring-types-bean-injection/src/test/java/com/baeldung/service/TestServiceIntegrationTest.java b/spring-types-bean-injection/src/test/java/com/baeldung/service/TestServiceIntegrationTest.java deleted file mode 100644 index 2059e87e04..0000000000 --- a/spring-types-bean-injection/src/test/java/com/baeldung/service/TestServiceIntegrationTest.java +++ /dev/null @@ -1,32 +0,0 @@ -package com.baeldung.service; - -import com.baeldung.config.AppConfig; -import org.junit.Assert; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.test.context.ContextConfiguration; -import org.springframework.test.context.junit4.SpringRunner; - -import static org.hamcrest.CoreMatchers.is; - -@RunWith(SpringRunner.class) -@ContextConfiguration(classes = { AppConfig.class }) -public class TestServiceIntegrationTest { - @Autowired - TestService testService; - - @Test - public void whenCallingGetTestOne_thenWeGetTestOneString() { - String resultOne = testService.getTestOne(); - - Assert.assertThat(resultOne, is("TestOne")); - } - - @Test - public void whenCallingGetTestTwo_thenWeGetTestTwoString() { - String resultTwo = testService.getTestTwo(); - - Assert.assertThat(resultTwo, is("TestTwo")); - } -} \ No newline at end of file From c4fd005da4d41ea4efffecb8a0ac7b1a93d6cc8f Mon Sep 17 00:00:00 2001 From: Dassi Orleando Date: Mon, 28 Aug 2017 05:23:07 +0100 Subject: [PATCH 033/236] Improve dates diff: for dates and datetimes --- .../java/com/baeldung/DateDiffUnitTest.java | 40 +++++++++++++++---- 1 file changed, 32 insertions(+), 8 deletions(-) diff --git a/core-java/src/test/java/com/baeldung/DateDiffUnitTest.java b/core-java/src/test/java/com/baeldung/DateDiffUnitTest.java index 40b7fac30d..ae9bae0050 100644 --- a/core-java/src/test/java/com/baeldung/DateDiffUnitTest.java +++ b/core-java/src/test/java/com/baeldung/DateDiffUnitTest.java @@ -1,12 +1,14 @@ package com.baeldung; import org.joda.time.DateTime; +import org.joda.time.Interval; import org.junit.Test; import java.text.ParseException; import java.text.SimpleDateFormat; import java.time.Duration; -import java.time.ZonedDateTime; +import java.time.LocalDate; +import java.time.LocalDateTime; import java.util.Date; import java.util.Locale; import java.util.TimeZone; @@ -30,8 +32,8 @@ public class DateDiffUnitTest { @Test public void givenTwoDatesInJava8_whenDifferentiating_thenWeGetSix() { - ZonedDateTime now = ZonedDateTime.now(); - ZonedDateTime sixDaysBehind = now.minusDays(6); + LocalDate now = LocalDate.now(); + LocalDate sixDaysBehind = now.minusDays(6); Duration duration = Duration.between(now, sixDaysBehind); long diff = Math.abs(duration.toDays()); @@ -40,12 +42,34 @@ public class DateDiffUnitTest { } @Test - public void givenTwoDatesInJodaTime_whenDifferentiating_thenWeGetSix() { - DateTime now = DateTime.now(); - DateTime sixDaysBehind = now.minusDays(6); + public void givenTwoDateTimesInJava8_whenDifferentiating_thenWeGetSix() { + LocalDateTime now = LocalDateTime.now(); + LocalDateTime sixMinutesBehind = now.minusMinutes(6); - org.joda.time.Duration duration = new org.joda.time.Duration(now, sixDaysBehind); - long diff = Math.abs(duration.getStandardDays()); + Duration duration = Duration.between(now, sixMinutesBehind); + long diff = Math.abs(duration.toMinutes()); + + assertEquals(diff, 6); + } + + @Test + public void givenTwoDatesInJodaTime_whenDifferentiating_thenWeGetSix() { + org.joda.time.LocalDate now = org.joda.time.LocalDate.now(); + org.joda.time.LocalDate sixDaysBehind = now.minusDays(6); + + org.joda.time.Period period = new org.joda.time.Period(now, sixDaysBehind); + long diff = Math.abs(period.getDays()); + + assertEquals(diff, 6); + } + + @Test + public void givenTwoDateTimesInJodaTime_whenDifferentiating_thenWeGetSix() { + org.joda.time.LocalDateTime now = org.joda.time.LocalDateTime.now(); + org.joda.time.LocalDateTime sixMinutesBehind = now.minusMinutes(6); + + org.joda.time.Period period = new org.joda.time.Period(now, sixMinutesBehind); + long diff = Math.abs(period.getDays()); assertEquals(diff, 6); } From 89d89e6dcef7df1a291394cb501ab46cd246f57a Mon Sep 17 00:00:00 2001 From: Parth Karia Date: Fri, 11 Aug 2017 15:25:43 +0530 Subject: [PATCH 034/236] BAEL-243 Spring Batch using Partitioner --- .../CustomMultiResourcePartitioner.java | 77 ++++++++ .../SpringbatchPartitionConfig.java | 169 ++++++++++++++++++ .../SpringbatchPartitionerApp.java | 28 +++ 3 files changed, 274 insertions(+) create mode 100644 spring-batch/src/main/java/org/baeldung/spring_batch_intro/partitioner/CustomMultiResourcePartitioner.java create mode 100644 spring-batch/src/main/java/org/baeldung/spring_batch_intro/partitioner/SpringbatchPartitionConfig.java create mode 100644 spring-batch/src/main/java/org/baeldung/spring_batch_intro/partitioner/SpringbatchPartitionerApp.java diff --git a/spring-batch/src/main/java/org/baeldung/spring_batch_intro/partitioner/CustomMultiResourcePartitioner.java b/spring-batch/src/main/java/org/baeldung/spring_batch_intro/partitioner/CustomMultiResourcePartitioner.java new file mode 100644 index 0000000000..4cae69efbd --- /dev/null +++ b/spring-batch/src/main/java/org/baeldung/spring_batch_intro/partitioner/CustomMultiResourcePartitioner.java @@ -0,0 +1,77 @@ +/* + * Copyright 2006-2013 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.baeldung.spring_batch_intro.partitioner; + +import java.util.HashMap; +import java.util.Map; + +import org.springframework.batch.core.partition.support.Partitioner; +import org.springframework.batch.item.ExecutionContext; +import org.springframework.core.io.Resource; +import org.springframework.util.Assert; + +public class CustomMultiResourcePartitioner implements Partitioner { + + private static final String DEFAULT_KEY_NAME = "fileName"; + + private static final String PARTITION_KEY = "partition"; + + private Resource[] resources = new Resource[0]; + + private String keyName = DEFAULT_KEY_NAME; + + /** + * The resources to assign to each partition. In Spring configuration you + * can use a pattern to select multiple resources. + * @param resources the resources to use + */ + public void setResources(Resource[] resources) { + this.resources = resources; + } + + /** + * The name of the key for the file name in each {@link ExecutionContext}. + * Defaults to "fileName". + * @param keyName the value of the key + */ + public void setKeyName(String keyName) { + this.keyName = keyName; + } + + /** + * Assign the filename of each of the injected resources to an + * {@link ExecutionContext}. + * + * @see Partitioner#partition(int) + */ + @Override + public Map partition(int gridSize) { + Map map = new HashMap(gridSize); + int i = 0, k = 1; + for (Resource resource : resources) { + ExecutionContext context = new ExecutionContext(); + Assert.state(resource.exists(), "Resource does not exist: " + resource); + context.putString(keyName, resource.getFilename()); + context.putString("opFileName", "output" + k++ + ".xml"); + + map.put(PARTITION_KEY + i, context); + i++; + } + return map; + } + +} diff --git a/spring-batch/src/main/java/org/baeldung/spring_batch_intro/partitioner/SpringbatchPartitionConfig.java b/spring-batch/src/main/java/org/baeldung/spring_batch_intro/partitioner/SpringbatchPartitionConfig.java new file mode 100644 index 0000000000..fe8339a8b4 --- /dev/null +++ b/spring-batch/src/main/java/org/baeldung/spring_batch_intro/partitioner/SpringbatchPartitionConfig.java @@ -0,0 +1,169 @@ +package org.baeldung.spring_batch_intro.partitioner; + +import java.io.IOException; +import java.net.MalformedURLException; +import java.text.ParseException; + +import javax.sql.DataSource; + +import org.baeldung.spring_batch_intro.model.Transaction; +import org.baeldung.spring_batch_intro.service.RecordFieldSetMapper; +import org.springframework.batch.core.Job; +import org.springframework.batch.core.Step; +import org.springframework.batch.core.configuration.annotation.EnableBatchProcessing; +import org.springframework.batch.core.configuration.annotation.JobBuilderFactory; +import org.springframework.batch.core.configuration.annotation.StepBuilderFactory; +import org.springframework.batch.core.configuration.annotation.StepScope; +import org.springframework.batch.core.launch.JobLauncher; +import org.springframework.batch.core.launch.support.SimpleJobLauncher; +import org.springframework.batch.core.repository.JobRepository; +import org.springframework.batch.core.repository.support.JobRepositoryFactoryBean; +import org.springframework.batch.item.UnexpectedInputException; +import org.springframework.batch.item.file.FlatFileItemReader; +import org.springframework.batch.item.file.mapping.DefaultLineMapper; +import org.springframework.batch.item.file.transform.DelimitedLineTokenizer; +import org.springframework.batch.item.xml.StaxEventItemWriter; +import org.springframework.batch.support.transaction.ResourcelessTransactionManager; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.core.io.ClassPathResource; +import org.springframework.core.io.FileSystemResource; +import org.springframework.core.io.Resource; +import org.springframework.core.io.support.ResourcePatternResolver; +import org.springframework.core.task.TaskExecutor; +import org.springframework.jdbc.datasource.embedded.EmbeddedDatabase; +import org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseBuilder; +import org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseType; +import org.springframework.oxm.Marshaller; +import org.springframework.oxm.jaxb.Jaxb2Marshaller; +import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor; +import org.springframework.transaction.PlatformTransactionManager; + +@Configuration +@EnableBatchProcessing +public class SpringbatchPartitionConfig { + + @Autowired + ResourcePatternResolver resoursePatternResolver; + + @Autowired + private JobBuilderFactory jobs; + + @Autowired + private StepBuilderFactory steps; + + @Bean(name = "partitionerJob") + public Job partitionerJob() throws UnexpectedInputException, MalformedURLException, ParseException { + return jobs.get("partitionerJob") + .start(partitionStep()) + .build(); + } + + @Bean + public Step partitionStep() throws UnexpectedInputException, MalformedURLException, ParseException { + return steps.get("partitionStep") + .partitioner("slaveStep", partitioner()) + .step(slaveStep()) + .taskExecutor(taskExecutor()) + .build(); + } + + @Bean + public Step slaveStep() throws UnexpectedInputException, MalformedURLException, ParseException { + return steps.get("slaveStep") + . chunk(1) + .reader(itemReader(null)) + .writer(itemWriter(marshaller(), null)) + .build(); + } + + @Bean + public CustomMultiResourcePartitioner partitioner() { + CustomMultiResourcePartitioner partitioner = new CustomMultiResourcePartitioner(); + Resource[] resources; + try { + resources = resoursePatternResolver.getResources("file:src/main/resources/input/partitioner/*.csv"); + } catch (IOException e) { + throw new RuntimeException("I/O problems when resolving the input file pattern.", e); + } + partitioner.setResources(resources); + return partitioner; + } + + @Bean + @StepScope + public FlatFileItemReader itemReader(@Value("#{stepExecutionContext[fileName]}") String filename) throws UnexpectedInputException, ParseException { + FlatFileItemReader reader = new FlatFileItemReader(); + DelimitedLineTokenizer tokenizer = new DelimitedLineTokenizer(); + String[] tokens = { "username", "userid", "transactiondate", "amount" }; + tokenizer.setNames(tokens); + reader.setResource(new ClassPathResource("input/partitioner/" + filename)); + DefaultLineMapper lineMapper = new DefaultLineMapper(); + lineMapper.setLineTokenizer(tokenizer); + lineMapper.setFieldSetMapper(new RecordFieldSetMapper()); + reader.setLinesToSkip(1); + reader.setLineMapper(lineMapper); + return reader; + } + + @Bean(destroyMethod = "") + @StepScope + public StaxEventItemWriter itemWriter(Marshaller marshaller, @Value("#{stepExecutionContext[opFileName]}") String filename) throws MalformedURLException { + StaxEventItemWriter itemWriter = new StaxEventItemWriter<>(); + itemWriter.setMarshaller(marshaller); + itemWriter.setRootTagName("transactionRecord"); + itemWriter.setResource(new FileSystemResource("src/main/resources/output/" + filename)); + return itemWriter; + } + + @Bean + public Marshaller marshaller() { + Jaxb2Marshaller marshaller = new Jaxb2Marshaller(); + marshaller.setClassesToBeBound(new Class[] { Transaction.class }); + return marshaller; + } + + @Bean + public TaskExecutor taskExecutor() { + ThreadPoolTaskExecutor taskExecutor = new ThreadPoolTaskExecutor(); + taskExecutor.setMaxPoolSize(5); + taskExecutor.setCorePoolSize(5); + taskExecutor.setQueueCapacity(5); + taskExecutor.afterPropertiesSet(); + return taskExecutor; + } + + private JobRepository getJobRepository() throws Exception { + JobRepositoryFactoryBean factory = new JobRepositoryFactoryBean(); + factory.setDataSource(dataSource()); + factory.setTransactionManager(getTransactionManager()); + // JobRepositoryFactoryBean's methods Throws Generic Exception, + // it would have been better to have a specific one + factory.afterPropertiesSet(); + return (JobRepository) factory.getObject(); + } + + private DataSource dataSource() { + EmbeddedDatabaseBuilder builder = new EmbeddedDatabaseBuilder(); + EmbeddedDatabase db = builder.setType(EmbeddedDatabaseType.HSQL) + .addScript("classpath:org/springframework/batch/core/schema-drop-h2.sql") + .addScript("classpath:org/springframework/batch/core/schema-h2.sql") + .build(); + return db; + } + + private PlatformTransactionManager getTransactionManager() { + return new ResourcelessTransactionManager(); + } + + public JobLauncher getJobLauncher() throws Exception { + SimpleJobLauncher jobLauncher = new SimpleJobLauncher(); + // SimpleJobLauncher's methods Throws Generic Exception, + // it would have been better to have a specific one + jobLauncher.setJobRepository(getJobRepository()); + jobLauncher.afterPropertiesSet(); + return jobLauncher; + } +} diff --git a/spring-batch/src/main/java/org/baeldung/spring_batch_intro/partitioner/SpringbatchPartitionerApp.java b/spring-batch/src/main/java/org/baeldung/spring_batch_intro/partitioner/SpringbatchPartitionerApp.java new file mode 100644 index 0000000000..1d6d922969 --- /dev/null +++ b/spring-batch/src/main/java/org/baeldung/spring_batch_intro/partitioner/SpringbatchPartitionerApp.java @@ -0,0 +1,28 @@ +package org.baeldung.spring_batch_intro.partitioner; + +import org.springframework.batch.core.Job; +import org.springframework.batch.core.JobExecution; +import org.springframework.batch.core.JobParameters; +import org.springframework.batch.core.launch.JobLauncher; +import org.springframework.context.annotation.AnnotationConfigApplicationContext; + +public class SpringbatchPartitionerApp { + public static void main(final String[] args) { + // Spring Java config + final AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(); + context.register(SpringbatchPartitionConfig.class); + context.refresh(); + + final JobLauncher jobLauncher = (JobLauncher) context.getBean("jobLauncher"); + final Job job = (Job) context.getBean("partitionerJob"); + System.out.println("Starting the batch job"); + try { + final JobExecution execution = jobLauncher.run(job, new JobParameters()); + System.out.println("Job Status : " + execution.getStatus()); + System.out.println("Job succeeded"); + } catch (final Exception e) { + e.printStackTrace(); + System.out.println("Job failed"); + } + } +} \ No newline at end of file From 9f9fbc4523d58ce40570f20a9dd631fda3322d41 Mon Sep 17 00:00:00 2001 From: parthkaria Date: Tue, 29 Aug 2017 17:14:13 +0530 Subject: [PATCH 035/236] BAEL-1106 Introduction to javax.measure --- core-java/pom.xml | 8 +++ .../com/baeldung/javax/measure/WaterTank.java | 26 +++++++ .../javax/measure/WaterTankTests.java | 68 +++++++++++++++++++ 3 files changed, 102 insertions(+) create mode 100644 core-java/src/main/java/com/baeldung/javax/measure/WaterTank.java create mode 100644 core-java/src/test/java/com/baeldung/javax/measure/WaterTankTests.java diff --git a/core-java/pom.xml b/core-java/pom.xml index 0f8a665fa1..5410ea54e2 100644 --- a/core-java/pom.xml +++ b/core-java/pom.xml @@ -212,6 +212,13 @@ streamex ${streamex.version} + + + javax.measure + jsr-275 + ${javax-measure.version} + + @@ -438,6 +445,7 @@ 1.5.1 1.13 0.6.5 + 0.9.1 1.3 diff --git a/core-java/src/main/java/com/baeldung/javax/measure/WaterTank.java b/core-java/src/main/java/com/baeldung/javax/measure/WaterTank.java new file mode 100644 index 0000000000..1ab9eee53f --- /dev/null +++ b/core-java/src/main/java/com/baeldung/javax/measure/WaterTank.java @@ -0,0 +1,26 @@ +package com.baeldung.javax.measure; + +import javax.measure.Measure; +import javax.measure.quantity.Volume; + +public class WaterTank { + + private Measure capacityMeasure; + private double capacityDouble; + + public void setCapacityMeasure(Measure capacityMeasure) { + this.capacityMeasure = capacityMeasure; + } + + public void setCapacityDouble(double capacityDouble) { + this.capacityDouble = capacityDouble; + } + + public Measure getCapacityMeasure() { + return capacityMeasure; + } + + public double getCapacityDouble() { + return capacityDouble; + } +} diff --git a/core-java/src/test/java/com/baeldung/javax/measure/WaterTankTests.java b/core-java/src/test/java/com/baeldung/javax/measure/WaterTankTests.java new file mode 100644 index 0000000000..ef54035353 --- /dev/null +++ b/core-java/src/test/java/com/baeldung/javax/measure/WaterTankTests.java @@ -0,0 +1,68 @@ +package com.baeldung.javax.measure; + +import javax.measure.Measure; +import javax.measure.converter.UnitConverter; +import javax.measure.quantity.Duration; +import javax.measure.quantity.Length; +import javax.measure.quantity.Pressure; +import javax.measure.quantity.Volume; +import static javax.measure.unit.NonSI.HOUR; +import static javax.measure.unit.NonSI.LITRE; +import static javax.measure.unit.NonSI.MILE; +import static javax.measure.unit.NonSI.MINUTE; +import javax.measure.unit.SI; +import static javax.measure.unit.SI.KILO; +import static javax.measure.unit.SI.METER; +import static javax.measure.unit.SI.NEWTON; +import static javax.measure.unit.SI.SECOND; +import javax.measure.unit.Unit; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertTrue; +import org.junit.Test; + +public class WaterTankTests { + + @Test + public void givenMeasure_whenGetUnitAndConvertValue_thenSuccess() { + WaterTank waterTank = new WaterTank(); + waterTank.setCapacityMeasure(Measure.valueOf(9.2, LITRE)); + assertEquals(LITRE, waterTank.getCapacityMeasure().getUnit()); + + Measure waterCapacity = waterTank.getCapacityMeasure(); + double volumeInLitre = waterCapacity.getValue().doubleValue(); + assertEquals(9.2, volumeInLitre, 0.0f); + + double volumeInMilliLitre = waterCapacity.doubleValue(SI.MILLI(LITRE)); + assertEquals(9200.0, volumeInMilliLitre, 0.0f); + + Unit Kilometer = SI.KILO(METER); + Unit Centimeter = SI.CENTI(METER); + } + + @Test + public void givenMeasure_whenAlternateMeasure_ThenGetAlternateMeasure() { + Unit PASCAL = NEWTON.divide(METER.pow(2)).alternate("Pa"); + assertTrue(Unit.valueOf("Pa").equals(PASCAL)); + } + + @Test + public void givenMeasure_whenCompoundMeasure_ThenGetCompoundMeasure() { + Unit HOUR_MINUTE_SECOND = HOUR.compound(MINUTE).compound(SECOND); + Measure duration = Measure.valueOf(12345, SECOND); + assertEquals("3h25min45s", duration.to(HOUR_MINUTE_SECOND).toString()); + } + + @Test + public void givenMiles_whenConvertToKilometer_ThenConverted() { + double distanceInMiles = 50.0; + UnitConverter mileToKilometer = MILE.getConverterTo(KILO(METER)); + double distanceInKilometers = mileToKilometer.convert(distanceInMiles); + assertEquals(80.4672, distanceInKilometers, 0.00f); + } + + @Test + public void givenSymbol_WhenCompareToSystemUnit_ThenSuccess() { + assertTrue(Unit.valueOf("kW").equals(SI.KILO(SI.WATT))); + assertTrue(Unit.valueOf("ms").equals(SI.SECOND.divide(1000))); + } +} From e573e2c43b35809f5521fa47ce8d4c6dea760348 Mon Sep 17 00:00:00 2001 From: parthkaria Date: Tue, 29 Aug 2017 17:37:29 +0530 Subject: [PATCH 036/236] Unnecessary Committed --- .../CustomMultiResourcePartitioner.java | 77 -------- .../SpringbatchPartitionConfig.java | 169 ------------------ .../SpringbatchPartitionerApp.java | 28 --- 3 files changed, 274 deletions(-) delete mode 100644 spring-batch/src/main/java/org/baeldung/spring_batch_intro/partitioner/CustomMultiResourcePartitioner.java delete mode 100644 spring-batch/src/main/java/org/baeldung/spring_batch_intro/partitioner/SpringbatchPartitionConfig.java delete mode 100644 spring-batch/src/main/java/org/baeldung/spring_batch_intro/partitioner/SpringbatchPartitionerApp.java diff --git a/spring-batch/src/main/java/org/baeldung/spring_batch_intro/partitioner/CustomMultiResourcePartitioner.java b/spring-batch/src/main/java/org/baeldung/spring_batch_intro/partitioner/CustomMultiResourcePartitioner.java deleted file mode 100644 index 4cae69efbd..0000000000 --- a/spring-batch/src/main/java/org/baeldung/spring_batch_intro/partitioner/CustomMultiResourcePartitioner.java +++ /dev/null @@ -1,77 +0,0 @@ -/* - * Copyright 2006-2013 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package org.baeldung.spring_batch_intro.partitioner; - -import java.util.HashMap; -import java.util.Map; - -import org.springframework.batch.core.partition.support.Partitioner; -import org.springframework.batch.item.ExecutionContext; -import org.springframework.core.io.Resource; -import org.springframework.util.Assert; - -public class CustomMultiResourcePartitioner implements Partitioner { - - private static final String DEFAULT_KEY_NAME = "fileName"; - - private static final String PARTITION_KEY = "partition"; - - private Resource[] resources = new Resource[0]; - - private String keyName = DEFAULT_KEY_NAME; - - /** - * The resources to assign to each partition. In Spring configuration you - * can use a pattern to select multiple resources. - * @param resources the resources to use - */ - public void setResources(Resource[] resources) { - this.resources = resources; - } - - /** - * The name of the key for the file name in each {@link ExecutionContext}. - * Defaults to "fileName". - * @param keyName the value of the key - */ - public void setKeyName(String keyName) { - this.keyName = keyName; - } - - /** - * Assign the filename of each of the injected resources to an - * {@link ExecutionContext}. - * - * @see Partitioner#partition(int) - */ - @Override - public Map partition(int gridSize) { - Map map = new HashMap(gridSize); - int i = 0, k = 1; - for (Resource resource : resources) { - ExecutionContext context = new ExecutionContext(); - Assert.state(resource.exists(), "Resource does not exist: " + resource); - context.putString(keyName, resource.getFilename()); - context.putString("opFileName", "output" + k++ + ".xml"); - - map.put(PARTITION_KEY + i, context); - i++; - } - return map; - } - -} diff --git a/spring-batch/src/main/java/org/baeldung/spring_batch_intro/partitioner/SpringbatchPartitionConfig.java b/spring-batch/src/main/java/org/baeldung/spring_batch_intro/partitioner/SpringbatchPartitionConfig.java deleted file mode 100644 index fe8339a8b4..0000000000 --- a/spring-batch/src/main/java/org/baeldung/spring_batch_intro/partitioner/SpringbatchPartitionConfig.java +++ /dev/null @@ -1,169 +0,0 @@ -package org.baeldung.spring_batch_intro.partitioner; - -import java.io.IOException; -import java.net.MalformedURLException; -import java.text.ParseException; - -import javax.sql.DataSource; - -import org.baeldung.spring_batch_intro.model.Transaction; -import org.baeldung.spring_batch_intro.service.RecordFieldSetMapper; -import org.springframework.batch.core.Job; -import org.springframework.batch.core.Step; -import org.springframework.batch.core.configuration.annotation.EnableBatchProcessing; -import org.springframework.batch.core.configuration.annotation.JobBuilderFactory; -import org.springframework.batch.core.configuration.annotation.StepBuilderFactory; -import org.springframework.batch.core.configuration.annotation.StepScope; -import org.springframework.batch.core.launch.JobLauncher; -import org.springframework.batch.core.launch.support.SimpleJobLauncher; -import org.springframework.batch.core.repository.JobRepository; -import org.springframework.batch.core.repository.support.JobRepositoryFactoryBean; -import org.springframework.batch.item.UnexpectedInputException; -import org.springframework.batch.item.file.FlatFileItemReader; -import org.springframework.batch.item.file.mapping.DefaultLineMapper; -import org.springframework.batch.item.file.transform.DelimitedLineTokenizer; -import org.springframework.batch.item.xml.StaxEventItemWriter; -import org.springframework.batch.support.transaction.ResourcelessTransactionManager; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.beans.factory.annotation.Value; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; -import org.springframework.core.io.ClassPathResource; -import org.springframework.core.io.FileSystemResource; -import org.springframework.core.io.Resource; -import org.springframework.core.io.support.ResourcePatternResolver; -import org.springframework.core.task.TaskExecutor; -import org.springframework.jdbc.datasource.embedded.EmbeddedDatabase; -import org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseBuilder; -import org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseType; -import org.springframework.oxm.Marshaller; -import org.springframework.oxm.jaxb.Jaxb2Marshaller; -import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor; -import org.springframework.transaction.PlatformTransactionManager; - -@Configuration -@EnableBatchProcessing -public class SpringbatchPartitionConfig { - - @Autowired - ResourcePatternResolver resoursePatternResolver; - - @Autowired - private JobBuilderFactory jobs; - - @Autowired - private StepBuilderFactory steps; - - @Bean(name = "partitionerJob") - public Job partitionerJob() throws UnexpectedInputException, MalformedURLException, ParseException { - return jobs.get("partitionerJob") - .start(partitionStep()) - .build(); - } - - @Bean - public Step partitionStep() throws UnexpectedInputException, MalformedURLException, ParseException { - return steps.get("partitionStep") - .partitioner("slaveStep", partitioner()) - .step(slaveStep()) - .taskExecutor(taskExecutor()) - .build(); - } - - @Bean - public Step slaveStep() throws UnexpectedInputException, MalformedURLException, ParseException { - return steps.get("slaveStep") - . chunk(1) - .reader(itemReader(null)) - .writer(itemWriter(marshaller(), null)) - .build(); - } - - @Bean - public CustomMultiResourcePartitioner partitioner() { - CustomMultiResourcePartitioner partitioner = new CustomMultiResourcePartitioner(); - Resource[] resources; - try { - resources = resoursePatternResolver.getResources("file:src/main/resources/input/partitioner/*.csv"); - } catch (IOException e) { - throw new RuntimeException("I/O problems when resolving the input file pattern.", e); - } - partitioner.setResources(resources); - return partitioner; - } - - @Bean - @StepScope - public FlatFileItemReader itemReader(@Value("#{stepExecutionContext[fileName]}") String filename) throws UnexpectedInputException, ParseException { - FlatFileItemReader reader = new FlatFileItemReader(); - DelimitedLineTokenizer tokenizer = new DelimitedLineTokenizer(); - String[] tokens = { "username", "userid", "transactiondate", "amount" }; - tokenizer.setNames(tokens); - reader.setResource(new ClassPathResource("input/partitioner/" + filename)); - DefaultLineMapper lineMapper = new DefaultLineMapper(); - lineMapper.setLineTokenizer(tokenizer); - lineMapper.setFieldSetMapper(new RecordFieldSetMapper()); - reader.setLinesToSkip(1); - reader.setLineMapper(lineMapper); - return reader; - } - - @Bean(destroyMethod = "") - @StepScope - public StaxEventItemWriter itemWriter(Marshaller marshaller, @Value("#{stepExecutionContext[opFileName]}") String filename) throws MalformedURLException { - StaxEventItemWriter itemWriter = new StaxEventItemWriter<>(); - itemWriter.setMarshaller(marshaller); - itemWriter.setRootTagName("transactionRecord"); - itemWriter.setResource(new FileSystemResource("src/main/resources/output/" + filename)); - return itemWriter; - } - - @Bean - public Marshaller marshaller() { - Jaxb2Marshaller marshaller = new Jaxb2Marshaller(); - marshaller.setClassesToBeBound(new Class[] { Transaction.class }); - return marshaller; - } - - @Bean - public TaskExecutor taskExecutor() { - ThreadPoolTaskExecutor taskExecutor = new ThreadPoolTaskExecutor(); - taskExecutor.setMaxPoolSize(5); - taskExecutor.setCorePoolSize(5); - taskExecutor.setQueueCapacity(5); - taskExecutor.afterPropertiesSet(); - return taskExecutor; - } - - private JobRepository getJobRepository() throws Exception { - JobRepositoryFactoryBean factory = new JobRepositoryFactoryBean(); - factory.setDataSource(dataSource()); - factory.setTransactionManager(getTransactionManager()); - // JobRepositoryFactoryBean's methods Throws Generic Exception, - // it would have been better to have a specific one - factory.afterPropertiesSet(); - return (JobRepository) factory.getObject(); - } - - private DataSource dataSource() { - EmbeddedDatabaseBuilder builder = new EmbeddedDatabaseBuilder(); - EmbeddedDatabase db = builder.setType(EmbeddedDatabaseType.HSQL) - .addScript("classpath:org/springframework/batch/core/schema-drop-h2.sql") - .addScript("classpath:org/springframework/batch/core/schema-h2.sql") - .build(); - return db; - } - - private PlatformTransactionManager getTransactionManager() { - return new ResourcelessTransactionManager(); - } - - public JobLauncher getJobLauncher() throws Exception { - SimpleJobLauncher jobLauncher = new SimpleJobLauncher(); - // SimpleJobLauncher's methods Throws Generic Exception, - // it would have been better to have a specific one - jobLauncher.setJobRepository(getJobRepository()); - jobLauncher.afterPropertiesSet(); - return jobLauncher; - } -} diff --git a/spring-batch/src/main/java/org/baeldung/spring_batch_intro/partitioner/SpringbatchPartitionerApp.java b/spring-batch/src/main/java/org/baeldung/spring_batch_intro/partitioner/SpringbatchPartitionerApp.java deleted file mode 100644 index 1d6d922969..0000000000 --- a/spring-batch/src/main/java/org/baeldung/spring_batch_intro/partitioner/SpringbatchPartitionerApp.java +++ /dev/null @@ -1,28 +0,0 @@ -package org.baeldung.spring_batch_intro.partitioner; - -import org.springframework.batch.core.Job; -import org.springframework.batch.core.JobExecution; -import org.springframework.batch.core.JobParameters; -import org.springframework.batch.core.launch.JobLauncher; -import org.springframework.context.annotation.AnnotationConfigApplicationContext; - -public class SpringbatchPartitionerApp { - public static void main(final String[] args) { - // Spring Java config - final AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(); - context.register(SpringbatchPartitionConfig.class); - context.refresh(); - - final JobLauncher jobLauncher = (JobLauncher) context.getBean("jobLauncher"); - final Job job = (Job) context.getBean("partitionerJob"); - System.out.println("Starting the batch job"); - try { - final JobExecution execution = jobLauncher.run(job, new JobParameters()); - System.out.println("Job Status : " + execution.getStatus()); - System.out.println("Job succeeded"); - } catch (final Exception e) { - e.printStackTrace(); - System.out.println("Job failed"); - } - } -} \ No newline at end of file From 82ed9489e51c85a7a623491c3be9d1090a2b4af0 Mon Sep 17 00:00:00 2001 From: Dassi Orleando Date: Wed, 30 Aug 2017 14:35:38 +0100 Subject: [PATCH 037/236] Move difference between dates from core-java to libraries --- core-java/pom.xml | 13 ------------- libraries/pom.xml | 18 ++++++++++++++++++ .../com/baeldung/date}/DateDiffUnitTest.java | 2 +- 3 files changed, 19 insertions(+), 14 deletions(-) rename {core-java/src/test/java/com/baeldung => libraries/src/test/java/com/baeldung/date}/DateDiffUnitTest.java (99%) diff --git a/core-java/pom.xml b/core-java/pom.xml index 586486027a..25029c237f 100644 --- a/core-java/pom.xml +++ b/core-java/pom.xml @@ -186,16 +186,6 @@ fscontext ${fscontext.version} - - joda-time - joda-time - ${joda-time.version} - - - com.darwinsys - hirondelle-date4j - ${hirondelle-date4j.version} - @@ -418,9 +408,6 @@ 1.8.7 1.16.12 4.6-b01 - 2.9.9 - 1.5.1 - 1.3 4.12 diff --git a/libraries/pom.xml b/libraries/pom.xml index 6d1098246e..ee92642b62 100644 --- a/libraries/pom.xml +++ b/libraries/pom.xml @@ -498,6 +498,22 @@ gt-swing ${geotools.version} + + com.darwinsys + hirondelle-date4j + RELEASE + test + + + joda-time + joda-time + ${joda-time.version} + + + com.darwinsys + hirondelle-date4j + ${hirondelle-date4j.version} + @@ -564,5 +580,7 @@ 0.6.5 0.9.0 15.2 + 2.9.9 + 1.5.1 \ No newline at end of file diff --git a/core-java/src/test/java/com/baeldung/DateDiffUnitTest.java b/libraries/src/test/java/com/baeldung/date/DateDiffUnitTest.java similarity index 99% rename from core-java/src/test/java/com/baeldung/DateDiffUnitTest.java rename to libraries/src/test/java/com/baeldung/date/DateDiffUnitTest.java index 324a0d4587..6046781619 100644 --- a/core-java/src/test/java/com/baeldung/DateDiffUnitTest.java +++ b/libraries/src/test/java/com/baeldung/date/DateDiffUnitTest.java @@ -1,4 +1,4 @@ -package com.baeldung; +package com.baeldung.date; import org.junit.Test; From f6216f27549b70ea891582cab92311b554b0697d Mon Sep 17 00:00:00 2001 From: parthkaria Date: Thu, 31 Aug 2017 12:55:56 +0530 Subject: [PATCH 038/236] BAEL-1106 Move code to libraries from core-java --- core-java/pom.xml | 7 ------- libraries/pom.xml | 6 ++++++ .../main/java/com/baeldung/javax/measure/WaterTank.java | 0 .../java/com/baeldung/javax/measure/WaterTankTests.java | 0 4 files changed, 6 insertions(+), 7 deletions(-) rename {core-java => libraries}/src/main/java/com/baeldung/javax/measure/WaterTank.java (100%) rename {core-java => libraries}/src/test/java/com/baeldung/javax/measure/WaterTankTests.java (100%) diff --git a/core-java/pom.xml b/core-java/pom.xml index 5410ea54e2..c532d80bd6 100644 --- a/core-java/pom.xml +++ b/core-java/pom.xml @@ -213,12 +213,6 @@ ${streamex.version} - - javax.measure - jsr-275 - ${javax-measure.version} - - @@ -445,7 +439,6 @@ 1.5.1 1.13 0.6.5 - 0.9.1 1.3 diff --git a/libraries/pom.xml b/libraries/pom.xml index cf16f0fb79..9b8f3f0a77 100644 --- a/libraries/pom.xml +++ b/libraries/pom.xml @@ -498,6 +498,11 @@ gt-swing ${geotools.version} + + javax.measure + jsr-275 + ${javax-measure.version} + @@ -564,5 +569,6 @@ 0.6.5 0.9.0 15.2 + 0.9.1 diff --git a/core-java/src/main/java/com/baeldung/javax/measure/WaterTank.java b/libraries/src/main/java/com/baeldung/javax/measure/WaterTank.java similarity index 100% rename from core-java/src/main/java/com/baeldung/javax/measure/WaterTank.java rename to libraries/src/main/java/com/baeldung/javax/measure/WaterTank.java diff --git a/core-java/src/test/java/com/baeldung/javax/measure/WaterTankTests.java b/libraries/src/test/java/com/baeldung/javax/measure/WaterTankTests.java similarity index 100% rename from core-java/src/test/java/com/baeldung/javax/measure/WaterTankTests.java rename to libraries/src/test/java/com/baeldung/javax/measure/WaterTankTests.java From 99e9e2332b9d46627836b85a1ed484fec3a53120 Mon Sep 17 00:00:00 2001 From: parthkaria Date: Thu, 31 Aug 2017 12:57:54 +0530 Subject: [PATCH 039/236] BAEL-1106 Move code to libraries from core-java --- core-java/pom.xml | 1 - 1 file changed, 1 deletion(-) diff --git a/core-java/pom.xml b/core-java/pom.xml index c532d80bd6..0f8a665fa1 100644 --- a/core-java/pom.xml +++ b/core-java/pom.xml @@ -212,7 +212,6 @@ streamex ${streamex.version} - From cccaa8c4ad6c65d7567a9ffad6f08acffb72ae89 Mon Sep 17 00:00:00 2001 From: Dassi Orleando Date: Thu, 7 Sep 2017 23:44:30 +0100 Subject: [PATCH 040/236] BAEL-890 - Kotlin-Allopen with Spring example --- spring-mvc-kotlin/pom.xml | 21 +++++++++++++++++-- .../kotlin/allopen/SimpleConfiguration.kt | 7 +++++++ .../kotlin/allopen/SimpleConfigurationTest.kt | 19 +++++++++++++++++ 3 files changed, 45 insertions(+), 2 deletions(-) create mode 100644 spring-mvc-kotlin/src/main/kotlin/com/baeldung/kotlin/allopen/SimpleConfiguration.kt create mode 100644 spring-mvc-kotlin/src/test/kotlin/com/baeldung/kotlin/allopen/SimpleConfigurationTest.kt diff --git a/spring-mvc-kotlin/pom.xml b/spring-mvc-kotlin/pom.xml index 264cf49817..2d1dac5e29 100644 --- a/spring-mvc-kotlin/pom.xml +++ b/spring-mvc-kotlin/pom.xml @@ -45,6 +45,12 @@ thymeleaf-spring4 3.0.7.RELEASE + + org.springframework + spring-test + 4.3.10.RELEASE + test + @@ -55,7 +61,12 @@ kotlin-maven-plugin org.jetbrains.kotlin 1.1.4 - + + + spring + + 1.8 + compile @@ -64,7 +75,6 @@ compile - test-compile test-compile @@ -73,6 +83,13 @@ + + + org.jetbrains.kotlin + kotlin-maven-allopen + 1.1.4-3 + + diff --git a/spring-mvc-kotlin/src/main/kotlin/com/baeldung/kotlin/allopen/SimpleConfiguration.kt b/spring-mvc-kotlin/src/main/kotlin/com/baeldung/kotlin/allopen/SimpleConfiguration.kt new file mode 100644 index 0000000000..5d0a3e13bf --- /dev/null +++ b/spring-mvc-kotlin/src/main/kotlin/com/baeldung/kotlin/allopen/SimpleConfiguration.kt @@ -0,0 +1,7 @@ +package com.baeldung.kotlin.allopen + +import org.springframework.context.annotation.Configuration + +@Configuration +class SimpleConfiguration { +} \ No newline at end of file diff --git a/spring-mvc-kotlin/src/test/kotlin/com/baeldung/kotlin/allopen/SimpleConfigurationTest.kt b/spring-mvc-kotlin/src/test/kotlin/com/baeldung/kotlin/allopen/SimpleConfigurationTest.kt new file mode 100644 index 0000000000..65a60c7157 --- /dev/null +++ b/spring-mvc-kotlin/src/test/kotlin/com/baeldung/kotlin/allopen/SimpleConfigurationTest.kt @@ -0,0 +1,19 @@ +package com.baeldung.kotlin.allopen + +import org.junit.Test +import org.junit.runner.RunWith +import org.springframework.test.context.ContextConfiguration +import org.springframework.test.context.junit4.SpringJUnit4ClassRunner +import org.springframework.test.context.support.AnnotationConfigContextLoader + +@RunWith(SpringJUnit4ClassRunner::class) +@ContextConfiguration( + loader = AnnotationConfigContextLoader::class, + classes = arrayOf(SimpleConfiguration::class)) +class SimpleConfigurationTest { + + @Test + fun contextLoads() { + } + +} \ No newline at end of file From 119c288942d7f3547515ec773f1e106c6cb50676 Mon Sep 17 00:00:00 2001 From: Jose Carvajal Date: Fri, 8 Sep 2017 11:09:04 +0200 Subject: [PATCH 041/236] BAEL-1069: Guide to diamond operator in Java --- .../java/org/baeldung/java/diamond/Car.java | 5 +++++ .../java/diamond/DiamondOperatorTest.java | 13 +++++++++++++ .../java/org/baeldung/java/diamond/Diesel.java | 10 ++++++++++ .../java/org/baeldung/java/diamond/Engine.java | 6 ++++++ .../java/org/baeldung/java/diamond/Vehicle.java | 5 +++++ .../baeldung/java/rawtypes/RawTypesTest.java | 17 +++++++++++++++++ 6 files changed, 56 insertions(+) create mode 100644 core-java/src/test/java/org/baeldung/java/diamond/Car.java create mode 100644 core-java/src/test/java/org/baeldung/java/diamond/DiamondOperatorTest.java create mode 100644 core-java/src/test/java/org/baeldung/java/diamond/Diesel.java create mode 100644 core-java/src/test/java/org/baeldung/java/diamond/Engine.java create mode 100644 core-java/src/test/java/org/baeldung/java/diamond/Vehicle.java create mode 100644 core-java/src/test/java/org/baeldung/java/rawtypes/RawTypesTest.java diff --git a/core-java/src/test/java/org/baeldung/java/diamond/Car.java b/core-java/src/test/java/org/baeldung/java/diamond/Car.java new file mode 100644 index 0000000000..9f923e0f3b --- /dev/null +++ b/core-java/src/test/java/org/baeldung/java/diamond/Car.java @@ -0,0 +1,5 @@ +package org.baeldung.java.diamond; + +public class Car implements Vehicle { + +} diff --git a/core-java/src/test/java/org/baeldung/java/diamond/DiamondOperatorTest.java b/core-java/src/test/java/org/baeldung/java/diamond/DiamondOperatorTest.java new file mode 100644 index 0000000000..ceb7c87100 --- /dev/null +++ b/core-java/src/test/java/org/baeldung/java/diamond/DiamondOperatorTest.java @@ -0,0 +1,13 @@ +package org.baeldung.java.diamond; + +import static org.junit.Assert.assertNotNull; + +import org.junit.Test; + +public class DiamondOperatorTest { + @Test + public void shouldCreateCarUsingDiamondWithoutWarnings() { + Car myCar = new Car<>(); + assertNotNull(myCar); + } +} diff --git a/core-java/src/test/java/org/baeldung/java/diamond/Diesel.java b/core-java/src/test/java/org/baeldung/java/diamond/Diesel.java new file mode 100644 index 0000000000..dc4256cdae --- /dev/null +++ b/core-java/src/test/java/org/baeldung/java/diamond/Diesel.java @@ -0,0 +1,10 @@ +package org.baeldung.java.diamond; + +public class Diesel implements Engine { + + @Override + public void start() { + System.out.println("Started Diesel..."); + } + +} diff --git a/core-java/src/test/java/org/baeldung/java/diamond/Engine.java b/core-java/src/test/java/org/baeldung/java/diamond/Engine.java new file mode 100644 index 0000000000..c18a8f64b5 --- /dev/null +++ b/core-java/src/test/java/org/baeldung/java/diamond/Engine.java @@ -0,0 +1,6 @@ +package org.baeldung.java.diamond; + +public interface Engine { + + void start(); +} diff --git a/core-java/src/test/java/org/baeldung/java/diamond/Vehicle.java b/core-java/src/test/java/org/baeldung/java/diamond/Vehicle.java new file mode 100644 index 0000000000..f61cf59620 --- /dev/null +++ b/core-java/src/test/java/org/baeldung/java/diamond/Vehicle.java @@ -0,0 +1,5 @@ +package org.baeldung.java.diamond; + +public interface Vehicle { + +} diff --git a/core-java/src/test/java/org/baeldung/java/rawtypes/RawTypesTest.java b/core-java/src/test/java/org/baeldung/java/rawtypes/RawTypesTest.java new file mode 100644 index 0000000000..2b36786abf --- /dev/null +++ b/core-java/src/test/java/org/baeldung/java/rawtypes/RawTypesTest.java @@ -0,0 +1,17 @@ +package org.baeldung.java.rawtypes; + +import java.util.ArrayList; +import java.util.List; + +import org.junit.Test; + +public class RawTypesTest { + @Test + public void shouldCreateListUsingRawTypes() { + @SuppressWarnings("rawtypes") + List myList = new ArrayList(); + myList.add(new Object()); + myList.add("2"); + myList.add(new Integer(1)); + } +} From d56dbc081d49111f2e1f041a2ff948fdd2076ca5 Mon Sep 17 00:00:00 2001 From: Ahmed Tawila Date: Sat, 9 Sep 2017 20:34:03 +0200 Subject: [PATCH 042/236] BAEL-1109 Introduction to JCache --- libraries/pom.xml | 33 ++++++++++++- .../com/baeldung/jcache/CacheLoaderTest.java | 35 ++++++++++++++ .../baeldung/jcache/EntryProcessorTest.java | 32 +++++++++++++ .../baeldung/jcache/EventListenerTest.java | 46 +++++++++++++++++++ .../java/com/baeldung/jcache/JCacheTest.java | 27 +++++++++++ .../jcache/SimpleCacheEntryListener.java | 34 ++++++++++++++ .../baeldung/jcache/SimpleCacheLoader.java | 24 ++++++++++ .../baeldung/jcache/SimpleEntryProcessor.java | 25 ++++++++++ 8 files changed, 254 insertions(+), 2 deletions(-) create mode 100644 libraries/src/test/java/com/baeldung/jcache/CacheLoaderTest.java create mode 100644 libraries/src/test/java/com/baeldung/jcache/EntryProcessorTest.java create mode 100644 libraries/src/test/java/com/baeldung/jcache/EventListenerTest.java create mode 100644 libraries/src/test/java/com/baeldung/jcache/JCacheTest.java create mode 100644 libraries/src/test/java/com/baeldung/jcache/SimpleCacheEntryListener.java create mode 100644 libraries/src/test/java/com/baeldung/jcache/SimpleCacheLoader.java create mode 100644 libraries/src/test/java/com/baeldung/jcache/SimpleEntryProcessor.java diff --git a/libraries/pom.xml b/libraries/pom.xml index a16a4de59d..51c79ef0dd 100644 --- a/libraries/pom.xml +++ b/libraries/pom.xml @@ -226,6 +226,10 @@ commons-logging commons-logging + + org.slf4j + slf4j-log4j12 + @@ -237,6 +241,10 @@ commons-logging commons-logging + + org.slf4j + slf4j-log4j12 + @@ -244,6 +252,12 @@ flink-test-utils_2.10 ${flink.version} test + + + org.slf4j + slf4j-log4j12 + + org.apache.commons @@ -467,11 +481,23 @@ noexception 1.1.0 - + org.eclipse.collections eclipse-collections ${eclipse-collections.version} + + javax.cache + cache-api + ${cache.version} + + + com.hazelcast + hazelcast + ${hazelcast.version} + + + 0.7.0 @@ -513,6 +539,9 @@ 1.7.1 2.1.2 1.0 - 8.2.0 + 8.2.0 + 1.0.0 + 1.0.0 + 3.8.4 \ No newline at end of file diff --git a/libraries/src/test/java/com/baeldung/jcache/CacheLoaderTest.java b/libraries/src/test/java/com/baeldung/jcache/CacheLoaderTest.java new file mode 100644 index 0000000000..e2167b39ad --- /dev/null +++ b/libraries/src/test/java/com/baeldung/jcache/CacheLoaderTest.java @@ -0,0 +1,35 @@ +package com.baeldung.jcache; + +import static org.junit.Assert.assertEquals; + +import javax.cache.Cache; +import javax.cache.CacheManager; +import javax.cache.Caching; +import javax.cache.configuration.FactoryBuilder; +import javax.cache.configuration.MutableConfiguration; +import javax.cache.spi.CachingProvider; + +import org.junit.Before; +import org.junit.Test; + +public class CacheLoaderTest { + + private Cache cache; + + @Before + public void setup() { + CachingProvider cachingProvider = Caching.getCachingProvider(); + CacheManager cacheManager = cachingProvider.getCacheManager(); + MutableConfiguration config = new MutableConfiguration().setReadThrough(true) + .setCacheLoaderFactory(new FactoryBuilder.SingletonFactory<>(new SimpleCacheLoader())); + this.cache = cacheManager.createCache("SimpleCache", config); + } + + @Test + public void whenReadingFromStorage_thenCorrect() { + for (int i = 1; i < 4; i++) { + String value = cache.get(i); + assertEquals("fromCache" + i, value); + } + } +} diff --git a/libraries/src/test/java/com/baeldung/jcache/EntryProcessorTest.java b/libraries/src/test/java/com/baeldung/jcache/EntryProcessorTest.java new file mode 100644 index 0000000000..fba6067885 --- /dev/null +++ b/libraries/src/test/java/com/baeldung/jcache/EntryProcessorTest.java @@ -0,0 +1,32 @@ +package com.baeldung.jcache; + +import static org.junit.Assert.assertEquals; + +import javax.cache.Cache; +import javax.cache.CacheManager; +import javax.cache.Caching; +import javax.cache.configuration.MutableConfiguration; +import javax.cache.spi.CachingProvider; + +import org.junit.Before; +import org.junit.Test; + +public class EntryProcessorTest { + + private Cache cache; + + @Before + public void instantiateCache() { + CachingProvider cachingProvider = Caching.getCachingProvider(); + CacheManager cacheManager = cachingProvider.getCacheManager(); + MutableConfiguration config = new MutableConfiguration(); + this.cache = cacheManager.createCache("MyCache", config); + this.cache.put("key", "value"); + } + + @Test + public void whenModifyValue_thenCorrect() { + this.cache.invoke("key", new SimpleEntryProcessor()); + assertEquals("value - modified", cache.get("key")); + } +} diff --git a/libraries/src/test/java/com/baeldung/jcache/EventListenerTest.java b/libraries/src/test/java/com/baeldung/jcache/EventListenerTest.java new file mode 100644 index 0000000000..5fb0b317e2 --- /dev/null +++ b/libraries/src/test/java/com/baeldung/jcache/EventListenerTest.java @@ -0,0 +1,46 @@ +package com.baeldung.jcache; + +import static org.junit.Assert.assertEquals; + +import javax.cache.Cache; +import javax.cache.CacheManager; +import javax.cache.Caching; +import javax.cache.configuration.FactoryBuilder; +import javax.cache.configuration.MutableCacheEntryListenerConfiguration; +import javax.cache.configuration.MutableConfiguration; +import javax.cache.spi.CachingProvider; + +import org.junit.Before; +import org.junit.Test; + +public class EventListenerTest { + + private Cache cache; + private SimpleCacheEntryListener listener; + MutableCacheEntryListenerConfiguration listenerConfiguration; + + @Before + public void setup() { + CachingProvider cachingProvider = Caching.getCachingProvider(); + CacheManager cacheManager = cachingProvider.getCacheManager(); + MutableConfiguration config = new MutableConfiguration(); + this.cache = cacheManager.createCache("MyCache", config); + this.listener = new SimpleCacheEntryListener(); + } + + @Test + public void whenRunEvent_thenCorrect() throws InterruptedException { + this.listenerConfiguration = new MutableCacheEntryListenerConfiguration(FactoryBuilder.factoryOf(this.listener), null, false, true); + this.cache.registerCacheEntryListener(this.listenerConfiguration); + + assertEquals(false, this.listener.getCreated()); + + this.cache.put("key", "value"); + assertEquals(true, this.listener.getCreated()); + assertEquals(false, this.listener.getUpdated()); + + this.cache.put("key", "newValue"); + assertEquals(true, this.listener.getUpdated()); + } + +} diff --git a/libraries/src/test/java/com/baeldung/jcache/JCacheTest.java b/libraries/src/test/java/com/baeldung/jcache/JCacheTest.java new file mode 100644 index 0000000000..2c86a236b4 --- /dev/null +++ b/libraries/src/test/java/com/baeldung/jcache/JCacheTest.java @@ -0,0 +1,27 @@ +package com.baeldung.jcache; + +import static org.junit.Assert.assertEquals; + +import javax.cache.Cache; +import javax.cache.CacheManager; +import javax.cache.Caching; +import javax.cache.configuration.MutableConfiguration; +import javax.cache.spi.CachingProvider; + +import org.junit.Test; + +public class JCacheTest { + + @Test + public void instantiateCache() { + CachingProvider cachingProvider = Caching.getCachingProvider(); + CacheManager cacheManager = cachingProvider.getCacheManager(); + MutableConfiguration config = new MutableConfiguration<>(); + Cache cache = cacheManager.createCache("simpleCache", config); + cache.put("key1", "value1"); + cache.put("key2", "value2"); + assertEquals("value1", cache.get("key1")); + assertEquals("value2", cache.get("key2")); + cacheManager.close(); + } +} diff --git a/libraries/src/test/java/com/baeldung/jcache/SimpleCacheEntryListener.java b/libraries/src/test/java/com/baeldung/jcache/SimpleCacheEntryListener.java new file mode 100644 index 0000000000..b58182eab0 --- /dev/null +++ b/libraries/src/test/java/com/baeldung/jcache/SimpleCacheEntryListener.java @@ -0,0 +1,34 @@ +package com.baeldung.jcache; + +import java.io.Serializable; + +import javax.cache.event.CacheEntryCreatedListener; +import javax.cache.event.CacheEntryEvent; +import javax.cache.event.CacheEntryListenerException; +import javax.cache.event.CacheEntryUpdatedListener; + +public class SimpleCacheEntryListener implements CacheEntryCreatedListener, CacheEntryUpdatedListener, Serializable { + + /** + * + */ + private static final long serialVersionUID = -712657810462878763L; + private boolean updated; + private boolean created; + + public boolean getUpdated() { + return this.updated; + } + + public boolean getCreated() { + return this.created; + } + + public void onUpdated(Iterable> events) throws CacheEntryListenerException { + this.updated = true; + } + + public void onCreated(Iterable> events) throws CacheEntryListenerException { + this.created = true; + } +} \ No newline at end of file diff --git a/libraries/src/test/java/com/baeldung/jcache/SimpleCacheLoader.java b/libraries/src/test/java/com/baeldung/jcache/SimpleCacheLoader.java new file mode 100644 index 0000000000..77ab8fb645 --- /dev/null +++ b/libraries/src/test/java/com/baeldung/jcache/SimpleCacheLoader.java @@ -0,0 +1,24 @@ +package com.baeldung.jcache; + +import java.util.HashMap; +import java.util.Map; + +import javax.cache.integration.CacheLoader; +import javax.cache.integration.CacheLoaderException; + +public class SimpleCacheLoader implements CacheLoader { + + @Override + public String load(Integer key) throws CacheLoaderException { + return "fromCache" + key; + } + + @Override + public Map loadAll(Iterable keys) throws CacheLoaderException { + Map data = new HashMap<>(); + for (int key : keys) { + data.put(key, load(key)); + } + return data; + } +} diff --git a/libraries/src/test/java/com/baeldung/jcache/SimpleEntryProcessor.java b/libraries/src/test/java/com/baeldung/jcache/SimpleEntryProcessor.java new file mode 100644 index 0000000000..bb585807fb --- /dev/null +++ b/libraries/src/test/java/com/baeldung/jcache/SimpleEntryProcessor.java @@ -0,0 +1,25 @@ +package com.baeldung.jcache; + +import java.io.Serializable; + +import javax.cache.processor.EntryProcessor; +import javax.cache.processor.EntryProcessorException; +import javax.cache.processor.MutableEntry; + +public class SimpleEntryProcessor implements EntryProcessor, Serializable { + + /** + * + */ + private static final long serialVersionUID = -5616476363722945132L; + + public String process(MutableEntry entry, Object... args) throws EntryProcessorException { + + if (entry.exists()) { + String current = entry.getValue(); + entry.setValue(current + " - modified"); + return current; + } + return null; + } +} From 1d90d18271d00d019ace4103d4199d4e71a93e1a Mon Sep 17 00:00:00 2001 From: Ahmed Tawila Date: Sat, 9 Sep 2017 20:47:58 +0200 Subject: [PATCH 043/236] BAEL-1109 Introduction to JCache --- libraries/pom.xml | 14 -------------- .../baeldung/jcache/SimpleCacheEntryListener.java | 0 .../com/baeldung/jcache/SimpleCacheLoader.java | 0 .../com/baeldung/jcache/SimpleEntryProcessor.java | 0 4 files changed, 14 deletions(-) rename libraries/src/{test => main}/java/com/baeldung/jcache/SimpleCacheEntryListener.java (100%) rename libraries/src/{test => main}/java/com/baeldung/jcache/SimpleCacheLoader.java (100%) rename libraries/src/{test => main}/java/com/baeldung/jcache/SimpleEntryProcessor.java (100%) diff --git a/libraries/pom.xml b/libraries/pom.xml index 51c79ef0dd..48a4ecd330 100644 --- a/libraries/pom.xml +++ b/libraries/pom.xml @@ -226,10 +226,6 @@ commons-logging commons-logging - - org.slf4j - slf4j-log4j12 - @@ -241,10 +237,6 @@ commons-logging commons-logging - - org.slf4j - slf4j-log4j12 - @@ -252,12 +244,6 @@ flink-test-utils_2.10 ${flink.version} test - - - org.slf4j - slf4j-log4j12 - - org.apache.commons diff --git a/libraries/src/test/java/com/baeldung/jcache/SimpleCacheEntryListener.java b/libraries/src/main/java/com/baeldung/jcache/SimpleCacheEntryListener.java similarity index 100% rename from libraries/src/test/java/com/baeldung/jcache/SimpleCacheEntryListener.java rename to libraries/src/main/java/com/baeldung/jcache/SimpleCacheEntryListener.java diff --git a/libraries/src/test/java/com/baeldung/jcache/SimpleCacheLoader.java b/libraries/src/main/java/com/baeldung/jcache/SimpleCacheLoader.java similarity index 100% rename from libraries/src/test/java/com/baeldung/jcache/SimpleCacheLoader.java rename to libraries/src/main/java/com/baeldung/jcache/SimpleCacheLoader.java diff --git a/libraries/src/test/java/com/baeldung/jcache/SimpleEntryProcessor.java b/libraries/src/main/java/com/baeldung/jcache/SimpleEntryProcessor.java similarity index 100% rename from libraries/src/test/java/com/baeldung/jcache/SimpleEntryProcessor.java rename to libraries/src/main/java/com/baeldung/jcache/SimpleEntryProcessor.java From 602279a7a2d645a8f42f9449e67c104eb5e556d1 Mon Sep 17 00:00:00 2001 From: Ahmed Tawila Date: Sat, 9 Sep 2017 21:07:28 +0200 Subject: [PATCH 044/236] remove unneeded property in pom.xml --- libraries/pom.xml | 1 - 1 file changed, 1 deletion(-) diff --git a/libraries/pom.xml b/libraries/pom.xml index 48a4ecd330..2931f7c0e7 100644 --- a/libraries/pom.xml +++ b/libraries/pom.xml @@ -527,7 +527,6 @@ 1.0 8.2.0 1.0.0 - 1.0.0 3.8.4 \ No newline at end of file From 4647e1b10e3d68376011fdcd401504d54d7251f4 Mon Sep 17 00:00:00 2001 From: Ahmed Tawila Date: Sat, 9 Sep 2017 21:24:52 +0200 Subject: [PATCH 045/236] fix formatting --- libraries/pom.xml | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/libraries/pom.xml b/libraries/pom.xml index d3434bfc85..fbab220a30 100644 --- a/libraries/pom.xml +++ b/libraries/pom.xml @@ -661,10 +661,9 @@ 2.3.0 2.9.9 1.5.1 - 1.14 + 1.14 1.0.3 1.0.0 - 1.0.0 - 3.8.4 + 3.8.4 \ No newline at end of file From 239da95f3d21ec25e945bda22d7e176bc3998bd6 Mon Sep 17 00:00:00 2001 From: Jose Carvajal Date: Wed, 13 Sep 2017 14:36:14 +0200 Subject: [PATCH 046/236] Changes after review --- ...{DiamondOperatorTest.java => DiamondOperatorUnitTest.java} | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) rename core-java/src/test/java/org/baeldung/java/diamond/{DiamondOperatorTest.java => DiamondOperatorUnitTest.java} (65%) diff --git a/core-java/src/test/java/org/baeldung/java/diamond/DiamondOperatorTest.java b/core-java/src/test/java/org/baeldung/java/diamond/DiamondOperatorUnitTest.java similarity index 65% rename from core-java/src/test/java/org/baeldung/java/diamond/DiamondOperatorTest.java rename to core-java/src/test/java/org/baeldung/java/diamond/DiamondOperatorUnitTest.java index ceb7c87100..f6c7f7162f 100644 --- a/core-java/src/test/java/org/baeldung/java/diamond/DiamondOperatorTest.java +++ b/core-java/src/test/java/org/baeldung/java/diamond/DiamondOperatorUnitTest.java @@ -4,9 +4,9 @@ import static org.junit.Assert.assertNotNull; import org.junit.Test; -public class DiamondOperatorTest { +public class DiamondOperatorUnitTest { @Test - public void shouldCreateCarUsingDiamondWithoutWarnings() { + public void whenCreateCarUsingDiamondOperator_thenSuccess() { Car myCar = new Car<>(); assertNotNull(myCar); } From 58aae2a09dc3a5d321dd3b87c65a88ea873fa9d3 Mon Sep 17 00:00:00 2001 From: Ahmed Tawila Date: Sat, 16 Sep 2017 17:43:16 +0200 Subject: [PATCH 047/236] close cache instances properly --- .../src/test/java/com/baeldung/jcache/CacheLoaderTest.java | 6 ++++++ .../test/java/com/baeldung/jcache/EntryProcessorTest.java | 6 ++++++ .../test/java/com/baeldung/jcache/EventListenerTest.java | 6 ++++++ 3 files changed, 18 insertions(+) diff --git a/libraries/src/test/java/com/baeldung/jcache/CacheLoaderTest.java b/libraries/src/test/java/com/baeldung/jcache/CacheLoaderTest.java index e2167b39ad..389aec836e 100644 --- a/libraries/src/test/java/com/baeldung/jcache/CacheLoaderTest.java +++ b/libraries/src/test/java/com/baeldung/jcache/CacheLoaderTest.java @@ -9,6 +9,7 @@ import javax.cache.configuration.FactoryBuilder; import javax.cache.configuration.MutableConfiguration; import javax.cache.spi.CachingProvider; +import org.junit.After; import org.junit.Before; import org.junit.Test; @@ -32,4 +33,9 @@ public class CacheLoaderTest { assertEquals("fromCache" + i, value); } } + + @After + public void closeCache() { + cache.close(); + } } diff --git a/libraries/src/test/java/com/baeldung/jcache/EntryProcessorTest.java b/libraries/src/test/java/com/baeldung/jcache/EntryProcessorTest.java index fba6067885..e92687227f 100644 --- a/libraries/src/test/java/com/baeldung/jcache/EntryProcessorTest.java +++ b/libraries/src/test/java/com/baeldung/jcache/EntryProcessorTest.java @@ -8,6 +8,7 @@ import javax.cache.Caching; import javax.cache.configuration.MutableConfiguration; import javax.cache.spi.CachingProvider; +import org.junit.After; import org.junit.Before; import org.junit.Test; @@ -29,4 +30,9 @@ public class EntryProcessorTest { this.cache.invoke("key", new SimpleEntryProcessor()); assertEquals("value - modified", cache.get("key")); } + + @After + public void closeCache() { + cache.close(); + } } diff --git a/libraries/src/test/java/com/baeldung/jcache/EventListenerTest.java b/libraries/src/test/java/com/baeldung/jcache/EventListenerTest.java index 5fb0b317e2..4bb054624f 100644 --- a/libraries/src/test/java/com/baeldung/jcache/EventListenerTest.java +++ b/libraries/src/test/java/com/baeldung/jcache/EventListenerTest.java @@ -10,6 +10,7 @@ import javax.cache.configuration.MutableCacheEntryListenerConfiguration; import javax.cache.configuration.MutableConfiguration; import javax.cache.spi.CachingProvider; +import org.junit.After; import org.junit.Before; import org.junit.Test; @@ -43,4 +44,9 @@ public class EventListenerTest { assertEquals(true, this.listener.getUpdated()); } + @After + public void closeCache() { + cache.close(); + } + } From 870b93df707c116a0ba8dfacc62754c8eb6f6f75 Mon Sep 17 00:00:00 2001 From: Ahmed Tawila Date: Sat, 16 Sep 2017 20:35:15 +0200 Subject: [PATCH 048/236] remove latest commit --- .../src/test/java/com/baeldung/jcache/CacheLoaderTest.java | 6 ------ .../test/java/com/baeldung/jcache/EntryProcessorTest.java | 6 ------ .../test/java/com/baeldung/jcache/EventListenerTest.java | 7 ------- 3 files changed, 19 deletions(-) diff --git a/libraries/src/test/java/com/baeldung/jcache/CacheLoaderTest.java b/libraries/src/test/java/com/baeldung/jcache/CacheLoaderTest.java index 389aec836e..e2167b39ad 100644 --- a/libraries/src/test/java/com/baeldung/jcache/CacheLoaderTest.java +++ b/libraries/src/test/java/com/baeldung/jcache/CacheLoaderTest.java @@ -9,7 +9,6 @@ import javax.cache.configuration.FactoryBuilder; import javax.cache.configuration.MutableConfiguration; import javax.cache.spi.CachingProvider; -import org.junit.After; import org.junit.Before; import org.junit.Test; @@ -33,9 +32,4 @@ public class CacheLoaderTest { assertEquals("fromCache" + i, value); } } - - @After - public void closeCache() { - cache.close(); - } } diff --git a/libraries/src/test/java/com/baeldung/jcache/EntryProcessorTest.java b/libraries/src/test/java/com/baeldung/jcache/EntryProcessorTest.java index e92687227f..fba6067885 100644 --- a/libraries/src/test/java/com/baeldung/jcache/EntryProcessorTest.java +++ b/libraries/src/test/java/com/baeldung/jcache/EntryProcessorTest.java @@ -8,7 +8,6 @@ import javax.cache.Caching; import javax.cache.configuration.MutableConfiguration; import javax.cache.spi.CachingProvider; -import org.junit.After; import org.junit.Before; import org.junit.Test; @@ -30,9 +29,4 @@ public class EntryProcessorTest { this.cache.invoke("key", new SimpleEntryProcessor()); assertEquals("value - modified", cache.get("key")); } - - @After - public void closeCache() { - cache.close(); - } } diff --git a/libraries/src/test/java/com/baeldung/jcache/EventListenerTest.java b/libraries/src/test/java/com/baeldung/jcache/EventListenerTest.java index 4bb054624f..d68d63eb69 100644 --- a/libraries/src/test/java/com/baeldung/jcache/EventListenerTest.java +++ b/libraries/src/test/java/com/baeldung/jcache/EventListenerTest.java @@ -10,7 +10,6 @@ import javax.cache.configuration.MutableCacheEntryListenerConfiguration; import javax.cache.configuration.MutableConfiguration; import javax.cache.spi.CachingProvider; -import org.junit.After; import org.junit.Before; import org.junit.Test; @@ -43,10 +42,4 @@ public class EventListenerTest { this.cache.put("key", "newValue"); assertEquals(true, this.listener.getUpdated()); } - - @After - public void closeCache() { - cache.close(); - } - } From 28ad804484b59e7952566989f5284fa220595661 Mon Sep 17 00:00:00 2001 From: Dassi Orleando Date: Wed, 20 Sep 2017 07:01:45 +0100 Subject: [PATCH 049/236] BAEL-1107 - Introduction to Apache Cayenne Orm --- apache-cayenne/pom.xml | 59 ++++++++ .../apachecayenne/persistent/Article.java | 9 ++ .../apachecayenne/persistent/Author.java | 9 ++ .../persistent/auto/_Article.java | 47 ++++++ .../persistent/auto/_Author.java | 52 +++++++ .../src/main/resources/cayenne-project.xml | 17 +++ .../src/main/resources/datamap.map.xml | 34 +++++ .../apachecayenne/CayenneOperationTests.java | 140 ++++++++++++++++++ pom.xml | 1 + 9 files changed, 368 insertions(+) create mode 100644 apache-cayenne/pom.xml create mode 100644 apache-cayenne/src/main/java/com/baeldung/apachecayenne/persistent/Article.java create mode 100644 apache-cayenne/src/main/java/com/baeldung/apachecayenne/persistent/Author.java create mode 100644 apache-cayenne/src/main/java/com/baeldung/apachecayenne/persistent/auto/_Article.java create mode 100644 apache-cayenne/src/main/java/com/baeldung/apachecayenne/persistent/auto/_Author.java create mode 100644 apache-cayenne/src/main/resources/cayenne-project.xml create mode 100644 apache-cayenne/src/main/resources/datamap.map.xml create mode 100644 apache-cayenne/src/test/java/com/baeldung/apachecayenne/CayenneOperationTests.java diff --git a/apache-cayenne/pom.xml b/apache-cayenne/pom.xml new file mode 100644 index 0000000000..23837d7019 --- /dev/null +++ b/apache-cayenne/pom.xml @@ -0,0 +1,59 @@ + + + 4.0.0 + + apache-cayenne + 0.0.1-SNAPSHOT + jar + + apache-cayenne + Introduction to Apache Cayenne + + + com.baeldung + parent-modules + 1.0.0-SNAPSHOT + + + + UTF-8 + UTF-8 + 1.8 + 5.1.31 + 4.0.M5 + 4.12 + + + + + org.apache.cayenne + cayenne-server + ${cayenne.version} + + + mysql + mysql-connector-java + ${mysql.connector.version} + runtime + + + + junit + junit + ${junit.version} + test + + + + + + + org.apache.cayenne.plugins + cayenne-modeler-maven-plugin + ${cayenne.version} + + + + + diff --git a/apache-cayenne/src/main/java/com/baeldung/apachecayenne/persistent/Article.java b/apache-cayenne/src/main/java/com/baeldung/apachecayenne/persistent/Article.java new file mode 100644 index 0000000000..303c180887 --- /dev/null +++ b/apache-cayenne/src/main/java/com/baeldung/apachecayenne/persistent/Article.java @@ -0,0 +1,9 @@ +package com.baeldung.apachecayenne.persistent; + +import com.baeldung.apachecayenne.persistent.auto._Article; + +public class Article extends _Article { + + private static final long serialVersionUID = 1L; + +} diff --git a/apache-cayenne/src/main/java/com/baeldung/apachecayenne/persistent/Author.java b/apache-cayenne/src/main/java/com/baeldung/apachecayenne/persistent/Author.java new file mode 100644 index 0000000000..5a8df57c6e --- /dev/null +++ b/apache-cayenne/src/main/java/com/baeldung/apachecayenne/persistent/Author.java @@ -0,0 +1,9 @@ +package com.baeldung.apachecayenne.persistent; + +import com.baeldung.apachecayenne.persistent.auto._Author; + +public class Author extends _Author { + + private static final long serialVersionUID = 1L; + +} diff --git a/apache-cayenne/src/main/java/com/baeldung/apachecayenne/persistent/auto/_Article.java b/apache-cayenne/src/main/java/com/baeldung/apachecayenne/persistent/auto/_Article.java new file mode 100644 index 0000000000..f6c179fcfd --- /dev/null +++ b/apache-cayenne/src/main/java/com/baeldung/apachecayenne/persistent/auto/_Article.java @@ -0,0 +1,47 @@ +package com.baeldung.apachecayenne.persistent.auto; + +import org.apache.cayenne.CayenneDataObject; +import org.apache.cayenne.exp.Property; + +import com.baeldung.apachecayenne.persistent.Author; + +/** + * Class _Article was generated by Cayenne. + * It is probably a good idea to avoid changing this class manually, + * since it may be overwritten next time code is regenerated. + * If you need to make any customizations, please use subclass. + */ +public abstract class _Article extends CayenneDataObject { + + private static final long serialVersionUID = 1L; + + public static final String ID_PK_COLUMN = "id"; + + public static final Property CONTENT = Property.create("content", String.class); + public static final Property TITLE = Property.create("title", String.class); + public static final Property AUTHOR = Property.create("author", Author.class); + + public void setContent(String content) { + writeProperty("content", content); + } + public String getContent() { + return (String)readProperty("content"); + } + + public void setTitle(String title) { + writeProperty("title", title); + } + public String getTitle() { + return (String)readProperty("title"); + } + + public void setAuthor(Author author) { + setToOneTarget("author", author, true); + } + + public Author getAuthor() { + return (Author)readProperty("author"); + } + + +} diff --git a/apache-cayenne/src/main/java/com/baeldung/apachecayenne/persistent/auto/_Author.java b/apache-cayenne/src/main/java/com/baeldung/apachecayenne/persistent/auto/_Author.java new file mode 100644 index 0000000000..3d068423c8 --- /dev/null +++ b/apache-cayenne/src/main/java/com/baeldung/apachecayenne/persistent/auto/_Author.java @@ -0,0 +1,52 @@ +package com.baeldung.apachecayenne.persistent.auto; + +import java.util.List; + +import org.apache.cayenne.CayenneDataObject; +import org.apache.cayenne.exp.Property; + +import com.baeldung.apachecayenne.persistent.Article; + +/** + * Class _Author was generated by Cayenne. + * It is probably a good idea to avoid changing this class manually, + * since it may be overwritten next time code is regenerated. + * If you need to make any customizations, please use subclass. + */ +public abstract class _Author extends CayenneDataObject { + + private static final long serialVersionUID = 1L; + + public static final String ID_PK_COLUMN = "id"; + + public static final Property FIRSTNAME = Property.create("firstname", String.class); + public static final Property LASTNAME = Property.create("lastname", String.class); + public static final Property> ARTICLES = Property.create("articles", List.class); + + public void setFirstname(String firstname) { + writeProperty("firstname", firstname); + } + public String getFirstname() { + return (String)readProperty("firstname"); + } + + public void setLastname(String lastname) { + writeProperty("lastname", lastname); + } + public String getLastname() { + return (String)readProperty("lastname"); + } + + public void addToArticles(Article obj) { + addToManyTarget("articles", obj, true); + } + public void removeFromArticles(Article obj) { + removeToManyTarget("articles", obj, true); + } + @SuppressWarnings("unchecked") + public List
getArticles() { + return (List
)readProperty("articles"); + } + + +} diff --git a/apache-cayenne/src/main/resources/cayenne-project.xml b/apache-cayenne/src/main/resources/cayenne-project.xml new file mode 100644 index 0000000000..3f3c59e0e9 --- /dev/null +++ b/apache-cayenne/src/main/resources/cayenne-project.xml @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + diff --git a/apache-cayenne/src/main/resources/datamap.map.xml b/apache-cayenne/src/main/resources/datamap.map.xml new file mode 100644 index 0000000000..dc78ad4348 --- /dev/null +++ b/apache-cayenne/src/main/resources/datamap.map.xml @@ -0,0 +1,34 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/apache-cayenne/src/test/java/com/baeldung/apachecayenne/CayenneOperationTests.java b/apache-cayenne/src/test/java/com/baeldung/apachecayenne/CayenneOperationTests.java new file mode 100644 index 0000000000..da9667b029 --- /dev/null +++ b/apache-cayenne/src/test/java/com/baeldung/apachecayenne/CayenneOperationTests.java @@ -0,0 +1,140 @@ +package com.baeldung.apachecayenne; + +import com.baeldung.apachecayenne.persistent.Article; +import com.baeldung.apachecayenne.persistent.Author; +import org.apache.cayenne.ObjectContext; +import org.apache.cayenne.configuration.server.ServerRuntime; +import org.apache.cayenne.query.ObjectSelect; +import org.apache.cayenne.query.SQLTemplate; +import org.junit.After; +import org.junit.BeforeClass; +import org.junit.Test; + +import java.util.List; + +import static junit.framework.Assert.assertEquals; +import static org.junit.Assert.assertNull; + + +public class CayenneOperationTests { + private static ObjectContext context = null; + + @BeforeClass + public static void setupTheCayenneContext(){ + ServerRuntime cayenneRuntime = ServerRuntime.builder() + .addConfig("cayenne-project.xml") + .build(); + context = cayenneRuntime.newContext(); + } + + @After + public void deleteAllRecords(){ + SQLTemplate deleteArticles = new SQLTemplate(Article.class, "delete from article"); + SQLTemplate deleteAuthors = new SQLTemplate(Author.class, "delete from author"); + + context.performGenericQuery(deleteArticles); + context.performGenericQuery(deleteAuthors); + } + + @Test + public void givenAuthor_whenInsert_thenWeGetOneRecordInTheDatabase(){ + Author author = context.newObject(Author.class); + author.setFirstname("Paul"); + author.setLastname("Smith"); + + context.commitChanges(); + + long records = ObjectSelect.dataRowQuery(Author.class).selectCount(context); + assertEquals(1, records); + } + + @Test + public void givenAuthor_whenInsert_andQueryByFirstName_thenWeGetTheAuthor(){ + Author author = context.newObject(Author.class); + author.setFirstname("Paul"); + author.setLastname("Smith"); + + context.commitChanges(); + + Author expectedAuthor = ObjectSelect.query(Author.class) + .where(Author.FIRSTNAME.eq("Paul")) + .selectOne(context); + + assertEquals("Paul", expectedAuthor.getFirstname()); + assertEquals("Smith", expectedAuthor.getLastname()); + } + + @Test + public void givenTwoAuthor_whenInsert_andQueryAll_thenWeGetTwoAuthors(){ + Author firstAuthor = context.newObject(Author.class); + firstAuthor.setFirstname("Paul"); + firstAuthor.setLastname("Smith"); + + Author secondAuthor = context.newObject(Author.class); + secondAuthor.setFirstname("Ludovic"); + secondAuthor.setLastname("Garcia"); + + context.commitChanges(); + + List authors = ObjectSelect.query(Author.class).select(context); + assertEquals(2, authors.size()); + } + + @Test + public void givenAuthor_whenUpdating_thenWeGetAnUpatedeAuthor(){ + Author author = context.newObject(Author.class); + author.setFirstname("Paul"); + author.setLastname("Smith"); + context.commitChanges(); + + Author expectedAuthor = ObjectSelect.query(Author.class) + .where(Author.FIRSTNAME.eq("Paul")) + .selectOne(context); + expectedAuthor.setLastname("Smith 2"); + context.commitChanges(); + + assertEquals(author.getFirstname(), expectedAuthor.getFirstname()); + assertEquals(author.getLastname(), expectedAuthor.getLastname()); + } + + @Test + public void givenAuthor_whenDeleting_thenWeLostHisDetails(){ + Author author = context.newObject(Author.class); + author.setFirstname("Paul"); + author.setLastname("Smith"); + context.commitChanges(); + + Author savedAuthor = ObjectSelect.query(Author.class) + .where(Author.FIRSTNAME.eq("Paul")).selectOne(context); + if(savedAuthor != null) { + context.deleteObjects(author); + context.commitChanges(); + } + + Author expectedAuthor = ObjectSelect.query(Author.class) + .where(Author.FIRSTNAME.eq("Paul")).selectOne(context); + assertNull(expectedAuthor); + } + + @Test + public void givenAuthor_whenAttachingToArticle_thenTheRelationIsMade(){ + Author author = context.newObject(Author.class); + author.setFirstname("Paul"); + author.setLastname("Smith"); + + Article article = context.newObject(Article.class); + article.setTitle("My post title"); + article.setContent("The content"); + article.setAuthor(author); + + context.commitChanges(); + + Author expectedAuthor = ObjectSelect.query(Author.class) + .where(Author.LASTNAME.eq("Smith")) + .selectOne(context); + + Article expectedArticle = (expectedAuthor.getArticles()).get(0); + assertEquals(article.getTitle(), expectedArticle.getTitle()); + } + +} diff --git a/pom.xml b/pom.xml index dfa7e09acc..083cee017b 100644 --- a/pom.xml +++ b/pom.xml @@ -28,6 +28,7 @@ + apache-cayenne aws akka-streams algorithms From 8b9037ff0a30d0f045a24d9173eca4b28c4085bf Mon Sep 17 00:00:00 2001 From: Dassi Orleando Date: Sat, 23 Sep 2017 00:24:55 +0100 Subject: [PATCH 050/236] BAEL-1107: update formating and version of libs --- apache-cayenne/pom.xml | 2 +- .../apachecayenne/CayenneOperationTests.java | 16 ++++++++-------- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/apache-cayenne/pom.xml b/apache-cayenne/pom.xml index 23837d7019..52631e8594 100644 --- a/apache-cayenne/pom.xml +++ b/apache-cayenne/pom.xml @@ -20,7 +20,7 @@ UTF-8 UTF-8 1.8 - 5.1.31 + 5.1.44 4.0.M5 4.12 diff --git a/apache-cayenne/src/test/java/com/baeldung/apachecayenne/CayenneOperationTests.java b/apache-cayenne/src/test/java/com/baeldung/apachecayenne/CayenneOperationTests.java index da9667b029..b92096c0fa 100644 --- a/apache-cayenne/src/test/java/com/baeldung/apachecayenne/CayenneOperationTests.java +++ b/apache-cayenne/src/test/java/com/baeldung/apachecayenne/CayenneOperationTests.java @@ -20,7 +20,7 @@ public class CayenneOperationTests { private static ObjectContext context = null; @BeforeClass - public static void setupTheCayenneContext(){ + public static void setupTheCayenneContext() { ServerRuntime cayenneRuntime = ServerRuntime.builder() .addConfig("cayenne-project.xml") .build(); @@ -28,7 +28,7 @@ public class CayenneOperationTests { } @After - public void deleteAllRecords(){ + public void deleteAllRecords() { SQLTemplate deleteArticles = new SQLTemplate(Article.class, "delete from article"); SQLTemplate deleteAuthors = new SQLTemplate(Author.class, "delete from author"); @@ -37,7 +37,7 @@ public class CayenneOperationTests { } @Test - public void givenAuthor_whenInsert_thenWeGetOneRecordInTheDatabase(){ + public void givenAuthor_whenInsert_thenWeGetOneRecordInTheDatabase() { Author author = context.newObject(Author.class); author.setFirstname("Paul"); author.setLastname("Smith"); @@ -49,7 +49,7 @@ public class CayenneOperationTests { } @Test - public void givenAuthor_whenInsert_andQueryByFirstName_thenWeGetTheAuthor(){ + public void givenAuthor_whenInsert_andQueryByFirstName_thenWeGetTheAuthor() { Author author = context.newObject(Author.class); author.setFirstname("Paul"); author.setLastname("Smith"); @@ -65,7 +65,7 @@ public class CayenneOperationTests { } @Test - public void givenTwoAuthor_whenInsert_andQueryAll_thenWeGetTwoAuthors(){ + public void givenTwoAuthor_whenInsert_andQueryAll_thenWeGetTwoAuthors() { Author firstAuthor = context.newObject(Author.class); firstAuthor.setFirstname("Paul"); firstAuthor.setLastname("Smith"); @@ -81,7 +81,7 @@ public class CayenneOperationTests { } @Test - public void givenAuthor_whenUpdating_thenWeGetAnUpatedeAuthor(){ + public void givenAuthor_whenUpdating_thenWeGetAnUpatedeAuthor() { Author author = context.newObject(Author.class); author.setFirstname("Paul"); author.setLastname("Smith"); @@ -98,7 +98,7 @@ public class CayenneOperationTests { } @Test - public void givenAuthor_whenDeleting_thenWeLostHisDetails(){ + public void givenAuthor_whenDeleting_thenWeLostHisDetails() { Author author = context.newObject(Author.class); author.setFirstname("Paul"); author.setLastname("Smith"); @@ -117,7 +117,7 @@ public class CayenneOperationTests { } @Test - public void givenAuthor_whenAttachingToArticle_thenTheRelationIsMade(){ + public void givenAuthor_whenAttachingToArticle_thenTheRelationIsMade() { Author author = context.newObject(Author.class); author.setFirstname("Paul"); author.setLastname("Smith"); From a6befdb84eb43bbf3a45db818227b37fe8eac337 Mon Sep 17 00:00:00 2001 From: Ahmed Tawila Date: Sat, 23 Sep 2017 04:59:49 +0200 Subject: [PATCH 051/236] BAEL-1057 Introduction to rxjava-jdbc --- rxjava/pom.xml | 19 + .../com/baeldung/rxjava/jdbc/Connector.java | 8 + .../com/baeldung/rxjava/jdbc/Employee.java | 13 + .../com/baeldung/rxjava/jdbc/Manager.java | 29 + .../java/com/baeldung/rxjava/jdbc/Utils.java | 16 + .../rxjava/jdbc/AutomapClassTest.java | 71 + .../rxjava/jdbc/AutomapInterfaceTest.java | 72 + .../rxjava/jdbc/BasicQueryTypesTest.java | 83 + .../baeldung/rxjava/jdbc/InsertBlobTest.java | 72 + .../baeldung/rxjava/jdbc/InsertClobTest.java | 68 + .../baeldung/rxjava/jdbc/ReturnKeysTest.java | 45 + .../baeldung/rxjava/jdbc/TransactionTest.java | 46 + rxjava/src/test/resources/actual_clob | 1546 +++++++++++++++++ rxjava/src/test/resources/expected_clob | 1546 +++++++++++++++++ 14 files changed, 3634 insertions(+) create mode 100644 rxjava/src/main/java/com/baeldung/rxjava/jdbc/Connector.java create mode 100644 rxjava/src/main/java/com/baeldung/rxjava/jdbc/Employee.java create mode 100644 rxjava/src/main/java/com/baeldung/rxjava/jdbc/Manager.java create mode 100644 rxjava/src/main/java/com/baeldung/rxjava/jdbc/Utils.java create mode 100644 rxjava/src/test/java/com/baeldung/rxjava/jdbc/AutomapClassTest.java create mode 100644 rxjava/src/test/java/com/baeldung/rxjava/jdbc/AutomapInterfaceTest.java create mode 100644 rxjava/src/test/java/com/baeldung/rxjava/jdbc/BasicQueryTypesTest.java create mode 100644 rxjava/src/test/java/com/baeldung/rxjava/jdbc/InsertBlobTest.java create mode 100644 rxjava/src/test/java/com/baeldung/rxjava/jdbc/InsertClobTest.java create mode 100644 rxjava/src/test/java/com/baeldung/rxjava/jdbc/ReturnKeysTest.java create mode 100644 rxjava/src/test/java/com/baeldung/rxjava/jdbc/TransactionTest.java create mode 100644 rxjava/src/test/resources/actual_clob create mode 100644 rxjava/src/test/resources/expected_clob diff --git a/rxjava/pom.xml b/rxjava/pom.xml index bf5f073d8d..ac2b923068 100644 --- a/rxjava/pom.xml +++ b/rxjava/pom.xml @@ -31,10 +31,29 @@ awaitility 1.7.0 + + com.github.davidmoten + rxjava-jdbc + ${rx.java.jdbc.version} + + + com.h2database + h2 + ${h2.version} + runtime + + + org.assertj + assertj-core + ${assertj.version} + + 3.8.0 1.2.5 + 0.7.11 + 1.4.196 diff --git a/rxjava/src/main/java/com/baeldung/rxjava/jdbc/Connector.java b/rxjava/src/main/java/com/baeldung/rxjava/jdbc/Connector.java new file mode 100644 index 0000000000..ca241d74c4 --- /dev/null +++ b/rxjava/src/main/java/com/baeldung/rxjava/jdbc/Connector.java @@ -0,0 +1,8 @@ +package com.baeldung.rxjava.jdbc; + +public class Connector { + + public static final String DB_CONNECTION = "jdbc:h2:mem:test;DB_CLOSE_DELAY=-1"; + public static final String DB_USER = ""; + public static final String DB_PASSWORD = ""; +} diff --git a/rxjava/src/main/java/com/baeldung/rxjava/jdbc/Employee.java b/rxjava/src/main/java/com/baeldung/rxjava/jdbc/Employee.java new file mode 100644 index 0000000000..790dddeb74 --- /dev/null +++ b/rxjava/src/main/java/com/baeldung/rxjava/jdbc/Employee.java @@ -0,0 +1,13 @@ +package com.baeldung.rxjava.jdbc; + +import com.github.davidmoten.rx.jdbc.annotations.Column; + +public interface Employee { + + @Column("id") + int id(); + + @Column("name") + String name(); + +} diff --git a/rxjava/src/main/java/com/baeldung/rxjava/jdbc/Manager.java b/rxjava/src/main/java/com/baeldung/rxjava/jdbc/Manager.java new file mode 100644 index 0000000000..d2b87fc897 --- /dev/null +++ b/rxjava/src/main/java/com/baeldung/rxjava/jdbc/Manager.java @@ -0,0 +1,29 @@ +package com.baeldung.rxjava.jdbc; + +public class Manager { + + private int id; + private String name; + + public Manager(int id, String name) { + this.id = id; + this.name = name; + } + + public int getId() { + return id; + } + + public void setId(int id) { + this.id = id; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + +} diff --git a/rxjava/src/main/java/com/baeldung/rxjava/jdbc/Utils.java b/rxjava/src/main/java/com/baeldung/rxjava/jdbc/Utils.java new file mode 100644 index 0000000000..f1dbd2676b --- /dev/null +++ b/rxjava/src/main/java/com/baeldung/rxjava/jdbc/Utils.java @@ -0,0 +1,16 @@ +package com.baeldung.rxjava.jdbc; + +import java.io.IOException; +import java.io.InputStream; +import java.io.StringWriter; + +import org.apache.commons.io.IOUtils; + +public class Utils { + + public static String getStringFromInputStream(InputStream input) throws IOException { + StringWriter writer = new StringWriter(); + IOUtils.copy(input, writer, "UTF-8"); + return writer.toString(); + } +} diff --git a/rxjava/src/test/java/com/baeldung/rxjava/jdbc/AutomapClassTest.java b/rxjava/src/test/java/com/baeldung/rxjava/jdbc/AutomapClassTest.java new file mode 100644 index 0000000000..e8bca98701 --- /dev/null +++ b/rxjava/src/test/java/com/baeldung/rxjava/jdbc/AutomapClassTest.java @@ -0,0 +1,71 @@ +package com.baeldung.rxjava.jdbc; + +import static org.assertj.core.api.Assertions.assertThat; + +import java.util.List; + +import org.junit.After; +import org.junit.Before; +import org.junit.Test; + +import com.github.davidmoten.rx.jdbc.ConnectionProvider; +import com.github.davidmoten.rx.jdbc.ConnectionProviderFromUrl; +import com.github.davidmoten.rx.jdbc.Database; + +import rx.Observable; + +public class AutomapClassTest { + + private String DB_CONNECTION = Connector.DB_CONNECTION; + private String DB_USER = Connector.DB_USER; + private String DB_PASSWORD = Connector.DB_PASSWORD; + + ConnectionProvider cp = null; + Database db = null; + + Observable create = null; + Observable insert1, insert2 = null; + + @Before + public void setup() { + cp = new ConnectionProviderFromUrl(DB_CONNECTION, DB_USER, DB_PASSWORD); + db = Database.from(cp); + + create = db.update("CREATE TABLE IF NOT EXISTS MANAGER(id int primary key, name varchar(255))") + .count(); + insert1 = db.update("INSERT INTO MANAGER(id, name) VALUES(1, 'Alan')") + .dependsOn(create) + .count(); + insert2 = db.update("INSERT INTO MANAGER(id, name) VALUES(2, 'Sarah')") + .dependsOn(create) + .count(); + } + + @Test + public void whenSelectManagersAndAutomap_thenCorrect() { + List managers = db.select("select id, name from MANAGER") + .dependsOn(create) + .dependsOn(insert1) + .dependsOn(insert2) + .autoMap(Manager.class) + .toList() + .toBlocking() + .single(); + + assertThat(managers.get(0) + .getId()).isEqualTo(1); + assertThat(managers.get(0) + .getName()).isEqualTo("Alan"); + assertThat(managers.get(1) + .getId()).isEqualTo(2); + assertThat(managers.get(1) + .getName()).isEqualTo("Sarah"); + } + + @After + public void close() { + db.update("DROP TABLE MANAGER") + .dependsOn(create); + cp.close(); + } +} diff --git a/rxjava/src/test/java/com/baeldung/rxjava/jdbc/AutomapInterfaceTest.java b/rxjava/src/test/java/com/baeldung/rxjava/jdbc/AutomapInterfaceTest.java new file mode 100644 index 0000000000..f636dda155 --- /dev/null +++ b/rxjava/src/test/java/com/baeldung/rxjava/jdbc/AutomapInterfaceTest.java @@ -0,0 +1,72 @@ +package com.baeldung.rxjava.jdbc; + +import static org.assertj.core.api.Assertions.assertThat; + +import java.util.List; + +import org.junit.After; +import org.junit.Before; +import org.junit.Test; + +import com.github.davidmoten.rx.jdbc.ConnectionProvider; +import com.github.davidmoten.rx.jdbc.ConnectionProviderFromUrl; +import com.github.davidmoten.rx.jdbc.Database; + +import rx.Observable; + +public class AutomapInterfaceTest { + + private String DB_CONNECTION = Connector.DB_CONNECTION; + private String DB_USER = Connector.DB_USER; + private String DB_PASSWORD = Connector.DB_PASSWORD; + + ConnectionProvider cp = null; + Database db = null; + + Observable create = null; + Observable insert1, insert2 = null; + + @Before + public void setup() { + cp = new ConnectionProviderFromUrl(DB_CONNECTION, DB_USER, DB_PASSWORD); + db = Database.from(cp); + + create = db.update("CREATE TABLE IF NOT EXISTS EMPLOYEE(id int primary key, name varchar(255))") + .count(); + insert1 = db.update("INSERT INTO EMPLOYEE(id, name) VALUES(1, 'Alan')") + .dependsOn(create) + .count(); + insert2 = db.update("INSERT INTO EMPLOYEE(id, name) VALUES(2, 'Sarah')") + .dependsOn(create) + .count(); + } + + @Test + public void whenSelectFromTableAndAutomap_thenCorrect() { + List employees = db.select("select id, name from EMPLOYEE") + .dependsOn(create) + .dependsOn(insert1) + .dependsOn(insert2) + .autoMap(Employee.class) + .toList() + .toBlocking() + .single(); + + assertThat(employees.get(0) + .id()).isEqualTo(1); + assertThat(employees.get(0) + .name()).isEqualTo("Alan"); + assertThat(employees.get(1) + .id()).isEqualTo(2); + assertThat(employees.get(1) + .name()).isEqualTo("Sarah"); + } + + @After + public void close() { + db.update("DROP TABLE EMPLOYEE") + .dependsOn(create); + cp.close(); + } + +} diff --git a/rxjava/src/test/java/com/baeldung/rxjava/jdbc/BasicQueryTypesTest.java b/rxjava/src/test/java/com/baeldung/rxjava/jdbc/BasicQueryTypesTest.java new file mode 100644 index 0000000000..6118e6f127 --- /dev/null +++ b/rxjava/src/test/java/com/baeldung/rxjava/jdbc/BasicQueryTypesTest.java @@ -0,0 +1,83 @@ +package com.baeldung.rxjava.jdbc; + +import static org.junit.Assert.assertEquals; + +import java.util.Arrays; +import java.util.List; + +import org.junit.After; +import org.junit.Before; +import org.junit.Test; + +import com.github.davidmoten.rx.jdbc.ConnectionProvider; +import com.github.davidmoten.rx.jdbc.ConnectionProviderFromUrl; +import com.github.davidmoten.rx.jdbc.Database; + +import rx.Observable; + +public class BasicQueryTypesTest { + + private String DB_CONNECTION = Connector.DB_CONNECTION; + private String DB_USER = Connector.DB_USER; + private String DB_PASSWORD = Connector.DB_PASSWORD; + + ConnectionProvider cp = null; + Database db = null; + + Observable create, insert1, insert2, insert3, insert4, insert5, update, delete = null; + + @Before + public void setup() { + cp = new ConnectionProviderFromUrl(DB_CONNECTION, DB_USER, DB_PASSWORD); + db = Database.from(cp); + } + + @Test + public void whenCreateTableAndInsertRecords_thenCorrect() { + create = db.update("CREATE TABLE IF NOT EXISTS EMPLOYEE(id int primary key, name varchar(255))") + .count(); + insert1 = db.update("INSERT INTO EMPLOYEE(id, name) VALUES(1, 'John')") + .dependsOn(create) + .count(); + update = db.update("UPDATE EMPLOYEE SET name = 'Alan' WHERE id = 1") + .dependsOn(create) + .count(); + insert2 = db.update("INSERT INTO EMPLOYEE(id, name) VALUES(2, 'Sarah')") + .dependsOn(create) + .count(); + insert3 = db.update("INSERT INTO EMPLOYEE(id, name) VALUES(3, 'Mike')") + .dependsOn(create) + .count(); + insert4 = db.update("INSERT INTO EMPLOYEE(id, name) VALUES(4, 'Jennifer')") + .dependsOn(create) + .count(); + insert5 = db.update("INSERT INTO EMPLOYEE(id, name) VALUES(5, 'George')") + .dependsOn(create) + .count(); + delete = db.update("DELETE FROM EMPLOYEE WHERE id = 5") + .dependsOn(create) + .count(); + List names = db.select("select name from EMPLOYEE where id > ?") + .parameter(2) + .dependsOn(create) + .dependsOn(insert1) + .dependsOn(insert2) + .dependsOn(insert3) + .dependsOn(insert4) + .dependsOn(insert5) + .dependsOn(update) + .dependsOn(delete) + .getAs(String.class) + .toList() + .toBlocking() + .single(); + assertEquals(Arrays.asList("Mike", "Jennifer"), names); + } + + @After + public void close() { + db.update("DROP TABLE EMPLOYEE") + .dependsOn(create); + cp.close(); + } +} diff --git a/rxjava/src/test/java/com/baeldung/rxjava/jdbc/InsertBlobTest.java b/rxjava/src/test/java/com/baeldung/rxjava/jdbc/InsertBlobTest.java new file mode 100644 index 0000000000..ced394eccb --- /dev/null +++ b/rxjava/src/test/java/com/baeldung/rxjava/jdbc/InsertBlobTest.java @@ -0,0 +1,72 @@ +package com.baeldung.rxjava.jdbc; + +import static org.junit.Assert.assertEquals; + +import java.io.FileInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.StringWriter; +import java.nio.charset.StandardCharsets; + +import org.apache.commons.io.IOUtils; +import org.junit.After; +import org.junit.Before; +import org.junit.Test; + +import com.github.davidmoten.rx.jdbc.ConnectionProvider; +import com.github.davidmoten.rx.jdbc.ConnectionProviderFromUrl; +import com.github.davidmoten.rx.jdbc.Database; + +import rx.Observable; + +public class InsertBlobTest { + + private String DB_CONNECTION = Connector.DB_CONNECTION; + private String DB_USER = Connector.DB_USER; + private String DB_PASSWORD = Connector.DB_PASSWORD; + + ConnectionProvider cp = new ConnectionProviderFromUrl(DB_CONNECTION, DB_USER, DB_PASSWORD); + Database db = Database.from(cp); + + String expectedDocument = null; + String actualDocument = null; + + Observable create, insert = null; + + @Before + public void setup() throws IOException { + create = db.update("CREATE TABLE IF NOT EXISTS SERVERLOG (id int primary key, document BLOB)") + .count(); + + InputStream actualInputStream = new FileInputStream("src/test/resources/actual_clob"); + this.actualDocument = Utils.getStringFromInputStream(actualInputStream); + byte[] bytes = this.actualDocument.getBytes(StandardCharsets.UTF_8); + + InputStream expectedInputStream = new FileInputStream("src/test/resources/expected_clob"); + this.expectedDocument = Utils.getStringFromInputStream(expectedInputStream); + this.insert = db.update("insert into SERVERLOG(id,document) values(?,?)") + .parameter(1) + .parameter(Database.toSentinelIfNull(bytes)) + .dependsOn(create) + .count(); + } + + @Test + public void whenInsertBLOB_thenCorrect() throws IOException { + db.select("select document from SERVERLOG where id = 1") + .dependsOn(create) + .dependsOn(insert) + .getAs(String.class) + .toList() + .toBlocking() + .single(); + assertEquals(expectedDocument, actualDocument); + } + + @After + public void close() { + db.update("DROP TABLE SERVERLOG") + .dependsOn(create); + cp.close(); + } +} diff --git a/rxjava/src/test/java/com/baeldung/rxjava/jdbc/InsertClobTest.java b/rxjava/src/test/java/com/baeldung/rxjava/jdbc/InsertClobTest.java new file mode 100644 index 0000000000..90f798aa43 --- /dev/null +++ b/rxjava/src/test/java/com/baeldung/rxjava/jdbc/InsertClobTest.java @@ -0,0 +1,68 @@ +package com.baeldung.rxjava.jdbc; + +import static org.junit.Assert.assertEquals; + +import java.io.FileInputStream; +import java.io.IOException; +import java.io.InputStream; + +import org.junit.After; +import org.junit.Before; +import org.junit.Test; + +import com.github.davidmoten.rx.jdbc.ConnectionProvider; +import com.github.davidmoten.rx.jdbc.ConnectionProviderFromUrl; +import com.github.davidmoten.rx.jdbc.Database; + +import rx.Observable; + +public class InsertClobTest { + + private String DB_CONNECTION = Connector.DB_CONNECTION; + private String DB_USER = Connector.DB_USER; + private String DB_PASSWORD = Connector.DB_PASSWORD; + + ConnectionProvider cp = new ConnectionProviderFromUrl(DB_CONNECTION, DB_USER, DB_PASSWORD); + Database db = Database.from(cp); + + String expectedDocument = null; + String actualDocument = null; + + Observable create, insert = null; + + @Before + public void setup() throws IOException { + create = db.update("CREATE TABLE IF NOT EXISTS SERVERLOG (id int primary key, document CLOB)") + .count(); + + InputStream actualInputStream = new FileInputStream("src/test/resources/actual_clob"); + this.actualDocument = Utils.getStringFromInputStream(actualInputStream); + + InputStream expectedInputStream = new FileInputStream("src/test/resources/expected_clob"); + this.expectedDocument = Utils.getStringFromInputStream(expectedInputStream); + this.insert = db.update("insert into SERVERLOG(id,document) values(?,?)") + .parameter(1) + .parameter(Database.toSentinelIfNull(actualDocument)) + .dependsOn(create) + .count(); + } + + @Test + public void whenSelectCLOB_thenCorrect() throws IOException { + db.select("select document from SERVERLOG where id = 1") + .dependsOn(create) + .dependsOn(insert) + .getAs(String.class) + .toList() + .toBlocking() + .single(); + assertEquals(expectedDocument, actualDocument); + } + + @After + public void close() { + db.update("DROP TABLE SERVERLOG") + .dependsOn(create); + cp.close(); + } +} \ No newline at end of file diff --git a/rxjava/src/test/java/com/baeldung/rxjava/jdbc/ReturnKeysTest.java b/rxjava/src/test/java/com/baeldung/rxjava/jdbc/ReturnKeysTest.java new file mode 100644 index 0000000000..d67fe1d4c1 --- /dev/null +++ b/rxjava/src/test/java/com/baeldung/rxjava/jdbc/ReturnKeysTest.java @@ -0,0 +1,45 @@ +package com.baeldung.rxjava.jdbc; + +import static org.assertj.core.api.Assertions.assertThat; + +import org.junit.Before; +import org.junit.Test; + +import com.github.davidmoten.rx.jdbc.ConnectionProvider; +import com.github.davidmoten.rx.jdbc.ConnectionProviderFromUrl; +import com.github.davidmoten.rx.jdbc.Database; + +import rx.Observable; + +public class ReturnKeysTest { + + private String DB_CONNECTION = Connector.DB_CONNECTION; + private String DB_USER = Connector.DB_USER; + private String DB_PASSWORD = Connector.DB_PASSWORD; + + Observable begin, commit = null; + Observable createStatement, insertStatement, updateStatement = null; + + ConnectionProvider cp = new ConnectionProviderFromUrl(DB_CONNECTION, DB_USER, DB_PASSWORD); + Database db = Database.from(cp); + + @Before + public void setup() { + begin = db.beginTransaction(); + createStatement = db.update("CREATE TABLE IF NOT EXISTS EMPLOYEE(id int auto_increment primary key, name varchar(255))") + .dependsOn(begin) + .count(); + } + + @Test + public void whenInsertAndReturnGeneratedKey_thenCorrect() { + Integer key = db.update("INSERT INTO EMPLOYEE(name) VALUES('John')") + .dependsOn(createStatement) + .returnGeneratedKeys() + .getAs(Integer.class) + .count() + .toBlocking() + .single(); + assertThat(key).isEqualTo(1); + } +} diff --git a/rxjava/src/test/java/com/baeldung/rxjava/jdbc/TransactionTest.java b/rxjava/src/test/java/com/baeldung/rxjava/jdbc/TransactionTest.java new file mode 100644 index 0000000000..a0076861da --- /dev/null +++ b/rxjava/src/test/java/com/baeldung/rxjava/jdbc/TransactionTest.java @@ -0,0 +1,46 @@ +package com.baeldung.rxjava.jdbc; + +import static org.junit.Assert.assertEquals; + +import org.junit.Test; + +import com.github.davidmoten.rx.jdbc.ConnectionProvider; +import com.github.davidmoten.rx.jdbc.ConnectionProviderFromUrl; +import com.github.davidmoten.rx.jdbc.Database; + +import rx.Observable; + +public class TransactionTest { + + private String DB_CONNECTION = Connector.DB_CONNECTION; + private String DB_USER = Connector.DB_USER; + private String DB_PASSWORD = Connector.DB_PASSWORD; + + Observable begin, commit = null; + Observable createStatement, insertStatement, updateStatement = null; + + ConnectionProvider cp = new ConnectionProviderFromUrl(DB_CONNECTION, DB_USER, DB_PASSWORD); + Database db = Database.from(cp); + + @Test + public void whenCommitTransaction_thenRecordUpdated() { + begin = db.beginTransaction(); + createStatement = db.update("CREATE TABLE IF NOT EXISTS EMPLOYEE(id int primary key, name varchar(255))") + .dependsOn(begin) + .count(); + insertStatement = db.update("INSERT INTO EMPLOYEE(id, name) VALUES(1, 'John')") + .dependsOn(createStatement) + .count(); + updateStatement = db.update("UPDATE EMPLOYEE SET name = 'Tom' WHERE id = 1") + .dependsOn(insertStatement) + .count(); + commit = db.commit(updateStatement); + String name = db.select("select name from EMPLOYEE WHERE id = 1") + .dependsOn(commit) + .getAs(String.class) + .toBlocking() + .single(); + + assertEquals("Tom", name); + } +} diff --git a/rxjava/src/test/resources/actual_clob b/rxjava/src/test/resources/actual_clob new file mode 100644 index 0000000000..d7bc560556 --- /dev/null +++ b/rxjava/src/test/resources/actual_clob @@ -0,0 +1,1546 @@ +64.242.88.10 - - [07/Mar/2004:16:05:49 -0800] "GET /ops/SP/play//edit/Main/Double_bounce_sender?topicparent=Main.ConfigurationVariables HTTP/1.1" 401 12846 +64.242.88.10 - - [07/Mar/2004:16:06:51 -0800] "GET /ops/SP/play//rdiff/TWiki/NewUserTemplate?rev1=1.3&rev2=1.2 HTTP/1.1" 200 4523 +64.242.88.10 - - [07/Mar/2004:16:10:02 -0800] "GET /mailman/listinfo/hsdivision HTTP/1.1" 200 6291 +64.242.88.10 - - [07/Mar/2004:16:11:58 -0800] "GET /ops/SP/play//view/TWiki/WikiSyntax HTTP/1.1" 200 7352 +64.242.88.10 - - [07/Mar/2004:16:20:55 -0800] "GET /ops/SP/play//view/Main/DCCAndPostFix HTTP/1.1" 200 5253 +64.242.88.10 - - [07/Mar/2004:16:23:12 -0800] "GET /ops/SP/play//oops/TWiki/AppendixFileSystem?template=oopsmore¶m1=1.12¶m2=1.12 HTTP/1.1" 200 11382 +64.242.88.10 - - [07/Mar/2004:16:24:16 -0800] "GET /ops/SP/play//view/Main/PeterThoeny HTTP/1.1" 200 4924 +64.242.88.10 - - [07/Mar/2004:16:29:16 -0800] "GET /ops/SP/play//edit/Main/Header_checks?topicparent=Main.ConfigurationVariables HTTP/1.1" 401 12851 +64.242.88.10 - - [07/Mar/2004:16:30:29 -0800] "GET /ops/SP/play//attach/Main/OfficeLocations HTTP/1.1" 401 12851 +64.242.88.10 - - [07/Mar/2004:16:31:48 -0800] "GET /ops/SP/play//view/TWiki/WebTopicEditTemplate HTTP/1.1" 200 3732 +64.242.88.10 - - [07/Mar/2004:16:32:50 -0800] "GET /ops/SP/play//view/Main/WebChanges HTTP/1.1" 200 40520 +64.242.88.10 - - [07/Mar/2004:16:33:53 -0800] "GET /ops/SP/play//edit/Main/Smtpd_etrn_restrictions?topicparent=Main.ConfigurationVariables HTTP/1.1" 401 12851 +64.242.88.10 - - [07/Mar/2004:16:35:19 -0800] "GET /mailman/listinfo/business HTTP/1.1" 200 6379 +64.242.88.10 - - [07/Mar/2004:16:36:22 -0800] "GET /ops/SP/play//rdiff/Main/WebIndex?rev1=1.2&rev2=1.1 HTTP/1.1" 200 46373 +64.242.88.10 - - [07/Mar/2004:16:37:27 -0800] "GET /ops/SP/play//view/TWiki/DontNotify HTTP/1.1" 200 4140 +64.242.88.10 - - [07/Mar/2004:16:39:24 -0800] "GET /ops/SP/play//view/Main/TokyoOffice HTTP/1.1" 200 3853 +64.242.88.10 - - [07/Mar/2004:16:43:54 -0800] "GET /ops/SP/play//view/Main/MikeMannix HTTP/1.1" 200 3686 +64.242.88.10 - - [07/Mar/2004:16:45:56 -0800] "GET /ops/SP/play//attach/Main/PostfixCommands HTTP/1.1" 401 12846 +64.242.88.10 - - [07/Mar/2004:16:47:12 -0800] "GET /robots.txt HTTP/1.1" 200 68 +64.242.88.10 - - [07/Mar/2004:16:47:46 -0800] "GET /ops/SP/play//rdiff/Know/ReadmeFirst?rev1=1.5&rev2=1.4 HTTP/1.1" 200 5724 +64.242.88.10 - - [07/Mar/2004:16:49:04 -0800] "GET /ops/SP/play//view/Main/TWikiGroups?rev=1.2 HTTP/1.1" 200 5162 +64.242.88.10 - - [07/Mar/2004:16:50:54 -0800] "GET /ops/SP/play//rdiff/Main/ConfigurationVariables HTTP/1.1" 200 59679 +64.242.88.10 - - [07/Mar/2004:16:52:35 -0800] "GET /ops/SP/play//edit/Main/Flush_service_name?topicparent=Main.ConfigurationVariables HTTP/1.1" 401 12851 +64.242.88.10 - - [07/Mar/2004:16:53:46 -0800] "GET /ops/SP/play//rdiff/TWiki/TWikiRegistration HTTP/1.1" 200 34395 +64.242.88.10 - - [07/Mar/2004:16:54:55 -0800] "GET /ops/SP/play//rdiff/Main/NicholasLee HTTP/1.1" 200 7235 +64.242.88.10 - - [07/Mar/2004:16:56:39 -0800] "GET /ops/SP/play//view/Sandbox/WebHome?rev=1.6 HTTP/1.1" 200 8545 +64.242.88.10 - - [07/Mar/2004:16:58:54 -0800] "GET /mailman/listinfo/administration HTTP/1.1" 200 6459 +lordgun.org - - [07/Mar/2004:17:01:53 -0800] "GET /razor.jsp HTTP/1.1" 200 2869 +64.242.88.10 - - [07/Mar/2004:17:09:01 -0800] "GET /ops/SP/play//search/Main/SearchResult?scope=text®ex=on&search=Joris%20*Benschop[^A-Za-z] HTTP/1.1" 200 4284 +64.242.88.10 - - [07/Mar/2004:17:10:20 -0800] "GET /ops/SP/play//oops/TWiki/TextFormattingRules?template=oopsmore¶m1=1.37¶m2=1.37 HTTP/1.1" 200 11400 +64.242.88.10 - - [07/Mar/2004:17:13:50 -0800] "GET /ops/SP/play//edit/TWiki/DefaultPlugin?t=1078688936 HTTP/1.1" 401 12846 +64.242.88.10 - - [07/Mar/2004:17:16:00 -0800] "GET /ops/SP/play//search/Main/?scope=topic®ex=on&search=^g HTTP/1.1" 200 3675 +64.242.88.10 - - [07/Mar/2004:17:17:27 -0800] "GET /ops/SP/play//search/TWiki/?scope=topic®ex=on&search=^d HTTP/1.1" 200 5773 +lj1036.passgo.com - - [07/Mar/2004:17:18:36 -0800] "GET /robots.txt HTTP/1.0" 200 68 +lj1090.passgo.com - - [07/Mar/2004:17:18:41 -0800] "GET /ops/SP/play//view/Main/LondonOffice HTTP/1.0" 200 3860 +64.242.88.10 - - [07/Mar/2004:17:21:44 -0800] "GET /ops/SP/play//attach/TWiki/TablePlugin HTTP/1.1" 401 12846 +64.242.88.10 - - [07/Mar/2004:17:22:49 -0800] "GET /ops/SP/play//view/TWiki/ManagingWebs?rev=1.22 HTTP/1.1" 200 9310 +64.242.88.10 - - [07/Mar/2004:17:23:54 -0800] "GET /ops/SP/play//statistics/Main HTTP/1.1" 200 808 +64.242.88.10 - - [07/Mar/2004:17:26:30 -0800] "GET /ops/SP/play//view/TWiki/WikiCulture HTTP/1.1" 200 5935 +64.242.88.10 - - [07/Mar/2004:17:27:37 -0800] "GET /ops/SP/play//edit/Main/WebSearch?t=1078669682 HTTP/1.1" 401 12846 +64.242.88.10 - - [07/Mar/2004:17:28:45 -0800] "GET /ops/SP/play//oops/TWiki/ResetPassword?template=oopsmore¶m1=1.4¶m2=1.4 HTTP/1.1" 200 11281 +64.242.88.10 - - [07/Mar/2004:17:29:59 -0800] "GET /ops/SP/play//view/TWiki/ManagingWebs?skin=print HTTP/1.1" 200 8806 +64.242.88.10 - - [07/Mar/2004:17:31:39 -0800] "GET /ops/SP/play//edit/Main/UvscanAndPostFix?topicparent=Main.WebHome HTTP/1.1" 401 12846 +64.242.88.10 - - [07/Mar/2004:17:35:35 -0800] "GET /ops/SP/play//view/TWiki/KlausWriessnegger HTTP/1.1" 200 3848 +64.242.88.10 - - [07/Mar/2004:17:39:39 -0800] "GET /ops/SP/play//view/Main/SpamAssassin HTTP/1.1" 200 4081 +64.242.88.10 - - [07/Mar/2004:17:42:15 -0800] "GET /ops/SP/play//oops/TWiki/RichardDonkin?template=oopsmore¶m1=1.2¶m2=1.2 HTTP/1.1" 200 11281 +64.242.88.10 - - [07/Mar/2004:17:46:17 -0800] "GET /ops/SP/play//rdiff/TWiki/AlWilliams?rev1=1.3&rev2=1.2 HTTP/1.1" 200 4485 +64.242.88.10 - - [07/Mar/2004:17:47:43 -0800] "GET /ops/SP/play//rdiff/TWiki/AlWilliams?rev1=1.2&rev2=1.1 HTTP/1.1" 200 5234 +64.242.88.10 - - [07/Mar/2004:17:50:44 -0800] "GET /ops/SP/play//view/TWiki/SvenDowideit HTTP/1.1" 200 3616 +64.242.88.10 - - [07/Mar/2004:17:53:45 -0800] "GET /ops/SP/play//search/Main/SearchResult?scope=text®ex=on&search=Office%20*Locations[^A-Za-z] HTTP/1.1" 200 7771 +64.242.88.10 - - [07/Mar/2004:17:56:54 -0800] "GET /ops/SP/play//view/TWiki/TextFormattingRules?rev=r1.31 HTTP/1.1" 200 23338 +64.242.88.10 - - [07/Mar/2004:17:58:00 -0800] "GET /ops/SP/play//edit/Main/KevinWGagel?t=1078670331 HTTP/1.1" 401 12846 +64.242.88.10 - - [07/Mar/2004:18:00:09 -0800] "GET /ops/SP/play//edit/Main/Virtual_mailbox_lock?topicparent=Main.ConfigurationVariables HTTP/1.1" 401 12846 +64.242.88.10 - - [07/Mar/2004:18:02:10 -0800] "GET /ops/SP/play//view/Main/WebPreferences HTTP/1.1" 200 8820 +64.242.88.10 - - [07/Mar/2004:18:04:05 -0800] "GET /ops/SP/play//view/TWiki/WikiWord?rev=1.3 HTTP/1.1" 200 6816 +lj1125.passgo.com - - [07/Mar/2004:18:06:14 -0800] "GET /ops/SP/play//oops/Sandbox/WebChanges HTTP/1.0" 200 209 +64.242.88.10 - - [07/Mar/2004:18:09:00 -0800] "GET /ops/SP/play//rdiff/Main/TWikiGuest HTTP/1.1" 200 11314 +64.242.88.10 - - [07/Mar/2004:18:10:09 -0800] "GET /ops/SP/play//edit/TWiki/TWikiVariables?t=1078684115 HTTP/1.1" 401 12846 +d207-6-9-183.bchsia.telus.net - - [07/Mar/2004:18:10:18 -0800] "GET /pipermail/cncce/2004-January/000001.jsp HTTP/1.1" 200 3095 +d207-6-9-183.bchsia.telus.net - - [07/Mar/2004:18:10:20 -0800] "GET /pipermail/cncce/2004-January/000002.jsp HTTP/1.1" 200 3810 +64.242.88.10 - - [07/Mar/2004:18:17:26 -0800] "GET /ops/SP/play//rdiff/TWiki/WikiWord?rev1=1.4&rev2=1.3 HTTP/1.1" 200 6948 +64.242.88.10 - - [07/Mar/2004:18:19:01 -0800] "GET /ops/SP/play//edit/Main/TWikiPreferences?topicparent=Main.WebHome HTTP/1.1" 401 12846 +d207-6-9-183.bchsia.telus.net - - [07/Mar/2004:18:19:16 -0800] "GET /pipermail/cncce/2004-January.txt HTTP/1.1" 200 3376 +64.242.88.10 - - [07/Mar/2004:18:22:52 -0800] "GET /ops/SP/play//search/Main/SearchResult?scope=text®ex=on&search=Web%20*Statistics[^A-Za-z] HTTP/1.1" 200 3584 +64.242.88.10 - - [07/Mar/2004:18:26:32 -0800] "GET /ops/SP/play//rdiff/TWiki/PeterFokkinga?rev1=1.4&rev2=1.3 HTTP/1.1" 200 4548 +64.242.88.10 - - [07/Mar/2004:18:32:39 -0800] "GET /mailman/listinfo/dentalstudies HTTP/1.1" 200 6345 +64.242.88.10 - - [07/Mar/2004:18:34:42 -0800] "GET /ops/SP/play//view/Main/TWikiGuest HTTP/1.1" 200 4449 +64.242.88.10 - - [07/Mar/2004:18:42:29 -0800] "GET /ops/SP/play//attach/Main/TWikiGroups HTTP/1.1" 401 12846 +64.242.88.10 - - [07/Mar/2004:18:46:00 -0800] "GET /ops/SP/play//rdiff/TWiki/TextFormattingRules?rev1=1.36&rev2=1.35 HTTP/1.1" 200 25416 +64.242.88.10 - - [07/Mar/2004:18:47:06 -0800] "GET /ops/SP/play//rdiff/Main/TWikiGroups?rev1=1.3&rev2=1.2 HTTP/1.1" 200 4308 +64.242.88.10 - - [07/Mar/2004:18:48:15 -0800] "GET /ops/SP/play//search/TWiki/?scope=topic®ex=on&search=.* HTTP/1.1" 200 3544 +64.242.88.10 - - [07/Mar/2004:18:52:30 -0800] "GET /ops/SP/play//edit/Main/Trigger_timeout?topicparent=Main.ConfigurationVariables HTTP/1.1" 401 12846 +64.242.88.10 - - [07/Mar/2004:18:53:55 -0800] "GET /ops/SP/play//oops/TWiki/TWikiSite?template=oopsmore¶m1=1.21¶m2=1.21 HTTP/1.1" 200 11284 +64.242.88.10 - - [07/Mar/2004:18:57:07 -0800] "GET /ops/SP/play//view/TWiki/TextFormattingRules?rev=r1.35 HTTP/1.1" 200 27248 +64.242.88.10 - - [07/Mar/2004:18:58:52 -0800] "GET /ops/SP/play//edit/Main/Mydestination?topicparent=Main.ConfigurationVariables HTTP/1.1" 401 12846 +64.242.88.10 - - [07/Mar/2004:18:59:52 -0800] "GET /mailman/listinfo/fcd HTTP/1.1" 200 5967 +64.242.88.10 - - [07/Mar/2004:19:01:48 -0800] "GET /ops/SP/play//rdiff/Main/WebHome?rev1=1.28&rev2=1.27 HTTP/1.1" 200 3596 +64.242.88.10 - - [07/Mar/2004:19:03:58 -0800] "GET /ops/SP/play//edit/Main/Message_size_limit?topicparent=Main.ConfigurationVariables HTTP/1.1" 401 12846 +64.242.88.10 - - [07/Mar/2004:19:08:55 -0800] "GET /ops/SP/play//rdiff/TWiki/TWikiHistory HTTP/1.1" 200 138789 +64.242.88.10 - - [07/Mar/2004:19:10:13 -0800] "GET /ops/SP/play//search/TWiki/?scope=topic®ex=on&search=^y HTTP/1.1" 200 3628 +64.242.88.10 - - [07/Mar/2004:19:15:38 -0800] "GET /ops/SP/play//edit/Main/Smtpd_history_flush_threshold?topicparent=Main.ConfigurationVariables HTTP/1.1" 401 12851 +64.242.88.10 - - [07/Mar/2004:19:16:44 -0800] "GET /ops/SP/play//view/TWiki/TWikiHistory?rev=1.59 HTTP/1.1" 200 52854 +64.242.88.10 - - [07/Mar/2004:19:18:05 -0800] "GET /ops/SP/play//edit/Main/Sender_canonical_maps?topicparent=Main.ConfigurationVariables HTTP/1.1" 401 12851 +64.242.88.10 - - [07/Mar/2004:19:19:19 -0800] "GET /mailman/listinfo/mlc HTTP/1.1" 200 6142 +64.242.88.10 - - [07/Mar/2004:19:21:01 -0800] "GET /ops/SP/play//rdiff/Main/WebChanges HTTP/1.1" 200 114241 +64.242.88.10 - - [07/Mar/2004:19:22:11 -0800] "GET /ops/SP/play//edit/Sandbox/TestTopic5?topicparent=Sandbox.WebHome HTTP/1.1" 401 12846 +64.242.88.10 - - [07/Mar/2004:19:24:57 -0800] "GET /ops/SP/play//view/TWiki/TextFormattingRules?rev=r1.22 HTTP/1.1" 200 21162 +64.242.88.10 - - [07/Mar/2004:19:26:22 -0800] "GET /ops/SP/play//search/TWiki/?scope=topic®ex=on&search=^j HTTP/1.1" 200 4524 +64.242.88.10 - - [07/Mar/2004:19:29:46 -0800] "GET /ops/SP/play//oops/TWiki/TWikiVariables?template=oopsmore¶m1=1.62¶m2=1.62 HTTP/1.1" 200 11444 +64.242.88.10 - - [07/Mar/2004:19:31:25 -0800] "GET /ops/SP/play//edit/Main/Lmtp_connect_timeout?topicparent=Main.ConfigurationVariables HTTP/1.1" 401 12846 +64.242.88.10 - - [07/Mar/2004:19:32:45 -0800] "GET /ops/SP/play//search/TWiki/?scope=topic®ex=on&search=^q HTTP/1.1" 200 2937 +64.242.88.10 - - [07/Mar/2004:19:36:14 -0800] "GET /ops/SP/play//view/TWiki/ManagingWebs?rev=1.21 HTTP/1.1" 200 9310 +64.242.88.10 - - [07/Mar/2004:19:39:40 -0800] "GET /ops/SP/play//edit/Main/Qmqpd_authorized_clients?topicparent=Main.ConfigurationVariables HTTP/1.1" 401 12846 +64.242.88.10 - - [07/Mar/2004:19:41:33 -0800] "GET /ops/SP/play//edit/Main/Header_address_token_limit?topicparent=Main.ConfigurationVariables HTTP/1.1" 401 12846 +64.242.88.10 - - [07/Mar/2004:19:42:45 -0800] "GET /ops/SP/play//edit/Main/Syslog_name?topicparent=Main.ConfigurationVariables HTTP/1.1" 401 12846 +80-219-148-207.dclient.hispeed.ch - - [07/Mar/2004:19:47:36 -0800] "OPTIONS * HTTP/1.0" 200 - +64.242.88.10 - - [07/Mar/2004:19:49:28 -0800] "GET /ops/SP/play//oops/TWiki/TWikiHistory?template=oopsmore¶m1=1.61¶m2=1.61 HTTP/1.1" 200 11345 +64.242.88.10 - - [07/Mar/2004:19:52:28 -0800] "GET /ops/SP/play//view/TWiki/HaroldGottschalk HTTP/1.1" 200 3838 +64.242.88.10 - - [07/Mar/2004:19:54:33 -0800] "GET /ops/SP/play//view/TWiki/DefaultPlugin?rev=1.4 HTTP/1.1" 200 7298 +64.242.88.10 - - [07/Mar/2004:19:55:40 -0800] "GET /ops/SP/play//oops/TWiki/WelcomeGuest?template=oopsmore¶m1=1.20¶m2=1.20 HTTP/1.1" 200 11266 +64.242.88.10 - - [07/Mar/2004:19:56:41 -0800] "GET /ops/SP/play//rdiff/Main/WebIndex HTTP/1.1" 200 46373 +64.242.88.10 - - [07/Mar/2004:19:58:24 -0800] "GET /ops/SP/play//rdiff/TWiki/TWikiRegistration?rev1=1.10&rev2=1.9 HTTP/1.1" 200 3826 +64.242.88.10 - - [07/Mar/2004:20:00:06 -0800] "GET /ops/SP/play//view/TWiki/TextFormattingRules?rev=r1.21 HTTP/1.1" 200 20972 +64.242.88.10 - - [07/Mar/2004:20:02:13 -0800] "GET /ops/SP/play//attach/TWiki/DefaultPlugin HTTP/1.1" 401 12846 +64.242.88.10 - - [07/Mar/2004:20:03:29 -0800] "GET /ops/SP/play//search/Main/?scope=topic®ex=on&search=^p HTTP/1.1" 200 7245 +206-15-133-181.dialup.ziplink.net - - [07/Mar/2004:20:04:03 -0800] "HEAD /ops/SP/play//view/Main/SpamAssassinDeleting HTTP/1.1" 200 0 +64.242.88.10 - - [07/Mar/2004:20:04:35 -0800] "GET /ops/SP/play//edit/Main/Smtp_pix_workaround_delay_time?topicparent=Main.ConfigurationVariables HTTP/1.1" 401 12846 +64.242.88.10 - - [07/Mar/2004:20:07:12 -0800] "GET /ops/SP/play//edit/Main/Berkeley_db_create_buffer_size?topicparent=Main.ConfigurationVariables HTTP/1.1" 401 12851 +mmscrm07-2.uah.goweb.net - - [07/Mar/2004:20:10:50 -0800] "GET /robots.txt HTTP/1.0" 200 68 +64.242.88.10 - - [07/Mar/2004:20:11:33 -0800] "GET /ops/SP/play//attach/TWiki/TWikiSite HTTP/1.1" 401 12846 +64.242.88.10 - - [07/Mar/2004:20:12:55 -0800] "GET /ops/SP/play//edit/TWiki/TWikiSite?t=1078681794 HTTP/1.1" 401 12846 +64.242.88.10 - - [07/Mar/2004:20:23:35 -0800] "GET /ops/SP/play//search/TWiki/SearchResult?scope=text®ex=on&search=Web%20*Statistics[^A-Za-z] HTTP/1.1" 200 10118 +64.242.88.10 - - [07/Mar/2004:20:25:31 -0800] "GET /ops/SP/play//edit/Main/Defer_transports?topicparent=Main.ConfigurationVariables HTTP/1.1" 401 12846 +64.242.88.10 - - [07/Mar/2004:20:31:40 -0800] "GET /ops/SP/play//rdiff/TWiki/SearchDoesNotWork HTTP/1.1" 200 6738 +64.242.88.10 - - [07/Mar/2004:20:35:28 -0800] "GET /ops/SP/play//search/Main/SearchResult?scope=text®ex=on&search=TWiki%20*Admin%20*Group[^A-Za-z] HTTP/1.1" 200 7311 +64.242.88.10 - - [07/Mar/2004:20:38:14 -0800] "GET /ops/SP/play//rdiff/TWiki/ChangePassword HTTP/1.1" 200 16670 +64.242.88.10 - - [07/Mar/2004:20:40:41 -0800] "GET /ops/SP/play//rdiff/TWiki/SvenDowideit HTTP/1.1" 200 5277 +64.242.88.10 - - [07/Mar/2004:20:42:09 -0800] "GET /ops/SP/play//rdiff/TWiki/KevinKinnell?rev1=1.5&rev2=1.4 HTTP/1.1" 200 4982 +64.242.88.10 - - [07/Mar/2004:20:44:48 -0800] "GET /ops/SP/play//edit/Main/Undisclosed_recipients_header?topicparent=Main.ConfigurationVariables HTTP/1.1" 401 12846 +64.242.88.10 - - [07/Mar/2004:20:55:43 -0800] "GET /mailman/listinfo/hs_support HTTP/1.1" 200 6294 +64.242.88.10 - - [07/Mar/2004:20:56:56 -0800] "GET /ops/SP/play//view/TWiki/WebTopicList HTTP/1.1" 200 14070 +64.242.88.10 - - [07/Mar/2004:20:58:27 -0800] "GET /ops/SP/play//attach/TWiki/WebPreferences HTTP/1.1" 401 12846 +64.242.88.10 - - [07/Mar/2004:21:03:48 -0800] "GET /ops/SP/play//view/TWiki/TWikiFAQ HTTP/1.1" 200 12050 +64.242.88.10 - - [07/Mar/2004:21:06:05 -0800] "GET /ops/SP/play//oops/TWiki/DefaultPlugin?template=oopsmore¶m1=1.5¶m2=1.5 HTTP/1.1" 200 11281 +64.242.88.10 - - [07/Mar/2004:21:07:24 -0800] "GET /ops/SP/play//rdiff/TWiki/AppendixFileSystem?rev1=1.11&rev2=1.10 HTTP/1.1" 200 40578 +64.242.88.10 - - [07/Mar/2004:21:14:32 -0800] "GET /ops/SP/play//rdiff/TWiki/FileAttribute HTTP/1.1" 200 5846 +h24-70-56-49.ca.clawio.org - - [07/Mar/2004:21:16:17 -0800] "GET /twiki/view/Main/WebHome HTTP/1.1" 404 300 +h24-70-56-49.ca.clawio.org - - [07/Mar/2004:21:16:18 -0800] "GET /favicon.ico HTTP/1.1" 200 1078 +h24-70-56-49.ca.clawio.org - - [07/Mar/2004:21:16:21 -0800] "GET /twiki/ HTTP/1.1" 200 782 +h24-70-56-49.ca.clawio.org - - [07/Mar/2004:21:16:23 -0800] "GET /ops/SP/play//view/Main/WebHome HTTP/1.1" 200 10419 +h24-70-56-49.ca.clawio.org - - [07/Mar/2004:21:16:23 -0800] "GET /go/bin/test/TWikiLogos/twikiRobot46x50.gif HTTP/1.1" 200 2877 +h24-70-56-49.ca.clawio.org - - [07/Mar/2004:21:16:33 -0800] "GET /ops/SP/play//view/Main/TWikiUsers HTTP/1.1" 200 6697 +h24-70-56-49.ca.clawio.org - - [07/Mar/2004:21:16:40 -0800] "GET /ops/SP/play//view/Main/KevinWGagel HTTP/1.1" 200 4901 +64.242.88.10 - - [07/Mar/2004:21:20:14 -0800] "GET /ops/SP/play//edit/TWiki/RichardDonkin?t=1078691832 HTTP/1.1" 401 12846 +64.242.88.10 - - [07/Mar/2004:21:21:40 -0800] "GET /ops/SP/play//oops/Main/DCC?template=oopsmore¶m1=1.1¶m2=1.1 HTTP/1.1" 200 6399 +64.242.88.10 - - [07/Mar/2004:21:23:38 -0800] "GET /ops/SP/play//view/TWiki/TWikiUpgradeTo01May2000 HTTP/1.1" 200 7463 +64.242.88.10 - - [07/Mar/2004:21:31:12 -0800] "GET /ops/SP/play//edit/Main/Mail_release_date?topicparent=Main.ConfigurationVariables HTTP/1.1" 401 12846 +64.242.88.10 - - [07/Mar/2004:21:33:51 -0800] "GET /ops/SP/play//view/TWiki/TWikiPlugins?rev=1.19 HTTP/1.1" 200 26541 +bh02i525f01.au.ibm.com - - [07/Mar/2004:21:34:00 -0800] "GET /AmavisNew.jsp HTTP/1.0" 200 2300 +64.242.88.10 - - [07/Mar/2004:21:39:55 -0800] "GET /ops/SP/play//attach/Main/ConfigurationVariables HTTP/1.1" 401 12846 +64.242.88.10 - - [07/Mar/2004:21:41:04 -0800] "GET /mailman/listinfo/techcomm HTTP/1.1" 200 6155 +64.242.88.10 - - [07/Mar/2004:21:42:47 -0800] "GET /ops/SP/play//view/TWiki/TWikiHistory?rev=1.8 HTTP/1.1" 200 15618 +64.242.88.10 - - [07/Mar/2004:21:44:10 -0800] "GET /ops/SP/play//edit/Sandbox/TestTopic7?topicparent=Sandbox.WebHome HTTP/1.1" 401 12846 +64.242.88.10 - - [07/Mar/2004:21:50:22 -0800] "GET /ops/SP/play//rdiff/TWiki/WebSearch HTTP/1.1" 200 55862 +64.242.88.10 - - [07/Mar/2004:21:52:05 -0800] "GET /ops/SP/play//rdiff/TWiki/TWikiTopics HTTP/1.1" 200 101445 +64.242.88.10 - - [07/Mar/2004:22:03:19 -0800] "GET /ops/SP/play//rdiff/Main/VishaalGolam HTTP/1.1" 200 5055 +64.242.88.10 - - [07/Mar/2004:22:04:44 -0800] "GET /ops/SP/play//view/Main/TWikiUsers?rev=1.21 HTTP/1.1" 200 6522 +64.242.88.10 - - [07/Mar/2004:22:06:16 -0800] "GET /ops/SP/play//edit/Main/Delay_notice_recipient?topicparent=Main.ConfigurationVariables HTTP/1.1" 401 12846 +64.242.88.10 - - [07/Mar/2004:22:07:33 -0800] "GET /ops/SP/play//view/TWiki/WikiNotation HTTP/1.1" 200 3617 +64.242.88.10 - - [07/Mar/2004:22:08:43 -0800] "GET /ops/SP/play//edit/Main/Forward_expansion_filter?topicparent=Main.ConfigurationVariables HTTP/1.1" 401 12846 +64.242.88.10 - - [07/Mar/2004:22:09:44 -0800] "GET /ops/SP/play//edit/Main/TestArea?topicparent=Main.WebHome HTTP/1.1" 401 12846 +64.242.88.10 - - [07/Mar/2004:22:10:55 -0800] "GET /ops/SP/play//view/Main/TokyoOffice?rev=1.2 HTTP/1.1" 200 4366 +64.242.88.10 - - [07/Mar/2004:22:12:28 -0800] "GET /ops/SP/play//attach/TWiki/WebSearch HTTP/1.1" 401 12846 +64.242.88.10 - - [07/Mar/2004:22:15:57 -0800] "GET /mailman/listinfo/hs_rcafaculty HTTP/1.1" 200 6345 +64.242.88.10 - - [07/Mar/2004:22:17:40 -0800] "GET /ops/SP/play//view/TWiki/TWikiSkins?skin=print HTTP/1.1" 200 9563 +64.242.88.10 - - [07/Mar/2004:22:27:18 -0800] "GET /ops/SP/play//edit/Main/OfficeLocations?t=1078691049 HTTP/1.1" 401 12846 +64.242.88.10 - - [07/Mar/2004:22:29:10 -0800] "GET /ops/SP/play//view/Main/ThanadonSomdee HTTP/1.1" 200 4611 +h24-71-249-14.ca.clawio.org - - [07/Mar/2004:22:29:12 -0800] "GET /mailman/options/cnc_notice/arobin%40shaw.c HTTP/1.1" 200 3382 +h24-71-249-14.ca.clawio.org - - [07/Mar/2004:22:29:13 -0800] "GET /icons/mailman.jpg HTTP/1.1" 200 2022 +h24-71-249-14.ca.clawio.org - - [07/Mar/2004:22:29:13 -0800] "GET /icons/PythonPowered.png HTTP/1.1" 200 945 +h24-71-249-14.ca.clawio.org - - [07/Mar/2004:22:29:13 -0800] "GET /icons/gnu-head-tiny.jpg HTTP/1.1" 200 3049 +h24-71-249-14.ca.clawio.org - - [07/Mar/2004:22:29:41 -0800] "POST /mailman/options/cnc_notice HTTP/1.1" 200 3533 +h24-71-249-14.ca.clawio.org - - [07/Mar/2004:22:30:08 -0800] "POST /mailman/options/cnc_notice HTTP/1.1" 200 13973 +64.242.88.10 - - [07/Mar/2004:22:31:25 -0800] "GET /ops/SP/play//view/TWiki/TextFormattingRules?rev=r1.16 HTTP/1.1" 200 17361 +64.242.88.10 - - [07/Mar/2004:22:35:53 -0800] "GET /ops/SP/play//edit/Main/Default_delivery_slot_discount?topicparent=Main.ConfigurationVariables HTTP/1.1" 401 12851 +64.242.88.10 - - [07/Mar/2004:22:36:58 -0800] "GET /ops/SP/play//rdiff/TWiki/TWikiHistory?rev1=1.10&rev2=1.9 HTTP/1.1" 200 5336 +64.242.88.10 - - [07/Mar/2004:22:39:00 -0800] "GET /ops/SP/play//search/TWiki/SearchResult?scope=text®ex=on&search=Al%20*Williams[^A-Za-z] HTTP/1.1" 200 4364 +64.242.88.10 - - [07/Mar/2004:22:45:46 -0800] "GET /ops/SP/play//edit/Main/Smtpd_banner?topicparent=Main.ConfigurationVariables HTTP/1.1" 401 12846 +64.242.88.10 - - [07/Mar/2004:22:47:19 -0800] "GET /ops/SP/play//view/Main/WebHome?rev=r1.9 HTTP/1.1" 200 9133 +64.242.88.10 - - [07/Mar/2004:22:48:55 -0800] "GET /ops/SP/play//rdiff/TWiki/TWikiSkins?rev1=1.10&rev2=1.9 HTTP/1.1" 200 5989 +64.242.88.10 - - [07/Mar/2004:22:51:55 -0800] "GET /ops/SP/play//attach/TWiki/AndreaSterbini HTTP/1.1" 401 12851 +64.242.88.10 - - [07/Mar/2004:22:53:36 -0800] "GET /ops/SP/play//rdiff/TWiki/TWikiPlugins?rev1=1.20&rev2=1.19 HTTP/1.1" 200 5140 +64.242.88.10 - - [07/Mar/2004:22:54:43 -0800] "GET /ops/SP/play//view/Know/ReadmeFirst?rev=1.4 HTTP/1.1" 200 6736 +64.242.88.10 - - [07/Mar/2004:22:58:24 -0800] "GET /ops/SP/play//view/Main/TokyoOffice?rev=r1.3 HTTP/1.1" 200 3853 +64.242.88.10 - - [07/Mar/2004:23:09:07 -0800] "GET /ops/SP/play//view/TWiki/AlWilliams?rev=1.1 HTTP/1.1" 200 3697 +calcite.rhyolite.com - - [07/Mar/2004:23:10:27 -0800] "GET /clients.jsp HTTP/1.1" 200 18753 +64.242.88.10 - - [07/Mar/2004:23:10:44 -0800] "GET /ops/SP/play//view/TWiki/JohnTalintyre HTTP/1.1" 200 3766 +64.242.88.10 - - [07/Mar/2004:23:13:51 -0800] "GET /ops/SP/play//view/TWiki/TWikiDocGraphics HTTP/1.1" 200 14492 +64.242.88.10 - - [07/Mar/2004:23:15:51 -0800] "GET /ops/SP/play//view/TWiki/TextFormattingRules?rev=r1.24 HTTP/1.1" 200 20981 +64.242.88.10 - - [07/Mar/2004:23:16:57 -0800] "GET /ops/SP/play//rdiff/Main/SanJoseOffice HTTP/1.1" 200 9524 +64.242.88.10 - - [07/Mar/2004:23:19:01 -0800] "GET /ops/SP/play//rdiff/Main/WebNotify HTTP/1.1" 200 16853 +64.242.88.10 - - [07/Mar/2004:23:20:26 -0800] "GET /ops/SP/play//view/TWiki/TWikiSiteTools HTTP/1.1" 200 14435 +64.242.88.10 - - [07/Mar/2004:23:23:00 -0800] "GET /ops/SP/play//rdiff/TWiki/RichardDonkin?rev1=1.2&rev2=1.1 HTTP/1.1" 200 5891 +64.242.88.10 - - [07/Mar/2004:23:27:26 -0800] "GET /ops/SP/play//search/TWiki/SearchResult?scope=text®ex=on&search=Web%20*Preferences[^A-Za-z] HTTP/1.1" 200 20030 +64.242.88.10 - - [07/Mar/2004:23:30:23 -0800] "GET /ops/SP/play//rdiff/TWiki/WebHome HTTP/1.1" 200 108162 +64.242.88.10 - - [07/Mar/2004:23:34:31 -0800] "GET /ops/SP/play//edit/Main/Lmtp_quit_timeout?topicparent=Main.ConfigurationVariables HTTP/1.1" 401 12851 +64.242.88.10 - - [07/Mar/2004:23:36:48 -0800] "GET /ops/SP/play//view/TWiki/WebSiteTools HTTP/1.1" 200 5208 +lj1036.passgo.com - - [07/Mar/2004:23:36:59 -0800] "GET /robots.txt HTTP/1.0" 200 68 +lj1088.passgo.com - - [07/Mar/2004:23:36:59 -0800] "GET /ops/SP/play//oops/TWiki/JohnAltstadt HTTP/1.0" 200 209 +64.242.88.10 - - [07/Mar/2004:23:37:48 -0800] "GET /ops/SP/play//oops/Main/FileAttachment?template=oopsmore¶m1=1.3¶m2=1.3 HTTP/1.1" 200 6612 +64.242.88.10 - - [07/Mar/2004:23:42:44 -0800] "GET /ops/SP/play//edit/Main/Cleanup_service_name?topicparent=Main.ConfigurationVariables HTTP/1.1" 401 12846 +64.242.88.10 - - [07/Mar/2004:23:47:58 -0800] "GET /ops/SP/play//view/TWiki/WikiReferences?skin=print HTTP/1.1" 200 5596 +64.242.88.10 - - [07/Mar/2004:23:50:03 -0800] "GET /ops/SP/play//view/Main/TokyoOffice?rev=1.3 HTTP/1.1" 200 3853 +64.242.88.10 - - [07/Mar/2004:23:51:38 -0800] "GET /ops/SP/play//view/Main/PostSuper?rev=r1.1 HTTP/1.1" 200 3629 +64.242.88.10 - - [07/Mar/2004:23:56:30 -0800] "GET /ops/SP/play//rdiff/Main/PostQueue HTTP/1.1" 200 4662 +64.242.88.10 - - [07/Mar/2004:23:58:53 -0800] "GET /ops/SP/play//edit/TWiki/TablePlugin?t=1078681446 HTTP/1.1" 401 12851 +dsl-80-43-113-44.access.uk.tiscali.com - - [08/Mar/2004:00:05:30 -0800] "GET / HTTP/1.1" 200 3169 +dsl-80-43-113-44.access.uk.tiscali.com - - [08/Mar/2004:00:05:35 -0800] "GET /favicon.ico HTTP/1.1" 200 1078 +dsl-80-43-113-44.access.uk.tiscali.com - - [08/Mar/2004:00:06:32 -0800] "GET /DCC.jsp HTTP/1.1" 200 2878 +64.242.88.10 - - [08/Mar/2004:00:08:58 -0800] "GET /ops/SP/play//oops/Sandbox/WebHome?template=oopsmore¶m1=1.7¶m2=1.7 HTTP/1.1" 200 4226 +64.242.88.10 - - [08/Mar/2004:00:11:22 -0800] "GET /ops/SP/play//edit/Main/WelcomeGuest?topicparent=Main.WebHome HTTP/1.1" 401 12846 +lj1125.passgo.com - - [08/Mar/2004:00:17:00 -0800] "GET /ops/SP/play//oops/Main/TWiki HTTP/1.0" 200 209 +64.242.88.10 - - [08/Mar/2004:00:17:22 -0800] "GET /ops/SP/play//view/TWiki/RichardDonkin?skin=print HTTP/1.1" 200 1729 +64.242.88.10 - - [08/Mar/2004:00:19:51 -0800] "GET /ops/SP/play//view/Main/WebPreferences?rev=r1.4 HTTP/1.1" 200 7049 +64.242.88.10 - - [08/Mar/2004:00:21:54 -0800] "GET /ops/SP/play//view/TWiki/TWikiRegistration?rev=r1.7 HTTP/1.1" 200 12737 +64.242.88.10 - - [08/Mar/2004:00:25:11 -0800] "GET /ops/SP/play//view/TWiki/TextFormattingRules?rev=r1.26 HTTP/1.1" 200 22710 +64.242.88.10 - - [08/Mar/2004:00:27:53 -0800] "GET /ops/SP/play//view/TWiki/GoBox HTTP/1.1" 200 3762 +64.242.88.10 - - [08/Mar/2004:00:29:13 -0800] "GET /ops/SP/play//view/Main/FileAttachment?rev=1.1 HTTP/1.1" 200 17757 +64.242.88.10 - - [08/Mar/2004:00:32:45 -0800] "GET /ops/SP/play//attach/TWiki/KevinKinnell HTTP/1.1" 401 12846 +64.242.88.10 - - [08/Mar/2004:00:36:21 -0800] "GET /ops/SP/play//rdiff/TWiki/WikiWikiClones HTTP/1.1" 200 9259 +64.242.88.10 - - [08/Mar/2004:00:37:23 -0800] "GET /ops/SP/play//oops/Main/NicholasLee?template=oopsmore¶m1=1.2¶m2=1.2 HTTP/1.1" 200 6558 +64.242.88.10 - - [08/Mar/2004:00:40:10 -0800] "GET /ops/SP/play//edit/Main/TWikiForms?topicparent=Main.TWikiVariables HTTP/1.1" 401 12846 +64.242.88.10 - - [08/Mar/2004:00:43:43 -0800] "GET /ops/SP/play//rdiff/TWiki/DefaultPlugin HTTP/1.1" 200 20376 +64.242.88.10 - - [08/Mar/2004:00:50:59 -0800] "GET /mailman/admin/educationadmin HTTP/1.1" 200 2150 +64.242.88.10 - - [08/Mar/2004:00:52:12 -0800] "GET /mailman/private/hsdivision/ HTTP/1.1" 200 1549 +64.242.88.10 - - [08/Mar/2004:00:54:26 -0800] "GET /mailman/listinfo/artsscience HTTP/1.1" 200 6248 +64.242.88.10 - - [08/Mar/2004:00:55:38 -0800] "GET /ops/SP/play//search/TWiki/?scope=topic®ex=on&search=^i HTTP/1.1" 200 7226 +64.242.88.10 - - [08/Mar/2004:01:00:08 -0800] "GET /ops/SP/play//rdiff/TWiki/AdrianLynch HTTP/1.1" 200 4011 +64.242.88.10 - - [08/Mar/2004:01:01:15 -0800] "GET /ops/SP/play//view/Main/WelcomeGuest HTTP/1.1" 200 4723 +64.242.88.10 - - [08/Mar/2004:01:02:16 -0800] "GET /ops/SP/play//view/Main/MikeMannix?rev=1.3 HTTP/1.1" 200 4721 +64.242.88.10 - - [08/Mar/2004:01:04:05 -0800] "GET /ops/SP/play//edit/TWiki/WikiStyleWord?topicparent=TWiki.TextFormattingFAQ HTTP/1.1" 401 12846 +lj1089.passgo.com - - [08/Mar/2004:01:04:54 -0800] "GET /ops/SP/play//oops/TWiki/InterWikis HTTP/1.0" 200 209 +64.242.88.10 - - [08/Mar/2004:01:10:43 -0800] "GET /ops/SP/play//view/TWiki/FormattedSearch?rev=1.8 HTTP/1.1" 200 20434 +64.242.88.10 - - [08/Mar/2004:01:12:20 -0800] "GET /ops/SP/play//view/TWiki/TWikiEnhancementRequests?rev=1.3 HTTP/1.1" 200 4379 +64.242.88.10 - - [08/Mar/2004:01:16:37 -0800] "GET /ops/SP/play//view/Main/FileAttachment?rev=1.2 HTTP/1.1" 200 17919 +64.242.88.10 - - [08/Mar/2004:01:19:18 -0800] "GET /ops/SP/play//edit/TWiki/AppendixFileSystem?t=1078674582 HTTP/1.1" 401 12846 +64.242.88.10 - - [08/Mar/2004:01:24:13 -0800] "GET /ops/SP/play//view/TWiki/TextFormattingRules?rev=r1.33 HTTP/1.1" 200 26294 +64.242.88.10 - - [08/Mar/2004:01:25:15 -0800] "GET /ops/SP/play//search/Main/?scope=topic®ex=on&search=^t HTTP/1.1" 200 8306 +64.242.88.10 - - [08/Mar/2004:01:29:17 -0800] "GET /ops/SP/play//oops/TWiki/TWikiPlugins?template=oopsmore¶m1=1.21¶m2=1.21 HTTP/1.1" 200 11341 +64.242.88.10 - - [08/Mar/2004:01:30:39 -0800] "GET /mailman/private/sswk/ HTTP/1.1" 200 1531 +64.242.88.10 - - [08/Mar/2004:01:33:14 -0800] "GET /mailman/private/business/ HTTP/1.1" 200 1543 +64.242.88.10 - - [08/Mar/2004:01:35:13 -0800] "GET /ops/SP/play//edit/TWiki/InterWikis?t=1078696998 HTTP/1.1" 401 12846 +64.242.88.10 - - [08/Mar/2004:01:41:14 -0800] "GET /ops/SP/play//view/TWiki/WelcomeGuest?rev=r1.18 HTTP/1.1" 200 14001 +64.242.88.10 - - [08/Mar/2004:01:46:05 -0800] "GET /ops/SP/play//search/TWiki/?search=\\.*&scope=topic&order=modified&reverse=on®ex=on&nosearch=on&limit=200 HTTP/1.1" 200 101279 +64.242.88.10 - - [08/Mar/2004:01:47:06 -0800] "GET /ops/SP/play//edit/TWiki/TWikiPages?topicparent=TWiki.WelcomeGuest HTTP/1.1" 401 12846 +64.242.88.10 - - [08/Mar/2004:01:48:06 -0800] "GET /ops/SP/play//view/Main/WebHome?rev=r1.16 HTTP/1.1" 200 9342 +64.242.88.10 - - [08/Mar/2004:01:50:37 -0800] "GET /ops/SP/play//rdiff/TWiki/RyanFreebern?rev1=1.2&rev2=1.1 HTTP/1.1" 200 5243 +64.242.88.10 - - [08/Mar/2004:01:59:13 -0800] "GET /ops/SP/play//edit/Main/Smtp_line_length_limit?topicparent=Main.ConfigurationVariables HTTP/1.1" 401 12846 +64.242.88.10 - - [08/Mar/2004:02:00:30 -0800] "GET /ops/SP/play//view/Main/WebStatistics?skin=print HTTP/1.1" 200 6194 +64.242.88.10 - - [08/Mar/2004:02:01:34 -0800] "GET /mailman/listinfo/webber HTTP/1.1" 200 6051 +64.242.88.10 - - [08/Mar/2004:02:03:12 -0800] "GET /mailman/admin/mlc HTTP/1.1" 200 2060 +64.242.88.10 - - [08/Mar/2004:02:05:15 -0800] "GET /mailman/listinfo/jjec HTTP/1.1" 200 6297 +64.242.88.10 - - [08/Mar/2004:02:06:17 -0800] "GET /mailman/listinfo/deans HTTP/1.1" 200 6102 +64.242.88.10 - - [08/Mar/2004:02:07:21 -0800] "GET /mailman/listinfo/gisgrad HTTP/1.1" 200 6024 +64.242.88.10 - - [08/Mar/2004:02:09:08 -0800] "GET /ops/SP/play//view/Main/WebNotify HTTP/1.1" 200 4468 +64.242.88.10 - - [08/Mar/2004:02:12:24 -0800] "GET /ops/SP/play//edit/Main/Setgid_group?topicparent=Main.ConfigurationVariables HTTP/1.1" 401 12846 +64.242.88.10 - - [08/Mar/2004:02:16:24 -0800] "GET /ops/SP/play//view/Main/WebChanges?skin=print HTTP/1.1" 200 38580 +lj1016.passgo.com - - [08/Mar/2004:02:17:10 -0800] "GET /ops/SP/play//oops/TWiki/FileAttachment HTTP/1.0" 200 209 +lj1036.passgo.com - - [08/Mar/2004:02:22:19 -0800] "GET /ops/SP/play//view/Main/TWi HTTP/1.0" 200 4866 +64.242.88.10 - - [08/Mar/2004:02:23:45 -0800] "GET /ops/SP/play//rdiff/TWiki/IncludeTopicsAndWebPages HTTP/1.1" 200 20972 +64.242.88.10 - - [08/Mar/2004:02:26:44 -0800] "GET /ops/SP/play//oops/Main/WebChanges?template=oopsmore¶m1=1.2¶m2=1.2 HTTP/1.1" 200 6540 +64.242.88.10 - - [08/Mar/2004:02:27:51 -0800] "GET /ops/SP/play//rdiff/TWiki/InstantEnhancements HTTP/1.1" 200 25123 +64.242.88.10 - - [08/Mar/2004:02:33:28 -0800] "GET /ops/SP/play//rdiff/TWiki/TWikiPreferences?rev1=1.47&rev2=1.46 HTTP/1.1" 200 4313 +64.242.88.10 - - [08/Mar/2004:02:34:40 -0800] "GET /ops/SP/play//view/Main/WebHome?rev=r1.24 HTTP/1.1" 200 9769 +64.242.88.10 - - [08/Mar/2004:02:42:36 -0800] "GET /mailman/listinfo/ppwc HTTP/1.1" 200 6271 +64.242.88.10 - - [08/Mar/2004:02:45:03 -0800] "GET /ops/SP/play//search/TWiki/?scope=topic®ex=on&bookview=on&search=.* HTTP/1.1" 200 102399 +64.242.88.10 - - [08/Mar/2004:02:46:12 -0800] "GET /ops/SP/play//edit/Main/Local_recipient_maps?topicparent=Main.ConfigurationVariables HTTP/1.1" 401 12851 +64.242.88.10 - - [08/Mar/2004:02:47:58 -0800] "GET /mailman/listinfo HTTP/1.1" 200 6893 +lj1025.passgo.com - - [08/Mar/2004:02:48:05 -0800] "GET /ops/SP/play//oops/Main/KevinWGage HTTP/1.0" 200 209 +prxint-sxb3.e-i.net - - [08/Mar/2004:02:50:53 -0800] "GET /ops/SP/play//view/Main/WebHome HTTP/1.0" 200 10392 +prxint-sxb3.e-i.net - - [08/Mar/2004:02:50:54 -0800] "GET /go/bin/test/TWikiLogos/twikiRobot46x50.gif HTTP/1.0" 200 2877 +64.242.88.10 - - [08/Mar/2004:02:52:39 -0800] "GET /ops/SP/play//view/Main/PostfixCmd HTTP/1.1" 200 4173 +prxint-sxb2.e-i.net - - [08/Mar/2004:02:54:29 -0800] "GET /ops/SP/play//view/Main/SpamAssassinAndPostFix HTTP/1.0" 200 4022 +64.242.88.10 - - [08/Mar/2004:02:54:54 -0800] "GET /ops/SP/play//edit/TWiki/NewTopic?topicparent=TWiki.WikiSyntax HTTP/1.1" 401 12846 +64.242.88.10 - - [08/Mar/2004:02:59:03 -0800] "GET /ops/SP/play//rdiff/TWiki/TWikiSite HTTP/1.1" 200 71941 +64.242.88.10 - - [08/Mar/2004:03:01:12 -0800] "GET /ops/SP/play//rdiff/TWiki/SimultaneousEdits HTTP/1.1" 200 6180 +64.242.88.10 - - [08/Mar/2004:03:06:31 -0800] "GET /ops/SP/play//view/Main/NicholasLee?rev=1.2 HTTP/1.1" 200 3570 +64.242.88.10 - - [08/Mar/2004:03:07:59 -0800] "GET /ops/SP/play//view/TWiki/TWikiHistory?rev=1.9 HTTP/1.1" 200 15756 +64.242.88.10 - - [08/Mar/2004:03:09:20 -0800] "GET /mailman/listinfo/ncbnpfaculty HTTP/1.1" 200 6331 +64.242.88.10 - - [08/Mar/2004:03:11:28 -0800] "GET /ops/SP/play//search/TWiki/SearchResult?scope=text®ex=on&search=Inter%20*Wikis[^A-Za-z] HTTP/1.1" 200 5113 +64.242.88.10 - - [08/Mar/2004:03:16:22 -0800] "GET /ops/SP/play//oops/TWiki/TextFormattingFAQ?template=oopsmore¶m1=1.14¶m2=1.14 HTTP/1.1" 200 11364 +64.242.88.10 - - [08/Mar/2004:03:17:50 -0800] "GET /ops/SP/play//rdiff/Main/WebTopicList HTTP/1.1" 200 8004 +64.242.88.10 - - [08/Mar/2004:03:21:16 -0800] "GET /ie.htm HTTP/1.1" 200 3518 +64.242.88.10 - - [08/Mar/2004:03:26:06 -0800] "GET /mailman/private/mlc/ HTTP/1.1" 200 1528 +64.242.88.10 - - [08/Mar/2004:03:28:02 -0800] "GET /ops/SP/play//view/TWiki/WikiName HTTP/1.1" 200 4811 +64.242.88.10 - - [08/Mar/2004:03:33:52 -0800] "GET /ops/SP/play//rdiff/Main/WebRss HTTP/1.1" 200 20726 +64.242.88.10 - - [08/Mar/2004:03:35:42 -0800] "GET /ops/SP/play//rdiff/TWiki/SvenDowideit?rev1=1.2&rev2=1.1 HTTP/1.1" 200 5277 +rouble.cc.strath.ac.uk - - [08/Mar/2004:03:40:51 -0800] "GET /razor.jsp HTTP/1.0" 200 2869 +213.181.81.4 - - [08/Mar/2004:03:42:20 -0800] "GET /LateEmail.jsp HTTP/1.0" 200 7649 +64.242.88.10 - - [08/Mar/2004:03:46:27 -0800] "GET /ops/SP/play//edit/Main/Deliver_lock_attempts?topicparent=Main.ConfigurationVariables HTTP/1.1" 401 12846 +64.242.88.10 - - [08/Mar/2004:03:48:18 -0800] "GET /ops/SP/play//edit/Main/Daemon_directory?topicparent=Main.ConfigurationVariables HTTP/1.1" 401 12846 +64.242.88.10 - - [08/Mar/2004:03:49:24 -0800] "GET /ops/SP/play//rdiff/TWiki/KlausWriessnegger?rev1=1.2&rev2=1.1 HTTP/1.1" 200 5421 +64.242.88.10 - - [08/Mar/2004:03:51:05 -0800] "GET /ops/SP/play//view/Main/TWikiGuest?rev=1.4 HTTP/1.1" 200 4719 +64.242.88.10 - - [08/Mar/2004:03:52:17 -0800] "GET /ops/SP/play//edit/Main/Relayhost?topicparent=Main.ConfigurationVariables HTTP/1.1" 401 12846 +lj1036.passgo.com - - [08/Mar/2004:03:53:59 -0800] "GET /robots.txt HTTP/1.0" 200 68 +lj1159.passgo.com - - [08/Mar/2004:03:54:03 -0800] "GET /ops/SP/play//oops/Main/TWi HTTP/1.0" 200 209 +64.242.88.10 - - [08/Mar/2004:03:55:09 -0800] "GET /ops/SP/play//edit/Main/BookView?topicparent=Main.TWikiVariables HTTP/1.1" 401 12846 +64.242.88.10 - - [08/Mar/2004:04:16:08 -0800] "GET /ops/SP/play//rdiff/TWiki/DeleteOrRenameATopic HTTP/1.1" 200 10254 +64.242.88.10 - - [08/Mar/2004:04:18:28 -0800] "GET /ops/SP/play//view/TWiki/DavidWarman HTTP/1.1" 200 3739 +64.242.88.10 - - [08/Mar/2004:04:20:48 -0800] "GET /ops/SP/play//view/TWiki/TextFormattingRules?rev=r1.28 HTTP/1.1" 200 22777 +64.242.88.10 - - [08/Mar/2004:04:21:53 -0800] "GET /ops/SP/play//rdiff/Main/PeterThoeny HTTP/1.1" 200 18927 +64.242.88.10 - - [08/Mar/2004:04:22:55 -0800] "GET /ops/SP/play//edit/TWiki/SvenDowideit?t=1078710644 HTTP/1.1" 401 12846 +64.242.88.10 - - [08/Mar/2004:04:24:47 -0800] "GET /ops/SP/play//edit/Main/RBLsHowTo?t=1078668449 HTTP/1.1" 401 12846 +prxint-sxb3.e-i.net - - [08/Mar/2004:04:25:38 -0800] "GET /ops/SP/play//view/Main/SpamAssassinTaggingOnly HTTP/1.0" 200 5672 +prxint-sxb3.e-i.net - - [08/Mar/2004:04:25:44 -0800] "GET /ops/SP/play//view/Main/WebHome HTTP/1.0" 200 10392 +prxint-sxb3.e-i.net - - [08/Mar/2004:04:26:02 -0800] "GET /ops/SP/play//view/Main/SideBar HTTP/1.0" 200 3960 +64.242.88.10 - - [08/Mar/2004:04:26:02 -0800] "GET /ops/SP/play//rdiff/TWiki/DefaultPlugin?rev1=1.5&rev2=1.4 HTTP/1.1" 200 4911 +prxint-sxb3.e-i.net - - [08/Mar/2004:04:26:11 -0800] "GET /ops/SP/play//view/Main/LinksOfUse HTTP/1.0" 200 4515 +prxint-sxb3.e-i.net - - [08/Mar/2004:04:28:34 -0800] "GET /ops/SP/play//view/Main/RelayGateway HTTP/1.0" 200 4213 +prxint-sxb3.e-i.net - - [08/Mar/2004:04:28:38 -0800] "GET /ops/SP/play//view/Main/PostfixCommands HTTP/1.0" 200 4004 +prxint-sxb3.e-i.net - - [08/Mar/2004:04:28:41 -0800] "GET /ops/SP/play//view/Main/PostfixCmd HTTP/1.0" 200 4154 +64.242.88.10 - - [08/Mar/2004:04:28:42 -0800] "GET /ops/SP/play//rdiff/TWiki/TWikiHistory?rev1=1.61&rev2=1.60 HTTP/1.1" 200 4898 +prxint-sxb3.e-i.net - - [08/Mar/2004:04:28:52 -0800] "GET /ops/SP/play//view/Main/PostSuper HTTP/1.0" 200 3617 +prxint-sxb3.e-i.net - - [08/Mar/2004:04:29:00 -0800] "GET /ops/SP/play//view/Main/RBLsHowTo HTTP/1.0" 200 4646 +prxint-sxb3.e-i.net - - [08/Mar/2004:04:29:11 -0800] "GET /ops/SP/play//view/Main/ConfigurationVariables HTTP/1.0" 200 58169 +prxint-sxb3.e-i.net - - [08/Mar/2004:04:29:21 -0800] "GET /ops/SP/play//edit/Main/Propagate_unmatched_extensions?topicparent=Main.ConfigurationVariables HTTP/1.0" 401 12816 +prxint-sxb3.e-i.net - - [08/Mar/2004:04:29:30 -0800] "GET /go/bin/test/TWikiDocGraphics/help.gif HTTP/1.0" 200 130 +64.242.88.10 - - [08/Mar/2004:04:33:25 -0800] "GET /mailman/admin/hs_support HTTP/1.1" 200 2120 +64.242.88.10 - - [08/Mar/2004:04:40:32 -0800] "GET /ops/SP/play//edit/Main/Always_bcc?topicparent=Main.ConfigurationVariables HTTP/1.1" 401 12846 +64.242.88.10 - - [08/Mar/2004:04:43:52 -0800] "GET /ops/SP/play//view/TWiki/WelcomeGuest?rev=r1.5 HTTP/1.1" 200 9492 +64.242.88.10 - - [08/Mar/2004:04:52:13 -0800] "GET /ops/SP/play//rdiff/Main/TWikiGuest?rev1=1.5&rev2=1.4 HTTP/1.1" 200 6233 +64.242.88.10 - - [08/Mar/2004:04:55:40 -0800] "GET /ops/SP/play//edit/Main/Delay_warning_time?topicparent=Main.ConfigurationVariables HTTP/1.1" 401 12846 +64.242.88.10 - - [08/Mar/2004:04:59:13 -0800] "GET /ops/SP/play//edit/TWiki/KlausWriessnegger?t=1078709735 HTTP/1.1" 401 12846 +64.242.88.10 - - [08/Mar/2004:05:00:42 -0800] "GET /ops/SP/play//rdiff/TWiki/StanleyKnutson HTTP/1.1" 200 5327 +p213.54.168.132.tisdip.tiscali.de - - [08/Mar/2004:05:00:44 -0800] "GET /ops/SP/play//view/Main/WebHome HTTP/1.1" 200 10419 +p213.54.168.132.tisdip.tiscali.de - - [08/Mar/2004:05:00:45 -0800] "GET /go/bin/test/TWikiLogos/twikiRobot46x50.gif HTTP/1.1" 200 2877 +p213.54.168.132.tisdip.tiscali.de - - [08/Mar/2004:05:00:46 -0800] "GET /favicon.ico HTTP/1.1" 200 1078 +p213.54.168.132.tisdip.tiscali.de - - [08/Mar/2004:05:00:52 -0800] "GET /ops/SP/play//view/Main/WebHome HTTP/1.1" 200 10419 +p213.54.168.132.tisdip.tiscali.de - - [08/Mar/2004:05:01:02 -0800] "GET /ops/SP/play//view/Main/SpamAssassinAndPostFix HTTP/1.1" 200 4034 +p213.54.168.132.tisdip.tiscali.de - - [08/Mar/2004:05:01:14 -0800] "GET /ops/SP/play//view/Main/SpamAssassinTaggingOnly HTTP/1.1" 200 5691 +64.242.88.10 - - [08/Mar/2004:05:01:58 -0800] "GET /ops/SP/play//view/TWiki/WhatIsWikiWiki HTTP/1.1" 200 4234 +200.160.249.68.bmf.com.br - - [08/Mar/2004:05:02:06 -0800] "GET /ops/SP/play//view/Main/WebHome HTTP/1.0" 200 10392 +200.160.249.68.bmf.com.br - - [08/Mar/2004:05:02:07 -0800] "GET /go/bin/test/TWikiLogos/twikiRobot46x50.gif HTTP/1.0" 200 2877 +64.242.88.10 - - [08/Mar/2004:05:03:13 -0800] "GET /ops/SP/play//view/Main/WebIndex?rev=1.1 HTTP/1.1" 200 44960 +64.242.88.10 - - [08/Mar/2004:05:13:35 -0800] "GET /mailman/private/hs_support/ HTTP/1.1" 200 1549 +68-174-110-154.nyc.rr.com - - [08/Mar/2004:05:16:15 -0800] "GET /razor.jsp HTTP/1.1" 200 2869 +68-174-110-154.nyc.rr.com - - [08/Mar/2004:05:16:20 -0800] "GET /favicon.ico HTTP/1.1" 200 1078 +64.242.88.10 - - [08/Mar/2004:05:22:57 -0800] "GET /ops/SP/play//attach/Sandbox/WebHome HTTP/1.1" 401 12846 +p213.54.168.132.tisdip.tiscali.de - - [08/Mar/2004:05:23:37 -0800] "GET /ops/SP/play//view/Main/SpamAssassinDeleting HTTP/1.1" 200 5543 +66-194-6-70.gen.twtelecom.net - - [08/Mar/2004:05:24:18 -0800] "GET / HTTP/1.1" 200 3169 +64.242.88.10 - - [08/Mar/2004:05:24:29 -0800] "GET /ops/SP/play//edit/TWiki/UnchangeableTopicBug?topicparent=TWiki.TWikiHistory HTTP/1.1" 401 12846 +p213.54.168.132.tisdip.tiscali.de - - [08/Mar/2004:05:24:50 -0800] "GET /ops/SP/play//view/Main/SpamAssassinUsingRazorAndDCC HTTP/1.1" 200 7435 +p213.54.168.132.tisdip.tiscali.de - - [08/Mar/2004:05:25:46 -0800] "GET /ops/SP/play//view/Main/Postfix HTTP/1.1" 200 3699 +64.242.88.10 - - [08/Mar/2004:05:26:02 -0800] "GET /ops/SP/play//view/Main/TWikiGuest?skin=print HTTP/1.1" 200 2372 +p213.54.168.132.tisdip.tiscali.de - - [08/Mar/2004:05:26:06 -0800] "GET /ops/SP/play//edit/Main/UvscanAndPostFix?topicparent=Main.WebHome HTTP/1.1" 401 12851 +p213.54.168.132.tisdip.tiscali.de - - [08/Mar/2004:05:26:08 -0800] "GET /go/bin/test/TWikiDocGraphics/help.gif HTTP/1.1" 200 130 +p213.54.168.132.tisdip.tiscali.de - - [08/Mar/2004:05:26:16 -0800] "GET /ops/SP/play//view/Main/DCCAndPostFix HTTP/1.1" 200 5253 +64.242.88.10 - - [08/Mar/2004:05:30:07 -0800] "GET /ops/SP/play//view/TWiki/SvenDowideit?rev=1.1 HTTP/1.1" 200 3564 +64.242.88.10 - - [08/Mar/2004:05:31:47 -0800] "GET /ops/SP/play//edit/Main/Maps_rbl_reject_code?topicparent=Main.ConfigurationVariables HTTP/1.1" 401 12846 +lj1027.passgo.com - - [08/Mar/2004:05:32:01 -0800] "GET /ops/SP/play//view/TWiki/2fa HTTP/1.0" 200 4615 +64.242.88.10 - - [08/Mar/2004:05:34:33 -0800] "GET /ops/SP/play//search/Main/SearchResult?scope=text®ex=on&search=Web%20*Changes[^A-Za-z] HTTP/1.1" 200 4829 +64.242.88.10 - - [08/Mar/2004:05:36:56 -0800] "GET /ops/SP/play//edit/Main/WebStatistics?t=1078690975 HTTP/1.1" 401 12851 +68-174-110-154.nyc.rr.com - - [08/Mar/2004:05:38:57 -0800] "GET /razor.jsp HTTP/1.1" 304 - +64.242.88.10 - - [08/Mar/2004:05:42:06 -0800] "GET /ops/SP/play//view/Main/RelayGateway?rev=1.3 HTTP/1.1" 200 4232 +64.242.88.10 - - [08/Mar/2004:05:47:38 -0800] "GET /robots.txt HTTP/1.1" 200 68 +64.242.88.10 - - [08/Mar/2004:05:48:48 -0800] "GET /ops/SP/play//rdiff/TWiki/KevinKinnell?rev1=1.4&rev2=1.3 HTTP/1.1" 200 4369 +64.242.88.10 - - [08/Mar/2004:05:51:45 -0800] "GET /ops/SP/play//view/TWiki/WelcomeGuest?rev=r1.11 HTTP/1.1" 200 13102 +64.242.88.10 - - [08/Mar/2004:05:56:08 -0800] "GET /ops/SP/play//view/TWiki/TWikiRegistration?rev=r1.4 HTTP/1.1" 200 12113 +64.242.88.10 - - [08/Mar/2004:05:57:15 -0800] "GET /ops/SP/play//edit/TWiki/TWikiCodevTWikiEnhancementRequests?topicparent=TWiki.TWikiHistory HTTP/1.1" 401 12851 +64.242.88.10 - - [08/Mar/2004:05:58:39 -0800] "GET /ops/SP/play//search/TWiki/SearchResult?scope=text®ex=on&search=Peter%20*Fokkinga[^A-Za-z] HTTP/1.1" 200 4388 +64.242.88.10 - - [08/Mar/2004:06:01:51 -0800] "GET /ops/SP/play//attach/Main/WebPreferences HTTP/1.1" 401 12851 +64.242.88.10 - - [08/Mar/2004:06:09:37 -0800] "GET /mailman/admin/hs_rcafaculty HTTP/1.1" 200 2144 +64.242.88.10 - - [08/Mar/2004:06:17:13 -0800] "GET /ops/SP/play//rdiff/TWiki/WebChanges HTTP/1.1" 200 114167 +64.242.88.10 - - [08/Mar/2004:06:20:36 -0800] "GET /ops/SP/play//view/Main/JorisBenschop?skin=print HTTP/1.1" 200 2717 +64.242.88.10 - - [08/Mar/2004:06:23:52 -0800] "GET /ops/SP/play//edit/TWiki/TestArea?topicparent=TWiki.WelcomeGuest HTTP/1.1" 401 12846 +64.242.88.10 - - [08/Mar/2004:06:32:14 -0800] "GET /ops/SP/play//view/TWiki/WelcomeGuest?rev=r1.6 HTTP/1.1" 200 12620 +64.242.88.10 - - [08/Mar/2004:06:37:19 -0800] "GET /ops/SP/play//rdiff/TWiki/HaroldGottschalk?rev1=1.2&rev2=1.1 HTTP/1.1" 200 5389 +64.242.88.10 - - [08/Mar/2004:06:41:22 -0800] "GET /pipermail/techcomm/ HTTP/1.1" 200 1176 +64.242.88.10 - - [08/Mar/2004:06:42:29 -0800] "GET /ops/SP/play//view/TWiki/TextFormattingRules?rev=r1.19 HTTP/1.1" 200 20488 +64.242.88.10 - - [08/Mar/2004:06:43:32 -0800] "GET /ops/SP/play//edit/Sandbox/TestTopic2?topicparent=Sandbox.WebHome HTTP/1.1" 401 12846 +128.227.88.79 - - [08/Mar/2004:06:47:41 -0800] "GET /ops/SP/play//view/Main/WebHome HTTP/1.1" 200 10419 +128.227.88.79 - - [08/Mar/2004:06:47:41 -0800] "GET /go/bin/test/TWikiLogos/twikiRobot46x50.gif HTTP/1.1" 200 2877 +64.242.88.10 - - [08/Mar/2004:06:49:27 -0800] "GET /ops/SP/play//attach/TWiki/InterWikis HTTP/1.1" 401 12846 +64.242.88.10 - - [08/Mar/2004:06:54:30 -0800] "GET /ops/SP/play//rdiff/TWiki/TWikiSkins?rev1=1.11&rev2=1.10 HTTP/1.1" 200 5711 +64.242.88.10 - - [08/Mar/2004:06:57:09 -0800] "GET /ops/SP/play//rdiff/TWiki/WebNotify HTTP/1.1" 200 11780 +128.227.88.79 - - [08/Mar/2004:06:57:46 -0800] "GET /ops/SP/play//view/Main/WebHome HTTP/1.1" 200 10419 +128.227.88.79 - - [08/Mar/2004:06:57:46 -0800] "GET /go/bin/test/TWikiLogos/twikiRobot46x50.gif HTTP/1.1" 304 - +64.242.88.10 - - [08/Mar/2004:07:00:15 -0800] "GET /ops/SP/play//view/TWiki/DontNotify?rev=1.1 HTTP/1.1" 200 3965 +64.242.88.10 - - [08/Mar/2004:07:07:13 -0800] "GET /ops/SP/play//edit/Main/Masquerade_classes?topicparent=Main.ConfigurationVariables HTTP/1.1" 401 12846 +128.227.88.79 - - [08/Mar/2004:07:09:12 -0800] "GET /ops/SP/play//view/Main/SpamAssassin HTTP/1.1" 200 4081 +64.242.88.10 - - [08/Mar/2004:07:09:21 -0800] "GET /ops/SP/play//view/Main/WebPreferences?rev=r1.10 HTTP/1.1" 200 8312 +64.242.88.10 - - [08/Mar/2004:07:10:26 -0800] "GET /ops/SP/play//view/TWiki/HaroldGottschalk?rev=1.2 HTTP/1.1" 200 3774 +64.242.88.10 - - [08/Mar/2004:07:11:37 -0800] "GET /ops/SP/play//edit/TWiki/TWikiCodevTWikiPlannedFeatures?topicparent=TWiki.TWikiHistory HTTP/1.1" 401 12851 +64.242.88.10 - - [08/Mar/2004:07:12:39 -0800] "GET /ops/SP/play//view/TWiki/TWikiHistory?rev=r1.44 HTTP/1.1" 200 41434 +64.242.88.10 - - [08/Mar/2004:07:22:13 -0800] "GET /ops/SP/play//view/TWiki/PeterFokkinga?rev=1.2 HTTP/1.1" 200 3748 +64.242.88.10 - - [08/Mar/2004:07:23:38 -0800] "GET /ops/SP/play//edit/TWiki/TWikiPlugins?t=1078696313 HTTP/1.1" 401 12846 +64.242.88.10 - - [08/Mar/2004:07:24:43 -0800] "GET /mailman/listinfo/webct HTTP/1.1" 200 6377 +64.242.88.10 - - [08/Mar/2004:07:25:56 -0800] "GET /razor.jsp HTTP/1.1" 200 2869 +64.242.88.10 - - [08/Mar/2004:07:27:01 -0800] "GET /mailman/listinfo/faculty HTTP/1.1" 200 6054 +61.9.4.61 - - [08/Mar/2004:07:27:36 -0800] "GET /_vti_bin/owssvr.dll?UL=1&ACT=4&BUILD=2614&STRMVER=4&CAPREQ=0 HTTP/1.0" 404 284 +61.9.4.61 - - [08/Mar/2004:07:27:36 -0800] "GET /SpamAssassin.jsp HTTP/1.0" 200 7368 +61.9.4.61 - - [08/Mar/2004:07:27:37 -0800] "GET /MSOffice/cltreq.asp?UL=1&ACT=4&BUILD=2614&STRMVER=4&CAPREQ=0 HTTP/1.0" 404 284 +64.242.88.10 - - [08/Mar/2004:07:28:29 -0800] "GET /mailman/admin/sswk HTTP/1.1" 200 2072 +64.242.88.10 - - [08/Mar/2004:07:29:56 -0800] "GET /mailman/listinfo/purchasing HTTP/1.1" 200 6050 +64.242.88.10 - - [08/Mar/2004:07:35:50 -0800] "GET /ops/SP/play//edit/Main/Invalid_hostname_reject_code?topicparent=Main.ConfigurationVariables HTTP/1.1" 401 12846 +64.242.88.10 - - [08/Mar/2004:07:39:31 -0800] "GET /ops/SP/play//rdiff/Main/WebPreferences?rev1=1.14&rev2=1.13 HTTP/1.1" 200 7207 +64.242.88.10 - - [08/Mar/2004:07:40:54 -0800] "GET /ops/SP/play//rename/TWiki/TWikiHistory HTTP/1.1" 401 12846 +64.242.88.10 - - [08/Mar/2004:07:43:21 -0800] "GET /ops/SP/play//view/TWiki/SearchDoesNotWork?rev=r1.2 HTTP/1.1" 200 4072 +64.242.88.10 - - [08/Mar/2004:07:44:53 -0800] "GET /ops/SP/play//view/TWiki/TWikiHistory?rev=r1.50 HTTP/1.1" 200 42285 +64.242.88.10 - - [08/Mar/2004:07:49:56 -0800] "GET /ops/SP/play//edit/TWiki/RyanFreebern?t=1078701457 HTTP/1.1" 401 12846 +64.242.88.10 - - [08/Mar/2004:07:51:39 -0800] "GET /ops/SP/play//view/Main/WebPreferences?rev=r1.2 HTTP/1.1" 200 6061 +64.242.88.10 - - [08/Mar/2004:07:53:19 -0800] "GET /ops/SP/play//rdiff/TWiki/WebTopicEditTemplate HTTP/1.1" 200 7895 +mcl02.tnr.on.ca - - [08/Mar/2004:07:53:37 -0800] "GET /ie.htm HTTP/1.1" 200 3518 +mcl02.tnr.on.ca - - [08/Mar/2004:07:53:38 -0800] "GET /images/image005.jpg HTTP/1.1" 200 21125 +mcl02.tnr.on.ca - - [08/Mar/2004:07:53:38 -0800] "GET /images/image004.jpg HTTP/1.1" 200 10936 +mcl02.tnr.on.ca - - [08/Mar/2004:07:53:38 -0800] "GET /images/msgops.JPG HTTP/1.1" 200 7939 +64.242.88.10 - - [08/Mar/2004:07:54:30 -0800] "GET /ops/SP/play//edit/Main/Unknown_local_recipient_reject_code?topicparent=Main.ConfigurationVariables HTTP/1.1" 401 12846 +64.242.88.10 - - [08/Mar/2004:07:56:34 -0800] "GET /ops/SP/play//search/Main/SearchResult?scope=text®ex=on&search=Web%20*Index[^A-Za-z] HTTP/1.1" 200 4163 +64.242.88.10 - - [08/Mar/2004:08:04:46 -0800] "GET /SpamAssassin.jsp HTTP/1.1" 200 7368 +p5083cd5d.dip0.t-ipconnect.de - - [08/Mar/2004:08:09:32 -0800] "GET /SpamAssassin.jsp HTTP/1.0" 200 7368 +64.242.88.10 - - [08/Mar/2004:08:12:50 -0800] "GET /ops/SP/play//view/TWiki/ChangePassword?rev=r1.6 HTTP/1.1" 200 5181 +64.242.88.10 - - [08/Mar/2004:08:14:15 -0800] "GET /ops/SP/play//edit/TWiki/HaroldGottschalk?t=1078717948 HTTP/1.1" 401 12846 +64.242.88.10 - - [08/Mar/2004:08:15:21 -0800] "GET /ops/SP/play//edit/Main/Expand_owner_alias?topicparent=Main.ConfigurationVariables HTTP/1.1" 401 12846 +64.242.88.10 - - [08/Mar/2004:08:17:09 -0800] "GET /ops/SP/play//view/Main/WebIndex?rev=r1.2 HTTP/1.1" 200 45059 +64.242.88.10 - - [08/Mar/2004:08:18:52 -0800] "GET /rfc.jsp HTTP/1.1" 200 3103 +pool-68-160-195-60.ny325.east.verizon.net - - [08/Mar/2004:08:21:00 -0800] "GET / HTTP/1.1" 200 3169 +pool-68-160-195-60.ny325.east.verizon.net - - [08/Mar/2004:08:21:00 -0800] "GET /favicon.ico HTTP/1.1" 200 1078 +64.242.88.10 - - [08/Mar/2004:08:21:47 -0800] "GET /ops/SP/play//search/Main/SearchResult?scope=text®ex=on&search=RBLs%20*How%20*To[^A-Za-z] HTTP/1.1" 200 3575 +64.242.88.10 - - [08/Mar/2004:08:25:37 -0800] "GET /ops/SP/play//rdiff/TWiki/WebTopicEditTemplate?rev1=1.5&rev2=1.4 HTTP/1.1" 200 4212 +212.92.37.62 - - [08/Mar/2004:08:26:41 -0800] "GET / HTTP/1.1" 200 3169 +212.92.37.62 - - [08/Mar/2004:08:27:04 -0800] "GET /ops/SP/play//view/Main/WebHome HTTP/1.1" 200 10419 +212.92.37.62 - - [08/Mar/2004:08:27:08 -0800] "GET /go/bin/test/TWikiLogos/twikiRobot46x50.gif HTTP/1.1" 200 2877 +64.242.88.10 - - [08/Mar/2004:08:27:14 -0800] "GET /ops/SP/play//rdiff/Main/SpamAssassin HTTP/1.1" 200 4445 +212.92.37.62 - - [08/Mar/2004:08:27:23 -0800] "GET /ops/SP/play//view/Main/SpamAssassinAndPostFix HTTP/1.1" 200 4034 +212.92.37.62 - - [08/Mar/2004:08:27:28 -0800] "GET /ops/SP/play//view/Main/SpamAssassinTaggingOnly HTTP/1.1" 200 5691 +64.242.88.10 - - [08/Mar/2004:08:28:23 -0800] "GET /ops/SP/play//rdiff/Main/TokyoOffice?rev1=1.2&rev2=1.1 HTTP/1.1" 200 7316 +64.242.88.10 - - [08/Mar/2004:08:29:36 -0800] "GET /ops/SP/play//view/TWiki/TWikiCategoryTable HTTP/1.1" 200 3729 +219.95.17.51 - - [08/Mar/2004:08:29:57 -0800] "GET / HTTP/1.1" 200 3169 +212.92.37.62 - - [08/Mar/2004:08:30:25 -0800] "GET /ops/SP/play//view/Main/SpamAssassinDeleting HTTP/1.1" 200 5543 +212.92.37.62 - - [08/Mar/2004:08:31:37 -0800] "GET /ops/SP/play//view/Main/DCCAndPostFix HTTP/1.1" 200 5253 +10.0.0.176 - - [08/Mar/2004:08:32:24 -0800] "GET / HTTP/1.1" 304 - +10.0.0.176 - - [08/Mar/2004:08:32:27 -0800] "GET /ops/SP/play//view/Main/WebHome HTTP/1.1" 200 10419 +10.0.0.176 - - [08/Mar/2004:08:32:27 -0800] "GET /go/bin/test/TWikiLogos/twikiRobot46x50.gif HTTP/1.1" 304 - +212.92.37.62 - - [08/Mar/2004:08:32:34 -0800] "GET /ops/SP/play//view/Main/SpamAssassinUsingRazorAndDCC HTTP/1.1" 200 7435 +212.92.37.62 - - [08/Mar/2004:08:33:27 -0800] "GET /ops/SP/play//view/Main/PostfixCommands HTTP/1.1" 200 4016 +212.92.37.62 - - [08/Mar/2004:08:33:30 -0800] "GET /ops/SP/play//view/Main/PostfixCmd HTTP/1.1" 200 4173 +212.92.37.62 - - [08/Mar/2004:08:33:39 -0800] "GET /ops/SP/play//view/Main/PostSuper HTTP/1.1" 200 3629 +64.242.88.10 - - [08/Mar/2004:08:33:51 -0800] "GET /ops/SP/play//view/Main/WebPreferences?rev=r1.14 HTTP/1.1" 200 8820 +212.92.37.62 - - [08/Mar/2004:08:33:52 -0800] "GET /ops/SP/play//view/Main/SideBar HTTP/1.1" 200 3972 +212.92.37.62 - - [08/Mar/2004:08:33:57 -0800] "GET /ops/SP/play//view/Main/DCCGraphs HTTP/1.1" 200 5402 +212.92.37.62 - - [08/Mar/2004:08:34:09 -0800] "GET /SpamAssassin.jsp HTTP/1.1" 200 7368 +64.242.88.10 - - [08/Mar/2004:08:34:53 -0800] "GET /ops/SP/play//rdiff/TWiki/TWikiHistory?rev1=1.8&rev2=1.7 HTTP/1.1" 200 4972 +64.242.88.10 - - [08/Mar/2004:08:36:05 -0800] "GET /ops/SP/play//view/TWiki/ChangePassword?rev=r1.3 HTTP/1.1" 200 5229 +92-moc-6.acn.waw.pl - - [08/Mar/2004:08:37:14 -0800] "GET /ops/SP/play//view/Main/SpamAssassinAndPostFix HTTP/1.1" 200 4034 +92-moc-6.acn.waw.pl - - [08/Mar/2004:08:37:14 -0800] "GET /go/bin/test/TWikiLogos/twikiRobot46x50.gif HTTP/1.1" 304 - +92-moc-6.acn.waw.pl - - [08/Mar/2004:08:37:17 -0800] "GET /ops/SP/play//view/Main/SpamAssassinTaggingOnly HTTP/1.1" 200 5691 +64.242.88.10 - - [08/Mar/2004:08:37:23 -0800] "GET /ops/SP/play//attach/TWiki/HaroldGottschalk HTTP/1.1" 401 12846 +66.213.206.2 - - [08/Mar/2004:08:37:53 -0800] "GET / HTTP/1.1" 200 3169 +64.242.88.10 - - [08/Mar/2004:08:40:15 -0800] "GET /LateEmail.jsp HTTP/1.1" 200 7649 +64.242.88.10 - - [08/Mar/2004:08:52:13 -0800] "GET /ops/SP/play//view/TWiki/TextFormattingRules?rev=r1.15 HTTP/1.1" 200 16746 +64.242.88.10 - - [08/Mar/2004:08:53:17 -0800] "GET /ops/SP/play//view/TWiki/TWikiTutorial HTTP/1.1" 200 14485 +64.242.88.10 - - [08/Mar/2004:08:55:12 -0800] "GET /mailman/private/dentalstudies/ HTTP/1.1" 200 1558 +spot.nnacorp.com - - [08/Mar/2004:09:02:14 -0800] "GET / HTTP/1.1" 200 3169 +spot.nnacorp.com - - [08/Mar/2004:09:02:21 -0800] "GET /ops/SP/play//view/Main/WebHome HTTP/1.1" 200 10419 +spot.nnacorp.com - - [08/Mar/2004:09:02:21 -0800] "GET /go/bin/test/TWikiLogos/twikiRobot46x50.gif HTTP/1.1" 200 2877 +10.0.0.176 - - [08/Mar/2004:09:02:29 -0800] "GET / HTTP/1.1" 304 - +10.0.0.176 - - [08/Mar/2004:09:02:31 -0800] "GET /forplus/mailgraph2.cgi HTTP/1.1" 200 2987 +10.0.0.176 - - [08/Mar/2004:09:02:32 -0800] "GET /forplus/mailgraph.cgi/mailgraph_0_err.png HTTP/1.1" 200 7326 +10.0.0.176 - - [08/Mar/2004:09:02:32 -0800] "GET /forplus/mailgraph.cgi/mailgraph_0.png HTTP/1.1" 200 7927 +10.0.0.176 - - [08/Mar/2004:09:02:32 -0800] "GET /forplus/mailgraph.cgi/mailgraph_1_err.png HTTP/1.1" 200 7182 +10.0.0.176 - - [08/Mar/2004:09:02:32 -0800] "GET /forplus/mailgraph.cgi/mailgraph_1.png HTTP/1.1" 200 8866 +10.0.0.176 - - [08/Mar/2004:09:02:32 -0800] "GET /forplus/mailgraph.cgi/mailgraph_2.png HTTP/1.1" 200 9307 +10.0.0.176 - - [08/Mar/2004:09:02:32 -0800] "GET /forplus/mailgraph.cgi/mailgraph_2_err.png HTTP/1.1" 200 6805 +10.0.0.176 - - [08/Mar/2004:09:02:32 -0800] "GET /forplus/mailgraph.cgi/mailgraph_3.png HTTP/1.1" 200 6596 +10.0.0.176 - - [08/Mar/2004:09:02:32 -0800] "GET /forplus/mailgraph.cgi/mailgraph_3_err.png HTTP/1.1" 200 5499 +spot.nnacorp.com - - [08/Mar/2004:09:02:54 -0800] "GET /ops/SP/play//view/Main/TWikiUsers HTTP/1.1" 200 6697 +spot.nnacorp.com - - [08/Mar/2004:09:02:54 -0800] "GET /go/bin/test/TWikiLogos/twikiRobot46x50.gif HTTP/1.1" 304 - +64.242.88.10 - - [08/Mar/2004:09:03:18 -0800] "GET /ststats/index.jsp HTTP/1.1" 200 2955 +64.242.88.10 - - [08/Mar/2004:09:05:54 -0800] "GET /ops/SP/play//edit/Sandbox/TestTopic6?topicparent=Sandbox.WebHome HTTP/1.1" 401 12846 +64.242.88.10 - - [08/Mar/2004:09:09:55 -0800] "GET /ops/SP/play//view/TWiki/TablePlugin?skin=print HTTP/1.1" 200 1572 +64.242.88.10 - - [08/Mar/2004:09:12:54 -0800] "GET /ops/SP/play//search/Main/SearchResult?scope=text®ex=on&search=Spam%20*Assassin[^A-Za-z] HTTP/1.1" 200 8782 +lhr003a.dhl.com - - [08/Mar/2004:09:16:26 -0800] "GET / HTTP/1.0" 200 3169 +lhr003a.dhl.com - - [08/Mar/2004:09:17:16 -0800] "GET /ststats/index.jsp HTTP/1.0" 200 2955 +lhr003a.dhl.com - - [08/Mar/2004:09:17:17 -0800] "GET /ststats/stats-spam.1day.png HTTP/1.0" 200 3040 +lhr003a.dhl.com - - [08/Mar/2004:09:17:17 -0800] "GET /ststats/stats-spam-ratio.1week.png HTTP/1.0" 200 2341 +lhr003a.dhl.com - - [08/Mar/2004:09:17:17 -0800] "GET /ststats/stats-spam-ratio.1day.png HTTP/1.0" 200 2271 +lhr003a.dhl.com - - [08/Mar/2004:09:17:17 -0800] "GET /ststats/stats-spam.1week.png HTTP/1.0" 200 3302 +lhr003a.dhl.com - - [08/Mar/2004:09:17:17 -0800] "GET /ststats/stats-hashes.1week.png HTTP/1.0" 200 1663 +lhr003a.dhl.com - - [08/Mar/2004:09:17:17 -0800] "GET /ststats/stats-spam.1month.png HTTP/1.0" 200 2521 +lhr003a.dhl.com - - [08/Mar/2004:09:17:17 -0800] "GET /ststats/stats-spam-ratio.1month.png HTTP/1.0" 200 1918 +lhr003a.dhl.com - - [08/Mar/2004:09:17:17 -0800] "GET /ststats/stats-hashes.1month.png HTTP/1.0" 200 1580 +lhr003a.dhl.com - - [08/Mar/2004:09:17:17 -0800] "GET /ststats/stats-spam.1year.png HTTP/1.0" 200 2202 +lhr003a.dhl.com - - [08/Mar/2004:09:17:18 -0800] "GET /ststats/stats-spam-ratio.1year.png HTTP/1.0" 200 1822 +lhr003a.dhl.com - - [08/Mar/2004:09:17:18 -0800] "GET /ststats/stats-hashes.1year.png HTTP/1.0" 200 1526 +10.0.0.176 - - [08/Mar/2004:09:18:53 -0800] "GET / HTTP/1.1" 304 - +10.0.0.176 - - [08/Mar/2004:09:18:56 -0800] "GET /ststats/index.jsp HTTP/1.1" 304 - +10.0.0.176 - - [08/Mar/2004:09:18:57 -0800] "GET /ststats/stats-spam.1day.png HTTP/1.1" 200 3040 +10.0.0.176 - - [08/Mar/2004:09:18:57 -0800] "GET /ststats/stats-spam-ratio.1day.png HTTP/1.1" 200 2271 +10.0.0.176 - - [08/Mar/2004:09:18:57 -0800] "GET /ststats/stats-spam-ratio.1week.png HTTP/1.1" 200 2341 +10.0.0.176 - - [08/Mar/2004:09:18:57 -0800] "GET /ststats/stats-spam.1week.png HTTP/1.1" 200 3302 +10.0.0.176 - - [08/Mar/2004:09:18:57 -0800] "GET /ststats/stats-hashes.1month.png HTTP/1.1" 200 1580 +10.0.0.176 - - [08/Mar/2004:09:18:57 -0800] "GET /ststats/stats-spam-ratio.1month.png HTTP/1.1" 200 1918 +10.0.0.176 - - [08/Mar/2004:09:18:57 -0800] "GET /ststats/stats-hashes.1week.png HTTP/1.1" 200 1663 +10.0.0.176 - - [08/Mar/2004:09:18:57 -0800] "GET /ststats/stats-spam.1year.png HTTP/1.1" 200 2202 +10.0.0.176 - - [08/Mar/2004:09:18:57 -0800] "GET /ststats/stats-spam.1month.png HTTP/1.1" 200 2521 +10.0.0.176 - - [08/Mar/2004:09:18:57 -0800] "GET /ststats/stats-spam-ratio.1year.png HTTP/1.1" 200 1822 +10.0.0.176 - - [08/Mar/2004:09:18:57 -0800] "GET /ststats/stats-hashes.1year.png HTTP/1.1" 200 1526 +64.242.88.10 - - [08/Mar/2004:09:23:03 -0800] "GET /ops/SP/play//view/TWiki/SearchDoesNotWork?rev=r1.1 HTTP/1.1" 200 3981 +64.242.88.10 - - [08/Mar/2004:09:25:42 -0800] "GET /ops/SP/play//search/TWiki/SearchResult?scope=text®ex=on&search=TWiki%20*FAQ[^A-Za-z] HTTP/1.1" 200 12083 +lj1036.passgo.com - - [08/Mar/2004:09:29:35 -0800] "GET /robots.txt HTTP/1.0" 200 68 +lj1027.passgo.com - - [08/Mar/2004:09:29:36 -0800] "GET /ops/SP/play//oops/Know/WinDoze95Crash HTTP/1.0" 200 209 +pool-68-160-195-60.ny325.east.verizon.net - - [08/Mar/2004:09:30:10 -0800] "GET /ops/SP/play//view/Main/WebHome HTTP/1.1" 200 10419 +pool-68-160-195-60.ny325.east.verizon.net - - [08/Mar/2004:09:30:11 -0800] "GET /favicon.ico HTTP/1.1" 200 1078 +pool-68-160-195-60.ny325.east.verizon.net - - [08/Mar/2004:09:30:11 -0800] "GET /go/bin/test/TWikiLogos/twikiRobot46x50.gif HTTP/1.1" 200 2877 +64.242.88.10 - - [08/Mar/2004:09:30:40 -0800] "GET /ops/SP/play//view/TWiki/WebSearch?rev=r1.10 HTTP/1.1" 200 9419 +64.242.88.10 - - [08/Mar/2004:09:32:32 -0800] "GET /ops/SP/play//rdiff/TWiki/TWikiDownload HTTP/1.1" 200 5933 +64.242.88.10 - - [08/Mar/2004:09:33:46 -0800] "GET /ops/SP/play//view/Main/SideBar?rev=1.1 HTTP/1.1" 200 3564 +lj1156.passgo.com - - [08/Mar/2004:09:33:53 -0800] "GET /ops/SP/play//oops/TWiki/TWikiAccessControl HTTP/1.0" 200 209 +64.242.88.10 - - [08/Mar/2004:09:34:58 -0800] "GET /ops/SP/play//rdiff/TWiki/TWikiFAQ HTTP/1.1" 200 43115 +64.242.88.10 - - [08/Mar/2004:09:36:35 -0800] "GET /ops/SP/play//edit/TWiki/WebNotification?topicparent=TWiki.TWikiUpgradeTo01May2000 HTTP/1.1" 401 12846 +64.242.88.10 - - [08/Mar/2004:09:38:11 -0800] "GET /ops/SP/play//view/Main/TWikiGuest?rev=r1.3 HTTP/1.1" 200 4604 +lj1156.passgo.com - - [08/Mar/2004:09:40:30 -0800] "GET /ops/SP/play//view/TWiki/d43 HTTP/1.0" 200 4619 +64.242.88.10 - - [08/Mar/2004:09:41:15 -0800] "GET /ops/SP/play//edit/Main/Export_environment?topicparent=Main.ConfigurationVariables HTTP/1.1" 401 12846 +64.242.88.10 - - [08/Mar/2004:09:42:27 -0800] "GET /ops/SP/play//rdiff/Know/ReadmeFirst?rev1=1.6&rev2=1.5 HTTP/1.1" 200 4187 +64.242.88.10 - - [08/Mar/2004:09:45:15 -0800] "GET /ops/SP/play//search/TWiki/SearchResult?scope=text®ex=on&search=Change%20*Password[^A-Za-z] HTTP/1.1" 200 7226 +64.242.88.10 - - [08/Mar/2004:10:01:06 -0800] "GET /ops/SP/play//view/TWiki/TWikiTopics?rev=r1.4 HTTP/1.1" 200 5171 +64.242.88.10 - - [08/Mar/2004:10:05:40 -0800] "GET /ops/SP/play//view/TWiki/WebSearch?rev=r1.9 HTTP/1.1" 200 9469 +lj1164.passgo.com - - [08/Mar/2004:10:06:28 -0800] "GET /ops/SP/play//view/Main/DCCGraphs HTTP/1.0" 200 5383 +64.242.88.10 - - [08/Mar/2004:10:08:02 -0800] "GET /ops/SP/play//rename/TWiki/DefaultPlugin HTTP/1.1" 401 12846 +64.242.88.10 - - [08/Mar/2004:10:09:52 -0800] "GET /ops/SP/play//view/Main/TWikiGuest?rev=r1.1 HTTP/1.1" 200 3763 +64.242.88.10 - - [08/Mar/2004:10:14:46 -0800] "GET /ops/SP/play//edit/TWiki/TWikiRegistration?t=1078670224 HTTP/1.1" 401 12851 +64.242.88.10 - - [08/Mar/2004:10:16:52 -0800] "GET /ops/SP/play//view/Main/TWikiAdminGroup?rev=1.6 HTTP/1.1" 200 4462 +64.242.88.10 - - [08/Mar/2004:10:18:21 -0800] "GET /ops/SP/play//rdiff/TWiki/WikiSyntax HTTP/1.1" 200 59454 +64.242.88.10 - - [08/Mar/2004:10:21:21 -0800] "GET /ops/SP/play//oops/TWiki/WikiCulture?template=oopsmore¶m1=1.8¶m2=1.8 HTTP/1.1" 200 11245 +64.242.88.10 - - [08/Mar/2004:10:30:56 -0800] "GET /ops/SP/play//view/TWiki/WikiTopic HTTP/1.1" 200 4646 +64.242.88.10 - - [08/Mar/2004:10:32:18 -0800] "GET /ops/SP/play//rdiff/TWiki/WebPreferences HTTP/1.1" 200 36410 +64.242.88.10 - - [08/Mar/2004:10:34:55 -0800] "GET /ops/SP/play//view/TWiki/WebSearch?skin=print HTTP/1.1" 200 7196 +64.242.88.10 - - [08/Mar/2004:10:40:09 -0800] "GET /ops/SP/play//view/TWiki/TWikiTopics?rev=r1.7 HTTP/1.1" 200 8540 +64.242.88.10 - - [08/Mar/2004:10:45:25 -0800] "GET /ops/SP/play//search/Main/SearchResult?scope=text®ex=on&search=Thanadon%20*Somdee[^A-Za-z] HTTP/1.1" 200 4287 +64.242.88.10 - - [08/Mar/2004:10:46:34 -0800] "GET /ops/SP/play//view/TWiki/TWikiUpgradeTo01May2000?rev=1.3 HTTP/1.1" 200 7441 +10.0.0.176 - - [08/Mar/2004:10:48:02 -0800] "GET / HTTP/1.1" 304 - +10.0.0.176 - - [08/Mar/2004:10:48:05 -0800] "GET /forplus/mailgraph2.cgi HTTP/1.1" 200 2987 +10.0.0.176 - - [08/Mar/2004:10:48:06 -0800] "GET /forplus/mailgraph.cgi/mailgraph_0_err.png HTTP/1.1" 200 7213 +10.0.0.176 - - [08/Mar/2004:10:48:06 -0800] "GET /forplus/mailgraph.cgi/mailgraph_0.png HTTP/1.1" 200 7970 +10.0.0.176 - - [08/Mar/2004:10:48:06 -0800] "GET /forplus/mailgraph.cgi/mailgraph_1_err.png HTTP/1.1" 200 7254 +10.0.0.176 - - [08/Mar/2004:10:48:06 -0800] "GET /forplus/mailgraph.cgi/mailgraph_1.png HTTP/1.1" 200 8821 +10.0.0.176 - - [08/Mar/2004:10:48:06 -0800] "GET /forplus/mailgraph.cgi/mailgraph_2_err.png HTTP/1.1" 200 6866 +10.0.0.176 - - [08/Mar/2004:10:48:06 -0800] "GET /forplus/mailgraph.cgi/mailgraph_2.png HTTP/1.1" 200 9312 +10.0.0.176 - - [08/Mar/2004:10:48:06 -0800] "GET /forplus/mailgraph.cgi/mailgraph_3.png HTTP/1.1" 200 6596 +10.0.0.176 - - [08/Mar/2004:10:48:06 -0800] "GET /forplus/mailgraph.cgi/mailgraph_3_err.png HTTP/1.1" 200 5499 +64.242.88.10 - - [08/Mar/2004:10:48:19 -0800] "GET /ops/SP/play//edit/Main/Max_use?topicparent=Main.ConfigurationVariables HTTP/1.1" 401 12846 +10.0.0.176 - - [08/Mar/2004:10:48:37 -0800] "GET /ststats/index.jsp HTTP/1.1" 304 - +10.0.0.176 - - [08/Mar/2004:10:48:37 -0800] "GET /ststats/stats-spam.1day.png HTTP/1.1" 200 3080 +10.0.0.176 - - [08/Mar/2004:10:48:37 -0800] "GET /ststats/stats-spam-ratio.1day.png HTTP/1.1" 200 2224 +10.0.0.176 - - [08/Mar/2004:10:48:37 -0800] "GET /ststats/stats-spam.1week.png HTTP/1.1" 200 3299 +10.0.0.176 - - [08/Mar/2004:10:48:37 -0800] "GET /ststats/stats-spam.1month.png HTTP/1.1" 200 2481 +10.0.0.176 - - [08/Mar/2004:10:48:37 -0800] "GET /ststats/stats-hashes.1week.png HTTP/1.1" 200 1667 +10.0.0.176 - - [08/Mar/2004:10:48:37 -0800] "GET /ststats/stats-spam-ratio.1week.png HTTP/1.1" 200 2346 +10.0.0.176 - - [08/Mar/2004:10:48:37 -0800] "GET /ststats/stats-spam-ratio.1month.png HTTP/1.1" 200 1872 +10.0.0.176 - - [08/Mar/2004:10:48:37 -0800] "GET /ststats/stats-hashes.1month.png HTTP/1.1" 200 1585 +10.0.0.176 - - [08/Mar/2004:10:48:37 -0800] "GET /ststats/stats-spam.1year.png HTTP/1.1" 200 2202 +10.0.0.176 - - [08/Mar/2004:10:48:37 -0800] "GET /ststats/stats-spam-ratio.1year.png HTTP/1.1" 200 1833 +10.0.0.176 - - [08/Mar/2004:10:48:37 -0800] "GET /ststats/stats-hashes.1year.png HTTP/1.1" 200 1521 +64.242.88.10 - - [08/Mar/2004:10:50:05 -0800] "GET /ops/SP/play//rdiff/TWiki/WebRss HTTP/1.1" 200 21483 +64.242.88.10 - - [08/Mar/2004:11:03:34 -0800] "GET /ops/SP/play//rdiff/TWiki/WikiCulture?rev1=1.8&rev2=1.7 HTTP/1.1" 200 5326 +128.227.88.79 - - [08/Mar/2004:11:06:20 -0800] "GET /ops/SP/play//view/Main/SpamAssassinAndPostFix HTTP/1.1" 200 4034 +128.227.88.79 - - [08/Mar/2004:11:06:20 -0800] "GET /go/bin/test/TWikiLogos/twikiRobot46x50.gif HTTP/1.1" 304 - +128.227.88.79 - - [08/Mar/2004:11:06:28 -0800] "GET /ops/SP/play//view/Main/SpamAssassinTaggingOnly HTTP/1.1" 200 5691 +64.242.88.10 - - [08/Mar/2004:11:09:24 -0800] "GET /ops/SP/play//edit/Main/Lmtp_mail_timeout?topicparent=Main.ConfigurationVariables HTTP/1.1" 401 12846 +128.227.88.79 - - [08/Mar/2004:11:10:09 -0800] "GET /ops/SP/play//view/Main/WebHome HTTP/1.1" 200 10419 +128.227.88.79 - - [08/Mar/2004:11:10:24 -0800] "GET /ops/SP/play//view/Main/PostfixCommands HTTP/1.1" 200 4016 +128.227.88.79 - - [08/Mar/2004:11:11:04 -0800] "GET /ops/SP/play//view/Main/WebHome HTTP/1.1" 200 10419 +128.227.88.79 - - [08/Mar/2004:11:11:10 -0800] "GET /ops/SP/play//view/Main/TWikiGroups HTTP/1.1" 200 4816 +128.227.88.79 - - [08/Mar/2004:11:11:15 -0800] "GET /ops/SP/play//view/Main/TWikiAdminGroup HTTP/1.1" 200 4175 +128.227.88.79 - - [08/Mar/2004:11:11:26 -0800] "GET /ops/SP/play//view/Main/WebHome HTTP/1.1" 200 10419 +64.242.88.10 - - [08/Mar/2004:11:11:51 -0800] "GET /ops/SP/play//edit/Main/TWikiGuest?t=1078713282 HTTP/1.1" 401 12846 +64.242.88.10 - - [08/Mar/2004:11:15:51 -0800] "GET /ops/SP/play//rdiff/TWiki/AdminSkillsAssumptions HTTP/1.1" 200 10368 +64.242.88.10 - - [08/Mar/2004:11:17:49 -0800] "GET /ops/SP/play//view/Sandbox/WebHome?rev=r1.3 HTTP/1.1" 200 8708 +64.242.88.10 - - [08/Mar/2004:11:19:43 -0800] "GET /ops/SP/play//edit/TWiki/WikiNotation?t=1078726052 HTTP/1.1" 401 12846 +64.242.88.10 - - [08/Mar/2004:11:24:12 -0800] "GET /ops/SP/play//search/TWiki/SearchResult?scope=text®ex=on&search=Wiki%20*Notation[^A-Za-z] HTTP/1.1" 200 6558 +64.242.88.10 - - [08/Mar/2004:11:25:16 -0800] "GET /ops/SP/play//oops/TWiki/WikiNotation?template=oopsmore¶m1=1.3¶m2=1.3 HTTP/1.1" 200 11263 +10.0.0.176 - - [08/Mar/2004:11:40:41 -0800] "GET /forplus/mailgraph2.cgi HTTP/1.1" 200 2987 +10.0.0.176 - - [08/Mar/2004:11:40:42 -0800] "GET /forplus/mailgraph.cgi/mailgraph_0_err.png HTTP/1.1" 200 7226 +10.0.0.176 - - [08/Mar/2004:11:40:42 -0800] "GET /forplus/mailgraph.cgi/mailgraph_0.png HTTP/1.1" 200 8055 +10.0.0.176 - - [08/Mar/2004:11:40:42 -0800] "GET /forplus/mailgraph.cgi/mailgraph_1.png HTTP/1.1" 200 8787 +10.0.0.176 - - [08/Mar/2004:11:40:42 -0800] "GET /forplus/mailgraph.cgi/mailgraph_1_err.png HTTP/1.1" 200 7088 +10.0.0.176 - - [08/Mar/2004:11:40:42 -0800] "GET /forplus/mailgraph.cgi/mailgraph_2_err.png HTTP/1.1" 200 6866 +10.0.0.176 - - [08/Mar/2004:11:40:42 -0800] "GET /forplus/mailgraph.cgi/mailgraph_3.png HTTP/1.1" 200 6596 +10.0.0.176 - - [08/Mar/2004:11:40:42 -0800] "GET /forplus/mailgraph.cgi/mailgraph_2.png HTTP/1.1" 200 9312 +10.0.0.176 - - [08/Mar/2004:11:40:42 -0800] "GET /forplus/mailgraph.cgi/mailgraph_3_err.png HTTP/1.1" 200 5499 +64.242.88.10 - - [08/Mar/2004:11:41:14 -0800] "GET /mailman/admin/artsscience HTTP/1.1" 200 2125 +64.242.88.10 - - [08/Mar/2004:11:43:17 -0800] "GET /ops/SP/play//search/Main/?scope=topic®ex=on&search=^d HTTP/1.1" 200 5036 +64.242.88.10 - - [08/Mar/2004:11:45:08 -0800] "GET /ops/SP/play//edit/TWiki/TWikiCodevFeatureToDo?topicparent=TWiki.TWikiHistory HTTP/1.1" 401 12846 +64.242.88.10 - - [08/Mar/2004:11:47:52 -0800] "GET /ops/SP/play//rename/TWiki/ResetPassword HTTP/1.1" 401 12851 +64.242.88.10 - - [08/Mar/2004:11:49:23 -0800] "GET /ops/SP/play//edit/Main/Fast_flush_domains?topicparent=Main.ConfigurationVariables HTTP/1.1" 401 12846 +64.242.88.10 - - [08/Mar/2004:11:51:20 -0800] "GET /ops/SP/play//edit/Main/SpamAssassin?t=1078709979 HTTP/1.1" 401 12846 +64.242.88.10 - - [08/Mar/2004:11:56:19 -0800] "GET /ops/SP/play//view/TWiki/TWikiTopics?rev=r1.10 HTTP/1.1" 200 14650 +64.242.88.10 - - [08/Mar/2004:11:57:28 -0800] "GET /ops/SP/play//view/TWiki/FileAttribute?rev=r1.2 HTTP/1.1" 200 3949 +64.242.88.10 - - [08/Mar/2004:12:00:26 -0800] "GET /ops/SP/play//rdiff/TWiki/TWikiEnhancementRequests HTTP/1.1" 200 10417 +64.242.88.10 - - [08/Mar/2004:12:06:03 -0800] "GET /ops/SP/play//search/TWiki/SearchResult?scope=text®ex=on&search=Kevin%20*Kinnell[^A-Za-z] HTTP/1.1" 200 4536 +10.0.0.176 - - [08/Mar/2004:12:06:29 -0800] "GET /forplus/mailgraph2.cgi HTTP/1.1" 200 2987 +10.0.0.176 - - [08/Mar/2004:12:06:29 -0800] "GET /forplus/mailgraph.cgi/mailgraph_0_err.png HTTP/1.1" 200 7192 +10.0.0.176 - - [08/Mar/2004:12:06:29 -0800] "GET /forplus/mailgraph.cgi/mailgraph_0.png HTTP/1.1" 200 8081 +10.0.0.176 - - [08/Mar/2004:12:06:29 -0800] "GET /forplus/mailgraph.cgi/mailgraph_1.png HTTP/1.1" 200 9065 +10.0.0.176 - - [08/Mar/2004:12:06:29 -0800] "GET /forplus/mailgraph.cgi/mailgraph_1_err.png HTTP/1.1" 200 7206 +10.0.0.176 - - [08/Mar/2004:12:06:29 -0800] "GET /forplus/mailgraph.cgi/mailgraph_2.png HTTP/1.1" 200 9312 +10.0.0.176 - - [08/Mar/2004:12:06:29 -0800] "GET /forplus/mailgraph.cgi/mailgraph_2_err.png HTTP/1.1" 200 6866 +10.0.0.176 - - [08/Mar/2004:12:06:29 -0800] "GET /forplus/mailgraph.cgi/mailgraph_3.png HTTP/1.1" 200 6596 +10.0.0.176 - - [08/Mar/2004:12:06:29 -0800] "GET /forplus/mailgraph.cgi/mailgraph_3_err.png HTTP/1.1" 200 5499 +64.242.88.10 - - [08/Mar/2004:12:07:13 -0800] "GET /ops/SP/play//view/TWiki/FileAttribute?rev=1.2 HTTP/1.1" 200 3949 +64.242.88.10 - - [08/Mar/2004:12:08:32 -0800] "GET /ops/SP/play//view/TWiki/WikiNotation?skin=print HTTP/1.1" 200 1435 +64.242.88.10 - - [08/Mar/2004:12:10:39 -0800] "GET /ops/SP/play//rdiff/TWiki/TWikiPlannedFeatures HTTP/1.1" 200 10577 +64.242.88.10 - - [08/Mar/2004:12:12:50 -0800] "GET /mailman/admin/deans HTTP/1.1" 200 2080 +64.242.88.10 - - [08/Mar/2004:12:15:36 -0800] "GET /pipermail/webber/ HTTP/1.1" 200 1161 +64.242.88.10 - - [08/Mar/2004:12:20:18 -0800] "GET /ops/SP/play//view/Main/PostSuper?rev=1.1 HTTP/1.1" 200 3629 +64.242.88.10 - - [08/Mar/2004:12:25:47 -0800] "GET /ops/SP/play//view/Main/WebPreferences?rev=1.13 HTTP/1.1" 200 8770 +64.242.88.10 - - [08/Mar/2004:12:28:09 -0800] "GET /ops/SP/play//edit/Main/Mailq_path?topicparent=Main.ConfigurationVariables HTTP/1.1" 401 12846 +64.242.88.10 - - [08/Mar/2004:12:31:32 -0800] "GET /ops/SP/play//view/TWiki/WebHome?rev=r1.49 HTTP/1.1" 200 12993 +64.242.88.10 - - [08/Mar/2004:12:33:09 -0800] "GET /ops/SP/play//view/TWiki/TWikiHistory?rev=r1.49 HTTP/1.1" 200 42243 +64.242.88.10 - - [08/Mar/2004:12:39:34 -0800] "GET /ops/SP/play//rdiff/TWiki/TWikiDocGraphics?rev1=1.11&rev2=1.10 HTTP/1.1" 200 6551 +64.242.88.10 - - [08/Mar/2004:12:40:36 -0800] "GET /ops/SP/play//view/TWiki/WebHome?rev=r1.47 HTTP/1.1" 200 12819 +64.242.88.10 - - [08/Mar/2004:12:42:04 -0800] "GET /ops/SP/play//view/Sandbox/WebStatistics HTTP/1.1" 200 6063 +64.242.88.10 - - [08/Mar/2004:12:43:08 -0800] "GET /pipermail/gisgrad/ HTTP/1.1" 200 1118 +64.242.88.10 - - [08/Mar/2004:12:45:13 -0800] "GET /mailman/admin/webber HTTP/1.1" 200 2089 +64.242.88.10 - - [08/Mar/2004:12:47:42 -0800] "GET /ops/SP/play//view/Main/WebPreferences?rev=1.14 HTTP/1.1" 200 8820 +64.242.88.10 - - [08/Mar/2004:12:55:18 -0800] "GET /ops/SP/play//view/TWiki/KevinKinnell?rev=1.4 HTTP/1.1" 200 3730 +64.242.88.10 - - [08/Mar/2004:12:58:39 -0800] "GET /ops/SP/play//search/Main/?search=\\.*&scope=topic&order=modified&reverse=on®ex=on&nosearch=on&limit=800 HTTP/1.1" 200 43915 +market-mail.panduit.com - - [08/Mar/2004:12:58:50 -0800] "GET / HTTP/1.0" 200 3169 +market-mail.panduit.com - - [08/Mar/2004:12:58:50 -0800] "GET /favicon.ico HTTP/1.0" 200 1078 +market-mail.panduit.com - - [08/Mar/2004:12:59:18 -0800] "GET /razor.jsp HTTP/1.0" 200 2869 +market-mail.panduit.com - - [08/Mar/2004:12:59:34 -0800] "GET /ststats/index.jsp HTTP/1.0" 200 2955 +market-mail.panduit.com - - [08/Mar/2004:12:59:37 -0800] "GET /ststats/stats-spam.1day.png HTTP/1.0" 200 3095 +market-mail.panduit.com - - [08/Mar/2004:12:59:37 -0800] "GET /ststats/stats-spam-ratio.1day.png HTTP/1.0" 200 2272 +market-mail.panduit.com - - [08/Mar/2004:12:59:37 -0800] "GET /ststats/stats-spam.1week.png HTTP/1.0" 200 3279 +market-mail.panduit.com - - [08/Mar/2004:12:59:37 -0800] "GET /ststats/stats-spam-ratio.1week.png HTTP/1.0" 200 2349 +market-mail.panduit.com - - [08/Mar/2004:12:59:37 -0800] "GET /ststats/stats-hashes.1week.png HTTP/1.0" 200 1659 +market-mail.panduit.com - - [08/Mar/2004:12:59:37 -0800] "GET /ststats/stats-spam.1month.png HTTP/1.0" 200 2542 +market-mail.panduit.com - - [08/Mar/2004:12:59:37 -0800] "GET /ststats/stats-spam-ratio.1month.png HTTP/1.0" 200 1927 +market-mail.panduit.com - - [08/Mar/2004:12:59:37 -0800] "GET /ststats/stats-hashes.1month.png HTTP/1.0" 200 1580 +market-mail.panduit.com - - [08/Mar/2004:12:59:37 -0800] "GET /ststats/stats-spam.1year.png HTTP/1.0" 200 2201 +market-mail.panduit.com - - [08/Mar/2004:12:59:37 -0800] "GET /ststats/stats-spam-ratio.1year.png HTTP/1.0" 200 1829 +market-mail.panduit.com - - [08/Mar/2004:12:59:37 -0800] "GET /ststats/stats-hashes.1year.png HTTP/1.0" 200 1524 +market-mail.panduit.com - - [08/Mar/2004:12:59:55 -0800] "GET /DCC.jsp HTTP/1.0" 200 2878 +market-mail.panduit.com - - [08/Mar/2004:13:00:12 -0800] "GET /ops/SP/play//view/Main/WebHome HTTP/1.0" 200 10392 +market-mail.panduit.com - - [08/Mar/2004:13:00:12 -0800] "GET /favicon.ico HTTP/1.0" 200 1078 +market-mail.panduit.com - - [08/Mar/2004:13:00:13 -0800] "GET /go/bin/test/TWikiLogos/twikiRobot46x50.gif HTTP/1.0" 200 2877 +market-mail.panduit.com - - [08/Mar/2004:13:00:20 -0800] "GET /ops/SP/play//view/Main/DCC HTTP/1.0" 200 4377 +market-mail.panduit.com - - [08/Mar/2004:13:00:27 -0800] "GET /ops/SP/play//view/Main/DCCAndPostFix HTTP/1.0" 200 5234 +64.242.88.10 - - [08/Mar/2004:13:00:40 -0800] "GET /ops/SP/play//oops/TWiki/HaroldGottschalk?template=oopsmore¶m1=1.3¶m2=1.3 HTTP/1.1" 200 11335 +market-mail.panduit.com - - [08/Mar/2004:13:01:27 -0800] "GET /ops/SP/play//view/Main/PostfixCommands HTTP/1.0" 200 4004 +market-mail.panduit.com - - [08/Mar/2004:13:01:29 -0800] "GET /ops/SP/play//view/Main/PostfixCmd HTTP/1.0" 200 4154 +market-mail.panduit.com - - [08/Mar/2004:13:01:35 -0800] "GET /ops/SP/play//edit/Main/PostConf?topicparent=Main.PostfixCommands HTTP/1.0" 401 12816 +market-mail.panduit.com - - [08/Mar/2004:13:01:38 -0800] "GET /go/bin/test/TWikiDocGraphics/help.gif HTTP/1.0" 200 130 +64.242.88.10 - - [08/Mar/2004:13:01:42 -0800] "GET /ops/SP/play//search/TWiki/SearchResult?scope=text®ex=on&search=John%20*Talintyre[^A-Za-z] HTTP/1.1" 200 8066 +market-mail.panduit.com - - [08/Mar/2004:13:01:42 -0800] "GET /ops/SP/play//view/Main/PostSuper HTTP/1.0" 200 3617 +market-mail.panduit.com - - [08/Mar/2004:13:01:55 -0800] "GET /ops/SP/play//view/Main/RelayGateway HTTP/1.0" 200 4213 +market-mail.panduit.com - - [08/Mar/2004:13:02:03 -0800] "GET /ops/SP/play//view/Main/VerifingGatway HTTP/1.0" 200 4731 +market-mail.panduit.com - - [08/Mar/2004:13:02:16 -0800] "GET /ops/SP/play//view/Main/Relay_Domains HTTP/1.0" 200 4564 +64.242.88.10 - - [08/Mar/2004:13:04:14 -0800] "GET /ops/SP/play//attach/Main/TWikiGuest HTTP/1.1" 401 12846 +64.242.88.10 - - [08/Mar/2004:13:07:16 -0800] "GET /ops/SP/play//view/Main/NicholasLee?rev=1.1 HTTP/1.1" 200 4456 +64.242.88.10 - - [08/Mar/2004:13:08:17 -0800] "GET /ops/SP/play//attach/TWiki/TWikiDocGraphics?filename=pencil.gif&revInfo=1 HTTP/1.1" 401 12846 +64.242.88.10 - - [08/Mar/2004:13:12:54 -0800] "GET /ops/SP/play//rdiff/TWiki/WebSiteTools?rev1=1.2&rev2=1.1 HTTP/1.1" 200 6640 +64.242.88.10 - - [08/Mar/2004:13:15:03 -0800] "GET /ops/SP/play//view/TWiki/TWikiHistory?rev=r1.55 HTTP/1.1" 200 44652 +64.242.88.10 - - [08/Mar/2004:13:16:11 -0800] "GET /ops/SP/play//attach/Main/SpamAssassinAndPostFix HTTP/1.1" 401 12846 +64.242.88.10 - - [08/Mar/2004:13:17:23 -0800] "GET /mailman/private/artsscience/ HTTP/1.1" 200 1552 +64.242.88.10 - - [08/Mar/2004:13:18:57 -0800] "GET /ops/SP/play//search/TWiki/?scope=topic®ex=on&search=^l HTTP/1.1" 200 2937 +64.242.88.10 - - [08/Mar/2004:13:24:49 -0800] "GET /ops/SP/play//rdiff/Main/RelayGateway?rev1=1.3&rev2=1.2 HTTP/1.1" 200 5181 +64.242.88.10 - - [08/Mar/2004:13:29:37 -0800] "GET /ops/SP/play//rdiff/Main/RelayGateway?rev1=1.2&rev2=1.1 HTTP/1.1" 200 6029 +64.242.88.10 - - [08/Mar/2004:13:31:16 -0800] "GET /ops/SP/play//rdiff/TWiki/WikiReferences?rev1=1.2&rev2=1.1 HTTP/1.1" 200 10024 +64.242.88.10 - - [08/Mar/2004:13:32:35 -0800] "GET /ops/SP/play//view/Main/WebPreferences?rev=r1.9 HTTP/1.1" 200 7511 +64.242.88.10 - - [08/Mar/2004:13:35:02 -0800] "GET /ops/SP/play//edit/TWiki/WebSiteTools?t=1078731408 HTTP/1.1" 401 12846 +64.242.88.10 - - [08/Mar/2004:13:36:06 -0800] "GET /ops/SP/play//attach/TWiki/TWikiDocGraphics?filename=viewtopic.gif&revInfo=1 HTTP/1.1" 401 12846 +64.242.88.10 - - [08/Mar/2004:13:38:39 -0800] "GET /ops/SP/play//view/TWiki/SvenDowideit?rev=r1.1 HTTP/1.1" 200 3564 +64.242.88.10 - - [08/Mar/2004:13:45:46 -0800] "GET /ops/SP/play//edit/Main/Ignore_mx_lookup_error?topicparent=Main.ConfigurationVariables HTTP/1.1" 401 12846 +64.242.88.10 - - [08/Mar/2004:13:48:06 -0800] "GET /ops/SP/play//oops/Main/DCCAndPostFix?template=oopsmore¶m1=1.2¶m2=1.2 HTTP/1.1" 200 6602 +64.242.88.10 - - [08/Mar/2004:13:49:47 -0800] "GET /ops/SP/play//view/TWiki/TWikiHistory?rev=r1.54 HTTP/1.1" 200 44644 +64.242.88.10 - - [08/Mar/2004:13:55:51 -0800] "GET /ops/SP/play//edit/Main/Allow_min_user?topicparent=Main.ConfigurationVariables HTTP/1.1" 401 12846 +64.242.88.10 - - [08/Mar/2004:13:56:52 -0800] "GET /ops/SP/play//edit/TWiki/KevinKinnell?t=1078692967 HTTP/1.1" 401 12846 +64.242.88.10 - - [08/Mar/2004:13:57:52 -0800] "GET /pipermail/fcd/ HTTP/1.1" 200 468 +64.242.88.10 - - [08/Mar/2004:13:58:55 -0800] "GET /mailman/listinfo/mgt-157 HTTP/1.1" 200 6189 +64.242.88.10 - - [08/Mar/2004:14:00:08 -0800] "GET /mailman/admin/fcd HTTP/1.1" 200 2060 +64.242.88.10 - - [08/Mar/2004:14:01:36 -0800] "GET /mailman/listinfo/cnc_forestry HTTP/1.1" 200 6159 +64.242.88.10 - - [08/Mar/2004:14:07:26 -0800] "GET /ops/SP/play//edit/Main/Strict_8bitmime?topicparent=Main.ConfigurationVariables HTTP/1.1" 401 12846 +64.242.88.10 - - [08/Mar/2004:14:11:28 -0800] "GET /ops/SP/play//view/TWiki/WelcomeGuest?rev=r1.19 HTTP/1.1" 200 13997 +64.242.88.10 - - [08/Mar/2004:14:12:49 -0800] "GET /ops/SP/play//view/TWiki/TWikiFAQ?rev=1.11 HTTP/1.1" 200 11950 +64.242.88.10 - - [08/Mar/2004:14:13:51 -0800] "GET /mailman/admin/gisgrad HTTP/1.1" 200 2093 +64.242.88.10 - - [08/Mar/2004:14:15:01 -0800] "GET /mailman/admin/jjec HTTP/1.1" 200 2088 +fw.aub.dk - - [08/Mar/2004:14:16:38 -0800] "GET /ops/SP/play//view/Main/WebHome HTTP/1.0" 200 10392 +fw.aub.dk - - [08/Mar/2004:14:16:39 -0800] "GET /go/bin/test/TWikiLogos/twikiRobot46x50.gif HTTP/1.0" 200 2877 +64.242.88.10 - - [08/Mar/2004:14:23:54 -0800] "GET /ops/SP/play//oops/TWiki/RyanFreebern?template=oopsmore¶m1=1.2¶m2=1.2 HTTP/1.1" 200 11263 +64.242.88.10 - - [08/Mar/2004:14:25:33 -0800] "GET /ops/SP/play//rdiff/TWiki/WebChangesAlert HTTP/1.1" 200 27035 +64.242.88.10 - - [08/Mar/2004:14:26:45 -0800] "GET /ops/SP/play//rdiff/Sandbox/WebTopicList HTTP/1.1" 200 4319 +64.242.88.10 - - [08/Mar/2004:14:27:46 -0800] "GET /ops/SP/play//edit/Main/Virtual_gid_maps?topicparent=Main.ConfigurationVariables HTTP/1.1" 401 12846 +64.242.88.10 - - [08/Mar/2004:14:28:46 -0800] "GET /ops/SP/play//view/TWiki/NewUserTemplate?skin=print HTTP/1.1" 200 2449 +64.242.88.10 - - [08/Mar/2004:14:33:56 -0800] "GET /mailman/admin HTTP/1.1" 200 6872 +64.242.88.10 - - [08/Mar/2004:14:40:18 -0800] "GET /mailman/admin/ncbnpfaculty HTTP/1.1" 200 2136 +64.242.88.10 - - [08/Mar/2004:14:41:22 -0800] "GET /ops/SP/play//search/TWiki/SearchResult?scope=text®ex=on&search=Web%20*Topic%20*List[^A-Za-z] HTTP/1.1" 200 10700 +64.242.88.10 - - [08/Mar/2004:14:42:44 -0800] "GET /ops/SP/play//view/TWiki/WebSearch?rev=1.11 HTTP/1.1" 200 9419 +64.242.88.10 - - [08/Mar/2004:14:43:45 -0800] "GET /ops/SP/play//view/TWiki/MartinCleaver HTTP/1.1" 200 3634 +64.242.88.10 - - [08/Mar/2004:14:52:51 -0800] "GET /ops/SP/play//view/TWiki/WebIndex HTTP/1.1" 200 102154 +64.242.88.10 - - [08/Mar/2004:14:54:56 -0800] "GET /ops/SP/play//edit/Main/TokyoOffice?t=1078706364 HTTP/1.1" 401 12846 +64.242.88.10 - - [08/Mar/2004:14:57:19 -0800] "GET /ops/SP/play//rdiff/Main/SpamAssassinAndPostFix?rev1=1.2&rev2=1.1 HTTP/1.1" 200 5794 +64.242.88.10 - - [08/Mar/2004:14:58:58 -0800] "GET /ops/SP/play//rdiff/TWiki/WhatIsWikiWiki HTTP/1.1" 200 9412 +64.242.88.10 - - [08/Mar/2004:15:00:07 -0800] "GET /ops/SP/play//rdiff/Main/WebChanges?rev1=1.2&rev2=1.1 HTTP/1.1" 200 114220 +64.242.88.10 - - [08/Mar/2004:15:01:12 -0800] "GET /ops/SP/play//rdiff/TWiki/EditDoesNotIncreaseTheRevision HTTP/1.1" 200 6310 +64.242.88.10 - - [08/Mar/2004:15:02:29 -0800] "GET /ops/SP/play//rdiff/TWiki/WebTopicList HTTP/1.1" 200 14591 +64.242.88.10 - - [08/Mar/2004:15:03:49 -0800] "GET /antivirus.jsp HTTP/1.1" 200 3548 +64.242.88.10 - - [08/Mar/2004:15:07:41 -0800] "GET /ops/SP/play//search/TWiki/SearchResult?scope=text®ex=on&search=Harold%20*Gottschalk[^A-Za-z] HTTP/1.1" 200 4412 +ip-200-56-225-61-mty.marcatel.net.mx - - [08/Mar/2004:15:15:17 -0800] "GET /razor.jsp HTTP/1.1" 200 2869 +64.242.88.10 - - [08/Mar/2004:15:16:14 -0800] "GET /ops/SP/play//view/TWiki/TextFormattingRules?rev=r1.37 HTTP/1.1" 200 28922 +64.242.88.10 - - [08/Mar/2004:15:17:18 -0800] "GET /ops/SP/play//search/Main/?scope=topic®ex=on&search=^f HTTP/1.1" 200 3438 +64.242.88.10 - - [08/Mar/2004:15:19:35 -0800] "GET /RBL.jsp HTTP/1.1" 200 4114 +c-24-11-14-147.client.comcast.net - - [08/Mar/2004:16:54:47 -0800] "GET /razor.jsp HTTP/1.1" 200 2869 +c-24-11-14-147.client.comcast.net - - [08/Mar/2004:16:54:47 -0800] "GET /favicon.ico HTTP/1.1" 200 1078 +lj1036.passgo.com - - [08/Mar/2004:17:39:00 -0800] "GET /robots.txt HTTP/1.0" 200 68 +lj1168.passgo.com - - [08/Mar/2004:17:39:01 -0800] "GET /ops/SP/play//oops/TWiki/TWikiVariables HTTP/1.0" 200 209 +calcite.rhyolite.com - - [08/Mar/2004:18:14:44 -0800] "GET /clients.jsp HTTP/1.1" 200 18767 +acbf6930.ipt.aol.com - - [08/Mar/2004:18:20:44 -0800] "GET /RBL.jsp HTTP/1.1" 200 4114 +acbf6930.ipt.aol.com - - [08/Mar/2004:18:20:44 -0800] "GET /LateEmail.jsp HTTP/1.1" 200 7649 +lj1018.passgo.com - - [08/Mar/2004:18:23:43 -0800] "GET /ops/SP/play//oops/Know/PublicSupported HTTP/1.0" 200 209 +barrie-ppp108371.sympatico.ca - - [08/Mar/2004:18:39:33 -0800] "GET /mailman/listinfo/webber HTTP/1.1" 200 6051 +barrie-ppp108371.sympatico.ca - - [08/Mar/2004:18:39:35 -0800] "GET /icons/mailman.jpg HTTP/1.1" 200 2022 +barrie-ppp108371.sympatico.ca - - [08/Mar/2004:18:39:35 -0800] "GET /icons/PythonPowered.png HTTP/1.1" 200 945 +barrie-ppp108371.sympatico.ca - - [08/Mar/2004:18:39:36 -0800] "GET /icons/gnu-head-tiny.jpg HTTP/1.1" 200 3049 +px7wh.vc.shawcable.net - - [08/Mar/2004:18:41:16 -0800] "GET /LateEmail.jsp HTTP/1.1" 200 7649 +user-0c8hdkf.cable.mindspring.com - - [08/Mar/2004:19:08:27 -0800] "GET /ops/SP/play//view/Main/WebHome HTTP/1.1" 200 10419 +user-0c8hdkf.cable.mindspring.com - - [08/Mar/2004:19:08:28 -0800] "GET /go/bin/test/TWikiLogos/twikiRobot46x50.gif HTTP/1.1" 200 2877 +user-0c8hdkf.cable.mindspring.com - - [08/Mar/2004:19:08:39 -0800] "GET /ops/SP/play//view/Main/RelayGateway HTTP/1.1" 200 4232 +user-0c8hdkf.cable.mindspring.com - - [08/Mar/2004:19:08:52 -0800] "GET /ops/SP/play//view/Main/VerifingGatway HTTP/1.1" 200 4750 +user-0c8hdkf.cable.mindspring.com - - [08/Mar/2004:19:10:06 -0800] "GET /ops/SP/play//view/Main/Relay_Domains HTTP/1.1" 200 4583 +lj1053.passgo.com - - [08/Mar/2004:19:24:42 -0800] "GET /ops/SP/play//oops/Main/SpamAssassinTaggingOnly HTTP/1.0" 200 209 +64.246.94.152 - - [08/Mar/2004:20:09:57 -0800] "HEAD /ops/SP/play//view/Main/SpamAssassinDeleting HTTP/1.1" 200 0 +ip68-228-43-49.tc.ph.cox.net - - [08/Mar/2004:20:48:18 -0800] "GET / HTTP/1.0" 200 3169 +ip68-228-43-49.tc.ph.cox.net - - [08/Mar/2004:20:48:18 -0800] "GET /favicon.ico HTTP/1.0" 200 1078 +ip68-228-43-49.tc.ph.cox.net - - [08/Mar/2004:20:48:25 -0800] "GET /ststats/index.jsp HTTP/1.0" 200 2955 +ip68-228-43-49.tc.ph.cox.net - - [08/Mar/2004:20:48:26 -0800] "GET /ststats/stats-spam.1day.png HTTP/1.0" 200 3049 +ip68-228-43-49.tc.ph.cox.net - - [08/Mar/2004:20:48:26 -0800] "GET /ststats/stats-spam-ratio.1day.png HTTP/1.0" 200 2160 +ip68-228-43-49.tc.ph.cox.net - - [08/Mar/2004:20:48:26 -0800] "GET /ststats/stats-spam-ratio.1week.png HTTP/1.0" 200 2386 +ip68-228-43-49.tc.ph.cox.net - - [08/Mar/2004:20:48:26 -0800] "GET /ststats/stats-spam.1week.png HTTP/1.0" 200 3271 +ip68-228-43-49.tc.ph.cox.net - - [08/Mar/2004:20:48:26 -0800] "GET /ststats/stats-hashes.1week.png HTTP/1.0" 200 1687 +ip68-228-43-49.tc.ph.cox.net - - [08/Mar/2004:20:48:26 -0800] "GET /ststats/stats-spam.1month.png HTTP/1.0" 200 2482 +ip68-228-43-49.tc.ph.cox.net - - [08/Mar/2004:20:48:27 -0800] "GET /ststats/stats-spam-ratio.1month.png HTTP/1.0" 200 1914 +ip68-228-43-49.tc.ph.cox.net - - [08/Mar/2004:20:48:27 -0800] "GET /ststats/stats-hashes.1month.png HTTP/1.0" 200 1536 +ip68-228-43-49.tc.ph.cox.net - - [08/Mar/2004:20:48:27 -0800] "GET /ststats/stats-spam.1year.png HTTP/1.0" 200 2250 +ip68-228-43-49.tc.ph.cox.net - - [08/Mar/2004:20:48:27 -0800] "GET /ststats/stats-spam-ratio.1year.png HTTP/1.0" 200 1883 +ip68-228-43-49.tc.ph.cox.net - - [08/Mar/2004:20:48:27 -0800] "GET /ststats/stats-hashes.1year.png HTTP/1.0" 200 1493 +ip68-228-43-49.tc.ph.cox.net - - [08/Mar/2004:20:48:48 -0800] "GET /ops/SP/play//view/Main/WebHome HTTP/1.0" 200 10392 +ip68-228-43-49.tc.ph.cox.net - - [08/Mar/2004:20:48:49 -0800] "GET /go/bin/test/TWikiLogos/twikiRobot46x50.gif HTTP/1.0" 200 2877 +ip68-228-43-49.tc.ph.cox.net - - [08/Mar/2004:20:48:49 -0800] "GET /favicon.ico HTTP/1.0" 200 1078 +ip68-228-43-49.tc.ph.cox.net - - [08/Mar/2004:20:48:53 -0800] "GET /ops/SP/play//view/Main/DCCAndPostFix HTTP/1.0" 200 5234 +ip68-228-43-49.tc.ph.cox.net - - [08/Mar/2004:20:50:59 -0800] "GET /ops/SP/play//view/Main/SpamAssassinAndPostFix HTTP/1.0" 200 4022 +ip68-228-43-49.tc.ph.cox.net - - [08/Mar/2004:20:51:01 -0800] "GET /ops/SP/play//view/Main/SpamAssassinTaggingOnly HTTP/1.0" 200 5672 +ip68-228-43-49.tc.ph.cox.net - - [08/Mar/2004:20:51:51 -0800] "GET /ops/SP/play//view/Main/SpamAssassin HTTP/1.0" 200 4062 +ip68-228-43-49.tc.ph.cox.net - - [08/Mar/2004:20:52:01 -0800] "GET /ops/SP/play//view/Main/SpamAssassin HTTP/1.0" 200 4062 +proxy0.haifa.ac.il - - [08/Mar/2004:22:03:04 -0800] "GET / HTTP/1.0" 200 3169 +proxy0.haifa.ac.il - - [08/Mar/2004:22:03:28 -0800] "GET /ststats/index.jsp HTTP/1.0" 200 2955 +proxy0.haifa.ac.il - - [08/Mar/2004:22:03:29 -0800] "GET /ststats/stats-spam.1week.png HTTP/1.0" 200 3238 +proxy0.haifa.ac.il - - [08/Mar/2004:22:03:29 -0800] "GET /ststats/stats-spam.1day.png HTTP/1.0" 200 3032 +proxy0.haifa.ac.il - - [08/Mar/2004:22:03:29 -0800] "GET /ststats/stats-spam-ratio.1day.png HTTP/1.0" 200 2160 +proxy0.haifa.ac.il - - [08/Mar/2004:22:03:29 -0800] "GET /ststats/stats-spam-ratio.1week.png HTTP/1.0" 200 2369 +proxy0.haifa.ac.il - - [08/Mar/2004:22:03:29 -0800] "GET /ststats/stats-hashes.1week.png HTTP/1.0" 200 1671 +proxy0.haifa.ac.il - - [08/Mar/2004:22:03:29 -0800] "GET /ststats/stats-spam.1month.png HTTP/1.0" 200 2485 +proxy0.haifa.ac.il - - [08/Mar/2004:22:03:29 -0800] "GET /ststats/stats-hashes.1month.png HTTP/1.0" 200 1533 +proxy0.haifa.ac.il - - [08/Mar/2004:22:03:29 -0800] "GET /ststats/stats-spam-ratio.1month.png HTTP/1.0" 200 1906 +proxy0.haifa.ac.il - - [08/Mar/2004:22:03:29 -0800] "GET /ststats/stats-spam.1year.png HTTP/1.0" 200 2251 +proxy0.haifa.ac.il - - [08/Mar/2004:22:03:29 -0800] "GET /ststats/stats-spam-ratio.1year.png HTTP/1.0" 200 1875 +proxy0.haifa.ac.il - - [08/Mar/2004:22:03:29 -0800] "GET /ststats/stats-hashes.1year.png HTTP/1.0" 200 1483 +proxy0.haifa.ac.il - - [08/Mar/2004:22:03:44 -0800] "GET /SpamAssassin.jsp HTTP/1.0" 200 7368 +proxy0.haifa.ac.il - - [08/Mar/2004:22:03:52 -0800] "GET /razor.jsp HTTP/1.0" 200 2869 +proxy0.haifa.ac.il - - [08/Mar/2004:22:04:09 -0800] "GET /ops/SP/play//view/Main/WebHome HTTP/1.0" 200 10392 +proxy0.haifa.ac.il - - [08/Mar/2004:22:04:10 -0800] "GET /go/bin/test/TWikiLogos/twikiRobot46x50.gif HTTP/1.0" 200 2877 +proxy0.haifa.ac.il - - [08/Mar/2004:22:04:24 -0800] "GET /ops/SP/play//view/Main/LinksOfUse HTTP/1.0" 200 4515 +proxy0.haifa.ac.il - - [08/Mar/2004:22:04:35 -0800] "GET /ops/SP/play//view/Main/PostfixCommands HTTP/1.0" 200 4004 +alille-251-1-2-197.w82-124.abo.wanadoo.fr - - [08/Mar/2004:22:30:01 -0800] "GET /razor.jsp HTTP/1.1" 200 2869 +a213-84-36-192.adsl.xs4all.nl - - [08/Mar/2004:23:42:55 -0800] "GET / HTTP/1.1" 200 3169 +195.246.13.119 - - [09/Mar/2004:01:48:27 -0800] "GET /ops/SP/play//view/Main/WebHome HTTP/1.1" 200 10419 +195.246.13.119 - - [09/Mar/2004:01:48:28 -0800] "GET /go/bin/test/TWikiLogos/twikiRobot46x50.gif HTTP/1.1" 200 2877 +195.246.13.119 - - [09/Mar/2004:01:48:28 -0800] "GET /favicon.ico HTTP/1.1" 200 1078 +195.246.13.119 - - [09/Mar/2004:01:49:53 -0800] "GET /ops/SP/play//view/Main/SpamAssassinAndPostFix HTTP/1.1" 200 4034 +195.246.13.119 - - [09/Mar/2004:01:49:57 -0800] "GET /ops/SP/play//view/Main/KevinWGagel HTTP/1.1" 200 4901 +195.246.13.119 - - [09/Mar/2004:01:50:35 -0800] "GET /ops/SP/play//view/Main/SpamAssassinTaggingOnly HTTP/1.1" 200 5691 +195.246.13.119 - - [09/Mar/2004:01:50:54 -0800] "GET /ops/SP/play//view/Main/SpamAssassinDeleting HTTP/1.1" 200 5543 +195.246.13.119 - - [09/Mar/2004:01:51:17 -0800] "GET /ops/SP/play//view/Main/DCCAndPostFix HTTP/1.1" 200 5253 +195.246.13.119 - - [09/Mar/2004:01:51:41 -0800] "GET /ops/SP/play//edit/Main/RazorAndPostFix?topicparent=Main.WebHome HTTP/1.1" 401 12851 +195.246.13.119 - - [09/Mar/2004:01:51:45 -0800] "GET /go/bin/test/TWikiDocGraphics/help.gif HTTP/1.1" 200 130 +195.246.13.119 - - [09/Mar/2004:01:51:54 -0800] "GET /ops/SP/play//view/Main/RelayGateway HTTP/1.1" 200 4232 +195.246.13.119 - - [09/Mar/2004:01:52:12 -0800] "GET /ops/SP/play//view/Main/LinksOfUse HTTP/1.1" 200 4534 +200-55-104-193.dsl.prima.net.ar - - [09/Mar/2004:02:33:10 -0800] "GET /ststats/index.jsp HTTP/1.1" 200 2955 +200-55-104-193.dsl.prima.net.ar - - [09/Mar/2004:02:33:17 -0800] "GET /ststats/stats-spam.1day.png HTTP/1.1" 200 3068 +200-55-104-193.dsl.prima.net.ar - - [09/Mar/2004:02:33:17 -0800] "GET /ststats/stats-spam-ratio.1day.png HTTP/1.1" 200 2187 +200-55-104-193.dsl.prima.net.ar - - [09/Mar/2004:02:33:17 -0800] "GET /ststats/stats-spam.1week.png HTTP/1.1" 200 3277 +200-55-104-193.dsl.prima.net.ar - - [09/Mar/2004:02:33:17 -0800] "GET /ststats/stats-spam-ratio.1week.png HTTP/1.1" 200 2379 +200-55-104-193.dsl.prima.net.ar - - [09/Mar/2004:02:33:18 -0800] "GET /ststats/stats-hashes.1week.png HTTP/1.1" 200 1687 +200-55-104-193.dsl.prima.net.ar - - [09/Mar/2004:02:33:18 -0800] "GET /ststats/stats-spam.1month.png HTTP/1.1" 200 2592 +200-55-104-193.dsl.prima.net.ar - - [09/Mar/2004:02:33:18 -0800] "GET /ststats/stats-spam-ratio.1month.png HTTP/1.1" 200 1983 +200-55-104-193.dsl.prima.net.ar - - [09/Mar/2004:02:33:18 -0800] "GET /ststats/stats-hashes.1month.png HTTP/1.1" 200 1545 +200-55-104-193.dsl.prima.net.ar - - [09/Mar/2004:02:33:18 -0800] "GET /ststats/stats-spam.1year.png HTTP/1.1" 200 2222 +200-55-104-193.dsl.prima.net.ar - - [09/Mar/2004:02:33:18 -0800] "GET /ststats/stats-spam-ratio.1year.png HTTP/1.1" 200 1866 +200-55-104-193.dsl.prima.net.ar - - [09/Mar/2004:02:33:18 -0800] "GET /ststats/stats-hashes.1year.png HTTP/1.1" 200 1494 +200-55-104-193.dsl.prima.net.ar - - [09/Mar/2004:02:33:18 -0800] "GET /favicon.ico HTTP/1.1" 200 1078 +lj1052.passgo.com - - [09/Mar/2004:02:39:17 -0800] "GET /robots.txt HTTP/1.0" 200 68 +lj1162.passgo.com - - [09/Mar/2004:02:39:18 -0800] "GET /ops/SP/play//view/Main/SanJoseOffice HTTP/1.0" 200 3884 +lj1162.passgo.com - - [09/Mar/2004:03:10:39 -0800] "GET /ops/SP/play//view/Main/SanJoseOffice HTTP/1.0" 200 3884 +mail.geovariances.fr - - [09/Mar/2004:05:01:53 -0800] "GET /ops/SP/play//view/Main/WebHome HTTP/1.1" 200 10419 +mail.geovariances.fr - - [09/Mar/2004:05:01:53 -0800] "GET /go/bin/test/TWikiLogos/twikiRobot46x50.gif HTTP/1.1" 200 2877 +mail.geovariances.fr - - [09/Mar/2004:05:02:11 -0800] "GET /ops/SP/play//view/Main/SpamAssassin HTTP/1.1" 200 4081 +mail.geovariances.fr - - [09/Mar/2004:05:02:11 -0800] "GET /go/bin/test/TWikiLogos/twikiRobot46x50.gif HTTP/1.1" 304 - +mail.geovariances.fr - - [09/Mar/2004:05:02:14 -0800] "GET /ops/SP/play//view/Main/SpamAssassinAndPostFix HTTP/1.1" 200 4034 +mail.geovariances.fr - - [09/Mar/2004:05:02:14 -0800] "GET /go/bin/test/TWikiLogos/twikiRobot46x50.gif HTTP/1.1" 304 - +mail.geovariances.fr - - [09/Mar/2004:05:02:19 -0800] "GET /ops/SP/play//view/Main/SpamAssassinTaggingOnly HTTP/1.1" 200 5691 +mail.geovariances.fr - - [09/Mar/2004:05:02:19 -0800] "GET /go/bin/test/TWikiLogos/twikiRobot46x50.gif HTTP/1.1" 304 - +mail.geovariances.fr - - [09/Mar/2004:05:02:27 -0800] "GET /ops/SP/play//view/Main/SpamAssassinDeleting HTTP/1.1" 200 5543 +mail.geovariances.fr - - [09/Mar/2004:05:02:28 -0800] "GET /go/bin/test/TWikiLogos/twikiRobot46x50.gif HTTP/1.1" 304 - +mail.geovariances.fr - - [09/Mar/2004:05:04:09 -0800] "GET /ops/SP/play//view/Main/DCCAndPostFix HTTP/1.1" 200 5253 +mail.geovariances.fr - - [09/Mar/2004:05:04:09 -0800] "GET /go/bin/test/TWikiLogos/twikiRobot46x50.gif HTTP/1.1" 304 - +mail.geovariances.fr - - [09/Mar/2004:05:09:30 -0800] "GET /ops/SP/play//view/Main/SpamAssassinUsingRazorAndDCC HTTP/1.1" 200 7435 +mail.geovariances.fr - - [09/Mar/2004:05:09:31 -0800] "GET /go/bin/test/TWikiLogos/twikiRobot46x50.gif HTTP/1.1" 304 - +mail.geovariances.fr - - [09/Mar/2004:05:12:45 -0800] "GET /go/bin/test/TWikiLogos/twikiRobot46x50.gif HTTP/1.1" 304 - +mail.geovariances.fr - - [09/Mar/2004:05:12:45 -0800] "GET /ops/SP/play//view/Main/ConfigurationVariables HTTP/1.1" 200 58292 +mail.geovariances.fr - - [09/Mar/2004:05:13:40 -0800] "GET /ops/SP/play//view/TWiki/WebHome HTTP/1.1" 200 15182 +mail.geovariances.fr - - [09/Mar/2004:05:13:40 -0800] "GET /go/bin/test/TWikiLogos/twikiRobot46x50.gif HTTP/1.1" 304 - +mail.geovariances.fr - - [09/Mar/2004:05:13:40 -0800] "GET /go/bin/test/TWikiLogos/twikiRobot131x64.gif HTTP/1.1" 200 7218 +mail.geovariances.fr - - [09/Mar/2004:05:13:40 -0800] "GET /go/bin/test/TWikiDocGraphics/tip.gif HTTP/1.1" 200 123 +mail.geovariances.fr - - [09/Mar/2004:05:13:40 -0800] "GET /go/bin/test/TWikiLogos/twikiRobot88x31.gif HTTP/1.1" 200 3501 +mail.geovariances.fr - - [09/Mar/2004:05:14:13 -0800] "GET /ops/SP/play//view/Sandbox/WebHome HTTP/1.1" 200 8632 +mail.geovariances.fr - - [09/Mar/2004:05:14:14 -0800] "GET /go/bin/test/TWikiLogos/twikiRobot46x50.gif HTTP/1.1" 304 - +66-194-6-70.gen.twtelecom.net - - [09/Mar/2004:05:20:20 -0800] "GET / HTTP/1.1" 200 3169 +195.230.181.122 - - [09/Mar/2004:06:29:03 -0800] "GET /AmavisNew.jsp HTTP/1.0" 200 2300 +ts04-ip92.hevanet.com - - [09/Mar/2004:06:33:21 -0800] "GET / HTTP/1.1" 200 3169 +ts04-ip92.hevanet.com - - [09/Mar/2004:06:34:51 -0800] "GET /ststats/index.jsp HTTP/1.1" 200 2955 +ts04-ip92.hevanet.com - - [09/Mar/2004:06:34:53 -0800] "GET /ststats/stats-spam.1day.png HTTP/1.1" 200 3027 +ts04-ip92.hevanet.com - - [09/Mar/2004:06:34:53 -0800] "GET /ststats/stats-spam-ratio.1day.png HTTP/1.1" 200 2148 +ts04-ip92.hevanet.com - - [09/Mar/2004:06:34:54 -0800] "GET /ststats/stats-spam.1week.png HTTP/1.1" 200 3200 +ts04-ip92.hevanet.com - - [09/Mar/2004:06:34:54 -0800] "GET /ststats/stats-spam-ratio.1week.png HTTP/1.1" 200 2341 +ts04-ip92.hevanet.com - - [09/Mar/2004:06:34:55 -0800] "GET /ststats/stats-hashes.1week.png HTTP/1.1" 200 1686 +ts04-ip92.hevanet.com - - [09/Mar/2004:06:34:55 -0800] "GET /ststats/stats-spam.1month.png HTTP/1.1" 200 2534 +ts04-ip92.hevanet.com - - [09/Mar/2004:06:34:56 -0800] "GET /ststats/stats-spam-ratio.1month.png HTTP/1.1" 200 1948 +ts04-ip92.hevanet.com - - [09/Mar/2004:06:34:56 -0800] "GET /ststats/stats-hashes.1month.png HTTP/1.1" 200 1549 +ts04-ip92.hevanet.com - - [09/Mar/2004:06:34:57 -0800] "GET /ststats/stats-spam.1year.png HTTP/1.1" 200 2214 +ts04-ip92.hevanet.com - - [09/Mar/2004:06:34:57 -0800] "GET /ststats/stats-spam-ratio.1year.png HTTP/1.1" 200 1873 +ts04-ip92.hevanet.com - - [09/Mar/2004:06:34:58 -0800] "GET /ststats/stats-hashes.1year.png HTTP/1.1" 200 1500 +ts04-ip92.hevanet.com - - [09/Mar/2004:06:35:04 -0800] "GET /forplus/mailgraph2.cgi HTTP/1.1" 200 2987 +ts04-ip92.hevanet.com - - [09/Mar/2004:06:35:06 -0800] "GET /forplus/mailgraph.cgi/mailgraph_0_err.png HTTP/1.1" 200 6708 +ts04-ip92.hevanet.com - - [09/Mar/2004:06:35:06 -0800] "GET /forplus/mailgraph.cgi/mailgraph_0.png HTTP/1.1" 200 8232 +ts04-ip92.hevanet.com - - [09/Mar/2004:06:35:09 -0800] "GET /forplus/mailgraph.cgi/mailgraph_1.png HTTP/1.1" 200 8857 +ts04-ip92.hevanet.com - - [09/Mar/2004:06:35:10 -0800] "GET /forplus/mailgraph.cgi/mailgraph_1_err.png HTTP/1.1" 200 7175 +ts04-ip92.hevanet.com - - [09/Mar/2004:06:35:13 -0800] "GET /forplus/mailgraph.cgi/mailgraph_2.png HTTP/1.1" 200 9391 +ts04-ip92.hevanet.com - - [09/Mar/2004:06:35:13 -0800] "GET /forplus/mailgraph.cgi/mailgraph_2_err.png HTTP/1.1" 200 6922 +ts04-ip92.hevanet.com - - [09/Mar/2004:06:35:17 -0800] "GET /forplus/mailgraph.cgi/mailgraph_3.png HTTP/1.1" 200 6618 +ts04-ip92.hevanet.com - - [09/Mar/2004:06:35:17 -0800] "GET /forplus/mailgraph.cgi/mailgraph_3_err.png HTTP/1.1" 200 5615 +ts04-ip92.hevanet.com - - [09/Mar/2004:06:35:42 -0800] "GET /razor.jsp HTTP/1.1" 200 2869 +ts04-ip92.hevanet.com - - [09/Mar/2004:06:36:28 -0800] "GET /ops/SP/play//view/Main/WebHome HTTP/1.1" 200 10419 +ts04-ip92.hevanet.com - - [09/Mar/2004:06:36:29 -0800] "GET /go/bin/test/TWikiLogos/twikiRobot46x50.gif HTTP/1.1" 200 2877 +ts04-ip92.hevanet.com - - [09/Mar/2004:06:36:51 -0800] "GET /ops/SP/play//view/Main/SpamAssassinAndPostFix HTTP/1.1" 200 4034 +ts04-ip92.hevanet.com - - [09/Mar/2004:06:37:00 -0800] "GET /ops/SP/play//view/Main/SpamAssassinTaggingOnly HTTP/1.1" 200 5691 +ts04-ip92.hevanet.com - - [09/Mar/2004:06:37:40 -0800] "GET /ops/SP/play//view/Main/SpamAssassinDeleting HTTP/1.1" 200 5543 +208-38-57-205.ip.cal.radiant.net - - [09/Mar/2004:07:27:10 -0800] "GET / HTTP/1.1" 200 3169 +208-38-57-205.ip.cal.radiant.net - - [09/Mar/2004:07:27:10 -0800] "GET /favicon.ico HTTP/1.1" 200 1078 +208-38-57-205.ip.cal.radiant.net - - [09/Mar/2004:07:27:44 -0800] "GET /ops/SP/play//view/Main/WebHome HTTP/1.1" 200 10419 +208-38-57-205.ip.cal.radiant.net - - [09/Mar/2004:07:27:44 -0800] "GET /go/bin/test/TWikiLogos/twikiRobot46x50.gif HTTP/1.1" 200 2877 +208-38-57-205.ip.cal.radiant.net - - [09/Mar/2004:07:27:44 -0800] "GET /favicon.ico HTTP/1.1" 200 1078 +208-38-57-205.ip.cal.radiant.net - - [09/Mar/2004:07:27:59 -0800] "GET /ops/SP/play//view/Main/SpamAssassinAndPostFix HTTP/1.1" 200 4034 +208-38-57-205.ip.cal.radiant.net - - [09/Mar/2004:07:28:05 -0800] "GET /ops/SP/play//view/Main/SpamAssassinTaggingOnly HTTP/1.1" 200 5691 +208-38-57-205.ip.cal.radiant.net - - [09/Mar/2004:07:28:12 -0800] "GET /ops/SP/play//view/Main/SpamAssassinDeleting HTTP/1.1" 200 5543 +207.195.59.160 - - [09/Mar/2004:08:08:35 -0800] "GET / HTTP/1.1" 200 3169 +207.195.59.160 - - [09/Mar/2004:08:08:37 -0800] "GET /ops/SP/play//view/Main/WebHome HTTP/1.1" 200 10419 +207.195.59.160 - - [09/Mar/2004:08:08:38 -0800] "GET /go/bin/test/TWikiLogos/twikiRobot46x50.gif HTTP/1.1" 200 2877 +207.195.59.160 - - [09/Mar/2004:08:08:54 -0800] "GET /ops/SP/play//view/Main/SpamAssassinAndPostFix HTTP/1.1" 200 4034 +207.195.59.160 - - [09/Mar/2004:08:08:54 -0800] "GET /go/bin/test/TWikiLogos/twikiRobot46x50.gif HTTP/1.1" 304 - +207.195.59.160 - - [09/Mar/2004:08:08:57 -0800] "GET /ops/SP/play//view/Main/SpamAssassinTaggingOnly HTTP/1.1" 200 5691 +207.195.59.160 - - [09/Mar/2004:08:09:39 -0800] "GET /ops/SP/play//view/Main/RBLsHowTo HTTP/1.1" 200 4665 +207.195.59.160 - - [09/Mar/2004:08:09:39 -0800] "GET /go/bin/test/TWikiLogos/twikiRobot46x50.gif HTTP/1.1" 304 - +207.195.59.160 - - [09/Mar/2004:08:09:58 -0800] "GET /ops/SP/play//view/Main/PostfixCommands HTTP/1.1" 200 4016 +207.195.59.160 - - [09/Mar/2004:08:09:58 -0800] "GET /go/bin/test/TWikiLogos/twikiRobot46x50.gif HTTP/1.1" 304 - +207.195.59.160 - - [09/Mar/2004:08:10:04 -0800] "GET /ops/SP/play//edit/Main/PostConf?topicparent=Main.PostfixCommands HTTP/1.1" 401 12851 +207.195.59.160 - - [09/Mar/2004:08:10:06 -0800] "GET /go/bin/test/TWikiDocGraphics/help.gif HTTP/1.1" 200 130 +207.195.59.160 - - [09/Mar/2004:08:10:12 -0800] "GET /ops/SP/play//view/Main/RelayGateway HTTP/1.1" 200 4232 +207.195.59.160 - - [09/Mar/2004:08:10:12 -0800] "GET /go/bin/test/TWikiLogos/twikiRobot46x50.gif HTTP/1.1" 304 - +207.195.59.160 - - [09/Mar/2004:08:10:20 -0800] "GET /ops/SP/play//view/Main/Relay_Domains HTTP/1.1" 200 4583 +fw1.millardref.com - - [09/Mar/2004:08:17:27 -0800] "GET / HTTP/1.1" 200 3169 +207.195.59.160 - - [09/Mar/2004:08:17:34 -0800] "GET /ops/SP/play//view/Main/VerifingGatway HTTP/1.1" 200 4750 +fw1.millardref.com - - [09/Mar/2004:08:17:50 -0800] "GET /RBL.jsp HTTP/1.1" 200 4114 +207.195.59.160 - - [09/Mar/2004:08:18:17 -0800] "GET /ops/SP/play//view/Main/SideBar HTTP/1.1" 200 3972 +207.195.59.160 - - [09/Mar/2004:08:18:17 -0800] "GET /go/bin/test/TWikiLogos/twikiRobot46x50.gif HTTP/1.1" 304 - +fw1.millardref.com - - [09/Mar/2004:08:18:19 -0800] "GET /favicon.ico HTTP/1.1" 200 1078 +fw1.millardref.com - - [09/Mar/2004:08:18:25 -0800] "GET /ie.htm HTTP/1.1" 200 3518 +fw1.millardref.com - - [09/Mar/2004:08:18:26 -0800] "GET /images/image004.jpg HTTP/1.1" 200 10936 +fw1.millardref.com - - [09/Mar/2004:08:18:27 -0800] "GET /images/image005.jpg HTTP/1.1" 200 21125 +fw1.millardref.com - - [09/Mar/2004:08:18:27 -0800] "GET /images/msgops.JPG HTTP/1.1" 200 7939 +207.195.59.160 - - [09/Mar/2004:08:18:50 -0800] "GET /ops/SP/play//view/Main/WebHome HTTP/1.1" 200 10419 +207.195.59.160 - - [09/Mar/2004:08:19:04 -0800] "GET /ops/SP/play//view/Main/DCCAndPostFix HTTP/1.1" 200 5253 +lj1007.passgo.com - - [09/Mar/2004:09:55:44 -0800] "GET /robots.txt HTTP/1.0" 200 68 +lj1125.passgo.com - - [09/Mar/2004:09:55:53 -0800] "GET /ops/SP/play//oops/TWiki/WebChangesAlert HTTP/1.0" 200 209 +80.58.35.111.proxycache.rima-tde.net - - [09/Mar/2004:10:08:07 -0800] "GET /RBL.jsp HTTP/1.0" 200 4114 +10.0.0.176 - - [09/Mar/2004:10:29:38 -0800] "GET / HTTP/1.1" 304 - +10.0.0.176 - - [09/Mar/2004:10:29:40 -0800] "GET /forplus/mailgraph2.cgi HTTP/1.1" 200 2987 +10.0.0.176 - - [09/Mar/2004:10:29:41 -0800] "GET /forplus/mailgraph.cgi/mailgraph_1.png HTTP/1.1" 200 8830 +10.0.0.176 - - [09/Mar/2004:10:29:41 -0800] "GET /forplus/mailgraph.cgi/mailgraph_0.png HTTP/1.1" 200 7255 +10.0.0.176 - - [09/Mar/2004:10:29:41 -0800] "GET /forplus/mailgraph.cgi/mailgraph_0_err.png HTTP/1.1" 200 6703 +10.0.0.176 - - [09/Mar/2004:10:29:41 -0800] "GET /forplus/mailgraph.cgi/mailgraph_1_err.png HTTP/1.1" 200 7127 +10.0.0.176 - - [09/Mar/2004:10:29:41 -0800] "GET /forplus/mailgraph.cgi/mailgraph_2.png HTTP/1.1" 200 9241 +10.0.0.176 - - [09/Mar/2004:10:29:41 -0800] "GET /forplus/mailgraph.cgi/mailgraph_2_err.png HTTP/1.1" 200 6856 +10.0.0.176 - - [09/Mar/2004:10:29:41 -0800] "GET /forplus/mailgraph.cgi/mailgraph_3.png HTTP/1.1" 200 6618 +10.0.0.176 - - [09/Mar/2004:10:29:41 -0800] "GET /forplus/mailgraph.cgi/mailgraph_3_err.png HTTP/1.1" 200 5615 +200.222.33.33 - - [09/Mar/2004:11:21:36 -0800] "GET /AmavisNew.jsp HTTP/1.1" 200 2300 +1-320.tnr.on.ca - - [09/Mar/2004:11:43:54 -0800] "GET /ie.htm HTTP/1.1" 200 3518 +1-320.tnr.on.ca - - [09/Mar/2004:11:43:56 -0800] "GET /images/image005.jpg HTTP/1.1" 200 21125 +1-320.tnr.on.ca - - [09/Mar/2004:11:43:56 -0800] "GET /images/msgops.JPG HTTP/1.1" 200 7939 +1-320.tnr.on.ca - - [09/Mar/2004:11:43:56 -0800] "GET /images/image004.jpg HTTP/1.1" 200 10936 +l07v-1-17.d1.club-internet.fr - - [09/Mar/2004:11:57:20 -0800] "GET / HTTP/1.1" 200 3169 +wwwcache.lanl.gov - - [09/Mar/2004:12:16:06 -0800] "GET /razor.jsp HTTP/1.1" 200 2869 +trrc02m01-40.bctel.ca - - [09/Mar/2004:12:21:08 -0800] "GET /mailman/listinfo/ppwc HTTP/1.1" 200 6271 +trrc02m01-40.bctel.ca - - [09/Mar/2004:12:21:09 -0800] "GET /icons/mailman.jpg HTTP/1.1" 200 2022 +trrc02m01-40.bctel.ca - - [09/Mar/2004:12:21:09 -0800] "GET /icons/PythonPowered.png HTTP/1.1" 200 945 +trrc02m01-40.bctel.ca - - [09/Mar/2004:12:21:10 -0800] "GET /icons/gnu-head-tiny.jpg HTTP/1.1" 200 3049 +fw.kcm.org - - [09/Mar/2004:12:21:49 -0800] "GET /ops/SP/play//view/Main/SpamAssassinTaggingOnly HTTP/1.1" 200 5691 +fw.kcm.org - - [09/Mar/2004:12:21:49 -0800] "GET /go/bin/test/TWikiLogos/twikiRobot46x50.gif HTTP/1.1" 200 2877 +lj1048.passgo.com - - [09/Mar/2004:12:52:21 -0800] "GET /robots.txt HTTP/1.0" 200 68 +lj1031.passgo.com - - [09/Mar/2004:12:52:58 -0800] "GET /ops/SP/play//oops/TWiki/InterwikiPlugin HTTP/1.0" 200 209 +c-24-20-163-223.client.comcast.net - - [09/Mar/2004:13:14:53 -0800] "GET / HTTP/1.1" 200 3169 +c-24-20-163-223.client.comcast.net - - [09/Mar/2004:13:15:15 -0800] "GET /ops/SP/play//view/Main/WebHome HTTP/1.1" 200 10419 +c-24-20-163-223.client.comcast.net - - [09/Mar/2004:13:15:15 -0800] "GET /go/bin/test/TWikiLogos/twikiRobot46x50.gif HTTP/1.1" 200 2877 +c-24-20-163-223.client.comcast.net - - [09/Mar/2004:13:15:23 -0800] "GET /ops/SP/play//view/Main/SpamAssassin HTTP/1.1" 200 4081 +c-24-20-163-223.client.comcast.net - - [09/Mar/2004:13:15:33 -0800] "GET /ops/SP/play//view/Main/SpamAssassinAndPostFix HTTP/1.1" 200 4034 +c-24-20-163-223.client.comcast.net - - [09/Mar/2004:13:15:49 -0800] "GET /ops/SP/play//view/Main/SpamAssassinTaggingOnly HTTP/1.1" 200 5691 +c-24-20-163-223.client.comcast.net - - [09/Mar/2004:13:16:00 -0800] "GET /ops/SP/play//view/Main/DCCAndPostFix HTTP/1.1" 200 5253 +h194n2fls308o1033.telia.com - - [09/Mar/2004:13:49:05 -0800] "-" 408 - +h24-71-236-129.ca.clawio.org - - [09/Mar/2004:14:43:02 -0800] "GET /mailman HTTP/1.1" 302 301 +h24-71-236-129.ca.clawio.org - - [09/Mar/2004:14:43:03 -0800] "GET /mailman/listinfo HTTP/1.1" 200 6893 +h24-71-236-129.ca.clawio.org - - [09/Mar/2004:14:43:04 -0800] "GET /icons/mailman.jpg HTTP/1.1" 304 - +h24-71-236-129.ca.clawio.org - - [09/Mar/2004:14:43:05 -0800] "GET /icons/PythonPowered.png HTTP/1.1" 304 - +h24-71-236-129.ca.clawio.org - - [09/Mar/2004:14:43:05 -0800] "GET /icons/gnu-head-tiny.jpg HTTP/1.1" 304 - +h24-71-236-129.ca.clawio.org - - [09/Mar/2004:14:43:12 -0800] "GET /mailman/listinfo/ppwc HTTP/1.1" 200 6271 +jacksonproject.tnr.on.ca - - [09/Mar/2004:14:50:15 -0800] "GET / HTTP/1.1" 200 3169 +jacksonproject.tnr.on.ca - - [09/Mar/2004:14:50:23 -0800] "GET /mailman HTTP/1.1" 302 301 +jacksonproject.tnr.on.ca - - [09/Mar/2004:14:50:23 -0800] "GET /mailman/listinfo HTTP/1.1" 200 6893 +jacksonproject.tnr.on.ca - - [09/Mar/2004:14:50:24 -0800] "GET /icons/mailman.jpg HTTP/1.1" 200 2022 +jacksonproject.tnr.on.ca - - [09/Mar/2004:14:50:24 -0800] "GET /icons/gnu-head-tiny.jpg HTTP/1.1" 200 3049 +jacksonproject.tnr.on.ca - - [09/Mar/2004:14:50:24 -0800] "GET /icons/PythonPowered.png HTTP/1.1" 200 945 +jacksonproject.tnr.on.ca - - [09/Mar/2004:14:50:28 -0800] "GET /mailman/listinfo/ppwc HTTP/1.1" 200 6271 +jacksonproject.tnr.on.ca - - [09/Mar/2004:14:56:15 -0800] "GET / HTTP/1.1" 304 - +home.yeungs.net - - [09/Mar/2004:15:03:55 -0800] "GET /AmavisNew.jsp HTTP/1.1" 200 2300 +203.147.138.233 - - [09/Mar/2004:15:25:03 -0800] "GET /ststats/index.jsp HTTP/1.1" 200 2955 +203.147.138.233 - - [09/Mar/2004:15:25:05 -0800] "GET /favicon.ico HTTP/1.1" 200 1078 +203.147.138.233 - - [09/Mar/2004:15:25:14 -0800] "GET /ststats/stats-spam.1day.png HTTP/1.1" 200 3041 +203.147.138.233 - - [09/Mar/2004:15:25:15 -0800] "GET /ststats/stats-hashes.1week.png HTTP/1.1" 200 1695 +203.147.138.233 - - [09/Mar/2004:15:25:15 -0800] "GET /ststats/stats-spam.1month.png HTTP/1.1" 200 2577 +203.147.138.233 - - [09/Mar/2004:15:25:15 -0800] "GET /ststats/stats-spam.1week.png HTTP/1.1" 200 3203 +203.147.138.233 - - [09/Mar/2004:15:25:15 -0800] "GET /ststats/stats-spam-ratio.1month.png HTTP/1.1" 200 1970 +203.147.138.233 - - [09/Mar/2004:15:25:15 -0800] "GET /ststats/stats-spam-ratio.1day.png HTTP/1.1" 200 2181 +203.147.138.233 - - [09/Mar/2004:15:25:15 -0800] "GET /ststats/stats-hashes.1month.png HTTP/1.1" 200 1550 +203.147.138.233 - - [09/Mar/2004:15:25:15 -0800] "GET /ststats/stats-spam-ratio.1week.png HTTP/1.1" 200 2314 +203.147.138.233 - - [09/Mar/2004:15:25:15 -0800] "GET /ststats/stats-spam-ratio.1year.png HTTP/1.1" 200 1850 +203.147.138.233 - - [09/Mar/2004:15:25:15 -0800] "GET /ststats/stats-spam.1year.png HTTP/1.1" 200 2213 +203.147.138.233 - - [09/Mar/2004:15:25:15 -0800] "GET /ststats/stats-hashes.1year.png HTTP/1.1" 200 1509 +h24-71-236-129.ca.clawio.org - - [09/Mar/2004:15:37:35 -0800] "GET /mailman/listinfo/ppwc HTTP/1.1" 200 6271 +h24-71-236-129.ca.clawio.org - - [09/Mar/2004:15:37:36 -0800] "GET /icons/mailman.jpg HTTP/1.1" 304 - +h24-71-236-129.ca.clawio.org - - [09/Mar/2004:15:37:36 -0800] "GET /icons/PythonPowered.png HTTP/1.1" 304 - +h24-71-236-129.ca.clawio.org - - [09/Mar/2004:15:37:36 -0800] "GET /icons/gnu-head-tiny.jpg HTTP/1.1" 304 - +208-38-57-205.ip.cal.radiant.net - - [09/Mar/2004:15:44:52 -0800] "GET / HTTP/1.1" 200 3169 +208-38-57-205.ip.cal.radiant.net - - [09/Mar/2004:15:44:52 -0800] "GET /favicon.ico HTTP/1.1" 200 1078 +208-38-57-205.ip.cal.radiant.net - - [09/Mar/2004:15:44:57 -0800] "GET /rejected.jsp HTTP/1.1" 200 3998 +h24-71-236-129.ca.clawio.org - - [09/Mar/2004:15:51:10 -0800] "GET /mailman/admin/ppwc HTTP/1.1" 200 2082 +h24-71-236-129.ca.clawio.org - - [09/Mar/2004:15:51:24 -0800] "POST /mailman/admin/ppwc HTTP/1.1" 200 2182 +h24-71-236-129.ca.clawio.org - - [09/Mar/2004:15:52:09 -0800] "POST /mailman/admin/ppwc HTTP/1.1" 200 2182 +h24-71-236-129.ca.clawio.org - - [09/Mar/2004:15:52:15 -0800] "POST /mailman/admin/ppwc HTTP/1.1" 200 19597 +h24-71-236-129.ca.clawio.org - - [09/Mar/2004:15:53:40 -0800] "GET /mailman/admin/ppwc/logout HTTP/1.1" 200 2103 +h24-71-236-129.ca.clawio.org - - [09/Mar/2004:15:53:49 -0800] "GET /mailman/listinfo HTTP/1.1" 200 6893 +h24-71-236-129.ca.clawio.org - - [09/Mar/2004:15:53:56 -0800] "GET /mailman/listinfo/ppwc HTTP/1.1" 200 6271 +lj1123.passgo.com - - [09/Mar/2004:16:23:55 -0800] "GET /ops/SP/play//oops/TWiki/RegularExp HTTP/1.0" 200 209 +206-15-133-153.dialup.ziplink.net - - [09/Mar/2004:16:27:48 -0800] "HEAD /ops/SP/play//view/Main/SpamAssassinDeleting HTTP/1.1" 200 0 +lj1048.passgo.com - - [09/Mar/2004:17:10:26 -0800] "GET /robots.txt HTTP/1.0" 200 68 +lj1061.passgo.com - - [09/Mar/2004:17:10:28 -0800] "GET /ops/SP/play//oops/TWiki/TablePlugin HTTP/1.0" 200 209 +korell2.cc.gatech.edu - - [09/Mar/2004:17:33:58 -0800] "GET /razor.jsp HTTP/1.0" 200 2869 +65-37-13-251.nrp2.roc.ny.frontiernet.net - - [09/Mar/2004:17:42:41 -0800] "GET /ops/SP/play//view/Main/WebHome HTTP/1.1" 200 10419 +65-37-13-251.nrp2.roc.ny.frontiernet.net - - [09/Mar/2004:17:42:42 -0800] "GET /favicon.ico HTTP/1.1" 200 1078 +65-37-13-251.nrp2.roc.ny.frontiernet.net - - [09/Mar/2004:17:42:42 -0800] "GET /go/bin/test/TWikiLogos/twikiRobot46x50.gif HTTP/1.1" 200 2877 +65-37-13-251.nrp2.roc.ny.frontiernet.net - - [09/Mar/2004:17:43:54 -0800] "GET /ops/SP/play//view/Main/RBLsHowTo HTTP/1.1" 200 4665 +65-37-13-251.nrp2.roc.ny.frontiernet.net - - [09/Mar/2004:17:45:02 -0800] "GET /ops/SP/play//view/Sandbox/WebHome HTTP/1.1" 200 8632 +cpe-203-51-137-224.vic.bigpond.net.au - - [09/Mar/2004:18:00:43 -0800] "GET /mailman/admin HTTP/1.1" 200 6872 +cpe-203-51-137-224.vic.bigpond.net.au - - [09/Mar/2004:18:00:44 -0800] "GET /icons/mailman.jpg HTTP/1.1" 200 2022 +cpe-203-51-137-224.vic.bigpond.net.au - - [09/Mar/2004:18:00:44 -0800] "GET /icons/PythonPowered.png HTTP/1.1" 200 945 +cpe-203-51-137-224.vic.bigpond.net.au - - [09/Mar/2004:18:00:44 -0800] "GET /icons/gnu-head-tiny.jpg HTTP/1.1" 200 3049 +cpe-203-51-137-224.vic.bigpond.net.au - - [09/Mar/2004:18:01:11 -0800] "GET /mailman/admin/webct HTTP/1.1" 200 2080 +cpe-203-51-137-224.vic.bigpond.net.au - - [09/Mar/2004:18:01:24 -0800] "GET /mailman HTTP/1.1" 302 301 +cpe-203-51-137-224.vic.bigpond.net.au - - [09/Mar/2004:18:01:25 -0800] "GET /mailman/listinfo HTTP/1.1" 200 6893 +cpe-203-51-137-224.vic.bigpond.net.au - - [09/Mar/2004:18:01:28 -0800] "GET /mailman/listinfo/administration HTTP/1.1" 200 6459 +cpe-203-51-137-224.vic.bigpond.net.au - - [09/Mar/2004:18:01:45 -0800] "GET /mailman/listinfo/cnc_notice HTTP/1.1" 200 6337 +cpe-203-51-137-224.vic.bigpond.net.au - - [09/Mar/2004:18:02:07 -0800] "GET /mailman/listinfo HTTP/1.1" 200 6893 +grandpa.mmlc.northwestern.edu - - [09/Mar/2004:18:06:27 -0800] "GET /razor.jsp HTTP/1.1" 200 2869 +grandpa.mmlc.northwestern.edu - - [09/Mar/2004:18:06:27 -0800] "GET /favicon.ico HTTP/1.1" 200 1078 +mth-fgw.ballarat.edu.au - - [09/Mar/2004:20:23:32 -0800] "GET /ops/SP/play//view/Main/SpamAssassinTaggingOnly HTTP/1.1" 200 5691 +mth-fgw.ballarat.edu.au - - [09/Mar/2004:20:23:32 -0800] "GET /go/bin/test/TWikiLogos/twikiRobot46x50.gif HTTP/1.1" 200 2877 +mth-fgw.ballarat.edu.au - - [09/Mar/2004:20:25:15 -0800] "GET /ops/SP/play//view/Main/SpamAssassinAndPostFix HTTP/1.1" 200 4034 +mth-fgw.ballarat.edu.au - - [09/Mar/2004:20:25:18 -0800] "GET /ops/SP/play//view/Main/SpamAssassinDeleting HTTP/1.1" 200 5543 +calcite.rhyolite.com - - [09/Mar/2004:20:34:55 -0800] "GET /clients.jsp HTTP/1.1" 200 18892 +mth-fgw.ballarat.edu.au - - [09/Mar/2004:20:45:43 -0800] "GET /ops/SP/play//view/Main/WebHome HTTP/1.1" 200 10419 +mth-fgw.ballarat.edu.au - - [09/Mar/2004:20:45:48 -0800] "GET /ops/SP/play//view/Main/SpamAssassinAndPostFix HTTP/1.1" 200 4034 +mth-fgw.ballarat.edu.au - - [09/Mar/2004:20:45:51 -0800] "GET /ops/SP/play//view/Main/SpamAssassinDeleting HTTP/1.1" 200 5543 +2-238.tnr.on.ca - - [09/Mar/2004:21:33:22 -0800] "GET / HTTP/1.1" 200 3169 +lj1048.passgo.com - - [09/Mar/2004:21:51:09 -0800] "GET /robots.txt HTTP/1.0" 200 68 +lj1153.passgo.com - - [09/Mar/2004:21:51:16 -0800] "GET /ops/SP/play//oops/Main/ThanadonSomdee HTTP/1.0" 200 209 +mmscrm07-2.uah.goweb.net - - [09/Mar/2004:22:23:39 -0800] "GET /robots.txt HTTP/1.0" 200 68 +lj1036.passgo.com - - [09/Mar/2004:22:31:21 -0800] "GET /ops/SP/play//oops/Know/TopicClassification HTTP/1.0" 200 209 +adsl-157-26-153.msy.bellsouth.net - - [09/Mar/2004:22:40:32 -0800] "GET /ops/SP/play//view/Main/SpamAssassinTaggingOnly HTTP/1.1" 200 5691 +adsl-157-26-153.msy.bellsouth.net - - [09/Mar/2004:22:40:33 -0800] "GET /go/bin/test/TWikiLogos/twikiRobot46x50.gif HTTP/1.1" 200 2877 +lj1164.passgo.com - - [09/Mar/2004:22:44:31 -0800] "GET /ops/SP/play//oops/TWiki/TextFormattingRules HTTP/1.0" 200 209 +66-194-6-79.gen.twtelecom.net - - [09/Mar/2004:23:36:11 -0800] "GET / HTTP/1.1" 200 3169 +lj1231.passgo.com - - [10/Mar/2004:00:21:51 -0800] "GET /ops/SP/play//oops/Main/TWikiUsers HTTP/1.0" 200 209 +212.21.228.26 - - [10/Mar/2004:00:24:58 -0800] "GET /razor.jsp HTTP/1.0" 200 2869 +yongsan-cache.korea.army.mil - - [10/Mar/2004:00:29:44 -0800] "GET /mailman/listinfo/cncce HTTP/1.1" 200 6208 +yongsan-cache.korea.army.mil - - [10/Mar/2004:00:29:44 -0800] "GET /icons/mailman.jpg HTTP/1.1" 200 2022 +yongsan-cache.korea.army.mil - - [10/Mar/2004:00:29:44 -0800] "GET /icons/PythonPowered.png HTTP/1.1" 200 945 +yongsan-cache.korea.army.mil - - [10/Mar/2004:00:29:45 -0800] "GET /icons/gnu-head-tiny.jpg HTTP/1.1" 200 3049 +pd9e761cf.dip.t-dialin.net - - [10/Mar/2004:02:07:27 -0800] "GET /AmavisNew.jsp HTTP/1.1" 200 2300 +lj1048.passgo.com - - [10/Mar/2004:02:31:33 -0800] "GET /robots.txt HTTP/1.0" 200 68 +lj1160.passgo.com - - [10/Mar/2004:02:31:44 -0800] "GET /razor.jsp HTTP/1.0" 304 - +nb-bolz.cremona.polimi.it - - [10/Mar/2004:02:52:49 -0800] "GET /AmavisNew.jsp HTTP/1.1" 200 2300 +pc-030-040.eco.rug.nl - - [10/Mar/2004:02:55:00 -0800] "GET /SpamAssassin.jsp HTTP/1.1" 200 7368 +pc3-registry-stockholm.telia.net - - [10/Mar/2004:03:11:40 -0800] "GET /ops/SP/play//view/Main/WebHome HTTP/1.1" 200 10419 +pc3-registry-stockholm.telia.net - - [10/Mar/2004:03:11:50 -0800] "GET /ops/SP/play//view/Main/SpamAssassinAndPostFix HTTP/1.1" 200 4034 +pc3-registry-stockholm.telia.net - - [10/Mar/2004:03:11:53 -0800] "GET /ops/SP/play//view/Main/SpamAssassinTaggingOnly HTTP/1.1" 200 5691 +pc3-registry-stockholm.telia.net - - [10/Mar/2004:03:12:07 -0800] "GET /ops/SP/play//view/Main/SpamAssassinDeleting HTTP/1.1" 200 5543 +pc3-registry-stockholm.telia.net - - [10/Mar/2004:03:12:20 -0800] "GET /ops/SP/play//view/Main/ConfigurationVariables HTTP/1.1" 200 58292 +pc3-registry-stockholm.telia.net - - [10/Mar/2004:03:12:33 -0800] "GET /ops/SP/play//view/Main/RBLsHowTo HTTP/1.1" 200 4665 +pc3-registry-stockholm.telia.net - - [10/Mar/2004:03:12:45 -0800] "GET /ops/SP/play//view/Main/PostfixCommands HTTP/1.1" 200 4016 +pc3-registry-stockholm.telia.net - - [10/Mar/2004:03:12:48 -0800] "GET /ops/SP/play//view/Main/PostSuper HTTP/1.1" 200 3629 +pc3-registry-stockholm.telia.net - - [10/Mar/2004:03:12:56 -0800] "GET /ops/SP/play//view/Main/LinksOfUse HTTP/1.1" 200 4534 +pc3-registry-stockholm.telia.net - - [10/Mar/2004:03:14:40 -0800] "GET /ops/SP/play//view/Main/DCCAndPostFix HTTP/1.1" 200 5253 +pc3-registry-stockholm.telia.net - - [10/Mar/2004:03:14:54 -0800] "GET /ops/SP/play//view/Main/SpamAssassinUsingRazorAndDCC HTTP/1.1" 200 7435 +pc3-registry-stockholm.telia.net - - [10/Mar/2004:03:15:28 -0800] "GET /ops/SP/play//view/Main/SideBar HTTP/1.1" 200 3972 +pc3-registry-stockholm.telia.net - - [10/Mar/2004:03:15:33 -0800] "GET /ops/SP/play//view/Main/DCCGraphs HTTP/1.1" 200 5402 +80.58.14.235.proxycache.rima-tde.net - - [10/Mar/2004:03:52:49 -0800] "GET /mailman/listinfo/fnac HTTP/1.0" 200 5969 +80.58.14.235.proxycache.rima-tde.net - - [10/Mar/2004:03:52:51 -0800] "GET /icons/PythonPowered.png HTTP/1.1" 200 945 +80.58.14.235.proxycache.rima-tde.net - - [10/Mar/2004:03:52:51 -0800] "GET /icons/mailman.jpg HTTP/1.1" 200 2022 +80.58.14.235.proxycache.rima-tde.net - - [10/Mar/2004:03:52:52 -0800] "GET /icons/gnu-head-tiny.jpg HTTP/1.1" 200 3049 +66-194-6-70.gen.twtelecom.net - - [10/Mar/2004:05:21:38 -0800] "GET / HTTP/1.1" 200 3169 +pd9e50809.dip.t-dialin.net - - [10/Mar/2004:07:36:56 -0800] "GET /razor.jsp HTTP/1.0" 200 2869 +10.0.0.176 - - [10/Mar/2004:08:36:28 -0800] "GET / HTTP/1.1" 304 - +10.0.0.176 - - [10/Mar/2004:08:36:30 -0800] "GET /forplus/mailgraph2.cgi HTTP/1.1" 200 2987 +10.0.0.176 - - [10/Mar/2004:08:36:31 -0800] "GET /forplus/mailgraph.cgi/mailgraph_0.png HTTP/1.1" 200 7783 +10.0.0.176 - - [10/Mar/2004:08:36:31 -0800] "GET /forplus/mailgraph.cgi/mailgraph_1.png HTTP/1.1" 200 8845 +10.0.0.176 - - [10/Mar/2004:08:36:31 -0800] "GET /forplus/mailgraph.cgi/mailgraph_0_err.png HTTP/1.1" 200 6274 +10.0.0.176 - - [10/Mar/2004:08:36:31 -0800] "GET /forplus/mailgraph.cgi/mailgraph_1_err.png HTTP/1.1" 200 7071 +10.0.0.176 - - [10/Mar/2004:08:36:31 -0800] "GET /forplus/mailgraph.cgi/mailgraph_2.png HTTP/1.1" 200 9328 +10.0.0.176 - - [10/Mar/2004:08:36:31 -0800] "GET /forplus/mailgraph.cgi/mailgraph_2_err.png HTTP/1.1" 200 6976 +10.0.0.176 - - [10/Mar/2004:08:36:31 -0800] "GET /forplus/mailgraph.cgi/mailgraph_3.png HTTP/1.1" 200 6619 +10.0.0.176 - - [10/Mar/2004:08:36:31 -0800] "GET /forplus/mailgraph.cgi/mailgraph_3_err.png HTTP/1.1" 200 5517 +10.0.0.176 - - [10/Mar/2004:08:36:57 -0800] "GET /ststats/index.jsp HTTP/1.1" 304 - +10.0.0.176 - - [10/Mar/2004:08:36:58 -0800] "GET /ststats/stats-spam.1day.png HTTP/1.1" 200 3020 +10.0.0.176 - - [10/Mar/2004:08:36:58 -0800] "GET /ststats/stats-spam-ratio.1day.png HTTP/1.1" 200 2287 +10.0.0.176 - - [10/Mar/2004:08:36:58 -0800] "GET /ststats/stats-spam-ratio.1week.png HTTP/1.1" 200 2332 +10.0.0.176 - - [10/Mar/2004:08:36:58 -0800] "GET /ststats/stats-hashes.1week.png HTTP/1.1" 200 1673 +10.0.0.176 - - [10/Mar/2004:08:36:58 -0800] "GET /ststats/stats-spam.1month.png HTTP/1.1" 200 2583 +10.0.0.176 - - [10/Mar/2004:08:36:58 -0800] "GET /ststats/stats-spam-ratio.1month.png HTTP/1.1" 200 1976 +10.0.0.176 - - [10/Mar/2004:08:36:58 -0800] "GET /ststats/stats-spam.1week.png HTTP/1.1" 200 3364 +10.0.0.176 - - [10/Mar/2004:08:36:58 -0800] "GET /ststats/stats-spam.1year.png HTTP/1.1" 200 2220 +10.0.0.176 - - [10/Mar/2004:08:36:58 -0800] "GET /ststats/stats-hashes.1month.png HTTP/1.1" 200 1627 +10.0.0.176 - - [10/Mar/2004:08:36:58 -0800] "GET /ststats/stats-spam-ratio.1year.png HTTP/1.1" 200 1837 +10.0.0.176 - - [10/Mar/2004:08:36:58 -0800] "GET /ststats/stats-hashes.1year.png HTTP/1.1" 200 1528 +ts05-ip44.hevanet.com - - [10/Mar/2004:08:51:31 -0800] "GET / HTTP/1.1" 304 - +ts05-ip44.hevanet.com - - [10/Mar/2004:08:52:13 -0800] "GET /ops/SP/play//view/Main/WebHome HTTP/1.1" 200 10419 +ts05-ip44.hevanet.com - - [10/Mar/2004:08:52:16 -0800] "GET /go/bin/test/TWikiLogos/twikiRobot46x50.gif HTTP/1.1" 304 - +ts05-ip44.hevanet.com - - [10/Mar/2004:08:52:25 -0800] "GET /ops/SP/play//view/Main/DCCAndPostFix HTTP/1.1" 200 5253 +ts05-ip44.hevanet.com - - [10/Mar/2004:08:52:52 -0800] "GET /ops/SP/play//view/Main/SpamAssassinUsingRazorAndDCC HTTP/1.1" 200 7435 +ts05-ip44.hevanet.com - - [10/Mar/2004:08:53:12 -0800] "GET /ops/SP/play//view/Main/PostfixCommands HTTP/1.1" 200 4016 +ts05-ip44.hevanet.com - - [10/Mar/2004:08:53:19 -0800] "GET /ops/SP/play//view/Main/PostfixCmd HTTP/1.1" 200 4173 +ts05-ip44.hevanet.com - - [10/Mar/2004:08:53:33 -0800] "GET /ops/SP/play//view/Main/PostSuper HTTP/1.1" 200 3629 +ts05-ip44.hevanet.com - - [10/Mar/2004:08:54:15 -0800] "GET /ops/SP/play//view/Main/ConfigurationVariables HTTP/1.1" 200 58292 +ts05-ip44.hevanet.com - - [10/Mar/2004:08:54:37 -0800] "GET /ops/SP/play//view/Main/RBLsHowTo HTTP/1.1" 200 4665 +ts05-ip44.hevanet.com - - [10/Mar/2004:08:55:03 -0800] "GET /ops/SP/play//view/Main/RelayGateway HTTP/1.1" 200 4232 +ts05-ip44.hevanet.com - - [10/Mar/2004:08:55:17 -0800] "GET /ops/SP/play//view/Main/VerifingGatway HTTP/1.1" 200 4750 +ts05-ip44.hevanet.com - - [10/Mar/2004:08:55:40 -0800] "GET /ops/SP/play//view/Main/KevinWGagel HTTP/1.1" 200 4901 +ts05-ip44.hevanet.com - - [10/Mar/2004:08:55:49 -0800] "GET /ops/SP/play//view/Main/LinksOfUse HTTP/1.1" 200 4534 +ts05-ip44.hevanet.com - - [10/Mar/2004:08:56:10 -0800] "GET /ops/SP/play//view/Main/SideBar HTTP/1.1" 200 3972 +ts05-ip44.hevanet.com - - [10/Mar/2004:08:56:13 -0800] "GET /ops/SP/play//view/Main/DCCGraphs HTTP/1.1" 200 5402 +lj1048.passgo.com - - [10/Mar/2004:09:05:59 -0800] "GET /robots.txt HTTP/1.0" 200 68 +lj1145.passgo.com - - [10/Mar/2004:09:05:59 -0800] "GET /ops/SP/play//oops/TWiki/MoveTopic HTTP/1.0" 200 209 +cacher2-ext.wise.edt.ericsson.se - - [10/Mar/2004:09:41:56 -0800] "GET /razor.jsp HTTP/1.0" 200 2869 +adsl-64-173-42-65.dsl.snfc21.pacbell.net - - [10/Mar/2004:10:37:53 -0800] "GET /AmavisNew.jsp HTTP/1.1" 200 2300 +ic8234.upco.es - - [10/Mar/2004:10:38:04 -0800] "GET /ops/SP/play//view/Main/WebHome HTTP/1.1" 200 10419 +ic8234.upco.es - - [10/Mar/2004:10:38:05 -0800] "GET /go/bin/test/TWikiLogos/twikiRobot46x50.gif HTTP/1.1" 200 2877 +ic8234.upco.es - - [10/Mar/2004:10:38:23 -0800] "GET /ops/SP/play//view/Main/PostfixCommands HTTP/1.1" 200 4016 +ic8234.upco.es - - [10/Mar/2004:10:38:27 -0800] "GET /ops/SP/play//view/Main/PostSuper HTTP/1.1" 200 3629 +ns.mou.cz - - [10/Mar/2004:10:59:06 -0800] "GET /AmavisNew.jsp HTTP/1.1" 200 2300 +h24-71-236-129.ca.clawio.org - - [10/Mar/2004:11:12:51 -0800] "GET /mailman/listinfo/ppwc HTTP/1.1" 200 6271 +lj1117.passgo.com - - [10/Mar/2004:11:13:21 -0800] "GET /ops/SP/play//view/Know/WebStatistics HTTP/1.0" 200 6394 +h24-71-236-129.ca.clawio.org - - [10/Mar/2004:11:18:59 -0800] "GET /mailman/admin/ppwc HTTP/1.1" 200 2082 +h24-71-236-129.ca.clawio.org - - [10/Mar/2004:11:19:00 -0800] "GET /icons/mailman.jpg HTTP/1.1" 200 2022 +h24-71-236-129.ca.clawio.org - - [10/Mar/2004:11:19:00 -0800] "GET /icons/PythonPowered.png HTTP/1.1" 200 945 +h24-71-236-129.ca.clawio.org - - [10/Mar/2004:11:19:00 -0800] "GET /icons/gnu-head-tiny.jpg HTTP/1.1" 200 3049 +h24-71-236-129.ca.clawio.org - - [10/Mar/2004:11:19:32 -0800] "POST /mailman/admin/ppwc HTTP/1.1" 200 19597 +h24-71-236-129.ca.clawio.org - - [10/Mar/2004:11:41:25 -0800] "GET /mailman/admin/ppwc HTTP/1.1" 200 2082 +h24-71-236-129.ca.clawio.org - - [10/Mar/2004:11:41:25 -0800] "GET /icons/mailman.jpg HTTP/1.1" 304 - +h24-71-236-129.ca.clawio.org - - [10/Mar/2004:11:41:25 -0800] "GET /icons/gnu-head-tiny.jpg HTTP/1.1" 304 - +h24-71-236-129.ca.clawio.org - - [10/Mar/2004:11:41:25 -0800] "GET /icons/PythonPowered.png HTTP/1.1" 304 - +h24-71-236-129.ca.clawio.org - - [10/Mar/2004:11:41:52 -0800] "POST /mailman/admin/ppwc HTTP/1.1" 200 19597 +h24-71-236-129.ca.clawio.org - - [10/Mar/2004:11:43:26 -0800] "GET /mailman/listinfo/ppwc HTTP/1.1" 200 6271 +h24-71-236-129.ca.clawio.org - - [10/Mar/2004:11:44:13 -0800] "GET /mailman/admin/ppwc/members HTTP/1.1" 200 15271 +h24-71-236-129.ca.clawio.org - - [10/Mar/2004:11:44:27 -0800] "GET /mailman/admin/ppwc/members?letter=n HTTP/1.1" 200 15131 +h24-71-236-129.ca.clawio.org - - [10/Mar/2004:11:44:44 -0800] "GET /mailman/admin/ppwc/members?letter=p HTTP/1.1" 200 24507 +h24-71-236-129.ca.clawio.org - - [10/Mar/2004:11:45:22 -0800] "GET /mailman/admin/ppwc/passwords HTTP/1.1" 200 6217 +h24-71-236-129.ca.clawio.org - - [10/Mar/2004:11:45:51 -0800] "GET /mailman/admin/ppwc/gateway HTTP/1.1" 200 0 +h24-71-236-129.ca.clawio.org - - [10/Mar/2004:11:45:51 -0800] "GET /mailman/admin/ppwc/gateway HTTP/1.1" 200 8692 +h24-71-236-129.ca.clawio.org - - [10/Mar/2004:11:46:42 -0800] "GET /mailman/admin/ppwc/general HTTP/1.1" 200 19597 +h24-71-236-129.ca.clawio.org - - [10/Mar/2004:11:47:37 -0800] "GET /mailman/admin/ppwc/?VARHELP=general/owner HTTP/1.1" 200 3505 +h24-71-236-129.ca.clawio.org - - [10/Mar/2004:11:49:57 -0800] "GET /mailman/admin/ppwc HTTP/1.1" 200 2082 +h24-71-236-129.ca.clawio.org - - [10/Mar/2004:11:49:57 -0800] "GET /icons/mailman.jpg HTTP/1.1" 304 - +h24-71-236-129.ca.clawio.org - - [10/Mar/2004:11:49:57 -0800] "GET /icons/gnu-head-tiny.jpg HTTP/1.1" 304 - +h24-71-236-129.ca.clawio.org - - [10/Mar/2004:11:49:57 -0800] "GET /icons/PythonPowered.png HTTP/1.1" 304 - +h24-71-236-129.ca.clawio.org - - [10/Mar/2004:11:50:28 -0800] "GET /mailman/listinfo HTTP/1.1" 200 6893 +h24-71-236-129.ca.clawio.org - - [10/Mar/2004:11:50:35 -0800] "GET /mailman/listinfo/ppwc HTTP/1.1" 200 6271 +h24-71-236-129.ca.clawio.org - - [10/Mar/2004:11:52:14 -0800] "GET /mailman/listinfo/ppwc HTTP/1.1" 200 6271 +h24-71-236-129.ca.clawio.org - - [10/Mar/2004:11:52:42 -0800] "GET /mailman/listinfo HTTP/1.1" 200 6893 +10.0.0.176 - - [10/Mar/2004:12:02:38 -0800] "GET / HTTP/1.1" 304 - +10.0.0.176 - - [10/Mar/2004:12:02:43 -0800] "GET /ops/SP/play//view/Main/WebHome HTTP/1.1" 200 10419 +10.0.0.176 - - [10/Mar/2004:12:02:43 -0800] "GET /go/bin/test/TWikiLogos/twikiRobot46x50.gif HTTP/1.1" 304 - +10.0.0.176 - - [10/Mar/2004:12:02:45 -0800] "GET /mailman HTTP/1.1" 302 301 +10.0.0.176 - - [10/Mar/2004:12:02:46 -0800] "GET /mailman/listinfo HTTP/1.1" 200 6893 +10.0.0.176 - - [10/Mar/2004:12:02:46 -0800] "GET /icons/mailman.jpg HTTP/1.1" 304 - +10.0.0.176 - - [10/Mar/2004:12:02:46 -0800] "GET /icons/PythonPowered.png HTTP/1.1" 304 - +10.0.0.176 - - [10/Mar/2004:12:02:46 -0800] "GET /icons/gnu-head-tiny.jpg HTTP/1.1" 304 - +10.0.0.176 - - [10/Mar/2004:12:02:50 -0800] "GET /mailman/listinfo/ppwc HTTP/1.1" 200 6271 +10.0.0.176 - - [10/Mar/2004:12:02:50 -0800] "GET /icons/PythonPowered.png HTTP/1.1" 304 - +10.0.0.176 - - [10/Mar/2004:12:02:50 -0800] "GET /icons/gnu-head-tiny.jpg HTTP/1.1" 304 - +10.0.0.176 - - [10/Mar/2004:12:02:50 -0800] "GET /icons/mailman.jpg HTTP/1.1" 304 - +10.0.0.176 - - [10/Mar/2004:12:02:52 -0800] "GET /mailman/admin/ppwc HTTP/1.1" 200 2082 +10.0.0.176 - - [10/Mar/2004:12:02:52 -0800] "GET /icons/mailman.jpg HTTP/1.1" 304 - +10.0.0.176 - - [10/Mar/2004:12:02:52 -0800] "GET /icons/gnu-head-tiny.jpg HTTP/1.1" 304 - +10.0.0.176 - - [10/Mar/2004:12:02:52 -0800] "GET /icons/PythonPowered.png HTTP/1.1" 304 - +10.0.0.176 - - [10/Mar/2004:12:02:59 -0800] "POST /mailman/admin/ppwc HTTP/1.1" 200 19597 +10.0.0.176 - - [10/Mar/2004:12:03:00 -0800] "GET /icons/mailman.jpg HTTP/1.1" 304 - +10.0.0.176 - - [10/Mar/2004:12:03:00 -0800] "GET /icons/gnu-head-tiny.jpg HTTP/1.1" 304 - +10.0.0.176 - - [10/Mar/2004:12:03:00 -0800] "GET /icons/PythonPowered.png HTTP/1.1" 304 - +10.0.0.176 - - [10/Mar/2004:12:03:03 -0800] "GET /mailman/admin/ppwc/members HTTP/1.1" 200 15271 +10.0.0.176 - - [10/Mar/2004:12:03:04 -0800] "GET /icons/mailman.jpg HTTP/1.1" 304 - +10.0.0.176 - - [10/Mar/2004:12:03:04 -0800] "GET /icons/gnu-head-tiny.jpg HTTP/1.1" 304 - +10.0.0.176 - - [10/Mar/2004:12:03:04 -0800] "GET /icons/PythonPowered.png HTTP/1.1" 304 - +10.0.0.176 - - [10/Mar/2004:12:03:08 -0800] "GET /mailman/admin/ppwc/members?letter=p HTTP/1.1" 200 24507 +10.0.0.176 - - [10/Mar/2004:12:03:08 -0800] "GET /icons/mailman.jpg HTTP/1.1" 304 - +10.0.0.176 - - [10/Mar/2004:12:03:08 -0800] "GET /icons/gnu-head-tiny.jpg HTTP/1.1" 304 - +10.0.0.176 - - [10/Mar/2004:12:03:08 -0800] "GET /icons/PythonPowered.png HTTP/1.1" 304 - +10.0.0.176 - - [10/Mar/2004:12:03:45 -0800] "GET /mailman/options/ppwc/ppwctwentynine--at--shaw.com HTTP/1.1" 200 14296 +10.0.0.176 - - [10/Mar/2004:12:03:45 -0800] "GET /icons/PythonPowered.png HTTP/1.1" 304 - +10.0.0.176 - - [10/Mar/2004:12:03:45 -0800] "GET /icons/gnu-head-tiny.jpg HTTP/1.1" 304 - +10.0.0.176 - - [10/Mar/2004:12:03:45 -0800] "GET /icons/mailman.jpg HTTP/1.1" 304 - +10.0.0.176 - - [10/Mar/2004:12:05:06 -0800] "POST /mailman/options/ppwc/ppwctwentynine@shaw.com HTTP/1.1" 200 14579 +10.0.0.176 - - [10/Mar/2004:12:05:06 -0800] "GET /icons/PythonPowered.png HTTP/1.1" 304 - +10.0.0.176 - - [10/Mar/2004:12:05:06 -0800] "GET /icons/gnu-head-tiny.jpg HTTP/1.1" 304 - +10.0.0.176 - - [10/Mar/2004:12:05:06 -0800] "GET /icons/mailman.jpg HTTP/1.1" 304 - +10.0.0.176 - - [10/Mar/2004:12:05:22 -0800] "GET /mailman/admin/ppwc HTTP/1.1" 200 19597 +10.0.0.176 - - [10/Mar/2004:12:05:22 -0800] "GET /icons/mailman.jpg HTTP/1.1" 304 - +10.0.0.176 - - [10/Mar/2004:12:05:22 -0800] "GET /icons/gnu-head-tiny.jpg HTTP/1.1" 304 - +10.0.0.176 - - [10/Mar/2004:12:05:22 -0800] "GET /icons/PythonPowered.png HTTP/1.1" 304 - +10.0.0.176 - - [10/Mar/2004:12:05:38 -0800] "GET /mailman/admin/ppwc/members HTTP/1.1" 200 15271 +10.0.0.176 - - [10/Mar/2004:12:05:38 -0800] "GET /icons/mailman.jpg HTTP/1.1" 304 - +10.0.0.176 - - [10/Mar/2004:12:05:38 -0800] "GET /icons/gnu-head-tiny.jpg HTTP/1.1" 304 - +10.0.0.176 - - [10/Mar/2004:12:05:38 -0800] "GET /icons/PythonPowered.png HTTP/1.1" 304 - +10.0.0.176 - - [10/Mar/2004:12:05:40 -0800] "GET /mailman/admin/ppwc/members?letter=p HTTP/1.1" 200 24525 +10.0.0.176 - - [10/Mar/2004:12:05:40 -0800] "GET /icons/mailman.jpg HTTP/1.1" 304 - +10.0.0.176 - - [10/Mar/2004:12:05:40 -0800] "GET /icons/gnu-head-tiny.jpg HTTP/1.1" 304 - +10.0.0.176 - - [10/Mar/2004:12:05:40 -0800] "GET /icons/PythonPowered.png HTTP/1.1" 304 - +10.0.0.176 - - [10/Mar/2004:12:05:54 -0800] "POST /mailman/admin/ppwc/members?letter=p HTTP/1.1" 200 23169 +10.0.0.176 - - [10/Mar/2004:12:05:54 -0800] "GET /icons/mailman.jpg HTTP/1.1" 304 - +10.0.0.176 - - [10/Mar/2004:12:05:54 -0800] "GET /icons/gnu-head-tiny.jpg HTTP/1.1" 304 - +10.0.0.176 - - [10/Mar/2004:12:05:54 -0800] "GET /icons/PythonPowered.png HTTP/1.1" 304 - +10.0.0.176 - - [10/Mar/2004:12:05:58 -0800] "GET /mailman/admin/ppwc/general HTTP/1.1" 200 19597 +10.0.0.176 - - [10/Mar/2004:12:05:58 -0800] "GET /icons/mailman.jpg HTTP/1.1" 304 - +10.0.0.176 - - [10/Mar/2004:12:05:58 -0800] "GET /icons/gnu-head-tiny.jpg HTTP/1.1" 304 - +10.0.0.176 - - [10/Mar/2004:12:05:58 -0800] "GET /icons/PythonPowered.png HTTP/1.1" 304 - +10.0.0.176 - - [10/Mar/2004:12:06:07 -0800] "GET /mailman/admin/ppwc/members HTTP/1.1" 200 15271 +10.0.0.176 - - [10/Mar/2004:12:06:07 -0800] "GET /icons/mailman.jpg HTTP/1.1" 304 - +10.0.0.176 - - [10/Mar/2004:12:06:07 -0800] "GET /icons/gnu-head-tiny.jpg HTTP/1.1" 304 - +10.0.0.176 - - [10/Mar/2004:12:06:07 -0800] "GET /icons/PythonPowered.png HTTP/1.1" 304 - +10.0.0.176 - - [10/Mar/2004:12:06:09 -0800] "GET /mailman/admin/ppwc/members/add HTTP/1.1" 200 6681 +10.0.0.176 - - [10/Mar/2004:12:06:09 -0800] "GET /icons/mailman.jpg HTTP/1.1" 304 - +10.0.0.176 - - [10/Mar/2004:12:06:09 -0800] "GET /icons/gnu-head-tiny.jpg HTTP/1.1" 304 - +10.0.0.176 - - [10/Mar/2004:12:06:09 -0800] "GET /icons/PythonPowered.png HTTP/1.1" 304 - +10.0.0.176 - - [10/Mar/2004:12:07:07 -0800] "POST /mailman/admin/ppwc/members/add HTTP/1.1" 200 6762 +10.0.0.176 - - [10/Mar/2004:12:07:07 -0800] "GET /icons/PythonPowered.png HTTP/1.1" 304 - +10.0.0.176 - - [10/Mar/2004:12:07:07 -0800] "GET /icons/gnu-head-tiny.jpg HTTP/1.1" 304 - +10.0.0.176 - - [10/Mar/2004:12:07:08 -0800] "GET /icons/mailman.jpg HTTP/1.1" 304 - +10.0.0.176 - - [10/Mar/2004:12:07:12 -0800] "GET /mailman/admin/ppwc/members/list HTTP/1.1" 200 15271 +10.0.0.176 - - [10/Mar/2004:12:07:12 -0800] "GET /icons/mailman.jpg HTTP/1.1" 304 - +10.0.0.176 - - [10/Mar/2004:12:07:12 -0800] "GET /icons/gnu-head-tiny.jpg HTTP/1.1" 304 - +10.0.0.176 - - [10/Mar/2004:12:07:13 -0800] "GET /icons/PythonPowered.png HTTP/1.1" 304 - +10.0.0.176 - - [10/Mar/2004:12:07:14 -0800] "GET /icons/mailman.jpg HTTP/1.1" 304 - +10.0.0.176 - - [10/Mar/2004:12:07:14 -0800] "GET /icons/PythonPowered.png HTTP/1.1" 304 - +10.0.0.176 - - [10/Mar/2004:12:07:14 -0800] "GET /icons/gnu-head-tiny.jpg HTTP/1.1" 304 - +10.0.0.176 - - [10/Mar/2004:12:07:14 -0800] "GET /mailman/admin/ppwc/members?letter=p HTTP/1.1" 200 24585 +10.0.0.176 - - [10/Mar/2004:12:07:25 -0800] "POST /mailman/admin/ppwc/members?letter=p HTTP/1.1" 200 24577 +10.0.0.176 - - [10/Mar/2004:12:07:25 -0800] "GET /icons/mailman.jpg HTTP/1.1" 304 - +10.0.0.176 - - [10/Mar/2004:12:07:25 -0800] "GET /icons/gnu-head-tiny.jpg HTTP/1.1" 304 - +10.0.0.176 - - [10/Mar/2004:12:07:25 -0800] "GET /icons/PythonPowered.png HTTP/1.1" 304 - +10.0.0.176 - - [10/Mar/2004:12:16:59 -0800] "GET /mailman/admin/ppwc/logout HTTP/1.1" 200 2103 +10.0.0.176 - - [10/Mar/2004:12:16:59 -0800] "GET /icons/PythonPowered.png HTTP/1.1" 304 - +10.0.0.176 - - [10/Mar/2004:12:16:59 -0800] "GET /icons/gnu-head-tiny.jpg HTTP/1.1" 304 - +10.0.0.176 - - [10/Mar/2004:12:16:59 -0800] "GET /icons/mailman.jpg HTTP/1.1" 304 - +142.27.64.35 - - [10/Mar/2004:12:19:02 -0800] "GET / HTTP/1.1" 304 - +142.27.64.35 - - [10/Mar/2004:12:19:05 -0800] "GET /mailman HTTP/1.1" 302 301 +142.27.64.35 - - [10/Mar/2004:12:19:05 -0800] "GET /mailman/listinfo HTTP/1.1" 200 6893 +142.27.64.35 - - [10/Mar/2004:12:19:06 -0800] "GET /icons/PythonPowered.png HTTP/1.1" 304 - +142.27.64.35 - - [10/Mar/2004:12:19:06 -0800] "GET /icons/gnu-head-tiny.jpg HTTP/1.1" 304 - +142.27.64.35 - - [10/Mar/2004:12:19:06 -0800] "GET /icons/mailman.jpg HTTP/1.1" 304 - +142.27.64.35 - - [10/Mar/2004:12:19:08 -0800] "GET /mailman/listinfo/ppwc HTTP/1.1" 200 6271 +lj1216.passgo.com - - [10/Mar/2004:12:22:32 -0800] "GET /ops/SP/play//oops/TWiki/WikiTopic HTTP/1.0" 200 209 +10.0.0.176 - - [10/Mar/2004:12:25:25 -0800] "GET / HTTP/1.1" 304 - +10.0.0.176 - - [10/Mar/2004:12:25:28 -0800] "GET /forplus/mailgraph2.cgi HTTP/1.1" 200 2987 +10.0.0.176 - - [10/Mar/2004:12:25:29 -0800] "GET /forplus/mailgraph.cgi/mailgraph_0.png HTTP/1.1" 200 8663 +10.0.0.176 - - [10/Mar/2004:12:25:29 -0800] "GET /forplus/mailgraph.cgi/mailgraph_0_err.png HTTP/1.1" 200 6392 +10.0.0.176 - - [10/Mar/2004:12:25:29 -0800] "GET /forplus/mailgraph.cgi/mailgraph_1_err.png HTTP/1.1" 200 7133 +10.0.0.176 - - [10/Mar/2004:12:25:29 -0800] "GET /forplus/mailgraph.cgi/mailgraph_1.png HTTP/1.1" 200 9449 +10.0.0.176 - - [10/Mar/2004:12:25:29 -0800] "GET /forplus/mailgraph.cgi/mailgraph_2_err.png HTTP/1.1" 200 6895 +10.0.0.176 - - [10/Mar/2004:12:25:29 -0800] "GET /forplus/mailgraph.cgi/mailgraph_2.png HTTP/1.1" 200 9403 +10.0.0.176 - - [10/Mar/2004:12:25:29 -0800] "GET /forplus/mailgraph.cgi/mailgraph_3.png HTTP/1.1" 200 6619 +10.0.0.176 - - [10/Mar/2004:12:25:29 -0800] "GET /forplus/mailgraph.cgi/mailgraph_3_err.png HTTP/1.1" 200 5517 +c-411472d5.04-138-73746f22.cust.bredbandsbolaget.se - - [10/Mar/2004:13:13:23 -0800] "GET /razor.jsp HTTP/1.1" 200 2869 +3_343_lt_someone - - [10/Mar/2004:13:15:44 -0800] "GET / HTTP/1.1" 200 3169 +3_343_lt_someone - - [10/Mar/2004:13:15:53 -0800] "GET /forplus/mailgraph2.cgi HTTP/1.1" 200 2987 +3_343_lt_someone - - [10/Mar/2004:13:15:54 -0800] "GET /forplus/mailgraph.cgi/mailgraph_1_err.png HTTP/1.1" 200 7142 +3_343_lt_someone - - [10/Mar/2004:13:15:54 -0800] "GET /forplus/mailgraph.cgi/mailgraph_0.png HTTP/1.1" 200 5882 +3_343_lt_someone - - [10/Mar/2004:13:15:54 -0800] "GET /forplus/mailgraph.cgi/mailgraph_0_err.png HTTP/1.1" 200 6485 +3_343_lt_someone - - [10/Mar/2004:13:15:54 -0800] "GET /forplus/mailgraph.cgi/mailgraph_1.png HTTP/1.1" 200 8673 +3_343_lt_someone - - [10/Mar/2004:13:15:54 -0800] "GET /forplus/mailgraph.cgi/mailgraph_2_err.png HTTP/1.1" 200 6895 +3_343_lt_someone - - [10/Mar/2004:13:15:54 -0800] "GET /forplus/mailgraph.cgi/mailgraph_2.png HTTP/1.1" 200 9403 +3_343_lt_someone - - [10/Mar/2004:13:15:54 -0800] "GET /forplus/mailgraph.cgi/mailgraph_3.png HTTP/1.1" 200 6619 +3_343_lt_someone - - [10/Mar/2004:13:15:54 -0800] "GET /forplus/mailgraph.cgi/mailgraph_3_err.png HTTP/1.1" 200 5517 +watchguard.cgmatane.qc.ca - - [10/Mar/2004:13:41:37 -0800] "GET /SpamAssassin.jsp HTTP/1.1" 200 7368 +watchguard.cgmatane.qc.ca - - [10/Mar/2004:13:42:23 -0800] "GET /RBL.jsp HTTP/1.1" 200 4114 +ppp2.p33.is.com.ua - - [10/Mar/2004:14:20:51 -0800] "GET /SpamAssassin.jsp HTTP/1.1" 200 7368 +ppp2.p33.is.com.ua - - [10/Mar/2004:14:21:36 -0800] "GET /favicon.ico HTTP/1.1" 200 1078 +ppp2.p33.is.com.ua - - [10/Mar/2004:14:22:13 -0800] "GET /AmavisNew.jsp HTTP/1.1" 200 2300 +10.0.0.176 - - [10/Mar/2004:15:06:20 -0800] "GET / HTTP/1.1" 304 - +10.0.0.176 - - [10/Mar/2004:15:06:24 -0800] "GET /forplus/mailgraph2.cgi HTTP/1.1" 200 2987 +10.0.0.176 - - [10/Mar/2004:15:06:24 -0800] "GET /forplus/mailgraph.cgi/mailgraph_0.png HTTP/1.1" 200 5871 +10.0.0.176 - - [10/Mar/2004:15:06:24 -0800] "GET /forplus/mailgraph.cgi/mailgraph_0_err.png HTTP/1.1" 200 6484 +10.0.0.176 - - [10/Mar/2004:15:06:24 -0800] "GET /forplus/mailgraph.cgi/mailgraph_1_err.png HTTP/1.1" 200 7014 +10.0.0.176 - - [10/Mar/2004:15:06:24 -0800] "GET /forplus/mailgraph.cgi/mailgraph_1.png HTTP/1.1" 200 8821 +10.0.0.176 - - [10/Mar/2004:15:06:25 -0800] "GET /forplus/mailgraph.cgi/mailgraph_2.png HTTP/1.1" 200 9306 +10.0.0.176 - - [10/Mar/2004:15:06:25 -0800] "GET /forplus/mailgraph.cgi/mailgraph_2_err.png HTTP/1.1" 200 6937 +10.0.0.176 - - [10/Mar/2004:15:06:25 -0800] "GET /forplus/mailgraph.cgi/mailgraph_3_err.png HTTP/1.1" 200 5517 +10.0.0.176 - - [10/Mar/2004:15:06:25 -0800] "GET /forplus/mailgraph.cgi/mailgraph_3.png HTTP/1.1" 200 6619 +lj1024.passgo.com - - [10/Mar/2004:15:10:10 -0800] "GET /robots.txt HTTP/1.0" 200 68 +lj1028.passgo.com - - [10/Mar/2004:15:10:13 -0800] "GET /ops/SP/play//oops/Main/T HTTP/1.0" 200 209 +lj1145.passgo.com - - [10/Mar/2004:15:49:55 -0800] "GET /ops/SP/play//oops/TWiki/NicholasLee HTTP/1.0" 200 209 +h24-68-45-227.gv.shawcable.net - - [10/Mar/2004:16:29:30 -0800] "GET /pipermail/cnc_notice/2004-February.txt HTTP/1.1" 200 6712 +64.246.94.141 - - [10/Mar/2004:16:31:19 -0800] "HEAD /ops/SP/play//view/Main/SpamAssassinDeleting HTTP/1.1" 200 0 +pntn02m05-129.bctel.ca - - [10/Mar/2004:16:33:04 -0800] "GET /pipermail/cncce/2004-January/000001.jsp HTTP/1.1" 200 3095 +calcite.rhyolite.com - - [10/Mar/2004:16:47:44 -0800] "GET /clients.jsp HTTP/1.1" 200 18971 +h24-68-45-227.gv.shawcable.net - - [10/Mar/2004:16:52:44 -0800] "GET /pipermail/cnc_notice/2003-December.txt HTTP/1.1" 200 6570 +h24-68-45-227.gv.shawcable.net - - [10/Mar/2004:16:54:36 -0800] "GET /pipermail/cnc_notice/2003-December/000002.jsp HTTP/1.1" 200 7074 +lj1117.passgo.com - - [10/Mar/2004:18:13:54 -0800] "GET /ops/SP/play//view/Main/VishaalGolam HTTP/1.0" 200 4577 +lj1073.passgo.com - - [10/Mar/2004:18:17:24 -0800] "GET /ops/SP/play//oops/TWiki/Wik HTTP/1.0" 200 209 +lj1024.passgo.com - - [10/Mar/2004:19:55:54 -0800] "GET /robots.txt HTTP/1.0" 200 68 +lj1000.passgo.com - - [10/Mar/2004:19:55:56 -0800] "GET /ops/SP/play//view/Know/WebHome HTTP/1.0" 200 7529 +dialup-5-81.tulane.edu - - [10/Mar/2004:20:22:41 -0800] "GET /ops/SP/play//view/Main/SpamAssassinTaggingOnly HTTP/1.1" 200 5691 +dialup-5-81.tulane.edu - - [10/Mar/2004:20:22:42 -0800] "GET /go/bin/test/TWikiLogos/twikiRobot46x50.gif HTTP/1.1" 200 2877 +dialup-5-81.tulane.edu - - [10/Mar/2004:20:23:11 -0800] "GET /ops/SP/play//view/Main/WebHome HTTP/1.1" 200 10419 +dialup-5-81.tulane.edu - - [10/Mar/2004:20:23:41 -0800] "GET /ops/SP/play//view/Main/TWikiGroups HTTP/1.1" 200 4816 +dialup-5-81.tulane.edu - - [10/Mar/2004:20:23:52 -0800] "GET /ops/SP/play//view/Main/TWikiAdminGroup HTTP/1.1" 200 4175 +lj1145.passgo.com - - [10/Mar/2004:21:56:34 -0800] "GET /ops/SP/play//oops/Main/WebStatistics HTTP/1.0" 200 209 +h24-70-69-74.ca.clawio.org - - [10/Mar/2004:21:58:46 -0800] "GET / HTTP/1.1" 200 3169 +h24-70-69-74.ca.clawio.org - - [10/Mar/2004:21:58:46 -0800] "GET /favicon.ico HTTP/1.1" 200 1078 +h24-70-69-74.ca.clawio.org - - [10/Mar/2004:21:59:16 -0800] "GET /forplus/mailgraph2.cgi HTTP/1.1" 200 2987 +h24-70-69-74.ca.clawio.org - - [10/Mar/2004:21:59:17 -0800] "GET /forplus/mailgraph.cgi/mailgraph_0.png HTTP/1.1" 200 5664 +h24-70-69-74.ca.clawio.org - - [10/Mar/2004:21:59:17 -0800] "GET /forplus/mailgraph.cgi/mailgraph_0_err.png HTTP/1.1" 200 6403 +h24-70-69-74.ca.clawio.org - - [10/Mar/2004:21:59:18 -0800] "GET /forplus/mailgraph.cgi/mailgraph_1.png HTTP/1.1" 200 8837 +h24-70-69-74.ca.clawio.org - - [10/Mar/2004:21:59:18 -0800] "GET /forplus/mailgraph.cgi/mailgraph_1_err.png HTTP/1.1" 200 6980 +h24-70-69-74.ca.clawio.org - - [10/Mar/2004:21:59:18 -0800] "GET /forplus/mailgraph.cgi/mailgraph_2.png HTTP/1.1" 200 9241 +h24-70-69-74.ca.clawio.org - - [10/Mar/2004:21:59:18 -0800] "GET /forplus/mailgraph.cgi/mailgraph_2_err.png HTTP/1.1" 200 6970 +h24-70-69-74.ca.clawio.org - - [10/Mar/2004:21:59:18 -0800] "GET /forplus/mailgraph.cgi/mailgraph_3.png HTTP/1.1" 200 6619 +h24-70-69-74.ca.clawio.org - - [10/Mar/2004:21:59:18 -0800] "GET /forplus/mailgraph.cgi/mailgraph_3_err.png HTTP/1.1" 200 5517 +h24-70-69-74.ca.clawio.org - - [10/Mar/2004:22:00:03 -0800] "GET /ststats/index.jsp HTTP/1.1" 200 2955 +h24-70-69-74.ca.clawio.org - - [10/Mar/2004:22:00:04 -0800] "GET /ststats/stats-spam.1day.png HTTP/1.1" 200 3093 +h24-70-69-74.ca.clawio.org - - [10/Mar/2004:22:00:05 -0800] "GET /ststats/stats-spam-ratio.1day.png HTTP/1.1" 200 2255 +h24-70-69-74.ca.clawio.org - - [10/Mar/2004:22:00:05 -0800] "GET /ststats/stats-spam.1week.png HTTP/1.1" 200 3419 +h24-70-69-74.ca.clawio.org - - [10/Mar/2004:22:00:05 -0800] "GET /ststats/stats-spam-ratio.1week.png HTTP/1.1" 200 2381 +h24-70-69-74.ca.clawio.org - - [10/Mar/2004:22:00:05 -0800] "GET /ststats/stats-hashes.1week.png HTTP/1.1" 200 1658 +h24-70-69-74.ca.clawio.org - - [10/Mar/2004:22:00:05 -0800] "GET /ststats/stats-spam.1month.png HTTP/1.1" 200 2657 +h24-70-69-74.ca.clawio.org - - [10/Mar/2004:22:00:05 -0800] "GET /ststats/stats-spam-ratio.1month.png HTTP/1.1" 200 2008 +h24-70-69-74.ca.clawio.org - - [10/Mar/2004:22:00:05 -0800] "GET /ststats/stats-hashes.1month.png HTTP/1.1" 200 1598 +h24-70-69-74.ca.clawio.org - - [10/Mar/2004:22:00:05 -0800] "GET /ststats/stats-spam.1year.png HTTP/1.1" 200 2223 +h24-70-69-74.ca.clawio.org - - [10/Mar/2004:22:00:05 -0800] "GET /ststats/stats-spam-ratio.1year.png HTTP/1.1" 200 1924 +h24-70-69-74.ca.clawio.org - - [10/Mar/2004:22:00:05 -0800] "GET /ststats/stats-hashes.1year.png HTTP/1.1" 200 1550 +lj1220.passgo.com - - [10/Mar/2004:22:16:58 -0800] "GET /ops/SP/play//oops/TWiki/SvenDowideit HTTP/1.0" 200 209 +h24-70-69-74.ca.clawio.org - - [10/Mar/2004:23:08:28 -0800] "GET /forplus/mailgraph2.cgi HTTP/1.1" 200 2987 +h24-70-69-74.ca.clawio.org - - [10/Mar/2004:23:08:30 -0800] "GET /forplus/mailgraph.cgi/mailgraph_0.png HTTP/1.1" 200 5805 +h24-70-69-74.ca.clawio.org - - [10/Mar/2004:23:08:30 -0800] "GET /forplus/mailgraph.cgi/mailgraph_0_err.png HTTP/1.1" 200 6445 +h24-70-69-74.ca.clawio.org - - [10/Mar/2004:23:08:30 -0800] "GET /forplus/mailgraph.cgi/mailgraph_1.png HTTP/1.1" 200 8809 +h24-70-69-74.ca.clawio.org - - [10/Mar/2004:23:08:31 -0800] "GET /forplus/mailgraph.cgi/mailgraph_1_err.png HTTP/1.1" 200 6882 +h24-70-69-74.ca.clawio.org - - [10/Mar/2004:23:08:31 -0800] "GET /forplus/mailgraph.cgi/mailgraph_2.png HTTP/1.1" 200 9241 +h24-70-69-74.ca.clawio.org - - [10/Mar/2004:23:08:31 -0800] "GET /forplus/mailgraph.cgi/mailgraph_2_err.png HTTP/1.1" 200 6970 +h24-70-69-74.ca.clawio.org - - [10/Mar/2004:23:08:31 -0800] "GET /forplus/mailgraph.cgi/mailgraph_3.png HTTP/1.1" 200 6619 +h24-70-69-74.ca.clawio.org - - [10/Mar/2004:23:08:31 -0800] "GET /forplus/mailgraph.cgi/mailgraph_3_err.png HTTP/1.1" 200 5517 +lj1024.passgo.com - - [11/Mar/2004:00:07:57 -0800] "GET /robots.txt HTTP/1.0" 200 68 +lj1117.passgo.com - - [11/Mar/2004:00:07:58 -0800] "GET /ops/SP/play//oops/Know/WebStatistics HTTP/1.0" 200 209 +lj1120.passgo.com - - [11/Mar/2004:00:42:01 -0800] "GET /ops/SP/play//view/Main/DCCAndPostFix HTTP/1.0" 200 5234 +ns3.vonroll.ch - - [11/Mar/2004:00:43:57 -0800] "GET /ops/SP/play//view/Main/WebHome HTTP/1.0" 200 10392 +ns3.vonroll.ch - - [11/Mar/2004:00:43:59 -0800] "GET /go/bin/test/TWikiLogos/twikiRobot46x50.gif HTTP/1.0" 200 2877 +ns3.vonroll.ch - - [11/Mar/2004:00:44:08 -0800] "GET /ops/SP/play//view/Main/RBLsHowTo HTTP/1.0" 200 4646 +lj1145.passgo.com - - [11/Mar/2004:01:39:53 -0800] "GET /ops/SP/play//view/Main/SimonMudd HTTP/1.0" 200 4612 +1513.cps.virtua.com.br - - [11/Mar/2004:02:27:39 -0800] "GET /pipermail/cipg/2003-november.txt HTTP/1.1" 404 309 +194.151.73.43 - - [11/Mar/2004:03:35:49 -0800] "GET /ie.htm HTTP/1.0" 200 3518 +194.151.73.43 - - [11/Mar/2004:03:35:57 -0800] "GET /images/image004.jpg HTTP/1.0" 200 10936 +194.151.73.43 - - [11/Mar/2004:03:35:57 -0800] "GET /images/image005.jpg HTTP/1.0" 200 21125 +194.151.73.43 - - [11/Mar/2004:03:35:58 -0800] "GET /images/msgops.JPG HTTP/1.0" 200 7939 +spica.ukc.ac.uk - - [11/Mar/2004:03:50:09 -0800] "GET /razor.jsp HTTP/1.1" 200 2869 +spica.ukc.ac.uk - - [11/Mar/2004:03:50:09 -0800] "GET /favicon.ico HTTP/1.1" 200 1078 +ogw.netinfo.nl - - [11/Mar/2004:06:11:19 -0800] "GET /ops/SP/play//view/Main/WebHome HTTP/1.1" 200 10419 +ogw.netinfo.nl - - [11/Mar/2004:06:11:21 -0800] "GET /go/bin/test/TWikiLogos/twikiRobot46x50.gif HTTP/1.1" 200 2877 +ogw.netinfo.nl - - [11/Mar/2004:06:11:38 -0800] "GET /ops/SP/play//view/Main/PostfixCommands HTTP/1.1" 200 4016 +ogw.netinfo.nl - - [11/Mar/2004:06:11:39 -0800] "GET /go/bin/test/TWikiLogos/twikiRobot46x50.gif HTTP/1.1" 304 - +ogw.netinfo.nl - - [11/Mar/2004:06:11:46 -0800] "GET /ops/SP/play//view/Main/PostfixCmd HTTP/1.1" 200 4173 +ogw.netinfo.nl - - [11/Mar/2004:06:11:47 -0800] "GET /go/bin/test/TWikiLogos/twikiRobot46x50.gif HTTP/1.1" 304 - +ogw.netinfo.nl - - [11/Mar/2004:06:12:41 -0800] "GET /ops/SP/play//view/Main/PostQueue HTTP/1.1" 200 4280 +ogw.netinfo.nl - - [11/Mar/2004:06:12:43 -0800] "GET /go/bin/test/TWikiLogos/twikiRobot46x50.gif HTTP/1.1" 304 - +ogw.netinfo.nl - - [11/Mar/2004:06:13:07 -0800] "GET /ops/SP/play//view/Main/PostSuper HTTP/1.1" 200 3629 +ogw.netinfo.nl - - [11/Mar/2004:06:13:08 -0800] "GET /go/bin/test/TWikiLogos/twikiRobot46x50.gif HTTP/1.1" 304 - +ogw.netinfo.nl - - [11/Mar/2004:06:14:03 -0800] "GET /ops/SP/play//view/Main/RBLsHowTo HTTP/1.1" 200 4665 +ogw.netinfo.nl - - [11/Mar/2004:06:14:04 -0800] "GET /go/bin/test/TWikiLogos/twikiRobot46x50.gif HTTP/1.1" 304 - +ogw.netinfo.nl - - [11/Mar/2004:06:16:40 -0800] "GET /ops/SP/play//view/Main/RelayGateway HTTP/1.1" 200 4232 +ogw.netinfo.nl - - [11/Mar/2004:06:17:06 -0800] "GET /ops/SP/play//view/Main/LinksOfUse HTTP/1.1" 200 4534 +ogw.netinfo.nl - - [11/Mar/2004:06:17:11 -0800] "GET /go/bin/test/TWikiLogos/twikiRobot46x50.gif HTTP/1.1" 304 - +lj1024.passgo.com - - [11/Mar/2004:06:27:31 -0800] "GET /robots.txt HTTP/1.0" 200 68 +lj1153.passgo.com - - [11/Mar/2004:06:27:36 -0800] "GET /ops/SP/play//oops/Sandbox/WebStatistics HTTP/1.0" 200 209 +208-186-146-13.nrp3.brv.mn.frontiernet.net - - [11/Mar/2004:06:48:05 -0800] "GET /AmavisNew.jsp HTTP/1.1" 200 2300 +208-186-146-13.nrp3.brv.mn.frontiernet.net - - [11/Mar/2004:06:48:05 -0800] "GET /favicon.ico HTTP/1.1" 200 1078 +ladybug.cns.vt.edu - - [11/Mar/2004:07:15:10 -0800] "GET /ops/SP/play//view/Main/WebHome HTTP/1.1" 200 10419 +ladybug.cns.vt.edu - - [11/Mar/2004:07:15:11 -0800] "GET /go/bin/test/TWikiLogos/twikiRobot46x50.gif HTTP/1.1" 200 2877 +ladybug.cns.vt.edu - - [11/Mar/2004:07:19:57 -0800] "GET /favicon.ico HTTP/1.1" 200 1078 +ladybug.cns.vt.edu - - [11/Mar/2004:07:20:05 -0800] "GET /ops/SP/play//view/Main/SpamAssassinAndPostFix HTTP/1.1" 200 4034 +ladybug.cns.vt.edu - - [11/Mar/2004:07:20:09 -0800] "GET /ops/SP/play//view/Main/SpamAssassinTaggingOnly HTTP/1.1" 200 5691 +osdlab.eic.nctu.edu.tw - - [11/Mar/2004:07:39:30 -0800] "GET /M83A HTTP/1.0" 404 269 +208.247.148.12 - - [11/Mar/2004:08:14:18 -0800] "GET /mailman/listinfo/ppwc HTTP/1.0" 200 6252 +208.247.148.12 - - [11/Mar/2004:08:14:18 -0800] "GET /icons/mailman.jpg HTTP/1.0" 200 2022 +208.247.148.12 - - [11/Mar/2004:08:14:18 -0800] "GET /icons/PythonPowered.png HTTP/1.0" 200 945 +208.247.148.12 - - [11/Mar/2004:08:14:18 -0800] "GET /icons/gnu-head-tiny.jpg HTTP/1.0" 200 3049 +ogw.netinfo.nl - - [11/Mar/2004:08:45:41 -0800] "GET /ops/SP/play//view/Main/SpamAssassinAndPostFix HTTP/1.1" 200 4034 +ogw.netinfo.nl - - [11/Mar/2004:08:45:42 -0800] "GET /go/bin/test/TWikiLogos/twikiRobot46x50.gif HTTP/1.1" 304 - +ogw.netinfo.nl - - [11/Mar/2004:08:45:49 -0800] "GET /ops/SP/play//view/Main/SpamAssassinDeleting HTTP/1.1" 200 5543 +ogw.netinfo.nl - - [11/Mar/2004:08:45:54 -0800] "GET /go/bin/test/TWikiLogos/twikiRobot46x50.gif HTTP/1.1" 304 - +0x503e4fce.virnxx2.adsl-dhcp.tele.dk - - [11/Mar/2004:10:55:40 -0800] "GET /razor.jsp HTTP/1.1" 200 2869 +0x503e4fce.virnxx2.adsl-dhcp.tele.dk - - [11/Mar/2004:10:58:16 -0800] "GET /favicon.ico HTTP/1.1" 200 1078 +0x503e4fce.virnxx2.adsl-dhcp.tele.dk - - [11/Mar/2004:10:58:27 -0800] "GET /razor.jsp HTTP/1.1" 304 - +64-93-34-186.client.dsl.net - - [11/Mar/2004:11:12:40 -0800] "GET /razor.jsp HTTP/1.1" 200 2869 +d207-6-50-215.bchsia.telus.net - - [11/Mar/2004:11:33:35 -0800] "GET /pipermail/cncce/2004-January/000001.jsp HTTP/1.1" 200 3095 +10.0.0.176 - - [11/Mar/2004:11:49:51 -0800] "GET / HTTP/1.1" 304 - +10.0.0.176 - - [11/Mar/2004:11:49:53 -0800] "GET /forplus/mailgraph2.cgi HTTP/1.1" 200 2987 +10.0.0.176 - - [11/Mar/2004:11:49:54 -0800] "GET /forplus/mailgraph.cgi/mailgraph_0.png HTTP/1.1" 200 5622 +10.0.0.176 - - [11/Mar/2004:11:49:54 -0800] "GET /forplus/mailgraph.cgi/mailgraph_0_err.png HTTP/1.1" 200 6357 +10.0.0.176 - - [11/Mar/2004:11:49:54 -0800] "GET /forplus/mailgraph.cgi/mailgraph_1.png HTTP/1.1" 200 8728 +10.0.0.176 - - [11/Mar/2004:11:49:54 -0800] "GET /forplus/mailgraph.cgi/mailgraph_1_err.png HTTP/1.1" 200 6791 +10.0.0.176 - - [11/Mar/2004:11:49:54 -0800] "GET /forplus/mailgraph.cgi/mailgraph_2.png HTTP/1.1" 200 9561 +10.0.0.176 - - [11/Mar/2004:11:49:54 -0800] "GET /forplus/mailgraph.cgi/mailgraph_2_err.png HTTP/1.1" 200 7087 +10.0.0.176 - - [11/Mar/2004:11:49:54 -0800] "GET /forplus/mailgraph.cgi/mailgraph_3.png HTTP/1.1" 200 6427 +10.0.0.176 - - [11/Mar/2004:11:49:54 -0800] "GET /forplus/mailgraph.cgi/mailgraph_3_err.png HTTP/1.1" 200 5598 +1-729.tnr.on.ca - - [11/Mar/2004:11:54:59 -0800] "GET / HTTP/1.1" 200 3169 +1-729.tnr.on.ca - - [11/Mar/2004:11:55:22 -0800] "GET /mailman HTTP/1.1" 302 301 +1-729.tnr.on.ca - - [11/Mar/2004:11:55:22 -0800] "GET /mailman/listinfo HTTP/1.1" 200 6893 +1-729.tnr.on.ca - - [11/Mar/2004:11:55:22 -0800] "GET /icons/mailman.jpg HTTP/1.1" 200 2022 +1-729.tnr.on.ca - - [11/Mar/2004:11:55:23 -0800] "GET /icons/PythonPowered.png HTTP/1.1" 200 945 +1-729.tnr.on.ca - - [11/Mar/2004:11:55:23 -0800] "GET /icons/gnu-head-tiny.jpg HTTP/1.1" 200 3049 +1-729.tnr.on.ca - - [11/Mar/2004:11:55:26 -0800] "GET /mailman/listinfo/administration HTTP/1.1" 200 6459 +h24-71-236-129.ca.clawio.org - - [11/Mar/2004:12:28:50 -0800] "GET /mailman/admindb/ppwc HTTP/1.1" 200 2072 +h24-71-236-129.ca.clawio.org - - [11/Mar/2004:12:28:50 -0800] "GET /icons/mailman.jpg HTTP/1.1" 304 - +h24-71-236-129.ca.clawio.org - - [11/Mar/2004:12:28:51 -0800] "GET /icons/PythonPowered.png HTTP/1.1" 304 - +h24-71-236-129.ca.clawio.org - - [11/Mar/2004:12:28:51 -0800] "GET /icons/gnu-head-tiny.jpg HTTP/1.1" 304 - +h24-71-236-129.ca.clawio.org - - [11/Mar/2004:12:29:03 -0800] "POST /mailman/admindb/ppwc HTTP/1.1" 200 3407 +h24-71-236-129.ca.clawio.org - - [11/Mar/2004:12:29:27 -0800] "POST /mailman/admindb/ppwc HTTP/1.1" 200 1134 +cr020r01-3.uah.goweb.net - - [11/Mar/2004:12:56:35 -0800] "GET /robots.txt HTTP/1.0" 200 68 +cr020r01-3.uah.goweb.net - - [11/Mar/2004:12:56:58 -0800] "GET /ops/SP/play//view/TWiki/WebStatistics HTTP/1.0" 200 8193 +cr020r01-3.uah.goweb.net - - [11/Mar/2004:12:57:18 -0800] "GET /ops/SP/play//view/Main/TWikiGuest HTTP/1.0" 200 4430 +cr020r01-3.uah.goweb.net - - [11/Mar/2004:12:57:24 -0800] "GET /ops/SP/play//view/Main/WebHome?rev=1.25 HTTP/1.0" 200 9812 +cr020r01-3.uah.goweb.net - - [11/Mar/2004:12:57:45 -0800] "GET /ops/SP/play//view/Main/WebNotify?rev=r1.6 HTTP/1.0" 200 4300 +cr020r01-3.uah.goweb.net - - [11/Mar/2004:12:58:03 -0800] "GET /ops/SP/play//rdiff/TWiki/ManagingTopics?rev1=1.16&rev2=1.15 HTTP/1.0" 200 7912 +cr020r01-3.uah.goweb.net - - [11/Mar/2004:12:58:37 -0800] "GET /ops/SP/play//view/Main/WebHome?rev=r1.8 HTTP/1.0" 200 8986 +cr020r01-3.uah.goweb.net - - [11/Mar/2004:12:58:50 -0800] "GET /ops/SP/play//edit/Main/Max_idle?topicparent=Main.ConfigurationVariables HTTP/1.0" 401 12816 +cr020r01-3.uah.goweb.net - - [11/Mar/2004:12:59:07 -0800] "GET /ops/SP/play//view/Main/WebChanges HTTP/1.0" 200 40430 +cr020r01-3.uah.goweb.net - - [11/Mar/2004:12:59:33 -0800] "GET /ops/SP/play//search/TWiki/SearchResult?scope=text®ex=on&search=Appendix%20*File%20*System%5B%5EA-Za-z%5D HTTP/1.0" 200 5794 +cr020r01-3.uah.goweb.net - - [11/Mar/2004:12:59:52 -0800] "GET /ops/SP/play//oops/TWiki/AppendixFileSystem?template=oopsmore¶m1=1.12¶m2=1.12 HTTP/1.0" 200 11355 +cr020r01-3.uah.goweb.net - - [11/Mar/2004:13:00:12 -0800] "GET /ops/SP/play//view/TWiki/WebTopicViewTemplate HTTP/1.0" 200 5420 +cr020r01-3.uah.goweb.net - - [11/Mar/2004:13:00:47 -0800] "GET /ops/SP/play//rdiff/Main/WebHome HTTP/1.0" 200 69197 +cr020r01-3.uah.goweb.net - - [11/Mar/2004:13:00:57 -0800] "GET /ops/SP/play//view/TWiki/WebPreferences?rev=r1.9 HTTP/1.0" 200 7875 +cr020r01-3.uah.goweb.net - - [11/Mar/2004:13:01:21 -0800] "GET /ops/SP/play//rdiff/Main/ConfigurationVariables?rev1=1.2&rev2=1.1 HTTP/1.0" 200 59549 +cr020r01-3.uah.goweb.net - - [11/Mar/2004:13:01:37 -0800] "GET /ops/SP/play//view/Main/AndreaSterbini HTTP/1.0" 200 3891 +cr020r01-3.uah.goweb.net - - [11/Mar/2004:13:01:58 -0800] "GET /ops/SP/play//rdiff/Main/AndreaSterbini HTTP/1.0" 200 5567 +cr020r01-3.uah.goweb.net - - [11/Mar/2004:13:02:22 -0800] "GET /ops/SP/play//rdiff/TWiki/WebNotify HTTP/1.0" 200 11733 +cr020r01-3.uah.goweb.net - - [11/Mar/2004:13:02:42 -0800] "GET /ops/SP/play//rdiff/Main/WebHome?rev1=1.28&rev2=1.27 HTTP/1.0" 200 3577 +cr020r01-3.uah.goweb.net - - [11/Mar/2004:13:03:06 -0800] "GET /ops/SP/play//view/Main/WebHome?skin=print HTTP/1.0" 200 8347 +cr020r01-3.uah.goweb.net - - [11/Mar/2004:13:03:23 -0800] "GET /ops/SP/play//search/Main/SearchResult?search=%5C.*&scope=topic&order=modified&reverse=on®ex=on&nosearch=on HTTP/1.0" 200 43816 +cr020r01-3.uah.goweb.net - - [11/Mar/2004:13:03:48 -0800] "GET /ops/SP/play//view/TWiki/FormattedSearch HTTP/1.0" 200 20420 +cr020r01-3.uah.goweb.net - - [11/Mar/2004:13:04:09 -0800] "GET /ops/SP/play//oops/Main/WebHome?template=oopsmore¶m1=1.28¶m2=1.8 HTTP/1.0" 200 7410 +cr020r01-3.uah.goweb.net - - [11/Mar/2004:13:04:30 -0800] "GET /ops/SP/play//edit/TWiki/TextFormattingFAQ?t=1075982736 HTTP/1.0" 401 12816 +cr020r01-3.uah.goweb.net - - [11/Mar/2004:13:04:52 -0800] "GET /ops/SP/play//edit/Main/Allow_untrusted_routing?topicparent=Main.ConfigurationVariables HTTP/1.0" 401 12816 +cr020r01-3.uah.goweb.net - - [11/Mar/2004:13:05:13 -0800] "GET /ops/SP/play//edit/Main/Smtp_data_init_timeout?topicparent=Main.ConfigurationVariables HTTP/1.0" 401 12816 +cr020r01-3.uah.goweb.net - - [11/Mar/2004:13:05:33 -0800] "GET /ops/SP/play//view/TWiki/AppendixFileSystem?rev=1.10 HTTP/1.0" 200 34910 +cr020r01-3.uah.goweb.net - - [11/Mar/2004:13:05:54 -0800] "GET /ops/SP/play//view/Main/AndreaSterbini?rev=r1.1 HTTP/1.0" 200 3732 +cr020r01-3.uah.goweb.net - - [11/Mar/2004:13:06:17 -0800] "GET /ops/SP/play//view/Know/WebNotify HTTP/1.0" 200 4472 +cr020r01-3.uah.goweb.net - - [11/Mar/2004:13:06:39 -0800] "GET /ops/SP/play//rdiff/Main/PeterThoeny HTTP/1.0" 200 18859 +cr020r01-3.uah.goweb.net - - [11/Mar/2004:13:07:02 -0800] "GET /ops/SP/play//view/Main/WebHome?skin=print&rev=1.25 HTTP/1.0" 200 7762 +cr020r01-3.uah.goweb.net - - [11/Mar/2004:13:07:20 -0800] "GET /ops/SP/play//edit/Main/Relayhost?topicparent=Main.ConfigurationVariables HTTP/1.0" 401 12816 +cr020r01-3.uah.goweb.net - - [11/Mar/2004:13:07:40 -0800] "GET /ops/SP/play//edit/Main/Unknown_virtual_mailbox_reject_code?topicparent=Main.ConfigurationVariables HTTP/1.0" 401 12816 +cr020r01-3.uah.goweb.net - - [11/Mar/2004:13:08:03 -0800] "GET /ops/SP/play//view/TWiki/WebPreferences HTTP/1.0" 200 9109 +cr020r01-3.uah.goweb.net - - [11/Mar/2004:13:08:44 -0800] "GET /ops/SP/play//view/Main/DCC HTTP/1.0" 200 4377 +cr020r01-3.uah.goweb.net - - [11/Mar/2004:13:09:04 -0800] "GET /ops/SP/play//view/Know/WebHome HTTP/1.0" 200 7529 +cr020r01-3.uah.goweb.net - - [11/Mar/2004:13:09:21 -0800] "GET /ops/SP/play//view/Main/WebNotify HTTP/1.0" 200 4449 +cr020r01-3.uah.goweb.net - - [11/Mar/2004:13:09:24 -0800] "GET /ops/SP/play//oops/Main/WebHome?template=oopsmore¶m1=1.28¶m2=1.28 HTTP/1.0" 200 7411 +cr020r01-3.uah.goweb.net - - [11/Mar/2004:13:09:52 -0800] "GET /ops/SP/play//view/Main/PostfixCommands HTTP/1.0" 200 4004 +cr020r01-3.uah.goweb.net - - [11/Mar/2004:13:10:11 -0800] "GET /ops/SP/play//view/TWiki/WebHome HTTP/1.0" 200 15147 +cr020r01-3.uah.goweb.net - - [11/Mar/2004:13:10:27 -0800] "GET /ops/SP/play//view/Main/RBLsHowTo HTTP/1.0" 200 4646 +cr020r01-3.uah.goweb.net - - [11/Mar/2004:13:10:52 -0800] "GET /ops/SP/play//view/Main/WebTopicList HTTP/1.0" 200 7461 +cr020r01-3.uah.goweb.net - - [11/Mar/2004:13:11:09 -0800] "GET /ops/SP/play//view/Main/WebHome?rev=1.27 HTTP/1.0" 200 10313 +cr020r01-3.uah.goweb.net - - [11/Mar/2004:13:11:41 -0800] "GET /ops/SP/play//view/Main/ConfigurationVariables HTTP/1.0" 200 58169 +4.37.97.186 - - [11/Mar/2004:13:12:54 -0800] "GET /pipermail/webber/2004-January/000000.jsp HTTP/1.1" 200 2446 +12.22.207.235 - - [11/Mar/2004:13:18:15 -0800] "GET /SpamAssassin.jsp HTTP/1.1" 200 7368 +archserve.id.ucsb.edu - - [11/Mar/2004:13:22:32 -0800] "GET /razor.jsp HTTP/1.1" 200 2869 +archserve.id.ucsb.edu - - [11/Mar/2004:13:22:32 -0800] "GET /favicon.ico HTTP/1.1" 200 1078 +2-110.tnr.on.ca - - [11/Mar/2004:13:24:03 -0800] "GET /ie.htm HTTP/1.1" 200 3518 +2-110.tnr.on.ca - - [11/Mar/2004:13:24:04 -0800] "GET /images/image005.jpg HTTP/1.1" 200 21125 +2-110.tnr.on.ca - - [11/Mar/2004:13:24:04 -0800] "GET /images/image004.jpg HTTP/1.1" 200 10936 +2-110.tnr.on.ca - - [11/Mar/2004:13:24:04 -0800] "GET /images/msgops.JPG HTTP/1.1" 200 7939 +2-110.tnr.on.ca - - [11/Mar/2004:13:26:38 -0800] "GET /images/image005.jpg HTTP/1.1" 304 - +2-110.tnr.on.ca - - [11/Mar/2004:13:26:38 -0800] "GET /images/image004.jpg HTTP/1.1" 304 - +2-110.tnr.on.ca - - [11/Mar/2004:13:26:38 -0800] "GET /images/msgops.JPG HTTP/1.1" 304 - +lj1024.passgo.com - - [11/Mar/2004:13:27:05 -0800] "GET /robots.txt HTTP/1.0" 200 68 +lj1212.passgo.com - - [11/Mar/2004:13:27:05 -0800] "GET / HTTP/1.0" 200 3169 +2-110.tnr.on.ca - - [11/Mar/2004:14:14:44 -0800] "GET /ie.htm HTTP/1.1" 200 3518 +2-110.tnr.on.ca - - [11/Mar/2004:14:14:47 -0800] "GET /images/image005.jpg HTTP/1.1" 200 21125 +2-110.tnr.on.ca - - [11/Mar/2004:14:14:47 -0800] "GET /images/msgops.JPG HTTP/1.1" 200 7939 +2-110.tnr.on.ca - - [11/Mar/2004:14:14:50 -0800] "GET /images/image004.jpg HTTP/1.1" 200 10936 +favr.go.de - - [11/Mar/2004:14:22:08 -0800] "GET /robots.txt HTTP/1.0" 200 68 +favr.go.de - - [11/Mar/2004:14:22:09 -0800] "GET /ops/SP/play//view/Main/WebSearch HTTP/1.0" 200 9263 +favr.go.de - - [11/Mar/2004:14:26:26 -0800] "GET /ops/SP/play//view/Sandbox/WebHome HTTP/1.0" 200 8605 +favr.go.de - - [11/Mar/2004:14:28:53 -0800] "GET /ops/SP/play//view/Sandbox/WebChanges HTTP/1.0" 200 9622 +favr.go.de - - [11/Mar/2004:14:29:44 -0800] "GET /ops/SP/play//view/Sandbox/WebPreferences HTTP/1.0" 200 8380 +favr.go.de - - [11/Mar/2004:14:29:52 -0800] "GET /ops/SP/play//view/Main/WebStatistics HTTP/1.0" 200 8331 +favr.go.de - - [11/Mar/2004:14:30:51 -0800] "GET /ops/SP/play//view/Main/WebTopicList HTTP/1.0" 200 7461 +favr.go.de - - [11/Mar/2004:14:31:43 -0800] "GET /ops/SP/play//view/Main/WebPreferences HTTP/1.0" 200 8793 +lj1008.passgo.com - - [11/Mar/2004:14:31:48 -0800] "GET /ops/SP/play//oops/TWiki/WikiWikiClones HTTP/1.0" 200 209 +favr.go.de - - [11/Mar/2004:14:33:01 -0800] "GET /ops/SP/play//view/Main/WebNotify HTTP/1.0" 200 4449 +64-249-27-114.client.dsl.net - - [11/Mar/2004:14:53:12 -0800] "GET /SpamAssassin.jsp HTTP/1.1" 200 7368 +pd9eb1396.dip.t-dialin.net - - [11/Mar/2004:15:17:08 -0800] "GET /AmavisNew.jsp HTTP/1.1" 200 2300 +10.0.0.176 - - [11/Mar/2004:15:51:49 -0800] "GET / HTTP/1.1" 304 - +10.0.0.176 - - [11/Mar/2004:15:52:07 -0800] "GET /ops/SP/play//view/Main/WebHome HTTP/1.1" 200 10419 +10.0.0.176 - - [11/Mar/2004:15:52:07 -0800] "GET /go/bin/test/TWikiLogos/twikiRobot46x50.gif HTTP/1.1" 304 - +10.0.0.176 - - [11/Mar/2004:15:52:12 -0800] "GET /ops/SP/play//view/Main/WebHome HTTP/1.1" 200 10419 +10.0.0.176 - - [11/Mar/2004:15:52:12 -0800] "GET /go/bin/test/TWikiLogos/twikiRobot46x50.gif HTTP/1.1" 304 - +10.0.0.176 - - [11/Mar/2004:15:52:18 -0800] "GET /forplus/mailgraph2.cgi HTTP/1.1" 200 2987 +10.0.0.176 - - [11/Mar/2004:15:52:19 -0800] "GET /forplus/mailgraph.cgi/mailgraph_0.png HTTP/1.1" 200 6329 +10.0.0.176 - - [11/Mar/2004:15:52:19 -0800] "GET /forplus/mailgraph.cgi/mailgraph_1.png HTTP/1.1" 200 8771 +10.0.0.176 - - [11/Mar/2004:15:52:19 -0800] "GET /forplus/mailgraph.cgi/mailgraph_0_err.png HTTP/1.1" 200 6340 +10.0.0.176 - - [11/Mar/2004:15:52:19 -0800] "GET /forplus/mailgraph.cgi/mailgraph_1_err.png HTTP/1.1" 200 6846 +10.0.0.176 - - [11/Mar/2004:15:52:19 -0800] "GET /forplus/mailgraph.cgi/mailgraph_2.png HTTP/1.1" 200 9523 +10.0.0.176 - - [11/Mar/2004:15:52:19 -0800] "GET /forplus/mailgraph.cgi/mailgraph_2_err.png HTTP/1.1" 200 6996 +10.0.0.176 - - [11/Mar/2004:15:52:19 -0800] "GET /forplus/mailgraph.cgi/mailgraph_3.png HTTP/1.1" 200 6427 +10.0.0.176 - - [11/Mar/2004:15:52:19 -0800] "GET /forplus/mailgraph.cgi/mailgraph_3_err.png HTTP/1.1" 200 5598 +10.0.0.176 - - [11/Mar/2004:15:52:37 -0800] "GET /ststats/index.jsp HTTP/1.1" 304 - +10.0.0.176 - - [11/Mar/2004:15:52:38 -0800] "GET /ststats/stats-spam.1day.png HTTP/1.1" 200 3241 +10.0.0.176 - - [11/Mar/2004:15:52:38 -0800] "GET /ststats/stats-spam.1week.png HTTP/1.1" 200 3327 +10.0.0.176 - - [11/Mar/2004:15:52:38 -0800] "GET /ststats/stats-spam-ratio.1week.png HTTP/1.1" 200 2434 +10.0.0.176 - - [11/Mar/2004:15:52:38 -0800] "GET /ststats/stats-hashes.1week.png HTTP/1.1" 200 1676 +10.0.0.176 - - [11/Mar/2004:15:52:38 -0800] "GET /ststats/stats-spam-ratio.1month.png HTTP/1.1" 200 2029 +10.0.0.176 - - [11/Mar/2004:15:52:38 -0800] "GET /ststats/stats-hashes.1month.png HTTP/1.1" 200 1604 +10.0.0.176 - - [11/Mar/2004:15:52:38 -0800] "GET /ststats/stats-spam.1month.png HTTP/1.1" 200 2640 +10.0.0.176 - - [11/Mar/2004:15:52:38 -0800] "GET /ststats/stats-spam.1year.png HTTP/1.1" 200 2251 +10.0.0.176 - - [11/Mar/2004:15:52:38 -0800] "GET /ststats/stats-spam-ratio.1year.png HTTP/1.1" 200 1899 +10.0.0.176 - - [11/Mar/2004:15:52:38 -0800] "GET /ststats/stats-hashes.1year.png HTTP/1.1" 200 1556 +10.0.0.176 - - [11/Mar/2004:15:52:39 -0800] "GET /ststats/stats-spam-ratio.1day.png HTTP/1.1" 200 2243 +lj1105.passgo.com - - [11/Mar/2004:16:02:37 -0800] "GET /ops/SP/play//oops/TWiki/1000 HTTP/1.0" 200 209 +wc01.piwa.pow.fr - - [11/Mar/2004:16:12:59 -0800] "GET /ie.htm HTTP/1.1" 200 3518 +wc01.piwa.pow.fr - - [11/Mar/2004:16:13:02 -0800] "GET /images/image005.jpg HTTP/1.1" 200 21125 +wc01.piwa.pow.fr - - [11/Mar/2004:16:13:02 -0800] "GET /images/msgops.JPG HTTP/1.1" 200 7939 +wc03.mtnk.rnc.net.cable.rogers.com - - [11/Mar/2004:16:13:03 -0800] "GET /images/image004.jpg HTTP/1.1" 200 10936 +206-15-133-154.dialup.ziplink.net - - [11/Mar/2004:16:33:23 -0800] "HEAD /ops/SP/play//view/Main/SpamAssassinDeleting HTTP/1.1" 200 0 +lj1024.passgo.com - - [11/Mar/2004:18:11:39 -0800] "GET /robots.txt HTTP/1.0" 200 68 +lj1008.passgo.com - - [11/Mar/2004:18:11:40 -0800] "GET /ops/SP/play//oops/Main/Smtpd_recipient_limit HTTP/1.0" 200 209 +ipcorp-c8b07af1.terraempresas.com.br - - [11/Mar/2004:18:31:35 -0800] "GET /SpamAssassin.jsp HTTP/1.1" 200 7368 +66-194-6-79.gen.twtelecom.net - - [11/Mar/2004:18:57:52 -0800] "GET / HTTP/1.1" 200 3169 +lj1223.passgo.com - - [11/Mar/2004:20:12:24 -0800] "GET /ops/SP/play//view/Main/MikeMannix HTTP/1.0" 200 3674 +216-160-111-121.tukw.qwest.net - - [11/Mar/2004:20:49:32 -0800] "GET /ststats/ HTTP/1.1" 200 2955 +216-160-111-121.tukw.qwest.net - - [11/Mar/2004:20:49:37 -0800] "GET /ststats/stats-spam.1day.png HTTP/1.1" 200 3091 +216-160-111-121.tukw.qwest.net - - [11/Mar/2004:20:49:37 -0800] "GET /ststats/stats-spam-ratio.1day.png HTTP/1.1" 200 2230 +216-160-111-121.tukw.qwest.net - - [11/Mar/2004:20:49:37 -0800] "GET /ststats/stats-spam-ratio.1week.png HTTP/1.1" 200 2388 +216-160-111-121.tukw.qwest.net - - [11/Mar/2004:20:49:37 -0800] "GET /ststats/stats-spam.1week.png HTTP/1.1" 200 3440 +216-160-111-121.tukw.qwest.net - - [11/Mar/2004:20:49:38 -0800] "GET /ststats/stats-hashes.1week.png HTTP/1.1" 200 1659 +216-160-111-121.tukw.qwest.net - - [11/Mar/2004:20:49:38 -0800] "GET /ststats/stats-spam.1month.png HTTP/1.1" 200 2662 +216-160-111-121.tukw.qwest.net - - [11/Mar/2004:20:49:38 -0800] "GET /ststats/stats-spam-ratio.1month.png HTTP/1.1" 200 2064 +216-160-111-121.tukw.qwest.net - - [11/Mar/2004:20:49:38 -0800] "GET /ststats/stats-hashes.1month.png HTTP/1.1" 200 1624 +216-160-111-121.tukw.qwest.net - - [11/Mar/2004:20:49:38 -0800] "GET /ststats/stats-spam.1year.png HTTP/1.1" 200 2243 +216-160-111-121.tukw.qwest.net - - [11/Mar/2004:20:49:38 -0800] "GET /ststats/stats-spam-ratio.1year.png HTTP/1.1" 200 1879 +216-160-111-121.tukw.qwest.net - - [11/Mar/2004:20:49:38 -0800] "GET /ststats/stats-hashes.1year.png HTTP/1.1" 200 1575 +lj1073.passgo.com - - [11/Mar/2004:20:59:05 -0800] "GET /ops/SP/play//oops/TWiki/TWikiPlannedFeatures HTTP/1.0" 200 209 +mmscrm07-2.uah.goweb.net - - [11/Mar/2004:23:56:31 -0800] "GET /robots.txt HTTP/1.0" 200 68 +66-194-6-71.gen.twtelecom.net - - [12/Mar/2004:01:30:44 -0800] "GET / HTTP/1.1" 200 3169 +lj1024.passgo.com - - [12/Mar/2004:02:27:29 -0800] "GET /robots.txt HTTP/1.0" 200 68 +lj1123.passgo.com - - [12/Mar/2004:02:27:32 -0800] "GET /ops/SP/play//view/Sandbox/WebIndex HTTP/1.0" 200 8667 +195.11.231.210 - - [12/Mar/2004:03:32:56 -0800] "GET /mailman/listinfo/webber HTTP/1.0" 200 6032 +80.58.33.42.proxycache.rima-tde.net - - [12/Mar/2004:04:57:20 -0800] "GET /ops/SP/play//view/Main/WebHome HTTP/1.0" 200 10392 +80.58.33.42.proxycache.rima-tde.net - - [12/Mar/2004:04:57:21 -0800] "GET /go/bin/test/TWikiLogos/twikiRobot46x50.gif HTTP/1.1" 200 2877 +80.58.33.42.proxycache.rima-tde.net - - [12/Mar/2004:04:57:56 -0800] "GET /ops/SP/play//view/Main/LinksOfUse HTTP/1.1" 200 4534 +200.100.10.5 - - [12/Mar/2004:04:59:21 -0800] "GET /ops/SP/play//view/Main/SpamAssassinUsingRazorAndDCC HTTP/1.1" 200 7435 +200.100.10.5 - - [12/Mar/2004:04:59:21 -0800] "GET /go/bin/test/TWikiLogos/twikiRobot46x50.gif HTTP/1.1" 200 2877 +lj1115.passgo.com - - [12/Mar/2004:05:03:19 -0800] "GET /ops/SP/play//view/Main/TWikiAdminGroup HTTP/1.0" 200 4156 +lj1008.passgo.com - - [12/Mar/2004:05:19:31 -0800] "GET /ops/SP/play//oops/TWiki/Mana HTTP/1.0" 200 209 +71.134.70.5 - - [12/Mar/2004:05:25:20 -0800] "GET /mailman/listinfo/cncce HTTP/1.1" 200 6208 +71.134.70.5 - - [12/Mar/2004:05:25:24 -0800] "GET /icons/mailman.jpg HTTP/1.1" 200 2022 +71.134.70.5 - - [12/Mar/2004:05:25:24 -0800] "GET /icons/PythonPowered.png HTTP/1.1" 200 945 +71.134.70.5 - - [12/Mar/2004:05:25:25 -0800] "GET /icons/gnu-head-tiny.jpg HTTP/1.1" 200 3049 +200.100.10.5 - - [12/Mar/2004:05:44:35 -0800] "GET /ops/SP/play//view/Main/SpamAssassinUsingRazorAndDCC HTTP/1.1" 200 7435 +200.100.10.5 - - [12/Mar/2004:05:44:35 -0800] "GET /go/bin/test/TWikiLogos/twikiRobot46x50.gif HTTP/1.1" 200 2877 +200.100.10.5 - - [12/Mar/2004:05:44:50 -0800] "GET /ops/SP/play//view/Main/DCC HTTP/1.1" 200 4396 +200.100.10.5 - - [12/Mar/2004:05:44:51 -0800] "GET /go/bin/test/TWikiLogos/twikiRobot46x50.gif HTTP/1.1" 304 - +200.100.10.5 - - [12/Mar/2004:05:51:36 -0800] "GET /favicon.ico HTTP/1.1" 200 1078 +vlp181.vlp.fi - - [12/Mar/2004:08:33:32 -0800] "GET /razor.jsp HTTP/1.1" 200 2869 +lj1024.passgo.com - - [12/Mar/2004:09:12:01 -0800] "GET /robots.txt HTTP/1.0" 200 68 +lj1223.passgo.com - - [12/Mar/2004:09:12:02 -0800] "GET /ops/SP/play//oops/Main/Mi HTTP/1.0" 200 209 +10.0.0.176 - - [12/Mar/2004:11:01:26 -0800] "GET / HTTP/1.1" 304 - +10.0.0.176 - - [12/Mar/2004:11:01:28 -0800] "GET /forplus/mailgraph2.cgi HTTP/1.1" 200 2987 +10.0.0.176 - - [12/Mar/2004:11:01:29 -0800] "GET /forplus/mailgraph.cgi/mailgraph_0.png HTTP/1.1" 200 6405 +10.0.0.176 - - [12/Mar/2004:11:01:29 -0800] "GET /forplus/mailgraph.cgi/mailgraph_0_err.png HTTP/1.1" 200 6413 +10.0.0.176 - - [12/Mar/2004:11:01:29 -0800] "GET /forplus/mailgraph.cgi/mailgraph_1_err.png HTTP/1.1" 200 6952 +10.0.0.176 - - [12/Mar/2004:11:01:29 -0800] "GET /forplus/mailgraph.cgi/mailgraph_1.png HTTP/1.1" 200 8715 +10.0.0.176 - - [12/Mar/2004:11:01:29 -0800] "GET /forplus/mailgraph.cgi/mailgraph_2_err.png HTTP/1.1" 200 7001 +10.0.0.176 - - [12/Mar/2004:11:01:29 -0800] "GET /forplus/mailgraph.cgi/mailgraph_2.png HTTP/1.1" 200 9514 +10.0.0.176 - - [12/Mar/2004:11:01:29 -0800] "GET /forplus/mailgraph.cgi/mailgraph_3.png HTTP/1.1" 200 6644 +10.0.0.176 - - [12/Mar/2004:11:01:29 -0800] "GET /forplus/mailgraph.cgi/mailgraph_3_err.png HTTP/1.1" 200 5554 +fassys.org - - [12/Mar/2004:11:16:36 -0800] "GET /ststats/ HTTP/1.0" 200 2955 +fassys.org - - [12/Mar/2004:11:16:55 -0800] "GET /ststats/stats-spam.1day.png HTTP/1.0" 200 2925 +fassys.org - - [12/Mar/2004:11:16:55 -0800] "GET /ststats/stats-spam-ratio.1day.png HTTP/1.0" 200 2347 +fassys.org - - [12/Mar/2004:11:16:55 -0800] "GET /ststats/stats-spam.1week.png HTTP/1.0" 200 3431 +fassys.org - - [12/Mar/2004:11:16:55 -0800] "GET /ststats/stats-spam-ratio.1week.png HTTP/1.0" 200 2380 +fassys.org - - [12/Mar/2004:11:16:55 -0800] "GET /ststats/stats-hashes.1week.png HTTP/1.0" 200 1658 +fassys.org - - [12/Mar/2004:11:16:55 -0800] "GET /ststats/stats-spam.1month.png HTTP/1.0" 200 2685 +fassys.org - - [12/Mar/2004:11:16:56 -0800] "GET /ststats/stats-spam-ratio.1month.png HTTP/1.0" 200 2082 +fassys.org - - [12/Mar/2004:11:16:56 -0800] "GET /ststats/stats-hashes.1month.png HTTP/1.0" 200 1637 +fassys.org - - [12/Mar/2004:11:16:56 -0800] "GET /ststats/stats-spam.1year.png HTTP/1.0" 200 2211 +fassys.org - - [12/Mar/2004:11:16:56 -0800] "GET /ststats/stats-spam-ratio.1year.png HTTP/1.0" 200 1853 +fassys.org - - [12/Mar/2004:11:16:56 -0800] "GET /ststats/stats-hashes.1year.png HTTP/1.0" 200 1572 +67.131.107.5 - - [12/Mar/2004:11:39:14 -0800] "GET / HTTP/1.1" 200 3169 +67.131.107.5 - - [12/Mar/2004:11:39:25 -0800] "GET /ops/SP/play//view/Main/WebHome HTTP/1.1" 200 10419 +67.131.107.5 - - [12/Mar/2004:11:39:31 -0800] "GET /go/bin/test/TWikiLogos/twikiRobot46x50.gif HTTP/1.1" 200 2877 +10.0.0.176 - - [12/Mar/2004:12:23:11 -0800] "GET / HTTP/1.1" 304 - +10.0.0.176 - - [12/Mar/2004:12:23:17 -0800] "GET /forplus/mailgraph2.cgi HTTP/1.1" 200 2987 +10.0.0.176 - - [12/Mar/2004:12:23:18 -0800] "GET /forplus/mailgraph.cgi/mailgraph_0_err.png HTTP/1.1" 200 6324 +10.0.0.176 - - [12/Mar/2004:12:23:18 -0800] "GET /forplus/mailgraph.cgi/mailgraph_1.png HTTP/1.1" 200 8964 +10.0.0.176 - - [12/Mar/2004:12:23:18 -0800] "GET /forplus/mailgraph.cgi/mailgraph_0.png HTTP/1.1" 200 6225 +10.0.0.176 - - [12/Mar/2004:12:23:18 -0800] "GET /forplus/mailgraph.cgi/mailgraph_2_err.png HTTP/1.1" 200 7001 +10.0.0.176 - - [12/Mar/2004:12:23:18 -0800] "GET /forplus/mailgraph.cgi/mailgraph_2.png HTTP/1.1" 200 9514 +10.0.0.176 - - [12/Mar/2004:12:23:18 -0800] "GET /forplus/mailgraph.cgi/mailgraph_1_err.png HTTP/1.1" 200 6949 +10.0.0.176 - - [12/Mar/2004:12:23:18 -0800] "GET /forplus/mailgraph.cgi/mailgraph_3.png HTTP/1.1" 200 6644 +10.0.0.176 - - [12/Mar/2004:12:23:18 -0800] "GET /forplus/mailgraph.cgi/mailgraph_3_err.png HTTP/1.1" 200 5554 +10.0.0.176 - - [12/Mar/2004:12:23:40 -0800] "GET /ststats/index.jsp HTTP/1.1" 304 - +10.0.0.176 - - [12/Mar/2004:12:23:41 -0800] "GET /ststats/stats-spam.1day.png HTTP/1.1" 200 2964 +10.0.0.176 - - [12/Mar/2004:12:23:41 -0800] "GET /ststats/stats-spam-ratio.1day.png HTTP/1.1" 200 2341 +10.0.0.176 - - [12/Mar/2004:12:23:41 -0800] "GET /ststats/stats-spam-ratio.1week.png HTTP/1.1" 200 2346 +10.0.0.176 - - [12/Mar/2004:12:23:41 -0800] "GET /ststats/stats-spam.1week.png HTTP/1.1" 200 3438 +10.0.0.176 - - [12/Mar/2004:12:23:41 -0800] "GET /ststats/stats-hashes.1week.png HTTP/1.1" 200 1670 +10.0.0.176 - - [12/Mar/2004:12:23:41 -0800] "GET /ststats/stats-spam.1month.png HTTP/1.1" 200 2651 +10.0.0.176 - - [12/Mar/2004:12:23:41 -0800] "GET /ststats/stats-spam-ratio.1month.png HTTP/1.1" 200 2023 +10.0.0.176 - - [12/Mar/2004:12:23:41 -0800] "GET /ststats/stats-hashes.1month.png HTTP/1.1" 200 1636 +10.0.0.176 - - [12/Mar/2004:12:23:41 -0800] "GET /ststats/stats-spam.1year.png HTTP/1.1" 200 2262 +10.0.0.176 - - [12/Mar/2004:12:23:41 -0800] "GET /ststats/stats-spam-ratio.1year.png HTTP/1.1" 200 1906 +10.0.0.176 - - [12/Mar/2004:12:23:41 -0800] "GET /ststats/stats-hashes.1year.png HTTP/1.1" 200 1582 +216.139.185.45 - - [12/Mar/2004:13:04:01 -0800] "GET /mailman/listinfo/webber HTTP/1.1" 200 6051 +pd95f99f2.dip.t-dialin.net - - [12/Mar/2004:13:18:57 -0800] "GET /razor.jsp HTTP/1.1" 200 2869 +d97082.upc-d.chello.nl - - [12/Mar/2004:13:25:45 -0800] "GET /SpamAssassin.jsp HTTP/1.1" 200 7368 diff --git a/rxjava/src/test/resources/expected_clob b/rxjava/src/test/resources/expected_clob new file mode 100644 index 0000000000..d7bc560556 --- /dev/null +++ b/rxjava/src/test/resources/expected_clob @@ -0,0 +1,1546 @@ +64.242.88.10 - - [07/Mar/2004:16:05:49 -0800] "GET /ops/SP/play//edit/Main/Double_bounce_sender?topicparent=Main.ConfigurationVariables HTTP/1.1" 401 12846 +64.242.88.10 - - [07/Mar/2004:16:06:51 -0800] "GET /ops/SP/play//rdiff/TWiki/NewUserTemplate?rev1=1.3&rev2=1.2 HTTP/1.1" 200 4523 +64.242.88.10 - - [07/Mar/2004:16:10:02 -0800] "GET /mailman/listinfo/hsdivision HTTP/1.1" 200 6291 +64.242.88.10 - - [07/Mar/2004:16:11:58 -0800] "GET /ops/SP/play//view/TWiki/WikiSyntax HTTP/1.1" 200 7352 +64.242.88.10 - - [07/Mar/2004:16:20:55 -0800] "GET /ops/SP/play//view/Main/DCCAndPostFix HTTP/1.1" 200 5253 +64.242.88.10 - - [07/Mar/2004:16:23:12 -0800] "GET /ops/SP/play//oops/TWiki/AppendixFileSystem?template=oopsmore¶m1=1.12¶m2=1.12 HTTP/1.1" 200 11382 +64.242.88.10 - - [07/Mar/2004:16:24:16 -0800] "GET /ops/SP/play//view/Main/PeterThoeny HTTP/1.1" 200 4924 +64.242.88.10 - - [07/Mar/2004:16:29:16 -0800] "GET /ops/SP/play//edit/Main/Header_checks?topicparent=Main.ConfigurationVariables HTTP/1.1" 401 12851 +64.242.88.10 - - [07/Mar/2004:16:30:29 -0800] "GET /ops/SP/play//attach/Main/OfficeLocations HTTP/1.1" 401 12851 +64.242.88.10 - - [07/Mar/2004:16:31:48 -0800] "GET /ops/SP/play//view/TWiki/WebTopicEditTemplate HTTP/1.1" 200 3732 +64.242.88.10 - - [07/Mar/2004:16:32:50 -0800] "GET /ops/SP/play//view/Main/WebChanges HTTP/1.1" 200 40520 +64.242.88.10 - - [07/Mar/2004:16:33:53 -0800] "GET /ops/SP/play//edit/Main/Smtpd_etrn_restrictions?topicparent=Main.ConfigurationVariables HTTP/1.1" 401 12851 +64.242.88.10 - - [07/Mar/2004:16:35:19 -0800] "GET /mailman/listinfo/business HTTP/1.1" 200 6379 +64.242.88.10 - - [07/Mar/2004:16:36:22 -0800] "GET /ops/SP/play//rdiff/Main/WebIndex?rev1=1.2&rev2=1.1 HTTP/1.1" 200 46373 +64.242.88.10 - - [07/Mar/2004:16:37:27 -0800] "GET /ops/SP/play//view/TWiki/DontNotify HTTP/1.1" 200 4140 +64.242.88.10 - - [07/Mar/2004:16:39:24 -0800] "GET /ops/SP/play//view/Main/TokyoOffice HTTP/1.1" 200 3853 +64.242.88.10 - - [07/Mar/2004:16:43:54 -0800] "GET /ops/SP/play//view/Main/MikeMannix HTTP/1.1" 200 3686 +64.242.88.10 - - [07/Mar/2004:16:45:56 -0800] "GET /ops/SP/play//attach/Main/PostfixCommands HTTP/1.1" 401 12846 +64.242.88.10 - - [07/Mar/2004:16:47:12 -0800] "GET /robots.txt HTTP/1.1" 200 68 +64.242.88.10 - - [07/Mar/2004:16:47:46 -0800] "GET /ops/SP/play//rdiff/Know/ReadmeFirst?rev1=1.5&rev2=1.4 HTTP/1.1" 200 5724 +64.242.88.10 - - [07/Mar/2004:16:49:04 -0800] "GET /ops/SP/play//view/Main/TWikiGroups?rev=1.2 HTTP/1.1" 200 5162 +64.242.88.10 - - [07/Mar/2004:16:50:54 -0800] "GET /ops/SP/play//rdiff/Main/ConfigurationVariables HTTP/1.1" 200 59679 +64.242.88.10 - - [07/Mar/2004:16:52:35 -0800] "GET /ops/SP/play//edit/Main/Flush_service_name?topicparent=Main.ConfigurationVariables HTTP/1.1" 401 12851 +64.242.88.10 - - [07/Mar/2004:16:53:46 -0800] "GET /ops/SP/play//rdiff/TWiki/TWikiRegistration HTTP/1.1" 200 34395 +64.242.88.10 - - [07/Mar/2004:16:54:55 -0800] "GET /ops/SP/play//rdiff/Main/NicholasLee HTTP/1.1" 200 7235 +64.242.88.10 - - [07/Mar/2004:16:56:39 -0800] "GET /ops/SP/play//view/Sandbox/WebHome?rev=1.6 HTTP/1.1" 200 8545 +64.242.88.10 - - [07/Mar/2004:16:58:54 -0800] "GET /mailman/listinfo/administration HTTP/1.1" 200 6459 +lordgun.org - - [07/Mar/2004:17:01:53 -0800] "GET /razor.jsp HTTP/1.1" 200 2869 +64.242.88.10 - - [07/Mar/2004:17:09:01 -0800] "GET /ops/SP/play//search/Main/SearchResult?scope=text®ex=on&search=Joris%20*Benschop[^A-Za-z] HTTP/1.1" 200 4284 +64.242.88.10 - - [07/Mar/2004:17:10:20 -0800] "GET /ops/SP/play//oops/TWiki/TextFormattingRules?template=oopsmore¶m1=1.37¶m2=1.37 HTTP/1.1" 200 11400 +64.242.88.10 - - [07/Mar/2004:17:13:50 -0800] "GET /ops/SP/play//edit/TWiki/DefaultPlugin?t=1078688936 HTTP/1.1" 401 12846 +64.242.88.10 - - [07/Mar/2004:17:16:00 -0800] "GET /ops/SP/play//search/Main/?scope=topic®ex=on&search=^g HTTP/1.1" 200 3675 +64.242.88.10 - - [07/Mar/2004:17:17:27 -0800] "GET /ops/SP/play//search/TWiki/?scope=topic®ex=on&search=^d HTTP/1.1" 200 5773 +lj1036.passgo.com - - [07/Mar/2004:17:18:36 -0800] "GET /robots.txt HTTP/1.0" 200 68 +lj1090.passgo.com - - [07/Mar/2004:17:18:41 -0800] "GET /ops/SP/play//view/Main/LondonOffice HTTP/1.0" 200 3860 +64.242.88.10 - - [07/Mar/2004:17:21:44 -0800] "GET /ops/SP/play//attach/TWiki/TablePlugin HTTP/1.1" 401 12846 +64.242.88.10 - - [07/Mar/2004:17:22:49 -0800] "GET /ops/SP/play//view/TWiki/ManagingWebs?rev=1.22 HTTP/1.1" 200 9310 +64.242.88.10 - - [07/Mar/2004:17:23:54 -0800] "GET /ops/SP/play//statistics/Main HTTP/1.1" 200 808 +64.242.88.10 - - [07/Mar/2004:17:26:30 -0800] "GET /ops/SP/play//view/TWiki/WikiCulture HTTP/1.1" 200 5935 +64.242.88.10 - - [07/Mar/2004:17:27:37 -0800] "GET /ops/SP/play//edit/Main/WebSearch?t=1078669682 HTTP/1.1" 401 12846 +64.242.88.10 - - [07/Mar/2004:17:28:45 -0800] "GET /ops/SP/play//oops/TWiki/ResetPassword?template=oopsmore¶m1=1.4¶m2=1.4 HTTP/1.1" 200 11281 +64.242.88.10 - - [07/Mar/2004:17:29:59 -0800] "GET /ops/SP/play//view/TWiki/ManagingWebs?skin=print HTTP/1.1" 200 8806 +64.242.88.10 - - [07/Mar/2004:17:31:39 -0800] "GET /ops/SP/play//edit/Main/UvscanAndPostFix?topicparent=Main.WebHome HTTP/1.1" 401 12846 +64.242.88.10 - - [07/Mar/2004:17:35:35 -0800] "GET /ops/SP/play//view/TWiki/KlausWriessnegger HTTP/1.1" 200 3848 +64.242.88.10 - - [07/Mar/2004:17:39:39 -0800] "GET /ops/SP/play//view/Main/SpamAssassin HTTP/1.1" 200 4081 +64.242.88.10 - - [07/Mar/2004:17:42:15 -0800] "GET /ops/SP/play//oops/TWiki/RichardDonkin?template=oopsmore¶m1=1.2¶m2=1.2 HTTP/1.1" 200 11281 +64.242.88.10 - - [07/Mar/2004:17:46:17 -0800] "GET /ops/SP/play//rdiff/TWiki/AlWilliams?rev1=1.3&rev2=1.2 HTTP/1.1" 200 4485 +64.242.88.10 - - [07/Mar/2004:17:47:43 -0800] "GET /ops/SP/play//rdiff/TWiki/AlWilliams?rev1=1.2&rev2=1.1 HTTP/1.1" 200 5234 +64.242.88.10 - - [07/Mar/2004:17:50:44 -0800] "GET /ops/SP/play//view/TWiki/SvenDowideit HTTP/1.1" 200 3616 +64.242.88.10 - - [07/Mar/2004:17:53:45 -0800] "GET /ops/SP/play//search/Main/SearchResult?scope=text®ex=on&search=Office%20*Locations[^A-Za-z] HTTP/1.1" 200 7771 +64.242.88.10 - - [07/Mar/2004:17:56:54 -0800] "GET /ops/SP/play//view/TWiki/TextFormattingRules?rev=r1.31 HTTP/1.1" 200 23338 +64.242.88.10 - - [07/Mar/2004:17:58:00 -0800] "GET /ops/SP/play//edit/Main/KevinWGagel?t=1078670331 HTTP/1.1" 401 12846 +64.242.88.10 - - [07/Mar/2004:18:00:09 -0800] "GET /ops/SP/play//edit/Main/Virtual_mailbox_lock?topicparent=Main.ConfigurationVariables HTTP/1.1" 401 12846 +64.242.88.10 - - [07/Mar/2004:18:02:10 -0800] "GET /ops/SP/play//view/Main/WebPreferences HTTP/1.1" 200 8820 +64.242.88.10 - - [07/Mar/2004:18:04:05 -0800] "GET /ops/SP/play//view/TWiki/WikiWord?rev=1.3 HTTP/1.1" 200 6816 +lj1125.passgo.com - - [07/Mar/2004:18:06:14 -0800] "GET /ops/SP/play//oops/Sandbox/WebChanges HTTP/1.0" 200 209 +64.242.88.10 - - [07/Mar/2004:18:09:00 -0800] "GET /ops/SP/play//rdiff/Main/TWikiGuest HTTP/1.1" 200 11314 +64.242.88.10 - - [07/Mar/2004:18:10:09 -0800] "GET /ops/SP/play//edit/TWiki/TWikiVariables?t=1078684115 HTTP/1.1" 401 12846 +d207-6-9-183.bchsia.telus.net - - [07/Mar/2004:18:10:18 -0800] "GET /pipermail/cncce/2004-January/000001.jsp HTTP/1.1" 200 3095 +d207-6-9-183.bchsia.telus.net - - [07/Mar/2004:18:10:20 -0800] "GET /pipermail/cncce/2004-January/000002.jsp HTTP/1.1" 200 3810 +64.242.88.10 - - [07/Mar/2004:18:17:26 -0800] "GET /ops/SP/play//rdiff/TWiki/WikiWord?rev1=1.4&rev2=1.3 HTTP/1.1" 200 6948 +64.242.88.10 - - [07/Mar/2004:18:19:01 -0800] "GET /ops/SP/play//edit/Main/TWikiPreferences?topicparent=Main.WebHome HTTP/1.1" 401 12846 +d207-6-9-183.bchsia.telus.net - - [07/Mar/2004:18:19:16 -0800] "GET /pipermail/cncce/2004-January.txt HTTP/1.1" 200 3376 +64.242.88.10 - - [07/Mar/2004:18:22:52 -0800] "GET /ops/SP/play//search/Main/SearchResult?scope=text®ex=on&search=Web%20*Statistics[^A-Za-z] HTTP/1.1" 200 3584 +64.242.88.10 - - [07/Mar/2004:18:26:32 -0800] "GET /ops/SP/play//rdiff/TWiki/PeterFokkinga?rev1=1.4&rev2=1.3 HTTP/1.1" 200 4548 +64.242.88.10 - - [07/Mar/2004:18:32:39 -0800] "GET /mailman/listinfo/dentalstudies HTTP/1.1" 200 6345 +64.242.88.10 - - [07/Mar/2004:18:34:42 -0800] "GET /ops/SP/play//view/Main/TWikiGuest HTTP/1.1" 200 4449 +64.242.88.10 - - [07/Mar/2004:18:42:29 -0800] "GET /ops/SP/play//attach/Main/TWikiGroups HTTP/1.1" 401 12846 +64.242.88.10 - - [07/Mar/2004:18:46:00 -0800] "GET /ops/SP/play//rdiff/TWiki/TextFormattingRules?rev1=1.36&rev2=1.35 HTTP/1.1" 200 25416 +64.242.88.10 - - [07/Mar/2004:18:47:06 -0800] "GET /ops/SP/play//rdiff/Main/TWikiGroups?rev1=1.3&rev2=1.2 HTTP/1.1" 200 4308 +64.242.88.10 - - [07/Mar/2004:18:48:15 -0800] "GET /ops/SP/play//search/TWiki/?scope=topic®ex=on&search=.* HTTP/1.1" 200 3544 +64.242.88.10 - - [07/Mar/2004:18:52:30 -0800] "GET /ops/SP/play//edit/Main/Trigger_timeout?topicparent=Main.ConfigurationVariables HTTP/1.1" 401 12846 +64.242.88.10 - - [07/Mar/2004:18:53:55 -0800] "GET /ops/SP/play//oops/TWiki/TWikiSite?template=oopsmore¶m1=1.21¶m2=1.21 HTTP/1.1" 200 11284 +64.242.88.10 - - [07/Mar/2004:18:57:07 -0800] "GET /ops/SP/play//view/TWiki/TextFormattingRules?rev=r1.35 HTTP/1.1" 200 27248 +64.242.88.10 - - [07/Mar/2004:18:58:52 -0800] "GET /ops/SP/play//edit/Main/Mydestination?topicparent=Main.ConfigurationVariables HTTP/1.1" 401 12846 +64.242.88.10 - - [07/Mar/2004:18:59:52 -0800] "GET /mailman/listinfo/fcd HTTP/1.1" 200 5967 +64.242.88.10 - - [07/Mar/2004:19:01:48 -0800] "GET /ops/SP/play//rdiff/Main/WebHome?rev1=1.28&rev2=1.27 HTTP/1.1" 200 3596 +64.242.88.10 - - [07/Mar/2004:19:03:58 -0800] "GET /ops/SP/play//edit/Main/Message_size_limit?topicparent=Main.ConfigurationVariables HTTP/1.1" 401 12846 +64.242.88.10 - - [07/Mar/2004:19:08:55 -0800] "GET /ops/SP/play//rdiff/TWiki/TWikiHistory HTTP/1.1" 200 138789 +64.242.88.10 - - [07/Mar/2004:19:10:13 -0800] "GET /ops/SP/play//search/TWiki/?scope=topic®ex=on&search=^y HTTP/1.1" 200 3628 +64.242.88.10 - - [07/Mar/2004:19:15:38 -0800] "GET /ops/SP/play//edit/Main/Smtpd_history_flush_threshold?topicparent=Main.ConfigurationVariables HTTP/1.1" 401 12851 +64.242.88.10 - - [07/Mar/2004:19:16:44 -0800] "GET /ops/SP/play//view/TWiki/TWikiHistory?rev=1.59 HTTP/1.1" 200 52854 +64.242.88.10 - - [07/Mar/2004:19:18:05 -0800] "GET /ops/SP/play//edit/Main/Sender_canonical_maps?topicparent=Main.ConfigurationVariables HTTP/1.1" 401 12851 +64.242.88.10 - - [07/Mar/2004:19:19:19 -0800] "GET /mailman/listinfo/mlc HTTP/1.1" 200 6142 +64.242.88.10 - - [07/Mar/2004:19:21:01 -0800] "GET /ops/SP/play//rdiff/Main/WebChanges HTTP/1.1" 200 114241 +64.242.88.10 - - [07/Mar/2004:19:22:11 -0800] "GET /ops/SP/play//edit/Sandbox/TestTopic5?topicparent=Sandbox.WebHome HTTP/1.1" 401 12846 +64.242.88.10 - - [07/Mar/2004:19:24:57 -0800] "GET /ops/SP/play//view/TWiki/TextFormattingRules?rev=r1.22 HTTP/1.1" 200 21162 +64.242.88.10 - - [07/Mar/2004:19:26:22 -0800] "GET /ops/SP/play//search/TWiki/?scope=topic®ex=on&search=^j HTTP/1.1" 200 4524 +64.242.88.10 - - [07/Mar/2004:19:29:46 -0800] "GET /ops/SP/play//oops/TWiki/TWikiVariables?template=oopsmore¶m1=1.62¶m2=1.62 HTTP/1.1" 200 11444 +64.242.88.10 - - [07/Mar/2004:19:31:25 -0800] "GET /ops/SP/play//edit/Main/Lmtp_connect_timeout?topicparent=Main.ConfigurationVariables HTTP/1.1" 401 12846 +64.242.88.10 - - [07/Mar/2004:19:32:45 -0800] "GET /ops/SP/play//search/TWiki/?scope=topic®ex=on&search=^q HTTP/1.1" 200 2937 +64.242.88.10 - - [07/Mar/2004:19:36:14 -0800] "GET /ops/SP/play//view/TWiki/ManagingWebs?rev=1.21 HTTP/1.1" 200 9310 +64.242.88.10 - - [07/Mar/2004:19:39:40 -0800] "GET /ops/SP/play//edit/Main/Qmqpd_authorized_clients?topicparent=Main.ConfigurationVariables HTTP/1.1" 401 12846 +64.242.88.10 - - [07/Mar/2004:19:41:33 -0800] "GET /ops/SP/play//edit/Main/Header_address_token_limit?topicparent=Main.ConfigurationVariables HTTP/1.1" 401 12846 +64.242.88.10 - - [07/Mar/2004:19:42:45 -0800] "GET /ops/SP/play//edit/Main/Syslog_name?topicparent=Main.ConfigurationVariables HTTP/1.1" 401 12846 +80-219-148-207.dclient.hispeed.ch - - [07/Mar/2004:19:47:36 -0800] "OPTIONS * HTTP/1.0" 200 - +64.242.88.10 - - [07/Mar/2004:19:49:28 -0800] "GET /ops/SP/play//oops/TWiki/TWikiHistory?template=oopsmore¶m1=1.61¶m2=1.61 HTTP/1.1" 200 11345 +64.242.88.10 - - [07/Mar/2004:19:52:28 -0800] "GET /ops/SP/play//view/TWiki/HaroldGottschalk HTTP/1.1" 200 3838 +64.242.88.10 - - [07/Mar/2004:19:54:33 -0800] "GET /ops/SP/play//view/TWiki/DefaultPlugin?rev=1.4 HTTP/1.1" 200 7298 +64.242.88.10 - - [07/Mar/2004:19:55:40 -0800] "GET /ops/SP/play//oops/TWiki/WelcomeGuest?template=oopsmore¶m1=1.20¶m2=1.20 HTTP/1.1" 200 11266 +64.242.88.10 - - [07/Mar/2004:19:56:41 -0800] "GET /ops/SP/play//rdiff/Main/WebIndex HTTP/1.1" 200 46373 +64.242.88.10 - - [07/Mar/2004:19:58:24 -0800] "GET /ops/SP/play//rdiff/TWiki/TWikiRegistration?rev1=1.10&rev2=1.9 HTTP/1.1" 200 3826 +64.242.88.10 - - [07/Mar/2004:20:00:06 -0800] "GET /ops/SP/play//view/TWiki/TextFormattingRules?rev=r1.21 HTTP/1.1" 200 20972 +64.242.88.10 - - [07/Mar/2004:20:02:13 -0800] "GET /ops/SP/play//attach/TWiki/DefaultPlugin HTTP/1.1" 401 12846 +64.242.88.10 - - [07/Mar/2004:20:03:29 -0800] "GET /ops/SP/play//search/Main/?scope=topic®ex=on&search=^p HTTP/1.1" 200 7245 +206-15-133-181.dialup.ziplink.net - - [07/Mar/2004:20:04:03 -0800] "HEAD /ops/SP/play//view/Main/SpamAssassinDeleting HTTP/1.1" 200 0 +64.242.88.10 - - [07/Mar/2004:20:04:35 -0800] "GET /ops/SP/play//edit/Main/Smtp_pix_workaround_delay_time?topicparent=Main.ConfigurationVariables HTTP/1.1" 401 12846 +64.242.88.10 - - [07/Mar/2004:20:07:12 -0800] "GET /ops/SP/play//edit/Main/Berkeley_db_create_buffer_size?topicparent=Main.ConfigurationVariables HTTP/1.1" 401 12851 +mmscrm07-2.uah.goweb.net - - [07/Mar/2004:20:10:50 -0800] "GET /robots.txt HTTP/1.0" 200 68 +64.242.88.10 - - [07/Mar/2004:20:11:33 -0800] "GET /ops/SP/play//attach/TWiki/TWikiSite HTTP/1.1" 401 12846 +64.242.88.10 - - [07/Mar/2004:20:12:55 -0800] "GET /ops/SP/play//edit/TWiki/TWikiSite?t=1078681794 HTTP/1.1" 401 12846 +64.242.88.10 - - [07/Mar/2004:20:23:35 -0800] "GET /ops/SP/play//search/TWiki/SearchResult?scope=text®ex=on&search=Web%20*Statistics[^A-Za-z] HTTP/1.1" 200 10118 +64.242.88.10 - - [07/Mar/2004:20:25:31 -0800] "GET /ops/SP/play//edit/Main/Defer_transports?topicparent=Main.ConfigurationVariables HTTP/1.1" 401 12846 +64.242.88.10 - - [07/Mar/2004:20:31:40 -0800] "GET /ops/SP/play//rdiff/TWiki/SearchDoesNotWork HTTP/1.1" 200 6738 +64.242.88.10 - - [07/Mar/2004:20:35:28 -0800] "GET /ops/SP/play//search/Main/SearchResult?scope=text®ex=on&search=TWiki%20*Admin%20*Group[^A-Za-z] HTTP/1.1" 200 7311 +64.242.88.10 - - [07/Mar/2004:20:38:14 -0800] "GET /ops/SP/play//rdiff/TWiki/ChangePassword HTTP/1.1" 200 16670 +64.242.88.10 - - [07/Mar/2004:20:40:41 -0800] "GET /ops/SP/play//rdiff/TWiki/SvenDowideit HTTP/1.1" 200 5277 +64.242.88.10 - - [07/Mar/2004:20:42:09 -0800] "GET /ops/SP/play//rdiff/TWiki/KevinKinnell?rev1=1.5&rev2=1.4 HTTP/1.1" 200 4982 +64.242.88.10 - - [07/Mar/2004:20:44:48 -0800] "GET /ops/SP/play//edit/Main/Undisclosed_recipients_header?topicparent=Main.ConfigurationVariables HTTP/1.1" 401 12846 +64.242.88.10 - - [07/Mar/2004:20:55:43 -0800] "GET /mailman/listinfo/hs_support HTTP/1.1" 200 6294 +64.242.88.10 - - [07/Mar/2004:20:56:56 -0800] "GET /ops/SP/play//view/TWiki/WebTopicList HTTP/1.1" 200 14070 +64.242.88.10 - - [07/Mar/2004:20:58:27 -0800] "GET /ops/SP/play//attach/TWiki/WebPreferences HTTP/1.1" 401 12846 +64.242.88.10 - - [07/Mar/2004:21:03:48 -0800] "GET /ops/SP/play//view/TWiki/TWikiFAQ HTTP/1.1" 200 12050 +64.242.88.10 - - [07/Mar/2004:21:06:05 -0800] "GET /ops/SP/play//oops/TWiki/DefaultPlugin?template=oopsmore¶m1=1.5¶m2=1.5 HTTP/1.1" 200 11281 +64.242.88.10 - - [07/Mar/2004:21:07:24 -0800] "GET /ops/SP/play//rdiff/TWiki/AppendixFileSystem?rev1=1.11&rev2=1.10 HTTP/1.1" 200 40578 +64.242.88.10 - - [07/Mar/2004:21:14:32 -0800] "GET /ops/SP/play//rdiff/TWiki/FileAttribute HTTP/1.1" 200 5846 +h24-70-56-49.ca.clawio.org - - [07/Mar/2004:21:16:17 -0800] "GET /twiki/view/Main/WebHome HTTP/1.1" 404 300 +h24-70-56-49.ca.clawio.org - - [07/Mar/2004:21:16:18 -0800] "GET /favicon.ico HTTP/1.1" 200 1078 +h24-70-56-49.ca.clawio.org - - [07/Mar/2004:21:16:21 -0800] "GET /twiki/ HTTP/1.1" 200 782 +h24-70-56-49.ca.clawio.org - - [07/Mar/2004:21:16:23 -0800] "GET /ops/SP/play//view/Main/WebHome HTTP/1.1" 200 10419 +h24-70-56-49.ca.clawio.org - - [07/Mar/2004:21:16:23 -0800] "GET /go/bin/test/TWikiLogos/twikiRobot46x50.gif HTTP/1.1" 200 2877 +h24-70-56-49.ca.clawio.org - - [07/Mar/2004:21:16:33 -0800] "GET /ops/SP/play//view/Main/TWikiUsers HTTP/1.1" 200 6697 +h24-70-56-49.ca.clawio.org - - [07/Mar/2004:21:16:40 -0800] "GET /ops/SP/play//view/Main/KevinWGagel HTTP/1.1" 200 4901 +64.242.88.10 - - [07/Mar/2004:21:20:14 -0800] "GET /ops/SP/play//edit/TWiki/RichardDonkin?t=1078691832 HTTP/1.1" 401 12846 +64.242.88.10 - - [07/Mar/2004:21:21:40 -0800] "GET /ops/SP/play//oops/Main/DCC?template=oopsmore¶m1=1.1¶m2=1.1 HTTP/1.1" 200 6399 +64.242.88.10 - - [07/Mar/2004:21:23:38 -0800] "GET /ops/SP/play//view/TWiki/TWikiUpgradeTo01May2000 HTTP/1.1" 200 7463 +64.242.88.10 - - [07/Mar/2004:21:31:12 -0800] "GET /ops/SP/play//edit/Main/Mail_release_date?topicparent=Main.ConfigurationVariables HTTP/1.1" 401 12846 +64.242.88.10 - - [07/Mar/2004:21:33:51 -0800] "GET /ops/SP/play//view/TWiki/TWikiPlugins?rev=1.19 HTTP/1.1" 200 26541 +bh02i525f01.au.ibm.com - - [07/Mar/2004:21:34:00 -0800] "GET /AmavisNew.jsp HTTP/1.0" 200 2300 +64.242.88.10 - - [07/Mar/2004:21:39:55 -0800] "GET /ops/SP/play//attach/Main/ConfigurationVariables HTTP/1.1" 401 12846 +64.242.88.10 - - [07/Mar/2004:21:41:04 -0800] "GET /mailman/listinfo/techcomm HTTP/1.1" 200 6155 +64.242.88.10 - - [07/Mar/2004:21:42:47 -0800] "GET /ops/SP/play//view/TWiki/TWikiHistory?rev=1.8 HTTP/1.1" 200 15618 +64.242.88.10 - - [07/Mar/2004:21:44:10 -0800] "GET /ops/SP/play//edit/Sandbox/TestTopic7?topicparent=Sandbox.WebHome HTTP/1.1" 401 12846 +64.242.88.10 - - [07/Mar/2004:21:50:22 -0800] "GET /ops/SP/play//rdiff/TWiki/WebSearch HTTP/1.1" 200 55862 +64.242.88.10 - - [07/Mar/2004:21:52:05 -0800] "GET /ops/SP/play//rdiff/TWiki/TWikiTopics HTTP/1.1" 200 101445 +64.242.88.10 - - [07/Mar/2004:22:03:19 -0800] "GET /ops/SP/play//rdiff/Main/VishaalGolam HTTP/1.1" 200 5055 +64.242.88.10 - - [07/Mar/2004:22:04:44 -0800] "GET /ops/SP/play//view/Main/TWikiUsers?rev=1.21 HTTP/1.1" 200 6522 +64.242.88.10 - - [07/Mar/2004:22:06:16 -0800] "GET /ops/SP/play//edit/Main/Delay_notice_recipient?topicparent=Main.ConfigurationVariables HTTP/1.1" 401 12846 +64.242.88.10 - - [07/Mar/2004:22:07:33 -0800] "GET /ops/SP/play//view/TWiki/WikiNotation HTTP/1.1" 200 3617 +64.242.88.10 - - [07/Mar/2004:22:08:43 -0800] "GET /ops/SP/play//edit/Main/Forward_expansion_filter?topicparent=Main.ConfigurationVariables HTTP/1.1" 401 12846 +64.242.88.10 - - [07/Mar/2004:22:09:44 -0800] "GET /ops/SP/play//edit/Main/TestArea?topicparent=Main.WebHome HTTP/1.1" 401 12846 +64.242.88.10 - - [07/Mar/2004:22:10:55 -0800] "GET /ops/SP/play//view/Main/TokyoOffice?rev=1.2 HTTP/1.1" 200 4366 +64.242.88.10 - - [07/Mar/2004:22:12:28 -0800] "GET /ops/SP/play//attach/TWiki/WebSearch HTTP/1.1" 401 12846 +64.242.88.10 - - [07/Mar/2004:22:15:57 -0800] "GET /mailman/listinfo/hs_rcafaculty HTTP/1.1" 200 6345 +64.242.88.10 - - [07/Mar/2004:22:17:40 -0800] "GET /ops/SP/play//view/TWiki/TWikiSkins?skin=print HTTP/1.1" 200 9563 +64.242.88.10 - - [07/Mar/2004:22:27:18 -0800] "GET /ops/SP/play//edit/Main/OfficeLocations?t=1078691049 HTTP/1.1" 401 12846 +64.242.88.10 - - [07/Mar/2004:22:29:10 -0800] "GET /ops/SP/play//view/Main/ThanadonSomdee HTTP/1.1" 200 4611 +h24-71-249-14.ca.clawio.org - - [07/Mar/2004:22:29:12 -0800] "GET /mailman/options/cnc_notice/arobin%40shaw.c HTTP/1.1" 200 3382 +h24-71-249-14.ca.clawio.org - - [07/Mar/2004:22:29:13 -0800] "GET /icons/mailman.jpg HTTP/1.1" 200 2022 +h24-71-249-14.ca.clawio.org - - [07/Mar/2004:22:29:13 -0800] "GET /icons/PythonPowered.png HTTP/1.1" 200 945 +h24-71-249-14.ca.clawio.org - - [07/Mar/2004:22:29:13 -0800] "GET /icons/gnu-head-tiny.jpg HTTP/1.1" 200 3049 +h24-71-249-14.ca.clawio.org - - [07/Mar/2004:22:29:41 -0800] "POST /mailman/options/cnc_notice HTTP/1.1" 200 3533 +h24-71-249-14.ca.clawio.org - - [07/Mar/2004:22:30:08 -0800] "POST /mailman/options/cnc_notice HTTP/1.1" 200 13973 +64.242.88.10 - - [07/Mar/2004:22:31:25 -0800] "GET /ops/SP/play//view/TWiki/TextFormattingRules?rev=r1.16 HTTP/1.1" 200 17361 +64.242.88.10 - - [07/Mar/2004:22:35:53 -0800] "GET /ops/SP/play//edit/Main/Default_delivery_slot_discount?topicparent=Main.ConfigurationVariables HTTP/1.1" 401 12851 +64.242.88.10 - - [07/Mar/2004:22:36:58 -0800] "GET /ops/SP/play//rdiff/TWiki/TWikiHistory?rev1=1.10&rev2=1.9 HTTP/1.1" 200 5336 +64.242.88.10 - - [07/Mar/2004:22:39:00 -0800] "GET /ops/SP/play//search/TWiki/SearchResult?scope=text®ex=on&search=Al%20*Williams[^A-Za-z] HTTP/1.1" 200 4364 +64.242.88.10 - - [07/Mar/2004:22:45:46 -0800] "GET /ops/SP/play//edit/Main/Smtpd_banner?topicparent=Main.ConfigurationVariables HTTP/1.1" 401 12846 +64.242.88.10 - - [07/Mar/2004:22:47:19 -0800] "GET /ops/SP/play//view/Main/WebHome?rev=r1.9 HTTP/1.1" 200 9133 +64.242.88.10 - - [07/Mar/2004:22:48:55 -0800] "GET /ops/SP/play//rdiff/TWiki/TWikiSkins?rev1=1.10&rev2=1.9 HTTP/1.1" 200 5989 +64.242.88.10 - - [07/Mar/2004:22:51:55 -0800] "GET /ops/SP/play//attach/TWiki/AndreaSterbini HTTP/1.1" 401 12851 +64.242.88.10 - - [07/Mar/2004:22:53:36 -0800] "GET /ops/SP/play//rdiff/TWiki/TWikiPlugins?rev1=1.20&rev2=1.19 HTTP/1.1" 200 5140 +64.242.88.10 - - [07/Mar/2004:22:54:43 -0800] "GET /ops/SP/play//view/Know/ReadmeFirst?rev=1.4 HTTP/1.1" 200 6736 +64.242.88.10 - - [07/Mar/2004:22:58:24 -0800] "GET /ops/SP/play//view/Main/TokyoOffice?rev=r1.3 HTTP/1.1" 200 3853 +64.242.88.10 - - [07/Mar/2004:23:09:07 -0800] "GET /ops/SP/play//view/TWiki/AlWilliams?rev=1.1 HTTP/1.1" 200 3697 +calcite.rhyolite.com - - [07/Mar/2004:23:10:27 -0800] "GET /clients.jsp HTTP/1.1" 200 18753 +64.242.88.10 - - [07/Mar/2004:23:10:44 -0800] "GET /ops/SP/play//view/TWiki/JohnTalintyre HTTP/1.1" 200 3766 +64.242.88.10 - - [07/Mar/2004:23:13:51 -0800] "GET /ops/SP/play//view/TWiki/TWikiDocGraphics HTTP/1.1" 200 14492 +64.242.88.10 - - [07/Mar/2004:23:15:51 -0800] "GET /ops/SP/play//view/TWiki/TextFormattingRules?rev=r1.24 HTTP/1.1" 200 20981 +64.242.88.10 - - [07/Mar/2004:23:16:57 -0800] "GET /ops/SP/play//rdiff/Main/SanJoseOffice HTTP/1.1" 200 9524 +64.242.88.10 - - [07/Mar/2004:23:19:01 -0800] "GET /ops/SP/play//rdiff/Main/WebNotify HTTP/1.1" 200 16853 +64.242.88.10 - - [07/Mar/2004:23:20:26 -0800] "GET /ops/SP/play//view/TWiki/TWikiSiteTools HTTP/1.1" 200 14435 +64.242.88.10 - - [07/Mar/2004:23:23:00 -0800] "GET /ops/SP/play//rdiff/TWiki/RichardDonkin?rev1=1.2&rev2=1.1 HTTP/1.1" 200 5891 +64.242.88.10 - - [07/Mar/2004:23:27:26 -0800] "GET /ops/SP/play//search/TWiki/SearchResult?scope=text®ex=on&search=Web%20*Preferences[^A-Za-z] HTTP/1.1" 200 20030 +64.242.88.10 - - [07/Mar/2004:23:30:23 -0800] "GET /ops/SP/play//rdiff/TWiki/WebHome HTTP/1.1" 200 108162 +64.242.88.10 - - [07/Mar/2004:23:34:31 -0800] "GET /ops/SP/play//edit/Main/Lmtp_quit_timeout?topicparent=Main.ConfigurationVariables HTTP/1.1" 401 12851 +64.242.88.10 - - [07/Mar/2004:23:36:48 -0800] "GET /ops/SP/play//view/TWiki/WebSiteTools HTTP/1.1" 200 5208 +lj1036.passgo.com - - [07/Mar/2004:23:36:59 -0800] "GET /robots.txt HTTP/1.0" 200 68 +lj1088.passgo.com - - [07/Mar/2004:23:36:59 -0800] "GET /ops/SP/play//oops/TWiki/JohnAltstadt HTTP/1.0" 200 209 +64.242.88.10 - - [07/Mar/2004:23:37:48 -0800] "GET /ops/SP/play//oops/Main/FileAttachment?template=oopsmore¶m1=1.3¶m2=1.3 HTTP/1.1" 200 6612 +64.242.88.10 - - [07/Mar/2004:23:42:44 -0800] "GET /ops/SP/play//edit/Main/Cleanup_service_name?topicparent=Main.ConfigurationVariables HTTP/1.1" 401 12846 +64.242.88.10 - - [07/Mar/2004:23:47:58 -0800] "GET /ops/SP/play//view/TWiki/WikiReferences?skin=print HTTP/1.1" 200 5596 +64.242.88.10 - - [07/Mar/2004:23:50:03 -0800] "GET /ops/SP/play//view/Main/TokyoOffice?rev=1.3 HTTP/1.1" 200 3853 +64.242.88.10 - - [07/Mar/2004:23:51:38 -0800] "GET /ops/SP/play//view/Main/PostSuper?rev=r1.1 HTTP/1.1" 200 3629 +64.242.88.10 - - [07/Mar/2004:23:56:30 -0800] "GET /ops/SP/play//rdiff/Main/PostQueue HTTP/1.1" 200 4662 +64.242.88.10 - - [07/Mar/2004:23:58:53 -0800] "GET /ops/SP/play//edit/TWiki/TablePlugin?t=1078681446 HTTP/1.1" 401 12851 +dsl-80-43-113-44.access.uk.tiscali.com - - [08/Mar/2004:00:05:30 -0800] "GET / HTTP/1.1" 200 3169 +dsl-80-43-113-44.access.uk.tiscali.com - - [08/Mar/2004:00:05:35 -0800] "GET /favicon.ico HTTP/1.1" 200 1078 +dsl-80-43-113-44.access.uk.tiscali.com - - [08/Mar/2004:00:06:32 -0800] "GET /DCC.jsp HTTP/1.1" 200 2878 +64.242.88.10 - - [08/Mar/2004:00:08:58 -0800] "GET /ops/SP/play//oops/Sandbox/WebHome?template=oopsmore¶m1=1.7¶m2=1.7 HTTP/1.1" 200 4226 +64.242.88.10 - - [08/Mar/2004:00:11:22 -0800] "GET /ops/SP/play//edit/Main/WelcomeGuest?topicparent=Main.WebHome HTTP/1.1" 401 12846 +lj1125.passgo.com - - [08/Mar/2004:00:17:00 -0800] "GET /ops/SP/play//oops/Main/TWiki HTTP/1.0" 200 209 +64.242.88.10 - - [08/Mar/2004:00:17:22 -0800] "GET /ops/SP/play//view/TWiki/RichardDonkin?skin=print HTTP/1.1" 200 1729 +64.242.88.10 - - [08/Mar/2004:00:19:51 -0800] "GET /ops/SP/play//view/Main/WebPreferences?rev=r1.4 HTTP/1.1" 200 7049 +64.242.88.10 - - [08/Mar/2004:00:21:54 -0800] "GET /ops/SP/play//view/TWiki/TWikiRegistration?rev=r1.7 HTTP/1.1" 200 12737 +64.242.88.10 - - [08/Mar/2004:00:25:11 -0800] "GET /ops/SP/play//view/TWiki/TextFormattingRules?rev=r1.26 HTTP/1.1" 200 22710 +64.242.88.10 - - [08/Mar/2004:00:27:53 -0800] "GET /ops/SP/play//view/TWiki/GoBox HTTP/1.1" 200 3762 +64.242.88.10 - - [08/Mar/2004:00:29:13 -0800] "GET /ops/SP/play//view/Main/FileAttachment?rev=1.1 HTTP/1.1" 200 17757 +64.242.88.10 - - [08/Mar/2004:00:32:45 -0800] "GET /ops/SP/play//attach/TWiki/KevinKinnell HTTP/1.1" 401 12846 +64.242.88.10 - - [08/Mar/2004:00:36:21 -0800] "GET /ops/SP/play//rdiff/TWiki/WikiWikiClones HTTP/1.1" 200 9259 +64.242.88.10 - - [08/Mar/2004:00:37:23 -0800] "GET /ops/SP/play//oops/Main/NicholasLee?template=oopsmore¶m1=1.2¶m2=1.2 HTTP/1.1" 200 6558 +64.242.88.10 - - [08/Mar/2004:00:40:10 -0800] "GET /ops/SP/play//edit/Main/TWikiForms?topicparent=Main.TWikiVariables HTTP/1.1" 401 12846 +64.242.88.10 - - [08/Mar/2004:00:43:43 -0800] "GET /ops/SP/play//rdiff/TWiki/DefaultPlugin HTTP/1.1" 200 20376 +64.242.88.10 - - [08/Mar/2004:00:50:59 -0800] "GET /mailman/admin/educationadmin HTTP/1.1" 200 2150 +64.242.88.10 - - [08/Mar/2004:00:52:12 -0800] "GET /mailman/private/hsdivision/ HTTP/1.1" 200 1549 +64.242.88.10 - - [08/Mar/2004:00:54:26 -0800] "GET /mailman/listinfo/artsscience HTTP/1.1" 200 6248 +64.242.88.10 - - [08/Mar/2004:00:55:38 -0800] "GET /ops/SP/play//search/TWiki/?scope=topic®ex=on&search=^i HTTP/1.1" 200 7226 +64.242.88.10 - - [08/Mar/2004:01:00:08 -0800] "GET /ops/SP/play//rdiff/TWiki/AdrianLynch HTTP/1.1" 200 4011 +64.242.88.10 - - [08/Mar/2004:01:01:15 -0800] "GET /ops/SP/play//view/Main/WelcomeGuest HTTP/1.1" 200 4723 +64.242.88.10 - - [08/Mar/2004:01:02:16 -0800] "GET /ops/SP/play//view/Main/MikeMannix?rev=1.3 HTTP/1.1" 200 4721 +64.242.88.10 - - [08/Mar/2004:01:04:05 -0800] "GET /ops/SP/play//edit/TWiki/WikiStyleWord?topicparent=TWiki.TextFormattingFAQ HTTP/1.1" 401 12846 +lj1089.passgo.com - - [08/Mar/2004:01:04:54 -0800] "GET /ops/SP/play//oops/TWiki/InterWikis HTTP/1.0" 200 209 +64.242.88.10 - - [08/Mar/2004:01:10:43 -0800] "GET /ops/SP/play//view/TWiki/FormattedSearch?rev=1.8 HTTP/1.1" 200 20434 +64.242.88.10 - - [08/Mar/2004:01:12:20 -0800] "GET /ops/SP/play//view/TWiki/TWikiEnhancementRequests?rev=1.3 HTTP/1.1" 200 4379 +64.242.88.10 - - [08/Mar/2004:01:16:37 -0800] "GET /ops/SP/play//view/Main/FileAttachment?rev=1.2 HTTP/1.1" 200 17919 +64.242.88.10 - - [08/Mar/2004:01:19:18 -0800] "GET /ops/SP/play//edit/TWiki/AppendixFileSystem?t=1078674582 HTTP/1.1" 401 12846 +64.242.88.10 - - [08/Mar/2004:01:24:13 -0800] "GET /ops/SP/play//view/TWiki/TextFormattingRules?rev=r1.33 HTTP/1.1" 200 26294 +64.242.88.10 - - [08/Mar/2004:01:25:15 -0800] "GET /ops/SP/play//search/Main/?scope=topic®ex=on&search=^t HTTP/1.1" 200 8306 +64.242.88.10 - - [08/Mar/2004:01:29:17 -0800] "GET /ops/SP/play//oops/TWiki/TWikiPlugins?template=oopsmore¶m1=1.21¶m2=1.21 HTTP/1.1" 200 11341 +64.242.88.10 - - [08/Mar/2004:01:30:39 -0800] "GET /mailman/private/sswk/ HTTP/1.1" 200 1531 +64.242.88.10 - - [08/Mar/2004:01:33:14 -0800] "GET /mailman/private/business/ HTTP/1.1" 200 1543 +64.242.88.10 - - [08/Mar/2004:01:35:13 -0800] "GET /ops/SP/play//edit/TWiki/InterWikis?t=1078696998 HTTP/1.1" 401 12846 +64.242.88.10 - - [08/Mar/2004:01:41:14 -0800] "GET /ops/SP/play//view/TWiki/WelcomeGuest?rev=r1.18 HTTP/1.1" 200 14001 +64.242.88.10 - - [08/Mar/2004:01:46:05 -0800] "GET /ops/SP/play//search/TWiki/?search=\\.*&scope=topic&order=modified&reverse=on®ex=on&nosearch=on&limit=200 HTTP/1.1" 200 101279 +64.242.88.10 - - [08/Mar/2004:01:47:06 -0800] "GET /ops/SP/play//edit/TWiki/TWikiPages?topicparent=TWiki.WelcomeGuest HTTP/1.1" 401 12846 +64.242.88.10 - - [08/Mar/2004:01:48:06 -0800] "GET /ops/SP/play//view/Main/WebHome?rev=r1.16 HTTP/1.1" 200 9342 +64.242.88.10 - - [08/Mar/2004:01:50:37 -0800] "GET /ops/SP/play//rdiff/TWiki/RyanFreebern?rev1=1.2&rev2=1.1 HTTP/1.1" 200 5243 +64.242.88.10 - - [08/Mar/2004:01:59:13 -0800] "GET /ops/SP/play//edit/Main/Smtp_line_length_limit?topicparent=Main.ConfigurationVariables HTTP/1.1" 401 12846 +64.242.88.10 - - [08/Mar/2004:02:00:30 -0800] "GET /ops/SP/play//view/Main/WebStatistics?skin=print HTTP/1.1" 200 6194 +64.242.88.10 - - [08/Mar/2004:02:01:34 -0800] "GET /mailman/listinfo/webber HTTP/1.1" 200 6051 +64.242.88.10 - - [08/Mar/2004:02:03:12 -0800] "GET /mailman/admin/mlc HTTP/1.1" 200 2060 +64.242.88.10 - - [08/Mar/2004:02:05:15 -0800] "GET /mailman/listinfo/jjec HTTP/1.1" 200 6297 +64.242.88.10 - - [08/Mar/2004:02:06:17 -0800] "GET /mailman/listinfo/deans HTTP/1.1" 200 6102 +64.242.88.10 - - [08/Mar/2004:02:07:21 -0800] "GET /mailman/listinfo/gisgrad HTTP/1.1" 200 6024 +64.242.88.10 - - [08/Mar/2004:02:09:08 -0800] "GET /ops/SP/play//view/Main/WebNotify HTTP/1.1" 200 4468 +64.242.88.10 - - [08/Mar/2004:02:12:24 -0800] "GET /ops/SP/play//edit/Main/Setgid_group?topicparent=Main.ConfigurationVariables HTTP/1.1" 401 12846 +64.242.88.10 - - [08/Mar/2004:02:16:24 -0800] "GET /ops/SP/play//view/Main/WebChanges?skin=print HTTP/1.1" 200 38580 +lj1016.passgo.com - - [08/Mar/2004:02:17:10 -0800] "GET /ops/SP/play//oops/TWiki/FileAttachment HTTP/1.0" 200 209 +lj1036.passgo.com - - [08/Mar/2004:02:22:19 -0800] "GET /ops/SP/play//view/Main/TWi HTTP/1.0" 200 4866 +64.242.88.10 - - [08/Mar/2004:02:23:45 -0800] "GET /ops/SP/play//rdiff/TWiki/IncludeTopicsAndWebPages HTTP/1.1" 200 20972 +64.242.88.10 - - [08/Mar/2004:02:26:44 -0800] "GET /ops/SP/play//oops/Main/WebChanges?template=oopsmore¶m1=1.2¶m2=1.2 HTTP/1.1" 200 6540 +64.242.88.10 - - [08/Mar/2004:02:27:51 -0800] "GET /ops/SP/play//rdiff/TWiki/InstantEnhancements HTTP/1.1" 200 25123 +64.242.88.10 - - [08/Mar/2004:02:33:28 -0800] "GET /ops/SP/play//rdiff/TWiki/TWikiPreferences?rev1=1.47&rev2=1.46 HTTP/1.1" 200 4313 +64.242.88.10 - - [08/Mar/2004:02:34:40 -0800] "GET /ops/SP/play//view/Main/WebHome?rev=r1.24 HTTP/1.1" 200 9769 +64.242.88.10 - - [08/Mar/2004:02:42:36 -0800] "GET /mailman/listinfo/ppwc HTTP/1.1" 200 6271 +64.242.88.10 - - [08/Mar/2004:02:45:03 -0800] "GET /ops/SP/play//search/TWiki/?scope=topic®ex=on&bookview=on&search=.* HTTP/1.1" 200 102399 +64.242.88.10 - - [08/Mar/2004:02:46:12 -0800] "GET /ops/SP/play//edit/Main/Local_recipient_maps?topicparent=Main.ConfigurationVariables HTTP/1.1" 401 12851 +64.242.88.10 - - [08/Mar/2004:02:47:58 -0800] "GET /mailman/listinfo HTTP/1.1" 200 6893 +lj1025.passgo.com - - [08/Mar/2004:02:48:05 -0800] "GET /ops/SP/play//oops/Main/KevinWGage HTTP/1.0" 200 209 +prxint-sxb3.e-i.net - - [08/Mar/2004:02:50:53 -0800] "GET /ops/SP/play//view/Main/WebHome HTTP/1.0" 200 10392 +prxint-sxb3.e-i.net - - [08/Mar/2004:02:50:54 -0800] "GET /go/bin/test/TWikiLogos/twikiRobot46x50.gif HTTP/1.0" 200 2877 +64.242.88.10 - - [08/Mar/2004:02:52:39 -0800] "GET /ops/SP/play//view/Main/PostfixCmd HTTP/1.1" 200 4173 +prxint-sxb2.e-i.net - - [08/Mar/2004:02:54:29 -0800] "GET /ops/SP/play//view/Main/SpamAssassinAndPostFix HTTP/1.0" 200 4022 +64.242.88.10 - - [08/Mar/2004:02:54:54 -0800] "GET /ops/SP/play//edit/TWiki/NewTopic?topicparent=TWiki.WikiSyntax HTTP/1.1" 401 12846 +64.242.88.10 - - [08/Mar/2004:02:59:03 -0800] "GET /ops/SP/play//rdiff/TWiki/TWikiSite HTTP/1.1" 200 71941 +64.242.88.10 - - [08/Mar/2004:03:01:12 -0800] "GET /ops/SP/play//rdiff/TWiki/SimultaneousEdits HTTP/1.1" 200 6180 +64.242.88.10 - - [08/Mar/2004:03:06:31 -0800] "GET /ops/SP/play//view/Main/NicholasLee?rev=1.2 HTTP/1.1" 200 3570 +64.242.88.10 - - [08/Mar/2004:03:07:59 -0800] "GET /ops/SP/play//view/TWiki/TWikiHistory?rev=1.9 HTTP/1.1" 200 15756 +64.242.88.10 - - [08/Mar/2004:03:09:20 -0800] "GET /mailman/listinfo/ncbnpfaculty HTTP/1.1" 200 6331 +64.242.88.10 - - [08/Mar/2004:03:11:28 -0800] "GET /ops/SP/play//search/TWiki/SearchResult?scope=text®ex=on&search=Inter%20*Wikis[^A-Za-z] HTTP/1.1" 200 5113 +64.242.88.10 - - [08/Mar/2004:03:16:22 -0800] "GET /ops/SP/play//oops/TWiki/TextFormattingFAQ?template=oopsmore¶m1=1.14¶m2=1.14 HTTP/1.1" 200 11364 +64.242.88.10 - - [08/Mar/2004:03:17:50 -0800] "GET /ops/SP/play//rdiff/Main/WebTopicList HTTP/1.1" 200 8004 +64.242.88.10 - - [08/Mar/2004:03:21:16 -0800] "GET /ie.htm HTTP/1.1" 200 3518 +64.242.88.10 - - [08/Mar/2004:03:26:06 -0800] "GET /mailman/private/mlc/ HTTP/1.1" 200 1528 +64.242.88.10 - - [08/Mar/2004:03:28:02 -0800] "GET /ops/SP/play//view/TWiki/WikiName HTTP/1.1" 200 4811 +64.242.88.10 - - [08/Mar/2004:03:33:52 -0800] "GET /ops/SP/play//rdiff/Main/WebRss HTTP/1.1" 200 20726 +64.242.88.10 - - [08/Mar/2004:03:35:42 -0800] "GET /ops/SP/play//rdiff/TWiki/SvenDowideit?rev1=1.2&rev2=1.1 HTTP/1.1" 200 5277 +rouble.cc.strath.ac.uk - - [08/Mar/2004:03:40:51 -0800] "GET /razor.jsp HTTP/1.0" 200 2869 +213.181.81.4 - - [08/Mar/2004:03:42:20 -0800] "GET /LateEmail.jsp HTTP/1.0" 200 7649 +64.242.88.10 - - [08/Mar/2004:03:46:27 -0800] "GET /ops/SP/play//edit/Main/Deliver_lock_attempts?topicparent=Main.ConfigurationVariables HTTP/1.1" 401 12846 +64.242.88.10 - - [08/Mar/2004:03:48:18 -0800] "GET /ops/SP/play//edit/Main/Daemon_directory?topicparent=Main.ConfigurationVariables HTTP/1.1" 401 12846 +64.242.88.10 - - [08/Mar/2004:03:49:24 -0800] "GET /ops/SP/play//rdiff/TWiki/KlausWriessnegger?rev1=1.2&rev2=1.1 HTTP/1.1" 200 5421 +64.242.88.10 - - [08/Mar/2004:03:51:05 -0800] "GET /ops/SP/play//view/Main/TWikiGuest?rev=1.4 HTTP/1.1" 200 4719 +64.242.88.10 - - [08/Mar/2004:03:52:17 -0800] "GET /ops/SP/play//edit/Main/Relayhost?topicparent=Main.ConfigurationVariables HTTP/1.1" 401 12846 +lj1036.passgo.com - - [08/Mar/2004:03:53:59 -0800] "GET /robots.txt HTTP/1.0" 200 68 +lj1159.passgo.com - - [08/Mar/2004:03:54:03 -0800] "GET /ops/SP/play//oops/Main/TWi HTTP/1.0" 200 209 +64.242.88.10 - - [08/Mar/2004:03:55:09 -0800] "GET /ops/SP/play//edit/Main/BookView?topicparent=Main.TWikiVariables HTTP/1.1" 401 12846 +64.242.88.10 - - [08/Mar/2004:04:16:08 -0800] "GET /ops/SP/play//rdiff/TWiki/DeleteOrRenameATopic HTTP/1.1" 200 10254 +64.242.88.10 - - [08/Mar/2004:04:18:28 -0800] "GET /ops/SP/play//view/TWiki/DavidWarman HTTP/1.1" 200 3739 +64.242.88.10 - - [08/Mar/2004:04:20:48 -0800] "GET /ops/SP/play//view/TWiki/TextFormattingRules?rev=r1.28 HTTP/1.1" 200 22777 +64.242.88.10 - - [08/Mar/2004:04:21:53 -0800] "GET /ops/SP/play//rdiff/Main/PeterThoeny HTTP/1.1" 200 18927 +64.242.88.10 - - [08/Mar/2004:04:22:55 -0800] "GET /ops/SP/play//edit/TWiki/SvenDowideit?t=1078710644 HTTP/1.1" 401 12846 +64.242.88.10 - - [08/Mar/2004:04:24:47 -0800] "GET /ops/SP/play//edit/Main/RBLsHowTo?t=1078668449 HTTP/1.1" 401 12846 +prxint-sxb3.e-i.net - - [08/Mar/2004:04:25:38 -0800] "GET /ops/SP/play//view/Main/SpamAssassinTaggingOnly HTTP/1.0" 200 5672 +prxint-sxb3.e-i.net - - [08/Mar/2004:04:25:44 -0800] "GET /ops/SP/play//view/Main/WebHome HTTP/1.0" 200 10392 +prxint-sxb3.e-i.net - - [08/Mar/2004:04:26:02 -0800] "GET /ops/SP/play//view/Main/SideBar HTTP/1.0" 200 3960 +64.242.88.10 - - [08/Mar/2004:04:26:02 -0800] "GET /ops/SP/play//rdiff/TWiki/DefaultPlugin?rev1=1.5&rev2=1.4 HTTP/1.1" 200 4911 +prxint-sxb3.e-i.net - - [08/Mar/2004:04:26:11 -0800] "GET /ops/SP/play//view/Main/LinksOfUse HTTP/1.0" 200 4515 +prxint-sxb3.e-i.net - - [08/Mar/2004:04:28:34 -0800] "GET /ops/SP/play//view/Main/RelayGateway HTTP/1.0" 200 4213 +prxint-sxb3.e-i.net - - [08/Mar/2004:04:28:38 -0800] "GET /ops/SP/play//view/Main/PostfixCommands HTTP/1.0" 200 4004 +prxint-sxb3.e-i.net - - [08/Mar/2004:04:28:41 -0800] "GET /ops/SP/play//view/Main/PostfixCmd HTTP/1.0" 200 4154 +64.242.88.10 - - [08/Mar/2004:04:28:42 -0800] "GET /ops/SP/play//rdiff/TWiki/TWikiHistory?rev1=1.61&rev2=1.60 HTTP/1.1" 200 4898 +prxint-sxb3.e-i.net - - [08/Mar/2004:04:28:52 -0800] "GET /ops/SP/play//view/Main/PostSuper HTTP/1.0" 200 3617 +prxint-sxb3.e-i.net - - [08/Mar/2004:04:29:00 -0800] "GET /ops/SP/play//view/Main/RBLsHowTo HTTP/1.0" 200 4646 +prxint-sxb3.e-i.net - - [08/Mar/2004:04:29:11 -0800] "GET /ops/SP/play//view/Main/ConfigurationVariables HTTP/1.0" 200 58169 +prxint-sxb3.e-i.net - - [08/Mar/2004:04:29:21 -0800] "GET /ops/SP/play//edit/Main/Propagate_unmatched_extensions?topicparent=Main.ConfigurationVariables HTTP/1.0" 401 12816 +prxint-sxb3.e-i.net - - [08/Mar/2004:04:29:30 -0800] "GET /go/bin/test/TWikiDocGraphics/help.gif HTTP/1.0" 200 130 +64.242.88.10 - - [08/Mar/2004:04:33:25 -0800] "GET /mailman/admin/hs_support HTTP/1.1" 200 2120 +64.242.88.10 - - [08/Mar/2004:04:40:32 -0800] "GET /ops/SP/play//edit/Main/Always_bcc?topicparent=Main.ConfigurationVariables HTTP/1.1" 401 12846 +64.242.88.10 - - [08/Mar/2004:04:43:52 -0800] "GET /ops/SP/play//view/TWiki/WelcomeGuest?rev=r1.5 HTTP/1.1" 200 9492 +64.242.88.10 - - [08/Mar/2004:04:52:13 -0800] "GET /ops/SP/play//rdiff/Main/TWikiGuest?rev1=1.5&rev2=1.4 HTTP/1.1" 200 6233 +64.242.88.10 - - [08/Mar/2004:04:55:40 -0800] "GET /ops/SP/play//edit/Main/Delay_warning_time?topicparent=Main.ConfigurationVariables HTTP/1.1" 401 12846 +64.242.88.10 - - [08/Mar/2004:04:59:13 -0800] "GET /ops/SP/play//edit/TWiki/KlausWriessnegger?t=1078709735 HTTP/1.1" 401 12846 +64.242.88.10 - - [08/Mar/2004:05:00:42 -0800] "GET /ops/SP/play//rdiff/TWiki/StanleyKnutson HTTP/1.1" 200 5327 +p213.54.168.132.tisdip.tiscali.de - - [08/Mar/2004:05:00:44 -0800] "GET /ops/SP/play//view/Main/WebHome HTTP/1.1" 200 10419 +p213.54.168.132.tisdip.tiscali.de - - [08/Mar/2004:05:00:45 -0800] "GET /go/bin/test/TWikiLogos/twikiRobot46x50.gif HTTP/1.1" 200 2877 +p213.54.168.132.tisdip.tiscali.de - - [08/Mar/2004:05:00:46 -0800] "GET /favicon.ico HTTP/1.1" 200 1078 +p213.54.168.132.tisdip.tiscali.de - - [08/Mar/2004:05:00:52 -0800] "GET /ops/SP/play//view/Main/WebHome HTTP/1.1" 200 10419 +p213.54.168.132.tisdip.tiscali.de - - [08/Mar/2004:05:01:02 -0800] "GET /ops/SP/play//view/Main/SpamAssassinAndPostFix HTTP/1.1" 200 4034 +p213.54.168.132.tisdip.tiscali.de - - [08/Mar/2004:05:01:14 -0800] "GET /ops/SP/play//view/Main/SpamAssassinTaggingOnly HTTP/1.1" 200 5691 +64.242.88.10 - - [08/Mar/2004:05:01:58 -0800] "GET /ops/SP/play//view/TWiki/WhatIsWikiWiki HTTP/1.1" 200 4234 +200.160.249.68.bmf.com.br - - [08/Mar/2004:05:02:06 -0800] "GET /ops/SP/play//view/Main/WebHome HTTP/1.0" 200 10392 +200.160.249.68.bmf.com.br - - [08/Mar/2004:05:02:07 -0800] "GET /go/bin/test/TWikiLogos/twikiRobot46x50.gif HTTP/1.0" 200 2877 +64.242.88.10 - - [08/Mar/2004:05:03:13 -0800] "GET /ops/SP/play//view/Main/WebIndex?rev=1.1 HTTP/1.1" 200 44960 +64.242.88.10 - - [08/Mar/2004:05:13:35 -0800] "GET /mailman/private/hs_support/ HTTP/1.1" 200 1549 +68-174-110-154.nyc.rr.com - - [08/Mar/2004:05:16:15 -0800] "GET /razor.jsp HTTP/1.1" 200 2869 +68-174-110-154.nyc.rr.com - - [08/Mar/2004:05:16:20 -0800] "GET /favicon.ico HTTP/1.1" 200 1078 +64.242.88.10 - - [08/Mar/2004:05:22:57 -0800] "GET /ops/SP/play//attach/Sandbox/WebHome HTTP/1.1" 401 12846 +p213.54.168.132.tisdip.tiscali.de - - [08/Mar/2004:05:23:37 -0800] "GET /ops/SP/play//view/Main/SpamAssassinDeleting HTTP/1.1" 200 5543 +66-194-6-70.gen.twtelecom.net - - [08/Mar/2004:05:24:18 -0800] "GET / HTTP/1.1" 200 3169 +64.242.88.10 - - [08/Mar/2004:05:24:29 -0800] "GET /ops/SP/play//edit/TWiki/UnchangeableTopicBug?topicparent=TWiki.TWikiHistory HTTP/1.1" 401 12846 +p213.54.168.132.tisdip.tiscali.de - - [08/Mar/2004:05:24:50 -0800] "GET /ops/SP/play//view/Main/SpamAssassinUsingRazorAndDCC HTTP/1.1" 200 7435 +p213.54.168.132.tisdip.tiscali.de - - [08/Mar/2004:05:25:46 -0800] "GET /ops/SP/play//view/Main/Postfix HTTP/1.1" 200 3699 +64.242.88.10 - - [08/Mar/2004:05:26:02 -0800] "GET /ops/SP/play//view/Main/TWikiGuest?skin=print HTTP/1.1" 200 2372 +p213.54.168.132.tisdip.tiscali.de - - [08/Mar/2004:05:26:06 -0800] "GET /ops/SP/play//edit/Main/UvscanAndPostFix?topicparent=Main.WebHome HTTP/1.1" 401 12851 +p213.54.168.132.tisdip.tiscali.de - - [08/Mar/2004:05:26:08 -0800] "GET /go/bin/test/TWikiDocGraphics/help.gif HTTP/1.1" 200 130 +p213.54.168.132.tisdip.tiscali.de - - [08/Mar/2004:05:26:16 -0800] "GET /ops/SP/play//view/Main/DCCAndPostFix HTTP/1.1" 200 5253 +64.242.88.10 - - [08/Mar/2004:05:30:07 -0800] "GET /ops/SP/play//view/TWiki/SvenDowideit?rev=1.1 HTTP/1.1" 200 3564 +64.242.88.10 - - [08/Mar/2004:05:31:47 -0800] "GET /ops/SP/play//edit/Main/Maps_rbl_reject_code?topicparent=Main.ConfigurationVariables HTTP/1.1" 401 12846 +lj1027.passgo.com - - [08/Mar/2004:05:32:01 -0800] "GET /ops/SP/play//view/TWiki/2fa HTTP/1.0" 200 4615 +64.242.88.10 - - [08/Mar/2004:05:34:33 -0800] "GET /ops/SP/play//search/Main/SearchResult?scope=text®ex=on&search=Web%20*Changes[^A-Za-z] HTTP/1.1" 200 4829 +64.242.88.10 - - [08/Mar/2004:05:36:56 -0800] "GET /ops/SP/play//edit/Main/WebStatistics?t=1078690975 HTTP/1.1" 401 12851 +68-174-110-154.nyc.rr.com - - [08/Mar/2004:05:38:57 -0800] "GET /razor.jsp HTTP/1.1" 304 - +64.242.88.10 - - [08/Mar/2004:05:42:06 -0800] "GET /ops/SP/play//view/Main/RelayGateway?rev=1.3 HTTP/1.1" 200 4232 +64.242.88.10 - - [08/Mar/2004:05:47:38 -0800] "GET /robots.txt HTTP/1.1" 200 68 +64.242.88.10 - - [08/Mar/2004:05:48:48 -0800] "GET /ops/SP/play//rdiff/TWiki/KevinKinnell?rev1=1.4&rev2=1.3 HTTP/1.1" 200 4369 +64.242.88.10 - - [08/Mar/2004:05:51:45 -0800] "GET /ops/SP/play//view/TWiki/WelcomeGuest?rev=r1.11 HTTP/1.1" 200 13102 +64.242.88.10 - - [08/Mar/2004:05:56:08 -0800] "GET /ops/SP/play//view/TWiki/TWikiRegistration?rev=r1.4 HTTP/1.1" 200 12113 +64.242.88.10 - - [08/Mar/2004:05:57:15 -0800] "GET /ops/SP/play//edit/TWiki/TWikiCodevTWikiEnhancementRequests?topicparent=TWiki.TWikiHistory HTTP/1.1" 401 12851 +64.242.88.10 - - [08/Mar/2004:05:58:39 -0800] "GET /ops/SP/play//search/TWiki/SearchResult?scope=text®ex=on&search=Peter%20*Fokkinga[^A-Za-z] HTTP/1.1" 200 4388 +64.242.88.10 - - [08/Mar/2004:06:01:51 -0800] "GET /ops/SP/play//attach/Main/WebPreferences HTTP/1.1" 401 12851 +64.242.88.10 - - [08/Mar/2004:06:09:37 -0800] "GET /mailman/admin/hs_rcafaculty HTTP/1.1" 200 2144 +64.242.88.10 - - [08/Mar/2004:06:17:13 -0800] "GET /ops/SP/play//rdiff/TWiki/WebChanges HTTP/1.1" 200 114167 +64.242.88.10 - - [08/Mar/2004:06:20:36 -0800] "GET /ops/SP/play//view/Main/JorisBenschop?skin=print HTTP/1.1" 200 2717 +64.242.88.10 - - [08/Mar/2004:06:23:52 -0800] "GET /ops/SP/play//edit/TWiki/TestArea?topicparent=TWiki.WelcomeGuest HTTP/1.1" 401 12846 +64.242.88.10 - - [08/Mar/2004:06:32:14 -0800] "GET /ops/SP/play//view/TWiki/WelcomeGuest?rev=r1.6 HTTP/1.1" 200 12620 +64.242.88.10 - - [08/Mar/2004:06:37:19 -0800] "GET /ops/SP/play//rdiff/TWiki/HaroldGottschalk?rev1=1.2&rev2=1.1 HTTP/1.1" 200 5389 +64.242.88.10 - - [08/Mar/2004:06:41:22 -0800] "GET /pipermail/techcomm/ HTTP/1.1" 200 1176 +64.242.88.10 - - [08/Mar/2004:06:42:29 -0800] "GET /ops/SP/play//view/TWiki/TextFormattingRules?rev=r1.19 HTTP/1.1" 200 20488 +64.242.88.10 - - [08/Mar/2004:06:43:32 -0800] "GET /ops/SP/play//edit/Sandbox/TestTopic2?topicparent=Sandbox.WebHome HTTP/1.1" 401 12846 +128.227.88.79 - - [08/Mar/2004:06:47:41 -0800] "GET /ops/SP/play//view/Main/WebHome HTTP/1.1" 200 10419 +128.227.88.79 - - [08/Mar/2004:06:47:41 -0800] "GET /go/bin/test/TWikiLogos/twikiRobot46x50.gif HTTP/1.1" 200 2877 +64.242.88.10 - - [08/Mar/2004:06:49:27 -0800] "GET /ops/SP/play//attach/TWiki/InterWikis HTTP/1.1" 401 12846 +64.242.88.10 - - [08/Mar/2004:06:54:30 -0800] "GET /ops/SP/play//rdiff/TWiki/TWikiSkins?rev1=1.11&rev2=1.10 HTTP/1.1" 200 5711 +64.242.88.10 - - [08/Mar/2004:06:57:09 -0800] "GET /ops/SP/play//rdiff/TWiki/WebNotify HTTP/1.1" 200 11780 +128.227.88.79 - - [08/Mar/2004:06:57:46 -0800] "GET /ops/SP/play//view/Main/WebHome HTTP/1.1" 200 10419 +128.227.88.79 - - [08/Mar/2004:06:57:46 -0800] "GET /go/bin/test/TWikiLogos/twikiRobot46x50.gif HTTP/1.1" 304 - +64.242.88.10 - - [08/Mar/2004:07:00:15 -0800] "GET /ops/SP/play//view/TWiki/DontNotify?rev=1.1 HTTP/1.1" 200 3965 +64.242.88.10 - - [08/Mar/2004:07:07:13 -0800] "GET /ops/SP/play//edit/Main/Masquerade_classes?topicparent=Main.ConfigurationVariables HTTP/1.1" 401 12846 +128.227.88.79 - - [08/Mar/2004:07:09:12 -0800] "GET /ops/SP/play//view/Main/SpamAssassin HTTP/1.1" 200 4081 +64.242.88.10 - - [08/Mar/2004:07:09:21 -0800] "GET /ops/SP/play//view/Main/WebPreferences?rev=r1.10 HTTP/1.1" 200 8312 +64.242.88.10 - - [08/Mar/2004:07:10:26 -0800] "GET /ops/SP/play//view/TWiki/HaroldGottschalk?rev=1.2 HTTP/1.1" 200 3774 +64.242.88.10 - - [08/Mar/2004:07:11:37 -0800] "GET /ops/SP/play//edit/TWiki/TWikiCodevTWikiPlannedFeatures?topicparent=TWiki.TWikiHistory HTTP/1.1" 401 12851 +64.242.88.10 - - [08/Mar/2004:07:12:39 -0800] "GET /ops/SP/play//view/TWiki/TWikiHistory?rev=r1.44 HTTP/1.1" 200 41434 +64.242.88.10 - - [08/Mar/2004:07:22:13 -0800] "GET /ops/SP/play//view/TWiki/PeterFokkinga?rev=1.2 HTTP/1.1" 200 3748 +64.242.88.10 - - [08/Mar/2004:07:23:38 -0800] "GET /ops/SP/play//edit/TWiki/TWikiPlugins?t=1078696313 HTTP/1.1" 401 12846 +64.242.88.10 - - [08/Mar/2004:07:24:43 -0800] "GET /mailman/listinfo/webct HTTP/1.1" 200 6377 +64.242.88.10 - - [08/Mar/2004:07:25:56 -0800] "GET /razor.jsp HTTP/1.1" 200 2869 +64.242.88.10 - - [08/Mar/2004:07:27:01 -0800] "GET /mailman/listinfo/faculty HTTP/1.1" 200 6054 +61.9.4.61 - - [08/Mar/2004:07:27:36 -0800] "GET /_vti_bin/owssvr.dll?UL=1&ACT=4&BUILD=2614&STRMVER=4&CAPREQ=0 HTTP/1.0" 404 284 +61.9.4.61 - - [08/Mar/2004:07:27:36 -0800] "GET /SpamAssassin.jsp HTTP/1.0" 200 7368 +61.9.4.61 - - [08/Mar/2004:07:27:37 -0800] "GET /MSOffice/cltreq.asp?UL=1&ACT=4&BUILD=2614&STRMVER=4&CAPREQ=0 HTTP/1.0" 404 284 +64.242.88.10 - - [08/Mar/2004:07:28:29 -0800] "GET /mailman/admin/sswk HTTP/1.1" 200 2072 +64.242.88.10 - - [08/Mar/2004:07:29:56 -0800] "GET /mailman/listinfo/purchasing HTTP/1.1" 200 6050 +64.242.88.10 - - [08/Mar/2004:07:35:50 -0800] "GET /ops/SP/play//edit/Main/Invalid_hostname_reject_code?topicparent=Main.ConfigurationVariables HTTP/1.1" 401 12846 +64.242.88.10 - - [08/Mar/2004:07:39:31 -0800] "GET /ops/SP/play//rdiff/Main/WebPreferences?rev1=1.14&rev2=1.13 HTTP/1.1" 200 7207 +64.242.88.10 - - [08/Mar/2004:07:40:54 -0800] "GET /ops/SP/play//rename/TWiki/TWikiHistory HTTP/1.1" 401 12846 +64.242.88.10 - - [08/Mar/2004:07:43:21 -0800] "GET /ops/SP/play//view/TWiki/SearchDoesNotWork?rev=r1.2 HTTP/1.1" 200 4072 +64.242.88.10 - - [08/Mar/2004:07:44:53 -0800] "GET /ops/SP/play//view/TWiki/TWikiHistory?rev=r1.50 HTTP/1.1" 200 42285 +64.242.88.10 - - [08/Mar/2004:07:49:56 -0800] "GET /ops/SP/play//edit/TWiki/RyanFreebern?t=1078701457 HTTP/1.1" 401 12846 +64.242.88.10 - - [08/Mar/2004:07:51:39 -0800] "GET /ops/SP/play//view/Main/WebPreferences?rev=r1.2 HTTP/1.1" 200 6061 +64.242.88.10 - - [08/Mar/2004:07:53:19 -0800] "GET /ops/SP/play//rdiff/TWiki/WebTopicEditTemplate HTTP/1.1" 200 7895 +mcl02.tnr.on.ca - - [08/Mar/2004:07:53:37 -0800] "GET /ie.htm HTTP/1.1" 200 3518 +mcl02.tnr.on.ca - - [08/Mar/2004:07:53:38 -0800] "GET /images/image005.jpg HTTP/1.1" 200 21125 +mcl02.tnr.on.ca - - [08/Mar/2004:07:53:38 -0800] "GET /images/image004.jpg HTTP/1.1" 200 10936 +mcl02.tnr.on.ca - - [08/Mar/2004:07:53:38 -0800] "GET /images/msgops.JPG HTTP/1.1" 200 7939 +64.242.88.10 - - [08/Mar/2004:07:54:30 -0800] "GET /ops/SP/play//edit/Main/Unknown_local_recipient_reject_code?topicparent=Main.ConfigurationVariables HTTP/1.1" 401 12846 +64.242.88.10 - - [08/Mar/2004:07:56:34 -0800] "GET /ops/SP/play//search/Main/SearchResult?scope=text®ex=on&search=Web%20*Index[^A-Za-z] HTTP/1.1" 200 4163 +64.242.88.10 - - [08/Mar/2004:08:04:46 -0800] "GET /SpamAssassin.jsp HTTP/1.1" 200 7368 +p5083cd5d.dip0.t-ipconnect.de - - [08/Mar/2004:08:09:32 -0800] "GET /SpamAssassin.jsp HTTP/1.0" 200 7368 +64.242.88.10 - - [08/Mar/2004:08:12:50 -0800] "GET /ops/SP/play//view/TWiki/ChangePassword?rev=r1.6 HTTP/1.1" 200 5181 +64.242.88.10 - - [08/Mar/2004:08:14:15 -0800] "GET /ops/SP/play//edit/TWiki/HaroldGottschalk?t=1078717948 HTTP/1.1" 401 12846 +64.242.88.10 - - [08/Mar/2004:08:15:21 -0800] "GET /ops/SP/play//edit/Main/Expand_owner_alias?topicparent=Main.ConfigurationVariables HTTP/1.1" 401 12846 +64.242.88.10 - - [08/Mar/2004:08:17:09 -0800] "GET /ops/SP/play//view/Main/WebIndex?rev=r1.2 HTTP/1.1" 200 45059 +64.242.88.10 - - [08/Mar/2004:08:18:52 -0800] "GET /rfc.jsp HTTP/1.1" 200 3103 +pool-68-160-195-60.ny325.east.verizon.net - - [08/Mar/2004:08:21:00 -0800] "GET / HTTP/1.1" 200 3169 +pool-68-160-195-60.ny325.east.verizon.net - - [08/Mar/2004:08:21:00 -0800] "GET /favicon.ico HTTP/1.1" 200 1078 +64.242.88.10 - - [08/Mar/2004:08:21:47 -0800] "GET /ops/SP/play//search/Main/SearchResult?scope=text®ex=on&search=RBLs%20*How%20*To[^A-Za-z] HTTP/1.1" 200 3575 +64.242.88.10 - - [08/Mar/2004:08:25:37 -0800] "GET /ops/SP/play//rdiff/TWiki/WebTopicEditTemplate?rev1=1.5&rev2=1.4 HTTP/1.1" 200 4212 +212.92.37.62 - - [08/Mar/2004:08:26:41 -0800] "GET / HTTP/1.1" 200 3169 +212.92.37.62 - - [08/Mar/2004:08:27:04 -0800] "GET /ops/SP/play//view/Main/WebHome HTTP/1.1" 200 10419 +212.92.37.62 - - [08/Mar/2004:08:27:08 -0800] "GET /go/bin/test/TWikiLogos/twikiRobot46x50.gif HTTP/1.1" 200 2877 +64.242.88.10 - - [08/Mar/2004:08:27:14 -0800] "GET /ops/SP/play//rdiff/Main/SpamAssassin HTTP/1.1" 200 4445 +212.92.37.62 - - [08/Mar/2004:08:27:23 -0800] "GET /ops/SP/play//view/Main/SpamAssassinAndPostFix HTTP/1.1" 200 4034 +212.92.37.62 - - [08/Mar/2004:08:27:28 -0800] "GET /ops/SP/play//view/Main/SpamAssassinTaggingOnly HTTP/1.1" 200 5691 +64.242.88.10 - - [08/Mar/2004:08:28:23 -0800] "GET /ops/SP/play//rdiff/Main/TokyoOffice?rev1=1.2&rev2=1.1 HTTP/1.1" 200 7316 +64.242.88.10 - - [08/Mar/2004:08:29:36 -0800] "GET /ops/SP/play//view/TWiki/TWikiCategoryTable HTTP/1.1" 200 3729 +219.95.17.51 - - [08/Mar/2004:08:29:57 -0800] "GET / HTTP/1.1" 200 3169 +212.92.37.62 - - [08/Mar/2004:08:30:25 -0800] "GET /ops/SP/play//view/Main/SpamAssassinDeleting HTTP/1.1" 200 5543 +212.92.37.62 - - [08/Mar/2004:08:31:37 -0800] "GET /ops/SP/play//view/Main/DCCAndPostFix HTTP/1.1" 200 5253 +10.0.0.176 - - [08/Mar/2004:08:32:24 -0800] "GET / HTTP/1.1" 304 - +10.0.0.176 - - [08/Mar/2004:08:32:27 -0800] "GET /ops/SP/play//view/Main/WebHome HTTP/1.1" 200 10419 +10.0.0.176 - - [08/Mar/2004:08:32:27 -0800] "GET /go/bin/test/TWikiLogos/twikiRobot46x50.gif HTTP/1.1" 304 - +212.92.37.62 - - [08/Mar/2004:08:32:34 -0800] "GET /ops/SP/play//view/Main/SpamAssassinUsingRazorAndDCC HTTP/1.1" 200 7435 +212.92.37.62 - - [08/Mar/2004:08:33:27 -0800] "GET /ops/SP/play//view/Main/PostfixCommands HTTP/1.1" 200 4016 +212.92.37.62 - - [08/Mar/2004:08:33:30 -0800] "GET /ops/SP/play//view/Main/PostfixCmd HTTP/1.1" 200 4173 +212.92.37.62 - - [08/Mar/2004:08:33:39 -0800] "GET /ops/SP/play//view/Main/PostSuper HTTP/1.1" 200 3629 +64.242.88.10 - - [08/Mar/2004:08:33:51 -0800] "GET /ops/SP/play//view/Main/WebPreferences?rev=r1.14 HTTP/1.1" 200 8820 +212.92.37.62 - - [08/Mar/2004:08:33:52 -0800] "GET /ops/SP/play//view/Main/SideBar HTTP/1.1" 200 3972 +212.92.37.62 - - [08/Mar/2004:08:33:57 -0800] "GET /ops/SP/play//view/Main/DCCGraphs HTTP/1.1" 200 5402 +212.92.37.62 - - [08/Mar/2004:08:34:09 -0800] "GET /SpamAssassin.jsp HTTP/1.1" 200 7368 +64.242.88.10 - - [08/Mar/2004:08:34:53 -0800] "GET /ops/SP/play//rdiff/TWiki/TWikiHistory?rev1=1.8&rev2=1.7 HTTP/1.1" 200 4972 +64.242.88.10 - - [08/Mar/2004:08:36:05 -0800] "GET /ops/SP/play//view/TWiki/ChangePassword?rev=r1.3 HTTP/1.1" 200 5229 +92-moc-6.acn.waw.pl - - [08/Mar/2004:08:37:14 -0800] "GET /ops/SP/play//view/Main/SpamAssassinAndPostFix HTTP/1.1" 200 4034 +92-moc-6.acn.waw.pl - - [08/Mar/2004:08:37:14 -0800] "GET /go/bin/test/TWikiLogos/twikiRobot46x50.gif HTTP/1.1" 304 - +92-moc-6.acn.waw.pl - - [08/Mar/2004:08:37:17 -0800] "GET /ops/SP/play//view/Main/SpamAssassinTaggingOnly HTTP/1.1" 200 5691 +64.242.88.10 - - [08/Mar/2004:08:37:23 -0800] "GET /ops/SP/play//attach/TWiki/HaroldGottschalk HTTP/1.1" 401 12846 +66.213.206.2 - - [08/Mar/2004:08:37:53 -0800] "GET / HTTP/1.1" 200 3169 +64.242.88.10 - - [08/Mar/2004:08:40:15 -0800] "GET /LateEmail.jsp HTTP/1.1" 200 7649 +64.242.88.10 - - [08/Mar/2004:08:52:13 -0800] "GET /ops/SP/play//view/TWiki/TextFormattingRules?rev=r1.15 HTTP/1.1" 200 16746 +64.242.88.10 - - [08/Mar/2004:08:53:17 -0800] "GET /ops/SP/play//view/TWiki/TWikiTutorial HTTP/1.1" 200 14485 +64.242.88.10 - - [08/Mar/2004:08:55:12 -0800] "GET /mailman/private/dentalstudies/ HTTP/1.1" 200 1558 +spot.nnacorp.com - - [08/Mar/2004:09:02:14 -0800] "GET / HTTP/1.1" 200 3169 +spot.nnacorp.com - - [08/Mar/2004:09:02:21 -0800] "GET /ops/SP/play//view/Main/WebHome HTTP/1.1" 200 10419 +spot.nnacorp.com - - [08/Mar/2004:09:02:21 -0800] "GET /go/bin/test/TWikiLogos/twikiRobot46x50.gif HTTP/1.1" 200 2877 +10.0.0.176 - - [08/Mar/2004:09:02:29 -0800] "GET / HTTP/1.1" 304 - +10.0.0.176 - - [08/Mar/2004:09:02:31 -0800] "GET /forplus/mailgraph2.cgi HTTP/1.1" 200 2987 +10.0.0.176 - - [08/Mar/2004:09:02:32 -0800] "GET /forplus/mailgraph.cgi/mailgraph_0_err.png HTTP/1.1" 200 7326 +10.0.0.176 - - [08/Mar/2004:09:02:32 -0800] "GET /forplus/mailgraph.cgi/mailgraph_0.png HTTP/1.1" 200 7927 +10.0.0.176 - - [08/Mar/2004:09:02:32 -0800] "GET /forplus/mailgraph.cgi/mailgraph_1_err.png HTTP/1.1" 200 7182 +10.0.0.176 - - [08/Mar/2004:09:02:32 -0800] "GET /forplus/mailgraph.cgi/mailgraph_1.png HTTP/1.1" 200 8866 +10.0.0.176 - - [08/Mar/2004:09:02:32 -0800] "GET /forplus/mailgraph.cgi/mailgraph_2.png HTTP/1.1" 200 9307 +10.0.0.176 - - [08/Mar/2004:09:02:32 -0800] "GET /forplus/mailgraph.cgi/mailgraph_2_err.png HTTP/1.1" 200 6805 +10.0.0.176 - - [08/Mar/2004:09:02:32 -0800] "GET /forplus/mailgraph.cgi/mailgraph_3.png HTTP/1.1" 200 6596 +10.0.0.176 - - [08/Mar/2004:09:02:32 -0800] "GET /forplus/mailgraph.cgi/mailgraph_3_err.png HTTP/1.1" 200 5499 +spot.nnacorp.com - - [08/Mar/2004:09:02:54 -0800] "GET /ops/SP/play//view/Main/TWikiUsers HTTP/1.1" 200 6697 +spot.nnacorp.com - - [08/Mar/2004:09:02:54 -0800] "GET /go/bin/test/TWikiLogos/twikiRobot46x50.gif HTTP/1.1" 304 - +64.242.88.10 - - [08/Mar/2004:09:03:18 -0800] "GET /ststats/index.jsp HTTP/1.1" 200 2955 +64.242.88.10 - - [08/Mar/2004:09:05:54 -0800] "GET /ops/SP/play//edit/Sandbox/TestTopic6?topicparent=Sandbox.WebHome HTTP/1.1" 401 12846 +64.242.88.10 - - [08/Mar/2004:09:09:55 -0800] "GET /ops/SP/play//view/TWiki/TablePlugin?skin=print HTTP/1.1" 200 1572 +64.242.88.10 - - [08/Mar/2004:09:12:54 -0800] "GET /ops/SP/play//search/Main/SearchResult?scope=text®ex=on&search=Spam%20*Assassin[^A-Za-z] HTTP/1.1" 200 8782 +lhr003a.dhl.com - - [08/Mar/2004:09:16:26 -0800] "GET / HTTP/1.0" 200 3169 +lhr003a.dhl.com - - [08/Mar/2004:09:17:16 -0800] "GET /ststats/index.jsp HTTP/1.0" 200 2955 +lhr003a.dhl.com - - [08/Mar/2004:09:17:17 -0800] "GET /ststats/stats-spam.1day.png HTTP/1.0" 200 3040 +lhr003a.dhl.com - - [08/Mar/2004:09:17:17 -0800] "GET /ststats/stats-spam-ratio.1week.png HTTP/1.0" 200 2341 +lhr003a.dhl.com - - [08/Mar/2004:09:17:17 -0800] "GET /ststats/stats-spam-ratio.1day.png HTTP/1.0" 200 2271 +lhr003a.dhl.com - - [08/Mar/2004:09:17:17 -0800] "GET /ststats/stats-spam.1week.png HTTP/1.0" 200 3302 +lhr003a.dhl.com - - [08/Mar/2004:09:17:17 -0800] "GET /ststats/stats-hashes.1week.png HTTP/1.0" 200 1663 +lhr003a.dhl.com - - [08/Mar/2004:09:17:17 -0800] "GET /ststats/stats-spam.1month.png HTTP/1.0" 200 2521 +lhr003a.dhl.com - - [08/Mar/2004:09:17:17 -0800] "GET /ststats/stats-spam-ratio.1month.png HTTP/1.0" 200 1918 +lhr003a.dhl.com - - [08/Mar/2004:09:17:17 -0800] "GET /ststats/stats-hashes.1month.png HTTP/1.0" 200 1580 +lhr003a.dhl.com - - [08/Mar/2004:09:17:17 -0800] "GET /ststats/stats-spam.1year.png HTTP/1.0" 200 2202 +lhr003a.dhl.com - - [08/Mar/2004:09:17:18 -0800] "GET /ststats/stats-spam-ratio.1year.png HTTP/1.0" 200 1822 +lhr003a.dhl.com - - [08/Mar/2004:09:17:18 -0800] "GET /ststats/stats-hashes.1year.png HTTP/1.0" 200 1526 +10.0.0.176 - - [08/Mar/2004:09:18:53 -0800] "GET / HTTP/1.1" 304 - +10.0.0.176 - - [08/Mar/2004:09:18:56 -0800] "GET /ststats/index.jsp HTTP/1.1" 304 - +10.0.0.176 - - [08/Mar/2004:09:18:57 -0800] "GET /ststats/stats-spam.1day.png HTTP/1.1" 200 3040 +10.0.0.176 - - [08/Mar/2004:09:18:57 -0800] "GET /ststats/stats-spam-ratio.1day.png HTTP/1.1" 200 2271 +10.0.0.176 - - [08/Mar/2004:09:18:57 -0800] "GET /ststats/stats-spam-ratio.1week.png HTTP/1.1" 200 2341 +10.0.0.176 - - [08/Mar/2004:09:18:57 -0800] "GET /ststats/stats-spam.1week.png HTTP/1.1" 200 3302 +10.0.0.176 - - [08/Mar/2004:09:18:57 -0800] "GET /ststats/stats-hashes.1month.png HTTP/1.1" 200 1580 +10.0.0.176 - - [08/Mar/2004:09:18:57 -0800] "GET /ststats/stats-spam-ratio.1month.png HTTP/1.1" 200 1918 +10.0.0.176 - - [08/Mar/2004:09:18:57 -0800] "GET /ststats/stats-hashes.1week.png HTTP/1.1" 200 1663 +10.0.0.176 - - [08/Mar/2004:09:18:57 -0800] "GET /ststats/stats-spam.1year.png HTTP/1.1" 200 2202 +10.0.0.176 - - [08/Mar/2004:09:18:57 -0800] "GET /ststats/stats-spam.1month.png HTTP/1.1" 200 2521 +10.0.0.176 - - [08/Mar/2004:09:18:57 -0800] "GET /ststats/stats-spam-ratio.1year.png HTTP/1.1" 200 1822 +10.0.0.176 - - [08/Mar/2004:09:18:57 -0800] "GET /ststats/stats-hashes.1year.png HTTP/1.1" 200 1526 +64.242.88.10 - - [08/Mar/2004:09:23:03 -0800] "GET /ops/SP/play//view/TWiki/SearchDoesNotWork?rev=r1.1 HTTP/1.1" 200 3981 +64.242.88.10 - - [08/Mar/2004:09:25:42 -0800] "GET /ops/SP/play//search/TWiki/SearchResult?scope=text®ex=on&search=TWiki%20*FAQ[^A-Za-z] HTTP/1.1" 200 12083 +lj1036.passgo.com - - [08/Mar/2004:09:29:35 -0800] "GET /robots.txt HTTP/1.0" 200 68 +lj1027.passgo.com - - [08/Mar/2004:09:29:36 -0800] "GET /ops/SP/play//oops/Know/WinDoze95Crash HTTP/1.0" 200 209 +pool-68-160-195-60.ny325.east.verizon.net - - [08/Mar/2004:09:30:10 -0800] "GET /ops/SP/play//view/Main/WebHome HTTP/1.1" 200 10419 +pool-68-160-195-60.ny325.east.verizon.net - - [08/Mar/2004:09:30:11 -0800] "GET /favicon.ico HTTP/1.1" 200 1078 +pool-68-160-195-60.ny325.east.verizon.net - - [08/Mar/2004:09:30:11 -0800] "GET /go/bin/test/TWikiLogos/twikiRobot46x50.gif HTTP/1.1" 200 2877 +64.242.88.10 - - [08/Mar/2004:09:30:40 -0800] "GET /ops/SP/play//view/TWiki/WebSearch?rev=r1.10 HTTP/1.1" 200 9419 +64.242.88.10 - - [08/Mar/2004:09:32:32 -0800] "GET /ops/SP/play//rdiff/TWiki/TWikiDownload HTTP/1.1" 200 5933 +64.242.88.10 - - [08/Mar/2004:09:33:46 -0800] "GET /ops/SP/play//view/Main/SideBar?rev=1.1 HTTP/1.1" 200 3564 +lj1156.passgo.com - - [08/Mar/2004:09:33:53 -0800] "GET /ops/SP/play//oops/TWiki/TWikiAccessControl HTTP/1.0" 200 209 +64.242.88.10 - - [08/Mar/2004:09:34:58 -0800] "GET /ops/SP/play//rdiff/TWiki/TWikiFAQ HTTP/1.1" 200 43115 +64.242.88.10 - - [08/Mar/2004:09:36:35 -0800] "GET /ops/SP/play//edit/TWiki/WebNotification?topicparent=TWiki.TWikiUpgradeTo01May2000 HTTP/1.1" 401 12846 +64.242.88.10 - - [08/Mar/2004:09:38:11 -0800] "GET /ops/SP/play//view/Main/TWikiGuest?rev=r1.3 HTTP/1.1" 200 4604 +lj1156.passgo.com - - [08/Mar/2004:09:40:30 -0800] "GET /ops/SP/play//view/TWiki/d43 HTTP/1.0" 200 4619 +64.242.88.10 - - [08/Mar/2004:09:41:15 -0800] "GET /ops/SP/play//edit/Main/Export_environment?topicparent=Main.ConfigurationVariables HTTP/1.1" 401 12846 +64.242.88.10 - - [08/Mar/2004:09:42:27 -0800] "GET /ops/SP/play//rdiff/Know/ReadmeFirst?rev1=1.6&rev2=1.5 HTTP/1.1" 200 4187 +64.242.88.10 - - [08/Mar/2004:09:45:15 -0800] "GET /ops/SP/play//search/TWiki/SearchResult?scope=text®ex=on&search=Change%20*Password[^A-Za-z] HTTP/1.1" 200 7226 +64.242.88.10 - - [08/Mar/2004:10:01:06 -0800] "GET /ops/SP/play//view/TWiki/TWikiTopics?rev=r1.4 HTTP/1.1" 200 5171 +64.242.88.10 - - [08/Mar/2004:10:05:40 -0800] "GET /ops/SP/play//view/TWiki/WebSearch?rev=r1.9 HTTP/1.1" 200 9469 +lj1164.passgo.com - - [08/Mar/2004:10:06:28 -0800] "GET /ops/SP/play//view/Main/DCCGraphs HTTP/1.0" 200 5383 +64.242.88.10 - - [08/Mar/2004:10:08:02 -0800] "GET /ops/SP/play//rename/TWiki/DefaultPlugin HTTP/1.1" 401 12846 +64.242.88.10 - - [08/Mar/2004:10:09:52 -0800] "GET /ops/SP/play//view/Main/TWikiGuest?rev=r1.1 HTTP/1.1" 200 3763 +64.242.88.10 - - [08/Mar/2004:10:14:46 -0800] "GET /ops/SP/play//edit/TWiki/TWikiRegistration?t=1078670224 HTTP/1.1" 401 12851 +64.242.88.10 - - [08/Mar/2004:10:16:52 -0800] "GET /ops/SP/play//view/Main/TWikiAdminGroup?rev=1.6 HTTP/1.1" 200 4462 +64.242.88.10 - - [08/Mar/2004:10:18:21 -0800] "GET /ops/SP/play//rdiff/TWiki/WikiSyntax HTTP/1.1" 200 59454 +64.242.88.10 - - [08/Mar/2004:10:21:21 -0800] "GET /ops/SP/play//oops/TWiki/WikiCulture?template=oopsmore¶m1=1.8¶m2=1.8 HTTP/1.1" 200 11245 +64.242.88.10 - - [08/Mar/2004:10:30:56 -0800] "GET /ops/SP/play//view/TWiki/WikiTopic HTTP/1.1" 200 4646 +64.242.88.10 - - [08/Mar/2004:10:32:18 -0800] "GET /ops/SP/play//rdiff/TWiki/WebPreferences HTTP/1.1" 200 36410 +64.242.88.10 - - [08/Mar/2004:10:34:55 -0800] "GET /ops/SP/play//view/TWiki/WebSearch?skin=print HTTP/1.1" 200 7196 +64.242.88.10 - - [08/Mar/2004:10:40:09 -0800] "GET /ops/SP/play//view/TWiki/TWikiTopics?rev=r1.7 HTTP/1.1" 200 8540 +64.242.88.10 - - [08/Mar/2004:10:45:25 -0800] "GET /ops/SP/play//search/Main/SearchResult?scope=text®ex=on&search=Thanadon%20*Somdee[^A-Za-z] HTTP/1.1" 200 4287 +64.242.88.10 - - [08/Mar/2004:10:46:34 -0800] "GET /ops/SP/play//view/TWiki/TWikiUpgradeTo01May2000?rev=1.3 HTTP/1.1" 200 7441 +10.0.0.176 - - [08/Mar/2004:10:48:02 -0800] "GET / HTTP/1.1" 304 - +10.0.0.176 - - [08/Mar/2004:10:48:05 -0800] "GET /forplus/mailgraph2.cgi HTTP/1.1" 200 2987 +10.0.0.176 - - [08/Mar/2004:10:48:06 -0800] "GET /forplus/mailgraph.cgi/mailgraph_0_err.png HTTP/1.1" 200 7213 +10.0.0.176 - - [08/Mar/2004:10:48:06 -0800] "GET /forplus/mailgraph.cgi/mailgraph_0.png HTTP/1.1" 200 7970 +10.0.0.176 - - [08/Mar/2004:10:48:06 -0800] "GET /forplus/mailgraph.cgi/mailgraph_1_err.png HTTP/1.1" 200 7254 +10.0.0.176 - - [08/Mar/2004:10:48:06 -0800] "GET /forplus/mailgraph.cgi/mailgraph_1.png HTTP/1.1" 200 8821 +10.0.0.176 - - [08/Mar/2004:10:48:06 -0800] "GET /forplus/mailgraph.cgi/mailgraph_2_err.png HTTP/1.1" 200 6866 +10.0.0.176 - - [08/Mar/2004:10:48:06 -0800] "GET /forplus/mailgraph.cgi/mailgraph_2.png HTTP/1.1" 200 9312 +10.0.0.176 - - [08/Mar/2004:10:48:06 -0800] "GET /forplus/mailgraph.cgi/mailgraph_3.png HTTP/1.1" 200 6596 +10.0.0.176 - - [08/Mar/2004:10:48:06 -0800] "GET /forplus/mailgraph.cgi/mailgraph_3_err.png HTTP/1.1" 200 5499 +64.242.88.10 - - [08/Mar/2004:10:48:19 -0800] "GET /ops/SP/play//edit/Main/Max_use?topicparent=Main.ConfigurationVariables HTTP/1.1" 401 12846 +10.0.0.176 - - [08/Mar/2004:10:48:37 -0800] "GET /ststats/index.jsp HTTP/1.1" 304 - +10.0.0.176 - - [08/Mar/2004:10:48:37 -0800] "GET /ststats/stats-spam.1day.png HTTP/1.1" 200 3080 +10.0.0.176 - - [08/Mar/2004:10:48:37 -0800] "GET /ststats/stats-spam-ratio.1day.png HTTP/1.1" 200 2224 +10.0.0.176 - - [08/Mar/2004:10:48:37 -0800] "GET /ststats/stats-spam.1week.png HTTP/1.1" 200 3299 +10.0.0.176 - - [08/Mar/2004:10:48:37 -0800] "GET /ststats/stats-spam.1month.png HTTP/1.1" 200 2481 +10.0.0.176 - - [08/Mar/2004:10:48:37 -0800] "GET /ststats/stats-hashes.1week.png HTTP/1.1" 200 1667 +10.0.0.176 - - [08/Mar/2004:10:48:37 -0800] "GET /ststats/stats-spam-ratio.1week.png HTTP/1.1" 200 2346 +10.0.0.176 - - [08/Mar/2004:10:48:37 -0800] "GET /ststats/stats-spam-ratio.1month.png HTTP/1.1" 200 1872 +10.0.0.176 - - [08/Mar/2004:10:48:37 -0800] "GET /ststats/stats-hashes.1month.png HTTP/1.1" 200 1585 +10.0.0.176 - - [08/Mar/2004:10:48:37 -0800] "GET /ststats/stats-spam.1year.png HTTP/1.1" 200 2202 +10.0.0.176 - - [08/Mar/2004:10:48:37 -0800] "GET /ststats/stats-spam-ratio.1year.png HTTP/1.1" 200 1833 +10.0.0.176 - - [08/Mar/2004:10:48:37 -0800] "GET /ststats/stats-hashes.1year.png HTTP/1.1" 200 1521 +64.242.88.10 - - [08/Mar/2004:10:50:05 -0800] "GET /ops/SP/play//rdiff/TWiki/WebRss HTTP/1.1" 200 21483 +64.242.88.10 - - [08/Mar/2004:11:03:34 -0800] "GET /ops/SP/play//rdiff/TWiki/WikiCulture?rev1=1.8&rev2=1.7 HTTP/1.1" 200 5326 +128.227.88.79 - - [08/Mar/2004:11:06:20 -0800] "GET /ops/SP/play//view/Main/SpamAssassinAndPostFix HTTP/1.1" 200 4034 +128.227.88.79 - - [08/Mar/2004:11:06:20 -0800] "GET /go/bin/test/TWikiLogos/twikiRobot46x50.gif HTTP/1.1" 304 - +128.227.88.79 - - [08/Mar/2004:11:06:28 -0800] "GET /ops/SP/play//view/Main/SpamAssassinTaggingOnly HTTP/1.1" 200 5691 +64.242.88.10 - - [08/Mar/2004:11:09:24 -0800] "GET /ops/SP/play//edit/Main/Lmtp_mail_timeout?topicparent=Main.ConfigurationVariables HTTP/1.1" 401 12846 +128.227.88.79 - - [08/Mar/2004:11:10:09 -0800] "GET /ops/SP/play//view/Main/WebHome HTTP/1.1" 200 10419 +128.227.88.79 - - [08/Mar/2004:11:10:24 -0800] "GET /ops/SP/play//view/Main/PostfixCommands HTTP/1.1" 200 4016 +128.227.88.79 - - [08/Mar/2004:11:11:04 -0800] "GET /ops/SP/play//view/Main/WebHome HTTP/1.1" 200 10419 +128.227.88.79 - - [08/Mar/2004:11:11:10 -0800] "GET /ops/SP/play//view/Main/TWikiGroups HTTP/1.1" 200 4816 +128.227.88.79 - - [08/Mar/2004:11:11:15 -0800] "GET /ops/SP/play//view/Main/TWikiAdminGroup HTTP/1.1" 200 4175 +128.227.88.79 - - [08/Mar/2004:11:11:26 -0800] "GET /ops/SP/play//view/Main/WebHome HTTP/1.1" 200 10419 +64.242.88.10 - - [08/Mar/2004:11:11:51 -0800] "GET /ops/SP/play//edit/Main/TWikiGuest?t=1078713282 HTTP/1.1" 401 12846 +64.242.88.10 - - [08/Mar/2004:11:15:51 -0800] "GET /ops/SP/play//rdiff/TWiki/AdminSkillsAssumptions HTTP/1.1" 200 10368 +64.242.88.10 - - [08/Mar/2004:11:17:49 -0800] "GET /ops/SP/play//view/Sandbox/WebHome?rev=r1.3 HTTP/1.1" 200 8708 +64.242.88.10 - - [08/Mar/2004:11:19:43 -0800] "GET /ops/SP/play//edit/TWiki/WikiNotation?t=1078726052 HTTP/1.1" 401 12846 +64.242.88.10 - - [08/Mar/2004:11:24:12 -0800] "GET /ops/SP/play//search/TWiki/SearchResult?scope=text®ex=on&search=Wiki%20*Notation[^A-Za-z] HTTP/1.1" 200 6558 +64.242.88.10 - - [08/Mar/2004:11:25:16 -0800] "GET /ops/SP/play//oops/TWiki/WikiNotation?template=oopsmore¶m1=1.3¶m2=1.3 HTTP/1.1" 200 11263 +10.0.0.176 - - [08/Mar/2004:11:40:41 -0800] "GET /forplus/mailgraph2.cgi HTTP/1.1" 200 2987 +10.0.0.176 - - [08/Mar/2004:11:40:42 -0800] "GET /forplus/mailgraph.cgi/mailgraph_0_err.png HTTP/1.1" 200 7226 +10.0.0.176 - - [08/Mar/2004:11:40:42 -0800] "GET /forplus/mailgraph.cgi/mailgraph_0.png HTTP/1.1" 200 8055 +10.0.0.176 - - [08/Mar/2004:11:40:42 -0800] "GET /forplus/mailgraph.cgi/mailgraph_1.png HTTP/1.1" 200 8787 +10.0.0.176 - - [08/Mar/2004:11:40:42 -0800] "GET /forplus/mailgraph.cgi/mailgraph_1_err.png HTTP/1.1" 200 7088 +10.0.0.176 - - [08/Mar/2004:11:40:42 -0800] "GET /forplus/mailgraph.cgi/mailgraph_2_err.png HTTP/1.1" 200 6866 +10.0.0.176 - - [08/Mar/2004:11:40:42 -0800] "GET /forplus/mailgraph.cgi/mailgraph_3.png HTTP/1.1" 200 6596 +10.0.0.176 - - [08/Mar/2004:11:40:42 -0800] "GET /forplus/mailgraph.cgi/mailgraph_2.png HTTP/1.1" 200 9312 +10.0.0.176 - - [08/Mar/2004:11:40:42 -0800] "GET /forplus/mailgraph.cgi/mailgraph_3_err.png HTTP/1.1" 200 5499 +64.242.88.10 - - [08/Mar/2004:11:41:14 -0800] "GET /mailman/admin/artsscience HTTP/1.1" 200 2125 +64.242.88.10 - - [08/Mar/2004:11:43:17 -0800] "GET /ops/SP/play//search/Main/?scope=topic®ex=on&search=^d HTTP/1.1" 200 5036 +64.242.88.10 - - [08/Mar/2004:11:45:08 -0800] "GET /ops/SP/play//edit/TWiki/TWikiCodevFeatureToDo?topicparent=TWiki.TWikiHistory HTTP/1.1" 401 12846 +64.242.88.10 - - [08/Mar/2004:11:47:52 -0800] "GET /ops/SP/play//rename/TWiki/ResetPassword HTTP/1.1" 401 12851 +64.242.88.10 - - [08/Mar/2004:11:49:23 -0800] "GET /ops/SP/play//edit/Main/Fast_flush_domains?topicparent=Main.ConfigurationVariables HTTP/1.1" 401 12846 +64.242.88.10 - - [08/Mar/2004:11:51:20 -0800] "GET /ops/SP/play//edit/Main/SpamAssassin?t=1078709979 HTTP/1.1" 401 12846 +64.242.88.10 - - [08/Mar/2004:11:56:19 -0800] "GET /ops/SP/play//view/TWiki/TWikiTopics?rev=r1.10 HTTP/1.1" 200 14650 +64.242.88.10 - - [08/Mar/2004:11:57:28 -0800] "GET /ops/SP/play//view/TWiki/FileAttribute?rev=r1.2 HTTP/1.1" 200 3949 +64.242.88.10 - - [08/Mar/2004:12:00:26 -0800] "GET /ops/SP/play//rdiff/TWiki/TWikiEnhancementRequests HTTP/1.1" 200 10417 +64.242.88.10 - - [08/Mar/2004:12:06:03 -0800] "GET /ops/SP/play//search/TWiki/SearchResult?scope=text®ex=on&search=Kevin%20*Kinnell[^A-Za-z] HTTP/1.1" 200 4536 +10.0.0.176 - - [08/Mar/2004:12:06:29 -0800] "GET /forplus/mailgraph2.cgi HTTP/1.1" 200 2987 +10.0.0.176 - - [08/Mar/2004:12:06:29 -0800] "GET /forplus/mailgraph.cgi/mailgraph_0_err.png HTTP/1.1" 200 7192 +10.0.0.176 - - [08/Mar/2004:12:06:29 -0800] "GET /forplus/mailgraph.cgi/mailgraph_0.png HTTP/1.1" 200 8081 +10.0.0.176 - - [08/Mar/2004:12:06:29 -0800] "GET /forplus/mailgraph.cgi/mailgraph_1.png HTTP/1.1" 200 9065 +10.0.0.176 - - [08/Mar/2004:12:06:29 -0800] "GET /forplus/mailgraph.cgi/mailgraph_1_err.png HTTP/1.1" 200 7206 +10.0.0.176 - - [08/Mar/2004:12:06:29 -0800] "GET /forplus/mailgraph.cgi/mailgraph_2.png HTTP/1.1" 200 9312 +10.0.0.176 - - [08/Mar/2004:12:06:29 -0800] "GET /forplus/mailgraph.cgi/mailgraph_2_err.png HTTP/1.1" 200 6866 +10.0.0.176 - - [08/Mar/2004:12:06:29 -0800] "GET /forplus/mailgraph.cgi/mailgraph_3.png HTTP/1.1" 200 6596 +10.0.0.176 - - [08/Mar/2004:12:06:29 -0800] "GET /forplus/mailgraph.cgi/mailgraph_3_err.png HTTP/1.1" 200 5499 +64.242.88.10 - - [08/Mar/2004:12:07:13 -0800] "GET /ops/SP/play//view/TWiki/FileAttribute?rev=1.2 HTTP/1.1" 200 3949 +64.242.88.10 - - [08/Mar/2004:12:08:32 -0800] "GET /ops/SP/play//view/TWiki/WikiNotation?skin=print HTTP/1.1" 200 1435 +64.242.88.10 - - [08/Mar/2004:12:10:39 -0800] "GET /ops/SP/play//rdiff/TWiki/TWikiPlannedFeatures HTTP/1.1" 200 10577 +64.242.88.10 - - [08/Mar/2004:12:12:50 -0800] "GET /mailman/admin/deans HTTP/1.1" 200 2080 +64.242.88.10 - - [08/Mar/2004:12:15:36 -0800] "GET /pipermail/webber/ HTTP/1.1" 200 1161 +64.242.88.10 - - [08/Mar/2004:12:20:18 -0800] "GET /ops/SP/play//view/Main/PostSuper?rev=1.1 HTTP/1.1" 200 3629 +64.242.88.10 - - [08/Mar/2004:12:25:47 -0800] "GET /ops/SP/play//view/Main/WebPreferences?rev=1.13 HTTP/1.1" 200 8770 +64.242.88.10 - - [08/Mar/2004:12:28:09 -0800] "GET /ops/SP/play//edit/Main/Mailq_path?topicparent=Main.ConfigurationVariables HTTP/1.1" 401 12846 +64.242.88.10 - - [08/Mar/2004:12:31:32 -0800] "GET /ops/SP/play//view/TWiki/WebHome?rev=r1.49 HTTP/1.1" 200 12993 +64.242.88.10 - - [08/Mar/2004:12:33:09 -0800] "GET /ops/SP/play//view/TWiki/TWikiHistory?rev=r1.49 HTTP/1.1" 200 42243 +64.242.88.10 - - [08/Mar/2004:12:39:34 -0800] "GET /ops/SP/play//rdiff/TWiki/TWikiDocGraphics?rev1=1.11&rev2=1.10 HTTP/1.1" 200 6551 +64.242.88.10 - - [08/Mar/2004:12:40:36 -0800] "GET /ops/SP/play//view/TWiki/WebHome?rev=r1.47 HTTP/1.1" 200 12819 +64.242.88.10 - - [08/Mar/2004:12:42:04 -0800] "GET /ops/SP/play//view/Sandbox/WebStatistics HTTP/1.1" 200 6063 +64.242.88.10 - - [08/Mar/2004:12:43:08 -0800] "GET /pipermail/gisgrad/ HTTP/1.1" 200 1118 +64.242.88.10 - - [08/Mar/2004:12:45:13 -0800] "GET /mailman/admin/webber HTTP/1.1" 200 2089 +64.242.88.10 - - [08/Mar/2004:12:47:42 -0800] "GET /ops/SP/play//view/Main/WebPreferences?rev=1.14 HTTP/1.1" 200 8820 +64.242.88.10 - - [08/Mar/2004:12:55:18 -0800] "GET /ops/SP/play//view/TWiki/KevinKinnell?rev=1.4 HTTP/1.1" 200 3730 +64.242.88.10 - - [08/Mar/2004:12:58:39 -0800] "GET /ops/SP/play//search/Main/?search=\\.*&scope=topic&order=modified&reverse=on®ex=on&nosearch=on&limit=800 HTTP/1.1" 200 43915 +market-mail.panduit.com - - [08/Mar/2004:12:58:50 -0800] "GET / HTTP/1.0" 200 3169 +market-mail.panduit.com - - [08/Mar/2004:12:58:50 -0800] "GET /favicon.ico HTTP/1.0" 200 1078 +market-mail.panduit.com - - [08/Mar/2004:12:59:18 -0800] "GET /razor.jsp HTTP/1.0" 200 2869 +market-mail.panduit.com - - [08/Mar/2004:12:59:34 -0800] "GET /ststats/index.jsp HTTP/1.0" 200 2955 +market-mail.panduit.com - - [08/Mar/2004:12:59:37 -0800] "GET /ststats/stats-spam.1day.png HTTP/1.0" 200 3095 +market-mail.panduit.com - - [08/Mar/2004:12:59:37 -0800] "GET /ststats/stats-spam-ratio.1day.png HTTP/1.0" 200 2272 +market-mail.panduit.com - - [08/Mar/2004:12:59:37 -0800] "GET /ststats/stats-spam.1week.png HTTP/1.0" 200 3279 +market-mail.panduit.com - - [08/Mar/2004:12:59:37 -0800] "GET /ststats/stats-spam-ratio.1week.png HTTP/1.0" 200 2349 +market-mail.panduit.com - - [08/Mar/2004:12:59:37 -0800] "GET /ststats/stats-hashes.1week.png HTTP/1.0" 200 1659 +market-mail.panduit.com - - [08/Mar/2004:12:59:37 -0800] "GET /ststats/stats-spam.1month.png HTTP/1.0" 200 2542 +market-mail.panduit.com - - [08/Mar/2004:12:59:37 -0800] "GET /ststats/stats-spam-ratio.1month.png HTTP/1.0" 200 1927 +market-mail.panduit.com - - [08/Mar/2004:12:59:37 -0800] "GET /ststats/stats-hashes.1month.png HTTP/1.0" 200 1580 +market-mail.panduit.com - - [08/Mar/2004:12:59:37 -0800] "GET /ststats/stats-spam.1year.png HTTP/1.0" 200 2201 +market-mail.panduit.com - - [08/Mar/2004:12:59:37 -0800] "GET /ststats/stats-spam-ratio.1year.png HTTP/1.0" 200 1829 +market-mail.panduit.com - - [08/Mar/2004:12:59:37 -0800] "GET /ststats/stats-hashes.1year.png HTTP/1.0" 200 1524 +market-mail.panduit.com - - [08/Mar/2004:12:59:55 -0800] "GET /DCC.jsp HTTP/1.0" 200 2878 +market-mail.panduit.com - - [08/Mar/2004:13:00:12 -0800] "GET /ops/SP/play//view/Main/WebHome HTTP/1.0" 200 10392 +market-mail.panduit.com - - [08/Mar/2004:13:00:12 -0800] "GET /favicon.ico HTTP/1.0" 200 1078 +market-mail.panduit.com - - [08/Mar/2004:13:00:13 -0800] "GET /go/bin/test/TWikiLogos/twikiRobot46x50.gif HTTP/1.0" 200 2877 +market-mail.panduit.com - - [08/Mar/2004:13:00:20 -0800] "GET /ops/SP/play//view/Main/DCC HTTP/1.0" 200 4377 +market-mail.panduit.com - - [08/Mar/2004:13:00:27 -0800] "GET /ops/SP/play//view/Main/DCCAndPostFix HTTP/1.0" 200 5234 +64.242.88.10 - - [08/Mar/2004:13:00:40 -0800] "GET /ops/SP/play//oops/TWiki/HaroldGottschalk?template=oopsmore¶m1=1.3¶m2=1.3 HTTP/1.1" 200 11335 +market-mail.panduit.com - - [08/Mar/2004:13:01:27 -0800] "GET /ops/SP/play//view/Main/PostfixCommands HTTP/1.0" 200 4004 +market-mail.panduit.com - - [08/Mar/2004:13:01:29 -0800] "GET /ops/SP/play//view/Main/PostfixCmd HTTP/1.0" 200 4154 +market-mail.panduit.com - - [08/Mar/2004:13:01:35 -0800] "GET /ops/SP/play//edit/Main/PostConf?topicparent=Main.PostfixCommands HTTP/1.0" 401 12816 +market-mail.panduit.com - - [08/Mar/2004:13:01:38 -0800] "GET /go/bin/test/TWikiDocGraphics/help.gif HTTP/1.0" 200 130 +64.242.88.10 - - [08/Mar/2004:13:01:42 -0800] "GET /ops/SP/play//search/TWiki/SearchResult?scope=text®ex=on&search=John%20*Talintyre[^A-Za-z] HTTP/1.1" 200 8066 +market-mail.panduit.com - - [08/Mar/2004:13:01:42 -0800] "GET /ops/SP/play//view/Main/PostSuper HTTP/1.0" 200 3617 +market-mail.panduit.com - - [08/Mar/2004:13:01:55 -0800] "GET /ops/SP/play//view/Main/RelayGateway HTTP/1.0" 200 4213 +market-mail.panduit.com - - [08/Mar/2004:13:02:03 -0800] "GET /ops/SP/play//view/Main/VerifingGatway HTTP/1.0" 200 4731 +market-mail.panduit.com - - [08/Mar/2004:13:02:16 -0800] "GET /ops/SP/play//view/Main/Relay_Domains HTTP/1.0" 200 4564 +64.242.88.10 - - [08/Mar/2004:13:04:14 -0800] "GET /ops/SP/play//attach/Main/TWikiGuest HTTP/1.1" 401 12846 +64.242.88.10 - - [08/Mar/2004:13:07:16 -0800] "GET /ops/SP/play//view/Main/NicholasLee?rev=1.1 HTTP/1.1" 200 4456 +64.242.88.10 - - [08/Mar/2004:13:08:17 -0800] "GET /ops/SP/play//attach/TWiki/TWikiDocGraphics?filename=pencil.gif&revInfo=1 HTTP/1.1" 401 12846 +64.242.88.10 - - [08/Mar/2004:13:12:54 -0800] "GET /ops/SP/play//rdiff/TWiki/WebSiteTools?rev1=1.2&rev2=1.1 HTTP/1.1" 200 6640 +64.242.88.10 - - [08/Mar/2004:13:15:03 -0800] "GET /ops/SP/play//view/TWiki/TWikiHistory?rev=r1.55 HTTP/1.1" 200 44652 +64.242.88.10 - - [08/Mar/2004:13:16:11 -0800] "GET /ops/SP/play//attach/Main/SpamAssassinAndPostFix HTTP/1.1" 401 12846 +64.242.88.10 - - [08/Mar/2004:13:17:23 -0800] "GET /mailman/private/artsscience/ HTTP/1.1" 200 1552 +64.242.88.10 - - [08/Mar/2004:13:18:57 -0800] "GET /ops/SP/play//search/TWiki/?scope=topic®ex=on&search=^l HTTP/1.1" 200 2937 +64.242.88.10 - - [08/Mar/2004:13:24:49 -0800] "GET /ops/SP/play//rdiff/Main/RelayGateway?rev1=1.3&rev2=1.2 HTTP/1.1" 200 5181 +64.242.88.10 - - [08/Mar/2004:13:29:37 -0800] "GET /ops/SP/play//rdiff/Main/RelayGateway?rev1=1.2&rev2=1.1 HTTP/1.1" 200 6029 +64.242.88.10 - - [08/Mar/2004:13:31:16 -0800] "GET /ops/SP/play//rdiff/TWiki/WikiReferences?rev1=1.2&rev2=1.1 HTTP/1.1" 200 10024 +64.242.88.10 - - [08/Mar/2004:13:32:35 -0800] "GET /ops/SP/play//view/Main/WebPreferences?rev=r1.9 HTTP/1.1" 200 7511 +64.242.88.10 - - [08/Mar/2004:13:35:02 -0800] "GET /ops/SP/play//edit/TWiki/WebSiteTools?t=1078731408 HTTP/1.1" 401 12846 +64.242.88.10 - - [08/Mar/2004:13:36:06 -0800] "GET /ops/SP/play//attach/TWiki/TWikiDocGraphics?filename=viewtopic.gif&revInfo=1 HTTP/1.1" 401 12846 +64.242.88.10 - - [08/Mar/2004:13:38:39 -0800] "GET /ops/SP/play//view/TWiki/SvenDowideit?rev=r1.1 HTTP/1.1" 200 3564 +64.242.88.10 - - [08/Mar/2004:13:45:46 -0800] "GET /ops/SP/play//edit/Main/Ignore_mx_lookup_error?topicparent=Main.ConfigurationVariables HTTP/1.1" 401 12846 +64.242.88.10 - - [08/Mar/2004:13:48:06 -0800] "GET /ops/SP/play//oops/Main/DCCAndPostFix?template=oopsmore¶m1=1.2¶m2=1.2 HTTP/1.1" 200 6602 +64.242.88.10 - - [08/Mar/2004:13:49:47 -0800] "GET /ops/SP/play//view/TWiki/TWikiHistory?rev=r1.54 HTTP/1.1" 200 44644 +64.242.88.10 - - [08/Mar/2004:13:55:51 -0800] "GET /ops/SP/play//edit/Main/Allow_min_user?topicparent=Main.ConfigurationVariables HTTP/1.1" 401 12846 +64.242.88.10 - - [08/Mar/2004:13:56:52 -0800] "GET /ops/SP/play//edit/TWiki/KevinKinnell?t=1078692967 HTTP/1.1" 401 12846 +64.242.88.10 - - [08/Mar/2004:13:57:52 -0800] "GET /pipermail/fcd/ HTTP/1.1" 200 468 +64.242.88.10 - - [08/Mar/2004:13:58:55 -0800] "GET /mailman/listinfo/mgt-157 HTTP/1.1" 200 6189 +64.242.88.10 - - [08/Mar/2004:14:00:08 -0800] "GET /mailman/admin/fcd HTTP/1.1" 200 2060 +64.242.88.10 - - [08/Mar/2004:14:01:36 -0800] "GET /mailman/listinfo/cnc_forestry HTTP/1.1" 200 6159 +64.242.88.10 - - [08/Mar/2004:14:07:26 -0800] "GET /ops/SP/play//edit/Main/Strict_8bitmime?topicparent=Main.ConfigurationVariables HTTP/1.1" 401 12846 +64.242.88.10 - - [08/Mar/2004:14:11:28 -0800] "GET /ops/SP/play//view/TWiki/WelcomeGuest?rev=r1.19 HTTP/1.1" 200 13997 +64.242.88.10 - - [08/Mar/2004:14:12:49 -0800] "GET /ops/SP/play//view/TWiki/TWikiFAQ?rev=1.11 HTTP/1.1" 200 11950 +64.242.88.10 - - [08/Mar/2004:14:13:51 -0800] "GET /mailman/admin/gisgrad HTTP/1.1" 200 2093 +64.242.88.10 - - [08/Mar/2004:14:15:01 -0800] "GET /mailman/admin/jjec HTTP/1.1" 200 2088 +fw.aub.dk - - [08/Mar/2004:14:16:38 -0800] "GET /ops/SP/play//view/Main/WebHome HTTP/1.0" 200 10392 +fw.aub.dk - - [08/Mar/2004:14:16:39 -0800] "GET /go/bin/test/TWikiLogos/twikiRobot46x50.gif HTTP/1.0" 200 2877 +64.242.88.10 - - [08/Mar/2004:14:23:54 -0800] "GET /ops/SP/play//oops/TWiki/RyanFreebern?template=oopsmore¶m1=1.2¶m2=1.2 HTTP/1.1" 200 11263 +64.242.88.10 - - [08/Mar/2004:14:25:33 -0800] "GET /ops/SP/play//rdiff/TWiki/WebChangesAlert HTTP/1.1" 200 27035 +64.242.88.10 - - [08/Mar/2004:14:26:45 -0800] "GET /ops/SP/play//rdiff/Sandbox/WebTopicList HTTP/1.1" 200 4319 +64.242.88.10 - - [08/Mar/2004:14:27:46 -0800] "GET /ops/SP/play//edit/Main/Virtual_gid_maps?topicparent=Main.ConfigurationVariables HTTP/1.1" 401 12846 +64.242.88.10 - - [08/Mar/2004:14:28:46 -0800] "GET /ops/SP/play//view/TWiki/NewUserTemplate?skin=print HTTP/1.1" 200 2449 +64.242.88.10 - - [08/Mar/2004:14:33:56 -0800] "GET /mailman/admin HTTP/1.1" 200 6872 +64.242.88.10 - - [08/Mar/2004:14:40:18 -0800] "GET /mailman/admin/ncbnpfaculty HTTP/1.1" 200 2136 +64.242.88.10 - - [08/Mar/2004:14:41:22 -0800] "GET /ops/SP/play//search/TWiki/SearchResult?scope=text®ex=on&search=Web%20*Topic%20*List[^A-Za-z] HTTP/1.1" 200 10700 +64.242.88.10 - - [08/Mar/2004:14:42:44 -0800] "GET /ops/SP/play//view/TWiki/WebSearch?rev=1.11 HTTP/1.1" 200 9419 +64.242.88.10 - - [08/Mar/2004:14:43:45 -0800] "GET /ops/SP/play//view/TWiki/MartinCleaver HTTP/1.1" 200 3634 +64.242.88.10 - - [08/Mar/2004:14:52:51 -0800] "GET /ops/SP/play//view/TWiki/WebIndex HTTP/1.1" 200 102154 +64.242.88.10 - - [08/Mar/2004:14:54:56 -0800] "GET /ops/SP/play//edit/Main/TokyoOffice?t=1078706364 HTTP/1.1" 401 12846 +64.242.88.10 - - [08/Mar/2004:14:57:19 -0800] "GET /ops/SP/play//rdiff/Main/SpamAssassinAndPostFix?rev1=1.2&rev2=1.1 HTTP/1.1" 200 5794 +64.242.88.10 - - [08/Mar/2004:14:58:58 -0800] "GET /ops/SP/play//rdiff/TWiki/WhatIsWikiWiki HTTP/1.1" 200 9412 +64.242.88.10 - - [08/Mar/2004:15:00:07 -0800] "GET /ops/SP/play//rdiff/Main/WebChanges?rev1=1.2&rev2=1.1 HTTP/1.1" 200 114220 +64.242.88.10 - - [08/Mar/2004:15:01:12 -0800] "GET /ops/SP/play//rdiff/TWiki/EditDoesNotIncreaseTheRevision HTTP/1.1" 200 6310 +64.242.88.10 - - [08/Mar/2004:15:02:29 -0800] "GET /ops/SP/play//rdiff/TWiki/WebTopicList HTTP/1.1" 200 14591 +64.242.88.10 - - [08/Mar/2004:15:03:49 -0800] "GET /antivirus.jsp HTTP/1.1" 200 3548 +64.242.88.10 - - [08/Mar/2004:15:07:41 -0800] "GET /ops/SP/play//search/TWiki/SearchResult?scope=text®ex=on&search=Harold%20*Gottschalk[^A-Za-z] HTTP/1.1" 200 4412 +ip-200-56-225-61-mty.marcatel.net.mx - - [08/Mar/2004:15:15:17 -0800] "GET /razor.jsp HTTP/1.1" 200 2869 +64.242.88.10 - - [08/Mar/2004:15:16:14 -0800] "GET /ops/SP/play//view/TWiki/TextFormattingRules?rev=r1.37 HTTP/1.1" 200 28922 +64.242.88.10 - - [08/Mar/2004:15:17:18 -0800] "GET /ops/SP/play//search/Main/?scope=topic®ex=on&search=^f HTTP/1.1" 200 3438 +64.242.88.10 - - [08/Mar/2004:15:19:35 -0800] "GET /RBL.jsp HTTP/1.1" 200 4114 +c-24-11-14-147.client.comcast.net - - [08/Mar/2004:16:54:47 -0800] "GET /razor.jsp HTTP/1.1" 200 2869 +c-24-11-14-147.client.comcast.net - - [08/Mar/2004:16:54:47 -0800] "GET /favicon.ico HTTP/1.1" 200 1078 +lj1036.passgo.com - - [08/Mar/2004:17:39:00 -0800] "GET /robots.txt HTTP/1.0" 200 68 +lj1168.passgo.com - - [08/Mar/2004:17:39:01 -0800] "GET /ops/SP/play//oops/TWiki/TWikiVariables HTTP/1.0" 200 209 +calcite.rhyolite.com - - [08/Mar/2004:18:14:44 -0800] "GET /clients.jsp HTTP/1.1" 200 18767 +acbf6930.ipt.aol.com - - [08/Mar/2004:18:20:44 -0800] "GET /RBL.jsp HTTP/1.1" 200 4114 +acbf6930.ipt.aol.com - - [08/Mar/2004:18:20:44 -0800] "GET /LateEmail.jsp HTTP/1.1" 200 7649 +lj1018.passgo.com - - [08/Mar/2004:18:23:43 -0800] "GET /ops/SP/play//oops/Know/PublicSupported HTTP/1.0" 200 209 +barrie-ppp108371.sympatico.ca - - [08/Mar/2004:18:39:33 -0800] "GET /mailman/listinfo/webber HTTP/1.1" 200 6051 +barrie-ppp108371.sympatico.ca - - [08/Mar/2004:18:39:35 -0800] "GET /icons/mailman.jpg HTTP/1.1" 200 2022 +barrie-ppp108371.sympatico.ca - - [08/Mar/2004:18:39:35 -0800] "GET /icons/PythonPowered.png HTTP/1.1" 200 945 +barrie-ppp108371.sympatico.ca - - [08/Mar/2004:18:39:36 -0800] "GET /icons/gnu-head-tiny.jpg HTTP/1.1" 200 3049 +px7wh.vc.shawcable.net - - [08/Mar/2004:18:41:16 -0800] "GET /LateEmail.jsp HTTP/1.1" 200 7649 +user-0c8hdkf.cable.mindspring.com - - [08/Mar/2004:19:08:27 -0800] "GET /ops/SP/play//view/Main/WebHome HTTP/1.1" 200 10419 +user-0c8hdkf.cable.mindspring.com - - [08/Mar/2004:19:08:28 -0800] "GET /go/bin/test/TWikiLogos/twikiRobot46x50.gif HTTP/1.1" 200 2877 +user-0c8hdkf.cable.mindspring.com - - [08/Mar/2004:19:08:39 -0800] "GET /ops/SP/play//view/Main/RelayGateway HTTP/1.1" 200 4232 +user-0c8hdkf.cable.mindspring.com - - [08/Mar/2004:19:08:52 -0800] "GET /ops/SP/play//view/Main/VerifingGatway HTTP/1.1" 200 4750 +user-0c8hdkf.cable.mindspring.com - - [08/Mar/2004:19:10:06 -0800] "GET /ops/SP/play//view/Main/Relay_Domains HTTP/1.1" 200 4583 +lj1053.passgo.com - - [08/Mar/2004:19:24:42 -0800] "GET /ops/SP/play//oops/Main/SpamAssassinTaggingOnly HTTP/1.0" 200 209 +64.246.94.152 - - [08/Mar/2004:20:09:57 -0800] "HEAD /ops/SP/play//view/Main/SpamAssassinDeleting HTTP/1.1" 200 0 +ip68-228-43-49.tc.ph.cox.net - - [08/Mar/2004:20:48:18 -0800] "GET / HTTP/1.0" 200 3169 +ip68-228-43-49.tc.ph.cox.net - - [08/Mar/2004:20:48:18 -0800] "GET /favicon.ico HTTP/1.0" 200 1078 +ip68-228-43-49.tc.ph.cox.net - - [08/Mar/2004:20:48:25 -0800] "GET /ststats/index.jsp HTTP/1.0" 200 2955 +ip68-228-43-49.tc.ph.cox.net - - [08/Mar/2004:20:48:26 -0800] "GET /ststats/stats-spam.1day.png HTTP/1.0" 200 3049 +ip68-228-43-49.tc.ph.cox.net - - [08/Mar/2004:20:48:26 -0800] "GET /ststats/stats-spam-ratio.1day.png HTTP/1.0" 200 2160 +ip68-228-43-49.tc.ph.cox.net - - [08/Mar/2004:20:48:26 -0800] "GET /ststats/stats-spam-ratio.1week.png HTTP/1.0" 200 2386 +ip68-228-43-49.tc.ph.cox.net - - [08/Mar/2004:20:48:26 -0800] "GET /ststats/stats-spam.1week.png HTTP/1.0" 200 3271 +ip68-228-43-49.tc.ph.cox.net - - [08/Mar/2004:20:48:26 -0800] "GET /ststats/stats-hashes.1week.png HTTP/1.0" 200 1687 +ip68-228-43-49.tc.ph.cox.net - - [08/Mar/2004:20:48:26 -0800] "GET /ststats/stats-spam.1month.png HTTP/1.0" 200 2482 +ip68-228-43-49.tc.ph.cox.net - - [08/Mar/2004:20:48:27 -0800] "GET /ststats/stats-spam-ratio.1month.png HTTP/1.0" 200 1914 +ip68-228-43-49.tc.ph.cox.net - - [08/Mar/2004:20:48:27 -0800] "GET /ststats/stats-hashes.1month.png HTTP/1.0" 200 1536 +ip68-228-43-49.tc.ph.cox.net - - [08/Mar/2004:20:48:27 -0800] "GET /ststats/stats-spam.1year.png HTTP/1.0" 200 2250 +ip68-228-43-49.tc.ph.cox.net - - [08/Mar/2004:20:48:27 -0800] "GET /ststats/stats-spam-ratio.1year.png HTTP/1.0" 200 1883 +ip68-228-43-49.tc.ph.cox.net - - [08/Mar/2004:20:48:27 -0800] "GET /ststats/stats-hashes.1year.png HTTP/1.0" 200 1493 +ip68-228-43-49.tc.ph.cox.net - - [08/Mar/2004:20:48:48 -0800] "GET /ops/SP/play//view/Main/WebHome HTTP/1.0" 200 10392 +ip68-228-43-49.tc.ph.cox.net - - [08/Mar/2004:20:48:49 -0800] "GET /go/bin/test/TWikiLogos/twikiRobot46x50.gif HTTP/1.0" 200 2877 +ip68-228-43-49.tc.ph.cox.net - - [08/Mar/2004:20:48:49 -0800] "GET /favicon.ico HTTP/1.0" 200 1078 +ip68-228-43-49.tc.ph.cox.net - - [08/Mar/2004:20:48:53 -0800] "GET /ops/SP/play//view/Main/DCCAndPostFix HTTP/1.0" 200 5234 +ip68-228-43-49.tc.ph.cox.net - - [08/Mar/2004:20:50:59 -0800] "GET /ops/SP/play//view/Main/SpamAssassinAndPostFix HTTP/1.0" 200 4022 +ip68-228-43-49.tc.ph.cox.net - - [08/Mar/2004:20:51:01 -0800] "GET /ops/SP/play//view/Main/SpamAssassinTaggingOnly HTTP/1.0" 200 5672 +ip68-228-43-49.tc.ph.cox.net - - [08/Mar/2004:20:51:51 -0800] "GET /ops/SP/play//view/Main/SpamAssassin HTTP/1.0" 200 4062 +ip68-228-43-49.tc.ph.cox.net - - [08/Mar/2004:20:52:01 -0800] "GET /ops/SP/play//view/Main/SpamAssassin HTTP/1.0" 200 4062 +proxy0.haifa.ac.il - - [08/Mar/2004:22:03:04 -0800] "GET / HTTP/1.0" 200 3169 +proxy0.haifa.ac.il - - [08/Mar/2004:22:03:28 -0800] "GET /ststats/index.jsp HTTP/1.0" 200 2955 +proxy0.haifa.ac.il - - [08/Mar/2004:22:03:29 -0800] "GET /ststats/stats-spam.1week.png HTTP/1.0" 200 3238 +proxy0.haifa.ac.il - - [08/Mar/2004:22:03:29 -0800] "GET /ststats/stats-spam.1day.png HTTP/1.0" 200 3032 +proxy0.haifa.ac.il - - [08/Mar/2004:22:03:29 -0800] "GET /ststats/stats-spam-ratio.1day.png HTTP/1.0" 200 2160 +proxy0.haifa.ac.il - - [08/Mar/2004:22:03:29 -0800] "GET /ststats/stats-spam-ratio.1week.png HTTP/1.0" 200 2369 +proxy0.haifa.ac.il - - [08/Mar/2004:22:03:29 -0800] "GET /ststats/stats-hashes.1week.png HTTP/1.0" 200 1671 +proxy0.haifa.ac.il - - [08/Mar/2004:22:03:29 -0800] "GET /ststats/stats-spam.1month.png HTTP/1.0" 200 2485 +proxy0.haifa.ac.il - - [08/Mar/2004:22:03:29 -0800] "GET /ststats/stats-hashes.1month.png HTTP/1.0" 200 1533 +proxy0.haifa.ac.il - - [08/Mar/2004:22:03:29 -0800] "GET /ststats/stats-spam-ratio.1month.png HTTP/1.0" 200 1906 +proxy0.haifa.ac.il - - [08/Mar/2004:22:03:29 -0800] "GET /ststats/stats-spam.1year.png HTTP/1.0" 200 2251 +proxy0.haifa.ac.il - - [08/Mar/2004:22:03:29 -0800] "GET /ststats/stats-spam-ratio.1year.png HTTP/1.0" 200 1875 +proxy0.haifa.ac.il - - [08/Mar/2004:22:03:29 -0800] "GET /ststats/stats-hashes.1year.png HTTP/1.0" 200 1483 +proxy0.haifa.ac.il - - [08/Mar/2004:22:03:44 -0800] "GET /SpamAssassin.jsp HTTP/1.0" 200 7368 +proxy0.haifa.ac.il - - [08/Mar/2004:22:03:52 -0800] "GET /razor.jsp HTTP/1.0" 200 2869 +proxy0.haifa.ac.il - - [08/Mar/2004:22:04:09 -0800] "GET /ops/SP/play//view/Main/WebHome HTTP/1.0" 200 10392 +proxy0.haifa.ac.il - - [08/Mar/2004:22:04:10 -0800] "GET /go/bin/test/TWikiLogos/twikiRobot46x50.gif HTTP/1.0" 200 2877 +proxy0.haifa.ac.il - - [08/Mar/2004:22:04:24 -0800] "GET /ops/SP/play//view/Main/LinksOfUse HTTP/1.0" 200 4515 +proxy0.haifa.ac.il - - [08/Mar/2004:22:04:35 -0800] "GET /ops/SP/play//view/Main/PostfixCommands HTTP/1.0" 200 4004 +alille-251-1-2-197.w82-124.abo.wanadoo.fr - - [08/Mar/2004:22:30:01 -0800] "GET /razor.jsp HTTP/1.1" 200 2869 +a213-84-36-192.adsl.xs4all.nl - - [08/Mar/2004:23:42:55 -0800] "GET / HTTP/1.1" 200 3169 +195.246.13.119 - - [09/Mar/2004:01:48:27 -0800] "GET /ops/SP/play//view/Main/WebHome HTTP/1.1" 200 10419 +195.246.13.119 - - [09/Mar/2004:01:48:28 -0800] "GET /go/bin/test/TWikiLogos/twikiRobot46x50.gif HTTP/1.1" 200 2877 +195.246.13.119 - - [09/Mar/2004:01:48:28 -0800] "GET /favicon.ico HTTP/1.1" 200 1078 +195.246.13.119 - - [09/Mar/2004:01:49:53 -0800] "GET /ops/SP/play//view/Main/SpamAssassinAndPostFix HTTP/1.1" 200 4034 +195.246.13.119 - - [09/Mar/2004:01:49:57 -0800] "GET /ops/SP/play//view/Main/KevinWGagel HTTP/1.1" 200 4901 +195.246.13.119 - - [09/Mar/2004:01:50:35 -0800] "GET /ops/SP/play//view/Main/SpamAssassinTaggingOnly HTTP/1.1" 200 5691 +195.246.13.119 - - [09/Mar/2004:01:50:54 -0800] "GET /ops/SP/play//view/Main/SpamAssassinDeleting HTTP/1.1" 200 5543 +195.246.13.119 - - [09/Mar/2004:01:51:17 -0800] "GET /ops/SP/play//view/Main/DCCAndPostFix HTTP/1.1" 200 5253 +195.246.13.119 - - [09/Mar/2004:01:51:41 -0800] "GET /ops/SP/play//edit/Main/RazorAndPostFix?topicparent=Main.WebHome HTTP/1.1" 401 12851 +195.246.13.119 - - [09/Mar/2004:01:51:45 -0800] "GET /go/bin/test/TWikiDocGraphics/help.gif HTTP/1.1" 200 130 +195.246.13.119 - - [09/Mar/2004:01:51:54 -0800] "GET /ops/SP/play//view/Main/RelayGateway HTTP/1.1" 200 4232 +195.246.13.119 - - [09/Mar/2004:01:52:12 -0800] "GET /ops/SP/play//view/Main/LinksOfUse HTTP/1.1" 200 4534 +200-55-104-193.dsl.prima.net.ar - - [09/Mar/2004:02:33:10 -0800] "GET /ststats/index.jsp HTTP/1.1" 200 2955 +200-55-104-193.dsl.prima.net.ar - - [09/Mar/2004:02:33:17 -0800] "GET /ststats/stats-spam.1day.png HTTP/1.1" 200 3068 +200-55-104-193.dsl.prima.net.ar - - [09/Mar/2004:02:33:17 -0800] "GET /ststats/stats-spam-ratio.1day.png HTTP/1.1" 200 2187 +200-55-104-193.dsl.prima.net.ar - - [09/Mar/2004:02:33:17 -0800] "GET /ststats/stats-spam.1week.png HTTP/1.1" 200 3277 +200-55-104-193.dsl.prima.net.ar - - [09/Mar/2004:02:33:17 -0800] "GET /ststats/stats-spam-ratio.1week.png HTTP/1.1" 200 2379 +200-55-104-193.dsl.prima.net.ar - - [09/Mar/2004:02:33:18 -0800] "GET /ststats/stats-hashes.1week.png HTTP/1.1" 200 1687 +200-55-104-193.dsl.prima.net.ar - - [09/Mar/2004:02:33:18 -0800] "GET /ststats/stats-spam.1month.png HTTP/1.1" 200 2592 +200-55-104-193.dsl.prima.net.ar - - [09/Mar/2004:02:33:18 -0800] "GET /ststats/stats-spam-ratio.1month.png HTTP/1.1" 200 1983 +200-55-104-193.dsl.prima.net.ar - - [09/Mar/2004:02:33:18 -0800] "GET /ststats/stats-hashes.1month.png HTTP/1.1" 200 1545 +200-55-104-193.dsl.prima.net.ar - - [09/Mar/2004:02:33:18 -0800] "GET /ststats/stats-spam.1year.png HTTP/1.1" 200 2222 +200-55-104-193.dsl.prima.net.ar - - [09/Mar/2004:02:33:18 -0800] "GET /ststats/stats-spam-ratio.1year.png HTTP/1.1" 200 1866 +200-55-104-193.dsl.prima.net.ar - - [09/Mar/2004:02:33:18 -0800] "GET /ststats/stats-hashes.1year.png HTTP/1.1" 200 1494 +200-55-104-193.dsl.prima.net.ar - - [09/Mar/2004:02:33:18 -0800] "GET /favicon.ico HTTP/1.1" 200 1078 +lj1052.passgo.com - - [09/Mar/2004:02:39:17 -0800] "GET /robots.txt HTTP/1.0" 200 68 +lj1162.passgo.com - - [09/Mar/2004:02:39:18 -0800] "GET /ops/SP/play//view/Main/SanJoseOffice HTTP/1.0" 200 3884 +lj1162.passgo.com - - [09/Mar/2004:03:10:39 -0800] "GET /ops/SP/play//view/Main/SanJoseOffice HTTP/1.0" 200 3884 +mail.geovariances.fr - - [09/Mar/2004:05:01:53 -0800] "GET /ops/SP/play//view/Main/WebHome HTTP/1.1" 200 10419 +mail.geovariances.fr - - [09/Mar/2004:05:01:53 -0800] "GET /go/bin/test/TWikiLogos/twikiRobot46x50.gif HTTP/1.1" 200 2877 +mail.geovariances.fr - - [09/Mar/2004:05:02:11 -0800] "GET /ops/SP/play//view/Main/SpamAssassin HTTP/1.1" 200 4081 +mail.geovariances.fr - - [09/Mar/2004:05:02:11 -0800] "GET /go/bin/test/TWikiLogos/twikiRobot46x50.gif HTTP/1.1" 304 - +mail.geovariances.fr - - [09/Mar/2004:05:02:14 -0800] "GET /ops/SP/play//view/Main/SpamAssassinAndPostFix HTTP/1.1" 200 4034 +mail.geovariances.fr - - [09/Mar/2004:05:02:14 -0800] "GET /go/bin/test/TWikiLogos/twikiRobot46x50.gif HTTP/1.1" 304 - +mail.geovariances.fr - - [09/Mar/2004:05:02:19 -0800] "GET /ops/SP/play//view/Main/SpamAssassinTaggingOnly HTTP/1.1" 200 5691 +mail.geovariances.fr - - [09/Mar/2004:05:02:19 -0800] "GET /go/bin/test/TWikiLogos/twikiRobot46x50.gif HTTP/1.1" 304 - +mail.geovariances.fr - - [09/Mar/2004:05:02:27 -0800] "GET /ops/SP/play//view/Main/SpamAssassinDeleting HTTP/1.1" 200 5543 +mail.geovariances.fr - - [09/Mar/2004:05:02:28 -0800] "GET /go/bin/test/TWikiLogos/twikiRobot46x50.gif HTTP/1.1" 304 - +mail.geovariances.fr - - [09/Mar/2004:05:04:09 -0800] "GET /ops/SP/play//view/Main/DCCAndPostFix HTTP/1.1" 200 5253 +mail.geovariances.fr - - [09/Mar/2004:05:04:09 -0800] "GET /go/bin/test/TWikiLogos/twikiRobot46x50.gif HTTP/1.1" 304 - +mail.geovariances.fr - - [09/Mar/2004:05:09:30 -0800] "GET /ops/SP/play//view/Main/SpamAssassinUsingRazorAndDCC HTTP/1.1" 200 7435 +mail.geovariances.fr - - [09/Mar/2004:05:09:31 -0800] "GET /go/bin/test/TWikiLogos/twikiRobot46x50.gif HTTP/1.1" 304 - +mail.geovariances.fr - - [09/Mar/2004:05:12:45 -0800] "GET /go/bin/test/TWikiLogos/twikiRobot46x50.gif HTTP/1.1" 304 - +mail.geovariances.fr - - [09/Mar/2004:05:12:45 -0800] "GET /ops/SP/play//view/Main/ConfigurationVariables HTTP/1.1" 200 58292 +mail.geovariances.fr - - [09/Mar/2004:05:13:40 -0800] "GET /ops/SP/play//view/TWiki/WebHome HTTP/1.1" 200 15182 +mail.geovariances.fr - - [09/Mar/2004:05:13:40 -0800] "GET /go/bin/test/TWikiLogos/twikiRobot46x50.gif HTTP/1.1" 304 - +mail.geovariances.fr - - [09/Mar/2004:05:13:40 -0800] "GET /go/bin/test/TWikiLogos/twikiRobot131x64.gif HTTP/1.1" 200 7218 +mail.geovariances.fr - - [09/Mar/2004:05:13:40 -0800] "GET /go/bin/test/TWikiDocGraphics/tip.gif HTTP/1.1" 200 123 +mail.geovariances.fr - - [09/Mar/2004:05:13:40 -0800] "GET /go/bin/test/TWikiLogos/twikiRobot88x31.gif HTTP/1.1" 200 3501 +mail.geovariances.fr - - [09/Mar/2004:05:14:13 -0800] "GET /ops/SP/play//view/Sandbox/WebHome HTTP/1.1" 200 8632 +mail.geovariances.fr - - [09/Mar/2004:05:14:14 -0800] "GET /go/bin/test/TWikiLogos/twikiRobot46x50.gif HTTP/1.1" 304 - +66-194-6-70.gen.twtelecom.net - - [09/Mar/2004:05:20:20 -0800] "GET / HTTP/1.1" 200 3169 +195.230.181.122 - - [09/Mar/2004:06:29:03 -0800] "GET /AmavisNew.jsp HTTP/1.0" 200 2300 +ts04-ip92.hevanet.com - - [09/Mar/2004:06:33:21 -0800] "GET / HTTP/1.1" 200 3169 +ts04-ip92.hevanet.com - - [09/Mar/2004:06:34:51 -0800] "GET /ststats/index.jsp HTTP/1.1" 200 2955 +ts04-ip92.hevanet.com - - [09/Mar/2004:06:34:53 -0800] "GET /ststats/stats-spam.1day.png HTTP/1.1" 200 3027 +ts04-ip92.hevanet.com - - [09/Mar/2004:06:34:53 -0800] "GET /ststats/stats-spam-ratio.1day.png HTTP/1.1" 200 2148 +ts04-ip92.hevanet.com - - [09/Mar/2004:06:34:54 -0800] "GET /ststats/stats-spam.1week.png HTTP/1.1" 200 3200 +ts04-ip92.hevanet.com - - [09/Mar/2004:06:34:54 -0800] "GET /ststats/stats-spam-ratio.1week.png HTTP/1.1" 200 2341 +ts04-ip92.hevanet.com - - [09/Mar/2004:06:34:55 -0800] "GET /ststats/stats-hashes.1week.png HTTP/1.1" 200 1686 +ts04-ip92.hevanet.com - - [09/Mar/2004:06:34:55 -0800] "GET /ststats/stats-spam.1month.png HTTP/1.1" 200 2534 +ts04-ip92.hevanet.com - - [09/Mar/2004:06:34:56 -0800] "GET /ststats/stats-spam-ratio.1month.png HTTP/1.1" 200 1948 +ts04-ip92.hevanet.com - - [09/Mar/2004:06:34:56 -0800] "GET /ststats/stats-hashes.1month.png HTTP/1.1" 200 1549 +ts04-ip92.hevanet.com - - [09/Mar/2004:06:34:57 -0800] "GET /ststats/stats-spam.1year.png HTTP/1.1" 200 2214 +ts04-ip92.hevanet.com - - [09/Mar/2004:06:34:57 -0800] "GET /ststats/stats-spam-ratio.1year.png HTTP/1.1" 200 1873 +ts04-ip92.hevanet.com - - [09/Mar/2004:06:34:58 -0800] "GET /ststats/stats-hashes.1year.png HTTP/1.1" 200 1500 +ts04-ip92.hevanet.com - - [09/Mar/2004:06:35:04 -0800] "GET /forplus/mailgraph2.cgi HTTP/1.1" 200 2987 +ts04-ip92.hevanet.com - - [09/Mar/2004:06:35:06 -0800] "GET /forplus/mailgraph.cgi/mailgraph_0_err.png HTTP/1.1" 200 6708 +ts04-ip92.hevanet.com - - [09/Mar/2004:06:35:06 -0800] "GET /forplus/mailgraph.cgi/mailgraph_0.png HTTP/1.1" 200 8232 +ts04-ip92.hevanet.com - - [09/Mar/2004:06:35:09 -0800] "GET /forplus/mailgraph.cgi/mailgraph_1.png HTTP/1.1" 200 8857 +ts04-ip92.hevanet.com - - [09/Mar/2004:06:35:10 -0800] "GET /forplus/mailgraph.cgi/mailgraph_1_err.png HTTP/1.1" 200 7175 +ts04-ip92.hevanet.com - - [09/Mar/2004:06:35:13 -0800] "GET /forplus/mailgraph.cgi/mailgraph_2.png HTTP/1.1" 200 9391 +ts04-ip92.hevanet.com - - [09/Mar/2004:06:35:13 -0800] "GET /forplus/mailgraph.cgi/mailgraph_2_err.png HTTP/1.1" 200 6922 +ts04-ip92.hevanet.com - - [09/Mar/2004:06:35:17 -0800] "GET /forplus/mailgraph.cgi/mailgraph_3.png HTTP/1.1" 200 6618 +ts04-ip92.hevanet.com - - [09/Mar/2004:06:35:17 -0800] "GET /forplus/mailgraph.cgi/mailgraph_3_err.png HTTP/1.1" 200 5615 +ts04-ip92.hevanet.com - - [09/Mar/2004:06:35:42 -0800] "GET /razor.jsp HTTP/1.1" 200 2869 +ts04-ip92.hevanet.com - - [09/Mar/2004:06:36:28 -0800] "GET /ops/SP/play//view/Main/WebHome HTTP/1.1" 200 10419 +ts04-ip92.hevanet.com - - [09/Mar/2004:06:36:29 -0800] "GET /go/bin/test/TWikiLogos/twikiRobot46x50.gif HTTP/1.1" 200 2877 +ts04-ip92.hevanet.com - - [09/Mar/2004:06:36:51 -0800] "GET /ops/SP/play//view/Main/SpamAssassinAndPostFix HTTP/1.1" 200 4034 +ts04-ip92.hevanet.com - - [09/Mar/2004:06:37:00 -0800] "GET /ops/SP/play//view/Main/SpamAssassinTaggingOnly HTTP/1.1" 200 5691 +ts04-ip92.hevanet.com - - [09/Mar/2004:06:37:40 -0800] "GET /ops/SP/play//view/Main/SpamAssassinDeleting HTTP/1.1" 200 5543 +208-38-57-205.ip.cal.radiant.net - - [09/Mar/2004:07:27:10 -0800] "GET / HTTP/1.1" 200 3169 +208-38-57-205.ip.cal.radiant.net - - [09/Mar/2004:07:27:10 -0800] "GET /favicon.ico HTTP/1.1" 200 1078 +208-38-57-205.ip.cal.radiant.net - - [09/Mar/2004:07:27:44 -0800] "GET /ops/SP/play//view/Main/WebHome HTTP/1.1" 200 10419 +208-38-57-205.ip.cal.radiant.net - - [09/Mar/2004:07:27:44 -0800] "GET /go/bin/test/TWikiLogos/twikiRobot46x50.gif HTTP/1.1" 200 2877 +208-38-57-205.ip.cal.radiant.net - - [09/Mar/2004:07:27:44 -0800] "GET /favicon.ico HTTP/1.1" 200 1078 +208-38-57-205.ip.cal.radiant.net - - [09/Mar/2004:07:27:59 -0800] "GET /ops/SP/play//view/Main/SpamAssassinAndPostFix HTTP/1.1" 200 4034 +208-38-57-205.ip.cal.radiant.net - - [09/Mar/2004:07:28:05 -0800] "GET /ops/SP/play//view/Main/SpamAssassinTaggingOnly HTTP/1.1" 200 5691 +208-38-57-205.ip.cal.radiant.net - - [09/Mar/2004:07:28:12 -0800] "GET /ops/SP/play//view/Main/SpamAssassinDeleting HTTP/1.1" 200 5543 +207.195.59.160 - - [09/Mar/2004:08:08:35 -0800] "GET / HTTP/1.1" 200 3169 +207.195.59.160 - - [09/Mar/2004:08:08:37 -0800] "GET /ops/SP/play//view/Main/WebHome HTTP/1.1" 200 10419 +207.195.59.160 - - [09/Mar/2004:08:08:38 -0800] "GET /go/bin/test/TWikiLogos/twikiRobot46x50.gif HTTP/1.1" 200 2877 +207.195.59.160 - - [09/Mar/2004:08:08:54 -0800] "GET /ops/SP/play//view/Main/SpamAssassinAndPostFix HTTP/1.1" 200 4034 +207.195.59.160 - - [09/Mar/2004:08:08:54 -0800] "GET /go/bin/test/TWikiLogos/twikiRobot46x50.gif HTTP/1.1" 304 - +207.195.59.160 - - [09/Mar/2004:08:08:57 -0800] "GET /ops/SP/play//view/Main/SpamAssassinTaggingOnly HTTP/1.1" 200 5691 +207.195.59.160 - - [09/Mar/2004:08:09:39 -0800] "GET /ops/SP/play//view/Main/RBLsHowTo HTTP/1.1" 200 4665 +207.195.59.160 - - [09/Mar/2004:08:09:39 -0800] "GET /go/bin/test/TWikiLogos/twikiRobot46x50.gif HTTP/1.1" 304 - +207.195.59.160 - - [09/Mar/2004:08:09:58 -0800] "GET /ops/SP/play//view/Main/PostfixCommands HTTP/1.1" 200 4016 +207.195.59.160 - - [09/Mar/2004:08:09:58 -0800] "GET /go/bin/test/TWikiLogos/twikiRobot46x50.gif HTTP/1.1" 304 - +207.195.59.160 - - [09/Mar/2004:08:10:04 -0800] "GET /ops/SP/play//edit/Main/PostConf?topicparent=Main.PostfixCommands HTTP/1.1" 401 12851 +207.195.59.160 - - [09/Mar/2004:08:10:06 -0800] "GET /go/bin/test/TWikiDocGraphics/help.gif HTTP/1.1" 200 130 +207.195.59.160 - - [09/Mar/2004:08:10:12 -0800] "GET /ops/SP/play//view/Main/RelayGateway HTTP/1.1" 200 4232 +207.195.59.160 - - [09/Mar/2004:08:10:12 -0800] "GET /go/bin/test/TWikiLogos/twikiRobot46x50.gif HTTP/1.1" 304 - +207.195.59.160 - - [09/Mar/2004:08:10:20 -0800] "GET /ops/SP/play//view/Main/Relay_Domains HTTP/1.1" 200 4583 +fw1.millardref.com - - [09/Mar/2004:08:17:27 -0800] "GET / HTTP/1.1" 200 3169 +207.195.59.160 - - [09/Mar/2004:08:17:34 -0800] "GET /ops/SP/play//view/Main/VerifingGatway HTTP/1.1" 200 4750 +fw1.millardref.com - - [09/Mar/2004:08:17:50 -0800] "GET /RBL.jsp HTTP/1.1" 200 4114 +207.195.59.160 - - [09/Mar/2004:08:18:17 -0800] "GET /ops/SP/play//view/Main/SideBar HTTP/1.1" 200 3972 +207.195.59.160 - - [09/Mar/2004:08:18:17 -0800] "GET /go/bin/test/TWikiLogos/twikiRobot46x50.gif HTTP/1.1" 304 - +fw1.millardref.com - - [09/Mar/2004:08:18:19 -0800] "GET /favicon.ico HTTP/1.1" 200 1078 +fw1.millardref.com - - [09/Mar/2004:08:18:25 -0800] "GET /ie.htm HTTP/1.1" 200 3518 +fw1.millardref.com - - [09/Mar/2004:08:18:26 -0800] "GET /images/image004.jpg HTTP/1.1" 200 10936 +fw1.millardref.com - - [09/Mar/2004:08:18:27 -0800] "GET /images/image005.jpg HTTP/1.1" 200 21125 +fw1.millardref.com - - [09/Mar/2004:08:18:27 -0800] "GET /images/msgops.JPG HTTP/1.1" 200 7939 +207.195.59.160 - - [09/Mar/2004:08:18:50 -0800] "GET /ops/SP/play//view/Main/WebHome HTTP/1.1" 200 10419 +207.195.59.160 - - [09/Mar/2004:08:19:04 -0800] "GET /ops/SP/play//view/Main/DCCAndPostFix HTTP/1.1" 200 5253 +lj1007.passgo.com - - [09/Mar/2004:09:55:44 -0800] "GET /robots.txt HTTP/1.0" 200 68 +lj1125.passgo.com - - [09/Mar/2004:09:55:53 -0800] "GET /ops/SP/play//oops/TWiki/WebChangesAlert HTTP/1.0" 200 209 +80.58.35.111.proxycache.rima-tde.net - - [09/Mar/2004:10:08:07 -0800] "GET /RBL.jsp HTTP/1.0" 200 4114 +10.0.0.176 - - [09/Mar/2004:10:29:38 -0800] "GET / HTTP/1.1" 304 - +10.0.0.176 - - [09/Mar/2004:10:29:40 -0800] "GET /forplus/mailgraph2.cgi HTTP/1.1" 200 2987 +10.0.0.176 - - [09/Mar/2004:10:29:41 -0800] "GET /forplus/mailgraph.cgi/mailgraph_1.png HTTP/1.1" 200 8830 +10.0.0.176 - - [09/Mar/2004:10:29:41 -0800] "GET /forplus/mailgraph.cgi/mailgraph_0.png HTTP/1.1" 200 7255 +10.0.0.176 - - [09/Mar/2004:10:29:41 -0800] "GET /forplus/mailgraph.cgi/mailgraph_0_err.png HTTP/1.1" 200 6703 +10.0.0.176 - - [09/Mar/2004:10:29:41 -0800] "GET /forplus/mailgraph.cgi/mailgraph_1_err.png HTTP/1.1" 200 7127 +10.0.0.176 - - [09/Mar/2004:10:29:41 -0800] "GET /forplus/mailgraph.cgi/mailgraph_2.png HTTP/1.1" 200 9241 +10.0.0.176 - - [09/Mar/2004:10:29:41 -0800] "GET /forplus/mailgraph.cgi/mailgraph_2_err.png HTTP/1.1" 200 6856 +10.0.0.176 - - [09/Mar/2004:10:29:41 -0800] "GET /forplus/mailgraph.cgi/mailgraph_3.png HTTP/1.1" 200 6618 +10.0.0.176 - - [09/Mar/2004:10:29:41 -0800] "GET /forplus/mailgraph.cgi/mailgraph_3_err.png HTTP/1.1" 200 5615 +200.222.33.33 - - [09/Mar/2004:11:21:36 -0800] "GET /AmavisNew.jsp HTTP/1.1" 200 2300 +1-320.tnr.on.ca - - [09/Mar/2004:11:43:54 -0800] "GET /ie.htm HTTP/1.1" 200 3518 +1-320.tnr.on.ca - - [09/Mar/2004:11:43:56 -0800] "GET /images/image005.jpg HTTP/1.1" 200 21125 +1-320.tnr.on.ca - - [09/Mar/2004:11:43:56 -0800] "GET /images/msgops.JPG HTTP/1.1" 200 7939 +1-320.tnr.on.ca - - [09/Mar/2004:11:43:56 -0800] "GET /images/image004.jpg HTTP/1.1" 200 10936 +l07v-1-17.d1.club-internet.fr - - [09/Mar/2004:11:57:20 -0800] "GET / HTTP/1.1" 200 3169 +wwwcache.lanl.gov - - [09/Mar/2004:12:16:06 -0800] "GET /razor.jsp HTTP/1.1" 200 2869 +trrc02m01-40.bctel.ca - - [09/Mar/2004:12:21:08 -0800] "GET /mailman/listinfo/ppwc HTTP/1.1" 200 6271 +trrc02m01-40.bctel.ca - - [09/Mar/2004:12:21:09 -0800] "GET /icons/mailman.jpg HTTP/1.1" 200 2022 +trrc02m01-40.bctel.ca - - [09/Mar/2004:12:21:09 -0800] "GET /icons/PythonPowered.png HTTP/1.1" 200 945 +trrc02m01-40.bctel.ca - - [09/Mar/2004:12:21:10 -0800] "GET /icons/gnu-head-tiny.jpg HTTP/1.1" 200 3049 +fw.kcm.org - - [09/Mar/2004:12:21:49 -0800] "GET /ops/SP/play//view/Main/SpamAssassinTaggingOnly HTTP/1.1" 200 5691 +fw.kcm.org - - [09/Mar/2004:12:21:49 -0800] "GET /go/bin/test/TWikiLogos/twikiRobot46x50.gif HTTP/1.1" 200 2877 +lj1048.passgo.com - - [09/Mar/2004:12:52:21 -0800] "GET /robots.txt HTTP/1.0" 200 68 +lj1031.passgo.com - - [09/Mar/2004:12:52:58 -0800] "GET /ops/SP/play//oops/TWiki/InterwikiPlugin HTTP/1.0" 200 209 +c-24-20-163-223.client.comcast.net - - [09/Mar/2004:13:14:53 -0800] "GET / HTTP/1.1" 200 3169 +c-24-20-163-223.client.comcast.net - - [09/Mar/2004:13:15:15 -0800] "GET /ops/SP/play//view/Main/WebHome HTTP/1.1" 200 10419 +c-24-20-163-223.client.comcast.net - - [09/Mar/2004:13:15:15 -0800] "GET /go/bin/test/TWikiLogos/twikiRobot46x50.gif HTTP/1.1" 200 2877 +c-24-20-163-223.client.comcast.net - - [09/Mar/2004:13:15:23 -0800] "GET /ops/SP/play//view/Main/SpamAssassin HTTP/1.1" 200 4081 +c-24-20-163-223.client.comcast.net - - [09/Mar/2004:13:15:33 -0800] "GET /ops/SP/play//view/Main/SpamAssassinAndPostFix HTTP/1.1" 200 4034 +c-24-20-163-223.client.comcast.net - - [09/Mar/2004:13:15:49 -0800] "GET /ops/SP/play//view/Main/SpamAssassinTaggingOnly HTTP/1.1" 200 5691 +c-24-20-163-223.client.comcast.net - - [09/Mar/2004:13:16:00 -0800] "GET /ops/SP/play//view/Main/DCCAndPostFix HTTP/1.1" 200 5253 +h194n2fls308o1033.telia.com - - [09/Mar/2004:13:49:05 -0800] "-" 408 - +h24-71-236-129.ca.clawio.org - - [09/Mar/2004:14:43:02 -0800] "GET /mailman HTTP/1.1" 302 301 +h24-71-236-129.ca.clawio.org - - [09/Mar/2004:14:43:03 -0800] "GET /mailman/listinfo HTTP/1.1" 200 6893 +h24-71-236-129.ca.clawio.org - - [09/Mar/2004:14:43:04 -0800] "GET /icons/mailman.jpg HTTP/1.1" 304 - +h24-71-236-129.ca.clawio.org - - [09/Mar/2004:14:43:05 -0800] "GET /icons/PythonPowered.png HTTP/1.1" 304 - +h24-71-236-129.ca.clawio.org - - [09/Mar/2004:14:43:05 -0800] "GET /icons/gnu-head-tiny.jpg HTTP/1.1" 304 - +h24-71-236-129.ca.clawio.org - - [09/Mar/2004:14:43:12 -0800] "GET /mailman/listinfo/ppwc HTTP/1.1" 200 6271 +jacksonproject.tnr.on.ca - - [09/Mar/2004:14:50:15 -0800] "GET / HTTP/1.1" 200 3169 +jacksonproject.tnr.on.ca - - [09/Mar/2004:14:50:23 -0800] "GET /mailman HTTP/1.1" 302 301 +jacksonproject.tnr.on.ca - - [09/Mar/2004:14:50:23 -0800] "GET /mailman/listinfo HTTP/1.1" 200 6893 +jacksonproject.tnr.on.ca - - [09/Mar/2004:14:50:24 -0800] "GET /icons/mailman.jpg HTTP/1.1" 200 2022 +jacksonproject.tnr.on.ca - - [09/Mar/2004:14:50:24 -0800] "GET /icons/gnu-head-tiny.jpg HTTP/1.1" 200 3049 +jacksonproject.tnr.on.ca - - [09/Mar/2004:14:50:24 -0800] "GET /icons/PythonPowered.png HTTP/1.1" 200 945 +jacksonproject.tnr.on.ca - - [09/Mar/2004:14:50:28 -0800] "GET /mailman/listinfo/ppwc HTTP/1.1" 200 6271 +jacksonproject.tnr.on.ca - - [09/Mar/2004:14:56:15 -0800] "GET / HTTP/1.1" 304 - +home.yeungs.net - - [09/Mar/2004:15:03:55 -0800] "GET /AmavisNew.jsp HTTP/1.1" 200 2300 +203.147.138.233 - - [09/Mar/2004:15:25:03 -0800] "GET /ststats/index.jsp HTTP/1.1" 200 2955 +203.147.138.233 - - [09/Mar/2004:15:25:05 -0800] "GET /favicon.ico HTTP/1.1" 200 1078 +203.147.138.233 - - [09/Mar/2004:15:25:14 -0800] "GET /ststats/stats-spam.1day.png HTTP/1.1" 200 3041 +203.147.138.233 - - [09/Mar/2004:15:25:15 -0800] "GET /ststats/stats-hashes.1week.png HTTP/1.1" 200 1695 +203.147.138.233 - - [09/Mar/2004:15:25:15 -0800] "GET /ststats/stats-spam.1month.png HTTP/1.1" 200 2577 +203.147.138.233 - - [09/Mar/2004:15:25:15 -0800] "GET /ststats/stats-spam.1week.png HTTP/1.1" 200 3203 +203.147.138.233 - - [09/Mar/2004:15:25:15 -0800] "GET /ststats/stats-spam-ratio.1month.png HTTP/1.1" 200 1970 +203.147.138.233 - - [09/Mar/2004:15:25:15 -0800] "GET /ststats/stats-spam-ratio.1day.png HTTP/1.1" 200 2181 +203.147.138.233 - - [09/Mar/2004:15:25:15 -0800] "GET /ststats/stats-hashes.1month.png HTTP/1.1" 200 1550 +203.147.138.233 - - [09/Mar/2004:15:25:15 -0800] "GET /ststats/stats-spam-ratio.1week.png HTTP/1.1" 200 2314 +203.147.138.233 - - [09/Mar/2004:15:25:15 -0800] "GET /ststats/stats-spam-ratio.1year.png HTTP/1.1" 200 1850 +203.147.138.233 - - [09/Mar/2004:15:25:15 -0800] "GET /ststats/stats-spam.1year.png HTTP/1.1" 200 2213 +203.147.138.233 - - [09/Mar/2004:15:25:15 -0800] "GET /ststats/stats-hashes.1year.png HTTP/1.1" 200 1509 +h24-71-236-129.ca.clawio.org - - [09/Mar/2004:15:37:35 -0800] "GET /mailman/listinfo/ppwc HTTP/1.1" 200 6271 +h24-71-236-129.ca.clawio.org - - [09/Mar/2004:15:37:36 -0800] "GET /icons/mailman.jpg HTTP/1.1" 304 - +h24-71-236-129.ca.clawio.org - - [09/Mar/2004:15:37:36 -0800] "GET /icons/PythonPowered.png HTTP/1.1" 304 - +h24-71-236-129.ca.clawio.org - - [09/Mar/2004:15:37:36 -0800] "GET /icons/gnu-head-tiny.jpg HTTP/1.1" 304 - +208-38-57-205.ip.cal.radiant.net - - [09/Mar/2004:15:44:52 -0800] "GET / HTTP/1.1" 200 3169 +208-38-57-205.ip.cal.radiant.net - - [09/Mar/2004:15:44:52 -0800] "GET /favicon.ico HTTP/1.1" 200 1078 +208-38-57-205.ip.cal.radiant.net - - [09/Mar/2004:15:44:57 -0800] "GET /rejected.jsp HTTP/1.1" 200 3998 +h24-71-236-129.ca.clawio.org - - [09/Mar/2004:15:51:10 -0800] "GET /mailman/admin/ppwc HTTP/1.1" 200 2082 +h24-71-236-129.ca.clawio.org - - [09/Mar/2004:15:51:24 -0800] "POST /mailman/admin/ppwc HTTP/1.1" 200 2182 +h24-71-236-129.ca.clawio.org - - [09/Mar/2004:15:52:09 -0800] "POST /mailman/admin/ppwc HTTP/1.1" 200 2182 +h24-71-236-129.ca.clawio.org - - [09/Mar/2004:15:52:15 -0800] "POST /mailman/admin/ppwc HTTP/1.1" 200 19597 +h24-71-236-129.ca.clawio.org - - [09/Mar/2004:15:53:40 -0800] "GET /mailman/admin/ppwc/logout HTTP/1.1" 200 2103 +h24-71-236-129.ca.clawio.org - - [09/Mar/2004:15:53:49 -0800] "GET /mailman/listinfo HTTP/1.1" 200 6893 +h24-71-236-129.ca.clawio.org - - [09/Mar/2004:15:53:56 -0800] "GET /mailman/listinfo/ppwc HTTP/1.1" 200 6271 +lj1123.passgo.com - - [09/Mar/2004:16:23:55 -0800] "GET /ops/SP/play//oops/TWiki/RegularExp HTTP/1.0" 200 209 +206-15-133-153.dialup.ziplink.net - - [09/Mar/2004:16:27:48 -0800] "HEAD /ops/SP/play//view/Main/SpamAssassinDeleting HTTP/1.1" 200 0 +lj1048.passgo.com - - [09/Mar/2004:17:10:26 -0800] "GET /robots.txt HTTP/1.0" 200 68 +lj1061.passgo.com - - [09/Mar/2004:17:10:28 -0800] "GET /ops/SP/play//oops/TWiki/TablePlugin HTTP/1.0" 200 209 +korell2.cc.gatech.edu - - [09/Mar/2004:17:33:58 -0800] "GET /razor.jsp HTTP/1.0" 200 2869 +65-37-13-251.nrp2.roc.ny.frontiernet.net - - [09/Mar/2004:17:42:41 -0800] "GET /ops/SP/play//view/Main/WebHome HTTP/1.1" 200 10419 +65-37-13-251.nrp2.roc.ny.frontiernet.net - - [09/Mar/2004:17:42:42 -0800] "GET /favicon.ico HTTP/1.1" 200 1078 +65-37-13-251.nrp2.roc.ny.frontiernet.net - - [09/Mar/2004:17:42:42 -0800] "GET /go/bin/test/TWikiLogos/twikiRobot46x50.gif HTTP/1.1" 200 2877 +65-37-13-251.nrp2.roc.ny.frontiernet.net - - [09/Mar/2004:17:43:54 -0800] "GET /ops/SP/play//view/Main/RBLsHowTo HTTP/1.1" 200 4665 +65-37-13-251.nrp2.roc.ny.frontiernet.net - - [09/Mar/2004:17:45:02 -0800] "GET /ops/SP/play//view/Sandbox/WebHome HTTP/1.1" 200 8632 +cpe-203-51-137-224.vic.bigpond.net.au - - [09/Mar/2004:18:00:43 -0800] "GET /mailman/admin HTTP/1.1" 200 6872 +cpe-203-51-137-224.vic.bigpond.net.au - - [09/Mar/2004:18:00:44 -0800] "GET /icons/mailman.jpg HTTP/1.1" 200 2022 +cpe-203-51-137-224.vic.bigpond.net.au - - [09/Mar/2004:18:00:44 -0800] "GET /icons/PythonPowered.png HTTP/1.1" 200 945 +cpe-203-51-137-224.vic.bigpond.net.au - - [09/Mar/2004:18:00:44 -0800] "GET /icons/gnu-head-tiny.jpg HTTP/1.1" 200 3049 +cpe-203-51-137-224.vic.bigpond.net.au - - [09/Mar/2004:18:01:11 -0800] "GET /mailman/admin/webct HTTP/1.1" 200 2080 +cpe-203-51-137-224.vic.bigpond.net.au - - [09/Mar/2004:18:01:24 -0800] "GET /mailman HTTP/1.1" 302 301 +cpe-203-51-137-224.vic.bigpond.net.au - - [09/Mar/2004:18:01:25 -0800] "GET /mailman/listinfo HTTP/1.1" 200 6893 +cpe-203-51-137-224.vic.bigpond.net.au - - [09/Mar/2004:18:01:28 -0800] "GET /mailman/listinfo/administration HTTP/1.1" 200 6459 +cpe-203-51-137-224.vic.bigpond.net.au - - [09/Mar/2004:18:01:45 -0800] "GET /mailman/listinfo/cnc_notice HTTP/1.1" 200 6337 +cpe-203-51-137-224.vic.bigpond.net.au - - [09/Mar/2004:18:02:07 -0800] "GET /mailman/listinfo HTTP/1.1" 200 6893 +grandpa.mmlc.northwestern.edu - - [09/Mar/2004:18:06:27 -0800] "GET /razor.jsp HTTP/1.1" 200 2869 +grandpa.mmlc.northwestern.edu - - [09/Mar/2004:18:06:27 -0800] "GET /favicon.ico HTTP/1.1" 200 1078 +mth-fgw.ballarat.edu.au - - [09/Mar/2004:20:23:32 -0800] "GET /ops/SP/play//view/Main/SpamAssassinTaggingOnly HTTP/1.1" 200 5691 +mth-fgw.ballarat.edu.au - - [09/Mar/2004:20:23:32 -0800] "GET /go/bin/test/TWikiLogos/twikiRobot46x50.gif HTTP/1.1" 200 2877 +mth-fgw.ballarat.edu.au - - [09/Mar/2004:20:25:15 -0800] "GET /ops/SP/play//view/Main/SpamAssassinAndPostFix HTTP/1.1" 200 4034 +mth-fgw.ballarat.edu.au - - [09/Mar/2004:20:25:18 -0800] "GET /ops/SP/play//view/Main/SpamAssassinDeleting HTTP/1.1" 200 5543 +calcite.rhyolite.com - - [09/Mar/2004:20:34:55 -0800] "GET /clients.jsp HTTP/1.1" 200 18892 +mth-fgw.ballarat.edu.au - - [09/Mar/2004:20:45:43 -0800] "GET /ops/SP/play//view/Main/WebHome HTTP/1.1" 200 10419 +mth-fgw.ballarat.edu.au - - [09/Mar/2004:20:45:48 -0800] "GET /ops/SP/play//view/Main/SpamAssassinAndPostFix HTTP/1.1" 200 4034 +mth-fgw.ballarat.edu.au - - [09/Mar/2004:20:45:51 -0800] "GET /ops/SP/play//view/Main/SpamAssassinDeleting HTTP/1.1" 200 5543 +2-238.tnr.on.ca - - [09/Mar/2004:21:33:22 -0800] "GET / HTTP/1.1" 200 3169 +lj1048.passgo.com - - [09/Mar/2004:21:51:09 -0800] "GET /robots.txt HTTP/1.0" 200 68 +lj1153.passgo.com - - [09/Mar/2004:21:51:16 -0800] "GET /ops/SP/play//oops/Main/ThanadonSomdee HTTP/1.0" 200 209 +mmscrm07-2.uah.goweb.net - - [09/Mar/2004:22:23:39 -0800] "GET /robots.txt HTTP/1.0" 200 68 +lj1036.passgo.com - - [09/Mar/2004:22:31:21 -0800] "GET /ops/SP/play//oops/Know/TopicClassification HTTP/1.0" 200 209 +adsl-157-26-153.msy.bellsouth.net - - [09/Mar/2004:22:40:32 -0800] "GET /ops/SP/play//view/Main/SpamAssassinTaggingOnly HTTP/1.1" 200 5691 +adsl-157-26-153.msy.bellsouth.net - - [09/Mar/2004:22:40:33 -0800] "GET /go/bin/test/TWikiLogos/twikiRobot46x50.gif HTTP/1.1" 200 2877 +lj1164.passgo.com - - [09/Mar/2004:22:44:31 -0800] "GET /ops/SP/play//oops/TWiki/TextFormattingRules HTTP/1.0" 200 209 +66-194-6-79.gen.twtelecom.net - - [09/Mar/2004:23:36:11 -0800] "GET / HTTP/1.1" 200 3169 +lj1231.passgo.com - - [10/Mar/2004:00:21:51 -0800] "GET /ops/SP/play//oops/Main/TWikiUsers HTTP/1.0" 200 209 +212.21.228.26 - - [10/Mar/2004:00:24:58 -0800] "GET /razor.jsp HTTP/1.0" 200 2869 +yongsan-cache.korea.army.mil - - [10/Mar/2004:00:29:44 -0800] "GET /mailman/listinfo/cncce HTTP/1.1" 200 6208 +yongsan-cache.korea.army.mil - - [10/Mar/2004:00:29:44 -0800] "GET /icons/mailman.jpg HTTP/1.1" 200 2022 +yongsan-cache.korea.army.mil - - [10/Mar/2004:00:29:44 -0800] "GET /icons/PythonPowered.png HTTP/1.1" 200 945 +yongsan-cache.korea.army.mil - - [10/Mar/2004:00:29:45 -0800] "GET /icons/gnu-head-tiny.jpg HTTP/1.1" 200 3049 +pd9e761cf.dip.t-dialin.net - - [10/Mar/2004:02:07:27 -0800] "GET /AmavisNew.jsp HTTP/1.1" 200 2300 +lj1048.passgo.com - - [10/Mar/2004:02:31:33 -0800] "GET /robots.txt HTTP/1.0" 200 68 +lj1160.passgo.com - - [10/Mar/2004:02:31:44 -0800] "GET /razor.jsp HTTP/1.0" 304 - +nb-bolz.cremona.polimi.it - - [10/Mar/2004:02:52:49 -0800] "GET /AmavisNew.jsp HTTP/1.1" 200 2300 +pc-030-040.eco.rug.nl - - [10/Mar/2004:02:55:00 -0800] "GET /SpamAssassin.jsp HTTP/1.1" 200 7368 +pc3-registry-stockholm.telia.net - - [10/Mar/2004:03:11:40 -0800] "GET /ops/SP/play//view/Main/WebHome HTTP/1.1" 200 10419 +pc3-registry-stockholm.telia.net - - [10/Mar/2004:03:11:50 -0800] "GET /ops/SP/play//view/Main/SpamAssassinAndPostFix HTTP/1.1" 200 4034 +pc3-registry-stockholm.telia.net - - [10/Mar/2004:03:11:53 -0800] "GET /ops/SP/play//view/Main/SpamAssassinTaggingOnly HTTP/1.1" 200 5691 +pc3-registry-stockholm.telia.net - - [10/Mar/2004:03:12:07 -0800] "GET /ops/SP/play//view/Main/SpamAssassinDeleting HTTP/1.1" 200 5543 +pc3-registry-stockholm.telia.net - - [10/Mar/2004:03:12:20 -0800] "GET /ops/SP/play//view/Main/ConfigurationVariables HTTP/1.1" 200 58292 +pc3-registry-stockholm.telia.net - - [10/Mar/2004:03:12:33 -0800] "GET /ops/SP/play//view/Main/RBLsHowTo HTTP/1.1" 200 4665 +pc3-registry-stockholm.telia.net - - [10/Mar/2004:03:12:45 -0800] "GET /ops/SP/play//view/Main/PostfixCommands HTTP/1.1" 200 4016 +pc3-registry-stockholm.telia.net - - [10/Mar/2004:03:12:48 -0800] "GET /ops/SP/play//view/Main/PostSuper HTTP/1.1" 200 3629 +pc3-registry-stockholm.telia.net - - [10/Mar/2004:03:12:56 -0800] "GET /ops/SP/play//view/Main/LinksOfUse HTTP/1.1" 200 4534 +pc3-registry-stockholm.telia.net - - [10/Mar/2004:03:14:40 -0800] "GET /ops/SP/play//view/Main/DCCAndPostFix HTTP/1.1" 200 5253 +pc3-registry-stockholm.telia.net - - [10/Mar/2004:03:14:54 -0800] "GET /ops/SP/play//view/Main/SpamAssassinUsingRazorAndDCC HTTP/1.1" 200 7435 +pc3-registry-stockholm.telia.net - - [10/Mar/2004:03:15:28 -0800] "GET /ops/SP/play//view/Main/SideBar HTTP/1.1" 200 3972 +pc3-registry-stockholm.telia.net - - [10/Mar/2004:03:15:33 -0800] "GET /ops/SP/play//view/Main/DCCGraphs HTTP/1.1" 200 5402 +80.58.14.235.proxycache.rima-tde.net - - [10/Mar/2004:03:52:49 -0800] "GET /mailman/listinfo/fnac HTTP/1.0" 200 5969 +80.58.14.235.proxycache.rima-tde.net - - [10/Mar/2004:03:52:51 -0800] "GET /icons/PythonPowered.png HTTP/1.1" 200 945 +80.58.14.235.proxycache.rima-tde.net - - [10/Mar/2004:03:52:51 -0800] "GET /icons/mailman.jpg HTTP/1.1" 200 2022 +80.58.14.235.proxycache.rima-tde.net - - [10/Mar/2004:03:52:52 -0800] "GET /icons/gnu-head-tiny.jpg HTTP/1.1" 200 3049 +66-194-6-70.gen.twtelecom.net - - [10/Mar/2004:05:21:38 -0800] "GET / HTTP/1.1" 200 3169 +pd9e50809.dip.t-dialin.net - - [10/Mar/2004:07:36:56 -0800] "GET /razor.jsp HTTP/1.0" 200 2869 +10.0.0.176 - - [10/Mar/2004:08:36:28 -0800] "GET / HTTP/1.1" 304 - +10.0.0.176 - - [10/Mar/2004:08:36:30 -0800] "GET /forplus/mailgraph2.cgi HTTP/1.1" 200 2987 +10.0.0.176 - - [10/Mar/2004:08:36:31 -0800] "GET /forplus/mailgraph.cgi/mailgraph_0.png HTTP/1.1" 200 7783 +10.0.0.176 - - [10/Mar/2004:08:36:31 -0800] "GET /forplus/mailgraph.cgi/mailgraph_1.png HTTP/1.1" 200 8845 +10.0.0.176 - - [10/Mar/2004:08:36:31 -0800] "GET /forplus/mailgraph.cgi/mailgraph_0_err.png HTTP/1.1" 200 6274 +10.0.0.176 - - [10/Mar/2004:08:36:31 -0800] "GET /forplus/mailgraph.cgi/mailgraph_1_err.png HTTP/1.1" 200 7071 +10.0.0.176 - - [10/Mar/2004:08:36:31 -0800] "GET /forplus/mailgraph.cgi/mailgraph_2.png HTTP/1.1" 200 9328 +10.0.0.176 - - [10/Mar/2004:08:36:31 -0800] "GET /forplus/mailgraph.cgi/mailgraph_2_err.png HTTP/1.1" 200 6976 +10.0.0.176 - - [10/Mar/2004:08:36:31 -0800] "GET /forplus/mailgraph.cgi/mailgraph_3.png HTTP/1.1" 200 6619 +10.0.0.176 - - [10/Mar/2004:08:36:31 -0800] "GET /forplus/mailgraph.cgi/mailgraph_3_err.png HTTP/1.1" 200 5517 +10.0.0.176 - - [10/Mar/2004:08:36:57 -0800] "GET /ststats/index.jsp HTTP/1.1" 304 - +10.0.0.176 - - [10/Mar/2004:08:36:58 -0800] "GET /ststats/stats-spam.1day.png HTTP/1.1" 200 3020 +10.0.0.176 - - [10/Mar/2004:08:36:58 -0800] "GET /ststats/stats-spam-ratio.1day.png HTTP/1.1" 200 2287 +10.0.0.176 - - [10/Mar/2004:08:36:58 -0800] "GET /ststats/stats-spam-ratio.1week.png HTTP/1.1" 200 2332 +10.0.0.176 - - [10/Mar/2004:08:36:58 -0800] "GET /ststats/stats-hashes.1week.png HTTP/1.1" 200 1673 +10.0.0.176 - - [10/Mar/2004:08:36:58 -0800] "GET /ststats/stats-spam.1month.png HTTP/1.1" 200 2583 +10.0.0.176 - - [10/Mar/2004:08:36:58 -0800] "GET /ststats/stats-spam-ratio.1month.png HTTP/1.1" 200 1976 +10.0.0.176 - - [10/Mar/2004:08:36:58 -0800] "GET /ststats/stats-spam.1week.png HTTP/1.1" 200 3364 +10.0.0.176 - - [10/Mar/2004:08:36:58 -0800] "GET /ststats/stats-spam.1year.png HTTP/1.1" 200 2220 +10.0.0.176 - - [10/Mar/2004:08:36:58 -0800] "GET /ststats/stats-hashes.1month.png HTTP/1.1" 200 1627 +10.0.0.176 - - [10/Mar/2004:08:36:58 -0800] "GET /ststats/stats-spam-ratio.1year.png HTTP/1.1" 200 1837 +10.0.0.176 - - [10/Mar/2004:08:36:58 -0800] "GET /ststats/stats-hashes.1year.png HTTP/1.1" 200 1528 +ts05-ip44.hevanet.com - - [10/Mar/2004:08:51:31 -0800] "GET / HTTP/1.1" 304 - +ts05-ip44.hevanet.com - - [10/Mar/2004:08:52:13 -0800] "GET /ops/SP/play//view/Main/WebHome HTTP/1.1" 200 10419 +ts05-ip44.hevanet.com - - [10/Mar/2004:08:52:16 -0800] "GET /go/bin/test/TWikiLogos/twikiRobot46x50.gif HTTP/1.1" 304 - +ts05-ip44.hevanet.com - - [10/Mar/2004:08:52:25 -0800] "GET /ops/SP/play//view/Main/DCCAndPostFix HTTP/1.1" 200 5253 +ts05-ip44.hevanet.com - - [10/Mar/2004:08:52:52 -0800] "GET /ops/SP/play//view/Main/SpamAssassinUsingRazorAndDCC HTTP/1.1" 200 7435 +ts05-ip44.hevanet.com - - [10/Mar/2004:08:53:12 -0800] "GET /ops/SP/play//view/Main/PostfixCommands HTTP/1.1" 200 4016 +ts05-ip44.hevanet.com - - [10/Mar/2004:08:53:19 -0800] "GET /ops/SP/play//view/Main/PostfixCmd HTTP/1.1" 200 4173 +ts05-ip44.hevanet.com - - [10/Mar/2004:08:53:33 -0800] "GET /ops/SP/play//view/Main/PostSuper HTTP/1.1" 200 3629 +ts05-ip44.hevanet.com - - [10/Mar/2004:08:54:15 -0800] "GET /ops/SP/play//view/Main/ConfigurationVariables HTTP/1.1" 200 58292 +ts05-ip44.hevanet.com - - [10/Mar/2004:08:54:37 -0800] "GET /ops/SP/play//view/Main/RBLsHowTo HTTP/1.1" 200 4665 +ts05-ip44.hevanet.com - - [10/Mar/2004:08:55:03 -0800] "GET /ops/SP/play//view/Main/RelayGateway HTTP/1.1" 200 4232 +ts05-ip44.hevanet.com - - [10/Mar/2004:08:55:17 -0800] "GET /ops/SP/play//view/Main/VerifingGatway HTTP/1.1" 200 4750 +ts05-ip44.hevanet.com - - [10/Mar/2004:08:55:40 -0800] "GET /ops/SP/play//view/Main/KevinWGagel HTTP/1.1" 200 4901 +ts05-ip44.hevanet.com - - [10/Mar/2004:08:55:49 -0800] "GET /ops/SP/play//view/Main/LinksOfUse HTTP/1.1" 200 4534 +ts05-ip44.hevanet.com - - [10/Mar/2004:08:56:10 -0800] "GET /ops/SP/play//view/Main/SideBar HTTP/1.1" 200 3972 +ts05-ip44.hevanet.com - - [10/Mar/2004:08:56:13 -0800] "GET /ops/SP/play//view/Main/DCCGraphs HTTP/1.1" 200 5402 +lj1048.passgo.com - - [10/Mar/2004:09:05:59 -0800] "GET /robots.txt HTTP/1.0" 200 68 +lj1145.passgo.com - - [10/Mar/2004:09:05:59 -0800] "GET /ops/SP/play//oops/TWiki/MoveTopic HTTP/1.0" 200 209 +cacher2-ext.wise.edt.ericsson.se - - [10/Mar/2004:09:41:56 -0800] "GET /razor.jsp HTTP/1.0" 200 2869 +adsl-64-173-42-65.dsl.snfc21.pacbell.net - - [10/Mar/2004:10:37:53 -0800] "GET /AmavisNew.jsp HTTP/1.1" 200 2300 +ic8234.upco.es - - [10/Mar/2004:10:38:04 -0800] "GET /ops/SP/play//view/Main/WebHome HTTP/1.1" 200 10419 +ic8234.upco.es - - [10/Mar/2004:10:38:05 -0800] "GET /go/bin/test/TWikiLogos/twikiRobot46x50.gif HTTP/1.1" 200 2877 +ic8234.upco.es - - [10/Mar/2004:10:38:23 -0800] "GET /ops/SP/play//view/Main/PostfixCommands HTTP/1.1" 200 4016 +ic8234.upco.es - - [10/Mar/2004:10:38:27 -0800] "GET /ops/SP/play//view/Main/PostSuper HTTP/1.1" 200 3629 +ns.mou.cz - - [10/Mar/2004:10:59:06 -0800] "GET /AmavisNew.jsp HTTP/1.1" 200 2300 +h24-71-236-129.ca.clawio.org - - [10/Mar/2004:11:12:51 -0800] "GET /mailman/listinfo/ppwc HTTP/1.1" 200 6271 +lj1117.passgo.com - - [10/Mar/2004:11:13:21 -0800] "GET /ops/SP/play//view/Know/WebStatistics HTTP/1.0" 200 6394 +h24-71-236-129.ca.clawio.org - - [10/Mar/2004:11:18:59 -0800] "GET /mailman/admin/ppwc HTTP/1.1" 200 2082 +h24-71-236-129.ca.clawio.org - - [10/Mar/2004:11:19:00 -0800] "GET /icons/mailman.jpg HTTP/1.1" 200 2022 +h24-71-236-129.ca.clawio.org - - [10/Mar/2004:11:19:00 -0800] "GET /icons/PythonPowered.png HTTP/1.1" 200 945 +h24-71-236-129.ca.clawio.org - - [10/Mar/2004:11:19:00 -0800] "GET /icons/gnu-head-tiny.jpg HTTP/1.1" 200 3049 +h24-71-236-129.ca.clawio.org - - [10/Mar/2004:11:19:32 -0800] "POST /mailman/admin/ppwc HTTP/1.1" 200 19597 +h24-71-236-129.ca.clawio.org - - [10/Mar/2004:11:41:25 -0800] "GET /mailman/admin/ppwc HTTP/1.1" 200 2082 +h24-71-236-129.ca.clawio.org - - [10/Mar/2004:11:41:25 -0800] "GET /icons/mailman.jpg HTTP/1.1" 304 - +h24-71-236-129.ca.clawio.org - - [10/Mar/2004:11:41:25 -0800] "GET /icons/gnu-head-tiny.jpg HTTP/1.1" 304 - +h24-71-236-129.ca.clawio.org - - [10/Mar/2004:11:41:25 -0800] "GET /icons/PythonPowered.png HTTP/1.1" 304 - +h24-71-236-129.ca.clawio.org - - [10/Mar/2004:11:41:52 -0800] "POST /mailman/admin/ppwc HTTP/1.1" 200 19597 +h24-71-236-129.ca.clawio.org - - [10/Mar/2004:11:43:26 -0800] "GET /mailman/listinfo/ppwc HTTP/1.1" 200 6271 +h24-71-236-129.ca.clawio.org - - [10/Mar/2004:11:44:13 -0800] "GET /mailman/admin/ppwc/members HTTP/1.1" 200 15271 +h24-71-236-129.ca.clawio.org - - [10/Mar/2004:11:44:27 -0800] "GET /mailman/admin/ppwc/members?letter=n HTTP/1.1" 200 15131 +h24-71-236-129.ca.clawio.org - - [10/Mar/2004:11:44:44 -0800] "GET /mailman/admin/ppwc/members?letter=p HTTP/1.1" 200 24507 +h24-71-236-129.ca.clawio.org - - [10/Mar/2004:11:45:22 -0800] "GET /mailman/admin/ppwc/passwords HTTP/1.1" 200 6217 +h24-71-236-129.ca.clawio.org - - [10/Mar/2004:11:45:51 -0800] "GET /mailman/admin/ppwc/gateway HTTP/1.1" 200 0 +h24-71-236-129.ca.clawio.org - - [10/Mar/2004:11:45:51 -0800] "GET /mailman/admin/ppwc/gateway HTTP/1.1" 200 8692 +h24-71-236-129.ca.clawio.org - - [10/Mar/2004:11:46:42 -0800] "GET /mailman/admin/ppwc/general HTTP/1.1" 200 19597 +h24-71-236-129.ca.clawio.org - - [10/Mar/2004:11:47:37 -0800] "GET /mailman/admin/ppwc/?VARHELP=general/owner HTTP/1.1" 200 3505 +h24-71-236-129.ca.clawio.org - - [10/Mar/2004:11:49:57 -0800] "GET /mailman/admin/ppwc HTTP/1.1" 200 2082 +h24-71-236-129.ca.clawio.org - - [10/Mar/2004:11:49:57 -0800] "GET /icons/mailman.jpg HTTP/1.1" 304 - +h24-71-236-129.ca.clawio.org - - [10/Mar/2004:11:49:57 -0800] "GET /icons/gnu-head-tiny.jpg HTTP/1.1" 304 - +h24-71-236-129.ca.clawio.org - - [10/Mar/2004:11:49:57 -0800] "GET /icons/PythonPowered.png HTTP/1.1" 304 - +h24-71-236-129.ca.clawio.org - - [10/Mar/2004:11:50:28 -0800] "GET /mailman/listinfo HTTP/1.1" 200 6893 +h24-71-236-129.ca.clawio.org - - [10/Mar/2004:11:50:35 -0800] "GET /mailman/listinfo/ppwc HTTP/1.1" 200 6271 +h24-71-236-129.ca.clawio.org - - [10/Mar/2004:11:52:14 -0800] "GET /mailman/listinfo/ppwc HTTP/1.1" 200 6271 +h24-71-236-129.ca.clawio.org - - [10/Mar/2004:11:52:42 -0800] "GET /mailman/listinfo HTTP/1.1" 200 6893 +10.0.0.176 - - [10/Mar/2004:12:02:38 -0800] "GET / HTTP/1.1" 304 - +10.0.0.176 - - [10/Mar/2004:12:02:43 -0800] "GET /ops/SP/play//view/Main/WebHome HTTP/1.1" 200 10419 +10.0.0.176 - - [10/Mar/2004:12:02:43 -0800] "GET /go/bin/test/TWikiLogos/twikiRobot46x50.gif HTTP/1.1" 304 - +10.0.0.176 - - [10/Mar/2004:12:02:45 -0800] "GET /mailman HTTP/1.1" 302 301 +10.0.0.176 - - [10/Mar/2004:12:02:46 -0800] "GET /mailman/listinfo HTTP/1.1" 200 6893 +10.0.0.176 - - [10/Mar/2004:12:02:46 -0800] "GET /icons/mailman.jpg HTTP/1.1" 304 - +10.0.0.176 - - [10/Mar/2004:12:02:46 -0800] "GET /icons/PythonPowered.png HTTP/1.1" 304 - +10.0.0.176 - - [10/Mar/2004:12:02:46 -0800] "GET /icons/gnu-head-tiny.jpg HTTP/1.1" 304 - +10.0.0.176 - - [10/Mar/2004:12:02:50 -0800] "GET /mailman/listinfo/ppwc HTTP/1.1" 200 6271 +10.0.0.176 - - [10/Mar/2004:12:02:50 -0800] "GET /icons/PythonPowered.png HTTP/1.1" 304 - +10.0.0.176 - - [10/Mar/2004:12:02:50 -0800] "GET /icons/gnu-head-tiny.jpg HTTP/1.1" 304 - +10.0.0.176 - - [10/Mar/2004:12:02:50 -0800] "GET /icons/mailman.jpg HTTP/1.1" 304 - +10.0.0.176 - - [10/Mar/2004:12:02:52 -0800] "GET /mailman/admin/ppwc HTTP/1.1" 200 2082 +10.0.0.176 - - [10/Mar/2004:12:02:52 -0800] "GET /icons/mailman.jpg HTTP/1.1" 304 - +10.0.0.176 - - [10/Mar/2004:12:02:52 -0800] "GET /icons/gnu-head-tiny.jpg HTTP/1.1" 304 - +10.0.0.176 - - [10/Mar/2004:12:02:52 -0800] "GET /icons/PythonPowered.png HTTP/1.1" 304 - +10.0.0.176 - - [10/Mar/2004:12:02:59 -0800] "POST /mailman/admin/ppwc HTTP/1.1" 200 19597 +10.0.0.176 - - [10/Mar/2004:12:03:00 -0800] "GET /icons/mailman.jpg HTTP/1.1" 304 - +10.0.0.176 - - [10/Mar/2004:12:03:00 -0800] "GET /icons/gnu-head-tiny.jpg HTTP/1.1" 304 - +10.0.0.176 - - [10/Mar/2004:12:03:00 -0800] "GET /icons/PythonPowered.png HTTP/1.1" 304 - +10.0.0.176 - - [10/Mar/2004:12:03:03 -0800] "GET /mailman/admin/ppwc/members HTTP/1.1" 200 15271 +10.0.0.176 - - [10/Mar/2004:12:03:04 -0800] "GET /icons/mailman.jpg HTTP/1.1" 304 - +10.0.0.176 - - [10/Mar/2004:12:03:04 -0800] "GET /icons/gnu-head-tiny.jpg HTTP/1.1" 304 - +10.0.0.176 - - [10/Mar/2004:12:03:04 -0800] "GET /icons/PythonPowered.png HTTP/1.1" 304 - +10.0.0.176 - - [10/Mar/2004:12:03:08 -0800] "GET /mailman/admin/ppwc/members?letter=p HTTP/1.1" 200 24507 +10.0.0.176 - - [10/Mar/2004:12:03:08 -0800] "GET /icons/mailman.jpg HTTP/1.1" 304 - +10.0.0.176 - - [10/Mar/2004:12:03:08 -0800] "GET /icons/gnu-head-tiny.jpg HTTP/1.1" 304 - +10.0.0.176 - - [10/Mar/2004:12:03:08 -0800] "GET /icons/PythonPowered.png HTTP/1.1" 304 - +10.0.0.176 - - [10/Mar/2004:12:03:45 -0800] "GET /mailman/options/ppwc/ppwctwentynine--at--shaw.com HTTP/1.1" 200 14296 +10.0.0.176 - - [10/Mar/2004:12:03:45 -0800] "GET /icons/PythonPowered.png HTTP/1.1" 304 - +10.0.0.176 - - [10/Mar/2004:12:03:45 -0800] "GET /icons/gnu-head-tiny.jpg HTTP/1.1" 304 - +10.0.0.176 - - [10/Mar/2004:12:03:45 -0800] "GET /icons/mailman.jpg HTTP/1.1" 304 - +10.0.0.176 - - [10/Mar/2004:12:05:06 -0800] "POST /mailman/options/ppwc/ppwctwentynine@shaw.com HTTP/1.1" 200 14579 +10.0.0.176 - - [10/Mar/2004:12:05:06 -0800] "GET /icons/PythonPowered.png HTTP/1.1" 304 - +10.0.0.176 - - [10/Mar/2004:12:05:06 -0800] "GET /icons/gnu-head-tiny.jpg HTTP/1.1" 304 - +10.0.0.176 - - [10/Mar/2004:12:05:06 -0800] "GET /icons/mailman.jpg HTTP/1.1" 304 - +10.0.0.176 - - [10/Mar/2004:12:05:22 -0800] "GET /mailman/admin/ppwc HTTP/1.1" 200 19597 +10.0.0.176 - - [10/Mar/2004:12:05:22 -0800] "GET /icons/mailman.jpg HTTP/1.1" 304 - +10.0.0.176 - - [10/Mar/2004:12:05:22 -0800] "GET /icons/gnu-head-tiny.jpg HTTP/1.1" 304 - +10.0.0.176 - - [10/Mar/2004:12:05:22 -0800] "GET /icons/PythonPowered.png HTTP/1.1" 304 - +10.0.0.176 - - [10/Mar/2004:12:05:38 -0800] "GET /mailman/admin/ppwc/members HTTP/1.1" 200 15271 +10.0.0.176 - - [10/Mar/2004:12:05:38 -0800] "GET /icons/mailman.jpg HTTP/1.1" 304 - +10.0.0.176 - - [10/Mar/2004:12:05:38 -0800] "GET /icons/gnu-head-tiny.jpg HTTP/1.1" 304 - +10.0.0.176 - - [10/Mar/2004:12:05:38 -0800] "GET /icons/PythonPowered.png HTTP/1.1" 304 - +10.0.0.176 - - [10/Mar/2004:12:05:40 -0800] "GET /mailman/admin/ppwc/members?letter=p HTTP/1.1" 200 24525 +10.0.0.176 - - [10/Mar/2004:12:05:40 -0800] "GET /icons/mailman.jpg HTTP/1.1" 304 - +10.0.0.176 - - [10/Mar/2004:12:05:40 -0800] "GET /icons/gnu-head-tiny.jpg HTTP/1.1" 304 - +10.0.0.176 - - [10/Mar/2004:12:05:40 -0800] "GET /icons/PythonPowered.png HTTP/1.1" 304 - +10.0.0.176 - - [10/Mar/2004:12:05:54 -0800] "POST /mailman/admin/ppwc/members?letter=p HTTP/1.1" 200 23169 +10.0.0.176 - - [10/Mar/2004:12:05:54 -0800] "GET /icons/mailman.jpg HTTP/1.1" 304 - +10.0.0.176 - - [10/Mar/2004:12:05:54 -0800] "GET /icons/gnu-head-tiny.jpg HTTP/1.1" 304 - +10.0.0.176 - - [10/Mar/2004:12:05:54 -0800] "GET /icons/PythonPowered.png HTTP/1.1" 304 - +10.0.0.176 - - [10/Mar/2004:12:05:58 -0800] "GET /mailman/admin/ppwc/general HTTP/1.1" 200 19597 +10.0.0.176 - - [10/Mar/2004:12:05:58 -0800] "GET /icons/mailman.jpg HTTP/1.1" 304 - +10.0.0.176 - - [10/Mar/2004:12:05:58 -0800] "GET /icons/gnu-head-tiny.jpg HTTP/1.1" 304 - +10.0.0.176 - - [10/Mar/2004:12:05:58 -0800] "GET /icons/PythonPowered.png HTTP/1.1" 304 - +10.0.0.176 - - [10/Mar/2004:12:06:07 -0800] "GET /mailman/admin/ppwc/members HTTP/1.1" 200 15271 +10.0.0.176 - - [10/Mar/2004:12:06:07 -0800] "GET /icons/mailman.jpg HTTP/1.1" 304 - +10.0.0.176 - - [10/Mar/2004:12:06:07 -0800] "GET /icons/gnu-head-tiny.jpg HTTP/1.1" 304 - +10.0.0.176 - - [10/Mar/2004:12:06:07 -0800] "GET /icons/PythonPowered.png HTTP/1.1" 304 - +10.0.0.176 - - [10/Mar/2004:12:06:09 -0800] "GET /mailman/admin/ppwc/members/add HTTP/1.1" 200 6681 +10.0.0.176 - - [10/Mar/2004:12:06:09 -0800] "GET /icons/mailman.jpg HTTP/1.1" 304 - +10.0.0.176 - - [10/Mar/2004:12:06:09 -0800] "GET /icons/gnu-head-tiny.jpg HTTP/1.1" 304 - +10.0.0.176 - - [10/Mar/2004:12:06:09 -0800] "GET /icons/PythonPowered.png HTTP/1.1" 304 - +10.0.0.176 - - [10/Mar/2004:12:07:07 -0800] "POST /mailman/admin/ppwc/members/add HTTP/1.1" 200 6762 +10.0.0.176 - - [10/Mar/2004:12:07:07 -0800] "GET /icons/PythonPowered.png HTTP/1.1" 304 - +10.0.0.176 - - [10/Mar/2004:12:07:07 -0800] "GET /icons/gnu-head-tiny.jpg HTTP/1.1" 304 - +10.0.0.176 - - [10/Mar/2004:12:07:08 -0800] "GET /icons/mailman.jpg HTTP/1.1" 304 - +10.0.0.176 - - [10/Mar/2004:12:07:12 -0800] "GET /mailman/admin/ppwc/members/list HTTP/1.1" 200 15271 +10.0.0.176 - - [10/Mar/2004:12:07:12 -0800] "GET /icons/mailman.jpg HTTP/1.1" 304 - +10.0.0.176 - - [10/Mar/2004:12:07:12 -0800] "GET /icons/gnu-head-tiny.jpg HTTP/1.1" 304 - +10.0.0.176 - - [10/Mar/2004:12:07:13 -0800] "GET /icons/PythonPowered.png HTTP/1.1" 304 - +10.0.0.176 - - [10/Mar/2004:12:07:14 -0800] "GET /icons/mailman.jpg HTTP/1.1" 304 - +10.0.0.176 - - [10/Mar/2004:12:07:14 -0800] "GET /icons/PythonPowered.png HTTP/1.1" 304 - +10.0.0.176 - - [10/Mar/2004:12:07:14 -0800] "GET /icons/gnu-head-tiny.jpg HTTP/1.1" 304 - +10.0.0.176 - - [10/Mar/2004:12:07:14 -0800] "GET /mailman/admin/ppwc/members?letter=p HTTP/1.1" 200 24585 +10.0.0.176 - - [10/Mar/2004:12:07:25 -0800] "POST /mailman/admin/ppwc/members?letter=p HTTP/1.1" 200 24577 +10.0.0.176 - - [10/Mar/2004:12:07:25 -0800] "GET /icons/mailman.jpg HTTP/1.1" 304 - +10.0.0.176 - - [10/Mar/2004:12:07:25 -0800] "GET /icons/gnu-head-tiny.jpg HTTP/1.1" 304 - +10.0.0.176 - - [10/Mar/2004:12:07:25 -0800] "GET /icons/PythonPowered.png HTTP/1.1" 304 - +10.0.0.176 - - [10/Mar/2004:12:16:59 -0800] "GET /mailman/admin/ppwc/logout HTTP/1.1" 200 2103 +10.0.0.176 - - [10/Mar/2004:12:16:59 -0800] "GET /icons/PythonPowered.png HTTP/1.1" 304 - +10.0.0.176 - - [10/Mar/2004:12:16:59 -0800] "GET /icons/gnu-head-tiny.jpg HTTP/1.1" 304 - +10.0.0.176 - - [10/Mar/2004:12:16:59 -0800] "GET /icons/mailman.jpg HTTP/1.1" 304 - +142.27.64.35 - - [10/Mar/2004:12:19:02 -0800] "GET / HTTP/1.1" 304 - +142.27.64.35 - - [10/Mar/2004:12:19:05 -0800] "GET /mailman HTTP/1.1" 302 301 +142.27.64.35 - - [10/Mar/2004:12:19:05 -0800] "GET /mailman/listinfo HTTP/1.1" 200 6893 +142.27.64.35 - - [10/Mar/2004:12:19:06 -0800] "GET /icons/PythonPowered.png HTTP/1.1" 304 - +142.27.64.35 - - [10/Mar/2004:12:19:06 -0800] "GET /icons/gnu-head-tiny.jpg HTTP/1.1" 304 - +142.27.64.35 - - [10/Mar/2004:12:19:06 -0800] "GET /icons/mailman.jpg HTTP/1.1" 304 - +142.27.64.35 - - [10/Mar/2004:12:19:08 -0800] "GET /mailman/listinfo/ppwc HTTP/1.1" 200 6271 +lj1216.passgo.com - - [10/Mar/2004:12:22:32 -0800] "GET /ops/SP/play//oops/TWiki/WikiTopic HTTP/1.0" 200 209 +10.0.0.176 - - [10/Mar/2004:12:25:25 -0800] "GET / HTTP/1.1" 304 - +10.0.0.176 - - [10/Mar/2004:12:25:28 -0800] "GET /forplus/mailgraph2.cgi HTTP/1.1" 200 2987 +10.0.0.176 - - [10/Mar/2004:12:25:29 -0800] "GET /forplus/mailgraph.cgi/mailgraph_0.png HTTP/1.1" 200 8663 +10.0.0.176 - - [10/Mar/2004:12:25:29 -0800] "GET /forplus/mailgraph.cgi/mailgraph_0_err.png HTTP/1.1" 200 6392 +10.0.0.176 - - [10/Mar/2004:12:25:29 -0800] "GET /forplus/mailgraph.cgi/mailgraph_1_err.png HTTP/1.1" 200 7133 +10.0.0.176 - - [10/Mar/2004:12:25:29 -0800] "GET /forplus/mailgraph.cgi/mailgraph_1.png HTTP/1.1" 200 9449 +10.0.0.176 - - [10/Mar/2004:12:25:29 -0800] "GET /forplus/mailgraph.cgi/mailgraph_2_err.png HTTP/1.1" 200 6895 +10.0.0.176 - - [10/Mar/2004:12:25:29 -0800] "GET /forplus/mailgraph.cgi/mailgraph_2.png HTTP/1.1" 200 9403 +10.0.0.176 - - [10/Mar/2004:12:25:29 -0800] "GET /forplus/mailgraph.cgi/mailgraph_3.png HTTP/1.1" 200 6619 +10.0.0.176 - - [10/Mar/2004:12:25:29 -0800] "GET /forplus/mailgraph.cgi/mailgraph_3_err.png HTTP/1.1" 200 5517 +c-411472d5.04-138-73746f22.cust.bredbandsbolaget.se - - [10/Mar/2004:13:13:23 -0800] "GET /razor.jsp HTTP/1.1" 200 2869 +3_343_lt_someone - - [10/Mar/2004:13:15:44 -0800] "GET / HTTP/1.1" 200 3169 +3_343_lt_someone - - [10/Mar/2004:13:15:53 -0800] "GET /forplus/mailgraph2.cgi HTTP/1.1" 200 2987 +3_343_lt_someone - - [10/Mar/2004:13:15:54 -0800] "GET /forplus/mailgraph.cgi/mailgraph_1_err.png HTTP/1.1" 200 7142 +3_343_lt_someone - - [10/Mar/2004:13:15:54 -0800] "GET /forplus/mailgraph.cgi/mailgraph_0.png HTTP/1.1" 200 5882 +3_343_lt_someone - - [10/Mar/2004:13:15:54 -0800] "GET /forplus/mailgraph.cgi/mailgraph_0_err.png HTTP/1.1" 200 6485 +3_343_lt_someone - - [10/Mar/2004:13:15:54 -0800] "GET /forplus/mailgraph.cgi/mailgraph_1.png HTTP/1.1" 200 8673 +3_343_lt_someone - - [10/Mar/2004:13:15:54 -0800] "GET /forplus/mailgraph.cgi/mailgraph_2_err.png HTTP/1.1" 200 6895 +3_343_lt_someone - - [10/Mar/2004:13:15:54 -0800] "GET /forplus/mailgraph.cgi/mailgraph_2.png HTTP/1.1" 200 9403 +3_343_lt_someone - - [10/Mar/2004:13:15:54 -0800] "GET /forplus/mailgraph.cgi/mailgraph_3.png HTTP/1.1" 200 6619 +3_343_lt_someone - - [10/Mar/2004:13:15:54 -0800] "GET /forplus/mailgraph.cgi/mailgraph_3_err.png HTTP/1.1" 200 5517 +watchguard.cgmatane.qc.ca - - [10/Mar/2004:13:41:37 -0800] "GET /SpamAssassin.jsp HTTP/1.1" 200 7368 +watchguard.cgmatane.qc.ca - - [10/Mar/2004:13:42:23 -0800] "GET /RBL.jsp HTTP/1.1" 200 4114 +ppp2.p33.is.com.ua - - [10/Mar/2004:14:20:51 -0800] "GET /SpamAssassin.jsp HTTP/1.1" 200 7368 +ppp2.p33.is.com.ua - - [10/Mar/2004:14:21:36 -0800] "GET /favicon.ico HTTP/1.1" 200 1078 +ppp2.p33.is.com.ua - - [10/Mar/2004:14:22:13 -0800] "GET /AmavisNew.jsp HTTP/1.1" 200 2300 +10.0.0.176 - - [10/Mar/2004:15:06:20 -0800] "GET / HTTP/1.1" 304 - +10.0.0.176 - - [10/Mar/2004:15:06:24 -0800] "GET /forplus/mailgraph2.cgi HTTP/1.1" 200 2987 +10.0.0.176 - - [10/Mar/2004:15:06:24 -0800] "GET /forplus/mailgraph.cgi/mailgraph_0.png HTTP/1.1" 200 5871 +10.0.0.176 - - [10/Mar/2004:15:06:24 -0800] "GET /forplus/mailgraph.cgi/mailgraph_0_err.png HTTP/1.1" 200 6484 +10.0.0.176 - - [10/Mar/2004:15:06:24 -0800] "GET /forplus/mailgraph.cgi/mailgraph_1_err.png HTTP/1.1" 200 7014 +10.0.0.176 - - [10/Mar/2004:15:06:24 -0800] "GET /forplus/mailgraph.cgi/mailgraph_1.png HTTP/1.1" 200 8821 +10.0.0.176 - - [10/Mar/2004:15:06:25 -0800] "GET /forplus/mailgraph.cgi/mailgraph_2.png HTTP/1.1" 200 9306 +10.0.0.176 - - [10/Mar/2004:15:06:25 -0800] "GET /forplus/mailgraph.cgi/mailgraph_2_err.png HTTP/1.1" 200 6937 +10.0.0.176 - - [10/Mar/2004:15:06:25 -0800] "GET /forplus/mailgraph.cgi/mailgraph_3_err.png HTTP/1.1" 200 5517 +10.0.0.176 - - [10/Mar/2004:15:06:25 -0800] "GET /forplus/mailgraph.cgi/mailgraph_3.png HTTP/1.1" 200 6619 +lj1024.passgo.com - - [10/Mar/2004:15:10:10 -0800] "GET /robots.txt HTTP/1.0" 200 68 +lj1028.passgo.com - - [10/Mar/2004:15:10:13 -0800] "GET /ops/SP/play//oops/Main/T HTTP/1.0" 200 209 +lj1145.passgo.com - - [10/Mar/2004:15:49:55 -0800] "GET /ops/SP/play//oops/TWiki/NicholasLee HTTP/1.0" 200 209 +h24-68-45-227.gv.shawcable.net - - [10/Mar/2004:16:29:30 -0800] "GET /pipermail/cnc_notice/2004-February.txt HTTP/1.1" 200 6712 +64.246.94.141 - - [10/Mar/2004:16:31:19 -0800] "HEAD /ops/SP/play//view/Main/SpamAssassinDeleting HTTP/1.1" 200 0 +pntn02m05-129.bctel.ca - - [10/Mar/2004:16:33:04 -0800] "GET /pipermail/cncce/2004-January/000001.jsp HTTP/1.1" 200 3095 +calcite.rhyolite.com - - [10/Mar/2004:16:47:44 -0800] "GET /clients.jsp HTTP/1.1" 200 18971 +h24-68-45-227.gv.shawcable.net - - [10/Mar/2004:16:52:44 -0800] "GET /pipermail/cnc_notice/2003-December.txt HTTP/1.1" 200 6570 +h24-68-45-227.gv.shawcable.net - - [10/Mar/2004:16:54:36 -0800] "GET /pipermail/cnc_notice/2003-December/000002.jsp HTTP/1.1" 200 7074 +lj1117.passgo.com - - [10/Mar/2004:18:13:54 -0800] "GET /ops/SP/play//view/Main/VishaalGolam HTTP/1.0" 200 4577 +lj1073.passgo.com - - [10/Mar/2004:18:17:24 -0800] "GET /ops/SP/play//oops/TWiki/Wik HTTP/1.0" 200 209 +lj1024.passgo.com - - [10/Mar/2004:19:55:54 -0800] "GET /robots.txt HTTP/1.0" 200 68 +lj1000.passgo.com - - [10/Mar/2004:19:55:56 -0800] "GET /ops/SP/play//view/Know/WebHome HTTP/1.0" 200 7529 +dialup-5-81.tulane.edu - - [10/Mar/2004:20:22:41 -0800] "GET /ops/SP/play//view/Main/SpamAssassinTaggingOnly HTTP/1.1" 200 5691 +dialup-5-81.tulane.edu - - [10/Mar/2004:20:22:42 -0800] "GET /go/bin/test/TWikiLogos/twikiRobot46x50.gif HTTP/1.1" 200 2877 +dialup-5-81.tulane.edu - - [10/Mar/2004:20:23:11 -0800] "GET /ops/SP/play//view/Main/WebHome HTTP/1.1" 200 10419 +dialup-5-81.tulane.edu - - [10/Mar/2004:20:23:41 -0800] "GET /ops/SP/play//view/Main/TWikiGroups HTTP/1.1" 200 4816 +dialup-5-81.tulane.edu - - [10/Mar/2004:20:23:52 -0800] "GET /ops/SP/play//view/Main/TWikiAdminGroup HTTP/1.1" 200 4175 +lj1145.passgo.com - - [10/Mar/2004:21:56:34 -0800] "GET /ops/SP/play//oops/Main/WebStatistics HTTP/1.0" 200 209 +h24-70-69-74.ca.clawio.org - - [10/Mar/2004:21:58:46 -0800] "GET / HTTP/1.1" 200 3169 +h24-70-69-74.ca.clawio.org - - [10/Mar/2004:21:58:46 -0800] "GET /favicon.ico HTTP/1.1" 200 1078 +h24-70-69-74.ca.clawio.org - - [10/Mar/2004:21:59:16 -0800] "GET /forplus/mailgraph2.cgi HTTP/1.1" 200 2987 +h24-70-69-74.ca.clawio.org - - [10/Mar/2004:21:59:17 -0800] "GET /forplus/mailgraph.cgi/mailgraph_0.png HTTP/1.1" 200 5664 +h24-70-69-74.ca.clawio.org - - [10/Mar/2004:21:59:17 -0800] "GET /forplus/mailgraph.cgi/mailgraph_0_err.png HTTP/1.1" 200 6403 +h24-70-69-74.ca.clawio.org - - [10/Mar/2004:21:59:18 -0800] "GET /forplus/mailgraph.cgi/mailgraph_1.png HTTP/1.1" 200 8837 +h24-70-69-74.ca.clawio.org - - [10/Mar/2004:21:59:18 -0800] "GET /forplus/mailgraph.cgi/mailgraph_1_err.png HTTP/1.1" 200 6980 +h24-70-69-74.ca.clawio.org - - [10/Mar/2004:21:59:18 -0800] "GET /forplus/mailgraph.cgi/mailgraph_2.png HTTP/1.1" 200 9241 +h24-70-69-74.ca.clawio.org - - [10/Mar/2004:21:59:18 -0800] "GET /forplus/mailgraph.cgi/mailgraph_2_err.png HTTP/1.1" 200 6970 +h24-70-69-74.ca.clawio.org - - [10/Mar/2004:21:59:18 -0800] "GET /forplus/mailgraph.cgi/mailgraph_3.png HTTP/1.1" 200 6619 +h24-70-69-74.ca.clawio.org - - [10/Mar/2004:21:59:18 -0800] "GET /forplus/mailgraph.cgi/mailgraph_3_err.png HTTP/1.1" 200 5517 +h24-70-69-74.ca.clawio.org - - [10/Mar/2004:22:00:03 -0800] "GET /ststats/index.jsp HTTP/1.1" 200 2955 +h24-70-69-74.ca.clawio.org - - [10/Mar/2004:22:00:04 -0800] "GET /ststats/stats-spam.1day.png HTTP/1.1" 200 3093 +h24-70-69-74.ca.clawio.org - - [10/Mar/2004:22:00:05 -0800] "GET /ststats/stats-spam-ratio.1day.png HTTP/1.1" 200 2255 +h24-70-69-74.ca.clawio.org - - [10/Mar/2004:22:00:05 -0800] "GET /ststats/stats-spam.1week.png HTTP/1.1" 200 3419 +h24-70-69-74.ca.clawio.org - - [10/Mar/2004:22:00:05 -0800] "GET /ststats/stats-spam-ratio.1week.png HTTP/1.1" 200 2381 +h24-70-69-74.ca.clawio.org - - [10/Mar/2004:22:00:05 -0800] "GET /ststats/stats-hashes.1week.png HTTP/1.1" 200 1658 +h24-70-69-74.ca.clawio.org - - [10/Mar/2004:22:00:05 -0800] "GET /ststats/stats-spam.1month.png HTTP/1.1" 200 2657 +h24-70-69-74.ca.clawio.org - - [10/Mar/2004:22:00:05 -0800] "GET /ststats/stats-spam-ratio.1month.png HTTP/1.1" 200 2008 +h24-70-69-74.ca.clawio.org - - [10/Mar/2004:22:00:05 -0800] "GET /ststats/stats-hashes.1month.png HTTP/1.1" 200 1598 +h24-70-69-74.ca.clawio.org - - [10/Mar/2004:22:00:05 -0800] "GET /ststats/stats-spam.1year.png HTTP/1.1" 200 2223 +h24-70-69-74.ca.clawio.org - - [10/Mar/2004:22:00:05 -0800] "GET /ststats/stats-spam-ratio.1year.png HTTP/1.1" 200 1924 +h24-70-69-74.ca.clawio.org - - [10/Mar/2004:22:00:05 -0800] "GET /ststats/stats-hashes.1year.png HTTP/1.1" 200 1550 +lj1220.passgo.com - - [10/Mar/2004:22:16:58 -0800] "GET /ops/SP/play//oops/TWiki/SvenDowideit HTTP/1.0" 200 209 +h24-70-69-74.ca.clawio.org - - [10/Mar/2004:23:08:28 -0800] "GET /forplus/mailgraph2.cgi HTTP/1.1" 200 2987 +h24-70-69-74.ca.clawio.org - - [10/Mar/2004:23:08:30 -0800] "GET /forplus/mailgraph.cgi/mailgraph_0.png HTTP/1.1" 200 5805 +h24-70-69-74.ca.clawio.org - - [10/Mar/2004:23:08:30 -0800] "GET /forplus/mailgraph.cgi/mailgraph_0_err.png HTTP/1.1" 200 6445 +h24-70-69-74.ca.clawio.org - - [10/Mar/2004:23:08:30 -0800] "GET /forplus/mailgraph.cgi/mailgraph_1.png HTTP/1.1" 200 8809 +h24-70-69-74.ca.clawio.org - - [10/Mar/2004:23:08:31 -0800] "GET /forplus/mailgraph.cgi/mailgraph_1_err.png HTTP/1.1" 200 6882 +h24-70-69-74.ca.clawio.org - - [10/Mar/2004:23:08:31 -0800] "GET /forplus/mailgraph.cgi/mailgraph_2.png HTTP/1.1" 200 9241 +h24-70-69-74.ca.clawio.org - - [10/Mar/2004:23:08:31 -0800] "GET /forplus/mailgraph.cgi/mailgraph_2_err.png HTTP/1.1" 200 6970 +h24-70-69-74.ca.clawio.org - - [10/Mar/2004:23:08:31 -0800] "GET /forplus/mailgraph.cgi/mailgraph_3.png HTTP/1.1" 200 6619 +h24-70-69-74.ca.clawio.org - - [10/Mar/2004:23:08:31 -0800] "GET /forplus/mailgraph.cgi/mailgraph_3_err.png HTTP/1.1" 200 5517 +lj1024.passgo.com - - [11/Mar/2004:00:07:57 -0800] "GET /robots.txt HTTP/1.0" 200 68 +lj1117.passgo.com - - [11/Mar/2004:00:07:58 -0800] "GET /ops/SP/play//oops/Know/WebStatistics HTTP/1.0" 200 209 +lj1120.passgo.com - - [11/Mar/2004:00:42:01 -0800] "GET /ops/SP/play//view/Main/DCCAndPostFix HTTP/1.0" 200 5234 +ns3.vonroll.ch - - [11/Mar/2004:00:43:57 -0800] "GET /ops/SP/play//view/Main/WebHome HTTP/1.0" 200 10392 +ns3.vonroll.ch - - [11/Mar/2004:00:43:59 -0800] "GET /go/bin/test/TWikiLogos/twikiRobot46x50.gif HTTP/1.0" 200 2877 +ns3.vonroll.ch - - [11/Mar/2004:00:44:08 -0800] "GET /ops/SP/play//view/Main/RBLsHowTo HTTP/1.0" 200 4646 +lj1145.passgo.com - - [11/Mar/2004:01:39:53 -0800] "GET /ops/SP/play//view/Main/SimonMudd HTTP/1.0" 200 4612 +1513.cps.virtua.com.br - - [11/Mar/2004:02:27:39 -0800] "GET /pipermail/cipg/2003-november.txt HTTP/1.1" 404 309 +194.151.73.43 - - [11/Mar/2004:03:35:49 -0800] "GET /ie.htm HTTP/1.0" 200 3518 +194.151.73.43 - - [11/Mar/2004:03:35:57 -0800] "GET /images/image004.jpg HTTP/1.0" 200 10936 +194.151.73.43 - - [11/Mar/2004:03:35:57 -0800] "GET /images/image005.jpg HTTP/1.0" 200 21125 +194.151.73.43 - - [11/Mar/2004:03:35:58 -0800] "GET /images/msgops.JPG HTTP/1.0" 200 7939 +spica.ukc.ac.uk - - [11/Mar/2004:03:50:09 -0800] "GET /razor.jsp HTTP/1.1" 200 2869 +spica.ukc.ac.uk - - [11/Mar/2004:03:50:09 -0800] "GET /favicon.ico HTTP/1.1" 200 1078 +ogw.netinfo.nl - - [11/Mar/2004:06:11:19 -0800] "GET /ops/SP/play//view/Main/WebHome HTTP/1.1" 200 10419 +ogw.netinfo.nl - - [11/Mar/2004:06:11:21 -0800] "GET /go/bin/test/TWikiLogos/twikiRobot46x50.gif HTTP/1.1" 200 2877 +ogw.netinfo.nl - - [11/Mar/2004:06:11:38 -0800] "GET /ops/SP/play//view/Main/PostfixCommands HTTP/1.1" 200 4016 +ogw.netinfo.nl - - [11/Mar/2004:06:11:39 -0800] "GET /go/bin/test/TWikiLogos/twikiRobot46x50.gif HTTP/1.1" 304 - +ogw.netinfo.nl - - [11/Mar/2004:06:11:46 -0800] "GET /ops/SP/play//view/Main/PostfixCmd HTTP/1.1" 200 4173 +ogw.netinfo.nl - - [11/Mar/2004:06:11:47 -0800] "GET /go/bin/test/TWikiLogos/twikiRobot46x50.gif HTTP/1.1" 304 - +ogw.netinfo.nl - - [11/Mar/2004:06:12:41 -0800] "GET /ops/SP/play//view/Main/PostQueue HTTP/1.1" 200 4280 +ogw.netinfo.nl - - [11/Mar/2004:06:12:43 -0800] "GET /go/bin/test/TWikiLogos/twikiRobot46x50.gif HTTP/1.1" 304 - +ogw.netinfo.nl - - [11/Mar/2004:06:13:07 -0800] "GET /ops/SP/play//view/Main/PostSuper HTTP/1.1" 200 3629 +ogw.netinfo.nl - - [11/Mar/2004:06:13:08 -0800] "GET /go/bin/test/TWikiLogos/twikiRobot46x50.gif HTTP/1.1" 304 - +ogw.netinfo.nl - - [11/Mar/2004:06:14:03 -0800] "GET /ops/SP/play//view/Main/RBLsHowTo HTTP/1.1" 200 4665 +ogw.netinfo.nl - - [11/Mar/2004:06:14:04 -0800] "GET /go/bin/test/TWikiLogos/twikiRobot46x50.gif HTTP/1.1" 304 - +ogw.netinfo.nl - - [11/Mar/2004:06:16:40 -0800] "GET /ops/SP/play//view/Main/RelayGateway HTTP/1.1" 200 4232 +ogw.netinfo.nl - - [11/Mar/2004:06:17:06 -0800] "GET /ops/SP/play//view/Main/LinksOfUse HTTP/1.1" 200 4534 +ogw.netinfo.nl - - [11/Mar/2004:06:17:11 -0800] "GET /go/bin/test/TWikiLogos/twikiRobot46x50.gif HTTP/1.1" 304 - +lj1024.passgo.com - - [11/Mar/2004:06:27:31 -0800] "GET /robots.txt HTTP/1.0" 200 68 +lj1153.passgo.com - - [11/Mar/2004:06:27:36 -0800] "GET /ops/SP/play//oops/Sandbox/WebStatistics HTTP/1.0" 200 209 +208-186-146-13.nrp3.brv.mn.frontiernet.net - - [11/Mar/2004:06:48:05 -0800] "GET /AmavisNew.jsp HTTP/1.1" 200 2300 +208-186-146-13.nrp3.brv.mn.frontiernet.net - - [11/Mar/2004:06:48:05 -0800] "GET /favicon.ico HTTP/1.1" 200 1078 +ladybug.cns.vt.edu - - [11/Mar/2004:07:15:10 -0800] "GET /ops/SP/play//view/Main/WebHome HTTP/1.1" 200 10419 +ladybug.cns.vt.edu - - [11/Mar/2004:07:15:11 -0800] "GET /go/bin/test/TWikiLogos/twikiRobot46x50.gif HTTP/1.1" 200 2877 +ladybug.cns.vt.edu - - [11/Mar/2004:07:19:57 -0800] "GET /favicon.ico HTTP/1.1" 200 1078 +ladybug.cns.vt.edu - - [11/Mar/2004:07:20:05 -0800] "GET /ops/SP/play//view/Main/SpamAssassinAndPostFix HTTP/1.1" 200 4034 +ladybug.cns.vt.edu - - [11/Mar/2004:07:20:09 -0800] "GET /ops/SP/play//view/Main/SpamAssassinTaggingOnly HTTP/1.1" 200 5691 +osdlab.eic.nctu.edu.tw - - [11/Mar/2004:07:39:30 -0800] "GET /M83A HTTP/1.0" 404 269 +208.247.148.12 - - [11/Mar/2004:08:14:18 -0800] "GET /mailman/listinfo/ppwc HTTP/1.0" 200 6252 +208.247.148.12 - - [11/Mar/2004:08:14:18 -0800] "GET /icons/mailman.jpg HTTP/1.0" 200 2022 +208.247.148.12 - - [11/Mar/2004:08:14:18 -0800] "GET /icons/PythonPowered.png HTTP/1.0" 200 945 +208.247.148.12 - - [11/Mar/2004:08:14:18 -0800] "GET /icons/gnu-head-tiny.jpg HTTP/1.0" 200 3049 +ogw.netinfo.nl - - [11/Mar/2004:08:45:41 -0800] "GET /ops/SP/play//view/Main/SpamAssassinAndPostFix HTTP/1.1" 200 4034 +ogw.netinfo.nl - - [11/Mar/2004:08:45:42 -0800] "GET /go/bin/test/TWikiLogos/twikiRobot46x50.gif HTTP/1.1" 304 - +ogw.netinfo.nl - - [11/Mar/2004:08:45:49 -0800] "GET /ops/SP/play//view/Main/SpamAssassinDeleting HTTP/1.1" 200 5543 +ogw.netinfo.nl - - [11/Mar/2004:08:45:54 -0800] "GET /go/bin/test/TWikiLogos/twikiRobot46x50.gif HTTP/1.1" 304 - +0x503e4fce.virnxx2.adsl-dhcp.tele.dk - - [11/Mar/2004:10:55:40 -0800] "GET /razor.jsp HTTP/1.1" 200 2869 +0x503e4fce.virnxx2.adsl-dhcp.tele.dk - - [11/Mar/2004:10:58:16 -0800] "GET /favicon.ico HTTP/1.1" 200 1078 +0x503e4fce.virnxx2.adsl-dhcp.tele.dk - - [11/Mar/2004:10:58:27 -0800] "GET /razor.jsp HTTP/1.1" 304 - +64-93-34-186.client.dsl.net - - [11/Mar/2004:11:12:40 -0800] "GET /razor.jsp HTTP/1.1" 200 2869 +d207-6-50-215.bchsia.telus.net - - [11/Mar/2004:11:33:35 -0800] "GET /pipermail/cncce/2004-January/000001.jsp HTTP/1.1" 200 3095 +10.0.0.176 - - [11/Mar/2004:11:49:51 -0800] "GET / HTTP/1.1" 304 - +10.0.0.176 - - [11/Mar/2004:11:49:53 -0800] "GET /forplus/mailgraph2.cgi HTTP/1.1" 200 2987 +10.0.0.176 - - [11/Mar/2004:11:49:54 -0800] "GET /forplus/mailgraph.cgi/mailgraph_0.png HTTP/1.1" 200 5622 +10.0.0.176 - - [11/Mar/2004:11:49:54 -0800] "GET /forplus/mailgraph.cgi/mailgraph_0_err.png HTTP/1.1" 200 6357 +10.0.0.176 - - [11/Mar/2004:11:49:54 -0800] "GET /forplus/mailgraph.cgi/mailgraph_1.png HTTP/1.1" 200 8728 +10.0.0.176 - - [11/Mar/2004:11:49:54 -0800] "GET /forplus/mailgraph.cgi/mailgraph_1_err.png HTTP/1.1" 200 6791 +10.0.0.176 - - [11/Mar/2004:11:49:54 -0800] "GET /forplus/mailgraph.cgi/mailgraph_2.png HTTP/1.1" 200 9561 +10.0.0.176 - - [11/Mar/2004:11:49:54 -0800] "GET /forplus/mailgraph.cgi/mailgraph_2_err.png HTTP/1.1" 200 7087 +10.0.0.176 - - [11/Mar/2004:11:49:54 -0800] "GET /forplus/mailgraph.cgi/mailgraph_3.png HTTP/1.1" 200 6427 +10.0.0.176 - - [11/Mar/2004:11:49:54 -0800] "GET /forplus/mailgraph.cgi/mailgraph_3_err.png HTTP/1.1" 200 5598 +1-729.tnr.on.ca - - [11/Mar/2004:11:54:59 -0800] "GET / HTTP/1.1" 200 3169 +1-729.tnr.on.ca - - [11/Mar/2004:11:55:22 -0800] "GET /mailman HTTP/1.1" 302 301 +1-729.tnr.on.ca - - [11/Mar/2004:11:55:22 -0800] "GET /mailman/listinfo HTTP/1.1" 200 6893 +1-729.tnr.on.ca - - [11/Mar/2004:11:55:22 -0800] "GET /icons/mailman.jpg HTTP/1.1" 200 2022 +1-729.tnr.on.ca - - [11/Mar/2004:11:55:23 -0800] "GET /icons/PythonPowered.png HTTP/1.1" 200 945 +1-729.tnr.on.ca - - [11/Mar/2004:11:55:23 -0800] "GET /icons/gnu-head-tiny.jpg HTTP/1.1" 200 3049 +1-729.tnr.on.ca - - [11/Mar/2004:11:55:26 -0800] "GET /mailman/listinfo/administration HTTP/1.1" 200 6459 +h24-71-236-129.ca.clawio.org - - [11/Mar/2004:12:28:50 -0800] "GET /mailman/admindb/ppwc HTTP/1.1" 200 2072 +h24-71-236-129.ca.clawio.org - - [11/Mar/2004:12:28:50 -0800] "GET /icons/mailman.jpg HTTP/1.1" 304 - +h24-71-236-129.ca.clawio.org - - [11/Mar/2004:12:28:51 -0800] "GET /icons/PythonPowered.png HTTP/1.1" 304 - +h24-71-236-129.ca.clawio.org - - [11/Mar/2004:12:28:51 -0800] "GET /icons/gnu-head-tiny.jpg HTTP/1.1" 304 - +h24-71-236-129.ca.clawio.org - - [11/Mar/2004:12:29:03 -0800] "POST /mailman/admindb/ppwc HTTP/1.1" 200 3407 +h24-71-236-129.ca.clawio.org - - [11/Mar/2004:12:29:27 -0800] "POST /mailman/admindb/ppwc HTTP/1.1" 200 1134 +cr020r01-3.uah.goweb.net - - [11/Mar/2004:12:56:35 -0800] "GET /robots.txt HTTP/1.0" 200 68 +cr020r01-3.uah.goweb.net - - [11/Mar/2004:12:56:58 -0800] "GET /ops/SP/play//view/TWiki/WebStatistics HTTP/1.0" 200 8193 +cr020r01-3.uah.goweb.net - - [11/Mar/2004:12:57:18 -0800] "GET /ops/SP/play//view/Main/TWikiGuest HTTP/1.0" 200 4430 +cr020r01-3.uah.goweb.net - - [11/Mar/2004:12:57:24 -0800] "GET /ops/SP/play//view/Main/WebHome?rev=1.25 HTTP/1.0" 200 9812 +cr020r01-3.uah.goweb.net - - [11/Mar/2004:12:57:45 -0800] "GET /ops/SP/play//view/Main/WebNotify?rev=r1.6 HTTP/1.0" 200 4300 +cr020r01-3.uah.goweb.net - - [11/Mar/2004:12:58:03 -0800] "GET /ops/SP/play//rdiff/TWiki/ManagingTopics?rev1=1.16&rev2=1.15 HTTP/1.0" 200 7912 +cr020r01-3.uah.goweb.net - - [11/Mar/2004:12:58:37 -0800] "GET /ops/SP/play//view/Main/WebHome?rev=r1.8 HTTP/1.0" 200 8986 +cr020r01-3.uah.goweb.net - - [11/Mar/2004:12:58:50 -0800] "GET /ops/SP/play//edit/Main/Max_idle?topicparent=Main.ConfigurationVariables HTTP/1.0" 401 12816 +cr020r01-3.uah.goweb.net - - [11/Mar/2004:12:59:07 -0800] "GET /ops/SP/play//view/Main/WebChanges HTTP/1.0" 200 40430 +cr020r01-3.uah.goweb.net - - [11/Mar/2004:12:59:33 -0800] "GET /ops/SP/play//search/TWiki/SearchResult?scope=text®ex=on&search=Appendix%20*File%20*System%5B%5EA-Za-z%5D HTTP/1.0" 200 5794 +cr020r01-3.uah.goweb.net - - [11/Mar/2004:12:59:52 -0800] "GET /ops/SP/play//oops/TWiki/AppendixFileSystem?template=oopsmore¶m1=1.12¶m2=1.12 HTTP/1.0" 200 11355 +cr020r01-3.uah.goweb.net - - [11/Mar/2004:13:00:12 -0800] "GET /ops/SP/play//view/TWiki/WebTopicViewTemplate HTTP/1.0" 200 5420 +cr020r01-3.uah.goweb.net - - [11/Mar/2004:13:00:47 -0800] "GET /ops/SP/play//rdiff/Main/WebHome HTTP/1.0" 200 69197 +cr020r01-3.uah.goweb.net - - [11/Mar/2004:13:00:57 -0800] "GET /ops/SP/play//view/TWiki/WebPreferences?rev=r1.9 HTTP/1.0" 200 7875 +cr020r01-3.uah.goweb.net - - [11/Mar/2004:13:01:21 -0800] "GET /ops/SP/play//rdiff/Main/ConfigurationVariables?rev1=1.2&rev2=1.1 HTTP/1.0" 200 59549 +cr020r01-3.uah.goweb.net - - [11/Mar/2004:13:01:37 -0800] "GET /ops/SP/play//view/Main/AndreaSterbini HTTP/1.0" 200 3891 +cr020r01-3.uah.goweb.net - - [11/Mar/2004:13:01:58 -0800] "GET /ops/SP/play//rdiff/Main/AndreaSterbini HTTP/1.0" 200 5567 +cr020r01-3.uah.goweb.net - - [11/Mar/2004:13:02:22 -0800] "GET /ops/SP/play//rdiff/TWiki/WebNotify HTTP/1.0" 200 11733 +cr020r01-3.uah.goweb.net - - [11/Mar/2004:13:02:42 -0800] "GET /ops/SP/play//rdiff/Main/WebHome?rev1=1.28&rev2=1.27 HTTP/1.0" 200 3577 +cr020r01-3.uah.goweb.net - - [11/Mar/2004:13:03:06 -0800] "GET /ops/SP/play//view/Main/WebHome?skin=print HTTP/1.0" 200 8347 +cr020r01-3.uah.goweb.net - - [11/Mar/2004:13:03:23 -0800] "GET /ops/SP/play//search/Main/SearchResult?search=%5C.*&scope=topic&order=modified&reverse=on®ex=on&nosearch=on HTTP/1.0" 200 43816 +cr020r01-3.uah.goweb.net - - [11/Mar/2004:13:03:48 -0800] "GET /ops/SP/play//view/TWiki/FormattedSearch HTTP/1.0" 200 20420 +cr020r01-3.uah.goweb.net - - [11/Mar/2004:13:04:09 -0800] "GET /ops/SP/play//oops/Main/WebHome?template=oopsmore¶m1=1.28¶m2=1.8 HTTP/1.0" 200 7410 +cr020r01-3.uah.goweb.net - - [11/Mar/2004:13:04:30 -0800] "GET /ops/SP/play//edit/TWiki/TextFormattingFAQ?t=1075982736 HTTP/1.0" 401 12816 +cr020r01-3.uah.goweb.net - - [11/Mar/2004:13:04:52 -0800] "GET /ops/SP/play//edit/Main/Allow_untrusted_routing?topicparent=Main.ConfigurationVariables HTTP/1.0" 401 12816 +cr020r01-3.uah.goweb.net - - [11/Mar/2004:13:05:13 -0800] "GET /ops/SP/play//edit/Main/Smtp_data_init_timeout?topicparent=Main.ConfigurationVariables HTTP/1.0" 401 12816 +cr020r01-3.uah.goweb.net - - [11/Mar/2004:13:05:33 -0800] "GET /ops/SP/play//view/TWiki/AppendixFileSystem?rev=1.10 HTTP/1.0" 200 34910 +cr020r01-3.uah.goweb.net - - [11/Mar/2004:13:05:54 -0800] "GET /ops/SP/play//view/Main/AndreaSterbini?rev=r1.1 HTTP/1.0" 200 3732 +cr020r01-3.uah.goweb.net - - [11/Mar/2004:13:06:17 -0800] "GET /ops/SP/play//view/Know/WebNotify HTTP/1.0" 200 4472 +cr020r01-3.uah.goweb.net - - [11/Mar/2004:13:06:39 -0800] "GET /ops/SP/play//rdiff/Main/PeterThoeny HTTP/1.0" 200 18859 +cr020r01-3.uah.goweb.net - - [11/Mar/2004:13:07:02 -0800] "GET /ops/SP/play//view/Main/WebHome?skin=print&rev=1.25 HTTP/1.0" 200 7762 +cr020r01-3.uah.goweb.net - - [11/Mar/2004:13:07:20 -0800] "GET /ops/SP/play//edit/Main/Relayhost?topicparent=Main.ConfigurationVariables HTTP/1.0" 401 12816 +cr020r01-3.uah.goweb.net - - [11/Mar/2004:13:07:40 -0800] "GET /ops/SP/play//edit/Main/Unknown_virtual_mailbox_reject_code?topicparent=Main.ConfigurationVariables HTTP/1.0" 401 12816 +cr020r01-3.uah.goweb.net - - [11/Mar/2004:13:08:03 -0800] "GET /ops/SP/play//view/TWiki/WebPreferences HTTP/1.0" 200 9109 +cr020r01-3.uah.goweb.net - - [11/Mar/2004:13:08:44 -0800] "GET /ops/SP/play//view/Main/DCC HTTP/1.0" 200 4377 +cr020r01-3.uah.goweb.net - - [11/Mar/2004:13:09:04 -0800] "GET /ops/SP/play//view/Know/WebHome HTTP/1.0" 200 7529 +cr020r01-3.uah.goweb.net - - [11/Mar/2004:13:09:21 -0800] "GET /ops/SP/play//view/Main/WebNotify HTTP/1.0" 200 4449 +cr020r01-3.uah.goweb.net - - [11/Mar/2004:13:09:24 -0800] "GET /ops/SP/play//oops/Main/WebHome?template=oopsmore¶m1=1.28¶m2=1.28 HTTP/1.0" 200 7411 +cr020r01-3.uah.goweb.net - - [11/Mar/2004:13:09:52 -0800] "GET /ops/SP/play//view/Main/PostfixCommands HTTP/1.0" 200 4004 +cr020r01-3.uah.goweb.net - - [11/Mar/2004:13:10:11 -0800] "GET /ops/SP/play//view/TWiki/WebHome HTTP/1.0" 200 15147 +cr020r01-3.uah.goweb.net - - [11/Mar/2004:13:10:27 -0800] "GET /ops/SP/play//view/Main/RBLsHowTo HTTP/1.0" 200 4646 +cr020r01-3.uah.goweb.net - - [11/Mar/2004:13:10:52 -0800] "GET /ops/SP/play//view/Main/WebTopicList HTTP/1.0" 200 7461 +cr020r01-3.uah.goweb.net - - [11/Mar/2004:13:11:09 -0800] "GET /ops/SP/play//view/Main/WebHome?rev=1.27 HTTP/1.0" 200 10313 +cr020r01-3.uah.goweb.net - - [11/Mar/2004:13:11:41 -0800] "GET /ops/SP/play//view/Main/ConfigurationVariables HTTP/1.0" 200 58169 +4.37.97.186 - - [11/Mar/2004:13:12:54 -0800] "GET /pipermail/webber/2004-January/000000.jsp HTTP/1.1" 200 2446 +12.22.207.235 - - [11/Mar/2004:13:18:15 -0800] "GET /SpamAssassin.jsp HTTP/1.1" 200 7368 +archserve.id.ucsb.edu - - [11/Mar/2004:13:22:32 -0800] "GET /razor.jsp HTTP/1.1" 200 2869 +archserve.id.ucsb.edu - - [11/Mar/2004:13:22:32 -0800] "GET /favicon.ico HTTP/1.1" 200 1078 +2-110.tnr.on.ca - - [11/Mar/2004:13:24:03 -0800] "GET /ie.htm HTTP/1.1" 200 3518 +2-110.tnr.on.ca - - [11/Mar/2004:13:24:04 -0800] "GET /images/image005.jpg HTTP/1.1" 200 21125 +2-110.tnr.on.ca - - [11/Mar/2004:13:24:04 -0800] "GET /images/image004.jpg HTTP/1.1" 200 10936 +2-110.tnr.on.ca - - [11/Mar/2004:13:24:04 -0800] "GET /images/msgops.JPG HTTP/1.1" 200 7939 +2-110.tnr.on.ca - - [11/Mar/2004:13:26:38 -0800] "GET /images/image005.jpg HTTP/1.1" 304 - +2-110.tnr.on.ca - - [11/Mar/2004:13:26:38 -0800] "GET /images/image004.jpg HTTP/1.1" 304 - +2-110.tnr.on.ca - - [11/Mar/2004:13:26:38 -0800] "GET /images/msgops.JPG HTTP/1.1" 304 - +lj1024.passgo.com - - [11/Mar/2004:13:27:05 -0800] "GET /robots.txt HTTP/1.0" 200 68 +lj1212.passgo.com - - [11/Mar/2004:13:27:05 -0800] "GET / HTTP/1.0" 200 3169 +2-110.tnr.on.ca - - [11/Mar/2004:14:14:44 -0800] "GET /ie.htm HTTP/1.1" 200 3518 +2-110.tnr.on.ca - - [11/Mar/2004:14:14:47 -0800] "GET /images/image005.jpg HTTP/1.1" 200 21125 +2-110.tnr.on.ca - - [11/Mar/2004:14:14:47 -0800] "GET /images/msgops.JPG HTTP/1.1" 200 7939 +2-110.tnr.on.ca - - [11/Mar/2004:14:14:50 -0800] "GET /images/image004.jpg HTTP/1.1" 200 10936 +favr.go.de - - [11/Mar/2004:14:22:08 -0800] "GET /robots.txt HTTP/1.0" 200 68 +favr.go.de - - [11/Mar/2004:14:22:09 -0800] "GET /ops/SP/play//view/Main/WebSearch HTTP/1.0" 200 9263 +favr.go.de - - [11/Mar/2004:14:26:26 -0800] "GET /ops/SP/play//view/Sandbox/WebHome HTTP/1.0" 200 8605 +favr.go.de - - [11/Mar/2004:14:28:53 -0800] "GET /ops/SP/play//view/Sandbox/WebChanges HTTP/1.0" 200 9622 +favr.go.de - - [11/Mar/2004:14:29:44 -0800] "GET /ops/SP/play//view/Sandbox/WebPreferences HTTP/1.0" 200 8380 +favr.go.de - - [11/Mar/2004:14:29:52 -0800] "GET /ops/SP/play//view/Main/WebStatistics HTTP/1.0" 200 8331 +favr.go.de - - [11/Mar/2004:14:30:51 -0800] "GET /ops/SP/play//view/Main/WebTopicList HTTP/1.0" 200 7461 +favr.go.de - - [11/Mar/2004:14:31:43 -0800] "GET /ops/SP/play//view/Main/WebPreferences HTTP/1.0" 200 8793 +lj1008.passgo.com - - [11/Mar/2004:14:31:48 -0800] "GET /ops/SP/play//oops/TWiki/WikiWikiClones HTTP/1.0" 200 209 +favr.go.de - - [11/Mar/2004:14:33:01 -0800] "GET /ops/SP/play//view/Main/WebNotify HTTP/1.0" 200 4449 +64-249-27-114.client.dsl.net - - [11/Mar/2004:14:53:12 -0800] "GET /SpamAssassin.jsp HTTP/1.1" 200 7368 +pd9eb1396.dip.t-dialin.net - - [11/Mar/2004:15:17:08 -0800] "GET /AmavisNew.jsp HTTP/1.1" 200 2300 +10.0.0.176 - - [11/Mar/2004:15:51:49 -0800] "GET / HTTP/1.1" 304 - +10.0.0.176 - - [11/Mar/2004:15:52:07 -0800] "GET /ops/SP/play//view/Main/WebHome HTTP/1.1" 200 10419 +10.0.0.176 - - [11/Mar/2004:15:52:07 -0800] "GET /go/bin/test/TWikiLogos/twikiRobot46x50.gif HTTP/1.1" 304 - +10.0.0.176 - - [11/Mar/2004:15:52:12 -0800] "GET /ops/SP/play//view/Main/WebHome HTTP/1.1" 200 10419 +10.0.0.176 - - [11/Mar/2004:15:52:12 -0800] "GET /go/bin/test/TWikiLogos/twikiRobot46x50.gif HTTP/1.1" 304 - +10.0.0.176 - - [11/Mar/2004:15:52:18 -0800] "GET /forplus/mailgraph2.cgi HTTP/1.1" 200 2987 +10.0.0.176 - - [11/Mar/2004:15:52:19 -0800] "GET /forplus/mailgraph.cgi/mailgraph_0.png HTTP/1.1" 200 6329 +10.0.0.176 - - [11/Mar/2004:15:52:19 -0800] "GET /forplus/mailgraph.cgi/mailgraph_1.png HTTP/1.1" 200 8771 +10.0.0.176 - - [11/Mar/2004:15:52:19 -0800] "GET /forplus/mailgraph.cgi/mailgraph_0_err.png HTTP/1.1" 200 6340 +10.0.0.176 - - [11/Mar/2004:15:52:19 -0800] "GET /forplus/mailgraph.cgi/mailgraph_1_err.png HTTP/1.1" 200 6846 +10.0.0.176 - - [11/Mar/2004:15:52:19 -0800] "GET /forplus/mailgraph.cgi/mailgraph_2.png HTTP/1.1" 200 9523 +10.0.0.176 - - [11/Mar/2004:15:52:19 -0800] "GET /forplus/mailgraph.cgi/mailgraph_2_err.png HTTP/1.1" 200 6996 +10.0.0.176 - - [11/Mar/2004:15:52:19 -0800] "GET /forplus/mailgraph.cgi/mailgraph_3.png HTTP/1.1" 200 6427 +10.0.0.176 - - [11/Mar/2004:15:52:19 -0800] "GET /forplus/mailgraph.cgi/mailgraph_3_err.png HTTP/1.1" 200 5598 +10.0.0.176 - - [11/Mar/2004:15:52:37 -0800] "GET /ststats/index.jsp HTTP/1.1" 304 - +10.0.0.176 - - [11/Mar/2004:15:52:38 -0800] "GET /ststats/stats-spam.1day.png HTTP/1.1" 200 3241 +10.0.0.176 - - [11/Mar/2004:15:52:38 -0800] "GET /ststats/stats-spam.1week.png HTTP/1.1" 200 3327 +10.0.0.176 - - [11/Mar/2004:15:52:38 -0800] "GET /ststats/stats-spam-ratio.1week.png HTTP/1.1" 200 2434 +10.0.0.176 - - [11/Mar/2004:15:52:38 -0800] "GET /ststats/stats-hashes.1week.png HTTP/1.1" 200 1676 +10.0.0.176 - - [11/Mar/2004:15:52:38 -0800] "GET /ststats/stats-spam-ratio.1month.png HTTP/1.1" 200 2029 +10.0.0.176 - - [11/Mar/2004:15:52:38 -0800] "GET /ststats/stats-hashes.1month.png HTTP/1.1" 200 1604 +10.0.0.176 - - [11/Mar/2004:15:52:38 -0800] "GET /ststats/stats-spam.1month.png HTTP/1.1" 200 2640 +10.0.0.176 - - [11/Mar/2004:15:52:38 -0800] "GET /ststats/stats-spam.1year.png HTTP/1.1" 200 2251 +10.0.0.176 - - [11/Mar/2004:15:52:38 -0800] "GET /ststats/stats-spam-ratio.1year.png HTTP/1.1" 200 1899 +10.0.0.176 - - [11/Mar/2004:15:52:38 -0800] "GET /ststats/stats-hashes.1year.png HTTP/1.1" 200 1556 +10.0.0.176 - - [11/Mar/2004:15:52:39 -0800] "GET /ststats/stats-spam-ratio.1day.png HTTP/1.1" 200 2243 +lj1105.passgo.com - - [11/Mar/2004:16:02:37 -0800] "GET /ops/SP/play//oops/TWiki/1000 HTTP/1.0" 200 209 +wc01.piwa.pow.fr - - [11/Mar/2004:16:12:59 -0800] "GET /ie.htm HTTP/1.1" 200 3518 +wc01.piwa.pow.fr - - [11/Mar/2004:16:13:02 -0800] "GET /images/image005.jpg HTTP/1.1" 200 21125 +wc01.piwa.pow.fr - - [11/Mar/2004:16:13:02 -0800] "GET /images/msgops.JPG HTTP/1.1" 200 7939 +wc03.mtnk.rnc.net.cable.rogers.com - - [11/Mar/2004:16:13:03 -0800] "GET /images/image004.jpg HTTP/1.1" 200 10936 +206-15-133-154.dialup.ziplink.net - - [11/Mar/2004:16:33:23 -0800] "HEAD /ops/SP/play//view/Main/SpamAssassinDeleting HTTP/1.1" 200 0 +lj1024.passgo.com - - [11/Mar/2004:18:11:39 -0800] "GET /robots.txt HTTP/1.0" 200 68 +lj1008.passgo.com - - [11/Mar/2004:18:11:40 -0800] "GET /ops/SP/play//oops/Main/Smtpd_recipient_limit HTTP/1.0" 200 209 +ipcorp-c8b07af1.terraempresas.com.br - - [11/Mar/2004:18:31:35 -0800] "GET /SpamAssassin.jsp HTTP/1.1" 200 7368 +66-194-6-79.gen.twtelecom.net - - [11/Mar/2004:18:57:52 -0800] "GET / HTTP/1.1" 200 3169 +lj1223.passgo.com - - [11/Mar/2004:20:12:24 -0800] "GET /ops/SP/play//view/Main/MikeMannix HTTP/1.0" 200 3674 +216-160-111-121.tukw.qwest.net - - [11/Mar/2004:20:49:32 -0800] "GET /ststats/ HTTP/1.1" 200 2955 +216-160-111-121.tukw.qwest.net - - [11/Mar/2004:20:49:37 -0800] "GET /ststats/stats-spam.1day.png HTTP/1.1" 200 3091 +216-160-111-121.tukw.qwest.net - - [11/Mar/2004:20:49:37 -0800] "GET /ststats/stats-spam-ratio.1day.png HTTP/1.1" 200 2230 +216-160-111-121.tukw.qwest.net - - [11/Mar/2004:20:49:37 -0800] "GET /ststats/stats-spam-ratio.1week.png HTTP/1.1" 200 2388 +216-160-111-121.tukw.qwest.net - - [11/Mar/2004:20:49:37 -0800] "GET /ststats/stats-spam.1week.png HTTP/1.1" 200 3440 +216-160-111-121.tukw.qwest.net - - [11/Mar/2004:20:49:38 -0800] "GET /ststats/stats-hashes.1week.png HTTP/1.1" 200 1659 +216-160-111-121.tukw.qwest.net - - [11/Mar/2004:20:49:38 -0800] "GET /ststats/stats-spam.1month.png HTTP/1.1" 200 2662 +216-160-111-121.tukw.qwest.net - - [11/Mar/2004:20:49:38 -0800] "GET /ststats/stats-spam-ratio.1month.png HTTP/1.1" 200 2064 +216-160-111-121.tukw.qwest.net - - [11/Mar/2004:20:49:38 -0800] "GET /ststats/stats-hashes.1month.png HTTP/1.1" 200 1624 +216-160-111-121.tukw.qwest.net - - [11/Mar/2004:20:49:38 -0800] "GET /ststats/stats-spam.1year.png HTTP/1.1" 200 2243 +216-160-111-121.tukw.qwest.net - - [11/Mar/2004:20:49:38 -0800] "GET /ststats/stats-spam-ratio.1year.png HTTP/1.1" 200 1879 +216-160-111-121.tukw.qwest.net - - [11/Mar/2004:20:49:38 -0800] "GET /ststats/stats-hashes.1year.png HTTP/1.1" 200 1575 +lj1073.passgo.com - - [11/Mar/2004:20:59:05 -0800] "GET /ops/SP/play//oops/TWiki/TWikiPlannedFeatures HTTP/1.0" 200 209 +mmscrm07-2.uah.goweb.net - - [11/Mar/2004:23:56:31 -0800] "GET /robots.txt HTTP/1.0" 200 68 +66-194-6-71.gen.twtelecom.net - - [12/Mar/2004:01:30:44 -0800] "GET / HTTP/1.1" 200 3169 +lj1024.passgo.com - - [12/Mar/2004:02:27:29 -0800] "GET /robots.txt HTTP/1.0" 200 68 +lj1123.passgo.com - - [12/Mar/2004:02:27:32 -0800] "GET /ops/SP/play//view/Sandbox/WebIndex HTTP/1.0" 200 8667 +195.11.231.210 - - [12/Mar/2004:03:32:56 -0800] "GET /mailman/listinfo/webber HTTP/1.0" 200 6032 +80.58.33.42.proxycache.rima-tde.net - - [12/Mar/2004:04:57:20 -0800] "GET /ops/SP/play//view/Main/WebHome HTTP/1.0" 200 10392 +80.58.33.42.proxycache.rima-tde.net - - [12/Mar/2004:04:57:21 -0800] "GET /go/bin/test/TWikiLogos/twikiRobot46x50.gif HTTP/1.1" 200 2877 +80.58.33.42.proxycache.rima-tde.net - - [12/Mar/2004:04:57:56 -0800] "GET /ops/SP/play//view/Main/LinksOfUse HTTP/1.1" 200 4534 +200.100.10.5 - - [12/Mar/2004:04:59:21 -0800] "GET /ops/SP/play//view/Main/SpamAssassinUsingRazorAndDCC HTTP/1.1" 200 7435 +200.100.10.5 - - [12/Mar/2004:04:59:21 -0800] "GET /go/bin/test/TWikiLogos/twikiRobot46x50.gif HTTP/1.1" 200 2877 +lj1115.passgo.com - - [12/Mar/2004:05:03:19 -0800] "GET /ops/SP/play//view/Main/TWikiAdminGroup HTTP/1.0" 200 4156 +lj1008.passgo.com - - [12/Mar/2004:05:19:31 -0800] "GET /ops/SP/play//oops/TWiki/Mana HTTP/1.0" 200 209 +71.134.70.5 - - [12/Mar/2004:05:25:20 -0800] "GET /mailman/listinfo/cncce HTTP/1.1" 200 6208 +71.134.70.5 - - [12/Mar/2004:05:25:24 -0800] "GET /icons/mailman.jpg HTTP/1.1" 200 2022 +71.134.70.5 - - [12/Mar/2004:05:25:24 -0800] "GET /icons/PythonPowered.png HTTP/1.1" 200 945 +71.134.70.5 - - [12/Mar/2004:05:25:25 -0800] "GET /icons/gnu-head-tiny.jpg HTTP/1.1" 200 3049 +200.100.10.5 - - [12/Mar/2004:05:44:35 -0800] "GET /ops/SP/play//view/Main/SpamAssassinUsingRazorAndDCC HTTP/1.1" 200 7435 +200.100.10.5 - - [12/Mar/2004:05:44:35 -0800] "GET /go/bin/test/TWikiLogos/twikiRobot46x50.gif HTTP/1.1" 200 2877 +200.100.10.5 - - [12/Mar/2004:05:44:50 -0800] "GET /ops/SP/play//view/Main/DCC HTTP/1.1" 200 4396 +200.100.10.5 - - [12/Mar/2004:05:44:51 -0800] "GET /go/bin/test/TWikiLogos/twikiRobot46x50.gif HTTP/1.1" 304 - +200.100.10.5 - - [12/Mar/2004:05:51:36 -0800] "GET /favicon.ico HTTP/1.1" 200 1078 +vlp181.vlp.fi - - [12/Mar/2004:08:33:32 -0800] "GET /razor.jsp HTTP/1.1" 200 2869 +lj1024.passgo.com - - [12/Mar/2004:09:12:01 -0800] "GET /robots.txt HTTP/1.0" 200 68 +lj1223.passgo.com - - [12/Mar/2004:09:12:02 -0800] "GET /ops/SP/play//oops/Main/Mi HTTP/1.0" 200 209 +10.0.0.176 - - [12/Mar/2004:11:01:26 -0800] "GET / HTTP/1.1" 304 - +10.0.0.176 - - [12/Mar/2004:11:01:28 -0800] "GET /forplus/mailgraph2.cgi HTTP/1.1" 200 2987 +10.0.0.176 - - [12/Mar/2004:11:01:29 -0800] "GET /forplus/mailgraph.cgi/mailgraph_0.png HTTP/1.1" 200 6405 +10.0.0.176 - - [12/Mar/2004:11:01:29 -0800] "GET /forplus/mailgraph.cgi/mailgraph_0_err.png HTTP/1.1" 200 6413 +10.0.0.176 - - [12/Mar/2004:11:01:29 -0800] "GET /forplus/mailgraph.cgi/mailgraph_1_err.png HTTP/1.1" 200 6952 +10.0.0.176 - - [12/Mar/2004:11:01:29 -0800] "GET /forplus/mailgraph.cgi/mailgraph_1.png HTTP/1.1" 200 8715 +10.0.0.176 - - [12/Mar/2004:11:01:29 -0800] "GET /forplus/mailgraph.cgi/mailgraph_2_err.png HTTP/1.1" 200 7001 +10.0.0.176 - - [12/Mar/2004:11:01:29 -0800] "GET /forplus/mailgraph.cgi/mailgraph_2.png HTTP/1.1" 200 9514 +10.0.0.176 - - [12/Mar/2004:11:01:29 -0800] "GET /forplus/mailgraph.cgi/mailgraph_3.png HTTP/1.1" 200 6644 +10.0.0.176 - - [12/Mar/2004:11:01:29 -0800] "GET /forplus/mailgraph.cgi/mailgraph_3_err.png HTTP/1.1" 200 5554 +fassys.org - - [12/Mar/2004:11:16:36 -0800] "GET /ststats/ HTTP/1.0" 200 2955 +fassys.org - - [12/Mar/2004:11:16:55 -0800] "GET /ststats/stats-spam.1day.png HTTP/1.0" 200 2925 +fassys.org - - [12/Mar/2004:11:16:55 -0800] "GET /ststats/stats-spam-ratio.1day.png HTTP/1.0" 200 2347 +fassys.org - - [12/Mar/2004:11:16:55 -0800] "GET /ststats/stats-spam.1week.png HTTP/1.0" 200 3431 +fassys.org - - [12/Mar/2004:11:16:55 -0800] "GET /ststats/stats-spam-ratio.1week.png HTTP/1.0" 200 2380 +fassys.org - - [12/Mar/2004:11:16:55 -0800] "GET /ststats/stats-hashes.1week.png HTTP/1.0" 200 1658 +fassys.org - - [12/Mar/2004:11:16:55 -0800] "GET /ststats/stats-spam.1month.png HTTP/1.0" 200 2685 +fassys.org - - [12/Mar/2004:11:16:56 -0800] "GET /ststats/stats-spam-ratio.1month.png HTTP/1.0" 200 2082 +fassys.org - - [12/Mar/2004:11:16:56 -0800] "GET /ststats/stats-hashes.1month.png HTTP/1.0" 200 1637 +fassys.org - - [12/Mar/2004:11:16:56 -0800] "GET /ststats/stats-spam.1year.png HTTP/1.0" 200 2211 +fassys.org - - [12/Mar/2004:11:16:56 -0800] "GET /ststats/stats-spam-ratio.1year.png HTTP/1.0" 200 1853 +fassys.org - - [12/Mar/2004:11:16:56 -0800] "GET /ststats/stats-hashes.1year.png HTTP/1.0" 200 1572 +67.131.107.5 - - [12/Mar/2004:11:39:14 -0800] "GET / HTTP/1.1" 200 3169 +67.131.107.5 - - [12/Mar/2004:11:39:25 -0800] "GET /ops/SP/play//view/Main/WebHome HTTP/1.1" 200 10419 +67.131.107.5 - - [12/Mar/2004:11:39:31 -0800] "GET /go/bin/test/TWikiLogos/twikiRobot46x50.gif HTTP/1.1" 200 2877 +10.0.0.176 - - [12/Mar/2004:12:23:11 -0800] "GET / HTTP/1.1" 304 - +10.0.0.176 - - [12/Mar/2004:12:23:17 -0800] "GET /forplus/mailgraph2.cgi HTTP/1.1" 200 2987 +10.0.0.176 - - [12/Mar/2004:12:23:18 -0800] "GET /forplus/mailgraph.cgi/mailgraph_0_err.png HTTP/1.1" 200 6324 +10.0.0.176 - - [12/Mar/2004:12:23:18 -0800] "GET /forplus/mailgraph.cgi/mailgraph_1.png HTTP/1.1" 200 8964 +10.0.0.176 - - [12/Mar/2004:12:23:18 -0800] "GET /forplus/mailgraph.cgi/mailgraph_0.png HTTP/1.1" 200 6225 +10.0.0.176 - - [12/Mar/2004:12:23:18 -0800] "GET /forplus/mailgraph.cgi/mailgraph_2_err.png HTTP/1.1" 200 7001 +10.0.0.176 - - [12/Mar/2004:12:23:18 -0800] "GET /forplus/mailgraph.cgi/mailgraph_2.png HTTP/1.1" 200 9514 +10.0.0.176 - - [12/Mar/2004:12:23:18 -0800] "GET /forplus/mailgraph.cgi/mailgraph_1_err.png HTTP/1.1" 200 6949 +10.0.0.176 - - [12/Mar/2004:12:23:18 -0800] "GET /forplus/mailgraph.cgi/mailgraph_3.png HTTP/1.1" 200 6644 +10.0.0.176 - - [12/Mar/2004:12:23:18 -0800] "GET /forplus/mailgraph.cgi/mailgraph_3_err.png HTTP/1.1" 200 5554 +10.0.0.176 - - [12/Mar/2004:12:23:40 -0800] "GET /ststats/index.jsp HTTP/1.1" 304 - +10.0.0.176 - - [12/Mar/2004:12:23:41 -0800] "GET /ststats/stats-spam.1day.png HTTP/1.1" 200 2964 +10.0.0.176 - - [12/Mar/2004:12:23:41 -0800] "GET /ststats/stats-spam-ratio.1day.png HTTP/1.1" 200 2341 +10.0.0.176 - - [12/Mar/2004:12:23:41 -0800] "GET /ststats/stats-spam-ratio.1week.png HTTP/1.1" 200 2346 +10.0.0.176 - - [12/Mar/2004:12:23:41 -0800] "GET /ststats/stats-spam.1week.png HTTP/1.1" 200 3438 +10.0.0.176 - - [12/Mar/2004:12:23:41 -0800] "GET /ststats/stats-hashes.1week.png HTTP/1.1" 200 1670 +10.0.0.176 - - [12/Mar/2004:12:23:41 -0800] "GET /ststats/stats-spam.1month.png HTTP/1.1" 200 2651 +10.0.0.176 - - [12/Mar/2004:12:23:41 -0800] "GET /ststats/stats-spam-ratio.1month.png HTTP/1.1" 200 2023 +10.0.0.176 - - [12/Mar/2004:12:23:41 -0800] "GET /ststats/stats-hashes.1month.png HTTP/1.1" 200 1636 +10.0.0.176 - - [12/Mar/2004:12:23:41 -0800] "GET /ststats/stats-spam.1year.png HTTP/1.1" 200 2262 +10.0.0.176 - - [12/Mar/2004:12:23:41 -0800] "GET /ststats/stats-spam-ratio.1year.png HTTP/1.1" 200 1906 +10.0.0.176 - - [12/Mar/2004:12:23:41 -0800] "GET /ststats/stats-hashes.1year.png HTTP/1.1" 200 1582 +216.139.185.45 - - [12/Mar/2004:13:04:01 -0800] "GET /mailman/listinfo/webber HTTP/1.1" 200 6051 +pd95f99f2.dip.t-dialin.net - - [12/Mar/2004:13:18:57 -0800] "GET /razor.jsp HTTP/1.1" 200 2869 +d97082.upc-d.chello.nl - - [12/Mar/2004:13:25:45 -0800] "GET /SpamAssassin.jsp HTTP/1.1" 200 7368 From 7ef66d7e838fd4389b43beb93856cb5eebacb4e8 Mon Sep 17 00:00:00 2001 From: Ahmed Tawila Date: Sat, 23 Sep 2017 15:26:36 +0200 Subject: [PATCH 052/236] refactor rxjava-jdbc --- .../com/baeldung/rxjava/jdbc/Connector.java | 7 +++- .../rxjava/jdbc/AutomapClassTest.java | 14 ++------ .../rxjava/jdbc/AutomapInterfaceTest.java | 13 ++----- .../rxjava/jdbc/BasicQueryTypesTest.java | 35 +++++-------------- .../baeldung/rxjava/jdbc/InsertBlobTest.java | 13 ++----- .../baeldung/rxjava/jdbc/InsertClobTest.java | 10 ++---- .../baeldung/rxjava/jdbc/ReturnKeysTest.java | 16 +++++---- .../baeldung/rxjava/jdbc/TransactionTest.java | 16 +++++---- 8 files changed, 47 insertions(+), 77 deletions(-) diff --git a/rxjava/src/main/java/com/baeldung/rxjava/jdbc/Connector.java b/rxjava/src/main/java/com/baeldung/rxjava/jdbc/Connector.java index ca241d74c4..290cc9cb3d 100644 --- a/rxjava/src/main/java/com/baeldung/rxjava/jdbc/Connector.java +++ b/rxjava/src/main/java/com/baeldung/rxjava/jdbc/Connector.java @@ -1,8 +1,13 @@ package com.baeldung.rxjava.jdbc; +import com.github.davidmoten.rx.jdbc.ConnectionProvider; +import com.github.davidmoten.rx.jdbc.ConnectionProviderFromUrl; + public class Connector { - + public static final String DB_CONNECTION = "jdbc:h2:mem:test;DB_CLOSE_DELAY=-1"; public static final String DB_USER = ""; public static final String DB_PASSWORD = ""; + + public static final ConnectionProvider connectionProvider = new ConnectionProviderFromUrl(DB_CONNECTION, DB_USER, DB_PASSWORD); } diff --git a/rxjava/src/test/java/com/baeldung/rxjava/jdbc/AutomapClassTest.java b/rxjava/src/test/java/com/baeldung/rxjava/jdbc/AutomapClassTest.java index e8bca98701..50d4551494 100644 --- a/rxjava/src/test/java/com/baeldung/rxjava/jdbc/AutomapClassTest.java +++ b/rxjava/src/test/java/com/baeldung/rxjava/jdbc/AutomapClassTest.java @@ -9,28 +9,20 @@ import org.junit.Before; import org.junit.Test; import com.github.davidmoten.rx.jdbc.ConnectionProvider; -import com.github.davidmoten.rx.jdbc.ConnectionProviderFromUrl; import com.github.davidmoten.rx.jdbc.Database; import rx.Observable; public class AutomapClassTest { - private String DB_CONNECTION = Connector.DB_CONNECTION; - private String DB_USER = Connector.DB_USER; - private String DB_PASSWORD = Connector.DB_PASSWORD; - - ConnectionProvider cp = null; - Database db = null; + ConnectionProvider connectionProvider = Connector.connectionProvider; + Database db = Database.from(connectionProvider); Observable create = null; Observable insert1, insert2 = null; @Before public void setup() { - cp = new ConnectionProviderFromUrl(DB_CONNECTION, DB_USER, DB_PASSWORD); - db = Database.from(cp); - create = db.update("CREATE TABLE IF NOT EXISTS MANAGER(id int primary key, name varchar(255))") .count(); insert1 = db.update("INSERT INTO MANAGER(id, name) VALUES(1, 'Alan')") @@ -66,6 +58,6 @@ public class AutomapClassTest { public void close() { db.update("DROP TABLE MANAGER") .dependsOn(create); - cp.close(); + connectionProvider.close(); } } diff --git a/rxjava/src/test/java/com/baeldung/rxjava/jdbc/AutomapInterfaceTest.java b/rxjava/src/test/java/com/baeldung/rxjava/jdbc/AutomapInterfaceTest.java index f636dda155..fc85213b80 100644 --- a/rxjava/src/test/java/com/baeldung/rxjava/jdbc/AutomapInterfaceTest.java +++ b/rxjava/src/test/java/com/baeldung/rxjava/jdbc/AutomapInterfaceTest.java @@ -16,21 +16,14 @@ import rx.Observable; public class AutomapInterfaceTest { - private String DB_CONNECTION = Connector.DB_CONNECTION; - private String DB_USER = Connector.DB_USER; - private String DB_PASSWORD = Connector.DB_PASSWORD; - - ConnectionProvider cp = null; - Database db = null; + ConnectionProvider connectionProvider = Connector.connectionProvider; + Database db = Database.from(connectionProvider); Observable create = null; Observable insert1, insert2 = null; @Before public void setup() { - cp = new ConnectionProviderFromUrl(DB_CONNECTION, DB_USER, DB_PASSWORD); - db = Database.from(cp); - create = db.update("CREATE TABLE IF NOT EXISTS EMPLOYEE(id int primary key, name varchar(255))") .count(); insert1 = db.update("INSERT INTO EMPLOYEE(id, name) VALUES(1, 'Alan')") @@ -66,7 +59,7 @@ public class AutomapInterfaceTest { public void close() { db.update("DROP TABLE EMPLOYEE") .dependsOn(create); - cp.close(); + connectionProvider.close(); } } diff --git a/rxjava/src/test/java/com/baeldung/rxjava/jdbc/BasicQueryTypesTest.java b/rxjava/src/test/java/com/baeldung/rxjava/jdbc/BasicQueryTypesTest.java index 6118e6f127..17d047d42f 100644 --- a/rxjava/src/test/java/com/baeldung/rxjava/jdbc/BasicQueryTypesTest.java +++ b/rxjava/src/test/java/com/baeldung/rxjava/jdbc/BasicQueryTypesTest.java @@ -17,20 +17,10 @@ import rx.Observable; public class BasicQueryTypesTest { - private String DB_CONNECTION = Connector.DB_CONNECTION; - private String DB_USER = Connector.DB_USER; - private String DB_PASSWORD = Connector.DB_PASSWORD; + ConnectionProvider connectionProvider = Connector.connectionProvider; + Database db = Database.from(connectionProvider); - ConnectionProvider cp = null; - Database db = null; - - Observable create, insert1, insert2, insert3, insert4, insert5, update, delete = null; - - @Before - public void setup() { - cp = new ConnectionProviderFromUrl(DB_CONNECTION, DB_USER, DB_PASSWORD); - db = Database.from(cp); - } + Observable create, insert1, insert2, insert3, update, delete = null; @Test public void whenCreateTableAndInsertRecords_thenCorrect() { @@ -48,36 +38,29 @@ public class BasicQueryTypesTest { insert3 = db.update("INSERT INTO EMPLOYEE(id, name) VALUES(3, 'Mike')") .dependsOn(create) .count(); - insert4 = db.update("INSERT INTO EMPLOYEE(id, name) VALUES(4, 'Jennifer')") + delete = db.update("DELETE FROM EMPLOYEE WHERE id = 2") .dependsOn(create) .count(); - insert5 = db.update("INSERT INTO EMPLOYEE(id, name) VALUES(5, 'George')") - .dependsOn(create) - .count(); - delete = db.update("DELETE FROM EMPLOYEE WHERE id = 5") - .dependsOn(create) - .count(); - List names = db.select("select name from EMPLOYEE where id > ?") - .parameter(2) + List names = db.select("select name from EMPLOYEE where id < ?") + .parameter(3) .dependsOn(create) .dependsOn(insert1) .dependsOn(insert2) .dependsOn(insert3) - .dependsOn(insert4) - .dependsOn(insert5) .dependsOn(update) .dependsOn(delete) .getAs(String.class) .toList() .toBlocking() .single(); - assertEquals(Arrays.asList("Mike", "Jennifer"), names); + + assertEquals(Arrays.asList("Alan"), names); } @After public void close() { db.update("DROP TABLE EMPLOYEE") .dependsOn(create); - cp.close(); + connectionProvider.close(); } } diff --git a/rxjava/src/test/java/com/baeldung/rxjava/jdbc/InsertBlobTest.java b/rxjava/src/test/java/com/baeldung/rxjava/jdbc/InsertBlobTest.java index ced394eccb..d166bdac10 100644 --- a/rxjava/src/test/java/com/baeldung/rxjava/jdbc/InsertBlobTest.java +++ b/rxjava/src/test/java/com/baeldung/rxjava/jdbc/InsertBlobTest.java @@ -5,28 +5,21 @@ import static org.junit.Assert.assertEquals; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; -import java.io.StringWriter; import java.nio.charset.StandardCharsets; -import org.apache.commons.io.IOUtils; import org.junit.After; import org.junit.Before; import org.junit.Test; import com.github.davidmoten.rx.jdbc.ConnectionProvider; -import com.github.davidmoten.rx.jdbc.ConnectionProviderFromUrl; import com.github.davidmoten.rx.jdbc.Database; import rx.Observable; public class InsertBlobTest { - private String DB_CONNECTION = Connector.DB_CONNECTION; - private String DB_USER = Connector.DB_USER; - private String DB_PASSWORD = Connector.DB_PASSWORD; - - ConnectionProvider cp = new ConnectionProviderFromUrl(DB_CONNECTION, DB_USER, DB_PASSWORD); - Database db = Database.from(cp); + ConnectionProvider connectionProvider = Connector.connectionProvider; + Database db = Database.from(connectionProvider); String expectedDocument = null; String actualDocument = null; @@ -67,6 +60,6 @@ public class InsertBlobTest { public void close() { db.update("DROP TABLE SERVERLOG") .dependsOn(create); - cp.close(); + connectionProvider.close(); } } diff --git a/rxjava/src/test/java/com/baeldung/rxjava/jdbc/InsertClobTest.java b/rxjava/src/test/java/com/baeldung/rxjava/jdbc/InsertClobTest.java index 90f798aa43..d49d7edf1a 100644 --- a/rxjava/src/test/java/com/baeldung/rxjava/jdbc/InsertClobTest.java +++ b/rxjava/src/test/java/com/baeldung/rxjava/jdbc/InsertClobTest.java @@ -18,12 +18,8 @@ import rx.Observable; public class InsertClobTest { - private String DB_CONNECTION = Connector.DB_CONNECTION; - private String DB_USER = Connector.DB_USER; - private String DB_PASSWORD = Connector.DB_PASSWORD; - - ConnectionProvider cp = new ConnectionProviderFromUrl(DB_CONNECTION, DB_USER, DB_PASSWORD); - Database db = Database.from(cp); + ConnectionProvider connectionProvider = Connector.connectionProvider; + Database db = Database.from(connectionProvider); String expectedDocument = null; String actualDocument = null; @@ -63,6 +59,6 @@ public class InsertClobTest { public void close() { db.update("DROP TABLE SERVERLOG") .dependsOn(create); - cp.close(); + connectionProvider.close(); } } \ No newline at end of file diff --git a/rxjava/src/test/java/com/baeldung/rxjava/jdbc/ReturnKeysTest.java b/rxjava/src/test/java/com/baeldung/rxjava/jdbc/ReturnKeysTest.java index d67fe1d4c1..9a2765f03d 100644 --- a/rxjava/src/test/java/com/baeldung/rxjava/jdbc/ReturnKeysTest.java +++ b/rxjava/src/test/java/com/baeldung/rxjava/jdbc/ReturnKeysTest.java @@ -2,6 +2,7 @@ package com.baeldung.rxjava.jdbc; import static org.assertj.core.api.Assertions.assertThat; +import org.junit.After; import org.junit.Before; import org.junit.Test; @@ -13,15 +14,11 @@ import rx.Observable; public class ReturnKeysTest { - private String DB_CONNECTION = Connector.DB_CONNECTION; - private String DB_USER = Connector.DB_USER; - private String DB_PASSWORD = Connector.DB_PASSWORD; - Observable begin, commit = null; Observable createStatement, insertStatement, updateStatement = null; - ConnectionProvider cp = new ConnectionProviderFromUrl(DB_CONNECTION, DB_USER, DB_PASSWORD); - Database db = Database.from(cp); + ConnectionProvider connectionProvider = Connector.connectionProvider; + Database db = Database.from(connectionProvider); @Before public void setup() { @@ -42,4 +39,11 @@ public class ReturnKeysTest { .single(); assertThat(key).isEqualTo(1); } + + @After + public void close() { + db.update("DROP TABLE EMPLOYEE") + .dependsOn(createStatement); + connectionProvider.close(); + } } diff --git a/rxjava/src/test/java/com/baeldung/rxjava/jdbc/TransactionTest.java b/rxjava/src/test/java/com/baeldung/rxjava/jdbc/TransactionTest.java index a0076861da..584add4a6e 100644 --- a/rxjava/src/test/java/com/baeldung/rxjava/jdbc/TransactionTest.java +++ b/rxjava/src/test/java/com/baeldung/rxjava/jdbc/TransactionTest.java @@ -2,6 +2,7 @@ package com.baeldung.rxjava.jdbc; import static org.junit.Assert.assertEquals; +import org.junit.After; import org.junit.Test; import com.github.davidmoten.rx.jdbc.ConnectionProvider; @@ -12,15 +13,11 @@ import rx.Observable; public class TransactionTest { - private String DB_CONNECTION = Connector.DB_CONNECTION; - private String DB_USER = Connector.DB_USER; - private String DB_PASSWORD = Connector.DB_PASSWORD; - Observable begin, commit = null; Observable createStatement, insertStatement, updateStatement = null; - ConnectionProvider cp = new ConnectionProviderFromUrl(DB_CONNECTION, DB_USER, DB_PASSWORD); - Database db = Database.from(cp); + ConnectionProvider connectionProvider = Connector.connectionProvider; + Database db = Database.from(connectionProvider); @Test public void whenCommitTransaction_thenRecordUpdated() { @@ -43,4 +40,11 @@ public class TransactionTest { assertEquals("Tom", name); } + + @After + public void close() { + db.update("DROP TABLE EMPLOYEE") + .dependsOn(createStatement); + connectionProvider.close(); + } } From b3edd4bbbaceb82a18093d5f74b473f81b5d4b0a Mon Sep 17 00:00:00 2001 From: Ahmed Tawila Date: Sat, 23 Sep 2017 16:09:01 +0200 Subject: [PATCH 053/236] Refactor rxjava-jdbc --- .../com/baeldung/rxjava/jdbc/Connector.java | 10 ++-- .../com/baeldung/rxjava/jdbc/Manager.java | 1 - .../java/com/baeldung/rxjava/jdbc/Utils.java | 4 +- .../rxjava/jdbc/AutomapClassTest.java | 34 ++++++------- .../rxjava/jdbc/AutomapInterfaceTest.java | 33 +++++++------ .../rxjava/jdbc/BasicQueryTypesTest.java | 48 +++++++++---------- .../baeldung/rxjava/jdbc/InsertBlobTest.java | 24 +++++----- .../baeldung/rxjava/jdbc/InsertClobTest.java | 25 +++++----- .../baeldung/rxjava/jdbc/ReturnKeysTest.java | 19 ++++---- .../baeldung/rxjava/jdbc/TransactionTest.java | 23 +++++---- 10 files changed, 107 insertions(+), 114 deletions(-) diff --git a/rxjava/src/main/java/com/baeldung/rxjava/jdbc/Connector.java b/rxjava/src/main/java/com/baeldung/rxjava/jdbc/Connector.java index 290cc9cb3d..b7416e471a 100644 --- a/rxjava/src/main/java/com/baeldung/rxjava/jdbc/Connector.java +++ b/rxjava/src/main/java/com/baeldung/rxjava/jdbc/Connector.java @@ -3,11 +3,11 @@ package com.baeldung.rxjava.jdbc; import com.github.davidmoten.rx.jdbc.ConnectionProvider; import com.github.davidmoten.rx.jdbc.ConnectionProviderFromUrl; -public class Connector { +class Connector { - public static final String DB_CONNECTION = "jdbc:h2:mem:test;DB_CLOSE_DELAY=-1"; - public static final String DB_USER = ""; - public static final String DB_PASSWORD = ""; + static final String DB_CONNECTION = "jdbc:h2:mem:test;DB_CLOSE_DELAY=-1"; + static final String DB_USER = ""; + static final String DB_PASSWORD = ""; - public static final ConnectionProvider connectionProvider = new ConnectionProviderFromUrl(DB_CONNECTION, DB_USER, DB_PASSWORD); + static final ConnectionProvider connectionProvider = new ConnectionProviderFromUrl(DB_CONNECTION, DB_USER, DB_PASSWORD); } diff --git a/rxjava/src/main/java/com/baeldung/rxjava/jdbc/Manager.java b/rxjava/src/main/java/com/baeldung/rxjava/jdbc/Manager.java index d2b87fc897..56faa4cae7 100644 --- a/rxjava/src/main/java/com/baeldung/rxjava/jdbc/Manager.java +++ b/rxjava/src/main/java/com/baeldung/rxjava/jdbc/Manager.java @@ -25,5 +25,4 @@ public class Manager { public void setName(String name) { this.name = name; } - } diff --git a/rxjava/src/main/java/com/baeldung/rxjava/jdbc/Utils.java b/rxjava/src/main/java/com/baeldung/rxjava/jdbc/Utils.java index f1dbd2676b..401962d1a9 100644 --- a/rxjava/src/main/java/com/baeldung/rxjava/jdbc/Utils.java +++ b/rxjava/src/main/java/com/baeldung/rxjava/jdbc/Utils.java @@ -6,9 +6,9 @@ import java.io.StringWriter; import org.apache.commons.io.IOUtils; -public class Utils { +class Utils { - public static String getStringFromInputStream(InputStream input) throws IOException { + static String getStringFromInputStream(InputStream input) throws IOException { StringWriter writer = new StringWriter(); IOUtils.copy(input, writer, "UTF-8"); return writer.toString(); diff --git a/rxjava/src/test/java/com/baeldung/rxjava/jdbc/AutomapClassTest.java b/rxjava/src/test/java/com/baeldung/rxjava/jdbc/AutomapClassTest.java index 50d4551494..f44d4ac6b8 100644 --- a/rxjava/src/test/java/com/baeldung/rxjava/jdbc/AutomapClassTest.java +++ b/rxjava/src/test/java/com/baeldung/rxjava/jdbc/AutomapClassTest.java @@ -24,40 +24,40 @@ public class AutomapClassTest { @Before public void setup() { create = db.update("CREATE TABLE IF NOT EXISTS MANAGER(id int primary key, name varchar(255))") - .count(); + .count(); insert1 = db.update("INSERT INTO MANAGER(id, name) VALUES(1, 'Alan')") - .dependsOn(create) - .count(); + .dependsOn(create) + .count(); insert2 = db.update("INSERT INTO MANAGER(id, name) VALUES(2, 'Sarah')") - .dependsOn(create) - .count(); + .dependsOn(create) + .count(); } @Test public void whenSelectManagersAndAutomap_thenCorrect() { List managers = db.select("select id, name from MANAGER") - .dependsOn(create) - .dependsOn(insert1) - .dependsOn(insert2) - .autoMap(Manager.class) - .toList() - .toBlocking() - .single(); + .dependsOn(create) + .dependsOn(insert1) + .dependsOn(insert2) + .autoMap(Manager.class) + .toList() + .toBlocking() + .single(); assertThat(managers.get(0) - .getId()).isEqualTo(1); + .getId()).isEqualTo(1); assertThat(managers.get(0) - .getName()).isEqualTo("Alan"); + .getName()).isEqualTo("Alan"); assertThat(managers.get(1) - .getId()).isEqualTo(2); + .getId()).isEqualTo(2); assertThat(managers.get(1) - .getName()).isEqualTo("Sarah"); + .getName()).isEqualTo("Sarah"); } @After public void close() { db.update("DROP TABLE MANAGER") - .dependsOn(create); + .dependsOn(create); connectionProvider.close(); } } diff --git a/rxjava/src/test/java/com/baeldung/rxjava/jdbc/AutomapInterfaceTest.java b/rxjava/src/test/java/com/baeldung/rxjava/jdbc/AutomapInterfaceTest.java index fc85213b80..79bae281eb 100644 --- a/rxjava/src/test/java/com/baeldung/rxjava/jdbc/AutomapInterfaceTest.java +++ b/rxjava/src/test/java/com/baeldung/rxjava/jdbc/AutomapInterfaceTest.java @@ -9,7 +9,6 @@ import org.junit.Before; import org.junit.Test; import com.github.davidmoten.rx.jdbc.ConnectionProvider; -import com.github.davidmoten.rx.jdbc.ConnectionProviderFromUrl; import com.github.davidmoten.rx.jdbc.Database; import rx.Observable; @@ -25,34 +24,34 @@ public class AutomapInterfaceTest { @Before public void setup() { create = db.update("CREATE TABLE IF NOT EXISTS EMPLOYEE(id int primary key, name varchar(255))") - .count(); + .count(); insert1 = db.update("INSERT INTO EMPLOYEE(id, name) VALUES(1, 'Alan')") - .dependsOn(create) - .count(); + .dependsOn(create) + .count(); insert2 = db.update("INSERT INTO EMPLOYEE(id, name) VALUES(2, 'Sarah')") - .dependsOn(create) - .count(); + .dependsOn(create) + .count(); } @Test public void whenSelectFromTableAndAutomap_thenCorrect() { List employees = db.select("select id, name from EMPLOYEE") - .dependsOn(create) - .dependsOn(insert1) - .dependsOn(insert2) - .autoMap(Employee.class) - .toList() - .toBlocking() - .single(); + .dependsOn(create) + .dependsOn(insert1) + .dependsOn(insert2) + .autoMap(Employee.class) + .toList() + .toBlocking() + .single(); assertThat(employees.get(0) - .id()).isEqualTo(1); + .id()).isEqualTo(1); assertThat(employees.get(0) - .name()).isEqualTo("Alan"); + .name()).isEqualTo("Alan"); assertThat(employees.get(1) - .id()).isEqualTo(2); + .id()).isEqualTo(2); assertThat(employees.get(1) - .name()).isEqualTo("Sarah"); + .name()).isEqualTo("Sarah"); } @After diff --git a/rxjava/src/test/java/com/baeldung/rxjava/jdbc/BasicQueryTypesTest.java b/rxjava/src/test/java/com/baeldung/rxjava/jdbc/BasicQueryTypesTest.java index 17d047d42f..7677b2375d 100644 --- a/rxjava/src/test/java/com/baeldung/rxjava/jdbc/BasicQueryTypesTest.java +++ b/rxjava/src/test/java/com/baeldung/rxjava/jdbc/BasicQueryTypesTest.java @@ -6,11 +6,9 @@ import java.util.Arrays; import java.util.List; import org.junit.After; -import org.junit.Before; import org.junit.Test; import com.github.davidmoten.rx.jdbc.ConnectionProvider; -import com.github.davidmoten.rx.jdbc.ConnectionProviderFromUrl; import com.github.davidmoten.rx.jdbc.Database; import rx.Observable; @@ -25,34 +23,34 @@ public class BasicQueryTypesTest { @Test public void whenCreateTableAndInsertRecords_thenCorrect() { create = db.update("CREATE TABLE IF NOT EXISTS EMPLOYEE(id int primary key, name varchar(255))") - .count(); + .count(); insert1 = db.update("INSERT INTO EMPLOYEE(id, name) VALUES(1, 'John')") - .dependsOn(create) - .count(); + .dependsOn(create) + .count(); update = db.update("UPDATE EMPLOYEE SET name = 'Alan' WHERE id = 1") - .dependsOn(create) - .count(); + .dependsOn(create) + .count(); insert2 = db.update("INSERT INTO EMPLOYEE(id, name) VALUES(2, 'Sarah')") - .dependsOn(create) - .count(); + .dependsOn(create) + .count(); insert3 = db.update("INSERT INTO EMPLOYEE(id, name) VALUES(3, 'Mike')") - .dependsOn(create) - .count(); + .dependsOn(create) + .count(); delete = db.update("DELETE FROM EMPLOYEE WHERE id = 2") - .dependsOn(create) - .count(); + .dependsOn(create) + .count(); List names = db.select("select name from EMPLOYEE where id < ?") - .parameter(3) - .dependsOn(create) - .dependsOn(insert1) - .dependsOn(insert2) - .dependsOn(insert3) - .dependsOn(update) - .dependsOn(delete) - .getAs(String.class) - .toList() - .toBlocking() - .single(); + .parameter(3) + .dependsOn(create) + .dependsOn(insert1) + .dependsOn(insert2) + .dependsOn(insert3) + .dependsOn(update) + .dependsOn(delete) + .getAs(String.class) + .toList() + .toBlocking() + .single(); assertEquals(Arrays.asList("Alan"), names); } @@ -60,7 +58,7 @@ public class BasicQueryTypesTest { @After public void close() { db.update("DROP TABLE EMPLOYEE") - .dependsOn(create); + .dependsOn(create); connectionProvider.close(); } } diff --git a/rxjava/src/test/java/com/baeldung/rxjava/jdbc/InsertBlobTest.java b/rxjava/src/test/java/com/baeldung/rxjava/jdbc/InsertBlobTest.java index d166bdac10..fb3018ede4 100644 --- a/rxjava/src/test/java/com/baeldung/rxjava/jdbc/InsertBlobTest.java +++ b/rxjava/src/test/java/com/baeldung/rxjava/jdbc/InsertBlobTest.java @@ -29,7 +29,7 @@ public class InsertBlobTest { @Before public void setup() throws IOException { create = db.update("CREATE TABLE IF NOT EXISTS SERVERLOG (id int primary key, document BLOB)") - .count(); + .count(); InputStream actualInputStream = new FileInputStream("src/test/resources/actual_clob"); this.actualDocument = Utils.getStringFromInputStream(actualInputStream); @@ -38,28 +38,28 @@ public class InsertBlobTest { InputStream expectedInputStream = new FileInputStream("src/test/resources/expected_clob"); this.expectedDocument = Utils.getStringFromInputStream(expectedInputStream); this.insert = db.update("insert into SERVERLOG(id,document) values(?,?)") - .parameter(1) - .parameter(Database.toSentinelIfNull(bytes)) - .dependsOn(create) - .count(); + .parameter(1) + .parameter(Database.toSentinelIfNull(bytes)) + .dependsOn(create) + .count(); } @Test public void whenInsertBLOB_thenCorrect() throws IOException { db.select("select document from SERVERLOG where id = 1") - .dependsOn(create) - .dependsOn(insert) - .getAs(String.class) - .toList() - .toBlocking() - .single(); + .dependsOn(create) + .dependsOn(insert) + .getAs(String.class) + .toList() + .toBlocking() + .single(); assertEquals(expectedDocument, actualDocument); } @After public void close() { db.update("DROP TABLE SERVERLOG") - .dependsOn(create); + .dependsOn(create); connectionProvider.close(); } } diff --git a/rxjava/src/test/java/com/baeldung/rxjava/jdbc/InsertClobTest.java b/rxjava/src/test/java/com/baeldung/rxjava/jdbc/InsertClobTest.java index d49d7edf1a..d29c2e3de2 100644 --- a/rxjava/src/test/java/com/baeldung/rxjava/jdbc/InsertClobTest.java +++ b/rxjava/src/test/java/com/baeldung/rxjava/jdbc/InsertClobTest.java @@ -11,7 +11,6 @@ import org.junit.Before; import org.junit.Test; import com.github.davidmoten.rx.jdbc.ConnectionProvider; -import com.github.davidmoten.rx.jdbc.ConnectionProviderFromUrl; import com.github.davidmoten.rx.jdbc.Database; import rx.Observable; @@ -29,7 +28,7 @@ public class InsertClobTest { @Before public void setup() throws IOException { create = db.update("CREATE TABLE IF NOT EXISTS SERVERLOG (id int primary key, document CLOB)") - .count(); + .count(); InputStream actualInputStream = new FileInputStream("src/test/resources/actual_clob"); this.actualDocument = Utils.getStringFromInputStream(actualInputStream); @@ -37,28 +36,28 @@ public class InsertClobTest { InputStream expectedInputStream = new FileInputStream("src/test/resources/expected_clob"); this.expectedDocument = Utils.getStringFromInputStream(expectedInputStream); this.insert = db.update("insert into SERVERLOG(id,document) values(?,?)") - .parameter(1) - .parameter(Database.toSentinelIfNull(actualDocument)) - .dependsOn(create) - .count(); + .parameter(1) + .parameter(Database.toSentinelIfNull(actualDocument)) + .dependsOn(create) + .count(); } @Test public void whenSelectCLOB_thenCorrect() throws IOException { db.select("select document from SERVERLOG where id = 1") - .dependsOn(create) - .dependsOn(insert) - .getAs(String.class) - .toList() - .toBlocking() - .single(); + .dependsOn(create) + .dependsOn(insert) + .getAs(String.class) + .toList() + .toBlocking() + .single(); assertEquals(expectedDocument, actualDocument); } @After public void close() { db.update("DROP TABLE SERVERLOG") - .dependsOn(create); + .dependsOn(create); connectionProvider.close(); } } \ No newline at end of file diff --git a/rxjava/src/test/java/com/baeldung/rxjava/jdbc/ReturnKeysTest.java b/rxjava/src/test/java/com/baeldung/rxjava/jdbc/ReturnKeysTest.java index 9a2765f03d..87604b6c5f 100644 --- a/rxjava/src/test/java/com/baeldung/rxjava/jdbc/ReturnKeysTest.java +++ b/rxjava/src/test/java/com/baeldung/rxjava/jdbc/ReturnKeysTest.java @@ -7,7 +7,6 @@ import org.junit.Before; import org.junit.Test; import com.github.davidmoten.rx.jdbc.ConnectionProvider; -import com.github.davidmoten.rx.jdbc.ConnectionProviderFromUrl; import com.github.davidmoten.rx.jdbc.Database; import rx.Observable; @@ -24,26 +23,26 @@ public class ReturnKeysTest { public void setup() { begin = db.beginTransaction(); createStatement = db.update("CREATE TABLE IF NOT EXISTS EMPLOYEE(id int auto_increment primary key, name varchar(255))") - .dependsOn(begin) - .count(); + .dependsOn(begin) + .count(); } @Test public void whenInsertAndReturnGeneratedKey_thenCorrect() { Integer key = db.update("INSERT INTO EMPLOYEE(name) VALUES('John')") - .dependsOn(createStatement) - .returnGeneratedKeys() - .getAs(Integer.class) - .count() - .toBlocking() - .single(); + .dependsOn(createStatement) + .returnGeneratedKeys() + .getAs(Integer.class) + .count() + .toBlocking() + .single(); assertThat(key).isEqualTo(1); } @After public void close() { db.update("DROP TABLE EMPLOYEE") - .dependsOn(createStatement); + .dependsOn(createStatement); connectionProvider.close(); } } diff --git a/rxjava/src/test/java/com/baeldung/rxjava/jdbc/TransactionTest.java b/rxjava/src/test/java/com/baeldung/rxjava/jdbc/TransactionTest.java index 584add4a6e..acca98d6d6 100644 --- a/rxjava/src/test/java/com/baeldung/rxjava/jdbc/TransactionTest.java +++ b/rxjava/src/test/java/com/baeldung/rxjava/jdbc/TransactionTest.java @@ -6,7 +6,6 @@ import org.junit.After; import org.junit.Test; import com.github.davidmoten.rx.jdbc.ConnectionProvider; -import com.github.davidmoten.rx.jdbc.ConnectionProviderFromUrl; import com.github.davidmoten.rx.jdbc.Database; import rx.Observable; @@ -23,20 +22,20 @@ public class TransactionTest { public void whenCommitTransaction_thenRecordUpdated() { begin = db.beginTransaction(); createStatement = db.update("CREATE TABLE IF NOT EXISTS EMPLOYEE(id int primary key, name varchar(255))") - .dependsOn(begin) - .count(); + .dependsOn(begin) + .count(); insertStatement = db.update("INSERT INTO EMPLOYEE(id, name) VALUES(1, 'John')") - .dependsOn(createStatement) - .count(); + .dependsOn(createStatement) + .count(); updateStatement = db.update("UPDATE EMPLOYEE SET name = 'Tom' WHERE id = 1") - .dependsOn(insertStatement) - .count(); + .dependsOn(insertStatement) + .count(); commit = db.commit(updateStatement); String name = db.select("select name from EMPLOYEE WHERE id = 1") - .dependsOn(commit) - .getAs(String.class) - .toBlocking() - .single(); + .dependsOn(commit) + .getAs(String.class) + .toBlocking() + .single(); assertEquals("Tom", name); } @@ -44,7 +43,7 @@ public class TransactionTest { @After public void close() { db.update("DROP TABLE EMPLOYEE") - .dependsOn(createStatement); + .dependsOn(createStatement); connectionProvider.close(); } } From 525336265393b279a8272faea26e181290fbbc9f Mon Sep 17 00:00:00 2001 From: Ahmed Tawila Date: Sat, 23 Sep 2017 16:45:39 +0200 Subject: [PATCH 054/236] Refactoring rxjava-jdbc --- .../com/baeldung/rxjava/jdbc/TransactionTest.java | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/rxjava/src/test/java/com/baeldung/rxjava/jdbc/TransactionTest.java b/rxjava/src/test/java/com/baeldung/rxjava/jdbc/TransactionTest.java index acca98d6d6..9603a11c46 100644 --- a/rxjava/src/test/java/com/baeldung/rxjava/jdbc/TransactionTest.java +++ b/rxjava/src/test/java/com/baeldung/rxjava/jdbc/TransactionTest.java @@ -20,17 +20,18 @@ public class TransactionTest { @Test public void whenCommitTransaction_thenRecordUpdated() { - begin = db.beginTransaction(); - createStatement = db.update("CREATE TABLE IF NOT EXISTS EMPLOYEE(id int primary key, name varchar(255))") + Observable begin = db.beginTransaction(); + Observable createStatement = db + .update("CREATE TABLE IF NOT EXISTS EMPLOYEE(id int primary key, name varchar(255))") .dependsOn(begin) .count(); - insertStatement = db.update("INSERT INTO EMPLOYEE(id, name) VALUES(1, 'John')") + Observable insertStatement = db.update("INSERT INTO EMPLOYEE(id, name) VALUES(1, 'John')") .dependsOn(createStatement) .count(); - updateStatement = db.update("UPDATE EMPLOYEE SET name = 'Tom' WHERE id = 1") + Observable updateStatement = db.update("UPDATE EMPLOYEE SET name = 'Tom' WHERE id = 1") .dependsOn(insertStatement) .count(); - commit = db.commit(updateStatement); + Observable commit = db.commit(updateStatement); String name = db.select("select name from EMPLOYEE WHERE id = 1") .dependsOn(commit) .getAs(String.class) From 44d5a03c0dfcc9a50b8e6f89aaeac7364eb4a2c9 Mon Sep 17 00:00:00 2001 From: Dassi Orleando Date: Sun, 24 Sep 2017 14:15:12 +0100 Subject: [PATCH 055/236] BAEL-1107: update properties of Author --- .../persistent/auto/_Author.java | 18 +++------ .../src/main/resources/datamap.map.xml | 6 +-- .../apachecayenne/CayenneOperationTests.java | 39 +++++++------------ 3 files changed, 22 insertions(+), 41 deletions(-) diff --git a/apache-cayenne/src/main/java/com/baeldung/apachecayenne/persistent/auto/_Author.java b/apache-cayenne/src/main/java/com/baeldung/apachecayenne/persistent/auto/_Author.java index 3d068423c8..4d3bb090ca 100644 --- a/apache-cayenne/src/main/java/com/baeldung/apachecayenne/persistent/auto/_Author.java +++ b/apache-cayenne/src/main/java/com/baeldung/apachecayenne/persistent/auto/_Author.java @@ -19,22 +19,14 @@ public abstract class _Author extends CayenneDataObject { public static final String ID_PK_COLUMN = "id"; - public static final Property FIRSTNAME = Property.create("firstname", String.class); - public static final Property LASTNAME = Property.create("lastname", String.class); + public static final Property NAME = Property.create("name", String.class); public static final Property> ARTICLES = Property.create("articles", List.class); - public void setFirstname(String firstname) { - writeProperty("firstname", firstname); + public void setName(String name) { + writeProperty("name", name); } - public String getFirstname() { - return (String)readProperty("firstname"); - } - - public void setLastname(String lastname) { - writeProperty("lastname", lastname); - } - public String getLastname() { - return (String)readProperty("lastname"); + public String getName() { + return (String)readProperty("name"); } public void addToArticles(Article obj) { diff --git a/apache-cayenne/src/main/resources/datamap.map.xml b/apache-cayenne/src/main/resources/datamap.map.xml index dc78ad4348..3305649669 100644 --- a/apache-cayenne/src/main/resources/datamap.map.xml +++ b/apache-cayenne/src/main/resources/datamap.map.xml @@ -11,17 +11,15 @@ - - + - - + diff --git a/apache-cayenne/src/test/java/com/baeldung/apachecayenne/CayenneOperationTests.java b/apache-cayenne/src/test/java/com/baeldung/apachecayenne/CayenneOperationTests.java index b92096c0fa..8a0d210d8d 100644 --- a/apache-cayenne/src/test/java/com/baeldung/apachecayenne/CayenneOperationTests.java +++ b/apache-cayenne/src/test/java/com/baeldung/apachecayenne/CayenneOperationTests.java @@ -39,8 +39,7 @@ public class CayenneOperationTests { @Test public void givenAuthor_whenInsert_thenWeGetOneRecordInTheDatabase() { Author author = context.newObject(Author.class); - author.setFirstname("Paul"); - author.setLastname("Smith"); + author.setName("Paul"); context.commitChanges(); @@ -51,28 +50,24 @@ public class CayenneOperationTests { @Test public void givenAuthor_whenInsert_andQueryByFirstName_thenWeGetTheAuthor() { Author author = context.newObject(Author.class); - author.setFirstname("Paul"); - author.setLastname("Smith"); + author.setName("Paul"); context.commitChanges(); Author expectedAuthor = ObjectSelect.query(Author.class) - .where(Author.FIRSTNAME.eq("Paul")) + .where(Author.NAME.eq("Paul")) .selectOne(context); - assertEquals("Paul", expectedAuthor.getFirstname()); - assertEquals("Smith", expectedAuthor.getLastname()); + assertEquals("Paul", expectedAuthor.getName()); } @Test public void givenTwoAuthor_whenInsert_andQueryAll_thenWeGetTwoAuthors() { Author firstAuthor = context.newObject(Author.class); - firstAuthor.setFirstname("Paul"); - firstAuthor.setLastname("Smith"); + firstAuthor.setName("Paul"); Author secondAuthor = context.newObject(Author.class); - secondAuthor.setFirstname("Ludovic"); - secondAuthor.setLastname("Garcia"); + secondAuthor.setName("Ludovic"); context.commitChanges(); @@ -83,44 +78,40 @@ public class CayenneOperationTests { @Test public void givenAuthor_whenUpdating_thenWeGetAnUpatedeAuthor() { Author author = context.newObject(Author.class); - author.setFirstname("Paul"); - author.setLastname("Smith"); + author.setName("Paul"); context.commitChanges(); Author expectedAuthor = ObjectSelect.query(Author.class) - .where(Author.FIRSTNAME.eq("Paul")) + .where(Author.NAME.eq("Paul")) .selectOne(context); - expectedAuthor.setLastname("Smith 2"); + expectedAuthor.setName("Garcia"); context.commitChanges(); - assertEquals(author.getFirstname(), expectedAuthor.getFirstname()); - assertEquals(author.getLastname(), expectedAuthor.getLastname()); + assertEquals(author.getName(), expectedAuthor.getName()); } @Test public void givenAuthor_whenDeleting_thenWeLostHisDetails() { Author author = context.newObject(Author.class); - author.setFirstname("Paul"); - author.setLastname("Smith"); + author.setName("Paul"); context.commitChanges(); Author savedAuthor = ObjectSelect.query(Author.class) - .where(Author.FIRSTNAME.eq("Paul")).selectOne(context); + .where(Author.NAME.eq("Paul")).selectOne(context); if(savedAuthor != null) { context.deleteObjects(author); context.commitChanges(); } Author expectedAuthor = ObjectSelect.query(Author.class) - .where(Author.FIRSTNAME.eq("Paul")).selectOne(context); + .where(Author.NAME.eq("Paul")).selectOne(context); assertNull(expectedAuthor); } @Test public void givenAuthor_whenAttachingToArticle_thenTheRelationIsMade() { Author author = context.newObject(Author.class); - author.setFirstname("Paul"); - author.setLastname("Smith"); + author.setName("Paul"); Article article = context.newObject(Article.class); article.setTitle("My post title"); @@ -130,7 +121,7 @@ public class CayenneOperationTests { context.commitChanges(); Author expectedAuthor = ObjectSelect.query(Author.class) - .where(Author.LASTNAME.eq("Smith")) + .where(Author.NAME.eq("Paul")) .selectOne(context); Article expectedArticle = (expectedAuthor.getArticles()).get(0); From f52560cdbbd85206d975756526bedb9e59c76eb4 Mon Sep 17 00:00:00 2001 From: parthkaria Date: Wed, 27 Sep 2017 14:51:43 +0530 Subject: [PATCH 056/236] BAEL-815 Introduction to JGraphT --- libraries/pom.xml | 5 + .../com/baeldung/javax/measure/WaterTank.java | 26 ----- .../javax/measure/WaterTankTests.java | 68 ------------- .../baeldung/jgrapht/CompleteGraphTest.java | 38 ++++++++ .../baeldung/jgrapht/DirectedGraphTests.java | 95 +++++++++++++++++++ .../baeldung/jgrapht/EulerianCircuitTest.java | 42 ++++++++ 6 files changed, 180 insertions(+), 94 deletions(-) delete mode 100644 libraries/src/main/java/com/baeldung/javax/measure/WaterTank.java delete mode 100644 libraries/src/test/java/com/baeldung/javax/measure/WaterTankTests.java create mode 100644 libraries/src/test/java/com/baeldung/jgrapht/CompleteGraphTest.java create mode 100644 libraries/src/test/java/com/baeldung/jgrapht/DirectedGraphTests.java create mode 100644 libraries/src/test/java/com/baeldung/jgrapht/EulerianCircuitTest.java diff --git a/libraries/pom.xml b/libraries/pom.xml index b0fdbea2f6..a15ffa6dfc 100644 --- a/libraries/pom.xml +++ b/libraries/pom.xml @@ -590,6 +590,11 @@ jsr-275 ${javax-measure.version} + + org.jgrapht + jgrapht-core + 1.0.1 + diff --git a/libraries/src/main/java/com/baeldung/javax/measure/WaterTank.java b/libraries/src/main/java/com/baeldung/javax/measure/WaterTank.java deleted file mode 100644 index 1ab9eee53f..0000000000 --- a/libraries/src/main/java/com/baeldung/javax/measure/WaterTank.java +++ /dev/null @@ -1,26 +0,0 @@ -package com.baeldung.javax.measure; - -import javax.measure.Measure; -import javax.measure.quantity.Volume; - -public class WaterTank { - - private Measure capacityMeasure; - private double capacityDouble; - - public void setCapacityMeasure(Measure capacityMeasure) { - this.capacityMeasure = capacityMeasure; - } - - public void setCapacityDouble(double capacityDouble) { - this.capacityDouble = capacityDouble; - } - - public Measure getCapacityMeasure() { - return capacityMeasure; - } - - public double getCapacityDouble() { - return capacityDouble; - } -} diff --git a/libraries/src/test/java/com/baeldung/javax/measure/WaterTankTests.java b/libraries/src/test/java/com/baeldung/javax/measure/WaterTankTests.java deleted file mode 100644 index ef54035353..0000000000 --- a/libraries/src/test/java/com/baeldung/javax/measure/WaterTankTests.java +++ /dev/null @@ -1,68 +0,0 @@ -package com.baeldung.javax.measure; - -import javax.measure.Measure; -import javax.measure.converter.UnitConverter; -import javax.measure.quantity.Duration; -import javax.measure.quantity.Length; -import javax.measure.quantity.Pressure; -import javax.measure.quantity.Volume; -import static javax.measure.unit.NonSI.HOUR; -import static javax.measure.unit.NonSI.LITRE; -import static javax.measure.unit.NonSI.MILE; -import static javax.measure.unit.NonSI.MINUTE; -import javax.measure.unit.SI; -import static javax.measure.unit.SI.KILO; -import static javax.measure.unit.SI.METER; -import static javax.measure.unit.SI.NEWTON; -import static javax.measure.unit.SI.SECOND; -import javax.measure.unit.Unit; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertTrue; -import org.junit.Test; - -public class WaterTankTests { - - @Test - public void givenMeasure_whenGetUnitAndConvertValue_thenSuccess() { - WaterTank waterTank = new WaterTank(); - waterTank.setCapacityMeasure(Measure.valueOf(9.2, LITRE)); - assertEquals(LITRE, waterTank.getCapacityMeasure().getUnit()); - - Measure waterCapacity = waterTank.getCapacityMeasure(); - double volumeInLitre = waterCapacity.getValue().doubleValue(); - assertEquals(9.2, volumeInLitre, 0.0f); - - double volumeInMilliLitre = waterCapacity.doubleValue(SI.MILLI(LITRE)); - assertEquals(9200.0, volumeInMilliLitre, 0.0f); - - Unit Kilometer = SI.KILO(METER); - Unit Centimeter = SI.CENTI(METER); - } - - @Test - public void givenMeasure_whenAlternateMeasure_ThenGetAlternateMeasure() { - Unit PASCAL = NEWTON.divide(METER.pow(2)).alternate("Pa"); - assertTrue(Unit.valueOf("Pa").equals(PASCAL)); - } - - @Test - public void givenMeasure_whenCompoundMeasure_ThenGetCompoundMeasure() { - Unit HOUR_MINUTE_SECOND = HOUR.compound(MINUTE).compound(SECOND); - Measure duration = Measure.valueOf(12345, SECOND); - assertEquals("3h25min45s", duration.to(HOUR_MINUTE_SECOND).toString()); - } - - @Test - public void givenMiles_whenConvertToKilometer_ThenConverted() { - double distanceInMiles = 50.0; - UnitConverter mileToKilometer = MILE.getConverterTo(KILO(METER)); - double distanceInKilometers = mileToKilometer.convert(distanceInMiles); - assertEquals(80.4672, distanceInKilometers, 0.00f); - } - - @Test - public void givenSymbol_WhenCompareToSystemUnit_ThenSuccess() { - assertTrue(Unit.valueOf("kW").equals(SI.KILO(SI.WATT))); - assertTrue(Unit.valueOf("ms").equals(SI.SECOND.divide(1000))); - } -} diff --git a/libraries/src/test/java/com/baeldung/jgrapht/CompleteGraphTest.java b/libraries/src/test/java/com/baeldung/jgrapht/CompleteGraphTest.java new file mode 100644 index 0000000000..c085d54689 --- /dev/null +++ b/libraries/src/test/java/com/baeldung/jgrapht/CompleteGraphTest.java @@ -0,0 +1,38 @@ +package com.baeldung.jgrapht; + +import static org.junit.Assert.assertEquals; + +import java.util.List; + +import org.jgrapht.VertexFactory; +import org.jgrapht.alg.HamiltonianCycle; +import org.jgrapht.generate.CompleteGraphGenerator; +import org.jgrapht.graph.DefaultEdge; +import org.jgrapht.graph.SimpleWeightedGraph; +import org.junit.Before; +import org.junit.Test; + +public class CompleteGraphTest { + + static SimpleWeightedGraph completeGraph; + static int size = 10; + + @Before + public void createCompleteGraph() { + completeGraph = new SimpleWeightedGraph<>(DefaultEdge.class); + CompleteGraphGenerator completeGenerator = new CompleteGraphGenerator(size); + VertexFactory vFactory = new VertexFactory() { + private int id = 0; + public String createVertex() { + return "v" + id++; + } + }; + completeGenerator.generateGraph(completeGraph, vFactory, null); + } + + @Test + public void givenCompleteGraph_whenGetHamiltonianCyclePath_thenGetVerticeListInSequence() { + List verticeList = HamiltonianCycle.getApproximateOptimalForCompleteGraph(completeGraph); + assertEquals(verticeList.size(), completeGraph.vertexSet().size()); + } +} diff --git a/libraries/src/test/java/com/baeldung/jgrapht/DirectedGraphTests.java b/libraries/src/test/java/com/baeldung/jgrapht/DirectedGraphTests.java new file mode 100644 index 0000000000..7f4cc99715 --- /dev/null +++ b/libraries/src/test/java/com/baeldung/jgrapht/DirectedGraphTests.java @@ -0,0 +1,95 @@ +package com.baeldung.jgrapht; + +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertTrue; + +import java.util.ArrayList; +import java.util.List; +import java.util.Set; +import java.util.stream.IntStream; + +import org.jgrapht.DirectedGraph; +import org.jgrapht.GraphPath; +import org.jgrapht.alg.CycleDetector; +import org.jgrapht.alg.KosarajuStrongConnectivityInspector; +import org.jgrapht.alg.interfaces.StrongConnectivityAlgorithm; +import org.jgrapht.alg.shortestpath.AllDirectedPaths; +import org.jgrapht.alg.shortestpath.BellmanFordShortestPath; +import org.jgrapht.alg.shortestpath.DijkstraShortestPath; +import org.jgrapht.graph.DefaultDirectedGraph; +import org.jgrapht.graph.DefaultEdge; +import org.jgrapht.graph.DirectedSubgraph; +import org.jgrapht.traverse.BreadthFirstIterator; +import org.jgrapht.traverse.DepthFirstIterator; +import org.junit.Before; +import org.junit.Test; + +public class DirectedGraphTests { + DirectedGraph directedGraph; + + @Before + public void createDirectedGraph() { + directedGraph = new DefaultDirectedGraph(DefaultEdge.class); + IntStream.range(1, 10).forEach(i -> { + directedGraph.addVertex("v" + i); + }); + directedGraph.addEdge("v1", "v2"); + directedGraph.addEdge("v2", "v4"); + directedGraph.addEdge("v4", "v3"); + directedGraph.addEdge("v3", "v1"); + directedGraph.addEdge("v5", "v4"); + directedGraph.addEdge("v5", "v6"); + directedGraph.addEdge("v6", "v7"); + directedGraph.addEdge("v7", "v5"); + directedGraph.addEdge("v8", "v5"); + directedGraph.addEdge("v9", "v8"); + } + + @Test + public void givenDirectedGraph_whenGetStronglyConnectedSubgraphs_thenPathExistsBetweenStronglyconnectedVertices() { + StrongConnectivityAlgorithm scAlg = new KosarajuStrongConnectivityInspector<>(directedGraph); + List> stronglyConnectedSubgraphs = scAlg.stronglyConnectedSubgraphs(); + List stronglyConnectedVertices = new ArrayList<>(stronglyConnectedSubgraphs.get(3).vertexSet()); + + String randomVertex1 = stronglyConnectedVertices.get(0); + String randomVertex2 = stronglyConnectedVertices.get(3); + AllDirectedPaths allDirectedPaths = new AllDirectedPaths<>(directedGraph); + + List> possiblePathList = allDirectedPaths.getAllPaths(randomVertex1, randomVertex2, false, stronglyConnectedVertices.size()); + assertTrue(possiblePathList.size() > 0); + } + + @Test + public void givenDirectedGraphWithCycle_whenCheckCycles_thenDetectCycles() { + CycleDetector cycleDetector = new CycleDetector(directedGraph); + assertTrue(cycleDetector.detectCycles()); + Set cycleVertices = cycleDetector.findCycles(); + assertTrue(cycleVertices.size() > 0); + } + + @Test + public void givenDirectedGraph_whenCreateInstanceDepthFirstIterator_thenGetIterator() { + DepthFirstIterator depthFirstIterator = new DepthFirstIterator<>(directedGraph); + assertNotNull(depthFirstIterator); + } + + @Test + public void givenDirectedGraph_whenCreateInstanceBreadthFirstIterator_thenGetIterator() { + BreadthFirstIterator breadthFirstIterator = new BreadthFirstIterator<>(directedGraph); + assertNotNull(breadthFirstIterator); + } + + @Test + public void givenDirectedGraph_whenGetDijkstraShortestPath_thenGetNotNullPath() { + DijkstraShortestPath dijkstraShortestPath = new DijkstraShortestPath(directedGraph); + List shortestPath = dijkstraShortestPath.getPath("v1", "v4").getVertexList(); + assertNotNull(shortestPath); + } + + @Test + public void givenDirectedGraph_whenGetBellmanFordShortestPath_thenGetNotNullPath() { + BellmanFordShortestPath bellmanFordShortestPath = new BellmanFordShortestPath(directedGraph); + List shortestPath = bellmanFordShortestPath.getPath("v1", "v4").getVertexList(); + assertNotNull(shortestPath); + } +} diff --git a/libraries/src/test/java/com/baeldung/jgrapht/EulerianCircuitTest.java b/libraries/src/test/java/com/baeldung/jgrapht/EulerianCircuitTest.java new file mode 100644 index 0000000000..6f0fb92ab7 --- /dev/null +++ b/libraries/src/test/java/com/baeldung/jgrapht/EulerianCircuitTest.java @@ -0,0 +1,42 @@ +package com.baeldung.jgrapht; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertTrue; + +import java.util.stream.IntStream; + +import org.jgrapht.GraphPath; +import org.jgrapht.alg.cycle.HierholzerEulerianCycle; +import org.jgrapht.graph.DefaultEdge; +import org.jgrapht.graph.SimpleWeightedGraph; +import org.junit.Before; +import org.junit.Test; + +public class EulerianCircuitTest { + SimpleWeightedGraph simpleGraph; + + @Before + public void createGraphWithEulerianCircuit() { + simpleGraph = new SimpleWeightedGraph<>(DefaultEdge.class); + IntStream.range(1, 6).forEach(i -> { + simpleGraph.addVertex("v" + i); + }); + IntStream.range(1, 6).forEach(i -> { + int endVertexNo = (i + 1) > 5 ? 1 : i + 1; + simpleGraph.addEdge("v" + i, "v" + endVertexNo); + }); + } + + @Test + public void givenGraph_whenCheckEluerianCycle_thenGetResult() { + HierholzerEulerianCycle eulerianCycle = new HierholzerEulerianCycle<>(); + assertTrue(eulerianCycle.isEulerian(simpleGraph)); + } + + @Test + public void givenGraphWithEulerianCircuit_whenGetEulerianCycle_thenGetGraphPath() { + HierholzerEulerianCycle eulerianCycle = new HierholzerEulerianCycle<>(); + GraphPath path = eulerianCycle.getEulerianCycle(simpleGraph); + assertTrue(path.getEdgeList().containsAll(simpleGraph.edgeSet())); + } +} From 38b2dc00284a18eda549c50daa47f85bfa128183 Mon Sep 17 00:00:00 2001 From: parthkaria Date: Wed, 27 Sep 2017 14:52:54 +0530 Subject: [PATCH 057/236] BAEL-815 Introduction to JGraphT --- libraries/pom.xml | 6 ------ 1 file changed, 6 deletions(-) diff --git a/libraries/pom.xml b/libraries/pom.xml index a15ffa6dfc..03919b9cec 100644 --- a/libraries/pom.xml +++ b/libraries/pom.xml @@ -585,11 +585,6 @@ fugue 3.0.0-m007 - - javax.measure - jsr-275 - ${javax-measure.version} - org.jgrapht jgrapht-core @@ -660,7 +655,6 @@ 0.6.5 0.9.0 15.2 - 0.9.1 2.9.9 1.5.1 2.3.0 From 9f9fa935a8baef3d5ab5caf13b1949eeb41edc51 Mon Sep 17 00:00:00 2001 From: Ahmed Tawila Date: Sat, 30 Sep 2017 18:14:54 +0200 Subject: [PATCH 058/236] BAEL-1171 java.lang.String API --- .../java/com/baeldung/string/CodePointAtTest.java | 12 ++++++++++++ .../main/java/com/baeldung/string/ConcatTest.java | 12 ++++++++++++ .../java/com/baeldung/string/GetBytesTest.java | 14 ++++++++++++++ 3 files changed, 38 insertions(+) create mode 100644 core-java/src/main/java/com/baeldung/string/CodePointAtTest.java create mode 100644 core-java/src/main/java/com/baeldung/string/ConcatTest.java create mode 100644 core-java/src/main/java/com/baeldung/string/GetBytesTest.java diff --git a/core-java/src/main/java/com/baeldung/string/CodePointAtTest.java b/core-java/src/main/java/com/baeldung/string/CodePointAtTest.java new file mode 100644 index 0000000000..bce0e1af18 --- /dev/null +++ b/core-java/src/main/java/com/baeldung/string/CodePointAtTest.java @@ -0,0 +1,12 @@ +package com.baeldung.string; + +import static org.junit.Assert.assertEquals; +import org.junit.Test; + +public class CodePointAtTest { + + @Test + public void whenCallCodePointAt_thenDecimalUnicodeReturned() { + assertEquals(97, "abcd".codePointAt(0)); + } +} diff --git a/core-java/src/main/java/com/baeldung/string/ConcatTest.java b/core-java/src/main/java/com/baeldung/string/ConcatTest.java new file mode 100644 index 0000000000..4a7362b513 --- /dev/null +++ b/core-java/src/main/java/com/baeldung/string/ConcatTest.java @@ -0,0 +1,12 @@ +package com.baeldung.string; + +import static org.junit.Assert.assertEquals; +import org.junit.Test; + +public class ConcatTest { + + @Test + public void whenCallConcat_thenCorrect() { + assertEquals("elephant", "elep".concat("hant")); + } +} diff --git a/core-java/src/main/java/com/baeldung/string/GetBytesTest.java b/core-java/src/main/java/com/baeldung/string/GetBytesTest.java new file mode 100644 index 0000000000..22011678f0 --- /dev/null +++ b/core-java/src/main/java/com/baeldung/string/GetBytesTest.java @@ -0,0 +1,14 @@ +package com.baeldung.string; + +import static org.junit.Assert.assertArrayEquals; +import org.junit.Test; + +public class GetBytesTest { + + @Test + public void whenGetBytes_thenCorrect() { + byte[] byteArray = "abcd".getBytes(); + byte[] expected = new byte[] { 97, 98, 99, 100 }; + assertArrayEquals(expected, byteArray); + } +} From ecb0e9924a837c86ea889c497eb10900f5c751ae Mon Sep 17 00:00:00 2001 From: Ahmed Tawila Date: Sat, 30 Sep 2017 22:37:00 +0200 Subject: [PATCH 059/236] refactor rxjava-jdbc --- .../com/baeldung/rxjava/jdbc/AutomapClassTest.java | 8 ++++---- .../com/baeldung/rxjava/jdbc/AutomapInterfaceTest.java | 8 ++++---- .../com/baeldung/rxjava/jdbc/BasicQueryTypesTest.java | 6 +++--- .../java/com/baeldung/rxjava/jdbc/InsertBlobTest.java | 10 +++++----- .../java/com/baeldung/rxjava/jdbc/InsertClobTest.java | 10 +++++----- .../java/com/baeldung/rxjava/jdbc/ReturnKeysTest.java | 8 ++++---- .../java/com/baeldung/rxjava/jdbc/TransactionTest.java | 7 +++---- 7 files changed, 28 insertions(+), 29 deletions(-) diff --git a/rxjava/src/test/java/com/baeldung/rxjava/jdbc/AutomapClassTest.java b/rxjava/src/test/java/com/baeldung/rxjava/jdbc/AutomapClassTest.java index f44d4ac6b8..dea194734f 100644 --- a/rxjava/src/test/java/com/baeldung/rxjava/jdbc/AutomapClassTest.java +++ b/rxjava/src/test/java/com/baeldung/rxjava/jdbc/AutomapClassTest.java @@ -15,11 +15,11 @@ import rx.Observable; public class AutomapClassTest { - ConnectionProvider connectionProvider = Connector.connectionProvider; - Database db = Database.from(connectionProvider); + private ConnectionProvider connectionProvider = Connector.connectionProvider; + private Database db = Database.from(connectionProvider); - Observable create = null; - Observable insert1, insert2 = null; + private Observable create = null; + private Observable insert1, insert2 = null; @Before public void setup() { diff --git a/rxjava/src/test/java/com/baeldung/rxjava/jdbc/AutomapInterfaceTest.java b/rxjava/src/test/java/com/baeldung/rxjava/jdbc/AutomapInterfaceTest.java index 79bae281eb..730e64fd34 100644 --- a/rxjava/src/test/java/com/baeldung/rxjava/jdbc/AutomapInterfaceTest.java +++ b/rxjava/src/test/java/com/baeldung/rxjava/jdbc/AutomapInterfaceTest.java @@ -15,11 +15,11 @@ import rx.Observable; public class AutomapInterfaceTest { - ConnectionProvider connectionProvider = Connector.connectionProvider; - Database db = Database.from(connectionProvider); + private ConnectionProvider connectionProvider = Connector.connectionProvider; + private Database db = Database.from(connectionProvider); - Observable create = null; - Observable insert1, insert2 = null; + private Observable create = null; + private Observable insert1, insert2 = null; @Before public void setup() { diff --git a/rxjava/src/test/java/com/baeldung/rxjava/jdbc/BasicQueryTypesTest.java b/rxjava/src/test/java/com/baeldung/rxjava/jdbc/BasicQueryTypesTest.java index 7677b2375d..034b3c1f50 100644 --- a/rxjava/src/test/java/com/baeldung/rxjava/jdbc/BasicQueryTypesTest.java +++ b/rxjava/src/test/java/com/baeldung/rxjava/jdbc/BasicQueryTypesTest.java @@ -15,10 +15,10 @@ import rx.Observable; public class BasicQueryTypesTest { - ConnectionProvider connectionProvider = Connector.connectionProvider; - Database db = Database.from(connectionProvider); + private ConnectionProvider connectionProvider = Connector.connectionProvider; + private Database db = Database.from(connectionProvider); - Observable create, insert1, insert2, insert3, update, delete = null; + private Observable create, insert1, insert2, insert3, update, delete = null; @Test public void whenCreateTableAndInsertRecords_thenCorrect() { diff --git a/rxjava/src/test/java/com/baeldung/rxjava/jdbc/InsertBlobTest.java b/rxjava/src/test/java/com/baeldung/rxjava/jdbc/InsertBlobTest.java index fb3018ede4..1ca82f81f3 100644 --- a/rxjava/src/test/java/com/baeldung/rxjava/jdbc/InsertBlobTest.java +++ b/rxjava/src/test/java/com/baeldung/rxjava/jdbc/InsertBlobTest.java @@ -18,13 +18,13 @@ import rx.Observable; public class InsertBlobTest { - ConnectionProvider connectionProvider = Connector.connectionProvider; - Database db = Database.from(connectionProvider); + private ConnectionProvider connectionProvider = Connector.connectionProvider; + private Database db = Database.from(connectionProvider); - String expectedDocument = null; - String actualDocument = null; + private String expectedDocument = null; + private String actualDocument = null; - Observable create, insert = null; + private Observable create, insert = null; @Before public void setup() throws IOException { diff --git a/rxjava/src/test/java/com/baeldung/rxjava/jdbc/InsertClobTest.java b/rxjava/src/test/java/com/baeldung/rxjava/jdbc/InsertClobTest.java index d29c2e3de2..0a685075f3 100644 --- a/rxjava/src/test/java/com/baeldung/rxjava/jdbc/InsertClobTest.java +++ b/rxjava/src/test/java/com/baeldung/rxjava/jdbc/InsertClobTest.java @@ -17,13 +17,13 @@ import rx.Observable; public class InsertClobTest { - ConnectionProvider connectionProvider = Connector.connectionProvider; - Database db = Database.from(connectionProvider); + private ConnectionProvider connectionProvider = Connector.connectionProvider; + private Database db = Database.from(connectionProvider); - String expectedDocument = null; - String actualDocument = null; + private String expectedDocument = null; + private String actualDocument = null; - Observable create, insert = null; + private Observable create, insert = null; @Before public void setup() throws IOException { diff --git a/rxjava/src/test/java/com/baeldung/rxjava/jdbc/ReturnKeysTest.java b/rxjava/src/test/java/com/baeldung/rxjava/jdbc/ReturnKeysTest.java index 87604b6c5f..50c81afcc4 100644 --- a/rxjava/src/test/java/com/baeldung/rxjava/jdbc/ReturnKeysTest.java +++ b/rxjava/src/test/java/com/baeldung/rxjava/jdbc/ReturnKeysTest.java @@ -13,11 +13,11 @@ import rx.Observable; public class ReturnKeysTest { - Observable begin, commit = null; - Observable createStatement, insertStatement, updateStatement = null; + private Observable begin = null; + private Observable createStatement = null; - ConnectionProvider connectionProvider = Connector.connectionProvider; - Database db = Database.from(connectionProvider); + private ConnectionProvider connectionProvider = Connector.connectionProvider; + private Database db = Database.from(connectionProvider); @Before public void setup() { diff --git a/rxjava/src/test/java/com/baeldung/rxjava/jdbc/TransactionTest.java b/rxjava/src/test/java/com/baeldung/rxjava/jdbc/TransactionTest.java index 9603a11c46..b7a1bb5b79 100644 --- a/rxjava/src/test/java/com/baeldung/rxjava/jdbc/TransactionTest.java +++ b/rxjava/src/test/java/com/baeldung/rxjava/jdbc/TransactionTest.java @@ -12,11 +12,10 @@ import rx.Observable; public class TransactionTest { - Observable begin, commit = null; - Observable createStatement, insertStatement, updateStatement = null; + private Observable createStatement = null; - ConnectionProvider connectionProvider = Connector.connectionProvider; - Database db = Database.from(connectionProvider); + private ConnectionProvider connectionProvider = Connector.connectionProvider; + private Database db = Database.from(connectionProvider); @Test public void whenCommitTransaction_thenRecordUpdated() { From 35182c42484d3bd4c73f1ef27e4558481749d7ad Mon Sep 17 00:00:00 2001 From: Ahmed Tawila Date: Sat, 30 Sep 2017 22:59:34 +0200 Subject: [PATCH 060/236] refactor String --- .../java/com/baeldung/string/CodePointAtTest.java | 12 ------------ .../main/java/com/baeldung/string/ConcatTest.java | 12 ------------ .../java/com/baeldung/string/GetBytesTest.java | 14 -------------- 3 files changed, 38 deletions(-) delete mode 100644 core-java/src/main/java/com/baeldung/string/CodePointAtTest.java delete mode 100644 core-java/src/main/java/com/baeldung/string/ConcatTest.java delete mode 100644 core-java/src/main/java/com/baeldung/string/GetBytesTest.java diff --git a/core-java/src/main/java/com/baeldung/string/CodePointAtTest.java b/core-java/src/main/java/com/baeldung/string/CodePointAtTest.java deleted file mode 100644 index bce0e1af18..0000000000 --- a/core-java/src/main/java/com/baeldung/string/CodePointAtTest.java +++ /dev/null @@ -1,12 +0,0 @@ -package com.baeldung.string; - -import static org.junit.Assert.assertEquals; -import org.junit.Test; - -public class CodePointAtTest { - - @Test - public void whenCallCodePointAt_thenDecimalUnicodeReturned() { - assertEquals(97, "abcd".codePointAt(0)); - } -} diff --git a/core-java/src/main/java/com/baeldung/string/ConcatTest.java b/core-java/src/main/java/com/baeldung/string/ConcatTest.java deleted file mode 100644 index 4a7362b513..0000000000 --- a/core-java/src/main/java/com/baeldung/string/ConcatTest.java +++ /dev/null @@ -1,12 +0,0 @@ -package com.baeldung.string; - -import static org.junit.Assert.assertEquals; -import org.junit.Test; - -public class ConcatTest { - - @Test - public void whenCallConcat_thenCorrect() { - assertEquals("elephant", "elep".concat("hant")); - } -} diff --git a/core-java/src/main/java/com/baeldung/string/GetBytesTest.java b/core-java/src/main/java/com/baeldung/string/GetBytesTest.java deleted file mode 100644 index 22011678f0..0000000000 --- a/core-java/src/main/java/com/baeldung/string/GetBytesTest.java +++ /dev/null @@ -1,14 +0,0 @@ -package com.baeldung.string; - -import static org.junit.Assert.assertArrayEquals; -import org.junit.Test; - -public class GetBytesTest { - - @Test - public void whenGetBytes_thenCorrect() { - byte[] byteArray = "abcd".getBytes(); - byte[] expected = new byte[] { 97, 98, 99, 100 }; - assertArrayEquals(expected, byteArray); - } -} From d559cf43fc078ea5db5cc364081c6b17da27a564 Mon Sep 17 00:00:00 2001 From: Ahmed Tawila Date: Sun, 1 Oct 2017 09:02:57 +0200 Subject: [PATCH 061/236] String API - move multiple classes into a single class --- .../java/com/baeldung/string/StringTest.java | 26 +++++++++++++++++++ 1 file changed, 26 insertions(+) create mode 100644 core-java/src/main/java/com/baeldung/string/StringTest.java diff --git a/core-java/src/main/java/com/baeldung/string/StringTest.java b/core-java/src/main/java/com/baeldung/string/StringTest.java new file mode 100644 index 0000000000..fd83c903a3 --- /dev/null +++ b/core-java/src/main/java/com/baeldung/string/StringTest.java @@ -0,0 +1,26 @@ +package com.baeldung.string; + +import static org.junit.Assert.assertArrayEquals; +import static org.junit.Assert.assertEquals; + +import org.junit.Test; + +public class StringTest { + + @Test + public void whenCallCodePointAt_thenDecimalUnicodeReturned() { + assertEquals(97, "abcd".codePointAt(0)); + } + + @Test + public void whenCallConcat_thenCorrect() { + assertEquals("elephant", "elep".concat("hant")); + } + + @Test + public void whenGetBytes_thenCorrect() { + byte[] byteArray = "abcd".getBytes(); + byte[] expected = new byte[] { 97, 98, 99, 100 }; + assertArrayEquals(expected, byteArray); + } +} From ab26dc03c3e705bc179946355edc99811bdc60e2 Mon Sep 17 00:00:00 2001 From: Ahmed Tawila Date: Sun, 1 Oct 2017 09:05:33 +0200 Subject: [PATCH 062/236] move class into test package --- .../src/{main => test}/java/com/baeldung/string/StringTest.java | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename core-java/src/{main => test}/java/com/baeldung/string/StringTest.java (100%) diff --git a/core-java/src/main/java/com/baeldung/string/StringTest.java b/core-java/src/test/java/com/baeldung/string/StringTest.java similarity index 100% rename from core-java/src/main/java/com/baeldung/string/StringTest.java rename to core-java/src/test/java/com/baeldung/string/StringTest.java From 5672ec1f2dfa511c2a2b58ac12e65cbc971b7d9e Mon Sep 17 00:00:00 2001 From: Dassi Orleando Date: Thu, 5 Oct 2017 03:14:25 +0100 Subject: [PATCH 063/236] BAEL-1157: Apache Cayenne - Advanced Querying --- .../CayenneAdvancedOperationTests.java | 255 ++++++++++++++++++ 1 file changed, 255 insertions(+) create mode 100644 apache-cayenne/src/test/java/com/baeldung/apachecayenne/CayenneAdvancedOperationTests.java diff --git a/apache-cayenne/src/test/java/com/baeldung/apachecayenne/CayenneAdvancedOperationTests.java b/apache-cayenne/src/test/java/com/baeldung/apachecayenne/CayenneAdvancedOperationTests.java new file mode 100644 index 0000000000..613ef757b4 --- /dev/null +++ b/apache-cayenne/src/test/java/com/baeldung/apachecayenne/CayenneAdvancedOperationTests.java @@ -0,0 +1,255 @@ +package com.baeldung.apachecayenne; + +import com.baeldung.apachecayenne.persistent.Article; +import com.baeldung.apachecayenne.persistent.Author; +import org.apache.cayenne.ObjectContext; +import org.apache.cayenne.configuration.server.ServerRuntime; +import org.apache.cayenne.query.ObjectSelect; +import org.apache.cayenne.query.SQLTemplate; +import org.apache.cayenne.query.SelectQuery; +import org.junit.After; +import org.junit.BeforeClass; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.junit.runners.JUnit4; + +import java.util.List; + +import static junit.framework.Assert.assertEquals; +import static org.junit.Assert.assertNull; + +public class CayenneAdvancedOperationTests { + private static ObjectContext context = null; + + @BeforeClass + public static void setupTheCayenneContext() { + ServerRuntime cayenneRuntime = ServerRuntime.builder() + .addConfig("cayenne-project.xml") + .build(); + context = cayenneRuntime.newContext(); + } + + @Before + public void saveThreeAuthors() { + Author authorOne = context.newObject(Author.class); + authorOne.setName("Paul Xavier"); + Author authorTwo = context.newObject(Author.class); + authorTwo.setName("pAuL Smith"); + Author authorThree = context.newObject(Author.class); + authorThree.setName("Vicky Sarra"); + context.commitChanges(); + } + + @After + public void deleteAllAuthors() { + SQLTemplate deleteAuthors = new SQLTemplate(Author.class, "delete from author"); + context.performGenericQuery(deleteAuthors); + } + + @Test + public void givenAuthors_whenFindAllSQLTmplt_thenWeGetThreeAuthors() { + SQLTemplate select = new SQLTemplate(Author.class, "select * from Author"); + List authors = context.performQuery(select); + + assertEquals(authors.size(), 3); + } + + @Test + public void givenAuthors_whenFindByNameSQLTmplt_thenWeGetOneAuthor() { + SQLTemplate select = new SQLTemplate(Author.class, "select * from Author where name = 'Vicky Sarra'"); + List authors = context.performQuery(select); + Author author = authors.get(0); + + assertEquals(authors.size(), 1); + assertEquals(author.getName(), "Vicky Sarra"); + } + + @Test + public void givenAuthors_whenLikeSltQry_thenWeGetOneAuthor() { + Expression qualifier = ExpressionFactory.likeExp(Author.NAME.getName(), "Paul%"); + SelectQuery query = new SelectQuery(Author.class, qualifier); + List authorsTwo = context.performQuery(query); + + assertEquals(authorsTwo.size(), 1); + } + + @Test + public void givenAuthors_whenCtnsIgnorCaseSltQry_thenWeGetTwoAuthors() { + Expression qualifier = ExpressionFactory.containsIgnoreCaseExp(Author.NAME.getName(), "Paul"); + SelectQuery query = new SelectQuery(Author.class, qualifier); + List authors = context.performQuery(query); + + assertEquals(authors.size(), 2); + } + + @Test + public void givenAuthors_whenCtnsIgnorCaseEndsWSltQry_thenWeGetTwoAuthors() { + Expression qualifier = ExpressionFactory.containsIgnoreCaseExp(Author.NAME.getName(), "Paul") + .andExp(ExpressionFactory.endsWithExp(Author.NAME.getName(), "h")); + SelectQuery query = new SelectQuery(Author.class, qualifier); + List authors = context.performQuery(query); + + Author author = authors.get(0); + + assertEquals(authors.size(), 1); + assertEquals(author.getName(), "pAuL Smith"); + } + + @Test + public void givenAuthors_whenAscOrderingSltQry_thenWeGetOrderedAuthors() { + SelectQuery query = new SelectQuery(Author.class); + query.addOrdering(Author.NAME.asc()); + + List authors = query.select(context); + Author firstAuthor = authors.get(0); + + assertEquals(authors.size(), 3); + assertEquals(firstAuthor.getName(), "Paul Xavier"); + } + + @Test + public void givenAuthors_whenDescOrderingSltQry_thenWeGetOrderedAuthors() { + SelectQuery query = new SelectQuery(Author.class); + query.addOrdering(Author.NAME.desc()); + + List authors = query.select(context); + Author firstAuthor = authors.get(0); + + assertEquals(authors.size(), 3); + assertEquals(firstAuthor.getName(), "pAuL Smith"); + } + + @Test + public void givenAuthors_onContainsObjS_thenWeGetOneRecord() { + List authors = ObjectSelect.query(Author.class) + .where(Author.NAME.contains("Paul")) + .select(context); + + assertEquals(authors.size(), 1); + } + + @Test + public void givenAuthors_whenLikeObjS_thenWeGetTwoAuthors() { + List authors = ObjectSelect.query(Author.class) + .where(Author.NAME.likeIgnoreCase("Paul%")) + .select(context); + + assertEquals(authors.size(), 2); + } + + @Test + public void givenTwoAuthor_whenEndsWithObjS_thenWeGetOrderedAuthors() { + List authors = ObjectSelect.query(Author.class) + .where(Author.NAME.endsWith("Sarra")) + .select(context); + Author firstAuthor = authors.get(0); + + assertEquals(authors.size(), 1); + assertEquals(firstAuthor.getName(), "Vicky Sarra"); + } + + @Test + public void givenTwoAuthor_whenInObjS_thenWeGetAuthors() { + String [] args = {"Paul Xavier", "pAuL Smith", "Vicky Sarra"}; + List authors = ObjectSelect.query(Author.class) + .where(Author.NAME.in(Arrays.asList(args))) + .select(context); + + assertEquals(authors.size(), 3); + } + + @Test + public void givenTwoAuthor_whenNinObjS_thenWeGetAuthors() { + String [] args = {"Paul Xavier", "pAuL Smith"}; + List authors = ObjectSelect.query(Author.class) + .where(Author.NAME.nin(Arrays.asList(args))) + .select(context); + Author author = authors.get(0); + + assertEquals(authors.size(), 1); + assertEquals(author.getName(), "Vicky Sarra"); + } + + @Test + public void givenTwoAuthor_whenIsNotNullObjS_thenWeGetAuthors() { + List authors = ObjectSelect.query(Author.class) + .where(Author.NAME.isNotNull()) + .select(context); + + assertEquals(authors.size(), 3); + } + + @Test + public void givenAuthors_whenFindAllEJBQL_thenWeGetThreeAuthors() { + EJBQLQuery query = new EJBQLQuery("select a FROM Author a"); + List authors = context.performQuery(query); + + assertEquals(authors.size(), 3); + } + + @Test + public void givenAuthors_whenFindByNameEJBQL_thenWeGetOneAuthor() { + EJBQLQuery query = new EJBQLQuery("select a FROM Author a WHERE a.name = 'Vicky Sarra'"); + List authors = context.performQuery(query); + Author author = authors.get(0); + + assertEquals(authors.size(), 1); + assertEquals(author.getName(), "Vicky Sarra"); + } + + @Test + public void givenAuthors_whenUpdadingByNameEJBQL_thenWeGetTheUpdatedAuthor() { + EJBQLQuery query = new EJBQLQuery("UPDATE Author AS a SET a.name = 'Vicky Edison' WHERE a.name = 'Vicky Sarra'"); + QueryResponse queryResponse = context.performGenericQuery(query); + + EJBQLQuery queryUpdatedAuthor = new EJBQLQuery("select a FROM Author a WHERE a.name = 'Vicky Edison'"); + List authors = context.performQuery(queryUpdatedAuthor); + Author author = authors.get(0); + + assertNotNull(author); + } + + @Test + public void givenAuthors_whenSeletingNamesEJBQL_thenWeGetListWithSizeThree() { + String [] args = {"Paul Xavier", "pAuL Smith", "Vicky Sarra"}; + List names = Arrays.asList(args); + EJBQLQuery query = new EJBQLQuery("select a.name FROM Author a"); + List nameList = context.performQuery(query); + + Collections.sort(names); + Collections.sort(nameList); + + assertEquals(names.size(), 3); + assertEquals(nameList.size(), 3); + assertEquals(names, nameList); + } + + @Test + public void givenAuthors_whenDeletingAllWithEJB_thenWeGetNoAuthor() { + EJBQLQuery deleteQuery = new EJBQLQuery("delete FROM Author"); + EJBQLQuery findAllQuery = new EJBQLQuery("select a FROM Author a"); + + context.performQuery(deleteQuery); + List objects = context.performQuery(findAllQuery); + + assertEquals(objects.size(), 0); + } + + @Test + public void givenAuthors_whenInsertingSQLExec_thenWeGetNewAuthor() { + int inserted = SQLExec + .query("INSERT INTO Author (name) VALUES ('Baeldung')") + .update(context); + + assertEquals(inserted, 1); + } + + @Test + public void givenAuthors_whenUpdatingSQLExec_thenItsUpdated() { + int updated = SQLExec + .query("UPDATE Author SET name = 'Baeldung' WHERE name = 'Vicky Sarra'") + .update(context); + + assertEquals(updated, 1); + } +} From 0dbfa53ae074e42cf354cd3939e97edab50872f5 Mon Sep 17 00:00:00 2001 From: Dassi Orleando Date: Thu, 5 Oct 2017 03:47:28 +0100 Subject: [PATCH 064/236] BAEL-1157: Fix imports --- .../CayenneAdvancedOperationTests.java | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/apache-cayenne/src/test/java/com/baeldung/apachecayenne/CayenneAdvancedOperationTests.java b/apache-cayenne/src/test/java/com/baeldung/apachecayenne/CayenneAdvancedOperationTests.java index 613ef757b4..ea10b59dd2 100644 --- a/apache-cayenne/src/test/java/com/baeldung/apachecayenne/CayenneAdvancedOperationTests.java +++ b/apache-cayenne/src/test/java/com/baeldung/apachecayenne/CayenneAdvancedOperationTests.java @@ -1,22 +1,23 @@ package com.baeldung.apachecayenne; -import com.baeldung.apachecayenne.persistent.Article; import com.baeldung.apachecayenne.persistent.Author; import org.apache.cayenne.ObjectContext; +import org.apache.cayenne.QueryResponse; import org.apache.cayenne.configuration.server.ServerRuntime; -import org.apache.cayenne.query.ObjectSelect; -import org.apache.cayenne.query.SQLTemplate; -import org.apache.cayenne.query.SelectQuery; +import org.apache.cayenne.exp.Expression; +import org.apache.cayenne.exp.ExpressionFactory; +import org.apache.cayenne.query.*; import org.junit.After; +import org.junit.Before; import org.junit.BeforeClass; import org.junit.Test; -import org.junit.runner.RunWith; -import org.junit.runners.JUnit4; +import java.util.Arrays; +import java.util.Collections; import java.util.List; import static junit.framework.Assert.assertEquals; -import static org.junit.Assert.assertNull; +import static org.junit.Assert.assertNotNull; public class CayenneAdvancedOperationTests { private static ObjectContext context = null; From 3f825c5b96cbd7105820616774c988c1359eb344 Mon Sep 17 00:00:00 2001 From: Dassi Orleando Date: Thu, 5 Oct 2017 04:17:56 +0100 Subject: [PATCH 065/236] BAEL-1157: code indentation --- .../CayenneAdvancedOperationTests.java | 36 +++++++++---------- 1 file changed, 18 insertions(+), 18 deletions(-) diff --git a/apache-cayenne/src/test/java/com/baeldung/apachecayenne/CayenneAdvancedOperationTests.java b/apache-cayenne/src/test/java/com/baeldung/apachecayenne/CayenneAdvancedOperationTests.java index ea10b59dd2..ddfe9325d3 100644 --- a/apache-cayenne/src/test/java/com/baeldung/apachecayenne/CayenneAdvancedOperationTests.java +++ b/apache-cayenne/src/test/java/com/baeldung/apachecayenne/CayenneAdvancedOperationTests.java @@ -25,8 +25,8 @@ public class CayenneAdvancedOperationTests { @BeforeClass public static void setupTheCayenneContext() { ServerRuntime cayenneRuntime = ServerRuntime.builder() - .addConfig("cayenne-project.xml") - .build(); + .addConfig("cayenne-project.xml") + .build(); context = cayenneRuntime.newContext(); } @@ -123,8 +123,8 @@ public class CayenneAdvancedOperationTests { @Test public void givenAuthors_onContainsObjS_thenWeGetOneRecord() { List authors = ObjectSelect.query(Author.class) - .where(Author.NAME.contains("Paul")) - .select(context); + .where(Author.NAME.contains("Paul")) + .select(context); assertEquals(authors.size(), 1); } @@ -132,8 +132,8 @@ public class CayenneAdvancedOperationTests { @Test public void givenAuthors_whenLikeObjS_thenWeGetTwoAuthors() { List authors = ObjectSelect.query(Author.class) - .where(Author.NAME.likeIgnoreCase("Paul%")) - .select(context); + .where(Author.NAME.likeIgnoreCase("Paul%")) + .select(context); assertEquals(authors.size(), 2); } @@ -141,8 +141,8 @@ public class CayenneAdvancedOperationTests { @Test public void givenTwoAuthor_whenEndsWithObjS_thenWeGetOrderedAuthors() { List authors = ObjectSelect.query(Author.class) - .where(Author.NAME.endsWith("Sarra")) - .select(context); + .where(Author.NAME.endsWith("Sarra")) + .select(context); Author firstAuthor = authors.get(0); assertEquals(authors.size(), 1); @@ -153,8 +153,8 @@ public class CayenneAdvancedOperationTests { public void givenTwoAuthor_whenInObjS_thenWeGetAuthors() { String [] args = {"Paul Xavier", "pAuL Smith", "Vicky Sarra"}; List authors = ObjectSelect.query(Author.class) - .where(Author.NAME.in(Arrays.asList(args))) - .select(context); + .where(Author.NAME.in(Arrays.asList(args))) + .select(context); assertEquals(authors.size(), 3); } @@ -163,8 +163,8 @@ public class CayenneAdvancedOperationTests { public void givenTwoAuthor_whenNinObjS_thenWeGetAuthors() { String [] args = {"Paul Xavier", "pAuL Smith"}; List authors = ObjectSelect.query(Author.class) - .where(Author.NAME.nin(Arrays.asList(args))) - .select(context); + .where(Author.NAME.nin(Arrays.asList(args))) + .select(context); Author author = authors.get(0); assertEquals(authors.size(), 1); @@ -174,8 +174,8 @@ public class CayenneAdvancedOperationTests { @Test public void givenTwoAuthor_whenIsNotNullObjS_thenWeGetAuthors() { List authors = ObjectSelect.query(Author.class) - .where(Author.NAME.isNotNull()) - .select(context); + .where(Author.NAME.isNotNull()) + .select(context); assertEquals(authors.size(), 3); } @@ -239,8 +239,8 @@ public class CayenneAdvancedOperationTests { @Test public void givenAuthors_whenInsertingSQLExec_thenWeGetNewAuthor() { int inserted = SQLExec - .query("INSERT INTO Author (name) VALUES ('Baeldung')") - .update(context); + .query("INSERT INTO Author (name) VALUES ('Baeldung')") + .update(context); assertEquals(inserted, 1); } @@ -248,8 +248,8 @@ public class CayenneAdvancedOperationTests { @Test public void givenAuthors_whenUpdatingSQLExec_thenItsUpdated() { int updated = SQLExec - .query("UPDATE Author SET name = 'Baeldung' WHERE name = 'Vicky Sarra'") - .update(context); + .query("UPDATE Author SET name = 'Baeldung' WHERE name = 'Vicky Sarra'") + .update(context); assertEquals(updated, 1); } From 57a993de64fc0959b0511096f07ac9d59133fa01 Mon Sep 17 00:00:00 2001 From: Jose Carvajal Date: Sun, 8 Oct 2017 08:17:24 +0200 Subject: [PATCH 066/236] BAEL-719: Intro to Spring Cloud Stream --- spring-cloud/pom.xml | 2 + spring-cloud/spring-cloud-stream/pom.xml | 70 +++++++++++++++++++ .../spring-cloud-stream-rabbit/pom.xml | 33 +++++++++ .../MultipleOutputsServiceApplication.java | 38 ++++++++++ ...tputsWithConditionsServiceApplication.java | 39 +++++++++++ .../rabbit/MyLoggerServiceApplication.java | 32 +++++++++ .../messages/TextPlainMessageConverter.java | 26 +++++++ .../cloud/stream/rabbit/model/LogMessage.java | 32 +++++++++ .../stream/rabbit/processor/MyProcessor.java | 19 +++++ .../src/main/resources/application.yml | 28 ++++++++ ...ultipleOutputsServiceApplicationTests.java | 52 ++++++++++++++ ...WithConditionsServiceApplicationTests.java | 52 ++++++++++++++ .../rabbit/MyLoggerApplicationTests.java | 44 ++++++++++++ 13 files changed, 467 insertions(+) create mode 100644 spring-cloud/spring-cloud-stream/pom.xml create mode 100644 spring-cloud/spring-cloud-stream/spring-cloud-stream-rabbit/pom.xml create mode 100644 spring-cloud/spring-cloud-stream/spring-cloud-stream-rabbit/src/main/java/com/baeldung/spring/cloud/stream/rabbit/MultipleOutputsServiceApplication.java create mode 100644 spring-cloud/spring-cloud-stream/spring-cloud-stream-rabbit/src/main/java/com/baeldung/spring/cloud/stream/rabbit/MultipleOutputsWithConditionsServiceApplication.java create mode 100644 spring-cloud/spring-cloud-stream/spring-cloud-stream-rabbit/src/main/java/com/baeldung/spring/cloud/stream/rabbit/MyLoggerServiceApplication.java create mode 100644 spring-cloud/spring-cloud-stream/spring-cloud-stream-rabbit/src/main/java/com/baeldung/spring/cloud/stream/rabbit/messages/TextPlainMessageConverter.java create mode 100644 spring-cloud/spring-cloud-stream/spring-cloud-stream-rabbit/src/main/java/com/baeldung/spring/cloud/stream/rabbit/model/LogMessage.java create mode 100644 spring-cloud/spring-cloud-stream/spring-cloud-stream-rabbit/src/main/java/com/baeldung/spring/cloud/stream/rabbit/processor/MyProcessor.java create mode 100644 spring-cloud/spring-cloud-stream/spring-cloud-stream-rabbit/src/main/resources/application.yml create mode 100644 spring-cloud/spring-cloud-stream/spring-cloud-stream-rabbit/src/test/java/com/baeldung/spring/cloud/stream/rabbit/MultipleOutputsServiceApplicationTests.java create mode 100644 spring-cloud/spring-cloud-stream/spring-cloud-stream-rabbit/src/test/java/com/baeldung/spring/cloud/stream/rabbit/MultipleOutputsWithConditionsServiceApplicationTests.java create mode 100644 spring-cloud/spring-cloud-stream/spring-cloud-stream-rabbit/src/test/java/com/baeldung/spring/cloud/stream/rabbit/MyLoggerApplicationTests.java diff --git a/spring-cloud/pom.xml b/spring-cloud/pom.xml index 44e72535f8..f3083f69b7 100644 --- a/spring-cloud/pom.xml +++ b/spring-cloud/pom.xml @@ -16,6 +16,7 @@ spring-cloud-rest spring-cloud-zookeeper spring-cloud-gateway + spring-cloud-stream pom @@ -37,6 +38,7 @@ 1.2.3.RELEASE 1.2.3.RELEASE 1.2.3.RELEASE + 1.3.0.RELEASE 1.4.2.RELEASE 3.6.0 1.4.2.RELEASE diff --git a/spring-cloud/spring-cloud-stream/pom.xml b/spring-cloud/spring-cloud-stream/pom.xml new file mode 100644 index 0000000000..352b52cc17 --- /dev/null +++ b/spring-cloud/spring-cloud-stream/pom.xml @@ -0,0 +1,70 @@ + + + 4.0.0 + + org.baeldung + spring-cloud-stream + + spring-cloud-stream-rabbit + + pom + + spring-cloud-stream + + + com.baeldung.spring.cloud + spring-cloud + 1.0.0-SNAPSHOT + + + + UTF-8 + 3.6.0 + + + + + + org.springframework.cloud + spring-cloud-starter-stream-rabbit + ${spring-cloud-stream.version} + + + + org.springframework.cloud + spring-cloud-stream + ${spring-cloud-stream.version} + + + + org.springframework.cloud + spring-cloud-stream-test-support + ${spring-cloud-stream.version} + test + + + + + + + + + org.apache.maven.plugins + maven-compiler-plugin + ${maven-compiler-plugin.version} + + 1.8 + 1.8 + + + + org.springframework.boot + spring-boot-maven-plugin + ${spring-boot-maven-plugin.version} + + + + + diff --git a/spring-cloud/spring-cloud-stream/spring-cloud-stream-rabbit/pom.xml b/spring-cloud/spring-cloud-stream/spring-cloud-stream-rabbit/pom.xml new file mode 100644 index 0000000000..9eede9e92c --- /dev/null +++ b/spring-cloud/spring-cloud-stream/spring-cloud-stream-rabbit/pom.xml @@ -0,0 +1,33 @@ + + + 4.0.0 + + spring-cloud-stream-rabbit + jar + + spring-cloud-stream-rabbit + Simple Spring Cloud Stream + + + org.baeldung + spring-cloud-stream + 1.0.0-SNAPSHOT + .. + + + + + + org.springframework.cloud + spring-cloud-starter-stream-rabbit + + + + org.springframework.cloud + spring-cloud-stream-test-support + test + + + + diff --git a/spring-cloud/spring-cloud-stream/spring-cloud-stream-rabbit/src/main/java/com/baeldung/spring/cloud/stream/rabbit/MultipleOutputsServiceApplication.java b/spring-cloud/spring-cloud-stream/spring-cloud-stream-rabbit/src/main/java/com/baeldung/spring/cloud/stream/rabbit/MultipleOutputsServiceApplication.java new file mode 100644 index 0000000000..375494dfac --- /dev/null +++ b/spring-cloud/spring-cloud-stream/spring-cloud-stream-rabbit/src/main/java/com/baeldung/spring/cloud/stream/rabbit/MultipleOutputsServiceApplication.java @@ -0,0 +1,38 @@ +package com.baeldung.spring.cloud.stream.rabbit; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.cloud.stream.annotation.EnableBinding; +import org.springframework.cloud.stream.annotation.StreamListener; +import org.springframework.messaging.Message; +import org.springframework.messaging.support.MessageBuilder; + +import com.baeldung.spring.cloud.stream.rabbit.processor.MyProcessor; + +@SpringBootApplication +@EnableBinding(MyProcessor.class) +public class MultipleOutputsServiceApplication { + public static void main(String[] args) { + SpringApplication.run(MultipleOutputsServiceApplication.class, args); + } + + @Autowired + private MyProcessor processor; + + @StreamListener(MyProcessor.INPUT) + public void routeValues(Integer val) { + if (val < 10) { + processor.anOutput() + .send(message(val)); + } else { + processor.anotherOutput() + .send(message(val)); + } + } + + private static final Message message(T val) { + return MessageBuilder.withPayload(val) + .build(); + } +} diff --git a/spring-cloud/spring-cloud-stream/spring-cloud-stream-rabbit/src/main/java/com/baeldung/spring/cloud/stream/rabbit/MultipleOutputsWithConditionsServiceApplication.java b/spring-cloud/spring-cloud-stream/spring-cloud-stream-rabbit/src/main/java/com/baeldung/spring/cloud/stream/rabbit/MultipleOutputsWithConditionsServiceApplication.java new file mode 100644 index 0000000000..4729e418b6 --- /dev/null +++ b/spring-cloud/spring-cloud-stream/spring-cloud-stream-rabbit/src/main/java/com/baeldung/spring/cloud/stream/rabbit/MultipleOutputsWithConditionsServiceApplication.java @@ -0,0 +1,39 @@ +package com.baeldung.spring.cloud.stream.rabbit; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.cloud.stream.annotation.EnableBinding; +import org.springframework.cloud.stream.annotation.StreamListener; +import org.springframework.messaging.Message; +import org.springframework.messaging.support.MessageBuilder; + +import com.baeldung.spring.cloud.stream.rabbit.processor.MyProcessor; + +@SpringBootApplication +@EnableBinding(MyProcessor.class) +public class MultipleOutputsWithConditionsServiceApplication { + public static void main(String[] args) { + SpringApplication.run(MultipleOutputsWithConditionsServiceApplication.class, args); + } + + @Autowired + private MyProcessor processor; + + @StreamListener(target = MyProcessor.INPUT, condition = "payload < 10") + public void routeValuesToAnOutput(Integer val) { + processor.anOutput() + .send(message(val)); + } + + @StreamListener(target = MyProcessor.INPUT, condition = "payload >= 10") + public void routeValuesToAnotherOutput(Integer val) { + processor.anotherOutput() + .send(message(val)); + } + + private static final Message message(T val) { + return MessageBuilder.withPayload(val) + .build(); + } +} diff --git a/spring-cloud/spring-cloud-stream/spring-cloud-stream-rabbit/src/main/java/com/baeldung/spring/cloud/stream/rabbit/MyLoggerServiceApplication.java b/spring-cloud/spring-cloud-stream/spring-cloud-stream-rabbit/src/main/java/com/baeldung/spring/cloud/stream/rabbit/MyLoggerServiceApplication.java new file mode 100644 index 0000000000..aac551e544 --- /dev/null +++ b/spring-cloud/spring-cloud-stream/spring-cloud-stream-rabbit/src/main/java/com/baeldung/spring/cloud/stream/rabbit/MyLoggerServiceApplication.java @@ -0,0 +1,32 @@ +package com.baeldung.spring.cloud.stream.rabbit; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.cloud.stream.annotation.EnableBinding; +import org.springframework.cloud.stream.annotation.StreamListener; +import org.springframework.cloud.stream.messaging.Processor; +import org.springframework.context.annotation.Bean; +import org.springframework.messaging.converter.MessageConverter; +import org.springframework.messaging.handler.annotation.SendTo; + +import com.baeldung.spring.cloud.stream.rabbit.messages.TextPlainMessageConverter; +import com.baeldung.spring.cloud.stream.rabbit.model.LogMessage; + +@SpringBootApplication +@EnableBinding(Processor.class) +public class MyLoggerServiceApplication { + public static void main(String[] args) { + SpringApplication.run(MyLoggerServiceApplication.class, args); + } + + @Bean + public MessageConverter providesTextPlainMessageConverter() { + return new TextPlainMessageConverter(); + } + + @StreamListener(Processor.INPUT) + @SendTo(Processor.OUTPUT) + public LogMessage enrichLogMessage(LogMessage log) { + return new LogMessage(String.format("[1]: %s", log.getMessage())); + } +} diff --git a/spring-cloud/spring-cloud-stream/spring-cloud-stream-rabbit/src/main/java/com/baeldung/spring/cloud/stream/rabbit/messages/TextPlainMessageConverter.java b/spring-cloud/spring-cloud-stream/spring-cloud-stream-rabbit/src/main/java/com/baeldung/spring/cloud/stream/rabbit/messages/TextPlainMessageConverter.java new file mode 100644 index 0000000000..d690ee38a9 --- /dev/null +++ b/spring-cloud/spring-cloud-stream/spring-cloud-stream-rabbit/src/main/java/com/baeldung/spring/cloud/stream/rabbit/messages/TextPlainMessageConverter.java @@ -0,0 +1,26 @@ +package com.baeldung.spring.cloud.stream.rabbit.messages; + +import org.springframework.messaging.Message; +import org.springframework.messaging.converter.AbstractMessageConverter; +import org.springframework.util.MimeType; + +import com.baeldung.spring.cloud.stream.rabbit.model.LogMessage; + +public class TextPlainMessageConverter extends AbstractMessageConverter { + + public TextPlainMessageConverter() { + super(new MimeType("text", "plain")); + } + + @Override + protected boolean supports(Class clazz) { + return (LogMessage.class == clazz); + } + + @Override + protected Object convertFromInternal(Message message, Class targetClass, Object conversionHint) { + Object payload = message.getPayload(); + String text = payload instanceof String ? (String) payload : new String((byte[]) payload); + return new LogMessage(text); + } +} diff --git a/spring-cloud/spring-cloud-stream/spring-cloud-stream-rabbit/src/main/java/com/baeldung/spring/cloud/stream/rabbit/model/LogMessage.java b/spring-cloud/spring-cloud-stream/spring-cloud-stream-rabbit/src/main/java/com/baeldung/spring/cloud/stream/rabbit/model/LogMessage.java new file mode 100644 index 0000000000..44a6ca4d4e --- /dev/null +++ b/spring-cloud/spring-cloud-stream/spring-cloud-stream-rabbit/src/main/java/com/baeldung/spring/cloud/stream/rabbit/model/LogMessage.java @@ -0,0 +1,32 @@ +package com.baeldung.spring.cloud.stream.rabbit.model; + +import java.io.Serializable; + +public class LogMessage implements Serializable { + + private static final long serialVersionUID = -5857383701708275796L; + + private String message; + + public LogMessage() { + + } + + public LogMessage(String message) { + this.message = message; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + @Override + public String toString() { + return message; + } + +} diff --git a/spring-cloud/spring-cloud-stream/spring-cloud-stream-rabbit/src/main/java/com/baeldung/spring/cloud/stream/rabbit/processor/MyProcessor.java b/spring-cloud/spring-cloud-stream/spring-cloud-stream-rabbit/src/main/java/com/baeldung/spring/cloud/stream/rabbit/processor/MyProcessor.java new file mode 100644 index 0000000000..563ce06b6f --- /dev/null +++ b/spring-cloud/spring-cloud-stream/spring-cloud-stream-rabbit/src/main/java/com/baeldung/spring/cloud/stream/rabbit/processor/MyProcessor.java @@ -0,0 +1,19 @@ +package com.baeldung.spring.cloud.stream.rabbit.processor; + +import org.springframework.cloud.stream.annotation.Input; +import org.springframework.cloud.stream.annotation.Output; +import org.springframework.messaging.MessageChannel; +import org.springframework.messaging.SubscribableChannel; + +public interface MyProcessor { + String INPUT = "myInput"; + + @Input + SubscribableChannel myInput(); + + @Output("myOutput") + MessageChannel anOutput(); + + @Output + MessageChannel anotherOutput(); +} diff --git a/spring-cloud/spring-cloud-stream/spring-cloud-stream-rabbit/src/main/resources/application.yml b/spring-cloud/spring-cloud-stream/spring-cloud-stream-rabbit/src/main/resources/application.yml new file mode 100644 index 0000000000..3d9d97a736 --- /dev/null +++ b/spring-cloud/spring-cloud-stream/spring-cloud-stream-rabbit/src/main/resources/application.yml @@ -0,0 +1,28 @@ +spring: + cloud: + stream: + bindings: + input: + destination: queue.log.messages + binder: local_rabbit + group: logMessageConsumers + output: + destination: queue.pretty.log.messages + binder: local_rabbit + binders: + local_rabbit: + type: rabbit + environment: + spring: + rabbitmq: + host: localhost + port: 5672 + username: guest + password: guest + virtual-host: / +server: + port: 0 +management: + health: + binders: + enabled: true \ No newline at end of file diff --git a/spring-cloud/spring-cloud-stream/spring-cloud-stream-rabbit/src/test/java/com/baeldung/spring/cloud/stream/rabbit/MultipleOutputsServiceApplicationTests.java b/spring-cloud/spring-cloud-stream/spring-cloud-stream-rabbit/src/test/java/com/baeldung/spring/cloud/stream/rabbit/MultipleOutputsServiceApplicationTests.java new file mode 100644 index 0000000000..18dcd8da7c --- /dev/null +++ b/spring-cloud/spring-cloud-stream/spring-cloud-stream-rabbit/src/test/java/com/baeldung/spring/cloud/stream/rabbit/MultipleOutputsServiceApplicationTests.java @@ -0,0 +1,52 @@ +package com.baeldung.spring.cloud.stream.rabbit; + +import static org.junit.Assert.assertEquals; + +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.cloud.stream.test.binder.MessageCollector; +import org.springframework.messaging.MessageChannel; +import org.springframework.messaging.support.MessageBuilder; +import org.springframework.test.annotation.DirtiesContext; +import org.springframework.test.context.ContextConfiguration; +import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; + +import com.baeldung.spring.cloud.stream.rabbit.processor.MyProcessor; + +@RunWith(SpringJUnit4ClassRunner.class) +@ContextConfiguration(classes = MultipleOutputsServiceApplication.class) +@DirtiesContext +public class MultipleOutputsServiceApplicationTests { + + @Autowired + private MyProcessor pipe; + + @Autowired + private MessageCollector messageCollector; + + @Test + public void shouldReceiveMessageInAnOutput() { + whenSendMessage(1); + thenPayloadInChannelIs(pipe.anOutput(), 1); + } + + @Test + public void shouldReceiveMessageInAnAnotherOutput() { + whenSendMessage(11); + thenPayloadInChannelIs(pipe.anotherOutput(), 11); + } + + private void whenSendMessage(Integer val) { + pipe.myInput() + .send(MessageBuilder.withPayload(val) + .build()); + } + + private void thenPayloadInChannelIs(MessageChannel channel, Integer expectedValue) { + Object payload = messageCollector.forChannel(channel) + .poll() + .getPayload(); + assertEquals(expectedValue, payload); + } +} diff --git a/spring-cloud/spring-cloud-stream/spring-cloud-stream-rabbit/src/test/java/com/baeldung/spring/cloud/stream/rabbit/MultipleOutputsWithConditionsServiceApplicationTests.java b/spring-cloud/spring-cloud-stream/spring-cloud-stream-rabbit/src/test/java/com/baeldung/spring/cloud/stream/rabbit/MultipleOutputsWithConditionsServiceApplicationTests.java new file mode 100644 index 0000000000..02638dea4c --- /dev/null +++ b/spring-cloud/spring-cloud-stream/spring-cloud-stream-rabbit/src/test/java/com/baeldung/spring/cloud/stream/rabbit/MultipleOutputsWithConditionsServiceApplicationTests.java @@ -0,0 +1,52 @@ +package com.baeldung.spring.cloud.stream.rabbit; + +import static org.junit.Assert.assertEquals; + +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.cloud.stream.test.binder.MessageCollector; +import org.springframework.messaging.MessageChannel; +import org.springframework.messaging.support.MessageBuilder; +import org.springframework.test.annotation.DirtiesContext; +import org.springframework.test.context.ContextConfiguration; +import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; + +import com.baeldung.spring.cloud.stream.rabbit.processor.MyProcessor; + +@RunWith(SpringJUnit4ClassRunner.class) +@ContextConfiguration(classes = MultipleOutputsWithConditionsServiceApplication.class) +@DirtiesContext +public class MultipleOutputsWithConditionsServiceApplicationTests { + + @Autowired + private MyProcessor pipe; + + @Autowired + private MessageCollector messageCollector; + + @Test + public void shouldReceiveMessageInAnOutput() { + whenSendMessage(1); + thenPayloadInChannelIs(pipe.anotherOutput(), 1); + } + + @Test + public void shouldReceiveMessageInAnAnotherOutput() { + whenSendMessage(11); + thenPayloadInChannelIs(pipe.anotherOutput(), 11); + } + + private void whenSendMessage(Integer val) { + pipe.myInput() + .send(MessageBuilder.withPayload(val) + .build()); + } + + private void thenPayloadInChannelIs(MessageChannel channel, Integer expectedValue) { + Object payload = messageCollector.forChannel(channel) + .poll() + .getPayload(); + assertEquals(expectedValue, payload); + } +} diff --git a/spring-cloud/spring-cloud-stream/spring-cloud-stream-rabbit/src/test/java/com/baeldung/spring/cloud/stream/rabbit/MyLoggerApplicationTests.java b/spring-cloud/spring-cloud-stream/spring-cloud-stream-rabbit/src/test/java/com/baeldung/spring/cloud/stream/rabbit/MyLoggerApplicationTests.java new file mode 100644 index 0000000000..d004987929 --- /dev/null +++ b/spring-cloud/spring-cloud-stream/spring-cloud-stream-rabbit/src/test/java/com/baeldung/spring/cloud/stream/rabbit/MyLoggerApplicationTests.java @@ -0,0 +1,44 @@ +package com.baeldung.spring.cloud.stream.rabbit; + +import static org.junit.Assert.assertEquals; + +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.cloud.stream.messaging.Processor; +import org.springframework.cloud.stream.test.binder.MessageCollector; +import org.springframework.messaging.support.MessageBuilder; +import org.springframework.test.annotation.DirtiesContext; +import org.springframework.test.context.ContextConfiguration; +import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; + +import com.baeldung.spring.cloud.stream.rabbit.MyLoggerServiceApplication; +import com.baeldung.spring.cloud.stream.rabbit.model.LogMessage; + +@RunWith(SpringJUnit4ClassRunner.class) +@ContextConfiguration(classes = MyLoggerServiceApplication.class) +@DirtiesContext +public class MyLoggerApplicationTests { + + @Autowired + private Processor pipe; + + @Autowired + private MessageCollector messageCollector; + + @Test + public void shouldEnrichMessage() { + // Send message + pipe.input() + .send(MessageBuilder.withPayload(new LogMessage("This is my message")) + .build()); + + // Get response from the service + Object payload = messageCollector.forChannel(pipe.output()) + .poll() + .getPayload(); + + // Assert + assertEquals("[1]: This is my message", payload.toString()); + } +} From efc58b5b79d25b0a3624da95a9ef6c200bd6d830 Mon Sep 17 00:00:00 2001 From: Dassi Orleando Date: Mon, 9 Oct 2017 17:31:54 +0100 Subject: [PATCH 067/236] BAEL-1157: Update list of author names --- .../apachecayenne/CayenneAdvancedOperationTests.java | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/apache-cayenne/src/test/java/com/baeldung/apachecayenne/CayenneAdvancedOperationTests.java b/apache-cayenne/src/test/java/com/baeldung/apachecayenne/CayenneAdvancedOperationTests.java index ddfe9325d3..cd563b6270 100644 --- a/apache-cayenne/src/test/java/com/baeldung/apachecayenne/CayenneAdvancedOperationTests.java +++ b/apache-cayenne/src/test/java/com/baeldung/apachecayenne/CayenneAdvancedOperationTests.java @@ -151,20 +151,20 @@ public class CayenneAdvancedOperationTests { @Test public void givenTwoAuthor_whenInObjS_thenWeGetAuthors() { - String [] args = {"Paul Xavier", "pAuL Smith", "Vicky Sarra"}; + List names = Arrays.asList("Paul Xavier", "pAuL Smith", "Vicky Sarra"); List authors = ObjectSelect.query(Author.class) - .where(Author.NAME.in(Arrays.asList(args))) - .select(context); + .where(Author.NAME.in(names)) + .select(context); assertEquals(authors.size(), 3); } @Test public void givenTwoAuthor_whenNinObjS_thenWeGetAuthors() { - String [] args = {"Paul Xavier", "pAuL Smith"}; + List names = Arrays.asList("Paul Xavier", "pAuL Smith"); List authors = ObjectSelect.query(Author.class) - .where(Author.NAME.nin(Arrays.asList(args))) - .select(context); + .where(Author.NAME.nin(names)) + .select(context); Author author = authors.get(0); assertEquals(authors.size(), 1); From e8979a40336ebacd60aaee3a9363b7ebf7683279 Mon Sep 17 00:00:00 2001 From: Jose Carvajal Date: Wed, 11 Oct 2017 12:11:38 +0200 Subject: [PATCH 068/236] Pull request changes done --- spring-cloud/spring-cloud-stream/pom.xml | 120 +++++++++--------- .../spring-cloud-stream-rabbit/pom.xml | 11 +- ...ultipleOutputsServiceApplicationTests.java | 4 +- ...WithConditionsServiceApplicationTests.java | 4 +- .../rabbit/MyLoggerApplicationTests.java | 6 +- 5 files changed, 70 insertions(+), 75 deletions(-) diff --git a/spring-cloud/spring-cloud-stream/pom.xml b/spring-cloud/spring-cloud-stream/pom.xml index 352b52cc17..2104ba1827 100644 --- a/spring-cloud/spring-cloud-stream/pom.xml +++ b/spring-cloud/spring-cloud-stream/pom.xml @@ -1,70 +1,70 @@ - 4.0.0 + xmlns="http://maven.apache.org/POM/4.0.0" + xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> + 4.0.0 - org.baeldung - spring-cloud-stream - - spring-cloud-stream-rabbit - - pom + org.baeldung + spring-cloud-stream + + spring-cloud-stream-rabbit + + pom - spring-cloud-stream + spring-cloud-stream - - com.baeldung.spring.cloud - spring-cloud - 1.0.0-SNAPSHOT - + + com.baeldung.spring.cloud + spring-cloud + 1.0.0-SNAPSHOT + - - UTF-8 - 3.6.0 - + + UTF-8 + 3.6.0 + - - - - org.springframework.cloud - spring-cloud-starter-stream-rabbit - ${spring-cloud-stream.version} - - - - org.springframework.cloud - spring-cloud-stream - ${spring-cloud-stream.version} - + + + + org.springframework.cloud + spring-cloud-starter-stream-rabbit + ${spring-cloud-stream.version} + + + + org.springframework.cloud + spring-cloud-stream + ${spring-cloud-stream.version} + - - org.springframework.cloud - spring-cloud-stream-test-support - ${spring-cloud-stream.version} - test - - - + + org.springframework.cloud + spring-cloud-stream-test-support + ${spring-cloud-stream.version} + test + + + - - - - - org.apache.maven.plugins - maven-compiler-plugin - ${maven-compiler-plugin.version} - - 1.8 - 1.8 - - - - org.springframework.boot - spring-boot-maven-plugin - ${spring-boot-maven-plugin.version} - - - - + + + + + org.apache.maven.plugins + maven-compiler-plugin + ${maven-compiler-plugin.version} + + 1.8 + 1.8 + + + + org.springframework.boot + spring-boot-maven-plugin + ${spring-boot-maven-plugin.version} + + + + diff --git a/spring-cloud/spring-cloud-stream/spring-cloud-stream-rabbit/pom.xml b/spring-cloud/spring-cloud-stream/spring-cloud-stream-rabbit/pom.xml index 9eede9e92c..a954a7035e 100644 --- a/spring-cloud/spring-cloud-stream/spring-cloud-stream-rabbit/pom.xml +++ b/spring-cloud/spring-cloud-stream/spring-cloud-stream-rabbit/pom.xml @@ -17,17 +17,16 @@ - org.springframework.cloud - spring-cloud-starter-stream-rabbit + spring-cloud-starter-stream-rabbit - org.springframework.cloud - spring-cloud-stream-test-support - test - + org.springframework.cloud + spring-cloud-stream-test-support + test + diff --git a/spring-cloud/spring-cloud-stream/spring-cloud-stream-rabbit/src/test/java/com/baeldung/spring/cloud/stream/rabbit/MultipleOutputsServiceApplicationTests.java b/spring-cloud/spring-cloud-stream/spring-cloud-stream-rabbit/src/test/java/com/baeldung/spring/cloud/stream/rabbit/MultipleOutputsServiceApplicationTests.java index 18dcd8da7c..196d4f0d23 100644 --- a/spring-cloud/spring-cloud-stream/spring-cloud-stream-rabbit/src/test/java/com/baeldung/spring/cloud/stream/rabbit/MultipleOutputsServiceApplicationTests.java +++ b/spring-cloud/spring-cloud-stream/spring-cloud-stream-rabbit/src/test/java/com/baeldung/spring/cloud/stream/rabbit/MultipleOutputsServiceApplicationTests.java @@ -26,13 +26,13 @@ public class MultipleOutputsServiceApplicationTests { private MessageCollector messageCollector; @Test - public void shouldReceiveMessageInAnOutput() { + public void whenSendMessage_thenResponseIsInAOutput() { whenSendMessage(1); thenPayloadInChannelIs(pipe.anOutput(), 1); } @Test - public void shouldReceiveMessageInAnAnotherOutput() { + public void whenSendMessage_thenResponseIsInAnotherOutput() { whenSendMessage(11); thenPayloadInChannelIs(pipe.anotherOutput(), 11); } diff --git a/spring-cloud/spring-cloud-stream/spring-cloud-stream-rabbit/src/test/java/com/baeldung/spring/cloud/stream/rabbit/MultipleOutputsWithConditionsServiceApplicationTests.java b/spring-cloud/spring-cloud-stream/spring-cloud-stream-rabbit/src/test/java/com/baeldung/spring/cloud/stream/rabbit/MultipleOutputsWithConditionsServiceApplicationTests.java index 02638dea4c..a74ee61be6 100644 --- a/spring-cloud/spring-cloud-stream/spring-cloud-stream-rabbit/src/test/java/com/baeldung/spring/cloud/stream/rabbit/MultipleOutputsWithConditionsServiceApplicationTests.java +++ b/spring-cloud/spring-cloud-stream/spring-cloud-stream-rabbit/src/test/java/com/baeldung/spring/cloud/stream/rabbit/MultipleOutputsWithConditionsServiceApplicationTests.java @@ -26,13 +26,13 @@ public class MultipleOutputsWithConditionsServiceApplicationTests { private MessageCollector messageCollector; @Test - public void shouldReceiveMessageInAnOutput() { + public void whenSendMessage_thenResponseIsInAOutput() { whenSendMessage(1); thenPayloadInChannelIs(pipe.anotherOutput(), 1); } @Test - public void shouldReceiveMessageInAnAnotherOutput() { + public void whenSendMessage_thenResponseIsInAnotherOutput() { whenSendMessage(11); thenPayloadInChannelIs(pipe.anotherOutput(), 11); } diff --git a/spring-cloud/spring-cloud-stream/spring-cloud-stream-rabbit/src/test/java/com/baeldung/spring/cloud/stream/rabbit/MyLoggerApplicationTests.java b/spring-cloud/spring-cloud-stream/spring-cloud-stream-rabbit/src/test/java/com/baeldung/spring/cloud/stream/rabbit/MyLoggerApplicationTests.java index d004987929..b939af25fc 100644 --- a/spring-cloud/spring-cloud-stream/spring-cloud-stream-rabbit/src/test/java/com/baeldung/spring/cloud/stream/rabbit/MyLoggerApplicationTests.java +++ b/spring-cloud/spring-cloud-stream/spring-cloud-stream-rabbit/src/test/java/com/baeldung/spring/cloud/stream/rabbit/MyLoggerApplicationTests.java @@ -12,7 +12,6 @@ import org.springframework.test.annotation.DirtiesContext; import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; -import com.baeldung.spring.cloud.stream.rabbit.MyLoggerServiceApplication; import com.baeldung.spring.cloud.stream.rabbit.model.LogMessage; @RunWith(SpringJUnit4ClassRunner.class) @@ -27,18 +26,15 @@ public class MyLoggerApplicationTests { private MessageCollector messageCollector; @Test - public void shouldEnrichMessage() { - // Send message + public void whenSendMessage_thenResponseShouldUpdateText() { pipe.input() .send(MessageBuilder.withPayload(new LogMessage("This is my message")) .build()); - // Get response from the service Object payload = messageCollector.forChannel(pipe.output()) .poll() .getPayload(); - // Assert assertEquals("[1]: This is my message", payload.toString()); } } From 44fa64e29fed5a59d8a2c26d7498defb9084a8a7 Mon Sep 17 00:00:00 2001 From: Ahmed Tawila Date: Sat, 14 Oct 2017 05:59:37 +0200 Subject: [PATCH 069/236] BAEL-1171 String.lang.String API --- .../java/com/baeldung/string/StringTest.java | 186 ++++++++++++++++++ 1 file changed, 186 insertions(+) diff --git a/core-java/src/test/java/com/baeldung/string/StringTest.java b/core-java/src/test/java/com/baeldung/string/StringTest.java index fd83c903a3..324f4690fc 100644 --- a/core-java/src/test/java/com/baeldung/string/StringTest.java +++ b/core-java/src/test/java/com/baeldung/string/StringTest.java @@ -2,6 +2,13 @@ package com.baeldung.string; import static org.junit.Assert.assertArrayEquals; import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertTrue; +import static org.junit.Assert.assertFalse; + +import java.nio.charset.Charset; +import java.nio.charset.StandardCharsets; +import java.util.IllegalFormatException; +import java.util.regex.PatternSyntaxException; import org.junit.Test; @@ -12,6 +19,11 @@ public class StringTest { assertEquals(97, "abcd".codePointAt(0)); } + @Test(expected = StringIndexOutOfBoundsException.class) + public void whenPassNonExistingIndex_thenExceptionThrown() { + int a = "abcd".codePointAt(4); + } + @Test public void whenCallConcat_thenCorrect() { assertEquals("elephant", "elep".concat("hant")); @@ -21,6 +33,180 @@ public class StringTest { public void whenGetBytes_thenCorrect() { byte[] byteArray = "abcd".getBytes(); byte[] expected = new byte[] { 97, 98, 99, 100 }; + assertArrayEquals(expected, byteArray); } + + @Test + public void whenGetBytesUsingUTF16_thenCorrect() { + byte[] byteArray = "efgh".getBytes(StandardCharsets.US_ASCII); + byte[] expected = new byte[] { 101, 102, 103, 104 }; + + assertArrayEquals(expected, byteArray); + } + + @Test + public void whenCreateStringUsingByteArray_thenCorrect() { + byte[] array = new byte[] { 97, 98, 99, 100 }; + String s = new String(array); + + assertEquals("abcd", s); + } + + @Test + public void whenCallCharAt_thenCorrect() { + assertEquals('P', "Paul".charAt(0)); + } + + @Test(expected = IndexOutOfBoundsException.class) + public void whenCharAtOnNonExistingIndex_thenIndexOutOfBoundsExceptionThrown() { + char character = "Paul".charAt(4); + } + + @Test + public void whenCallCodePointCount_thenCorrect() { + assertEquals(2, "abcd".codePointCount(0, 2)); + } + + @Test(expected = IndexOutOfBoundsException.class) + public void whenSecondIndexEqualToLengthOfString_thenIndexOutOfBoundsExceptionThrown() { + char character = "Paul".charAt(4); + } + + @Test + public void whenCallContains_thenCorrect() { + String s = "abcd"; + + assertTrue(s.contains("abc")); + assertFalse(s.contains("cde")); + } + + @Test + public void whenCallCopyValueOf_thenStringConstructed() { + char[] array = new char[] { 'a', 'b', 'c', 'd' }; + + assertEquals("abcd", String.copyValueOf(array)); + } + + @Test + public void whenCallEndsWith_thenCorrect() { + String s1 = "test"; + + assertTrue(s1.endsWith("t")); + } + + @Test + public void whenFormat_thenCorrect() { + String value = "Baeldung"; + String formatted = String.format("Welcome to %s!", value); + + assertEquals("Welcome to Baeldung!", formatted); + } + + @Test(expected = IllegalFormatException.class) + public void whenInvalidFormatSyntax_thenIllegalFormatExceptionThrown() { + String value = "Baeldung"; + String formatted = String.format("Welcome to %x!", value); + } + + @Test + public void whenCallIndexOf_thenCorrect() { + assertEquals(1, "foo".indexOf("o")); + } + + @Test + public void whenCallIsEmpty_thenCorrect() { + String s1 = ""; + + assertTrue(s1.isEmpty()); + } + + @Test + public void whenCallLastIndexOf_thenCorrect() { + assertEquals(2, "foo".lastIndexOf("o")); + } + + @Test + public void whenCallRegionMatches_thenCorrect() { + assertTrue("welcome to baeldung".regionMatches(false, 11, "baeldung", 0, 8)); + } + + @Test + public void whenCallStartsWith_thenCorrect() { + assertTrue("foo".startsWith("f")); + } + + @Test + public void whenTrim_thenCorrect() { + assertEquals("foo", " foo ".trim()); + } + + @Test + public void whenSplit_thenCorrect() { + String s = "Welcome to Baeldung"; + String[] array = new String[] { "Welcome", "to", "Baeldung" }; + + assertArrayEquals(array, s.split(" ")); + } + + @Test(expected = PatternSyntaxException.class) + public void whenPassInvalidParameterToSplit_thenPatternSyntaxExceptionThrown() { + String s = "Welcome*to Baeldung"; + + String[] result = s.split("*"); + } + + @Test + public void whenCallSubstring_thenCorrect() { + String s = "Welcome to Baeldung"; + + assertEquals("Welcome", s.substring(0, 7)); + } + + @Test(expected = IndexOutOfBoundsException.class) + public void whenSecondIndexEqualToLengthOfString_thenCorrect() { + String s = "Welcome to Baeldung"; + + String sub = s.substring(0, 20); + } + + @Test + public void whenConvertToUpperCase_thenCorrect() { + String s = "Welcome to Baeldung!"; + + assertEquals("WELCOME TO BAELDUNG!", s.toUpperCase()); + } + + @Test + public void whenConvertToLowerCase_thenCorrect() { + String s = "WELCOME to BAELDUNG!"; + + assertEquals("welcome to baeldung!", s.toLowerCase()); + } + + @Test + public void whenCallReplace_thenCorrect() { + String s = "I learn Spanish"; + + assertEquals("I learn French", s.replaceAll("Spanish", "French")); + } + + @Test + public void whenIntern_thenCorrect() { + String s1 = "abc"; + String s2 = new String("abc"); + String s3 = new String("foo"); + String s4 = s1.intern(); + String s5 = s2.intern(); + + assertFalse(s3 == s4); + assertTrue(s1 == s5); + } + + @Test + public void whenCallValueOf_thenCorrect() { + long l = 200L; + + assertEquals("200", String.valueOf(l)); + } } From 82fde89335c1abe44cb65e7625bbdb8ca4f8c629 Mon Sep 17 00:00:00 2001 From: Ahmed Tawila Date: Sun, 15 Oct 2017 12:38:54 +0200 Subject: [PATCH 070/236] BAEL-1171 java.lang.String API --- .../src/test/java/com/baeldung/string/StringTest.java | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/core-java/src/test/java/com/baeldung/string/StringTest.java b/core-java/src/test/java/com/baeldung/string/StringTest.java index 324f4690fc..5bb4de27ee 100644 --- a/core-java/src/test/java/com/baeldung/string/StringTest.java +++ b/core-java/src/test/java/com/baeldung/string/StringTest.java @@ -38,7 +38,7 @@ public class StringTest { } @Test - public void whenGetBytesUsingUTF16_thenCorrect() { + public void whenGetBytesUsingASCII_thenCorrect() { byte[] byteArray = "efgh".getBytes(StandardCharsets.US_ASCII); byte[] expected = new byte[] { 101, 102, 103, 104 }; @@ -155,6 +155,13 @@ public class StringTest { String[] result = s.split("*"); } + + @Test + public void whenCallSubSequence_thenCorrect() { + String s = "Welcome to Baeldung"; + + assertEquals("Welcome", s.subSequence(0, 7)); + } @Test public void whenCallSubstring_thenCorrect() { From c3a2179b9bcfb07fb3603cfc76be735e8924e41c Mon Sep 17 00:00:00 2001 From: Dassi Orleando Date: Sun, 22 Oct 2017 03:45:08 +0100 Subject: [PATCH 071/236] BAEL-132: Configure Jenkins to Run and Show Jmeter Tests --- pom.xml | 1 + spring-jmeter-jenkins | 1 + 2 files changed, 2 insertions(+) create mode 160000 spring-jmeter-jenkins diff --git a/pom.xml b/pom.xml index c3915e4fce..996ca91f2e 100644 --- a/pom.xml +++ b/pom.xml @@ -168,6 +168,7 @@ spring-hibernate5 spring-integration spring-jersey + spring-jmeter-jenkins spring-jms spring-jooq spring-jpa diff --git a/spring-jmeter-jenkins b/spring-jmeter-jenkins new file mode 160000 index 0000000000..a1b44b4c48 --- /dev/null +++ b/spring-jmeter-jenkins @@ -0,0 +1 @@ +Subproject commit a1b44b4c487164577be3c7eb4bf215d39a0700df From fdd485ddd91a42ba07ae33e6f94bee8a6ea1e507 Mon Sep 17 00:00:00 2001 From: Ahmed Tawila Date: Sun, 22 Oct 2017 10:48:39 +0200 Subject: [PATCH 072/236] BAEL-1250 Initializing Arrays in Java --- .../com/baeldung/array/ArrayInitializer.java | 48 +++++++++++++++++++ .../baeldung/array/ArrayInitializerTest.java | 48 +++++++++++++++++++ 2 files changed, 96 insertions(+) create mode 100644 core-java/src/main/java/com/baeldung/array/ArrayInitializer.java create mode 100644 core-java/src/test/java/com/baeldung/array/ArrayInitializerTest.java diff --git a/core-java/src/main/java/com/baeldung/array/ArrayInitializer.java b/core-java/src/main/java/com/baeldung/array/ArrayInitializer.java new file mode 100644 index 0000000000..0c9bf1834e --- /dev/null +++ b/core-java/src/main/java/com/baeldung/array/ArrayInitializer.java @@ -0,0 +1,48 @@ +package com.baeldung.array; + +import java.util.Arrays; + +public class ArrayInitializer { + + public static int[] initializeArrayInLoop() { + int array[] = new int[5]; + for (int i = 0; i < array.length; i++) + array[i] = i + 2; + return array; + } + + public static int[][] initializeMultiDimensionalArrayInLoop() { + int array[][] = new int[2][5]; + for (int i = 0; i < 2; i++) + for (int j = 0; j < 5; j++) + array[i][j] = j + 1; + return array; + } + + public static String[] initializeArrayAtTimeOfDeclarationMethod1() { + String array[] = new String[] { "Toyota", "Mercedes", "BMW", "Volkswagen", "Skoda" }; + return array; + } + + public static int[] initializeArrayAtTimeOfDeclarationMethod2() { + int[] array = new int[] { 1, 2, 3, 4, 5 }; + return array; + } + + public static int[] initializeArrayAtTimeOfDeclarationMethod3() { + int array[] = { 1, 2, 3, 4, 5 }; + return array; + } + + public static long[] initializeArrayUsingArraysFill() { + long array[] = new long[5]; + Arrays.fill(array, 30); + return array; + } + + public static int[] initializeArrayRangeUsingArraysFill() { + int array[] = new int[5]; + Arrays.fill(array, 0, 3, -50); + return array; + } +} diff --git a/core-java/src/test/java/com/baeldung/array/ArrayInitializerTest.java b/core-java/src/test/java/com/baeldung/array/ArrayInitializerTest.java new file mode 100644 index 0000000000..0797a524c4 --- /dev/null +++ b/core-java/src/test/java/com/baeldung/array/ArrayInitializerTest.java @@ -0,0 +1,48 @@ +package com.baeldung.array; + +import static com.baeldung.array.ArrayInitializer.initializeArrayAtTimeOfDeclarationMethod1; +import static com.baeldung.array.ArrayInitializer.initializeArrayAtTimeOfDeclarationMethod2; +import static com.baeldung.array.ArrayInitializer.initializeArrayAtTimeOfDeclarationMethod3; +import static com.baeldung.array.ArrayInitializer.initializeArrayInLoop; +import static com.baeldung.array.ArrayInitializer.initializeArrayRangeUsingArraysFill; +import static com.baeldung.array.ArrayInitializer.initializeArrayUsingArraysFill; +import static com.baeldung.array.ArrayInitializer.initializeMultiDimensionalArrayInLoop; +import static org.junit.Assert.assertArrayEquals; + +import org.junit.Test; + +public class ArrayInitializerTest { + + @Test + public void whenInitializeArrayInLoop_thenCorrect() { + assertArrayEquals(new int[] { 2, 3, 4, 5, 6 }, initializeArrayInLoop()); + } + + @Test + public void whenInitializeMultiDimensionalArrayInLoop_thenCorrect() { + assertArrayEquals(new int[][] { { 1, 2, 3, 4, 5 }, { 1, 2, 3, 4, 5 } }, initializeMultiDimensionalArrayInLoop()); + } + + @Test + public void whenInitializeArrayAtTimeOfDeclarationMethod1_thenCorrect() { + assertArrayEquals(new String[] { "Toyota", "Mercedes", "BMW", "Volkswagen", "Skoda" }, initializeArrayAtTimeOfDeclarationMethod1()); + } + + @Test + public void whenInitializeArrayAtTimeOfDeclarationMethod2_thenCorrect() { + assertArrayEquals(new int[] { 1, 2, 3, 4, 5 }, initializeArrayAtTimeOfDeclarationMethod2()); + } + + @Test + public void whenInitializeArrayAtTimeOfDeclarationMethod3_thenCorrect() { + assertArrayEquals(new int[] { 1, 2, 3, 4, 5 }, initializeArrayAtTimeOfDeclarationMethod3()); + } + + public void whenInitializeArrayUsingArraysFill_thenCorrect() { + assertArrayEquals(new long[] { 30, 30, 30, 30, 30 }, initializeArrayUsingArraysFill()); + } + + public void whenInitializeArrayRangeUsingArraysFill() { + assertArrayEquals(new int[] { -50, -50, -50, 0, 0 }, initializeArrayRangeUsingArraysFill()); + } +} From 0623fb5b172c5637b93627d02b4ad218d83d8075 Mon Sep 17 00:00:00 2001 From: Dassi Orleando Date: Sun, 22 Oct 2017 16:14:18 +0100 Subject: [PATCH 073/236] Removed submodule spring-jmeter-jenkins --- spring-jmeter-jenkins | 1 - 1 file changed, 1 deletion(-) delete mode 160000 spring-jmeter-jenkins diff --git a/spring-jmeter-jenkins b/spring-jmeter-jenkins deleted file mode 160000 index a1b44b4c48..0000000000 --- a/spring-jmeter-jenkins +++ /dev/null @@ -1 +0,0 @@ -Subproject commit a1b44b4c487164577be3c7eb4bf215d39a0700df From 3d0fe787cfaee47105b1b1305bc376afec6aeabd Mon Sep 17 00:00:00 2001 From: Dassi Orleando Date: Sun, 22 Oct 2017 16:15:50 +0100 Subject: [PATCH 074/236] Commit again spring-jmeter-jenkins --- spring-jmeter-jenkins/.gitignore | 24 ++ .../.mvn/wrapper/maven-wrapper.jar | Bin 0 -> 49502 bytes .../.mvn/wrapper/maven-wrapper.properties | 1 + spring-jmeter-jenkins/README.md | 55 +++++ spring-jmeter-jenkins/mvnw | 233 ++++++++++++++++++ spring-jmeter-jenkins/mvnw.cmd | 145 +++++++++++ spring-jmeter-jenkins/pom.xml | 52 ++++ .../SpringJMeterJenkinsApplication.java | 13 + .../java/com/baeldung/domain/Student.java | 66 +++++ .../repository/StudentRepository.java | 7 + .../src/main/resources/JMeter-Jenkins.jmx | 96 ++++++++ .../src/main/resources/application.properties | 14 ++ .../SpringJMeterJenkinsApplicationTests.java | 16 ++ 13 files changed, 722 insertions(+) create mode 100644 spring-jmeter-jenkins/.gitignore create mode 100644 spring-jmeter-jenkins/.mvn/wrapper/maven-wrapper.jar create mode 100644 spring-jmeter-jenkins/.mvn/wrapper/maven-wrapper.properties create mode 100644 spring-jmeter-jenkins/README.md create mode 100755 spring-jmeter-jenkins/mvnw create mode 100644 spring-jmeter-jenkins/mvnw.cmd create mode 100644 spring-jmeter-jenkins/pom.xml create mode 100644 spring-jmeter-jenkins/src/main/java/com/baeldung/SpringJMeterJenkinsApplication.java create mode 100644 spring-jmeter-jenkins/src/main/java/com/baeldung/domain/Student.java create mode 100644 spring-jmeter-jenkins/src/main/java/com/baeldung/repository/StudentRepository.java create mode 100644 spring-jmeter-jenkins/src/main/resources/JMeter-Jenkins.jmx create mode 100644 spring-jmeter-jenkins/src/main/resources/application.properties create mode 100644 spring-jmeter-jenkins/src/test/java/com/baeldung/SpringJMeterJenkinsApplicationTests.java diff --git a/spring-jmeter-jenkins/.gitignore b/spring-jmeter-jenkins/.gitignore new file mode 100644 index 0000000000..2af7cefb0a --- /dev/null +++ b/spring-jmeter-jenkins/.gitignore @@ -0,0 +1,24 @@ +target/ +!.mvn/wrapper/maven-wrapper.jar + +### STS ### +.apt_generated +.classpath +.factorypath +.project +.settings +.springBeans + +### IntelliJ IDEA ### +.idea +*.iws +*.iml +*.ipr + +### NetBeans ### +nbproject/private/ +build/ +nbbuild/ +dist/ +nbdist/ +.nb-gradle/ \ No newline at end of file diff --git a/spring-jmeter-jenkins/.mvn/wrapper/maven-wrapper.jar b/spring-jmeter-jenkins/.mvn/wrapper/maven-wrapper.jar new file mode 100644 index 0000000000000000000000000000000000000000..5fd4d5023f1463b5ba3970e33c460c1eb26d748d GIT binary patch literal 49502 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%0A$pwhjXzyA0ZzErH{1@M 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 OJOEd-=rxTO#Qy`$*1Hh^ literal 0 HcmV?d00001 diff --git a/spring-jmeter-jenkins/.mvn/wrapper/maven-wrapper.properties b/spring-jmeter-jenkins/.mvn/wrapper/maven-wrapper.properties new file mode 100644 index 0000000000..c954cec91c --- /dev/null +++ b/spring-jmeter-jenkins/.mvn/wrapper/maven-wrapper.properties @@ -0,0 +1 @@ +distributionUrl=https://repo1.maven.org/maven2/org/apache/maven/apache-maven/3.3.9/apache-maven-3.3.9-bin.zip diff --git a/spring-jmeter-jenkins/README.md b/spring-jmeter-jenkins/README.md new file mode 100644 index 0000000000..49c18122a2 --- /dev/null +++ b/spring-jmeter-jenkins/README.md @@ -0,0 +1,55 @@ +BASIC CRUD API with Spring Boot +================================ + +This is the code of a simple API for some CRUD operations realised for a seminar at [FGI](www.fgi-ud.org) using Spring Boot. + +### Demo +* API: The online version **is**/**will be** hosted here: https://fgi-tcheck.herokuapp.com +* Mobile version is also opensource and located here: https://github.com/valdesekamdem/tcheck-mobile + +### Features +#### Currently Implemented +* CRUD + * Student + +#### To DO +* Validations of input with: [Spring Data Rest Validators](http://docs.spring.io/spring-data/rest/docs/2.1.0.RELEASE/reference/html/validation-chapter.html) + + +### Requirements + +- Maven +- JDK 8 +- MongoDB + +### Running + +To build and start the server simply type + +```bash +$ mvn clean install +$ mvn spring-boot:run -Dserver.port=8989 +``` + +### Available CRUD + +You can see what crud operation are available using curl: + +```bash +$ curl localhost:8080 +``` +You can view existing student objects with this command: + +```bash +$ curl localhost:8080/students +``` +Or create a new one via a POST: + +```bash +$ curl -X POST -H "Content-Type:application/json" -d '{ "firstName" : "Dassi", "lastName" : "Orleando", "phoneNumber": "+237 545454545", "email": "mymail@yahoo.fr" }' localhost:8080/students +``` + + +Now with default configurations it will be available at: [http://localhost:8080](http://localhost:8080) + +Enjoy it :) \ No newline at end of file diff --git a/spring-jmeter-jenkins/mvnw b/spring-jmeter-jenkins/mvnw new file mode 100755 index 0000000000..a1ba1bf554 --- /dev/null +++ b/spring-jmeter-jenkins/mvnw @@ -0,0 +1,233 @@ +#!/bin/sh +# ---------------------------------------------------------------------------- +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. +# ---------------------------------------------------------------------------- + +# ---------------------------------------------------------------------------- +# Maven2 Start Up Batch script +# +# Required ENV vars: +# ------------------ +# JAVA_HOME - location of a JDK home dir +# +# Optional ENV vars +# ----------------- +# M2_HOME - location of maven2's installed home dir +# MAVEN_OPTS - parameters passed to the Java VM when running Maven +# e.g. to debug Maven itself, use +# set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000 +# MAVEN_SKIP_RC - flag to disable loading of mavenrc files +# ---------------------------------------------------------------------------- + +if [ -z "$MAVEN_SKIP_RC" ] ; then + + if [ -f /etc/mavenrc ] ; then + . /etc/mavenrc + fi + + if [ -f "$HOME/.mavenrc" ] ; then + . "$HOME/.mavenrc" + fi + +fi + +# OS specific support. $var _must_ be set to either true or false. +cygwin=false; +darwin=false; +mingw=false +case "`uname`" in + CYGWIN*) cygwin=true ;; + MINGW*) mingw=true;; + Darwin*) darwin=true + # + # Look for the Apple JDKs first to preserve the existing behaviour, and then look + # for the new JDKs provided by Oracle. + # + if [ -z "$JAVA_HOME" ] && [ -L /System/Library/Frameworks/JavaVM.framework/Versions/CurrentJDK ] ; then + # + # Apple JDKs + # + export JAVA_HOME=/System/Library/Frameworks/JavaVM.framework/Versions/CurrentJDK/Home + fi + + if [ -z "$JAVA_HOME" ] && [ -L /System/Library/Java/JavaVirtualMachines/CurrentJDK ] ; then + # + # Apple JDKs + # + export JAVA_HOME=/System/Library/Java/JavaVirtualMachines/CurrentJDK/Contents/Home + fi + + if [ -z "$JAVA_HOME" ] && [ -L "/Library/Java/JavaVirtualMachines/CurrentJDK" ] ; then + # + # Oracle JDKs + # + export JAVA_HOME=/Library/Java/JavaVirtualMachines/CurrentJDK/Contents/Home + fi + + if [ -z "$JAVA_HOME" ] && [ -x "/usr/libexec/java_home" ]; then + # + # Apple JDKs + # + export JAVA_HOME=`/usr/libexec/java_home` + fi + ;; +esac + +if [ -z "$JAVA_HOME" ] ; then + if [ -r /etc/gentoo-release ] ; then + JAVA_HOME=`java-config --jre-home` + fi +fi + +if [ -z "$M2_HOME" ] ; then + ## resolve links - $0 may be a link to maven's home + PRG="$0" + + # need this for relative symlinks + while [ -h "$PRG" ] ; do + ls=`ls -ld "$PRG"` + link=`expr "$ls" : '.*-> \(.*\)$'` + if expr "$link" : '/.*' > /dev/null; then + PRG="$link" + else + PRG="`dirname "$PRG"`/$link" + fi + done + + saveddir=`pwd` + + M2_HOME=`dirname "$PRG"`/.. + + # make it fully qualified + M2_HOME=`cd "$M2_HOME" && pwd` + + cd "$saveddir" + # echo Using m2 at $M2_HOME +fi + +# For Cygwin, ensure paths are in UNIX format before anything is touched +if $cygwin ; then + [ -n "$M2_HOME" ] && + M2_HOME=`cygpath --unix "$M2_HOME"` + [ -n "$JAVA_HOME" ] && + JAVA_HOME=`cygpath --unix "$JAVA_HOME"` + [ -n "$CLASSPATH" ] && + CLASSPATH=`cygpath --path --unix "$CLASSPATH"` +fi + +# For Migwn, ensure paths are in UNIX format before anything is touched +if $mingw ; then + [ -n "$M2_HOME" ] && + M2_HOME="`(cd "$M2_HOME"; pwd)`" + [ -n "$JAVA_HOME" ] && + JAVA_HOME="`(cd "$JAVA_HOME"; pwd)`" + # TODO classpath? +fi + +if [ -z "$JAVA_HOME" ]; then + javaExecutable="`which javac`" + if [ -n "$javaExecutable" ] && ! [ "`expr \"$javaExecutable\" : '\([^ ]*\)'`" = "no" ]; then + # readlink(1) is not available as standard on Solaris 10. + readLink=`which readlink` + if [ ! `expr "$readLink" : '\([^ ]*\)'` = "no" ]; then + if $darwin ; then + javaHome="`dirname \"$javaExecutable\"`" + javaExecutable="`cd \"$javaHome\" && pwd -P`/javac" + else + javaExecutable="`readlink -f \"$javaExecutable\"`" + fi + javaHome="`dirname \"$javaExecutable\"`" + javaHome=`expr "$javaHome" : '\(.*\)/bin'` + JAVA_HOME="$javaHome" + export JAVA_HOME + fi + fi +fi + +if [ -z "$JAVACMD" ] ; then + if [ -n "$JAVA_HOME" ] ; then + if [ -x "$JAVA_HOME/jre/sh/java" ] ; then + # IBM's JDK on AIX uses strange locations for the executables + JAVACMD="$JAVA_HOME/jre/sh/java" + else + JAVACMD="$JAVA_HOME/bin/java" + fi + else + JAVACMD="`which java`" + fi +fi + +if [ ! -x "$JAVACMD" ] ; then + echo "Error: JAVA_HOME is not defined correctly." >&2 + echo " We cannot execute $JAVACMD" >&2 + exit 1 +fi + +if [ -z "$JAVA_HOME" ] ; then + echo "Warning: JAVA_HOME environment variable is not set." +fi + +CLASSWORLDS_LAUNCHER=org.codehaus.plexus.classworlds.launcher.Launcher + +# For Cygwin, switch paths to Windows format before running java +if $cygwin; then + [ -n "$M2_HOME" ] && + M2_HOME=`cygpath --path --windows "$M2_HOME"` + [ -n "$JAVA_HOME" ] && + JAVA_HOME=`cygpath --path --windows "$JAVA_HOME"` + [ -n "$CLASSPATH" ] && + CLASSPATH=`cygpath --path --windows "$CLASSPATH"` +fi + +# traverses directory structure from process work directory to filesystem root +# first directory with .mvn subdirectory is considered project base directory +find_maven_basedir() { + local basedir=$(pwd) + local wdir=$(pwd) + while [ "$wdir" != '/' ] ; do + if [ -d "$wdir"/.mvn ] ; then + basedir=$wdir + break + fi + wdir=$(cd "$wdir/.."; pwd) + done + echo "${basedir}" +} + +# concatenates all lines of a file +concat_lines() { + if [ -f "$1" ]; then + echo "$(tr -s '\n' ' ' < "$1")" + fi +} + +export MAVEN_PROJECTBASEDIR=${MAVEN_BASEDIR:-$(find_maven_basedir)} +MAVEN_OPTS="$(concat_lines "$MAVEN_PROJECTBASEDIR/.mvn/jvm.config") $MAVEN_OPTS" + +# Provide a "standardized" way to retrieve the CLI args that will +# work with both Windows and non-Windows executions. +MAVEN_CMD_LINE_ARGS="$MAVEN_CONFIG $@" +export MAVEN_CMD_LINE_ARGS + +WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain + +exec "$JAVACMD" \ + $MAVEN_OPTS \ + -classpath "$MAVEN_PROJECTBASEDIR/.mvn/wrapper/maven-wrapper.jar" \ + "-Dmaven.home=${M2_HOME}" "-Dmaven.multiModuleProjectDirectory=${MAVEN_PROJECTBASEDIR}" \ + ${WRAPPER_LAUNCHER} "$@" diff --git a/spring-jmeter-jenkins/mvnw.cmd b/spring-jmeter-jenkins/mvnw.cmd new file mode 100644 index 0000000000..2b934e89dd --- /dev/null +++ b/spring-jmeter-jenkins/mvnw.cmd @@ -0,0 +1,145 @@ +@REM ---------------------------------------------------------------------------- +@REM Licensed to the Apache Software Foundation (ASF) under one +@REM or more contributor license agreements. See the NOTICE file +@REM distributed with this work for additional information +@REM regarding copyright ownership. The ASF licenses this file +@REM to you under the Apache License, Version 2.0 (the +@REM "License"); you may not use this file except in compliance +@REM with the License. You may obtain a copy of the License at +@REM +@REM http://www.apache.org/licenses/LICENSE-2.0 +@REM +@REM Unless required by applicable law or agreed to in writing, +@REM software distributed under the License is distributed on an +@REM "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +@REM KIND, either express or implied. See the License for the +@REM specific language governing permissions and limitations +@REM under the License. +@REM ---------------------------------------------------------------------------- + +@REM ---------------------------------------------------------------------------- +@REM Maven2 Start Up Batch script +@REM +@REM Required ENV vars: +@REM JAVA_HOME - location of a JDK home dir +@REM +@REM Optional ENV vars +@REM M2_HOME - location of maven2's installed home dir +@REM MAVEN_BATCH_ECHO - set to 'on' to enable the echoing of the batch commands +@REM MAVEN_BATCH_PAUSE - set to 'on' to wait for a key stroke before ending +@REM MAVEN_OPTS - parameters passed to the Java VM when running Maven +@REM e.g. to debug Maven itself, use +@REM set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000 +@REM MAVEN_SKIP_RC - flag to disable loading of mavenrc files +@REM ---------------------------------------------------------------------------- + +@REM Begin all REM lines with '@' in case MAVEN_BATCH_ECHO is 'on' +@echo off +@REM enable echoing my setting MAVEN_BATCH_ECHO to 'on' +@if "%MAVEN_BATCH_ECHO%" == "on" echo %MAVEN_BATCH_ECHO% + +@REM set %HOME% to equivalent of $HOME +if "%HOME%" == "" (set "HOME=%HOMEDRIVE%%HOMEPATH%") + +@REM Execute a user defined script before this one +if not "%MAVEN_SKIP_RC%" == "" goto skipRcPre +@REM check for pre script, once with legacy .bat ending and once with .cmd ending +if exist "%HOME%\mavenrc_pre.bat" call "%HOME%\mavenrc_pre.bat" +if exist "%HOME%\mavenrc_pre.cmd" call "%HOME%\mavenrc_pre.cmd" +:skipRcPre + +@setlocal + +set ERROR_CODE=0 + +@REM To isolate internal variables from possible post scripts, we use another setlocal +@setlocal + +@REM ==== START VALIDATION ==== +if not "%JAVA_HOME%" == "" goto OkJHome + +echo. +echo Error: JAVA_HOME not found in your environment. >&2 +echo Please set the JAVA_HOME variable in your environment to match the >&2 +echo location of your Java installation. >&2 +echo. +goto error + +:OkJHome +if exist "%JAVA_HOME%\bin\java.exe" goto init + +echo. +echo Error: JAVA_HOME is set to an invalid directory. >&2 +echo JAVA_HOME = "%JAVA_HOME%" >&2 +echo Please set the JAVA_HOME variable in your environment to match the >&2 +echo location of your Java installation. >&2 +echo. +goto error + +@REM ==== END VALIDATION ==== + +:init + +set MAVEN_CMD_LINE_ARGS=%* + +@REM Find the project base dir, i.e. the directory that contains the folder ".mvn". +@REM Fallback to current working directory if not found. + +set MAVEN_PROJECTBASEDIR=%MAVEN_BASEDIR% +IF NOT "%MAVEN_PROJECTBASEDIR%"=="" goto endDetectBaseDir + +set EXEC_DIR=%CD% +set WDIR=%EXEC_DIR% +:findBaseDir +IF EXIST "%WDIR%"\.mvn goto baseDirFound +cd .. +IF "%WDIR%"=="%CD%" goto baseDirNotFound +set WDIR=%CD% +goto findBaseDir + +:baseDirFound +set MAVEN_PROJECTBASEDIR=%WDIR% +cd "%EXEC_DIR%" +goto endDetectBaseDir + +:baseDirNotFound +set MAVEN_PROJECTBASEDIR=%EXEC_DIR% +cd "%EXEC_DIR%" + +:endDetectBaseDir + +IF NOT EXIST "%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config" goto endReadAdditionalConfig + +@setlocal EnableExtensions EnableDelayedExpansion +for /F "usebackq delims=" %%a in ("%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config") do set JVM_CONFIG_MAVEN_PROPS=!JVM_CONFIG_MAVEN_PROPS! %%a +@endlocal & set JVM_CONFIG_MAVEN_PROPS=%JVM_CONFIG_MAVEN_PROPS% + +:endReadAdditionalConfig + +SET MAVEN_JAVA_EXE="%JAVA_HOME%\bin\java.exe" + +set WRAPPER_JAR="".\.mvn\wrapper\maven-wrapper.jar"" +set WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain + +%MAVEN_JAVA_EXE% %JVM_CONFIG_MAVEN_PROPS% %MAVEN_OPTS% %MAVEN_DEBUG_OPTS% -classpath %WRAPPER_JAR% "-Dmaven.multiModuleProjectDirectory=%MAVEN_PROJECTBASEDIR%" %WRAPPER_LAUNCHER% %MAVEN_CMD_LINE_ARGS% +if ERRORLEVEL 1 goto error +goto end + +:error +set ERROR_CODE=1 + +:end +@endlocal & set ERROR_CODE=%ERROR_CODE% + +if not "%MAVEN_SKIP_RC%" == "" goto skipRcPost +@REM check for post script, once with legacy .bat ending and once with .cmd ending +if exist "%HOME%\mavenrc_post.bat" call "%HOME%\mavenrc_post.bat" +if exist "%HOME%\mavenrc_post.cmd" call "%HOME%\mavenrc_post.cmd" +:skipRcPost + +@REM pause the script if MAVEN_BATCH_PAUSE is set to 'on' +if "%MAVEN_BATCH_PAUSE%" == "on" pause + +if "%MAVEN_TERMINATE_CMD%" == "on" exit %ERROR_CODE% + +exit /B %ERROR_CODE% \ No newline at end of file diff --git a/spring-jmeter-jenkins/pom.xml b/spring-jmeter-jenkins/pom.xml new file mode 100644 index 0000000000..38b5f98e45 --- /dev/null +++ b/spring-jmeter-jenkins/pom.xml @@ -0,0 +1,52 @@ + + + 4.0.0 + + spring-jmeter-jenkins + 0.0.1-SNAPSHOT + jar + + spring-jmeter-jenkins + Run and Show JMeter test with Jenkins + + + parent-boot-5 + com.baeldung + 0.0.1-SNAPSHOT + ../parent-boot-5 + + + + UTF-8 + UTF-8 + 1.8 + + + + + org.springframework.boot + spring-boot-starter-data-mongodb + + + org.springframework.boot + spring-boot-starter-data-rest + + + org.springframework.boot + spring-boot-starter-test + test + + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + + + + diff --git a/spring-jmeter-jenkins/src/main/java/com/baeldung/SpringJMeterJenkinsApplication.java b/spring-jmeter-jenkins/src/main/java/com/baeldung/SpringJMeterJenkinsApplication.java new file mode 100644 index 0000000000..3bc1f64f41 --- /dev/null +++ b/spring-jmeter-jenkins/src/main/java/com/baeldung/SpringJMeterJenkinsApplication.java @@ -0,0 +1,13 @@ +package com.baeldung; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.data.mongodb.repository.config.EnableMongoRepositories; + +@SpringBootApplication +@EnableMongoRepositories +public class SpringJMeterJenkinsApplication { + public static void main(String[] args) { + SpringApplication.run(SpringJMeterJenkinsApplication.class, args); + } +} diff --git a/spring-jmeter-jenkins/src/main/java/com/baeldung/domain/Student.java b/spring-jmeter-jenkins/src/main/java/com/baeldung/domain/Student.java new file mode 100644 index 0000000000..0f6150fc48 --- /dev/null +++ b/spring-jmeter-jenkins/src/main/java/com/baeldung/domain/Student.java @@ -0,0 +1,66 @@ +package com.baeldung.domain; + +import javax.validation.constraints.NotNull; +import org.springframework.data.annotation.Id; +import org.springframework.data.mongodb.core.mapping.Document; + +import java.io.Serializable; + +@Document(collection = "STUDENT") +public class Student implements Serializable { + + @Id + private String id; + @NotNull + private String firstName; + private String lastName; + @NotNull + private String phoneNumber; + private String email; + + public String getId() { + return id; + } + + public String getFirstName() { + return firstName; + } + + public void setFirstName(String firstName) { + this.firstName = firstName; + } + + public String getLastName() { + return lastName; + } + + public void setLastName(String lastName) { + this.lastName = lastName; + } + + public String getPhoneNumber() { + return phoneNumber; + } + + public void setPhoneNumber(String phoneNumber) { + this.phoneNumber = phoneNumber; + } + + public String getEmail() { + return email; + } + + public void setEmail(String email) { + this.email = email; + } + + @Override + public String toString() { + return "Student{" + + "firstName='" + firstName + '\'' + + ", lastName='" + lastName + '\'' + + ", phoneNumber='" + phoneNumber + '\'' + + ", email='" + email + '\'' + + '}'; + } +} diff --git a/spring-jmeter-jenkins/src/main/java/com/baeldung/repository/StudentRepository.java b/spring-jmeter-jenkins/src/main/java/com/baeldung/repository/StudentRepository.java new file mode 100644 index 0000000000..d0ca7d8510 --- /dev/null +++ b/spring-jmeter-jenkins/src/main/java/com/baeldung/repository/StudentRepository.java @@ -0,0 +1,7 @@ +package com.baeldung.repository; + +import org.springframework.data.mongodb.repository.MongoRepository; +import com.baeldung.domain.Student; + +public interface StudentRepository extends MongoRepository { +} diff --git a/spring-jmeter-jenkins/src/main/resources/JMeter-Jenkins.jmx b/spring-jmeter-jenkins/src/main/resources/JMeter-Jenkins.jmx new file mode 100644 index 0000000000..49ce2dec1d --- /dev/null +++ b/spring-jmeter-jenkins/src/main/resources/JMeter-Jenkins.jmx @@ -0,0 +1,96 @@ + + + + + + false + false + + + + + + + + continue + + false + 1 + + 5 + 1 + 1507776008000 + 1507776008000 + false + + + + + + + + + localhost + 8989 + + + /students + GET + true + false + true + false + + + + + + + false + + saveConfig + + + true + true + true + + true + true + true + true + false + true + true + false + false + false + true + false + false + false + true + 0 + true + true + true + true + true + + + + + + + 10 + + + + + + + true + + + + diff --git a/spring-jmeter-jenkins/src/main/resources/application.properties b/spring-jmeter-jenkins/src/main/resources/application.properties new file mode 100644 index 0000000000..c7d86e14b0 --- /dev/null +++ b/spring-jmeter-jenkins/src/main/resources/application.properties @@ -0,0 +1,14 @@ +# the db host +spring.data.mongodb.host=localhost +# the connection port (defaults to 27107) +spring.data.mongodb.port=27017 +# The database's name +spring.data.mongodb.database=JMeter-Jenkins + +# Or this +# spring.data.mongodb.uri=mongodb://localhost/JMeter-Jenkins + +# spring.data.mongodb.username= +# spring.data.mongodb.password= + +spring.data.mongodb.repositories.enabled=true \ No newline at end of file diff --git a/spring-jmeter-jenkins/src/test/java/com/baeldung/SpringJMeterJenkinsApplicationTests.java b/spring-jmeter-jenkins/src/test/java/com/baeldung/SpringJMeterJenkinsApplicationTests.java new file mode 100644 index 0000000000..b39a5605b1 --- /dev/null +++ b/spring-jmeter-jenkins/src/test/java/com/baeldung/SpringJMeterJenkinsApplicationTests.java @@ -0,0 +1,16 @@ +package com.baeldung; + +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.test.context.junit4.SpringRunner; + +@RunWith(SpringRunner.class) +@SpringBootTest +public class SpringJMeterJenkinsApplicationTests { + + @Test + public void contextLoads() { + } + +} From d14411e2b471f2d6987bfd040be730a222d0659a Mon Sep 17 00:00:00 2001 From: Ahmed Tawila Date: Mon, 23 Oct 2017 10:58:07 +0200 Subject: [PATCH 075/236] BAEL-1250 Initializing Arrays in Java --- .../com/baeldung/array/ArrayInitializer.java | 26 +++++++++++++++++++ .../baeldung/array/ArrayInitializerTest.java | 22 +++++++++++++++- 2 files changed, 47 insertions(+), 1 deletion(-) diff --git a/core-java/src/main/java/com/baeldung/array/ArrayInitializer.java b/core-java/src/main/java/com/baeldung/array/ArrayInitializer.java index 0c9bf1834e..fd00c74e7f 100644 --- a/core-java/src/main/java/com/baeldung/array/ArrayInitializer.java +++ b/core-java/src/main/java/com/baeldung/array/ArrayInitializer.java @@ -45,4 +45,30 @@ public class ArrayInitializer { Arrays.fill(array, 0, 3, -50); return array; } + + public static int[] initializeArrayUsingArraysCopy() { + int array[] = { 1, 2, 3, 4, 5 }; + int[] copy = Arrays.copyOf(array, 5); + return copy; + } + + public static int[] initializeLargerArrayUsingArraysCopy() { + int array[] = { 1, 2, 3, 4, 5 }; + int[] copy = Arrays.copyOf(array, 6); + return copy; + } + + public static int[] initializeArrayUsingArraysSetAll() { + int[] array = new int[20]; + + for (int i = 0; i < 20; i++) { + Arrays.setAll(array, p -> { + if (p > 9) + return 0; + else + return p; + }); + } + return array; + } } diff --git a/core-java/src/test/java/com/baeldung/array/ArrayInitializerTest.java b/core-java/src/test/java/com/baeldung/array/ArrayInitializerTest.java index 0797a524c4..d3afad7b00 100644 --- a/core-java/src/test/java/com/baeldung/array/ArrayInitializerTest.java +++ b/core-java/src/test/java/com/baeldung/array/ArrayInitializerTest.java @@ -5,7 +5,10 @@ import static com.baeldung.array.ArrayInitializer.initializeArrayAtTimeOfDeclara import static com.baeldung.array.ArrayInitializer.initializeArrayAtTimeOfDeclarationMethod3; import static com.baeldung.array.ArrayInitializer.initializeArrayInLoop; import static com.baeldung.array.ArrayInitializer.initializeArrayRangeUsingArraysFill; +import static com.baeldung.array.ArrayInitializer.initializeArrayUsingArraysCopy; import static com.baeldung.array.ArrayInitializer.initializeArrayUsingArraysFill; +import static com.baeldung.array.ArrayInitializer.initializeArrayUsingArraysSetAll; +import static com.baeldung.array.ArrayInitializer.initializeLargerArrayUsingArraysCopy; import static com.baeldung.array.ArrayInitializer.initializeMultiDimensionalArrayInLoop; import static org.junit.Assert.assertArrayEquals; @@ -38,11 +41,28 @@ public class ArrayInitializerTest { assertArrayEquals(new int[] { 1, 2, 3, 4, 5 }, initializeArrayAtTimeOfDeclarationMethod3()); } + @Test public void whenInitializeArrayUsingArraysFill_thenCorrect() { assertArrayEquals(new long[] { 30, 30, 30, 30, 30 }, initializeArrayUsingArraysFill()); } - public void whenInitializeArrayRangeUsingArraysFill() { + @Test + public void whenInitializeArrayRangeUsingArraysFill_thenCorrect() { assertArrayEquals(new int[] { -50, -50, -50, 0, 0 }, initializeArrayRangeUsingArraysFill()); } + + @Test + public void whenInitializeArrayRangeUsingArraysCopy_thenCorrect() { + assertArrayEquals(new int[] { 1, 2, 3, 4, 5 }, initializeArrayUsingArraysCopy()); + } + + @Test + public void whenInitializeLargerArrayRangeUsingArraysCopy_thenCorrect() { + assertArrayEquals(new int[] { 1, 2, 3, 4, 5, 0 }, initializeLargerArrayUsingArraysCopy()); + } + + @Test + public void whenInitializeLargerArrayRangeUsingArraysSetAll_thenCorrect() { + assertArrayEquals(new int[] { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, initializeArrayUsingArraysSetAll()); + } } From 65d6e0127fa31ae92f0aaa25a96ee9b6c4f2972e Mon Sep 17 00:00:00 2001 From: Graham Cox Date: Tue, 24 Oct 2017 12:51:14 +0100 Subject: [PATCH 076/236] Updated test names --- .../baeldung/kotlin/junit5/CalculatorTest5.kt | 20 +++++++++---------- .../com/baeldung/kotlin/junit5/SimpleTest5.kt | 4 ++-- 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/core-kotlin/src/test/kotlin/com/baeldung/kotlin/junit5/CalculatorTest5.kt b/core-kotlin/src/test/kotlin/com/baeldung/kotlin/junit5/CalculatorTest5.kt index dd35805044..40cd9adc99 100644 --- a/core-kotlin/src/test/kotlin/com/baeldung/kotlin/junit5/CalculatorTest5.kt +++ b/core-kotlin/src/test/kotlin/com/baeldung/kotlin/junit5/CalculatorTest5.kt @@ -7,12 +7,12 @@ class CalculatorTest5 { private val calculator = Calculator() @Test - fun testAddition() { + fun whenAdding1and3_thenAnswerIs4() { Assertions.assertEquals(4, calculator.add(1, 3)) } @Test - fun testDivideByZero() { + fun whenDividingBy0_thenErrorOccurs() { val exception = Assertions.assertThrows(DivideByZeroException::class.java) { calculator.divide(5, 0) } @@ -21,7 +21,7 @@ class CalculatorTest5 { } @Test - fun testSquares() { + fun whenSquaringNumbers_thenCorrectAnswerGiven() { Assertions.assertAll( Executable { Assertions.assertEquals(1, calculator.square(1)) }, Executable { Assertions.assertEquals(4, calculator.square(2)) }, @@ -31,9 +31,9 @@ class CalculatorTest5 { @TestFactory fun testSquaresFactory() = listOf( - DynamicTest.dynamicTest("1 squared") { Assertions.assertEquals(1,calculator.square(1))}, - DynamicTest.dynamicTest("2 squared") { Assertions.assertEquals(4,calculator.square(2))}, - DynamicTest.dynamicTest("3 squared") { Assertions.assertEquals(9,calculator.square(3))} + DynamicTest.dynamicTest("when I calculate 1^2 then I get 1") { Assertions.assertEquals(1,calculator.square(1))}, + DynamicTest.dynamicTest("when I calculate 2^2 then I get 4") { Assertions.assertEquals(4,calculator.square(2))}, + DynamicTest.dynamicTest("when I calculate 3^2 then I get 9") { Assertions.assertEquals(9,calculator.square(3))} ) @TestFactory @@ -44,7 +44,7 @@ class CalculatorTest5 { 4 to 16, 5 to 25) .map { (input, expected) -> - DynamicTest.dynamicTest("$input squared") { + DynamicTest.dynamicTest("when I calculate $input^2 then I get $expected") { Assertions.assertEquals(expected, calculator.square(input)) } } @@ -59,14 +59,14 @@ class CalculatorTest5 { @TestFactory fun testSquaresFactory3() = squaresTestData .map { (input, expected) -> - DynamicTest.dynamicTest("$input squared") { + DynamicTest.dynamicTest("when I calculate $input^2 then I get $expected") { Assertions.assertEquals(expected, calculator.square(input)) } } @TestFactory fun testSquareRootsFactory3() = squaresTestData .map { (expected, input) -> - DynamicTest.dynamicTest("Square root of $input") { + DynamicTest.dynamicTest("I calculate the square root of $input then I get $expected") { Assertions.assertEquals(expected.toDouble(), calculator.squareRoot(input)) } } @@ -76,7 +76,7 @@ class CalculatorTest5 { Tag("logarithms") ) @Test - fun testLogarithms() { + fun whenIcalculateLog2Of8_thenIget3() { Assertions.assertEquals(3.0, calculator.log(2, 8)) } } diff --git a/core-kotlin/src/test/kotlin/com/baeldung/kotlin/junit5/SimpleTest5.kt b/core-kotlin/src/test/kotlin/com/baeldung/kotlin/junit5/SimpleTest5.kt index c04ab568f7..70d3fb90bf 100644 --- a/core-kotlin/src/test/kotlin/com/baeldung/kotlin/junit5/SimpleTest5.kt +++ b/core-kotlin/src/test/kotlin/com/baeldung/kotlin/junit5/SimpleTest5.kt @@ -6,14 +6,14 @@ import org.junit.jupiter.api.Test class SimpleTest5 { @Test - fun testEmpty() { + fun whenEmptyList_thenListIsEmpty() { val list = listOf() Assertions.assertTrue(list::isEmpty) } @Test @Disabled - fun testMessage() { + fun when3equals4_thenTestFails() { Assertions.assertEquals(3, 4) { "Three does not equal four" } From 26f495afa7dd942bd2de3165b6c4ff5b409837f0 Mon Sep 17 00:00:00 2001 From: Ahmed Tawila Date: Wed, 25 Oct 2017 15:34:13 +0200 Subject: [PATCH 077/236] BAEL-1250 Initializing Arrays in Java --- .../src/main/java/com/baeldung/array/ArrayInitializer.java | 7 +++++++ .../test/java/com/baeldung/array/ArrayInitializerTest.java | 5 +++++ 2 files changed, 12 insertions(+) diff --git a/core-java/src/main/java/com/baeldung/array/ArrayInitializer.java b/core-java/src/main/java/com/baeldung/array/ArrayInitializer.java index fd00c74e7f..7759e282e6 100644 --- a/core-java/src/main/java/com/baeldung/array/ArrayInitializer.java +++ b/core-java/src/main/java/com/baeldung/array/ArrayInitializer.java @@ -2,6 +2,8 @@ package com.baeldung.array; import java.util.Arrays; +import org.apache.commons.lang.ArrayUtils; + public class ArrayInitializer { public static int[] initializeArrayInLoop() { @@ -71,4 +73,9 @@ public class ArrayInitializer { } return array; } + + public static char[] initializeArrayUsingArraysUtilClone() { + char[] array = new char[] {'a', 'b', 'c'}; + return ArrayUtils.clone(array); + } } diff --git a/core-java/src/test/java/com/baeldung/array/ArrayInitializerTest.java b/core-java/src/test/java/com/baeldung/array/ArrayInitializerTest.java index d3afad7b00..6826a5186b 100644 --- a/core-java/src/test/java/com/baeldung/array/ArrayInitializerTest.java +++ b/core-java/src/test/java/com/baeldung/array/ArrayInitializerTest.java @@ -8,6 +8,7 @@ import static com.baeldung.array.ArrayInitializer.initializeArrayRangeUsingArray import static com.baeldung.array.ArrayInitializer.initializeArrayUsingArraysCopy; import static com.baeldung.array.ArrayInitializer.initializeArrayUsingArraysFill; import static com.baeldung.array.ArrayInitializer.initializeArrayUsingArraysSetAll; +import static com.baeldung.array.ArrayInitializer.initializeArrayUsingArraysUtilClone; import static com.baeldung.array.ArrayInitializer.initializeLargerArrayUsingArraysCopy; import static com.baeldung.array.ArrayInitializer.initializeMultiDimensionalArrayInLoop; import static org.junit.Assert.assertArrayEquals; @@ -65,4 +66,8 @@ public class ArrayInitializerTest { public void whenInitializeLargerArrayRangeUsingArraysSetAll_thenCorrect() { assertArrayEquals(new int[] { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, initializeArrayUsingArraysSetAll()); } + + public void whenInitializeArrayUsingArraysUtilClone_thenCorrect() { + assertArrayEquals(new char[] { 'a', 'b', 'c' }, initializeArrayUsingArraysUtilClone()); + } } From 9ce32992a791f5d890c14123da9bb27d3079ba06 Mon Sep 17 00:00:00 2001 From: Ahmed Tawila Date: Wed, 25 Oct 2017 15:53:15 +0200 Subject: [PATCH 078/236] small fix --- .../com/baeldung/array/ArrayInitializer.java | 16 ++++++++-------- .../com/baeldung/array/ArrayInitializerTest.java | 1 + 2 files changed, 9 insertions(+), 8 deletions(-) diff --git a/core-java/src/main/java/com/baeldung/array/ArrayInitializer.java b/core-java/src/main/java/com/baeldung/array/ArrayInitializer.java index 474cbe42a9..0ba6c342d9 100644 --- a/core-java/src/main/java/com/baeldung/array/ArrayInitializer.java +++ b/core-java/src/main/java/com/baeldung/array/ArrayInitializer.java @@ -26,17 +26,17 @@ public class ArrayInitializer { } static String[] initializeArrayAtTimeOfDeclarationMethod1() { - String array[] = new String[]{"Toyota", "Mercedes", "BMW", "Volkswagen", "Skoda"}; + String array[] = new String[] { "Toyota", "Mercedes", "BMW", "Volkswagen", "Skoda" }; return array; } static int[] initializeArrayAtTimeOfDeclarationMethod2() { - int[] array = new int[]{1, 2, 3, 4, 5}; + int[] array = new int[] { 1, 2, 3, 4, 5 }; return array; } static int[] initializeArrayAtTimeOfDeclarationMethod3() { - int array[] = {1, 2, 3, 4, 5}; + int array[] = { 1, 2, 3, 4, 5 }; return array; } @@ -53,13 +53,13 @@ public class ArrayInitializer { } static int[] initializeArrayUsingArraysCopy() { - int array[] = {1, 2, 3, 4, 5}; + int array[] = { 1, 2, 3, 4, 5 }; int[] copy = Arrays.copyOf(array, 5); return copy; } static int[] initializeLargerArrayUsingArraysCopy() { - int array[] = {1, 2, 3, 4, 5}; + int array[] = { 1, 2, 3, 4, 5 }; int[] copy = Arrays.copyOf(array, 6); return copy; } @@ -70,9 +70,9 @@ public class ArrayInitializer { Arrays.setAll(array, p -> p > 9 ? 0 : p); return array; } - - public static char[] initializeArrayUsingArraysUtilClone() { - char[] array = new char[] {'a', 'b', 'c'}; + + static char[] initializeArrayUsingArraysUtilClone() { + char[] array = new char[] { 'a', 'b', 'c' }; return ArrayUtils.clone(array); } } diff --git a/core-java/src/test/java/com/baeldung/array/ArrayInitializerTest.java b/core-java/src/test/java/com/baeldung/array/ArrayInitializerTest.java index 6826a5186b..7265fa20e5 100644 --- a/core-java/src/test/java/com/baeldung/array/ArrayInitializerTest.java +++ b/core-java/src/test/java/com/baeldung/array/ArrayInitializerTest.java @@ -67,6 +67,7 @@ public class ArrayInitializerTest { assertArrayEquals(new int[] { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, initializeArrayUsingArraysSetAll()); } + @Test public void whenInitializeArrayUsingArraysUtilClone_thenCorrect() { assertArrayEquals(new char[] { 'a', 'b', 'c' }, initializeArrayUsingArraysUtilClone()); } From ead7528c9c2bddfcee98b526bfc951d5410eb9a5 Mon Sep 17 00:00:00 2001 From: Ahmed Tawila Date: Thu, 26 Oct 2017 10:17:25 +0200 Subject: [PATCH 079/236] BAEL-1171 java.lang.String API --- .../java/com/baeldung/string/StringTest.java | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/core-java/src/test/java/com/baeldung/string/StringTest.java b/core-java/src/test/java/com/baeldung/string/StringTest.java index 0e325950b0..fe1a69aa23 100644 --- a/core-java/src/test/java/com/baeldung/string/StringTest.java +++ b/core-java/src/test/java/com/baeldung/string/StringTest.java @@ -5,6 +5,7 @@ import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; +import java.io.UnsupportedEncodingException; import java.nio.charset.StandardCharsets; import java.util.IllegalFormatException; import java.util.regex.PatternSyntaxException; @@ -29,11 +30,17 @@ public class StringTest { } @Test - public void whenGetBytes_thenCorrect() { - byte[] byteArray = "abcd".getBytes(); - byte[] expected = new byte[] { 97, 98, 99, 100 }; + public void whenGetBytes_thenCorrect() throws UnsupportedEncodingException { + byte[] byteArray1 = "abcd".getBytes(); + byte[] byteArray2 = "efgh".getBytes(StandardCharsets.US_ASCII); + byte[] byteArray3 = "ijkl".getBytes("UTF-8"); + byte[] expected1 = new byte[] { 97, 98, 99, 100 }; + byte[] expected2 = new byte[] { 101, 102, 103, 104 }; + byte[] expected3 = new byte[] { 105, 106, 107, 108 }; - assertArrayEquals(expected, byteArray); + assertArrayEquals(expected1, byteArray1); + assertArrayEquals(expected2, byteArray2); + assertArrayEquals(expected3, byteArray3); } @Test @@ -123,6 +130,7 @@ public class StringTest { @Test public void whenCallLastIndexOf_thenCorrect() { assertEquals(2, "foo".lastIndexOf("o")); + assertEquals(2, "foo".lastIndexOf(111)); } @Test From ef4ee45a18de65b0c81bbe8da16c0b063b2201a5 Mon Sep 17 00:00:00 2001 From: Ahmed Tawila Date: Thu, 26 Oct 2017 11:48:45 +0200 Subject: [PATCH 080/236] BAEL-1263 Daemon Threads in Java --- .../baeldung/concurrent/daemon/NewThread.java | 9 +++++ .../concurrent/daemon/DaemonThreadTest.java | 33 +++++++++++++++++++ 2 files changed, 42 insertions(+) create mode 100644 core-java-concurrency/src/main/java/com/baeldung/concurrent/daemon/NewThread.java create mode 100644 core-java-concurrency/src/test/java/com/baeldung/concurrent/daemon/DaemonThreadTest.java diff --git a/core-java-concurrency/src/main/java/com/baeldung/concurrent/daemon/NewThread.java b/core-java-concurrency/src/main/java/com/baeldung/concurrent/daemon/NewThread.java new file mode 100644 index 0000000000..a9433a8333 --- /dev/null +++ b/core-java-concurrency/src/main/java/com/baeldung/concurrent/daemon/NewThread.java @@ -0,0 +1,9 @@ +package com.baeldung.concurrent.daemon; + +public class NewThread extends Thread { + + public void run() { + for (int i = 0; i < 10; i++) + System.out.println("New Thread is running..."); + } +} diff --git a/core-java-concurrency/src/test/java/com/baeldung/concurrent/daemon/DaemonThreadTest.java b/core-java-concurrency/src/test/java/com/baeldung/concurrent/daemon/DaemonThreadTest.java new file mode 100644 index 0000000000..96f79cd0dd --- /dev/null +++ b/core-java-concurrency/src/test/java/com/baeldung/concurrent/daemon/DaemonThreadTest.java @@ -0,0 +1,33 @@ +package com.baeldung.concurrent.daemon; + +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertTrue; + +import org.junit.Test; + +public class DaemonThreadTest { + + @Test + public void whenCallIsDaemon_thenCorrect() { + NewThread daemonThread = new NewThread(); + NewThread userThread = new NewThread(); + daemonThread.setDaemon(true); + daemonThread.start(); + userThread.start(); + + assertTrue(daemonThread.isDaemon()); + assertFalse(userThread.isDaemon()); + } + + @Test(expected = IllegalThreadStateException.class) + public void givenUserThread_whenSetDaemonWhileRunning_thenIllegalThreadStateException() { + NewThread daemonThread = new NewThread(); + daemonThread.start(); + daemonThread.setDaemon(true); + } + + @Test + public void givenUserThread_whenStartThread_thenFalse() { + NewThread daemonThread = new NewThread(); + } +} From 5a23a6908198a709bd24edf987b8e2bd6c0cbc77 Mon Sep 17 00:00:00 2001 From: Ahmed Tawila Date: Fri, 27 Oct 2017 10:17:01 +0200 Subject: [PATCH 081/236] merge with fork --- .../test/java/com/baeldung/string/StringTest.java | 13 +------------ 1 file changed, 1 insertion(+), 12 deletions(-) diff --git a/core-java/src/test/java/com/baeldung/string/StringTest.java b/core-java/src/test/java/com/baeldung/string/StringTest.java index 2f8aec9887..e88b2d7c2c 100644 --- a/core-java/src/test/java/com/baeldung/string/StringTest.java +++ b/core-java/src/test/java/com/baeldung/string/StringTest.java @@ -5,10 +5,7 @@ import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; -<<<<<<< HEAD -======= import java.io.UnsupportedEncodingException; ->>>>>>> ef4ee45a18de65b0c81bbe8da16c0b063b2201a5 import java.nio.charset.StandardCharsets; import java.util.IllegalFormatException; import java.util.regex.PatternSyntaxException; @@ -33,13 +30,6 @@ public class StringTest { } @Test -<<<<<<< HEAD - public void whenGetBytes_thenCorrect() { - byte[] byteArray = "abcd".getBytes(); - byte[] expected = new byte[] { 97, 98, 99, 100 }; - - assertArrayEquals(expected, byteArray); -======= public void whenGetBytes_thenCorrect() throws UnsupportedEncodingException { byte[] byteArray1 = "abcd".getBytes(); byte[] byteArray2 = "efgh".getBytes(StandardCharsets.US_ASCII); @@ -51,7 +41,6 @@ public class StringTest { assertArrayEquals(expected1, byteArray1); assertArrayEquals(expected2, byteArray2); assertArrayEquals(expected3, byteArray3); ->>>>>>> ef4ee45a18de65b0c81bbe8da16c0b063b2201a5 } @Test @@ -234,4 +223,4 @@ public class StringTest { assertEquals("200", String.valueOf(l)); } -} +} \ No newline at end of file From 1be0d76f8c12837683846b0ba1d3da4307d8339a Mon Sep 17 00:00:00 2001 From: Ahmed Tawila Date: Sun, 29 Oct 2017 12:59:55 +0200 Subject: [PATCH 082/236] BAEL-1263 Daemon Threads in Java --- .../main/java/com/baeldung/concurrent/daemon/NewThread.java | 5 +++-- .../com/baeldung/concurrent/daemon/DaemonThreadTest.java | 5 ----- 2 files changed, 3 insertions(+), 7 deletions(-) diff --git a/core-java-concurrency/src/main/java/com/baeldung/concurrent/daemon/NewThread.java b/core-java-concurrency/src/main/java/com/baeldung/concurrent/daemon/NewThread.java index a9433a8333..6ddcb954a1 100644 --- a/core-java-concurrency/src/main/java/com/baeldung/concurrent/daemon/NewThread.java +++ b/core-java-concurrency/src/main/java/com/baeldung/concurrent/daemon/NewThread.java @@ -3,7 +3,8 @@ package com.baeldung.concurrent.daemon; public class NewThread extends Thread { public void run() { - for (int i = 0; i < 10; i++) - System.out.println("New Thread is running..."); + while (true) + for (int i = 0; i < 10; i++) + System.out.println("New Thread is running..."); } } diff --git a/core-java-concurrency/src/test/java/com/baeldung/concurrent/daemon/DaemonThreadTest.java b/core-java-concurrency/src/test/java/com/baeldung/concurrent/daemon/DaemonThreadTest.java index 96f79cd0dd..2c4eeb63d6 100644 --- a/core-java-concurrency/src/test/java/com/baeldung/concurrent/daemon/DaemonThreadTest.java +++ b/core-java-concurrency/src/test/java/com/baeldung/concurrent/daemon/DaemonThreadTest.java @@ -25,9 +25,4 @@ public class DaemonThreadTest { daemonThread.start(); daemonThread.setDaemon(true); } - - @Test - public void givenUserThread_whenStartThread_thenFalse() { - NewThread daemonThread = new NewThread(); - } } From d7c207145ad799983f5ade9bd1a8b7787258f1d2 Mon Sep 17 00:00:00 2001 From: Jose Carvajal Date: Mon, 30 Oct 2017 13:39:39 +0100 Subject: [PATCH 083/236] Renamed unit tests --- ...ts.java => MultipleOutputsServiceApplicationUnitTest.java} | 2 +- ...java => MultipleOutputsWithConditionsServiceUnitTest.java} | 4 ++-- ...ApplicationTests.java => MyLoggerApplicationUnitTest.java} | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) rename spring-cloud/spring-cloud-stream/spring-cloud-stream-rabbit/src/test/java/com/baeldung/spring/cloud/stream/rabbit/{MultipleOutputsServiceApplicationTests.java => MultipleOutputsServiceApplicationUnitTest.java} (96%) rename spring-cloud/spring-cloud-stream/spring-cloud-stream-rabbit/src/test/java/com/baeldung/spring/cloud/stream/rabbit/{MultipleOutputsWithConditionsServiceApplicationTests.java => MultipleOutputsWithConditionsServiceUnitTest.java} (92%) rename spring-cloud/spring-cloud-stream/spring-cloud-stream-rabbit/src/test/java/com/baeldung/spring/cloud/stream/rabbit/{MyLoggerApplicationTests.java => MyLoggerApplicationUnitTest.java} (96%) diff --git a/spring-cloud/spring-cloud-stream/spring-cloud-stream-rabbit/src/test/java/com/baeldung/spring/cloud/stream/rabbit/MultipleOutputsServiceApplicationTests.java b/spring-cloud/spring-cloud-stream/spring-cloud-stream-rabbit/src/test/java/com/baeldung/spring/cloud/stream/rabbit/MultipleOutputsServiceApplicationUnitTest.java similarity index 96% rename from spring-cloud/spring-cloud-stream/spring-cloud-stream-rabbit/src/test/java/com/baeldung/spring/cloud/stream/rabbit/MultipleOutputsServiceApplicationTests.java rename to spring-cloud/spring-cloud-stream/spring-cloud-stream-rabbit/src/test/java/com/baeldung/spring/cloud/stream/rabbit/MultipleOutputsServiceApplicationUnitTest.java index 196d4f0d23..225ed73ff7 100644 --- a/spring-cloud/spring-cloud-stream/spring-cloud-stream-rabbit/src/test/java/com/baeldung/spring/cloud/stream/rabbit/MultipleOutputsServiceApplicationTests.java +++ b/spring-cloud/spring-cloud-stream/spring-cloud-stream-rabbit/src/test/java/com/baeldung/spring/cloud/stream/rabbit/MultipleOutputsServiceApplicationUnitTest.java @@ -17,7 +17,7 @@ import com.baeldung.spring.cloud.stream.rabbit.processor.MyProcessor; @RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration(classes = MultipleOutputsServiceApplication.class) @DirtiesContext -public class MultipleOutputsServiceApplicationTests { +public class MultipleOutputsServiceApplicationUnitTest { @Autowired private MyProcessor pipe; diff --git a/spring-cloud/spring-cloud-stream/spring-cloud-stream-rabbit/src/test/java/com/baeldung/spring/cloud/stream/rabbit/MultipleOutputsWithConditionsServiceApplicationTests.java b/spring-cloud/spring-cloud-stream/spring-cloud-stream-rabbit/src/test/java/com/baeldung/spring/cloud/stream/rabbit/MultipleOutputsWithConditionsServiceUnitTest.java similarity index 92% rename from spring-cloud/spring-cloud-stream/spring-cloud-stream-rabbit/src/test/java/com/baeldung/spring/cloud/stream/rabbit/MultipleOutputsWithConditionsServiceApplicationTests.java rename to spring-cloud/spring-cloud-stream/spring-cloud-stream-rabbit/src/test/java/com/baeldung/spring/cloud/stream/rabbit/MultipleOutputsWithConditionsServiceUnitTest.java index a74ee61be6..8628b209cb 100644 --- a/spring-cloud/spring-cloud-stream/spring-cloud-stream-rabbit/src/test/java/com/baeldung/spring/cloud/stream/rabbit/MultipleOutputsWithConditionsServiceApplicationTests.java +++ b/spring-cloud/spring-cloud-stream/spring-cloud-stream-rabbit/src/test/java/com/baeldung/spring/cloud/stream/rabbit/MultipleOutputsWithConditionsServiceUnitTest.java @@ -17,7 +17,7 @@ import com.baeldung.spring.cloud.stream.rabbit.processor.MyProcessor; @RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration(classes = MultipleOutputsWithConditionsServiceApplication.class) @DirtiesContext -public class MultipleOutputsWithConditionsServiceApplicationTests { +public class MultipleOutputsWithConditionsServiceUnitTest { @Autowired private MyProcessor pipe; @@ -28,7 +28,7 @@ public class MultipleOutputsWithConditionsServiceApplicationTests { @Test public void whenSendMessage_thenResponseIsInAOutput() { whenSendMessage(1); - thenPayloadInChannelIs(pipe.anotherOutput(), 1); + thenPayloadInChannelIs(pipe.anOutput(), 1); } @Test diff --git a/spring-cloud/spring-cloud-stream/spring-cloud-stream-rabbit/src/test/java/com/baeldung/spring/cloud/stream/rabbit/MyLoggerApplicationTests.java b/spring-cloud/spring-cloud-stream/spring-cloud-stream-rabbit/src/test/java/com/baeldung/spring/cloud/stream/rabbit/MyLoggerApplicationUnitTest.java similarity index 96% rename from spring-cloud/spring-cloud-stream/spring-cloud-stream-rabbit/src/test/java/com/baeldung/spring/cloud/stream/rabbit/MyLoggerApplicationTests.java rename to spring-cloud/spring-cloud-stream/spring-cloud-stream-rabbit/src/test/java/com/baeldung/spring/cloud/stream/rabbit/MyLoggerApplicationUnitTest.java index b939af25fc..1541af3cb5 100644 --- a/spring-cloud/spring-cloud-stream/spring-cloud-stream-rabbit/src/test/java/com/baeldung/spring/cloud/stream/rabbit/MyLoggerApplicationTests.java +++ b/spring-cloud/spring-cloud-stream/spring-cloud-stream-rabbit/src/test/java/com/baeldung/spring/cloud/stream/rabbit/MyLoggerApplicationUnitTest.java @@ -17,7 +17,7 @@ import com.baeldung.spring.cloud.stream.rabbit.model.LogMessage; @RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration(classes = MyLoggerServiceApplication.class) @DirtiesContext -public class MyLoggerApplicationTests { +public class MyLoggerApplicationUnitTest { @Autowired private Processor pipe; From 29fe38bfdeea959588886487c3728573c2b0bb66 Mon Sep 17 00:00:00 2001 From: Dassi Orleando Date: Wed, 15 Nov 2017 05:09:41 +0100 Subject: [PATCH 084/236] BAEL-1190: JUnit 5 upgrade --- testing-modules/junit-5/pom.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/testing-modules/junit-5/pom.xml b/testing-modules/junit-5/pom.xml index 229703ccf5..2be8937d04 100644 --- a/testing-modules/junit-5/pom.xml +++ b/testing-modules/junit-5/pom.xml @@ -20,7 +20,7 @@ UTF-8 1.8 - 5.0.1 + 5.0.2 1.0.1 4.12.1 2.8.2 @@ -127,4 +127,4 @@ - \ No newline at end of file + From 3cc88518bd0ac009d8ad568b708a571bf938d04b Mon Sep 17 00:00:00 2001 From: Ahmed Tawila Date: Wed, 15 Nov 2017 23:40:35 +0200 Subject: [PATCH 085/236] fix compilation error --- .../java/com/baeldung/concurrent/daemon/DaemonThreadTest.java | 3 --- 1 file changed, 3 deletions(-) diff --git a/core-java-concurrency/src/test/java/com/baeldung/concurrent/daemon/DaemonThreadTest.java b/core-java-concurrency/src/test/java/com/baeldung/concurrent/daemon/DaemonThreadTest.java index f0150578ae..3ca69d8847 100644 --- a/core-java-concurrency/src/test/java/com/baeldung/concurrent/daemon/DaemonThreadTest.java +++ b/core-java-concurrency/src/test/java/com/baeldung/concurrent/daemon/DaemonThreadTest.java @@ -3,10 +3,7 @@ package com.baeldung.concurrent.daemon; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; -<<<<<<< HEAD -======= import org.junit.Ignore; ->>>>>>> d54917c7e9f0f74c40982571af8ac9f61782b7cb import org.junit.Test; public class DaemonThreadTest { From 960d8e004c4babafcb3e9762e294a839ca6b189e Mon Sep 17 00:00:00 2001 From: Ahmed Tawila Date: Thu, 16 Nov 2017 06:44:34 +0200 Subject: [PATCH 086/236] BAEL-1309 Append Data to a File with Java --- .../baeldung/file/FileOutputStreamTest.java | 37 ++++++++++++++++ .../java/com/baeldung/file/FileUtilsTest.java | 38 +++++++++++++++++ .../com/baeldung/file/FileWriterTest.java | 42 +++++++++++++++++++ .../java/com/baeldung/file/FilesTest.java | 37 ++++++++++++++++ .../java/com/baeldung/file/GuavaTest.java | 41 ++++++++++++++++++ .../java/com/baeldung/util/StreamUtils.java | 16 +++++++ 6 files changed, 211 insertions(+) create mode 100644 core-java/src/main/java/com/baeldung/file/FileOutputStreamTest.java create mode 100644 core-java/src/main/java/com/baeldung/file/FileUtilsTest.java create mode 100644 core-java/src/main/java/com/baeldung/file/FileWriterTest.java create mode 100644 core-java/src/main/java/com/baeldung/file/FilesTest.java create mode 100644 core-java/src/main/java/com/baeldung/file/GuavaTest.java create mode 100644 core-java/src/main/java/com/baeldung/util/StreamUtils.java diff --git a/core-java/src/main/java/com/baeldung/file/FileOutputStreamTest.java b/core-java/src/main/java/com/baeldung/file/FileOutputStreamTest.java new file mode 100644 index 0000000000..d85c028dae --- /dev/null +++ b/core-java/src/main/java/com/baeldung/file/FileOutputStreamTest.java @@ -0,0 +1,37 @@ +package com.baeldung.file; + +import static org.assertj.core.api.Assertions.assertThat; + +import java.io.FileInputStream; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.PrintWriter; + +import org.junit.After; +import org.junit.Test; + +import com.baeldung.util.StreamUtils; + +public class FileOutputStreamTest { + + public static final String fileName = "src/main/resources/countries.txt"; + + @Test + public void whenAppendToFileUsingFileOutputStream_thenCorrect() throws Exception { + FileOutputStream fos = new FileOutputStream(fileName, true); + fos.write("Spain\r\n".getBytes()); + fos.close(); + + assertThat(StreamUtils.getStringFromInputStream( + new FileInputStream(fileName))) + .isEqualTo("UK\r\n" + "US\r\n" + "Germany\r\n" + "Spain\r\n"); + } + + @After + public void revertFile() throws IOException { + PrintWriter writer = new PrintWriter(fileName); + writer.print(""); + writer.print("UK\r\n" + "US\r\n" + "Germany\r\n"); + writer.close(); + } +} diff --git a/core-java/src/main/java/com/baeldung/file/FileUtilsTest.java b/core-java/src/main/java/com/baeldung/file/FileUtilsTest.java new file mode 100644 index 0000000000..6147653976 --- /dev/null +++ b/core-java/src/main/java/com/baeldung/file/FileUtilsTest.java @@ -0,0 +1,38 @@ +package com.baeldung.file; + +import static org.assertj.core.api.Assertions.assertThat; + +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; +import java.io.PrintWriter; +import java.nio.charset.StandardCharsets; + +import org.apache.commons.io.FileUtils; +import org.junit.After; +import org.junit.Test; + +import com.baeldung.util.StreamUtils; + +public class FileUtilsTest { + + public static final String fileName = "src/main/resources/countries.txt"; + + @Test + public void whenAppendToFileUsingFiles_thenCorrect() throws IOException { + File file = new File(fileName); + FileUtils.writeStringToFile(file, "Spain\r\n", StandardCharsets.UTF_8, true); + + assertThat(StreamUtils.getStringFromInputStream( + new FileInputStream(fileName))) + .isEqualTo("UK\r\n" + "US\r\n" + "Germany\r\n" + "Spain\r\n"); + } + + @After + public void revertFile() throws IOException { + PrintWriter writer = new PrintWriter(fileName); + writer.print(""); + writer.print("UK\r\n" + "US\r\n" + "Germany\r\n"); + writer.close(); + } +} diff --git a/core-java/src/main/java/com/baeldung/file/FileWriterTest.java b/core-java/src/main/java/com/baeldung/file/FileWriterTest.java new file mode 100644 index 0000000000..67e4dfaf20 --- /dev/null +++ b/core-java/src/main/java/com/baeldung/file/FileWriterTest.java @@ -0,0 +1,42 @@ +package com.baeldung.file; + +import static org.assertj.core.api.Assertions.assertThat; + +import java.io.BufferedWriter; +import java.io.FileInputStream; +import java.io.FileWriter; +import java.io.IOException; +import java.io.PrintWriter; + +import org.junit.After; +import org.junit.Test; + +import com.baeldung.util.StreamUtils; + +public class FileWriterTest { + + public static final String fileName = "src/main/resources/countries.txt"; + + @Test + public void whenAppendToFileUsingFileWriter_thenCorrect() throws IOException { + String fileName = "src/main/resources/countries.txt"; + FileWriter fw = new FileWriter(fileName, true); + BufferedWriter bw = new BufferedWriter(fw); + bw.write("Spain"); + bw.newLine(); + bw.close(); + + assertThat( + StreamUtils.getStringFromInputStream( + new FileInputStream(fileName))) + .isEqualTo("UK\r\n" + "US\r\n" + "Germany\r\n" + "Spain\r\n"); + } + + @After + public void revertFile() throws IOException { + PrintWriter writer = new PrintWriter(fileName); + writer.print(""); + writer.print("UK\r\n" + "US\r\n" + "Germany\r\n"); + writer.close(); + } +} diff --git a/core-java/src/main/java/com/baeldung/file/FilesTest.java b/core-java/src/main/java/com/baeldung/file/FilesTest.java new file mode 100644 index 0000000000..0ca69db8ab --- /dev/null +++ b/core-java/src/main/java/com/baeldung/file/FilesTest.java @@ -0,0 +1,37 @@ +package com.baeldung.file; + +import static org.assertj.core.api.Assertions.assertThat; + +import java.io.FileInputStream; +import java.io.IOException; +import java.io.PrintWriter; +import java.nio.file.Files; +import java.nio.file.Paths; +import java.nio.file.StandardOpenOption; + +import org.junit.After; +import org.junit.Test; + +import com.baeldung.util.StreamUtils; + +public class FilesTest { + + public static final String fileName = "src/main/resources/countries.txt"; + + @Test + public void whenAppendToFileUsingFiles_thenCorrect() throws IOException { + Files.write(Paths.get(fileName), "Spain\r\n".getBytes(), StandardOpenOption.APPEND); + + assertThat(StreamUtils.getStringFromInputStream( + new FileInputStream(fileName))) + .isEqualTo("UK\r\n" + "US\r\n" + "Germany\r\n" + "Spain\r\n"); + } + + @After + public void revertFile() throws IOException { + PrintWriter writer = new PrintWriter(fileName); + writer.print(""); + writer.print("UK\r\n" + "US\r\n" + "Germany\r\n"); + writer.close(); + } +} diff --git a/core-java/src/main/java/com/baeldung/file/GuavaTest.java b/core-java/src/main/java/com/baeldung/file/GuavaTest.java new file mode 100644 index 0000000000..06379451f9 --- /dev/null +++ b/core-java/src/main/java/com/baeldung/file/GuavaTest.java @@ -0,0 +1,41 @@ +package com.baeldung.file; + +import static org.assertj.core.api.Assertions.assertThat; + +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; +import java.io.PrintWriter; + +import org.junit.After; +import org.junit.Test; + +import com.baeldung.util.StreamUtils; +import com.google.common.base.Charsets; +import com.google.common.io.CharSink; +import com.google.common.io.FileWriteMode; +import com.google.common.io.Files; + +public class GuavaTest { + + public static final String fileName = "src/main/resources/countries.txt"; + + @Test + public void whenAppendToFileUsingFileWriter_thenCorrect() throws IOException { + File file = new File(fileName); + CharSink chs = Files.asCharSink(file, Charsets.UTF_8, FileWriteMode.APPEND); + chs.write("Spain\r\n"); + + assertThat(StreamUtils.getStringFromInputStream( + new FileInputStream(fileName))) + .isEqualTo("UK\r\n" + "US\r\n" + "Germany\r\n" + "Spain\r\n"); + } + + @After + public void revertFile() throws IOException { + PrintWriter writer = new PrintWriter(fileName); + writer.print(""); + writer.print("UK\r\n" + "US\r\n" + "Germany\r\n"); + writer.close(); + } +} diff --git a/core-java/src/main/java/com/baeldung/util/StreamUtils.java b/core-java/src/main/java/com/baeldung/util/StreamUtils.java new file mode 100644 index 0000000000..42f438732f --- /dev/null +++ b/core-java/src/main/java/com/baeldung/util/StreamUtils.java @@ -0,0 +1,16 @@ +package com.baeldung.util; + +import java.io.IOException; +import java.io.InputStream; +import java.io.StringWriter; + +import org.apache.commons.io.IOUtils; + +public class StreamUtils { + + public static String getStringFromInputStream(InputStream input) throws IOException { + StringWriter writer = new StringWriter(); + IOUtils.copy(input, writer, "UTF-8"); + return writer.toString(); + } +} From 2d3ea1ba241de45e264d5bfe6cc4497dd20ad2a8 Mon Sep 17 00:00:00 2001 From: Ahmed Tawila Date: Thu, 16 Nov 2017 10:21:08 +0200 Subject: [PATCH 087/236] fix build fails --- .../java/com/baeldung/file/FileOutputStreamTest.java | 0 .../src/{main => test}/java/com/baeldung/file/FileUtilsTest.java | 0 .../src/{main => test}/java/com/baeldung/file/FileWriterTest.java | 0 .../src/{main => test}/java/com/baeldung/file/FilesTest.java | 0 .../src/{main => test}/java/com/baeldung/file/GuavaTest.java | 0 5 files changed, 0 insertions(+), 0 deletions(-) rename core-java/src/{main => test}/java/com/baeldung/file/FileOutputStreamTest.java (100%) rename core-java/src/{main => test}/java/com/baeldung/file/FileUtilsTest.java (100%) rename core-java/src/{main => test}/java/com/baeldung/file/FileWriterTest.java (100%) rename core-java/src/{main => test}/java/com/baeldung/file/FilesTest.java (100%) rename core-java/src/{main => test}/java/com/baeldung/file/GuavaTest.java (100%) diff --git a/core-java/src/main/java/com/baeldung/file/FileOutputStreamTest.java b/core-java/src/test/java/com/baeldung/file/FileOutputStreamTest.java similarity index 100% rename from core-java/src/main/java/com/baeldung/file/FileOutputStreamTest.java rename to core-java/src/test/java/com/baeldung/file/FileOutputStreamTest.java diff --git a/core-java/src/main/java/com/baeldung/file/FileUtilsTest.java b/core-java/src/test/java/com/baeldung/file/FileUtilsTest.java similarity index 100% rename from core-java/src/main/java/com/baeldung/file/FileUtilsTest.java rename to core-java/src/test/java/com/baeldung/file/FileUtilsTest.java diff --git a/core-java/src/main/java/com/baeldung/file/FileWriterTest.java b/core-java/src/test/java/com/baeldung/file/FileWriterTest.java similarity index 100% rename from core-java/src/main/java/com/baeldung/file/FileWriterTest.java rename to core-java/src/test/java/com/baeldung/file/FileWriterTest.java diff --git a/core-java/src/main/java/com/baeldung/file/FilesTest.java b/core-java/src/test/java/com/baeldung/file/FilesTest.java similarity index 100% rename from core-java/src/main/java/com/baeldung/file/FilesTest.java rename to core-java/src/test/java/com/baeldung/file/FilesTest.java diff --git a/core-java/src/main/java/com/baeldung/file/GuavaTest.java b/core-java/src/test/java/com/baeldung/file/GuavaTest.java similarity index 100% rename from core-java/src/main/java/com/baeldung/file/GuavaTest.java rename to core-java/src/test/java/com/baeldung/file/GuavaTest.java From 10fe3d060f79fa80180977d4fb3f2bd4cf1d6a87 Mon Sep 17 00:00:00 2001 From: Ahmed Tawila Date: Thu, 16 Nov 2017 10:32:06 +0200 Subject: [PATCH 088/236] fix test error --- core-java/src/test/java/com/baeldung/file/FileWriterTest.java | 1 - 1 file changed, 1 deletion(-) diff --git a/core-java/src/test/java/com/baeldung/file/FileWriterTest.java b/core-java/src/test/java/com/baeldung/file/FileWriterTest.java index 67e4dfaf20..5e1f2f35de 100644 --- a/core-java/src/test/java/com/baeldung/file/FileWriterTest.java +++ b/core-java/src/test/java/com/baeldung/file/FileWriterTest.java @@ -19,7 +19,6 @@ public class FileWriterTest { @Test public void whenAppendToFileUsingFileWriter_thenCorrect() throws IOException { - String fileName = "src/main/resources/countries.txt"; FileWriter fw = new FileWriter(fileName, true); BufferedWriter bw = new BufferedWriter(fw); bw.write("Spain"); From c901cb5fad3619d9baa7a977fbdc1cb3f0a85f4b Mon Sep 17 00:00:00 2001 From: Ahmed Tawila Date: Thu, 16 Nov 2017 10:39:51 +0200 Subject: [PATCH 089/236] fix build failures --- .../src/test/java/com/baeldung/file/FileOutputStreamTest.java | 1 - core-java/src/test/java/com/baeldung/file/FileWriterTest.java | 1 - core-java/src/test/java/com/baeldung/file/FilesTest.java | 1 - core-java/src/test/java/com/baeldung/file/GuavaTest.java | 1 - 4 files changed, 4 deletions(-) diff --git a/core-java/src/test/java/com/baeldung/file/FileOutputStreamTest.java b/core-java/src/test/java/com/baeldung/file/FileOutputStreamTest.java index d85c028dae..98984f9781 100644 --- a/core-java/src/test/java/com/baeldung/file/FileOutputStreamTest.java +++ b/core-java/src/test/java/com/baeldung/file/FileOutputStreamTest.java @@ -30,7 +30,6 @@ public class FileOutputStreamTest { @After public void revertFile() throws IOException { PrintWriter writer = new PrintWriter(fileName); - writer.print(""); writer.print("UK\r\n" + "US\r\n" + "Germany\r\n"); writer.close(); } diff --git a/core-java/src/test/java/com/baeldung/file/FileWriterTest.java b/core-java/src/test/java/com/baeldung/file/FileWriterTest.java index 5e1f2f35de..657593201b 100644 --- a/core-java/src/test/java/com/baeldung/file/FileWriterTest.java +++ b/core-java/src/test/java/com/baeldung/file/FileWriterTest.java @@ -34,7 +34,6 @@ public class FileWriterTest { @After public void revertFile() throws IOException { PrintWriter writer = new PrintWriter(fileName); - writer.print(""); writer.print("UK\r\n" + "US\r\n" + "Germany\r\n"); writer.close(); } diff --git a/core-java/src/test/java/com/baeldung/file/FilesTest.java b/core-java/src/test/java/com/baeldung/file/FilesTest.java index 0ca69db8ab..7da2d5ce7b 100644 --- a/core-java/src/test/java/com/baeldung/file/FilesTest.java +++ b/core-java/src/test/java/com/baeldung/file/FilesTest.java @@ -30,7 +30,6 @@ public class FilesTest { @After public void revertFile() throws IOException { PrintWriter writer = new PrintWriter(fileName); - writer.print(""); writer.print("UK\r\n" + "US\r\n" + "Germany\r\n"); writer.close(); } diff --git a/core-java/src/test/java/com/baeldung/file/GuavaTest.java b/core-java/src/test/java/com/baeldung/file/GuavaTest.java index 06379451f9..df6496b288 100644 --- a/core-java/src/test/java/com/baeldung/file/GuavaTest.java +++ b/core-java/src/test/java/com/baeldung/file/GuavaTest.java @@ -34,7 +34,6 @@ public class GuavaTest { @After public void revertFile() throws IOException { PrintWriter writer = new PrintWriter(fileName); - writer.print(""); writer.print("UK\r\n" + "US\r\n" + "Germany\r\n"); writer.close(); } From 1bbe9196eed2290185b7484461c7cc5457480b75 Mon Sep 17 00:00:00 2001 From: Ahmed Tawila Date: Thu, 16 Nov 2017 10:42:59 +0200 Subject: [PATCH 090/236] cleanup --- core-java/src/test/java/com/baeldung/file/FileUtilsTest.java | 1 - 1 file changed, 1 deletion(-) diff --git a/core-java/src/test/java/com/baeldung/file/FileUtilsTest.java b/core-java/src/test/java/com/baeldung/file/FileUtilsTest.java index 6147653976..aae3c9fa1f 100644 --- a/core-java/src/test/java/com/baeldung/file/FileUtilsTest.java +++ b/core-java/src/test/java/com/baeldung/file/FileUtilsTest.java @@ -31,7 +31,6 @@ public class FileUtilsTest { @After public void revertFile() throws IOException { PrintWriter writer = new PrintWriter(fileName); - writer.print(""); writer.print("UK\r\n" + "US\r\n" + "Germany\r\n"); writer.close(); } From afd142caa030c7e16fbf6b709c29ce18c1e7b4a1 Mon Sep 17 00:00:00 2001 From: Ahmed Tawila Date: Thu, 16 Nov 2017 10:50:25 +0200 Subject: [PATCH 091/236] fix Sneaky Runnable test --- .../com/baeldung/sneakythrows/SneakyRunnableTest.java | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/core-java/src/test/java/com/baeldung/sneakythrows/SneakyRunnableTest.java b/core-java/src/test/java/com/baeldung/sneakythrows/SneakyRunnableTest.java index cd31f545b9..794e70d475 100644 --- a/core-java/src/test/java/com/baeldung/sneakythrows/SneakyRunnableTest.java +++ b/core-java/src/test/java/com/baeldung/sneakythrows/SneakyRunnableTest.java @@ -6,12 +6,8 @@ import static junit.framework.TestCase.assertEquals; public class SneakyRunnableTest { - @Test + @Test(expected = InterruptedException.class) public void whenCallSneakyRunnableMethod_thenThrowException() { - try { - new SneakyRunnable().run(); - } catch (Exception e) { - assertEquals(InterruptedException.class, e.getStackTrace()); - } + new SneakyRunnable().run(); } } From 0ffa8c6c8cae687699c762f25c234b0d2942a5b6 Mon Sep 17 00:00:00 2001 From: Ahmed Tawila Date: Thu, 16 Nov 2017 11:08:27 +0200 Subject: [PATCH 092/236] revert sneaky runnable fix attempt --- .../com/baeldung/sneakythrows/SneakyRunnableTest.java | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/core-java/src/test/java/com/baeldung/sneakythrows/SneakyRunnableTest.java b/core-java/src/test/java/com/baeldung/sneakythrows/SneakyRunnableTest.java index 794e70d475..cd31f545b9 100644 --- a/core-java/src/test/java/com/baeldung/sneakythrows/SneakyRunnableTest.java +++ b/core-java/src/test/java/com/baeldung/sneakythrows/SneakyRunnableTest.java @@ -6,8 +6,12 @@ import static junit.framework.TestCase.assertEquals; public class SneakyRunnableTest { - @Test(expected = InterruptedException.class) + @Test public void whenCallSneakyRunnableMethod_thenThrowException() { - new SneakyRunnable().run(); + try { + new SneakyRunnable().run(); + } catch (Exception e) { + assertEquals(InterruptedException.class, e.getStackTrace()); + } } } From df3aa78d57ac6a3ba16133e336b18f3d37c679a5 Mon Sep 17 00:00:00 2001 From: Ahmed Tawila Date: Thu, 16 Nov 2017 11:31:05 +0200 Subject: [PATCH 093/236] fix test failure --- core-java/src/test/java/com/baeldung/file/GuavaTest.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/core-java/src/test/java/com/baeldung/file/GuavaTest.java b/core-java/src/test/java/com/baeldung/file/GuavaTest.java index df6496b288..f6bd71eb15 100644 --- a/core-java/src/test/java/com/baeldung/file/GuavaTest.java +++ b/core-java/src/test/java/com/baeldung/file/GuavaTest.java @@ -21,10 +21,10 @@ public class GuavaTest { public static final String fileName = "src/main/resources/countries.txt"; @Test - public void whenAppendToFileUsingFileWriter_thenCorrect() throws IOException { + public void whenAppendToFileUsingGuava_thenCorrect() throws IOException { File file = new File(fileName); CharSink chs = Files.asCharSink(file, Charsets.UTF_8, FileWriteMode.APPEND); - chs.write("Spain\r\n"); + chs.write("Spain\n"); assertThat(StreamUtils.getStringFromInputStream( new FileInputStream(fileName))) From f6ca36fa21fedac14324ac067d38f1ec1574672d Mon Sep 17 00:00:00 2001 From: Ahmed Tawila Date: Thu, 16 Nov 2017 11:38:58 +0200 Subject: [PATCH 094/236] fix test failure --- core-java/src/test/java/com/baeldung/file/FileWriterTest.java | 2 +- core-java/src/test/java/com/baeldung/file/GuavaTest.java | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/core-java/src/test/java/com/baeldung/file/FileWriterTest.java b/core-java/src/test/java/com/baeldung/file/FileWriterTest.java index 657593201b..b916f2b2c1 100644 --- a/core-java/src/test/java/com/baeldung/file/FileWriterTest.java +++ b/core-java/src/test/java/com/baeldung/file/FileWriterTest.java @@ -28,7 +28,7 @@ public class FileWriterTest { assertThat( StreamUtils.getStringFromInputStream( new FileInputStream(fileName))) - .isEqualTo("UK\r\n" + "US\r\n" + "Germany\r\n" + "Spain\r\n"); + .isEqualTo("UK\r\n" + "US\r\n" + "Germany\r\n" + "Spain\n"); } @After diff --git a/core-java/src/test/java/com/baeldung/file/GuavaTest.java b/core-java/src/test/java/com/baeldung/file/GuavaTest.java index f6bd71eb15..b17b12c464 100644 --- a/core-java/src/test/java/com/baeldung/file/GuavaTest.java +++ b/core-java/src/test/java/com/baeldung/file/GuavaTest.java @@ -24,11 +24,11 @@ public class GuavaTest { public void whenAppendToFileUsingGuava_thenCorrect() throws IOException { File file = new File(fileName); CharSink chs = Files.asCharSink(file, Charsets.UTF_8, FileWriteMode.APPEND); - chs.write("Spain\n"); + chs.write("Spain"); assertThat(StreamUtils.getStringFromInputStream( new FileInputStream(fileName))) - .isEqualTo("UK\r\n" + "US\r\n" + "Germany\r\n" + "Spain\r\n"); + .isEqualTo("UK\r\n" + "US\r\n" + "Germany\r\n" + "Spain"); } @After From 31a26aca25d08aa53b6ca53d810d5eb28a114687 Mon Sep 17 00:00:00 2001 From: Ahmed Tawila Date: Thu, 16 Nov 2017 12:01:08 +0200 Subject: [PATCH 095/236] fix all test failures --- core-java/src/main/resources/countries.properties | 3 +++ .../src/test/java/com/baeldung/file/FileOutputStreamTest.java | 2 +- core-java/src/test/java/com/baeldung/file/FileUtilsTest.java | 2 +- core-java/src/test/java/com/baeldung/file/FileWriterTest.java | 2 +- core-java/src/test/java/com/baeldung/file/FilesTest.java | 2 +- core-java/src/test/java/com/baeldung/file/GuavaTest.java | 2 +- 6 files changed, 8 insertions(+), 5 deletions(-) create mode 100644 core-java/src/main/resources/countries.properties diff --git a/core-java/src/main/resources/countries.properties b/core-java/src/main/resources/countries.properties new file mode 100644 index 0000000000..3c1f53aded --- /dev/null +++ b/core-java/src/main/resources/countries.properties @@ -0,0 +1,3 @@ +UK +US +Germany diff --git a/core-java/src/test/java/com/baeldung/file/FileOutputStreamTest.java b/core-java/src/test/java/com/baeldung/file/FileOutputStreamTest.java index 98984f9781..451c1b4c4d 100644 --- a/core-java/src/test/java/com/baeldung/file/FileOutputStreamTest.java +++ b/core-java/src/test/java/com/baeldung/file/FileOutputStreamTest.java @@ -14,7 +14,7 @@ import com.baeldung.util.StreamUtils; public class FileOutputStreamTest { - public static final String fileName = "src/main/resources/countries.txt"; + public static final String fileName = "src/main/resources/countries.properties"; @Test public void whenAppendToFileUsingFileOutputStream_thenCorrect() throws Exception { diff --git a/core-java/src/test/java/com/baeldung/file/FileUtilsTest.java b/core-java/src/test/java/com/baeldung/file/FileUtilsTest.java index aae3c9fa1f..9ee8726575 100644 --- a/core-java/src/test/java/com/baeldung/file/FileUtilsTest.java +++ b/core-java/src/test/java/com/baeldung/file/FileUtilsTest.java @@ -16,7 +16,7 @@ import com.baeldung.util.StreamUtils; public class FileUtilsTest { - public static final String fileName = "src/main/resources/countries.txt"; + public static final String fileName = "src/main/resources/countries.properties"; @Test public void whenAppendToFileUsingFiles_thenCorrect() throws IOException { diff --git a/core-java/src/test/java/com/baeldung/file/FileWriterTest.java b/core-java/src/test/java/com/baeldung/file/FileWriterTest.java index b916f2b2c1..8d2ce4310e 100644 --- a/core-java/src/test/java/com/baeldung/file/FileWriterTest.java +++ b/core-java/src/test/java/com/baeldung/file/FileWriterTest.java @@ -15,7 +15,7 @@ import com.baeldung.util.StreamUtils; public class FileWriterTest { - public static final String fileName = "src/main/resources/countries.txt"; + public static final String fileName = "src/main/resources/countries.properties"; @Test public void whenAppendToFileUsingFileWriter_thenCorrect() throws IOException { diff --git a/core-java/src/test/java/com/baeldung/file/FilesTest.java b/core-java/src/test/java/com/baeldung/file/FilesTest.java index 7da2d5ce7b..bd39d004d3 100644 --- a/core-java/src/test/java/com/baeldung/file/FilesTest.java +++ b/core-java/src/test/java/com/baeldung/file/FilesTest.java @@ -16,7 +16,7 @@ import com.baeldung.util.StreamUtils; public class FilesTest { - public static final String fileName = "src/main/resources/countries.txt"; + public static final String fileName = "src/main/resources/countries.properties"; @Test public void whenAppendToFileUsingFiles_thenCorrect() throws IOException { diff --git a/core-java/src/test/java/com/baeldung/file/GuavaTest.java b/core-java/src/test/java/com/baeldung/file/GuavaTest.java index b17b12c464..5caa59e596 100644 --- a/core-java/src/test/java/com/baeldung/file/GuavaTest.java +++ b/core-java/src/test/java/com/baeldung/file/GuavaTest.java @@ -18,7 +18,7 @@ import com.google.common.io.Files; public class GuavaTest { - public static final String fileName = "src/main/resources/countries.txt"; + public static final String fileName = "src/main/resources/countries.properties"; @Test public void whenAppendToFileUsingGuava_thenCorrect() throws IOException { From 53074cd7f01469884fa3f9271cc705d4f86ca476 Mon Sep 17 00:00:00 2001 From: Ahmed Tawila Date: Thu, 16 Nov 2017 12:07:48 +0200 Subject: [PATCH 096/236] fix test failure --- core-java/src/test/java/com/baeldung/file/GuavaTest.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/core-java/src/test/java/com/baeldung/file/GuavaTest.java b/core-java/src/test/java/com/baeldung/file/GuavaTest.java index 5caa59e596..acac9172b4 100644 --- a/core-java/src/test/java/com/baeldung/file/GuavaTest.java +++ b/core-java/src/test/java/com/baeldung/file/GuavaTest.java @@ -24,11 +24,11 @@ public class GuavaTest { public void whenAppendToFileUsingGuava_thenCorrect() throws IOException { File file = new File(fileName); CharSink chs = Files.asCharSink(file, Charsets.UTF_8, FileWriteMode.APPEND); - chs.write("Spain"); + chs.write("Spain\r\n"); assertThat(StreamUtils.getStringFromInputStream( new FileInputStream(fileName))) - .isEqualTo("UK\r\n" + "US\r\n" + "Germany\r\n" + "Spain"); + .isEqualTo("UK\r\n" + "US\r\n" + "Germany\r\n" + "Spain\r\n"); } @After From 1a368ca9f394cb37b9a5fa0408ff7ae70806495b Mon Sep 17 00:00:00 2001 From: Ahmed Tawila Date: Thu, 16 Nov 2017 12:22:12 +0200 Subject: [PATCH 097/236] fix test failures --- core-java/src/test/java/com/baeldung/file/GuavaTest.java | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/core-java/src/test/java/com/baeldung/file/GuavaTest.java b/core-java/src/test/java/com/baeldung/file/GuavaTest.java index acac9172b4..5a7ec6c4a8 100644 --- a/core-java/src/test/java/com/baeldung/file/GuavaTest.java +++ b/core-java/src/test/java/com/baeldung/file/GuavaTest.java @@ -8,6 +8,7 @@ import java.io.IOException; import java.io.PrintWriter; import org.junit.After; +import org.junit.Before; import org.junit.Test; import com.baeldung.util.StreamUtils; @@ -19,6 +20,13 @@ import com.google.common.io.Files; public class GuavaTest { public static final String fileName = "src/main/resources/countries.properties"; + + @Before + public void setup() throws Exception { + PrintWriter writer = new PrintWriter(fileName); + writer.print("UK\r\n" + "US\r\n" + "Germany\r\n"); + writer.close(); + } @Test public void whenAppendToFileUsingGuava_thenCorrect() throws IOException { From ff3001386e066b7db58872db9298628b3a9ab965 Mon Sep 17 00:00:00 2001 From: abialas Date: Thu, 16 Nov 2017 22:57:21 +0100 Subject: [PATCH 098/236] BAEL-1344 add java8 convert methods date, localdate, localdatetime --- .../datetime/DateToLocalDateConverter.java | 34 ++++++++ .../DateToLocalDateTimeConverter.java | 34 ++++++++ .../LocalDateTimeToDateConverter.java | 27 +++++++ .../datetime/LocalDateToDateConverter.java | 28 +++++++ .../DateToLocalDateConverterTest.java | 72 +++++++++++++++++ .../DateToLocalDateTimeConverterTest.java | 78 +++++++++++++++++++ .../LocalDateTimeToDateConverterTest.java | 61 +++++++++++++++ .../LocalDateToDateConverterTest.java | 55 +++++++++++++ 8 files changed, 389 insertions(+) create mode 100644 core-java-8/src/main/java/com/baeldung/datetime/DateToLocalDateConverter.java create mode 100644 core-java-8/src/main/java/com/baeldung/datetime/DateToLocalDateTimeConverter.java create mode 100644 core-java-8/src/main/java/com/baeldung/datetime/LocalDateTimeToDateConverter.java create mode 100644 core-java-8/src/main/java/com/baeldung/datetime/LocalDateToDateConverter.java create mode 100644 core-java-8/src/test/java/com/baeldung/datetime/DateToLocalDateConverterTest.java create mode 100644 core-java-8/src/test/java/com/baeldung/datetime/DateToLocalDateTimeConverterTest.java create mode 100644 core-java-8/src/test/java/com/baeldung/datetime/LocalDateTimeToDateConverterTest.java create mode 100644 core-java-8/src/test/java/com/baeldung/datetime/LocalDateToDateConverterTest.java diff --git a/core-java-8/src/main/java/com/baeldung/datetime/DateToLocalDateConverter.java b/core-java-8/src/main/java/com/baeldung/datetime/DateToLocalDateConverter.java new file mode 100644 index 0000000000..1ef77a2960 --- /dev/null +++ b/core-java-8/src/main/java/com/baeldung/datetime/DateToLocalDateConverter.java @@ -0,0 +1,34 @@ +/** + * + */ +package com.baeldung.datetime; + +import java.time.Instant; +import java.time.LocalDate; +import java.time.ZoneId; +import java.util.Date; + +/** + * Class which shows different ways of converting java.util.Date into java.time.LocalDate. + * + * @author abialas + * + */ +public class DateToLocalDateConverter { + + public static LocalDate convertToLocalDateViaInstant(Date dateToConvert) { + return dateToConvert.toInstant() + .atZone(ZoneId.systemDefault()) + .toLocalDate(); + } + + public static LocalDate convertToLocalDateViaSqlDate(Date dateToConvert) { + return new java.sql.Date(dateToConvert.getTime()).toLocalDate(); + } + + public static LocalDate convertToLocalDateViaMilisecond(Date dateToConvert) { + return LocalDate.from(Instant.ofEpochMilli(dateToConvert.getTime()) + .atZone(ZoneId.systemDefault())); + } + +} diff --git a/core-java-8/src/main/java/com/baeldung/datetime/DateToLocalDateTimeConverter.java b/core-java-8/src/main/java/com/baeldung/datetime/DateToLocalDateTimeConverter.java new file mode 100644 index 0000000000..78abb6a94c --- /dev/null +++ b/core-java-8/src/main/java/com/baeldung/datetime/DateToLocalDateTimeConverter.java @@ -0,0 +1,34 @@ +/** + * + */ +package com.baeldung.datetime; + +import java.time.Instant; +import java.time.LocalDateTime; +import java.time.ZoneId; +import java.util.Date; + +/** + * Class which shows different ways of converting java.util.Date into java.time.LocalDateTime. + * + * @author abialas + * + */ +public class DateToLocalDateTimeConverter { + + public static LocalDateTime convertToLocalDateTimeViaInstant(Date dateToConvert) { + return dateToConvert.toInstant() + .atZone(ZoneId.systemDefault()) + .toLocalDateTime(); + } + + public static LocalDateTime convertToLocalDateTimeViaSqlTimestamp(Date dateToConvert) { + return new java.sql.Timestamp(dateToConvert.getTime()).toLocalDateTime(); + } + + public static LocalDateTime convertToLocalDateTimeViaMilisecond(Date dateToConvert) { + return LocalDateTime.from(Instant.ofEpochMilli(dateToConvert.getTime()) + .atZone(ZoneId.systemDefault())); + } + +} diff --git a/core-java-8/src/main/java/com/baeldung/datetime/LocalDateTimeToDateConverter.java b/core-java-8/src/main/java/com/baeldung/datetime/LocalDateTimeToDateConverter.java new file mode 100644 index 0000000000..ef72c8b4fb --- /dev/null +++ b/core-java-8/src/main/java/com/baeldung/datetime/LocalDateTimeToDateConverter.java @@ -0,0 +1,27 @@ +/** + * + */ +package com.baeldung.datetime; + +import java.time.LocalDateTime; +import java.time.ZoneId; +import java.util.Date; + +/** + * Class which shows different ways of converting java.time.LocalDateTime into java.util.Date. + * + * @author abialas + * + */ +public class LocalDateTimeToDateConverter { + + public static Date convertToDateViaSqlTimestamp(LocalDateTime dateToConvert) { + return java.sql.Timestamp.valueOf(dateToConvert); + } + + public static Date convertToDateViaInstant(LocalDateTime dateToConvert) { + return java.util.Date.from(dateToConvert.atZone(ZoneId.systemDefault()) + .toInstant()); + } + +} diff --git a/core-java-8/src/main/java/com/baeldung/datetime/LocalDateToDateConverter.java b/core-java-8/src/main/java/com/baeldung/datetime/LocalDateToDateConverter.java new file mode 100644 index 0000000000..8050815799 --- /dev/null +++ b/core-java-8/src/main/java/com/baeldung/datetime/LocalDateToDateConverter.java @@ -0,0 +1,28 @@ +/** + * + */ +package com.baeldung.datetime; + +import java.time.LocalDate; +import java.time.ZoneId; +import java.util.Date; + +/** + * Class which shows different ways of converting java.time.LocalDate into java.util.Date. + * + * @author abialas + * + */ +public class LocalDateToDateConverter { + + public static Date convertToDateViaSqlDate(LocalDate dateToConvert) { + return java.sql.Date.valueOf(dateToConvert); + } + + public static Date convertToDateViaInstant(LocalDate dateToConvert) { + return java.util.Date.from(dateToConvert.atStartOfDay() + .atZone(ZoneId.systemDefault()) + .toInstant()); + } + +} diff --git a/core-java-8/src/test/java/com/baeldung/datetime/DateToLocalDateConverterTest.java b/core-java-8/src/test/java/com/baeldung/datetime/DateToLocalDateConverterTest.java new file mode 100644 index 0000000000..5de6ae3e59 --- /dev/null +++ b/core-java-8/src/test/java/com/baeldung/datetime/DateToLocalDateConverterTest.java @@ -0,0 +1,72 @@ +/** + * + */ +package com.baeldung.datetime; + +import static org.junit.Assert.assertEquals; + +import java.time.LocalDate; +import java.time.temporal.ChronoField; +import java.util.Calendar; +import java.util.Date; + +import org.junit.Test; + +/** + * + * JUnits for {@link DateToLocalDateConverter} class. + * + * @author abialas + * + */ +public class DateToLocalDateConverterTest { + + @Test + public void shouldReturn10thNovember2010WhenConvertViaInstant() { + // given + Calendar calendar = Calendar.getInstance(); + calendar.set(2010, 10, 10); + Date dateToConvert = calendar.getTime(); + + // when + LocalDate localDate = DateToLocalDateConverter.convertToLocalDateViaInstant(dateToConvert); + + // then + assertEquals(2010, localDate.get(ChronoField.YEAR)); + assertEquals(11, localDate.get(ChronoField.MONTH_OF_YEAR)); + assertEquals(10, localDate.get(ChronoField.DAY_OF_MONTH)); + } + + @Test + public void shouldReturn10thNovember2010WhenConvertViaMiliseconds() { + // given + Calendar calendar = Calendar.getInstance(); + calendar.set(2010, 10, 10); + Date dateToConvert = calendar.getTime(); + + // when + LocalDate localDate = DateToLocalDateConverter.convertToLocalDateViaMilisecond(dateToConvert); + + // then + assertEquals(2010, localDate.get(ChronoField.YEAR)); + assertEquals(11, localDate.get(ChronoField.MONTH_OF_YEAR)); + assertEquals(10, localDate.get(ChronoField.DAY_OF_MONTH)); + } + + @Test + public void shouldReturn10thNovember2010WhenConvertViaSqlDate() { + // given + Calendar calendar = Calendar.getInstance(); + calendar.set(2010, 10, 10); + Date dateToConvert = calendar.getTime(); + + // when + LocalDate localDate = DateToLocalDateConverter.convertToLocalDateViaSqlDate(dateToConvert); + + // then + assertEquals(2010, localDate.get(ChronoField.YEAR)); + assertEquals(11, localDate.get(ChronoField.MONTH_OF_YEAR)); + assertEquals(10, localDate.get(ChronoField.DAY_OF_MONTH)); + } + +} diff --git a/core-java-8/src/test/java/com/baeldung/datetime/DateToLocalDateTimeConverterTest.java b/core-java-8/src/test/java/com/baeldung/datetime/DateToLocalDateTimeConverterTest.java new file mode 100644 index 0000000000..6d8fb8ea93 --- /dev/null +++ b/core-java-8/src/test/java/com/baeldung/datetime/DateToLocalDateTimeConverterTest.java @@ -0,0 +1,78 @@ +/** + * + */ +package com.baeldung.datetime; + +import static org.junit.Assert.assertEquals; + +import java.time.LocalDateTime; +import java.time.temporal.ChronoField; +import java.util.Calendar; +import java.util.Date; + +import org.junit.Test; + +/** + * + * JUnits for {@link DateToLocalDateTimeConverter} class. + * + * @author abialas + * + */ +public class DateToLocalDateTimeConverterTest { + + @Test + public void shouldReturn10thNovember2010time8hour20minWhenConvertViaInstant() { + // given + Calendar calendar = Calendar.getInstance(); + calendar.set(2010, 10, 10, 8, 20); + Date dateToConvert = calendar.getTime(); + + // when + LocalDateTime localDateTime = DateToLocalDateTimeConverter.convertToLocalDateTimeViaInstant(dateToConvert); + + // then + assertEquals(2010, localDateTime.get(ChronoField.YEAR)); + assertEquals(11, localDateTime.get(ChronoField.MONTH_OF_YEAR)); + assertEquals(10, localDateTime.get(ChronoField.DAY_OF_MONTH)); + assertEquals(8, localDateTime.get(ChronoField.HOUR_OF_DAY)); + assertEquals(20, localDateTime.get(ChronoField.MINUTE_OF_HOUR)); + } + + @Test + public void shouldReturn10thNovember2010time8hour20minWhenConvertViaMiliseconds() { + // given + Calendar calendar = Calendar.getInstance(); + calendar.set(2010, 10, 10, 8, 20); + Date dateToConvert = calendar.getTime(); + + // when + LocalDateTime localDateTime = DateToLocalDateTimeConverter.convertToLocalDateTimeViaMilisecond(dateToConvert); + + // then + assertEquals(2010, localDateTime.get(ChronoField.YEAR)); + assertEquals(11, localDateTime.get(ChronoField.MONTH_OF_YEAR)); + assertEquals(10, localDateTime.get(ChronoField.DAY_OF_MONTH)); + assertEquals(8, localDateTime.get(ChronoField.HOUR_OF_DAY)); + assertEquals(20, localDateTime.get(ChronoField.MINUTE_OF_HOUR)); + } + + @Test + public void shouldReturn10thNovember2010time8hour20minWhenConvertViaSqlTimestamp() { + // given + Calendar calendar = Calendar.getInstance(); + calendar.set(2010, 10, 10, 8, 20); + Date dateToConvert = calendar.getTime(); + + // when + LocalDateTime localDateTime = DateToLocalDateTimeConverter.convertToLocalDateTimeViaSqlTimestamp(dateToConvert); + + // then + assertEquals(2010, localDateTime.get(ChronoField.YEAR)); + assertEquals(11, localDateTime.get(ChronoField.MONTH_OF_YEAR)); + assertEquals(10, localDateTime.get(ChronoField.DAY_OF_MONTH)); + assertEquals(8, localDateTime.get(ChronoField.HOUR_OF_DAY)); + assertEquals(20, localDateTime.get(ChronoField.MINUTE_OF_HOUR)); + } + +} diff --git a/core-java-8/src/test/java/com/baeldung/datetime/LocalDateTimeToDateConverterTest.java b/core-java-8/src/test/java/com/baeldung/datetime/LocalDateTimeToDateConverterTest.java new file mode 100644 index 0000000000..519fa69f04 --- /dev/null +++ b/core-java-8/src/test/java/com/baeldung/datetime/LocalDateTimeToDateConverterTest.java @@ -0,0 +1,61 @@ +/** + * + */ +package com.baeldung.datetime; + +import static org.junit.Assert.assertEquals; + +import java.time.LocalDateTime; +import java.util.Calendar; +import java.util.Date; + +import org.junit.Test; + +/** + * + * JUnits for {@link LocalDateTimeToDateConverter} class. + * + * @author abialas + * + */ +public class LocalDateTimeToDateConverterTest { + + @Test + public void shouldReturn10thNovember2010time8hour20minWhenConvertViaInstant() { + // given + LocalDateTime dateToConvert = LocalDateTime.of(2010, 11, 10, 8, 20); + + // when + Date date = LocalDateTimeToDateConverter.convertToDateViaInstant(dateToConvert); + Calendar calendar = Calendar.getInstance(); + calendar.setTime(date); + + // then + assertEquals(2010, calendar.get(Calendar.YEAR)); + assertEquals(10, calendar.get(Calendar.MONTH)); + assertEquals(10, calendar.get(Calendar.DAY_OF_MONTH)); + assertEquals(8, calendar.get(Calendar.HOUR)); + assertEquals(20, calendar.get(Calendar.MINUTE)); + assertEquals(0, calendar.get(Calendar.SECOND)); + } + + @Test + public void shouldReturn10thNovember2010WhenConvertViaSqlTimestamp() { + // given + LocalDateTime dateToConvert = LocalDateTime.of(2010, 11, 10, 8, 20); + + // when + Date date = LocalDateTimeToDateConverter.convertToDateViaSqlTimestamp(dateToConvert); + Calendar calendar = Calendar.getInstance(); + calendar.setTime(date); + + // then + assertEquals(2010, calendar.get(Calendar.YEAR)); + assertEquals(10, calendar.get(Calendar.MONTH)); + assertEquals(10, calendar.get(Calendar.DAY_OF_MONTH)); + assertEquals(8, calendar.get(Calendar.HOUR)); + assertEquals(20, calendar.get(Calendar.MINUTE)); + assertEquals(0, calendar.get(Calendar.SECOND)); + } + +} diff --git a/core-java-8/src/test/java/com/baeldung/datetime/LocalDateToDateConverterTest.java b/core-java-8/src/test/java/com/baeldung/datetime/LocalDateToDateConverterTest.java new file mode 100644 index 0000000000..c1da3af052 --- /dev/null +++ b/core-java-8/src/test/java/com/baeldung/datetime/LocalDateToDateConverterTest.java @@ -0,0 +1,55 @@ +/** + * + */ +package com.baeldung.datetime; + +import static org.junit.Assert.assertEquals; + +import java.time.LocalDate; +import java.util.Calendar; +import java.util.Date; + +import org.junit.Test; + +/** + * + * JUnits for {@link LocalDateToDateConverter} class. + * + * @author abialas + * + */ +public class LocalDateToDateConverterTest { + + @Test + public void shouldReturn10thNovember2010WhenConvertViaInstant() { + // given + LocalDate dateToConvert = LocalDate.of(2010, 11, 10); + + // when + Date date = LocalDateToDateConverter.convertToDateViaInstant(dateToConvert); + Calendar calendar = Calendar.getInstance(); + calendar.setTime(date); + + // then + assertEquals(2010, calendar.get(Calendar.YEAR)); + assertEquals(10, calendar.get(Calendar.MONTH)); + assertEquals(10, calendar.get(Calendar.DAY_OF_MONTH)); + } + + @Test + public void shouldReturn10thNovember2010WhenConvertViaSqlDate() { + // given + LocalDate dateToConvert = LocalDate.of(2010, 11, 10); + + // when + Date date = LocalDateToDateConverter.convertToDateViaSqlDate(dateToConvert); + Calendar calendar = Calendar.getInstance(); + calendar.setTime(date); + + // then + assertEquals(2010, calendar.get(Calendar.YEAR)); + assertEquals(10, calendar.get(Calendar.MONTH)); + assertEquals(10, calendar.get(Calendar.DAY_OF_MONTH)); + } + +} From 99ae59b9611c06045f376fc71e622687508d31b7 Mon Sep 17 00:00:00 2001 From: abialas Date: Fri, 17 Nov 2017 23:46:09 +0100 Subject: [PATCH 099/236] BAEL-1344 add java9 example --- .../datetime/DateToLocalDateConverter.java | 5 ++- .../DateToLocalDateTimeConverter.java | 5 ++- .../datetime/DateToLocalDateConverter.java | 22 ++++++++++ .../DateToLocalDateTimeConverter.java | 22 ++++++++++ .../DateToLocalDateConverterTest.java | 41 ++++++++++++++++++ .../DateToLocalDateTimeConverterTest.java | 43 +++++++++++++++++++ 6 files changed, 134 insertions(+), 4 deletions(-) create mode 100644 core-java-9/src/main/java/com/baeldung/java9/datetime/DateToLocalDateConverter.java create mode 100644 core-java-9/src/main/java/com/baeldung/java9/datetime/DateToLocalDateTimeConverter.java create mode 100644 core-java-9/src/test/java/com/baeldung/java9/datetime/DateToLocalDateConverterTest.java create mode 100644 core-java-9/src/test/java/com/baeldung/java9/datetime/DateToLocalDateTimeConverterTest.java diff --git a/core-java-8/src/main/java/com/baeldung/datetime/DateToLocalDateConverter.java b/core-java-8/src/main/java/com/baeldung/datetime/DateToLocalDateConverter.java index 1ef77a2960..8788aac747 100644 --- a/core-java-8/src/main/java/com/baeldung/datetime/DateToLocalDateConverter.java +++ b/core-java-8/src/main/java/com/baeldung/datetime/DateToLocalDateConverter.java @@ -27,8 +27,9 @@ public class DateToLocalDateConverter { } public static LocalDate convertToLocalDateViaMilisecond(Date dateToConvert) { - return LocalDate.from(Instant.ofEpochMilli(dateToConvert.getTime()) - .atZone(ZoneId.systemDefault())); + return Instant.ofEpochMilli(dateToConvert.getTime()) + .atZone(ZoneId.systemDefault()) + .toLocalDate(); } } diff --git a/core-java-8/src/main/java/com/baeldung/datetime/DateToLocalDateTimeConverter.java b/core-java-8/src/main/java/com/baeldung/datetime/DateToLocalDateTimeConverter.java index 78abb6a94c..f994023526 100644 --- a/core-java-8/src/main/java/com/baeldung/datetime/DateToLocalDateTimeConverter.java +++ b/core-java-8/src/main/java/com/baeldung/datetime/DateToLocalDateTimeConverter.java @@ -27,8 +27,9 @@ public class DateToLocalDateTimeConverter { } public static LocalDateTime convertToLocalDateTimeViaMilisecond(Date dateToConvert) { - return LocalDateTime.from(Instant.ofEpochMilli(dateToConvert.getTime()) - .atZone(ZoneId.systemDefault())); + return Instant.ofEpochMilli(dateToConvert.getTime()) + .atZone(ZoneId.systemDefault()) + .toLocalDateTime(); } } diff --git a/core-java-9/src/main/java/com/baeldung/java9/datetime/DateToLocalDateConverter.java b/core-java-9/src/main/java/com/baeldung/java9/datetime/DateToLocalDateConverter.java new file mode 100644 index 0000000000..bafa9ebff1 --- /dev/null +++ b/core-java-9/src/main/java/com/baeldung/java9/datetime/DateToLocalDateConverter.java @@ -0,0 +1,22 @@ +/** + * + */ +package com.baeldung.java9.datetime; + +import java.time.LocalDate; +import java.time.ZoneId; +import java.util.Date; + +/** + * Class which shows a way to convert java.util.Date into java.time.LocalDate with new Java 1.9. + * + * @author abialas + * + */ +public class DateToLocalDateConverter { + + public static LocalDate convertToLocalDate(Date dateToConvert) { + return LocalDate.ofInstant(dateToConvert.toInstant(), ZoneId.systemDefault()); + } + +} diff --git a/core-java-9/src/main/java/com/baeldung/java9/datetime/DateToLocalDateTimeConverter.java b/core-java-9/src/main/java/com/baeldung/java9/datetime/DateToLocalDateTimeConverter.java new file mode 100644 index 0000000000..538d5a9f63 --- /dev/null +++ b/core-java-9/src/main/java/com/baeldung/java9/datetime/DateToLocalDateTimeConverter.java @@ -0,0 +1,22 @@ +/** + * + */ +package com.baeldung.java9.datetime; + +import java.time.LocalDateTime; +import java.time.ZoneId; +import java.util.Date; + +/** + * Class which shows a way to convert java.util.Date into java.time.LocalDateTime with new Java 1.9. + * + * @author abialas + * + */ +public class DateToLocalDateTimeConverter { + + public static LocalDateTime convertToLocalDateTime(Date dateToConvert) { + return LocalDateTime.ofInstant(dateToConvert.toInstant(), ZoneId.systemDefault()); + } + +} diff --git a/core-java-9/src/test/java/com/baeldung/java9/datetime/DateToLocalDateConverterTest.java b/core-java-9/src/test/java/com/baeldung/java9/datetime/DateToLocalDateConverterTest.java new file mode 100644 index 0000000000..2e0fb0dedd --- /dev/null +++ b/core-java-9/src/test/java/com/baeldung/java9/datetime/DateToLocalDateConverterTest.java @@ -0,0 +1,41 @@ +/** + * + */ +package com.baeldung.java9.datetime; + +import static org.junit.Assert.assertEquals; + +import java.time.LocalDate; +import java.time.temporal.ChronoField; +import java.util.Calendar; +import java.util.Date; + +import org.junit.Test; + +import com.baeldung.java9.datetime.DateToLocalDateConverter; + +/** + * JUnits for {@link DateToLocalDateConverter} class. + * + * @author abialas + * + */ +public class DateToLocalDateConverterTest { + + @Test + public void shouldReturn10thNovember2010WhenConvertToLocalDate() { + // given + Calendar calendar = Calendar.getInstance(); + calendar.set(2010, 10, 10); + Date dateToConvert = calendar.getTime(); + + // when + LocalDate localDateTime = DateToLocalDateConverter.convertToLocalDate(dateToConvert); + + // then + assertEquals(2010, localDateTime.get(ChronoField.YEAR)); + assertEquals(11, localDateTime.get(ChronoField.MONTH_OF_YEAR)); + assertEquals(10, localDateTime.get(ChronoField.DAY_OF_MONTH)); + } + +} diff --git a/core-java-9/src/test/java/com/baeldung/java9/datetime/DateToLocalDateTimeConverterTest.java b/core-java-9/src/test/java/com/baeldung/java9/datetime/DateToLocalDateTimeConverterTest.java new file mode 100644 index 0000000000..49988c8b33 --- /dev/null +++ b/core-java-9/src/test/java/com/baeldung/java9/datetime/DateToLocalDateTimeConverterTest.java @@ -0,0 +1,43 @@ +/** + * + */ +package com.baeldung.java9.datetime; + +import static org.junit.Assert.assertEquals; + +import java.time.LocalDateTime; +import java.time.temporal.ChronoField; +import java.util.Calendar; +import java.util.Date; + +import org.junit.Test; + +import com.baeldung.java9.datetime.DateToLocalDateTimeConverter; + +/** + * JUnits for {@link DateToLocalDateTimeConverter} class. + * + * @author abialas + * + */ +public class DateToLocalDateTimeConverterTest { + + @Test + public void shouldReturn10thNovember2010time8hour20minWhenConvertViaInstant() { + // given + Calendar calendar = Calendar.getInstance(); + calendar.set(2010, 10, 10, 8, 20); + Date dateToConvert = calendar.getTime(); + + // when + LocalDateTime localDateTime = DateToLocalDateTimeConverter.convertToLocalDateTime(dateToConvert); + + // then + assertEquals(2010, localDateTime.get(ChronoField.YEAR)); + assertEquals(11, localDateTime.get(ChronoField.MONTH_OF_YEAR)); + assertEquals(10, localDateTime.get(ChronoField.DAY_OF_MONTH)); + assertEquals(8, localDateTime.get(ChronoField.HOUR_OF_DAY)); + assertEquals(20, localDateTime.get(ChronoField.MINUTE_OF_HOUR)); + } + +} From 449c107ef224dad82f7814c0965b69f632c7b894 Mon Sep 17 00:00:00 2001 From: "Hany.Ahmed" Date: Mon, 20 Nov 2017 21:46:29 +0200 Subject: [PATCH 100/236] BAEL-1184 Quick Guide to BDDMockito --- .../baeldung/bddmockito/BDDMockitoTest.java | 104 ++++++++++++++++++ .../bddmockito/PhoneBookRepository.java | 26 +++++ .../baeldung/bddmockito/PhoneBookService.java | 34 ++++++ 3 files changed, 164 insertions(+) create mode 100644 testing-modules/mockito/src/test/java/org/baeldung/bddmockito/BDDMockitoTest.java create mode 100644 testing-modules/mockito/src/test/java/org/baeldung/bddmockito/PhoneBookRepository.java create mode 100644 testing-modules/mockito/src/test/java/org/baeldung/bddmockito/PhoneBookService.java diff --git a/testing-modules/mockito/src/test/java/org/baeldung/bddmockito/BDDMockitoTest.java b/testing-modules/mockito/src/test/java/org/baeldung/bddmockito/BDDMockitoTest.java new file mode 100644 index 0000000000..9cc586fb84 --- /dev/null +++ b/testing-modules/mockito/src/test/java/org/baeldung/bddmockito/BDDMockitoTest.java @@ -0,0 +1,104 @@ +package org.baeldung.bddmockito; + +import static org.junit.Assert.fail; +import static org.mockito.BDDMockito.*; + +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; +import org.mockito.Mockito; +import org.mockito.invocation.InvocationOnMock; + + +public class BDDMockitoTest { + + PhoneBookService phoneBookService; + PhoneBookRepository phoneBookRepository; + + String momContactName = "Mom"; + String momPhoneNumber = "01234"; + String xContactName = "x"; + String tooLongPhoneNumber = "01111111111111"; + + @Before + public void init() { + phoneBookRepository = Mockito.mock(PhoneBookRepository.class); + phoneBookService = new PhoneBookService(phoneBookRepository); + } + + @Test + public void givenValidContactName_whenSearchInPhoneBook_thenRetunPhoneNumber() { + given(phoneBookRepository.contains(momContactName)).willReturn(true); + given(phoneBookRepository.getPhoneNumberByContactName(momContactName)) + .will((InvocationOnMock invocation) -> { + if(invocation.getArgument(0).equals(momContactName)) { + return momPhoneNumber; + } else { + return null; + } + }); + + String phoneNumber = phoneBookService.search(momContactName); + + then(phoneBookRepository).should().contains(momContactName); + then(phoneBookRepository).should().getPhoneNumberByContactName(momContactName); + Assert.assertEquals(phoneNumber, momPhoneNumber); + } + + @Test + public void givenInvalidContactName_whenSearch_thenRetunNull() { + given(phoneBookRepository.contains(xContactName)).willReturn(false); + + String phoneNumber = phoneBookService.search(xContactName); + + then(phoneBookRepository).should().contains(xContactName); + then(phoneBookRepository).should(never()).getPhoneNumberByContactName(xContactName); + Assert.assertEquals(phoneNumber, null); + } + + @Test + public void givenValidContactNameAndPhoneNumber_whenRegister_thenSucceed() { + given(phoneBookRepository.contains(momContactName)).willReturn(false); + + phoneBookService.register(momContactName, momPhoneNumber); + + verify(phoneBookRepository).insert(momContactName, momPhoneNumber); + } + + @Test + public void givenEmptyPhoneNumber_whenRegister_thenFail() { + given(phoneBookRepository.contains(momContactName)).willReturn(false); + + phoneBookService.register(xContactName, ""); + + then(phoneBookRepository).should(never()).insert(momContactName, momPhoneNumber); + } + + @Test + public void givenLongPhoneNumber_whenRegister_thenFail() { + given(phoneBookRepository.contains(xContactName)).willReturn(false); + willThrow(new RuntimeException()) + .given(phoneBookRepository).insert(any(String.class), eq(tooLongPhoneNumber)); + + try { + phoneBookService.register(xContactName, tooLongPhoneNumber); + fail("Should throw exception"); + } catch (RuntimeException ex) { } + + then(phoneBookRepository).should(never()).insert(momContactName, tooLongPhoneNumber); + } + + @Test + public void givenExistentContactName_whenRegister_thenFail() { + given(phoneBookRepository.contains(momContactName)) + .willThrow(new RuntimeException("Name already exist")); + + try { + phoneBookService.register(momContactName, momPhoneNumber); + fail("Should throw exception"); + } catch(Exception ex) { } + + then(phoneBookRepository).should(never()).insert(momContactName, momPhoneNumber); + } + +} diff --git a/testing-modules/mockito/src/test/java/org/baeldung/bddmockito/PhoneBookRepository.java b/testing-modules/mockito/src/test/java/org/baeldung/bddmockito/PhoneBookRepository.java new file mode 100644 index 0000000000..b73a1d835c --- /dev/null +++ b/testing-modules/mockito/src/test/java/org/baeldung/bddmockito/PhoneBookRepository.java @@ -0,0 +1,26 @@ +package org.baeldung.bddmockito; + +public interface PhoneBookRepository { + + /** + * Insert phone record + * @param name Contact name + * @param phone Phone number + */ + void insert(String name, String phone); + + /** + * Search for contact phone number + * @param name Contact name + * @return phone number + */ + String getPhoneNumberByContactName(String name); + + /** + * Check if the phonebook contains this contact + * @param name Contact name + * @return true if this contact name exists + */ + boolean contains(String name); + +} diff --git a/testing-modules/mockito/src/test/java/org/baeldung/bddmockito/PhoneBookService.java b/testing-modules/mockito/src/test/java/org/baeldung/bddmockito/PhoneBookService.java new file mode 100644 index 0000000000..645884af02 --- /dev/null +++ b/testing-modules/mockito/src/test/java/org/baeldung/bddmockito/PhoneBookService.java @@ -0,0 +1,34 @@ +package org.baeldung.bddmockito; + +public class PhoneBookService { + + private PhoneBookRepository phoneBookRepository; + + public PhoneBookService(PhoneBookRepository phoneBookRepository) { + this.phoneBookRepository = phoneBookRepository; + } + + /** + * Register a contact + * @param name Contact name + * @param phone Phone number + */ + public void register(String name, String phone) { + if(!name.isEmpty() && !phone.isEmpty() && !phoneBookRepository.contains(name)) { + phoneBookRepository.insert(name, phone); + } + } + + /** + * Search for a phone number by contact name + * @param name Contact name + * @return Phone number + */ + public String search(String name) { + if(!name.isEmpty() && phoneBookRepository.contains(name)) { + return phoneBookRepository.getPhoneNumberByContactName(name); + } + return null; + } + +} From 138633863cced4e655eb4a9568a33f805d73545c Mon Sep 17 00:00:00 2001 From: Ahmed Tawila Date: Fri, 24 Nov 2017 21:01:47 +0200 Subject: [PATCH 101/236] Nested Classes in Java --- .../com/baeldung/nestedclass/Enclosing.java | 11 +++++++ .../baeldung/nestedclass/NewEnclosing.java | 15 +++++++++ .../java/com/baeldung/nestedclass/Outer.java | 11 +++++++ .../nestedclass/SimpleAbstractClass.java | 5 +++ .../nestedclass/AnonymousInnerTest.java | 16 ++++++++++ .../baeldung/nestedclass/InnerClassTest.java | 13 ++++++++ .../baeldung/nestedclass/LocalClassTest.java | 12 +++++++ .../baeldung/nestedclass/NestedClassTest.java | 12 +++++++ .../baeldung/nestedclass/NewOuterTest.java | 32 +++++++++++++++++++ 9 files changed, 127 insertions(+) create mode 100644 core-java/src/main/java/com/baeldung/nestedclass/Enclosing.java create mode 100644 core-java/src/main/java/com/baeldung/nestedclass/NewEnclosing.java create mode 100644 core-java/src/main/java/com/baeldung/nestedclass/Outer.java create mode 100644 core-java/src/main/java/com/baeldung/nestedclass/SimpleAbstractClass.java create mode 100644 core-java/src/test/java/com/baeldung/nestedclass/AnonymousInnerTest.java create mode 100644 core-java/src/test/java/com/baeldung/nestedclass/InnerClassTest.java create mode 100644 core-java/src/test/java/com/baeldung/nestedclass/LocalClassTest.java create mode 100644 core-java/src/test/java/com/baeldung/nestedclass/NestedClassTest.java create mode 100644 core-java/src/test/java/com/baeldung/nestedclass/NewOuterTest.java diff --git a/core-java/src/main/java/com/baeldung/nestedclass/Enclosing.java b/core-java/src/main/java/com/baeldung/nestedclass/Enclosing.java new file mode 100644 index 0000000000..a9911538b0 --- /dev/null +++ b/core-java/src/main/java/com/baeldung/nestedclass/Enclosing.java @@ -0,0 +1,11 @@ +package com.baeldung.nestedclass; + +public class Enclosing { + + public static class Nested { + + public void test() { + System.out.println("Calling test..."); + } + } +} diff --git a/core-java/src/main/java/com/baeldung/nestedclass/NewEnclosing.java b/core-java/src/main/java/com/baeldung/nestedclass/NewEnclosing.java new file mode 100644 index 0000000000..c7e04e8600 --- /dev/null +++ b/core-java/src/main/java/com/baeldung/nestedclass/NewEnclosing.java @@ -0,0 +1,15 @@ +package com.baeldung.nestedclass; + +public class NewEnclosing { + + void run() { + class Local { + + void run() { + System.out.println("Welcome to Baeldung!"); + } + } + Local local = new Local(); + local.run(); + } +} \ No newline at end of file diff --git a/core-java/src/main/java/com/baeldung/nestedclass/Outer.java b/core-java/src/main/java/com/baeldung/nestedclass/Outer.java new file mode 100644 index 0000000000..ebd6d27293 --- /dev/null +++ b/core-java/src/main/java/com/baeldung/nestedclass/Outer.java @@ -0,0 +1,11 @@ +package com.baeldung.nestedclass; + +public class Outer { + + public class Inner { + + public void test() { + System.out.println("Calling test..."); + } + } +} diff --git a/core-java/src/main/java/com/baeldung/nestedclass/SimpleAbstractClass.java b/core-java/src/main/java/com/baeldung/nestedclass/SimpleAbstractClass.java new file mode 100644 index 0000000000..586e2d12b4 --- /dev/null +++ b/core-java/src/main/java/com/baeldung/nestedclass/SimpleAbstractClass.java @@ -0,0 +1,5 @@ +package com.baeldung.nestedclass; + +abstract class SimpleAbstractClass { + abstract void run(); +} \ No newline at end of file diff --git a/core-java/src/test/java/com/baeldung/nestedclass/AnonymousInnerTest.java b/core-java/src/test/java/com/baeldung/nestedclass/AnonymousInnerTest.java new file mode 100644 index 0000000000..394c0bb57a --- /dev/null +++ b/core-java/src/test/java/com/baeldung/nestedclass/AnonymousInnerTest.java @@ -0,0 +1,16 @@ +package com.baeldung.nestedclass; + +import org.junit.Test; + +public class AnonymousInnerTest { + + @Test + public void whenRunAnonymousClass_thenCorrect() { + SimpleAbstractClass simpleAbstractClass = new SimpleAbstractClass() { + void run() { + System.out.println("Running Anonymous Class..."); + } + }; + simpleAbstractClass.run(); + } +} \ No newline at end of file diff --git a/core-java/src/test/java/com/baeldung/nestedclass/InnerClassTest.java b/core-java/src/test/java/com/baeldung/nestedclass/InnerClassTest.java new file mode 100644 index 0000000000..e9cb119ac2 --- /dev/null +++ b/core-java/src/test/java/com/baeldung/nestedclass/InnerClassTest.java @@ -0,0 +1,13 @@ +package com.baeldung.nestedclass; + +import org.junit.Test; + +public class InnerClassTest { + + @Test + public void givenInnerClassWhenInstantiating_thenCorrect() { + Outer outer = new Outer(); + Outer.Inner inner = outer.new Inner(); + inner.test(); + } +} diff --git a/core-java/src/test/java/com/baeldung/nestedclass/LocalClassTest.java b/core-java/src/test/java/com/baeldung/nestedclass/LocalClassTest.java new file mode 100644 index 0000000000..dad19161ad --- /dev/null +++ b/core-java/src/test/java/com/baeldung/nestedclass/LocalClassTest.java @@ -0,0 +1,12 @@ +package com.baeldung.nestedclass; + +import org.junit.Test; + +public class LocalClassTest { + + @Test + public void whenTestingLocalClass_thenCorrect() { + NewEnclosing newEnclosing = new NewEnclosing(); + newEnclosing.run(); + } +} diff --git a/core-java/src/test/java/com/baeldung/nestedclass/NestedClassTest.java b/core-java/src/test/java/com/baeldung/nestedclass/NestedClassTest.java new file mode 100644 index 0000000000..16c883689a --- /dev/null +++ b/core-java/src/test/java/com/baeldung/nestedclass/NestedClassTest.java @@ -0,0 +1,12 @@ +package com.baeldung.nestedclass; + +import org.junit.Test; + +public class NestedClassTest { + + @Test + public void whenInstantiatingStaticNestedClass_thenCorrect() { + Enclosing.Nested nested = new Enclosing.Nested(); + nested.test(); + } +} diff --git a/core-java/src/test/java/com/baeldung/nestedclass/NewOuterTest.java b/core-java/src/test/java/com/baeldung/nestedclass/NewOuterTest.java new file mode 100644 index 0000000000..e883687d33 --- /dev/null +++ b/core-java/src/test/java/com/baeldung/nestedclass/NewOuterTest.java @@ -0,0 +1,32 @@ +package com.baeldung.nestedclass; + +import static org.junit.Assert.assertEquals; +import org.junit.Test; + +public class NewOuterTest { + + int a = 1; + static int b = 2; + + public class InnerClass { + int a = 3; + static final int b = 4; + + @Test + public void whenShadowing_thenCorrect() { + assertEquals(3, a); + assertEquals(4, b); + assertEquals(1, NewOuterTest.this.a); + assertEquals(2, NewOuterTest.b); + assertEquals(2, NewOuterTest.this.b); + } + } + + @Test + public void shadowingTest() { + NewOuterTest outer = new NewOuterTest(); + NewOuterTest.InnerClass inner = outer.new InnerClass(); + inner.whenShadowing_thenCorrect(); + + } +} \ No newline at end of file From d0396880e5871c18035cd7b9aadba617a0e4e9d7 Mon Sep 17 00:00:00 2001 From: abialas Date: Fri, 24 Nov 2017 20:51:02 +0100 Subject: [PATCH 102/236] Move Date to LocalDate and LocalDateTime converters from core-java-8 to core-java-9 --- .../datetime/DateToLocalDateConverter.java | 35 --------- .../DateToLocalDateTimeConverter.java | 35 --------- .../DateToLocalDateConverterTest.java | 72 ----------------- .../DateToLocalDateTimeConverterTest.java | 78 ------------------- .../datetime/DateToLocalDateConverter.java | 19 ++++- .../DateToLocalDateTimeConverter.java | 19 ++++- .../LocalDateTimeToDateConverter.java | 2 +- .../datetime/LocalDateToDateConverter.java | 2 +- .../DateToLocalDateConverterTest.java | 48 ++++++++++++ .../DateToLocalDateTimeConverterTest.java | 54 +++++++++++++ .../LocalDateTimeToDateConverterTest.java | 2 +- .../LocalDateToDateConverterTest.java | 2 +- 12 files changed, 142 insertions(+), 226 deletions(-) delete mode 100644 core-java-8/src/main/java/com/baeldung/datetime/DateToLocalDateConverter.java delete mode 100644 core-java-8/src/main/java/com/baeldung/datetime/DateToLocalDateTimeConverter.java delete mode 100644 core-java-8/src/test/java/com/baeldung/datetime/DateToLocalDateConverterTest.java delete mode 100644 core-java-8/src/test/java/com/baeldung/datetime/DateToLocalDateTimeConverterTest.java rename {core-java-8/src/main/java/com/baeldung => core-java-9/src/main/java/com/baeldung/java9}/datetime/LocalDateTimeToDateConverter.java (94%) rename {core-java-8/src/main/java/com/baeldung => core-java-9/src/main/java/com/baeldung/java9}/datetime/LocalDateToDateConverter.java (94%) rename {core-java-8/src/test/java/com/baeldung => core-java-9/src/test/java/com/baeldung/java9}/datetime/LocalDateTimeToDateConverterTest.java (97%) rename {core-java-8/src/test/java/com/baeldung => core-java-9/src/test/java/com/baeldung/java9}/datetime/LocalDateToDateConverterTest.java (97%) diff --git a/core-java-8/src/main/java/com/baeldung/datetime/DateToLocalDateConverter.java b/core-java-8/src/main/java/com/baeldung/datetime/DateToLocalDateConverter.java deleted file mode 100644 index 8788aac747..0000000000 --- a/core-java-8/src/main/java/com/baeldung/datetime/DateToLocalDateConverter.java +++ /dev/null @@ -1,35 +0,0 @@ -/** - * - */ -package com.baeldung.datetime; - -import java.time.Instant; -import java.time.LocalDate; -import java.time.ZoneId; -import java.util.Date; - -/** - * Class which shows different ways of converting java.util.Date into java.time.LocalDate. - * - * @author abialas - * - */ -public class DateToLocalDateConverter { - - public static LocalDate convertToLocalDateViaInstant(Date dateToConvert) { - return dateToConvert.toInstant() - .atZone(ZoneId.systemDefault()) - .toLocalDate(); - } - - public static LocalDate convertToLocalDateViaSqlDate(Date dateToConvert) { - return new java.sql.Date(dateToConvert.getTime()).toLocalDate(); - } - - public static LocalDate convertToLocalDateViaMilisecond(Date dateToConvert) { - return Instant.ofEpochMilli(dateToConvert.getTime()) - .atZone(ZoneId.systemDefault()) - .toLocalDate(); - } - -} diff --git a/core-java-8/src/main/java/com/baeldung/datetime/DateToLocalDateTimeConverter.java b/core-java-8/src/main/java/com/baeldung/datetime/DateToLocalDateTimeConverter.java deleted file mode 100644 index f994023526..0000000000 --- a/core-java-8/src/main/java/com/baeldung/datetime/DateToLocalDateTimeConverter.java +++ /dev/null @@ -1,35 +0,0 @@ -/** - * - */ -package com.baeldung.datetime; - -import java.time.Instant; -import java.time.LocalDateTime; -import java.time.ZoneId; -import java.util.Date; - -/** - * Class which shows different ways of converting java.util.Date into java.time.LocalDateTime. - * - * @author abialas - * - */ -public class DateToLocalDateTimeConverter { - - public static LocalDateTime convertToLocalDateTimeViaInstant(Date dateToConvert) { - return dateToConvert.toInstant() - .atZone(ZoneId.systemDefault()) - .toLocalDateTime(); - } - - public static LocalDateTime convertToLocalDateTimeViaSqlTimestamp(Date dateToConvert) { - return new java.sql.Timestamp(dateToConvert.getTime()).toLocalDateTime(); - } - - public static LocalDateTime convertToLocalDateTimeViaMilisecond(Date dateToConvert) { - return Instant.ofEpochMilli(dateToConvert.getTime()) - .atZone(ZoneId.systemDefault()) - .toLocalDateTime(); - } - -} diff --git a/core-java-8/src/test/java/com/baeldung/datetime/DateToLocalDateConverterTest.java b/core-java-8/src/test/java/com/baeldung/datetime/DateToLocalDateConverterTest.java deleted file mode 100644 index 5de6ae3e59..0000000000 --- a/core-java-8/src/test/java/com/baeldung/datetime/DateToLocalDateConverterTest.java +++ /dev/null @@ -1,72 +0,0 @@ -/** - * - */ -package com.baeldung.datetime; - -import static org.junit.Assert.assertEquals; - -import java.time.LocalDate; -import java.time.temporal.ChronoField; -import java.util.Calendar; -import java.util.Date; - -import org.junit.Test; - -/** - * - * JUnits for {@link DateToLocalDateConverter} class. - * - * @author abialas - * - */ -public class DateToLocalDateConverterTest { - - @Test - public void shouldReturn10thNovember2010WhenConvertViaInstant() { - // given - Calendar calendar = Calendar.getInstance(); - calendar.set(2010, 10, 10); - Date dateToConvert = calendar.getTime(); - - // when - LocalDate localDate = DateToLocalDateConverter.convertToLocalDateViaInstant(dateToConvert); - - // then - assertEquals(2010, localDate.get(ChronoField.YEAR)); - assertEquals(11, localDate.get(ChronoField.MONTH_OF_YEAR)); - assertEquals(10, localDate.get(ChronoField.DAY_OF_MONTH)); - } - - @Test - public void shouldReturn10thNovember2010WhenConvertViaMiliseconds() { - // given - Calendar calendar = Calendar.getInstance(); - calendar.set(2010, 10, 10); - Date dateToConvert = calendar.getTime(); - - // when - LocalDate localDate = DateToLocalDateConverter.convertToLocalDateViaMilisecond(dateToConvert); - - // then - assertEquals(2010, localDate.get(ChronoField.YEAR)); - assertEquals(11, localDate.get(ChronoField.MONTH_OF_YEAR)); - assertEquals(10, localDate.get(ChronoField.DAY_OF_MONTH)); - } - - @Test - public void shouldReturn10thNovember2010WhenConvertViaSqlDate() { - // given - Calendar calendar = Calendar.getInstance(); - calendar.set(2010, 10, 10); - Date dateToConvert = calendar.getTime(); - - // when - LocalDate localDate = DateToLocalDateConverter.convertToLocalDateViaSqlDate(dateToConvert); - - // then - assertEquals(2010, localDate.get(ChronoField.YEAR)); - assertEquals(11, localDate.get(ChronoField.MONTH_OF_YEAR)); - assertEquals(10, localDate.get(ChronoField.DAY_OF_MONTH)); - } - -} diff --git a/core-java-8/src/test/java/com/baeldung/datetime/DateToLocalDateTimeConverterTest.java b/core-java-8/src/test/java/com/baeldung/datetime/DateToLocalDateTimeConverterTest.java deleted file mode 100644 index 6d8fb8ea93..0000000000 --- a/core-java-8/src/test/java/com/baeldung/datetime/DateToLocalDateTimeConverterTest.java +++ /dev/null @@ -1,78 +0,0 @@ -/** - * - */ -package com.baeldung.datetime; - -import static org.junit.Assert.assertEquals; - -import java.time.LocalDateTime; -import java.time.temporal.ChronoField; -import java.util.Calendar; -import java.util.Date; - -import org.junit.Test; - -/** - * - * JUnits for {@link DateToLocalDateTimeConverter} class. - * - * @author abialas - * - */ -public class DateToLocalDateTimeConverterTest { - - @Test - public void shouldReturn10thNovember2010time8hour20minWhenConvertViaInstant() { - // given - Calendar calendar = Calendar.getInstance(); - calendar.set(2010, 10, 10, 8, 20); - Date dateToConvert = calendar.getTime(); - - // when - LocalDateTime localDateTime = DateToLocalDateTimeConverter.convertToLocalDateTimeViaInstant(dateToConvert); - - // then - assertEquals(2010, localDateTime.get(ChronoField.YEAR)); - assertEquals(11, localDateTime.get(ChronoField.MONTH_OF_YEAR)); - assertEquals(10, localDateTime.get(ChronoField.DAY_OF_MONTH)); - assertEquals(8, localDateTime.get(ChronoField.HOUR_OF_DAY)); - assertEquals(20, localDateTime.get(ChronoField.MINUTE_OF_HOUR)); - } - - @Test - public void shouldReturn10thNovember2010time8hour20minWhenConvertViaMiliseconds() { - // given - Calendar calendar = Calendar.getInstance(); - calendar.set(2010, 10, 10, 8, 20); - Date dateToConvert = calendar.getTime(); - - // when - LocalDateTime localDateTime = DateToLocalDateTimeConverter.convertToLocalDateTimeViaMilisecond(dateToConvert); - - // then - assertEquals(2010, localDateTime.get(ChronoField.YEAR)); - assertEquals(11, localDateTime.get(ChronoField.MONTH_OF_YEAR)); - assertEquals(10, localDateTime.get(ChronoField.DAY_OF_MONTH)); - assertEquals(8, localDateTime.get(ChronoField.HOUR_OF_DAY)); - assertEquals(20, localDateTime.get(ChronoField.MINUTE_OF_HOUR)); - } - - @Test - public void shouldReturn10thNovember2010time8hour20minWhenConvertViaSqlTimestamp() { - // given - Calendar calendar = Calendar.getInstance(); - calendar.set(2010, 10, 10, 8, 20); - Date dateToConvert = calendar.getTime(); - - // when - LocalDateTime localDateTime = DateToLocalDateTimeConverter.convertToLocalDateTimeViaSqlTimestamp(dateToConvert); - - // then - assertEquals(2010, localDateTime.get(ChronoField.YEAR)); - assertEquals(11, localDateTime.get(ChronoField.MONTH_OF_YEAR)); - assertEquals(10, localDateTime.get(ChronoField.DAY_OF_MONTH)); - assertEquals(8, localDateTime.get(ChronoField.HOUR_OF_DAY)); - assertEquals(20, localDateTime.get(ChronoField.MINUTE_OF_HOUR)); - } - -} diff --git a/core-java-9/src/main/java/com/baeldung/java9/datetime/DateToLocalDateConverter.java b/core-java-9/src/main/java/com/baeldung/java9/datetime/DateToLocalDateConverter.java index bafa9ebff1..c794c57e87 100644 --- a/core-java-9/src/main/java/com/baeldung/java9/datetime/DateToLocalDateConverter.java +++ b/core-java-9/src/main/java/com/baeldung/java9/datetime/DateToLocalDateConverter.java @@ -3,18 +3,35 @@ */ package com.baeldung.java9.datetime; +import java.time.Instant; import java.time.LocalDate; import java.time.ZoneId; import java.util.Date; /** - * Class which shows a way to convert java.util.Date into java.time.LocalDate with new Java 1.9. + * Class which shows a way to convert java.util.Date into java.time.LocalDate. * * @author abialas * */ public class DateToLocalDateConverter { + public static LocalDate convertToLocalDateViaInstant(Date dateToConvert) { + return dateToConvert.toInstant() + .atZone(ZoneId.systemDefault()) + .toLocalDate(); + } + + public static LocalDate convertToLocalDateViaSqlDate(Date dateToConvert) { + return new java.sql.Date(dateToConvert.getTime()).toLocalDate(); + } + + public static LocalDate convertToLocalDateViaMilisecond(Date dateToConvert) { + return Instant.ofEpochMilli(dateToConvert.getTime()) + .atZone(ZoneId.systemDefault()) + .toLocalDate(); + } + public static LocalDate convertToLocalDate(Date dateToConvert) { return LocalDate.ofInstant(dateToConvert.toInstant(), ZoneId.systemDefault()); } diff --git a/core-java-9/src/main/java/com/baeldung/java9/datetime/DateToLocalDateTimeConverter.java b/core-java-9/src/main/java/com/baeldung/java9/datetime/DateToLocalDateTimeConverter.java index 538d5a9f63..17ca5b1122 100644 --- a/core-java-9/src/main/java/com/baeldung/java9/datetime/DateToLocalDateTimeConverter.java +++ b/core-java-9/src/main/java/com/baeldung/java9/datetime/DateToLocalDateTimeConverter.java @@ -3,18 +3,35 @@ */ package com.baeldung.java9.datetime; +import java.time.Instant; import java.time.LocalDateTime; import java.time.ZoneId; import java.util.Date; /** - * Class which shows a way to convert java.util.Date into java.time.LocalDateTime with new Java 1.9. + * Class which shows a way to convert java.util.Date into java.time.LocalDateTime. * * @author abialas * */ public class DateToLocalDateTimeConverter { + public static LocalDateTime convertToLocalDateTimeViaInstant(Date dateToConvert) { + return dateToConvert.toInstant() + .atZone(ZoneId.systemDefault()) + .toLocalDateTime(); + } + + public static LocalDateTime convertToLocalDateTimeViaSqlTimestamp(Date dateToConvert) { + return new java.sql.Timestamp(dateToConvert.getTime()).toLocalDateTime(); + } + + public static LocalDateTime convertToLocalDateTimeViaMilisecond(Date dateToConvert) { + return Instant.ofEpochMilli(dateToConvert.getTime()) + .atZone(ZoneId.systemDefault()) + .toLocalDateTime(); + } + public static LocalDateTime convertToLocalDateTime(Date dateToConvert) { return LocalDateTime.ofInstant(dateToConvert.toInstant(), ZoneId.systemDefault()); } diff --git a/core-java-8/src/main/java/com/baeldung/datetime/LocalDateTimeToDateConverter.java b/core-java-9/src/main/java/com/baeldung/java9/datetime/LocalDateTimeToDateConverter.java similarity index 94% rename from core-java-8/src/main/java/com/baeldung/datetime/LocalDateTimeToDateConverter.java rename to core-java-9/src/main/java/com/baeldung/java9/datetime/LocalDateTimeToDateConverter.java index ef72c8b4fb..f219dcf038 100644 --- a/core-java-8/src/main/java/com/baeldung/datetime/LocalDateTimeToDateConverter.java +++ b/core-java-9/src/main/java/com/baeldung/java9/datetime/LocalDateTimeToDateConverter.java @@ -1,7 +1,7 @@ /** * */ -package com.baeldung.datetime; +package com.baeldung.java9.datetime; import java.time.LocalDateTime; import java.time.ZoneId; diff --git a/core-java-8/src/main/java/com/baeldung/datetime/LocalDateToDateConverter.java b/core-java-9/src/main/java/com/baeldung/java9/datetime/LocalDateToDateConverter.java similarity index 94% rename from core-java-8/src/main/java/com/baeldung/datetime/LocalDateToDateConverter.java rename to core-java-9/src/main/java/com/baeldung/java9/datetime/LocalDateToDateConverter.java index 8050815799..f9893da5d0 100644 --- a/core-java-8/src/main/java/com/baeldung/datetime/LocalDateToDateConverter.java +++ b/core-java-9/src/main/java/com/baeldung/java9/datetime/LocalDateToDateConverter.java @@ -1,7 +1,7 @@ /** * */ -package com.baeldung.datetime; +package com.baeldung.java9.datetime; import java.time.LocalDate; import java.time.ZoneId; diff --git a/core-java-9/src/test/java/com/baeldung/java9/datetime/DateToLocalDateConverterTest.java b/core-java-9/src/test/java/com/baeldung/java9/datetime/DateToLocalDateConverterTest.java index 2e0fb0dedd..ab69bba359 100644 --- a/core-java-9/src/test/java/com/baeldung/java9/datetime/DateToLocalDateConverterTest.java +++ b/core-java-9/src/test/java/com/baeldung/java9/datetime/DateToLocalDateConverterTest.java @@ -22,6 +22,54 @@ import com.baeldung.java9.datetime.DateToLocalDateConverter; */ public class DateToLocalDateConverterTest { + @Test + public void shouldReturn10thNovember2010WhenConvertViaInstant() { + // given + Calendar calendar = Calendar.getInstance(); + calendar.set(2010, 10, 10); + Date dateToConvert = calendar.getTime(); + + // when + LocalDate localDate = DateToLocalDateConverter.convertToLocalDateViaInstant(dateToConvert); + + // then + assertEquals(2010, localDate.get(ChronoField.YEAR)); + assertEquals(11, localDate.get(ChronoField.MONTH_OF_YEAR)); + assertEquals(10, localDate.get(ChronoField.DAY_OF_MONTH)); + } + + @Test + public void shouldReturn10thNovember2010WhenConvertViaMiliseconds() { + // given + Calendar calendar = Calendar.getInstance(); + calendar.set(2010, 10, 10); + Date dateToConvert = calendar.getTime(); + + // when + LocalDate localDate = DateToLocalDateConverter.convertToLocalDateViaMilisecond(dateToConvert); + + // then + assertEquals(2010, localDate.get(ChronoField.YEAR)); + assertEquals(11, localDate.get(ChronoField.MONTH_OF_YEAR)); + assertEquals(10, localDate.get(ChronoField.DAY_OF_MONTH)); + } + + @Test + public void shouldReturn10thNovember2010WhenConvertViaSqlDate() { + // given + Calendar calendar = Calendar.getInstance(); + calendar.set(2010, 10, 10); + Date dateToConvert = calendar.getTime(); + + // when + LocalDate localDate = DateToLocalDateConverter.convertToLocalDateViaSqlDate(dateToConvert); + + // then + assertEquals(2010, localDate.get(ChronoField.YEAR)); + assertEquals(11, localDate.get(ChronoField.MONTH_OF_YEAR)); + assertEquals(10, localDate.get(ChronoField.DAY_OF_MONTH)); + } + @Test public void shouldReturn10thNovember2010WhenConvertToLocalDate() { // given diff --git a/core-java-9/src/test/java/com/baeldung/java9/datetime/DateToLocalDateTimeConverterTest.java b/core-java-9/src/test/java/com/baeldung/java9/datetime/DateToLocalDateTimeConverterTest.java index 49988c8b33..97c70ee5ac 100644 --- a/core-java-9/src/test/java/com/baeldung/java9/datetime/DateToLocalDateTimeConverterTest.java +++ b/core-java-9/src/test/java/com/baeldung/java9/datetime/DateToLocalDateTimeConverterTest.java @@ -29,6 +29,60 @@ public class DateToLocalDateTimeConverterTest { calendar.set(2010, 10, 10, 8, 20); Date dateToConvert = calendar.getTime(); + // when + LocalDateTime localDateTime = DateToLocalDateTimeConverter.convertToLocalDateTimeViaInstant(dateToConvert); + + // then + assertEquals(2010, localDateTime.get(ChronoField.YEAR)); + assertEquals(11, localDateTime.get(ChronoField.MONTH_OF_YEAR)); + assertEquals(10, localDateTime.get(ChronoField.DAY_OF_MONTH)); + assertEquals(8, localDateTime.get(ChronoField.HOUR_OF_DAY)); + assertEquals(20, localDateTime.get(ChronoField.MINUTE_OF_HOUR)); + } + + @Test + public void shouldReturn10thNovember2010time8hour20minWhenConvertViaMiliseconds() { + // given + Calendar calendar = Calendar.getInstance(); + calendar.set(2010, 10, 10, 8, 20); + Date dateToConvert = calendar.getTime(); + + // when + LocalDateTime localDateTime = DateToLocalDateTimeConverter.convertToLocalDateTimeViaMilisecond(dateToConvert); + + // then + assertEquals(2010, localDateTime.get(ChronoField.YEAR)); + assertEquals(11, localDateTime.get(ChronoField.MONTH_OF_YEAR)); + assertEquals(10, localDateTime.get(ChronoField.DAY_OF_MONTH)); + assertEquals(8, localDateTime.get(ChronoField.HOUR_OF_DAY)); + assertEquals(20, localDateTime.get(ChronoField.MINUTE_OF_HOUR)); + } + + @Test + public void shouldReturn10thNovember2010time8hour20minWhenConvertViaSqlTimestamp() { + // given + Calendar calendar = Calendar.getInstance(); + calendar.set(2010, 10, 10, 8, 20); + Date dateToConvert = calendar.getTime(); + + // when + LocalDateTime localDateTime = DateToLocalDateTimeConverter.convertToLocalDateTimeViaSqlTimestamp(dateToConvert); + + // then + assertEquals(2010, localDateTime.get(ChronoField.YEAR)); + assertEquals(11, localDateTime.get(ChronoField.MONTH_OF_YEAR)); + assertEquals(10, localDateTime.get(ChronoField.DAY_OF_MONTH)); + assertEquals(8, localDateTime.get(ChronoField.HOUR_OF_DAY)); + assertEquals(20, localDateTime.get(ChronoField.MINUTE_OF_HOUR)); + } + + @Test + public void shouldReturn10thNovember2010time8hour20minWhenConvertToLocalDateTime() { + // given + Calendar calendar = Calendar.getInstance(); + calendar.set(2010, 10, 10, 8, 20); + Date dateToConvert = calendar.getTime(); + // when LocalDateTime localDateTime = DateToLocalDateTimeConverter.convertToLocalDateTime(dateToConvert); diff --git a/core-java-8/src/test/java/com/baeldung/datetime/LocalDateTimeToDateConverterTest.java b/core-java-9/src/test/java/com/baeldung/java9/datetime/LocalDateTimeToDateConverterTest.java similarity index 97% rename from core-java-8/src/test/java/com/baeldung/datetime/LocalDateTimeToDateConverterTest.java rename to core-java-9/src/test/java/com/baeldung/java9/datetime/LocalDateTimeToDateConverterTest.java index 519fa69f04..2c6898381f 100644 --- a/core-java-8/src/test/java/com/baeldung/datetime/LocalDateTimeToDateConverterTest.java +++ b/core-java-9/src/test/java/com/baeldung/java9/datetime/LocalDateTimeToDateConverterTest.java @@ -1,7 +1,7 @@ /** * */ -package com.baeldung.datetime; +package com.baeldung.java9.datetime; import static org.junit.Assert.assertEquals; diff --git a/core-java-8/src/test/java/com/baeldung/datetime/LocalDateToDateConverterTest.java b/core-java-9/src/test/java/com/baeldung/java9/datetime/LocalDateToDateConverterTest.java similarity index 97% rename from core-java-8/src/test/java/com/baeldung/datetime/LocalDateToDateConverterTest.java rename to core-java-9/src/test/java/com/baeldung/java9/datetime/LocalDateToDateConverterTest.java index c1da3af052..7f20d5d2d2 100644 --- a/core-java-8/src/test/java/com/baeldung/datetime/LocalDateToDateConverterTest.java +++ b/core-java-9/src/test/java/com/baeldung/java9/datetime/LocalDateToDateConverterTest.java @@ -1,7 +1,7 @@ /** * */ -package com.baeldung.datetime; +package com.baeldung.java9.datetime; import static org.junit.Assert.assertEquals; From 043ea5e574ab5deee7c0935f92121dc6630fb7a2 Mon Sep 17 00:00:00 2001 From: "parth.karia" Date: Mon, 27 Nov 2017 12:03:43 +0530 Subject: [PATCH 103/236] Removes jgrapht from libraries --- libraries/pom.xml | 11 +-- .../baeldung/jgrapht/CompleteGraphTest.java | 38 -------- .../baeldung/jgrapht/DirectedGraphTests.java | 95 ------------------- .../baeldung/jgrapht/EulerianCircuitTest.java | 42 -------- 4 files changed, 1 insertion(+), 185 deletions(-) delete mode 100644 libraries/src/test/java/com/baeldung/jgrapht/CompleteGraphTest.java delete mode 100644 libraries/src/test/java/com/baeldung/jgrapht/DirectedGraphTests.java delete mode 100644 libraries/src/test/java/com/baeldung/jgrapht/EulerianCircuitTest.java diff --git a/libraries/pom.xml b/libraries/pom.xml index bf90e4ccd9..0b707b914e 100644 --- a/libraries/pom.xml +++ b/libraries/pom.xml @@ -587,21 +587,12 @@ hazelcast ${hazelcast.version} - - org.jgrapht - jgrapht-core - 1.0.1 - com.netopyr.wurmloch wurmloch-crdt ${crdt.version} - org.jgrapht - jgrapht-core - 1.0.1 - org.docx4j docx4j 3.3.5 @@ -715,4 +706,4 @@ 3.8.4 2.5.5 - + \ No newline at end of file diff --git a/libraries/src/test/java/com/baeldung/jgrapht/CompleteGraphTest.java b/libraries/src/test/java/com/baeldung/jgrapht/CompleteGraphTest.java deleted file mode 100644 index c085d54689..0000000000 --- a/libraries/src/test/java/com/baeldung/jgrapht/CompleteGraphTest.java +++ /dev/null @@ -1,38 +0,0 @@ -package com.baeldung.jgrapht; - -import static org.junit.Assert.assertEquals; - -import java.util.List; - -import org.jgrapht.VertexFactory; -import org.jgrapht.alg.HamiltonianCycle; -import org.jgrapht.generate.CompleteGraphGenerator; -import org.jgrapht.graph.DefaultEdge; -import org.jgrapht.graph.SimpleWeightedGraph; -import org.junit.Before; -import org.junit.Test; - -public class CompleteGraphTest { - - static SimpleWeightedGraph completeGraph; - static int size = 10; - - @Before - public void createCompleteGraph() { - completeGraph = new SimpleWeightedGraph<>(DefaultEdge.class); - CompleteGraphGenerator completeGenerator = new CompleteGraphGenerator(size); - VertexFactory vFactory = new VertexFactory() { - private int id = 0; - public String createVertex() { - return "v" + id++; - } - }; - completeGenerator.generateGraph(completeGraph, vFactory, null); - } - - @Test - public void givenCompleteGraph_whenGetHamiltonianCyclePath_thenGetVerticeListInSequence() { - List verticeList = HamiltonianCycle.getApproximateOptimalForCompleteGraph(completeGraph); - assertEquals(verticeList.size(), completeGraph.vertexSet().size()); - } -} diff --git a/libraries/src/test/java/com/baeldung/jgrapht/DirectedGraphTests.java b/libraries/src/test/java/com/baeldung/jgrapht/DirectedGraphTests.java deleted file mode 100644 index 7f4cc99715..0000000000 --- a/libraries/src/test/java/com/baeldung/jgrapht/DirectedGraphTests.java +++ /dev/null @@ -1,95 +0,0 @@ -package com.baeldung.jgrapht; - -import static org.junit.Assert.assertNotNull; -import static org.junit.Assert.assertTrue; - -import java.util.ArrayList; -import java.util.List; -import java.util.Set; -import java.util.stream.IntStream; - -import org.jgrapht.DirectedGraph; -import org.jgrapht.GraphPath; -import org.jgrapht.alg.CycleDetector; -import org.jgrapht.alg.KosarajuStrongConnectivityInspector; -import org.jgrapht.alg.interfaces.StrongConnectivityAlgorithm; -import org.jgrapht.alg.shortestpath.AllDirectedPaths; -import org.jgrapht.alg.shortestpath.BellmanFordShortestPath; -import org.jgrapht.alg.shortestpath.DijkstraShortestPath; -import org.jgrapht.graph.DefaultDirectedGraph; -import org.jgrapht.graph.DefaultEdge; -import org.jgrapht.graph.DirectedSubgraph; -import org.jgrapht.traverse.BreadthFirstIterator; -import org.jgrapht.traverse.DepthFirstIterator; -import org.junit.Before; -import org.junit.Test; - -public class DirectedGraphTests { - DirectedGraph directedGraph; - - @Before - public void createDirectedGraph() { - directedGraph = new DefaultDirectedGraph(DefaultEdge.class); - IntStream.range(1, 10).forEach(i -> { - directedGraph.addVertex("v" + i); - }); - directedGraph.addEdge("v1", "v2"); - directedGraph.addEdge("v2", "v4"); - directedGraph.addEdge("v4", "v3"); - directedGraph.addEdge("v3", "v1"); - directedGraph.addEdge("v5", "v4"); - directedGraph.addEdge("v5", "v6"); - directedGraph.addEdge("v6", "v7"); - directedGraph.addEdge("v7", "v5"); - directedGraph.addEdge("v8", "v5"); - directedGraph.addEdge("v9", "v8"); - } - - @Test - public void givenDirectedGraph_whenGetStronglyConnectedSubgraphs_thenPathExistsBetweenStronglyconnectedVertices() { - StrongConnectivityAlgorithm scAlg = new KosarajuStrongConnectivityInspector<>(directedGraph); - List> stronglyConnectedSubgraphs = scAlg.stronglyConnectedSubgraphs(); - List stronglyConnectedVertices = new ArrayList<>(stronglyConnectedSubgraphs.get(3).vertexSet()); - - String randomVertex1 = stronglyConnectedVertices.get(0); - String randomVertex2 = stronglyConnectedVertices.get(3); - AllDirectedPaths allDirectedPaths = new AllDirectedPaths<>(directedGraph); - - List> possiblePathList = allDirectedPaths.getAllPaths(randomVertex1, randomVertex2, false, stronglyConnectedVertices.size()); - assertTrue(possiblePathList.size() > 0); - } - - @Test - public void givenDirectedGraphWithCycle_whenCheckCycles_thenDetectCycles() { - CycleDetector cycleDetector = new CycleDetector(directedGraph); - assertTrue(cycleDetector.detectCycles()); - Set cycleVertices = cycleDetector.findCycles(); - assertTrue(cycleVertices.size() > 0); - } - - @Test - public void givenDirectedGraph_whenCreateInstanceDepthFirstIterator_thenGetIterator() { - DepthFirstIterator depthFirstIterator = new DepthFirstIterator<>(directedGraph); - assertNotNull(depthFirstIterator); - } - - @Test - public void givenDirectedGraph_whenCreateInstanceBreadthFirstIterator_thenGetIterator() { - BreadthFirstIterator breadthFirstIterator = new BreadthFirstIterator<>(directedGraph); - assertNotNull(breadthFirstIterator); - } - - @Test - public void givenDirectedGraph_whenGetDijkstraShortestPath_thenGetNotNullPath() { - DijkstraShortestPath dijkstraShortestPath = new DijkstraShortestPath(directedGraph); - List shortestPath = dijkstraShortestPath.getPath("v1", "v4").getVertexList(); - assertNotNull(shortestPath); - } - - @Test - public void givenDirectedGraph_whenGetBellmanFordShortestPath_thenGetNotNullPath() { - BellmanFordShortestPath bellmanFordShortestPath = new BellmanFordShortestPath(directedGraph); - List shortestPath = bellmanFordShortestPath.getPath("v1", "v4").getVertexList(); - assertNotNull(shortestPath); - } -} diff --git a/libraries/src/test/java/com/baeldung/jgrapht/EulerianCircuitTest.java b/libraries/src/test/java/com/baeldung/jgrapht/EulerianCircuitTest.java deleted file mode 100644 index 6f0fb92ab7..0000000000 --- a/libraries/src/test/java/com/baeldung/jgrapht/EulerianCircuitTest.java +++ /dev/null @@ -1,42 +0,0 @@ -package com.baeldung.jgrapht; - -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertTrue; - -import java.util.stream.IntStream; - -import org.jgrapht.GraphPath; -import org.jgrapht.alg.cycle.HierholzerEulerianCycle; -import org.jgrapht.graph.DefaultEdge; -import org.jgrapht.graph.SimpleWeightedGraph; -import org.junit.Before; -import org.junit.Test; - -public class EulerianCircuitTest { - SimpleWeightedGraph simpleGraph; - - @Before - public void createGraphWithEulerianCircuit() { - simpleGraph = new SimpleWeightedGraph<>(DefaultEdge.class); - IntStream.range(1, 6).forEach(i -> { - simpleGraph.addVertex("v" + i); - }); - IntStream.range(1, 6).forEach(i -> { - int endVertexNo = (i + 1) > 5 ? 1 : i + 1; - simpleGraph.addEdge("v" + i, "v" + endVertexNo); - }); - } - - @Test - public void givenGraph_whenCheckEluerianCycle_thenGetResult() { - HierholzerEulerianCycle eulerianCycle = new HierholzerEulerianCycle<>(); - assertTrue(eulerianCycle.isEulerian(simpleGraph)); - } - - @Test - public void givenGraphWithEulerianCircuit_whenGetEulerianCycle_thenGetGraphPath() { - HierholzerEulerianCycle eulerianCycle = new HierholzerEulerianCycle<>(); - GraphPath path = eulerianCycle.getEulerianCycle(simpleGraph); - assertTrue(path.getEdgeList().containsAll(simpleGraph.edgeSet())); - } -} From b1782b3c19c3f4e3eef2a976efa23ad066d28e00 Mon Sep 17 00:00:00 2001 From: "parth.karia" Date: Mon, 27 Nov 2017 12:05:18 +0530 Subject: [PATCH 104/236] Resolve conflicts manually --- libraries/pom.xml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/libraries/pom.xml b/libraries/pom.xml index 0b707b914e..27d867b68b 100644 --- a/libraries/pom.xml +++ b/libraries/pom.xml @@ -587,6 +587,11 @@ hazelcast ${hazelcast.version} + + org.jgrapht + jgrapht-core + 1.0.1 + com.netopyr.wurmloch wurmloch-crdt From 3daa1b01ce4794f2df03ad0bf44c87b5378f9438 Mon Sep 17 00:00:00 2001 From: "parth.karia" Date: Mon, 27 Nov 2017 12:10:19 +0530 Subject: [PATCH 105/236] BAEL-21 Exploring the new HTTP Client in Java 9 --- .../java9/httpclient/HttpClientExample.java | 76 +++++++++++++++++++ core-java-9/src/main/java/module-info.java | 3 + 2 files changed, 79 insertions(+) create mode 100644 core-java-9/src/main/java/com/baeldung/java9/httpclient/HttpClientExample.java create mode 100644 core-java-9/src/main/java/module-info.java diff --git a/core-java-9/src/main/java/com/baeldung/java9/httpclient/HttpClientExample.java b/core-java-9/src/main/java/com/baeldung/java9/httpclient/HttpClientExample.java new file mode 100644 index 0000000000..6ccfd030a5 --- /dev/null +++ b/core-java-9/src/main/java/com/baeldung/java9/httpclient/HttpClientExample.java @@ -0,0 +1,76 @@ +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ +package com.baeldung.java9.httpclient; + +import java.io.File; +import java.io.IOException; +import java.net.URI; +import java.net.URISyntaxException; +import java.nio.file.Paths; +import java.util.Arrays; +import java.util.List; +import java.util.concurrent.CompletableFuture; +import java.util.stream.Collectors; +import jdk.incubator.http.HttpClient; +import jdk.incubator.http.HttpRequest; +import jdk.incubator.http.HttpRequest.BodyProcessor; +import jdk.incubator.http.HttpResponse; +import jdk.incubator.http.HttpResponse.BodyHandler; + +/** + * + * @author pkaria + */ +public class HttpClientExample { + + public void httpGetRequest() throws URISyntaxException, IOException, InterruptedException { + HttpClient client = HttpClient.newHttpClient(); + URI httpURI = new URI("http://jsonplaceholder.typicode.com/posts/1"); + HttpRequest request = HttpRequest.newBuilder(httpURI).GET().build(); + HttpResponse response = client.send(request, HttpResponse.BodyHandler.asString()); + String responseBody = response.body(); + int responseStatusCode = response.statusCode(); + System.out.println(responseBody); + } + + public void httpPosttRequest() throws URISyntaxException, IOException, InterruptedException { + HttpClient client = HttpClient + .newBuilder() + .build(); + HttpRequest request = HttpRequest + .newBuilder(new URI("http://jsonplaceholder.typicode.com/posts")) + .POST(BodyProcessor.fromString("Sample Post Request")) + .build(); + HttpResponse response + = client.send(request, HttpResponse.BodyHandler.asString()); + String responseBody = response.body(); + System.out.println(responseBody); + } + + public void asynchronousRequest() throws URISyntaxException { + HttpClient client = HttpClient.newHttpClient(); + URI httpURI = new URI("http://jsonplaceholder.typicode.com/posts/1"); + HttpRequest request = HttpRequest.newBuilder(httpURI).GET().build(); + CompletableFuture> futureResponse = client.sendAsync(request, + HttpResponse.BodyHandler.asString()); + } + + public void asynchronousMultipleRequests() throws URISyntaxException { + List targets = Arrays.asList(new URI("http://jsonplaceholder.typicode.com/posts/1"), new URI("http://jsonplaceholder.typicode.com/posts/2")); + HttpClient client = HttpClient.newHttpClient(); + List> futures = targets + .stream() + .map(target -> client + .sendAsync( + HttpRequest.newBuilder(target) + .GET() + .build(), + BodyHandler.asFile(Paths.get("base", target.getPath()))) + .thenApply(response -> response.body()) + .thenApply(path -> path.toFile())) + .collect(Collectors.toList()); + } +} diff --git a/core-java-9/src/main/java/module-info.java b/core-java-9/src/main/java/module-info.java new file mode 100644 index 0000000000..163dd4f5be --- /dev/null +++ b/core-java-9/src/main/java/module-info.java @@ -0,0 +1,3 @@ +module com.baeldung.java9.httpclient { + requires jdk.incubator.httpclient; +} \ No newline at end of file From 4bf7fb23f665f4b29883ad0df53e0c86bb540fc0 Mon Sep 17 00:00:00 2001 From: Dassi Orleando Date: Wed, 29 Nov 2017 04:30:45 +0100 Subject: [PATCH 106/236] BAEL-720: Intro to Jenkins 2 and the power of pipelines --- pom.xml | 1 + spring-jenkins-pipeline/.gitignore | 24 ++ .../.mvn/wrapper/maven-wrapper.jar | Bin 0 -> 49502 bytes .../.mvn/wrapper/maven-wrapper.properties | 1 + spring-jenkins-pipeline/README.md | 23 ++ spring-jenkins-pipeline/mvnw | 233 ++++++++++++++++++ spring-jenkins-pipeline/mvnw.cmd | 145 +++++++++++ spring-jenkins-pipeline/pom.xml | 97 ++++++++ .../SpringJenkinsPipelineApplication.java | 13 + .../java/com/baeldung/domain/Student.java | 73 ++++++ .../repository/StudentRepository.java | 7 + .../src/main/resources/application.properties | 14 ++ .../com/baeldung/SomeIntegrationTest.java | 37 +++ .../test/java/com/baeldung/SomeUnitTest.java | 11 + spring-jmeter-jenkins/README.md | 16 +- 15 files changed, 680 insertions(+), 15 deletions(-) create mode 100644 spring-jenkins-pipeline/.gitignore create mode 100644 spring-jenkins-pipeline/.mvn/wrapper/maven-wrapper.jar create mode 100644 spring-jenkins-pipeline/.mvn/wrapper/maven-wrapper.properties create mode 100644 spring-jenkins-pipeline/README.md create mode 100755 spring-jenkins-pipeline/mvnw create mode 100644 spring-jenkins-pipeline/mvnw.cmd create mode 100644 spring-jenkins-pipeline/pom.xml create mode 100644 spring-jenkins-pipeline/src/main/java/com/baeldung/SpringJenkinsPipelineApplication.java create mode 100644 spring-jenkins-pipeline/src/main/java/com/baeldung/domain/Student.java create mode 100644 spring-jenkins-pipeline/src/main/java/com/baeldung/repository/StudentRepository.java create mode 100644 spring-jenkins-pipeline/src/main/resources/application.properties create mode 100644 spring-jenkins-pipeline/src/test/java/com/baeldung/SomeIntegrationTest.java create mode 100644 spring-jenkins-pipeline/src/test/java/com/baeldung/SomeUnitTest.java diff --git a/pom.xml b/pom.xml index 20f7c4ffad..827c4ee4cf 100644 --- a/pom.xml +++ b/pom.xml @@ -173,6 +173,7 @@ spring-hibernate4 persistence-modules/spring-hibernate-5 spring-integration + spring-jenkins-pipeline spring-jersey spring-jmeter-jenkins spring-jms diff --git a/spring-jenkins-pipeline/.gitignore b/spring-jenkins-pipeline/.gitignore new file mode 100644 index 0000000000..2af7cefb0a --- /dev/null +++ b/spring-jenkins-pipeline/.gitignore @@ -0,0 +1,24 @@ +target/ +!.mvn/wrapper/maven-wrapper.jar + +### STS ### +.apt_generated +.classpath +.factorypath +.project +.settings +.springBeans + +### IntelliJ IDEA ### +.idea +*.iws +*.iml +*.ipr + +### NetBeans ### +nbproject/private/ +build/ +nbbuild/ +dist/ +nbdist/ +.nb-gradle/ \ No newline at end of file diff --git a/spring-jenkins-pipeline/.mvn/wrapper/maven-wrapper.jar b/spring-jenkins-pipeline/.mvn/wrapper/maven-wrapper.jar new file mode 100644 index 0000000000000000000000000000000000000000..5fd4d5023f1463b5ba3970e33c460c1eb26d748d GIT binary patch literal 49502 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%0A$pwhjXzyA0ZzErH{1@M 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 OJOEd-=rxTO#Qy`$*1Hh^ literal 0 HcmV?d00001 diff --git a/spring-jenkins-pipeline/.mvn/wrapper/maven-wrapper.properties b/spring-jenkins-pipeline/.mvn/wrapper/maven-wrapper.properties new file mode 100644 index 0000000000..c954cec91c --- /dev/null +++ b/spring-jenkins-pipeline/.mvn/wrapper/maven-wrapper.properties @@ -0,0 +1 @@ +distributionUrl=https://repo1.maven.org/maven2/org/apache/maven/apache-maven/3.3.9/apache-maven-3.3.9-bin.zip diff --git a/spring-jenkins-pipeline/README.md b/spring-jenkins-pipeline/README.md new file mode 100644 index 0000000000..7e562664e6 --- /dev/null +++ b/spring-jenkins-pipeline/README.md @@ -0,0 +1,23 @@ +BASIC CRUD API with Spring Boot +================================ + +This is the code of a simple API for some CRUD operations build using Spring Boot. + +### Requirements + +- Maven +- JDK 8 +- MongoDB + +### Running + +To build and start the server simply type + +```bash +$ mvn clean install +$ mvn spring-boot:run -Dserver.port=8989 +``` + +Now with default configurations it will be available at: [http://localhost:8080](http://localhost:8080) + +Enjoy it :) \ No newline at end of file diff --git a/spring-jenkins-pipeline/mvnw b/spring-jenkins-pipeline/mvnw new file mode 100755 index 0000000000..a1ba1bf554 --- /dev/null +++ b/spring-jenkins-pipeline/mvnw @@ -0,0 +1,233 @@ +#!/bin/sh +# ---------------------------------------------------------------------------- +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. +# ---------------------------------------------------------------------------- + +# ---------------------------------------------------------------------------- +# Maven2 Start Up Batch script +# +# Required ENV vars: +# ------------------ +# JAVA_HOME - location of a JDK home dir +# +# Optional ENV vars +# ----------------- +# M2_HOME - location of maven2's installed home dir +# MAVEN_OPTS - parameters passed to the Java VM when running Maven +# e.g. to debug Maven itself, use +# set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000 +# MAVEN_SKIP_RC - flag to disable loading of mavenrc files +# ---------------------------------------------------------------------------- + +if [ -z "$MAVEN_SKIP_RC" ] ; then + + if [ -f /etc/mavenrc ] ; then + . /etc/mavenrc + fi + + if [ -f "$HOME/.mavenrc" ] ; then + . "$HOME/.mavenrc" + fi + +fi + +# OS specific support. $var _must_ be set to either true or false. +cygwin=false; +darwin=false; +mingw=false +case "`uname`" in + CYGWIN*) cygwin=true ;; + MINGW*) mingw=true;; + Darwin*) darwin=true + # + # Look for the Apple JDKs first to preserve the existing behaviour, and then look + # for the new JDKs provided by Oracle. + # + if [ -z "$JAVA_HOME" ] && [ -L /System/Library/Frameworks/JavaVM.framework/Versions/CurrentJDK ] ; then + # + # Apple JDKs + # + export JAVA_HOME=/System/Library/Frameworks/JavaVM.framework/Versions/CurrentJDK/Home + fi + + if [ -z "$JAVA_HOME" ] && [ -L /System/Library/Java/JavaVirtualMachines/CurrentJDK ] ; then + # + # Apple JDKs + # + export JAVA_HOME=/System/Library/Java/JavaVirtualMachines/CurrentJDK/Contents/Home + fi + + if [ -z "$JAVA_HOME" ] && [ -L "/Library/Java/JavaVirtualMachines/CurrentJDK" ] ; then + # + # Oracle JDKs + # + export JAVA_HOME=/Library/Java/JavaVirtualMachines/CurrentJDK/Contents/Home + fi + + if [ -z "$JAVA_HOME" ] && [ -x "/usr/libexec/java_home" ]; then + # + # Apple JDKs + # + export JAVA_HOME=`/usr/libexec/java_home` + fi + ;; +esac + +if [ -z "$JAVA_HOME" ] ; then + if [ -r /etc/gentoo-release ] ; then + JAVA_HOME=`java-config --jre-home` + fi +fi + +if [ -z "$M2_HOME" ] ; then + ## resolve links - $0 may be a link to maven's home + PRG="$0" + + # need this for relative symlinks + while [ -h "$PRG" ] ; do + ls=`ls -ld "$PRG"` + link=`expr "$ls" : '.*-> \(.*\)$'` + if expr "$link" : '/.*' > /dev/null; then + PRG="$link" + else + PRG="`dirname "$PRG"`/$link" + fi + done + + saveddir=`pwd` + + M2_HOME=`dirname "$PRG"`/.. + + # make it fully qualified + M2_HOME=`cd "$M2_HOME" && pwd` + + cd "$saveddir" + # echo Using m2 at $M2_HOME +fi + +# For Cygwin, ensure paths are in UNIX format before anything is touched +if $cygwin ; then + [ -n "$M2_HOME" ] && + M2_HOME=`cygpath --unix "$M2_HOME"` + [ -n "$JAVA_HOME" ] && + JAVA_HOME=`cygpath --unix "$JAVA_HOME"` + [ -n "$CLASSPATH" ] && + CLASSPATH=`cygpath --path --unix "$CLASSPATH"` +fi + +# For Migwn, ensure paths are in UNIX format before anything is touched +if $mingw ; then + [ -n "$M2_HOME" ] && + M2_HOME="`(cd "$M2_HOME"; pwd)`" + [ -n "$JAVA_HOME" ] && + JAVA_HOME="`(cd "$JAVA_HOME"; pwd)`" + # TODO classpath? +fi + +if [ -z "$JAVA_HOME" ]; then + javaExecutable="`which javac`" + if [ -n "$javaExecutable" ] && ! [ "`expr \"$javaExecutable\" : '\([^ ]*\)'`" = "no" ]; then + # readlink(1) is not available as standard on Solaris 10. + readLink=`which readlink` + if [ ! `expr "$readLink" : '\([^ ]*\)'` = "no" ]; then + if $darwin ; then + javaHome="`dirname \"$javaExecutable\"`" + javaExecutable="`cd \"$javaHome\" && pwd -P`/javac" + else + javaExecutable="`readlink -f \"$javaExecutable\"`" + fi + javaHome="`dirname \"$javaExecutable\"`" + javaHome=`expr "$javaHome" : '\(.*\)/bin'` + JAVA_HOME="$javaHome" + export JAVA_HOME + fi + fi +fi + +if [ -z "$JAVACMD" ] ; then + if [ -n "$JAVA_HOME" ] ; then + if [ -x "$JAVA_HOME/jre/sh/java" ] ; then + # IBM's JDK on AIX uses strange locations for the executables + JAVACMD="$JAVA_HOME/jre/sh/java" + else + JAVACMD="$JAVA_HOME/bin/java" + fi + else + JAVACMD="`which java`" + fi +fi + +if [ ! -x "$JAVACMD" ] ; then + echo "Error: JAVA_HOME is not defined correctly." >&2 + echo " We cannot execute $JAVACMD" >&2 + exit 1 +fi + +if [ -z "$JAVA_HOME" ] ; then + echo "Warning: JAVA_HOME environment variable is not set." +fi + +CLASSWORLDS_LAUNCHER=org.codehaus.plexus.classworlds.launcher.Launcher + +# For Cygwin, switch paths to Windows format before running java +if $cygwin; then + [ -n "$M2_HOME" ] && + M2_HOME=`cygpath --path --windows "$M2_HOME"` + [ -n "$JAVA_HOME" ] && + JAVA_HOME=`cygpath --path --windows "$JAVA_HOME"` + [ -n "$CLASSPATH" ] && + CLASSPATH=`cygpath --path --windows "$CLASSPATH"` +fi + +# traverses directory structure from process work directory to filesystem root +# first directory with .mvn subdirectory is considered project base directory +find_maven_basedir() { + local basedir=$(pwd) + local wdir=$(pwd) + while [ "$wdir" != '/' ] ; do + if [ -d "$wdir"/.mvn ] ; then + basedir=$wdir + break + fi + wdir=$(cd "$wdir/.."; pwd) + done + echo "${basedir}" +} + +# concatenates all lines of a file +concat_lines() { + if [ -f "$1" ]; then + echo "$(tr -s '\n' ' ' < "$1")" + fi +} + +export MAVEN_PROJECTBASEDIR=${MAVEN_BASEDIR:-$(find_maven_basedir)} +MAVEN_OPTS="$(concat_lines "$MAVEN_PROJECTBASEDIR/.mvn/jvm.config") $MAVEN_OPTS" + +# Provide a "standardized" way to retrieve the CLI args that will +# work with both Windows and non-Windows executions. +MAVEN_CMD_LINE_ARGS="$MAVEN_CONFIG $@" +export MAVEN_CMD_LINE_ARGS + +WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain + +exec "$JAVACMD" \ + $MAVEN_OPTS \ + -classpath "$MAVEN_PROJECTBASEDIR/.mvn/wrapper/maven-wrapper.jar" \ + "-Dmaven.home=${M2_HOME}" "-Dmaven.multiModuleProjectDirectory=${MAVEN_PROJECTBASEDIR}" \ + ${WRAPPER_LAUNCHER} "$@" diff --git a/spring-jenkins-pipeline/mvnw.cmd b/spring-jenkins-pipeline/mvnw.cmd new file mode 100644 index 0000000000..2b934e89dd --- /dev/null +++ b/spring-jenkins-pipeline/mvnw.cmd @@ -0,0 +1,145 @@ +@REM ---------------------------------------------------------------------------- +@REM Licensed to the Apache Software Foundation (ASF) under one +@REM or more contributor license agreements. See the NOTICE file +@REM distributed with this work for additional information +@REM regarding copyright ownership. The ASF licenses this file +@REM to you under the Apache License, Version 2.0 (the +@REM "License"); you may not use this file except in compliance +@REM with the License. You may obtain a copy of the License at +@REM +@REM http://www.apache.org/licenses/LICENSE-2.0 +@REM +@REM Unless required by applicable law or agreed to in writing, +@REM software distributed under the License is distributed on an +@REM "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +@REM KIND, either express or implied. See the License for the +@REM specific language governing permissions and limitations +@REM under the License. +@REM ---------------------------------------------------------------------------- + +@REM ---------------------------------------------------------------------------- +@REM Maven2 Start Up Batch script +@REM +@REM Required ENV vars: +@REM JAVA_HOME - location of a JDK home dir +@REM +@REM Optional ENV vars +@REM M2_HOME - location of maven2's installed home dir +@REM MAVEN_BATCH_ECHO - set to 'on' to enable the echoing of the batch commands +@REM MAVEN_BATCH_PAUSE - set to 'on' to wait for a key stroke before ending +@REM MAVEN_OPTS - parameters passed to the Java VM when running Maven +@REM e.g. to debug Maven itself, use +@REM set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000 +@REM MAVEN_SKIP_RC - flag to disable loading of mavenrc files +@REM ---------------------------------------------------------------------------- + +@REM Begin all REM lines with '@' in case MAVEN_BATCH_ECHO is 'on' +@echo off +@REM enable echoing my setting MAVEN_BATCH_ECHO to 'on' +@if "%MAVEN_BATCH_ECHO%" == "on" echo %MAVEN_BATCH_ECHO% + +@REM set %HOME% to equivalent of $HOME +if "%HOME%" == "" (set "HOME=%HOMEDRIVE%%HOMEPATH%") + +@REM Execute a user defined script before this one +if not "%MAVEN_SKIP_RC%" == "" goto skipRcPre +@REM check for pre script, once with legacy .bat ending and once with .cmd ending +if exist "%HOME%\mavenrc_pre.bat" call "%HOME%\mavenrc_pre.bat" +if exist "%HOME%\mavenrc_pre.cmd" call "%HOME%\mavenrc_pre.cmd" +:skipRcPre + +@setlocal + +set ERROR_CODE=0 + +@REM To isolate internal variables from possible post scripts, we use another setlocal +@setlocal + +@REM ==== START VALIDATION ==== +if not "%JAVA_HOME%" == "" goto OkJHome + +echo. +echo Error: JAVA_HOME not found in your environment. >&2 +echo Please set the JAVA_HOME variable in your environment to match the >&2 +echo location of your Java installation. >&2 +echo. +goto error + +:OkJHome +if exist "%JAVA_HOME%\bin\java.exe" goto init + +echo. +echo Error: JAVA_HOME is set to an invalid directory. >&2 +echo JAVA_HOME = "%JAVA_HOME%" >&2 +echo Please set the JAVA_HOME variable in your environment to match the >&2 +echo location of your Java installation. >&2 +echo. +goto error + +@REM ==== END VALIDATION ==== + +:init + +set MAVEN_CMD_LINE_ARGS=%* + +@REM Find the project base dir, i.e. the directory that contains the folder ".mvn". +@REM Fallback to current working directory if not found. + +set MAVEN_PROJECTBASEDIR=%MAVEN_BASEDIR% +IF NOT "%MAVEN_PROJECTBASEDIR%"=="" goto endDetectBaseDir + +set EXEC_DIR=%CD% +set WDIR=%EXEC_DIR% +:findBaseDir +IF EXIST "%WDIR%"\.mvn goto baseDirFound +cd .. +IF "%WDIR%"=="%CD%" goto baseDirNotFound +set WDIR=%CD% +goto findBaseDir + +:baseDirFound +set MAVEN_PROJECTBASEDIR=%WDIR% +cd "%EXEC_DIR%" +goto endDetectBaseDir + +:baseDirNotFound +set MAVEN_PROJECTBASEDIR=%EXEC_DIR% +cd "%EXEC_DIR%" + +:endDetectBaseDir + +IF NOT EXIST "%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config" goto endReadAdditionalConfig + +@setlocal EnableExtensions EnableDelayedExpansion +for /F "usebackq delims=" %%a in ("%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config") do set JVM_CONFIG_MAVEN_PROPS=!JVM_CONFIG_MAVEN_PROPS! %%a +@endlocal & set JVM_CONFIG_MAVEN_PROPS=%JVM_CONFIG_MAVEN_PROPS% + +:endReadAdditionalConfig + +SET MAVEN_JAVA_EXE="%JAVA_HOME%\bin\java.exe" + +set WRAPPER_JAR="".\.mvn\wrapper\maven-wrapper.jar"" +set WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain + +%MAVEN_JAVA_EXE% %JVM_CONFIG_MAVEN_PROPS% %MAVEN_OPTS% %MAVEN_DEBUG_OPTS% -classpath %WRAPPER_JAR% "-Dmaven.multiModuleProjectDirectory=%MAVEN_PROJECTBASEDIR%" %WRAPPER_LAUNCHER% %MAVEN_CMD_LINE_ARGS% +if ERRORLEVEL 1 goto error +goto end + +:error +set ERROR_CODE=1 + +:end +@endlocal & set ERROR_CODE=%ERROR_CODE% + +if not "%MAVEN_SKIP_RC%" == "" goto skipRcPost +@REM check for post script, once with legacy .bat ending and once with .cmd ending +if exist "%HOME%\mavenrc_post.bat" call "%HOME%\mavenrc_post.bat" +if exist "%HOME%\mavenrc_post.cmd" call "%HOME%\mavenrc_post.cmd" +:skipRcPost + +@REM pause the script if MAVEN_BATCH_PAUSE is set to 'on' +if "%MAVEN_BATCH_PAUSE%" == "on" pause + +if "%MAVEN_TERMINATE_CMD%" == "on" exit %ERROR_CODE% + +exit /B %ERROR_CODE% \ No newline at end of file diff --git a/spring-jenkins-pipeline/pom.xml b/spring-jenkins-pipeline/pom.xml new file mode 100644 index 0000000000..1c35f0f73b --- /dev/null +++ b/spring-jenkins-pipeline/pom.xml @@ -0,0 +1,97 @@ + + + 4.0.0 + + spring-jenkins-pipeline + 0.0.1-SNAPSHOT + jar + + spring-jenkins-pipeline + Intro to Jenkins 2 and the power of pipelines + + + parent-boot-5 + com.baeldung + 0.0.1-SNAPSHOT + ../parent-boot-5 + + + + UTF-8 + UTF-8 + 1.8 + + + + + org.springframework.boot + spring-boot-starter-data-mongodb + + + org.springframework.boot + spring-boot-starter-data-rest + + + org.springframework.boot + spring-boot-starter-test + test + + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + org.apache.maven.plugins + maven-checkstyle-plugin + 2.17 + + + + + + + integration + + + + maven-surefire-plugin + + + **/*UnitTest.java + + + + **/*IntegrationTest.java + + + + + + + + + unit + + + + maven-surefire-plugin + + + **/*IntegrationTest.java + + + + **/*UnitTest.java + + + + + + + + diff --git a/spring-jenkins-pipeline/src/main/java/com/baeldung/SpringJenkinsPipelineApplication.java b/spring-jenkins-pipeline/src/main/java/com/baeldung/SpringJenkinsPipelineApplication.java new file mode 100644 index 0000000000..fcf4fde414 --- /dev/null +++ b/spring-jenkins-pipeline/src/main/java/com/baeldung/SpringJenkinsPipelineApplication.java @@ -0,0 +1,13 @@ +package com.baeldung; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.data.mongodb.repository.config.EnableMongoRepositories; + +@SpringBootApplication +@EnableMongoRepositories +public class SpringJenkinsPipelineApplication { + public static void main(String[] args) { + SpringApplication.run(SpringJenkinsPipelineApplication.class, args); + } +} diff --git a/spring-jenkins-pipeline/src/main/java/com/baeldung/domain/Student.java b/spring-jenkins-pipeline/src/main/java/com/baeldung/domain/Student.java new file mode 100644 index 0000000000..3d1dd27b0e --- /dev/null +++ b/spring-jenkins-pipeline/src/main/java/com/baeldung/domain/Student.java @@ -0,0 +1,73 @@ +package com.baeldung.domain; + +import javax.validation.constraints.NotNull; +import org.springframework.data.annotation.Id; +import org.springframework.data.mongodb.core.mapping.Document; + +import java.io.Serializable; + +@Document(collection = "STUDENT") +public class Student implements Serializable { + + @Id + private String id; + @NotNull + private String firstName; + private String lastName; + @NotNull + private String phoneNumber; + private String email; + + public Student(String firstName, String lastName, String phoneNumber, String email) { + this.firstName = firstName; + this.lastName = lastName; + this.phoneNumber = phoneNumber; + this.email = email; + } + + public String getId() { + return id; + } + + public String getFirstName() { + return firstName; + } + + public void setFirstName(String firstName) { + this.firstName = firstName; + } + + public String getLastName() { + return lastName; + } + + public void setLastName(String lastName) { + this.lastName = lastName; + } + + public String getPhoneNumber() { + return phoneNumber; + } + + public void setPhoneNumber(String phoneNumber) { + this.phoneNumber = phoneNumber; + } + + public String getEmail() { + return email; + } + + public void setEmail(String email) { + this.email = email; + } + + @Override + public String toString() { + return "Student{" + + "firstName='" + firstName + '\'' + + ", lastName='" + lastName + '\'' + + ", phoneNumber='" + phoneNumber + '\'' + + ", email='" + email + '\'' + + '}'; + } +} diff --git a/spring-jenkins-pipeline/src/main/java/com/baeldung/repository/StudentRepository.java b/spring-jenkins-pipeline/src/main/java/com/baeldung/repository/StudentRepository.java new file mode 100644 index 0000000000..d0ca7d8510 --- /dev/null +++ b/spring-jenkins-pipeline/src/main/java/com/baeldung/repository/StudentRepository.java @@ -0,0 +1,7 @@ +package com.baeldung.repository; + +import org.springframework.data.mongodb.repository.MongoRepository; +import com.baeldung.domain.Student; + +public interface StudentRepository extends MongoRepository { +} diff --git a/spring-jenkins-pipeline/src/main/resources/application.properties b/spring-jenkins-pipeline/src/main/resources/application.properties new file mode 100644 index 0000000000..b6bfd8f6f3 --- /dev/null +++ b/spring-jenkins-pipeline/src/main/resources/application.properties @@ -0,0 +1,14 @@ +# the db host +spring.data.mongodb.host=localhost +# the connection port (defaults to 27107) +spring.data.mongodb.port=27017 +# The database's name +spring.data.mongodb.database=Jenkins-Pipeline + +# Or this +# spring.data.mongodb.uri=mongodb://localhost/Jenkins-Pipeline + +# spring.data.mongodb.username= +# spring.data.mongodb.password= + +spring.data.mongodb.repositories.enabled=true \ No newline at end of file diff --git a/spring-jenkins-pipeline/src/test/java/com/baeldung/SomeIntegrationTest.java b/spring-jenkins-pipeline/src/test/java/com/baeldung/SomeIntegrationTest.java new file mode 100644 index 0000000000..dd8a234d1d --- /dev/null +++ b/spring-jenkins-pipeline/src/test/java/com/baeldung/SomeIntegrationTest.java @@ -0,0 +1,37 @@ +package com.baeldung; + +import com.baeldung.domain.Student; +import com.baeldung.repository.StudentRepository; +import org.junit.After; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; +import static org.junit.Assert.*; + +@RunWith(SpringJUnit4ClassRunner.class) +@SpringBootTest +public class SomeIntegrationTest { + @Autowired + private StudentRepository studentRepository; + + @Before + public void setup() { + Student student = new Student("Paul", "Smith", "64377473774", "me@mymail.com"); + studentRepository.save(student); + } + + @Test + public void testDB() { + long count = studentRepository.count(); + + assertNotEquals(0, count); + } + + @After + public void clean() { + studentRepository.deleteAll(); + } +} diff --git a/spring-jenkins-pipeline/src/test/java/com/baeldung/SomeUnitTest.java b/spring-jenkins-pipeline/src/test/java/com/baeldung/SomeUnitTest.java new file mode 100644 index 0000000000..ea317ed7cd --- /dev/null +++ b/spring-jenkins-pipeline/src/test/java/com/baeldung/SomeUnitTest.java @@ -0,0 +1,11 @@ +package com.baeldung; + +import org.junit.Test; +import static org.junit.Assert.*; + +public class SomeUnitTest { + @Test + public void init() { + assertEquals(1, 1); + } +} diff --git a/spring-jmeter-jenkins/README.md b/spring-jmeter-jenkins/README.md index 49c18122a2..dec8364647 100644 --- a/spring-jmeter-jenkins/README.md +++ b/spring-jmeter-jenkins/README.md @@ -1,20 +1,7 @@ BASIC CRUD API with Spring Boot ================================ -This is the code of a simple API for some CRUD operations realised for a seminar at [FGI](www.fgi-ud.org) using Spring Boot. - -### Demo -* API: The online version **is**/**will be** hosted here: https://fgi-tcheck.herokuapp.com -* Mobile version is also opensource and located here: https://github.com/valdesekamdem/tcheck-mobile - -### Features -#### Currently Implemented -* CRUD - * Student - -#### To DO -* Validations of input with: [Spring Data Rest Validators](http://docs.spring.io/spring-data/rest/docs/2.1.0.RELEASE/reference/html/validation-chapter.html) - +This is the code of a simple API for some CRUD operations build using Spring Boot. ### Requirements @@ -49,7 +36,6 @@ Or create a new one via a POST: $ curl -X POST -H "Content-Type:application/json" -d '{ "firstName" : "Dassi", "lastName" : "Orleando", "phoneNumber": "+237 545454545", "email": "mymail@yahoo.fr" }' localhost:8080/students ``` - Now with default configurations it will be available at: [http://localhost:8080](http://localhost:8080) Enjoy it :) \ No newline at end of file From eb33074a0ee4a31c538e4523367a80a9c3c63cc6 Mon Sep 17 00:00:00 2001 From: Dassi Orleando Date: Wed, 29 Nov 2017 05:30:56 +0100 Subject: [PATCH 107/236] Simulate false unit test --- .../src/test/java/com/baeldung/SomeUnitTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/spring-jenkins-pipeline/src/test/java/com/baeldung/SomeUnitTest.java b/spring-jenkins-pipeline/src/test/java/com/baeldung/SomeUnitTest.java index ea317ed7cd..1e0fc985c3 100644 --- a/spring-jenkins-pipeline/src/test/java/com/baeldung/SomeUnitTest.java +++ b/spring-jenkins-pipeline/src/test/java/com/baeldung/SomeUnitTest.java @@ -6,6 +6,6 @@ import static org.junit.Assert.*; public class SomeUnitTest { @Test public void init() { - assertEquals(1, 1); + assertEquals(1, 0); } } From 5f0eed95024ea13354322ccdc2b1fa8ded909d2f Mon Sep 17 00:00:00 2001 From: Ahmed Tawila Date: Wed, 29 Nov 2017 09:06:30 +0200 Subject: [PATCH 108/236] Future in Vavr - Initial Commit --- .../java/com/baeldung/vavr/future/Tester.java | 22 +++++++++++++++++++ 1 file changed, 22 insertions(+) create mode 100644 vavr/src/main/java/com/baeldung/vavr/future/Tester.java diff --git a/vavr/src/main/java/com/baeldung/vavr/future/Tester.java b/vavr/src/main/java/com/baeldung/vavr/future/Tester.java new file mode 100644 index 0000000000..7e07027509 --- /dev/null +++ b/vavr/src/main/java/com/baeldung/vavr/future/Tester.java @@ -0,0 +1,22 @@ +package com.baeldung.vavr.future; + +import static org.junit.Assert.assertEquals; +import org.junit.Test; + +import io.vavr.concurrent.Future; + +public class Tester { + + @Test + public void start() { + Future resultFuture = Future.of(() -> addOne(4)); + Integer result = resultFuture.get(); + + assertEquals(5, (int) result); + } + + public Integer addOne(Integer num) { + return num + 1; + } + +} From 339552010ebf0aace41af80b59d0f6ea64cb2429 Mon Sep 17 00:00:00 2001 From: Ahmed Tawila Date: Wed, 29 Nov 2017 15:28:08 +0200 Subject: [PATCH 109/236] enhance nested classes --- .../com/baeldung/nestedclass/Enclosing.java | 11 ------- .../java/com/baeldung/nestedclass/Outer.java | 11 ------- .../nestedclass/SimpleAbstractClass.java | 5 --- ...mousInnerTest.java => AnonymousInner.java} | 8 +++-- .../com/baeldung/nestedclass/Enclosing.java | 21 ++++++++++++ .../baeldung/nestedclass/InnerClassTest.java | 13 -------- .../baeldung/nestedclass/LocalClassTest.java | 12 ------- .../baeldung/nestedclass/NestedClassTest.java | 12 ------- .../baeldung/nestedclass/NewEnclosing.java | 11 +++++-- .../com/baeldung/nestedclass/NewOuter.java | 30 +++++++++++++++++ .../baeldung/nestedclass/NewOuterTest.java | 32 ------------------- .../java/com/baeldung/nestedclass/Outer.java | 20 ++++++++++++ 12 files changed, 86 insertions(+), 100 deletions(-) delete mode 100644 core-java/src/main/java/com/baeldung/nestedclass/Enclosing.java delete mode 100644 core-java/src/main/java/com/baeldung/nestedclass/Outer.java delete mode 100644 core-java/src/main/java/com/baeldung/nestedclass/SimpleAbstractClass.java rename core-java/src/test/java/com/baeldung/nestedclass/{AnonymousInnerTest.java => AnonymousInner.java} (72%) create mode 100644 core-java/src/test/java/com/baeldung/nestedclass/Enclosing.java delete mode 100644 core-java/src/test/java/com/baeldung/nestedclass/InnerClassTest.java delete mode 100644 core-java/src/test/java/com/baeldung/nestedclass/LocalClassTest.java delete mode 100644 core-java/src/test/java/com/baeldung/nestedclass/NestedClassTest.java rename core-java/src/{main => test}/java/com/baeldung/nestedclass/NewEnclosing.java (59%) create mode 100644 core-java/src/test/java/com/baeldung/nestedclass/NewOuter.java delete mode 100644 core-java/src/test/java/com/baeldung/nestedclass/NewOuterTest.java create mode 100644 core-java/src/test/java/com/baeldung/nestedclass/Outer.java diff --git a/core-java/src/main/java/com/baeldung/nestedclass/Enclosing.java b/core-java/src/main/java/com/baeldung/nestedclass/Enclosing.java deleted file mode 100644 index a9911538b0..0000000000 --- a/core-java/src/main/java/com/baeldung/nestedclass/Enclosing.java +++ /dev/null @@ -1,11 +0,0 @@ -package com.baeldung.nestedclass; - -public class Enclosing { - - public static class Nested { - - public void test() { - System.out.println("Calling test..."); - } - } -} diff --git a/core-java/src/main/java/com/baeldung/nestedclass/Outer.java b/core-java/src/main/java/com/baeldung/nestedclass/Outer.java deleted file mode 100644 index ebd6d27293..0000000000 --- a/core-java/src/main/java/com/baeldung/nestedclass/Outer.java +++ /dev/null @@ -1,11 +0,0 @@ -package com.baeldung.nestedclass; - -public class Outer { - - public class Inner { - - public void test() { - System.out.println("Calling test..."); - } - } -} diff --git a/core-java/src/main/java/com/baeldung/nestedclass/SimpleAbstractClass.java b/core-java/src/main/java/com/baeldung/nestedclass/SimpleAbstractClass.java deleted file mode 100644 index 586e2d12b4..0000000000 --- a/core-java/src/main/java/com/baeldung/nestedclass/SimpleAbstractClass.java +++ /dev/null @@ -1,5 +0,0 @@ -package com.baeldung.nestedclass; - -abstract class SimpleAbstractClass { - abstract void run(); -} \ No newline at end of file diff --git a/core-java/src/test/java/com/baeldung/nestedclass/AnonymousInnerTest.java b/core-java/src/test/java/com/baeldung/nestedclass/AnonymousInner.java similarity index 72% rename from core-java/src/test/java/com/baeldung/nestedclass/AnonymousInnerTest.java rename to core-java/src/test/java/com/baeldung/nestedclass/AnonymousInner.java index 394c0bb57a..9fa8ee9cd5 100644 --- a/core-java/src/test/java/com/baeldung/nestedclass/AnonymousInnerTest.java +++ b/core-java/src/test/java/com/baeldung/nestedclass/AnonymousInner.java @@ -2,10 +2,14 @@ package com.baeldung.nestedclass; import org.junit.Test; -public class AnonymousInnerTest { +abstract class SimpleAbstractClass { + abstract void run(); +} + +public class AnonymousInner { @Test - public void whenRunAnonymousClass_thenCorrect() { + public void run() { SimpleAbstractClass simpleAbstractClass = new SimpleAbstractClass() { void run() { System.out.println("Running Anonymous Class..."); diff --git a/core-java/src/test/java/com/baeldung/nestedclass/Enclosing.java b/core-java/src/test/java/com/baeldung/nestedclass/Enclosing.java new file mode 100644 index 0000000000..3db33cde9b --- /dev/null +++ b/core-java/src/test/java/com/baeldung/nestedclass/Enclosing.java @@ -0,0 +1,21 @@ +package com.baeldung.nestedclass; + +import org.junit.Test; + +public class Enclosing { + + private static int x = 1; + + public static class StaticNested { + + private void run() { + System.out.println("x = " + x); + } + } + + @Test + public void test() { + Enclosing.StaticNested nested = new Enclosing.StaticNested(); + nested.run(); + } +} diff --git a/core-java/src/test/java/com/baeldung/nestedclass/InnerClassTest.java b/core-java/src/test/java/com/baeldung/nestedclass/InnerClassTest.java deleted file mode 100644 index e9cb119ac2..0000000000 --- a/core-java/src/test/java/com/baeldung/nestedclass/InnerClassTest.java +++ /dev/null @@ -1,13 +0,0 @@ -package com.baeldung.nestedclass; - -import org.junit.Test; - -public class InnerClassTest { - - @Test - public void givenInnerClassWhenInstantiating_thenCorrect() { - Outer outer = new Outer(); - Outer.Inner inner = outer.new Inner(); - inner.test(); - } -} diff --git a/core-java/src/test/java/com/baeldung/nestedclass/LocalClassTest.java b/core-java/src/test/java/com/baeldung/nestedclass/LocalClassTest.java deleted file mode 100644 index dad19161ad..0000000000 --- a/core-java/src/test/java/com/baeldung/nestedclass/LocalClassTest.java +++ /dev/null @@ -1,12 +0,0 @@ -package com.baeldung.nestedclass; - -import org.junit.Test; - -public class LocalClassTest { - - @Test - public void whenTestingLocalClass_thenCorrect() { - NewEnclosing newEnclosing = new NewEnclosing(); - newEnclosing.run(); - } -} diff --git a/core-java/src/test/java/com/baeldung/nestedclass/NestedClassTest.java b/core-java/src/test/java/com/baeldung/nestedclass/NestedClassTest.java deleted file mode 100644 index 16c883689a..0000000000 --- a/core-java/src/test/java/com/baeldung/nestedclass/NestedClassTest.java +++ /dev/null @@ -1,12 +0,0 @@ -package com.baeldung.nestedclass; - -import org.junit.Test; - -public class NestedClassTest { - - @Test - public void whenInstantiatingStaticNestedClass_thenCorrect() { - Enclosing.Nested nested = new Enclosing.Nested(); - nested.test(); - } -} diff --git a/core-java/src/main/java/com/baeldung/nestedclass/NewEnclosing.java b/core-java/src/test/java/com/baeldung/nestedclass/NewEnclosing.java similarity index 59% rename from core-java/src/main/java/com/baeldung/nestedclass/NewEnclosing.java rename to core-java/src/test/java/com/baeldung/nestedclass/NewEnclosing.java index c7e04e8600..deeb72de0c 100644 --- a/core-java/src/main/java/com/baeldung/nestedclass/NewEnclosing.java +++ b/core-java/src/test/java/com/baeldung/nestedclass/NewEnclosing.java @@ -1,10 +1,11 @@ package com.baeldung.nestedclass; +import org.junit.Test; + public class NewEnclosing { - void run() { + private void run() { class Local { - void run() { System.out.println("Welcome to Baeldung!"); } @@ -12,4 +13,10 @@ public class NewEnclosing { Local local = new Local(); local.run(); } + + @Test + public void test() { + NewEnclosing newEnclosing = new NewEnclosing(); + newEnclosing.run(); + } } \ No newline at end of file diff --git a/core-java/src/test/java/com/baeldung/nestedclass/NewOuter.java b/core-java/src/test/java/com/baeldung/nestedclass/NewOuter.java new file mode 100644 index 0000000000..a3a723b30e --- /dev/null +++ b/core-java/src/test/java/com/baeldung/nestedclass/NewOuter.java @@ -0,0 +1,30 @@ +package com.baeldung.nestedclass; + +import org.junit.Test; + +public class NewOuter { + + int a = 1; + static int b = 2; + + public class InnerClass { + int a = 3; + static final int b = 4; + + public void run() { + System.out.println("a = " + a); + System.out.println("b = " + b); + System.out.println("NewOuterTest.this.a = " + NewOuter.this.a); + System.out.println("NewOuterTest.b = " + NewOuter.b); + System.out.println("NewOuterTest.this.b = " + NewOuter.this.b); + } + } + + @Test + public void test() { + NewOuter outer = new NewOuter(); + NewOuter.InnerClass inner = outer.new InnerClass(); + inner.run(); + + } +} \ No newline at end of file diff --git a/core-java/src/test/java/com/baeldung/nestedclass/NewOuterTest.java b/core-java/src/test/java/com/baeldung/nestedclass/NewOuterTest.java deleted file mode 100644 index e883687d33..0000000000 --- a/core-java/src/test/java/com/baeldung/nestedclass/NewOuterTest.java +++ /dev/null @@ -1,32 +0,0 @@ -package com.baeldung.nestedclass; - -import static org.junit.Assert.assertEquals; -import org.junit.Test; - -public class NewOuterTest { - - int a = 1; - static int b = 2; - - public class InnerClass { - int a = 3; - static final int b = 4; - - @Test - public void whenShadowing_thenCorrect() { - assertEquals(3, a); - assertEquals(4, b); - assertEquals(1, NewOuterTest.this.a); - assertEquals(2, NewOuterTest.b); - assertEquals(2, NewOuterTest.this.b); - } - } - - @Test - public void shadowingTest() { - NewOuterTest outer = new NewOuterTest(); - NewOuterTest.InnerClass inner = outer.new InnerClass(); - inner.whenShadowing_thenCorrect(); - - } -} \ No newline at end of file diff --git a/core-java/src/test/java/com/baeldung/nestedclass/Outer.java b/core-java/src/test/java/com/baeldung/nestedclass/Outer.java new file mode 100644 index 0000000000..d5e46670c9 --- /dev/null +++ b/core-java/src/test/java/com/baeldung/nestedclass/Outer.java @@ -0,0 +1,20 @@ +package com.baeldung.nestedclass; + +import org.junit.Test; + +public class Outer { + + public class Inner { + + public void run() { + System.out.println("Calling test..."); + } + } + + @Test + public void test() { + Outer outer = new Outer(); + Outer.Inner inner = outer.new Inner(); + inner.run(); + } +} From d26adf690b615d5194b5f1650b092c68139445c3 Mon Sep 17 00:00:00 2001 From: Markus Gulden Date: Wed, 29 Nov 2017 23:50:00 +0100 Subject: [PATCH 110/236] BAEL-1336 Introduction to Hibernate Search --- .../spring-hibernate-5/pom.xml | 6 + .../HibernateSearchConfig.java | 76 +++++++ .../hibernatesearch/ProductSearchDao.java | 195 ++++++++++++++++++ .../hibernatesearch/model/Product.java | 94 +++++++++ .../main/resources/persistence-h2.properties | 4 + .../HibernateSearchIntegrationTest.java | 187 +++++++++++++++++ 6 files changed, 562 insertions(+) create mode 100644 persistence-modules/spring-hibernate-5/src/main/java/com/baeldung/hibernatesearch/HibernateSearchConfig.java create mode 100644 persistence-modules/spring-hibernate-5/src/main/java/com/baeldung/hibernatesearch/ProductSearchDao.java create mode 100644 persistence-modules/spring-hibernate-5/src/main/java/com/baeldung/hibernatesearch/model/Product.java create mode 100644 persistence-modules/spring-hibernate-5/src/test/java/com/baeldung/hibernatesearch/HibernateSearchIntegrationTest.java diff --git a/persistence-modules/spring-hibernate-5/pom.xml b/persistence-modules/spring-hibernate-5/pom.xml index f1f3d10347..8dc447c3b7 100644 --- a/persistence-modules/spring-hibernate-5/pom.xml +++ b/persistence-modules/spring-hibernate-5/pom.xml @@ -57,6 +57,11 @@ jta ${jta.version} + + org.hibernate + hibernate-search-orm + ${hibernatesearch.version} + org.apache.tomcat @@ -184,6 +189,7 @@ 5.2.10.Final + 5.8.2.Final 8.0.7-dmr 9.0.0.M26 1.1 diff --git a/persistence-modules/spring-hibernate-5/src/main/java/com/baeldung/hibernatesearch/HibernateSearchConfig.java b/persistence-modules/spring-hibernate-5/src/main/java/com/baeldung/hibernatesearch/HibernateSearchConfig.java new file mode 100644 index 0000000000..6bbd2625fc --- /dev/null +++ b/persistence-modules/spring-hibernate-5/src/main/java/com/baeldung/hibernatesearch/HibernateSearchConfig.java @@ -0,0 +1,76 @@ +package com.baeldung.hibernatesearch; + +import com.google.common.base.Preconditions; +import org.apache.tomcat.dbcp.dbcp2.BasicDataSource; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.ComponentScan; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.PropertySource; +import org.springframework.core.env.Environment; +import org.springframework.dao.annotation.PersistenceExceptionTranslationPostProcessor; +import org.springframework.data.jpa.repository.config.EnableJpaRepositories; +import org.springframework.jdbc.datasource.DriverManagerDataSource; +import org.springframework.orm.jpa.JpaTransactionManager; +import org.springframework.orm.jpa.JpaVendorAdapter; +import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean; +import org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter; +import org.springframework.transaction.PlatformTransactionManager; +import org.springframework.transaction.annotation.EnableTransactionManagement; + +import javax.persistence.EntityManagerFactory; +import javax.sql.DataSource; +import java.util.Properties; + +@EnableTransactionManagement +@Configuration +@PropertySource({ "classpath:persistence-h2.properties" }) +@EnableJpaRepositories(basePackages = { "com.baeldung.hibernatesearch" }) +@ComponentScan({ "com.baeldung.hibernatesearch" }) +public class HibernateSearchConfig { + + @Autowired + private Environment env; + + @Bean + public LocalContainerEntityManagerFactoryBean entityManagerFactory() { + LocalContainerEntityManagerFactoryBean em = new LocalContainerEntityManagerFactoryBean(); + em.setDataSource(dataSource()); + em.setPackagesToScan(new String[] { "com.baeldung.hibernatesearch.model" }); + + JpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter(); + em.setJpaVendorAdapter(vendorAdapter); + em.setJpaProperties(additionalProperties()); + + return em; + } + + @Bean + public DataSource dataSource() { + final BasicDataSource dataSource = new BasicDataSource(); + dataSource.setDriverClassName(Preconditions.checkNotNull(env.getProperty("jdbc.driverClassName"))); + dataSource.setUrl(Preconditions.checkNotNull(env.getProperty("jdbc.url"))); + + return dataSource; + } + + @Bean + public PlatformTransactionManager transactionManager(EntityManagerFactory emf) { + JpaTransactionManager transactionManager = new JpaTransactionManager(); + transactionManager.setEntityManagerFactory(emf); + + return transactionManager; + } + + @Bean + public PersistenceExceptionTranslationPostProcessor exceptionTranslation() { + return new PersistenceExceptionTranslationPostProcessor(); + } + + Properties additionalProperties() { + Properties properties = new Properties(); + properties.setProperty("hibernate.hbm2ddl.auto", Preconditions.checkNotNull(env.getProperty("hibernate.hbm2ddl.auto"))); + properties.setProperty("hibernate.dialect", Preconditions.checkNotNull(env.getProperty("hibernate.dialect"))); + return properties; + } +} \ No newline at end of file diff --git a/persistence-modules/spring-hibernate-5/src/main/java/com/baeldung/hibernatesearch/ProductSearchDao.java b/persistence-modules/spring-hibernate-5/src/main/java/com/baeldung/hibernatesearch/ProductSearchDao.java new file mode 100644 index 0000000000..210c1c58b3 --- /dev/null +++ b/persistence-modules/spring-hibernate-5/src/main/java/com/baeldung/hibernatesearch/ProductSearchDao.java @@ -0,0 +1,195 @@ +package com.baeldung.hibernatesearch; + +import com.baeldung.hibernatesearch.model.Product; +import org.apache.lucene.search.Query; +import org.hibernate.search.engine.ProjectionConstants; +import org.hibernate.search.jpa.FullTextEntityManager; +import org.hibernate.search.jpa.FullTextQuery; +import org.hibernate.search.jpa.Search; +import org.hibernate.search.query.dsl.QueryBuilder; +import org.springframework.stereotype.Repository; + +import javax.persistence.EntityManager; +import javax.persistence.PersistenceContext; +import java.util.List; + +@Repository +public class ProductSearchDao { + + @PersistenceContext + private EntityManager entityManager; + + public List searchProductNameByKeywordQuery(String text) { + + Query keywordQuery = getQueryBuilder() + .keyword() + .onField("productName") + .matching(text) + .createQuery(); + + List results = getJpaQuery(keywordQuery).getResultList(); + + return results; + } + + public List searchProductNameByFuzzyQuery(String text) { + + Query fuzzyQuery = getQueryBuilder() + .keyword() + .fuzzy() + .withEditDistanceUpTo(2) + .withPrefixLength(0) + .onField("productName") + .matching(text) + .createQuery(); + + List results = getJpaQuery(fuzzyQuery).getResultList(); + + return results; + } + + public List searchProductNameByWildcardQuery(String text) { + + Query wildcardQuery = getQueryBuilder() + .keyword() + .wildcard() + .onField("productName") + .matching(text) + .createQuery(); + + List results = getJpaQuery(wildcardQuery).getResultList(); + + return results; + } + + public List searchProductDescriptionByPhraseQuery(String text) { + + Query phraseQuery = getQueryBuilder() + .phrase() + .withSlop(1) + .onField("description") + .sentence(text) + .createQuery(); + + List results = getJpaQuery(phraseQuery).getResultList(); + + return results; + } + + public List searchProductNameAndDescriptionBySimpleQueryStringQuery(String text) { + + Query simpleQueryStringQuery = getQueryBuilder() + .simpleQueryString() + .onFields("productName", "description") + .matching(text) + .createQuery(); + + List results = getJpaQuery(simpleQueryStringQuery).getResultList(); + + return results; + } + + public List searchProductNameByRangeQuery(int low, int high) { + + Query rangeQuery = getQueryBuilder() + .range() + .onField("memory") + .from(low) + .to(high) + .createQuery(); + + List results = getJpaQuery(rangeQuery).getResultList(); + + return results; + } + + public List searchProductNameByMoreLikeThisQuery(Product entity) { + + Query moreLikeThisQuery = getQueryBuilder() + .moreLikeThis() + .comparingField("productName") + .toEntity(entity) + .createQuery(); + + List results = getJpaQuery(moreLikeThisQuery).setProjection(ProjectionConstants.THIS, ProjectionConstants.SCORE) + .getResultList(); + + return results; + } + + public List searchProductNameAndDescriptionByKeywordQuery(String text) { + + Query keywordQuery = getQueryBuilder() + .keyword() + .onFields("productName", "description") + .matching(text) + .createQuery(); + + List results = getJpaQuery(keywordQuery).getResultList(); + + return results; + } + + public List searchProductNameAndDescriptionByMoreLikeThisQuery(Product entity) { + + Query moreLikeThisQuery = getQueryBuilder() + .moreLikeThis() + .comparingField("productName") + .toEntity(entity) + .createQuery(); + + List results = getJpaQuery(moreLikeThisQuery).setProjection(ProjectionConstants.THIS, ProjectionConstants.SCORE) + .getResultList(); + + return results; + } + + public List searchProductNameAndDescriptionByCombinedQuery(String manufactorer, int memoryLow, int memoryTop, String extraFeature, String exclude) { + + Query combinedQuery = getQueryBuilder() + .bool() + .must(getQueryBuilder().keyword() + .onField("productName") + .matching(manufactorer) + .createQuery()) + .must(getQueryBuilder() + .range() + .onField("memory") + .from(memoryLow) + .to(memoryTop) + .createQuery()) + .should(getQueryBuilder() + .phrase() + .onField("description") + .sentence(extraFeature) + .createQuery()) + .must(getQueryBuilder() + .keyword() + .onField("productName") + .matching(exclude) + .createQuery()) + .not() + .createQuery(); + + List results = getJpaQuery(combinedQuery).getResultList(); + + return results; + } + + private FullTextQuery getJpaQuery(org.apache.lucene.search.Query luceneQuery) { + + FullTextEntityManager fullTextEntityManager = Search.getFullTextEntityManager(entityManager); + + return fullTextEntityManager.createFullTextQuery(luceneQuery, Product.class); + } + + private QueryBuilder getQueryBuilder() { + + FullTextEntityManager fullTextEntityManager = Search.getFullTextEntityManager(entityManager); + + return fullTextEntityManager.getSearchFactory() + .buildQueryBuilder() + .forEntity(Product.class) + .get(); + } +} diff --git a/persistence-modules/spring-hibernate-5/src/main/java/com/baeldung/hibernatesearch/model/Product.java b/persistence-modules/spring-hibernate-5/src/main/java/com/baeldung/hibernatesearch/model/Product.java new file mode 100644 index 0000000000..3ca020fe57 --- /dev/null +++ b/persistence-modules/spring-hibernate-5/src/main/java/com/baeldung/hibernatesearch/model/Product.java @@ -0,0 +1,94 @@ +package com.baeldung.hibernatesearch.model; + +import org.hibernate.search.annotations.*; + +import javax.persistence.Entity; +import javax.persistence.Id; +import javax.persistence.Table; + +@Entity +@Indexed +@Table(name = "product") +public class Product { + + @Id + private int id; + + @Field(termVector = TermVector.YES) + private String productName; + + @Field(termVector = TermVector.YES) + private String description; + + @Field + private int memory; + + public Product(int id, String productName, int memory, String description) { + this.id = id; + this.productName = productName; + this.memory = memory; + this.description = description; + } + + public Product() { + } + + @Override + public boolean equals(Object o) { + if (this == o) + return true; + if (!(o instanceof Product)) + return false; + + Product product = (Product) o; + + if (id != product.id) + return false; + if (memory != product.memory) + return false; + if (!productName.equals(product.productName)) + return false; + return description.equals(product.description); + } + + @Override + public int hashCode() { + int result = id; + result = 31 * result + productName.hashCode(); + result = 31 * result + memory; + result = 31 * result + description.hashCode(); + return result; + } + + public int getId() { + return id; + } + + public void setId(int id) { + this.id = id; + } + + public String getProductName() { + return productName; + } + + public void setProductName(String productName) { + this.productName = productName; + } + + public int getMemory() { + return memory; + } + + public void setMemory(int memory) { + this.memory = memory; + } + + public String getDescription() { + return description; + } + + public void setDescription(String description) { + this.description = description; + } +} diff --git a/persistence-modules/spring-hibernate-5/src/main/resources/persistence-h2.properties b/persistence-modules/spring-hibernate-5/src/main/resources/persistence-h2.properties index 696e805cff..915bc4317b 100644 --- a/persistence-modules/spring-hibernate-5/src/main/resources/persistence-h2.properties +++ b/persistence-modules/spring-hibernate-5/src/main/resources/persistence-h2.properties @@ -9,5 +9,9 @@ hibernate.dialect=org.hibernate.dialect.H2Dialect hibernate.show_sql=false hibernate.hbm2ddl.auto=create-drop +# hibernate.search.X +hibernate.search.default.directory_provider = filesystem +hibernate.search.default.indexBase = /data/index/default + # envers.X envers.audit_table_suffix=_audit_log diff --git a/persistence-modules/spring-hibernate-5/src/test/java/com/baeldung/hibernatesearch/HibernateSearchIntegrationTest.java b/persistence-modules/spring-hibernate-5/src/test/java/com/baeldung/hibernatesearch/HibernateSearchIntegrationTest.java new file mode 100644 index 0000000000..b69f8d3a60 --- /dev/null +++ b/persistence-modules/spring-hibernate-5/src/test/java/com/baeldung/hibernatesearch/HibernateSearchIntegrationTest.java @@ -0,0 +1,187 @@ +package com.baeldung.hibernatesearch; + +import com.baeldung.hibernatesearch.model.Product; + +import static org.hamcrest.collection.IsIterableContainingInOrder.contains; +import static org.junit.Assert.*; + +import org.hibernate.search.jpa.FullTextEntityManager; +import org.hibernate.search.jpa.Search; +import org.junit.Before; +import org.junit.FixMethodOrder; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.junit.runners.MethodSorters; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.test.annotation.Commit; +import org.springframework.test.context.ContextConfiguration; +import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; +import org.springframework.test.context.support.AnnotationConfigContextLoader; +import org.springframework.transaction.annotation.Transactional; + +import javax.persistence.EntityManager; +import javax.persistence.PersistenceContext; +import java.util.Arrays; +import java.util.LinkedList; +import java.util.List; + +import static org.hamcrest.collection.IsIterableContainingInAnyOrder.containsInAnyOrder; + +@RunWith(SpringJUnit4ClassRunner.class) +@ContextConfiguration(classes = { HibernateSearchConfig.class }, loader = AnnotationConfigContextLoader.class) +@Transactional +@FixMethodOrder(MethodSorters.NAME_ASCENDING) +public class HibernateSearchIntegrationTest { + + @Autowired + ProductSearchDao dao; + + @PersistenceContext + private EntityManager entityManager; + + private List products; + + @Before + public void setupTestData() { + + products = Arrays.asList(new Product(1, "Apple iPhone X 256 GB", 256, "The current high-end smartphone from Apple, with lots of memory and also Face ID"), + new Product(2, "Apple iPhone X 128 GB", 128, "The current high-end smartphone from Apple, with Face ID"), new Product(3, "Apple iPhone 8 128 GB", 128, "The latest smartphone from Apple within the regular iPhone line, supporting wireless charging"), + new Product(4, "Samsung Galaxy S7 128 GB", 64, "A great Android smartphone"), new Product(5, "Microsoft Lumia 650 32 GB", 32, "A cheaper smartphone, coming with Windows Mobile"), + new Product(6, "Microsoft Lumia 640 32 GB", 32, "A cheaper smartphone, coming with Windows Mobile"), new Product(7, "Microsoft Lumia 630 16 GB", 16, "A cheaper smartphone, coming with Windows Mobile")); + } + + @Commit + @Test + public void testA_whenInitialTestDataInserted_thenSuccess() { + + for (int i = 0; i < products.size() - 1; i++) { + entityManager.persist(products.get(i)); + } + } + + @Test + public void testB_whenIndexInitialized_thenCorrectIndexSize() throws InterruptedException { + + FullTextEntityManager fullTextEntityManager = Search.getFullTextEntityManager(entityManager); + fullTextEntityManager.createIndexer() + .startAndWait(); + int indexSize = fullTextEntityManager.getSearchFactory() + .getStatistics() + .getNumberOfIndexedEntities(Product.class.getName()); + + assertEquals(products.size() - 1, indexSize); + } + + @Commit + @Test + public void testC_whenAdditionalTestDataInserted_thenSuccess() { + + entityManager.persist(products.get(products.size() - 1)); + } + + @Test + public void testD_whenAdditionalTestDataInserted_thenIndexUpdatedAutomatically() { + + FullTextEntityManager fullTextEntityManager = Search.getFullTextEntityManager(entityManager); + int indexSize = fullTextEntityManager.getSearchFactory() + .getStatistics() + .getNumberOfIndexedEntities(Product.class.getName()); + + assertEquals(products.size(), indexSize); + } + + @Test + public void testE_whenKeywordSearchOnName_thenCorrectMatches() { + List expected = Arrays.asList(products.get(0), products.get(1), products.get(2)); + List results = dao.searchProductNameByKeywordQuery("iphone"); + + assertThat(results, containsInAnyOrder(expected.toArray())); + } + + @Test + public void testF_whenFuzzySearch_thenCorrectMatches() { + List expected = Arrays.asList(products.get(0), products.get(1), products.get(2)); + List results = dao.searchProductNameByFuzzyQuery("iPhaen"); + + assertThat(results, containsInAnyOrder(expected.toArray())); + } + + @Test + public void testG_whenWildcardSearch_thenCorrectMatches() { + List expected = Arrays.asList(products.get(4), products.get(5), products.get(6)); + List results = dao.searchProductNameByWildcardQuery("6*"); + + assertThat(results, containsInAnyOrder(expected.toArray())); + + } + + @Test + public void testH_whenPhraseSearch_thenCorrectMatches() { + List expected = Arrays.asList(products.get(2)); + List results = dao.searchProductDescriptionByPhraseQuery("with wireless charging"); + + assertThat(results, containsInAnyOrder(expected.toArray())); + + } + + @Test + public void testI_whenSimpleQueryStringSearch_thenCorrectMatches() { + List expected = Arrays.asList(products.get(0), products.get(1)); + List results = dao.searchProductNameAndDescriptionBySimpleQueryStringQuery("Aple~2 + \"iPhone X\" + (256 | 128)"); + + assertThat(results, containsInAnyOrder(expected.toArray())); + + } + + @Test + public void testJ_whenRangeSearch_thenCorrectMatches() { + List expected = Arrays.asList(products.get(0), products.get(1), products.get(2), products.get(3)); + List results = dao.searchProductNameByRangeQuery(64, 256); + + assertThat(results, containsInAnyOrder(expected.toArray())); + + } + + @Test + public void testK_whenMoreLikeThisSearch_thenCorrectMatchesInOrder() { + List expected = products; + List resultsWithScore = dao.searchProductNameByMoreLikeThisQuery(products.get(0)); + List results = new LinkedList(); + + for (Object[] resultWithScore : resultsWithScore) { + results.add((Product) resultWithScore[0]); + } + + assertThat(results, contains(expected.toArray())); + + } + + @Test + public void testL_whenKeywordSearchOnNameAndDescription_thenCorrectMatches() { + List expected = Arrays.asList(products.get(0), products.get(1), products.get(2)); + List results = dao.searchProductNameAndDescriptionByKeywordQuery("iphone"); + + assertThat(results, containsInAnyOrder(expected.toArray())); + } + + @Test + public void testM_whenMoreLikeThisSearchOnProductNameAndDescription_thenCorrectMatchesInOrder() { + List expected = products; + List resultsWithScore = dao.searchProductNameAndDescriptionByMoreLikeThisQuery(products.get(0)); + List results = new LinkedList(); + + for (Object[] resultWithScore : resultsWithScore) { + results.add((Product) resultWithScore[0]); + } + + assertThat(results, contains(expected.toArray())); + } + + @Test + public void testN_whenCombinedSearch_thenCorrectMatches() { + List expected = Arrays.asList(products.get(1), products.get(2)); + List results = dao.searchProductNameAndDescriptionByCombinedQuery("apple", 64, 128, "face id", "samsung"); + + assertThat(results, containsInAnyOrder(expected.toArray())); + } +} From 3d49c4a4b6d5c7eeeab9f5203701b19e198873b4 Mon Sep 17 00:00:00 2001 From: Dassi Orleando Date: Thu, 30 Nov 2017 04:58:55 +0100 Subject: [PATCH 111/236] Disable failded build for unsuccesful test --- spring-jenkins-pipeline/pom.xml | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/spring-jenkins-pipeline/pom.xml b/spring-jenkins-pipeline/pom.xml index 1c35f0f73b..5ebc7540d6 100644 --- a/spring-jenkins-pipeline/pom.xml +++ b/spring-jenkins-pipeline/pom.xml @@ -50,6 +50,13 @@ maven-checkstyle-plugin 2.17 + + org.apache.maven.plugins + maven-surefire-plugin + + true + + From 138e7fd492bbd611603ef2423c272a260563a2e8 Mon Sep 17 00:00:00 2001 From: Dassi Orleando Date: Thu, 30 Nov 2017 05:52:28 +0100 Subject: [PATCH 112/236] Let the build failed if the test is not Ok --- spring-jenkins-pipeline/pom.xml | 7 ------- .../src/test/java/com/baeldung/SomeUnitTest.java | 2 +- 2 files changed, 1 insertion(+), 8 deletions(-) diff --git a/spring-jenkins-pipeline/pom.xml b/spring-jenkins-pipeline/pom.xml index 5ebc7540d6..1c35f0f73b 100644 --- a/spring-jenkins-pipeline/pom.xml +++ b/spring-jenkins-pipeline/pom.xml @@ -50,13 +50,6 @@ maven-checkstyle-plugin 2.17 - - org.apache.maven.plugins - maven-surefire-plugin - - true - - diff --git a/spring-jenkins-pipeline/src/test/java/com/baeldung/SomeUnitTest.java b/spring-jenkins-pipeline/src/test/java/com/baeldung/SomeUnitTest.java index 1e0fc985c3..ea317ed7cd 100644 --- a/spring-jenkins-pipeline/src/test/java/com/baeldung/SomeUnitTest.java +++ b/spring-jenkins-pipeline/src/test/java/com/baeldung/SomeUnitTest.java @@ -6,6 +6,6 @@ import static org.junit.Assert.*; public class SomeUnitTest { @Test public void init() { - assertEquals(1, 0); + assertEquals(1, 1); } } From b14dfbe4f0cd1b4d209730ffa3ba0c2ac7adb7f4 Mon Sep 17 00:00:00 2001 From: Jose Carvajal Date: Thu, 30 Nov 2017 11:55:49 +0100 Subject: [PATCH 113/236] BAEL-1174: A Quick Guide to Spring Cloud Consul --- bootique/dependency-reduced-pom.xml | 8 ++- libraries-data/file.dat | Bin 0 -> 87 bytes libraries/helloWorld.docx | Bin 0 -> 76887 bytes spring-cloud/spring-cloud-consul/pom.xml | 58 ++++++++++++++++++ .../consul/DiscoveryClientApplication.java | 53 ++++++++++++++++ .../DistributedPropertiesApplication.java | 36 +++++++++++ .../cloud/consul/RibbonClientApplication.java | 34 ++++++++++ .../consul/ServiceDiscoveryApplication.java | 29 +++++++++ .../cloud/consul/properties/MyProperties.java | 20 ++++++ .../src/main/resources/application.yml | 14 +++++ .../src/main/resources/bootstrap.yml | 9 +++ undertow/dependency-reduced-pom.xml | 40 ++++++++++++ xml/src/test/resources/example_dom4j_new.xml | 10 +++ xml/src/test/resources/example_jaxb_new.xml | 9 +++ 14 files changed, 319 insertions(+), 1 deletion(-) create mode 100644 libraries-data/file.dat create mode 100644 libraries/helloWorld.docx create mode 100644 spring-cloud/spring-cloud-consul/pom.xml create mode 100644 spring-cloud/spring-cloud-consul/src/main/java/com/baeldung/spring/cloud/consul/DiscoveryClientApplication.java create mode 100644 spring-cloud/spring-cloud-consul/src/main/java/com/baeldung/spring/cloud/consul/DistributedPropertiesApplication.java create mode 100644 spring-cloud/spring-cloud-consul/src/main/java/com/baeldung/spring/cloud/consul/RibbonClientApplication.java create mode 100644 spring-cloud/spring-cloud-consul/src/main/java/com/baeldung/spring/cloud/consul/ServiceDiscoveryApplication.java create mode 100644 spring-cloud/spring-cloud-consul/src/main/java/com/baeldung/spring/cloud/consul/properties/MyProperties.java create mode 100644 spring-cloud/spring-cloud-consul/src/main/resources/application.yml create mode 100644 spring-cloud/spring-cloud-consul/src/main/resources/bootstrap.yml create mode 100644 undertow/dependency-reduced-pom.xml create mode 100644 xml/src/test/resources/example_dom4j_new.xml create mode 100644 xml/src/test/resources/example_jaxb_new.xml diff --git a/bootique/dependency-reduced-pom.xml b/bootique/dependency-reduced-pom.xml index ed18f4e42a..ab09cfb7b1 100644 --- a/bootique/dependency-reduced-pom.xml +++ b/bootique/dependency-reduced-pom.xml @@ -28,8 +28,14 @@ junit junit - 3.8.1 + 4.12 test + + + hamcrest-core + org.hamcrest + + diff --git a/libraries-data/file.dat b/libraries-data/file.dat new file mode 100644 index 0000000000000000000000000000000000000000..70177cef976ad64b5517006b8abb7acc41f58b6e GIT binary patch literal 87 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 AsQ>@~ literal 0 HcmV?d00001 diff --git a/spring-cloud/spring-cloud-consul/pom.xml b/spring-cloud/spring-cloud-consul/pom.xml new file mode 100644 index 0000000000..0a0650ec8b --- /dev/null +++ b/spring-cloud/spring-cloud-consul/pom.xml @@ -0,0 +1,58 @@ + + + 4.0.0 + + org.baeldung + spring-cloud-consul + jar + + spring-cloud-consul + + + com.baeldung.spring.cloud + spring-cloud + 1.0.0-SNAPSHOT + + + + UTF-8 + 3.6.0 + + + + + org.springframework.cloud + spring-cloud-starter-consul-all + 1.3.0.RELEASE + + + + org.springframework.cloud + spring-cloud-starter-consul-config + 1.3.0.RELEASE + + + + + + + + org.apache.maven.plugins + maven-compiler-plugin + ${maven-compiler-plugin.version} + + 1.8 + 1.8 + + + + org.springframework.boot + spring-boot-maven-plugin + ${spring-boot-maven-plugin.version} + + + + + diff --git a/spring-cloud/spring-cloud-consul/src/main/java/com/baeldung/spring/cloud/consul/DiscoveryClientApplication.java b/spring-cloud/spring-cloud-consul/src/main/java/com/baeldung/spring/cloud/consul/DiscoveryClientApplication.java new file mode 100644 index 0000000000..e5e18d71ff --- /dev/null +++ b/spring-cloud/spring-cloud-consul/src/main/java/com/baeldung/spring/cloud/consul/DiscoveryClientApplication.java @@ -0,0 +1,53 @@ +package com.baeldung.spring.cloud.consul; + +import java.net.URI; +import java.util.List; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.boot.builder.SpringApplicationBuilder; +import org.springframework.cloud.client.ServiceInstance; +import org.springframework.cloud.client.discovery.DiscoveryClient; +import org.springframework.cloud.client.discovery.EnableDiscoveryClient; +import org.springframework.context.annotation.Bean; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.client.RestTemplate; + +@SpringBootApplication +@EnableDiscoveryClient +@RestController +public class DiscoveryClientApplication { + + @Bean + public RestTemplate restTemplate() { + return new RestTemplate(); + } + + @Autowired + private RestTemplate restTemplate; + + @Autowired + private DiscoveryClient discoveryClient; + + @RequestMapping("/discoveryClient") + public String home() { + return this.restTemplate.getForEntity(serviceUrl().resolve("/ping"), String.class) + .getBody(); + } + + public URI serviceUrl() { + List list = discoveryClient.getInstances("myApp"); + if (list != null && list.size() > 0) { + return list.get(0) + .getUri(); + } + + return null; + } + + public static void main(String[] args) { + new SpringApplicationBuilder(DiscoveryClientApplication.class).web(true) + .run(args); + } +} diff --git a/spring-cloud/spring-cloud-consul/src/main/java/com/baeldung/spring/cloud/consul/DistributedPropertiesApplication.java b/spring-cloud/spring-cloud-consul/src/main/java/com/baeldung/spring/cloud/consul/DistributedPropertiesApplication.java new file mode 100644 index 0000000000..12ecd96b26 --- /dev/null +++ b/spring-cloud/spring-cloud-consul/src/main/java/com/baeldung/spring/cloud/consul/DistributedPropertiesApplication.java @@ -0,0 +1,36 @@ +package com.baeldung.spring.cloud.consul; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.boot.builder.SpringApplicationBuilder; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import com.baeldung.spring.cloud.consul.properties.MyProperties; + +@SpringBootApplication +@RestController +public class DistributedPropertiesApplication { + + @Value("${my.prop}") + String value; + + @Autowired + private MyProperties properties; + + @RequestMapping("/getConfigFromValue") + public String getConfigFromValue() { + return value; + } + + @RequestMapping("/getConfigFromProperty") + public String getConfigFromProperty() { + return properties.getProp(); + } + + public static void main(String[] args) { + new SpringApplicationBuilder(DistributedPropertiesApplication.class).web(true) + .run(args); + } +} diff --git a/spring-cloud/spring-cloud-consul/src/main/java/com/baeldung/spring/cloud/consul/RibbonClientApplication.java b/spring-cloud/spring-cloud-consul/src/main/java/com/baeldung/spring/cloud/consul/RibbonClientApplication.java new file mode 100644 index 0000000000..620c3553ba --- /dev/null +++ b/spring-cloud/spring-cloud-consul/src/main/java/com/baeldung/spring/cloud/consul/RibbonClientApplication.java @@ -0,0 +1,34 @@ +package com.baeldung.spring.cloud.consul; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.boot.builder.SpringApplicationBuilder; +import org.springframework.cloud.client.loadbalancer.LoadBalanced; +import org.springframework.context.annotation.Bean; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.client.RestTemplate; + +@SpringBootApplication +@RestController +public class RibbonClientApplication { + + @LoadBalanced + @Bean + public RestTemplate loadbalancedRestTemplate() { + return new RestTemplate(); + } + + @Autowired + RestTemplate restTemplate; + + @RequestMapping("/ribbonClient") + public String home() { + return this.restTemplate.getForObject("http://myApp/ping", String.class); + } + + public static void main(String[] args) { + new SpringApplicationBuilder(RibbonClientApplication.class).web(true) + .run(args); + } +} diff --git a/spring-cloud/spring-cloud-consul/src/main/java/com/baeldung/spring/cloud/consul/ServiceDiscoveryApplication.java b/spring-cloud/spring-cloud-consul/src/main/java/com/baeldung/spring/cloud/consul/ServiceDiscoveryApplication.java new file mode 100644 index 0000000000..5da8105d01 --- /dev/null +++ b/spring-cloud/spring-cloud-consul/src/main/java/com/baeldung/spring/cloud/consul/ServiceDiscoveryApplication.java @@ -0,0 +1,29 @@ +package com.baeldung.spring.cloud.consul; + +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.boot.builder.SpringApplicationBuilder; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +@SpringBootApplication +@RestController +public class ServiceDiscoveryApplication { + @RequestMapping("/my-health-check") + public ResponseEntity myCustomCheck() { + String message = "Testing my healh check function"; + return new ResponseEntity<>(message, HttpStatus.FORBIDDEN); + } + + @RequestMapping("/ping") + public String ping() { + return "pong"; + } + + public static void main(String[] args) { + new SpringApplicationBuilder(ServiceDiscoveryApplication.class).web(true) + .run(args); + } + +} \ No newline at end of file diff --git a/spring-cloud/spring-cloud-consul/src/main/java/com/baeldung/spring/cloud/consul/properties/MyProperties.java b/spring-cloud/spring-cloud-consul/src/main/java/com/baeldung/spring/cloud/consul/properties/MyProperties.java new file mode 100644 index 0000000000..7accac168d --- /dev/null +++ b/spring-cloud/spring-cloud-consul/src/main/java/com/baeldung/spring/cloud/consul/properties/MyProperties.java @@ -0,0 +1,20 @@ +package com.baeldung.spring.cloud.consul.properties; + +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.cloud.context.config.annotation.RefreshScope; +import org.springframework.context.annotation.Configuration; + +@RefreshScope +@Configuration +@ConfigurationProperties("my") +public class MyProperties { + private String prop; + + public String getProp() { + return prop; + } + + public void setProp(String prop) { + this.prop = prop; + } +} diff --git a/spring-cloud/spring-cloud-consul/src/main/resources/application.yml b/spring-cloud/spring-cloud-consul/src/main/resources/application.yml new file mode 100644 index 0000000000..ccdc3fdeee --- /dev/null +++ b/spring-cloud/spring-cloud-consul/src/main/resources/application.yml @@ -0,0 +1,14 @@ +spring: + application: + name: myApp + cloud: + consul: + host: localhost + port: 8500 + discovery: + healthCheckPath: /my-health-check + healthCheckInterval: 20s + enabled: true + instanceId: ${spring.application.name}:${random.value} +server: + port: 0 \ No newline at end of file diff --git a/spring-cloud/spring-cloud-consul/src/main/resources/bootstrap.yml b/spring-cloud/spring-cloud-consul/src/main/resources/bootstrap.yml new file mode 100644 index 0000000000..6318170135 --- /dev/null +++ b/spring-cloud/spring-cloud-consul/src/main/resources/bootstrap.yml @@ -0,0 +1,9 @@ +spring: + application: + name: myApp + cloud: + consul: + host: localhost + port: 8500 + config: + enabled: true \ No newline at end of file diff --git a/undertow/dependency-reduced-pom.xml b/undertow/dependency-reduced-pom.xml new file mode 100644 index 0000000000..f3bb8b78ed --- /dev/null +++ b/undertow/dependency-reduced-pom.xml @@ -0,0 +1,40 @@ + + + 4.0.0 + com.baeldung.undertow + undertow + undertow + 1.0-SNAPSHOT + http://maven.apache.org + + ${project.artifactId} + + + maven-shade-plugin + + + package + + shade + + + + + + maven-jar-plugin + + + + com.baeldung.undertow.SimpleServer + + + + + + + + 1.8 + 1.8 + + + diff --git a/xml/src/test/resources/example_dom4j_new.xml b/xml/src/test/resources/example_dom4j_new.xml new file mode 100644 index 0000000000..020760fdd3 --- /dev/null +++ b/xml/src/test/resources/example_dom4j_new.xml @@ -0,0 +1,10 @@ + + + + + XML with Dom4J + XML handling with Dom4J + 14/06/2016 + Dom4J tech writer + + diff --git a/xml/src/test/resources/example_jaxb_new.xml b/xml/src/test/resources/example_jaxb_new.xml new file mode 100644 index 0000000000..646d938869 --- /dev/null +++ b/xml/src/test/resources/example_jaxb_new.xml @@ -0,0 +1,9 @@ + + + + Jaxb author + 04/02/2015 + XML Binding with Jaxb + XML with Jaxb + + From 58f8e6163fc0bfc6c6ddbfb8d712fc930b11a0a4 Mon Sep 17 00:00:00 2001 From: ramansahasi Date: Fri, 1 Dec 2017 00:31:44 +0530 Subject: [PATCH 114/236] BAEL-1327 Java Threads: notify and wait (initial commit) (#3160) --- .../concurrent/waitandnotify/Data.java | 33 ++++++++++ .../waitandnotify/NetworkDriver.java | 12 ++++ .../concurrent/waitandnotify/Receiver.java | 25 +++++++ .../concurrent/waitandnotify/Sender.java | 30 +++++++++ .../waitandnotify/NetworkIntegrationTest.java | 65 +++++++++++++++++++ 5 files changed, 165 insertions(+) create mode 100644 core-java-concurrency/src/main/java/com/baeldung/concurrent/waitandnotify/Data.java create mode 100644 core-java-concurrency/src/main/java/com/baeldung/concurrent/waitandnotify/NetworkDriver.java create mode 100644 core-java-concurrency/src/main/java/com/baeldung/concurrent/waitandnotify/Receiver.java create mode 100644 core-java-concurrency/src/main/java/com/baeldung/concurrent/waitandnotify/Sender.java create mode 100644 core-java-concurrency/src/test/java/com/baeldung/concurrent/waitandnotify/NetworkIntegrationTest.java diff --git a/core-java-concurrency/src/main/java/com/baeldung/concurrent/waitandnotify/Data.java b/core-java-concurrency/src/main/java/com/baeldung/concurrent/waitandnotify/Data.java new file mode 100644 index 0000000000..9b850c4153 --- /dev/null +++ b/core-java-concurrency/src/main/java/com/baeldung/concurrent/waitandnotify/Data.java @@ -0,0 +1,33 @@ +package com.baeldung.concurrent.waitandnotify; + +public class Data { + private String packet; + + // True if receiver should wait + // False if sender should wait + private boolean transfer = true; + + public synchronized String receive() { + while (transfer) { + try { + wait(); + } catch (InterruptedException e) {} + } + transfer = true; + + notifyAll(); + return packet; + } + + public synchronized void send(String packet) { + while (!transfer) { + try { + wait(); + } catch (InterruptedException e) {} + } + transfer = false; + + this.packet = packet; + notifyAll(); + } +} \ No newline at end of file diff --git a/core-java-concurrency/src/main/java/com/baeldung/concurrent/waitandnotify/NetworkDriver.java b/core-java-concurrency/src/main/java/com/baeldung/concurrent/waitandnotify/NetworkDriver.java new file mode 100644 index 0000000000..d4fd1574c6 --- /dev/null +++ b/core-java-concurrency/src/main/java/com/baeldung/concurrent/waitandnotify/NetworkDriver.java @@ -0,0 +1,12 @@ +package com.baeldung.concurrent.waitandnotify; + +public class NetworkDriver { + public static void main(String[] args) { + Data data = new Data(); + Thread sender = new Thread(new Sender(data)); + Thread receiver = new Thread(new Receiver(data)); + + sender.start(); + receiver.start(); + } +} \ No newline at end of file diff --git a/core-java-concurrency/src/main/java/com/baeldung/concurrent/waitandnotify/Receiver.java b/core-java-concurrency/src/main/java/com/baeldung/concurrent/waitandnotify/Receiver.java new file mode 100644 index 0000000000..63f48b8031 --- /dev/null +++ b/core-java-concurrency/src/main/java/com/baeldung/concurrent/waitandnotify/Receiver.java @@ -0,0 +1,25 @@ +package com.baeldung.concurrent.waitandnotify; + +import java.util.concurrent.ThreadLocalRandom; + +public class Receiver implements Runnable { + private Data load; + + public Receiver(Data load) { + this.load = load; + } + + public void run() { + for(String receivedMessage = load.receive(); + !"End".equals(receivedMessage) ; + receivedMessage = load.receive()) { + + System.out.println(receivedMessage); + + //Thread.sleep() to mimic heavy server-side processing + try { + Thread.sleep(ThreadLocalRandom.current().nextInt(1000, 5000)); + } catch (InterruptedException e) {} + } + } +} \ No newline at end of file diff --git a/core-java-concurrency/src/main/java/com/baeldung/concurrent/waitandnotify/Sender.java b/core-java-concurrency/src/main/java/com/baeldung/concurrent/waitandnotify/Sender.java new file mode 100644 index 0000000000..b7d782c3f5 --- /dev/null +++ b/core-java-concurrency/src/main/java/com/baeldung/concurrent/waitandnotify/Sender.java @@ -0,0 +1,30 @@ +package com.baeldung.concurrent.waitandnotify; + +import java.util.concurrent.ThreadLocalRandom; + +public class Sender implements Runnable { + private Data data; + + public Sender(Data data) { + this.data = data; + } + + public void run() { + String packets[] = { + "First packet", + "Second packet", + "Third packet", + "Fourth packet", + "End" + }; + + for (String packet : packets) { + data.send(packet); + + //Thread.sleep() to mimic heavy server-side processing + try { + Thread.sleep(ThreadLocalRandom.current().nextInt(1000, 5000)); + } catch (InterruptedException e) {} + } + } +} \ No newline at end of file diff --git a/core-java-concurrency/src/test/java/com/baeldung/concurrent/waitandnotify/NetworkIntegrationTest.java b/core-java-concurrency/src/test/java/com/baeldung/concurrent/waitandnotify/NetworkIntegrationTest.java new file mode 100644 index 0000000000..49f4313e9d --- /dev/null +++ b/core-java-concurrency/src/test/java/com/baeldung/concurrent/waitandnotify/NetworkIntegrationTest.java @@ -0,0 +1,65 @@ +package com.baeldung.concurrent.waitandnotify; + +import static org.junit.Assert.assertEquals; + +import java.io.ByteArrayOutputStream; +import java.io.PrintStream; +import java.io.PrintWriter; +import java.io.StringWriter; + +import org.junit.After; +import org.junit.Before; +import org.junit.Test; + +public class NetworkIntegrationTest { + + private final ByteArrayOutputStream outContent = new ByteArrayOutputStream(); + private final ByteArrayOutputStream errContent = new ByteArrayOutputStream(); + private String expected; + + @Before + public void setUpStreams() { + System.setOut(new PrintStream(outContent)); + System.setErr(new PrintStream(errContent)); + } + + @Before + public void setUpExpectedOutput() { + StringWriter expectedStringWriter = new StringWriter(); + + PrintWriter printWriter = new PrintWriter(expectedStringWriter); + printWriter.println("First packet"); + printWriter.println("Second packet"); + printWriter.println("Third packet"); + printWriter.println("Fourth packet"); + printWriter.close(); + + expected = expectedStringWriter.toString(); + } + + @After + public void cleanUpStreams() { + System.setOut(null); + System.setErr(null); + } + + @Test + public void givenSenderAndReceiver_whenSendingPackets_thenNetworkSynchronized() { + Data data = new Data(); + Thread sender = new Thread(new Sender(data)); + Thread receiver = new Thread(new Receiver(data)); + + sender.start(); + receiver.start(); + + //wait for sender and receiver to finish before we test against expected + try { + sender.join(); + receiver.join(); + } catch (InterruptedException e) { + e.printStackTrace(); + } + + assertEquals(expected, outContent.toString()); + } +} From d45a891d4c2b6e295eb8d6324b0d6493c897b786 Mon Sep 17 00:00:00 2001 From: ocheja Date: Fri, 1 Dec 2017 05:07:23 +0900 Subject: [PATCH 115/236] BAEL-1261 Polymorphism in Java (#2762) * Define beans for handling different message types in a lean chat app * Add class based spring beans configuration * Define spring configuration in XML for constructor based bean injection * Refactor package structure to separate constructor based bean injection code set from setter based bean injection code set * Define configuration and classes specific to setter-based bean injection. * Implement tests for constructor-based and setter-based bean injections * develop codes for explaining type erasure * Write unit tests for type erasure examples * Remove evaluation article code * Modify type erasure examples and unit tests * Modify type erasure examples and unit tests * Add expected exception in TypeErasureUnitTest * Correct grammar in class name * Implement File Manager app to demonstrate Polymorphism. Develop unit tests for Polymorphism article code * Add examples for static polymorphism * Change sysout statments to slf4j log info statements * Add assertions and expected errors check on Test * Add assertions and expected errors check on Test * Correct compile time error of symbol not found * Removed commented out non-compiling test. --- .../baeldung/polymorphism/FileManager.java | 38 +++++++++++ .../baeldung/polymorphism/GenericFile.java | 63 +++++++++++++++++++ .../com/baeldung/polymorphism/ImageFile.java | 41 ++++++++++++ .../com/baeldung/polymorphism/TextFile.java | 44 +++++++++++++ .../polymorphism/PolymorphismUnitTest.java | 34 ++++++++++ 5 files changed, 220 insertions(+) create mode 100644 core-java/src/main/java/com/baeldung/polymorphism/FileManager.java create mode 100644 core-java/src/main/java/com/baeldung/polymorphism/GenericFile.java create mode 100644 core-java/src/main/java/com/baeldung/polymorphism/ImageFile.java create mode 100644 core-java/src/main/java/com/baeldung/polymorphism/TextFile.java create mode 100644 core-java/src/test/java/com/baeldung/polymorphism/PolymorphismUnitTest.java diff --git a/core-java/src/main/java/com/baeldung/polymorphism/FileManager.java b/core-java/src/main/java/com/baeldung/polymorphism/FileManager.java new file mode 100644 index 0000000000..7f2665ff2d --- /dev/null +++ b/core-java/src/main/java/com/baeldung/polymorphism/FileManager.java @@ -0,0 +1,38 @@ +package com.baeldung.polymorphism; + +import java.awt.image.BufferedImage; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class FileManager { + + final static Logger logger = LoggerFactory.getLogger(FileManager.class); + + public static void main(String[] args) { + GenericFile file1 = new TextFile("SampleTextFile", "This is a sample text content", "v1.0.0"); + logger.info("File Info: \n" + file1.getFileInfo() + "\n"); + ImageFile imageFile = new ImageFile("SampleImageFile", 200, 100, new BufferedImage(100, 200, BufferedImage.TYPE_INT_RGB).toString() + .getBytes(), "v1.0.0"); + logger.info("File Info: \n" + imageFile.getFileInfo()); + } + + public static ImageFile createImageFile(String name, int height, int width, byte[] content, String version) { + ImageFile imageFile = new ImageFile(name, height, width, content, version); + logger.info("File 2 Info: \n" + imageFile.getFileInfo()); + return imageFile; + } + + public static GenericFile createTextFile(String name, String content, String version) { + GenericFile file1 = new TextFile(name, content, version); + logger.info("File 1 Info: \n" + file1.getFileInfo() + "\n"); + return file1; + } + + public static TextFile createTextFile2(String name, String content, String version) { + TextFile file1 = new TextFile(name, content, version); + logger.info("File 1 Info: \n" + file1.getFileInfo() + "\n"); + return file1; + } + +} diff --git a/core-java/src/main/java/com/baeldung/polymorphism/GenericFile.java b/core-java/src/main/java/com/baeldung/polymorphism/GenericFile.java new file mode 100644 index 0000000000..4075083c49 --- /dev/null +++ b/core-java/src/main/java/com/baeldung/polymorphism/GenericFile.java @@ -0,0 +1,63 @@ +package com.baeldung.polymorphism; + +import java.util.Date; + +public class GenericFile { + private String name; + private String extension; + private Date dateCreated; + private String version; + private byte[] content; + + public GenericFile() { + this.setDateCreated(new Date()); + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getExtension() { + return extension; + } + + public void setExtension(String extension) { + this.extension = extension; + } + + public Date getDateCreated() { + return dateCreated; + } + + public void setDateCreated(Date dateCreated) { + this.dateCreated = dateCreated; + } + + public String getVersion() { + return version; + } + + public void setVersion(String version) { + this.version = version; + } + + public byte[] getContent() { + return content; + } + + public void setContent(byte[] content) { + this.content = content; + } + + public String getFileInfo() { + return "File Name: " + this.getName() + "\n" + "Extension: " + this.getExtension() + "\n" + "Date Created: " + this.getDateCreated() + "\n" + "Version: " + this.getVersion() + "\n"; + } + + public Object read() { + return content; + } +} diff --git a/core-java/src/main/java/com/baeldung/polymorphism/ImageFile.java b/core-java/src/main/java/com/baeldung/polymorphism/ImageFile.java new file mode 100644 index 0000000000..ac72a40993 --- /dev/null +++ b/core-java/src/main/java/com/baeldung/polymorphism/ImageFile.java @@ -0,0 +1,41 @@ +package com.baeldung.polymorphism; + +public class ImageFile extends GenericFile { + private int height; + private int width; + + public ImageFile(String name, int height, int width, byte[] content, String version) { + this.setHeight(height); + this.setWidth(width); + this.setContent(content); + this.setName(name); + this.setVersion(version); + this.setExtension(".jpg"); + } + + public int getHeight() { + return height; + } + + public void setHeight(int height) { + this.height = height; + } + + public int getWidth() { + return width; + } + + public void setWidth(int width) { + this.width = width; + } + + public String getFileInfo() { + return super.getFileInfo() + "Height: " + this.getHeight() + "\n" + "Width: " + this.getWidth(); + } + + public String read() { + return this.getContent() + .toString(); + } + +} diff --git a/core-java/src/main/java/com/baeldung/polymorphism/TextFile.java b/core-java/src/main/java/com/baeldung/polymorphism/TextFile.java new file mode 100644 index 0000000000..8280b4ee95 --- /dev/null +++ b/core-java/src/main/java/com/baeldung/polymorphism/TextFile.java @@ -0,0 +1,44 @@ +package com.baeldung.polymorphism; + +public class TextFile extends GenericFile { + private int wordCount; + + public TextFile(String name, String content, String version) { + String[] words = content.split(" "); + this.setWordCount(words.length > 0 ? words.length : 1); + this.setContent(content.getBytes()); + this.setName(name); + this.setVersion(version); + this.setExtension(".txt"); + } + + public int getWordCount() { + return wordCount; + } + + public void setWordCount(int wordCount) { + this.wordCount = wordCount; + } + + public String getFileInfo() { + return super.getFileInfo() + "Word Count: " + wordCount; + } + + public String read() { + return this.getContent() + .toString(); + } + + public String read(int limit) { + return this.getContent() + .toString() + .substring(0, limit); + } + + public String read(int start, int stop) { + return this.getContent() + .toString() + .substring(start, stop); + } + +} diff --git a/core-java/src/test/java/com/baeldung/polymorphism/PolymorphismUnitTest.java b/core-java/src/test/java/com/baeldung/polymorphism/PolymorphismUnitTest.java new file mode 100644 index 0000000000..8fb606c2fc --- /dev/null +++ b/core-java/src/test/java/com/baeldung/polymorphism/PolymorphismUnitTest.java @@ -0,0 +1,34 @@ +package com.baeldung.polymorphism; + +import static org.junit.Assert.*; + +import java.awt.image.BufferedImage; + +import org.junit.Ignore; +import org.junit.Test; + +public class PolymorphismUnitTest { + + @Test + public void givenImageFile_whenFileCreated_shouldSucceed() { + ImageFile imageFile = FileManager.createImageFile("SampleImageFile", 200, 100, new BufferedImage(100, 200, BufferedImage.TYPE_INT_RGB).toString() + .getBytes(), "v1.0.0"); + assertEquals(200, imageFile.getHeight()); + } + + // Downcasting then Upcasting + @Test + public void givenTextFile_whenTextFileCreatedAndAssignedToGenericFileAndCastBackToTextFileOnGetWordCount_shouldSucceed() { + GenericFile textFile = FileManager.createTextFile("SampleTextFile", "This is a sample text content", "v1.0.0"); + TextFile textFile2 = (TextFile) textFile; + assertEquals(6, textFile2.getWordCount()); + } + + // Downcasting + @Test(expected = ClassCastException.class) + public void givenGenericFile_whenCastToTextFileAndInvokeGetWordCount_shouldFail() { + GenericFile genericFile = new GenericFile(); + TextFile textFile = (TextFile) genericFile; + System.out.println(textFile.getWordCount()); + } +} From d51b1b4f20b98fbc30a42477103ab8b477872faa Mon Sep 17 00:00:00 2001 From: parthkaria Date: Fri, 1 Dec 2017 10:51:33 +0530 Subject: [PATCH 116/236] BAEL-21 Java 9 HttpClient code refactoring --- core-java-9/compile-httpclient.bat | 3 +++ core-java-9/src/main/java/module-info.java | 3 --- .../baeldung}/httpclient/HttpClientExample.java | 17 ++++++++++++----- .../com.baeldung.httpclient/module-info.java | 3 +++ 4 files changed, 18 insertions(+), 8 deletions(-) create mode 100644 core-java-9/compile-httpclient.bat delete mode 100644 core-java-9/src/main/java/module-info.java rename core-java-9/src/{main/java/com/baeldung/java9 => modules/com.baeldung.httpclient/com/baeldung}/httpclient/HttpClientExample.java (82%) create mode 100644 core-java-9/src/modules/com.baeldung.httpclient/module-info.java diff --git a/core-java-9/compile-httpclient.bat b/core-java-9/compile-httpclient.bat new file mode 100644 index 0000000000..9d845784cf --- /dev/null +++ b/core-java-9/compile-httpclient.bat @@ -0,0 +1,3 @@ +javac --module-path mods -d mods/com.baeldung.httpclient^ + src/modules/com.baeldung.httpclient/module-info.java^ + src/modules/com.baeldung.httpclient/com/baeldung/httpclient/HttpClientExample.java \ No newline at end of file diff --git a/core-java-9/src/main/java/module-info.java b/core-java-9/src/main/java/module-info.java deleted file mode 100644 index 163dd4f5be..0000000000 --- a/core-java-9/src/main/java/module-info.java +++ /dev/null @@ -1,3 +0,0 @@ -module com.baeldung.java9.httpclient { - requires jdk.incubator.httpclient; -} \ No newline at end of file diff --git a/core-java-9/src/main/java/com/baeldung/java9/httpclient/HttpClientExample.java b/core-java-9/src/modules/com.baeldung.httpclient/com/baeldung/httpclient/HttpClientExample.java similarity index 82% rename from core-java-9/src/main/java/com/baeldung/java9/httpclient/HttpClientExample.java rename to core-java-9/src/modules/com.baeldung.httpclient/com/baeldung/httpclient/HttpClientExample.java index 6ccfd030a5..44c55715c7 100644 --- a/core-java-9/src/main/java/com/baeldung/java9/httpclient/HttpClientExample.java +++ b/core-java-9/src/modules/com.baeldung.httpclient/com/baeldung/httpclient/HttpClientExample.java @@ -3,7 +3,7 @@ * To change this template file, choose Tools | Templates * and open the template in the editor. */ -package com.baeldung.java9.httpclient; +package com.baeldung.httpclient; import java.io.File; import java.io.IOException; @@ -25,8 +25,15 @@ import jdk.incubator.http.HttpResponse.BodyHandler; * @author pkaria */ public class HttpClientExample { + + public static void main(String[] args) throws Exception { + httpGetRequest(); + httpPosttRequest(); + asynchronousRequest(); + asynchronousMultipleRequests(); + } - public void httpGetRequest() throws URISyntaxException, IOException, InterruptedException { + public static void httpGetRequest() throws URISyntaxException, IOException, InterruptedException { HttpClient client = HttpClient.newHttpClient(); URI httpURI = new URI("http://jsonplaceholder.typicode.com/posts/1"); HttpRequest request = HttpRequest.newBuilder(httpURI).GET().build(); @@ -36,7 +43,7 @@ public class HttpClientExample { System.out.println(responseBody); } - public void httpPosttRequest() throws URISyntaxException, IOException, InterruptedException { + public static void httpPosttRequest() throws URISyntaxException, IOException, InterruptedException { HttpClient client = HttpClient .newBuilder() .build(); @@ -50,7 +57,7 @@ public class HttpClientExample { System.out.println(responseBody); } - public void asynchronousRequest() throws URISyntaxException { + public static void asynchronousRequest() throws URISyntaxException { HttpClient client = HttpClient.newHttpClient(); URI httpURI = new URI("http://jsonplaceholder.typicode.com/posts/1"); HttpRequest request = HttpRequest.newBuilder(httpURI).GET().build(); @@ -58,7 +65,7 @@ public class HttpClientExample { HttpResponse.BodyHandler.asString()); } - public void asynchronousMultipleRequests() throws URISyntaxException { + public static void asynchronousMultipleRequests() throws URISyntaxException { List targets = Arrays.asList(new URI("http://jsonplaceholder.typicode.com/posts/1"), new URI("http://jsonplaceholder.typicode.com/posts/2")); HttpClient client = HttpClient.newHttpClient(); List> futures = targets diff --git a/core-java-9/src/modules/com.baeldung.httpclient/module-info.java b/core-java-9/src/modules/com.baeldung.httpclient/module-info.java new file mode 100644 index 0000000000..205c9ea725 --- /dev/null +++ b/core-java-9/src/modules/com.baeldung.httpclient/module-info.java @@ -0,0 +1,3 @@ +module com.baeldung.httpclient { + requires jdk.incubator.httpclient; +} From 235ea3eb782e2bc2ba3587cbc836268263d7d294 Mon Sep 17 00:00:00 2001 From: Dassi Orleando Date: Fri, 1 Dec 2017 06:31:30 +0100 Subject: [PATCH 117/236] Formating --- .../src/test/java/com/baeldung/SomeIntegrationTest.java | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/spring-jenkins-pipeline/src/test/java/com/baeldung/SomeIntegrationTest.java b/spring-jenkins-pipeline/src/test/java/com/baeldung/SomeIntegrationTest.java index dd8a234d1d..092ebb93fd 100644 --- a/spring-jenkins-pipeline/src/test/java/com/baeldung/SomeIntegrationTest.java +++ b/spring-jenkins-pipeline/src/test/java/com/baeldung/SomeIntegrationTest.java @@ -9,7 +9,8 @@ import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; -import static org.junit.Assert.*; + +import static org.junit.Assert.assertNotEquals; @RunWith(SpringJUnit4ClassRunner.class) @SpringBootTest @@ -19,12 +20,12 @@ public class SomeIntegrationTest { @Before public void setup() { - Student student = new Student("Paul", "Smith", "64377473774", "me@mymail.com"); + Student student = new Student("Paul", "Smith", "64377473774", "me@mailprovider.com"); studentRepository.save(student); } @Test - public void testDB() { + public void whenInserting_andCount_thenWeDontGetZero() { long count = studentRepository.count(); assertNotEquals(0, count); From 42c894e7f96748c25427fc73e13372c6a2a06d4b Mon Sep 17 00:00:00 2001 From: Ahmed Tawila Date: Fri, 1 Dec 2017 08:37:19 +0200 Subject: [PATCH 118/236] BAEL-1307 Java Nested Classes (#3157) * Evaluation article: Different Types of Bean Injection in Spring * added tests & changed configuration to Java-based config * removed xml config files * rename unit tests * BAEL-972 - Apache Commons Text * remove code from evaluation article * remove code from evaluation article * BAEL-972 - Apache Commons Text - added another example * BAEL-972 - Apache Commons Text - just indentation * BAEL-994 - TemporalAdjuster in Java * BAEL-994 - TemporalAdjuster in Java * BAEL-994 - TemporalAdjuster in Java * BAEL-994 - TemporalAdjuster in Java * BAEL-994 - TemporalAdjuster in Java - fix problems * BAEL-1033 Introduction to StreamUtils * BAEL-1033 Introduction to StreamUtils * BAEL-1033 Introduction to StreamUtils * fix formatting * BAEL-1033 minor refactor * BAEL-1035 Introduction to Eclipse Collections * format * BAEL-1035 Introduction to Eclipse Collections * BAEL-1035 Introduction to Eclipse Collections * BAEL-1035 Introduction to Eclipse Collections * cleanup * cleanup * BAEL-1109 Introduction to JCache * BAEL-1109 Introduction to JCache * remove unneeded property in pom.xml * fix formatting * close cache instances properly * remove latest commit * BAEL-1057 Introduction to rxjava-jdbc * refactor rxjava-jdbc * Refactor rxjava-jdbc * Refactoring rxjava-jdbc * BAEL-1171 java.lang.String API * refactor rxjava-jdbc * refactor String * String API - move multiple classes into a single class * move class into test package * BAEL-1171 String.lang.String API * BAEL-1171 java.lang.String API * BAEL-1250 Initializing Arrays in Java * BAEL-1250 Initializing Arrays in Java * BAEL-1250 Initializing Arrays in Java * small fix * BAEL-1171 java.lang.String API * BAEL-1263 Daemon Threads in Java * merge with fork * BAEL-1263 Daemon Threads in Java * fix compilation error * BAEL-1309 Append Data to a File with Java * fix build fails * fix test error * fix build failures * cleanup * fix Sneaky Runnable test * revert sneaky runnable fix attempt * fix test failure * fix test failure * fix all test failures * fix test failure * fix test failures * Nested Classes in Java * enhance nested classes --- .../com/baeldung/nestedclass/Enclosing.java | 11 ------- .../java/com/baeldung/nestedclass/Outer.java | 11 ------- .../nestedclass/SimpleAbstractClass.java | 5 --- ...mousInnerTest.java => AnonymousInner.java} | 8 +++-- .../com/baeldung/nestedclass/Enclosing.java | 21 ++++++++++++ .../baeldung/nestedclass/InnerClassTest.java | 13 -------- .../baeldung/nestedclass/LocalClassTest.java | 12 ------- .../baeldung/nestedclass/NestedClassTest.java | 12 ------- .../baeldung/nestedclass/NewEnclosing.java | 11 +++++-- .../com/baeldung/nestedclass/NewOuter.java | 30 +++++++++++++++++ .../baeldung/nestedclass/NewOuterTest.java | 32 ------------------- .../java/com/baeldung/nestedclass/Outer.java | 20 ++++++++++++ 12 files changed, 86 insertions(+), 100 deletions(-) delete mode 100644 core-java/src/main/java/com/baeldung/nestedclass/Enclosing.java delete mode 100644 core-java/src/main/java/com/baeldung/nestedclass/Outer.java delete mode 100644 core-java/src/main/java/com/baeldung/nestedclass/SimpleAbstractClass.java rename core-java/src/test/java/com/baeldung/nestedclass/{AnonymousInnerTest.java => AnonymousInner.java} (72%) create mode 100644 core-java/src/test/java/com/baeldung/nestedclass/Enclosing.java delete mode 100644 core-java/src/test/java/com/baeldung/nestedclass/InnerClassTest.java delete mode 100644 core-java/src/test/java/com/baeldung/nestedclass/LocalClassTest.java delete mode 100644 core-java/src/test/java/com/baeldung/nestedclass/NestedClassTest.java rename core-java/src/{main => test}/java/com/baeldung/nestedclass/NewEnclosing.java (59%) create mode 100644 core-java/src/test/java/com/baeldung/nestedclass/NewOuter.java delete mode 100644 core-java/src/test/java/com/baeldung/nestedclass/NewOuterTest.java create mode 100644 core-java/src/test/java/com/baeldung/nestedclass/Outer.java diff --git a/core-java/src/main/java/com/baeldung/nestedclass/Enclosing.java b/core-java/src/main/java/com/baeldung/nestedclass/Enclosing.java deleted file mode 100644 index a9911538b0..0000000000 --- a/core-java/src/main/java/com/baeldung/nestedclass/Enclosing.java +++ /dev/null @@ -1,11 +0,0 @@ -package com.baeldung.nestedclass; - -public class Enclosing { - - public static class Nested { - - public void test() { - System.out.println("Calling test..."); - } - } -} diff --git a/core-java/src/main/java/com/baeldung/nestedclass/Outer.java b/core-java/src/main/java/com/baeldung/nestedclass/Outer.java deleted file mode 100644 index ebd6d27293..0000000000 --- a/core-java/src/main/java/com/baeldung/nestedclass/Outer.java +++ /dev/null @@ -1,11 +0,0 @@ -package com.baeldung.nestedclass; - -public class Outer { - - public class Inner { - - public void test() { - System.out.println("Calling test..."); - } - } -} diff --git a/core-java/src/main/java/com/baeldung/nestedclass/SimpleAbstractClass.java b/core-java/src/main/java/com/baeldung/nestedclass/SimpleAbstractClass.java deleted file mode 100644 index 586e2d12b4..0000000000 --- a/core-java/src/main/java/com/baeldung/nestedclass/SimpleAbstractClass.java +++ /dev/null @@ -1,5 +0,0 @@ -package com.baeldung.nestedclass; - -abstract class SimpleAbstractClass { - abstract void run(); -} \ No newline at end of file diff --git a/core-java/src/test/java/com/baeldung/nestedclass/AnonymousInnerTest.java b/core-java/src/test/java/com/baeldung/nestedclass/AnonymousInner.java similarity index 72% rename from core-java/src/test/java/com/baeldung/nestedclass/AnonymousInnerTest.java rename to core-java/src/test/java/com/baeldung/nestedclass/AnonymousInner.java index 394c0bb57a..9fa8ee9cd5 100644 --- a/core-java/src/test/java/com/baeldung/nestedclass/AnonymousInnerTest.java +++ b/core-java/src/test/java/com/baeldung/nestedclass/AnonymousInner.java @@ -2,10 +2,14 @@ package com.baeldung.nestedclass; import org.junit.Test; -public class AnonymousInnerTest { +abstract class SimpleAbstractClass { + abstract void run(); +} + +public class AnonymousInner { @Test - public void whenRunAnonymousClass_thenCorrect() { + public void run() { SimpleAbstractClass simpleAbstractClass = new SimpleAbstractClass() { void run() { System.out.println("Running Anonymous Class..."); diff --git a/core-java/src/test/java/com/baeldung/nestedclass/Enclosing.java b/core-java/src/test/java/com/baeldung/nestedclass/Enclosing.java new file mode 100644 index 0000000000..3db33cde9b --- /dev/null +++ b/core-java/src/test/java/com/baeldung/nestedclass/Enclosing.java @@ -0,0 +1,21 @@ +package com.baeldung.nestedclass; + +import org.junit.Test; + +public class Enclosing { + + private static int x = 1; + + public static class StaticNested { + + private void run() { + System.out.println("x = " + x); + } + } + + @Test + public void test() { + Enclosing.StaticNested nested = new Enclosing.StaticNested(); + nested.run(); + } +} diff --git a/core-java/src/test/java/com/baeldung/nestedclass/InnerClassTest.java b/core-java/src/test/java/com/baeldung/nestedclass/InnerClassTest.java deleted file mode 100644 index e9cb119ac2..0000000000 --- a/core-java/src/test/java/com/baeldung/nestedclass/InnerClassTest.java +++ /dev/null @@ -1,13 +0,0 @@ -package com.baeldung.nestedclass; - -import org.junit.Test; - -public class InnerClassTest { - - @Test - public void givenInnerClassWhenInstantiating_thenCorrect() { - Outer outer = new Outer(); - Outer.Inner inner = outer.new Inner(); - inner.test(); - } -} diff --git a/core-java/src/test/java/com/baeldung/nestedclass/LocalClassTest.java b/core-java/src/test/java/com/baeldung/nestedclass/LocalClassTest.java deleted file mode 100644 index dad19161ad..0000000000 --- a/core-java/src/test/java/com/baeldung/nestedclass/LocalClassTest.java +++ /dev/null @@ -1,12 +0,0 @@ -package com.baeldung.nestedclass; - -import org.junit.Test; - -public class LocalClassTest { - - @Test - public void whenTestingLocalClass_thenCorrect() { - NewEnclosing newEnclosing = new NewEnclosing(); - newEnclosing.run(); - } -} diff --git a/core-java/src/test/java/com/baeldung/nestedclass/NestedClassTest.java b/core-java/src/test/java/com/baeldung/nestedclass/NestedClassTest.java deleted file mode 100644 index 16c883689a..0000000000 --- a/core-java/src/test/java/com/baeldung/nestedclass/NestedClassTest.java +++ /dev/null @@ -1,12 +0,0 @@ -package com.baeldung.nestedclass; - -import org.junit.Test; - -public class NestedClassTest { - - @Test - public void whenInstantiatingStaticNestedClass_thenCorrect() { - Enclosing.Nested nested = new Enclosing.Nested(); - nested.test(); - } -} diff --git a/core-java/src/main/java/com/baeldung/nestedclass/NewEnclosing.java b/core-java/src/test/java/com/baeldung/nestedclass/NewEnclosing.java similarity index 59% rename from core-java/src/main/java/com/baeldung/nestedclass/NewEnclosing.java rename to core-java/src/test/java/com/baeldung/nestedclass/NewEnclosing.java index c7e04e8600..deeb72de0c 100644 --- a/core-java/src/main/java/com/baeldung/nestedclass/NewEnclosing.java +++ b/core-java/src/test/java/com/baeldung/nestedclass/NewEnclosing.java @@ -1,10 +1,11 @@ package com.baeldung.nestedclass; +import org.junit.Test; + public class NewEnclosing { - void run() { + private void run() { class Local { - void run() { System.out.println("Welcome to Baeldung!"); } @@ -12,4 +13,10 @@ public class NewEnclosing { Local local = new Local(); local.run(); } + + @Test + public void test() { + NewEnclosing newEnclosing = new NewEnclosing(); + newEnclosing.run(); + } } \ No newline at end of file diff --git a/core-java/src/test/java/com/baeldung/nestedclass/NewOuter.java b/core-java/src/test/java/com/baeldung/nestedclass/NewOuter.java new file mode 100644 index 0000000000..a3a723b30e --- /dev/null +++ b/core-java/src/test/java/com/baeldung/nestedclass/NewOuter.java @@ -0,0 +1,30 @@ +package com.baeldung.nestedclass; + +import org.junit.Test; + +public class NewOuter { + + int a = 1; + static int b = 2; + + public class InnerClass { + int a = 3; + static final int b = 4; + + public void run() { + System.out.println("a = " + a); + System.out.println("b = " + b); + System.out.println("NewOuterTest.this.a = " + NewOuter.this.a); + System.out.println("NewOuterTest.b = " + NewOuter.b); + System.out.println("NewOuterTest.this.b = " + NewOuter.this.b); + } + } + + @Test + public void test() { + NewOuter outer = new NewOuter(); + NewOuter.InnerClass inner = outer.new InnerClass(); + inner.run(); + + } +} \ No newline at end of file diff --git a/core-java/src/test/java/com/baeldung/nestedclass/NewOuterTest.java b/core-java/src/test/java/com/baeldung/nestedclass/NewOuterTest.java deleted file mode 100644 index e883687d33..0000000000 --- a/core-java/src/test/java/com/baeldung/nestedclass/NewOuterTest.java +++ /dev/null @@ -1,32 +0,0 @@ -package com.baeldung.nestedclass; - -import static org.junit.Assert.assertEquals; -import org.junit.Test; - -public class NewOuterTest { - - int a = 1; - static int b = 2; - - public class InnerClass { - int a = 3; - static final int b = 4; - - @Test - public void whenShadowing_thenCorrect() { - assertEquals(3, a); - assertEquals(4, b); - assertEquals(1, NewOuterTest.this.a); - assertEquals(2, NewOuterTest.b); - assertEquals(2, NewOuterTest.this.b); - } - } - - @Test - public void shadowingTest() { - NewOuterTest outer = new NewOuterTest(); - NewOuterTest.InnerClass inner = outer.new InnerClass(); - inner.whenShadowing_thenCorrect(); - - } -} \ No newline at end of file diff --git a/core-java/src/test/java/com/baeldung/nestedclass/Outer.java b/core-java/src/test/java/com/baeldung/nestedclass/Outer.java new file mode 100644 index 0000000000..d5e46670c9 --- /dev/null +++ b/core-java/src/test/java/com/baeldung/nestedclass/Outer.java @@ -0,0 +1,20 @@ +package com.baeldung.nestedclass; + +import org.junit.Test; + +public class Outer { + + public class Inner { + + public void run() { + System.out.println("Calling test..."); + } + } + + @Test + public void test() { + Outer outer = new Outer(); + Outer.Inner inner = outer.new Inner(); + inner.run(); + } +} From f84dbbbb45aa29caddef58b77de2388a90abd302 Mon Sep 17 00:00:00 2001 From: ryan Date: Fri, 1 Dec 2017 14:55:04 +0800 Subject: [PATCH 119/236] fix parent.relativePath config for maven submodules in separate folders (#3148) --- guava-modules/guava-18/pom.xml | 2 +- guava-modules/guava-19/pom.xml | 2 +- guava-modules/guava-21/pom.xml | 2 +- logging-modules/log-mdc/pom.xml | 2 +- logging-modules/log4j/pom.xml | 2 +- logging-modules/log4j2/pom.xml | 2 +- persistence-modules/java-cassandra/pom.xml | 2 +- persistence-modules/java-mongodb/pom.xml | 2 +- persistence-modules/liquibase/pom.xml | 2 +- persistence-modules/querydsl/pom.xml | 2 +- persistence-modules/redis/pom.xml | 2 +- persistence-modules/solr/pom.xml | 2 +- persistence-modules/spring-data-cassandra/pom.xml | 2 +- persistence-modules/spring-data-gemfire/pom.xml | 2 +- persistence-modules/spring-data-neo4j/pom.xml | 2 +- persistence-modules/spring-data-redis/pom.xml | 2 +- persistence-modules/spring-data-solr/pom.xml | 2 +- persistence-modules/spring-hibernate-3/pom.xml | 2 +- persistence-modules/spring-hibernate-5/pom.xml | 2 +- testing-modules/groovy-spock/pom.xml | 2 +- testing-modules/junit-5/pom.xml | 2 +- testing-modules/mockito-2/pom.xml | 2 +- testing-modules/mockito/pom.xml | 2 +- testing-modules/mocks/pom.xml | 2 +- testing-modules/rest-assured/pom.xml | 2 +- testing-modules/rest-testing/pom.xml | 2 +- testing-modules/selenium-junit-testng/pom.xml | 2 +- testing-modules/testing/pom.xml | 2 +- testing-modules/testng/pom.xml | 2 +- 29 files changed, 29 insertions(+), 29 deletions(-) diff --git a/guava-modules/guava-18/pom.xml b/guava-modules/guava-18/pom.xml index a9aba47f12..f8dbf5657e 100644 --- a/guava-modules/guava-18/pom.xml +++ b/guava-modules/guava-18/pom.xml @@ -11,7 +11,7 @@ com.baeldung parent-modules 1.0.0-SNAPSHOT - ../ + ../../ diff --git a/guava-modules/guava-19/pom.xml b/guava-modules/guava-19/pom.xml index 2345212eba..4a23bf7aec 100644 --- a/guava-modules/guava-19/pom.xml +++ b/guava-modules/guava-19/pom.xml @@ -11,7 +11,7 @@ com.baeldung parent-modules 1.0.0-SNAPSHOT - ../ + ../../ diff --git a/guava-modules/guava-21/pom.xml b/guava-modules/guava-21/pom.xml index 94bb66e76a..f5432fb7df 100644 --- a/guava-modules/guava-21/pom.xml +++ b/guava-modules/guava-21/pom.xml @@ -11,7 +11,7 @@ com.baeldung parent-modules 1.0.0-SNAPSHOT - ../ + ../../ diff --git a/logging-modules/log-mdc/pom.xml b/logging-modules/log-mdc/pom.xml index 918e052a15..5551585372 100644 --- a/logging-modules/log-mdc/pom.xml +++ b/logging-modules/log-mdc/pom.xml @@ -12,7 +12,7 @@ com.baeldung parent-modules 1.0.0-SNAPSHOT - ../ + ../../ diff --git a/logging-modules/log4j/pom.xml b/logging-modules/log4j/pom.xml index a3bfb0a33a..6a3fbde393 100644 --- a/logging-modules/log4j/pom.xml +++ b/logging-modules/log4j/pom.xml @@ -11,7 +11,7 @@ com.baeldung parent-modules 1.0.0-SNAPSHOT - ../ + ../../ diff --git a/logging-modules/log4j2/pom.xml b/logging-modules/log4j2/pom.xml index 58bc4b74e7..48608fbc80 100644 --- a/logging-modules/log4j2/pom.xml +++ b/logging-modules/log4j2/pom.xml @@ -9,7 +9,7 @@ com.baeldung parent-modules 1.0.0-SNAPSHOT - ../ + ../../ diff --git a/persistence-modules/java-cassandra/pom.xml b/persistence-modules/java-cassandra/pom.xml index faaabb9e2e..81e072c3a7 100644 --- a/persistence-modules/java-cassandra/pom.xml +++ b/persistence-modules/java-cassandra/pom.xml @@ -11,7 +11,7 @@ com.baeldung parent-modules 1.0.0-SNAPSHOT - ../ + ../../ diff --git a/persistence-modules/java-mongodb/pom.xml b/persistence-modules/java-mongodb/pom.xml index aab48921a6..9784b2c5a8 100644 --- a/persistence-modules/java-mongodb/pom.xml +++ b/persistence-modules/java-mongodb/pom.xml @@ -11,7 +11,7 @@ com.baeldung parent-modules 1.0.0-SNAPSHOT - ../ + ../../ diff --git a/persistence-modules/liquibase/pom.xml b/persistence-modules/liquibase/pom.xml index 020c2516a2..a574ba497c 100644 --- a/persistence-modules/liquibase/pom.xml +++ b/persistence-modules/liquibase/pom.xml @@ -6,7 +6,7 @@ parent-modules com.baeldung 1.0.0-SNAPSHOT - ../ + ../../ 4.0.0 diff --git a/persistence-modules/querydsl/pom.xml b/persistence-modules/querydsl/pom.xml index 27f383e0c6..c2943875f1 100644 --- a/persistence-modules/querydsl/pom.xml +++ b/persistence-modules/querydsl/pom.xml @@ -15,7 +15,7 @@ com.baeldung parent-modules 1.0.0-SNAPSHOT - ../ + ../../ diff --git a/persistence-modules/redis/pom.xml b/persistence-modules/redis/pom.xml index ef081a2c69..4321b491eb 100644 --- a/persistence-modules/redis/pom.xml +++ b/persistence-modules/redis/pom.xml @@ -15,7 +15,7 @@ com.baeldung parent-modules 1.0.0-SNAPSHOT - ../ + ../../ diff --git a/persistence-modules/solr/pom.xml b/persistence-modules/solr/pom.xml index 2fd0bdd721..966bd8755b 100644 --- a/persistence-modules/solr/pom.xml +++ b/persistence-modules/solr/pom.xml @@ -12,7 +12,7 @@ com.baeldung parent-modules 1.0.0-SNAPSHOT - ../ + ../../ diff --git a/persistence-modules/spring-data-cassandra/pom.xml b/persistence-modules/spring-data-cassandra/pom.xml index 607d7b90ba..1358210a45 100644 --- a/persistence-modules/spring-data-cassandra/pom.xml +++ b/persistence-modules/spring-data-cassandra/pom.xml @@ -13,7 +13,7 @@ com.baeldung parent-modules 1.0.0-SNAPSHOT - ../ + ../../ diff --git a/persistence-modules/spring-data-gemfire/pom.xml b/persistence-modules/spring-data-gemfire/pom.xml index 9108865b4c..3f7fcd03e5 100644 --- a/persistence-modules/spring-data-gemfire/pom.xml +++ b/persistence-modules/spring-data-gemfire/pom.xml @@ -12,7 +12,7 @@ com.baeldung parent-modules 1.0.0-SNAPSHOT - ../ + ../../ diff --git a/persistence-modules/spring-data-neo4j/pom.xml b/persistence-modules/spring-data-neo4j/pom.xml index 0055850ec3..bdd51e9659 100644 --- a/persistence-modules/spring-data-neo4j/pom.xml +++ b/persistence-modules/spring-data-neo4j/pom.xml @@ -10,7 +10,7 @@ com.baeldung parent-modules 1.0.0-SNAPSHOT - ../ + ../../ diff --git a/persistence-modules/spring-data-redis/pom.xml b/persistence-modules/spring-data-redis/pom.xml index b184d7e369..6cb49f11cf 100644 --- a/persistence-modules/spring-data-redis/pom.xml +++ b/persistence-modules/spring-data-redis/pom.xml @@ -11,7 +11,7 @@ com.baeldung parent-modules 1.0.0-SNAPSHOT - ../ + ../../ diff --git a/persistence-modules/spring-data-solr/pom.xml b/persistence-modules/spring-data-solr/pom.xml index 0759c1dbc0..e24d8314ba 100644 --- a/persistence-modules/spring-data-solr/pom.xml +++ b/persistence-modules/spring-data-solr/pom.xml @@ -12,7 +12,7 @@ com.baeldung parent-modules 1.0.0-SNAPSHOT - ../ + ../../ diff --git a/persistence-modules/spring-hibernate-3/pom.xml b/persistence-modules/spring-hibernate-3/pom.xml index 8eee819572..f1873a84d3 100644 --- a/persistence-modules/spring-hibernate-3/pom.xml +++ b/persistence-modules/spring-hibernate-3/pom.xml @@ -11,7 +11,7 @@ com.baeldung parent-modules 1.0.0-SNAPSHOT - ../ + ../../ diff --git a/persistence-modules/spring-hibernate-5/pom.xml b/persistence-modules/spring-hibernate-5/pom.xml index f1f3d10347..57eb1aeffb 100644 --- a/persistence-modules/spring-hibernate-5/pom.xml +++ b/persistence-modules/spring-hibernate-5/pom.xml @@ -11,7 +11,7 @@ com.baeldung parent-modules 1.0.0-SNAPSHOT - ../ + ../../ diff --git a/testing-modules/groovy-spock/pom.xml b/testing-modules/groovy-spock/pom.xml index f4e61e6786..3d67657224 100644 --- a/testing-modules/groovy-spock/pom.xml +++ b/testing-modules/groovy-spock/pom.xml @@ -17,7 +17,7 @@ com.baeldung parent-modules 1.0.0-SNAPSHOT - ../ + ../../ diff --git a/testing-modules/junit-5/pom.xml b/testing-modules/junit-5/pom.xml index 2be8937d04..684a9253d5 100644 --- a/testing-modules/junit-5/pom.xml +++ b/testing-modules/junit-5/pom.xml @@ -14,7 +14,7 @@ com.baeldung parent-modules 1.0.0-SNAPSHOT - ../ + ../../ diff --git a/testing-modules/mockito-2/pom.xml b/testing-modules/mockito-2/pom.xml index 0291ac4ec1..2d119ae8af 100644 --- a/testing-modules/mockito-2/pom.xml +++ b/testing-modules/mockito-2/pom.xml @@ -12,7 +12,7 @@ com.baeldung parent-modules 1.0.0-SNAPSHOT - ../ + ../../ diff --git a/testing-modules/mockito/pom.xml b/testing-modules/mockito/pom.xml index aa3dd9b20a..0e83c46926 100644 --- a/testing-modules/mockito/pom.xml +++ b/testing-modules/mockito/pom.xml @@ -11,7 +11,7 @@ com.baeldung parent-modules 1.0.0-SNAPSHOT - ../ + ../../ diff --git a/testing-modules/mocks/pom.xml b/testing-modules/mocks/pom.xml index 959c1851d6..6473f07c13 100644 --- a/testing-modules/mocks/pom.xml +++ b/testing-modules/mocks/pom.xml @@ -6,7 +6,7 @@ com.baeldung parent-modules 1.0.0-SNAPSHOT - ../ + ../../ mocks diff --git a/testing-modules/rest-assured/pom.xml b/testing-modules/rest-assured/pom.xml index 0c0826c5c3..1006e9a373 100644 --- a/testing-modules/rest-assured/pom.xml +++ b/testing-modules/rest-assured/pom.xml @@ -10,7 +10,7 @@ com.baeldung parent-modules 1.0.0-SNAPSHOT - ../ + ../../ diff --git a/testing-modules/rest-testing/pom.xml b/testing-modules/rest-testing/pom.xml index 4b838720da..ea63ee0e58 100644 --- a/testing-modules/rest-testing/pom.xml +++ b/testing-modules/rest-testing/pom.xml @@ -11,7 +11,7 @@ com.baeldung parent-modules 1.0.0-SNAPSHOT - ../ + ../../ diff --git a/testing-modules/selenium-junit-testng/pom.xml b/testing-modules/selenium-junit-testng/pom.xml index 14169e5749..418dd495a4 100644 --- a/testing-modules/selenium-junit-testng/pom.xml +++ b/testing-modules/selenium-junit-testng/pom.xml @@ -9,7 +9,7 @@ com.baeldung parent-modules 1.0.0-SNAPSHOT - ../ + ../../ diff --git a/testing-modules/testing/pom.xml b/testing-modules/testing/pom.xml index 3ad503558f..7aff0a93e0 100644 --- a/testing-modules/testing/pom.xml +++ b/testing-modules/testing/pom.xml @@ -10,7 +10,7 @@ com.baeldung parent-modules 1.0.0-SNAPSHOT - ../ + ../../ diff --git a/testing-modules/testng/pom.xml b/testing-modules/testng/pom.xml index f7a50954fc..7aed1837e5 100644 --- a/testing-modules/testng/pom.xml +++ b/testing-modules/testng/pom.xml @@ -11,7 +11,7 @@ com.baeldung parent-modules 1.0.0-SNAPSHOT - ../ + ../../ From 2ad2d4d820a806d46bba6d1f9aebac7e618ed142 Mon Sep 17 00:00:00 2001 From: linhvovn Date: Fri, 1 Dec 2017 14:55:22 +0800 Subject: [PATCH 120/236] [tlinh2110@gmail.com]Bael1313 Create spring-acl module (#3131) * [tlinh2110@gmail.com] [BAEL1313] Introduction Spring ACL * [tlinh2110@gmail.com] BAEL 1313 - Update unit test * [tlinh2110@gmail.com]BAEL1313- remove unused files from spring-core * [BAEL1313] Create spring-acl module * [BAEL1313] Add resources for Spring ACL * [BAEL1313] Remove acl from spring-security-mvc-boot * [BAEL1313] Add Spring ACL module in parent pom.xml --- pom.xml | 1 + spring-acl/pom.xml | 66 ++++++++++ .../org/baeldung/acl/config/ACLContext.java | 80 ++++++++++++ .../AclMethodSecurityConfiguration.java | 21 ++++ .../acl/config/JPAPersistenceConfig.java | 16 +++ .../dao/NoticeMessageRepository.java | 24 ++++ .../acl/persistence/entity/NoticeMessage.java | 29 +++++ spring-acl/src/main/resources/acl-data.sql | 28 +++++ spring-acl/src/main/resources/acl-schema.sql | 58 +++++++++ .../org.baeldung.acl.datasource.properties | 12 ++ .../java/org/baeldung/acl/SpringAclTest.java | 119 ++++++++++++++++++ 11 files changed, 454 insertions(+) create mode 100644 spring-acl/pom.xml create mode 100644 spring-acl/src/main/java/org/baeldung/acl/config/ACLContext.java create mode 100644 spring-acl/src/main/java/org/baeldung/acl/config/AclMethodSecurityConfiguration.java create mode 100644 spring-acl/src/main/java/org/baeldung/acl/config/JPAPersistenceConfig.java create mode 100644 spring-acl/src/main/java/org/baeldung/acl/persistence/dao/NoticeMessageRepository.java create mode 100644 spring-acl/src/main/java/org/baeldung/acl/persistence/entity/NoticeMessage.java create mode 100644 spring-acl/src/main/resources/acl-data.sql create mode 100644 spring-acl/src/main/resources/acl-schema.sql create mode 100644 spring-acl/src/main/resources/org.baeldung.acl.datasource.properties create mode 100644 spring-acl/src/test/java/org/baeldung/acl/SpringAclTest.java diff --git a/pom.xml b/pom.xml index 9b1f50f05e..cac0cc5845 100644 --- a/pom.xml +++ b/pom.xml @@ -141,6 +141,7 @@ spark-java spring-5-mvc + spring-acl spring-activiti spring-akka spring-amqp diff --git a/spring-acl/pom.xml b/spring-acl/pom.xml new file mode 100644 index 0000000000..3bcc0cf596 --- /dev/null +++ b/spring-acl/pom.xml @@ -0,0 +1,66 @@ + + + 4.0.0 + + com.baeldung + spring-acl + 0.0.1-SNAPSHOT + war + + spring-acl + Spring ACL + + + parent-boot-5 + com.baeldung + 0.0.1-SNAPSHOT + ../parent-boot-5 + + + + + + org.springframework.boot + spring-boot-starter-data-jpa + + + + com.h2database + h2 + + + + org.springframework + spring-test + test + + + + org.springframework.security + spring-security-test + test + + + + org.springframework.security + spring-security-acl + + + org.springframework.security + spring-security-config + + + org.springframework + spring-context-support + + + net.sf.ehcache + ehcache-core + 2.6.11 + jar + + + + + diff --git a/spring-acl/src/main/java/org/baeldung/acl/config/ACLContext.java b/spring-acl/src/main/java/org/baeldung/acl/config/ACLContext.java new file mode 100644 index 0000000000..63a4ea58ef --- /dev/null +++ b/spring-acl/src/main/java/org/baeldung/acl/config/ACLContext.java @@ -0,0 +1,80 @@ +package org.baeldung.acl.config; + +import javax.sql.DataSource; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.autoconfigure.EnableAutoConfiguration; +import org.springframework.cache.ehcache.EhCacheFactoryBean; +import org.springframework.cache.ehcache.EhCacheManagerFactoryBean; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.security.access.expression.method.DefaultMethodSecurityExpressionHandler; +import org.springframework.security.access.expression.method.MethodSecurityExpressionHandler; +import org.springframework.security.acls.AclPermissionCacheOptimizer; +import org.springframework.security.acls.AclPermissionEvaluator; +import org.springframework.security.acls.domain.AclAuthorizationStrategy; +import org.springframework.security.acls.domain.AclAuthorizationStrategyImpl; +import org.springframework.security.acls.domain.ConsoleAuditLogger; +import org.springframework.security.acls.domain.DefaultPermissionGrantingStrategy; +import org.springframework.security.acls.domain.EhCacheBasedAclCache; +import org.springframework.security.acls.jdbc.BasicLookupStrategy; +import org.springframework.security.acls.jdbc.JdbcMutableAclService; +import org.springframework.security.acls.jdbc.LookupStrategy; +import org.springframework.security.acls.model.PermissionGrantingStrategy; +import org.springframework.security.core.authority.SimpleGrantedAuthority; + +@Configuration +@EnableAutoConfiguration +public class ACLContext { + + @Autowired + DataSource dataSource; + + @Bean + public EhCacheBasedAclCache aclCache() { + return new EhCacheBasedAclCache(aclEhCacheFactoryBean().getObject(), permissionGrantingStrategy(), aclAuthorizationStrategy()); + } + + @Bean + public EhCacheFactoryBean aclEhCacheFactoryBean() { + EhCacheFactoryBean ehCacheFactoryBean = new EhCacheFactoryBean(); + ehCacheFactoryBean.setCacheManager(aclCacheManager().getObject()); + ehCacheFactoryBean.setCacheName("aclCache"); + return ehCacheFactoryBean; + } + + @Bean + public EhCacheManagerFactoryBean aclCacheManager() { + return new EhCacheManagerFactoryBean(); + } + + @Bean + public PermissionGrantingStrategy permissionGrantingStrategy() { + return new DefaultPermissionGrantingStrategy(new ConsoleAuditLogger()); + } + + @Bean + public AclAuthorizationStrategy aclAuthorizationStrategy() { + return new AclAuthorizationStrategyImpl(new SimpleGrantedAuthority("ROLE_ADMIN")); + } + + @Bean + public MethodSecurityExpressionHandler defaultMethodSecurityExpressionHandler() { + DefaultMethodSecurityExpressionHandler expressionHandler = new DefaultMethodSecurityExpressionHandler(); + AclPermissionEvaluator permissionEvaluator = new AclPermissionEvaluator(aclService()); + expressionHandler.setPermissionEvaluator(permissionEvaluator); + expressionHandler.setPermissionCacheOptimizer(new AclPermissionCacheOptimizer(aclService())); + return expressionHandler; + } + + @Bean + public LookupStrategy lookupStrategy() { + return new BasicLookupStrategy(dataSource, aclCache(), aclAuthorizationStrategy(), new ConsoleAuditLogger()); + } + + @Bean + public JdbcMutableAclService aclService() { + return new JdbcMutableAclService(dataSource, lookupStrategy(), aclCache()); + } + +} \ No newline at end of file diff --git a/spring-acl/src/main/java/org/baeldung/acl/config/AclMethodSecurityConfiguration.java b/spring-acl/src/main/java/org/baeldung/acl/config/AclMethodSecurityConfiguration.java new file mode 100644 index 0000000000..110c4a6d24 --- /dev/null +++ b/spring-acl/src/main/java/org/baeldung/acl/config/AclMethodSecurityConfiguration.java @@ -0,0 +1,21 @@ +package org.baeldung.acl.config; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Configuration; +import org.springframework.security.access.expression.method.MethodSecurityExpressionHandler; +import org.springframework.security.config.annotation.method.configuration.EnableGlobalMethodSecurity; +import org.springframework.security.config.annotation.method.configuration.GlobalMethodSecurityConfiguration; + +@Configuration +@EnableGlobalMethodSecurity(prePostEnabled = true, securedEnabled = true) +public class AclMethodSecurityConfiguration extends GlobalMethodSecurityConfiguration { + + @Autowired + MethodSecurityExpressionHandler defaultMethodSecurityExpressionHandler; + + @Override + protected MethodSecurityExpressionHandler createExpressionHandler() { + return defaultMethodSecurityExpressionHandler; + } + +} diff --git a/spring-acl/src/main/java/org/baeldung/acl/config/JPAPersistenceConfig.java b/spring-acl/src/main/java/org/baeldung/acl/config/JPAPersistenceConfig.java new file mode 100644 index 0000000000..9b87efa92c --- /dev/null +++ b/spring-acl/src/main/java/org/baeldung/acl/config/JPAPersistenceConfig.java @@ -0,0 +1,16 @@ +package org.baeldung.acl.config; + +import org.springframework.boot.autoconfigure.domain.EntityScan; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.PropertySource; +import org.springframework.data.jpa.repository.config.EnableJpaRepositories; +import org.springframework.transaction.annotation.EnableTransactionManagement; + +@Configuration +@EnableTransactionManagement +@EnableJpaRepositories(basePackages = "org.baeldung.acl.persistence.dao") +@PropertySource("classpath:org.baeldung.acl.datasource.properties") +@EntityScan(basePackages={ "org.baeldung.acl.persistence.entity" }) +public class JPAPersistenceConfig { + +} diff --git a/spring-acl/src/main/java/org/baeldung/acl/persistence/dao/NoticeMessageRepository.java b/spring-acl/src/main/java/org/baeldung/acl/persistence/dao/NoticeMessageRepository.java new file mode 100644 index 0000000000..8662c88d6c --- /dev/null +++ b/spring-acl/src/main/java/org/baeldung/acl/persistence/dao/NoticeMessageRepository.java @@ -0,0 +1,24 @@ +package org.baeldung.acl.persistence.dao; + +import java.util.List; + +import org.baeldung.acl.persistence.entity.NoticeMessage; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.repository.query.Param; +import org.springframework.security.access.prepost.PostAuthorize; +import org.springframework.security.access.prepost.PostFilter; +import org.springframework.security.access.prepost.PreAuthorize; + +public interface NoticeMessageRepository extends JpaRepository{ + + @PostFilter("hasPermission(filterObject, 'READ')") + List findAll(); + + @PostAuthorize("hasPermission(returnObject, 'READ')") + NoticeMessage findById(Integer id); + + @SuppressWarnings("unchecked") + @PreAuthorize("hasPermission(#noticeMessage, 'WRITE')") + NoticeMessage save(@Param("noticeMessage")NoticeMessage noticeMessage); + +} diff --git a/spring-acl/src/main/java/org/baeldung/acl/persistence/entity/NoticeMessage.java b/spring-acl/src/main/java/org/baeldung/acl/persistence/entity/NoticeMessage.java new file mode 100644 index 0000000000..23f01a8edb --- /dev/null +++ b/spring-acl/src/main/java/org/baeldung/acl/persistence/entity/NoticeMessage.java @@ -0,0 +1,29 @@ +package org.baeldung.acl.persistence.entity; + +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.Id; +import javax.persistence.Table; + +@Entity +@Table(name="system_message") +public class NoticeMessage { + + @Id + @Column + private Integer id; + @Column + private String content; + public Integer getId() { + return id; + } + public void setId(Integer id) { + this.id = id; + } + public String getContent() { + return content; + } + public void setContent(String content) { + this.content = content; + } +} \ No newline at end of file diff --git a/spring-acl/src/main/resources/acl-data.sql b/spring-acl/src/main/resources/acl-data.sql new file mode 100644 index 0000000000..6c01eaacc2 --- /dev/null +++ b/spring-acl/src/main/resources/acl-data.sql @@ -0,0 +1,28 @@ +INSERT INTO system_message(id,content) VALUES (1,'First Level Message'); +INSERT INTO system_message(id,content) VALUES (2,'Second Level Message'); +INSERT INTO system_message(id,content) VALUES (3,'Third Level Message'); + +INSERT INTO acl_class (id, class) VALUES +(1, 'org.baeldung.acl.persistence.entity.NoticeMessage'); + +INSERT INTO acl_sid (id, principal, sid) VALUES +(1, 1, 'manager'), +(2, 1, 'hr'), +(3, 1, 'admin'), +(4, 0, 'ROLE_EDITOR'); + +INSERT INTO acl_object_identity (id, object_id_class, object_id_identity, parent_object, owner_sid, entries_inheriting) VALUES +(1, 1, 1, NULL, 3, 0), +(2, 1, 2, NULL, 3, 0), +(3, 1, 3, NULL, 3, 0) +; + +INSERT INTO acl_entry (id, acl_object_identity, ace_order, sid, mask, granting, audit_success, audit_failure) VALUES +(1, 1, 1, 1, 1, 1, 1, 1), +(2, 1, 2, 1, 2, 1, 1, 1), +(3, 1, 3, 4, 1, 1, 1, 1), +(4, 2, 1, 2, 1, 1, 1, 1), +(5, 2, 2, 4, 1, 1, 1, 1), +(6, 3, 1, 4, 1, 1, 1, 1), +(7, 3, 2, 4, 2, 1, 1, 1) +; \ No newline at end of file diff --git a/spring-acl/src/main/resources/acl-schema.sql b/spring-acl/src/main/resources/acl-schema.sql new file mode 100644 index 0000000000..58e9394b2b --- /dev/null +++ b/spring-acl/src/main/resources/acl-schema.sql @@ -0,0 +1,58 @@ +create table system_message (id integer not null, content varchar(255), primary key (id)); + +CREATE TABLE IF NOT EXISTS acl_sid ( + id bigint(20) NOT NULL AUTO_INCREMENT, + principal tinyint(1) NOT NULL, + sid varchar(100) NOT NULL, + PRIMARY KEY (id), + UNIQUE KEY unique_uk_1 (sid,principal) +); + +CREATE TABLE IF NOT EXISTS acl_class ( + id bigint(20) NOT NULL AUTO_INCREMENT, + class varchar(255) NOT NULL, + PRIMARY KEY (id), + UNIQUE KEY unique_uk_2 (class) +); + +CREATE TABLE IF NOT EXISTS acl_entry ( + id bigint(20) NOT NULL AUTO_INCREMENT, + acl_object_identity bigint(20) NOT NULL, + ace_order int(11) NOT NULL, + sid bigint(20) NOT NULL, + mask int(11) NOT NULL, + granting tinyint(1) NOT NULL, + audit_success tinyint(1) NOT NULL, + audit_failure tinyint(1) NOT NULL, + PRIMARY KEY (id), + UNIQUE KEY unique_uk_4 (acl_object_identity,ace_order) +); + +CREATE TABLE IF NOT EXISTS acl_object_identity ( + id bigint(20) NOT NULL AUTO_INCREMENT, + object_id_class bigint(20) NOT NULL, + object_id_identity bigint(20) NOT NULL, + parent_object bigint(20) DEFAULT NULL, + owner_sid bigint(20) DEFAULT NULL, + entries_inheriting tinyint(1) NOT NULL, + PRIMARY KEY (id), + UNIQUE KEY unique_uk_3 (object_id_class,object_id_identity) +); + +ALTER TABLE acl_entry +ADD FOREIGN KEY (acl_object_identity) REFERENCES acl_object_identity(id); + +ALTER TABLE acl_entry +ADD FOREIGN KEY (sid) REFERENCES acl_sid(id); + +-- +-- Constraints for table acl_object_identity +-- +ALTER TABLE acl_object_identity +ADD FOREIGN KEY (parent_object) REFERENCES acl_object_identity (id); + +ALTER TABLE acl_object_identity +ADD FOREIGN KEY (object_id_class) REFERENCES acl_class (id); + +ALTER TABLE acl_object_identity +ADD FOREIGN KEY (owner_sid) REFERENCES acl_sid (id); \ No newline at end of file diff --git a/spring-acl/src/main/resources/org.baeldung.acl.datasource.properties b/spring-acl/src/main/resources/org.baeldung.acl.datasource.properties new file mode 100644 index 0000000000..739dd3f07c --- /dev/null +++ b/spring-acl/src/main/resources/org.baeldung.acl.datasource.properties @@ -0,0 +1,12 @@ +spring.datasource.url=jdbc:h2:mem:testdb;DB_CLOSE_ON_EXIT=FALSE +spring.datasource.username=sa +spring.datasource.password= +spring.datasource.driverClassName=org.h2.Driver +spring.jpa.hibernate.ddl-auto=update +spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.H2Dialect + +spring.h2.console.path=/myconsole +spring.h2.console.enabled=true +spring.datasource.initialize=true +spring.datasource.schema=classpath:acl-schema.sql +spring.datasource.data=classpath:acl-data.sql \ No newline at end of file diff --git a/spring-acl/src/test/java/org/baeldung/acl/SpringAclTest.java b/spring-acl/src/test/java/org/baeldung/acl/SpringAclTest.java new file mode 100644 index 0000000000..fd9069d9bc --- /dev/null +++ b/spring-acl/src/test/java/org/baeldung/acl/SpringAclTest.java @@ -0,0 +1,119 @@ +package org.baeldung.acl; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; + +import java.util.List; + +import org.baeldung.acl.persistence.dao.NoticeMessageRepository; +import org.baeldung.acl.persistence.entity.NoticeMessage; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.ComponentScan; +import org.springframework.context.annotation.Configuration; +import org.springframework.security.access.AccessDeniedException; +import org.springframework.security.test.context.support.WithMockUser; +import org.springframework.security.test.context.support.WithSecurityContextTestExecutionListener; +import org.springframework.test.context.ContextConfiguration; +import org.springframework.test.context.TestExecutionListeners; +import org.springframework.test.context.junit4.AbstractJUnit4SpringContextTests; +import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; +import org.springframework.test.context.support.DependencyInjectionTestExecutionListener; +import org.springframework.test.context.support.DirtiesContextTestExecutionListener; +import org.springframework.test.context.transaction.TransactionalTestExecutionListener; +import org.springframework.test.context.web.ServletTestExecutionListener; + +@RunWith(SpringJUnit4ClassRunner.class) +@ContextConfiguration +@TestExecutionListeners(listeners={ServletTestExecutionListener.class, + DependencyInjectionTestExecutionListener.class, + DirtiesContextTestExecutionListener.class, + TransactionalTestExecutionListener.class, + WithSecurityContextTestExecutionListener.class}) +public class SpringAclTest extends AbstractJUnit4SpringContextTests{ + + private static Integer FIRST_MESSAGE_ID = 1; + private static Integer SECOND_MESSAGE_ID = 2; + private static Integer THIRD_MESSAGE_ID = 3; + private static String EDITTED_CONTENT = "EDITED"; + + @Configuration + @ComponentScan("org.baeldung.acl.*") + public static class SpringConfig { + + } + + @Autowired + NoticeMessageRepository repo; + + @Test + @WithMockUser(username="manager") + public void givenUsernameManager_whenFindAllMessage_thenReturnFirstMessage(){ + List details = repo.findAll(); + assertNotNull(details); + assertEquals(1,details.size()); + assertEquals(FIRST_MESSAGE_ID,details.get(0).getId()); + } + + @Test + @WithMockUser(username="manager") + public void givenUsernameManager_whenFindFirstMessageByIdAndUpdateFirstMessageContent_thenOK(){ + NoticeMessage firstMessage = repo.findById(FIRST_MESSAGE_ID); + assertNotNull(firstMessage); + assertEquals(FIRST_MESSAGE_ID,firstMessage.getId()); + + firstMessage.setContent(EDITTED_CONTENT); + repo.save(firstMessage); + + NoticeMessage editedFirstMessage = repo.findById(FIRST_MESSAGE_ID); + assertNotNull(editedFirstMessage); + assertEquals(FIRST_MESSAGE_ID,editedFirstMessage.getId()); + assertEquals(EDITTED_CONTENT,editedFirstMessage.getContent()); + } + + @Test + @WithMockUser(username="hr") + public void givenUsernameHr_whenFindMessageById2_thenOK(){ + NoticeMessage secondMessage = repo.findById(SECOND_MESSAGE_ID); + assertNotNull(secondMessage); + assertEquals(SECOND_MESSAGE_ID,secondMessage.getId()); + } + + @Test(expected=AccessDeniedException.class) + @WithMockUser(username="hr") + public void givenUsernameHr_whenUpdateMessageWithId2_thenFail(){ + NoticeMessage secondMessage = new NoticeMessage(); + secondMessage.setId(SECOND_MESSAGE_ID); + secondMessage.setContent(EDITTED_CONTENT); + repo.save(secondMessage); + } + + @Test + @WithMockUser(roles={"EDITOR"}) + public void givenRoleEditor_whenFindAllMessage_thenReturnThreeMessage(){ + List details = repo.findAll(); + assertNotNull(details); + assertEquals(3,details.size()); + } + + @Test + @WithMockUser(roles={"EDITOR"}) + public void givenRoleEditor_whenUpdateThirdMessage_thenOK(){ + NoticeMessage thirdMessage = new NoticeMessage(); + thirdMessage.setId(THIRD_MESSAGE_ID); + thirdMessage.setContent(EDITTED_CONTENT); + repo.save(thirdMessage); + } + + @Test(expected=AccessDeniedException.class) + @WithMockUser(roles={"EDITOR"}) + public void givenRoleEditor_whenFindFirstMessageByIdAndUpdateFirstMessageContent_thenFail(){ + NoticeMessage firstMessage = repo.findById(FIRST_MESSAGE_ID); + assertNotNull(firstMessage); + assertEquals(FIRST_MESSAGE_ID,firstMessage.getId()); + firstMessage.setContent(EDITTED_CONTENT); + repo.save(firstMessage); + } +} + \ No newline at end of file From 37d13ac4f5d8fa44edd33862b258bd3df05d4fd0 Mon Sep 17 00:00:00 2001 From: Jose Carvajal Date: Fri, 1 Dec 2017 08:43:20 +0100 Subject: [PATCH 121/236] BAEL-1174: A Quick Guide to Spring Cloud Consul --- core-java/src/main/resources/countries.properties | 6 +++--- spring-cloud/pom.xml | 1 + spring-cloud/spring-cloud-stream/pom.xml | 1 - undertow/dependency-reduced-pom.xml | 2 +- xml/src/test/resources/example_dom4j_new.xml | 10 ---------- xml/src/test/resources/example_jaxb_new.xml | 9 --------- 6 files changed, 5 insertions(+), 24 deletions(-) delete mode 100644 xml/src/test/resources/example_dom4j_new.xml delete mode 100644 xml/src/test/resources/example_jaxb_new.xml diff --git a/core-java/src/main/resources/countries.properties b/core-java/src/main/resources/countries.properties index 3c1f53aded..e743b5a40b 100644 --- a/core-java/src/main/resources/countries.properties +++ b/core-java/src/main/resources/countries.properties @@ -1,3 +1,3 @@ -UK -US -Germany +UK +US +Germany diff --git a/spring-cloud/pom.xml b/spring-cloud/pom.xml index e6d78f292d..d11455f90c 100644 --- a/spring-cloud/pom.xml +++ b/spring-cloud/pom.xml @@ -19,6 +19,7 @@ spring-cloud-stream spring-cloud-connectors-heroku spring-cloud-aws + spring-cloud-consul pom diff --git a/spring-cloud/spring-cloud-stream/pom.xml b/spring-cloud/spring-cloud-stream/pom.xml index 1666a440b9..5ec24268d9 100644 --- a/spring-cloud/spring-cloud-stream/pom.xml +++ b/spring-cloud/spring-cloud-stream/pom.xml @@ -6,7 +6,6 @@ org.baeldung spring-cloud-stream - pom spring-cloud-stream diff --git a/undertow/dependency-reduced-pom.xml b/undertow/dependency-reduced-pom.xml index 6481c51285..e8fcd39fbb 100644 --- a/undertow/dependency-reduced-pom.xml +++ b/undertow/dependency-reduced-pom.xml @@ -36,4 +36,4 @@ 1.8 1.8 - \ No newline at end of file + diff --git a/xml/src/test/resources/example_dom4j_new.xml b/xml/src/test/resources/example_dom4j_new.xml deleted file mode 100644 index 020760fdd3..0000000000 --- a/xml/src/test/resources/example_dom4j_new.xml +++ /dev/null @@ -1,10 +0,0 @@ - - - - - XML with Dom4J - XML handling with Dom4J - 14/06/2016 - Dom4J tech writer - - diff --git a/xml/src/test/resources/example_jaxb_new.xml b/xml/src/test/resources/example_jaxb_new.xml deleted file mode 100644 index 646d938869..0000000000 --- a/xml/src/test/resources/example_jaxb_new.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - - Jaxb author - 04/02/2015 - XML Binding with Jaxb - XML with Jaxb - - From b6b3c476a749430b1bf4c6d7532b96909a50f732 Mon Sep 17 00:00:00 2001 From: Jose Carvajal Date: Fri, 1 Dec 2017 08:47:37 +0100 Subject: [PATCH 122/236] Update dependency-reduced-pom.xml From 978d5e630a68a40ca1e1cf92436fb77cc3604143 Mon Sep 17 00:00:00 2001 From: Jose Carvajal Date: Fri, 1 Dec 2017 08:48:36 +0100 Subject: [PATCH 123/236] BAEL-1174: A Quick Guide to Spring Cloud Consul --- ...ipleOutputsServiceApplicationUnitTest.java | 52 ------------------- ...eOutputsWithConditionsServiceUnitTest.java | 52 ------------------- .../rabbit/MyLoggerApplicationUnitTest.java | 40 -------------- undertow/dependency-reduced-pom.xml | 1 + 4 files changed, 1 insertion(+), 144 deletions(-) delete mode 100644 spring-cloud/spring-cloud-stream/spring-cloud-stream-rabbit/src/test/java/com/baeldung/spring/cloud/stream/rabbit/MultipleOutputsServiceApplicationUnitTest.java delete mode 100644 spring-cloud/spring-cloud-stream/spring-cloud-stream-rabbit/src/test/java/com/baeldung/spring/cloud/stream/rabbit/MultipleOutputsWithConditionsServiceUnitTest.java delete mode 100644 spring-cloud/spring-cloud-stream/spring-cloud-stream-rabbit/src/test/java/com/baeldung/spring/cloud/stream/rabbit/MyLoggerApplicationUnitTest.java diff --git a/spring-cloud/spring-cloud-stream/spring-cloud-stream-rabbit/src/test/java/com/baeldung/spring/cloud/stream/rabbit/MultipleOutputsServiceApplicationUnitTest.java b/spring-cloud/spring-cloud-stream/spring-cloud-stream-rabbit/src/test/java/com/baeldung/spring/cloud/stream/rabbit/MultipleOutputsServiceApplicationUnitTest.java deleted file mode 100644 index 225ed73ff7..0000000000 --- a/spring-cloud/spring-cloud-stream/spring-cloud-stream-rabbit/src/test/java/com/baeldung/spring/cloud/stream/rabbit/MultipleOutputsServiceApplicationUnitTest.java +++ /dev/null @@ -1,52 +0,0 @@ -package com.baeldung.spring.cloud.stream.rabbit; - -import static org.junit.Assert.assertEquals; - -import org.junit.Test; -import org.junit.runner.RunWith; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.cloud.stream.test.binder.MessageCollector; -import org.springframework.messaging.MessageChannel; -import org.springframework.messaging.support.MessageBuilder; -import org.springframework.test.annotation.DirtiesContext; -import org.springframework.test.context.ContextConfiguration; -import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; - -import com.baeldung.spring.cloud.stream.rabbit.processor.MyProcessor; - -@RunWith(SpringJUnit4ClassRunner.class) -@ContextConfiguration(classes = MultipleOutputsServiceApplication.class) -@DirtiesContext -public class MultipleOutputsServiceApplicationUnitTest { - - @Autowired - private MyProcessor pipe; - - @Autowired - private MessageCollector messageCollector; - - @Test - public void whenSendMessage_thenResponseIsInAOutput() { - whenSendMessage(1); - thenPayloadInChannelIs(pipe.anOutput(), 1); - } - - @Test - public void whenSendMessage_thenResponseIsInAnotherOutput() { - whenSendMessage(11); - thenPayloadInChannelIs(pipe.anotherOutput(), 11); - } - - private void whenSendMessage(Integer val) { - pipe.myInput() - .send(MessageBuilder.withPayload(val) - .build()); - } - - private void thenPayloadInChannelIs(MessageChannel channel, Integer expectedValue) { - Object payload = messageCollector.forChannel(channel) - .poll() - .getPayload(); - assertEquals(expectedValue, payload); - } -} diff --git a/spring-cloud/spring-cloud-stream/spring-cloud-stream-rabbit/src/test/java/com/baeldung/spring/cloud/stream/rabbit/MultipleOutputsWithConditionsServiceUnitTest.java b/spring-cloud/spring-cloud-stream/spring-cloud-stream-rabbit/src/test/java/com/baeldung/spring/cloud/stream/rabbit/MultipleOutputsWithConditionsServiceUnitTest.java deleted file mode 100644 index 8628b209cb..0000000000 --- a/spring-cloud/spring-cloud-stream/spring-cloud-stream-rabbit/src/test/java/com/baeldung/spring/cloud/stream/rabbit/MultipleOutputsWithConditionsServiceUnitTest.java +++ /dev/null @@ -1,52 +0,0 @@ -package com.baeldung.spring.cloud.stream.rabbit; - -import static org.junit.Assert.assertEquals; - -import org.junit.Test; -import org.junit.runner.RunWith; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.cloud.stream.test.binder.MessageCollector; -import org.springframework.messaging.MessageChannel; -import org.springframework.messaging.support.MessageBuilder; -import org.springframework.test.annotation.DirtiesContext; -import org.springframework.test.context.ContextConfiguration; -import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; - -import com.baeldung.spring.cloud.stream.rabbit.processor.MyProcessor; - -@RunWith(SpringJUnit4ClassRunner.class) -@ContextConfiguration(classes = MultipleOutputsWithConditionsServiceApplication.class) -@DirtiesContext -public class MultipleOutputsWithConditionsServiceUnitTest { - - @Autowired - private MyProcessor pipe; - - @Autowired - private MessageCollector messageCollector; - - @Test - public void whenSendMessage_thenResponseIsInAOutput() { - whenSendMessage(1); - thenPayloadInChannelIs(pipe.anOutput(), 1); - } - - @Test - public void whenSendMessage_thenResponseIsInAnotherOutput() { - whenSendMessage(11); - thenPayloadInChannelIs(pipe.anotherOutput(), 11); - } - - private void whenSendMessage(Integer val) { - pipe.myInput() - .send(MessageBuilder.withPayload(val) - .build()); - } - - private void thenPayloadInChannelIs(MessageChannel channel, Integer expectedValue) { - Object payload = messageCollector.forChannel(channel) - .poll() - .getPayload(); - assertEquals(expectedValue, payload); - } -} diff --git a/spring-cloud/spring-cloud-stream/spring-cloud-stream-rabbit/src/test/java/com/baeldung/spring/cloud/stream/rabbit/MyLoggerApplicationUnitTest.java b/spring-cloud/spring-cloud-stream/spring-cloud-stream-rabbit/src/test/java/com/baeldung/spring/cloud/stream/rabbit/MyLoggerApplicationUnitTest.java deleted file mode 100644 index 1541af3cb5..0000000000 --- a/spring-cloud/spring-cloud-stream/spring-cloud-stream-rabbit/src/test/java/com/baeldung/spring/cloud/stream/rabbit/MyLoggerApplicationUnitTest.java +++ /dev/null @@ -1,40 +0,0 @@ -package com.baeldung.spring.cloud.stream.rabbit; - -import static org.junit.Assert.assertEquals; - -import org.junit.Test; -import org.junit.runner.RunWith; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.cloud.stream.messaging.Processor; -import org.springframework.cloud.stream.test.binder.MessageCollector; -import org.springframework.messaging.support.MessageBuilder; -import org.springframework.test.annotation.DirtiesContext; -import org.springframework.test.context.ContextConfiguration; -import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; - -import com.baeldung.spring.cloud.stream.rabbit.model.LogMessage; - -@RunWith(SpringJUnit4ClassRunner.class) -@ContextConfiguration(classes = MyLoggerServiceApplication.class) -@DirtiesContext -public class MyLoggerApplicationUnitTest { - - @Autowired - private Processor pipe; - - @Autowired - private MessageCollector messageCollector; - - @Test - public void whenSendMessage_thenResponseShouldUpdateText() { - pipe.input() - .send(MessageBuilder.withPayload(new LogMessage("This is my message")) - .build()); - - Object payload = messageCollector.forChannel(pipe.output()) - .poll() - .getPayload(); - - assertEquals("[1]: This is my message", payload.toString()); - } -} diff --git a/undertow/dependency-reduced-pom.xml b/undertow/dependency-reduced-pom.xml index e8fcd39fbb..0654c82b74 100644 --- a/undertow/dependency-reduced-pom.xml +++ b/undertow/dependency-reduced-pom.xml @@ -37,3 +37,4 @@ 1.8 + From a94f98b63194deb3e204bd454b9eb829c18ab4bb Mon Sep 17 00:00:00 2001 From: Yasin Date: Fri, 1 Dec 2017 14:10:03 +0530 Subject: [PATCH 124/236] BAEL-1334 Guide to Hibernate Spatial (#3139) * BAEL-1334 Guide to Hibernate Spatial * BAEL-1334 Guide to Hibernate Spatial Moving the files to hibernate5 from libraries * Reverting the pom file --- hibernate5/pom.xml | 22 ++++- .../com/baeldung/hibernate/HibernateUtil.java | 14 ++- .../baeldung/hibernate/pojo/PointEntity.java | 41 ++++++++ .../hibernate/HibernateSpatialTest.java | 97 +++++++++++++++++++ .../resources/hibernate-spatial.properties | 10 ++ 5 files changed, 179 insertions(+), 5 deletions(-) create mode 100644 hibernate5/src/main/java/com/baeldung/hibernate/pojo/PointEntity.java create mode 100644 hibernate5/src/test/java/com/baeldung/hibernate/HibernateSpatialTest.java create mode 100644 hibernate5/src/test/resources/hibernate-spatial.properties diff --git a/hibernate5/pom.xml b/hibernate5/pom.xml index 8543d1dae3..3b0b2fcd88 100644 --- a/hibernate5/pom.xml +++ b/hibernate5/pom.xml @@ -17,12 +17,15 @@ UTF-8 3.6.0 - + 5.2.12.Final + 6.0.6 + 2.2.3 + org.hibernate hibernate-core - 5.2.12.Final + ${hibernate.version} junit @@ -40,6 +43,21 @@ h2 1.4.194 + + org.hibernate + hibernate-spatial + ${hibernate.version} + + + mysql + mysql-connector-java + ${mysql.version} + + + ch.vorburger.mariaDB4j + mariaDB4j + ${mariaDB4j.version} + hibernate5 diff --git a/hibernate5/src/main/java/com/baeldung/hibernate/HibernateUtil.java b/hibernate5/src/main/java/com/baeldung/hibernate/HibernateUtil.java index c3bf8c2aa9..f1fc22d29a 100644 --- a/hibernate5/src/main/java/com/baeldung/hibernate/HibernateUtil.java +++ b/hibernate5/src/main/java/com/baeldung/hibernate/HibernateUtil.java @@ -5,6 +5,7 @@ import com.baeldung.hibernate.pojo.EntityDescription; import com.baeldung.hibernate.pojo.OrderEntry; import com.baeldung.hibernate.pojo.OrderEntryIdClass; import com.baeldung.hibernate.pojo.OrderEntryPK; +import com.baeldung.hibernate.pojo.PointEntity; import com.baeldung.hibernate.pojo.Product; import com.baeldung.hibernate.pojo.Phone; import com.baeldung.hibernate.pojo.TemporalValues; @@ -23,6 +24,7 @@ import com.baeldung.hibernate.pojo.inheritance.Person; import com.baeldung.hibernate.pojo.inheritance.Pet; import com.baeldung.hibernate.pojo.inheritance.Vehicle; +import org.apache.commons.lang3.StringUtils; import org.hibernate.SessionFactory; import org.hibernate.boot.Metadata; import org.hibernate.boot.MetadataSources; @@ -36,8 +38,14 @@ import java.util.Properties; public class HibernateUtil { private static SessionFactory sessionFactory; + private static String PROPERTY_FILE_NAME; public static SessionFactory getSessionFactory() throws IOException { + return getSessionFactory(null); + } + + public static SessionFactory getSessionFactory(String propertyFileName) throws IOException { + PROPERTY_FILE_NAME = propertyFileName; if (sessionFactory == null) { ServiceRegistry serviceRegistry = configureServiceRegistry(); sessionFactory = makeSessionFactory(serviceRegistry); @@ -70,6 +78,7 @@ public class HibernateUtil { metadataSources.addAnnotatedClass(Vehicle.class); metadataSources.addAnnotatedClass(Car.class); metadataSources.addAnnotatedClass(Bag.class); + metadataSources.addAnnotatedClass(PointEntity.class); Metadata metadata = metadataSources.buildMetadata(); return metadata.getSessionFactoryBuilder() @@ -86,12 +95,11 @@ public class HibernateUtil { private static Properties getProperties() throws IOException { Properties properties = new Properties(); URL propertiesURL = Thread.currentThread() - .getContextClassLoader() - .getResource("hibernate.properties"); + .getContextClassLoader() + .getResource(StringUtils.defaultString(PROPERTY_FILE_NAME, "hibernate.properties")); try (FileInputStream inputStream = new FileInputStream(propertiesURL.getFile())) { properties.load(inputStream); } return properties; } - } \ No newline at end of file diff --git a/hibernate5/src/main/java/com/baeldung/hibernate/pojo/PointEntity.java b/hibernate5/src/main/java/com/baeldung/hibernate/pojo/PointEntity.java new file mode 100644 index 0000000000..223f5dcbde --- /dev/null +++ b/hibernate5/src/main/java/com/baeldung/hibernate/pojo/PointEntity.java @@ -0,0 +1,41 @@ +package com.baeldung.hibernate.pojo; + +import com.vividsolutions.jts.geom.Point; + +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.Id; + +@Entity +public class PointEntity { + + @Id + @GeneratedValue + private Long id; + + private Point point; + + public PointEntity() { + } + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public Point getPoint() { + return point; + } + + public void setPoint(Point point) { + this.point = point; + } + + @Override + public String toString() { + return "PointEntity{" + "id=" + id + ", point=" + point + '}'; + } +} diff --git a/hibernate5/src/test/java/com/baeldung/hibernate/HibernateSpatialTest.java b/hibernate5/src/test/java/com/baeldung/hibernate/HibernateSpatialTest.java new file mode 100644 index 0000000000..6d0aa0a4cd --- /dev/null +++ b/hibernate5/src/test/java/com/baeldung/hibernate/HibernateSpatialTest.java @@ -0,0 +1,97 @@ +package com.baeldung.hibernate; + +import com.baeldung.hibernate.pojo.PointEntity; +import com.vividsolutions.jts.geom.Geometry; +import com.vividsolutions.jts.geom.Point; +import com.vividsolutions.jts.io.ParseException; +import com.vividsolutions.jts.io.WKTReader; +import org.hibernate.Session; +import org.hibernate.Transaction; +import org.junit.After; +import org.junit.Before; +import org.junit.Test; + +import javax.persistence.Query; +import java.io.IOException; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertTrue; + +public class HibernateSpatialTest { + + private Session session; + private Transaction transaction; + + @Before + public void setUp() throws IOException { + session = HibernateUtil.getSessionFactory("hibernate-spatial.properties") + .openSession(); + transaction = session.beginTransaction(); + } + + @After + public void tearDown() { + transaction.rollback(); + session.close(); + } + + @Test + public void shouldConvertWktToGeometry() throws ParseException { + Geometry geometry = wktToGeometry("POINT (2 5)"); + assertEquals("Point", geometry.getGeometryType()); + assertTrue(geometry instanceof Point); + } + + @Test + public void shouldInsertAndSelectPoints() throws ParseException { + PointEntity entity = new PointEntity(); + entity.setPoint((Point) wktToGeometry("POINT (1 1)")); + + session.persist(entity); + PointEntity fromDb = session.find(PointEntity.class, entity.getId()); + assertEquals("POINT (1 1)", fromDb.getPoint().toString()); + } + + @Test + public void shouldSelectDisjointPoints() throws ParseException { + insertPoint("POINT (1 2)"); + insertPoint("POINT (3 4)"); + insertPoint("POINT (5 6)"); + + Point point = (Point) wktToGeometry("POINT (3 4)"); + Query query = session.createQuery("select p from PointEntity p " + + "where disjoint(p.point, :point) = true", PointEntity.class); + query.setParameter("point", point); + assertEquals("POINT (1 2)", ((PointEntity) query.getResultList().get(0)).getPoint().toString()); + assertEquals("POINT (5 6)", ((PointEntity) query.getResultList().get(1)).getPoint().toString()); + } + + @Test + public void shouldSelectAllPointsWithinPolygon() throws ParseException { + insertPoint("POINT (1 1)"); + insertPoint("POINT (1 2)"); + insertPoint("POINT (3 4)"); + insertPoint("POINT (5 6)"); + + Query query = session.createQuery("select p from PointEntity p where within(p.point, :area) = true", + PointEntity.class); + query.setParameter("area", wktToGeometry("POLYGON((0 0, 0 5, 5 5, 5 0, 0 0))")); + assertEquals(3, query.getResultList().size()); + assertEquals("POINT (1 1)", ((PointEntity) query.getResultList().get(0)).getPoint().toString()); + assertEquals("POINT (1 2)", ((PointEntity) query.getResultList().get(1)).getPoint().toString()); + assertEquals("POINT (3 4)", ((PointEntity) query.getResultList().get(2)).getPoint().toString()); + } + + private void insertPoint(String point) throws ParseException { + PointEntity entity = new PointEntity(); + entity.setPoint((Point) wktToGeometry(point)); + session.persist(entity); + } + + private Geometry wktToGeometry(String wellKnownText) throws ParseException { + WKTReader fromText = new WKTReader(); + Geometry geom = null; + geom = fromText.read(wellKnownText); + return geom; + } +} diff --git a/hibernate5/src/test/resources/hibernate-spatial.properties b/hibernate5/src/test/resources/hibernate-spatial.properties new file mode 100644 index 0000000000..e85cd49cc3 --- /dev/null +++ b/hibernate5/src/test/resources/hibernate-spatial.properties @@ -0,0 +1,10 @@ +hibernate.dialect=org.hibernate.spatial.dialect.mysql.MySQL56SpatialDialect +hibernate.connection.driver_class=com.mysql.jdbc.Driver +hibernate.connection.url=jdbc:mysql://localhost:3306/hibernate-spatial +hibernate.connection.username=root +hibernate.connection.password=pass +hibernate.connection.pool_size=5 +hibernate.show_sql=true +hibernate.format_sql=true +hibernate.max_fetch_depth=5 +hibernate.hbm2ddl.auto=create-drop \ No newline at end of file From 5aa0b890d1fcb90bb3d0bf43bb1689ff27dee252 Mon Sep 17 00:00:00 2001 From: Loredana Crusoveanu Date: Fri, 1 Dec 2017 13:34:00 +0200 Subject: [PATCH 125/236] refactor packages --- .../DiscoveryClientApplication.java | 30 +++++++++---------- .../ServiceDiscoveryApplication.java | 2 +- .../DistributedPropertiesApplication.java | 4 +-- .../{ => ribbon}/RibbonClientApplication.java | 14 ++++++--- 4 files changed, 26 insertions(+), 24 deletions(-) rename spring-cloud/spring-cloud-consul/src/main/java/com/baeldung/spring/cloud/consul/{ => discovery}/DiscoveryClientApplication.java (64%) rename spring-cloud/spring-cloud-consul/src/main/java/com/baeldung/spring/cloud/consul/{ => health}/ServiceDiscoveryApplication.java (94%) rename spring-cloud/spring-cloud-consul/src/main/java/com/baeldung/spring/cloud/consul/{ => properties}/DistributedPropertiesApplication.java (90%) rename spring-cloud/spring-cloud-consul/src/main/java/com/baeldung/spring/cloud/consul/{ => ribbon}/RibbonClientApplication.java (74%) diff --git a/spring-cloud/spring-cloud-consul/src/main/java/com/baeldung/spring/cloud/consul/DiscoveryClientApplication.java b/spring-cloud/spring-cloud-consul/src/main/java/com/baeldung/spring/cloud/consul/discovery/DiscoveryClientApplication.java similarity index 64% rename from spring-cloud/spring-cloud-consul/src/main/java/com/baeldung/spring/cloud/consul/DiscoveryClientApplication.java rename to spring-cloud/spring-cloud-consul/src/main/java/com/baeldung/spring/cloud/consul/discovery/DiscoveryClientApplication.java index e5e18d71ff..2dfd08b5c3 100644 --- a/spring-cloud/spring-cloud-consul/src/main/java/com/baeldung/spring/cloud/consul/DiscoveryClientApplication.java +++ b/spring-cloud/spring-cloud-consul/src/main/java/com/baeldung/spring/cloud/consul/discovery/DiscoveryClientApplication.java @@ -1,16 +1,14 @@ -package com.baeldung.spring.cloud.consul; +package com.baeldung.spring.cloud.consul.discovery; import java.net.URI; -import java.util.List; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.builder.SpringApplicationBuilder; -import org.springframework.cloud.client.ServiceInstance; import org.springframework.cloud.client.discovery.DiscoveryClient; import org.springframework.cloud.client.discovery.EnableDiscoveryClient; import org.springframework.context.annotation.Bean; -import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RestController; import org.springframework.web.client.RestTemplate; @@ -24,26 +22,26 @@ public class DiscoveryClientApplication { return new RestTemplate(); } - @Autowired - private RestTemplate restTemplate; - @Autowired private DiscoveryClient discoveryClient; - @RequestMapping("/discoveryClient") + @GetMapping("/discoveryClient") public String home() { - return this.restTemplate.getForEntity(serviceUrl().resolve("/ping"), String.class) + return restTemplate().getForEntity(serviceUrl().resolve("/ping"), String.class) .getBody(); } + + @GetMapping("/ping") + public String ping() { + return "pong"; + } public URI serviceUrl() { - List list = discoveryClient.getInstances("myApp"); - if (list != null && list.size() > 0) { - return list.get(0) - .getUri(); - } - - return null; + return discoveryClient.getInstances("myApp") + .stream() + .findFirst() + .map(si -> si.getUri()) + .orElse(null); } public static void main(String[] args) { diff --git a/spring-cloud/spring-cloud-consul/src/main/java/com/baeldung/spring/cloud/consul/ServiceDiscoveryApplication.java b/spring-cloud/spring-cloud-consul/src/main/java/com/baeldung/spring/cloud/consul/health/ServiceDiscoveryApplication.java similarity index 94% rename from spring-cloud/spring-cloud-consul/src/main/java/com/baeldung/spring/cloud/consul/ServiceDiscoveryApplication.java rename to spring-cloud/spring-cloud-consul/src/main/java/com/baeldung/spring/cloud/consul/health/ServiceDiscoveryApplication.java index 5da8105d01..7db361eb4f 100644 --- a/spring-cloud/spring-cloud-consul/src/main/java/com/baeldung/spring/cloud/consul/ServiceDiscoveryApplication.java +++ b/spring-cloud/spring-cloud-consul/src/main/java/com/baeldung/spring/cloud/consul/health/ServiceDiscoveryApplication.java @@ -1,4 +1,4 @@ -package com.baeldung.spring.cloud.consul; +package com.baeldung.spring.cloud.consul.health; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.builder.SpringApplicationBuilder; diff --git a/spring-cloud/spring-cloud-consul/src/main/java/com/baeldung/spring/cloud/consul/DistributedPropertiesApplication.java b/spring-cloud/spring-cloud-consul/src/main/java/com/baeldung/spring/cloud/consul/properties/DistributedPropertiesApplication.java similarity index 90% rename from spring-cloud/spring-cloud-consul/src/main/java/com/baeldung/spring/cloud/consul/DistributedPropertiesApplication.java rename to spring-cloud/spring-cloud-consul/src/main/java/com/baeldung/spring/cloud/consul/properties/DistributedPropertiesApplication.java index 12ecd96b26..919bf08921 100644 --- a/spring-cloud/spring-cloud-consul/src/main/java/com/baeldung/spring/cloud/consul/DistributedPropertiesApplication.java +++ b/spring-cloud/spring-cloud-consul/src/main/java/com/baeldung/spring/cloud/consul/properties/DistributedPropertiesApplication.java @@ -1,4 +1,4 @@ -package com.baeldung.spring.cloud.consul; +package com.baeldung.spring.cloud.consul.properties; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; @@ -7,8 +7,6 @@ import org.springframework.boot.builder.SpringApplicationBuilder; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; -import com.baeldung.spring.cloud.consul.properties.MyProperties; - @SpringBootApplication @RestController public class DistributedPropertiesApplication { diff --git a/spring-cloud/spring-cloud-consul/src/main/java/com/baeldung/spring/cloud/consul/RibbonClientApplication.java b/spring-cloud/spring-cloud-consul/src/main/java/com/baeldung/spring/cloud/consul/ribbon/RibbonClientApplication.java similarity index 74% rename from spring-cloud/spring-cloud-consul/src/main/java/com/baeldung/spring/cloud/consul/RibbonClientApplication.java rename to spring-cloud/spring-cloud-consul/src/main/java/com/baeldung/spring/cloud/consul/ribbon/RibbonClientApplication.java index 620c3553ba..ca0d23b185 100644 --- a/spring-cloud/spring-cloud-consul/src/main/java/com/baeldung/spring/cloud/consul/RibbonClientApplication.java +++ b/spring-cloud/spring-cloud-consul/src/main/java/com/baeldung/spring/cloud/consul/ribbon/RibbonClientApplication.java @@ -1,10 +1,11 @@ -package com.baeldung.spring.cloud.consul; +package com.baeldung.spring.cloud.consul.ribbon; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.builder.SpringApplicationBuilder; import org.springframework.cloud.client.loadbalancer.LoadBalanced; import org.springframework.context.annotation.Bean; +import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import org.springframework.web.client.RestTemplate; @@ -15,16 +16,21 @@ public class RibbonClientApplication { @LoadBalanced @Bean - public RestTemplate loadbalancedRestTemplate() { + RestTemplate getRestTemplate() { return new RestTemplate(); } - + @Autowired RestTemplate restTemplate; @RequestMapping("/ribbonClient") public String home() { - return this.restTemplate.getForObject("http://myApp/ping", String.class); + return restTemplate.getForObject("http://myApp/ping", String.class); + } + + @GetMapping("/ping") + public String ping() { + return "pong"; } public static void main(String[] args) { From cd14a791d120c1c7cebc1f575ce4027bd45ed37d Mon Sep 17 00:00:00 2001 From: Loredana Crusoveanu Date: Fri, 1 Dec 2017 13:56:44 +0200 Subject: [PATCH 126/236] remove extra word file --- libraries/helloWorld.docx | Bin 76887 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 libraries/helloWorld.docx diff --git a/libraries/helloWorld.docx b/libraries/helloWorld.docx deleted file mode 100644 index a58ff2d80abbfc2881bc7cd799f996a58e58bd0d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 76887 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 AsQ>@~ From 69fc1a02f4482639e991d20bb277b626b4c0e150 Mon Sep 17 00:00:00 2001 From: Loredana Crusoveanu Date: Fri, 1 Dec 2017 14:36:59 +0200 Subject: [PATCH 127/236] fix cas project build --- cas/cas-secured-app/pom.xml | 5 +++++ .../baeldung/cassecuredapp/controllers/AuthController.java | 5 +++-- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/cas/cas-secured-app/pom.xml b/cas/cas-secured-app/pom.xml index 543354e8b3..13fb7ac2cb 100644 --- a/cas/cas-secured-app/pom.xml +++ b/cas/cas-secured-app/pom.xml @@ -57,6 +57,11 @@ spring-security-test test + + org.apache.logging.log4j + log4j-core + 2.10.0 + diff --git a/cas/cas-secured-app/src/main/java/com/baeldung/cassecuredapp/controllers/AuthController.java b/cas/cas-secured-app/src/main/java/com/baeldung/cassecuredapp/controllers/AuthController.java index 703e6abf7a..7faccbb125 100644 --- a/cas/cas-secured-app/src/main/java/com/baeldung/cassecuredapp/controllers/AuthController.java +++ b/cas/cas-secured-app/src/main/java/com/baeldung/cassecuredapp/controllers/AuthController.java @@ -1,6 +1,7 @@ package com.baeldung.cassecuredapp.controllers; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; +import org.apache.logging.log4j.LogManager; import org.springframework.security.core.Authentication; import org.springframework.security.core.context.SecurityContextHolder; import org.springframework.security.web.authentication.logout.CookieClearingLogoutHandler; @@ -15,7 +16,7 @@ import javax.servlet.http.HttpServletResponse; @Controller public class AuthController { - private Logger logger = Logger.getLogger(AuthController.class); + private Logger logger = LogManager.getLogger(AuthController.class); @GetMapping("/logout") public String logout( From 4e61c381e3fdcc67fb9f59efd50d7b359f4ce72b Mon Sep 17 00:00:00 2001 From: Loredana Crusoveanu Date: Fri, 1 Dec 2017 14:43:27 +0200 Subject: [PATCH 128/236] remove extra depedency --- cas/cas-secured-app/pom.xml | 5 ----- 1 file changed, 5 deletions(-) diff --git a/cas/cas-secured-app/pom.xml b/cas/cas-secured-app/pom.xml index 13fb7ac2cb..543354e8b3 100644 --- a/cas/cas-secured-app/pom.xml +++ b/cas/cas-secured-app/pom.xml @@ -57,11 +57,6 @@ spring-security-test test - - org.apache.logging.log4j - log4j-core - 2.10.0 - From c728e9d4a89b00695aeeac6203b4e291d4a3c198 Mon Sep 17 00:00:00 2001 From: Ahmed Tawila Date: Fri, 1 Dec 2017 14:50:22 +0200 Subject: [PATCH 129/236] cleanup --- .../src/test/java/com/baeldung/nestedclass/NewOuter.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/core-java/src/test/java/com/baeldung/nestedclass/NewOuter.java b/core-java/src/test/java/com/baeldung/nestedclass/NewOuter.java index a3a723b30e..260f69fd1b 100644 --- a/core-java/src/test/java/com/baeldung/nestedclass/NewOuter.java +++ b/core-java/src/test/java/com/baeldung/nestedclass/NewOuter.java @@ -14,9 +14,9 @@ public class NewOuter { public void run() { System.out.println("a = " + a); System.out.println("b = " + b); - System.out.println("NewOuterTest.this.a = " + NewOuter.this.a); - System.out.println("NewOuterTest.b = " + NewOuter.b); - System.out.println("NewOuterTest.this.b = " + NewOuter.this.b); + System.out.println("NewOuter.this.a = " + NewOuter.this.a); + System.out.println("NewOuter.b = " + NewOuter.b); + System.out.println("NewOuter.this.b = " + NewOuter.this.b); } } From f00c95f4fc2973ddc0e3cc7b62a259307bc0156d Mon Sep 17 00:00:00 2001 From: Graham Cox Date: Fri, 1 Dec 2017 14:05:24 +0000 Subject: [PATCH 130/236] Examples of writing Extension Methods --- .../com/baeldung/kotlin/ExtensionMethods.kt | 51 +++++++++++++++++++ 1 file changed, 51 insertions(+) create mode 100644 core-kotlin/src/test/kotlin/com/baeldung/kotlin/ExtensionMethods.kt diff --git a/core-kotlin/src/test/kotlin/com/baeldung/kotlin/ExtensionMethods.kt b/core-kotlin/src/test/kotlin/com/baeldung/kotlin/ExtensionMethods.kt new file mode 100644 index 0000000000..09ce898860 --- /dev/null +++ b/core-kotlin/src/test/kotlin/com/baeldung/kotlin/ExtensionMethods.kt @@ -0,0 +1,51 @@ +package com.baeldung.kotlin + +import org.junit.Assert +import org.junit.Test + +class ExtensionMethods { + @Test + fun simpleExtensionMethod() { + fun String.escapeForXml() : String { + return this + .replace("&", "&") + .replace("<", "<") + .replace(">", ">") + } + + Assert.assertEquals("Nothing", "Nothing".escapeForXml()) + Assert.assertEquals("<Tag>", "".escapeForXml()) + Assert.assertEquals("a&b", "a&b".escapeForXml()) + } + + @Test + fun genericExtensionMethod() { + fun T.concatAsString(b: T) : String { + return this.toString() + b.toString() + } + + Assert.assertEquals("12", "1".concatAsString("2")) + Assert.assertEquals("12", 1.concatAsString(2)) + // This doesn't compile + // Assert.assertEquals("12", 1.concatAsString(2.0)) + } + + @Test + fun infixExtensionMethod() { + infix fun Number.toPowerOf(exponent: Number): Double { + return Math.pow(this.toDouble(), exponent.toDouble()) + } + + Assert.assertEquals(9.0, 3 toPowerOf 2, 0.1) + Assert.assertEquals(3.0, 9 toPowerOf 0.5, 0.1) + } + + @Test + fun operatorExtensionMethod() { + operator fun List.times(by: Int): List { + return this.map { it * by } + } + + Assert.assertEquals(listOf(2, 4, 6), listOf(1, 2, 3) * 2) + } +} From bdf881701c8676714301b5865fdc1b3bddc8b32a Mon Sep 17 00:00:00 2001 From: Loredana Crusoveanu Date: Fri, 1 Dec 2017 16:11:07 +0200 Subject: [PATCH 131/236] add headers ex --- core-java-9/run-httpclient.bat | 1 + .../com/baeldung/httpclient/HttpClientExample.java | 7 ++++--- 2 files changed, 5 insertions(+), 3 deletions(-) create mode 100644 core-java-9/run-httpclient.bat diff --git a/core-java-9/run-httpclient.bat b/core-java-9/run-httpclient.bat new file mode 100644 index 0000000000..60b1eb7f68 --- /dev/null +++ b/core-java-9/run-httpclient.bat @@ -0,0 +1 @@ +java --module-path mods -m com.baeldung.httpclient/com.baeldung.httpclient.HttpClientExample \ No newline at end of file diff --git a/core-java-9/src/modules/com.baeldung.httpclient/com/baeldung/httpclient/HttpClientExample.java b/core-java-9/src/modules/com.baeldung.httpclient/com/baeldung/httpclient/HttpClientExample.java index 44c55715c7..de08c2164e 100644 --- a/core-java-9/src/modules/com.baeldung.httpclient/com/baeldung/httpclient/HttpClientExample.java +++ b/core-java-9/src/modules/com.baeldung.httpclient/com/baeldung/httpclient/HttpClientExample.java @@ -28,7 +28,7 @@ public class HttpClientExample { public static void main(String[] args) throws Exception { httpGetRequest(); - httpPosttRequest(); + httpPostRequest(); asynchronousRequest(); asynchronousMultipleRequests(); } @@ -36,14 +36,15 @@ public class HttpClientExample { public static void httpGetRequest() throws URISyntaxException, IOException, InterruptedException { HttpClient client = HttpClient.newHttpClient(); URI httpURI = new URI("http://jsonplaceholder.typicode.com/posts/1"); - HttpRequest request = HttpRequest.newBuilder(httpURI).GET().build(); + HttpRequest request = HttpRequest.newBuilder(httpURI).GET() + .headers("Accept-Enconding", "gzip, deflate").build(); HttpResponse response = client.send(request, HttpResponse.BodyHandler.asString()); String responseBody = response.body(); int responseStatusCode = response.statusCode(); System.out.println(responseBody); } - public static void httpPosttRequest() throws URISyntaxException, IOException, InterruptedException { + public static void httpPostRequest() throws URISyntaxException, IOException, InterruptedException { HttpClient client = HttpClient .newBuilder() .build(); From 1f7572884b8fac46762ff4d0c7977510d230ce15 Mon Sep 17 00:00:00 2001 From: Jose Carvajal Date: Fri, 1 Dec 2017 16:56:34 +0100 Subject: [PATCH 132/236] BAEL-1174: A Quick Guide to Spring Cloud Consul: Fix Ribbon client sasd a --- .../consul/discovery/DiscoveryClientApplication.java | 10 +++++++++- .../cloud/consul/ribbon/RibbonClientApplication.java | 11 +++++++++-- 2 files changed, 18 insertions(+), 3 deletions(-) diff --git a/spring-cloud/spring-cloud-consul/src/main/java/com/baeldung/spring/cloud/consul/discovery/DiscoveryClientApplication.java b/spring-cloud/spring-cloud-consul/src/main/java/com/baeldung/spring/cloud/consul/discovery/DiscoveryClientApplication.java index 2dfd08b5c3..b4f42219a4 100644 --- a/spring-cloud/spring-cloud-consul/src/main/java/com/baeldung/spring/cloud/consul/discovery/DiscoveryClientApplication.java +++ b/spring-cloud/spring-cloud-consul/src/main/java/com/baeldung/spring/cloud/consul/discovery/DiscoveryClientApplication.java @@ -8,7 +8,10 @@ import org.springframework.boot.builder.SpringApplicationBuilder; import org.springframework.cloud.client.discovery.DiscoveryClient; import org.springframework.cloud.client.discovery.EnableDiscoveryClient; import org.springframework.context.annotation.Bean; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import org.springframework.web.client.RestTemplate; @@ -30,12 +33,17 @@ public class DiscoveryClientApplication { return restTemplate().getForEntity(serviceUrl().resolve("/ping"), String.class) .getBody(); } - + @GetMapping("/ping") public String ping() { return "pong"; } + @RequestMapping("/my-health-check") + public ResponseEntity myCustomCheck() { + return new ResponseEntity<>(HttpStatus.OK); + } + public URI serviceUrl() { return discoveryClient.getInstances("myApp") .stream() diff --git a/spring-cloud/spring-cloud-consul/src/main/java/com/baeldung/spring/cloud/consul/ribbon/RibbonClientApplication.java b/spring-cloud/spring-cloud-consul/src/main/java/com/baeldung/spring/cloud/consul/ribbon/RibbonClientApplication.java index ca0d23b185..b2b54fbe8e 100644 --- a/spring-cloud/spring-cloud-consul/src/main/java/com/baeldung/spring/cloud/consul/ribbon/RibbonClientApplication.java +++ b/spring-cloud/spring-cloud-consul/src/main/java/com/baeldung/spring/cloud/consul/ribbon/RibbonClientApplication.java @@ -5,6 +5,8 @@ import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.builder.SpringApplicationBuilder; import org.springframework.cloud.client.loadbalancer.LoadBalanced; import org.springframework.context.annotation.Bean; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; @@ -19,7 +21,7 @@ public class RibbonClientApplication { RestTemplate getRestTemplate() { return new RestTemplate(); } - + @Autowired RestTemplate restTemplate; @@ -27,12 +29,17 @@ public class RibbonClientApplication { public String home() { return restTemplate.getForObject("http://myApp/ping", String.class); } - + @GetMapping("/ping") public String ping() { return "pong"; } + @RequestMapping("/my-health-check") + public ResponseEntity myCustomCheck() { + return new ResponseEntity<>(HttpStatus.OK); + } + public static void main(String[] args) { new SpringApplicationBuilder(RibbonClientApplication.class).web(true) .run(args); From 39fb51e63d1471dde1d89b0c0ecb045545b17a6f Mon Sep 17 00:00:00 2001 From: daoire Date: Fri, 1 Dec 2017 16:06:12 +0000 Subject: [PATCH 133/236] Update README.md --- spring-5/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/spring-5/README.md b/spring-5/README.md index 15e12cb5dc..1b65d01811 100644 --- a/spring-5/README.md +++ b/spring-5/README.md @@ -10,4 +10,4 @@ The "REST With Spring" Classes: http://bit.ly/restwithspring - [Exploring the Spring 5 MVC URL Matching Improvements](http://www.baeldung.com/spring-5-mvc-url-matching) - [Spring 5 WebClient](http://www.baeldung.com/spring-5-webclient) - [Spring 5 Functional Bean Registration](http://www.baeldung.com/spring-5-functional-beans) - +- [The SpringJUnitConfig and SpringJUnitWebConfig Annotations in Spring 5](http://www.baeldung.com/spring-5-junit-config) From b7a86b1b5644c4fa648d6a99a06d6b7cadc5ce31 Mon Sep 17 00:00:00 2001 From: Michael C Good <31810784+michaelcgood@users.noreply.github.com> Date: Fri, 1 Dec 2017 13:28:09 -0500 Subject: [PATCH 134/236] BAEL-1341 JDBC RowSet Interface (#3175) * michael.good703@gmail.com michael.good703@gmail.com * michael.good703@gmail.com michael.good703@gmail.com * michael.good703@gmail.com michael.good703@gmail.com * update * michael.good703@gmail.com Had to add @SpringBootApplication(exclude = MySQLAutoconfiguration.class) * Updated for 3.3.0.Final BAEL-1238 * Update pom.xml * BAEL-1238 Added new module spring-boot-keycloak and removed Keycloak code from spring-boot module * Minor changes to pom.xml * Update CustomConverterTest.java * Update StringToEmployeeConverter.java * Update GenericBigDecimalConverter.java * Update MyFeatures.java * Update .gitignore * Formatting changes * "Resolving conflicts" * Updated spring-boot to remove keycloak * Updated to see * Update * Updated * Found remnant file and deleted it * Update pom.xml Added spring-boot-keycloak module * Added reference to parent-boot-5 I changed the parent from org.springframework.boot to parent-boot-5. * Update GenericBigDecimalConverter.java Copy current GenericBigDecimalConverter to resolve any conflicts * Update StringToEmployeeConverter.java Copy current version to resolve any conflicts * Update pom.xml * Update pom.xml * Delete remnant files * Updated pom.xml * Update pom.xml * BAEL-1341 JDBC RowSet Interface This commit includes the main package and test package to accompany the tutorial JDBC RowSet Interface. * Update pom.xml * Changed from MySQL to h2 Changed MySQL to embedded database for ease of use. --- core-java/customers.xml | 95 ++ core-java/pom.xml | 921 +++++++++--------- .../jdbcrowset/DatabaseConfiguration.java | 51 + .../baeldung/jdbcrowset/ExampleListener.java | 24 + .../baeldung/jdbcrowset/FilterExample.java | 46 + .../jdbcrowset/JdbcRowsetApplication.java | 139 +++ .../baeldung/jdbcrowset/JdbcRowSetTest.java | 157 +++ 7 files changed, 981 insertions(+), 452 deletions(-) create mode 100644 core-java/customers.xml create mode 100644 core-java/src/main/java/com/baeldung/jdbcrowset/DatabaseConfiguration.java create mode 100644 core-java/src/main/java/com/baeldung/jdbcrowset/ExampleListener.java create mode 100644 core-java/src/main/java/com/baeldung/jdbcrowset/FilterExample.java create mode 100644 core-java/src/main/java/com/baeldung/jdbcrowset/JdbcRowsetApplication.java create mode 100644 core-java/src/test/java/com/baeldung/jdbcrowset/JdbcRowSetTest.java diff --git a/core-java/customers.xml b/core-java/customers.xml new file mode 100644 index 0000000000..b52dc27633 --- /dev/null +++ b/core-java/customers.xml @@ -0,0 +1,95 @@ + + + + SELECT * FROM customers + 1008 + + true + 1000 + 0 + 2 + + + + + 0 + 0 + 0 + true + ResultSet.TYPE_SCROLL_INSENSITIVE + false + customers + jdbc:h2:mem:testdb + + com.sun.rowset.providers.RIOptimisticProvider + Oracle Corporation + 1.0 + 2 + 1 + + + + 2 + + 1 + false + true + false + 0 + true + true + 11 + ID + ID + PUBLIC + 10 + 0 + CUSTOMERS + TESTDB + 4 + INTEGER + + + 2 + false + true + false + 0 + true + true + 50 + NAME + NAME + PUBLIC + 50 + 0 + CUSTOMERS + TESTDB + 12 + VARCHAR + + + + + 1 + Customer1 + + + 2 + Customer2 + + + 3 + Customer3 + + + 4 + Customer4 + + + 5 + Customer5 + + + diff --git a/core-java/pom.xml b/core-java/pom.xml index 2c4cbfc37b..068a772c43 100644 --- a/core-java/pom.xml +++ b/core-java/pom.xml @@ -1,479 +1,496 @@ - 4.0.0 - com.baeldung - core-java - 0.1.0-SNAPSHOT - jar + xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> + 4.0.0 + com.baeldung + core-java + 0.1.0-SNAPSHOT + jar - core-java + core-java - + - - - net.sourceforge.collections - collections-generic - ${collections-generic.version} - - - com.google.guava - guava - ${guava.version} - - - - org.apache.commons - commons-collections4 - ${commons-collections4.version} - - - - commons-io - commons-io - ${commons-io.version} - - - - org.apache.commons - commons-lang3 - ${commons-lang3.version} - - - - org.apache.commons - commons-math3 - ${commons-math3.version} - - - - org.decimal4j - decimal4j - ${decimal4j.version} - - - - org.bouncycastle - bcprov-jdk15on - ${bouncycastle.version} - - - - org.unix4j - unix4j-command - ${unix4j.version} - - - - com.googlecode.grep4j - grep4j - ${grep4j.version} - - - - - - - com.fasterxml.jackson.core - jackson-databind - ${jackson.version} - - - - - log4j - log4j - 1.2.17 - - - org.slf4j - slf4j-api - ${org.slf4j.version} - - - ch.qos.logback - logback-classic - ${logback.version} - - - - org.slf4j - jcl-over-slf4j - ${org.slf4j.version} - - - - org.slf4j - log4j-over-slf4j - ${org.slf4j.version} - - - org.projectlombok - lombok - ${lombok.version} - provided - - - - - - org.hamcrest - hamcrest-all - 1.3 - test - - - - junit - junit - ${junit.version} - test - - - - org.hamcrest - hamcrest-core - ${org.hamcrest.version} - test - - - org.hamcrest - hamcrest-library - ${org.hamcrest.version} - test - - - - org.assertj - assertj-core - ${assertj.version} - test - - - - org.mockito - mockito-core - ${mockito.version} - test - - - com.jayway.awaitility - awaitility - ${avaitility.version} - test - - - - commons-codec - commons-codec - ${commons-codec.version} - - - - org.javamoney - moneta - 1.1 - - - - org.owasp.esapi - esapi - 2.1.0.1 - - - - com.codepoetics - protonpack - ${protonpack.version} - - - one.util - streamex - ${streamex.version} - - - io.vavr - vavr - ${vavr.version} - - - org.openjdk.jmh - jmh-core - 1.19 - - - org.openjdk.jmh - jmh-generator-annprocess - 1.19 - + - org.springframework - spring-web - 4.3.4.RELEASE + net.sourceforge.collections + collections-generic + ${collections-generic.version} + + + com.google.guava + guava + ${guava.version} - - - core-java - - - src/main/resources - true - - + + org.apache.commons + commons-collections4 + ${commons-collections4.version} + - + + commons-io + commons-io + ${commons-io.version} + - - org.apache.maven.plugins - maven-compiler-plugin - ${maven-compiler-plugin.version} - - 1.8 - 1.8 - - + + org.apache.commons + commons-lang3 + ${commons-lang3.version} + - - org.apache.maven.plugins - maven-surefire-plugin - - - **/*LiveTest.java - **/*IntegrationTest.java - **/*LongRunningUnitTest.java - **/*ManualTest.java - + + org.apache.commons + commons-math3 + ${commons-math3.version} + - - + + org.decimal4j + decimal4j + ${decimal4j.version} + - - org.apache.maven.plugins - maven-dependency-plugin - - - copy-dependencies - prepare-package - - copy-dependencies - - - ${project.build.directory}/libs - - - - + + org.bouncycastle + bcprov-jdk15on + ${bouncycastle.version} + - - org.apache.maven.plugins - maven-jar-plugin - - - - true - libs/ - org.baeldung.executable.ExecutableMavenJar - - - - + + org.unix4j + unix4j-command + ${unix4j.version} + - - org.apache.maven.plugins - maven-assembly-plugin - - - package - - single - - - ${project.basedir} - - - org.baeldung.executable.ExecutableMavenJar - - - - jar-with-dependencies - - - - - + + com.googlecode.grep4j + grep4j + ${grep4j.version} + + - - org.apache.maven.plugins - maven-shade-plugin - - - - shade - - - true - - - org.baeldung.executable.ExecutableMavenJar - - - - - - + - - com.jolira - onejar-maven-plugin - - - - org.baeldung.executable.ExecutableMavenJar - true - ${project.build.finalName}-onejar.${project.packaging} - - - one-jar - - - - + + com.fasterxml.jackson.core + jackson-databind + ${jackson.version} + - - org.springframework.boot - spring-boot-maven-plugin - - - - repackage - - - spring-boot - org.baeldung.executable.ExecutableMavenJar - - - - + + + log4j + log4j + 1.2.17 + + + org.slf4j + slf4j-api + ${org.slf4j.version} + + + ch.qos.logback + logback-classic + ${logback.version} + + + + org.slf4j + jcl-over-slf4j + ${org.slf4j.version} + + + + org.slf4j + log4j-over-slf4j + ${org.slf4j.version} + + + org.projectlombok + lombok + ${lombok.version} + provided + - - org.codehaus.mojo - exec-maven-plugin - 1.6.0 - - java - com.baeldung.outofmemoryerror.OutOfMemoryGCLimitExceed - - -Xmx300m - -XX:+UseParallelGC - -classpath - - com.baeldung.outofmemoryerror.OutOfMemoryGCLimitExceed - - - + + + + org.hamcrest + hamcrest-all + 1.3 + test + + + + junit + junit + ${junit.version} + test + + + + org.hamcrest + hamcrest-core + ${org.hamcrest.version} + test + + + org.hamcrest + hamcrest-library + ${org.hamcrest.version} + test + + + + org.assertj + assertj-core + ${assertj.version} + test + + + + org.mockito + mockito-core + ${mockito.version} + test + + + com.jayway.awaitility + awaitility + ${avaitility.version} + test + + + + commons-codec + commons-codec + ${commons-codec.version} + + + + org.javamoney + moneta + 1.1 + + + + org.owasp.esapi + esapi + 2.1.0.1 + + + com.h2database + h2 + 1.4.196 + runtime + + + com.sun.messaging.mq + fscontext + ${fscontext.version} + + + com.codepoetics + protonpack + ${protonpack.version} + + + one.util + streamex + ${streamex.version} + + + io.vavr + vavr + ${vavr.version} + + + org.openjdk.jmh + jmh-core + 1.19 + + + org.openjdk.jmh + jmh-generator-annprocess + 1.19 + + + org.springframework + spring-web + 4.3.4.RELEASE + + + + org.springframework.boot + spring-boot-starter + 1.5.8.RELEASE + + + + + + core-java + + + src/main/resources + true + + + + + + + org.apache.maven.plugins + maven-compiler-plugin + ${maven-compiler-plugin.version} + + 1.8 + 1.8 + + + + + org.apache.maven.plugins + maven-surefire-plugin + + + **/*LiveTest.java + **/*IntegrationTest.java + **/*LongRunningUnitTest.java + **/*ManualTest.java + + + + + + + org.apache.maven.plugins + maven-dependency-plugin + + + copy-dependencies + prepare-package + + copy-dependencies + + + ${project.build.directory}/libs + + + + + + + org.apache.maven.plugins + maven-jar-plugin + + + + true + libs/ + org.baeldung.executable.ExecutableMavenJar + + + + + + + org.apache.maven.plugins + maven-assembly-plugin + + + package + + single + + + ${project.basedir} + + + org.baeldung.executable.ExecutableMavenJar + + + + jar-with-dependencies + + + + + + + + org.apache.maven.plugins + maven-shade-plugin + + + + shade + + + true + + + org.baeldung.executable.ExecutableMavenJar + + + + + + + + + com.jolira + onejar-maven-plugin + + + + org.baeldung.executable.ExecutableMavenJar + true + ${project.build.finalName}-onejar.${project.packaging} + + + one-jar + + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + + repackage + + + spring-boot + org.baeldung.executable.ExecutableMavenJar + + + + + + + org.codehaus.mojo + exec-maven-plugin + 1.6.0 + + java + com.baeldung.outofmemoryerror.OutOfMemoryGCLimitExceed + + -Xmx300m + -XX:+UseParallelGC + -classpath + + com.baeldung.outofmemoryerror.OutOfMemoryGCLimitExceed + + + - + - + - - - integration - - - - org.apache.maven.plugins - maven-surefire-plugin - - - integration-test - - test - - - - **/*ManualTest.java - - - **/*IntegrationTest.java - - - - - - - json - - - - - org.codehaus.mojo - exec-maven-plugin + + + integration + + + + org.apache.maven.plugins + maven-surefire-plugin + + + integration-test + + test + + + + **/*ManualTest.java + + + **/*IntegrationTest.java + + + + + + + json + + + + + org.codehaus.mojo + exec-maven-plugin - - - run-benchmarks - - none - - exec - - - test - java - - -classpath - - org.openjdk.jmh.Main - .* - - - - - - - - - + + + run-benchmarks + + none + + exec + + + test + java + + -classpath + + org.openjdk.jmh.Main + .* + + + + + + + + + - - - 2.8.5 + + + 2.8.5 - - 1.7.21 - 1.1.7 + + 1.7.21 + 1.1.7 - - 23.0 - 3.5 - 1.55 - 1.10 - 3.6.1 - 1.0.3 - 2.5 - 4.1 - 4.01 - 0.4 - 1.8.7 - 1.16.12 - 4.6-b01 - 1.13 - 0.6.5 - 0.9.0 - - - 1.3 - 4.12 - 2.8.9 - 3.6.1 - 1.7.0 + + 22.0 + 3.5 + 1.55 + 1.10 + 3.6.1 + 1.0.3 + 2.5 + 4.1 + 4.01 + 0.4 + 1.8.7 + 1.16.12 + 4.6-b01 + 1.13 + 0.6.5 + 0.9.0 - - 3.6.0 - 2.19.1 - - \ No newline at end of file + + 1.3 + 4.12 + 2.8.9 + 3.6.1 + 1.7.0 + + + 3.6.0 + 2.19.1 + + diff --git a/core-java/src/main/java/com/baeldung/jdbcrowset/DatabaseConfiguration.java b/core-java/src/main/java/com/baeldung/jdbcrowset/DatabaseConfiguration.java new file mode 100644 index 0000000000..9cfcff468e --- /dev/null +++ b/core-java/src/main/java/com/baeldung/jdbcrowset/DatabaseConfiguration.java @@ -0,0 +1,51 @@ +package com.baeldung.jdbcrowset; + +import java.sql.Connection; +import java.sql.DriverManager; +import java.sql.SQLException; +import java.sql.Statement; + +import javax.sql.rowset.JdbcRowSet; +import javax.sql.rowset.RowSetFactory; +import javax.sql.rowset.RowSetProvider; + +import org.springframework.boot.autoconfigure.EnableAutoConfiguration; +import org.springframework.context.annotation.Configuration; + +@Configuration +@EnableAutoConfiguration +public class DatabaseConfiguration { + + + public static Connection geth2Connection() throws Exception { + Class.forName("org.h2.Driver"); + System.out.println("Driver Loaded."); + String url = "jdbc:h2:mem:testdb"; + return DriverManager.getConnection(url, "sa", ""); + } + + public static void initDatabase(Statement stmt) throws SQLException{ + int iter = 1; + while(iter<=5){ + String customer = "Customer"+iter; + String sql ="INSERT INTO customers(id, name) VALUES ("+iter+ ",'"+customer+"');"; + System.out.println("here is sql statmeent for execution: " + sql); + stmt.executeUpdate(sql); + iter++; + } + + int iterb = 1; + while(iterb<=5){ + String associate = "Associate"+iter; + String sql = "INSERT INTO associates(id, name) VALUES("+iterb+",'"+associate+"');"; + System.out.println("here is sql statement for associate:"+ sql); + stmt.executeUpdate(sql); + iterb++; + } + + + } + + + +} diff --git a/core-java/src/main/java/com/baeldung/jdbcrowset/ExampleListener.java b/core-java/src/main/java/com/baeldung/jdbcrowset/ExampleListener.java new file mode 100644 index 0000000000..7d5bb759f5 --- /dev/null +++ b/core-java/src/main/java/com/baeldung/jdbcrowset/ExampleListener.java @@ -0,0 +1,24 @@ +package com.baeldung.jdbcrowset; + +import javax.sql.RowSetEvent; +import javax.sql.RowSetListener; + +public class ExampleListener implements RowSetListener { + + + public void cursorMoved(RowSetEvent event) { + System.out.println("ExampleListener alerted of cursorMoved event"); + System.out.println(event.toString()); + } + + public void rowChanged(RowSetEvent event) { + System.out.println("ExampleListener alerted of rowChanged event"); + System.out.println(event.toString()); + } + + public void rowSetChanged(RowSetEvent event) { + System.out.println("ExampleListener alerted of rowSetChanged event"); + System.out.println(event.toString()); + } + +} diff --git a/core-java/src/main/java/com/baeldung/jdbcrowset/FilterExample.java b/core-java/src/main/java/com/baeldung/jdbcrowset/FilterExample.java new file mode 100644 index 0000000000..14e738f72d --- /dev/null +++ b/core-java/src/main/java/com/baeldung/jdbcrowset/FilterExample.java @@ -0,0 +1,46 @@ +package com.baeldung.jdbcrowset; + +import java.sql.SQLException; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +import javax.sql.RowSet; +import javax.sql.rowset.Predicate; + +public class FilterExample implements Predicate { + + private Pattern pattern; + + public FilterExample(String regexQuery) { + if (regexQuery != null && !regexQuery.isEmpty()) { + pattern = Pattern.compile(regexQuery); + } + } + + public boolean evaluate(RowSet rs) { + try { + if (!rs.isAfterLast()) { + String name = rs.getString("name"); + System.out.println(String.format( + "Searching for pattern '%s' in %s", pattern.toString(), + name)); + Matcher matcher = pattern.matcher(name); + return matcher.matches(); + } else + return false; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + public boolean evaluate(Object value, int column) throws SQLException { + throw new UnsupportedOperationException("This operation is unsupported."); + } + + public boolean evaluate(Object value, String columnName) + throws SQLException { + throw new UnsupportedOperationException("This operation is unsupported."); + } + +} diff --git a/core-java/src/main/java/com/baeldung/jdbcrowset/JdbcRowsetApplication.java b/core-java/src/main/java/com/baeldung/jdbcrowset/JdbcRowsetApplication.java new file mode 100644 index 0000000000..72c462ac42 --- /dev/null +++ b/core-java/src/main/java/com/baeldung/jdbcrowset/JdbcRowsetApplication.java @@ -0,0 +1,139 @@ +package com.baeldung.jdbcrowset; + +import java.io.FileOutputStream; +import java.sql.Connection; +import java.sql.ResultSet; +import java.sql.ResultSetMetaData; +import java.sql.SQLException; +import java.sql.Statement; + +import com.sun.rowset.*; + +import javax.sql.rowset.CachedRowSet; +import javax.sql.rowset.FilteredRowSet; +import javax.sql.rowset.JdbcRowSet; +import javax.sql.rowset.JoinRowSet; +import javax.sql.rowset.RowSetFactory; +import javax.sql.rowset.RowSetProvider; +import javax.sql.rowset.WebRowSet; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +public class JdbcRowsetApplication { + + public static void main(String[] args) throws Exception { + SpringApplication.run(JdbcRowsetApplication.class, args); + Statement stmt = null; + try { + Connection conn = DatabaseConfiguration.geth2Connection(); + + String drop = "DROP TABLE IF EXISTS customers, associates;"; + String schema = "CREATE TABLE customers (id INT NOT NULL, name VARCHAR(50) NOT NULL, PRIMARY KEY (id)); "; + String schemapartb = "CREATE TABLE associates (id INT NOT NULL, name VARCHAR(50) NOT NULL, PRIMARY KEY (id));"; + + stmt = conn.createStatement(); + stmt.executeUpdate(drop); + stmt.executeUpdate(schema); + stmt.executeUpdate(schemapartb); + // insert data + DatabaseConfiguration.initDatabase(stmt); + // JdbcRowSet Example + String sql = "SELECT * FROM customers"; + JdbcRowSet jdbcRS; + jdbcRS = new JdbcRowSetImpl(conn); + jdbcRS.setType(ResultSet.TYPE_SCROLL_INSENSITIVE); + jdbcRS.setCommand(sql); + jdbcRS.execute(); + jdbcRS.addRowSetListener(new ExampleListener()); + + while (jdbcRS.next()) { + // each call to next, generates a cursorMoved event + System.out.println("id=" + jdbcRS.getString(1)); + System.out.println("name=" + jdbcRS.getString(2)); + } + + // CachedRowSet Example + String username = "sa"; + String password = ""; + String url = "jdbc:h2:mem:testdb"; + CachedRowSet crs = new CachedRowSetImpl(); + crs.setUsername(username); + crs.setPassword(password); + crs.setUrl(url); + crs.setCommand(sql); + crs.execute(); + crs.addRowSetListener(new ExampleListener()); + while (crs.next()) { + if (crs.getInt("id") == 1) { + System.out.println("CRS found customer1 and will remove the record."); + crs.deleteRow(); + break; + } + } + + // WebRowSet example + WebRowSet wrs = new WebRowSetImpl(); + wrs.setUsername(username); + wrs.setPassword(password); + wrs.setUrl(url); + wrs.setCommand(sql); + wrs.execute(); + FileOutputStream ostream = new FileOutputStream("customers.xml"); + wrs.writeXml(ostream); + + // JoinRowSet example + CachedRowSetImpl customers = new CachedRowSetImpl(); + customers.setUsername(username); + customers.setPassword(password); + customers.setUrl(url); + customers.setCommand(sql); + customers.execute(); + + CachedRowSetImpl associates = new CachedRowSetImpl(); + associates.setUsername(username); + associates.setPassword(password); + associates.setUrl(url); + String associatesSQL = "SELECT * FROM associates"; + associates.setCommand(associatesSQL); + associates.execute(); + + JoinRowSet jrs = new JoinRowSetImpl(); + final String ID = "id"; + final String NAME = "name"; + jrs.addRowSet(customers, ID); + jrs.addRowSet(associates, ID); + jrs.last(); + System.out.println("Total rows: " + jrs.getRow()); + jrs.beforeFirst(); + while (jrs.next()) { + + String string1 = jrs.getString(ID); + String string2 = jrs.getString(NAME); + System.out.println("ID: " + string1 + ", NAME: " + string2); + } + + // FilteredRowSet example + RowSetFactory rsf = RowSetProvider.newFactory(); + FilteredRowSet frs = rsf.createFilteredRowSet(); + frs.setCommand("select * from customers"); + frs.execute(conn); + frs.setFilter(new FilterExample("^[A-C].*")); + + ResultSetMetaData rsmd = frs.getMetaData(); + int columncount = rsmd.getColumnCount(); + while (frs.next()) { + for (int i = 1; i <= columncount; i++) { + System.out.println(rsmd.getColumnLabel(i) + " = " + frs.getObject(i) + " "); + } + } + + } catch (SQLException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + + } + +} diff --git a/core-java/src/test/java/com/baeldung/jdbcrowset/JdbcRowSetTest.java b/core-java/src/test/java/com/baeldung/jdbcrowset/JdbcRowSetTest.java new file mode 100644 index 0000000000..cb455c213a --- /dev/null +++ b/core-java/src/test/java/com/baeldung/jdbcrowset/JdbcRowSetTest.java @@ -0,0 +1,157 @@ +package com.baeldung.jdbcrowset; + +import java.io.FileOutputStream; +import java.io.IOException; +import java.sql.Connection; +import java.sql.ResultSet; +import java.sql.ResultSetMetaData; +import java.sql.SQLException; +import java.sql.Statement; + +import javax.sql.rowset.CachedRowSet; +import javax.sql.rowset.FilteredRowSet; +import javax.sql.rowset.JdbcRowSet; +import javax.sql.rowset.JoinRowSet; +import javax.sql.rowset.RowSetFactory; +import javax.sql.rowset.RowSetProvider; +import javax.sql.rowset.WebRowSet; + +import org.junit.Before; +import org.junit.Test; + +import com.sun.rowset.CachedRowSetImpl; +import com.sun.rowset.JdbcRowSetImpl; +import com.sun.rowset.JoinRowSetImpl; +import com.sun.rowset.WebRowSetImpl; + +public class JdbcRowSetTest { + Statement stmt = null; + String username = "sa"; + String password = ""; + String url = "jdbc:h2:mem:testdb"; + String sql = "SELECT * FROM customers"; + + @Before + public void setup() throws Exception { + Connection conn = DatabaseConfiguration.geth2Connection(); + + String drop = "DROP TABLE IF EXISTS customers, associates;"; + String schema = "CREATE TABLE customers (id INT NOT NULL, name VARCHAR(50) NOT NULL, PRIMARY KEY (id)); "; + String schemapartb = "CREATE TABLE associates (id INT NOT NULL, name VARCHAR(50) NOT NULL, PRIMARY KEY (id));"; + stmt = conn.createStatement(); + stmt.executeUpdate(drop); + stmt.executeUpdate(schema); + stmt.executeUpdate(schemapartb); + DatabaseConfiguration.initDatabase(stmt); + + } + + // JdbcRowSet Example + @Test + public void createJdbcRowSet_SelectCustomers_ThenCorrect() throws Exception { + + String sql = "SELECT * FROM customers"; + JdbcRowSet jdbcRS; + Connection conn = DatabaseConfiguration.geth2Connection(); + jdbcRS = new JdbcRowSetImpl(conn); + jdbcRS.setType(ResultSet.TYPE_SCROLL_INSENSITIVE); + jdbcRS.setCommand(sql); + jdbcRS.execute(); + jdbcRS.addRowSetListener(new ExampleListener()); + + while (jdbcRS.next()) { + // each call to next, generates a cursorMoved event + System.out.println("id=" + jdbcRS.getString(1)); + System.out.println("name=" + jdbcRS.getString(2)); + } + + } + + // CachedRowSet Example + @Test + public void createCachedRowSet_DeleteRecord_ThenCorrect() throws Exception { + + CachedRowSet crs = new CachedRowSetImpl(); + crs.setUsername(username); + crs.setPassword(password); + crs.setUrl(url); + crs.setCommand(sql); + crs.execute(); + crs.addRowSetListener(new ExampleListener()); + while (crs.next()) { + if (crs.getInt("id") == 1) { + System.out.println("CRS found customer1 and will remove the record."); + crs.deleteRow(); + break; + } + } + } + + // WebRowSet example + @Test + public void createWebRowSet_SelectCustomers_WritetoXML_ThenCorrect() throws SQLException, IOException { + + WebRowSet wrs = new WebRowSetImpl(); + wrs.setUsername(username); + wrs.setPassword(password); + wrs.setUrl(url); + wrs.setCommand(sql); + wrs.execute(); + FileOutputStream ostream = new FileOutputStream("customers.xml"); + wrs.writeXml(ostream); + } + + // JoinRowSet example + @Test + public void createCachedRowSets_DoJoinRowSet_ThenCorrect() throws Exception { + + CachedRowSetImpl customers = new CachedRowSetImpl(); + customers.setUsername(username); + customers.setPassword(password); + customers.setUrl(url); + customers.setCommand(sql); + customers.execute(); + + CachedRowSetImpl associates = new CachedRowSetImpl(); + associates.setUsername(username); + associates.setPassword(password); + associates.setUrl(url); + String associatesSQL = "SELECT * FROM associates"; + associates.setCommand(associatesSQL); + associates.execute(); + + JoinRowSet jrs = new JoinRowSetImpl(); + final String ID = "id"; + final String NAME = "name"; + jrs.addRowSet(customers, ID); + jrs.addRowSet(associates, ID); + jrs.last(); + System.out.println("Total rows: " + jrs.getRow()); + jrs.beforeFirst(); + while (jrs.next()) { + + String string1 = jrs.getString(ID); + String string2 = jrs.getString(NAME); + System.out.println("ID: " + string1 + ", NAME: " + string2); + } + } + + // FilteredRowSet example + @Test + public void createFilteredRowSet_filterByRegexExpression_thenCorrect() throws Exception { + RowSetFactory rsf = RowSetProvider.newFactory(); + FilteredRowSet frs = rsf.createFilteredRowSet(); + frs.setCommand("select * from customers"); + Connection conn = DatabaseConfiguration.geth2Connection(); + frs.execute(conn); + frs.setFilter(new FilterExample("^[A-C].*")); + + ResultSetMetaData rsmd = frs.getMetaData(); + int columncount = rsmd.getColumnCount(); + while (frs.next()) { + for (int i = 1; i <= columncount; i++) { + System.out.println(rsmd.getColumnLabel(i) + " = " + frs.getObject(i) + " "); + } + } + } +} From e4d301e81dfbfca03d385975eed121160302939c Mon Sep 17 00:00:00 2001 From: ericgoebelbecker <@592Gbetz> Date: Fri, 1 Dec 2017 15:08:19 -0500 Subject: [PATCH 135/236] BAEL-1374 - search an array --- .../com/baeldung/array/SearchArrayTest.java | 116 ++++++++++++++++++ 1 file changed, 116 insertions(+) create mode 100644 core-java/src/test/java/com/baeldung/array/SearchArrayTest.java diff --git a/core-java/src/test/java/com/baeldung/array/SearchArrayTest.java b/core-java/src/test/java/com/baeldung/array/SearchArrayTest.java new file mode 100644 index 0000000000..204e8a7945 --- /dev/null +++ b/core-java/src/test/java/com/baeldung/array/SearchArrayTest.java @@ -0,0 +1,116 @@ +package com.baeldung.array; + +import org.junit.Test; + +import java.util.*; + +public class SearchArrayTest { + + + @Test + public void searchArrayAllocNewCollections() { + + int count = 1000; + + String[] array = seedArray(count); + + long startTime = System.nanoTime(); + for (int i = 0; i < count; i++) { + searchList(array, "A"); + } + long duration = System.nanoTime() - startTime; + System.out.println("SearchList: " + duration / 10000); + + startTime = System.nanoTime(); + for (int i = 0; i < count; i++) { + searchSet(array,"A"); + } + duration = System.nanoTime() - startTime; + System.out.println("SearchSet: " + duration / 10000); + + startTime = System.nanoTime(); + for (int i = 0; i < count; i++) { + searchLoop(array, "A"); + } + duration = System.nanoTime() - startTime; + System.out.println("SearchLoop: " + duration / 10000); + } + + @Test + public void searchArrayReuseCollections() { + + int count = 10000; + String[] array = seedArray(count); + + List asList = Arrays.asList(array); + Set asSet = new HashSet<>(Arrays.asList(array)); + + long startTime = System.nanoTime(); + for (int i = 0; i < count; i++) { + asList.contains("A"); + } + long duration = System.nanoTime() - startTime; + System.out.println("List: " + duration / 10000); + + startTime = System.nanoTime(); + for (int i = 0; i < count; i++) { + asSet.contains("A"); + } + duration = System.nanoTime() - startTime; + System.out.println("Set: " + duration / 10000); + + startTime = System.nanoTime(); + for (int i = 0; i < count; i++) { + searchLoop(array, "A"); + } + duration = System.nanoTime() - startTime; + System.out.println("Loop: " + duration / 10000); + + } + + + @Test + public void searchArrayBinarySearch() { + + int count = 10000; + String[] array = seedArray(count); + Arrays.sort(array); + + long startTime = System.nanoTime(); + for (int i = 0; i < count; i++) { + Arrays.binarySearch(array, "A"); + } + long duration = System.nanoTime() - startTime; + System.out.println("Binary search: " + duration / 10000); + + } + + private boolean searchList(String[] arr, String targetValue) { + return Arrays.asList(arr).contains(targetValue); + } + + private boolean searchSet(String[] arr, String targetValue) { + Set set = new HashSet<>(Arrays.asList(arr)); + return set.contains(targetValue); + } + + private boolean searchLoop(String[] arr, String targetValue) { + for (String s : arr) { + if (s.equals(targetValue)) + return true; + } + return true; + } + + private String[] seedArray(int length) { + + String[] strings = new String[length]; + Random random = new Random(); + for (int i = 0; i < length; i++) + { + strings[i] = String.valueOf(random.nextInt()); + } + return strings; + } + +} From 89ab473651138ae2cf2f07881cd7e2550bd64232 Mon Sep 17 00:00:00 2001 From: ericgoebelbecker <@592Gbetz> Date: Fri, 1 Dec 2017 18:02:13 -0500 Subject: [PATCH 136/236] BAEL-1374 - search an array. Name changes. --- .../com/baeldung/array/SearchArrayTest.java | 44 +++++++++---------- 1 file changed, 22 insertions(+), 22 deletions(-) diff --git a/core-java/src/test/java/com/baeldung/array/SearchArrayTest.java b/core-java/src/test/java/com/baeldung/array/SearchArrayTest.java index 204e8a7945..94911baac9 100644 --- a/core-java/src/test/java/com/baeldung/array/SearchArrayTest.java +++ b/core-java/src/test/java/com/baeldung/array/SearchArrayTest.java @@ -12,25 +12,25 @@ public class SearchArrayTest { int count = 1000; - String[] array = seedArray(count); + String[] strings = seedArray(count); long startTime = System.nanoTime(); for (int i = 0; i < count; i++) { - searchList(array, "A"); + searchList(strings, "W"); } long duration = System.nanoTime() - startTime; System.out.println("SearchList: " + duration / 10000); startTime = System.nanoTime(); for (int i = 0; i < count; i++) { - searchSet(array,"A"); + searchSet(strings,"S"); } duration = System.nanoTime() - startTime; System.out.println("SearchSet: " + duration / 10000); startTime = System.nanoTime(); for (int i = 0; i < count; i++) { - searchLoop(array, "A"); + searchLoop(strings, "T"); } duration = System.nanoTime() - startTime; System.out.println("SearchLoop: " + duration / 10000); @@ -40,28 +40,28 @@ public class SearchArrayTest { public void searchArrayReuseCollections() { int count = 10000; - String[] array = seedArray(count); + String[] strings = seedArray(count); - List asList = Arrays.asList(array); - Set asSet = new HashSet<>(Arrays.asList(array)); + List asList = Arrays.asList(strings); + Set asSet = new HashSet<>(Arrays.asList(strings)); long startTime = System.nanoTime(); for (int i = 0; i < count; i++) { - asList.contains("A"); + asList.contains("W"); } long duration = System.nanoTime() - startTime; System.out.println("List: " + duration / 10000); startTime = System.nanoTime(); for (int i = 0; i < count; i++) { - asSet.contains("A"); + asSet.contains("S"); } duration = System.nanoTime() - startTime; System.out.println("Set: " + duration / 10000); startTime = System.nanoTime(); for (int i = 0; i < count; i++) { - searchLoop(array, "A"); + searchLoop(strings, "T"); } duration = System.nanoTime() - startTime; System.out.println("Loop: " + duration / 10000); @@ -73,33 +73,33 @@ public class SearchArrayTest { public void searchArrayBinarySearch() { int count = 10000; - String[] array = seedArray(count); - Arrays.sort(array); + String[] strings = seedArray(count); + Arrays.sort(strings); long startTime = System.nanoTime(); for (int i = 0; i < count; i++) { - Arrays.binarySearch(array, "A"); + Arrays.binarySearch(strings, "A"); } long duration = System.nanoTime() - startTime; System.out.println("Binary search: " + duration / 10000); } - private boolean searchList(String[] arr, String targetValue) { - return Arrays.asList(arr).contains(targetValue); + private boolean searchList(String[] strings, String searchString) { + return Arrays.asList(strings).contains(searchString); } - private boolean searchSet(String[] arr, String targetValue) { - Set set = new HashSet<>(Arrays.asList(arr)); - return set.contains(targetValue); + private boolean searchSet(String[] strings, String searchString) { + Set set = new HashSet<>(Arrays.asList(strings)); + return set.contains(searchString); } - private boolean searchLoop(String[] arr, String targetValue) { - for (String s : arr) { - if (s.equals(targetValue)) + private boolean searchLoop(String[] strings, String searchString) { + for (String s : strings) { + if (s.equals(searchString)) return true; } - return true; + return false; } private String[] seedArray(int length) { From 2c7481c35fd171afd19be602793ca143c04bb521 Mon Sep 17 00:00:00 2001 From: Loredana Crusoveanu Date: Sat, 2 Dec 2017 11:55:12 +0200 Subject: [PATCH 137/236] Update README.md --- core-java/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/core-java/README.md b/core-java/README.md index 1feee4126e..8287a21d1e 100644 --- a/core-java/README.md +++ b/core-java/README.md @@ -120,4 +120,5 @@ - [Guide to Java String Pool](http://www.baeldung.com/java-string-pool) - [Copy a File with Java](http://www.baeldung.com/java-copy-file) - [Introduction to Creational Design Patterns](http://www.baeldung.com/creational-design-patterns) +- [Quick Example - Comparator vs Comparable in Java](http://www.baeldung.com/java-comparator-comparable) From 3d0e68b4a9bcc50f286ae9afbb224c38fb9233b7 Mon Sep 17 00:00:00 2001 From: Shouvik Bhattacharya <33756821+shouvikbhattacharya@users.noreply.github.com> Date: Sat, 2 Dec 2017 19:57:28 +0530 Subject: [PATCH 138/236] Guide to HashSet (#3165) --- .../baeldung/collection/WhenUsingHashSet.java | 93 +++++++++++++++++++ 1 file changed, 93 insertions(+) create mode 100644 core-java/src/test/java/com/baeldung/collection/WhenUsingHashSet.java diff --git a/core-java/src/test/java/com/baeldung/collection/WhenUsingHashSet.java b/core-java/src/test/java/com/baeldung/collection/WhenUsingHashSet.java new file mode 100644 index 0000000000..7dc47ee8c2 --- /dev/null +++ b/core-java/src/test/java/com/baeldung/collection/WhenUsingHashSet.java @@ -0,0 +1,93 @@ +package com.baeldung.collection; + +import java.util.ConcurrentModificationException; +import java.util.HashSet; +import java.util.Iterator; +import java.util.Set; + +import org.junit.Assert; +import org.junit.Test; + +public class WhenUsingHashSet { + + @Test + public void whenAddingElement_shouldAddElement() { + Set hashset = new HashSet<>(); + Assert.assertTrue(hashset.add("String Added")); + } + + @Test + public void whenCheckingForElement_shouldSearchForElement() { + Set hashsetContains = new HashSet<>(); + hashsetContains.add("String Added"); + Assert.assertTrue(hashsetContains.contains("String Added")); + } + + @Test + public void whenCheckingTheSizeOfHashSet_shouldReturnThesize() { + Set hashSetSize = new HashSet<>(); + hashSetSize.add("String Added"); + Assert.assertEquals(1, hashSetSize.size()); + } + + @Test + public void whenCheckingForEmptyHashSet_shouldCheckForEmpty() { + Set emptyHashSet = new HashSet<>(); + Assert.assertTrue(emptyHashSet.isEmpty()); + } + + @Test + public void whenRemovingElement_shouldRemoveElement() { + Set removeFromHashSet = new HashSet<>(); + removeFromHashSet.add("String Added"); + Assert.assertTrue(removeFromHashSet.remove("String Added")); + } + + @Test + public void whenClearingHashSet_shouldClearHashSet() { + Set clearHashSet = new HashSet<>(); + clearHashSet.add("String Added"); + clearHashSet.clear(); + Assert.assertTrue(clearHashSet.isEmpty()); + } + + @Test + public void whenIteratingHashSet_shouldIterateHashSet() { + Set hashset = new HashSet<>(); + hashset.add("First"); + hashset.add("Second"); + hashset.add("Third"); + Iterator itr = hashset.iterator(); + while (itr.hasNext()) { + System.out.println(itr.next()); + } + } + + @Test(expected = ConcurrentModificationException.class) + public void whenModifyingHashSetWhileIterating_shouldThrowException() { + Set hashset = new HashSet<>(); + hashset.add("First"); + hashset.add("Second"); + hashset.add("Third"); + Iterator itr = hashset.iterator(); + while (itr.hasNext()) { + itr.next(); + hashset.remove("Second"); + } + } + + @Test + public void whenRemovingElementUsingIterator_shouldRemoveElement() { + Set hashset = new HashSet<>(); + hashset.add("First"); + hashset.add("Second"); + hashset.add("Third"); + Iterator itr = hashset.iterator(); + while (itr.hasNext()) { + String element = itr.next(); + if (element.equals("Second")) + itr.remove(); + } + Assert.assertEquals(2, hashset.size()); + } +} From 79cf459013a258294192a0b96af5b66e2407c977 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Walter=20G=C3=B3mez?= Date: Sat, 2 Dec 2017 10:04:30 -0600 Subject: [PATCH 139/236] Generated id fix (#3180) * Add project for hibernate immutable article Add Event entity Add hibernate configuration file Add hibernateutil for configuration Add test to match snippets from article * Update master * Update hibernate tests Change sesssion handling Modify event creation * Remove setId method on generated id --- .../hibernate/immutable/HibernateImmutableIntegrationTest.java | 1 - 1 file changed, 1 deletion(-) diff --git a/persistence-modules/spring-hibernate-5/src/test/java/com/baeldung/hibernate/immutable/HibernateImmutableIntegrationTest.java b/persistence-modules/spring-hibernate-5/src/test/java/com/baeldung/hibernate/immutable/HibernateImmutableIntegrationTest.java index d6ecdb29d6..c5a7633c74 100644 --- a/persistence-modules/spring-hibernate-5/src/test/java/com/baeldung/hibernate/immutable/HibernateImmutableIntegrationTest.java +++ b/persistence-modules/spring-hibernate-5/src/test/java/com/baeldung/hibernate/immutable/HibernateImmutableIntegrationTest.java @@ -115,7 +115,6 @@ public class HibernateImmutableIntegrationTest { private static void createEventGenerated() { EventGeneratedId eventGeneratedId = new EventGeneratedId("John", "Doe"); - eventGeneratedId.setId(4L); session.save(eventGeneratedId); } From c2e8eb2ccccb744e8d6cd9c0f1c490dfc66c032b Mon Sep 17 00:00:00 2001 From: Eugen Paraschiv Date: Sat, 2 Dec 2017 18:24:28 +0200 Subject: [PATCH 140/236] cleanup Hibernate work --- .../baeldung/spring/PersistenceConfig.java | 2 +- .../src/main/resources/manytomany.cfg.xml | 24 +++++-------------- .../HibernateImmutableIntegrationTest.java | 2 +- 3 files changed, 8 insertions(+), 20 deletions(-) diff --git a/persistence-modules/spring-hibernate-5/src/main/java/com/baeldung/spring/PersistenceConfig.java b/persistence-modules/spring-hibernate-5/src/main/java/com/baeldung/spring/PersistenceConfig.java index 74ac0a269e..e64f0a4efe 100644 --- a/persistence-modules/spring-hibernate-5/src/main/java/com/baeldung/spring/PersistenceConfig.java +++ b/persistence-modules/spring-hibernate-5/src/main/java/com/baeldung/spring/PersistenceConfig.java @@ -21,7 +21,7 @@ import java.util.Properties; @Configuration @EnableTransactionManagement -@PropertySource({ "classpath:persistence-h2.properties" }) +@PropertySource({ "classpath:persistence-mysql.properties" }) @ComponentScan({ "com.baeldung.persistence" }) public class PersistenceConfig { diff --git a/persistence-modules/spring-hibernate-5/src/main/resources/manytomany.cfg.xml b/persistence-modules/spring-hibernate-5/src/main/resources/manytomany.cfg.xml index 8a10fc1580..3c753a89af 100644 --- a/persistence-modules/spring-hibernate-5/src/main/resources/manytomany.cfg.xml +++ b/persistence-modules/spring-hibernate-5/src/main/resources/manytomany.cfg.xml @@ -4,24 +4,12 @@ "http://hibernate.org/dtd/hibernate-configuration-3.0.dtd"> - - com.mysql.jdbc.Driver - - - buddhinisam123 - - - jdbc:mysql://localhost:3306/spring_hibernate_many_to_many - - - root - - - org.hibernate.dialect.MySQLDialect - - - thread - + com.mysql.jdbc.Driver + tutorialmy5ql + jdbc:mysql://localhost:3306/spring_hibernate_many_to_many + tutorialuser + org.hibernate.dialect.MySQLDialect + thread true diff --git a/persistence-modules/spring-hibernate-5/src/test/java/com/baeldung/hibernate/immutable/HibernateImmutableIntegrationTest.java b/persistence-modules/spring-hibernate-5/src/test/java/com/baeldung/hibernate/immutable/HibernateImmutableIntegrationTest.java index c5a7633c74..8465dee21c 100644 --- a/persistence-modules/spring-hibernate-5/src/test/java/com/baeldung/hibernate/immutable/HibernateImmutableIntegrationTest.java +++ b/persistence-modules/spring-hibernate-5/src/test/java/com/baeldung/hibernate/immutable/HibernateImmutableIntegrationTest.java @@ -4,7 +4,6 @@ import com.baeldung.hibernate.immutable.entities.Event; import com.baeldung.hibernate.immutable.entities.EventGeneratedId; import com.baeldung.hibernate.immutable.util.HibernateUtil; import com.google.common.collect.Sets; -import org.hibernate.CacheMode; import org.hibernate.Session; import org.junit.*; import org.junit.rules.ExpectedException; @@ -98,6 +97,7 @@ public class HibernateImmutableIntegrationTest { public void updateEventGenerated() { createEventGenerated(); EventGeneratedId eventGeneratedId = (EventGeneratedId) session.createQuery("FROM EventGeneratedId WHERE name LIKE '%John%'").list().get(0); + eventGeneratedId.setName("Mike"); session.update(eventGeneratedId); session.flush(); From 9f54deaff764051a6d758ea5716f77dd3381008f Mon Sep 17 00:00:00 2001 From: Eugen Paraschiv Date: Sat, 2 Dec 2017 18:26:00 +0200 Subject: [PATCH 141/236] minor documentation work --- .../hibernate/immutable/HibernateImmutableIntegrationTest.java | 3 +++ .../HibernateManyToManyAnnotationMainIntegrationTest.java | 3 +++ 2 files changed, 6 insertions(+) diff --git a/persistence-modules/spring-hibernate-5/src/test/java/com/baeldung/hibernate/immutable/HibernateImmutableIntegrationTest.java b/persistence-modules/spring-hibernate-5/src/test/java/com/baeldung/hibernate/immutable/HibernateImmutableIntegrationTest.java index 8465dee21c..1572f23ed1 100644 --- a/persistence-modules/spring-hibernate-5/src/test/java/com/baeldung/hibernate/immutable/HibernateImmutableIntegrationTest.java +++ b/persistence-modules/spring-hibernate-5/src/test/java/com/baeldung/hibernate/immutable/HibernateImmutableIntegrationTest.java @@ -13,6 +13,9 @@ import javax.persistence.PersistenceException; import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.core.IsEqual.equalTo; +/** + * Configured in: immutable.cfg.xml + */ public class HibernateImmutableIntegrationTest { private static Session session; diff --git a/persistence-modules/spring-hibernate-5/src/test/java/com/baeldung/hibernate/manytomany/HibernateManyToManyAnnotationMainIntegrationTest.java b/persistence-modules/spring-hibernate-5/src/test/java/com/baeldung/hibernate/manytomany/HibernateManyToManyAnnotationMainIntegrationTest.java index 9a536a0f80..0073e181cc 100644 --- a/persistence-modules/spring-hibernate-5/src/test/java/com/baeldung/hibernate/manytomany/HibernateManyToManyAnnotationMainIntegrationTest.java +++ b/persistence-modules/spring-hibernate-5/src/test/java/com/baeldung/hibernate/manytomany/HibernateManyToManyAnnotationMainIntegrationTest.java @@ -17,6 +17,9 @@ import com.baeldung.hibernate.manytomany.util.HibernateUtil; import com.baeldung.hibernate.manytomany.model.Employee; import com.baeldung.hibernate.manytomany.model.Project; +/** + * Configured in: manytomany.cfg.xml + */ public class HibernateManyToManyAnnotationMainIntegrationTest { private static SessionFactory sessionFactory; From 4e39bfb945ddd83f208a193c527a32787888b036 Mon Sep 17 00:00:00 2001 From: Shouvik Bhattacharya <33756821+shouvikbhattacharya@users.noreply.github.com> Date: Sun, 3 Dec 2017 02:24:36 +0530 Subject: [PATCH 142/236] Bael-1305: A Guide to Java Loops (#3181) * BAEL-1305: A Simple Guide to Java Loops. * BAEL-1305: Updated article to add few more examples. --- .../com/baeldung/loops/WhenUsingLoops.java | 70 +++++++++++++++++++ 1 file changed, 70 insertions(+) diff --git a/core-java/src/test/java/com/baeldung/loops/WhenUsingLoops.java b/core-java/src/test/java/com/baeldung/loops/WhenUsingLoops.java index 9590eabfef..f82f9ddaa7 100644 --- a/core-java/src/test/java/com/baeldung/loops/WhenUsingLoops.java +++ b/core-java/src/test/java/com/baeldung/loops/WhenUsingLoops.java @@ -1,11 +1,38 @@ package com.baeldung.loops; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import java.util.Map.Entry; +import java.util.Set; + import org.junit.Assert; +import org.junit.BeforeClass; import org.junit.Test; public class WhenUsingLoops { private LoopsInJava loops = new LoopsInJava(); + private static List list = new ArrayList<>(); + private static Set set = new HashSet<>(); + private static Map map = new HashMap<>(); + + @BeforeClass + public static void setUp() { + list.add("One"); + list.add("Two"); + list.add("Three"); + + set.add("Four"); + set.add("Five"); + set.add("Six"); + + map.put("One", 1); + map.put("Two", 2); + map.put("Three", 3); + } @Test public void shouldRunForLoop() { @@ -34,4 +61,47 @@ public class WhenUsingLoops { int[] actual = loops.do_while_loop(); Assert.assertArrayEquals(expected, actual); } + + @Test + public void whenUsingSimpleFor_shouldIterateList() { + for (int i = 0; i < list.size(); i++) { + System.out.println(list.get(i)); + } + } + + @Test + public void whenUsingEnhancedFor_shouldIterateList() { + for (String item : list) { + System.out.println(item); + } + } + + @Test + public void whenUsingEnhancedFor_shouldIterateSet() { + for (String item : set) { + System.out.println(item); + } + } + + @Test + public void whenUsingEnhancedFor_shouldIterateMap() { + for (Entry entry : map.entrySet()) { + System.out.println("Key: " + entry.getKey() + " - " + "Value: " + entry.getValue()); + } + } + + @Test + public void whenUsingSimpleFor_shouldRunLabelledLoop() { + aa: for (int i = 1; i <= 3; i++) { + if (i == 1) + continue; + bb: for (int j = 1; j <= 3; j++) { + if (i == 2 && j == 2) { + break aa; + } + System.out.println(i + " " + j); + } + } + } + } From d88e07dd2df6bac7bb58484cd740e86563b48fea Mon Sep 17 00:00:00 2001 From: mkuligowski Date: Sat, 2 Dec 2017 23:30:28 +0100 Subject: [PATCH 143/236] Add starting build.gradle file --- gradle/gradle-fat-jar/build.gradle | 10 ++++++++++ 1 file changed, 10 insertions(+) create mode 100644 gradle/gradle-fat-jar/build.gradle diff --git a/gradle/gradle-fat-jar/build.gradle b/gradle/gradle-fat-jar/build.gradle new file mode 100644 index 0000000000..102bc96dfc --- /dev/null +++ b/gradle/gradle-fat-jar/build.gradle @@ -0,0 +1,10 @@ +apply plugin: 'java' + +repositories { + mavenCentral() +} + +dependencies{ + compile group: 'org.slf4j', name: 'slf4j-api', version: '1.7.25' + compile group: 'org.slf4j', name: 'slf4j-simple', version: '1.7.25' +} \ No newline at end of file From 3f8fb8dd78dff603b28f73ba8833b84425894b35 Mon Sep 17 00:00:00 2001 From: mkuligowski Date: Sat, 2 Dec 2017 23:30:55 +0100 Subject: [PATCH 144/236] Add main class --- .../java/com/baeldung/fatjar/Application.java | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) create mode 100644 gradle/gradle-fat-jar/src/main/java/com/baeldung/fatjar/Application.java diff --git a/gradle/gradle-fat-jar/src/main/java/com/baeldung/fatjar/Application.java b/gradle/gradle-fat-jar/src/main/java/com/baeldung/fatjar/Application.java new file mode 100644 index 0000000000..470d89c332 --- /dev/null +++ b/gradle/gradle-fat-jar/src/main/java/com/baeldung/fatjar/Application.java @@ -0,0 +1,16 @@ +package com.baeldung.fatjar; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + + +public class Application { + + static final Logger logger = LoggerFactory.getLogger(Application.class); + + public static void main(String[] args) { + + logger.info("Hello at Baeldung!"); + } + +} \ No newline at end of file From 1ad1431c768ea31975a11b0fd4a03a6b5158f8c6 Mon Sep 17 00:00:00 2001 From: Ahmed Tawila Date: Sun, 3 Dec 2017 01:30:02 +0200 Subject: [PATCH 145/236] Future in Vavr --- .../src/main/java/com/vavr/future/Tester.java | 57 +++++++++++++++++++ 1 file changed, 57 insertions(+) create mode 100644 vavr/src/main/java/com/vavr/future/Tester.java diff --git a/vavr/src/main/java/com/vavr/future/Tester.java b/vavr/src/main/java/com/vavr/future/Tester.java new file mode 100644 index 0000000000..438bc67abf --- /dev/null +++ b/vavr/src/main/java/com/vavr/future/Tester.java @@ -0,0 +1,57 @@ +package com.vavr.future; + +import static org.junit.Assert.assertEquals; + +import java.util.concurrent.ExecutorService; + +import org.junit.Test; + +import io.vavr.concurrent.Future; + +public class Tester { + + @Test + public void whenAppendData_thenCorrect() { + String initialValue = "Welcome to "; + Future resultFuture = Future.of(() -> appendData(initialValue)); + String result = resultFuture.get(); + + assertEquals("Welcome to Baeldung!", result); + } + + @Test + public void whenAppendData_thenSuccess() { + String initialValue = "Welcome to "; + Future resultFuture = Future.of(() -> appendData(initialValue)) + .onSuccess(finalResult -> System.out.println("Successfully Completed - Result: " + finalResult)) + .onFailure(finalResult -> System.out.println("Failed - Result: " + finalResult)); + String result = resultFuture.get(); + + assertEquals("Welcome to Baeldung!", result); + } + + @Test + public void whenChainingCallbacks_thenCorrect() { + String initialValue = "Welcome to "; + Future resultFuture = Future.of(() -> appendData(initialValue)) + .andThen(finalResult -> System.out.println("Completed - 1: " + finalResult)) + .andThen(finalResult -> System.out.println("Completed - 2: " + finalResult)); + String result = resultFuture.get(); + + assertEquals("Welcome to Baeldung!", result); + } + + @Test + public void whenCallAwait_thenCorrect() { + String initialValue = "Welcome to "; + Future resultFuture = Future.of(() -> appendData(initialValue)); + resultFuture = resultFuture.await(); + String result = resultFuture.get(); + + assertEquals("Welcome to Baeldung!", result); + } + + public String appendData(String initial) { + return initial + "Baeldung!"; + } +} From b152de4851aaea4cee444191bafa893a29741e89 Mon Sep 17 00:00:00 2001 From: mkuligowski Date: Sun, 3 Dec 2017 10:56:52 +0100 Subject: [PATCH 146/236] Modify jar task from java plugin in order to produce fat-jar --- gradle/gradle-fat-jar/build.gradle | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/gradle/gradle-fat-jar/build.gradle b/gradle/gradle-fat-jar/build.gradle index 102bc96dfc..334583d486 100644 --- a/gradle/gradle-fat-jar/build.gradle +++ b/gradle/gradle-fat-jar/build.gradle @@ -4,6 +4,16 @@ repositories { mavenCentral() } +jar { + manifest { + attributes "Main-Class": "com.baeldung.fatjar.Application" + } + + from { + configurations.compile.collect { it.isDirectory() ? it : zipTree(it) } + } +} + dependencies{ compile group: 'org.slf4j', name: 'slf4j-api', version: '1.7.25' compile group: 'org.slf4j', name: 'slf4j-simple', version: '1.7.25' From 867e8ef3bec6dee4c4f77e591f64fbc3cf8b77ad Mon Sep 17 00:00:00 2001 From: mkuligowski Date: Sun, 3 Dec 2017 11:23:53 +0100 Subject: [PATCH 147/236] Add custom task which produces fat jar --- gradle/gradle-fat-jar/build.gradle | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/gradle/gradle-fat-jar/build.gradle b/gradle/gradle-fat-jar/build.gradle index 334583d486..23d66943cb 100644 --- a/gradle/gradle-fat-jar/build.gradle +++ b/gradle/gradle-fat-jar/build.gradle @@ -14,6 +14,17 @@ jar { } } + +task customFatJar(type: Jar) { + manifest { + attributes 'Main-Class': 'com.baeldung.fatjar.Application' + } + baseName = 'all-in-one-jar' + from { configurations.compile.collect { it.isDirectory() ? it : zipTree(it) } } + with jar +} + + dependencies{ compile group: 'org.slf4j', name: 'slf4j-api', version: '1.7.25' compile group: 'org.slf4j', name: 'slf4j-simple', version: '1.7.25' From e75a143e9f386ec7f5916b7cfe7506d23adeafca Mon Sep 17 00:00:00 2001 From: mkuligowski Date: Sun, 3 Dec 2017 11:26:27 +0100 Subject: [PATCH 148/236] Add shadow plugin --- gradle/gradle-fat-jar/build.gradle | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/gradle/gradle-fat-jar/build.gradle b/gradle/gradle-fat-jar/build.gradle index 23d66943cb..6afad80652 100644 --- a/gradle/gradle-fat-jar/build.gradle +++ b/gradle/gradle-fat-jar/build.gradle @@ -1,4 +1,14 @@ +buildscript { + repositories { + jcenter() + } + dependencies { + classpath 'com.github.jengelman.gradle.plugins:shadow:2.0.1' + } +} + apply plugin: 'java' +apply plugin: 'com.github.johnrengelman.shadow' repositories { mavenCentral() From c01c2266b839a8791c8a9cc62e3670655bb83a90 Mon Sep 17 00:00:00 2001 From: Yasin Date: Sun, 3 Dec 2017 16:51:42 +0530 Subject: [PATCH 149/236] BAEL-1334: Guide to Hibernate Spatial (#3183) * BAEL-1334 Guide to Hibernate Spatial * BAEL-1334 Guide to Hibernate Spatial Moving the files to hibernate5 from libraries * Reverting the pom file * BAEL-1334 Guide to Hibernate Spatial * BAEL-1334 Guide to Hibernate Spatial Moving the files to hibernate5 from libraries * Reverting the pom file * BAEL-1334 Guide to Hibernate Spatial Improved assertions --- .../java/com/baeldung/hibernate/HibernateSpatialTest.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/hibernate5/src/test/java/com/baeldung/hibernate/HibernateSpatialTest.java b/hibernate5/src/test/java/com/baeldung/hibernate/HibernateSpatialTest.java index 6d0aa0a4cd..a5c7b329fc 100644 --- a/hibernate5/src/test/java/com/baeldung/hibernate/HibernateSpatialTest.java +++ b/hibernate5/src/test/java/com/baeldung/hibernate/HibernateSpatialTest.java @@ -14,7 +14,9 @@ import org.junit.Test; import javax.persistence.Query; import java.io.IOException; +import static org.assertj.core.api.Assertions.assertThat; import static org.junit.Assert.assertEquals; + import static org.junit.Assert.assertTrue; public class HibernateSpatialTest { @@ -76,10 +78,8 @@ public class HibernateSpatialTest { Query query = session.createQuery("select p from PointEntity p where within(p.point, :area) = true", PointEntity.class); query.setParameter("area", wktToGeometry("POLYGON((0 0, 0 5, 5 5, 5 0, 0 0))")); - assertEquals(3, query.getResultList().size()); - assertEquals("POINT (1 1)", ((PointEntity) query.getResultList().get(0)).getPoint().toString()); - assertEquals("POINT (1 2)", ((PointEntity) query.getResultList().get(1)).getPoint().toString()); - assertEquals("POINT (3 4)", ((PointEntity) query.getResultList().get(2)).getPoint().toString()); + assertThat(query.getResultList().stream().map(p -> ((PointEntity) p).getPoint().toString())) + .containsOnly("POINT (1 1)", "POINT (1 2)", "POINT (3 4)"); } private void insertPoint(String point) throws ParseException { From 63d4e7d0143404684fec3b27db4931100a7c929c Mon Sep 17 00:00:00 2001 From: Muhammed Almas Date: Mon, 4 Dec 2017 01:52:39 +0530 Subject: [PATCH 150/236] BAEL-1375 Counter in Java. (#3170) * BAEL-1375 Counter in Java. * BAEL-1375 Frequency counter in java. * BAEL-1375 Refactored method names. --- core-java-8/pom.xml | 532 +++++++++--------- .../baeldung/counter/CounterStatistics.java | 45 ++ .../com/baeldung/counter/CounterTest.java | 53 ++ .../com/baeldung/counter/CounterUtil.java | 61 ++ 4 files changed, 434 insertions(+), 257 deletions(-) create mode 100644 core-java-8/src/test/java/com/baeldung/counter/CounterStatistics.java create mode 100644 core-java-8/src/test/java/com/baeldung/counter/CounterTest.java create mode 100644 core-java-8/src/test/java/com/baeldung/counter/CounterUtil.java diff --git a/core-java-8/pom.xml b/core-java-8/pom.xml index f5506f095e..17d330b3b8 100644 --- a/core-java-8/pom.xml +++ b/core-java-8/pom.xml @@ -1,258 +1,276 @@ - - 4.0.0 - com.baeldung - core-java-8 - 0.1.0-SNAPSHOT - jar - - core-java-8 - - - - com.baeldung - parent-modules - 1.0.0-SNAPSHOT - - - - - - - com.google.guava - guava - ${guava.version} - - - - org.apache.commons - commons-collections4 - ${commons-collections4.version} - - - - commons-io - commons-io - ${commons-io.version} - - - - org.apache.commons - commons-lang3 - ${commons-lang3.version} - - - - org.apache.commons - commons-math3 - ${commons-math3.version} - - - - log4j - log4j - 1.2.17 - - - - commons-codec - commons-codec - ${commons-codec.version} - - - - org.projectlombok - lombok - ${lombok.version} - provided - - - - - - org.assertj - assertj-core - ${assertj.version} - test - - - - com.jayway.awaitility - awaitility - ${avaitility.version} - test - - - - - - core-java-8 - - - src/main/resources - true - - - - - - org.apache.maven.plugins - maven-dependency-plugin - - - copy-dependencies - prepare-package - - copy-dependencies - - - ${project.build.directory}/libs - - - - - - - org.apache.maven.plugins - maven-jar-plugin - - - - true - libs/ - org.baeldung.executable.ExecutableMavenJar - - - - - - org.apache.maven.plugins - maven-assembly-plugin - - - package - - single - - - ${project.basedir} - - - org.baeldung.executable.ExecutableMavenJar - - - - jar-with-dependencies - - - - - - - org.apache.maven.plugins - maven-shade-plugin - - - - shade - - - true - - - org.baeldung.executable.ExecutableMavenJar - - - - - - - - com.jolira - onejar-maven-plugin - - - - org.baeldung.executable.ExecutableMavenJar - true - ${project.build.finalName}-onejar.${project.packaging} - - - one-jar - - - - - - org.springframework.boot - spring-boot-maven-plugin - - - - repackage - - - spring-boot - org.baeldung.executable.ExecutableMavenJar - - - - - - - - - - - integration - - - - org.apache.maven.plugins - maven-surefire-plugin - - - integration-test - - test - - - - **/*ManualTest.java - - - **/*IntegrationTest.java - - - - - - - json - - - - - - - - - - - - 21.0 - 3.5 - 3.6.1 - 2.5 - 4.1 - 4.01 - 1.10 - 1.16.12 - - - 3.6.1 - 1.7.0 - - + + 4.0.0 + com.baeldung + core-java-8 + 0.1.0-SNAPSHOT + jar + + core-java-8 + + + + com.baeldung + parent-modules + 1.0.0-SNAPSHOT + + + + + + + com.google.guava + guava + ${guava.version} + + + + org.apache.commons + commons-collections4 + ${commons-collections4.version} + + + + commons-io + commons-io + ${commons-io.version} + + + + org.apache.commons + commons-lang3 + ${commons-lang3.version} + + + + org.apache.commons + commons-math3 + ${commons-math3.version} + + + + log4j + log4j + 1.2.17 + + + + commons-codec + commons-codec + ${commons-codec.version} + + + + org.projectlombok + lombok + ${lombok.version} + provided + + + + + + org.assertj + assertj-core + ${assertj.version} + test + + + + com.jayway.awaitility + awaitility + ${avaitility.version} + test + + + + org.openjdk.jmh + jmh-core + 1.19 + + + + org.openjdk.jmh + jmh-generator-annprocess + 1.19 + + + + org.openjdk.jmh + jmh-generator-bytecode + 1.19 + + + + + + core-java-8 + + + src/main/resources + true + + + + + + org.apache.maven.plugins + maven-dependency-plugin + + + copy-dependencies + prepare-package + + copy-dependencies + + + ${project.build.directory}/libs + + + + + + + org.apache.maven.plugins + maven-jar-plugin + + + + true + libs/ + org.baeldung.executable.ExecutableMavenJar + + + + + + org.apache.maven.plugins + maven-assembly-plugin + + + package + + single + + + ${project.basedir} + + + org.baeldung.executable.ExecutableMavenJar + + + + jar-with-dependencies + + + + + + + org.apache.maven.plugins + maven-shade-plugin + + + + shade + + + true + + + org.baeldung.executable.ExecutableMavenJar + + + + + + + + com.jolira + onejar-maven-plugin + + + + org.baeldung.executable.ExecutableMavenJar + true + ${project.build.finalName}-onejar.${project.packaging} + + + one-jar + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + + repackage + + + spring-boot + org.baeldung.executable.ExecutableMavenJar + + + + + + + + + + + integration + + + + org.apache.maven.plugins + maven-surefire-plugin + + + integration-test + + test + + + + **/*ManualTest.java + + + **/*IntegrationTest.java + + + + + + + json + + + + + + + + + + + + 21.0 + 3.5 + 3.6.1 + 2.5 + 4.1 + 4.01 + 1.10 + 1.16.12 + + + 3.6.1 + 1.7.0 + + \ No newline at end of file diff --git a/core-java-8/src/test/java/com/baeldung/counter/CounterStatistics.java b/core-java-8/src/test/java/com/baeldung/counter/CounterStatistics.java new file mode 100644 index 0000000000..2a42a166fa --- /dev/null +++ b/core-java-8/src/test/java/com/baeldung/counter/CounterStatistics.java @@ -0,0 +1,45 @@ +package com.baeldung.counter; + +import java.util.HashMap; +import java.util.Map; + +import org.openjdk.jmh.annotations.Benchmark; +import org.openjdk.jmh.annotations.BenchmarkMode; +import org.openjdk.jmh.annotations.Fork; +import org.openjdk.jmh.annotations.Mode; + +import com.baeldung.counter.CounterUtil.MutableInteger; + +@Fork(value = 1, warmups = 3) +@BenchmarkMode(Mode.All) +public class CounterStatistics { + + private static final Map counterMap = new HashMap<>(); + private static final Map counterWithMutableIntMap = new HashMap<>(); + private static final Map counterWithIntArrayMap = new HashMap<>(); + private static final Map counterWithLongWrapperMap = new HashMap<>(); + + @Benchmark + public void wrapperAsCounter() { + CounterUtil.counterWithWrapperObject(counterMap); + } + + @Benchmark + public void lambdaExpressionWithWrapper() { + CounterUtil.counterWithLambdaAndWrapper(counterWithLongWrapperMap); + } + + @Benchmark + public void mutableIntegerAsCounter() { + CounterUtil.counterWithMutableInteger(counterWithMutableIntMap); + } + + @Benchmark + public void primitiveArrayAsCounter() { + CounterUtil.counterWithPrimitiveArray(counterWithIntArrayMap); + } + + public static void main(String[] args) throws Exception { + org.openjdk.jmh.Main.main(args); + } +} diff --git a/core-java-8/src/test/java/com/baeldung/counter/CounterTest.java b/core-java-8/src/test/java/com/baeldung/counter/CounterTest.java new file mode 100644 index 0000000000..657b510452 --- /dev/null +++ b/core-java-8/src/test/java/com/baeldung/counter/CounterTest.java @@ -0,0 +1,53 @@ +package com.baeldung.counter; + +import java.util.HashMap; +import java.util.Map; + +import static org.junit.Assert.*; + +import org.junit.Test; + +import com.baeldung.counter.CounterUtil.MutableInteger; + +public class CounterTest { + + @Test + public void whenMapWithWrapperAsCounter_runsSuccessfully() { + Map counterMap = new HashMap<>(); + CounterUtil.counterWithWrapperObject(counterMap); + + assertEquals(3, counterMap.get("China") + .intValue()); + assertEquals(2, counterMap.get("India") + .intValue()); + } + + @Test + public void whenMapWithLambdaAndWrapperCounter_runsSuccessfully() { + Map counterMap = new HashMap<>(); + CounterUtil.counterWithLambdaAndWrapper(counterMap); + + assertEquals(3l, counterMap.get("China") + .longValue()); + assertEquals(2l, counterMap.get("India") + .longValue()); + } + + @Test + public void whenMapWithMutableIntegerCounter_runsSuccessfully() { + Map counterMap = new HashMap<>(); + CounterUtil.counterWithMutableInteger(counterMap); + assertEquals(3, counterMap.get("China") + .getCount()); + assertEquals(2, counterMap.get("India") + .getCount()); + } + + @Test + public void whenMapWithPrimitiveArray_runsSuccessfully() { + Map counterMap = new HashMap<>(); + CounterUtil.counterWithPrimitiveArray(counterMap); + assertEquals(3, counterMap.get("China")[0]); + assertEquals(2, counterMap.get("India")[0]); + } +} diff --git a/core-java-8/src/test/java/com/baeldung/counter/CounterUtil.java b/core-java-8/src/test/java/com/baeldung/counter/CounterUtil.java new file mode 100644 index 0000000000..647fbfb0cc --- /dev/null +++ b/core-java-8/src/test/java/com/baeldung/counter/CounterUtil.java @@ -0,0 +1,61 @@ +package com.baeldung.counter; + +import java.util.Map; +import java.util.stream.Collectors; +import java.util.stream.Stream; + +public class CounterUtil { + + private final static String[] COUNTRY_NAMES = { "China", "Australia", "India", "USA", "USSR", "UK", "China", "France", "Poland", "Austria", "India", "USA", "Egypt", "China" }; + + public static void counterWithWrapperObject(Map counterMap) { + for (String country : COUNTRY_NAMES) { + counterMap.compute(country, (k, v) -> v == null ? 1 : v + 1); + } + } + + public static void counterWithLambdaAndWrapper(Map counterMap) { + counterMap.putAll(Stream.of(COUNTRY_NAMES) + .parallel() + .collect(Collectors.groupingBy(k -> k, Collectors.counting()))); + } + + public static class MutableInteger { + int count; + + public MutableInteger(int count) { + this.count = count; + } + + public void increment() { + this.count++; + } + + public int getCount() { + return this.count; + } + } + + public static void counterWithMutableInteger(Map counterMap) { + for (String country : COUNTRY_NAMES) { + MutableInteger oldValue = counterMap.get(country); + if (oldValue != null) { + oldValue.increment(); + } else { + counterMap.put(country, new MutableInteger(1)); + } + } + } + + public static void counterWithPrimitiveArray(Map counterMap) { + for (String country : COUNTRY_NAMES) { + int[] oldCounter = counterMap.get(country); + if (oldCounter != null) { + oldCounter[0] += 1; + } else { + counterMap.put(country, new int[] { 1 }); + } + } + } + +} From a523437dc05e7858075ea05f87093678cf85ce97 Mon Sep 17 00:00:00 2001 From: Ahmed Tawila Date: Mon, 4 Dec 2017 00:09:43 +0200 Subject: [PATCH 151/236] Future in Vavr --- .../src/main/java/com/vavr/future/Tester.java | 57 -------- vavr/src/main/java/com/vavr/future/Util.java | 12 ++ .../test/java/com/vavr/future/FutureTest.java | 137 ++++++++++++++++++ 3 files changed, 149 insertions(+), 57 deletions(-) delete mode 100644 vavr/src/main/java/com/vavr/future/Tester.java create mode 100644 vavr/src/main/java/com/vavr/future/Util.java create mode 100644 vavr/src/test/java/com/vavr/future/FutureTest.java diff --git a/vavr/src/main/java/com/vavr/future/Tester.java b/vavr/src/main/java/com/vavr/future/Tester.java deleted file mode 100644 index 438bc67abf..0000000000 --- a/vavr/src/main/java/com/vavr/future/Tester.java +++ /dev/null @@ -1,57 +0,0 @@ -package com.vavr.future; - -import static org.junit.Assert.assertEquals; - -import java.util.concurrent.ExecutorService; - -import org.junit.Test; - -import io.vavr.concurrent.Future; - -public class Tester { - - @Test - public void whenAppendData_thenCorrect() { - String initialValue = "Welcome to "; - Future resultFuture = Future.of(() -> appendData(initialValue)); - String result = resultFuture.get(); - - assertEquals("Welcome to Baeldung!", result); - } - - @Test - public void whenAppendData_thenSuccess() { - String initialValue = "Welcome to "; - Future resultFuture = Future.of(() -> appendData(initialValue)) - .onSuccess(finalResult -> System.out.println("Successfully Completed - Result: " + finalResult)) - .onFailure(finalResult -> System.out.println("Failed - Result: " + finalResult)); - String result = resultFuture.get(); - - assertEquals("Welcome to Baeldung!", result); - } - - @Test - public void whenChainingCallbacks_thenCorrect() { - String initialValue = "Welcome to "; - Future resultFuture = Future.of(() -> appendData(initialValue)) - .andThen(finalResult -> System.out.println("Completed - 1: " + finalResult)) - .andThen(finalResult -> System.out.println("Completed - 2: " + finalResult)); - String result = resultFuture.get(); - - assertEquals("Welcome to Baeldung!", result); - } - - @Test - public void whenCallAwait_thenCorrect() { - String initialValue = "Welcome to "; - Future resultFuture = Future.of(() -> appendData(initialValue)); - resultFuture = resultFuture.await(); - String result = resultFuture.get(); - - assertEquals("Welcome to Baeldung!", result); - } - - public String appendData(String initial) { - return initial + "Baeldung!"; - } -} diff --git a/vavr/src/main/java/com/vavr/future/Util.java b/vavr/src/main/java/com/vavr/future/Util.java new file mode 100644 index 0000000000..bd8d623af7 --- /dev/null +++ b/vavr/src/main/java/com/vavr/future/Util.java @@ -0,0 +1,12 @@ +package com.vavr.future; + +public class Util { + + public static String appendData(String initial) { + return initial + "Baeldung!"; + } + + public static int divideByZero(int num) { + return num / 0; + } +} diff --git a/vavr/src/test/java/com/vavr/future/FutureTest.java b/vavr/src/test/java/com/vavr/future/FutureTest.java new file mode 100644 index 0000000000..bac4487c83 --- /dev/null +++ b/vavr/src/test/java/com/vavr/future/FutureTest.java @@ -0,0 +1,137 @@ +package com.vavr.future; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertTrue; + +import java.util.concurrent.CompletableFuture; +import java.util.concurrent.ExecutionException; + +import org.junit.Test; + +import io.vavr.Tuple; +import io.vavr.Tuple2; +import io.vavr.concurrent.Future; +import io.vavr.control.Option; +import io.vavr.control.Try; + +public class FutureTest { + + @Test + public void whenAppendData_thenCorrect1() { + String initialValue = "Welcome to "; + Future resultFuture = Future.of(() -> Util.appendData(initialValue)); + String result = resultFuture.get(); + + assertEquals("Welcome to Baeldung!", result); + } + + @Test + public void whenAppendData_thenCorrect2() { + String initialValue = "Welcome to "; + Future resultFuture = Future.of(() -> Util.appendData(initialValue)); + resultFuture.await(); + Option> futureOption = resultFuture.getValue(); + Try futureTry = futureOption.get(); + String result = futureTry.get(); + + assertEquals("Welcome to Baeldung!", result); + } + + @Test + public void whenAppendData_thenSuccess() { + String initialValue = "Welcome to "; + Future resultFuture = Future.of(() -> Util.appendData(initialValue)) + .onSuccess(finalResult -> System.out.println("Successfully Completed - Result: " + finalResult)) + .onFailure(finalResult -> System.out.println("Failed - Result: " + finalResult)); + String result = resultFuture.get(); + + assertEquals("Welcome to Baeldung!", result); + } + + @Test + public void whenChainingCallbacks_thenCorrect() { + String initialValue = "Welcome to "; + Future resultFuture = Future.of(() -> Util.appendData(initialValue)) + .andThen(finalResult -> System.out.println("Completed - 1: " + finalResult)) + .andThen(finalResult -> System.out.println("Completed - 2: " + finalResult)); + String result = resultFuture.get(); + + assertEquals("Welcome to Baeldung!", result); + } + + @Test + public void whenCallAwait_thenCorrect() { + String initialValue = "Welcome to "; + Future resultFuture = Future.of(() -> Util.appendData(initialValue)); + resultFuture = resultFuture.await(); + String result = resultFuture.get(); + + assertEquals("Welcome to Baeldung!", result); + } + + @Test + public void whenDivideByZero_thenGetThrowable1() { + Future resultFuture = Future.of(() -> Util.divideByZero(10)); + Future throwableFuture = resultFuture.failed(); + Throwable throwable = throwableFuture.get(); + + assertEquals("/ by zero", throwable.getMessage()); + } + + @Test + public void whenDivideByZero_thenGetThrowable2() { + Future resultFuture = Future.of(() -> Util.divideByZero(10)); + resultFuture.await(); + Option throwableOption = resultFuture.getCause(); + Throwable throwable = throwableOption.get(); + + assertEquals("/ by zero", throwable.getMessage()); + } + + @Test + public void whenDivideByZero_thenCorrect() throws InterruptedException { + Future resultFuture = Future.of(() -> Util.divideByZero(10)); + resultFuture.await(); + + assertTrue(resultFuture.isCompleted()); + assertFalse(resultFuture.isSuccess()); + assertTrue(resultFuture.isFailure()); + } + + @Test + public void whenAppendData_thenFutureNotEmpty() { + String initialValue = "Welcome to "; + Future resultFuture = Future.of(() -> Util.appendData(initialValue)); + resultFuture.await(); + + assertFalse(resultFuture.isEmpty()); + } + + @Test + public void whenCallZip_thenCorrect() { + Future> future = Future.of(() -> "John") + .zip(Future.of(() -> new Integer(5))); + future.await(); + + assertEquals(Tuple.of("John", new Integer(5)), future.get()); + } + + @Test + public void whenAppendData_thenFutureNotEmptyd() throws InterruptedException, ExecutionException { + String initialValue = "Welcome to "; + Future resultFuture = Future.of(() -> Util.appendData(initialValue)); + CompletableFuture convertedFuture = resultFuture.toCompletableFuture(); + + assertEquals("Welcome to Baeldung!", convertedFuture.get()); + } + + @Test + public void whenCallMap_thenCorrect() { + Future futureResult = Future.of(() -> new StringBuilder("from Baeldung")) + .map(a -> "Hello " + a); + futureResult.await(); + + assertEquals("Hello from Baeldung", futureResult.get()); + } +} From ebc28dbe980fe490d7bb6837d4ed3b802836a0f4 Mon Sep 17 00:00:00 2001 From: Ahmed Tawila Date: Mon, 4 Dec 2017 00:19:58 +0200 Subject: [PATCH 152/236] Future in Vavr --- .../java/com/baeldung/vavr/future/Tester.java | 22 -- .../com/{ => baeldung}/vavr/future/Util.java | 2 +- .../vavr/future/FutureTest.java | 2 +- .../baeldung/vavr/future/FutureUnitTest.java | 289 ------------------ 4 files changed, 2 insertions(+), 313 deletions(-) delete mode 100644 vavr/src/main/java/com/baeldung/vavr/future/Tester.java rename vavr/src/main/java/com/{ => baeldung}/vavr/future/Util.java (85%) rename vavr/src/test/java/com/{ => baeldung}/vavr/future/FutureTest.java (99%) delete mode 100644 vavr/src/test/java/com/baeldung/vavr/future/FutureUnitTest.java diff --git a/vavr/src/main/java/com/baeldung/vavr/future/Tester.java b/vavr/src/main/java/com/baeldung/vavr/future/Tester.java deleted file mode 100644 index 7e07027509..0000000000 --- a/vavr/src/main/java/com/baeldung/vavr/future/Tester.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.baeldung.vavr.future; - -import static org.junit.Assert.assertEquals; -import org.junit.Test; - -import io.vavr.concurrent.Future; - -public class Tester { - - @Test - public void start() { - Future resultFuture = Future.of(() -> addOne(4)); - Integer result = resultFuture.get(); - - assertEquals(5, (int) result); - } - - public Integer addOne(Integer num) { - return num + 1; - } - -} diff --git a/vavr/src/main/java/com/vavr/future/Util.java b/vavr/src/main/java/com/baeldung/vavr/future/Util.java similarity index 85% rename from vavr/src/main/java/com/vavr/future/Util.java rename to vavr/src/main/java/com/baeldung/vavr/future/Util.java index bd8d623af7..9339a6742e 100644 --- a/vavr/src/main/java/com/vavr/future/Util.java +++ b/vavr/src/main/java/com/baeldung/vavr/future/Util.java @@ -1,4 +1,4 @@ -package com.vavr.future; +package com.baeldung.vavr.future; public class Util { diff --git a/vavr/src/test/java/com/vavr/future/FutureTest.java b/vavr/src/test/java/com/baeldung/vavr/future/FutureTest.java similarity index 99% rename from vavr/src/test/java/com/vavr/future/FutureTest.java rename to vavr/src/test/java/com/baeldung/vavr/future/FutureTest.java index bac4487c83..ae05748124 100644 --- a/vavr/src/test/java/com/vavr/future/FutureTest.java +++ b/vavr/src/test/java/com/baeldung/vavr/future/FutureTest.java @@ -1,4 +1,4 @@ -package com.vavr.future; +package com.baeldung.vavr.future; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; diff --git a/vavr/src/test/java/com/baeldung/vavr/future/FutureUnitTest.java b/vavr/src/test/java/com/baeldung/vavr/future/FutureUnitTest.java deleted file mode 100644 index 437742c964..0000000000 --- a/vavr/src/test/java/com/baeldung/vavr/future/FutureUnitTest.java +++ /dev/null @@ -1,289 +0,0 @@ -package com.baeldung.vavr.future; - -import static io.vavr.API.$; -import static io.vavr.API.Case; -import static io.vavr.API.Match; -import static io.vavr.Predicates.exists; -import static io.vavr.Predicates.forAll; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertTrue; - -import java.util.concurrent.CancellationException; -import java.util.function.Consumer; -import java.util.function.Predicate; - -import org.junit.Test; -import org.mockito.Mockito; -import org.mockito.internal.verification.VerificationModeFactory; -import org.mockito.verification.Timeout; - -import io.vavr.Tuple; -import io.vavr.Tuple2; -import io.vavr.collection.List; -import io.vavr.concurrent.Future; -import io.vavr.control.Try; - -public class FutureUnitTest { - - private final String SUCCESS = "Success"; - private final String FAILURE = "Failure"; - - @Test - public void givenFunctionReturnInteger_WhenCallWithFuture_ShouldReturnFunctionValue() { - Future future = Future.of(() -> 1); - - assertEquals(1, future.get().intValue()); - } - - @Test - public void givenFunctionGetRemoteHttpResourceAsString_WhenCallSuccessWithFuture_ShouldReturnContentValueAsString() { - String url = "http://resource"; - String content = "Content from " + url; - Future future = Future.of(() -> getResource(url)); - - assertEquals(content, future.get()); - } - - @Test - public void givenFunctionThrowException_WhenCallWithFuture_ShouldReturnFailure() { - Future future = Future.of(() -> getResourceThrowException("")); - future.await(); - - assertTrue(future.isFailure()); - } - - @Test - public void givenAFutureReturnZero_WhenCheckFutureWithExistEvenValue_ShouldReturnRight() { - Future future = Future.of(() -> 2); - boolean result = future.exists(i -> i % 2 == 0); - - assertTrue(result); - } - - @Test - public void givenFunction_WhenCallWithFutureAndRegisterConsumerForSuccess_ShouldCallConsumerToStoreValue() { - Future future = Future.of(() -> 1); - MockConsumer consumer = Mockito.mock(MockConsumer.class); - future.onSuccess(consumer); - Mockito.verify(consumer, new Timeout(1000, VerificationModeFactory.times(1))).accept(1); - } - - @Test - public void givenFunctionThrowException_WhenCallWithFutureAndRegisterConsumerForFailer_ShouldCallConsumerToStoreException() { - Future future = Future.of(() -> getResourceThrowException("")); - MockThrowableConsumer consumer = Mockito.mock(MockThrowableConsumer.class); - future.onFailure(consumer); - Mockito.verify(consumer, new Timeout(1000, VerificationModeFactory.times(1))).accept(Mockito.any()); - } - - @Test - public void givenAFuture_WhenAddAndThenConsumer_ShouldCallConsumerWithResultOfFutureAction() { - MockTryConsumer consumer1 = Mockito.mock(MockTryConsumer.class); - MockTryConsumer consumer2 = Mockito.mock(MockTryConsumer.class); - Future future = Future.of(() -> 1); - Future andThenFuture = future.andThen(consumer1).andThen(consumer2); - andThenFuture.await(); - Mockito.verify(consumer1, VerificationModeFactory.times(1)).accept(Try.success(1)); - Mockito.verify(consumer2, VerificationModeFactory.times(1)).accept(Try.success(1)); - } - - @Test - public void givenAFailureFuture_WhenCallOrElseFunction_ShouldReturnNewFuture() { - Future future = Future.failed(new RuntimeException()); - Future future2 = future.orElse(Future.of(() -> 2)); - - assertEquals(2, future2.get().intValue()); - } - - @Test(expected = CancellationException.class) - public void givenAFuture_WhenCallCancel_ShouldReturnCancellationException() { - long waitTime = 1000; - Future future = Future.of(() -> { - Thread.sleep(waitTime); - return 1; - }); - future.cancel(); - future.await(); - future.get(); - } - - @Test - public void givenAFuture_WhenCallFallBackWithSuccessFuture_ShouldReturnFutureResult() { - String expectedResult = "take this"; - Future future = Future.of(() -> expectedResult); - Future secondFuture = Future.of(() -> "take that"); - Future futureResult = future.fallbackTo(secondFuture); - futureResult.await(); - - assertEquals(expectedResult, futureResult.get()); - } - - @Test - public void givenAFuture_WhenCallFallBackWithFailureFuture_ShouldReturnValueOfFallBackFuture() { - String expectedResult = "take that"; - Future future = Future.failed(new RuntimeException()); - Future fallbackFuture = Future.of(() -> expectedResult); - Future futureResult = future.fallbackTo(fallbackFuture); - - assertEquals(expectedResult, futureResult.get()); - } - - @Test - public void givenAFuture_WhenTransformByAddingOne_ShouldReturn() { - Future future = Future.of(() -> 1).transformValue(f -> Try.of(() -> "Hello: " + f.get())); - - assertEquals("Hello: 1", future.get()); - } - - @Test - public void givenAFutureOfInt_WhenMapToString_ShouldCombineAndReturn() { - Future future = Future.of(()->1).map(i -> "Hello: " + i); - - assertEquals("Hello: 1", future.get()); - } - - @Test - public void givenAFutureOfInt_WhenFlatMapToString_ShouldCombineAndReturn() { - Future futureMap = Future.of(() -> 1).flatMap((i) -> Future.of(() -> "Hello: " + i)); - - assertEquals("Hello: 1", futureMap.get()); - } - - @Test - public void givenAFutureOf2String_WhenZip_ShouldReturnTupleOf2String() { - Future> future = Future.of(() -> "hello").zip(Future.of(() -> "world")); - - assertEquals(Tuple.of("hello", "world"), future.get()); - } - - @Test - public void givenGetResourceWithFuture_WhenWaitAndMatchWithPredicate_ShouldReturnSuccess() { - String url = "http://resource"; - Future future = Future.of(() -> getResource(url)); - future.await(); - String s = Match(future).of( - Case($(future0 -> future0.isSuccess()), SUCCESS), - Case($(), FAILURE)); - - assertEquals(SUCCESS, s); - } - - @Test - public void givenAFailedFuture_WhenWaitAndMatchWithPredicateCheckSuccess_ShouldReturnFailed() { - Future future = Future.failed(new RuntimeException()); - future.await(); - String s = Match(future).of( - Case($(future0 -> future0.isSuccess()), SUCCESS), - Case($(), FAILURE)); - - assertEquals(FAILURE, s); - } - - @Test - public void givenAFuture_WhenMatchWithFuturePredicate_ShouldReturnSuccess() { - Future future = Future.of(() -> { - Thread.sleep(10); - return 1; - }); - Predicate> predicate = f -> f.exists(i -> i % 2 == 1); - - String s = Match(future).of( - Case($(predicate), "Even"), - Case($(), "Odd")); - - assertEquals("Even", s); - } - - @Test - public void givenAListOfFutureReturnFist3Integers_WhenMatchWithExistEvenNumberPredicate_ShouldReturnSuccess() { - List> futures = getFutureOfFirst3Number(); - Predicate> predicate0 = future -> future.exists(i -> i % 2 == 0); - String s = Match(futures).of( - Case($(exists(predicate0)), "Even"), - Case($(), "Odd")); - - assertEquals("Even", s); - } - - @Test - public void givenAListOfFutureReturnFist3Integers_WhenMatchWithForAllNumberBiggerThanZeroPredicate_ShouldReturnSuccess() { - List> futures = getFutureOfFirst3Number(); - Predicate> predicate0 = future -> future.exists(i -> i > 0); - String s = Match(futures).of( - Case($(forAll(predicate0)), "Positive numbers"), - Case($(), "None")); - - assertEquals("Positive numbers", s); - } - - @Test - public void givenAListOfFutureReturnFist3Integers_WhenMatchWithForAllNumberSmallerThanZeroPredicate_ShouldReturnFailed() { - List> futures = getFutureOfFirst3Number(); - Predicate> predicate0 = future -> future.exists(i -> i < 0); - String s = Match(futures).of( - Case($(forAll(predicate0)), "Negative numbers"), - Case($(), "None")); - - assertEquals("None", s); - } - - private String getResource(String url) { - try { - Thread.sleep(10); - } catch (InterruptedException e) { - throw new RuntimeException(e); - } - return "Content from " + url; - } - - private String getResourceThrowException(String url) { - throw new RuntimeException("Exception when get resource " + url); - } - - private List> getFutureOfFirst3Number() { - List> futures = List.of(Future.of(() -> 1), Future.of(() -> 2), Future.of(() -> 3)); - return futures; - } - - private static void checkOnSuccessFunction() { - Future future = Future.of(() -> 1); - future.onSuccess(i -> System.out.println("Future finish with result: " + i)); - } - - private static void checkOnFailureFunction() { - Future future = Future.of(() -> {throw new RuntimeException("Failed");}); - future.onFailure(t -> System.out.println("Future failures with exception: " + t)); - } - - private static void runAndThenConsumer() { - Future future = Future.of(() -> 1); - future.andThen(i -> System.out.println("Do side-effect action 1 with input: " + i.get())). - andThen((i) -> System.out.println("Do side-effect action 2 with input: " + i.get())); - } - - public static void main(String[] args) throws InterruptedException { - checkOnSuccessFunction(); - checkOnFailureFunction(); - runAndThenConsumer(); - Thread.sleep(1000); - } -} - - -class MockConsumer implements Consumer { - @Override - public void accept(Integer t) { - } -} - -class MockTryConsumer implements Consumer> { - @Override - public void accept(Try t) { - } -} - -class MockThrowableConsumer implements Consumer { - @Override - public void accept(Throwable t) { - } -} From 7f23c45ef4e747f460f1d1e2f6890be11d4e7da5 Mon Sep 17 00:00:00 2001 From: Taylor Daugherty Date: Mon, 4 Dec 2017 01:40:21 -0500 Subject: [PATCH 153/236] [BAEL-1300] Custom Logback Appender (#3193) * BAEL-1300 Custom logback appender * BAEL-1300 fix to logback module * relativePath --- libraries/helloWorld.docx | Bin 0 -> 76895 bytes logging-modules/logback/README.md | 0 logging-modules/logback/pom.xml | 35 ++++++++++ .../java/com/baeldung/logback/Example.java | 14 ++++ .../com/baeldung/logback/MapAppender.java | 37 +++++++++++ .../logback/src/main/resources/logback.xml | 18 ++++++ .../logback/MapAppenderIntegrationTest.java | 33 ++++++++++ .../com/baeldung/logback/MapAppenderTest.java | 60 ++++++++++++++++++ .../src/test/resources/logback-test.xml | 14 ++++ pom.xml | 1 + xml/src/test/resources/example_dom4j_new.xml | 10 +++ xml/src/test/resources/example_jaxb_new.xml | 9 +++ 12 files changed, 231 insertions(+) create mode 100644 libraries/helloWorld.docx create mode 100644 logging-modules/logback/README.md create mode 100644 logging-modules/logback/pom.xml create mode 100644 logging-modules/logback/src/main/java/com/baeldung/logback/Example.java create mode 100644 logging-modules/logback/src/main/java/com/baeldung/logback/MapAppender.java create mode 100644 logging-modules/logback/src/main/resources/logback.xml create mode 100644 logging-modules/logback/src/test/java/com/baeldung/logback/MapAppenderIntegrationTest.java create mode 100644 logging-modules/logback/src/test/java/com/baeldung/logback/MapAppenderTest.java create mode 100644 logging-modules/logback/src/test/resources/logback-test.xml create mode 100644 xml/src/test/resources/example_dom4j_new.xml create mode 100644 xml/src/test/resources/example_jaxb_new.xml diff --git a/libraries/helloWorld.docx b/libraries/helloWorld.docx new file mode 100644 index 0000000000000000000000000000000000000000..09e71a4d4ec07142de51e5d046b0ac8326d7e7f5 GIT binary patch literal 76895 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�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 Gfd2u|YeTgF literal 0 HcmV?d00001 diff --git a/logging-modules/logback/README.md b/logging-modules/logback/README.md new file mode 100644 index 0000000000..e69de29bb2 diff --git a/logging-modules/logback/pom.xml b/logging-modules/logback/pom.xml new file mode 100644 index 0000000000..8169134442 --- /dev/null +++ b/logging-modules/logback/pom.xml @@ -0,0 +1,35 @@ + + + + 4.0.0 + + logback + logback + 0.1-SNAPSHOT + + + UTF-8 + 1.2.3 + + + + com.baeldung + parent-modules + 1.0.0-SNAPSHOT + ../../ + + + + + + ch.qos.logback + logback-classic + ${logback.version} + + + + + + diff --git a/logging-modules/logback/src/main/java/com/baeldung/logback/Example.java b/logging-modules/logback/src/main/java/com/baeldung/logback/Example.java new file mode 100644 index 0000000000..e3d09dc321 --- /dev/null +++ b/logging-modules/logback/src/main/java/com/baeldung/logback/Example.java @@ -0,0 +1,14 @@ +package com.baeldung.logback; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class Example { + + private static final Logger logger = LoggerFactory.getLogger(Example.class); + + public static void main(String[] args) { + logger.info("Example log from {}", Example.class.getSimpleName()); + } + +} diff --git a/logging-modules/logback/src/main/java/com/baeldung/logback/MapAppender.java b/logging-modules/logback/src/main/java/com/baeldung/logback/MapAppender.java new file mode 100644 index 0000000000..99cc6488e5 --- /dev/null +++ b/logging-modules/logback/src/main/java/com/baeldung/logback/MapAppender.java @@ -0,0 +1,37 @@ +package com.baeldung.logback; + +import ch.qos.logback.classic.spi.ILoggingEvent; +import ch.qos.logback.core.AppenderBase; + +import java.util.HashMap; +import java.util.Map; + +public class MapAppender extends AppenderBase { + + private final Map eventMap = new HashMap<>(); + + private String prefix; + + @Override + protected void append(final ILoggingEvent event) { + if (prefix == null || "".equals(prefix)) { + addError("Prefix is not set for MapAppender."); + return; + } + + eventMap.put(prefix + System.currentTimeMillis(), event); + } + + public String getPrefix() { + return prefix; + } + + public void setPrefix(final String prefix) { + this.prefix = prefix; + } + + public Map getEventMap() { + return eventMap; + } + +} diff --git a/logging-modules/logback/src/main/resources/logback.xml b/logging-modules/logback/src/main/resources/logback.xml new file mode 100644 index 0000000000..37ae2adbb0 --- /dev/null +++ b/logging-modules/logback/src/main/resources/logback.xml @@ -0,0 +1,18 @@ + + + + test + + + + + %d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n + + + + + + + + + \ No newline at end of file diff --git a/logging-modules/logback/src/test/java/com/baeldung/logback/MapAppenderIntegrationTest.java b/logging-modules/logback/src/test/java/com/baeldung/logback/MapAppenderIntegrationTest.java new file mode 100644 index 0000000000..20366a229d --- /dev/null +++ b/logging-modules/logback/src/test/java/com/baeldung/logback/MapAppenderIntegrationTest.java @@ -0,0 +1,33 @@ +package com.baeldung.logback; + +import ch.qos.logback.classic.Logger; +import org.junit.Before; +import org.junit.Test; +import org.slf4j.LoggerFactory; + +import static org.junit.Assert.assertEquals; + +public class MapAppenderIntegrationTest { + + private Logger rootLogger; + + @Before + public void setUp() throws Exception { + rootLogger = (Logger) LoggerFactory.getLogger("ROOT"); + } + + @Test + public void whenLoggerEmitsLoggingEvent_thenAppenderReceivesEvent() throws Exception { + rootLogger.info("Test from {}", this.getClass().getSimpleName()); + MapAppender appender = (MapAppender) rootLogger.getAppender("map"); + assertEquals(appender.getEventMap().size(), 1); + } + + @Test + public void givenNoPrefixSet_whenLoggerEmitsEvent_thenAppenderReceivesNoEvent() throws Exception { + rootLogger.info("Test from {}", this.getClass().getSimpleName()); + MapAppender appender = (MapAppender) rootLogger.getAppender("badMap"); + assertEquals(appender.getEventMap().size(), 0); + } + +} diff --git a/logging-modules/logback/src/test/java/com/baeldung/logback/MapAppenderTest.java b/logging-modules/logback/src/test/java/com/baeldung/logback/MapAppenderTest.java new file mode 100644 index 0000000000..a5a938a923 --- /dev/null +++ b/logging-modules/logback/src/test/java/com/baeldung/logback/MapAppenderTest.java @@ -0,0 +1,60 @@ +package com.baeldung.logback; + +import ch.qos.logback.classic.Level; +import ch.qos.logback.classic.LoggerContext; +import ch.qos.logback.classic.spi.LoggingEvent; +import ch.qos.logback.core.BasicStatusManager; +import org.junit.After; +import org.junit.Before; +import org.junit.Test; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertTrue; + +public class MapAppenderTest { + + private LoggerContext ctx; + + private MapAppender mapAppender = new MapAppender(); + + private LoggingEvent event; + + @Before + public void setUp() throws Exception { + ctx = new LoggerContext(); + ctx.setName("test context"); + ctx.setStatusManager(new BasicStatusManager()); + mapAppender.setContext(ctx); + mapAppender.setPrefix("prefix"); + event = new LoggingEvent("fqcn", ctx.getLogger("logger"), Level.INFO, "Test message for logback appender", null, new Object[0]); + ctx.start(); + } + + @After + public void tearDown() throws Exception { + ctx.stop(); + mapAppender.stop(); + } + + @Test + public void whenPrefixIsNull_thenMapAppenderDoesNotLog() throws Exception { + mapAppender.setPrefix(null); + mapAppender.append(event); + assertTrue(mapAppender.getEventMap().isEmpty()); + } + + @Test + public void whenPrefixIsEmpty_thenMapAppenderDoesNotLog() throws Exception { + mapAppender.setPrefix(""); + mapAppender.append(event); + assertTrue(mapAppender.getEventMap().isEmpty()); + } + + @Test + public void whenLogMessageIsEmitted_thenMapAppenderReceivesMessage() throws Exception { + mapAppender.append(event); + assertEquals(mapAppender.getEventMap().size(), 1); + mapAppender.getEventMap().forEach((k, v) -> assertTrue(k.startsWith("prefix"))); + } + +} diff --git a/logging-modules/logback/src/test/resources/logback-test.xml b/logging-modules/logback/src/test/resources/logback-test.xml new file mode 100644 index 0000000000..8254e6ac80 --- /dev/null +++ b/logging-modules/logback/src/test/resources/logback-test.xml @@ -0,0 +1,14 @@ + + + + test + + + + + + + + + + \ No newline at end of file diff --git a/pom.xml b/pom.xml index cac0cc5845..c8fa30e8c9 100644 --- a/pom.xml +++ b/pom.xml @@ -107,6 +107,7 @@ logging-modules/log-mdc logging-modules/log4j logging-modules/log4j2 + logging-modules/logback lombok mapstruct diff --git a/xml/src/test/resources/example_dom4j_new.xml b/xml/src/test/resources/example_dom4j_new.xml new file mode 100644 index 0000000000..020760fdd3 --- /dev/null +++ b/xml/src/test/resources/example_dom4j_new.xml @@ -0,0 +1,10 @@ + + + + + XML with Dom4J + XML handling with Dom4J + 14/06/2016 + Dom4J tech writer + + diff --git a/xml/src/test/resources/example_jaxb_new.xml b/xml/src/test/resources/example_jaxb_new.xml new file mode 100644 index 0000000000..646d938869 --- /dev/null +++ b/xml/src/test/resources/example_jaxb_new.xml @@ -0,0 +1,9 @@ + + + + Jaxb author + 04/02/2015 + XML Binding with Jaxb + XML with Jaxb + + From 059e66da30976ea19b8cb52030a7743d239b0f6f Mon Sep 17 00:00:00 2001 From: Jose Carvajal Date: Mon, 4 Dec 2017 08:53:58 +0100 Subject: [PATCH 154/236] BAEL-1174: A Quick Guide to Spring Cloud Consul: Changes after senior code review --- .../discovery/DiscoveryClientApplication.java | 45 +---------------- .../discovery/DiscoveryClientController.java | 50 +++++++++++++++++++ .../health/ServiceDiscoveryApplication.java | 15 ------ .../health/ServiceDiscoveryController.java | 22 ++++++++ .../DistributedPropertiesApplication.java | 20 +------- .../DistributedPropertiesController.java | 27 ++++++++++ .../cloud/consul/properties/MyProperties.java | 2 + .../ribbon/RibbonClientApplication.java | 47 ----------------- 8 files changed, 103 insertions(+), 125 deletions(-) create mode 100644 spring-cloud/spring-cloud-consul/src/main/java/com/baeldung/spring/cloud/consul/discovery/DiscoveryClientController.java create mode 100644 spring-cloud/spring-cloud-consul/src/main/java/com/baeldung/spring/cloud/consul/health/ServiceDiscoveryController.java create mode 100644 spring-cloud/spring-cloud-consul/src/main/java/com/baeldung/spring/cloud/consul/properties/DistributedPropertiesController.java delete mode 100644 spring-cloud/spring-cloud-consul/src/main/java/com/baeldung/spring/cloud/consul/ribbon/RibbonClientApplication.java diff --git a/spring-cloud/spring-cloud-consul/src/main/java/com/baeldung/spring/cloud/consul/discovery/DiscoveryClientApplication.java b/spring-cloud/spring-cloud-consul/src/main/java/com/baeldung/spring/cloud/consul/discovery/DiscoveryClientApplication.java index b4f42219a4..d013969ad3 100644 --- a/spring-cloud/spring-cloud-consul/src/main/java/com/baeldung/spring/cloud/consul/discovery/DiscoveryClientApplication.java +++ b/spring-cloud/spring-cloud-consul/src/main/java/com/baeldung/spring/cloud/consul/discovery/DiscoveryClientApplication.java @@ -1,59 +1,16 @@ package com.baeldung.spring.cloud.consul.discovery; -import java.net.URI; - -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.builder.SpringApplicationBuilder; -import org.springframework.cloud.client.discovery.DiscoveryClient; import org.springframework.cloud.client.discovery.EnableDiscoveryClient; -import org.springframework.context.annotation.Bean; -import org.springframework.http.HttpStatus; -import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; -import org.springframework.web.client.RestTemplate; @SpringBootApplication @EnableDiscoveryClient -@RestController public class DiscoveryClientApplication { - @Bean - public RestTemplate restTemplate() { - return new RestTemplate(); - } - - @Autowired - private DiscoveryClient discoveryClient; - - @GetMapping("/discoveryClient") - public String home() { - return restTemplate().getForEntity(serviceUrl().resolve("/ping"), String.class) - .getBody(); - } - - @GetMapping("/ping") - public String ping() { - return "pong"; - } - - @RequestMapping("/my-health-check") - public ResponseEntity myCustomCheck() { - return new ResponseEntity<>(HttpStatus.OK); - } - - public URI serviceUrl() { - return discoveryClient.getInstances("myApp") - .stream() - .findFirst() - .map(si -> si.getUri()) - .orElse(null); - } - public static void main(String[] args) { new SpringApplicationBuilder(DiscoveryClientApplication.class).web(true) .run(args); } + } diff --git a/spring-cloud/spring-cloud-consul/src/main/java/com/baeldung/spring/cloud/consul/discovery/DiscoveryClientController.java b/spring-cloud/spring-cloud-consul/src/main/java/com/baeldung/spring/cloud/consul/discovery/DiscoveryClientController.java new file mode 100644 index 0000000000..1436096d10 --- /dev/null +++ b/spring-cloud/spring-cloud-consul/src/main/java/com/baeldung/spring/cloud/consul/discovery/DiscoveryClientController.java @@ -0,0 +1,50 @@ +package com.baeldung.spring.cloud.consul.discovery; + +import java.net.URI; +import java.util.Optional; + +import javax.naming.ServiceUnavailableException; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.cloud.client.discovery.DiscoveryClient; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.client.RestClientException; +import org.springframework.web.client.RestTemplate; + +@RestController +public class DiscoveryClientController { + + @Autowired + private DiscoveryClient discoveryClient; + + private final RestTemplate restTemplate = new RestTemplate(); + + @GetMapping("/discoveryClient") + public String discoveryPing() throws RestClientException, ServiceUnavailableException { + URI service = serviceUrl().map(s -> s.resolve("/ping")) + .orElseThrow(ServiceUnavailableException::new); + return restTemplate.getForEntity(service, String.class) + .getBody(); + } + + @GetMapping("/ping") + public String ping() { + return "pong"; + } + + @GetMapping("/my-health-check") + public ResponseEntity myCustomCheck() { + return new ResponseEntity<>(HttpStatus.OK); + } + + public Optional serviceUrl() { + return discoveryClient.getInstances("myApp") + .stream() + .findFirst() + .map(si -> si.getUri()); + } + +} diff --git a/spring-cloud/spring-cloud-consul/src/main/java/com/baeldung/spring/cloud/consul/health/ServiceDiscoveryApplication.java b/spring-cloud/spring-cloud-consul/src/main/java/com/baeldung/spring/cloud/consul/health/ServiceDiscoveryApplication.java index 7db361eb4f..020d7d017c 100644 --- a/spring-cloud/spring-cloud-consul/src/main/java/com/baeldung/spring/cloud/consul/health/ServiceDiscoveryApplication.java +++ b/spring-cloud/spring-cloud-consul/src/main/java/com/baeldung/spring/cloud/consul/health/ServiceDiscoveryApplication.java @@ -2,24 +2,9 @@ package com.baeldung.spring.cloud.consul.health; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.builder.SpringApplicationBuilder; -import org.springframework.http.HttpStatus; -import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; @SpringBootApplication -@RestController public class ServiceDiscoveryApplication { - @RequestMapping("/my-health-check") - public ResponseEntity myCustomCheck() { - String message = "Testing my healh check function"; - return new ResponseEntity<>(message, HttpStatus.FORBIDDEN); - } - - @RequestMapping("/ping") - public String ping() { - return "pong"; - } public static void main(String[] args) { new SpringApplicationBuilder(ServiceDiscoveryApplication.class).web(true) diff --git a/spring-cloud/spring-cloud-consul/src/main/java/com/baeldung/spring/cloud/consul/health/ServiceDiscoveryController.java b/spring-cloud/spring-cloud-consul/src/main/java/com/baeldung/spring/cloud/consul/health/ServiceDiscoveryController.java new file mode 100644 index 0000000000..20deba993f --- /dev/null +++ b/spring-cloud/spring-cloud-consul/src/main/java/com/baeldung/spring/cloud/consul/health/ServiceDiscoveryController.java @@ -0,0 +1,22 @@ +package com.baeldung.spring.cloud.consul.health; + +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RestController; + +@RestController +public class ServiceDiscoveryController { + + @GetMapping("/ping") + public String ping() { + return "pong"; + } + + @GetMapping("/my-health-check") + public ResponseEntity myCustomCheck() { + String message = "Testing my healh check function"; + return new ResponseEntity<>(message, HttpStatus.FORBIDDEN); + } + +} diff --git a/spring-cloud/spring-cloud-consul/src/main/java/com/baeldung/spring/cloud/consul/properties/DistributedPropertiesApplication.java b/spring-cloud/spring-cloud-consul/src/main/java/com/baeldung/spring/cloud/consul/properties/DistributedPropertiesApplication.java index 919bf08921..c1d2b0acc5 100644 --- a/spring-cloud/spring-cloud-consul/src/main/java/com/baeldung/spring/cloud/consul/properties/DistributedPropertiesApplication.java +++ b/spring-cloud/spring-cloud-consul/src/main/java/com/baeldung/spring/cloud/consul/properties/DistributedPropertiesApplication.java @@ -1,34 +1,16 @@ package com.baeldung.spring.cloud.consul.properties; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.beans.factory.annotation.Value; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.builder.SpringApplicationBuilder; -import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; @SpringBootApplication @RestController public class DistributedPropertiesApplication { - @Value("${my.prop}") - String value; - - @Autowired - private MyProperties properties; - - @RequestMapping("/getConfigFromValue") - public String getConfigFromValue() { - return value; - } - - @RequestMapping("/getConfigFromProperty") - public String getConfigFromProperty() { - return properties.getProp(); - } - public static void main(String[] args) { new SpringApplicationBuilder(DistributedPropertiesApplication.class).web(true) .run(args); } + } diff --git a/spring-cloud/spring-cloud-consul/src/main/java/com/baeldung/spring/cloud/consul/properties/DistributedPropertiesController.java b/spring-cloud/spring-cloud-consul/src/main/java/com/baeldung/spring/cloud/consul/properties/DistributedPropertiesController.java new file mode 100644 index 0000000000..da2d37eb76 --- /dev/null +++ b/spring-cloud/spring-cloud-consul/src/main/java/com/baeldung/spring/cloud/consul/properties/DistributedPropertiesController.java @@ -0,0 +1,27 @@ +package com.baeldung.spring.cloud.consul.properties; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RestController; + +@RestController +public class DistributedPropertiesController { + + @Value("${my.prop}") + String value; + + @Autowired + private MyProperties properties; + + @GetMapping("/getConfigFromValue") + public String getConfigFromValue() { + return value; + } + + @GetMapping("/getConfigFromProperty") + public String getConfigFromProperty() { + return properties.getProp(); + } + +} diff --git a/spring-cloud/spring-cloud-consul/src/main/java/com/baeldung/spring/cloud/consul/properties/MyProperties.java b/spring-cloud/spring-cloud-consul/src/main/java/com/baeldung/spring/cloud/consul/properties/MyProperties.java index 7accac168d..d92b18ed51 100644 --- a/spring-cloud/spring-cloud-consul/src/main/java/com/baeldung/spring/cloud/consul/properties/MyProperties.java +++ b/spring-cloud/spring-cloud-consul/src/main/java/com/baeldung/spring/cloud/consul/properties/MyProperties.java @@ -8,6 +8,7 @@ import org.springframework.context.annotation.Configuration; @Configuration @ConfigurationProperties("my") public class MyProperties { + private String prop; public String getProp() { @@ -17,4 +18,5 @@ public class MyProperties { public void setProp(String prop) { this.prop = prop; } + } diff --git a/spring-cloud/spring-cloud-consul/src/main/java/com/baeldung/spring/cloud/consul/ribbon/RibbonClientApplication.java b/spring-cloud/spring-cloud-consul/src/main/java/com/baeldung/spring/cloud/consul/ribbon/RibbonClientApplication.java deleted file mode 100644 index b2b54fbe8e..0000000000 --- a/spring-cloud/spring-cloud-consul/src/main/java/com/baeldung/spring/cloud/consul/ribbon/RibbonClientApplication.java +++ /dev/null @@ -1,47 +0,0 @@ -package com.baeldung.spring.cloud.consul.ribbon; - -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.autoconfigure.SpringBootApplication; -import org.springframework.boot.builder.SpringApplicationBuilder; -import org.springframework.cloud.client.loadbalancer.LoadBalanced; -import org.springframework.context.annotation.Bean; -import org.springframework.http.HttpStatus; -import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; -import org.springframework.web.client.RestTemplate; - -@SpringBootApplication -@RestController -public class RibbonClientApplication { - - @LoadBalanced - @Bean - RestTemplate getRestTemplate() { - return new RestTemplate(); - } - - @Autowired - RestTemplate restTemplate; - - @RequestMapping("/ribbonClient") - public String home() { - return restTemplate.getForObject("http://myApp/ping", String.class); - } - - @GetMapping("/ping") - public String ping() { - return "pong"; - } - - @RequestMapping("/my-health-check") - public ResponseEntity myCustomCheck() { - return new ResponseEntity<>(HttpStatus.OK); - } - - public static void main(String[] args) { - new SpringApplicationBuilder(RibbonClientApplication.class).web(true) - .run(args); - } -} From d562f429a1b0caba463e90e83ee8f9d3e82e1a21 Mon Sep 17 00:00:00 2001 From: tamasradu Date: Mon, 4 Dec 2017 18:34:13 +0200 Subject: [PATCH 155/236] Radutamas/bael 1265 update junit with lambdas (#3196) * Code for test article: Different Types of Bean Injection in Spring * Adding jUnits for test article: Different Types of Bean Injection in Spring * BAEL-1265: Adding jUnit for article * BAEL-1265: Closing ExecutorService in jUnit * BAEL-1265: Using lambdas instead of anonymous classes --- .../WaitingForThreadsToFinishTest.java | 28 +++++++------------ 1 file changed, 10 insertions(+), 18 deletions(-) diff --git a/core-java-concurrency/src/test/java/com/baeldung/concurrent/executorservice/WaitingForThreadsToFinishTest.java b/core-java-concurrency/src/test/java/com/baeldung/concurrent/executorservice/WaitingForThreadsToFinishTest.java index 17b71aa35b..7e2bf590fd 100644 --- a/core-java-concurrency/src/test/java/com/baeldung/concurrent/executorservice/WaitingForThreadsToFinishTest.java +++ b/core-java-concurrency/src/test/java/com/baeldung/concurrent/executorservice/WaitingForThreadsToFinishTest.java @@ -9,7 +9,6 @@ import java.util.List; import java.util.concurrent.*; import static junit.framework.TestCase.assertTrue; -import static org.junit.Assert.fail; public class WaitingForThreadsToFinishTest { @@ -40,16 +39,13 @@ public class WaitingForThreadsToFinishTest { CountDownLatch latch = new CountDownLatch(2); for (int i = 0; i < 2; i++) { - WORKER_THREAD_POOL.submit(new Runnable() { - @Override - public void run() { - try { - Thread.sleep(1000); - latch.countDown(); - } catch (InterruptedException e) { - e.printStackTrace(); - Thread.currentThread().interrupt(); - } + WORKER_THREAD_POOL.submit(() -> { + try { + Thread.sleep(1000); + latch.countDown(); + } catch (InterruptedException e) { + e.printStackTrace(); + Thread.currentThread().interrupt(); } }); } @@ -83,13 +79,9 @@ public class WaitingForThreadsToFinishTest { awaitTerminationAfterShutdown(WORKER_THREAD_POOL); try { - WORKER_THREAD_POOL.submit(new Callable() { - @Override - public String call() throws Exception { - fail("This thread should have been rejected !"); - Thread.sleep(1000000); - return null; - } + WORKER_THREAD_POOL.submit((Callable) () -> { + Thread.sleep(1000000); + return null; }); } catch (RejectedExecutionException ex) { // From c067162a5676a59fb8f2b9520111e6fb14a15991 Mon Sep 17 00:00:00 2001 From: Dassi Orleando Date: Tue, 5 Dec 2017 05:29:10 +0100 Subject: [PATCH 156/236] Jenkins pipeline script for unix and non-unix OS --- spring-jenkins-pipeline/pom.xml | 3 +- .../scripted-pipeline-unix-nonunix | 91 +++++++++++++++++++ 2 files changed, 93 insertions(+), 1 deletion(-) create mode 100644 spring-jenkins-pipeline/scripted-pipeline-unix-nonunix diff --git a/spring-jenkins-pipeline/pom.xml b/spring-jenkins-pipeline/pom.xml index 1c35f0f73b..9b4727a235 100644 --- a/spring-jenkins-pipeline/pom.xml +++ b/spring-jenkins-pipeline/pom.xml @@ -21,6 +21,7 @@ UTF-8 UTF-8 1.8 + 2.17 @@ -48,7 +49,7 @@ org.apache.maven.plugins maven-checkstyle-plugin - 2.17 + ${checkstyle.version} diff --git a/spring-jenkins-pipeline/scripted-pipeline-unix-nonunix b/spring-jenkins-pipeline/scripted-pipeline-unix-nonunix new file mode 100644 index 0000000000..861c38c8a2 --- /dev/null +++ b/spring-jenkins-pipeline/scripted-pipeline-unix-nonunix @@ -0,0 +1,91 @@ +node { + stage 'Clone the project' + git 'https://github.com/dassiorleando/tutorials.git' + + dir('spring-jenkins-pipeline') { + stage("Compilation and Analysis") { + parallel 'Compilation': { + if (isUnix()) { + sh "./mvnw clean install -DskipTests" + } else { + bat "./mvnw.cmd clean install -DskipTests" + } + }, 'Static Analysis': { + stage("Checkstyle") { + if (isUnix()) { + sh "./mvnw checkstyle:checkstyle" + + step([$class: 'CheckStylePublisher', + canRunOnFailed: true, + defaultEncoding: '', + healthy: '100', + pattern: '**/target/checkstyle-result.xml', + unHealthy: '90', + useStableBuildAsReference: true + ]) + } else { + bat "./mvnw.cmd checkstyle:checkstyle" + + step([$class: 'CheckStylePublisher', + canRunOnFailed: true, + defaultEncoding: '', + healthy: '100', + pattern: '**\target\checkstyle-result.xml', + unHealthy: '90', + useStableBuildAsReference: true + ]) + } + } + } + } + + stage("Tests and Deployment") { + parallel 'Unit tests': { + stage("Runing unit tests") { + if (isUnix()) { + sh "./mvnw test -Punit" + + step([$class: 'JUnitResultArchiver', testResults: '**/target/surefire-reports/TEST-*UnitTest.xml']) + } else { + bat "./mvnw.cmd test -Punit" + + step([$class: 'JUnitResultArchiver', testResults: '**\target\surefire-reports\TEST-*UnitTest.xml']) + } + } + }, 'Integration tests': { + stage("Runing integration tests") { + if (isUnix()) { + sh "./mvnw test -Pintegration" + + step([$class: 'JUnitResultArchiver', testResults: '**/target/surefire-reports/TEST-*IntegrationTest.xml']) + } else { + bat "./mvnw.cmd test -Pintegration" + + step([$class: 'JUnitResultArchiver', testResults: '**\target\surefire-reports\TEST-*IntegrationTest.xml']) + } + } + }, 'Deployment': { + stage("Staging") { + if (isUnix()) { + sh "pid=\$(lsof -i:8989 -t); kill -TERM \$pid || kill -KILL \$pid" + } else { + bat "FOR /F 'tokens=5 delims= ' %%P IN ('netstat -ano ^| findstr :8989') DO TaskKill.exe /PID %%P" + } + + withEnv(['JENKINS_NODE_COOKIE=dontkill']) { + if (isUnix()) { + sh 'nohup ./mvnw spring-boot:run -Dserver.port=8989 &' + sh "while ! httping -qc1 http://localhost:8989 ; do sleep 1 ; done" + sh "curl http://localhost:8989" + } else { + bat 'start ./mvnw.cmd spring-boot:run -Dserver.port=8989' + // Here we need to check(loop) if localhost:8989 is up + // Once it's we continue de script + bat "curl.exe http://localhost:8989" + } + } + } + } + } + } +} \ No newline at end of file From 1e0f0c1849036b6403629911e1e21212950079ba Mon Sep 17 00:00:00 2001 From: Dassi Orleando Date: Tue, 5 Dec 2017 07:51:37 +0100 Subject: [PATCH 157/236] BAEL-1408: Intro to Performance Testing using JMeter --- spring-jmeter-jenkins/pom.xml | 21 +++++++++++++++++-- .../resources/20171205-JMeter-Jenkins.csv | 6 ++++++ 2 files changed, 25 insertions(+), 2 deletions(-) create mode 100644 spring-jmeter-jenkins/src/main/resources/20171205-JMeter-Jenkins.csv diff --git a/spring-jmeter-jenkins/pom.xml b/spring-jmeter-jenkins/pom.xml index 38b5f98e45..dcf1c6d3e5 100644 --- a/spring-jmeter-jenkins/pom.xml +++ b/spring-jmeter-jenkins/pom.xml @@ -21,6 +21,7 @@ UTF-8 UTF-8 1.8 + 2.6.0 @@ -45,8 +46,24 @@ org.springframework.boot spring-boot-maven-plugin + + + com.lazerycode.jmeter + jmeter-maven-plugin + ${jmeter.version} + + + jmeter-tests + + jmeter + + + + + ${project.basedir}/src/main/resources + ${project.basedir}/src/main/resources + + - - diff --git a/spring-jmeter-jenkins/src/main/resources/20171205-JMeter-Jenkins.csv b/spring-jmeter-jenkins/src/main/resources/20171205-JMeter-Jenkins.csv new file mode 100644 index 0000000000..719fc18f41 --- /dev/null +++ b/spring-jmeter-jenkins/src/main/resources/20171205-JMeter-Jenkins.csv @@ -0,0 +1,6 @@ +timeStamp,elapsed,label,responseCode,responseMessage,threadName,dataType,success,failureMessage,bytes,sentBytes,grpThreads,allThreads,Latency,IdleTime,Connect +1512454361862,181,HTTP Request,Non HTTP response code: java.net.ConnectException,Non HTTP response message: Connection refused (Connection refused),Thread Group 1-2,text,false,"The operation lasted too long: It took 181 milliseconds, but should not have lasted longer than 10 milliseconds.",2058,0,3,3,0,0,181 +1512454361926,116,HTTP Request,Non HTTP response code: java.net.ConnectException,Non HTTP response message: Connection refused (Connection refused),Thread Group 1-3,text,false,"The operation lasted too long: It took 116 milliseconds, but should not have lasted longer than 10 milliseconds.",2058,0,3,3,0,0,116 +1512454361862,181,HTTP Request,Non HTTP response code: java.net.ConnectException,Non HTTP response message: Connection refused (Connection refused),Thread Group 1-1,text,false,"The operation lasted too long: It took 181 milliseconds, but should not have lasted longer than 10 milliseconds.",2058,0,3,3,0,0,181 +1512454362126,2,HTTP Request,Non HTTP response code: java.net.ConnectException,Non HTTP response message: Connection refused (Connection refused),Thread Group 1-4,text,false,,2058,0,1,1,0,0,2 +1512454362326,2,HTTP Request,Non HTTP response code: java.net.ConnectException,Non HTTP response message: Connection refused (Connection refused),Thread Group 1-5,text,false,,2058,0,1,1,0,0,2 From b05e035814f8938ae5816e2a1d7e8a1ac77ebe55 Mon Sep 17 00:00:00 2001 From: Ahmed Tawila Date: Tue, 5 Dec 2017 16:02:01 +0200 Subject: [PATCH 158/236] use AssertJ instead of JUnit --- .../com/baeldung/vavr/future/FutureTest.java | 32 +++++++++---------- 1 file changed, 15 insertions(+), 17 deletions(-) diff --git a/vavr/src/test/java/com/baeldung/vavr/future/FutureTest.java b/vavr/src/test/java/com/baeldung/vavr/future/FutureTest.java index ae05748124..0506873c9e 100644 --- a/vavr/src/test/java/com/baeldung/vavr/future/FutureTest.java +++ b/vavr/src/test/java/com/baeldung/vavr/future/FutureTest.java @@ -1,8 +1,6 @@ package com.baeldung.vavr.future; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertFalse; -import static org.junit.Assert.assertTrue; +import static org.assertj.core.api.Assertions.assertThat; import java.util.concurrent.CompletableFuture; import java.util.concurrent.ExecutionException; @@ -23,7 +21,7 @@ public class FutureTest { Future resultFuture = Future.of(() -> Util.appendData(initialValue)); String result = resultFuture.get(); - assertEquals("Welcome to Baeldung!", result); + assertThat(result).isEqualTo("Welcome to Baeldung!"); } @Test @@ -35,7 +33,7 @@ public class FutureTest { Try futureTry = futureOption.get(); String result = futureTry.get(); - assertEquals("Welcome to Baeldung!", result); + assertThat(result).isEqualTo("Welcome to Baeldung!"); } @Test @@ -46,7 +44,7 @@ public class FutureTest { .onFailure(finalResult -> System.out.println("Failed - Result: " + finalResult)); String result = resultFuture.get(); - assertEquals("Welcome to Baeldung!", result); + assertThat(result).isEqualTo("Welcome to Baeldung!"); } @Test @@ -57,7 +55,7 @@ public class FutureTest { .andThen(finalResult -> System.out.println("Completed - 2: " + finalResult)); String result = resultFuture.get(); - assertEquals("Welcome to Baeldung!", result); + assertThat(result).isEqualTo("Welcome to Baeldung!"); } @Test @@ -67,7 +65,7 @@ public class FutureTest { resultFuture = resultFuture.await(); String result = resultFuture.get(); - assertEquals("Welcome to Baeldung!", result); + assertThat(result).isEqualTo("Welcome to Baeldung!"); } @Test @@ -76,7 +74,7 @@ public class FutureTest { Future throwableFuture = resultFuture.failed(); Throwable throwable = throwableFuture.get(); - assertEquals("/ by zero", throwable.getMessage()); + assertThat(throwable.getMessage()).isEqualTo("/ by zero"); } @Test @@ -86,7 +84,7 @@ public class FutureTest { Option throwableOption = resultFuture.getCause(); Throwable throwable = throwableOption.get(); - assertEquals("/ by zero", throwable.getMessage()); + assertThat(throwable.getMessage()).isEqualTo("/ by zero"); } @Test @@ -94,9 +92,9 @@ public class FutureTest { Future resultFuture = Future.of(() -> Util.divideByZero(10)); resultFuture.await(); - assertTrue(resultFuture.isCompleted()); - assertFalse(resultFuture.isSuccess()); - assertTrue(resultFuture.isFailure()); + assertThat(resultFuture.isCompleted()).isTrue(); + assertThat(resultFuture.isSuccess()).isFalse(); + assertThat(resultFuture.isFailure()).isTrue(); } @Test @@ -105,7 +103,7 @@ public class FutureTest { Future resultFuture = Future.of(() -> Util.appendData(initialValue)); resultFuture.await(); - assertFalse(resultFuture.isEmpty()); + assertThat(resultFuture.isEmpty()).isFalse(); } @Test @@ -114,7 +112,7 @@ public class FutureTest { .zip(Future.of(() -> new Integer(5))); future.await(); - assertEquals(Tuple.of("John", new Integer(5)), future.get()); + assertThat(future.get()).isEqualTo(Tuple.of("John", new Integer(5))); } @Test @@ -123,7 +121,7 @@ public class FutureTest { Future resultFuture = Future.of(() -> Util.appendData(initialValue)); CompletableFuture convertedFuture = resultFuture.toCompletableFuture(); - assertEquals("Welcome to Baeldung!", convertedFuture.get()); + assertThat(convertedFuture.get()).isEqualTo("Welcome to Baeldung!"); } @Test @@ -132,6 +130,6 @@ public class FutureTest { .map(a -> "Hello " + a); futureResult.await(); - assertEquals("Hello from Baeldung", futureResult.get()); + assertThat(futureResult.get()).isEqualTo("Hello from Baeldung"); } } From 0d37e8831602fadff7816174f5a4bbc11f262514 Mon Sep 17 00:00:00 2001 From: Dassi Orleando Date: Tue, 5 Dec 2017 18:45:09 +0100 Subject: [PATCH 159/236] Fix indents --- spring-jenkins-pipeline/pom.xml | 174 ++++++++++++++++---------------- spring-jmeter-jenkins/pom.xml | 118 +++++++++++----------- 2 files changed, 146 insertions(+), 146 deletions(-) diff --git a/spring-jenkins-pipeline/pom.xml b/spring-jenkins-pipeline/pom.xml index 9b4727a235..071f6e6e36 100644 --- a/spring-jenkins-pipeline/pom.xml +++ b/spring-jenkins-pipeline/pom.xml @@ -1,98 +1,98 @@ - 4.0.0 + xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> + 4.0.0 - spring-jenkins-pipeline - 0.0.1-SNAPSHOT - jar + spring-jenkins-pipeline + 0.0.1-SNAPSHOT + jar - spring-jenkins-pipeline - Intro to Jenkins 2 and the power of pipelines + spring-jenkins-pipeline + Intro to Jenkins 2 and the power of pipelines - - parent-boot-5 - com.baeldung - 0.0.1-SNAPSHOT - ../parent-boot-5 - + + parent-boot-5 + com.baeldung + 0.0.1-SNAPSHOT + ../parent-boot-5 + - - UTF-8 - UTF-8 - 1.8 - 2.17 - + + UTF-8 + UTF-8 + 1.8 + 2.17 + - - - org.springframework.boot - spring-boot-starter-data-mongodb - - - org.springframework.boot - spring-boot-starter-data-rest - - - org.springframework.boot - spring-boot-starter-test - test - - + + + org.springframework.boot + spring-boot-starter-data-mongodb + + + org.springframework.boot + spring-boot-starter-data-rest + + + org.springframework.boot + spring-boot-starter-test + test + + - - - - org.springframework.boot - spring-boot-maven-plugin - - - org.apache.maven.plugins - maven-checkstyle-plugin - ${checkstyle.version} - - - + + + + org.springframework.boot + spring-boot-maven-plugin + + + org.apache.maven.plugins + maven-checkstyle-plugin + ${checkstyle.version} + + + - - - integration - - - - maven-surefire-plugin - - - **/*UnitTest.java - - - - **/*IntegrationTest.java - - - - - - + + + integration + + + + maven-surefire-plugin + + + **/*UnitTest.java + + + + **/*IntegrationTest.java + + + + + + - - unit - - - - maven-surefire-plugin - - - **/*IntegrationTest.java - - - - **/*UnitTest.java - - - - - - - + + unit + + + + maven-surefire-plugin + + + **/*IntegrationTest.java + + + + **/*UnitTest.java + + + + + + + diff --git a/spring-jmeter-jenkins/pom.xml b/spring-jmeter-jenkins/pom.xml index dcf1c6d3e5..daef45b6d4 100644 --- a/spring-jmeter-jenkins/pom.xml +++ b/spring-jmeter-jenkins/pom.xml @@ -1,69 +1,69 @@ - 4.0.0 + xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> + 4.0.0 - spring-jmeter-jenkins - 0.0.1-SNAPSHOT - jar + spring-jmeter-jenkins + 0.0.1-SNAPSHOT + jar - spring-jmeter-jenkins - Run and Show JMeter test with Jenkins + spring-jmeter-jenkins + Run and Show JMeter test with Jenkins - - parent-boot-5 - com.baeldung - 0.0.1-SNAPSHOT - ../parent-boot-5 - + + parent-boot-5 + com.baeldung + 0.0.1-SNAPSHOT + ../parent-boot-5 + - - UTF-8 - UTF-8 - 1.8 - 2.6.0 - + + UTF-8 + UTF-8 + 1.8 + 2.6.0 + - - - org.springframework.boot - spring-boot-starter-data-mongodb - - - org.springframework.boot - spring-boot-starter-data-rest - - - org.springframework.boot - spring-boot-starter-test - test - - + + + org.springframework.boot + spring-boot-starter-data-mongodb + + + org.springframework.boot + spring-boot-starter-data-rest + + + org.springframework.boot + spring-boot-starter-test + test + + - - - - org.springframework.boot - spring-boot-maven-plugin - + + + + org.springframework.boot + spring-boot-maven-plugin + - - com.lazerycode.jmeter - jmeter-maven-plugin - ${jmeter.version} - - - jmeter-tests - - jmeter - - - - - ${project.basedir}/src/main/resources - ${project.basedir}/src/main/resources - - - - + + com.lazerycode.jmeter + jmeter-maven-plugin + ${jmeter.version} + + + jmeter-tests + + jmeter + + + + + ${project.basedir}/src/main/resources + ${project.basedir}/src/main/resources + + + + From c489044f0b1767cf929bb21334ddb88f926bfcb7 Mon Sep 17 00:00:00 2001 From: Ahmed Tawila Date: Tue, 5 Dec 2017 20:22:05 +0200 Subject: [PATCH 160/236] Future in Vavr --- .../java/com/baeldung/vavr/future/Util.java | 8 +++ .../com/baeldung/vavr/future/FutureTest.java | 56 ++++++++++++++++--- 2 files changed, 57 insertions(+), 7 deletions(-) diff --git a/vavr/src/main/java/com/baeldung/vavr/future/Util.java b/vavr/src/main/java/com/baeldung/vavr/future/Util.java index 9339a6742e..790ef2bf88 100644 --- a/vavr/src/main/java/com/baeldung/vavr/future/Util.java +++ b/vavr/src/main/java/com/baeldung/vavr/future/Util.java @@ -9,4 +9,12 @@ public class Util { public static int divideByZero(int num) { return num / 0; } + + public static String getSubstringMinusOne(String s) { + return s.substring(-1); + } + + public static String getSubstringMinusTwo(String s) { + return s.substring(-2); + } } diff --git a/vavr/src/test/java/com/baeldung/vavr/future/FutureTest.java b/vavr/src/test/java/com/baeldung/vavr/future/FutureTest.java index 0506873c9e..1f2a3761eb 100644 --- a/vavr/src/test/java/com/baeldung/vavr/future/FutureTest.java +++ b/vavr/src/test/java/com/baeldung/vavr/future/FutureTest.java @@ -4,6 +4,7 @@ import static org.assertj.core.api.Assertions.assertThat; import java.util.concurrent.CompletableFuture; import java.util.concurrent.ExecutionException; +import java.util.concurrent.Executors; import org.junit.Test; @@ -15,6 +16,17 @@ import io.vavr.control.Try; public class FutureTest { + @Test + public void whenChangeExecutorService_thenCorrect() { + String initialValue = "Welcome to "; + Future resultFuture = Future.of( + Executors.newSingleThreadExecutor(), + () -> Util.appendData(initialValue)); + String result = resultFuture.get(); + + assertThat(result).isEqualTo("Welcome to Baeldung!"); + } + @Test public void whenAppendData_thenCorrect1() { String initialValue = "Welcome to "; @@ -40,8 +52,8 @@ public class FutureTest { public void whenAppendData_thenSuccess() { String initialValue = "Welcome to "; Future resultFuture = Future.of(() -> Util.appendData(initialValue)) - .onSuccess(finalResult -> System.out.println("Successfully Completed - Result: " + finalResult)) - .onFailure(finalResult -> System.out.println("Failed - Result: " + finalResult)); + .onSuccess(finalResult -> System.out.println("Successfully Completed - Result: " + finalResult)) + .onFailure(finalResult -> System.out.println("Failed - Result: " + finalResult)); String result = resultFuture.get(); assertThat(result).isEqualTo("Welcome to Baeldung!"); @@ -51,8 +63,8 @@ public class FutureTest { public void whenChainingCallbacks_thenCorrect() { String initialValue = "Welcome to "; Future resultFuture = Future.of(() -> Util.appendData(initialValue)) - .andThen(finalResult -> System.out.println("Completed - 1: " + finalResult)) - .andThen(finalResult -> System.out.println("Completed - 2: " + finalResult)); + .andThen(finalResult -> System.out.println("Completed - 1: " + finalResult)) + .andThen(finalResult -> System.out.println("Completed - 2: " + finalResult)); String result = resultFuture.get(); assertThat(result).isEqualTo("Welcome to Baeldung!"); @@ -109,14 +121,14 @@ public class FutureTest { @Test public void whenCallZip_thenCorrect() { Future> future = Future.of(() -> "John") - .zip(Future.of(() -> new Integer(5))); + .zip(Future.of(() -> new Integer(5))); future.await(); assertThat(future.get()).isEqualTo(Tuple.of("John", new Integer(5))); } @Test - public void whenAppendData_thenFutureNotEmptyd() throws InterruptedException, ExecutionException { + public void whenConvertToCompletableFuture_thenCorrect() throws InterruptedException, ExecutionException { String initialValue = "Welcome to "; Future resultFuture = Future.of(() -> Util.appendData(initialValue)); CompletableFuture convertedFuture = resultFuture.toCompletableFuture(); @@ -127,9 +139,39 @@ public class FutureTest { @Test public void whenCallMap_thenCorrect() { Future futureResult = Future.of(() -> new StringBuilder("from Baeldung")) - .map(a -> "Hello " + a); + .map(a -> "Hello " + a); futureResult.await(); assertThat(futureResult.get()).isEqualTo("Hello from Baeldung"); } + + @Test + public void whenFutureFails_thenGetErrorMessage() { + Future resultFuture = Future.of(() -> Util.getSubstringMinusOne("Hello")); + Future errorMessageFuture = resultFuture.recover(Throwable::getMessage); + String errorMessage = errorMessageFuture.get(); + + assertThat(errorMessage).isEqualTo("String index out of range: -1"); + } + + @Test + public void whenFutureFails_thenGetAnotherFuture() { + Future resultFuture = Future.of(() -> Util.getSubstringMinusOne("Hello")); + Future errorMessageFuture = resultFuture.recoverWith(a -> Future.of(a::getMessage)); + String errorMessage = errorMessageFuture.get(); + + assertThat(errorMessage).isEqualTo("String index out of range: -1"); + } + + @Test + public void whenBothFuturesFail_thenGetErrorMessage() { + Future future1 = Future.of(() -> Util.getSubstringMinusOne("Hello")); + Future future2 = Future.of(() -> Util.getSubstringMinusTwo("Hello")); + Future errorMessageFuture = future1.fallbackTo(future2); + Future errorMessage = errorMessageFuture.failed(); + + assertThat( + errorMessage.get().getMessage()) + .isEqualTo("String index out of range: -1"); + } } From 5477f80a1ce2e45f97580d4a8a6b5815c295b3aa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9=20Thiago?= Date: Tue, 5 Dec 2017 23:43:23 -0300 Subject: [PATCH 161/236] BAEL-1328 (#3099) * BAEL-1328 How to Invert an Array in Java * Removing code from evaluation article. * BAEL-1328 Adjusting spaces and implement inversion with commons lang3 and guava. * BAEL-1328 Renaming unit test class; using AssertJ. --- .../com/baeldung/array/ArrayInverter.java | 41 ++++++++++++++++ .../baeldung/array/ArrayInverterUnitTest.java | 49 +++++++++++++++++++ 2 files changed, 90 insertions(+) create mode 100644 core-java/src/main/java/com/baeldung/array/ArrayInverter.java create mode 100644 core-java/src/test/java/com/baeldung/array/ArrayInverterUnitTest.java diff --git a/core-java/src/main/java/com/baeldung/array/ArrayInverter.java b/core-java/src/main/java/com/baeldung/array/ArrayInverter.java new file mode 100644 index 0000000000..7f7fcbb5a8 --- /dev/null +++ b/core-java/src/main/java/com/baeldung/array/ArrayInverter.java @@ -0,0 +1,41 @@ +package com.baeldung.array; + +import java.util.Arrays; +import java.util.Collections; +import java.util.List; +import java.util.stream.IntStream; + +import org.apache.commons.lang3.ArrayUtils; + +import com.google.common.collect.Lists; + +public class ArrayInverter { + + public void invertUsingFor(Object[] array) { + for (int i = 0; i < array.length / 2; i++) { + Object temp = array[i]; + array[i] = array[array.length - 1 - i]; + array[array.length - 1 - i] = temp; + } + } + + public void invertUsingCollectionsReverse(Object[] array) { + List list = Arrays.asList(array); + Collections.reverse(list); + } + + public Object[] invertUsingStreams(final Object[] array) { + return IntStream.range(1, array.length + 1).mapToObj(i -> array[array.length - i]).toArray(); + } + + public void invertUsingCommonsLang(Object[] array) { + ArrayUtils.reverse(array); + } + + public Object[] invertUsingGuava(Object[] array) { + List list = Arrays.asList(array); + List reverted = Lists.reverse(list); + return reverted.toArray(); + } + +} diff --git a/core-java/src/test/java/com/baeldung/array/ArrayInverterUnitTest.java b/core-java/src/test/java/com/baeldung/array/ArrayInverterUnitTest.java new file mode 100644 index 0000000000..ca59ee51fb --- /dev/null +++ b/core-java/src/test/java/com/baeldung/array/ArrayInverterUnitTest.java @@ -0,0 +1,49 @@ +package com.baeldung.array; + +import static org.assertj.core.api.Assertions.assertThat; + +import org.junit.Test; + +public class ArrayInverterUnitTest { + + private String[] fruits = { "apples", "tomatoes", "bananas", "guavas", "pineapples", "oranges" }; + + @Test + public void invertArrayWithForLoop() { + ArrayInverter inverter = new ArrayInverter(); + inverter.invertUsingFor(fruits); + + assertThat(new String[] { "oranges", "pineapples", "guavas", "bananas", "tomatoes", "apples" }).isEqualTo(fruits); + } + + @Test + public void invertArrayWithCollectionsReverse() { + ArrayInverter inverter = new ArrayInverter(); + inverter.invertUsingCollectionsReverse(fruits); + + assertThat(new String[] { "oranges", "pineapples", "guavas", "bananas", "tomatoes", "apples" }).isEqualTo(fruits); + } + + @Test + public void invertArrayWithStreams() { + ArrayInverter inverter = new ArrayInverter(); + + assertThat(new String[] { "oranges", "pineapples", "guavas", "bananas", "tomatoes", "apples" }).isEqualTo(inverter.invertUsingStreams(fruits)); + } + + @Test + public void invertArrayWithCommonsLang() { + ArrayInverter inverter = new ArrayInverter(); + inverter.invertUsingCommonsLang(fruits); + + assertThat(new String[] { "oranges", "pineapples", "guavas", "bananas", "tomatoes", "apples" }).isEqualTo(fruits); + } + + @Test + public void invertArrayWithGuava() { + ArrayInverter inverter = new ArrayInverter(); + + assertThat(new String[] { "oranges", "pineapples", "guavas", "bananas", "tomatoes", "apples" }).isEqualTo(inverter.invertUsingGuava(fruits)); + } + +} From 97d68365bf59ee40b2ecd7fc87d5a0a9e1a52356 Mon Sep 17 00:00:00 2001 From: Eugen Paraschiv Date: Wed, 6 Dec 2017 12:00:56 +0200 Subject: [PATCH 162/236] minor Boot upgrade --- spring-5/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/spring-5/pom.xml b/spring-5/pom.xml index 7e30179f07..b6b6f9d370 100644 --- a/spring-5/pom.xml +++ b/spring-5/pom.xml @@ -14,7 +14,7 @@ org.springframework.boot spring-boot-starter-parent - 2.0.0.M6 + 2.0.0.M7 From 44a17ece1d3daaebf77261ea3efb875a7f0a0634 Mon Sep 17 00:00:00 2001 From: k0l0ssus Date: Wed, 6 Dec 2017 10:56:56 -0500 Subject: [PATCH 163/236] Update pom.xml (#3190) Corrected main class and added JUnit dependency --- spring-integration/pom.xml | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/spring-integration/pom.xml b/spring-integration/pom.xml index a162f18b9c..4e210122b0 100644 --- a/spring-integration/pom.xml +++ b/spring-integration/pom.xml @@ -22,7 +22,7 @@ 1.1.4.RELEASE 1.4.7 1.1.1 - + 4.12 2.10 1.5.0 @@ -56,7 +56,7 @@ exec-maven-plugin ${exec-maven-plugin.version} - com.baeldung.samples.Main + com.baeldung.samples.FileCopyConfig @@ -106,6 +106,12 @@ spring-integration-file ${spring.integration.version} + + junit + junit + ${junit.version} + test + From 50b9b80730b7e07357e900be0db0e07c8398c9b9 Mon Sep 17 00:00:00 2001 From: linhvovn Date: Thu, 7 Dec 2017 03:52:12 +0800 Subject: [PATCH 164/236] Bael1313 spring acl (#3188) * [tlinh2110@gmail.com] [BAEL1313] Introduction Spring ACL * [tlinh2110@gmail.com] BAEL 1313 - Update unit test * [tlinh2110@gmail.com]BAEL1313- remove unused files from spring-core * [BAEL1313] Create spring-acl module * [BAEL1313] Add resources for Spring ACL * [BAEL1313] Remove acl from spring-security-mvc-boot * [BAEL1313] Add Spring ACL module in parent pom.xml * [BAEL-1313] Change method name * [BAEL-1313] Revert change in spring-security-mvc-boot pom file * change spring-acl to spring-security-acl * Update name in pom.xml --- pom.xml | 1 + spring-security-acl/pom.xml | 66 ++++++++++ .../org/baeldung/acl/config/ACLContext.java | 80 ++++++++++++ .../AclMethodSecurityConfiguration.java | 21 ++++ .../acl/config/JPAPersistenceConfig.java | 16 +++ .../dao/NoticeMessageRepository.java | 24 ++++ .../acl/persistence/entity/NoticeMessage.java | 29 +++++ .../src/main/resources/acl-data.sql | 26 ++++ .../src/main/resources/acl-schema.sql | 58 +++++++++ .../org.baeldung.acl.datasource.properties | 12 ++ .../java/org/baeldung/acl/SpringAclTest.java | 119 ++++++++++++++++++ 11 files changed, 452 insertions(+) create mode 100644 spring-security-acl/pom.xml create mode 100644 spring-security-acl/src/main/java/org/baeldung/acl/config/ACLContext.java create mode 100644 spring-security-acl/src/main/java/org/baeldung/acl/config/AclMethodSecurityConfiguration.java create mode 100644 spring-security-acl/src/main/java/org/baeldung/acl/config/JPAPersistenceConfig.java create mode 100644 spring-security-acl/src/main/java/org/baeldung/acl/persistence/dao/NoticeMessageRepository.java create mode 100644 spring-security-acl/src/main/java/org/baeldung/acl/persistence/entity/NoticeMessage.java create mode 100644 spring-security-acl/src/main/resources/acl-data.sql create mode 100644 spring-security-acl/src/main/resources/acl-schema.sql create mode 100644 spring-security-acl/src/main/resources/org.baeldung.acl.datasource.properties create mode 100644 spring-security-acl/src/test/java/org/baeldung/acl/SpringAclTest.java diff --git a/pom.xml b/pom.xml index c8fa30e8c9..cf01712cba 100644 --- a/pom.xml +++ b/pom.xml @@ -202,6 +202,7 @@ spring-rest-query-language spring-rest spring-rest-simple + spring-security-acl spring-security-cache-control spring-security-client/spring-security-jsp-authentication spring-security-client/spring-security-jsp-authorize diff --git a/spring-security-acl/pom.xml b/spring-security-acl/pom.xml new file mode 100644 index 0000000000..67197bc2f8 --- /dev/null +++ b/spring-security-acl/pom.xml @@ -0,0 +1,66 @@ + + + 4.0.0 + + com.baeldung + spring-security-acl + 0.0.1-SNAPSHOT + war + + spring-security-acl + Spring Security ACL + + + parent-boot-5 + com.baeldung + 0.0.1-SNAPSHOT + ../parent-boot-5 + + + + + + org.springframework.boot + spring-boot-starter-data-jpa + + + + com.h2database + h2 + + + + org.springframework + spring-test + test + + + + org.springframework.security + spring-security-test + test + + + + org.springframework.security + spring-security-acl + + + org.springframework.security + spring-security-config + + + org.springframework + spring-context-support + + + net.sf.ehcache + ehcache-core + 2.6.11 + jar + + + + + diff --git a/spring-security-acl/src/main/java/org/baeldung/acl/config/ACLContext.java b/spring-security-acl/src/main/java/org/baeldung/acl/config/ACLContext.java new file mode 100644 index 0000000000..337e745c3c --- /dev/null +++ b/spring-security-acl/src/main/java/org/baeldung/acl/config/ACLContext.java @@ -0,0 +1,80 @@ +package org.baeldung.acl.config; + +import javax.sql.DataSource; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.autoconfigure.EnableAutoConfiguration; +import org.springframework.cache.ehcache.EhCacheFactoryBean; +import org.springframework.cache.ehcache.EhCacheManagerFactoryBean; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.security.access.expression.method.DefaultMethodSecurityExpressionHandler; +import org.springframework.security.access.expression.method.MethodSecurityExpressionHandler; +import org.springframework.security.acls.AclPermissionCacheOptimizer; +import org.springframework.security.acls.AclPermissionEvaluator; +import org.springframework.security.acls.domain.AclAuthorizationStrategy; +import org.springframework.security.acls.domain.AclAuthorizationStrategyImpl; +import org.springframework.security.acls.domain.ConsoleAuditLogger; +import org.springframework.security.acls.domain.DefaultPermissionGrantingStrategy; +import org.springframework.security.acls.domain.EhCacheBasedAclCache; +import org.springframework.security.acls.jdbc.BasicLookupStrategy; +import org.springframework.security.acls.jdbc.JdbcMutableAclService; +import org.springframework.security.acls.jdbc.LookupStrategy; +import org.springframework.security.acls.model.PermissionGrantingStrategy; +import org.springframework.security.core.authority.SimpleGrantedAuthority; + +@Configuration +@EnableAutoConfiguration +public class ACLContext { + + @Autowired + DataSource dataSource; + + @Bean + public EhCacheBasedAclCache aclCache() { + return new EhCacheBasedAclCache(aclEhCacheFactoryBean().getObject(), permissionGrantingStrategy(), aclAuthorizationStrategy()); + } + + @Bean + public EhCacheFactoryBean aclEhCacheFactoryBean() { + EhCacheFactoryBean ehCacheFactoryBean = new EhCacheFactoryBean(); + ehCacheFactoryBean.setCacheManager(aclCacheManager().getObject()); + ehCacheFactoryBean.setCacheName("aclCache"); + return ehCacheFactoryBean; + } + + @Bean + public EhCacheManagerFactoryBean aclCacheManager() { + return new EhCacheManagerFactoryBean(); + } + + @Bean + public PermissionGrantingStrategy permissionGrantingStrategy() { + return new DefaultPermissionGrantingStrategy(new ConsoleAuditLogger()); + } + + @Bean + public AclAuthorizationStrategy aclAuthorizationStrategy() { + return new AclAuthorizationStrategyImpl(new SimpleGrantedAuthority("ROLE_ADMIN")); + } + + @Bean + public MethodSecurityExpressionHandler defaultMethodSecurityExpressionHandler() { + DefaultMethodSecurityExpressionHandler expressionHandler = new DefaultMethodSecurityExpressionHandler(); + AclPermissionEvaluator permissionEvaluator = new AclPermissionEvaluator(aclService()); + expressionHandler.setPermissionEvaluator(permissionEvaluator); + expressionHandler.setPermissionCacheOptimizer(new AclPermissionCacheOptimizer(aclService())); + return expressionHandler; + } + + @Bean + public LookupStrategy lookupStrategy() { + return new BasicLookupStrategy(dataSource, aclCache(), aclAuthorizationStrategy(), new ConsoleAuditLogger()); + } + + @Bean + public JdbcMutableAclService aclService() { + return new JdbcMutableAclService(dataSource, lookupStrategy(), aclCache()); + } + +} \ No newline at end of file diff --git a/spring-security-acl/src/main/java/org/baeldung/acl/config/AclMethodSecurityConfiguration.java b/spring-security-acl/src/main/java/org/baeldung/acl/config/AclMethodSecurityConfiguration.java new file mode 100644 index 0000000000..e503cb1a41 --- /dev/null +++ b/spring-security-acl/src/main/java/org/baeldung/acl/config/AclMethodSecurityConfiguration.java @@ -0,0 +1,21 @@ +package org.baeldung.acl.config; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Configuration; +import org.springframework.security.access.expression.method.MethodSecurityExpressionHandler; +import org.springframework.security.config.annotation.method.configuration.EnableGlobalMethodSecurity; +import org.springframework.security.config.annotation.method.configuration.GlobalMethodSecurityConfiguration; + +@Configuration +@EnableGlobalMethodSecurity(prePostEnabled = true, securedEnabled = true) +public class AclMethodSecurityConfiguration extends GlobalMethodSecurityConfiguration { + + @Autowired + MethodSecurityExpressionHandler defaultMethodSecurityExpressionHandler; + + @Override + protected MethodSecurityExpressionHandler createExpressionHandler() { + return defaultMethodSecurityExpressionHandler; + } + +} diff --git a/spring-security-acl/src/main/java/org/baeldung/acl/config/JPAPersistenceConfig.java b/spring-security-acl/src/main/java/org/baeldung/acl/config/JPAPersistenceConfig.java new file mode 100644 index 0000000000..24d170e56c --- /dev/null +++ b/spring-security-acl/src/main/java/org/baeldung/acl/config/JPAPersistenceConfig.java @@ -0,0 +1,16 @@ +package org.baeldung.acl.config; + +import org.springframework.boot.autoconfigure.domain.EntityScan; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.PropertySource; +import org.springframework.data.jpa.repository.config.EnableJpaRepositories; +import org.springframework.transaction.annotation.EnableTransactionManagement; + +@Configuration +@EnableTransactionManagement +@EnableJpaRepositories(basePackages = "org.baeldung.acl.persistence.dao") +@PropertySource("classpath:org.baeldung.acl.datasource.properties") +@EntityScan(basePackages={ "org.baeldung.acl.persistence.entity" }) +public class JPAPersistenceConfig { + +} diff --git a/spring-security-acl/src/main/java/org/baeldung/acl/persistence/dao/NoticeMessageRepository.java b/spring-security-acl/src/main/java/org/baeldung/acl/persistence/dao/NoticeMessageRepository.java new file mode 100644 index 0000000000..91a2af7d83 --- /dev/null +++ b/spring-security-acl/src/main/java/org/baeldung/acl/persistence/dao/NoticeMessageRepository.java @@ -0,0 +1,24 @@ +package org.baeldung.acl.persistence.dao; + +import java.util.List; + +import org.baeldung.acl.persistence.entity.NoticeMessage; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.repository.query.Param; +import org.springframework.security.access.prepost.PostAuthorize; +import org.springframework.security.access.prepost.PostFilter; +import org.springframework.security.access.prepost.PreAuthorize; + +public interface NoticeMessageRepository extends JpaRepository{ + + @PostFilter("hasPermission(filterObject, 'READ')") + List findAll(); + + @PostAuthorize("hasPermission(returnObject, 'READ')") + NoticeMessage findById(Integer id); + + @SuppressWarnings("unchecked") + @PreAuthorize("hasPermission(#noticeMessage, 'WRITE')") + NoticeMessage save(@Param("noticeMessage")NoticeMessage noticeMessage); + +} diff --git a/spring-security-acl/src/main/java/org/baeldung/acl/persistence/entity/NoticeMessage.java b/spring-security-acl/src/main/java/org/baeldung/acl/persistence/entity/NoticeMessage.java new file mode 100644 index 0000000000..bd1e866f83 --- /dev/null +++ b/spring-security-acl/src/main/java/org/baeldung/acl/persistence/entity/NoticeMessage.java @@ -0,0 +1,29 @@ +package org.baeldung.acl.persistence.entity; + +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.Id; +import javax.persistence.Table; + +@Entity +@Table(name="system_message") +public class NoticeMessage { + + @Id + @Column + private Integer id; + @Column + private String content; + public Integer getId() { + return id; + } + public void setId(Integer id) { + this.id = id; + } + public String getContent() { + return content; + } + public void setContent(String content) { + this.content = content; + } +} \ No newline at end of file diff --git a/spring-security-acl/src/main/resources/acl-data.sql b/spring-security-acl/src/main/resources/acl-data.sql new file mode 100644 index 0000000000..a4e0011834 --- /dev/null +++ b/spring-security-acl/src/main/resources/acl-data.sql @@ -0,0 +1,26 @@ +INSERT INTO acl_sid (id, principal, sid) VALUES +(1, 1, 'manager'), +(2, 1, 'hr'), +(3, 0, 'ROLE_EDITOR'); + +INSERT INTO acl_class (id, class) VALUES +(1, 'org.baeldung.acl.persistence.entity.NoticeMessage'); + +INSERT INTO system_message(id,content) VALUES +(1,'First Level Message'), +(2,'Second Level Message'), +(3,'Third Level Message'); + +INSERT INTO acl_object_identity (id, object_id_class, object_id_identity, parent_object, owner_sid, entries_inheriting) VALUES +(1, 1, 1, NULL, 3, 0), +(2, 1, 2, NULL, 3, 0), +(3, 1, 3, NULL, 3, 0); + +INSERT INTO acl_entry (id, acl_object_identity, ace_order, sid, mask, granting, audit_success, audit_failure) VALUES +(1, 1, 1, 1, 1, 1, 1, 1), +(2, 1, 2, 1, 2, 1, 1, 1), +(3, 1, 3, 3, 1, 1, 1, 1), +(4, 2, 1, 2, 1, 1, 1, 1), +(5, 2, 2, 3, 1, 1, 1, 1), +(6, 3, 1, 3, 1, 1, 1, 1), +(7, 3, 2, 3, 2, 1, 1, 1); \ No newline at end of file diff --git a/spring-security-acl/src/main/resources/acl-schema.sql b/spring-security-acl/src/main/resources/acl-schema.sql new file mode 100644 index 0000000000..9f74048230 --- /dev/null +++ b/spring-security-acl/src/main/resources/acl-schema.sql @@ -0,0 +1,58 @@ +create table IF NOT EXISTS system_message (id integer not null, content varchar(255), primary key (id)); + +CREATE TABLE IF NOT EXISTS acl_sid ( + id bigint(20) NOT NULL AUTO_INCREMENT, + principal tinyint(1) NOT NULL, + sid varchar(100) NOT NULL, + PRIMARY KEY (id), + UNIQUE KEY unique_uk_1 (sid,principal) +); + +CREATE TABLE IF NOT EXISTS acl_class ( + id bigint(20) NOT NULL AUTO_INCREMENT, + class varchar(255) NOT NULL, + PRIMARY KEY (id), + UNIQUE KEY unique_uk_2 (class) +); + +CREATE TABLE IF NOT EXISTS acl_entry ( + id bigint(20) NOT NULL AUTO_INCREMENT, + acl_object_identity bigint(20) NOT NULL, + ace_order int(11) NOT NULL, + sid bigint(20) NOT NULL, + mask int(11) NOT NULL, + granting tinyint(1) NOT NULL, + audit_success tinyint(1) NOT NULL, + audit_failure tinyint(1) NOT NULL, + PRIMARY KEY (id), + UNIQUE KEY unique_uk_4 (acl_object_identity,ace_order) +); + +CREATE TABLE IF NOT EXISTS acl_object_identity ( + id bigint(20) NOT NULL AUTO_INCREMENT, + object_id_class bigint(20) NOT NULL, + object_id_identity bigint(20) NOT NULL, + parent_object bigint(20) DEFAULT NULL, + owner_sid bigint(20) DEFAULT NULL, + entries_inheriting tinyint(1) NOT NULL, + PRIMARY KEY (id), + UNIQUE KEY unique_uk_3 (object_id_class,object_id_identity) +); + +ALTER TABLE acl_entry +ADD FOREIGN KEY (acl_object_identity) REFERENCES acl_object_identity(id); + +ALTER TABLE acl_entry +ADD FOREIGN KEY (sid) REFERENCES acl_sid(id); + +-- +-- Constraints for table acl_object_identity +-- +ALTER TABLE acl_object_identity +ADD FOREIGN KEY (parent_object) REFERENCES acl_object_identity (id); + +ALTER TABLE acl_object_identity +ADD FOREIGN KEY (object_id_class) REFERENCES acl_class (id); + +ALTER TABLE acl_object_identity +ADD FOREIGN KEY (owner_sid) REFERENCES acl_sid (id); \ No newline at end of file diff --git a/spring-security-acl/src/main/resources/org.baeldung.acl.datasource.properties b/spring-security-acl/src/main/resources/org.baeldung.acl.datasource.properties new file mode 100644 index 0000000000..40f1e6ef38 --- /dev/null +++ b/spring-security-acl/src/main/resources/org.baeldung.acl.datasource.properties @@ -0,0 +1,12 @@ +spring.datasource.url=jdbc:h2:mem:testdb;DB_CLOSE_ON_EXIT=FALSE +spring.datasource.username=sa +spring.datasource.password= +spring.datasource.driverClassName=org.h2.Driver +spring.jpa.hibernate.ddl-auto=update +spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.H2Dialect + +spring.h2.console.path=/myconsole +spring.h2.console.enabled=true +spring.datasource.initialize=true +spring.datasource.schema=classpath:acl-schema.sql +spring.datasource.data=classpath:acl-data.sql \ No newline at end of file diff --git a/spring-security-acl/src/test/java/org/baeldung/acl/SpringAclTest.java b/spring-security-acl/src/test/java/org/baeldung/acl/SpringAclTest.java new file mode 100644 index 0000000000..b864639d74 --- /dev/null +++ b/spring-security-acl/src/test/java/org/baeldung/acl/SpringAclTest.java @@ -0,0 +1,119 @@ +package org.baeldung.acl; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; + +import java.util.List; + +import org.baeldung.acl.persistence.dao.NoticeMessageRepository; +import org.baeldung.acl.persistence.entity.NoticeMessage; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.ComponentScan; +import org.springframework.context.annotation.Configuration; +import org.springframework.security.access.AccessDeniedException; +import org.springframework.security.test.context.support.WithMockUser; +import org.springframework.security.test.context.support.WithSecurityContextTestExecutionListener; +import org.springframework.test.context.ContextConfiguration; +import org.springframework.test.context.TestExecutionListeners; +import org.springframework.test.context.junit4.AbstractJUnit4SpringContextTests; +import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; +import org.springframework.test.context.support.DependencyInjectionTestExecutionListener; +import org.springframework.test.context.support.DirtiesContextTestExecutionListener; +import org.springframework.test.context.transaction.TransactionalTestExecutionListener; +import org.springframework.test.context.web.ServletTestExecutionListener; + +@RunWith(SpringJUnit4ClassRunner.class) +@ContextConfiguration +@TestExecutionListeners(listeners={ServletTestExecutionListener.class, + DependencyInjectionTestExecutionListener.class, + DirtiesContextTestExecutionListener.class, + TransactionalTestExecutionListener.class, + WithSecurityContextTestExecutionListener.class}) +public class SpringAclTest extends AbstractJUnit4SpringContextTests{ + + private static Integer FIRST_MESSAGE_ID = 1; + private static Integer SECOND_MESSAGE_ID = 2; + private static Integer THIRD_MESSAGE_ID = 3; + private static String EDITTED_CONTENT = "EDITED"; + + @Configuration + @ComponentScan("org.baeldung.acl.*") + public static class SpringConfig { + + } + + @Autowired + NoticeMessageRepository repo; + + @Test + @WithMockUser(username="manager") + public void givenUserManager_whenFindAllMessage_thenReturnFirstMessage(){ + List details = repo.findAll(); + assertNotNull(details); + assertEquals(1,details.size()); + assertEquals(FIRST_MESSAGE_ID,details.get(0).getId()); + } + + @Test + @WithMockUser(username="manager") + public void givenUserManager_whenFind1stMessageByIdAndUpdateItsContent_thenOK(){ + NoticeMessage firstMessage = repo.findById(FIRST_MESSAGE_ID); + assertNotNull(firstMessage); + assertEquals(FIRST_MESSAGE_ID,firstMessage.getId()); + + firstMessage.setContent(EDITTED_CONTENT); + repo.save(firstMessage); + + NoticeMessage editedFirstMessage = repo.findById(FIRST_MESSAGE_ID); + assertNotNull(editedFirstMessage); + assertEquals(FIRST_MESSAGE_ID,editedFirstMessage.getId()); + assertEquals(EDITTED_CONTENT,editedFirstMessage.getContent()); + } + + @Test + @WithMockUser(username="hr") + public void givenUsernameHr_whenFindMessageById2_thenOK(){ + NoticeMessage secondMessage = repo.findById(SECOND_MESSAGE_ID); + assertNotNull(secondMessage); + assertEquals(SECOND_MESSAGE_ID,secondMessage.getId()); + } + + @Test(expected=AccessDeniedException.class) + @WithMockUser(username="hr") + public void givenUsernameHr_whenUpdateMessageWithId2_thenFail(){ + NoticeMessage secondMessage = new NoticeMessage(); + secondMessage.setId(SECOND_MESSAGE_ID); + secondMessage.setContent(EDITTED_CONTENT); + repo.save(secondMessage); + } + + @Test + @WithMockUser(roles={"EDITOR"}) + public void givenRoleEditor_whenFindAllMessage_thenReturn3Message(){ + List details = repo.findAll(); + assertNotNull(details); + assertEquals(3,details.size()); + } + + @Test + @WithMockUser(roles={"EDITOR"}) + public void givenRoleEditor_whenUpdateThirdMessage_thenOK(){ + NoticeMessage thirdMessage = new NoticeMessage(); + thirdMessage.setId(THIRD_MESSAGE_ID); + thirdMessage.setContent(EDITTED_CONTENT); + repo.save(thirdMessage); + } + + @Test(expected=AccessDeniedException.class) + @WithMockUser(roles={"EDITOR"}) + public void givenRoleEditor_whenFind1stMessageByIdAndUpdateContent_thenFail(){ + NoticeMessage firstMessage = repo.findById(FIRST_MESSAGE_ID); + assertNotNull(firstMessage); + assertEquals(FIRST_MESSAGE_ID,firstMessage.getId()); + firstMessage.setContent(EDITTED_CONTENT); + repo.save(firstMessage); + } +} + \ No newline at end of file From 1a7e85ceedb1041b973b29d74b5d74feacd29aeb Mon Sep 17 00:00:00 2001 From: Donato Rimenti Date: Thu, 7 Dec 2017 04:41:29 +0100 Subject: [PATCH 165/236] BAEL-1196: jUnit @Test Annotation (#3184) * BAEL-1196: jUnit @Test Annotation * Fixed tests names as suggested. * Reduced visibility on test methods. --- .../com/baeldung/junit5/bean/NumbersBean.java | 22 ++++++++++ .../junit5/bean/test/NumbersBeanUnitTest.java | 43 +++++++++++++++++++ 2 files changed, 65 insertions(+) create mode 100644 testing-modules/junit-5/src/main/java/com/baeldung/junit5/bean/NumbersBean.java create mode 100644 testing-modules/junit-5/src/test/java/com/baeldung/junit5/bean/test/NumbersBeanUnitTest.java diff --git a/testing-modules/junit-5/src/main/java/com/baeldung/junit5/bean/NumbersBean.java b/testing-modules/junit-5/src/main/java/com/baeldung/junit5/bean/NumbersBean.java new file mode 100644 index 0000000000..48730fd844 --- /dev/null +++ b/testing-modules/junit-5/src/main/java/com/baeldung/junit5/bean/NumbersBean.java @@ -0,0 +1,22 @@ +package com.baeldung.junit5.bean; + +/** + * Bean that contains utility methods to work with numbers. + * + * @author Donato Rimenti + * + */ +public class NumbersBean { + + /** + * Returns true if a number is even, false otherwise. + * + * @param number + * the number to check + * @return true if the argument is even, false otherwise + */ + public boolean isNumberEven(int number) { + return number % 2 == 0; + } + +} diff --git a/testing-modules/junit-5/src/test/java/com/baeldung/junit5/bean/test/NumbersBeanUnitTest.java b/testing-modules/junit-5/src/test/java/com/baeldung/junit5/bean/test/NumbersBeanUnitTest.java new file mode 100644 index 0000000000..0297d010e8 --- /dev/null +++ b/testing-modules/junit-5/src/test/java/com/baeldung/junit5/bean/test/NumbersBeanUnitTest.java @@ -0,0 +1,43 @@ +package com.baeldung.junit5.bean.test; + +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; + +import com.baeldung.junit5.bean.NumbersBean; + +/** + * Test class for {@link NumbersBean}. + * + * @author Donato Rimenti + * + */ +public class NumbersBeanUnitTest { + + /** + * The bean to test. + */ + private NumbersBean bean = new NumbersBean(); + + /** + * Tests that when an even number is passed to + * {@link NumbersBean#isNumberEven(int)}, true is returned. + */ + @Test + void givenEvenNumber_whenCheckingIsNumberEven_thenTrue() { + boolean result = bean.isNumberEven(8); + + Assertions.assertTrue(result); + } + + /** + * Tests that when an odd number is passed to + * {@link NumbersBean#isNumberEven(int)}, false is returned. + */ + @Test + void givenOddNumber_whenCheckingIsNumberEven_thenFalse() { + boolean result = bean.isNumberEven(3); + + Assertions.assertFalse(result); + } + +} From 909109ec9122c23d63728e90852ad73fd5585be0 Mon Sep 17 00:00:00 2001 From: Grzegorz Piwowarek Date: Thu, 7 Dec 2017 10:24:26 +0100 Subject: [PATCH 166/236] Create README.md (#3202) --- spring-security-acl/README.md | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 spring-security-acl/README.md diff --git a/spring-security-acl/README.md b/spring-security-acl/README.md new file mode 100644 index 0000000000..fb3e8160ab --- /dev/null +++ b/spring-security-acl/README.md @@ -0,0 +1,4 @@ +## Spring Security ACL Project + +### Relevant Articles +- [Introduction to Spring Security ACL](http://www.baeldung.com/spring-security-acl) From c0a730a3ac5fcd51d1ce732e633bae1f3cb89a18 Mon Sep 17 00:00:00 2001 From: ocheja Date: Thu, 7 Dec 2017 18:24:49 +0900 Subject: [PATCH 167/236] Replace string concatenations with String.format (#3201) * Define beans for handling different message types in a lean chat app * Add class based spring beans configuration * Define spring configuration in XML for constructor based bean injection * Refactor package structure to separate constructor based bean injection code set from setter based bean injection code set * Define configuration and classes specific to setter-based bean injection. * Implement tests for constructor-based and setter-based bean injections * develop codes for explaining type erasure * Write unit tests for type erasure examples * Remove evaluation article code * Modify type erasure examples and unit tests * Modify type erasure examples and unit tests * Add expected exception in TypeErasureUnitTest * Correct grammar in class name * Implement File Manager app to demonstrate Polymorphism. Develop unit tests for Polymorphism article code * Add examples for static polymorphism * Change sysout statments to slf4j log info statements * Add assertions and expected errors check on Test * Add assertions and expected errors check on Test * Correct compile time error of symbol not found * Removed commented out non-compiling test. * Replace string concatenations with String.format * Replace string concatenations with String.format --- .../src/main/java/com/baeldung/polymorphism/GenericFile.java | 2 +- .../src/main/java/com/baeldung/polymorphism/ImageFile.java | 2 +- core-java/src/main/java/com/baeldung/polymorphism/TextFile.java | 2 +- .../java/com/baeldung/polymorphism/PolymorphismUnitTest.java | 2 -- 4 files changed, 3 insertions(+), 5 deletions(-) diff --git a/core-java/src/main/java/com/baeldung/polymorphism/GenericFile.java b/core-java/src/main/java/com/baeldung/polymorphism/GenericFile.java index 4075083c49..03e704f36f 100644 --- a/core-java/src/main/java/com/baeldung/polymorphism/GenericFile.java +++ b/core-java/src/main/java/com/baeldung/polymorphism/GenericFile.java @@ -54,7 +54,7 @@ public class GenericFile { } public String getFileInfo() { - return "File Name: " + this.getName() + "\n" + "Extension: " + this.getExtension() + "\n" + "Date Created: " + this.getDateCreated() + "\n" + "Version: " + this.getVersion() + "\n"; + return String.format("File Name: %s\n" + " Extension: %s\n" + " Date Created: %s\n" + " Version: %s\n", this.getName(), this.getExtension(), this.getDateCreated(), this.getVersion()); } public Object read() { diff --git a/core-java/src/main/java/com/baeldung/polymorphism/ImageFile.java b/core-java/src/main/java/com/baeldung/polymorphism/ImageFile.java index ac72a40993..e237f3f826 100644 --- a/core-java/src/main/java/com/baeldung/polymorphism/ImageFile.java +++ b/core-java/src/main/java/com/baeldung/polymorphism/ImageFile.java @@ -30,7 +30,7 @@ public class ImageFile extends GenericFile { } public String getFileInfo() { - return super.getFileInfo() + "Height: " + this.getHeight() + "\n" + "Width: " + this.getWidth(); + return String.format(" %s Height: %d\n Width: %d", super.getFileInfo(), this.getHeight(), this.getWidth()); } public String read() { diff --git a/core-java/src/main/java/com/baeldung/polymorphism/TextFile.java b/core-java/src/main/java/com/baeldung/polymorphism/TextFile.java index 8280b4ee95..2c28c968b8 100644 --- a/core-java/src/main/java/com/baeldung/polymorphism/TextFile.java +++ b/core-java/src/main/java/com/baeldung/polymorphism/TextFile.java @@ -21,7 +21,7 @@ public class TextFile extends GenericFile { } public String getFileInfo() { - return super.getFileInfo() + "Word Count: " + wordCount; + return String.format(" %s Word Count: %d", super.getFileInfo(), wordCount); } public String read() { diff --git a/core-java/src/test/java/com/baeldung/polymorphism/PolymorphismUnitTest.java b/core-java/src/test/java/com/baeldung/polymorphism/PolymorphismUnitTest.java index 8fb606c2fc..58826766e0 100644 --- a/core-java/src/test/java/com/baeldung/polymorphism/PolymorphismUnitTest.java +++ b/core-java/src/test/java/com/baeldung/polymorphism/PolymorphismUnitTest.java @@ -3,8 +3,6 @@ package com.baeldung.polymorphism; import static org.junit.Assert.*; import java.awt.image.BufferedImage; - -import org.junit.Ignore; import org.junit.Test; public class PolymorphismUnitTest { From 694dbe983d2ddfddd6e4152702973e51677be661 Mon Sep 17 00:00:00 2001 From: Loredana Crusoveanu Date: Thu, 7 Dec 2017 13:41:35 +0200 Subject: [PATCH 168/236] Update README.md --- spring-cloud/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/spring-cloud/README.md b/spring-cloud/README.md index 1b793144b1..b24e5b0296 100644 --- a/spring-cloud/README.md +++ b/spring-cloud/README.md @@ -15,6 +15,7 @@ - [Intro to Spring Cloud Netflix - Hystrix](http://www.baeldung.com/spring-cloud-netflix-hystrix) - [Dockerizing a Spring Boot Application](http://www.baeldung.com/dockerizing-spring-boot-application) - [Introduction to Spring Cloud Rest Client with Netflix Ribbon](http://www.baeldung.com/spring-cloud-rest-client-with-netflix-ribbon) +- [A Quick Guide to Spring Cloud Consul](http://www.baeldung.com/spring-cloud-consul) ### Relevant Articles: - [Introduction to Spring Cloud Rest Client with Netflix Ribbon](http://www.baeldung.com/spring-cloud-rest-client-with-netflix-ribbon) From a391ecf04fe7b3bf38f79d8ce5abf149e111de5f Mon Sep 17 00:00:00 2001 From: Marcos Date: Thu, 7 Dec 2017 23:37:09 +0100 Subject: [PATCH 169/236] BAEL-1339 - Implementing a binary tree in Java --- .../java/com/baeldung/tree/BinaryTree.java | 217 ++++++++++++++++++ .../com/baeldung/tree/BinaryTreeTest.java | 141 ++++++++++++ 2 files changed, 358 insertions(+) create mode 100644 core-java/src/main/java/com/baeldung/tree/BinaryTree.java create mode 100644 core-java/src/test/java/com/baeldung/tree/BinaryTreeTest.java diff --git a/core-java/src/main/java/com/baeldung/tree/BinaryTree.java b/core-java/src/main/java/com/baeldung/tree/BinaryTree.java new file mode 100644 index 0000000000..3c5f5f4e10 --- /dev/null +++ b/core-java/src/main/java/com/baeldung/tree/BinaryTree.java @@ -0,0 +1,217 @@ +package com.baeldung.tree; + +import java.util.LinkedList; +import java.util.Queue; + +public class BinaryTree { + + Node root; + + public void add(int value) { + + Node newNode = new Node(value); + + if (root == null) { + root = newNode; + return; + } + + Node parent = root; + Node current = root; + + while (true) { + + if (newNode.value < parent.value) { + current = parent.left; + + if (current == null) { + parent.left = newNode; + break; + } + } else { + current = parent.right; + + if (current == null) { + parent.right = newNode; + break; + } + } + + parent = current; + } + + } + + public boolean isEmpty() { + return root == null; + } + + public boolean containsNode(int value) { + + Node current = root; + + while (current != null) { + + if (value == current.value) { + return true; + } + + if (value < current.value) { + current = current.left; + } else { + current = current.right; + } + + } + + return false; + } + + public void delete(int value) { + + Node current = root; + Node parent = root; + Node nodeToDelete = null; + boolean isLeftChild = false; + + while (nodeToDelete == null && current != null) { + + if (value == current.value) { + nodeToDelete = current; + } else if (value < current.value) { + parent = current; + current = current.left; + isLeftChild = true; + } else { + parent = current; + current = current.right; + isLeftChild = false; + } + + } + + if (nodeToDelete == null) { + return; + } + + // Case 1: no children + if (nodeToDelete.left == null && nodeToDelete.right == null) { + if (nodeToDelete == root) { + root = null; + } else if (isLeftChild) { + parent.left = null; + } else { + parent.right = null; + } + } + // Case 2: only 1 child + else if (nodeToDelete.right == null) { + if (nodeToDelete == root) { + root = nodeToDelete.left; + } else if (isLeftChild) { + parent.left = nodeToDelete.left; + } else { + parent.right = nodeToDelete.left; + } + } else if (nodeToDelete.left == null) { + if (nodeToDelete == root) { + root = nodeToDelete.right; + } else if (isLeftChild) { + parent.left = nodeToDelete.right; + } else { + parent.right = nodeToDelete.right; + } + } + // Case 3: 2 children + else if (nodeToDelete.left != null && nodeToDelete.right != null) { + Node replacement = findReplacement(nodeToDelete); + if (nodeToDelete == root) { + root = replacement; + } else if (isLeftChild) { + parent.left = replacement; + } else { + parent.right = replacement; + } + } + + } + + private Node findReplacement(Node nodeToDelete) { + + Node replacement = nodeToDelete; + Node parentReplacement = nodeToDelete; + Node current = nodeToDelete.right; + + while (current != null) { + parentReplacement = replacement; + replacement = current; + current = current.left; + } + + if (replacement != nodeToDelete.right) { + parentReplacement.left = replacement.right; + replacement.right = nodeToDelete.right; + } + + replacement.left = nodeToDelete.left; + + return replacement; + } + + public void traverseInOrder(Node node) { + if (node != null) { + traverseInOrder(node.left); + System.out.print(" " + node.value); + traverseInOrder(node.right); + } + } + + public void traversePreOrder(Node node) { + if (node != null) { + System.out.print(" " + node.value); + traversePreOrder(node.left); + traversePreOrder(node.right); + } + } + + public void traversePostOrder(Node node) { + if (node != null) { + traversePostOrder(node.left); + traversePostOrder(node.right); + + System.out.print(" " + node.value); + } + } + + public void traverseLevelOrder() { + Queue nodes = new LinkedList<>(); + nodes.add(root); + + while (!nodes.isEmpty()) { + + Node node = nodes.remove(); + + System.out.print(" " + node.value); + + if (node.left != null) { + nodes.add(node.left); + } + + if (node.left != null) { + nodes.add(node.right); + } + } + } + + class Node { + int value; + Node left; + Node right; + + Node(int value) { + this.value = value; + right = null; + left = null; + } + } +} diff --git a/core-java/src/test/java/com/baeldung/tree/BinaryTreeTest.java b/core-java/src/test/java/com/baeldung/tree/BinaryTreeTest.java new file mode 100644 index 0000000000..df0f3ba62d --- /dev/null +++ b/core-java/src/test/java/com/baeldung/tree/BinaryTreeTest.java @@ -0,0 +1,141 @@ +package com.baeldung.tree; + +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertTrue; + +import org.junit.Test; + +public class BinaryTreeTest { + + @Test + public void givenABinaryTree_WhenAddElements_ThenTreeNotEmpty() { + + BinaryTree bt = new BinaryTree(); + + bt.add(6); + bt.add(4); + bt.add(8); + bt.add(3); + bt.add(5); + bt.add(7); + bt.add(9); + + assertTrue(!bt.isEmpty()); + } + + @Test + public void givenABinaryTree_WhenAddElements_ThenTreeContainsThoseElements() { + + BinaryTree bt = new BinaryTree(); + + bt.add(6); + bt.add(4); + bt.add(8); + bt.add(3); + bt.add(5); + bt.add(7); + bt.add(9); + + assertTrue(bt.containsNode(6)); + assertTrue(bt.containsNode(4)); + assertTrue(bt.containsNode(8)); + assertTrue(bt.containsNode(3)); + assertTrue(bt.containsNode(5)); + assertTrue(bt.containsNode(7)); + assertTrue(bt.containsNode(9)); + + assertFalse(bt.containsNode(1)); + assertFalse(bt.containsNode(10)); + } + + @Test + public void givenABinaryTree_WhenDeletingElements_ThenTreeDoesNotContainThoseElements() { + + BinaryTree bt = new BinaryTree(); + + bt.add(6); + bt.add(4); + bt.add(8); + bt.add(3); + bt.add(5); + bt.add(7); + bt.add(9); + + assertTrue(bt.containsNode(9)); + bt.delete(9); + assertFalse(bt.containsNode(9)); + + assertTrue(bt.containsNode(6)); + bt.delete(6); + assertFalse(bt.containsNode(6)); + + assertTrue(bt.containsNode(4)); + bt.delete(4); + assertFalse(bt.containsNode(4)); + } + + @Test + public void givenABinaryTree_WhenTraversingInOrder_ThenPrintValues() { + + BinaryTree bt = new BinaryTree(); + + bt.add(6); + bt.add(4); + bt.add(8); + bt.add(3); + bt.add(5); + bt.add(7); + bt.add(9); + + bt.traverseInOrder(bt.root); + } + + @Test + public void givenABinaryTree_WhenTraversingPreOrder_ThenPrintValues() { + + BinaryTree bt = new BinaryTree(); + + bt.add(6); + bt.add(4); + bt.add(8); + bt.add(3); + bt.add(5); + bt.add(7); + bt.add(9); + + bt.traversePreOrder(bt.root); + } + + @Test + public void givenABinaryTree_WhenTraversingPostOrder_ThenPrintValues() { + + BinaryTree bt = new BinaryTree(); + + bt.add(6); + bt.add(4); + bt.add(8); + bt.add(3); + bt.add(5); + bt.add(7); + bt.add(9); + + bt.traversePostOrder(bt.root); + } + + @Test + public void givenABinaryTree_WhenTraversingLevelOrder_ThenPrintValues() { + + BinaryTree bt = new BinaryTree(); + + bt.add(6); + bt.add(4); + bt.add(8); + bt.add(3); + bt.add(5); + bt.add(7); + bt.add(9); + + bt.traverseLevelOrder(); + } + +} From 2ed8da65c1b9e7e1127d0927f23b9e1d58fb5f5a Mon Sep 17 00:00:00 2001 From: aietcn Date: Fri, 8 Dec 2017 18:07:31 +0800 Subject: [PATCH 170/236] BAEL-1270 intro to dubbo (#3109) * BAEL-1270 intro to dubbo * BAEL-1270: add cluster and load-balancing tests * BAEL-1270 exclude *LiveTest * BAEL-1270 using call() instead of run() in executorService.submit() --- dubbo/README.md | 4 + dubbo/pom.xml | 72 ++++++ .../simple/SimpleRegistryService.java | 210 ++++++++++++++++++ .../remote/GreetingsFailoverServiceImpl.java | 14 ++ .../dubbo/remote/GreetingsService.java | 10 + .../dubbo/remote/GreetingsServiceImpl.java | 14 ++ .../remote/GreetingsServiceSpecialImpl.java | 20 ++ .../dubbo/APIConfigurationLiveTest.java | 57 +++++ .../ClusterDynamicLoadBalanceLiveTest.java | 70 ++++++ .../dubbo/ClusterFailoverLiveTest.java | 52 +++++ .../dubbo/ClusterFailsafeLiveTest.java | 47 ++++ .../dubbo/ClusterLoadBalanceLiveTest.java | 66 ++++++ .../dubbo/MulticastRegistryLiveTest.java | 36 +++ .../baeldung/dubbo/ResultCacheLiveTest.java | 47 ++++ .../dubbo/SimpleRegistryLiveTest.java | 39 ++++ .../cluster/consumer-app-failtest.xml | 15 ++ .../resources/cluster/consumer-app-lb.xml | 15 ++ .../cluster/provider-app-default.xml | 22 ++ .../cluster/provider-app-failover.xml | 22 ++ .../cluster/provider-app-special-failsafe.xml | 22 ++ .../cluster/provider-app-special.xml | 22 ++ dubbo/src/test/resources/log4j.properties | 6 + .../test/resources/multicast/consumer-app.xml | 15 ++ .../multicast/provider-app-special.xml | 22 ++ .../test/resources/multicast/provider-app.xml | 22 ++ .../test/resources/simple/consumer-app.xml | 15 ++ .../test/resources/simple/provider-app.xml | 22 ++ dubbo/src/test/resources/simple/registry.xml | 17 ++ 28 files changed, 995 insertions(+) create mode 100644 dubbo/README.md create mode 100644 dubbo/pom.xml create mode 100644 dubbo/src/main/java/com/alibaba/dubbo/registry/simple/SimpleRegistryService.java create mode 100644 dubbo/src/main/java/com/baeldung/dubbo/remote/GreetingsFailoverServiceImpl.java create mode 100644 dubbo/src/main/java/com/baeldung/dubbo/remote/GreetingsService.java create mode 100644 dubbo/src/main/java/com/baeldung/dubbo/remote/GreetingsServiceImpl.java create mode 100644 dubbo/src/main/java/com/baeldung/dubbo/remote/GreetingsServiceSpecialImpl.java create mode 100644 dubbo/src/test/java/com/baeldung/dubbo/APIConfigurationLiveTest.java create mode 100644 dubbo/src/test/java/com/baeldung/dubbo/ClusterDynamicLoadBalanceLiveTest.java create mode 100644 dubbo/src/test/java/com/baeldung/dubbo/ClusterFailoverLiveTest.java create mode 100644 dubbo/src/test/java/com/baeldung/dubbo/ClusterFailsafeLiveTest.java create mode 100644 dubbo/src/test/java/com/baeldung/dubbo/ClusterLoadBalanceLiveTest.java create mode 100644 dubbo/src/test/java/com/baeldung/dubbo/MulticastRegistryLiveTest.java create mode 100644 dubbo/src/test/java/com/baeldung/dubbo/ResultCacheLiveTest.java create mode 100644 dubbo/src/test/java/com/baeldung/dubbo/SimpleRegistryLiveTest.java create mode 100644 dubbo/src/test/resources/cluster/consumer-app-failtest.xml create mode 100644 dubbo/src/test/resources/cluster/consumer-app-lb.xml create mode 100644 dubbo/src/test/resources/cluster/provider-app-default.xml create mode 100644 dubbo/src/test/resources/cluster/provider-app-failover.xml create mode 100644 dubbo/src/test/resources/cluster/provider-app-special-failsafe.xml create mode 100644 dubbo/src/test/resources/cluster/provider-app-special.xml create mode 100644 dubbo/src/test/resources/log4j.properties create mode 100644 dubbo/src/test/resources/multicast/consumer-app.xml create mode 100644 dubbo/src/test/resources/multicast/provider-app-special.xml create mode 100644 dubbo/src/test/resources/multicast/provider-app.xml create mode 100644 dubbo/src/test/resources/simple/consumer-app.xml create mode 100644 dubbo/src/test/resources/simple/provider-app.xml create mode 100644 dubbo/src/test/resources/simple/registry.xml diff --git a/dubbo/README.md b/dubbo/README.md new file mode 100644 index 0000000000..dec02f5cfc --- /dev/null +++ b/dubbo/README.md @@ -0,0 +1,4 @@ +## Relevant articles: + +- [Intro to Dubbo](http://www.baeldung.com/dubbo-intro) + diff --git a/dubbo/pom.xml b/dubbo/pom.xml new file mode 100644 index 0000000000..3faef99e8d --- /dev/null +++ b/dubbo/pom.xml @@ -0,0 +1,72 @@ + + 4.0.0 + + + parent-modules + com.baeldung + 1.0.0-SNAPSHOT + + + dubbo + + + UTF-8 + UTF-8 + 1.8 + 2.5.7 + 3.4.11 + 0.10 + 2.19.1 + + + + + com.alibaba + dubbo + ${dubbo.version} + + + junit + junit + 4.12 + test + + + + org.apache.zookeeper + zookeeper + ${zookeeper.version} + + + + com.101tec + zkclient + ${zkclient.version} + + + + + + + + org.apache.maven.plugins + maven-compiler-plugin + + 1.8 + 1.8 + + + + maven-surefire-plugin + ${surefire.version} + + + **/*LiveTest.java + + + + + + + diff --git a/dubbo/src/main/java/com/alibaba/dubbo/registry/simple/SimpleRegistryService.java b/dubbo/src/main/java/com/alibaba/dubbo/registry/simple/SimpleRegistryService.java new file mode 100644 index 0000000000..bf4a5e201c --- /dev/null +++ b/dubbo/src/main/java/com/alibaba/dubbo/registry/simple/SimpleRegistryService.java @@ -0,0 +1,210 @@ +/* + * Copyright 1999-2011 Alibaba Group. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.alibaba.dubbo.registry.simple; + +import com.alibaba.dubbo.common.Constants; +import com.alibaba.dubbo.common.URL; +import com.alibaba.dubbo.common.logger.Logger; +import com.alibaba.dubbo.common.logger.LoggerFactory; +import com.alibaba.dubbo.common.utils.ConcurrentHashSet; +import com.alibaba.dubbo.common.utils.NetUtils; +import com.alibaba.dubbo.common.utils.UrlUtils; +import com.alibaba.dubbo.registry.NotifyListener; +import com.alibaba.dubbo.registry.RegistryService; +import com.alibaba.dubbo.registry.support.AbstractRegistry; +import com.alibaba.dubbo.rpc.RpcContext; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.ConcurrentMap; + +/** + * SimpleRegistryService + * + * @author william.liangf + */ +public class SimpleRegistryService extends AbstractRegistry { + + private final static Logger logger = LoggerFactory.getLogger(SimpleRegistryService.class); + private final ConcurrentMap> remoteRegistered = new ConcurrentHashMap>(); + private final ConcurrentMap>> remoteSubscribed = new ConcurrentHashMap>>(); + + public SimpleRegistryService() { + super(new URL("dubbo", NetUtils.getLocalHost(), 0, RegistryService.class.getName(), "file", "N/A")); + } + + public boolean isAvailable() { + return true; + } + + public List lookup(URL url) { + List urls = new ArrayList(); + for (URL u : getRegistered()) { + if (UrlUtils.isMatch(url, u)) { + urls.add(u); + } + } + return urls; + } + + public void register(URL url) { + String client = RpcContext.getContext().getRemoteAddressString(); + Set urls = remoteRegistered.get(client); + if (urls == null) { + remoteRegistered.putIfAbsent(client, new ConcurrentHashSet()); + urls = remoteRegistered.get(client); + } + urls.add(url); + super.register(url); + registered(url); + } + + public void unregister(URL url) { + String client = RpcContext.getContext().getRemoteAddressString(); + Set urls = remoteRegistered.get(client); + if (urls != null && urls.size() > 0) { + urls.remove(url); + } + super.unregister(url); + unregistered(url); + } + + public void subscribe(URL url, NotifyListener listener) { + if (getUrl().getPort() == 0) { + URL registryUrl = RpcContext.getContext().getUrl(); + if (registryUrl != null && registryUrl.getPort() > 0 + && RegistryService.class.getName().equals(registryUrl.getPath())) { + super.setUrl(registryUrl); + super.register(registryUrl); + } + } + String client = RpcContext.getContext().getRemoteAddressString(); + ConcurrentMap> clientListeners = remoteSubscribed.get(client); + if (clientListeners == null) { + remoteSubscribed.putIfAbsent(client, new ConcurrentHashMap>()); + clientListeners = remoteSubscribed.get(client); + } + Set listeners = clientListeners.get(url); + if (listeners == null) { + clientListeners.putIfAbsent(url, new ConcurrentHashSet()); + listeners = clientListeners.get(url); + } + listeners.add(listener); + super.subscribe(url, listener); + subscribed(url, listener); + } + + public void unsubscribe(URL url, NotifyListener listener) { + if (!Constants.ANY_VALUE.equals(url.getServiceInterface()) + && url.getParameter(Constants.REGISTER_KEY, true)) { + unregister(url); + } + String client = RpcContext.getContext().getRemoteAddressString(); + Map> clientListeners = remoteSubscribed.get(client); + if (clientListeners != null && clientListeners.size() > 0) { + Set listeners = clientListeners.get(url); + if (listeners != null && listeners.size() > 0) { + listeners.remove(listener); + } + } + } + + protected void registered(URL url) { + for (Map.Entry> entry : getSubscribed().entrySet()) { + URL key = entry.getKey(); + if (UrlUtils.isMatch(key, url)) { + List list = lookup(key); + for (NotifyListener listener : entry.getValue()) { + listener.notify(list); + } + } + } + } + + protected void unregistered(URL url) { + for (Map.Entry> entry : getSubscribed().entrySet()) { + URL key = entry.getKey(); + if (UrlUtils.isMatch(key, url)) { + List list = lookup(key); + for (NotifyListener listener : entry.getValue()) { + listener.notify(list); + } + } + } + } + + protected void subscribed(final URL url, final NotifyListener listener) { + if (Constants.ANY_VALUE.equals(url.getServiceInterface())) { + new Thread(new Runnable() { + public void run() { + Map> map = new HashMap>(); + for (URL u : getRegistered()) { + if (UrlUtils.isMatch(url, u)) { + String service = u.getServiceInterface(); + List list = map.get(service); + if (list == null) { + list = new ArrayList(); + map.put(service, list); + } + list.add(u); + } + } + for (List list : map.values()) { + try { + listener.notify(list); + } catch (Throwable e) { + logger.warn("Discard to notify " + url.getServiceKey() + " to listener " + listener); + } + } + } + }, "DubboMonitorNotifier").start(); + } else { + List list = lookup(url); + try { + listener.notify(list); + } catch (Throwable e) { + logger.warn("Discard to notify " + url.getServiceKey() + " to listener " + listener); + } + } + } + + public void disconnect() { + String client = RpcContext.getContext().getRemoteAddressString(); + if (logger.isInfoEnabled()) { + logger.info("Disconnected " + client); + } + Set urls = remoteRegistered.get(client); + if (urls != null && urls.size() > 0) { + for (URL url : urls) { + unregister(url); + } + } + Map> listeners = remoteSubscribed.get(client); + if (listeners != null && listeners.size() > 0) { + for (Map.Entry> entry : listeners.entrySet()) { + URL url = entry.getKey(); + for (NotifyListener listener : entry.getValue()) { + unsubscribe(url, listener); + } + } + } + } + +} \ No newline at end of file diff --git a/dubbo/src/main/java/com/baeldung/dubbo/remote/GreetingsFailoverServiceImpl.java b/dubbo/src/main/java/com/baeldung/dubbo/remote/GreetingsFailoverServiceImpl.java new file mode 100644 index 0000000000..2ad26beac3 --- /dev/null +++ b/dubbo/src/main/java/com/baeldung/dubbo/remote/GreetingsFailoverServiceImpl.java @@ -0,0 +1,14 @@ +package com.baeldung.dubbo.remote; + +/** + * @author aiet + */ +public class GreetingsFailoverServiceImpl implements GreetingsService { + + @Override + public String sayHi(String name) { + System.out.println("failover implementation"); + return "hi, failover " + name; + } + +} diff --git a/dubbo/src/main/java/com/baeldung/dubbo/remote/GreetingsService.java b/dubbo/src/main/java/com/baeldung/dubbo/remote/GreetingsService.java new file mode 100644 index 0000000000..337c4c83e7 --- /dev/null +++ b/dubbo/src/main/java/com/baeldung/dubbo/remote/GreetingsService.java @@ -0,0 +1,10 @@ +package com.baeldung.dubbo.remote; + +/** + * @author aiet + */ +public interface GreetingsService { + + String sayHi(String name); + +} diff --git a/dubbo/src/main/java/com/baeldung/dubbo/remote/GreetingsServiceImpl.java b/dubbo/src/main/java/com/baeldung/dubbo/remote/GreetingsServiceImpl.java new file mode 100644 index 0000000000..a11d9588d8 --- /dev/null +++ b/dubbo/src/main/java/com/baeldung/dubbo/remote/GreetingsServiceImpl.java @@ -0,0 +1,14 @@ +package com.baeldung.dubbo.remote; + +/** + * @author aiet + */ +public class GreetingsServiceImpl implements GreetingsService { + + @Override + public String sayHi(String name) { + System.out.println("default implementation"); + return "hi, " + name; + } + +} diff --git a/dubbo/src/main/java/com/baeldung/dubbo/remote/GreetingsServiceSpecialImpl.java b/dubbo/src/main/java/com/baeldung/dubbo/remote/GreetingsServiceSpecialImpl.java new file mode 100644 index 0000000000..37449da8d8 --- /dev/null +++ b/dubbo/src/main/java/com/baeldung/dubbo/remote/GreetingsServiceSpecialImpl.java @@ -0,0 +1,20 @@ +package com.baeldung.dubbo.remote; + +import static java.util.concurrent.TimeUnit.SECONDS; + +/** + * @author aiet + */ +public class GreetingsServiceSpecialImpl implements GreetingsService { + + @Override + public String sayHi(String name) { + try { + System.out.println("specially called"); + SECONDS.sleep(5); + } catch (Exception ignored) { + } + return "hi, " + name; + } + +} diff --git a/dubbo/src/test/java/com/baeldung/dubbo/APIConfigurationLiveTest.java b/dubbo/src/test/java/com/baeldung/dubbo/APIConfigurationLiveTest.java new file mode 100644 index 0000000000..27c77bf9df --- /dev/null +++ b/dubbo/src/test/java/com/baeldung/dubbo/APIConfigurationLiveTest.java @@ -0,0 +1,57 @@ +package com.baeldung.dubbo; + +import com.alibaba.dubbo.config.ApplicationConfig; +import com.alibaba.dubbo.config.ReferenceConfig; +import com.alibaba.dubbo.config.RegistryConfig; +import com.alibaba.dubbo.config.ServiceConfig; +import com.baeldung.dubbo.remote.GreetingsService; +import com.baeldung.dubbo.remote.GreetingsServiceImpl; +import org.junit.Before; +import org.junit.Test; + +import static org.junit.Assert.assertEquals; + +/** + * @author aiet + */ +public class APIConfigurationLiveTest { + + @Before + public void initProvider() { + ApplicationConfig application = new ApplicationConfig(); + application.setName("demo-provider"); + application.setVersion("1.0"); + + RegistryConfig registryConfig = new RegistryConfig(); + registryConfig.setAddress("multicast://224.1.1.1:9090"); + + ServiceConfig service = new ServiceConfig<>(); + service.setApplication(application); + service.setRegistry(registryConfig); + service.setInterface(GreetingsService.class); + service.setRef(new GreetingsServiceImpl()); + + service.export(); + } + + @Test + public void givenProviderConsumer_whenSayHi_thenGotResponse() { + ApplicationConfig application = new ApplicationConfig(); + application.setName("demo-consumer"); + application.setVersion("1.0"); + + RegistryConfig registryConfig = new RegistryConfig(); + registryConfig.setAddress("multicast://224.1.1.1:9090"); + + ReferenceConfig reference = new ReferenceConfig<>(); + reference.setApplication(application); + reference.setRegistry(registryConfig); + reference.setInterface(GreetingsService.class); + + GreetingsService greetingsService = reference.get(); + String hiMessage = greetingsService.sayHi("baeldung"); + + assertEquals("hi, baeldung", hiMessage); + } + +} diff --git a/dubbo/src/test/java/com/baeldung/dubbo/ClusterDynamicLoadBalanceLiveTest.java b/dubbo/src/test/java/com/baeldung/dubbo/ClusterDynamicLoadBalanceLiveTest.java new file mode 100644 index 0000000000..408d5af368 --- /dev/null +++ b/dubbo/src/test/java/com/baeldung/dubbo/ClusterDynamicLoadBalanceLiveTest.java @@ -0,0 +1,70 @@ +package com.baeldung.dubbo; + +import com.baeldung.dubbo.remote.GreetingsService; +import org.junit.After; +import org.junit.Before; +import org.junit.Test; +import org.springframework.context.support.ClassPathXmlApplicationContext; + +import java.util.ArrayList; +import java.util.List; +import java.util.OptionalDouble; +import java.util.concurrent.Callable; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; + +import static java.util.concurrent.TimeUnit.SECONDS; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertTrue; + +/** + * @author aiet + */ +public class ClusterDynamicLoadBalanceLiveTest { + + private ExecutorService executorService; + + @Before + public void initRemote() { + executorService = Executors.newFixedThreadPool(2); + executorService.submit(() -> { + ClassPathXmlApplicationContext remoteContext = new ClassPathXmlApplicationContext("cluster/provider-app-default.xml"); + remoteContext.start(); + }); + executorService.submit(() -> { + SECONDS.sleep(2); + ClassPathXmlApplicationContext backupRemoteContext = new ClassPathXmlApplicationContext("cluster/provider-app-special.xml"); + backupRemoteContext.start(); + return null; + }); + } + + @Test + public void givenProviderCluster_whenConsumerSaysHi_thenResponseBalanced() throws InterruptedException { + ClassPathXmlApplicationContext localContext = new ClassPathXmlApplicationContext("cluster/consumer-app-lb.xml"); + localContext.start(); + GreetingsService greetingsService = (GreetingsService) localContext.getBean("greetingsService"); + List elapseList = new ArrayList<>(6); + for (int i = 0; i < 6; i++) { + long current = System.currentTimeMillis(); + String hiMessage = greetingsService.sayHi("baeldung"); + assertNotNull(hiMessage); + elapseList.add(System.currentTimeMillis() - current); + SECONDS.sleep(1); + } + + OptionalDouble avgElapse = elapseList + .stream() + .mapToLong(e -> e) + .average(); + assertTrue(avgElapse.isPresent()); + assertTrue(avgElapse.getAsDouble() > 1666.0); + + } + + @After + public void destroy() { + executorService.shutdown(); + } + +} diff --git a/dubbo/src/test/java/com/baeldung/dubbo/ClusterFailoverLiveTest.java b/dubbo/src/test/java/com/baeldung/dubbo/ClusterFailoverLiveTest.java new file mode 100644 index 0000000000..721363d3d1 --- /dev/null +++ b/dubbo/src/test/java/com/baeldung/dubbo/ClusterFailoverLiveTest.java @@ -0,0 +1,52 @@ +package com.baeldung.dubbo; + +import com.baeldung.dubbo.remote.GreetingsService; +import org.junit.After; +import org.junit.Before; +import org.junit.Test; +import org.springframework.context.support.ClassPathXmlApplicationContext; + +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; + +/** + * @author aiet + */ +public class ClusterFailoverLiveTest { + + private ExecutorService executorService; + + @Before + public void initRemote() { + executorService = Executors.newFixedThreadPool(2); + executorService.submit(() -> { + ClassPathXmlApplicationContext backupRemoteContext = new ClassPathXmlApplicationContext("cluster/provider-app-special.xml"); + backupRemoteContext.start(); + }); + executorService.submit(() -> { + ClassPathXmlApplicationContext remoteContext = new ClassPathXmlApplicationContext("cluster/provider-app-failover.xml"); + remoteContext.start(); + }); + + } + + @Test + public void givenProviderCluster_whenConsumerSaysHi_thenGotFailoverResponse() { + ClassPathXmlApplicationContext localContext = new ClassPathXmlApplicationContext("cluster/consumer-app-failtest.xml"); + localContext.start(); + GreetingsService greetingsService = (GreetingsService) localContext.getBean("greetingsService"); + String hiMessage = greetingsService.sayHi("baeldung"); + + assertNotNull(hiMessage); + assertEquals("hi, failover baeldung", hiMessage); + } + + @After + public void destroy() { + executorService.shutdown(); + } + +} diff --git a/dubbo/src/test/java/com/baeldung/dubbo/ClusterFailsafeLiveTest.java b/dubbo/src/test/java/com/baeldung/dubbo/ClusterFailsafeLiveTest.java new file mode 100644 index 0000000000..29a10fa20a --- /dev/null +++ b/dubbo/src/test/java/com/baeldung/dubbo/ClusterFailsafeLiveTest.java @@ -0,0 +1,47 @@ +package com.baeldung.dubbo; + +import com.baeldung.dubbo.remote.GreetingsService; +import org.junit.After; +import org.junit.Before; +import org.junit.Test; +import org.springframework.context.support.ClassPathXmlApplicationContext; + +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertNull; + +/** + * @author aiet + */ +public class ClusterFailsafeLiveTest { + + private ExecutorService executorService; + + @Before + public void initRemote() { + executorService = Executors.newFixedThreadPool(1); + executorService.submit(() -> { + ClassPathXmlApplicationContext remoteContext = new ClassPathXmlApplicationContext("cluster/provider-app-special-failsafe.xml"); + remoteContext.start(); + }); + } + + @Test + public void givenProviderCluster_whenConsumerSaysHi_thenGotFailsafeResponse() { + ClassPathXmlApplicationContext localContext = new ClassPathXmlApplicationContext("cluster/consumer-app-failtest.xml"); + localContext.start(); + GreetingsService greetingsService = (GreetingsService) localContext.getBean("greetingsService"); + String hiMessage = greetingsService.sayHi("baeldung"); + + assertNull(hiMessage); + } + + @After + public void destroy() { + executorService.shutdown(); + } + +} diff --git a/dubbo/src/test/java/com/baeldung/dubbo/ClusterLoadBalanceLiveTest.java b/dubbo/src/test/java/com/baeldung/dubbo/ClusterLoadBalanceLiveTest.java new file mode 100644 index 0000000000..b880dfe843 --- /dev/null +++ b/dubbo/src/test/java/com/baeldung/dubbo/ClusterLoadBalanceLiveTest.java @@ -0,0 +1,66 @@ +package com.baeldung.dubbo; + +import com.baeldung.dubbo.remote.GreetingsService; +import org.junit.After; +import org.junit.Before; +import org.junit.Test; +import org.springframework.context.support.ClassPathXmlApplicationContext; + +import java.util.ArrayList; +import java.util.List; +import java.util.OptionalDouble; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; + +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertTrue; + +/** + * @author aiet + */ +public class ClusterLoadBalanceLiveTest { + + private ExecutorService executorService; + + @Before + public void initRemote() { + executorService = Executors.newFixedThreadPool(2); + executorService.submit(() -> { + ClassPathXmlApplicationContext remoteContext = new ClassPathXmlApplicationContext("cluster/provider-app-default.xml"); + remoteContext.start(); + }); + executorService.submit(() -> { + ClassPathXmlApplicationContext backupRemoteContext = new ClassPathXmlApplicationContext("cluster/provider-app-special.xml"); + backupRemoteContext.start(); + }); + } + + @Test + public void givenProviderCluster_whenConsumerSaysHi_thenResponseBalanced() { + ClassPathXmlApplicationContext localContext = new ClassPathXmlApplicationContext("cluster/consumer-app-lb.xml"); + localContext.start(); + GreetingsService greetingsService = (GreetingsService) localContext.getBean("greetingsService"); + List elapseList = new ArrayList<>(6); + for (int i = 0; i < 6; i++) { + long current = System.currentTimeMillis(); + String hiMessage = greetingsService.sayHi("baeldung"); + assertNotNull(hiMessage); + elapseList.add(System.currentTimeMillis() - current); + } + + OptionalDouble avgElapse = elapseList + .stream() + .mapToLong(e -> e) + .average(); + assertTrue(avgElapse.isPresent()); + System.out.println(avgElapse.getAsDouble()); + assertTrue(avgElapse.getAsDouble() > 2500.0); + + } + + @After + public void destroy() { + executorService.shutdown(); + } + +} diff --git a/dubbo/src/test/java/com/baeldung/dubbo/MulticastRegistryLiveTest.java b/dubbo/src/test/java/com/baeldung/dubbo/MulticastRegistryLiveTest.java new file mode 100644 index 0000000000..13dc5d3f1e --- /dev/null +++ b/dubbo/src/test/java/com/baeldung/dubbo/MulticastRegistryLiveTest.java @@ -0,0 +1,36 @@ +package com.baeldung.dubbo; + +import com.baeldung.dubbo.remote.GreetingsService; +import org.junit.After; +import org.junit.Before; +import org.junit.Test; +import org.springframework.context.support.ClassPathXmlApplicationContext; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; + +/** + * @author aiet + */ +public class MulticastRegistryLiveTest { + + private ClassPathXmlApplicationContext remoteContext; + + @Before + public void initRemote() { + remoteContext = new ClassPathXmlApplicationContext("multicast/provider-app.xml"); + remoteContext.start(); + } + + @Test + public void givenProvider_whenConsumerSaysHi_thenGotResponse() { + ClassPathXmlApplicationContext localContext = new ClassPathXmlApplicationContext("multicast/consumer-app.xml"); + localContext.start(); + GreetingsService greetingsService = (GreetingsService) localContext.getBean("greetingsService"); + String hiMessage = greetingsService.sayHi("baeldung"); + + assertNotNull(hiMessage); + assertEquals("hi, baeldung", hiMessage); + } + +} diff --git a/dubbo/src/test/java/com/baeldung/dubbo/ResultCacheLiveTest.java b/dubbo/src/test/java/com/baeldung/dubbo/ResultCacheLiveTest.java new file mode 100644 index 0000000000..401ebc9b94 --- /dev/null +++ b/dubbo/src/test/java/com/baeldung/dubbo/ResultCacheLiveTest.java @@ -0,0 +1,47 @@ +package com.baeldung.dubbo; + +import com.baeldung.dubbo.remote.GreetingsService; +import org.junit.After; +import org.junit.Before; +import org.junit.Test; +import org.springframework.context.support.ClassPathXmlApplicationContext; + +import static org.junit.Assert.*; + +/** + * @author aiet + */ +public class ResultCacheLiveTest { + + private ClassPathXmlApplicationContext remoteContext; + + @Before + public void initRemote() { + remoteContext = new ClassPathXmlApplicationContext("multicast/provider-app-special.xml"); + remoteContext.start(); + } + + @Test + public void givenProvider_whenConsumerSaysHi_thenGotResponse() { + ClassPathXmlApplicationContext localContext = new ClassPathXmlApplicationContext("multicast/consumer-app.xml"); + localContext.start(); + GreetingsService greetingsService = (GreetingsService) localContext.getBean("greetingsService"); + + long before = System.currentTimeMillis(); + String hiMessage = greetingsService.sayHi("baeldung"); + + long timeElapsed = System.currentTimeMillis() - before; + assertTrue(timeElapsed > 5000); + assertNotNull(hiMessage); + assertEquals("hi, baeldung", hiMessage); + + + before = System.currentTimeMillis(); + hiMessage = greetingsService.sayHi("baeldung"); + timeElapsed = System.currentTimeMillis() - before; + assertTrue(timeElapsed < 1000); + assertNotNull(hiMessage); + assertEquals("hi, baeldung", hiMessage); + } + +} diff --git a/dubbo/src/test/java/com/baeldung/dubbo/SimpleRegistryLiveTest.java b/dubbo/src/test/java/com/baeldung/dubbo/SimpleRegistryLiveTest.java new file mode 100644 index 0000000000..72f15cf7ec --- /dev/null +++ b/dubbo/src/test/java/com/baeldung/dubbo/SimpleRegistryLiveTest.java @@ -0,0 +1,39 @@ +package com.baeldung.dubbo; + +import com.baeldung.dubbo.remote.GreetingsService; +import org.junit.Before; +import org.junit.Test; +import org.springframework.context.support.ClassPathXmlApplicationContext; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; + +/** + * @author aiet + */ +public class SimpleRegistryLiveTest { + + private ClassPathXmlApplicationContext remoteContext; + private ClassPathXmlApplicationContext registryContext; + + @Before + public void initRemote() { + registryContext = new ClassPathXmlApplicationContext("simple/registry.xml"); + registryContext.start(); + + remoteContext = new ClassPathXmlApplicationContext("simple/provider-app.xml"); + remoteContext.start(); + } + + @Test + public void givenProvider_whenConsumerSaysHi_thenGotResponse() { + ClassPathXmlApplicationContext localContext = new ClassPathXmlApplicationContext("simple/consumer-app.xml"); + localContext.start(); + GreetingsService greetingsService = (GreetingsService) localContext.getBean("greetingsService"); + String hiMessage = greetingsService.sayHi("baeldung"); + + assertNotNull(hiMessage); + assertEquals("hi, baeldung", hiMessage); + } + +} diff --git a/dubbo/src/test/resources/cluster/consumer-app-failtest.xml b/dubbo/src/test/resources/cluster/consumer-app-failtest.xml new file mode 100644 index 0000000000..beb982db22 --- /dev/null +++ b/dubbo/src/test/resources/cluster/consumer-app-failtest.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/dubbo/src/test/resources/cluster/consumer-app-lb.xml b/dubbo/src/test/resources/cluster/consumer-app-lb.xml new file mode 100644 index 0000000000..268e21b902 --- /dev/null +++ b/dubbo/src/test/resources/cluster/consumer-app-lb.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/dubbo/src/test/resources/cluster/provider-app-default.xml b/dubbo/src/test/resources/cluster/provider-app-default.xml new file mode 100644 index 0000000000..cb51bc1771 --- /dev/null +++ b/dubbo/src/test/resources/cluster/provider-app-default.xml @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/dubbo/src/test/resources/cluster/provider-app-failover.xml b/dubbo/src/test/resources/cluster/provider-app-failover.xml new file mode 100644 index 0000000000..95cbee1f90 --- /dev/null +++ b/dubbo/src/test/resources/cluster/provider-app-failover.xml @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/dubbo/src/test/resources/cluster/provider-app-special-failsafe.xml b/dubbo/src/test/resources/cluster/provider-app-special-failsafe.xml new file mode 100644 index 0000000000..7a7a139bb3 --- /dev/null +++ b/dubbo/src/test/resources/cluster/provider-app-special-failsafe.xml @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/dubbo/src/test/resources/cluster/provider-app-special.xml b/dubbo/src/test/resources/cluster/provider-app-special.xml new file mode 100644 index 0000000000..8e5dc07d61 --- /dev/null +++ b/dubbo/src/test/resources/cluster/provider-app-special.xml @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/dubbo/src/test/resources/log4j.properties b/dubbo/src/test/resources/log4j.properties new file mode 100644 index 0000000000..4c15f1b4e0 --- /dev/null +++ b/dubbo/src/test/resources/log4j.properties @@ -0,0 +1,6 @@ +log4j.rootLogger=INFO, stdout + +log4j.appender.stdout=org.apache.log4j.ConsoleAppender +log4j.appender.stdout.Target=System.out +log4j.appender.stdout.layout=org.apache.log4j.PatternLayout +log4j.appender.stdout.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n \ No newline at end of file diff --git a/dubbo/src/test/resources/multicast/consumer-app.xml b/dubbo/src/test/resources/multicast/consumer-app.xml new file mode 100644 index 0000000000..da9a41fd61 --- /dev/null +++ b/dubbo/src/test/resources/multicast/consumer-app.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/dubbo/src/test/resources/multicast/provider-app-special.xml b/dubbo/src/test/resources/multicast/provider-app-special.xml new file mode 100644 index 0000000000..4b22b5aace --- /dev/null +++ b/dubbo/src/test/resources/multicast/provider-app-special.xml @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/dubbo/src/test/resources/multicast/provider-app.xml b/dubbo/src/test/resources/multicast/provider-app.xml new file mode 100644 index 0000000000..065d5ddad8 --- /dev/null +++ b/dubbo/src/test/resources/multicast/provider-app.xml @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/dubbo/src/test/resources/simple/consumer-app.xml b/dubbo/src/test/resources/simple/consumer-app.xml new file mode 100644 index 0000000000..91f7a666e4 --- /dev/null +++ b/dubbo/src/test/resources/simple/consumer-app.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/dubbo/src/test/resources/simple/provider-app.xml b/dubbo/src/test/resources/simple/provider-app.xml new file mode 100644 index 0000000000..9880172249 --- /dev/null +++ b/dubbo/src/test/resources/simple/provider-app.xml @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/dubbo/src/test/resources/simple/registry.xml b/dubbo/src/test/resources/simple/registry.xml new file mode 100644 index 0000000000..9d1372da10 --- /dev/null +++ b/dubbo/src/test/resources/simple/registry.xml @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + \ No newline at end of file From f5a5c02053781c2a0a2aaf708993ec935e76e919 Mon Sep 17 00:00:00 2001 From: Sergey Petunin Date: Fri, 8 Dec 2017 14:01:23 +0100 Subject: [PATCH 171/236] BAEL-1128: A Practical Guide to Java Remote Debugging (#3144) --- guest/remote-debugging/README.md | 16 ++++++ guest/remote-debugging/pom.xml | 49 +++++++++++++++++++ .../debug/JavaRemoteDebuggingApplication.java | 12 +++++ .../stackify/debug/config/WebInitializer.java | 12 +++++ .../stackify/debug/rest/HelloController.java | 16 ++++++ 5 files changed, 105 insertions(+) create mode 100644 guest/remote-debugging/README.md create mode 100644 guest/remote-debugging/pom.xml create mode 100644 guest/remote-debugging/src/main/java/com/stackify/debug/JavaRemoteDebuggingApplication.java create mode 100644 guest/remote-debugging/src/main/java/com/stackify/debug/config/WebInitializer.java create mode 100644 guest/remote-debugging/src/main/java/com/stackify/debug/rest/HelloController.java diff --git a/guest/remote-debugging/README.md b/guest/remote-debugging/README.md new file mode 100644 index 0000000000..cc63e7fd59 --- /dev/null +++ b/guest/remote-debugging/README.md @@ -0,0 +1,16 @@ +## Building + +To build the module, use Maven's `package` goal: + +``` +mvn clean package +``` + +The `war` file will be available at `target/remote-debugging.war` + +## Running + +The `war` application is deployed to Apache Tomcat 8 or any other Java Web or Application server. +To deploy it to the Apache Tomcat 8 server, drop it in the `tomcat/webapps` directory. + +The service then will be accessible at http://localhost:8080/remote-debugging/hello?name=John \ No newline at end of file diff --git a/guest/remote-debugging/pom.xml b/guest/remote-debugging/pom.xml new file mode 100644 index 0000000000..d958d4c681 --- /dev/null +++ b/guest/remote-debugging/pom.xml @@ -0,0 +1,49 @@ + + + 4.0.0 + + com.stackify + java-remote-debugging + 0.0.1-SNAPSHOT + war + + + org.springframework.boot + spring-boot-starter-parent + 1.5.8.RELEASE + + + + + UTF-8 + UTF-8 + 1.8 + + + + + + org.springframework.boot + spring-boot-starter-web + + + + org.springframework.boot + spring-boot-starter-tomcat + provided + + + + + + remote-debugging + + + org.springframework.boot + spring-boot-maven-plugin + + + + + diff --git a/guest/remote-debugging/src/main/java/com/stackify/debug/JavaRemoteDebuggingApplication.java b/guest/remote-debugging/src/main/java/com/stackify/debug/JavaRemoteDebuggingApplication.java new file mode 100644 index 0000000000..9d1a632638 --- /dev/null +++ b/guest/remote-debugging/src/main/java/com/stackify/debug/JavaRemoteDebuggingApplication.java @@ -0,0 +1,12 @@ +package com.stackify.debug; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +public class JavaRemoteDebuggingApplication { + + public static void main(String[] args) { + SpringApplication.run(JavaRemoteDebuggingApplication.class, args); + } +} diff --git a/guest/remote-debugging/src/main/java/com/stackify/debug/config/WebInitializer.java b/guest/remote-debugging/src/main/java/com/stackify/debug/config/WebInitializer.java new file mode 100644 index 0000000000..b69e2b6c77 --- /dev/null +++ b/guest/remote-debugging/src/main/java/com/stackify/debug/config/WebInitializer.java @@ -0,0 +1,12 @@ +package com.stackify.debug.config; + +import com.stackify.debug.JavaRemoteDebuggingApplication; +import org.springframework.boot.builder.SpringApplicationBuilder; +import org.springframework.boot.web.support.SpringBootServletInitializer; + +public class WebInitializer extends SpringBootServletInitializer { + @Override + protected SpringApplicationBuilder configure(SpringApplicationBuilder application) { + return application.sources(JavaRemoteDebuggingApplication.class); + } +} diff --git a/guest/remote-debugging/src/main/java/com/stackify/debug/rest/HelloController.java b/guest/remote-debugging/src/main/java/com/stackify/debug/rest/HelloController.java new file mode 100644 index 0000000000..8c614a36ec --- /dev/null +++ b/guest/remote-debugging/src/main/java/com/stackify/debug/rest/HelloController.java @@ -0,0 +1,16 @@ +package com.stackify.debug.rest; + +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +@RestController("/hello") +public class HelloController { + + @GetMapping + public String hello(@RequestParam("name") String name) { + String message = "Hello, " + name; + return message; + } + +} From bb5a1697ddeb97578f2b9f8eb8339371950e300c Mon Sep 17 00:00:00 2001 From: Grzegorz Piwowarek Date: Fri, 8 Dec 2017 14:24:47 +0100 Subject: [PATCH 172/236] CAS fix (#3207) --- cas/cas-secured-app/pom.xml | 18 +----------------- 1 file changed, 1 insertion(+), 17 deletions(-) diff --git a/cas/cas-secured-app/pom.xml b/cas/cas-secured-app/pom.xml index 543354e8b3..d52597412e 100644 --- a/cas/cas-secured-app/pom.xml +++ b/cas/cas-secured-app/pom.xml @@ -14,7 +14,7 @@ org.springframework.boot spring-boot-starter-parent - 2.0.0.BUILD-SNAPSHOT + 2.0.0.M7 @@ -87,14 +87,6 @@ - - spring-snapshots - Spring Snapshots - https://repo.spring.io/snapshot - - true - - spring-milestones Spring Milestones @@ -106,14 +98,6 @@ - - spring-snapshots - Spring Snapshots - https://repo.spring.io/snapshot - - true - - spring-milestones Spring Milestones From dc334432e4b90322d5f643546c0b8cc0c61738c8 Mon Sep 17 00:00:00 2001 From: Taylor Daugherty Date: Fri, 8 Dec 2017 17:31:36 -0500 Subject: [PATCH 173/236] BAEL-1300 Change to ConcurrentHashMap (#3206) * BAEL-1300 Custom logback appender * BAEL-1300 fix to logback module * relativePath * Change to ConcurrentHashMap --- .../src/main/java/com/baeldung/logback/MapAppender.java | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/logging-modules/logback/src/main/java/com/baeldung/logback/MapAppender.java b/logging-modules/logback/src/main/java/com/baeldung/logback/MapAppender.java index 99cc6488e5..a25c54b96e 100644 --- a/logging-modules/logback/src/main/java/com/baeldung/logback/MapAppender.java +++ b/logging-modules/logback/src/main/java/com/baeldung/logback/MapAppender.java @@ -3,12 +3,14 @@ package com.baeldung.logback; import ch.qos.logback.classic.spi.ILoggingEvent; import ch.qos.logback.core.AppenderBase; -import java.util.HashMap; import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.ConcurrentMap; public class MapAppender extends AppenderBase { - private final Map eventMap = new HashMap<>(); + private final ConcurrentMap eventMap + = new ConcurrentHashMap<>(); private String prefix; From b49844c3d8089d054155959a070f0079ace1f2eb Mon Sep 17 00:00:00 2001 From: ericgoebelbecker <@592Gbetz> Date: Fri, 8 Dec 2017 23:11:50 -0500 Subject: [PATCH 174/236] BAEL-1374 - use JMH. Move out of test area. --- .../baeldung/array/ArrayBenchmarkRunner.java | 21 ++++ .../com/baeldung/array/SearchArrayTest.java | 106 ++++++++++-------- 2 files changed, 81 insertions(+), 46 deletions(-) create mode 100644 core-java/src/main/java/com/baeldung/array/ArrayBenchmarkRunner.java rename core-java/src/{test => main}/java/com/baeldung/array/SearchArrayTest.java (57%) diff --git a/core-java/src/main/java/com/baeldung/array/ArrayBenchmarkRunner.java b/core-java/src/main/java/com/baeldung/array/ArrayBenchmarkRunner.java new file mode 100644 index 0000000000..977587a06a --- /dev/null +++ b/core-java/src/main/java/com/baeldung/array/ArrayBenchmarkRunner.java @@ -0,0 +1,21 @@ +package com.baeldung.array; + +import org.openjdk.jmh.runner.Runner; +import org.openjdk.jmh.runner.options.Options; +import org.openjdk.jmh.runner.options.OptionsBuilder; + +public class ArrayBenchmarkRunner { + + public static void main(String[] args) throws Exception { + + Options options = new OptionsBuilder() + .include(SearchArrayTest.class.getSimpleName()).threads(1) + .forks(1).shouldFailOnError(true).shouldDoGC(true) + .jvmArgs("-server").build(); + + new Runner(options).run(); + + + } + +} diff --git a/core-java/src/test/java/com/baeldung/array/SearchArrayTest.java b/core-java/src/main/java/com/baeldung/array/SearchArrayTest.java similarity index 57% rename from core-java/src/test/java/com/baeldung/array/SearchArrayTest.java rename to core-java/src/main/java/com/baeldung/array/SearchArrayTest.java index 94911baac9..fd11e49373 100644 --- a/core-java/src/test/java/com/baeldung/array/SearchArrayTest.java +++ b/core-java/src/main/java/com/baeldung/array/SearchArrayTest.java @@ -1,78 +1,92 @@ package com.baeldung.array; -import org.junit.Test; +import org.openjdk.jmh.annotations.*; import java.util.*; +import java.util.concurrent.TimeUnit; public class SearchArrayTest { - - @Test - public void searchArrayAllocNewCollections() { + @Benchmark + @BenchmarkMode(Mode.AverageTime) + @Warmup(iterations = 5) + @OutputTimeUnit(TimeUnit.MICROSECONDS) + public void searchArrayLoop() { int count = 1000; - String[] strings = seedArray(count); + for (int i = 0; i < count; i++) { + searchLoop(strings, "T"); + } + } - long startTime = System.nanoTime(); + @Benchmark + @BenchmarkMode(Mode.AverageTime) + @Warmup(iterations = 5) + @OutputTimeUnit(TimeUnit.MICROSECONDS) + public void searchArrayAllocNewList() { + + int count = 1000; + String[] strings = seedArray(count); for (int i = 0; i < count; i++) { searchList(strings, "W"); } - long duration = System.nanoTime() - startTime; - System.out.println("SearchList: " + duration / 10000); - startTime = System.nanoTime(); - for (int i = 0; i < count; i++) { - searchSet(strings,"S"); - } - duration = System.nanoTime() - startTime; - System.out.println("SearchSet: " + duration / 10000); - - startTime = System.nanoTime(); - for (int i = 0; i < count; i++) { - searchLoop(strings, "T"); - } - duration = System.nanoTime() - startTime; - System.out.println("SearchLoop: " + duration / 10000); } - @Test - public void searchArrayReuseCollections() { + @Benchmark + @BenchmarkMode(Mode.AverageTime) + @Warmup(iterations = 5) + @OutputTimeUnit(TimeUnit.MICROSECONDS) + public void searchArrayAllocNewSet() { - int count = 10000; + int count = 1000; + String[] strings = seedArray(count); + for (int i = 0; i < count; i++) { + searchSet(strings, "S"); + } + } + + + @Benchmark + @BenchmarkMode(Mode.AverageTime) + @Warmup(iterations = 5) + @OutputTimeUnit(TimeUnit.MICROSECONDS) + public void searchArrayReuseList() { + + int count = 1000; String[] strings = seedArray(count); List asList = Arrays.asList(strings); - Set asSet = new HashSet<>(Arrays.asList(strings)); - long startTime = System.nanoTime(); for (int i = 0; i < count; i++) { asList.contains("W"); } - long duration = System.nanoTime() - startTime; - System.out.println("List: " + duration / 10000); - - startTime = System.nanoTime(); - for (int i = 0; i < count; i++) { - asSet.contains("S"); - } - duration = System.nanoTime() - startTime; - System.out.println("Set: " + duration / 10000); - - startTime = System.nanoTime(); - for (int i = 0; i < count; i++) { - searchLoop(strings, "T"); - } - duration = System.nanoTime() - startTime; - System.out.println("Loop: " + duration / 10000); - } - @Test + @Benchmark + @BenchmarkMode(Mode.AverageTime) + @Warmup(iterations = 5) + @OutputTimeUnit(TimeUnit.MICROSECONDS) + public void searchArrayReuseSet() { + + int count = 1000; + String[] strings = seedArray(count); + Set asSet = new HashSet<>(Arrays.asList(strings)); + for (int i = 0; i < count; i++) { + asSet.contains("S"); + } + } + + + @Benchmark + @BenchmarkMode(Mode.AverageTime) + @Warmup(iterations = 5) + @OutputTimeUnit(TimeUnit.MICROSECONDS) public void searchArrayBinarySearch() { - int count = 10000; + int count = 1000; String[] strings = seedArray(count); Arrays.sort(strings); @@ -81,7 +95,7 @@ public class SearchArrayTest { Arrays.binarySearch(strings, "A"); } long duration = System.nanoTime() - startTime; - System.out.println("Binary search: " + duration / 10000); + //System.out.println("Binary search: " + duration / 10000); } From 7c82545377566c177690b86f401cbdada1adc9c7 Mon Sep 17 00:00:00 2001 From: Marcos Date: Sat, 9 Dec 2017 11:20:14 +0100 Subject: [PATCH 175/236] tests renaming --- core-java/src/test/java/com/baeldung/tree/BinaryTreeTest.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/core-java/src/test/java/com/baeldung/tree/BinaryTreeTest.java b/core-java/src/test/java/com/baeldung/tree/BinaryTreeTest.java index df0f3ba62d..0b123a9684 100644 --- a/core-java/src/test/java/com/baeldung/tree/BinaryTreeTest.java +++ b/core-java/src/test/java/com/baeldung/tree/BinaryTreeTest.java @@ -8,7 +8,7 @@ import org.junit.Test; public class BinaryTreeTest { @Test - public void givenABinaryTree_WhenAddElements_ThenTreeNotEmpty() { + public void givenABinaryTree_WhenAddingElements_ThenTreeNotEmpty() { BinaryTree bt = new BinaryTree(); @@ -24,7 +24,7 @@ public class BinaryTreeTest { } @Test - public void givenABinaryTree_WhenAddElements_ThenTreeContainsThoseElements() { + public void givenABinaryTree_WhenAddingElements_ThenTreeContainsThoseElements() { BinaryTree bt = new BinaryTree(); From f9f5a82cf483748316feb45c4fc6e7e77d653f5f Mon Sep 17 00:00:00 2001 From: YasinBhojawala <31448190+YasinBhojawala@users.noreply.github.com> Date: Sun, 10 Dec 2017 13:47:49 +0530 Subject: [PATCH 176/236] BAEL-1334 Guide to Hibernate Spatial (#3211) * BAEL-1334 Guide to Hibernate Spatial * BAEL-1334 Guide to Hibernate Spatial Moving the files to hibernate5 from libraries * Reverting the pom file * BAEL-1334 Guide to Hibernate Spatial * BAEL-1334 Guide to Hibernate Spatial Moving the files to hibernate5 from libraries * Reverting the pom file * BAEL-1334 Guide to Hibernate Spatial Improved assertions * Add examples related to circle --- .../com/baeldung/hibernate/HibernateUtil.java | 2 + .../hibernate/pojo/PolygonEntity.java | 38 +++++++++++++++ .../hibernate/HibernateSpatialTest.java | 47 +++++++++++++++++++ 3 files changed, 87 insertions(+) create mode 100644 hibernate5/src/main/java/com/baeldung/hibernate/pojo/PolygonEntity.java diff --git a/hibernate5/src/main/java/com/baeldung/hibernate/HibernateUtil.java b/hibernate5/src/main/java/com/baeldung/hibernate/HibernateUtil.java index f1fc22d29a..25fc0d7b02 100644 --- a/hibernate5/src/main/java/com/baeldung/hibernate/HibernateUtil.java +++ b/hibernate5/src/main/java/com/baeldung/hibernate/HibernateUtil.java @@ -6,6 +6,7 @@ import com.baeldung.hibernate.pojo.OrderEntry; import com.baeldung.hibernate.pojo.OrderEntryIdClass; import com.baeldung.hibernate.pojo.OrderEntryPK; import com.baeldung.hibernate.pojo.PointEntity; +import com.baeldung.hibernate.pojo.PolygonEntity; import com.baeldung.hibernate.pojo.Product; import com.baeldung.hibernate.pojo.Phone; import com.baeldung.hibernate.pojo.TemporalValues; @@ -79,6 +80,7 @@ public class HibernateUtil { metadataSources.addAnnotatedClass(Car.class); metadataSources.addAnnotatedClass(Bag.class); metadataSources.addAnnotatedClass(PointEntity.class); + metadataSources.addAnnotatedClass(PolygonEntity.class); Metadata metadata = metadataSources.buildMetadata(); return metadata.getSessionFactoryBuilder() diff --git a/hibernate5/src/main/java/com/baeldung/hibernate/pojo/PolygonEntity.java b/hibernate5/src/main/java/com/baeldung/hibernate/pojo/PolygonEntity.java new file mode 100644 index 0000000000..69208c8cd4 --- /dev/null +++ b/hibernate5/src/main/java/com/baeldung/hibernate/pojo/PolygonEntity.java @@ -0,0 +1,38 @@ +package com.baeldung.hibernate.pojo; + +import com.vividsolutions.jts.geom.Polygon; + +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.Id; + +@Entity +public class PolygonEntity { + + @Id + @GeneratedValue + private Long id; + + private Polygon polygon; + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public Polygon getPolygon() { + return polygon; + } + + public void setPolygon(Polygon polygon) { + this.polygon = polygon; + } + + @Override + public String toString() { + return "PolygonEntity{" + "id=" + id + ", polygon=" + polygon + '}'; + } +} diff --git a/hibernate5/src/test/java/com/baeldung/hibernate/HibernateSpatialTest.java b/hibernate5/src/test/java/com/baeldung/hibernate/HibernateSpatialTest.java index a5c7b329fc..10b5cbef4e 100644 --- a/hibernate5/src/test/java/com/baeldung/hibernate/HibernateSpatialTest.java +++ b/hibernate5/src/test/java/com/baeldung/hibernate/HibernateSpatialTest.java @@ -1,10 +1,14 @@ package com.baeldung.hibernate; import com.baeldung.hibernate.pojo.PointEntity; +import com.baeldung.hibernate.pojo.PolygonEntity; +import com.vividsolutions.jts.geom.Coordinate; import com.vividsolutions.jts.geom.Geometry; import com.vividsolutions.jts.geom.Point; +import com.vividsolutions.jts.geom.Polygon; import com.vividsolutions.jts.io.ParseException; import com.vividsolutions.jts.io.WKTReader; +import com.vividsolutions.jts.util.GeometricShapeFactory; import org.hibernate.Session; import org.hibernate.Transaction; import org.junit.After; @@ -13,6 +17,7 @@ import org.junit.Test; import javax.persistence.Query; import java.io.IOException; +import java.util.List; import static org.assertj.core.api.Assertions.assertThat; import static org.junit.Assert.assertEquals; @@ -82,16 +87,58 @@ public class HibernateSpatialTest { .containsOnly("POINT (1 1)", "POINT (1 2)", "POINT (3 4)"); } + @Test + public void shouldSelectAllPointsWithinRadius() throws ParseException { + insertPoint("POINT (1 1)"); + insertPoint("POINT (1 2)"); + insertPoint("POINT (3 4)"); + insertPoint("POINT (5 6)"); + + Query query = session.createQuery("select p from PointEntity p where within(p.point, :circle) = true", + PointEntity.class); + query.setParameter("circle", createCircle(0.0, 0.0, 5)); + + assertThat(query.getResultList().stream().map(p -> ((PointEntity) p).getPoint().toString())) + .containsOnly("POINT (1 1)", "POINT (1 2)"); + } + + @Test + public void shouldSelectAdjacentPolygons() throws ParseException { + insertPolygon("POLYGON ((0 0, 0 5, 5 5, 5 0, 0 0))"); + insertPolygon("POLYGON ((3 0, 3 5, 8 5, 8 0, 3 0))"); + insertPolygon("POLYGON ((2 2, 3 1, 2 5, 4 3, 3 3, 2 2))"); + + Query query = session.createQuery("select p from PolygonEntity p where touches(p.polygon, :polygon) = true", + PolygonEntity.class); + query.setParameter("polygon", wktToGeometry("POLYGON ((5 5, 5 10, 10 10, 10 5, 5 5))")); + assertThat(query.getResultList().stream().map(p -> ((PolygonEntity) p).getPolygon().toString())) + .containsOnly("POLYGON ((0 0, 0 5, 5 5, 5 0, 0 0))", "POLYGON ((3 0, 3 5, 8 5, 8 0, 3 0))"); + } + private void insertPoint(String point) throws ParseException { PointEntity entity = new PointEntity(); entity.setPoint((Point) wktToGeometry(point)); session.persist(entity); } + private void insertPolygon(String polygon) throws ParseException { + PolygonEntity entity = new PolygonEntity(); + entity.setPolygon((Polygon) wktToGeometry(polygon)); + session.persist(entity); + } + private Geometry wktToGeometry(String wellKnownText) throws ParseException { WKTReader fromText = new WKTReader(); Geometry geom = null; geom = fromText.read(wellKnownText); return geom; } + + private static Geometry createCircle(double x, double y, double radius) { + GeometricShapeFactory shapeFactory = new GeometricShapeFactory(); + shapeFactory.setNumPoints(32); + shapeFactory.setCentre(new Coordinate(x, y)); + shapeFactory.setSize(radius * 2); + return shapeFactory.createCircle(); + } } From 5014f5088ec9f68c7ea17d68d3bbebbbbc18f88a Mon Sep 17 00:00:00 2001 From: Bogdan Stoean <4540392+BogdanStoean@users.noreply.github.com> Date: Sun, 10 Dec 2017 10:27:50 +0200 Subject: [PATCH 177/236] BAEL-1315 (#3113) * initial setup with spring boot/ spring data jpa/ flyway * BAEL-1315 - added flyway test extensions for spring * BAEL-1315 - added flyway test extensions for spring * BAEL-1315 - created multiple migration scripts and locations * BAEL-1315 - test insert after schema creation * cleanup * BAEL-1315 - test data changes by a migration * BAEL-1315 - use a single location for migrations * BAEL-1315 - added also a JAVA class migration --- flyway/pom.xml | 18 +++++- flyway/spring-flyway/.gitignore | 24 ++++++++ flyway/spring-flyway/pom.xml | 57 +++++++++++++++++++ .../springflyway/SpringFlywayApplication.java | 12 ++++ .../springflyway/entities/Customer.java | 28 +++++++++ .../migration/V2__uk_lastname_customer.java | 14 +++++ .../repositories/CustomerRepository.java | 11 ++++ ...ustomerRepositoryInitialMigrationTest.java | 28 +++++++++ ...omerRepositoryInsertDataMigrationTest.java | 35 ++++++++++++ ...ositoryNotNullConstraintMigrationTest.java | 25 ++++++++ ...toryUniqueConstraintJavaMigrationTest.java | 29 ++++++++++ ...positoryUniqueConstraintMigrationTest.java | 27 +++++++++ .../src/test/resources/application.properties | 1 + .../migration/V1_0__create_table_customer.sql | 6 ++ .../db/migration/V1_1__insert_customer.sql | 6 ++ .../migration/V1_2__make_email_not_null.sql | 1 + .../db/migration/V1_3__make_email_unique.sql | 1 + 17 files changed, 322 insertions(+), 1 deletion(-) create mode 100644 flyway/spring-flyway/.gitignore create mode 100644 flyway/spring-flyway/pom.xml create mode 100644 flyway/spring-flyway/src/main/java/com/baeldung/springflyway/SpringFlywayApplication.java create mode 100644 flyway/spring-flyway/src/main/java/com/baeldung/springflyway/entities/Customer.java create mode 100644 flyway/spring-flyway/src/main/java/com/baeldung/springflyway/migration/V2__uk_lastname_customer.java create mode 100644 flyway/spring-flyway/src/main/java/com/baeldung/springflyway/repositories/CustomerRepository.java create mode 100644 flyway/spring-flyway/src/test/java/com/baeldung/springflyway/CustomerRepositoryInitialMigrationTest.java create mode 100644 flyway/spring-flyway/src/test/java/com/baeldung/springflyway/CustomerRepositoryInsertDataMigrationTest.java create mode 100644 flyway/spring-flyway/src/test/java/com/baeldung/springflyway/CustomerRepositoryNotNullConstraintMigrationTest.java create mode 100644 flyway/spring-flyway/src/test/java/com/baeldung/springflyway/CustomerRepositoryUniqueConstraintJavaMigrationTest.java create mode 100644 flyway/spring-flyway/src/test/java/com/baeldung/springflyway/CustomerRepositoryUniqueConstraintMigrationTest.java create mode 100644 flyway/spring-flyway/src/test/resources/application.properties create mode 100644 flyway/spring-flyway/src/test/resources/db/migration/V1_0__create_table_customer.sql create mode 100644 flyway/spring-flyway/src/test/resources/db/migration/V1_1__insert_customer.sql create mode 100644 flyway/spring-flyway/src/test/resources/db/migration/V1_2__make_email_not_null.sql create mode 100644 flyway/spring-flyway/src/test/resources/db/migration/V1_3__make_email_unique.sql diff --git a/flyway/pom.xml b/flyway/pom.xml index 2774602654..5cb8fabe67 100644 --- a/flyway/pom.xml +++ b/flyway/pom.xml @@ -1,10 +1,10 @@ 4.0.0 - com.baeldung flyway 1.0 flyway + pom A sample project to demonstrate Flyway migrations @@ -13,6 +13,10 @@ 1.0.0-SNAPSHOT + + spring-flyway + + mysql @@ -20,6 +24,17 @@ ${mysql.version} + + + + org.springframework.boot + spring-boot-dependencies + ${spring.boot.version} + pom + import + + + @@ -32,5 +47,6 @@ 6.0.5 4.0.3 + 1.5.8.RELEASE \ No newline at end of file diff --git a/flyway/spring-flyway/.gitignore b/flyway/spring-flyway/.gitignore new file mode 100644 index 0000000000..2af7cefb0a --- /dev/null +++ b/flyway/spring-flyway/.gitignore @@ -0,0 +1,24 @@ +target/ +!.mvn/wrapper/maven-wrapper.jar + +### STS ### +.apt_generated +.classpath +.factorypath +.project +.settings +.springBeans + +### IntelliJ IDEA ### +.idea +*.iws +*.iml +*.ipr + +### NetBeans ### +nbproject/private/ +build/ +nbbuild/ +dist/ +nbdist/ +.nb-gradle/ \ No newline at end of file diff --git a/flyway/spring-flyway/pom.xml b/flyway/spring-flyway/pom.xml new file mode 100644 index 0000000000..cf5703cfab --- /dev/null +++ b/flyway/spring-flyway/pom.xml @@ -0,0 +1,57 @@ + + + 4.0.0 + + spring-flyway + 0.0.1-SNAPSHOT + jar + + spring-flyway + Spring Boot Test Flyway Migrations + + + flyway + com.baeldung + 1.0 + ../../flyway + + + + UTF-8 + UTF-8 + 1.8 + + + + + org.springframework.boot + spring-boot-starter-data-jpa + + + org.flywaydb + flyway-core + + + org.projectlombok + lombok + + + com.h2database + h2 + + + org.springframework.boot + spring-boot-starter-test + test + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + + diff --git a/flyway/spring-flyway/src/main/java/com/baeldung/springflyway/SpringFlywayApplication.java b/flyway/spring-flyway/src/main/java/com/baeldung/springflyway/SpringFlywayApplication.java new file mode 100644 index 0000000000..9218fbc88d --- /dev/null +++ b/flyway/spring-flyway/src/main/java/com/baeldung/springflyway/SpringFlywayApplication.java @@ -0,0 +1,12 @@ +package com.baeldung.springflyway; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +public class SpringFlywayApplication { + + public static void main(String[] args) { + SpringApplication.run(SpringFlywayApplication.class, args); + } +} diff --git a/flyway/spring-flyway/src/main/java/com/baeldung/springflyway/entities/Customer.java b/flyway/spring-flyway/src/main/java/com/baeldung/springflyway/entities/Customer.java new file mode 100644 index 0000000000..194b961d2d --- /dev/null +++ b/flyway/spring-flyway/src/main/java/com/baeldung/springflyway/entities/Customer.java @@ -0,0 +1,28 @@ +package com.baeldung.springflyway.entities; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.Id; + +@Entity +@Data +@AllArgsConstructor +@NoArgsConstructor +@Builder +public class Customer { + + @Id + @GeneratedValue + private Long id; + + private String firstName; + private String lastName; + + private String email; + +} diff --git a/flyway/spring-flyway/src/main/java/com/baeldung/springflyway/migration/V2__uk_lastname_customer.java b/flyway/spring-flyway/src/main/java/com/baeldung/springflyway/migration/V2__uk_lastname_customer.java new file mode 100644 index 0000000000..52b851546b --- /dev/null +++ b/flyway/spring-flyway/src/main/java/com/baeldung/springflyway/migration/V2__uk_lastname_customer.java @@ -0,0 +1,14 @@ +package com.baeldung.springflyway.migration; + +import org.flywaydb.core.api.migration.spring.SpringJdbcMigration; +import org.springframework.jdbc.core.JdbcTemplate; + +public class V2__uk_lastname_customer implements SpringJdbcMigration { + + final String CUSTOMER_LASTNAME_UK = "ALTER TABLE customer ADD CONSTRAINT uk_customer_lastname UNIQUE(last_name);"; + + @Override + public void migrate(final JdbcTemplate jdbcTemplate) throws Exception { + jdbcTemplate.execute(CUSTOMER_LASTNAME_UK); + } +} diff --git a/flyway/spring-flyway/src/main/java/com/baeldung/springflyway/repositories/CustomerRepository.java b/flyway/spring-flyway/src/main/java/com/baeldung/springflyway/repositories/CustomerRepository.java new file mode 100644 index 0000000000..0a1fb5a146 --- /dev/null +++ b/flyway/spring-flyway/src/main/java/com/baeldung/springflyway/repositories/CustomerRepository.java @@ -0,0 +1,11 @@ +package com.baeldung.springflyway.repositories; + +import com.baeldung.springflyway.entities.Customer; +import org.springframework.data.jpa.repository.JpaRepository; + +import java.util.Optional; + +public interface CustomerRepository extends JpaRepository { + + Optional findByEmail(String email); +} diff --git a/flyway/spring-flyway/src/test/java/com/baeldung/springflyway/CustomerRepositoryInitialMigrationTest.java b/flyway/spring-flyway/src/test/java/com/baeldung/springflyway/CustomerRepositoryInitialMigrationTest.java new file mode 100644 index 0000000000..b3f2cb29e1 --- /dev/null +++ b/flyway/spring-flyway/src/test/java/com/baeldung/springflyway/CustomerRepositoryInitialMigrationTest.java @@ -0,0 +1,28 @@ +package com.baeldung.springflyway; + +import com.baeldung.springflyway.entities.Customer; +import com.baeldung.springflyway.repositories.CustomerRepository; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.test.context.junit4.SpringRunner; + +import static org.junit.Assert.assertNotNull; + +@RunWith(SpringRunner.class) +@SpringBootTest +public class CustomerRepositoryInitialMigrationTest { + + @Autowired CustomerRepository customerRepository; + + @Test + public void givenSchemaCreationMigration_whenTryingToCreateACustomer_thenSuccess() { + Customer customer = customerRepository.save(Customer + .builder() + .email("customer@email.com") + .build()); + assertNotNull(customer.getId()); + } + +} diff --git a/flyway/spring-flyway/src/test/java/com/baeldung/springflyway/CustomerRepositoryInsertDataMigrationTest.java b/flyway/spring-flyway/src/test/java/com/baeldung/springflyway/CustomerRepositoryInsertDataMigrationTest.java new file mode 100644 index 0000000000..369e61d98f --- /dev/null +++ b/flyway/spring-flyway/src/test/java/com/baeldung/springflyway/CustomerRepositoryInsertDataMigrationTest.java @@ -0,0 +1,35 @@ +package com.baeldung.springflyway; + +import com.baeldung.springflyway.entities.Customer; +import com.baeldung.springflyway.repositories.CustomerRepository; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.test.context.junit4.SpringRunner; + +import java.util.List; +import java.util.Optional; + +import static org.junit.Assert.*; + +@RunWith(SpringRunner.class) +@SpringBootTest +public class CustomerRepositoryInsertDataMigrationTest { + + @Autowired CustomerRepository customerRepository; + + @Test + public void givenASetInsertData_whenRunningMigrationsWithSuccess_thenASpecificCustomerIsFound() { + Optional customerOptional = customerRepository.findByEmail("email@email.com"); + assertTrue(customerOptional.isPresent()); + } + + @Test + public void givenASetInsertData_whenRunningMigrationsWithSuccess_thenASetOfCustomersIsFound() { + List customers = customerRepository.findAll(); + assertNotNull(customers); + assertEquals(customers.size(), 6); + } + +} diff --git a/flyway/spring-flyway/src/test/java/com/baeldung/springflyway/CustomerRepositoryNotNullConstraintMigrationTest.java b/flyway/spring-flyway/src/test/java/com/baeldung/springflyway/CustomerRepositoryNotNullConstraintMigrationTest.java new file mode 100644 index 0000000000..90517c9225 --- /dev/null +++ b/flyway/spring-flyway/src/test/java/com/baeldung/springflyway/CustomerRepositoryNotNullConstraintMigrationTest.java @@ -0,0 +1,25 @@ +package com.baeldung.springflyway; + +import com.baeldung.springflyway.entities.Customer; +import com.baeldung.springflyway.repositories.CustomerRepository; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.dao.DataIntegrityViolationException; +import org.springframework.test.context.junit4.SpringRunner; + +@RunWith(SpringRunner.class) +@SpringBootTest +public class CustomerRepositoryNotNullConstraintMigrationTest { + + @Autowired CustomerRepository customerRepository; + + @Test(expected = DataIntegrityViolationException.class) + public void givenTheNotNullConstraintMigrations_whenInsertingACustomerWithNullEmail_thenThrowException() { + customerRepository.save(Customer + .builder() + .build()); + } + +} diff --git a/flyway/spring-flyway/src/test/java/com/baeldung/springflyway/CustomerRepositoryUniqueConstraintJavaMigrationTest.java b/flyway/spring-flyway/src/test/java/com/baeldung/springflyway/CustomerRepositoryUniqueConstraintJavaMigrationTest.java new file mode 100644 index 0000000000..e5ba782fda --- /dev/null +++ b/flyway/spring-flyway/src/test/java/com/baeldung/springflyway/CustomerRepositoryUniqueConstraintJavaMigrationTest.java @@ -0,0 +1,29 @@ +package com.baeldung.springflyway; + +import com.baeldung.springflyway.entities.Customer; +import com.baeldung.springflyway.repositories.CustomerRepository; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.dao.DataIntegrityViolationException; +import org.springframework.test.context.junit4.SpringRunner; + +@RunWith(SpringRunner.class) +@SpringBootTest(properties = { + "flyway.locations[0]=db/migration", "flyway.locations[1]=com/baeldung/springflyway/migration" +}) +public class CustomerRepositoryUniqueConstraintJavaMigrationTest { + + @Autowired CustomerRepository customerRepository; + + @Test(expected = DataIntegrityViolationException.class) + public void givenTheUniqueConstraintMigrations_whenInsertingAnExistingLastNameCustomer_thenThrowException() { + customerRepository.save(Customer + .builder() + .lastName("LastName") + .build()); + + } + +} diff --git a/flyway/spring-flyway/src/test/java/com/baeldung/springflyway/CustomerRepositoryUniqueConstraintMigrationTest.java b/flyway/spring-flyway/src/test/java/com/baeldung/springflyway/CustomerRepositoryUniqueConstraintMigrationTest.java new file mode 100644 index 0000000000..9fa2dee42d --- /dev/null +++ b/flyway/spring-flyway/src/test/java/com/baeldung/springflyway/CustomerRepositoryUniqueConstraintMigrationTest.java @@ -0,0 +1,27 @@ +package com.baeldung.springflyway; + +import com.baeldung.springflyway.entities.Customer; +import com.baeldung.springflyway.repositories.CustomerRepository; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.dao.DataIntegrityViolationException; +import org.springframework.test.context.junit4.SpringRunner; + +@RunWith(SpringRunner.class) +@SpringBootTest +public class CustomerRepositoryUniqueConstraintMigrationTest { + + @Autowired CustomerRepository customerRepository; + + @Test(expected = DataIntegrityViolationException.class) + public void givenTheUniqueConstraintMigrations_whenInsertingAnExistingEmailCustomer_thenThrowException() { + customerRepository.save(Customer + .builder() + .email("email@email.com") + .build()); + + } + +} diff --git a/flyway/spring-flyway/src/test/resources/application.properties b/flyway/spring-flyway/src/test/resources/application.properties new file mode 100644 index 0000000000..5656ca79ce --- /dev/null +++ b/flyway/spring-flyway/src/test/resources/application.properties @@ -0,0 +1 @@ +spring.jpa.hibernate.ddl-auto=validate \ No newline at end of file diff --git a/flyway/spring-flyway/src/test/resources/db/migration/V1_0__create_table_customer.sql b/flyway/spring-flyway/src/test/resources/db/migration/V1_0__create_table_customer.sql new file mode 100644 index 0000000000..8c65253ed8 --- /dev/null +++ b/flyway/spring-flyway/src/test/resources/db/migration/V1_0__create_table_customer.sql @@ -0,0 +1,6 @@ +create table if not exists customer ( + id bigint AUTO_INCREMENT not null primary key, + first_name varchar(255) , + last_name varchar(255) , + email varchar(255) +); \ No newline at end of file diff --git a/flyway/spring-flyway/src/test/resources/db/migration/V1_1__insert_customer.sql b/flyway/spring-flyway/src/test/resources/db/migration/V1_1__insert_customer.sql new file mode 100644 index 0000000000..6bba6e00a1 --- /dev/null +++ b/flyway/spring-flyway/src/test/resources/db/migration/V1_1__insert_customer.sql @@ -0,0 +1,6 @@ +insert into customer (first_name, last_name, email) values ('FirstName', 'LastName', 'email@email.com'); +insert into customer (first_name, last_name, email) values ('FirstName1', 'LastName1', 'email1@email.com'); +insert into customer (first_name, last_name, email) values ('FirstName2', 'LastName2', 'email2@email.com'); +insert into customer (first_name, last_name, email) values ('FirstName3', 'LastName3', 'email3@email.com'); +insert into customer (first_name, last_name, email) values ('FirstName4', 'LastName4', 'email4@email.com'); +insert into customer (first_name, last_name, email) values ('FirstName5', 'LastName5', 'email5@email.com'); \ No newline at end of file diff --git a/flyway/spring-flyway/src/test/resources/db/migration/V1_2__make_email_not_null.sql b/flyway/spring-flyway/src/test/resources/db/migration/V1_2__make_email_not_null.sql new file mode 100644 index 0000000000..b1cc396741 --- /dev/null +++ b/flyway/spring-flyway/src/test/resources/db/migration/V1_2__make_email_not_null.sql @@ -0,0 +1 @@ +ALTER TABLE customer ALTER email SET NOT NULL; \ No newline at end of file diff --git a/flyway/spring-flyway/src/test/resources/db/migration/V1_3__make_email_unique.sql b/flyway/spring-flyway/src/test/resources/db/migration/V1_3__make_email_unique.sql new file mode 100644 index 0000000000..19d738fe46 --- /dev/null +++ b/flyway/spring-flyway/src/test/resources/db/migration/V1_3__make_email_unique.sql @@ -0,0 +1 @@ +ALTER TABLE customer ADD CONSTRAINT uk_customer_email UNIQUE(email); \ No newline at end of file From 72d162ddc99ca2f3d660d4d6be12e1c8e3e4bcac Mon Sep 17 00:00:00 2001 From: Marcos Date: Sun, 10 Dec 2017 19:27:45 +0100 Subject: [PATCH 178/236] tests refactoring --- .../java/com/baeldung/tree/BinaryTree.java | 1 - .../com/baeldung/tree/BinaryTreeTest.java | 82 +++---------------- 2 files changed, 13 insertions(+), 70 deletions(-) diff --git a/core-java/src/main/java/com/baeldung/tree/BinaryTree.java b/core-java/src/main/java/com/baeldung/tree/BinaryTree.java index 3c5f5f4e10..3cc496e348 100644 --- a/core-java/src/main/java/com/baeldung/tree/BinaryTree.java +++ b/core-java/src/main/java/com/baeldung/tree/BinaryTree.java @@ -39,7 +39,6 @@ public class BinaryTree { parent = current; } - } public boolean isEmpty() { diff --git a/core-java/src/test/java/com/baeldung/tree/BinaryTreeTest.java b/core-java/src/test/java/com/baeldung/tree/BinaryTreeTest.java index 0b123a9684..2c20c730df 100644 --- a/core-java/src/test/java/com/baeldung/tree/BinaryTreeTest.java +++ b/core-java/src/test/java/com/baeldung/tree/BinaryTreeTest.java @@ -10,15 +10,7 @@ public class BinaryTreeTest { @Test public void givenABinaryTree_WhenAddingElements_ThenTreeNotEmpty() { - BinaryTree bt = new BinaryTree(); - - bt.add(6); - bt.add(4); - bt.add(8); - bt.add(3); - bt.add(5); - bt.add(7); - bt.add(9); + BinaryTree bt = createBinaryTree(); assertTrue(!bt.isEmpty()); } @@ -26,66 +18,28 @@ public class BinaryTreeTest { @Test public void givenABinaryTree_WhenAddingElements_ThenTreeContainsThoseElements() { - BinaryTree bt = new BinaryTree(); - - bt.add(6); - bt.add(4); - bt.add(8); - bt.add(3); - bt.add(5); - bt.add(7); - bt.add(9); + BinaryTree bt = createBinaryTree(); assertTrue(bt.containsNode(6)); assertTrue(bt.containsNode(4)); - assertTrue(bt.containsNode(8)); - assertTrue(bt.containsNode(3)); - assertTrue(bt.containsNode(5)); - assertTrue(bt.containsNode(7)); - assertTrue(bt.containsNode(9)); assertFalse(bt.containsNode(1)); - assertFalse(bt.containsNode(10)); } @Test public void givenABinaryTree_WhenDeletingElements_ThenTreeDoesNotContainThoseElements() { - BinaryTree bt = new BinaryTree(); - - bt.add(6); - bt.add(4); - bt.add(8); - bt.add(3); - bt.add(5); - bt.add(7); - bt.add(9); + BinaryTree bt = createBinaryTree(); assertTrue(bt.containsNode(9)); bt.delete(9); assertFalse(bt.containsNode(9)); - - assertTrue(bt.containsNode(6)); - bt.delete(6); - assertFalse(bt.containsNode(6)); - - assertTrue(bt.containsNode(4)); - bt.delete(4); - assertFalse(bt.containsNode(4)); } @Test public void givenABinaryTree_WhenTraversingInOrder_ThenPrintValues() { - BinaryTree bt = new BinaryTree(); - - bt.add(6); - bt.add(4); - bt.add(8); - bt.add(3); - bt.add(5); - bt.add(7); - bt.add(9); + BinaryTree bt = createBinaryTree(); bt.traverseInOrder(bt.root); } @@ -93,15 +47,7 @@ public class BinaryTreeTest { @Test public void givenABinaryTree_WhenTraversingPreOrder_ThenPrintValues() { - BinaryTree bt = new BinaryTree(); - - bt.add(6); - bt.add(4); - bt.add(8); - bt.add(3); - bt.add(5); - bt.add(7); - bt.add(9); + BinaryTree bt = createBinaryTree(); bt.traversePreOrder(bt.root); } @@ -109,15 +55,7 @@ public class BinaryTreeTest { @Test public void givenABinaryTree_WhenTraversingPostOrder_ThenPrintValues() { - BinaryTree bt = new BinaryTree(); - - bt.add(6); - bt.add(4); - bt.add(8); - bt.add(3); - bt.add(5); - bt.add(7); - bt.add(9); + BinaryTree bt = createBinaryTree(); bt.traversePostOrder(bt.root); } @@ -125,6 +63,12 @@ public class BinaryTreeTest { @Test public void givenABinaryTree_WhenTraversingLevelOrder_ThenPrintValues() { + BinaryTree bt = createBinaryTree(); + + bt.traverseLevelOrder(); + } + + private BinaryTree createBinaryTree() { BinaryTree bt = new BinaryTree(); bt.add(6); @@ -135,7 +79,7 @@ public class BinaryTreeTest { bt.add(7); bt.add(9); - bt.traverseLevelOrder(); + return bt; } } From 080d1a942542a0d90d0f4b1d4f8217fd7e9c52ce Mon Sep 17 00:00:00 2001 From: k0l0ssus Date: Mon, 11 Dec 2017 06:25:25 -0500 Subject: [PATCH 179/236] Updated readme.md (#3215) * Update pom.xml Corrected main class and added JUnit dependency * Update README.md * Update README.md --- spring-integration/README.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/spring-integration/README.md b/spring-integration/README.md index e5b0f601ce..750ad994eb 100644 --- a/spring-integration/README.md +++ b/spring-integration/README.md @@ -1,2 +1,5 @@ ### Relevant Articles: - [Introduction to Spring Integration](http://www.baeldung.com/spring-integration) + +### Running the Sample +Executing the `mvn exec:java` maven command (either from the command line or from an IDE) will start up the application. Follow the command prompt for further instructions. From 904695519788ef6e5121ace6fa614881148e3e92 Mon Sep 17 00:00:00 2001 From: Wosin Date: Mon, 11 Dec 2017 16:32:04 +0100 Subject: [PATCH 180/236] BAEL-1349: Custom plugin added to Gradle (#3145) --- gradle/plugin/build.gradle | 14 ++++++++++++ .../java/com/baeldung/GreetingPlugin.java | 17 ++++++++++++++ .../com/baeldung/GreetingPluginExtension.java | 22 +++++++++++++++++++ 3 files changed, 53 insertions(+) create mode 100644 gradle/plugin/build.gradle create mode 100644 gradle/plugin/buildSrc/src/main/java/com/baeldung/GreetingPlugin.java create mode 100644 gradle/plugin/buildSrc/src/main/java/com/baeldung/GreetingPluginExtension.java diff --git a/gradle/plugin/build.gradle b/gradle/plugin/build.gradle new file mode 100644 index 0000000000..8d7329c1b0 --- /dev/null +++ b/gradle/plugin/build.gradle @@ -0,0 +1,14 @@ + repositories{ + mavenCentral() + } + apply plugin: 'java' + apply plugin: 'maven' + apply plugin: com.baeldung.GreetingPlugin + dependencies { + compile gradleApi() + } + + greeting { + greeter = "Stranger" + message = "Message from the build script!" + } \ No newline at end of file diff --git a/gradle/plugin/buildSrc/src/main/java/com/baeldung/GreetingPlugin.java b/gradle/plugin/buildSrc/src/main/java/com/baeldung/GreetingPlugin.java new file mode 100644 index 0000000000..ad32ecfe91 --- /dev/null +++ b/gradle/plugin/buildSrc/src/main/java/com/baeldung/GreetingPlugin.java @@ -0,0 +1,17 @@ +package com.baeldung; + +import org.gradle.api.Plugin; +import org.gradle.api.Project; + +public class GreetingPlugin implements Plugin { + @Override + public void apply(Project project) { + + GreetingPluginExtension extension = project.getExtensions().create("greeting", GreetingPluginExtension.class); + + project.task("hello").doLast(task -> { + System.out.println("Hello, " + extension.getGreeter()); + System.out.println("I have a message for You: " + extension.getMessage()); } + ); + } +} \ No newline at end of file diff --git a/gradle/plugin/buildSrc/src/main/java/com/baeldung/GreetingPluginExtension.java b/gradle/plugin/buildSrc/src/main/java/com/baeldung/GreetingPluginExtension.java new file mode 100644 index 0000000000..2ff64a43f5 --- /dev/null +++ b/gradle/plugin/buildSrc/src/main/java/com/baeldung/GreetingPluginExtension.java @@ -0,0 +1,22 @@ +package com.baeldung; + +public class GreetingPluginExtension { + private String greeter = "Baeldung"; + private String message = "Message from Plugin!"; + + public String getGreeter() { + return greeter; + } + + public void setGreeter(String greeter) { + this.greeter = greeter; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } +} From b2ea831d83849609401461fe90282f8384256745 Mon Sep 17 00:00:00 2001 From: bahti Date: Mon, 11 Dec 2017 20:31:52 +0300 Subject: [PATCH 181/236] inner interface examples added (#3151) --- .../interfaces/CommaSeparatedCustomers.java | 21 +++++++++++++++++++ .../com/baeldung/interfaces/Customer.java | 19 +++++++++++++++++ .../interfaces/InnerInterfaceTests.java | 18 ++++++++++++++++ 3 files changed, 58 insertions(+) create mode 100644 core-java/src/main/java/com/baeldung/interfaces/CommaSeparatedCustomers.java create mode 100644 core-java/src/main/java/com/baeldung/interfaces/Customer.java create mode 100644 core-java/src/test/java/com/baeldung/interfaces/InnerInterfaceTests.java diff --git a/core-java/src/main/java/com/baeldung/interfaces/CommaSeparatedCustomers.java b/core-java/src/main/java/com/baeldung/interfaces/CommaSeparatedCustomers.java new file mode 100644 index 0000000000..29ed2d3d26 --- /dev/null +++ b/core-java/src/main/java/com/baeldung/interfaces/CommaSeparatedCustomers.java @@ -0,0 +1,21 @@ +package com.baeldung.interfaces; + +import java.util.ArrayList; +import java.util.List; +import java.util.stream.Collectors; + +public class CommaSeparatedCustomers implements Customer.List { + + private List customers = new ArrayList(); + + @Override + public void Add(Customer customer) { + customers.add(customer); + } + + @Override + public String getCustomerNames() { + return customers.stream().map(customer -> customer.getName()).collect(Collectors.joining(",")); + } + +} diff --git a/core-java/src/main/java/com/baeldung/interfaces/Customer.java b/core-java/src/main/java/com/baeldung/interfaces/Customer.java new file mode 100644 index 0000000000..d2f2b48074 --- /dev/null +++ b/core-java/src/main/java/com/baeldung/interfaces/Customer.java @@ -0,0 +1,19 @@ +package com.baeldung.interfaces; + +public class Customer { + public interface List { + void Add(Customer customer); + + String getCustomerNames(); + } + + private String name; + + public Customer(String name) { + this.name = name; + } + + String getName() { + return name; + } +} diff --git a/core-java/src/test/java/com/baeldung/interfaces/InnerInterfaceTests.java b/core-java/src/test/java/com/baeldung/interfaces/InnerInterfaceTests.java new file mode 100644 index 0000000000..b19ed76189 --- /dev/null +++ b/core-java/src/test/java/com/baeldung/interfaces/InnerInterfaceTests.java @@ -0,0 +1,18 @@ +package com.baeldung.interfaces; + +import static org.junit.Assert.assertEquals; + +import org.junit.Test; +import org.junit.runner.RunWith; +import org.junit.runners.JUnit4; + +@RunWith(JUnit4.class) +public class InnerInterfaceTests { + @Test + public void whenCustomerListJoined_thenReturnsJoinedNames() { + Customer.List customerList = new CommaSeparatedCustomers(); + customerList.Add(new Customer("customer1")); + customerList.Add(new Customer("customer2")); + assertEquals("customer1,customer2", customerList.getCustomerNames()); + } +} From c787414dd954e44d51cba00ae6babbcaa9cfbf75 Mon Sep 17 00:00:00 2001 From: ericgoebelbecker <@592Gbetz> Date: Mon, 11 Dec 2017 22:27:04 -0500 Subject: [PATCH 182/236] BAEL-1374 - move JMH settings to class-level annotations. --- .../com/baeldung/array/SearchArrayTest.java | 21 +++---------------- 1 file changed, 3 insertions(+), 18 deletions(-) diff --git a/core-java/src/main/java/com/baeldung/array/SearchArrayTest.java b/core-java/src/main/java/com/baeldung/array/SearchArrayTest.java index fd11e49373..8b44138b32 100644 --- a/core-java/src/main/java/com/baeldung/array/SearchArrayTest.java +++ b/core-java/src/main/java/com/baeldung/array/SearchArrayTest.java @@ -5,12 +5,12 @@ import org.openjdk.jmh.annotations.*; import java.util.*; import java.util.concurrent.TimeUnit; +@BenchmarkMode(Mode.AverageTime) +@Warmup(iterations = 5) +@OutputTimeUnit(TimeUnit.MICROSECONDS) public class SearchArrayTest { @Benchmark - @BenchmarkMode(Mode.AverageTime) - @Warmup(iterations = 5) - @OutputTimeUnit(TimeUnit.MICROSECONDS) public void searchArrayLoop() { int count = 1000; @@ -21,9 +21,6 @@ public class SearchArrayTest { } @Benchmark - @BenchmarkMode(Mode.AverageTime) - @Warmup(iterations = 5) - @OutputTimeUnit(TimeUnit.MICROSECONDS) public void searchArrayAllocNewList() { int count = 1000; @@ -35,9 +32,6 @@ public class SearchArrayTest { } @Benchmark - @BenchmarkMode(Mode.AverageTime) - @Warmup(iterations = 5) - @OutputTimeUnit(TimeUnit.MICROSECONDS) public void searchArrayAllocNewSet() { int count = 1000; @@ -49,9 +43,6 @@ public class SearchArrayTest { @Benchmark - @BenchmarkMode(Mode.AverageTime) - @Warmup(iterations = 5) - @OutputTimeUnit(TimeUnit.MICROSECONDS) public void searchArrayReuseList() { int count = 1000; @@ -66,9 +57,6 @@ public class SearchArrayTest { @Benchmark - @BenchmarkMode(Mode.AverageTime) - @Warmup(iterations = 5) - @OutputTimeUnit(TimeUnit.MICROSECONDS) public void searchArrayReuseSet() { int count = 1000; @@ -81,9 +69,6 @@ public class SearchArrayTest { @Benchmark - @BenchmarkMode(Mode.AverageTime) - @Warmup(iterations = 5) - @OutputTimeUnit(TimeUnit.MICROSECONDS) public void searchArrayBinarySearch() { int count = 1000; From 339cf6a7d0202513090a49bec23aee00c67046aa Mon Sep 17 00:00:00 2001 From: Hany Ahmed Date: Tue, 12 Dec 2017 06:39:39 +0200 Subject: [PATCH 183/236] BAEL-1278 (#3214) * BAEL-1278 * Rename methods names --- testing-modules/testing/pom.xml | 6 + .../main/java/com/baeldung/jspec/Animal.java | 41 ++++++ .../main/java/com/baeldung/jspec/Cage.java | 48 +++++++ .../src/main/java/com/baeldung/jspec/Cat.java | 14 ++ .../src/main/java/com/baeldung/jspec/Dog.java | 14 ++ .../java/com/baeldung/jspec/CageUnitTest.java | 126 ++++++++++++++++++ .../com/baeldung/jspec/JSpecUnitTest.java | 57 ++++++++ 7 files changed, 306 insertions(+) create mode 100644 testing-modules/testing/src/main/java/com/baeldung/jspec/Animal.java create mode 100644 testing-modules/testing/src/main/java/com/baeldung/jspec/Cage.java create mode 100644 testing-modules/testing/src/main/java/com/baeldung/jspec/Cat.java create mode 100644 testing-modules/testing/src/main/java/com/baeldung/jspec/Dog.java create mode 100644 testing-modules/testing/src/test/java/com/baeldung/jspec/CageUnitTest.java create mode 100644 testing-modules/testing/src/test/java/com/baeldung/jspec/JSpecUnitTest.java diff --git a/testing-modules/testing/pom.xml b/testing-modules/testing/pom.xml index 7aff0a93e0..1fd6357b87 100644 --- a/testing-modules/testing/pom.xml +++ b/testing-modules/testing/pom.xml @@ -94,6 +94,11 @@ 1.5 test + + org.javalite + javalite-common + ${javalite.version} + @@ -162,5 +167,6 @@ 0.32 1.1.0 0.12 + 1.4.13 diff --git a/testing-modules/testing/src/main/java/com/baeldung/jspec/Animal.java b/testing-modules/testing/src/main/java/com/baeldung/jspec/Animal.java new file mode 100644 index 0000000000..efb4c62bde --- /dev/null +++ b/testing-modules/testing/src/main/java/com/baeldung/jspec/Animal.java @@ -0,0 +1,41 @@ +package com.baeldung.jspec; + +public abstract class Animal { + + protected String name; + + public Animal(String name) { + this.name = name; + } + + public String getName() { + return name; + } + + @Override + public int hashCode() { + final int prime = 31; + int result = 1; + result = prime * result + ((name == null) ? 0 : name.hashCode()); + return result; + } + + @Override + public boolean equals(Object obj) { + if (this == obj) + return true; + if (obj == null) + return false; + if (getClass() != obj.getClass()) + return false; + Animal other = (Animal) obj; + if (name == null) { + if (other.name != null) + return false; + } else if (!name.equals(other.name)) + return false; + return true; + } + + +} diff --git a/testing-modules/testing/src/main/java/com/baeldung/jspec/Cage.java b/testing-modules/testing/src/main/java/com/baeldung/jspec/Cage.java new file mode 100644 index 0000000000..73ea343600 --- /dev/null +++ b/testing-modules/testing/src/main/java/com/baeldung/jspec/Cage.java @@ -0,0 +1,48 @@ +package com.baeldung.jspec; + +import java.util.Arrays; +import java.util.HashSet; +import java.util.Set; + +public class Cage { + + private Set animals = new HashSet<>(); + + public void put(Animal animal) { + animals.add(animal); + } + + public void put(Animal... animals) { + this.animals.addAll(Arrays.asList(animals)); + } + + public Animal release(Animal animal) { + return animals.remove(animal) ? animal : null; + } + + public void open() { + animals.clear(); + } + + public boolean hasAnimals() { + return animals.size() > 0; + } + + public boolean isEmpty() { + return animals.isEmpty(); + } + + public Set getAnimals() { + return this.animals; + } + + public int size() { + return animals.size(); + } + + @Override + public String toString() { + return "Cage [animals=" + animals + "]"; + } + +} diff --git a/testing-modules/testing/src/main/java/com/baeldung/jspec/Cat.java b/testing-modules/testing/src/main/java/com/baeldung/jspec/Cat.java new file mode 100644 index 0000000000..5021a1481c --- /dev/null +++ b/testing-modules/testing/src/main/java/com/baeldung/jspec/Cat.java @@ -0,0 +1,14 @@ +package com.baeldung.jspec; + +public class Cat extends Animal { + + public Cat(String name) { + super(name); + } + + @Override + public String toString() { + return "Cat [name=" + name + "]"; + } + +} diff --git a/testing-modules/testing/src/main/java/com/baeldung/jspec/Dog.java b/testing-modules/testing/src/main/java/com/baeldung/jspec/Dog.java new file mode 100644 index 0000000000..43626941e3 --- /dev/null +++ b/testing-modules/testing/src/main/java/com/baeldung/jspec/Dog.java @@ -0,0 +1,14 @@ +package com.baeldung.jspec; + +public class Dog extends Animal { + + public Dog(String name) { + super(name); + } + + @Override + public String toString() { + return "Dog [name=" + name + "]"; + } + +} diff --git a/testing-modules/testing/src/test/java/com/baeldung/jspec/CageUnitTest.java b/testing-modules/testing/src/test/java/com/baeldung/jspec/CageUnitTest.java new file mode 100644 index 0000000000..33ef986588 --- /dev/null +++ b/testing-modules/testing/src/test/java/com/baeldung/jspec/CageUnitTest.java @@ -0,0 +1,126 @@ +package com.baeldung.jspec; + +import static org.javalite.test.jspec.JSpec.$; +import static org.javalite.test.jspec.JSpec.expect; +import static org.javalite.test.jspec.JSpec.the; + +import java.util.Set; + +import org.javalite.test.jspec.DifferenceExpectation; +import org.junit.Test; + +public class CageUnitTest { + + Cat tomCat = new Cat("Tom"); + Cat felixCat = new Cat("Felix"); + Dog boltDog = new Dog("Bolt"); + Cage cage = new Cage(); + + + @Test + public void puttingAnimals_shouldIncreaseCageSize() { + // When + cage.put(tomCat, boltDog); + + // Then + the(cage.size()).shouldEqual(2); + } + + @Test + public void releasingAnimals_shouldDecreaseCageSize() { + // When + cage.put(tomCat, boltDog); + cage.release(tomCat); + + // Then + the(cage.size()).shouldEqual(1); + } + + @Test + public void puttingAnimals_shouldLeaveThemInsideTheCage() { + // When + cage.put(tomCat, boltDog); + + // Then + the(cage).shouldHave("animals"); + } + + @Test + public void openingTheCage_shouldReleaseAllAnimals() { + // When + cage.put(tomCat, boltDog); + + // Then + the(cage).shouldNotBe("empty"); + + // When + cage.open(); + + // Then + the(cage).shouldBe("empty"); + the(cage.isEmpty()).shouldBeTrue(); + } + + @Test + public void comparingTwoDogs() { + // When + Dog firstDog = new Dog("Rex"); + Dog secondDog = new Dog("Rex"); + + // Then + $(firstDog).shouldEqual(secondDog); + $(firstDog).shouldNotBeTheSameAs(secondDog); + } + + @Test + public void puttingCatsOnly_shouldLetCageAnimalsToContainCats() { + // When + cage.put(tomCat, felixCat); + + // Then + Set animals = cage.getAnimals(); + the(animals).shouldContain(tomCat); + the(animals).shouldContain(felixCat); + the(animals).shouldNotContain(boltDog); + } + + @Test + public void puttingCatsOnly_shouldLetCageToContainCats() { + // When + cage.put(tomCat, felixCat); + + // Then + // Check with toString of the tested objects + the(cage).shouldContain(tomCat); + the(cage).shouldContain(felixCat); + the(cage).shouldNotContain(boltDog); + } + + @Test + public void puttingMoreAnimals_shouldChangeSize() { + // When + cage.put(tomCat, boltDog); + + // Then + expect( new DifferenceExpectation(cage.size()) { + + @Override + public Integer exec() { + cage.release(tomCat); + return cage.size(); + } + } ); + } + + + @Test + public void releasingTheDog_shouldReleaseAnAnimalOfDogType() { + // When + cage.put(boltDog); + Animal releasedAnimal = cage.release(boltDog); + + // Then + the(releasedAnimal).shouldNotBeNull(); + the(releasedAnimal).shouldBeA(Dog.class); + } +} diff --git a/testing-modules/testing/src/test/java/com/baeldung/jspec/JSpecUnitTest.java b/testing-modules/testing/src/test/java/com/baeldung/jspec/JSpecUnitTest.java new file mode 100644 index 0000000000..0e35e26728 --- /dev/null +++ b/testing-modules/testing/src/test/java/com/baeldung/jspec/JSpecUnitTest.java @@ -0,0 +1,57 @@ +package com.baeldung.jspec; + +import static org.javalite.test.jspec.JSpec.$; +import static org.javalite.test.jspec.JSpec.a; +import static org.javalite.test.jspec.JSpec.expect; +import static org.javalite.test.jspec.JSpec.it; +import static org.javalite.test.jspec.JSpec.the; + +import java.util.Arrays; +import java.util.List; + +import org.javalite.test.jspec.ExceptionExpectation; +import org.junit.Test; + +public class JSpecUnitTest { + + @Test + public void onePlusTwo_shouldEqualThree() { + $(1 + 2).shouldEqual(3); + a(1 + 2).shouldEqual(3); + the(1 + 2).shouldEqual(3); + it(1 + 2).shouldEqual(3); + } + + @Test + public void messageShouldContainJSpec() { + String message = "Welcome to JSpec demo"; + // The message should not be empty + the(message).shouldNotBe("empty"); + // The message should contain JSpec + the(message).shouldContain("JSpec"); + } + + public void colorsListShouldContainRed() { + List colorsList = Arrays.asList("red", "green", "blue"); + $(colorsList).shouldContain("red"); + } + + public void guessedNumberShouldEqualHiddenNumber() { + Integer guessedNumber = 11; + Integer hiddenNumber = 11; + + $(guessedNumber).shouldEqual(hiddenNumber); + $(guessedNumber).shouldNotBeTheSameAs(hiddenNumber); + } + + @Test + public void dividingByThero_shouldThrowArithmeticException() { + expect(new ExceptionExpectation(ArithmeticException.class) { + @Override + public void exec() throws ArithmeticException { + System.out.println(1 / 0); + } + } ); + } + +} From b59226a68cd90250c13f416806445234db23c3f9 Mon Sep 17 00:00:00 2001 From: Rokon Uddin Ahmed Date: Tue, 12 Dec 2017 12:32:35 +0600 Subject: [PATCH 184/236] 12.12 (#3219) * Create README.md * Update README.md * Update README.md * Update README.md * Update README.md * Update README.md * Create README.md * Update README.md * Update README.md * Update README.md * Update README.MD * Update README.md * Update README.md * Update README.md * Update README.md * Update README.md * Create README.md * Update README.MD * Create README.md * Update readme.md * Update README.md * Update README.md * Update README.md --- cas/cas-secured-app/README.md | 2 ++ core-java-8/README.md | 1 + core-java-9/README.md | 1 + core-java-concurrency/README.md | 2 ++ core-java/README.md | 6 +++++- drools/README.MD | 1 + gradle/README.md | 1 + hibernate5/README.md | 2 ++ jsonb/README.md | 3 +++ junit5/README.md | 2 ++ osgi/readme.md | 3 +++ patterns/README.md | 3 ++- persistence-modules/spring-jpa/README.md | 1 + spring-5/README.md | 2 ++ spring-aop/README.md | 3 ++- spring-boot-keycloak/README.md | 2 ++ spring-boot/README.MD | 2 +- spring-cloud-cli/README.md | 2 +- spring-core/README.md | 2 ++ spring-hibernate3/README.md | 2 ++ testing-modules/mockito-2/README.md | 1 + testing-modules/mockito/README.md | 2 ++ 22 files changed, 41 insertions(+), 5 deletions(-) create mode 100644 cas/cas-secured-app/README.md create mode 100644 junit5/README.md create mode 100644 spring-boot-keycloak/README.md create mode 100644 spring-hibernate3/README.md diff --git a/cas/cas-secured-app/README.md b/cas/cas-secured-app/README.md new file mode 100644 index 0000000000..01c5f91988 --- /dev/null +++ b/cas/cas-secured-app/README.md @@ -0,0 +1,2 @@ +## Relevant articles: +- [CAS SSO With Spring Security](http://www.baeldung.com/spring-security-cas-sso) diff --git a/core-java-8/README.md b/core-java-8/README.md index 540a32b0ba..61f8df8f49 100644 --- a/core-java-8/README.md +++ b/core-java-8/README.md @@ -32,3 +32,4 @@ - [“Stream has already been operated upon or closed” Exception in Java](http://www.baeldung.com/java-stream-operated-upon-or-closed-exception) - [Display All Time Zones With GMT And UTC in Java](http://www.baeldung.com/java-time-zones) - [Copy a File with Java](http://www.baeldung.com/java-copy-file) +- [Generating Prime Numbers in Java](http://www.baeldung.com/java-generate-prime-numbers) diff --git a/core-java-9/README.md b/core-java-9/README.md index 98c855caea..ce8a140dc0 100644 --- a/core-java-9/README.md +++ b/core-java-9/README.md @@ -18,3 +18,4 @@ - [How to Get All Dates Between Two Dates?](http://www.baeldung.com/java-between-dates) - [Java 9 java.util.Objects Additions](http://www.baeldung.com/java-9-objects-new) - [Compact Strings in Java 9](http://www.baeldung.com/java-9-compact-string) +- [Convert Date to LocalDate or LocalDateTime and Back](http://www.baeldung.com/java-date-to-localdate-and-localdatetime) diff --git a/core-java-concurrency/README.md b/core-java-concurrency/README.md index 48c5f2a50c..23509013d5 100644 --- a/core-java-concurrency/README.md +++ b/core-java-concurrency/README.md @@ -31,3 +31,5 @@ - [Overview of the java.util.concurrent](http://www.baeldung.com/java-util-concurrent) - [Semaphores in Java](http://www.baeldung.com/java-semaphore) - [Daemon Threads in Java](http://www.baeldung.com/java-daemon-thread) +- [Implementing a Runnable vs Extending a Thread](http://www.baeldung.com/java-runnable-vs-extending-thread) +- [How to Kill a Java Thread](http://www.baeldung.com/java-thread-stop) diff --git a/core-java/README.md b/core-java/README.md index 8287a21d1e..ae9e0d96c4 100644 --- a/core-java/README.md +++ b/core-java/README.md @@ -121,4 +121,8 @@ - [Copy a File with Java](http://www.baeldung.com/java-copy-file) - [Introduction to Creational Design Patterns](http://www.baeldung.com/creational-design-patterns) - [Quick Example - Comparator vs Comparable in Java](http://www.baeldung.com/java-comparator-comparable) - +- [Quick Guide to Java Stack](http://www.baeldung.com/java-stack) +- [The Java continue and break Keywords](http://www.baeldung.com/java-continue-and-break) +- [Java – Append Data to a File](http://www.baeldung.com/java-append-to-file) +- [Introduction to the Java ArrayDeque](http://www.baeldung.com/java-array-deque) +- [Guide to java.util.Formatter](http://www.baeldung.com/java-string-formatter) diff --git a/drools/README.MD b/drools/README.MD index b2259e2878..5efbe0d3c3 100644 --- a/drools/README.MD +++ b/drools/README.MD @@ -1,3 +1,4 @@ ### Relevant Articles: - [Introduction to Drools](http://www.baeldung.com/drools) - [Drools Using Rules from Excel Files](http://www.baeldung.com/drools-excel) +- [An Example of Backward Chaining in Drools](http://www.baeldung.com/drools-backward-chaining) diff --git a/gradle/README.md b/gradle/README.md index ff12555376..dd5ea03a18 100644 --- a/gradle/README.md +++ b/gradle/README.md @@ -1 +1,2 @@ ## Relevant articles: +- [Introduction to Gradle](http://www.baeldung.com/gradle) diff --git a/hibernate5/README.md b/hibernate5/README.md index 4690ebbe76..d480a7455c 100644 --- a/hibernate5/README.md +++ b/hibernate5/README.md @@ -2,3 +2,5 @@ - [Dynamic Mapping with Hibernate](http://www.baeldung.com/hibernate-dynamic-mapping) - [An Overview of Identifiers in Hibernate](http://www.baeldung.com/hibernate-identifiers) +- [Hibernate – Mapping Date and Time](http://www.baeldung.com/hibernate-date-time) +- [Hibernate Inheritance Mapping](http://www.baeldung.com/hibernate-inheritance) diff --git a/jsonb/README.md b/jsonb/README.md index a638f0355c..9293a44808 100644 --- a/jsonb/README.md +++ b/jsonb/README.md @@ -1 +1,4 @@ ## JSON B + +## Relevant articles: +- [Introduction to the JSON Binding API (JSR 367) in Java](http://www.baeldung.com/java-json-binding-api) diff --git a/junit5/README.md b/junit5/README.md new file mode 100644 index 0000000000..fb1685fdd5 --- /dev/null +++ b/junit5/README.md @@ -0,0 +1,2 @@ +## Relevant articles: +- [The Order of Tests in JUnit](http://www.baeldung.com/junit-5-test-order) diff --git a/osgi/readme.md b/osgi/readme.md index ea4a411c7b..e380ae06c3 100644 --- a/osgi/readme.md +++ b/osgi/readme.md @@ -86,6 +86,9 @@ org.eclipse.osgi_3.12.1.v20170821-1548.jar = = NOT GOOD = = + ## Relevant articles: + - [Introduction to OSGi](http://www.baeldung.com/osgi) + diff --git a/patterns/README.md b/patterns/README.md index 67d84154cb..26099ae34f 100644 --- a/patterns/README.md +++ b/patterns/README.md @@ -1,4 +1,5 @@ ###Relevant Articles: - [A Guide to the Front Controller Pattern in Java](http://www.baeldung.com/java-front-controller-pattern) - [Introduction to Intercepting Filter Pattern in Java](http://www.baeldung.com/intercepting-filter-pattern-in-java) -- [Implementing the Template Method Pattern in Java](http://www.baeldung.com/template-method-pattern-in-java) +- [Implementing the Template Method Pattern in Java](http://www.baeldung.com/java-template-method-pattern) + diff --git a/persistence-modules/spring-jpa/README.md b/persistence-modules/spring-jpa/README.md index d93271164c..4bfe2a1d25 100644 --- a/persistence-modules/spring-jpa/README.md +++ b/persistence-modules/spring-jpa/README.md @@ -15,6 +15,7 @@ - [Deleting Objects with Hibernate](http://www.baeldung.com/delete-with-hibernate) - [Self-Contained Testing Using an In-Memory Database](http://www.baeldung.com/spring-jpa-test-in-memory-database) - [Spring Data JPA – Adding a Method in All Repositories](http://www.baeldung.com/spring-data-jpa-method-in-all-repositories) +- [A Guide to Spring AbstractRoutingDatasource](http://www.baeldung.com/spring-abstract-routing-data-source) ### Eclipse Config After importing the project into Eclipse, you may see the following error: diff --git a/spring-5/README.md b/spring-5/README.md index 1b65d01811..400e343263 100644 --- a/spring-5/README.md +++ b/spring-5/README.md @@ -11,3 +11,5 @@ The "REST With Spring" Classes: http://bit.ly/restwithspring - [Spring 5 WebClient](http://www.baeldung.com/spring-5-webclient) - [Spring 5 Functional Bean Registration](http://www.baeldung.com/spring-5-functional-beans) - [The SpringJUnitConfig and SpringJUnitWebConfig Annotations in Spring 5](http://www.baeldung.com/spring-5-junit-config) +- [Spring Security 5 for Reactive Applications](http://www.baeldung.com/spring-security-5-reactive) +- [Spring 5 Testing with @EnabledIf Annotation](https://github.com/eugenp/tutorials/tree/master/spring-5) diff --git a/spring-aop/README.md b/spring-aop/README.md index 03d5d8f429..af8ab71da0 100644 --- a/spring-aop/README.md +++ b/spring-aop/README.md @@ -2,4 +2,5 @@ - [Implementing a Custom Spring AOP Annotation](http://www.baeldung.com/spring-aop-annotation) - [Intro to AspectJ](http://www.baeldung.com/aspectj) -- [Spring Performance Logging](http://www.baeldung.com/spring-performance-logging) \ No newline at end of file +- [Spring Performance Logging](http://www.baeldung.com/spring-performance-logging) +- [Introduction to Spring AOP](http://www.baeldung.com/spring-aop) diff --git a/spring-boot-keycloak/README.md b/spring-boot-keycloak/README.md new file mode 100644 index 0000000000..cfe82c6cf7 --- /dev/null +++ b/spring-boot-keycloak/README.md @@ -0,0 +1,2 @@ +## Relevant articles: +- [A Quick Guide to Using Keycloak with Spring Boot](http://www.baeldung.com/spring-boot-keycloak) diff --git a/spring-boot/README.MD b/spring-boot/README.MD index f126df00af..7b5fb3c880 100644 --- a/spring-boot/README.MD +++ b/spring-boot/README.MD @@ -28,4 +28,4 @@ The "REST With Spring" Classes: http://bit.ly/restwithspring - [Spring Boot and Togglz Aspect](http://www.baeldung.com/spring-togglz) - [Getting Started with GraphQL and Spring Boot](http://www.baeldung.com/spring-graphql) - [Guide to Spring Type Conversions](http://www.baeldung.com/spring-type-conversions) - +- [Quick Guide on data.sql and schema.sql Files in Spring Boot](http://www.baeldung.com/spring-boot-data-sql-and-schema-sql) diff --git a/spring-cloud-cli/README.md b/spring-cloud-cli/README.md index 5f83ab06fa..7f29be3f07 100644 --- a/spring-cloud-cli/README.md +++ b/spring-cloud-cli/README.md @@ -3,4 +3,4 @@ ## Spring Cloud CLI ### Relevant Articles: -- [Introduction to Spring Cloud CLI](http://www.baeldung.com/introduction-to-spring-cloud-cli/) \ No newline at end of file +- [Introduction to Spring Cloud CLI](http://www.baeldung.com/spring-cloud-cli) diff --git a/spring-core/README.md b/spring-core/README.md index 81a7aaa952..dc3bb1c9f0 100644 --- a/spring-core/README.md +++ b/spring-core/README.md @@ -8,3 +8,5 @@ - [Spring YAML Configuration](http://www.baeldung.com/spring-yaml) - [Introduction to Spring’s StreamUtils](http://www.baeldung.com/spring-stream-utils) - [Using Spring @Value with Defaults](http://www.baeldung.com/spring-value-defaults) +- [Groovy Bean Definitions](http://www.baeldung.com/spring-groovy-beans) +- [XML-Based Injection in Spring](http://www.baeldung.com/spring-xml-injection) diff --git a/spring-hibernate3/README.md b/spring-hibernate3/README.md new file mode 100644 index 0000000000..02928dfb51 --- /dev/null +++ b/spring-hibernate3/README.md @@ -0,0 +1,2 @@ +## Relevant articles: +- [HibernateException: No Hibernate Session Bound to Thread in Hibernate 3](http://www.baeldung.com/no-hibernate-session-bound-to-thread-exception) diff --git a/testing-modules/mockito-2/README.md b/testing-modules/mockito-2/README.md index 49741c66d1..ee443df81a 100644 --- a/testing-modules/mockito-2/README.md +++ b/testing-modules/mockito-2/README.md @@ -1,6 +1,7 @@ ### Relevant articles - [Mockito’s Java 8 Features](http://www.baeldung.com/mockito-2-java-8) +- [Lazy Verification with Mockito 2](http://www.baeldung.com/mockito-2-lazy-verification) ## Mockito 2 and Java 8 Tips diff --git a/testing-modules/mockito/README.md b/testing-modules/mockito/README.md index 0d6f69a64f..4bbc083d8c 100644 --- a/testing-modules/mockito/README.md +++ b/testing-modules/mockito/README.md @@ -12,3 +12,5 @@ - [Introduction to PowerMock](http://www.baeldung.com/intro-to-powermock) - [Mocking Exception Throwing using Mockito](http://www.baeldung.com/mockito-exceptions) - [Mocking Void Methods with Mockito](http://www.baeldung.com/mockito-void-methods) +- [Mocking of Private Methods Using PowerMock](http://www.baeldung.com/powermock-private-method) +- [Mock Final Classes and Methods with Mockito](http://www.baeldung.com/mockito-final) From 30f78fc3cae32201f20804708429dc364cec57c2 Mon Sep 17 00:00:00 2001 From: hugosama1 Date: Tue, 12 Dec 2017 08:01:06 -0500 Subject: [PATCH 185/236] BAEL-1345 - Apachefileupload (#3185) * Added code for file upload controller * changed to spring module --- libraries/pom.xml | 10 +-- spring-rest-simple/pom.xml | 2 +- .../apachefileupload/UploadController.java | 73 +++++++++++++++++++ 3 files changed, 79 insertions(+), 6 deletions(-) create mode 100644 spring-rest-simple/src/main/java/com/baeldung/apachefileupload/UploadController.java diff --git a/libraries/pom.xml b/libraries/pom.xml index 27d867b68b..eaa2d9d38f 100644 --- a/libraries/pom.xml +++ b/libraries/pom.xml @@ -630,13 +630,13 @@ com.google.http-client google-http-client-jackson2 - ${googleclient.version} + ${googleclient.version} - com.google.http-client - google-http-client-gson - ${googleclient.version} - + com.google.http-client + google-http-client-gson + ${googleclient.version} + diff --git a/spring-rest-simple/pom.xml b/spring-rest-simple/pom.xml index f3fdd78ff4..7314785731 100644 --- a/spring-rest-simple/pom.xml +++ b/spring-rest-simple/pom.xml @@ -346,7 +346,7 @@ - 1.3.2 + 1.3.3 4.0.0 1.4 3.1.0 diff --git a/spring-rest-simple/src/main/java/com/baeldung/apachefileupload/UploadController.java b/spring-rest-simple/src/main/java/com/baeldung/apachefileupload/UploadController.java new file mode 100644 index 0000000000..b9b6739898 --- /dev/null +++ b/spring-rest-simple/src/main/java/com/baeldung/apachefileupload/UploadController.java @@ -0,0 +1,73 @@ +package com.baeldung.apachefileupload; + +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.util.Iterator; +import java.util.List; +import javax.servlet.http.HttpServletRequest; +import org.apache.commons.fileupload.FileItem; +import org.apache.commons.fileupload.FileItemIterator; +import org.apache.commons.fileupload.FileItemStream; +import org.apache.commons.fileupload.FileUploadException; +import org.apache.commons.fileupload.disk.DiskFileItemFactory; +import org.apache.commons.fileupload.servlet.ServletFileUpload; +import org.apache.commons.fileupload.util.Streams; +import org.apache.commons.io.IOUtils; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.RestController; + +@RestController +public class UploadController { + + @RequestMapping(value = "/upload", method = RequestMethod.POST) + public String handleUpload(HttpServletRequest request) { + System.out.println(System.getProperty("java.io.tmpdir")); + boolean isMultipart = ServletFileUpload.isMultipartContent(request); + // Create a factory for disk-based file items + DiskFileItemFactory factory = new DiskFileItemFactory(); + factory.setRepository(new File(System.getProperty("java.io.tmpdir"))); + factory.setSizeThreshold(DiskFileItemFactory.DEFAULT_SIZE_THRESHOLD); + factory.setFileCleaningTracker(null); + // Configure a repository (to ensure a secure temp location is used) + ServletFileUpload upload = new ServletFileUpload(factory); + try { + // Parse the request + List items = upload.parseRequest(request); + // Process the uploaded items + Iterator iter = items.iterator(); + while (iter.hasNext()) { + FileItem item = iter.next(); + + if (!item.isFormField()) { + try (InputStream uploadedStream = item.getInputStream(); + OutputStream out = new FileOutputStream("file.mov");) { + IOUtils.copy(uploadedStream, out); + out.close(); + } + } + } + // Parse the request with Streaming API + upload = new ServletFileUpload(); + FileItemIterator iterStream = upload.getItemIterator(request); + while (iterStream.hasNext()) { + FileItemStream item = iterStream.next(); + String name = item.getFieldName(); + InputStream stream = item.openStream(); + if (!item.isFormField()) { + //Process the InputStream + } else { + //process form fields + String formFieldValue = Streams.asString(stream); + } + } + return "success!"; + } catch (IOException | FileUploadException ex) { + return "failed: " + ex.getMessage(); + } + } + +} From 33198c73e179c4d7b34ec88f1ead04c0489d1fc9 Mon Sep 17 00:00:00 2001 From: "dhrubajyoti.bhattacharjee" Date: Wed, 13 Dec 2017 00:49:49 +0530 Subject: [PATCH 186/236] BAEL-1207 File search using Lucene --- lucene/.gitignore | 1 + .../com/baeldung/lucene/LuceneFileSearch.java | 80 +++++++++++++++++++ .../baeldung/lucene/LuceneFileSearchTest.java | 32 ++++++++ lucene/src/test/resources/data/file1.txt | 3 + 4 files changed, 116 insertions(+) create mode 100644 lucene/.gitignore create mode 100644 lucene/src/main/java/com/baeldung/lucene/LuceneFileSearch.java create mode 100644 lucene/src/test/java/com/baeldung/lucene/LuceneFileSearchTest.java create mode 100644 lucene/src/test/resources/data/file1.txt diff --git a/lucene/.gitignore b/lucene/.gitignore new file mode 100644 index 0000000000..3ed87faec7 --- /dev/null +++ b/lucene/.gitignore @@ -0,0 +1 @@ +/index/ diff --git a/lucene/src/main/java/com/baeldung/lucene/LuceneFileSearch.java b/lucene/src/main/java/com/baeldung/lucene/LuceneFileSearch.java new file mode 100644 index 0000000000..1d090d55fc --- /dev/null +++ b/lucene/src/main/java/com/baeldung/lucene/LuceneFileSearch.java @@ -0,0 +1,80 @@ +package com.baeldung.lucene; + +import java.io.File; +import java.io.FileReader; +import java.io.IOException; +import java.net.URISyntaxException; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.util.ArrayList; +import java.util.List; + +import org.apache.lucene.analysis.standard.StandardAnalyzer; +import org.apache.lucene.document.Document; +import org.apache.lucene.document.Field; +import org.apache.lucene.document.StringField; +import org.apache.lucene.document.TextField; +import org.apache.lucene.index.DirectoryReader; +import org.apache.lucene.index.IndexReader; +import org.apache.lucene.index.IndexWriter; +import org.apache.lucene.index.IndexWriterConfig; +import org.apache.lucene.queryparser.classic.ParseException; +import org.apache.lucene.queryparser.classic.QueryParser; +import org.apache.lucene.search.IndexSearcher; +import org.apache.lucene.search.Query; +import org.apache.lucene.search.ScoreDoc; +import org.apache.lucene.search.TopDocs; +import org.apache.lucene.store.Directory; + +public class LuceneFileSearch { + + private Directory indexDirectory; + private StandardAnalyzer analyzer; + + public LuceneFileSearch(Directory fsDirectory, StandardAnalyzer analyzer) { + super(); + this.indexDirectory = fsDirectory; + this.analyzer = analyzer; + } + + public void addFileToIndex(String filepath) throws IOException, URISyntaxException { + + Path path = Paths.get(getClass().getClassLoader().getResource(filepath).toURI()); + File file = path.toFile(); + IndexWriterConfig indexWriterConfig = new IndexWriterConfig(analyzer); + IndexWriter indexWriter = new IndexWriter(indexDirectory, indexWriterConfig); + Document document = new Document(); + + FileReader fileReader = new FileReader(file); + document.add(new TextField("contents", fileReader)); + document.add(new StringField("path", file.getPath(), Field.Store.YES)); + document.add(new StringField("filename", file.getName(), Field.Store.YES)); + + indexWriter.addDocument(document); + + indexWriter.close(); + } + + public List searchFiles(String inField, String queryString) { + try { + Query query = new QueryParser(inField, analyzer).parse(queryString); + + IndexReader indexReader = DirectoryReader.open(indexDirectory); + IndexSearcher searcher = new IndexSearcher(indexReader); + TopDocs topDocs = searcher.search(query, 10); + List documents = new ArrayList<>(); + for (ScoreDoc scoreDoc : topDocs.scoreDocs) { + documents.add(searcher.doc(scoreDoc.doc)); + } + + return documents; + } catch (IOException | ParseException e) { + e.printStackTrace(); + } + return null; + + } + +} + + diff --git a/lucene/src/test/java/com/baeldung/lucene/LuceneFileSearchTest.java b/lucene/src/test/java/com/baeldung/lucene/LuceneFileSearchTest.java new file mode 100644 index 0000000000..4345057ff7 --- /dev/null +++ b/lucene/src/test/java/com/baeldung/lucene/LuceneFileSearchTest.java @@ -0,0 +1,32 @@ +package com.baeldung.lucene; + +import java.io.IOException; +import java.net.URISyntaxException; +import java.nio.file.Paths; +import java.util.List; + +import org.apache.lucene.analysis.standard.StandardAnalyzer; +import org.apache.lucene.document.Document; +import org.apache.lucene.store.Directory; +import org.apache.lucene.store.FSDirectory; +import org.junit.Assert; +import org.junit.Test; + +public class LuceneFileSearchTest { + + @Test + public void givenSearchQueryWhenFetchedFileNamehenCorrect() throws IOException, URISyntaxException { + String indexPath = "index"; + String dataPath = "data/file1.txt"; + + Directory directory = FSDirectory.open(Paths.get(indexPath)); + LuceneFileSearch luceneFileSearch = new LuceneFileSearch(directory, new StandardAnalyzer()); + + luceneFileSearch.addFileToIndex(dataPath); + + List docs = luceneFileSearch.searchFiles("contents", "consectetur"); + + Assert.assertEquals("file1.txt", docs.get(0).get("filename")); + } + +} \ No newline at end of file diff --git a/lucene/src/test/resources/data/file1.txt b/lucene/src/test/resources/data/file1.txt new file mode 100644 index 0000000000..6f915d3927 --- /dev/null +++ b/lucene/src/test/resources/data/file1.txt @@ -0,0 +1,3 @@ +Cras auctor viverra arcu, id consequat diam posuere id. Pellentesque hendrerit felis tortor, et ornare nibh ullamcorper sed. Aenean sed mauris vitae purus auctor gravida. Nam aliquam egestas orci, sit amet imperdiet leo porttitor quis. Integer commodo sodales orci, ultrices vulputate arcu vestibulum non. Nunc at tellus id urna tristique ultrices in in massa. Vestibulum laoreet ullamcorper nulla vel porttitor. Duis blandit commodo elit at consequat. Vestibulum faucibus lectus eget mi tincidunt, quis molestie lacus mollis. Duis elementum urna eros, non iaculis est facilisis in. Praesent et neque vel ipsum viverra euismod ac ac metus. Ut vitae libero ex. + +Proin consectetur, neque nec feugiat facilisis, metus libero mollis arcu, id pharetra nibh sapien in elit. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Nam pulvinar fringilla orci in posuere. Duis ut turpis dignissim nisl eleifend posuere nec a massa. Cras fringilla iaculis ipsum a aliquet. Nunc ultrices nisl ipsum, vitae consectetur tellus vehicula in. Aliquam lacinia elit nec scelerisque dapibus. Duis pharetra mauris vitae quam tincidunt, viverra iaculis orci iaculis. Nunc gravida sem arcu, et mollis leo porttitor nec. Ut dictum tempor est, at fringilla ex feugiat sed. Nullam purus mi, aliquet eu libero ut, finibus efficitur metus. \ No newline at end of file From e5c9d8144b1a49107c49c8a7d165c41b1af81c02 Mon Sep 17 00:00:00 2001 From: Dassi Orleando Date: Wed, 13 Dec 2017 04:00:58 +0100 Subject: [PATCH 187/236] Edit jmeter module name --- {spring-jmeter-jenkins => jmeter}/.gitignore | 0 .../.mvn/wrapper/maven-wrapper.jar | Bin .../.mvn/wrapper/maven-wrapper.properties | 0 {spring-jmeter-jenkins => jmeter}/README.md | 0 {spring-jmeter-jenkins => jmeter}/mvnw | 0 {spring-jmeter-jenkins => jmeter}/mvnw.cmd | 0 {spring-jmeter-jenkins => jmeter}/pom.xml | 6 +++--- .../baeldung/SpringJMeterJenkinsApplication.java | 0 .../src/main/java/com/baeldung/domain/Student.java | 0 .../com/baeldung/repository/StudentRepository.java | 0 .../src/main/resources/20171205-JMeter-Jenkins.csv | 0 .../src/main/resources/20171213-JMeter-Jenkins.csv | 6 ++++++ .../src/main/resources/JMeter-Jenkins.jmx | 0 .../src/main/resources/application.properties | 0 ...ringJMeterJenkinsApplicationIntegrationTest.java | 0 pom.xml | 2 +- 16 files changed, 10 insertions(+), 4 deletions(-) rename {spring-jmeter-jenkins => jmeter}/.gitignore (100%) rename {spring-jmeter-jenkins => jmeter}/.mvn/wrapper/maven-wrapper.jar (100%) rename {spring-jmeter-jenkins => jmeter}/.mvn/wrapper/maven-wrapper.properties (100%) rename {spring-jmeter-jenkins => jmeter}/README.md (100%) rename {spring-jmeter-jenkins => jmeter}/mvnw (100%) rename {spring-jmeter-jenkins => jmeter}/mvnw.cmd (100%) rename {spring-jmeter-jenkins => jmeter}/pom.xml (93%) rename {spring-jmeter-jenkins => jmeter}/src/main/java/com/baeldung/SpringJMeterJenkinsApplication.java (100%) rename {spring-jmeter-jenkins => jmeter}/src/main/java/com/baeldung/domain/Student.java (100%) rename {spring-jmeter-jenkins => jmeter}/src/main/java/com/baeldung/repository/StudentRepository.java (100%) rename {spring-jmeter-jenkins => jmeter}/src/main/resources/20171205-JMeter-Jenkins.csv (100%) create mode 100644 jmeter/src/main/resources/20171213-JMeter-Jenkins.csv rename {spring-jmeter-jenkins => jmeter}/src/main/resources/JMeter-Jenkins.jmx (100%) rename {spring-jmeter-jenkins => jmeter}/src/main/resources/application.properties (100%) rename {spring-jmeter-jenkins => jmeter}/src/test/java/com/baeldung/SpringJMeterJenkinsApplicationIntegrationTest.java (100%) diff --git a/spring-jmeter-jenkins/.gitignore b/jmeter/.gitignore similarity index 100% rename from spring-jmeter-jenkins/.gitignore rename to jmeter/.gitignore diff --git a/spring-jmeter-jenkins/.mvn/wrapper/maven-wrapper.jar b/jmeter/.mvn/wrapper/maven-wrapper.jar similarity index 100% rename from spring-jmeter-jenkins/.mvn/wrapper/maven-wrapper.jar rename to jmeter/.mvn/wrapper/maven-wrapper.jar diff --git a/spring-jmeter-jenkins/.mvn/wrapper/maven-wrapper.properties b/jmeter/.mvn/wrapper/maven-wrapper.properties similarity index 100% rename from spring-jmeter-jenkins/.mvn/wrapper/maven-wrapper.properties rename to jmeter/.mvn/wrapper/maven-wrapper.properties diff --git a/spring-jmeter-jenkins/README.md b/jmeter/README.md similarity index 100% rename from spring-jmeter-jenkins/README.md rename to jmeter/README.md diff --git a/spring-jmeter-jenkins/mvnw b/jmeter/mvnw similarity index 100% rename from spring-jmeter-jenkins/mvnw rename to jmeter/mvnw diff --git a/spring-jmeter-jenkins/mvnw.cmd b/jmeter/mvnw.cmd similarity index 100% rename from spring-jmeter-jenkins/mvnw.cmd rename to jmeter/mvnw.cmd diff --git a/spring-jmeter-jenkins/pom.xml b/jmeter/pom.xml similarity index 93% rename from spring-jmeter-jenkins/pom.xml rename to jmeter/pom.xml index daef45b6d4..977e3bbc94 100644 --- a/spring-jmeter-jenkins/pom.xml +++ b/jmeter/pom.xml @@ -3,12 +3,12 @@ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 - spring-jmeter-jenkins + jmeter 0.0.1-SNAPSHOT jar - spring-jmeter-jenkins - Run and Show JMeter test with Jenkins + jmeter + Intro to Performance testing using JMeter parent-boot-5 diff --git a/spring-jmeter-jenkins/src/main/java/com/baeldung/SpringJMeterJenkinsApplication.java b/jmeter/src/main/java/com/baeldung/SpringJMeterJenkinsApplication.java similarity index 100% rename from spring-jmeter-jenkins/src/main/java/com/baeldung/SpringJMeterJenkinsApplication.java rename to jmeter/src/main/java/com/baeldung/SpringJMeterJenkinsApplication.java diff --git a/spring-jmeter-jenkins/src/main/java/com/baeldung/domain/Student.java b/jmeter/src/main/java/com/baeldung/domain/Student.java similarity index 100% rename from spring-jmeter-jenkins/src/main/java/com/baeldung/domain/Student.java rename to jmeter/src/main/java/com/baeldung/domain/Student.java diff --git a/spring-jmeter-jenkins/src/main/java/com/baeldung/repository/StudentRepository.java b/jmeter/src/main/java/com/baeldung/repository/StudentRepository.java similarity index 100% rename from spring-jmeter-jenkins/src/main/java/com/baeldung/repository/StudentRepository.java rename to jmeter/src/main/java/com/baeldung/repository/StudentRepository.java diff --git a/spring-jmeter-jenkins/src/main/resources/20171205-JMeter-Jenkins.csv b/jmeter/src/main/resources/20171205-JMeter-Jenkins.csv similarity index 100% rename from spring-jmeter-jenkins/src/main/resources/20171205-JMeter-Jenkins.csv rename to jmeter/src/main/resources/20171205-JMeter-Jenkins.csv diff --git a/jmeter/src/main/resources/20171213-JMeter-Jenkins.csv b/jmeter/src/main/resources/20171213-JMeter-Jenkins.csv new file mode 100644 index 0000000000..92650ea36f --- /dev/null +++ b/jmeter/src/main/resources/20171213-JMeter-Jenkins.csv @@ -0,0 +1,6 @@ +timeStamp,elapsed,label,responseCode,responseMessage,threadName,dataType,success,failureMessage,bytes,sentBytes,grpThreads,allThreads,Latency,IdleTime,Connect +1513133869106,1150,HTTP Request,Non HTTP response code: java.net.ConnectException,Non HTTP response message: Connection refused (Connection refused),Thread Group 1-2,text,false,"The operation lasted too long: It took 1,150 milliseconds, but should not have lasted longer than 10 milliseconds.",2058,0,5,5,0,0,1150 +1513133869106,1152,HTTP Request,Non HTTP response code: java.net.ConnectException,Non HTTP response message: Connection refused (Connection refused),Thread Group 1-5,text,false,"The operation lasted too long: It took 1,152 milliseconds, but should not have lasted longer than 10 milliseconds.",2058,0,5,5,0,0,1152 +1513133869106,1150,HTTP Request,Non HTTP response code: java.net.ConnectException,Non HTTP response message: Connection refused (Connection refused),Thread Group 1-4,text,false,"The operation lasted too long: It took 1,150 milliseconds, but should not have lasted longer than 10 milliseconds.",2058,0,5,5,0,0,1150 +1513133869106,1152,HTTP Request,Non HTTP response code: java.net.ConnectException,Non HTTP response message: Connection refused (Connection refused),Thread Group 1-1,text,false,"The operation lasted too long: It took 1,152 milliseconds, but should not have lasted longer than 10 milliseconds.",2058,0,5,5,0,0,1152 +1513133869104,1153,HTTP Request,Non HTTP response code: java.net.ConnectException,Non HTTP response message: Connection refused (Connection refused),Thread Group 1-3,text,false,"The operation lasted too long: It took 1,153 milliseconds, but should not have lasted longer than 10 milliseconds.",2058,0,5,5,0,0,1153 diff --git a/spring-jmeter-jenkins/src/main/resources/JMeter-Jenkins.jmx b/jmeter/src/main/resources/JMeter-Jenkins.jmx similarity index 100% rename from spring-jmeter-jenkins/src/main/resources/JMeter-Jenkins.jmx rename to jmeter/src/main/resources/JMeter-Jenkins.jmx diff --git a/spring-jmeter-jenkins/src/main/resources/application.properties b/jmeter/src/main/resources/application.properties similarity index 100% rename from spring-jmeter-jenkins/src/main/resources/application.properties rename to jmeter/src/main/resources/application.properties diff --git a/spring-jmeter-jenkins/src/test/java/com/baeldung/SpringJMeterJenkinsApplicationIntegrationTest.java b/jmeter/src/test/java/com/baeldung/SpringJMeterJenkinsApplicationIntegrationTest.java similarity index 100% rename from spring-jmeter-jenkins/src/test/java/com/baeldung/SpringJMeterJenkinsApplicationIntegrationTest.java rename to jmeter/src/test/java/com/baeldung/SpringJMeterJenkinsApplicationIntegrationTest.java diff --git a/pom.xml b/pom.xml index 8aa9afc6b3..462d70741e 100644 --- a/pom.xml +++ b/pom.xml @@ -177,7 +177,7 @@ spring-integration spring-jenkins-pipeline spring-jersey - spring-jmeter-jenkins + jmeter spring-jms spring-jooq persistence-modules/spring-jpa From 9eb7a54316856c56ec0b3c6d2f980039774e746c Mon Sep 17 00:00:00 2001 From: Dassi Orleando Date: Wed, 13 Dec 2017 04:51:20 +0100 Subject: [PATCH 188/236] Update JMeter tests --- jmeter/jmeter.log | 68 +++++++++++++++++++ .../resources/20171205-JMeter-Jenkins.csv | 6 -- .../resources/20171213-JMeter-Jenkins.csv | 6 -- jmeter/src/main/resources/20171213-JMeter.csv | 6 ++ .../{JMeter-Jenkins.jmx => JMeter.jmx} | 2 +- jmeter/src/main/resources/JMeter.jtl | 43 ++++++++++++ 6 files changed, 118 insertions(+), 13 deletions(-) create mode 100644 jmeter/jmeter.log delete mode 100644 jmeter/src/main/resources/20171205-JMeter-Jenkins.csv delete mode 100644 jmeter/src/main/resources/20171213-JMeter-Jenkins.csv create mode 100644 jmeter/src/main/resources/20171213-JMeter.csv rename jmeter/src/main/resources/{JMeter-Jenkins.jmx => JMeter.jmx} (99%) create mode 100644 jmeter/src/main/resources/JMeter.jtl diff --git a/jmeter/jmeter.log b/jmeter/jmeter.log new file mode 100644 index 0000000000..ce55007e74 --- /dev/null +++ b/jmeter/jmeter.log @@ -0,0 +1,68 @@ +2017-12-13 04:50:16,291 INFO o.a.j.u.JMeterUtils: Setting Locale to en_US +2017-12-13 04:50:16,319 INFO o.a.j.JMeter: Loading user properties from: /Users/dassiorleando/projects/biz/baeldung/jmeter/apache-jmeter-3.3/bin/user.properties +2017-12-13 04:50:16,392 INFO o.a.j.JMeter: Loading system properties from: /Users/dassiorleando/projects/biz/baeldung/jmeter/apache-jmeter-3.3/bin/system.properties +2017-12-13 04:50:16,406 INFO o.a.j.JMeter: Setting JMeter property: jmeter.save.saveservice.output_format=xml +2017-12-13 04:50:16,451 INFO o.a.j.JMeter: Copyright (c) 1998-2017 The Apache Software Foundation +2017-12-13 04:50:16,451 INFO o.a.j.JMeter: Version 3.3 r1808647 +2017-12-13 04:50:16,451 INFO o.a.j.JMeter: java.version=1.8.0_152 +2017-12-13 04:50:16,451 INFO o.a.j.JMeter: java.vm.name=Java HotSpot(TM) 64-Bit Server VM +2017-12-13 04:50:16,451 INFO o.a.j.JMeter: os.name=Mac OS X +2017-12-13 04:50:16,451 INFO o.a.j.JMeter: os.arch=x86_64 +2017-12-13 04:50:16,452 INFO o.a.j.JMeter: os.version=10.12.6 +2017-12-13 04:50:16,452 INFO o.a.j.JMeter: file.encoding=UTF-8 +2017-12-13 04:50:16,452 INFO o.a.j.JMeter: Max memory =536870912 +2017-12-13 04:50:16,452 INFO o.a.j.JMeter: Available Processors =4 +2017-12-13 04:50:16,461 INFO o.a.j.JMeter: Default Locale=English (United States) +2017-12-13 04:50:16,462 INFO o.a.j.JMeter: JMeter Locale=English (United States) +2017-12-13 04:50:16,462 INFO o.a.j.JMeter: JMeterHome=/Users/dassiorleando/projects/biz/baeldung/jmeter/apache-jmeter-3.3 +2017-12-13 04:50:16,462 INFO o.a.j.JMeter: user.dir =/Users/dassiorleando/projects/biz/baeldung/tutorials/jmeter +2017-12-13 04:50:16,462 INFO o.a.j.JMeter: PWD =/Users/dassiorleando/projects/biz/baeldung/tutorials/jmeter +2017-12-13 04:50:16,466 INFO o.a.j.JMeter: IP: 192.168.10.100 Name: MBP FullName: 192.168.10.100 +2017-12-13 04:50:16,472 INFO o.a.j.s.FileServer: Default base='/Users/dassiorleando/projects/biz/baeldung/tutorials/jmeter' +2017-12-13 04:50:16,473 INFO o.a.j.s.FileServer: Set new base='/Users/dassiorleando/projects/biz/baeldung/tutorials/jmeter/src/main/resources' +2017-12-13 04:50:17,022 INFO o.a.j.s.SaveService: Testplan (JMX) version: 2.2. Testlog (JTL) version: 2.2 +2017-12-13 04:50:17,134 INFO o.a.j.s.SaveService: Using SaveService properties file encoding UTF-8 +2017-12-13 04:50:17,142 INFO o.a.j.s.SaveService: Using SaveService properties version 3.2 +2017-12-13 04:50:17,168 INFO o.a.j.s.SaveService: Loading file: src/main/resources/JMeter.jmx +2017-12-13 04:50:17,340 INFO o.a.j.p.h.s.HTTPSamplerBase: Parser for text/html is org.apache.jmeter.protocol.http.parser.LagartoBasedHtmlParser +2017-12-13 04:50:17,351 INFO o.a.j.p.h.s.HTTPSamplerBase: Parser for application/xhtml+xml is org.apache.jmeter.protocol.http.parser.LagartoBasedHtmlParser +2017-12-13 04:50:17,352 INFO o.a.j.p.h.s.HTTPSamplerBase: Parser for application/xml is org.apache.jmeter.protocol.http.parser.LagartoBasedHtmlParser +2017-12-13 04:50:17,352 INFO o.a.j.p.h.s.HTTPSamplerBase: Parser for text/xml is org.apache.jmeter.protocol.http.parser.LagartoBasedHtmlParser +2017-12-13 04:50:17,353 INFO o.a.j.p.h.s.HTTPSamplerBase: Parser for text/vnd.wap.wml is org.apache.jmeter.protocol.http.parser.RegexpHTMLParser +2017-12-13 04:50:17,353 INFO o.a.j.p.h.s.HTTPSamplerBase: Parser for text/css is org.apache.jmeter.protocol.http.parser.CssParser +2017-12-13 04:50:17,552 INFO o.a.j.JMeter: Creating summariser +2017-12-13 04:50:17,580 INFO o.a.j.e.StandardJMeterEngine: Running the test! +2017-12-13 04:50:17,581 INFO o.a.j.s.SampleEvent: List of sample_variables: [] +2017-12-13 04:50:17,582 INFO o.a.j.s.SampleEvent: List of sample_variables: [] +2017-12-13 04:50:17,590 INFO o.a.j.e.u.CompoundVariable: Note: Function class names must contain the string: '.functions.' +2017-12-13 04:50:17,590 INFO o.a.j.e.u.CompoundVariable: Note: Function class names must not contain the string: '.gui.' +2017-12-13 04:50:18,640 INFO o.a.j.JMeter: Running test (1513137018640) +2017-12-13 04:50:18,728 INFO o.a.j.e.StandardJMeterEngine: Starting ThreadGroup: 1 : Thread Group +2017-12-13 04:50:18,737 INFO o.a.j.e.StandardJMeterEngine: Starting 5 threads for group Thread Group. +2017-12-13 04:50:18,737 INFO o.a.j.e.StandardJMeterEngine: Thread will continue on error +2017-12-13 04:50:18,738 INFO o.a.j.t.ThreadGroup: Starting thread group... number=1 threads=5 ramp-up=1 perThread=200.0 delayedStart=false +2017-12-13 04:50:18,751 INFO o.a.j.t.JMeterThread: Thread started: Thread Group 1-1 +2017-12-13 04:50:18,753 INFO o.a.j.t.ThreadGroup: Started thread group number 1 +2017-12-13 04:50:18,753 INFO o.a.j.e.StandardJMeterEngine: All thread groups have been started +2017-12-13 04:50:18,786 INFO o.a.j.p.h.s.HTTPHCAbstractImpl: Local host = MBP +2017-12-13 04:50:18,797 INFO o.a.j.p.h.s.HTTPHC4Impl: HTTP request retry count = 0 +2017-12-13 04:50:18,812 INFO o.a.j.s.SampleResult: Note: Sample TimeStamps are START times +2017-12-13 04:50:18,812 INFO o.a.j.s.SampleResult: sampleresult.default.encoding is set to ISO-8859-1 +2017-12-13 04:50:18,812 INFO o.a.j.s.SampleResult: sampleresult.useNanoTime=true +2017-12-13 04:50:18,812 INFO o.a.j.s.SampleResult: sampleresult.nanoThreadSleep=5000 +2017-12-13 04:50:18,954 INFO o.a.j.t.JMeterThread: Thread started: Thread Group 1-2 +2017-12-13 04:50:19,152 INFO o.a.j.t.JMeterThread: Thread started: Thread Group 1-3 +2017-12-13 04:50:19,257 INFO o.a.j.t.JMeterThread: Thread is done: Thread Group 1-3 +2017-12-13 04:50:19,257 INFO o.a.j.t.JMeterThread: Thread finished: Thread Group 1-3 +2017-12-13 04:50:19,264 INFO o.a.j.t.JMeterThread: Thread is done: Thread Group 1-2 +2017-12-13 04:50:19,264 INFO o.a.j.t.JMeterThread: Thread is done: Thread Group 1-1 +2017-12-13 04:50:19,264 INFO o.a.j.t.JMeterThread: Thread finished: Thread Group 1-2 +2017-12-13 04:50:19,265 INFO o.a.j.t.JMeterThread: Thread finished: Thread Group 1-1 +2017-12-13 04:50:19,353 INFO o.a.j.t.JMeterThread: Thread started: Thread Group 1-4 +2017-12-13 04:50:19,365 INFO o.a.j.t.JMeterThread: Thread is done: Thread Group 1-4 +2017-12-13 04:50:19,365 INFO o.a.j.t.JMeterThread: Thread finished: Thread Group 1-4 +2017-12-13 04:50:19,557 INFO o.a.j.t.JMeterThread: Thread started: Thread Group 1-5 +2017-12-13 04:50:19,573 INFO o.a.j.t.JMeterThread: Thread is done: Thread Group 1-5 +2017-12-13 04:50:19,573 INFO o.a.j.t.JMeterThread: Thread finished: Thread Group 1-5 +2017-12-13 04:50:19,573 INFO o.a.j.e.StandardJMeterEngine: Notifying test listeners of end of test +2017-12-13 04:50:19,575 INFO o.a.j.r.Summariser: summary = 5 in 00:00:01 = 5.4/s Avg: 155 Min: 10 Max: 388 Err: 4 (80.00%) diff --git a/jmeter/src/main/resources/20171205-JMeter-Jenkins.csv b/jmeter/src/main/resources/20171205-JMeter-Jenkins.csv deleted file mode 100644 index 719fc18f41..0000000000 --- a/jmeter/src/main/resources/20171205-JMeter-Jenkins.csv +++ /dev/null @@ -1,6 +0,0 @@ -timeStamp,elapsed,label,responseCode,responseMessage,threadName,dataType,success,failureMessage,bytes,sentBytes,grpThreads,allThreads,Latency,IdleTime,Connect -1512454361862,181,HTTP Request,Non HTTP response code: java.net.ConnectException,Non HTTP response message: Connection refused (Connection refused),Thread Group 1-2,text,false,"The operation lasted too long: It took 181 milliseconds, but should not have lasted longer than 10 milliseconds.",2058,0,3,3,0,0,181 -1512454361926,116,HTTP Request,Non HTTP response code: java.net.ConnectException,Non HTTP response message: Connection refused (Connection refused),Thread Group 1-3,text,false,"The operation lasted too long: It took 116 milliseconds, but should not have lasted longer than 10 milliseconds.",2058,0,3,3,0,0,116 -1512454361862,181,HTTP Request,Non HTTP response code: java.net.ConnectException,Non HTTP response message: Connection refused (Connection refused),Thread Group 1-1,text,false,"The operation lasted too long: It took 181 milliseconds, but should not have lasted longer than 10 milliseconds.",2058,0,3,3,0,0,181 -1512454362126,2,HTTP Request,Non HTTP response code: java.net.ConnectException,Non HTTP response message: Connection refused (Connection refused),Thread Group 1-4,text,false,,2058,0,1,1,0,0,2 -1512454362326,2,HTTP Request,Non HTTP response code: java.net.ConnectException,Non HTTP response message: Connection refused (Connection refused),Thread Group 1-5,text,false,,2058,0,1,1,0,0,2 diff --git a/jmeter/src/main/resources/20171213-JMeter-Jenkins.csv b/jmeter/src/main/resources/20171213-JMeter-Jenkins.csv deleted file mode 100644 index 92650ea36f..0000000000 --- a/jmeter/src/main/resources/20171213-JMeter-Jenkins.csv +++ /dev/null @@ -1,6 +0,0 @@ -timeStamp,elapsed,label,responseCode,responseMessage,threadName,dataType,success,failureMessage,bytes,sentBytes,grpThreads,allThreads,Latency,IdleTime,Connect -1513133869106,1150,HTTP Request,Non HTTP response code: java.net.ConnectException,Non HTTP response message: Connection refused (Connection refused),Thread Group 1-2,text,false,"The operation lasted too long: It took 1,150 milliseconds, but should not have lasted longer than 10 milliseconds.",2058,0,5,5,0,0,1150 -1513133869106,1152,HTTP Request,Non HTTP response code: java.net.ConnectException,Non HTTP response message: Connection refused (Connection refused),Thread Group 1-5,text,false,"The operation lasted too long: It took 1,152 milliseconds, but should not have lasted longer than 10 milliseconds.",2058,0,5,5,0,0,1152 -1513133869106,1150,HTTP Request,Non HTTP response code: java.net.ConnectException,Non HTTP response message: Connection refused (Connection refused),Thread Group 1-4,text,false,"The operation lasted too long: It took 1,150 milliseconds, but should not have lasted longer than 10 milliseconds.",2058,0,5,5,0,0,1150 -1513133869106,1152,HTTP Request,Non HTTP response code: java.net.ConnectException,Non HTTP response message: Connection refused (Connection refused),Thread Group 1-1,text,false,"The operation lasted too long: It took 1,152 milliseconds, but should not have lasted longer than 10 milliseconds.",2058,0,5,5,0,0,1152 -1513133869104,1153,HTTP Request,Non HTTP response code: java.net.ConnectException,Non HTTP response message: Connection refused (Connection refused),Thread Group 1-3,text,false,"The operation lasted too long: It took 1,153 milliseconds, but should not have lasted longer than 10 milliseconds.",2058,0,5,5,0,0,1153 diff --git a/jmeter/src/main/resources/20171213-JMeter.csv b/jmeter/src/main/resources/20171213-JMeter.csv new file mode 100644 index 0000000000..6eb1a37cb0 --- /dev/null +++ b/jmeter/src/main/resources/20171213-JMeter.csv @@ -0,0 +1,6 @@ +timeStamp,elapsed,label,responseCode,responseMessage,threadName,dataType,success,failureMessage,bytes,sentBytes,grpThreads,allThreads,Latency,IdleTime,Connect +1513134869133,1075,HTTP Request,Non HTTP response code: java.net.ConnectException,Non HTTP response message: Connection refused (Connection refused),Thread Group 1-4,text,false,"The operation lasted too long: It took 1,075 milliseconds, but should not have lasted longer than 10 milliseconds.",2058,0,5,5,0,0,1075 +1513134869272,935,HTTP Request,Non HTTP response code: java.net.ConnectException,Non HTTP response message: Connection refused (Connection refused),Thread Group 1-1,text,false,"The operation lasted too long: It took 935 milliseconds, but should not have lasted longer than 10 milliseconds.",2058,0,5,5,0,0,935 +1513134869133,1075,HTTP Request,Non HTTP response code: java.net.ConnectException,Non HTTP response message: Connection refused (Connection refused),Thread Group 1-3,text,false,"The operation lasted too long: It took 1,075 milliseconds, but should not have lasted longer than 10 milliseconds.",2058,0,5,5,0,0,1075 +1513134869272,935,HTTP Request,Non HTTP response code: java.net.ConnectException,Non HTTP response message: Connection refused (Connection refused),Thread Group 1-2,text,false,"The operation lasted too long: It took 935 milliseconds, but should not have lasted longer than 10 milliseconds.",2058,0,5,5,0,0,934 +1513134869133,1074,HTTP Request,Non HTTP response code: java.net.ConnectException,Non HTTP response message: Connection refused (Connection refused),Thread Group 1-5,text,false,"The operation lasted too long: It took 1,074 milliseconds, but should not have lasted longer than 10 milliseconds.",2058,0,5,5,0,0,1074 diff --git a/jmeter/src/main/resources/JMeter-Jenkins.jmx b/jmeter/src/main/resources/JMeter.jmx similarity index 99% rename from jmeter/src/main/resources/JMeter-Jenkins.jmx rename to jmeter/src/main/resources/JMeter.jmx index 49ce2dec1d..77bccb2b24 100644 --- a/jmeter/src/main/resources/JMeter-Jenkins.jmx +++ b/jmeter/src/main/resources/JMeter.jmx @@ -1,7 +1,7 @@ - + false false diff --git a/jmeter/src/main/resources/JMeter.jtl b/jmeter/src/main/resources/JMeter.jtl new file mode 100644 index 0000000000..f9259ef739 --- /dev/null +++ b/jmeter/src/main/resources/JMeter.jtl @@ -0,0 +1,43 @@ + + + + + Duration Assertion + true + false + The operation lasted too long: It took 83 milliseconds, but should not have lasted longer than 10 milliseconds. + + + + + Duration Assertion + true + false + The operation lasted too long: It took 388 milliseconds, but should not have lasted longer than 10 milliseconds. + + + + + Duration Assertion + true + false + The operation lasted too long: It took 281 milliseconds, but should not have lasted longer than 10 milliseconds. + + + + + Duration Assertion + false + false + + + + + Duration Assertion + true + false + The operation lasted too long: It took 13 milliseconds, but should not have lasted longer than 10 milliseconds. + + + + From c194284dddd5f79bd444b03e986a43aabe6d93f1 Mon Sep 17 00:00:00 2001 From: Dassi Orleando Date: Wed, 13 Dec 2017 04:59:11 +0100 Subject: [PATCH 189/236] Update spring jenkins module --- spring-jenkins-pipeline/scripted-pipeline-unix-nonunix | 5 ----- 1 file changed, 5 deletions(-) diff --git a/spring-jenkins-pipeline/scripted-pipeline-unix-nonunix b/spring-jenkins-pipeline/scripted-pipeline-unix-nonunix index 861c38c8a2..6b775b6e56 100644 --- a/spring-jenkins-pipeline/scripted-pipeline-unix-nonunix +++ b/spring-jenkins-pipeline/scripted-pipeline-unix-nonunix @@ -75,13 +75,8 @@ node { withEnv(['JENKINS_NODE_COOKIE=dontkill']) { if (isUnix()) { sh 'nohup ./mvnw spring-boot:run -Dserver.port=8989 &' - sh "while ! httping -qc1 http://localhost:8989 ; do sleep 1 ; done" - sh "curl http://localhost:8989" } else { bat 'start ./mvnw.cmd spring-boot:run -Dserver.port=8989' - // Here we need to check(loop) if localhost:8989 is up - // Once it's we continue de script - bat "curl.exe http://localhost:8989" } } } From 112f33acb9a0fd45fc640091ab836d9a0bbdfae0 Mon Sep 17 00:00:00 2001 From: Grzegorz Piwowarek Date: Wed, 13 Dec 2017 11:25:47 +0100 Subject: [PATCH 190/236] Optimize build (#3227) * Exclude NeurophTest * Fix build --- ...itoryInitialMigrationIntegrationTest.java} | 2 +- ...rRepositoryInsertDataIntegrationTest.java} | 2 +- ...llConstraintMigrationIntegrationTest.java} | 2 +- ...nstraintJavaMigrationIntegrationTest.java} | 2 +- ...ueConstraintMigrationIntegrationTest.java} | 2 +- .../{XORTest.java => XORIntegrationTest.java} | 2 +- pom.xml | 3 +- spring-acl/pom.xml | 66 ---------- .../org/baeldung/acl/config/ACLContext.java | 80 ------------ .../AclMethodSecurityConfiguration.java | 21 ---- .../acl/config/JPAPersistenceConfig.java | 16 --- .../dao/NoticeMessageRepository.java | 24 ---- .../acl/persistence/entity/NoticeMessage.java | 29 ----- spring-acl/src/main/resources/acl-data.sql | 28 ----- spring-acl/src/main/resources/acl-schema.sql | 58 --------- .../org.baeldung.acl.datasource.properties | 12 -- .../java/org/baeldung/acl/SpringAclTest.java | 119 ------------------ ...est.java => SpringACLIntegrationTest.java} | 2 +- 18 files changed, 8 insertions(+), 462 deletions(-) rename flyway/spring-flyway/src/test/java/com/baeldung/springflyway/{CustomerRepositoryInitialMigrationTest.java => CustomerRepositoryInitialMigrationIntegrationTest.java} (92%) rename flyway/spring-flyway/src/test/java/com/baeldung/springflyway/{CustomerRepositoryInsertDataMigrationTest.java => CustomerRepositoryInsertDataIntegrationTest.java} (94%) rename flyway/spring-flyway/src/test/java/com/baeldung/springflyway/{CustomerRepositoryNotNullConstraintMigrationTest.java => CustomerRepositoryNotNullConstraintMigrationIntegrationTest.java} (91%) rename flyway/spring-flyway/src/test/java/com/baeldung/springflyway/{CustomerRepositoryUniqueConstraintJavaMigrationTest.java => CustomerRepositoryUniqueConstraintJavaMigrationIntegrationTest.java} (92%) rename flyway/spring-flyway/src/test/java/com/baeldung/springflyway/{CustomerRepositoryUniqueConstraintMigrationTest.java => CustomerRepositoryUniqueConstraintMigrationIntegrationTest.java} (92%) rename libraries/src/test/java/com/baeldung/neuroph/{XORTest.java => XORIntegrationTest.java} (97%) delete mode 100644 spring-acl/pom.xml delete mode 100644 spring-acl/src/main/java/org/baeldung/acl/config/ACLContext.java delete mode 100644 spring-acl/src/main/java/org/baeldung/acl/config/AclMethodSecurityConfiguration.java delete mode 100644 spring-acl/src/main/java/org/baeldung/acl/config/JPAPersistenceConfig.java delete mode 100644 spring-acl/src/main/java/org/baeldung/acl/persistence/dao/NoticeMessageRepository.java delete mode 100644 spring-acl/src/main/java/org/baeldung/acl/persistence/entity/NoticeMessage.java delete mode 100644 spring-acl/src/main/resources/acl-data.sql delete mode 100644 spring-acl/src/main/resources/acl-schema.sql delete mode 100644 spring-acl/src/main/resources/org.baeldung.acl.datasource.properties delete mode 100644 spring-acl/src/test/java/org/baeldung/acl/SpringAclTest.java rename spring-security-acl/src/test/java/org/baeldung/acl/{SpringAclTest.java => SpringACLIntegrationTest.java} (98%) diff --git a/flyway/spring-flyway/src/test/java/com/baeldung/springflyway/CustomerRepositoryInitialMigrationTest.java b/flyway/spring-flyway/src/test/java/com/baeldung/springflyway/CustomerRepositoryInitialMigrationIntegrationTest.java similarity index 92% rename from flyway/spring-flyway/src/test/java/com/baeldung/springflyway/CustomerRepositoryInitialMigrationTest.java rename to flyway/spring-flyway/src/test/java/com/baeldung/springflyway/CustomerRepositoryInitialMigrationIntegrationTest.java index b3f2cb29e1..59ef5820d7 100644 --- a/flyway/spring-flyway/src/test/java/com/baeldung/springflyway/CustomerRepositoryInitialMigrationTest.java +++ b/flyway/spring-flyway/src/test/java/com/baeldung/springflyway/CustomerRepositoryInitialMigrationIntegrationTest.java @@ -12,7 +12,7 @@ import static org.junit.Assert.assertNotNull; @RunWith(SpringRunner.class) @SpringBootTest -public class CustomerRepositoryInitialMigrationTest { +public class CustomerRepositoryInitialMigrationIntegrationTest { @Autowired CustomerRepository customerRepository; diff --git a/flyway/spring-flyway/src/test/java/com/baeldung/springflyway/CustomerRepositoryInsertDataMigrationTest.java b/flyway/spring-flyway/src/test/java/com/baeldung/springflyway/CustomerRepositoryInsertDataIntegrationTest.java similarity index 94% rename from flyway/spring-flyway/src/test/java/com/baeldung/springflyway/CustomerRepositoryInsertDataMigrationTest.java rename to flyway/spring-flyway/src/test/java/com/baeldung/springflyway/CustomerRepositoryInsertDataIntegrationTest.java index 369e61d98f..3feedf2fd9 100644 --- a/flyway/spring-flyway/src/test/java/com/baeldung/springflyway/CustomerRepositoryInsertDataMigrationTest.java +++ b/flyway/spring-flyway/src/test/java/com/baeldung/springflyway/CustomerRepositoryInsertDataIntegrationTest.java @@ -15,7 +15,7 @@ import static org.junit.Assert.*; @RunWith(SpringRunner.class) @SpringBootTest -public class CustomerRepositoryInsertDataMigrationTest { +public class CustomerRepositoryInsertDataIntegrationTest { @Autowired CustomerRepository customerRepository; diff --git a/flyway/spring-flyway/src/test/java/com/baeldung/springflyway/CustomerRepositoryNotNullConstraintMigrationTest.java b/flyway/spring-flyway/src/test/java/com/baeldung/springflyway/CustomerRepositoryNotNullConstraintMigrationIntegrationTest.java similarity index 91% rename from flyway/spring-flyway/src/test/java/com/baeldung/springflyway/CustomerRepositoryNotNullConstraintMigrationTest.java rename to flyway/spring-flyway/src/test/java/com/baeldung/springflyway/CustomerRepositoryNotNullConstraintMigrationIntegrationTest.java index 90517c9225..9ec5d4d77e 100644 --- a/flyway/spring-flyway/src/test/java/com/baeldung/springflyway/CustomerRepositoryNotNullConstraintMigrationTest.java +++ b/flyway/spring-flyway/src/test/java/com/baeldung/springflyway/CustomerRepositoryNotNullConstraintMigrationIntegrationTest.java @@ -11,7 +11,7 @@ import org.springframework.test.context.junit4.SpringRunner; @RunWith(SpringRunner.class) @SpringBootTest -public class CustomerRepositoryNotNullConstraintMigrationTest { +public class CustomerRepositoryNotNullConstraintMigrationIntegrationTest { @Autowired CustomerRepository customerRepository; diff --git a/flyway/spring-flyway/src/test/java/com/baeldung/springflyway/CustomerRepositoryUniqueConstraintJavaMigrationTest.java b/flyway/spring-flyway/src/test/java/com/baeldung/springflyway/CustomerRepositoryUniqueConstraintJavaMigrationIntegrationTest.java similarity index 92% rename from flyway/spring-flyway/src/test/java/com/baeldung/springflyway/CustomerRepositoryUniqueConstraintJavaMigrationTest.java rename to flyway/spring-flyway/src/test/java/com/baeldung/springflyway/CustomerRepositoryUniqueConstraintJavaMigrationIntegrationTest.java index e5ba782fda..f615f477bc 100644 --- a/flyway/spring-flyway/src/test/java/com/baeldung/springflyway/CustomerRepositoryUniqueConstraintJavaMigrationTest.java +++ b/flyway/spring-flyway/src/test/java/com/baeldung/springflyway/CustomerRepositoryUniqueConstraintJavaMigrationIntegrationTest.java @@ -13,7 +13,7 @@ import org.springframework.test.context.junit4.SpringRunner; @SpringBootTest(properties = { "flyway.locations[0]=db/migration", "flyway.locations[1]=com/baeldung/springflyway/migration" }) -public class CustomerRepositoryUniqueConstraintJavaMigrationTest { +public class CustomerRepositoryUniqueConstraintJavaMigrationIntegrationTest { @Autowired CustomerRepository customerRepository; diff --git a/flyway/spring-flyway/src/test/java/com/baeldung/springflyway/CustomerRepositoryUniqueConstraintMigrationTest.java b/flyway/spring-flyway/src/test/java/com/baeldung/springflyway/CustomerRepositoryUniqueConstraintMigrationIntegrationTest.java similarity index 92% rename from flyway/spring-flyway/src/test/java/com/baeldung/springflyway/CustomerRepositoryUniqueConstraintMigrationTest.java rename to flyway/spring-flyway/src/test/java/com/baeldung/springflyway/CustomerRepositoryUniqueConstraintMigrationIntegrationTest.java index 9fa2dee42d..e9ac34b384 100644 --- a/flyway/spring-flyway/src/test/java/com/baeldung/springflyway/CustomerRepositoryUniqueConstraintMigrationTest.java +++ b/flyway/spring-flyway/src/test/java/com/baeldung/springflyway/CustomerRepositoryUniqueConstraintMigrationIntegrationTest.java @@ -11,7 +11,7 @@ import org.springframework.test.context.junit4.SpringRunner; @RunWith(SpringRunner.class) @SpringBootTest -public class CustomerRepositoryUniqueConstraintMigrationTest { +public class CustomerRepositoryUniqueConstraintMigrationIntegrationTest { @Autowired CustomerRepository customerRepository; diff --git a/libraries/src/test/java/com/baeldung/neuroph/XORTest.java b/libraries/src/test/java/com/baeldung/neuroph/XORIntegrationTest.java similarity index 97% rename from libraries/src/test/java/com/baeldung/neuroph/XORTest.java rename to libraries/src/test/java/com/baeldung/neuroph/XORIntegrationTest.java index 4a6ecf8e46..5da1d166f6 100644 --- a/libraries/src/test/java/com/baeldung/neuroph/XORTest.java +++ b/libraries/src/test/java/com/baeldung/neuroph/XORIntegrationTest.java @@ -7,7 +7,7 @@ import org.neuroph.core.NeuralNetwork; import static org.junit.Assert.*; -public class XORTest { +public class XORIntegrationTest { private NeuralNetwork ann = null; private void print(String input, double output, double actual) { diff --git a/pom.xml b/pom.xml index cf01712cba..b3da4655d6 100644 --- a/pom.xml +++ b/pom.xml @@ -142,7 +142,6 @@ spark-java spring-5-mvc - spring-acl spring-activiti spring-akka spring-amqp @@ -152,7 +151,7 @@ spring-batch spring-bom spring-boot - spring-boot-keycloak + spring-boot-keycloak spring-boot-bootstrap spring-cloud-data-flow spring-cloud diff --git a/spring-acl/pom.xml b/spring-acl/pom.xml deleted file mode 100644 index 3bcc0cf596..0000000000 --- a/spring-acl/pom.xml +++ /dev/null @@ -1,66 +0,0 @@ - - - 4.0.0 - - com.baeldung - spring-acl - 0.0.1-SNAPSHOT - war - - spring-acl - Spring ACL - - - parent-boot-5 - com.baeldung - 0.0.1-SNAPSHOT - ../parent-boot-5 - - - - - - org.springframework.boot - spring-boot-starter-data-jpa - - - - com.h2database - h2 - - - - org.springframework - spring-test - test - - - - org.springframework.security - spring-security-test - test - - - - org.springframework.security - spring-security-acl - - - org.springframework.security - spring-security-config - - - org.springframework - spring-context-support - - - net.sf.ehcache - ehcache-core - 2.6.11 - jar - - - - - diff --git a/spring-acl/src/main/java/org/baeldung/acl/config/ACLContext.java b/spring-acl/src/main/java/org/baeldung/acl/config/ACLContext.java deleted file mode 100644 index 63a4ea58ef..0000000000 --- a/spring-acl/src/main/java/org/baeldung/acl/config/ACLContext.java +++ /dev/null @@ -1,80 +0,0 @@ -package org.baeldung.acl.config; - -import javax.sql.DataSource; - -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.autoconfigure.EnableAutoConfiguration; -import org.springframework.cache.ehcache.EhCacheFactoryBean; -import org.springframework.cache.ehcache.EhCacheManagerFactoryBean; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; -import org.springframework.security.access.expression.method.DefaultMethodSecurityExpressionHandler; -import org.springframework.security.access.expression.method.MethodSecurityExpressionHandler; -import org.springframework.security.acls.AclPermissionCacheOptimizer; -import org.springframework.security.acls.AclPermissionEvaluator; -import org.springframework.security.acls.domain.AclAuthorizationStrategy; -import org.springframework.security.acls.domain.AclAuthorizationStrategyImpl; -import org.springframework.security.acls.domain.ConsoleAuditLogger; -import org.springframework.security.acls.domain.DefaultPermissionGrantingStrategy; -import org.springframework.security.acls.domain.EhCacheBasedAclCache; -import org.springframework.security.acls.jdbc.BasicLookupStrategy; -import org.springframework.security.acls.jdbc.JdbcMutableAclService; -import org.springframework.security.acls.jdbc.LookupStrategy; -import org.springframework.security.acls.model.PermissionGrantingStrategy; -import org.springframework.security.core.authority.SimpleGrantedAuthority; - -@Configuration -@EnableAutoConfiguration -public class ACLContext { - - @Autowired - DataSource dataSource; - - @Bean - public EhCacheBasedAclCache aclCache() { - return new EhCacheBasedAclCache(aclEhCacheFactoryBean().getObject(), permissionGrantingStrategy(), aclAuthorizationStrategy()); - } - - @Bean - public EhCacheFactoryBean aclEhCacheFactoryBean() { - EhCacheFactoryBean ehCacheFactoryBean = new EhCacheFactoryBean(); - ehCacheFactoryBean.setCacheManager(aclCacheManager().getObject()); - ehCacheFactoryBean.setCacheName("aclCache"); - return ehCacheFactoryBean; - } - - @Bean - public EhCacheManagerFactoryBean aclCacheManager() { - return new EhCacheManagerFactoryBean(); - } - - @Bean - public PermissionGrantingStrategy permissionGrantingStrategy() { - return new DefaultPermissionGrantingStrategy(new ConsoleAuditLogger()); - } - - @Bean - public AclAuthorizationStrategy aclAuthorizationStrategy() { - return new AclAuthorizationStrategyImpl(new SimpleGrantedAuthority("ROLE_ADMIN")); - } - - @Bean - public MethodSecurityExpressionHandler defaultMethodSecurityExpressionHandler() { - DefaultMethodSecurityExpressionHandler expressionHandler = new DefaultMethodSecurityExpressionHandler(); - AclPermissionEvaluator permissionEvaluator = new AclPermissionEvaluator(aclService()); - expressionHandler.setPermissionEvaluator(permissionEvaluator); - expressionHandler.setPermissionCacheOptimizer(new AclPermissionCacheOptimizer(aclService())); - return expressionHandler; - } - - @Bean - public LookupStrategy lookupStrategy() { - return new BasicLookupStrategy(dataSource, aclCache(), aclAuthorizationStrategy(), new ConsoleAuditLogger()); - } - - @Bean - public JdbcMutableAclService aclService() { - return new JdbcMutableAclService(dataSource, lookupStrategy(), aclCache()); - } - -} \ No newline at end of file diff --git a/spring-acl/src/main/java/org/baeldung/acl/config/AclMethodSecurityConfiguration.java b/spring-acl/src/main/java/org/baeldung/acl/config/AclMethodSecurityConfiguration.java deleted file mode 100644 index 110c4a6d24..0000000000 --- a/spring-acl/src/main/java/org/baeldung/acl/config/AclMethodSecurityConfiguration.java +++ /dev/null @@ -1,21 +0,0 @@ -package org.baeldung.acl.config; - -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.context.annotation.Configuration; -import org.springframework.security.access.expression.method.MethodSecurityExpressionHandler; -import org.springframework.security.config.annotation.method.configuration.EnableGlobalMethodSecurity; -import org.springframework.security.config.annotation.method.configuration.GlobalMethodSecurityConfiguration; - -@Configuration -@EnableGlobalMethodSecurity(prePostEnabled = true, securedEnabled = true) -public class AclMethodSecurityConfiguration extends GlobalMethodSecurityConfiguration { - - @Autowired - MethodSecurityExpressionHandler defaultMethodSecurityExpressionHandler; - - @Override - protected MethodSecurityExpressionHandler createExpressionHandler() { - return defaultMethodSecurityExpressionHandler; - } - -} diff --git a/spring-acl/src/main/java/org/baeldung/acl/config/JPAPersistenceConfig.java b/spring-acl/src/main/java/org/baeldung/acl/config/JPAPersistenceConfig.java deleted file mode 100644 index 9b87efa92c..0000000000 --- a/spring-acl/src/main/java/org/baeldung/acl/config/JPAPersistenceConfig.java +++ /dev/null @@ -1,16 +0,0 @@ -package org.baeldung.acl.config; - -import org.springframework.boot.autoconfigure.domain.EntityScan; -import org.springframework.context.annotation.Configuration; -import org.springframework.context.annotation.PropertySource; -import org.springframework.data.jpa.repository.config.EnableJpaRepositories; -import org.springframework.transaction.annotation.EnableTransactionManagement; - -@Configuration -@EnableTransactionManagement -@EnableJpaRepositories(basePackages = "org.baeldung.acl.persistence.dao") -@PropertySource("classpath:org.baeldung.acl.datasource.properties") -@EntityScan(basePackages={ "org.baeldung.acl.persistence.entity" }) -public class JPAPersistenceConfig { - -} diff --git a/spring-acl/src/main/java/org/baeldung/acl/persistence/dao/NoticeMessageRepository.java b/spring-acl/src/main/java/org/baeldung/acl/persistence/dao/NoticeMessageRepository.java deleted file mode 100644 index 8662c88d6c..0000000000 --- a/spring-acl/src/main/java/org/baeldung/acl/persistence/dao/NoticeMessageRepository.java +++ /dev/null @@ -1,24 +0,0 @@ -package org.baeldung.acl.persistence.dao; - -import java.util.List; - -import org.baeldung.acl.persistence.entity.NoticeMessage; -import org.springframework.data.jpa.repository.JpaRepository; -import org.springframework.data.repository.query.Param; -import org.springframework.security.access.prepost.PostAuthorize; -import org.springframework.security.access.prepost.PostFilter; -import org.springframework.security.access.prepost.PreAuthorize; - -public interface NoticeMessageRepository extends JpaRepository{ - - @PostFilter("hasPermission(filterObject, 'READ')") - List findAll(); - - @PostAuthorize("hasPermission(returnObject, 'READ')") - NoticeMessage findById(Integer id); - - @SuppressWarnings("unchecked") - @PreAuthorize("hasPermission(#noticeMessage, 'WRITE')") - NoticeMessage save(@Param("noticeMessage")NoticeMessage noticeMessage); - -} diff --git a/spring-acl/src/main/java/org/baeldung/acl/persistence/entity/NoticeMessage.java b/spring-acl/src/main/java/org/baeldung/acl/persistence/entity/NoticeMessage.java deleted file mode 100644 index 23f01a8edb..0000000000 --- a/spring-acl/src/main/java/org/baeldung/acl/persistence/entity/NoticeMessage.java +++ /dev/null @@ -1,29 +0,0 @@ -package org.baeldung.acl.persistence.entity; - -import javax.persistence.Column; -import javax.persistence.Entity; -import javax.persistence.Id; -import javax.persistence.Table; - -@Entity -@Table(name="system_message") -public class NoticeMessage { - - @Id - @Column - private Integer id; - @Column - private String content; - public Integer getId() { - return id; - } - public void setId(Integer id) { - this.id = id; - } - public String getContent() { - return content; - } - public void setContent(String content) { - this.content = content; - } -} \ No newline at end of file diff --git a/spring-acl/src/main/resources/acl-data.sql b/spring-acl/src/main/resources/acl-data.sql deleted file mode 100644 index 6c01eaacc2..0000000000 --- a/spring-acl/src/main/resources/acl-data.sql +++ /dev/null @@ -1,28 +0,0 @@ -INSERT INTO system_message(id,content) VALUES (1,'First Level Message'); -INSERT INTO system_message(id,content) VALUES (2,'Second Level Message'); -INSERT INTO system_message(id,content) VALUES (3,'Third Level Message'); - -INSERT INTO acl_class (id, class) VALUES -(1, 'org.baeldung.acl.persistence.entity.NoticeMessage'); - -INSERT INTO acl_sid (id, principal, sid) VALUES -(1, 1, 'manager'), -(2, 1, 'hr'), -(3, 1, 'admin'), -(4, 0, 'ROLE_EDITOR'); - -INSERT INTO acl_object_identity (id, object_id_class, object_id_identity, parent_object, owner_sid, entries_inheriting) VALUES -(1, 1, 1, NULL, 3, 0), -(2, 1, 2, NULL, 3, 0), -(3, 1, 3, NULL, 3, 0) -; - -INSERT INTO acl_entry (id, acl_object_identity, ace_order, sid, mask, granting, audit_success, audit_failure) VALUES -(1, 1, 1, 1, 1, 1, 1, 1), -(2, 1, 2, 1, 2, 1, 1, 1), -(3, 1, 3, 4, 1, 1, 1, 1), -(4, 2, 1, 2, 1, 1, 1, 1), -(5, 2, 2, 4, 1, 1, 1, 1), -(6, 3, 1, 4, 1, 1, 1, 1), -(7, 3, 2, 4, 2, 1, 1, 1) -; \ No newline at end of file diff --git a/spring-acl/src/main/resources/acl-schema.sql b/spring-acl/src/main/resources/acl-schema.sql deleted file mode 100644 index 58e9394b2b..0000000000 --- a/spring-acl/src/main/resources/acl-schema.sql +++ /dev/null @@ -1,58 +0,0 @@ -create table system_message (id integer not null, content varchar(255), primary key (id)); - -CREATE TABLE IF NOT EXISTS acl_sid ( - id bigint(20) NOT NULL AUTO_INCREMENT, - principal tinyint(1) NOT NULL, - sid varchar(100) NOT NULL, - PRIMARY KEY (id), - UNIQUE KEY unique_uk_1 (sid,principal) -); - -CREATE TABLE IF NOT EXISTS acl_class ( - id bigint(20) NOT NULL AUTO_INCREMENT, - class varchar(255) NOT NULL, - PRIMARY KEY (id), - UNIQUE KEY unique_uk_2 (class) -); - -CREATE TABLE IF NOT EXISTS acl_entry ( - id bigint(20) NOT NULL AUTO_INCREMENT, - acl_object_identity bigint(20) NOT NULL, - ace_order int(11) NOT NULL, - sid bigint(20) NOT NULL, - mask int(11) NOT NULL, - granting tinyint(1) NOT NULL, - audit_success tinyint(1) NOT NULL, - audit_failure tinyint(1) NOT NULL, - PRIMARY KEY (id), - UNIQUE KEY unique_uk_4 (acl_object_identity,ace_order) -); - -CREATE TABLE IF NOT EXISTS acl_object_identity ( - id bigint(20) NOT NULL AUTO_INCREMENT, - object_id_class bigint(20) NOT NULL, - object_id_identity bigint(20) NOT NULL, - parent_object bigint(20) DEFAULT NULL, - owner_sid bigint(20) DEFAULT NULL, - entries_inheriting tinyint(1) NOT NULL, - PRIMARY KEY (id), - UNIQUE KEY unique_uk_3 (object_id_class,object_id_identity) -); - -ALTER TABLE acl_entry -ADD FOREIGN KEY (acl_object_identity) REFERENCES acl_object_identity(id); - -ALTER TABLE acl_entry -ADD FOREIGN KEY (sid) REFERENCES acl_sid(id); - --- --- Constraints for table acl_object_identity --- -ALTER TABLE acl_object_identity -ADD FOREIGN KEY (parent_object) REFERENCES acl_object_identity (id); - -ALTER TABLE acl_object_identity -ADD FOREIGN KEY (object_id_class) REFERENCES acl_class (id); - -ALTER TABLE acl_object_identity -ADD FOREIGN KEY (owner_sid) REFERENCES acl_sid (id); \ No newline at end of file diff --git a/spring-acl/src/main/resources/org.baeldung.acl.datasource.properties b/spring-acl/src/main/resources/org.baeldung.acl.datasource.properties deleted file mode 100644 index 739dd3f07c..0000000000 --- a/spring-acl/src/main/resources/org.baeldung.acl.datasource.properties +++ /dev/null @@ -1,12 +0,0 @@ -spring.datasource.url=jdbc:h2:mem:testdb;DB_CLOSE_ON_EXIT=FALSE -spring.datasource.username=sa -spring.datasource.password= -spring.datasource.driverClassName=org.h2.Driver -spring.jpa.hibernate.ddl-auto=update -spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.H2Dialect - -spring.h2.console.path=/myconsole -spring.h2.console.enabled=true -spring.datasource.initialize=true -spring.datasource.schema=classpath:acl-schema.sql -spring.datasource.data=classpath:acl-data.sql \ No newline at end of file diff --git a/spring-acl/src/test/java/org/baeldung/acl/SpringAclTest.java b/spring-acl/src/test/java/org/baeldung/acl/SpringAclTest.java deleted file mode 100644 index fd9069d9bc..0000000000 --- a/spring-acl/src/test/java/org/baeldung/acl/SpringAclTest.java +++ /dev/null @@ -1,119 +0,0 @@ -package org.baeldung.acl; - -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertNotNull; - -import java.util.List; - -import org.baeldung.acl.persistence.dao.NoticeMessageRepository; -import org.baeldung.acl.persistence.entity.NoticeMessage; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.context.annotation.ComponentScan; -import org.springframework.context.annotation.Configuration; -import org.springframework.security.access.AccessDeniedException; -import org.springframework.security.test.context.support.WithMockUser; -import org.springframework.security.test.context.support.WithSecurityContextTestExecutionListener; -import org.springframework.test.context.ContextConfiguration; -import org.springframework.test.context.TestExecutionListeners; -import org.springframework.test.context.junit4.AbstractJUnit4SpringContextTests; -import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; -import org.springframework.test.context.support.DependencyInjectionTestExecutionListener; -import org.springframework.test.context.support.DirtiesContextTestExecutionListener; -import org.springframework.test.context.transaction.TransactionalTestExecutionListener; -import org.springframework.test.context.web.ServletTestExecutionListener; - -@RunWith(SpringJUnit4ClassRunner.class) -@ContextConfiguration -@TestExecutionListeners(listeners={ServletTestExecutionListener.class, - DependencyInjectionTestExecutionListener.class, - DirtiesContextTestExecutionListener.class, - TransactionalTestExecutionListener.class, - WithSecurityContextTestExecutionListener.class}) -public class SpringAclTest extends AbstractJUnit4SpringContextTests{ - - private static Integer FIRST_MESSAGE_ID = 1; - private static Integer SECOND_MESSAGE_ID = 2; - private static Integer THIRD_MESSAGE_ID = 3; - private static String EDITTED_CONTENT = "EDITED"; - - @Configuration - @ComponentScan("org.baeldung.acl.*") - public static class SpringConfig { - - } - - @Autowired - NoticeMessageRepository repo; - - @Test - @WithMockUser(username="manager") - public void givenUsernameManager_whenFindAllMessage_thenReturnFirstMessage(){ - List details = repo.findAll(); - assertNotNull(details); - assertEquals(1,details.size()); - assertEquals(FIRST_MESSAGE_ID,details.get(0).getId()); - } - - @Test - @WithMockUser(username="manager") - public void givenUsernameManager_whenFindFirstMessageByIdAndUpdateFirstMessageContent_thenOK(){ - NoticeMessage firstMessage = repo.findById(FIRST_MESSAGE_ID); - assertNotNull(firstMessage); - assertEquals(FIRST_MESSAGE_ID,firstMessage.getId()); - - firstMessage.setContent(EDITTED_CONTENT); - repo.save(firstMessage); - - NoticeMessage editedFirstMessage = repo.findById(FIRST_MESSAGE_ID); - assertNotNull(editedFirstMessage); - assertEquals(FIRST_MESSAGE_ID,editedFirstMessage.getId()); - assertEquals(EDITTED_CONTENT,editedFirstMessage.getContent()); - } - - @Test - @WithMockUser(username="hr") - public void givenUsernameHr_whenFindMessageById2_thenOK(){ - NoticeMessage secondMessage = repo.findById(SECOND_MESSAGE_ID); - assertNotNull(secondMessage); - assertEquals(SECOND_MESSAGE_ID,secondMessage.getId()); - } - - @Test(expected=AccessDeniedException.class) - @WithMockUser(username="hr") - public void givenUsernameHr_whenUpdateMessageWithId2_thenFail(){ - NoticeMessage secondMessage = new NoticeMessage(); - secondMessage.setId(SECOND_MESSAGE_ID); - secondMessage.setContent(EDITTED_CONTENT); - repo.save(secondMessage); - } - - @Test - @WithMockUser(roles={"EDITOR"}) - public void givenRoleEditor_whenFindAllMessage_thenReturnThreeMessage(){ - List details = repo.findAll(); - assertNotNull(details); - assertEquals(3,details.size()); - } - - @Test - @WithMockUser(roles={"EDITOR"}) - public void givenRoleEditor_whenUpdateThirdMessage_thenOK(){ - NoticeMessage thirdMessage = new NoticeMessage(); - thirdMessage.setId(THIRD_MESSAGE_ID); - thirdMessage.setContent(EDITTED_CONTENT); - repo.save(thirdMessage); - } - - @Test(expected=AccessDeniedException.class) - @WithMockUser(roles={"EDITOR"}) - public void givenRoleEditor_whenFindFirstMessageByIdAndUpdateFirstMessageContent_thenFail(){ - NoticeMessage firstMessage = repo.findById(FIRST_MESSAGE_ID); - assertNotNull(firstMessage); - assertEquals(FIRST_MESSAGE_ID,firstMessage.getId()); - firstMessage.setContent(EDITTED_CONTENT); - repo.save(firstMessage); - } -} - \ No newline at end of file diff --git a/spring-security-acl/src/test/java/org/baeldung/acl/SpringAclTest.java b/spring-security-acl/src/test/java/org/baeldung/acl/SpringACLIntegrationTest.java similarity index 98% rename from spring-security-acl/src/test/java/org/baeldung/acl/SpringAclTest.java rename to spring-security-acl/src/test/java/org/baeldung/acl/SpringACLIntegrationTest.java index b864639d74..1460d4f47b 100644 --- a/spring-security-acl/src/test/java/org/baeldung/acl/SpringAclTest.java +++ b/spring-security-acl/src/test/java/org/baeldung/acl/SpringACLIntegrationTest.java @@ -31,7 +31,7 @@ import org.springframework.test.context.web.ServletTestExecutionListener; DirtiesContextTestExecutionListener.class, TransactionalTestExecutionListener.class, WithSecurityContextTestExecutionListener.class}) -public class SpringAclTest extends AbstractJUnit4SpringContextTests{ +public class SpringACLIntegrationTest extends AbstractJUnit4SpringContextTests{ private static Integer FIRST_MESSAGE_ID = 1; private static Integer SECOND_MESSAGE_ID = 2; From cee5dcf7b26ee7a7125c0c36e129deca19470c92 Mon Sep 17 00:00:00 2001 From: Eugen Paraschiv Date: Wed, 13 Dec 2017 14:08:18 +0200 Subject: [PATCH 191/236] adding new module --- pom.xml | 1 + spring-5-reactive/.gitignore | 12 ++ spring-5-reactive/README.md | 15 ++ spring-5-reactive/pom.xml | 203 ++++++++++++++++++ .../java/com/baeldung/Spring5Application.java | 15 ++ .../baeldung/SpringSecurity5Application.java | 34 +++ .../java/com/baeldung/functional/Actor.java | 23 ++ ...Spring5URLPatternUsingRouterFunctions.java | 61 ++++++ .../com/baeldung/functional/FormHandler.java | 41 ++++ .../FunctionalSpringBootApplication.java | 87 ++++++++ .../functional/FunctionalWebApplication.java | 80 +++++++ .../functional/IndexRewriteFilter.java | 27 +++ .../com/baeldung/functional/MyService.java | 11 + .../com/baeldung/functional/RootServlet.java | 82 +++++++ .../main/java/com/baeldung/jsonb/Person.java | 127 +++++++++++ .../com/baeldung/jsonb/PersonController.java | 58 +++++ .../baeldung/jsonb/Spring5Application.java | 30 +++ .../jupiter/MethodParameterFactory.java | 46 ++++ .../jupiter/ParameterAutowireUtils.java | 44 ++++ .../com/baeldung/jupiter/SpringExtension.java | 94 ++++++++ .../baeldung/jupiter/SpringJUnit5Config.java | 39 ++++ .../java/com/baeldung/jupiter/TestConfig.java | 20 ++ .../baeldung/persistence/DataSetupBean.java | 27 +++ .../baeldung/persistence/FooRepository.java | 10 + .../baeldung/security/GreetController.java | 37 ++++ .../com/baeldung/security/GreetService.java | 15 ++ .../com/baeldung/security/SecurityConfig.java | 42 ++++ .../src/main/java/com/baeldung/web/Foo.java | 84 ++++++++ .../java/com/baeldung/web/FooController.java | 53 +++++ .../baeldung/web/PathPatternController.java | 39 ++++ .../java/com/baeldung/web/reactive/Task.java | 28 +++ .../reactive/client/WebClientController.java | 85 ++++++++ .../src/main/resources/application.properties | 3 + .../src/main/resources/files/hello.txt | 1 + .../src/main/resources/files/test/test.txt | 1 + .../src/main/webapp/WEB-INF/web.xml | 21 ++ .../com/baeldung/Example1IntegrationTest.java | 29 +++ .../com/baeldung/Example2IntegrationTest.java | 29 +++ .../com/baeldung/ParallelIntegrationTest.java | 24 +++ .../Spring5ApplicationIntegrationTest.java | 16 ++ ...pring5JUnit4ConcurrentIntegrationTest.java | 52 +++++ .../functional/BeanRegistrationTest.java | 42 ++++ ...ng5URLPatternUsingRouterFunctionsTest.java | 110 ++++++++++ ...nctionalWebApplicationIntegrationTest.java | 141 ++++++++++++ .../baeldung/jsonb/JsonbIntegrationTest.java | 43 ++++ .../com/baeldung/jupiter/EnabledOnJava8.java | 18 ++ .../jupiter/Spring5EnabledAnnotationTest.java | 50 +++++ ...nit5ComposedAnnotationIntegrationTest.java | 38 ++++ .../jupiter/Spring5JUnit5IntegrationTest.java | 25 +++ .../Spring5JUnit5ParallelIntegrationTest.java | 25 +++ ...pring5Java8NewFeaturesIntegrationTest.java | 31 +++ ...g5ReactiveServerClientIntegrationTest.java | 94 ++++++++ .../jupiter/SpringJUnitConfigTest.java | 33 +++ .../jupiter/SpringJUnitWebConfigTest.java | 34 +++ .../com/baeldung/security/SecurityTest.java | 48 +++++ ...ernsUsingHandlerMethodIntegrationTest.java | 101 +++++++++ .../web/client/WebTestClientTest.java | 60 ++++++ .../src/test/resources/baeldung-weekly.png | Bin 0 -> 22275 bytes .../baeldung/web/PathPatternController.java | 1 - 59 files changed, 2639 insertions(+), 1 deletion(-) create mode 100644 spring-5-reactive/.gitignore create mode 100644 spring-5-reactive/README.md create mode 100644 spring-5-reactive/pom.xml create mode 100644 spring-5-reactive/src/main/java/com/baeldung/Spring5Application.java create mode 100644 spring-5-reactive/src/main/java/com/baeldung/SpringSecurity5Application.java create mode 100644 spring-5-reactive/src/main/java/com/baeldung/functional/Actor.java create mode 100644 spring-5-reactive/src/main/java/com/baeldung/functional/ExploreSpring5URLPatternUsingRouterFunctions.java create mode 100644 spring-5-reactive/src/main/java/com/baeldung/functional/FormHandler.java create mode 100644 spring-5-reactive/src/main/java/com/baeldung/functional/FunctionalSpringBootApplication.java create mode 100644 spring-5-reactive/src/main/java/com/baeldung/functional/FunctionalWebApplication.java create mode 100644 spring-5-reactive/src/main/java/com/baeldung/functional/IndexRewriteFilter.java create mode 100644 spring-5-reactive/src/main/java/com/baeldung/functional/MyService.java create mode 100644 spring-5-reactive/src/main/java/com/baeldung/functional/RootServlet.java create mode 100644 spring-5-reactive/src/main/java/com/baeldung/jsonb/Person.java create mode 100644 spring-5-reactive/src/main/java/com/baeldung/jsonb/PersonController.java create mode 100644 spring-5-reactive/src/main/java/com/baeldung/jsonb/Spring5Application.java create mode 100644 spring-5-reactive/src/main/java/com/baeldung/jupiter/MethodParameterFactory.java create mode 100644 spring-5-reactive/src/main/java/com/baeldung/jupiter/ParameterAutowireUtils.java create mode 100644 spring-5-reactive/src/main/java/com/baeldung/jupiter/SpringExtension.java create mode 100644 spring-5-reactive/src/main/java/com/baeldung/jupiter/SpringJUnit5Config.java create mode 100644 spring-5-reactive/src/main/java/com/baeldung/jupiter/TestConfig.java create mode 100644 spring-5-reactive/src/main/java/com/baeldung/persistence/DataSetupBean.java create mode 100644 spring-5-reactive/src/main/java/com/baeldung/persistence/FooRepository.java create mode 100644 spring-5-reactive/src/main/java/com/baeldung/security/GreetController.java create mode 100644 spring-5-reactive/src/main/java/com/baeldung/security/GreetService.java create mode 100644 spring-5-reactive/src/main/java/com/baeldung/security/SecurityConfig.java create mode 100644 spring-5-reactive/src/main/java/com/baeldung/web/Foo.java create mode 100644 spring-5-reactive/src/main/java/com/baeldung/web/FooController.java create mode 100644 spring-5-reactive/src/main/java/com/baeldung/web/PathPatternController.java create mode 100644 spring-5-reactive/src/main/java/com/baeldung/web/reactive/Task.java create mode 100644 spring-5-reactive/src/main/java/com/baeldung/web/reactive/client/WebClientController.java create mode 100644 spring-5-reactive/src/main/resources/application.properties create mode 100644 spring-5-reactive/src/main/resources/files/hello.txt create mode 100644 spring-5-reactive/src/main/resources/files/test/test.txt create mode 100644 spring-5-reactive/src/main/webapp/WEB-INF/web.xml create mode 100644 spring-5-reactive/src/test/java/com/baeldung/Example1IntegrationTest.java create mode 100644 spring-5-reactive/src/test/java/com/baeldung/Example2IntegrationTest.java create mode 100644 spring-5-reactive/src/test/java/com/baeldung/ParallelIntegrationTest.java create mode 100644 spring-5-reactive/src/test/java/com/baeldung/Spring5ApplicationIntegrationTest.java create mode 100644 spring-5-reactive/src/test/java/com/baeldung/Spring5JUnit4ConcurrentIntegrationTest.java create mode 100644 spring-5-reactive/src/test/java/com/baeldung/functional/BeanRegistrationTest.java create mode 100644 spring-5-reactive/src/test/java/com/baeldung/functional/ExploreSpring5URLPatternUsingRouterFunctionsTest.java create mode 100644 spring-5-reactive/src/test/java/com/baeldung/functional/FunctionalWebApplicationIntegrationTest.java create mode 100644 spring-5-reactive/src/test/java/com/baeldung/jsonb/JsonbIntegrationTest.java create mode 100644 spring-5-reactive/src/test/java/com/baeldung/jupiter/EnabledOnJava8.java create mode 100644 spring-5-reactive/src/test/java/com/baeldung/jupiter/Spring5EnabledAnnotationTest.java create mode 100644 spring-5-reactive/src/test/java/com/baeldung/jupiter/Spring5JUnit5ComposedAnnotationIntegrationTest.java create mode 100644 spring-5-reactive/src/test/java/com/baeldung/jupiter/Spring5JUnit5IntegrationTest.java create mode 100644 spring-5-reactive/src/test/java/com/baeldung/jupiter/Spring5JUnit5ParallelIntegrationTest.java create mode 100644 spring-5-reactive/src/test/java/com/baeldung/jupiter/Spring5Java8NewFeaturesIntegrationTest.java create mode 100644 spring-5-reactive/src/test/java/com/baeldung/jupiter/Spring5ReactiveServerClientIntegrationTest.java create mode 100644 spring-5-reactive/src/test/java/com/baeldung/jupiter/SpringJUnitConfigTest.java create mode 100644 spring-5-reactive/src/test/java/com/baeldung/jupiter/SpringJUnitWebConfigTest.java create mode 100644 spring-5-reactive/src/test/java/com/baeldung/security/SecurityTest.java create mode 100644 spring-5-reactive/src/test/java/com/baeldung/web/PathPatternsUsingHandlerMethodIntegrationTest.java create mode 100644 spring-5-reactive/src/test/java/com/baeldung/web/client/WebTestClientTest.java create mode 100644 spring-5-reactive/src/test/resources/baeldung-weekly.png diff --git a/pom.xml b/pom.xml index b3da4655d6..88f54be629 100644 --- a/pom.xml +++ b/pom.xml @@ -141,6 +141,7 @@ persistence-modules/solr spark-java + spring-5-reactive spring-5-mvc spring-activiti spring-akka diff --git a/spring-5-reactive/.gitignore b/spring-5-reactive/.gitignore new file mode 100644 index 0000000000..dec013dfa4 --- /dev/null +++ b/spring-5-reactive/.gitignore @@ -0,0 +1,12 @@ +#folders# +.idea +/target +/neoDb* +/data +/src/main/webapp/WEB-INF/classes +*/META-INF/* + +# Packaged files # +*.jar +*.war +*.ear \ No newline at end of file diff --git a/spring-5-reactive/README.md b/spring-5-reactive/README.md new file mode 100644 index 0000000000..400e343263 --- /dev/null +++ b/spring-5-reactive/README.md @@ -0,0 +1,15 @@ +## Spring REST Example Project + +### The Course +The "REST With Spring" Classes: http://bit.ly/restwithspring + +### Relevant Articles + +- [Concurrent Test Execution in Spring 5](http://www.baeldung.com/spring-5-concurrent-tests) +- [Introduction to the Functional Web Framework in Spring 5](http://www.baeldung.com/spring-5-functional-web) +- [Exploring the Spring 5 MVC URL Matching Improvements](http://www.baeldung.com/spring-5-mvc-url-matching) +- [Spring 5 WebClient](http://www.baeldung.com/spring-5-webclient) +- [Spring 5 Functional Bean Registration](http://www.baeldung.com/spring-5-functional-beans) +- [The SpringJUnitConfig and SpringJUnitWebConfig Annotations in Spring 5](http://www.baeldung.com/spring-5-junit-config) +- [Spring Security 5 for Reactive Applications](http://www.baeldung.com/spring-security-5-reactive) +- [Spring 5 Testing with @EnabledIf Annotation](https://github.com/eugenp/tutorials/tree/master/spring-5) diff --git a/spring-5-reactive/pom.xml b/spring-5-reactive/pom.xml new file mode 100644 index 0000000000..43d9a5ed94 --- /dev/null +++ b/spring-5-reactive/pom.xml @@ -0,0 +1,203 @@ + + + 4.0.0 + + com.baeldung + spring-5-reactive + 0.0.1-SNAPSHOT + jar + + spring-5 + spring 5 sample project about new features + + + org.springframework.boot + spring-boot-starter-parent + 2.0.0.M7 + + + + + + org.springframework.boot + spring-boot-starter-data-jpa + + + org.springframework.boot + spring-boot-starter-security + + + org.springframework.boot + spring-boot-starter-validation + + + org.springframework.boot + spring-boot-starter-web + + + org.springframework.boot + spring-boot-starter-webflux + + + org.projectreactor + reactor-spring + ${reactor-spring.version} + + + javax.json.bind + javax.json.bind-api + ${jsonb-api.version} + + + + + + + + + + + + + + + org.apache.geronimo.specs + geronimo-json_1.1_spec + ${geronimo-json_1.1_spec.version} + + + org.apache.johnzon + johnzon-jsonb + ${johnzon.version} + + + + org.apache.commons + commons-lang3 + + + + + + org.springframework.boot + spring-boot-devtools + runtime + + + com.h2database + h2 + runtime + + + + org.springframework + spring-test + + + org.springframework.boot + spring-boot-starter-test + test + + + org.springframework.security + spring-security-test + test + + + + org.apache.commons + commons-collections4 + 4.1 + test + + + + org.junit.jupiter + junit-jupiter-api + ${junit.jupiter.version} + + + org.junit.jupiter + junit-jupiter-engine + ${junit.jupiter.version} + test + + + org.junit.platform + junit-platform-surefire-provider + ${junit.platform.version} + test + + + org.junit.platform + junit-platform-runner + ${junit.platform.version} + test + + + + + + + + org.springframework.boot + spring-boot-maven-plugin + + com.baeldung.Spring5Application + JAR + + + + + org.apache.maven.plugins + maven-surefire-plugin + + 3 + true + methods + true + + **/*IntegrationTest.java + **/*LiveTest.java + + + + + + + + + spring-milestones + Spring Milestones + https://repo.spring.io/milestone + + false + + + + + + spring-milestones + Spring Milestones + https://repo.spring.io/milestone + + false + + + + + + UTF-8 + UTF-8 + 1.8 + 1.0.0 + 5.0.0 + 2.20 + 5.0.1.RELEASE + 1.0.1.RELEASE + 1.1.3 + 1.0 + 1.0 + + + diff --git a/spring-5-reactive/src/main/java/com/baeldung/Spring5Application.java b/spring-5-reactive/src/main/java/com/baeldung/Spring5Application.java new file mode 100644 index 0000000000..f321871646 --- /dev/null +++ b/spring-5-reactive/src/main/java/com/baeldung/Spring5Application.java @@ -0,0 +1,15 @@ +package com.baeldung; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.context.annotation.ComponentScan; + +@SpringBootApplication +@ComponentScan(basePackages = { "com.baeldung.web" }) +public class Spring5Application { + + public static void main(String[] args) { + SpringApplication.run(Spring5Application.class, args); + } + +} diff --git a/spring-5-reactive/src/main/java/com/baeldung/SpringSecurity5Application.java b/spring-5-reactive/src/main/java/com/baeldung/SpringSecurity5Application.java new file mode 100644 index 0000000000..02c91a1879 --- /dev/null +++ b/spring-5-reactive/src/main/java/com/baeldung/SpringSecurity5Application.java @@ -0,0 +1,34 @@ +package com.baeldung; + +import org.springframework.context.ApplicationContext; +import org.springframework.context.annotation.AnnotationConfigApplicationContext; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.ComponentScan; +import org.springframework.http.server.reactive.HttpHandler; +import org.springframework.http.server.reactive.ReactorHttpHandlerAdapter; +import org.springframework.web.reactive.config.EnableWebFlux; +import org.springframework.web.server.adapter.WebHttpHandlerBuilder; +import reactor.ipc.netty.NettyContext; +import reactor.ipc.netty.http.server.HttpServer; + +@ComponentScan(basePackages = {"com.baeldung.security"}) +@EnableWebFlux +public class SpringSecurity5Application { + + public static void main(String[] args) { + try (AnnotationConfigApplicationContext context = + new AnnotationConfigApplicationContext(SpringSecurity5Application.class)) { + context.getBean(NettyContext.class).onClose().block(); + } + } + + @Bean + public NettyContext nettyContext(ApplicationContext context) { + HttpHandler handler = WebHttpHandlerBuilder.applicationContext(context) + .build(); + ReactorHttpHandlerAdapter adapter = new ReactorHttpHandlerAdapter(handler); + HttpServer httpServer = HttpServer.create("localhost", 8080); + return httpServer.newHandler(adapter).block(); + } + +} diff --git a/spring-5-reactive/src/main/java/com/baeldung/functional/Actor.java b/spring-5-reactive/src/main/java/com/baeldung/functional/Actor.java new file mode 100644 index 0000000000..23c88b89e1 --- /dev/null +++ b/spring-5-reactive/src/main/java/com/baeldung/functional/Actor.java @@ -0,0 +1,23 @@ +package com.baeldung.functional; + +class Actor { + private String firstname; + private String lastname; + + public Actor() { + } + + public Actor(String firstname, String lastname) { + this.firstname = firstname; + this.lastname = lastname; + } + + public String getFirstname() { + return firstname; + } + + public String getLastname() { + return lastname; + } + +} diff --git a/spring-5-reactive/src/main/java/com/baeldung/functional/ExploreSpring5URLPatternUsingRouterFunctions.java b/spring-5-reactive/src/main/java/com/baeldung/functional/ExploreSpring5URLPatternUsingRouterFunctions.java new file mode 100644 index 0000000000..2a6d04538c --- /dev/null +++ b/spring-5-reactive/src/main/java/com/baeldung/functional/ExploreSpring5URLPatternUsingRouterFunctions.java @@ -0,0 +1,61 @@ +package com.baeldung.functional; + +import static org.springframework.web.reactive.function.BodyInserters.fromObject; +import static org.springframework.web.reactive.function.server.RequestPredicates.GET; +import static org.springframework.web.reactive.function.server.RouterFunctions.route; +import static org.springframework.web.reactive.function.server.RouterFunctions.toHttpHandler; +import static org.springframework.web.reactive.function.server.ServerResponse.ok; + +import org.apache.catalina.Context; +import org.apache.catalina.startup.Tomcat; +import org.springframework.boot.web.embedded.tomcat.TomcatWebServer; +import org.springframework.boot.web.server.WebServer; +import org.springframework.core.io.ClassPathResource; +import org.springframework.http.server.reactive.HttpHandler; +import org.springframework.http.server.reactive.ServletHttpHandlerAdapter; +import org.springframework.web.reactive.function.server.RouterFunction; +import org.springframework.web.reactive.function.server.RouterFunctions; +import org.springframework.web.reactive.function.server.ServerResponse; +import org.springframework.web.server.WebHandler; +import org.springframework.web.server.adapter.WebHttpHandlerBuilder; + +public class ExploreSpring5URLPatternUsingRouterFunctions { + + private RouterFunction routingFunction() { + + return route(GET("/p?ths"), serverRequest -> ok().body(fromObject("/p?ths"))).andRoute(GET("/test/{*id}"), serverRequest -> ok().body(fromObject(serverRequest.pathVariable("id")))) + .andRoute(GET("/*card"), serverRequest -> ok().body(fromObject("/*card path was accessed"))) + .andRoute(GET("/{var1}_{var2}"), serverRequest -> ok().body(fromObject(serverRequest.pathVariable("var1") + " , " + serverRequest.pathVariable("var2")))) + .andRoute(GET("/{baeldung:[a-z]+}"), serverRequest -> ok().body(fromObject("/{baeldung:[a-z]+} was accessed and baeldung=" + serverRequest.pathVariable("baeldung")))) + .and(RouterFunctions.resources("/files/{*filepaths}", new ClassPathResource("files/"))); + } + + WebServer start() throws Exception { + WebHandler webHandler = (WebHandler) toHttpHandler(routingFunction()); + HttpHandler httpHandler = WebHttpHandlerBuilder.webHandler(webHandler) + .filter(new IndexRewriteFilter()) + .build(); + + Tomcat tomcat = new Tomcat(); + tomcat.setHostname("localhost"); + tomcat.setPort(9090); + Context rootContext = tomcat.addContext("", System.getProperty("java.io.tmpdir")); + ServletHttpHandlerAdapter servlet = new ServletHttpHandlerAdapter(httpHandler); + Tomcat.addServlet(rootContext, "httpHandlerServlet", servlet); + rootContext.addServletMappingDecoded("/", "httpHandlerServlet"); + + TomcatWebServer server = new TomcatWebServer(tomcat); + server.start(); + return server; + + } + + public static void main(String[] args) { + try { + new FunctionalWebApplication().start(); + } catch (Exception e) { + e.printStackTrace(); + } + } + +} diff --git a/spring-5-reactive/src/main/java/com/baeldung/functional/FormHandler.java b/spring-5-reactive/src/main/java/com/baeldung/functional/FormHandler.java new file mode 100644 index 0000000000..05069735bb --- /dev/null +++ b/spring-5-reactive/src/main/java/com/baeldung/functional/FormHandler.java @@ -0,0 +1,41 @@ +package com.baeldung.functional; + +import org.springframework.core.io.buffer.DataBuffer; +import org.springframework.util.MultiValueMap; +import org.springframework.web.reactive.function.server.ServerRequest; +import org.springframework.web.reactive.function.server.ServerResponse; +import reactor.core.publisher.Mono; + +import java.util.List; +import java.util.concurrent.atomic.AtomicLong; + +import static org.springframework.web.reactive.function.BodyExtractors.toDataBuffers; +import static org.springframework.web.reactive.function.BodyExtractors.toFormData; +import static org.springframework.web.reactive.function.BodyInserters.fromObject; +import static org.springframework.web.reactive.function.server.ServerResponse.ok; + +public class FormHandler { + + Mono handleLogin(ServerRequest request) { + return request.body(toFormData()) + .map(MultiValueMap::toSingleValueMap) + .filter(formData -> "baeldung".equals(formData.get("user"))) + .filter(formData -> "you_know_what_to_do".equals(formData.get("token"))) + .flatMap(formData -> ok().body(Mono.just("welcome back!"), String.class)) + .switchIfEmpty(ServerResponse.badRequest() + .build()); + } + + Mono handleUpload(ServerRequest request) { + return request.body(toDataBuffers()) + .collectList() + .flatMap(dataBuffers -> ok().body(fromObject(extractData(dataBuffers).toString()))); + } + + private AtomicLong extractData(List dataBuffers) { + AtomicLong atomicLong = new AtomicLong(0); + dataBuffers.forEach(d -> atomicLong.addAndGet(d.asByteBuffer() + .array().length)); + return atomicLong; + } +} diff --git a/spring-5-reactive/src/main/java/com/baeldung/functional/FunctionalSpringBootApplication.java b/spring-5-reactive/src/main/java/com/baeldung/functional/FunctionalSpringBootApplication.java new file mode 100644 index 0000000000..402b607b19 --- /dev/null +++ b/spring-5-reactive/src/main/java/com/baeldung/functional/FunctionalSpringBootApplication.java @@ -0,0 +1,87 @@ +package com.baeldung.functional; + +import static org.springframework.web.reactive.function.BodyInserters.fromObject; +import static org.springframework.web.reactive.function.server.RequestPredicates.GET; +import static org.springframework.web.reactive.function.server.RequestPredicates.POST; +import static org.springframework.web.reactive.function.server.RequestPredicates.path; +import static org.springframework.web.reactive.function.server.RouterFunctions.route; +import static org.springframework.web.reactive.function.server.RouterFunctions.toHttpHandler; +import static org.springframework.web.reactive.function.server.ServerResponse.ok; + +import java.util.Arrays; +import java.util.List; +import java.util.concurrent.CopyOnWriteArrayList; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.boot.web.servlet.ServletRegistrationBean; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.ComponentScan; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Profile; +import org.springframework.core.io.ClassPathResource; +import org.springframework.http.server.reactive.HttpHandler; +import org.springframework.security.config.annotation.web.builders.HttpSecurity; +import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; +import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter; +import org.springframework.web.reactive.function.server.RouterFunction; +import org.springframework.web.reactive.function.server.RouterFunctions; +import org.springframework.web.reactive.function.server.ServerResponse; +import org.springframework.web.server.WebHandler; +import org.springframework.web.server.adapter.WebHttpHandlerBuilder; + +import reactor.core.publisher.Flux; + +@SpringBootApplication +@ComponentScan(basePackages = { "com.baeldung.functional" }) +public class FunctionalSpringBootApplication { + + private static final Actor BRAD_PITT = new Actor("Brad", "Pitt"); + private static final Actor TOM_HANKS = new Actor("Tom", "Hanks"); + private static final List actors = new CopyOnWriteArrayList<>(Arrays.asList(BRAD_PITT, TOM_HANKS)); + + private RouterFunction routingFunction() { + FormHandler formHandler = new FormHandler(); + + RouterFunction restfulRouter = route(GET("/"), serverRequest -> ok().body(Flux.fromIterable(actors), Actor.class)).andRoute(POST("/"), serverRequest -> serverRequest.bodyToMono(Actor.class) + .doOnNext(actors::add) + .then(ok().build())); + + return route(GET("/test"), serverRequest -> ok().body(fromObject("helloworld"))).andRoute(POST("/login"), formHandler::handleLogin) + .andRoute(POST("/upload"), formHandler::handleUpload) + .and(RouterFunctions.resources("/files/**", new ClassPathResource("files/"))) + .andNest(path("/actor"), restfulRouter) + .filter((request, next) -> { + System.out.println("Before handler invocation: " + request.path()); + return next.handle(request); + }); + } + + @Bean + public ServletRegistrationBean servletRegistrationBean() throws Exception { + HttpHandler httpHandler = WebHttpHandlerBuilder.webHandler((WebHandler) toHttpHandler(routingFunction())) + .filter(new IndexRewriteFilter()) + .build(); + ServletRegistrationBean registrationBean = new ServletRegistrationBean<>(new RootServlet(httpHandler), "/"); + registrationBean.setLoadOnStartup(1); + registrationBean.setAsyncSupported(true); + return registrationBean; + } + + @Configuration + @EnableWebSecurity + @Profile("!https") + static class SecurityConfig extends WebSecurityConfigurerAdapter { + @Override + protected void configure(final HttpSecurity http) throws Exception { + http.authorizeRequests() + .anyRequest() + .permitAll(); + } + } + + public static void main(String[] args) { + SpringApplication.run(FunctionalSpringBootApplication.class, args); + } + +} diff --git a/spring-5-reactive/src/main/java/com/baeldung/functional/FunctionalWebApplication.java b/spring-5-reactive/src/main/java/com/baeldung/functional/FunctionalWebApplication.java new file mode 100644 index 0000000000..5a7d70d3db --- /dev/null +++ b/spring-5-reactive/src/main/java/com/baeldung/functional/FunctionalWebApplication.java @@ -0,0 +1,80 @@ +package com.baeldung.functional; + +import static org.springframework.web.reactive.function.BodyInserters.fromObject; +import static org.springframework.web.reactive.function.server.RequestPredicates.GET; +import static org.springframework.web.reactive.function.server.RequestPredicates.POST; +import static org.springframework.web.reactive.function.server.RequestPredicates.path; +import static org.springframework.web.reactive.function.server.RouterFunctions.route; +import static org.springframework.web.reactive.function.server.RouterFunctions.toHttpHandler; +import static org.springframework.web.reactive.function.server.ServerResponse.ok; + +import java.util.Arrays; +import java.util.List; +import java.util.concurrent.CopyOnWriteArrayList; + +import org.apache.catalina.Context; +import org.apache.catalina.startup.Tomcat; +import org.springframework.boot.web.embedded.tomcat.TomcatWebServer; +import org.springframework.boot.web.server.WebServer; +import org.springframework.core.io.ClassPathResource; +import org.springframework.http.server.reactive.HttpHandler; +import org.springframework.http.server.reactive.ServletHttpHandlerAdapter; +import org.springframework.web.reactive.function.server.RouterFunction; +import org.springframework.web.reactive.function.server.RouterFunctions; +import org.springframework.web.reactive.function.server.ServerResponse; +import org.springframework.web.server.WebHandler; +import org.springframework.web.server.adapter.WebHttpHandlerBuilder; + +import reactor.core.publisher.Flux; + +public class FunctionalWebApplication { + + private static final Actor BRAD_PITT = new Actor("Brad", "Pitt"); + private static final Actor TOM_HANKS = new Actor("Tom", "Hanks"); + private static final List actors = new CopyOnWriteArrayList<>(Arrays.asList(BRAD_PITT, TOM_HANKS)); + + private RouterFunction routingFunction() { + FormHandler formHandler = new FormHandler(); + + RouterFunction restfulRouter = route(GET("/"), serverRequest -> ok().body(Flux.fromIterable(actors), Actor.class)).andRoute(POST("/"), serverRequest -> serverRequest.bodyToMono(Actor.class) + .doOnNext(actors::add) + .then(ok().build())); + + return route(GET("/test"), serverRequest -> ok().body(fromObject("helloworld"))).andRoute(POST("/login"), formHandler::handleLogin) + .andRoute(POST("/upload"), formHandler::handleUpload) + .and(RouterFunctions.resources("/files/**", new ClassPathResource("files/"))) + .andNest(path("/actor"), restfulRouter) + .filter((request, next) -> { + System.out.println("Before handler invocation: " + request.path()); + return next.handle(request); + }); + } + + WebServer start() throws Exception { + WebHandler webHandler = (WebHandler) toHttpHandler(routingFunction()); + HttpHandler httpHandler = WebHttpHandlerBuilder.webHandler(webHandler) + .filter(new IndexRewriteFilter()) + .build(); + + Tomcat tomcat = new Tomcat(); + tomcat.setHostname("localhost"); + tomcat.setPort(9090); + Context rootContext = tomcat.addContext("", System.getProperty("java.io.tmpdir")); + ServletHttpHandlerAdapter servlet = new ServletHttpHandlerAdapter(httpHandler); + Tomcat.addServlet(rootContext, "httpHandlerServlet", servlet); + rootContext.addServletMappingDecoded("/", "httpHandlerServlet"); + + TomcatWebServer server = new TomcatWebServer(tomcat); + server.start(); + return server; + + } + + public static void main(String[] args) { + try { + new FunctionalWebApplication().start(); + } catch (Exception e) { + e.printStackTrace(); + } + } +} diff --git a/spring-5-reactive/src/main/java/com/baeldung/functional/IndexRewriteFilter.java b/spring-5-reactive/src/main/java/com/baeldung/functional/IndexRewriteFilter.java new file mode 100644 index 0000000000..3e91a0354b --- /dev/null +++ b/spring-5-reactive/src/main/java/com/baeldung/functional/IndexRewriteFilter.java @@ -0,0 +1,27 @@ +package com.baeldung.functional; + +import org.springframework.http.server.reactive.ServerHttpRequest; +import org.springframework.web.server.ServerWebExchange; +import org.springframework.web.server.WebFilter; +import org.springframework.web.server.WebFilterChain; +import reactor.core.publisher.Mono; + +class IndexRewriteFilter implements WebFilter { + + @Override + public Mono filter(ServerWebExchange serverWebExchange, WebFilterChain webFilterChain) { + ServerHttpRequest request = serverWebExchange.getRequest(); + if (request.getURI() + .getPath() + .equals("/")) { + return webFilterChain.filter(serverWebExchange.mutate() + .request(builder -> builder.method(request.getMethod()) + .contextPath(request.getPath() + .toString()) + .path("/test")) + .build()); + } + return webFilterChain.filter(serverWebExchange); + } + +} diff --git a/spring-5-reactive/src/main/java/com/baeldung/functional/MyService.java b/spring-5-reactive/src/main/java/com/baeldung/functional/MyService.java new file mode 100644 index 0000000000..b7b8b13d8b --- /dev/null +++ b/spring-5-reactive/src/main/java/com/baeldung/functional/MyService.java @@ -0,0 +1,11 @@ +package com.baeldung.functional; + +import java.util.Random; + +public class MyService { + + public int getRandomNumber() { + return (new Random().nextInt(10)); + } + +} diff --git a/spring-5-reactive/src/main/java/com/baeldung/functional/RootServlet.java b/spring-5-reactive/src/main/java/com/baeldung/functional/RootServlet.java new file mode 100644 index 0000000000..8fe24821de --- /dev/null +++ b/spring-5-reactive/src/main/java/com/baeldung/functional/RootServlet.java @@ -0,0 +1,82 @@ +package com.baeldung.functional; + +import static org.springframework.web.reactive.function.BodyExtractors.toDataBuffers; +import static org.springframework.web.reactive.function.BodyExtractors.toFormData; +import static org.springframework.web.reactive.function.BodyInserters.fromObject; +import static org.springframework.web.reactive.function.server.RequestPredicates.GET; +import static org.springframework.web.reactive.function.server.RequestPredicates.POST; +import static org.springframework.web.reactive.function.server.RequestPredicates.path; +import static org.springframework.web.reactive.function.server.RouterFunctions.route; +import static org.springframework.web.reactive.function.server.RouterFunctions.toHttpHandler; +import static org.springframework.web.reactive.function.server.ServerResponse.ok; + +import java.util.Arrays; +import java.util.List; +import java.util.concurrent.CopyOnWriteArrayList; +import java.util.concurrent.atomic.AtomicLong; + +import org.springframework.core.io.ClassPathResource; +import org.springframework.http.server.reactive.HttpHandler; +import org.springframework.http.server.reactive.ServletHttpHandlerAdapter; +import org.springframework.util.MultiValueMap; +import org.springframework.web.reactive.function.server.RouterFunction; +import org.springframework.web.reactive.function.server.RouterFunctions; +import org.springframework.web.reactive.function.server.ServerResponse; +import org.springframework.web.server.WebHandler; +import org.springframework.web.server.adapter.WebHttpHandlerBuilder; + +import reactor.core.publisher.Flux; +import reactor.core.publisher.Mono; + +public class RootServlet extends ServletHttpHandlerAdapter { + + public RootServlet() { + this(WebHttpHandlerBuilder.webHandler((WebHandler) toHttpHandler(routingFunction())) + .filter(new IndexRewriteFilter()) + .build()); + } + + RootServlet(HttpHandler httpHandler) { + super(httpHandler); + } + + private static final Actor BRAD_PITT = new Actor("Brad", "Pitt"); + private static final Actor TOM_HANKS = new Actor("Tom", "Hanks"); + private static final List actors = new CopyOnWriteArrayList<>(Arrays.asList(BRAD_PITT, TOM_HANKS)); + + private static RouterFunction routingFunction() { + + return route(GET("/test"), serverRequest -> ok().body(fromObject("helloworld"))).andRoute(POST("/login"), serverRequest -> serverRequest.body(toFormData()) + .map(MultiValueMap::toSingleValueMap) + .map(formData -> { + System.out.println("form data: " + formData.toString()); + if ("baeldung".equals(formData.get("user")) && "you_know_what_to_do".equals(formData.get("token"))) { + return ok().body(Mono.just("welcome back!"), String.class) + .block(); + } + return ServerResponse.badRequest() + .build() + .block(); + })) + .andRoute(POST("/upload"), serverRequest -> serverRequest.body(toDataBuffers()) + .collectList() + .map(dataBuffers -> { + AtomicLong atomicLong = new AtomicLong(0); + dataBuffers.forEach(d -> atomicLong.addAndGet(d.asByteBuffer() + .array().length)); + System.out.println("data length:" + atomicLong.get()); + return ok().body(fromObject(atomicLong.toString())) + .block(); + })) + .and(RouterFunctions.resources("/files/**", new ClassPathResource("files/"))) + .andNest(path("/actor"), route(GET("/"), serverRequest -> ok().body(Flux.fromIterable(actors), Actor.class)).andRoute(POST("/"), serverRequest -> serverRequest.bodyToMono(Actor.class) + .doOnNext(actors::add) + .then(ok().build()))) + .filter((request, next) -> { + System.out.println("Before handler invocation: " + request.path()); + return next.handle(request); + }); + + } + +} diff --git a/spring-5-reactive/src/main/java/com/baeldung/jsonb/Person.java b/spring-5-reactive/src/main/java/com/baeldung/jsonb/Person.java new file mode 100644 index 0000000000..7a54b37574 --- /dev/null +++ b/spring-5-reactive/src/main/java/com/baeldung/jsonb/Person.java @@ -0,0 +1,127 @@ +package com.baeldung.jsonb; + +import java.math.BigDecimal; +import java.time.LocalDate; + +import javax.json.bind.annotation.JsonbDateFormat; +import javax.json.bind.annotation.JsonbNumberFormat; +import javax.json.bind.annotation.JsonbProperty; +import javax.json.bind.annotation.JsonbTransient; + +public class Person { + + private int id; + @JsonbProperty("person-name") + private String name; + @JsonbProperty(nillable = true) + private String email; + @JsonbTransient + private int age; + @JsonbDateFormat("dd-MM-yyyy") + private LocalDate registeredDate; + private BigDecimal salary; + + public Person() { + } + + public Person(int id, String name, String email, int age, LocalDate registeredDate, BigDecimal salary) { + super(); + this.id = id; + this.name = name; + this.email = email; + this.age = age; + this.registeredDate = registeredDate; + this.salary = salary; + } + + public int getId() { + return id; + } + + public void setId(int id) { + this.id = id; + } + + public int getAge() { + return age; + } + + public void setAge(int age) { + this.age = age; + } + + public String getEmail() { + return email; + } + + public void setEmail(String email) { + this.email = email; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + @JsonbNumberFormat(locale = "en_US", value = "#0.0") + public BigDecimal getSalary() { + return salary; + } + + public void setSalary(BigDecimal salary) { + this.salary = salary; + } + + public LocalDate getRegisteredDate() { + return registeredDate; + } + + public void setRegisteredDate(LocalDate registeredDate) { + this.registeredDate = registeredDate; + } + + @Override + public String toString() { + StringBuilder builder = new StringBuilder(); + builder.append("Person [id="); + builder.append(id); + builder.append(", name="); + builder.append(name); + builder.append(", email="); + builder.append(email); + builder.append(", age="); + builder.append(age); + builder.append(", registeredDate="); + builder.append(registeredDate); + builder.append(", salary="); + builder.append(salary); + builder.append("]"); + return builder.toString(); + } + + @Override + public int hashCode() { + final int prime = 31; + int result = 1; + result = prime * result + id; + return result; + } + + @Override + public boolean equals(Object obj) { + if (this == obj) + return true; + if (obj == null) + return false; + if (getClass() != obj.getClass()) + return false; + Person other = (Person) obj; + if (id != other.id) + return false; + return true; + } + +} diff --git a/spring-5-reactive/src/main/java/com/baeldung/jsonb/PersonController.java b/spring-5-reactive/src/main/java/com/baeldung/jsonb/PersonController.java new file mode 100644 index 0000000000..e216a282eb --- /dev/null +++ b/spring-5-reactive/src/main/java/com/baeldung/jsonb/PersonController.java @@ -0,0 +1,58 @@ +package com.baeldung.jsonb; + +import java.math.BigDecimal; +import java.time.LocalDate; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +import javax.annotation.PostConstruct; + +import org.springframework.http.HttpStatus; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.ResponseBody; +import org.springframework.web.bind.annotation.ResponseStatus; +import org.springframework.web.bind.annotation.RestController; + +@RestController("/person") +public class PersonController { + + List personRepository; + + @PostConstruct + public void init() { + // @formatter:off + personRepository = new ArrayList<>(Arrays.asList( + new Person(1, "Jhon", "jhon@test.com", 20, LocalDate.of(2019, 9, 9), BigDecimal.valueOf(1000)), + new Person(2, "Jhon", "jhon1@test.com", 20, LocalDate.of(2019, 9, 9), BigDecimal.valueOf(1500)), + new Person(3, "Jhon", null, 20, LocalDate.of(2019, 9, 9), BigDecimal.valueOf(1000)), + new Person(4, "Tom", "tom@test.com", 21, LocalDate.of(2019, 9, 9), BigDecimal.valueOf(1500)), + new Person(5, "Mark", "mark@test.com", 21, LocalDate.of(2019, 9, 9), BigDecimal.valueOf(1200)), + new Person(6, "Julia", "jhon@test.com", 20, LocalDate.of(2019, 9, 9), BigDecimal.valueOf(1000)))); + // @formatter:on + + } + + @GetMapping("/person/{id}") + @ResponseBody + public Person findById(@PathVariable final int id) { + return personRepository.get(id); + } + + @PostMapping("/person") + @ResponseStatus(HttpStatus.OK) + @ResponseBody + public boolean insertPerson(@RequestBody final Person person) { + return personRepository.add(person); + } + + @GetMapping("/person") + @ResponseBody + public List findAll() { + return personRepository; + } + +} diff --git a/spring-5-reactive/src/main/java/com/baeldung/jsonb/Spring5Application.java b/spring-5-reactive/src/main/java/com/baeldung/jsonb/Spring5Application.java new file mode 100644 index 0000000000..00fce06834 --- /dev/null +++ b/spring-5-reactive/src/main/java/com/baeldung/jsonb/Spring5Application.java @@ -0,0 +1,30 @@ +package com.baeldung.jsonb; + +import java.util.ArrayList; +import java.util.Collection; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.boot.autoconfigure.http.HttpMessageConverters; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.ComponentScan; +import org.springframework.http.converter.HttpMessageConverter; +import org.springframework.http.converter.json.JsonbHttpMessageConverter; + +@SpringBootApplication +@ComponentScan(basePackages = { "com.baeldung.jsonb" }) +public class Spring5Application { + + public static void main(String[] args) { + SpringApplication.run(Spring5Application.class, args); + } + + @Bean + public HttpMessageConverters customConverters() { + Collection> messageConverters = new ArrayList<>(); + JsonbHttpMessageConverter jsonbHttpMessageConverter = new JsonbHttpMessageConverter(); + messageConverters.add(jsonbHttpMessageConverter); + return new HttpMessageConverters(true, messageConverters); + } + +} diff --git a/spring-5-reactive/src/main/java/com/baeldung/jupiter/MethodParameterFactory.java b/spring-5-reactive/src/main/java/com/baeldung/jupiter/MethodParameterFactory.java new file mode 100644 index 0000000000..85bd505d11 --- /dev/null +++ b/spring-5-reactive/src/main/java/com/baeldung/jupiter/MethodParameterFactory.java @@ -0,0 +1,46 @@ +package com.baeldung.jupiter; + +import org.springframework.core.MethodParameter; +import org.springframework.core.annotation.SynthesizingMethodParameter; +import org.springframework.util.Assert; + +import java.lang.reflect.Constructor; +import java.lang.reflect.Executable; +import java.lang.reflect.Method; +import java.lang.reflect.Parameter; + +abstract class MethodParameterFactory { + + private MethodParameterFactory() { + } + + public static MethodParameter createMethodParameter(Parameter parameter) { + Assert.notNull(parameter, "Parameter must not be null"); + Executable executable = parameter.getDeclaringExecutable(); + if (executable instanceof Method) { + return new MethodParameter((Method) executable, getIndex(parameter)); + } + return new MethodParameter((Constructor) executable, getIndex(parameter)); + } + + public static SynthesizingMethodParameter createSynthesizingMethodParameter(Parameter parameter) { + Assert.notNull(parameter, "Parameter must not be null"); + Executable executable = parameter.getDeclaringExecutable(); + if (executable instanceof Method) { + return new SynthesizingMethodParameter((Method) executable, getIndex(parameter)); + } + throw new UnsupportedOperationException("Cannot create a SynthesizingMethodParameter for a constructor parameter: " + parameter); + } + + private static int getIndex(Parameter parameter) { + Assert.notNull(parameter, "Parameter must not be null"); + Executable executable = parameter.getDeclaringExecutable(); + Parameter[] parameters = executable.getParameters(); + for (int i = 0; i < parameters.length; i++) { + if (parameters[i] == parameter) { + return i; + } + } + throw new IllegalStateException(String.format("Failed to resolve index of parameter [%s] in executable [%s]", parameter, executable.toGenericString())); + } +} diff --git a/spring-5-reactive/src/main/java/com/baeldung/jupiter/ParameterAutowireUtils.java b/spring-5-reactive/src/main/java/com/baeldung/jupiter/ParameterAutowireUtils.java new file mode 100644 index 0000000000..d1a4cc8b29 --- /dev/null +++ b/spring-5-reactive/src/main/java/com/baeldung/jupiter/ParameterAutowireUtils.java @@ -0,0 +1,44 @@ +package com.baeldung.jupiter; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.beans.factory.config.DependencyDescriptor; +import org.springframework.context.ApplicationContext; +import org.springframework.core.MethodParameter; +import org.springframework.core.annotation.AnnotatedElementUtils; + +import java.lang.annotation.Annotation; +import java.lang.reflect.AnnotatedElement; +import java.lang.reflect.Method; +import java.lang.reflect.Parameter; +import java.util.Optional; + +import static org.springframework.core.annotation.AnnotatedElementUtils.hasAnnotation; + +abstract class ParameterAutowireUtils { + + private ParameterAutowireUtils() { + } + + public static boolean isAutowirable(Parameter parameter) { + return ApplicationContext.class.isAssignableFrom(parameter.getType()) || hasAnnotation(parameter, Autowired.class) || hasAnnotation(parameter, Qualifier.class) || hasAnnotation(parameter, Value.class); + } + + public static Object resolveDependency(Parameter parameter, Class containingClass, ApplicationContext applicationContext) { + + boolean required = findMergedAnnotation(parameter, Autowired.class).map(Autowired::required) + .orElse(true); + MethodParameter methodParameter = (parameter.getDeclaringExecutable() instanceof Method ? MethodParameterFactory.createSynthesizingMethodParameter(parameter) : MethodParameterFactory.createMethodParameter(parameter)); + DependencyDescriptor descriptor = new DependencyDescriptor(methodParameter, required); + descriptor.setContainingClass(containingClass); + + return applicationContext.getAutowireCapableBeanFactory() + .resolveDependency(descriptor, null); + } + + private static Optional findMergedAnnotation(AnnotatedElement element, Class annotationType) { + + return Optional.ofNullable(AnnotatedElementUtils.findMergedAnnotation(element, annotationType)); + } +} diff --git a/spring-5-reactive/src/main/java/com/baeldung/jupiter/SpringExtension.java b/spring-5-reactive/src/main/java/com/baeldung/jupiter/SpringExtension.java new file mode 100644 index 0000000000..7218d984ef --- /dev/null +++ b/spring-5-reactive/src/main/java/com/baeldung/jupiter/SpringExtension.java @@ -0,0 +1,94 @@ +package com.baeldung.jupiter; + +import java.lang.reflect.Constructor; +import java.lang.reflect.Executable; +import java.lang.reflect.Method; +import java.lang.reflect.Parameter; + +import org.junit.jupiter.api.extension.AfterAllCallback; +import org.junit.jupiter.api.extension.AfterEachCallback; +import org.junit.jupiter.api.extension.BeforeAllCallback; +import org.junit.jupiter.api.extension.BeforeEachCallback; +import org.junit.jupiter.api.extension.ExtensionContext; +import org.junit.jupiter.api.extension.ParameterContext; +import org.junit.jupiter.api.extension.ParameterResolutionException; +import org.junit.jupiter.api.extension.ParameterResolver; +import org.junit.jupiter.api.extension.TestInstancePostProcessor; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.ApplicationContext; +import org.springframework.core.annotation.AnnotatedElementUtils; +import org.springframework.test.context.TestContextManager; +import org.springframework.util.Assert; + +public class SpringExtension implements BeforeAllCallback, AfterAllCallback, TestInstancePostProcessor, BeforeEachCallback, AfterEachCallback, ParameterResolver { + + private static final ExtensionContext.Namespace namespace = ExtensionContext.Namespace.create(SpringExtension.class); + + @Override + public void beforeAll(ExtensionContext context) throws Exception { + getTestContextManager(context).beforeTestClass(); + } + + @Override + public void afterAll(ExtensionContext context) throws Exception { + try { + getTestContextManager(context).afterTestClass(); + } finally { + context.getStore(namespace) + .remove(context.getTestClass() + .get()); + } + } + + @Override + public void postProcessTestInstance(Object testInstance, ExtensionContext context) throws Exception { + getTestContextManager(context).prepareTestInstance(testInstance); + } + + @Override + public void beforeEach(ExtensionContext context) throws Exception { + Object testInstance = context.getTestInstance(); + Method testMethod = context.getTestMethod() + .get(); + getTestContextManager(context).beforeTestMethod(testInstance, testMethod); + } + + @Override + public void afterEach(ExtensionContext context) throws Exception { + Object testInstance = context.getTestInstance(); + Method testMethod = context.getTestMethod() + .get(); + Throwable testException = context.getExecutionException() + .orElse(null); + getTestContextManager(context).afterTestMethod(testInstance, testMethod, testException); + } + + @Override + public boolean supportsParameter(ParameterContext parameterContext, ExtensionContext extensionContext) throws ParameterResolutionException { + Parameter parameter = parameterContext.getParameter(); + Executable executable = parameter.getDeclaringExecutable(); + return ((executable instanceof Constructor) && AnnotatedElementUtils.hasAnnotation(executable, Autowired.class)) || ParameterAutowireUtils.isAutowirable(parameter); + } + + @Override + public Object resolveParameter(ParameterContext parameterContext, ExtensionContext extensionContext) throws ParameterResolutionException { + Parameter parameter = parameterContext.getParameter(); + Class testClass = extensionContext.getTestClass() + .get(); + ApplicationContext applicationContext = getApplicationContext(extensionContext); + return ParameterAutowireUtils.resolveDependency(parameter, testClass, applicationContext); + } + + private ApplicationContext getApplicationContext(ExtensionContext context) { + return getTestContextManager(context).getTestContext() + .getApplicationContext(); + } + + private TestContextManager getTestContextManager(ExtensionContext context) { + Assert.notNull(context, "ExtensionContext must not be null"); + Class testClass = context.getTestClass() + .get(); + ExtensionContext.Store store = context.getStore(namespace); + return store.getOrComputeIfAbsent(testClass, TestContextManager::new, TestContextManager.class); + } +} diff --git a/spring-5-reactive/src/main/java/com/baeldung/jupiter/SpringJUnit5Config.java b/spring-5-reactive/src/main/java/com/baeldung/jupiter/SpringJUnit5Config.java new file mode 100644 index 0000000000..8f02d71d49 --- /dev/null +++ b/spring-5-reactive/src/main/java/com/baeldung/jupiter/SpringJUnit5Config.java @@ -0,0 +1,39 @@ +package com.baeldung.jupiter; + +import org.junit.jupiter.api.extension.ExtendWith; +import org.springframework.context.ApplicationContextInitializer; +import org.springframework.context.ConfigurableApplicationContext; +import org.springframework.core.annotation.AliasFor; +import org.springframework.test.context.ContextConfiguration; + +import java.lang.annotation.*; + +@ExtendWith(SpringExtension.class) +@ContextConfiguration +@Documented +@Inherited +@Retention(RetentionPolicy.RUNTIME) +@Target(ElementType.TYPE) +public @interface SpringJUnit5Config { + + @AliasFor(annotation = ContextConfiguration.class, attribute = "classes") + Class[] value() default {}; + + @AliasFor(annotation = ContextConfiguration.class) + Class[] classes() default {}; + + @AliasFor(annotation = ContextConfiguration.class) + String[] locations() default {}; + + @AliasFor(annotation = ContextConfiguration.class) + Class>[] initializers() default {}; + + @AliasFor(annotation = ContextConfiguration.class) + boolean inheritLocations() default true; + + @AliasFor(annotation = ContextConfiguration.class) + boolean inheritInitializers() default true; + + @AliasFor(annotation = ContextConfiguration.class) + String name() default ""; +} diff --git a/spring-5-reactive/src/main/java/com/baeldung/jupiter/TestConfig.java b/spring-5-reactive/src/main/java/com/baeldung/jupiter/TestConfig.java new file mode 100644 index 0000000000..a29f77c5df --- /dev/null +++ b/spring-5-reactive/src/main/java/com/baeldung/jupiter/TestConfig.java @@ -0,0 +1,20 @@ +package com.baeldung.jupiter; + +import com.baeldung.web.reactive.Task; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.support.PropertySourcesPlaceholderConfigurer; + +@Configuration +public class TestConfig { + + @Bean + static PropertySourcesPlaceholderConfigurer placeholderConfigurer() { + return new PropertySourcesPlaceholderConfigurer(); + } + + @Bean + Task taskName() { + return new Task("taskName", 1); + } +} diff --git a/spring-5-reactive/src/main/java/com/baeldung/persistence/DataSetupBean.java b/spring-5-reactive/src/main/java/com/baeldung/persistence/DataSetupBean.java new file mode 100644 index 0000000000..9f5d9ff6c2 --- /dev/null +++ b/spring-5-reactive/src/main/java/com/baeldung/persistence/DataSetupBean.java @@ -0,0 +1,27 @@ +package com.baeldung.persistence; + +import static org.apache.commons.lang3.RandomStringUtils.randomAlphabetic; + +import java.util.stream.IntStream; + +import org.springframework.beans.factory.InitializingBean; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import com.baeldung.web.Foo; + +@Component +public class DataSetupBean implements InitializingBean { + + @Autowired + private FooRepository repo; + + // + + @Override + public void afterPropertiesSet() throws Exception { + IntStream.range(1, 20) + .forEach(i -> repo.save(new Foo(randomAlphabetic(8)))); + } + +} diff --git a/spring-5-reactive/src/main/java/com/baeldung/persistence/FooRepository.java b/spring-5-reactive/src/main/java/com/baeldung/persistence/FooRepository.java new file mode 100644 index 0000000000..1f1e071158 --- /dev/null +++ b/spring-5-reactive/src/main/java/com/baeldung/persistence/FooRepository.java @@ -0,0 +1,10 @@ +package com.baeldung.persistence; + +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.JpaSpecificationExecutor; + +import com.baeldung.web.Foo; + +public interface FooRepository extends JpaRepository, JpaSpecificationExecutor { + +} diff --git a/spring-5-reactive/src/main/java/com/baeldung/security/GreetController.java b/spring-5-reactive/src/main/java/com/baeldung/security/GreetController.java new file mode 100644 index 0000000000..6b69e3bc9b --- /dev/null +++ b/spring-5-reactive/src/main/java/com/baeldung/security/GreetController.java @@ -0,0 +1,37 @@ +package com.baeldung.security; + +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RestController; +import reactor.core.publisher.Mono; + +import java.security.Principal; + +@RestController +public class GreetController { + + private GreetService greetService; + + public GreetController(GreetService greetService) { + this.greetService = greetService; + } + + @GetMapping("/") + public Mono greet(Mono principal) { + return principal + .map(Principal::getName) + .map(name -> String.format("Hello, %s", name)); + } + + @GetMapping("/admin") + public Mono greetAdmin(Mono principal) { + return principal + .map(Principal::getName) + .map(name -> String.format("Admin access: %s", name)); + } + + @GetMapping("/greetService") + public Mono greetService() { + return greetService.greet(); + } + +} diff --git a/spring-5-reactive/src/main/java/com/baeldung/security/GreetService.java b/spring-5-reactive/src/main/java/com/baeldung/security/GreetService.java new file mode 100644 index 0000000000..7622b360be --- /dev/null +++ b/spring-5-reactive/src/main/java/com/baeldung/security/GreetService.java @@ -0,0 +1,15 @@ +package com.baeldung.security; + +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.stereotype.Service; +import reactor.core.publisher.Mono; + +@Service +public class GreetService { + + @PreAuthorize("hasRole('ADMIN')") + public Mono greet() { + return Mono.just("Hello from service!"); + } + +} diff --git a/spring-5-reactive/src/main/java/com/baeldung/security/SecurityConfig.java b/spring-5-reactive/src/main/java/com/baeldung/security/SecurityConfig.java new file mode 100644 index 0000000000..a9e44a2eee --- /dev/null +++ b/spring-5-reactive/src/main/java/com/baeldung/security/SecurityConfig.java @@ -0,0 +1,42 @@ +package com.baeldung.security; + +import org.springframework.context.annotation.Bean; +import org.springframework.security.config.annotation.method.configuration.EnableReactiveMethodSecurity; +import org.springframework.security.config.annotation.web.reactive.EnableWebFluxSecurity; +import org.springframework.security.config.web.server.ServerHttpSecurity; +import org.springframework.security.core.userdetails.MapReactiveUserDetailsService; +import org.springframework.security.core.userdetails.User; +import org.springframework.security.core.userdetails.UserDetails; +import org.springframework.security.web.server.SecurityWebFilterChain; + +@EnableWebFluxSecurity +@EnableReactiveMethodSecurity +public class SecurityConfig { + + @Bean + public SecurityWebFilterChain securitygWebFilterChain(ServerHttpSecurity http) { + return http.authorizeExchange() + .pathMatchers("/admin").hasAuthority("ROLE_ADMIN") + .anyExchange().authenticated() + .and().formLogin() + .and().build(); + } + + @Bean + public MapReactiveUserDetailsService userDetailsService() { + UserDetails user = User.withDefaultPasswordEncoder() + .username("user") + .password("password") + .roles("USER") + .build(); + + UserDetails admin = User.withDefaultPasswordEncoder() + .username("admin") + .password("password") + .roles("ADMIN") + .build(); + + return new MapReactiveUserDetailsService(user, admin); + } + +} diff --git a/spring-5-reactive/src/main/java/com/baeldung/web/Foo.java b/spring-5-reactive/src/main/java/com/baeldung/web/Foo.java new file mode 100644 index 0000000000..c4868a9958 --- /dev/null +++ b/spring-5-reactive/src/main/java/com/baeldung/web/Foo.java @@ -0,0 +1,84 @@ +package com.baeldung.web; + +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.GenerationType; +import javax.persistence.Id; + +@Entity +public class Foo { + + @Id + @GeneratedValue(strategy = GenerationType.AUTO) + private long id; + + private String name; + + public Foo() { + super(); + } + + public Foo(final String name) { + super(); + + this.name = name; + } + + public Foo(final long id, final String name) { + super(); + + this.id = id; + this.name = name; + } + + // API + + public long getId() { + return id; + } + + public void setId(final long id) { + this.id = id; + } + + public String getName() { + return name; + } + + public void setName(final String name) { + this.name = name; + } + + // + + @Override + public int hashCode() { + final int prime = 31; + int result = 1; + result = prime * result + ((name == null) ? 0 : name.hashCode()); + return result; + } + + @Override + public boolean equals(Object obj) { + if (this == obj) + return true; + if (obj == null) + return false; + if (getClass() != obj.getClass()) + return false; + Foo other = (Foo) obj; + if (name == null) { + if (other.name != null) + return false; + } else if (!name.equals(other.name)) + return false; + return true; + } + + @Override + public String toString() { + return "Foo [name=" + name + "]"; + } + +} \ No newline at end of file diff --git a/spring-5-reactive/src/main/java/com/baeldung/web/FooController.java b/spring-5-reactive/src/main/java/com/baeldung/web/FooController.java new file mode 100644 index 0000000000..925f2b49f4 --- /dev/null +++ b/spring-5-reactive/src/main/java/com/baeldung/web/FooController.java @@ -0,0 +1,53 @@ +package com.baeldung.web; + +import com.baeldung.persistence.FooRepository; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.domain.PageRequest; +import org.springframework.http.HttpStatus; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import javax.validation.constraints.Max; +import javax.validation.constraints.Min; +import java.util.List; + +@RestController("/foos") +public class FooController { + + @Autowired + private FooRepository repo; + + // API - read + + @GetMapping("/foos/{id}") + @ResponseBody + @Validated + public Foo findById(@PathVariable @Min(0) final long id) { + return repo.findById(id) + .orElse(null); + } + + @GetMapping + @ResponseBody + public List findAll() { + return repo.findAll(); + } + + @GetMapping(params = { "page", "size" }) + @ResponseBody + @Validated + public List findPaginated(@RequestParam("page") @Min(0) final int page, @Max(100) @RequestParam("size") final int size) { + return repo.findAll(PageRequest.of(page, size)) + .getContent(); + } + + // API - write + + @PutMapping("/foos/{id}") + @ResponseStatus(HttpStatus.OK) + @ResponseBody + public Foo update(@PathVariable("id") final String id, @RequestBody final Foo foo) { + return foo; + } + +} diff --git a/spring-5-reactive/src/main/java/com/baeldung/web/PathPatternController.java b/spring-5-reactive/src/main/java/com/baeldung/web/PathPatternController.java new file mode 100644 index 0000000000..fa413e4f00 --- /dev/null +++ b/spring-5-reactive/src/main/java/com/baeldung/web/PathPatternController.java @@ -0,0 +1,39 @@ +package com.baeldung.web; + +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RestController; + +@RestController +public class PathPatternController { + + @GetMapping("/spring5/{*id}") + public String URIVariableHandler(@PathVariable String id) { + return id; + } + + @GetMapping("/s?ring5") + public String wildcardTakingExactlyOneChar() { + return "/s?ring5"; + } + + @GetMapping("/spring5/*id") + public String wildcardTakingZeroOrMoreChar() { + return "/spring5/*id"; + } + + @GetMapping("/resources/**") + public String wildcardTakingZeroOrMorePathSegments() { + return "/resources/**"; + } + + @GetMapping("/{baeldung:[a-z]+}") + public String regexInPathVariable(@PathVariable String baeldung) { + return baeldung; + } + + @GetMapping("/{var1}_{var2}") + public String multiplePathVariablesInSameSegment(@PathVariable String var1, @PathVariable String var2) { + return "Two variables are var1=" + var1 + " and var2=" + var2; + } +} diff --git a/spring-5-reactive/src/main/java/com/baeldung/web/reactive/Task.java b/spring-5-reactive/src/main/java/com/baeldung/web/reactive/Task.java new file mode 100644 index 0000000000..725fd931e1 --- /dev/null +++ b/spring-5-reactive/src/main/java/com/baeldung/web/reactive/Task.java @@ -0,0 +1,28 @@ +package com.baeldung.web.reactive; + +import com.fasterxml.jackson.annotation.JsonProperty; + +public class Task { + + private final String name; + + private final int id; + + public Task(@JsonProperty("name") String name, @JsonProperty("id") int id) { + this.name = name; + this.id = id; + } + + public String getName() { + return this.name; + } + + public int getId() { + return this.id; + } + + @Override + public String toString() { + return "Task{" + "name='" + name + '\'' + ", id=" + id + '}'; + } +} diff --git a/spring-5-reactive/src/main/java/com/baeldung/web/reactive/client/WebClientController.java b/spring-5-reactive/src/main/java/com/baeldung/web/reactive/client/WebClientController.java new file mode 100644 index 0000000000..a218c6b7cf --- /dev/null +++ b/spring-5-reactive/src/main/java/com/baeldung/web/reactive/client/WebClientController.java @@ -0,0 +1,85 @@ +package com.baeldung.web.reactive.client; + +import org.reactivestreams.Publisher; +import org.reactivestreams.Subscriber; +import org.springframework.http.*; +import org.springframework.http.client.reactive.ClientHttpRequest; +import org.springframework.util.LinkedMultiValueMap; +import org.springframework.util.MultiValueMap; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.ResponseStatus; +import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.reactive.function.BodyInserter; +import org.springframework.web.reactive.function.BodyInserters; +import org.springframework.web.reactive.function.client.WebClient; +import reactor.core.publisher.Mono; + +import java.net.URI; +import java.nio.charset.Charset; +import java.time.ZonedDateTime; +import java.util.Collections; + +@RestController +public class WebClientController { + + @ResponseStatus(HttpStatus.OK) + @GetMapping("/resource") + public void getResource() { + } + + public void demonstrateWebClient() { + // request + WebClient.UriSpec request1 = createWebClientWithServerURLAndDefaultValues().method(HttpMethod.POST); + WebClient.UriSpec request2 = createWebClientWithServerURLAndDefaultValues().post(); + + // request body specifications + WebClient.RequestBodySpec uri1 = createWebClientWithServerURLAndDefaultValues().method(HttpMethod.POST) + .uri("/resource"); + WebClient.RequestBodySpec uri2 = createWebClientWithServerURLAndDefaultValues().post() + .uri(URI.create("/resource")); + + // request header specification + WebClient.RequestHeadersSpec requestSpec1 = uri1.body(BodyInserters.fromPublisher(Mono.just("data"), String.class)); + WebClient.RequestHeadersSpec requestSpec2 = uri2.body(BodyInserters.fromObject("data")); + + // inserters + BodyInserter, ReactiveHttpOutputMessage> inserter1 = BodyInserters + .fromPublisher(Subscriber::onComplete, String.class); + + LinkedMultiValueMap map = new LinkedMultiValueMap<>(); + map.add("key1", "value1"); + map.add("key2", "value2"); + + BodyInserter, ClientHttpRequest> inserter2 = BodyInserters.fromMultipartData(map); + BodyInserter inserter3 = BodyInserters.fromObject("body"); + + // responses + WebClient.ResponseSpec response1 = uri1.body(inserter3) + .header(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE) + .accept(MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML) + .acceptCharset(Charset.forName("UTF-8")) + .ifNoneMatch("*") + .ifModifiedSince(ZonedDateTime.now()) + .retrieve(); + WebClient.ResponseSpec response2 = requestSpec2.retrieve(); + + } + + private WebClient createWebClient() { + return WebClient.create(); + } + + private WebClient createWebClientWithServerURL() { + return WebClient.create("http://localhost:8081"); + } + + private WebClient createWebClientWithServerURLAndDefaultValues() { + return WebClient.builder() + .baseUrl("http://localhost:8081") + .defaultCookie("cookieKey", "cookieValue") + .defaultHeader(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE) + .defaultUriVariables(Collections.singletonMap("url", "http://localhost:8080")) + .build(); + } + +} diff --git a/spring-5-reactive/src/main/resources/application.properties b/spring-5-reactive/src/main/resources/application.properties new file mode 100644 index 0000000000..ccec014c2b --- /dev/null +++ b/spring-5-reactive/src/main/resources/application.properties @@ -0,0 +1,3 @@ +server.port=8081 + +logging.level.root=INFO \ No newline at end of file diff --git a/spring-5-reactive/src/main/resources/files/hello.txt b/spring-5-reactive/src/main/resources/files/hello.txt new file mode 100644 index 0000000000..b6fc4c620b --- /dev/null +++ b/spring-5-reactive/src/main/resources/files/hello.txt @@ -0,0 +1 @@ +hello \ No newline at end of file diff --git a/spring-5-reactive/src/main/resources/files/test/test.txt b/spring-5-reactive/src/main/resources/files/test/test.txt new file mode 100644 index 0000000000..30d74d2584 --- /dev/null +++ b/spring-5-reactive/src/main/resources/files/test/test.txt @@ -0,0 +1 @@ +test \ No newline at end of file diff --git a/spring-5-reactive/src/main/webapp/WEB-INF/web.xml b/spring-5-reactive/src/main/webapp/WEB-INF/web.xml new file mode 100644 index 0000000000..bfcf43dad2 --- /dev/null +++ b/spring-5-reactive/src/main/webapp/WEB-INF/web.xml @@ -0,0 +1,21 @@ + + + + Spring Functional Application + + + functional + com.baeldung.functional.RootServlet + 1 + true + + + functional + / + + + + \ No newline at end of file diff --git a/spring-5-reactive/src/test/java/com/baeldung/Example1IntegrationTest.java b/spring-5-reactive/src/test/java/com/baeldung/Example1IntegrationTest.java new file mode 100644 index 0000000000..8b9e66213f --- /dev/null +++ b/spring-5-reactive/src/test/java/com/baeldung/Example1IntegrationTest.java @@ -0,0 +1,29 @@ +package com.baeldung; + +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.test.context.junit4.SpringRunner; + +@RunWith(SpringRunner.class) +@SpringBootTest +public class Example1IntegrationTest { + + @Test + public void test1a() { + block(3000); + } + + @Test + public void test1b() { + block(3000); + } + + public static void block(long ms) { + try { + Thread.sleep(ms); + } catch (InterruptedException e) { + System.out.println("Thread interrupted"); + } + } +} diff --git a/spring-5-reactive/src/test/java/com/baeldung/Example2IntegrationTest.java b/spring-5-reactive/src/test/java/com/baeldung/Example2IntegrationTest.java new file mode 100644 index 0000000000..6ed53ca4e9 --- /dev/null +++ b/spring-5-reactive/src/test/java/com/baeldung/Example2IntegrationTest.java @@ -0,0 +1,29 @@ +package com.baeldung; + +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.test.context.junit4.SpringRunner; + +@RunWith(SpringRunner.class) +@SpringBootTest +public class Example2IntegrationTest { + + @Test + public void test1a() { + block(3000); + } + + @Test + public void test1b() { + block(3000); + } + + public static void block(long ms) { + try { + Thread.sleep(ms); + } catch (InterruptedException e) { + System.out.println("Thread Interrupted"); + } + } +} diff --git a/spring-5-reactive/src/test/java/com/baeldung/ParallelIntegrationTest.java b/spring-5-reactive/src/test/java/com/baeldung/ParallelIntegrationTest.java new file mode 100644 index 0000000000..1ce96de4ef --- /dev/null +++ b/spring-5-reactive/src/test/java/com/baeldung/ParallelIntegrationTest.java @@ -0,0 +1,24 @@ +package com.baeldung; + +import org.junit.Test; +import org.junit.experimental.ParallelComputer; +import org.junit.runner.Computer; +import org.junit.runner.JUnitCore; + +public class ParallelIntegrationTest { + + @Test + public void runTests() { + final Class[] classes = { Example1IntegrationTest.class, Example2IntegrationTest.class }; + + JUnitCore.runClasses(new Computer(), classes); + } + + @Test + public void runTestsInParallel() { + final Class[] classes = { Example1IntegrationTest.class, Example2IntegrationTest.class }; + + JUnitCore.runClasses(new ParallelComputer(true, true), classes); + } + +} \ No newline at end of file diff --git a/spring-5-reactive/src/test/java/com/baeldung/Spring5ApplicationIntegrationTest.java b/spring-5-reactive/src/test/java/com/baeldung/Spring5ApplicationIntegrationTest.java new file mode 100644 index 0000000000..af288c3c2d --- /dev/null +++ b/spring-5-reactive/src/test/java/com/baeldung/Spring5ApplicationIntegrationTest.java @@ -0,0 +1,16 @@ +package com.baeldung; + +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.test.context.junit4.SpringRunner; + +@RunWith(SpringRunner.class) +@SpringBootTest +public class Spring5ApplicationIntegrationTest { + + @Test + public void contextLoads() { + } + +} diff --git a/spring-5-reactive/src/test/java/com/baeldung/Spring5JUnit4ConcurrentIntegrationTest.java b/spring-5-reactive/src/test/java/com/baeldung/Spring5JUnit4ConcurrentIntegrationTest.java new file mode 100644 index 0000000000..7e494465b2 --- /dev/null +++ b/spring-5-reactive/src/test/java/com/baeldung/Spring5JUnit4ConcurrentIntegrationTest.java @@ -0,0 +1,52 @@ +package com.baeldung; + +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.beans.BeansException; +import org.springframework.beans.factory.InitializingBean; +import org.springframework.context.ApplicationContext; +import org.springframework.context.ApplicationContextAware; +import org.springframework.context.annotation.Configuration; +import org.springframework.test.context.ContextConfiguration; +import org.springframework.test.context.junit4.SpringRunner; + +import java.util.concurrent.TimeUnit; + +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertTrue; + +@RunWith(SpringRunner.class) +@ContextConfiguration(classes = Spring5JUnit4ConcurrentIntegrationTest.SimpleConfiguration.class) +public class Spring5JUnit4ConcurrentIntegrationTest implements ApplicationContextAware, InitializingBean { + + @Configuration + public static class SimpleConfiguration { + } + + private ApplicationContext applicationContext; + + private boolean beanInitialized = false; + + @Override + public final void afterPropertiesSet() throws Exception { + this.beanInitialized = true; + } + + @Override + public final void setApplicationContext(final ApplicationContext applicationContext) throws BeansException { + this.applicationContext = applicationContext; + } + + @Test + public final void verifyApplicationContextSet() throws InterruptedException { + TimeUnit.SECONDS.sleep(2); + assertNotNull("The application context should have been set due to ApplicationContextAware semantics.", this.applicationContext); + } + + @Test + public final void verifyBeanInitialized() throws InterruptedException { + TimeUnit.SECONDS.sleep(2); + assertTrue("This test bean should have been initialized due to InitializingBean semantics.", this.beanInitialized); + } + +} diff --git a/spring-5-reactive/src/test/java/com/baeldung/functional/BeanRegistrationTest.java b/spring-5-reactive/src/test/java/com/baeldung/functional/BeanRegistrationTest.java new file mode 100644 index 0000000000..0b1542dbbc --- /dev/null +++ b/spring-5-reactive/src/test/java/com/baeldung/functional/BeanRegistrationTest.java @@ -0,0 +1,42 @@ +package com.baeldung.functional; + +import static org.junit.Assert.*; + +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.test.context.junit4.SpringRunner; +import org.springframework.web.context.support.GenericWebApplicationContext; + +import com.baeldung.Spring5Application; + +@RunWith(SpringRunner.class) +@SpringBootTest(classes = Spring5Application.class) +public class BeanRegistrationTest { + + @Autowired + private GenericWebApplicationContext context; + + @Test + public void whenRegisterBean_thenOk() { + context.registerBean(MyService.class, () -> new MyService()); + MyService myService = (MyService) context.getBean("com.baeldung.functional.MyService"); + assertTrue(myService.getRandomNumber() < 10); + } + + @Test + public void whenRegisterBeanWithName_thenOk() { + context.registerBean("mySecondService", MyService.class, () -> new MyService()); + MyService mySecondService = (MyService) context.getBean("mySecondService"); + assertTrue(mySecondService.getRandomNumber() < 10); + } + + @Test + public void whenRegisterBeanWithCallback_thenOk() { + context.registerBean("myCallbackService", MyService.class, () -> new MyService(), bd -> bd.setAutowireCandidate(false)); + MyService myCallbackService = (MyService) context.getBean("myCallbackService"); + assertTrue(myCallbackService.getRandomNumber() < 10); + } + +} diff --git a/spring-5-reactive/src/test/java/com/baeldung/functional/ExploreSpring5URLPatternUsingRouterFunctionsTest.java b/spring-5-reactive/src/test/java/com/baeldung/functional/ExploreSpring5URLPatternUsingRouterFunctionsTest.java new file mode 100644 index 0000000000..7a38fa697f --- /dev/null +++ b/spring-5-reactive/src/test/java/com/baeldung/functional/ExploreSpring5URLPatternUsingRouterFunctionsTest.java @@ -0,0 +1,110 @@ +package com.baeldung.functional; + +import org.junit.AfterClass; +import org.junit.BeforeClass; +import org.junit.Test; +import org.springframework.boot.web.server.WebServer; +import org.springframework.test.web.reactive.server.WebTestClient; + +public class ExploreSpring5URLPatternUsingRouterFunctionsTest { + + private static WebTestClient client; + private static WebServer server; + + @BeforeClass + public static void setup() throws Exception { + server = new ExploreSpring5URLPatternUsingRouterFunctions().start(); + client = WebTestClient.bindToServer() + .baseUrl("http://localhost:" + server.getPort()) + .build(); + } + + @AfterClass + public static void destroy() { + server.stop(); + } + + @Test + public void givenRouter_whenGetPathWithSingleCharWildcard_thenGotPathPattern() throws Exception { + client.get() + .uri("/paths") + .exchange() + .expectStatus() + .isOk() + .expectBody(String.class) + .isEqualTo("/p?ths"); + } + + @Test + public void givenRouter_whenMultipleURIVariablePattern_thenGotPathVariable() throws Exception { + client.get() + .uri("/test/ab/cd") + .exchange() + .expectStatus() + .isOk() + .expectBody(String.class) + .isEqualTo("/ab/cd"); + } + + @Test + public void givenRouter_whenGetMultipleCharWildcard_thenGotPathPattern() throws Exception { + + client.get() + .uri("/wildcard") + .exchange() + .expectStatus() + .isOk() + .expectBody(String.class) + .isEqualTo("/*card path was accessed"); + } + + @Test + public void givenRouter_whenGetMultiplePathVaribleInSameSegment_thenGotPathVariables() throws Exception { + + client.get() + .uri("/baeldung_tutorial") + .exchange() + .expectStatus() + .isOk() + .expectBody(String.class) + .isEqualTo("baeldung , tutorial"); + } + + @Test + public void givenRouter_whenGetRegexInPathVarible_thenGotPathVariable() throws Exception { + + client.get() + .uri("/abcd") + .exchange() + .expectStatus() + .isOk() + .expectBody(String.class) + .isEqualTo("/{baeldung:[a-z]+} was accessed and baeldung=abcd"); + + client.get() + .uri("/1234") + .exchange() + .expectStatus() + .is4xxClientError(); + } + + @Test + public void givenResources_whenAccess_thenGot() throws Exception { + client.get() + .uri("/files/test/test.txt") + .exchange() + .expectStatus() + .isOk() + .expectBody(String.class) + .isEqualTo("test"); + + client.get() + .uri("/files/hello.txt") + .exchange() + .expectStatus() + .isOk() + .expectBody(String.class) + .isEqualTo("hello"); + } + +} diff --git a/spring-5-reactive/src/test/java/com/baeldung/functional/FunctionalWebApplicationIntegrationTest.java b/spring-5-reactive/src/test/java/com/baeldung/functional/FunctionalWebApplicationIntegrationTest.java new file mode 100644 index 0000000000..a7b951b930 --- /dev/null +++ b/spring-5-reactive/src/test/java/com/baeldung/functional/FunctionalWebApplicationIntegrationTest.java @@ -0,0 +1,141 @@ +package com.baeldung.functional; + +import org.junit.AfterClass; +import org.junit.BeforeClass; +import org.junit.Test; +import org.springframework.boot.web.server.WebServer; +import org.springframework.core.io.ClassPathResource; +import org.springframework.core.io.Resource; +import org.springframework.http.MediaType; +import org.springframework.test.web.reactive.server.WebTestClient; +import org.springframework.util.LinkedMultiValueMap; +import org.springframework.util.MultiValueMap; +import org.springframework.web.reactive.function.BodyInserters; + +import static org.springframework.web.reactive.function.BodyInserters.fromObject; +import static org.springframework.web.reactive.function.BodyInserters.fromResource; + +public class FunctionalWebApplicationIntegrationTest { + + private static WebTestClient client; + private static WebServer server; + + @BeforeClass + public static void setup() throws Exception { + server = new FunctionalWebApplication().start(); + client = WebTestClient.bindToServer() + .baseUrl("http://localhost:" + server.getPort()) + .build(); + } + + @AfterClass + public static void destroy() { + server.stop(); + } + + @Test + public void givenRouter_whenGetTest_thenGotHelloWorld() throws Exception { + client.get() + .uri("/test") + .exchange() + .expectStatus() + .isOk() + .expectBody(String.class) + .isEqualTo("helloworld"); + } + + @Test + public void givenIndexFilter_whenRequestRoot_thenRewrittenToTest() throws Exception { + client.get() + .uri("/") + .exchange() + .expectStatus() + .isOk() + .expectBody(String.class) + .isEqualTo("helloworld"); + } + + @Test + public void givenLoginForm_whenPostValidToken_thenSuccess() throws Exception { + MultiValueMap formData = new LinkedMultiValueMap<>(1); + formData.add("user", "baeldung"); + formData.add("token", "you_know_what_to_do"); + + client.post() + .uri("/login") + .contentType(MediaType.APPLICATION_FORM_URLENCODED) + .body(BodyInserters.fromFormData(formData)) + .exchange() + .expectStatus() + .isOk() + .expectBody(String.class) + .isEqualTo("welcome back!"); + } + + @Test + public void givenLoginForm_whenRequestWithInvalidToken_thenFail() throws Exception { + MultiValueMap formData = new LinkedMultiValueMap<>(2); + formData.add("user", "baeldung"); + formData.add("token", "try_again"); + + client.post() + .uri("/login") + .contentType(MediaType.APPLICATION_FORM_URLENCODED) + .body(BodyInserters.fromFormData(formData)) + .exchange() + .expectStatus() + .isBadRequest(); + } + + @Test + public void givenUploadForm_whenRequestWithMultipartData_thenSuccess() throws Exception { + Resource resource = new ClassPathResource("/baeldung-weekly.png"); + client.post() + .uri("/upload") + .contentType(MediaType.MULTIPART_FORM_DATA) + .body(fromResource(resource)) + .exchange() + .expectStatus() + .isOk() + .expectBody(String.class) + .isEqualTo(String.valueOf(resource.contentLength())); + } + + @Test + public void givenActors_whenAddActor_thenAdded() throws Exception { + client.get() + .uri("/actor") + .exchange() + .expectStatus() + .isOk() + .expectBodyList(Actor.class) + .hasSize(2); + + client.post() + .uri("/actor") + .body(fromObject(new Actor("Clint", "Eastwood"))) + .exchange() + .expectStatus() + .isOk(); + + client.get() + .uri("/actor") + .exchange() + .expectStatus() + .isOk() + .expectBodyList(Actor.class) + .hasSize(3); + } + + @Test + public void givenResources_whenAccess_thenGot() throws Exception { + client.get() + .uri("/files/hello.txt") + .exchange() + .expectStatus() + .isOk() + .expectBody(String.class) + .isEqualTo("hello"); + } + +} diff --git a/spring-5-reactive/src/test/java/com/baeldung/jsonb/JsonbIntegrationTest.java b/spring-5-reactive/src/test/java/com/baeldung/jsonb/JsonbIntegrationTest.java new file mode 100644 index 0000000000..756b303f3b --- /dev/null +++ b/spring-5-reactive/src/test/java/com/baeldung/jsonb/JsonbIntegrationTest.java @@ -0,0 +1,43 @@ +package com.baeldung.jsonb; + +import static org.junit.Assert.assertTrue; + +import java.math.BigDecimal; +import java.time.LocalDate; + +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.boot.test.web.client.TestRestTemplate; +import org.springframework.http.ResponseEntity; +import org.springframework.test.context.junit4.SpringRunner; + +@RunWith(SpringRunner.class) +@SpringBootTest(classes = Spring5Application.class, webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT) +public class JsonbIntegrationTest { + @Value("${security.user.name}") + private String username; + @Value("${security.user.password}") + private String password; + + @Autowired + private TestRestTemplate template; + + @Test + public void givenId_whenUriIsPerson_thenGetPerson() { + ResponseEntity response = template.withBasicAuth(username, password) + .getForEntity("/person/1", Person.class); + Person person = response.getBody(); + assertTrue(person.equals(new Person(2, "Jhon", "jhon1@test.com", 0, LocalDate.of(2019, 9, 9), BigDecimal.valueOf(1500.0)))); + } + + @Test + public void whenSendPostAPerson_thenGetOkStatus() { + ResponseEntity response = template.withBasicAuth(username, password) + .postForEntity("/person", "{\"birthDate\":\"07-09-2017\",\"email\":\"jhon1@test.com\",\"person-name\":\"Jhon\",\"id\":10}", Boolean.class); + assertTrue(response.getBody()); + } + +} diff --git a/spring-5-reactive/src/test/java/com/baeldung/jupiter/EnabledOnJava8.java b/spring-5-reactive/src/test/java/com/baeldung/jupiter/EnabledOnJava8.java new file mode 100644 index 0000000000..c6d3b7ff10 --- /dev/null +++ b/spring-5-reactive/src/test/java/com/baeldung/jupiter/EnabledOnJava8.java @@ -0,0 +1,18 @@ +package com.baeldung.jupiter; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +import org.springframework.test.context.junit.jupiter.EnabledIf; + +@Target({ ElementType.TYPE, ElementType.METHOD }) +@Retention(RetentionPolicy.RUNTIME) +@EnabledIf( + expression = "#{systemProperties['java.version'].startsWith('1.8')}", + reason = "Enabled on Java 8" +) +public @interface EnabledOnJava8 { + +} diff --git a/spring-5-reactive/src/test/java/com/baeldung/jupiter/Spring5EnabledAnnotationTest.java b/spring-5-reactive/src/test/java/com/baeldung/jupiter/Spring5EnabledAnnotationTest.java new file mode 100644 index 0000000000..ae058bc8ba --- /dev/null +++ b/spring-5-reactive/src/test/java/com/baeldung/jupiter/Spring5EnabledAnnotationTest.java @@ -0,0 +1,50 @@ +package com.baeldung.jupiter; + +import static org.junit.jupiter.api.Assertions.assertTrue; + +import org.junit.jupiter.api.Test; +import org.springframework.context.annotation.Configuration; +import org.springframework.test.context.TestPropertySource; +import org.springframework.test.context.junit.jupiter.DisabledIf; +import org.springframework.test.context.junit.jupiter.EnabledIf; +import org.springframework.test.context.junit.jupiter.SpringJUnitConfig; + +@SpringJUnitConfig(Spring5EnabledAnnotationTest.Config.class) +@TestPropertySource(properties = { "tests.enabled=true" }) +public class Spring5EnabledAnnotationTest { + + @Configuration + static class Config { + } + + @EnabledIf("true") + @Test + void givenEnabledIfLiteral_WhenTrue_ThenTestExecuted() { + assertTrue(true); + } + + @EnabledIf(expression = "${tests.enabled}", loadContext = true) + @Test + void givenEnabledIfExpression_WhenTrue_ThenTestExecuted() { + assertTrue(true); + } + + @EnabledIf("#{systemProperties['java.version'].startsWith('1.8')}") + @Test + void givenEnabledIfSpel_WhenTrue_ThenTestExecuted() { + assertTrue(true); + } + + @EnabledOnJava8 + @Test + void givenEnabledOnJava8_WhenTrue_ThenTestExecuted() { + assertTrue(true); + } + + @DisabledIf("#{systemProperties['java.version'].startsWith('1.7')}") + @Test + void givenDisabledIf_WhenTrue_ThenTestNotExecuted() { + assertTrue(true); + } + +} diff --git a/spring-5-reactive/src/test/java/com/baeldung/jupiter/Spring5JUnit5ComposedAnnotationIntegrationTest.java b/spring-5-reactive/src/test/java/com/baeldung/jupiter/Spring5JUnit5ComposedAnnotationIntegrationTest.java new file mode 100644 index 0000000000..42d27b90f4 --- /dev/null +++ b/spring-5-reactive/src/test/java/com/baeldung/jupiter/Spring5JUnit5ComposedAnnotationIntegrationTest.java @@ -0,0 +1,38 @@ +package com.baeldung.jupiter; + +import com.baeldung.web.reactive.Task; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.ApplicationContext; + +import java.util.List; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNotNull; + +@SpringJUnit5Config(TestConfig.class) +@DisplayName("@SpringJUnit5Config Tests") +class Spring5JUnit5ComposedAnnotationIntegrationTest { + + @Autowired + private Task task; + + @Autowired + private List tasks; + + @Test + @DisplayName("ApplicationContext injected into method") + void givenAMethodName_whenInjecting_thenApplicationContextInjectedIntoMethod(ApplicationContext applicationContext) { + assertNotNull(applicationContext, "ApplicationContext should have been injected into method by Spring"); + assertEquals(this.task, applicationContext.getBean("taskName", Task.class)); + } + + @Test + @DisplayName("Spring @Beans injected into fields") + void givenAnObject_whenInjecting_thenSpringBeansInjected() { + assertNotNull(task, "Task should have been @Autowired by Spring"); + assertEquals("taskName", task.getName(), "Task's name"); + assertEquals(1, tasks.size(), "Number of Tasks in context"); + } +} diff --git a/spring-5-reactive/src/test/java/com/baeldung/jupiter/Spring5JUnit5IntegrationTest.java b/spring-5-reactive/src/test/java/com/baeldung/jupiter/Spring5JUnit5IntegrationTest.java new file mode 100644 index 0000000000..0f00a85832 --- /dev/null +++ b/spring-5-reactive/src/test/java/com/baeldung/jupiter/Spring5JUnit5IntegrationTest.java @@ -0,0 +1,25 @@ +package com.baeldung.jupiter; + +import com.baeldung.web.reactive.Task; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.ApplicationContext; +import org.springframework.test.context.ContextConfiguration; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNotNull; + +@ExtendWith(SpringExtension.class) +@ContextConfiguration(classes = TestConfig.class) +class Spring5JUnit5IntegrationTest { + + @Autowired + private Task task; + + @Test + void givenAMethodName_whenInjecting_thenApplicationContextInjectedIntoMetho(ApplicationContext applicationContext) { + assertNotNull(applicationContext, "ApplicationContext should have been injected by Spring"); + assertEquals(this.task, applicationContext.getBean("taskName", Task.class)); + } +} diff --git a/spring-5-reactive/src/test/java/com/baeldung/jupiter/Spring5JUnit5ParallelIntegrationTest.java b/spring-5-reactive/src/test/java/com/baeldung/jupiter/Spring5JUnit5ParallelIntegrationTest.java new file mode 100644 index 0000000000..55b0fcf267 --- /dev/null +++ b/spring-5-reactive/src/test/java/com/baeldung/jupiter/Spring5JUnit5ParallelIntegrationTest.java @@ -0,0 +1,25 @@ +package com.baeldung.jupiter; + +import com.baeldung.Example1IntegrationTest; +import com.baeldung.Example2IntegrationTest; +import org.junit.experimental.ParallelComputer; +import org.junit.jupiter.api.Test; +import org.junit.runner.Computer; +import org.junit.runner.JUnitCore; + +class Spring5JUnit5ParallelIntegrationTest { + + @Test + void givenTwoTestClasses_whenJUnitRunParallel_thenTheTestsExecutingParallel() { + final Class[] classes = { Example1IntegrationTest.class, Example2IntegrationTest.class }; + + JUnitCore.runClasses(new ParallelComputer(true, true), classes); + } + + @Test + void givenTwoTestClasses_whenJUnitRunParallel_thenTheTestsExecutingLinear() { + final Class[] classes = { Example1IntegrationTest.class, Example2IntegrationTest.class }; + + JUnitCore.runClasses(new Computer(), classes); + } +} \ No newline at end of file diff --git a/spring-5-reactive/src/test/java/com/baeldung/jupiter/Spring5Java8NewFeaturesIntegrationTest.java b/spring-5-reactive/src/test/java/com/baeldung/jupiter/Spring5Java8NewFeaturesIntegrationTest.java new file mode 100644 index 0000000000..f58bf9f3cd --- /dev/null +++ b/spring-5-reactive/src/test/java/com/baeldung/jupiter/Spring5Java8NewFeaturesIntegrationTest.java @@ -0,0 +1,31 @@ +package com.baeldung.jupiter; + +import org.junit.jupiter.api.Test; + +import java.util.function.Supplier; +import java.util.regex.Pattern; +import java.util.stream.Collectors; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +class Spring5Java8NewFeaturesIntegrationTest { + + @FunctionalInterface + public interface FunctionalInterfaceExample { + Result reverseString(Input input); + } + + public class StringUtils { + FunctionalInterfaceExample functionLambdaString = s -> Pattern.compile(" +") + .splitAsStream(s) + .map(word -> new StringBuilder(word).reverse()) + .collect(Collectors.joining(" ")); + } + + @Test + void givenStringUtil_whenSupplierCall_thenFunctionalInterfaceReverseString() throws Exception { + Supplier stringUtilsSupplier = StringUtils::new; + + assertEquals(stringUtilsSupplier.get().functionLambdaString.reverseString("hello"), "olleh"); + } +} diff --git a/spring-5-reactive/src/test/java/com/baeldung/jupiter/Spring5ReactiveServerClientIntegrationTest.java b/spring-5-reactive/src/test/java/com/baeldung/jupiter/Spring5ReactiveServerClientIntegrationTest.java new file mode 100644 index 0000000000..bbd852d625 --- /dev/null +++ b/spring-5-reactive/src/test/java/com/baeldung/jupiter/Spring5ReactiveServerClientIntegrationTest.java @@ -0,0 +1,94 @@ +package com.baeldung.jupiter; + +import com.baeldung.web.reactive.Task; +import org.junit.jupiter.api.AfterAll; +import org.junit.jupiter.api.BeforeAll; +import org.springframework.http.server.reactive.HttpHandler; +import org.springframework.http.server.reactive.ReactorHttpHandlerAdapter; +import org.springframework.web.reactive.function.server.RouterFunction; +import org.springframework.web.reactive.function.server.RouterFunctions; +import org.springframework.web.reactive.function.server.ServerResponse; +import reactor.core.publisher.Flux; +import reactor.core.publisher.Mono; +import reactor.ipc.netty.NettyContext; +import reactor.ipc.netty.http.server.HttpServer; + +import java.time.Duration; + +import static org.springframework.web.reactive.function.server.RequestPredicates.GET; +import static org.springframework.web.reactive.function.server.RequestPredicates.POST; + +public class Spring5ReactiveServerClientIntegrationTest { + + private static NettyContext nettyContext; + + @BeforeAll + public static void setUp() throws Exception { + HttpServer server = HttpServer.create("localhost", 8080); + RouterFunction route = RouterFunctions.route(POST("/task/process"), request -> ServerResponse.ok() + .body(request.bodyToFlux(Task.class) + .map(ll -> new Task("TaskName", 1)), Task.class)) + .and(RouterFunctions.route(GET("/task"), request -> ServerResponse.ok() + .body(Mono.just("server is alive"), String.class))); + HttpHandler httpHandler = RouterFunctions.toHttpHandler(route); + ReactorHttpHandlerAdapter adapter = new ReactorHttpHandlerAdapter(httpHandler); + nettyContext = server.newHandler(adapter) + .block(); + } + + @AfterAll + public static void shutDown() { + nettyContext.dispose(); + } + + // @Test + // public void givenCheckTask_whenServerHandle_thenServerResponseALiveString() throws Exception { + // WebClient client = WebClient.create("http://localhost:8080"); + // Mono result = client + // .get() + // .uri("/task") + // .exchange() + // .then(response -> response.bodyToMono(String.class)); + // + // assertThat(result.block()).isInstanceOf(String.class); + // } + + // @Test + // public void givenThreeTasks_whenServerHandleTheTasks_thenServerResponseATask() throws Exception { + // URI uri = URI.create("http://localhost:8080/task/process"); + // ExchangeFunction exchange = ExchangeFunctions.create(new ReactorClientHttpConnector()); + // ClientRequest request = ClientRequest + // .method(HttpMethod.POST, uri) + // .body(BodyInserters.fromPublisher(getLatLngs(), Task.class)) + // .build(); + // + // Flux taskResponse = exchange + // .exchange(request) + // .flatMap(response -> response.bodyToFlux(Task.class)); + // + // assertThat(taskResponse.blockFirst()).isInstanceOf(Task.class); + // } + + // @Test + // public void givenCheckTask_whenServerHandle_thenOragicServerResponseALiveString() throws Exception { + // URI uri = URI.create("http://localhost:8080/task"); + // ExchangeFunction exchange = ExchangeFunctions.create(new ReactorClientHttpConnector()); + // ClientRequest request = ClientRequest + // .method(HttpMethod.GET, uri) + // .body(BodyInserters.fromPublisher(getLatLngs(), Task.class)) + // .build(); + // + // Flux taskResponse = exchange + // .exchange(request) + // .flatMap(response -> response.bodyToFlux(String.class)); + // + // assertThat(taskResponse.blockFirst()).isInstanceOf(String.class); + // } + + private static Flux getLatLngs() { + return Flux.range(0, 3) + .zipWith(Flux.interval(Duration.ofSeconds(1))) + .map(x -> new Task("taskname", 1)) + .doOnNext(ll -> System.out.println("Produced: {}" + ll)); + } +} diff --git a/spring-5-reactive/src/test/java/com/baeldung/jupiter/SpringJUnitConfigTest.java b/spring-5-reactive/src/test/java/com/baeldung/jupiter/SpringJUnitConfigTest.java new file mode 100644 index 0000000000..6b0a6f9808 --- /dev/null +++ b/spring-5-reactive/src/test/java/com/baeldung/jupiter/SpringJUnitConfigTest.java @@ -0,0 +1,33 @@ +package com.baeldung.jupiter; + +import static org.junit.Assert.assertNotNull; + +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.ApplicationContext; +import org.springframework.context.annotation.Configuration; +import org.springframework.test.context.junit.jupiter.SpringJUnitConfig; + +/** + * @SpringJUnitConfig(SpringJUnitConfigTest.Config.class) is equivalent to: + * + * @ExtendWith(SpringExtension.class) + * @ContextConfiguration(classes = SpringJUnitConfigTest.Config.class ) + * + */ +@SpringJUnitConfig(SpringJUnitConfigTest.Config.class) +public class SpringJUnitConfigTest { + + @Configuration + static class Config { + } + + @Autowired + private ApplicationContext applicationContext; + + @Test + void givenAppContext_WhenInjected_ThenItShouldNotBeNull() { + assertNotNull(applicationContext); + } + +} diff --git a/spring-5-reactive/src/test/java/com/baeldung/jupiter/SpringJUnitWebConfigTest.java b/spring-5-reactive/src/test/java/com/baeldung/jupiter/SpringJUnitWebConfigTest.java new file mode 100644 index 0000000000..c679dce77f --- /dev/null +++ b/spring-5-reactive/src/test/java/com/baeldung/jupiter/SpringJUnitWebConfigTest.java @@ -0,0 +1,34 @@ +package com.baeldung.jupiter; + +import static org.junit.Assert.assertNotNull; + +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Configuration; +import org.springframework.test.context.junit.jupiter.web.SpringJUnitWebConfig; +import org.springframework.web.context.WebApplicationContext; + +/** + * @SpringJUnitWebConfig(SpringJUnitWebConfigTest.Config.class) is equivalent to: + * + * @ExtendWith(SpringExtension.class) + * @WebAppConfiguration + * @ContextConfiguration(classes = SpringJUnitWebConfigTest.Config.class ) + * + */ +@SpringJUnitWebConfig(SpringJUnitWebConfigTest.Config.class) +public class SpringJUnitWebConfigTest { + + @Configuration + static class Config { + } + + @Autowired + private WebApplicationContext webAppContext; + + @Test + void givenWebAppContext_WhenInjected_ThenItShouldNotBeNull() { + assertNotNull(webAppContext); + } + +} diff --git a/spring-5-reactive/src/test/java/com/baeldung/security/SecurityTest.java b/spring-5-reactive/src/test/java/com/baeldung/security/SecurityTest.java new file mode 100644 index 0000000000..a1c940a17a --- /dev/null +++ b/spring-5-reactive/src/test/java/com/baeldung/security/SecurityTest.java @@ -0,0 +1,48 @@ +package com.baeldung.security; + +import com.baeldung.SpringSecurity5Application; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.ApplicationContext; +import org.springframework.security.test.context.support.WithMockUser; +import org.springframework.test.context.ContextConfiguration; +import org.springframework.test.context.junit4.SpringRunner; +import org.springframework.test.web.reactive.server.WebTestClient; + +@RunWith(SpringRunner.class) +@ContextConfiguration(classes = SpringSecurity5Application.class) +public class SecurityTest { + + @Autowired + ApplicationContext context; + + private WebTestClient rest; + + @Before + public void setup() { + this.rest = WebTestClient + .bindToApplicationContext(this.context) + .configureClient() + .build(); + } + + @Test + public void whenNoCredentials_thenRedirectToLogin() { + this.rest.get() + .uri("/") + .exchange() + .expectStatus().is3xxRedirection(); + } + + @Test + @WithMockUser + public void whenHasCredentials_thenSeesGreeting() { + this.rest.get() + .uri("/") + .exchange() + .expectStatus().isOk() + .expectBody(String.class).isEqualTo("Hello, user"); + } +} diff --git a/spring-5-reactive/src/test/java/com/baeldung/web/PathPatternsUsingHandlerMethodIntegrationTest.java b/spring-5-reactive/src/test/java/com/baeldung/web/PathPatternsUsingHandlerMethodIntegrationTest.java new file mode 100644 index 0000000000..c2ed8ff071 --- /dev/null +++ b/spring-5-reactive/src/test/java/com/baeldung/web/PathPatternsUsingHandlerMethodIntegrationTest.java @@ -0,0 +1,101 @@ +package com.baeldung.web; + +import com.baeldung.Spring5Application; +import org.junit.BeforeClass; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.test.context.junit4.SpringRunner; +import org.springframework.test.web.reactive.server.WebTestClient; + +@RunWith(SpringRunner.class) +@SpringBootTest(classes = Spring5Application.class) +public class PathPatternsUsingHandlerMethodIntegrationTest { + + private static WebTestClient client; + + @BeforeClass + public static void setUp() { + client = WebTestClient.bindToController(new PathPatternController()) + .build(); + } + + @Test + public void givenHandlerMethod_whenMultipleURIVariablePattern_then200() { + + client.get() + .uri("/spring5/ab/cd") + .exchange() + .expectStatus() + .is2xxSuccessful() + .expectBody() + .equals("/ab/cd"); + } + + @Test + public void givenHandlerMethod_whenURLWithWildcardTakingZeroOrMoreChar_then200() { + + client.get() + .uri("/spring5/userid") + .exchange() + .expectStatus() + .is2xxSuccessful() + .expectBody() + .equals("/spring5/*id"); + } + + @Test + public void givenHandlerMethod_whenURLWithWildcardTakingExactlyOneChar_then200() { + + client.get() + .uri("/string5") + .exchange() + .expectStatus() + .is2xxSuccessful() + .expectBody() + .equals("/s?ring5"); + } + + @Test + public void givenHandlerMethod_whenURLWithWildcardTakingZeroOrMorePathSegments_then200() { + + client.get() + .uri("/resources/baeldung") + .exchange() + .expectStatus() + .is2xxSuccessful() + .expectBody() + .equals("/resources/**"); + } + + @Test + public void givenHandlerMethod_whenURLWithRegexInPathVariable_thenExpectedOutput() { + + client.get() + .uri("/abc") + .exchange() + .expectStatus() + .is2xxSuccessful() + .expectBody() + .equals("abc"); + + client.get() + .uri("/123") + .exchange() + .expectStatus() + .is4xxClientError(); + } + + @Test + public void givenHandlerMethod_whenURLWithMultiplePathVariablesInSameSegment_then200() { + + client.get() + .uri("/baeldung_tutorial") + .exchange() + .expectStatus() + .is2xxSuccessful() + .expectBody() + .equals("Two variables are var1=baeldung and var2=tutorial"); + } + +} diff --git a/spring-5-reactive/src/test/java/com/baeldung/web/client/WebTestClientTest.java b/spring-5-reactive/src/test/java/com/baeldung/web/client/WebTestClientTest.java new file mode 100644 index 0000000000..43114b5b50 --- /dev/null +++ b/spring-5-reactive/src/test/java/com/baeldung/web/client/WebTestClientTest.java @@ -0,0 +1,60 @@ +package com.baeldung.web.client; + +import com.baeldung.Spring5Application; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.boot.web.server.LocalServerPort; +import org.springframework.test.context.junit4.SpringRunner; +import org.springframework.test.web.reactive.server.WebTestClient; +import org.springframework.web.reactive.function.server.RequestPredicates; +import org.springframework.web.reactive.function.server.RouterFunction; +import org.springframework.web.reactive.function.server.RouterFunctions; +import org.springframework.web.reactive.function.server.ServerResponse; +import org.springframework.web.server.WebHandler; +import reactor.core.publisher.Mono; + +@RunWith(SpringRunner.class) +@SpringBootTest(classes = Spring5Application.class, webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT) +public class WebTestClientTest { + + @LocalServerPort + private int port; + + private final RouterFunction ROUTER_FUNCTION = RouterFunctions.route(RequestPredicates.GET("/resource"), request -> ServerResponse.ok() + .build()); + private final WebHandler WEB_HANDLER = exchange -> Mono.empty(); + + @Test + public void testWebTestClientWithServerWebHandler() { + WebTestClient.bindToWebHandler(WEB_HANDLER) + .build(); + } + + @Test + public void testWebTestClientWithRouterFunction() { + WebTestClient.bindToRouterFunction(ROUTER_FUNCTION) + .build() + .get() + .uri("/resource") + .exchange() + .expectStatus() + .isOk() + .expectBody() + .isEmpty(); + } + + @Test + public void testWebTestClientWithServerURL() { + WebTestClient.bindToServer() + .baseUrl("http://localhost:" + port) + .build() + .get() + .uri("/resource") + .exchange() + .expectStatus() + .is3xxRedirection() + .expectBody(); + } + +} diff --git a/spring-5-reactive/src/test/resources/baeldung-weekly.png b/spring-5-reactive/src/test/resources/baeldung-weekly.png new file mode 100644 index 0000000000000000000000000000000000000000..5a27d61dae718016a947083e01411ed1bc14f90e GIT binary patch literal 22275 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 Date: Wed, 13 Dec 2017 13:10:46 +0100 Subject: [PATCH 192/236] Update pom.xml (#3232) --- pom.xml | 2 -- 1 file changed, 2 deletions(-) diff --git a/pom.xml b/pom.xml index 88f54be629..2c611e6efe 100644 --- a/pom.xml +++ b/pom.xml @@ -49,8 +49,6 @@ core-java-8 core-java-concurrency couchbase - cas/cas-server - cas/cas-secured-app deltaspike dozer From df8b6bea54252e476327480cd769799d47abf710 Mon Sep 17 00:00:00 2001 From: Eugen Paraschiv Date: Wed, 13 Dec 2017 15:15:46 +0200 Subject: [PATCH 193/236] reactive work --- spring-5-reactive/pom.xml | 24 ++- .../java/com/baeldung/Spring5Application.java | 15 -- .../baeldung/SpringSecurity5Application.java | 34 ----- .../java/com/baeldung/functional/Actor.java | 23 --- ...Spring5URLPatternUsingRouterFunctions.java | 61 -------- .../com/baeldung/functional/FormHandler.java | 41 ----- .../FunctionalSpringBootApplication.java | 87 ----------- .../functional/FunctionalWebApplication.java | 80 ---------- .../functional/IndexRewriteFilter.java | 27 ---- .../com/baeldung/functional/MyService.java | 11 -- .../com/baeldung/functional/RootServlet.java | 82 ---------- .../main/java/com/baeldung/jsonb/Person.java | 127 ---------------- .../com/baeldung/jsonb/PersonController.java | 58 ------- .../baeldung/jsonb/Spring5Application.java | 30 ---- .../jupiter/MethodParameterFactory.java | 46 ------ .../jupiter/ParameterAutowireUtils.java | 44 ------ .../com/baeldung/jupiter/SpringExtension.java | 94 ------------ .../baeldung/jupiter/SpringJUnit5Config.java | 39 ----- .../java/com/baeldung/jupiter/TestConfig.java | 20 --- .../baeldung/persistence/DataSetupBean.java | 27 ---- .../baeldung/persistence/FooRepository.java | 10 -- .../reactive/Spring5ReactiveApplication.java | 13 ++ .../com/baeldung/reactive/controller/Foo.java | 13 ++ .../controller/FooReactiveController.java | 34 +++++ .../baeldung/security/GreetController.java | 37 ----- .../com/baeldung/security/GreetService.java | 15 -- .../com/baeldung/security/SecurityConfig.java | 42 ------ .../src/main/java/com/baeldung/web/Foo.java | 84 ----------- .../java/com/baeldung/web/FooController.java | 53 ------- .../baeldung/web/PathPatternController.java | 39 ----- .../java/com/baeldung/web/reactive/Task.java | 28 ---- .../reactive/client/WebClientController.java | 85 ----------- .../src/main/resources/application.properties | 2 - .../com/baeldung/Example1IntegrationTest.java | 29 ---- .../com/baeldung/Example2IntegrationTest.java | 29 ---- .../com/baeldung/ParallelIntegrationTest.java | 24 --- .../Spring5ApplicationIntegrationTest.java | 16 -- ...pring5JUnit4ConcurrentIntegrationTest.java | 52 ------- .../functional/BeanRegistrationTest.java | 42 ------ ...ng5URLPatternUsingRouterFunctionsTest.java | 110 -------------- ...nctionalWebApplicationIntegrationTest.java | 141 ------------------ .../baeldung/jsonb/JsonbIntegrationTest.java | 43 ------ .../com/baeldung/jupiter/EnabledOnJava8.java | 18 --- .../jupiter/Spring5EnabledAnnotationTest.java | 50 ------- ...nit5ComposedAnnotationIntegrationTest.java | 38 ----- .../jupiter/Spring5JUnit5IntegrationTest.java | 25 ---- .../Spring5JUnit5ParallelIntegrationTest.java | 25 ---- ...pring5Java8NewFeaturesIntegrationTest.java | 31 ---- ...g5ReactiveServerClientIntegrationTest.java | 94 ------------ .../jupiter/SpringJUnitConfigTest.java | 33 ---- .../jupiter/SpringJUnitWebConfigTest.java | 34 ----- .../com/baeldung/security/SecurityTest.java | 48 ------ ...ernsUsingHandlerMethodIntegrationTest.java | 101 ------------- .../web/client/WebTestClientTest.java | 60 -------- .../src/test/resources/baeldung-weekly.png | Bin 22275 -> 0 bytes 55 files changed, 71 insertions(+), 2397 deletions(-) delete mode 100644 spring-5-reactive/src/main/java/com/baeldung/Spring5Application.java delete mode 100644 spring-5-reactive/src/main/java/com/baeldung/SpringSecurity5Application.java delete mode 100644 spring-5-reactive/src/main/java/com/baeldung/functional/Actor.java delete mode 100644 spring-5-reactive/src/main/java/com/baeldung/functional/ExploreSpring5URLPatternUsingRouterFunctions.java delete mode 100644 spring-5-reactive/src/main/java/com/baeldung/functional/FormHandler.java delete mode 100644 spring-5-reactive/src/main/java/com/baeldung/functional/FunctionalSpringBootApplication.java delete mode 100644 spring-5-reactive/src/main/java/com/baeldung/functional/FunctionalWebApplication.java delete mode 100644 spring-5-reactive/src/main/java/com/baeldung/functional/IndexRewriteFilter.java delete mode 100644 spring-5-reactive/src/main/java/com/baeldung/functional/MyService.java delete mode 100644 spring-5-reactive/src/main/java/com/baeldung/functional/RootServlet.java delete mode 100644 spring-5-reactive/src/main/java/com/baeldung/jsonb/Person.java delete mode 100644 spring-5-reactive/src/main/java/com/baeldung/jsonb/PersonController.java delete mode 100644 spring-5-reactive/src/main/java/com/baeldung/jsonb/Spring5Application.java delete mode 100644 spring-5-reactive/src/main/java/com/baeldung/jupiter/MethodParameterFactory.java delete mode 100644 spring-5-reactive/src/main/java/com/baeldung/jupiter/ParameterAutowireUtils.java delete mode 100644 spring-5-reactive/src/main/java/com/baeldung/jupiter/SpringExtension.java delete mode 100644 spring-5-reactive/src/main/java/com/baeldung/jupiter/SpringJUnit5Config.java delete mode 100644 spring-5-reactive/src/main/java/com/baeldung/jupiter/TestConfig.java delete mode 100644 spring-5-reactive/src/main/java/com/baeldung/persistence/DataSetupBean.java delete mode 100644 spring-5-reactive/src/main/java/com/baeldung/persistence/FooRepository.java create mode 100644 spring-5-reactive/src/main/java/com/baeldung/reactive/Spring5ReactiveApplication.java create mode 100644 spring-5-reactive/src/main/java/com/baeldung/reactive/controller/Foo.java create mode 100644 spring-5-reactive/src/main/java/com/baeldung/reactive/controller/FooReactiveController.java delete mode 100644 spring-5-reactive/src/main/java/com/baeldung/security/GreetController.java delete mode 100644 spring-5-reactive/src/main/java/com/baeldung/security/GreetService.java delete mode 100644 spring-5-reactive/src/main/java/com/baeldung/security/SecurityConfig.java delete mode 100644 spring-5-reactive/src/main/java/com/baeldung/web/Foo.java delete mode 100644 spring-5-reactive/src/main/java/com/baeldung/web/FooController.java delete mode 100644 spring-5-reactive/src/main/java/com/baeldung/web/PathPatternController.java delete mode 100644 spring-5-reactive/src/main/java/com/baeldung/web/reactive/Task.java delete mode 100644 spring-5-reactive/src/main/java/com/baeldung/web/reactive/client/WebClientController.java delete mode 100644 spring-5-reactive/src/test/java/com/baeldung/Example1IntegrationTest.java delete mode 100644 spring-5-reactive/src/test/java/com/baeldung/Example2IntegrationTest.java delete mode 100644 spring-5-reactive/src/test/java/com/baeldung/ParallelIntegrationTest.java delete mode 100644 spring-5-reactive/src/test/java/com/baeldung/Spring5ApplicationIntegrationTest.java delete mode 100644 spring-5-reactive/src/test/java/com/baeldung/Spring5JUnit4ConcurrentIntegrationTest.java delete mode 100644 spring-5-reactive/src/test/java/com/baeldung/functional/BeanRegistrationTest.java delete mode 100644 spring-5-reactive/src/test/java/com/baeldung/functional/ExploreSpring5URLPatternUsingRouterFunctionsTest.java delete mode 100644 spring-5-reactive/src/test/java/com/baeldung/functional/FunctionalWebApplicationIntegrationTest.java delete mode 100644 spring-5-reactive/src/test/java/com/baeldung/jsonb/JsonbIntegrationTest.java delete mode 100644 spring-5-reactive/src/test/java/com/baeldung/jupiter/EnabledOnJava8.java delete mode 100644 spring-5-reactive/src/test/java/com/baeldung/jupiter/Spring5EnabledAnnotationTest.java delete mode 100644 spring-5-reactive/src/test/java/com/baeldung/jupiter/Spring5JUnit5ComposedAnnotationIntegrationTest.java delete mode 100644 spring-5-reactive/src/test/java/com/baeldung/jupiter/Spring5JUnit5IntegrationTest.java delete mode 100644 spring-5-reactive/src/test/java/com/baeldung/jupiter/Spring5JUnit5ParallelIntegrationTest.java delete mode 100644 spring-5-reactive/src/test/java/com/baeldung/jupiter/Spring5Java8NewFeaturesIntegrationTest.java delete mode 100644 spring-5-reactive/src/test/java/com/baeldung/jupiter/Spring5ReactiveServerClientIntegrationTest.java delete mode 100644 spring-5-reactive/src/test/java/com/baeldung/jupiter/SpringJUnitConfigTest.java delete mode 100644 spring-5-reactive/src/test/java/com/baeldung/jupiter/SpringJUnitWebConfigTest.java delete mode 100644 spring-5-reactive/src/test/java/com/baeldung/security/SecurityTest.java delete mode 100644 spring-5-reactive/src/test/java/com/baeldung/web/PathPatternsUsingHandlerMethodIntegrationTest.java delete mode 100644 spring-5-reactive/src/test/java/com/baeldung/web/client/WebTestClientTest.java delete mode 100644 spring-5-reactive/src/test/resources/baeldung-weekly.png diff --git a/spring-5-reactive/pom.xml b/spring-5-reactive/pom.xml index 43d9a5ed94..c1c18fbc82 100644 --- a/spring-5-reactive/pom.xml +++ b/spring-5-reactive/pom.xml @@ -22,10 +22,6 @@ org.springframework.boot spring-boot-starter-data-jpa - - org.springframework.boot - spring-boot-starter-security - org.springframework.boot spring-boot-starter-validation @@ -46,8 +42,8 @@ javax.json.bind javax.json.bind-api - ${jsonb-api.version} + @@ -60,6 +56,7 @@ + org.apache.geronimo.specs geronimo-json_1.1_spec @@ -68,7 +65,6 @@ org.apache.johnzon johnzon-jsonb - ${johnzon.version} @@ -98,11 +94,6 @@ spring-boot-starter-test test - - org.springframework.security - spring-security-test - test - org.apache.commons @@ -114,12 +105,10 @@ org.junit.jupiter junit-jupiter-api - ${junit.jupiter.version} org.junit.jupiter junit-jupiter-engine - ${junit.jupiter.version} test @@ -135,6 +124,15 @@ test + + org.projectlombok + lombok + + + org.apache.commons + commons-lang3 + + diff --git a/spring-5-reactive/src/main/java/com/baeldung/Spring5Application.java b/spring-5-reactive/src/main/java/com/baeldung/Spring5Application.java deleted file mode 100644 index f321871646..0000000000 --- a/spring-5-reactive/src/main/java/com/baeldung/Spring5Application.java +++ /dev/null @@ -1,15 +0,0 @@ -package com.baeldung; - -import org.springframework.boot.SpringApplication; -import org.springframework.boot.autoconfigure.SpringBootApplication; -import org.springframework.context.annotation.ComponentScan; - -@SpringBootApplication -@ComponentScan(basePackages = { "com.baeldung.web" }) -public class Spring5Application { - - public static void main(String[] args) { - SpringApplication.run(Spring5Application.class, args); - } - -} diff --git a/spring-5-reactive/src/main/java/com/baeldung/SpringSecurity5Application.java b/spring-5-reactive/src/main/java/com/baeldung/SpringSecurity5Application.java deleted file mode 100644 index 02c91a1879..0000000000 --- a/spring-5-reactive/src/main/java/com/baeldung/SpringSecurity5Application.java +++ /dev/null @@ -1,34 +0,0 @@ -package com.baeldung; - -import org.springframework.context.ApplicationContext; -import org.springframework.context.annotation.AnnotationConfigApplicationContext; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.ComponentScan; -import org.springframework.http.server.reactive.HttpHandler; -import org.springframework.http.server.reactive.ReactorHttpHandlerAdapter; -import org.springframework.web.reactive.config.EnableWebFlux; -import org.springframework.web.server.adapter.WebHttpHandlerBuilder; -import reactor.ipc.netty.NettyContext; -import reactor.ipc.netty.http.server.HttpServer; - -@ComponentScan(basePackages = {"com.baeldung.security"}) -@EnableWebFlux -public class SpringSecurity5Application { - - public static void main(String[] args) { - try (AnnotationConfigApplicationContext context = - new AnnotationConfigApplicationContext(SpringSecurity5Application.class)) { - context.getBean(NettyContext.class).onClose().block(); - } - } - - @Bean - public NettyContext nettyContext(ApplicationContext context) { - HttpHandler handler = WebHttpHandlerBuilder.applicationContext(context) - .build(); - ReactorHttpHandlerAdapter adapter = new ReactorHttpHandlerAdapter(handler); - HttpServer httpServer = HttpServer.create("localhost", 8080); - return httpServer.newHandler(adapter).block(); - } - -} diff --git a/spring-5-reactive/src/main/java/com/baeldung/functional/Actor.java b/spring-5-reactive/src/main/java/com/baeldung/functional/Actor.java deleted file mode 100644 index 23c88b89e1..0000000000 --- a/spring-5-reactive/src/main/java/com/baeldung/functional/Actor.java +++ /dev/null @@ -1,23 +0,0 @@ -package com.baeldung.functional; - -class Actor { - private String firstname; - private String lastname; - - public Actor() { - } - - public Actor(String firstname, String lastname) { - this.firstname = firstname; - this.lastname = lastname; - } - - public String getFirstname() { - return firstname; - } - - public String getLastname() { - return lastname; - } - -} diff --git a/spring-5-reactive/src/main/java/com/baeldung/functional/ExploreSpring5URLPatternUsingRouterFunctions.java b/spring-5-reactive/src/main/java/com/baeldung/functional/ExploreSpring5URLPatternUsingRouterFunctions.java deleted file mode 100644 index 2a6d04538c..0000000000 --- a/spring-5-reactive/src/main/java/com/baeldung/functional/ExploreSpring5URLPatternUsingRouterFunctions.java +++ /dev/null @@ -1,61 +0,0 @@ -package com.baeldung.functional; - -import static org.springframework.web.reactive.function.BodyInserters.fromObject; -import static org.springframework.web.reactive.function.server.RequestPredicates.GET; -import static org.springframework.web.reactive.function.server.RouterFunctions.route; -import static org.springframework.web.reactive.function.server.RouterFunctions.toHttpHandler; -import static org.springframework.web.reactive.function.server.ServerResponse.ok; - -import org.apache.catalina.Context; -import org.apache.catalina.startup.Tomcat; -import org.springframework.boot.web.embedded.tomcat.TomcatWebServer; -import org.springframework.boot.web.server.WebServer; -import org.springframework.core.io.ClassPathResource; -import org.springframework.http.server.reactive.HttpHandler; -import org.springframework.http.server.reactive.ServletHttpHandlerAdapter; -import org.springframework.web.reactive.function.server.RouterFunction; -import org.springframework.web.reactive.function.server.RouterFunctions; -import org.springframework.web.reactive.function.server.ServerResponse; -import org.springframework.web.server.WebHandler; -import org.springframework.web.server.adapter.WebHttpHandlerBuilder; - -public class ExploreSpring5URLPatternUsingRouterFunctions { - - private RouterFunction routingFunction() { - - return route(GET("/p?ths"), serverRequest -> ok().body(fromObject("/p?ths"))).andRoute(GET("/test/{*id}"), serverRequest -> ok().body(fromObject(serverRequest.pathVariable("id")))) - .andRoute(GET("/*card"), serverRequest -> ok().body(fromObject("/*card path was accessed"))) - .andRoute(GET("/{var1}_{var2}"), serverRequest -> ok().body(fromObject(serverRequest.pathVariable("var1") + " , " + serverRequest.pathVariable("var2")))) - .andRoute(GET("/{baeldung:[a-z]+}"), serverRequest -> ok().body(fromObject("/{baeldung:[a-z]+} was accessed and baeldung=" + serverRequest.pathVariable("baeldung")))) - .and(RouterFunctions.resources("/files/{*filepaths}", new ClassPathResource("files/"))); - } - - WebServer start() throws Exception { - WebHandler webHandler = (WebHandler) toHttpHandler(routingFunction()); - HttpHandler httpHandler = WebHttpHandlerBuilder.webHandler(webHandler) - .filter(new IndexRewriteFilter()) - .build(); - - Tomcat tomcat = new Tomcat(); - tomcat.setHostname("localhost"); - tomcat.setPort(9090); - Context rootContext = tomcat.addContext("", System.getProperty("java.io.tmpdir")); - ServletHttpHandlerAdapter servlet = new ServletHttpHandlerAdapter(httpHandler); - Tomcat.addServlet(rootContext, "httpHandlerServlet", servlet); - rootContext.addServletMappingDecoded("/", "httpHandlerServlet"); - - TomcatWebServer server = new TomcatWebServer(tomcat); - server.start(); - return server; - - } - - public static void main(String[] args) { - try { - new FunctionalWebApplication().start(); - } catch (Exception e) { - e.printStackTrace(); - } - } - -} diff --git a/spring-5-reactive/src/main/java/com/baeldung/functional/FormHandler.java b/spring-5-reactive/src/main/java/com/baeldung/functional/FormHandler.java deleted file mode 100644 index 05069735bb..0000000000 --- a/spring-5-reactive/src/main/java/com/baeldung/functional/FormHandler.java +++ /dev/null @@ -1,41 +0,0 @@ -package com.baeldung.functional; - -import org.springframework.core.io.buffer.DataBuffer; -import org.springframework.util.MultiValueMap; -import org.springframework.web.reactive.function.server.ServerRequest; -import org.springframework.web.reactive.function.server.ServerResponse; -import reactor.core.publisher.Mono; - -import java.util.List; -import java.util.concurrent.atomic.AtomicLong; - -import static org.springframework.web.reactive.function.BodyExtractors.toDataBuffers; -import static org.springframework.web.reactive.function.BodyExtractors.toFormData; -import static org.springframework.web.reactive.function.BodyInserters.fromObject; -import static org.springframework.web.reactive.function.server.ServerResponse.ok; - -public class FormHandler { - - Mono handleLogin(ServerRequest request) { - return request.body(toFormData()) - .map(MultiValueMap::toSingleValueMap) - .filter(formData -> "baeldung".equals(formData.get("user"))) - .filter(formData -> "you_know_what_to_do".equals(formData.get("token"))) - .flatMap(formData -> ok().body(Mono.just("welcome back!"), String.class)) - .switchIfEmpty(ServerResponse.badRequest() - .build()); - } - - Mono handleUpload(ServerRequest request) { - return request.body(toDataBuffers()) - .collectList() - .flatMap(dataBuffers -> ok().body(fromObject(extractData(dataBuffers).toString()))); - } - - private AtomicLong extractData(List dataBuffers) { - AtomicLong atomicLong = new AtomicLong(0); - dataBuffers.forEach(d -> atomicLong.addAndGet(d.asByteBuffer() - .array().length)); - return atomicLong; - } -} diff --git a/spring-5-reactive/src/main/java/com/baeldung/functional/FunctionalSpringBootApplication.java b/spring-5-reactive/src/main/java/com/baeldung/functional/FunctionalSpringBootApplication.java deleted file mode 100644 index 402b607b19..0000000000 --- a/spring-5-reactive/src/main/java/com/baeldung/functional/FunctionalSpringBootApplication.java +++ /dev/null @@ -1,87 +0,0 @@ -package com.baeldung.functional; - -import static org.springframework.web.reactive.function.BodyInserters.fromObject; -import static org.springframework.web.reactive.function.server.RequestPredicates.GET; -import static org.springframework.web.reactive.function.server.RequestPredicates.POST; -import static org.springframework.web.reactive.function.server.RequestPredicates.path; -import static org.springframework.web.reactive.function.server.RouterFunctions.route; -import static org.springframework.web.reactive.function.server.RouterFunctions.toHttpHandler; -import static org.springframework.web.reactive.function.server.ServerResponse.ok; - -import java.util.Arrays; -import java.util.List; -import java.util.concurrent.CopyOnWriteArrayList; - -import org.springframework.boot.SpringApplication; -import org.springframework.boot.autoconfigure.SpringBootApplication; -import org.springframework.boot.web.servlet.ServletRegistrationBean; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.ComponentScan; -import org.springframework.context.annotation.Configuration; -import org.springframework.context.annotation.Profile; -import org.springframework.core.io.ClassPathResource; -import org.springframework.http.server.reactive.HttpHandler; -import org.springframework.security.config.annotation.web.builders.HttpSecurity; -import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; -import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter; -import org.springframework.web.reactive.function.server.RouterFunction; -import org.springframework.web.reactive.function.server.RouterFunctions; -import org.springframework.web.reactive.function.server.ServerResponse; -import org.springframework.web.server.WebHandler; -import org.springframework.web.server.adapter.WebHttpHandlerBuilder; - -import reactor.core.publisher.Flux; - -@SpringBootApplication -@ComponentScan(basePackages = { "com.baeldung.functional" }) -public class FunctionalSpringBootApplication { - - private static final Actor BRAD_PITT = new Actor("Brad", "Pitt"); - private static final Actor TOM_HANKS = new Actor("Tom", "Hanks"); - private static final List actors = new CopyOnWriteArrayList<>(Arrays.asList(BRAD_PITT, TOM_HANKS)); - - private RouterFunction routingFunction() { - FormHandler formHandler = new FormHandler(); - - RouterFunction restfulRouter = route(GET("/"), serverRequest -> ok().body(Flux.fromIterable(actors), Actor.class)).andRoute(POST("/"), serverRequest -> serverRequest.bodyToMono(Actor.class) - .doOnNext(actors::add) - .then(ok().build())); - - return route(GET("/test"), serverRequest -> ok().body(fromObject("helloworld"))).andRoute(POST("/login"), formHandler::handleLogin) - .andRoute(POST("/upload"), formHandler::handleUpload) - .and(RouterFunctions.resources("/files/**", new ClassPathResource("files/"))) - .andNest(path("/actor"), restfulRouter) - .filter((request, next) -> { - System.out.println("Before handler invocation: " + request.path()); - return next.handle(request); - }); - } - - @Bean - public ServletRegistrationBean servletRegistrationBean() throws Exception { - HttpHandler httpHandler = WebHttpHandlerBuilder.webHandler((WebHandler) toHttpHandler(routingFunction())) - .filter(new IndexRewriteFilter()) - .build(); - ServletRegistrationBean registrationBean = new ServletRegistrationBean<>(new RootServlet(httpHandler), "/"); - registrationBean.setLoadOnStartup(1); - registrationBean.setAsyncSupported(true); - return registrationBean; - } - - @Configuration - @EnableWebSecurity - @Profile("!https") - static class SecurityConfig extends WebSecurityConfigurerAdapter { - @Override - protected void configure(final HttpSecurity http) throws Exception { - http.authorizeRequests() - .anyRequest() - .permitAll(); - } - } - - public static void main(String[] args) { - SpringApplication.run(FunctionalSpringBootApplication.class, args); - } - -} diff --git a/spring-5-reactive/src/main/java/com/baeldung/functional/FunctionalWebApplication.java b/spring-5-reactive/src/main/java/com/baeldung/functional/FunctionalWebApplication.java deleted file mode 100644 index 5a7d70d3db..0000000000 --- a/spring-5-reactive/src/main/java/com/baeldung/functional/FunctionalWebApplication.java +++ /dev/null @@ -1,80 +0,0 @@ -package com.baeldung.functional; - -import static org.springframework.web.reactive.function.BodyInserters.fromObject; -import static org.springframework.web.reactive.function.server.RequestPredicates.GET; -import static org.springframework.web.reactive.function.server.RequestPredicates.POST; -import static org.springframework.web.reactive.function.server.RequestPredicates.path; -import static org.springframework.web.reactive.function.server.RouterFunctions.route; -import static org.springframework.web.reactive.function.server.RouterFunctions.toHttpHandler; -import static org.springframework.web.reactive.function.server.ServerResponse.ok; - -import java.util.Arrays; -import java.util.List; -import java.util.concurrent.CopyOnWriteArrayList; - -import org.apache.catalina.Context; -import org.apache.catalina.startup.Tomcat; -import org.springframework.boot.web.embedded.tomcat.TomcatWebServer; -import org.springframework.boot.web.server.WebServer; -import org.springframework.core.io.ClassPathResource; -import org.springframework.http.server.reactive.HttpHandler; -import org.springframework.http.server.reactive.ServletHttpHandlerAdapter; -import org.springframework.web.reactive.function.server.RouterFunction; -import org.springframework.web.reactive.function.server.RouterFunctions; -import org.springframework.web.reactive.function.server.ServerResponse; -import org.springframework.web.server.WebHandler; -import org.springframework.web.server.adapter.WebHttpHandlerBuilder; - -import reactor.core.publisher.Flux; - -public class FunctionalWebApplication { - - private static final Actor BRAD_PITT = new Actor("Brad", "Pitt"); - private static final Actor TOM_HANKS = new Actor("Tom", "Hanks"); - private static final List actors = new CopyOnWriteArrayList<>(Arrays.asList(BRAD_PITT, TOM_HANKS)); - - private RouterFunction routingFunction() { - FormHandler formHandler = new FormHandler(); - - RouterFunction restfulRouter = route(GET("/"), serverRequest -> ok().body(Flux.fromIterable(actors), Actor.class)).andRoute(POST("/"), serverRequest -> serverRequest.bodyToMono(Actor.class) - .doOnNext(actors::add) - .then(ok().build())); - - return route(GET("/test"), serverRequest -> ok().body(fromObject("helloworld"))).andRoute(POST("/login"), formHandler::handleLogin) - .andRoute(POST("/upload"), formHandler::handleUpload) - .and(RouterFunctions.resources("/files/**", new ClassPathResource("files/"))) - .andNest(path("/actor"), restfulRouter) - .filter((request, next) -> { - System.out.println("Before handler invocation: " + request.path()); - return next.handle(request); - }); - } - - WebServer start() throws Exception { - WebHandler webHandler = (WebHandler) toHttpHandler(routingFunction()); - HttpHandler httpHandler = WebHttpHandlerBuilder.webHandler(webHandler) - .filter(new IndexRewriteFilter()) - .build(); - - Tomcat tomcat = new Tomcat(); - tomcat.setHostname("localhost"); - tomcat.setPort(9090); - Context rootContext = tomcat.addContext("", System.getProperty("java.io.tmpdir")); - ServletHttpHandlerAdapter servlet = new ServletHttpHandlerAdapter(httpHandler); - Tomcat.addServlet(rootContext, "httpHandlerServlet", servlet); - rootContext.addServletMappingDecoded("/", "httpHandlerServlet"); - - TomcatWebServer server = new TomcatWebServer(tomcat); - server.start(); - return server; - - } - - public static void main(String[] args) { - try { - new FunctionalWebApplication().start(); - } catch (Exception e) { - e.printStackTrace(); - } - } -} diff --git a/spring-5-reactive/src/main/java/com/baeldung/functional/IndexRewriteFilter.java b/spring-5-reactive/src/main/java/com/baeldung/functional/IndexRewriteFilter.java deleted file mode 100644 index 3e91a0354b..0000000000 --- a/spring-5-reactive/src/main/java/com/baeldung/functional/IndexRewriteFilter.java +++ /dev/null @@ -1,27 +0,0 @@ -package com.baeldung.functional; - -import org.springframework.http.server.reactive.ServerHttpRequest; -import org.springframework.web.server.ServerWebExchange; -import org.springframework.web.server.WebFilter; -import org.springframework.web.server.WebFilterChain; -import reactor.core.publisher.Mono; - -class IndexRewriteFilter implements WebFilter { - - @Override - public Mono filter(ServerWebExchange serverWebExchange, WebFilterChain webFilterChain) { - ServerHttpRequest request = serverWebExchange.getRequest(); - if (request.getURI() - .getPath() - .equals("/")) { - return webFilterChain.filter(serverWebExchange.mutate() - .request(builder -> builder.method(request.getMethod()) - .contextPath(request.getPath() - .toString()) - .path("/test")) - .build()); - } - return webFilterChain.filter(serverWebExchange); - } - -} diff --git a/spring-5-reactive/src/main/java/com/baeldung/functional/MyService.java b/spring-5-reactive/src/main/java/com/baeldung/functional/MyService.java deleted file mode 100644 index b7b8b13d8b..0000000000 --- a/spring-5-reactive/src/main/java/com/baeldung/functional/MyService.java +++ /dev/null @@ -1,11 +0,0 @@ -package com.baeldung.functional; - -import java.util.Random; - -public class MyService { - - public int getRandomNumber() { - return (new Random().nextInt(10)); - } - -} diff --git a/spring-5-reactive/src/main/java/com/baeldung/functional/RootServlet.java b/spring-5-reactive/src/main/java/com/baeldung/functional/RootServlet.java deleted file mode 100644 index 8fe24821de..0000000000 --- a/spring-5-reactive/src/main/java/com/baeldung/functional/RootServlet.java +++ /dev/null @@ -1,82 +0,0 @@ -package com.baeldung.functional; - -import static org.springframework.web.reactive.function.BodyExtractors.toDataBuffers; -import static org.springframework.web.reactive.function.BodyExtractors.toFormData; -import static org.springframework.web.reactive.function.BodyInserters.fromObject; -import static org.springframework.web.reactive.function.server.RequestPredicates.GET; -import static org.springframework.web.reactive.function.server.RequestPredicates.POST; -import static org.springframework.web.reactive.function.server.RequestPredicates.path; -import static org.springframework.web.reactive.function.server.RouterFunctions.route; -import static org.springframework.web.reactive.function.server.RouterFunctions.toHttpHandler; -import static org.springframework.web.reactive.function.server.ServerResponse.ok; - -import java.util.Arrays; -import java.util.List; -import java.util.concurrent.CopyOnWriteArrayList; -import java.util.concurrent.atomic.AtomicLong; - -import org.springframework.core.io.ClassPathResource; -import org.springframework.http.server.reactive.HttpHandler; -import org.springframework.http.server.reactive.ServletHttpHandlerAdapter; -import org.springframework.util.MultiValueMap; -import org.springframework.web.reactive.function.server.RouterFunction; -import org.springframework.web.reactive.function.server.RouterFunctions; -import org.springframework.web.reactive.function.server.ServerResponse; -import org.springframework.web.server.WebHandler; -import org.springframework.web.server.adapter.WebHttpHandlerBuilder; - -import reactor.core.publisher.Flux; -import reactor.core.publisher.Mono; - -public class RootServlet extends ServletHttpHandlerAdapter { - - public RootServlet() { - this(WebHttpHandlerBuilder.webHandler((WebHandler) toHttpHandler(routingFunction())) - .filter(new IndexRewriteFilter()) - .build()); - } - - RootServlet(HttpHandler httpHandler) { - super(httpHandler); - } - - private static final Actor BRAD_PITT = new Actor("Brad", "Pitt"); - private static final Actor TOM_HANKS = new Actor("Tom", "Hanks"); - private static final List actors = new CopyOnWriteArrayList<>(Arrays.asList(BRAD_PITT, TOM_HANKS)); - - private static RouterFunction routingFunction() { - - return route(GET("/test"), serverRequest -> ok().body(fromObject("helloworld"))).andRoute(POST("/login"), serverRequest -> serverRequest.body(toFormData()) - .map(MultiValueMap::toSingleValueMap) - .map(formData -> { - System.out.println("form data: " + formData.toString()); - if ("baeldung".equals(formData.get("user")) && "you_know_what_to_do".equals(formData.get("token"))) { - return ok().body(Mono.just("welcome back!"), String.class) - .block(); - } - return ServerResponse.badRequest() - .build() - .block(); - })) - .andRoute(POST("/upload"), serverRequest -> serverRequest.body(toDataBuffers()) - .collectList() - .map(dataBuffers -> { - AtomicLong atomicLong = new AtomicLong(0); - dataBuffers.forEach(d -> atomicLong.addAndGet(d.asByteBuffer() - .array().length)); - System.out.println("data length:" + atomicLong.get()); - return ok().body(fromObject(atomicLong.toString())) - .block(); - })) - .and(RouterFunctions.resources("/files/**", new ClassPathResource("files/"))) - .andNest(path("/actor"), route(GET("/"), serverRequest -> ok().body(Flux.fromIterable(actors), Actor.class)).andRoute(POST("/"), serverRequest -> serverRequest.bodyToMono(Actor.class) - .doOnNext(actors::add) - .then(ok().build()))) - .filter((request, next) -> { - System.out.println("Before handler invocation: " + request.path()); - return next.handle(request); - }); - - } - -} diff --git a/spring-5-reactive/src/main/java/com/baeldung/jsonb/Person.java b/spring-5-reactive/src/main/java/com/baeldung/jsonb/Person.java deleted file mode 100644 index 7a54b37574..0000000000 --- a/spring-5-reactive/src/main/java/com/baeldung/jsonb/Person.java +++ /dev/null @@ -1,127 +0,0 @@ -package com.baeldung.jsonb; - -import java.math.BigDecimal; -import java.time.LocalDate; - -import javax.json.bind.annotation.JsonbDateFormat; -import javax.json.bind.annotation.JsonbNumberFormat; -import javax.json.bind.annotation.JsonbProperty; -import javax.json.bind.annotation.JsonbTransient; - -public class Person { - - private int id; - @JsonbProperty("person-name") - private String name; - @JsonbProperty(nillable = true) - private String email; - @JsonbTransient - private int age; - @JsonbDateFormat("dd-MM-yyyy") - private LocalDate registeredDate; - private BigDecimal salary; - - public Person() { - } - - public Person(int id, String name, String email, int age, LocalDate registeredDate, BigDecimal salary) { - super(); - this.id = id; - this.name = name; - this.email = email; - this.age = age; - this.registeredDate = registeredDate; - this.salary = salary; - } - - public int getId() { - return id; - } - - public void setId(int id) { - this.id = id; - } - - public int getAge() { - return age; - } - - public void setAge(int age) { - this.age = age; - } - - public String getEmail() { - return email; - } - - public void setEmail(String email) { - this.email = email; - } - - public String getName() { - return name; - } - - public void setName(String name) { - this.name = name; - } - - @JsonbNumberFormat(locale = "en_US", value = "#0.0") - public BigDecimal getSalary() { - return salary; - } - - public void setSalary(BigDecimal salary) { - this.salary = salary; - } - - public LocalDate getRegisteredDate() { - return registeredDate; - } - - public void setRegisteredDate(LocalDate registeredDate) { - this.registeredDate = registeredDate; - } - - @Override - public String toString() { - StringBuilder builder = new StringBuilder(); - builder.append("Person [id="); - builder.append(id); - builder.append(", name="); - builder.append(name); - builder.append(", email="); - builder.append(email); - builder.append(", age="); - builder.append(age); - builder.append(", registeredDate="); - builder.append(registeredDate); - builder.append(", salary="); - builder.append(salary); - builder.append("]"); - return builder.toString(); - } - - @Override - public int hashCode() { - final int prime = 31; - int result = 1; - result = prime * result + id; - return result; - } - - @Override - public boolean equals(Object obj) { - if (this == obj) - return true; - if (obj == null) - return false; - if (getClass() != obj.getClass()) - return false; - Person other = (Person) obj; - if (id != other.id) - return false; - return true; - } - -} diff --git a/spring-5-reactive/src/main/java/com/baeldung/jsonb/PersonController.java b/spring-5-reactive/src/main/java/com/baeldung/jsonb/PersonController.java deleted file mode 100644 index e216a282eb..0000000000 --- a/spring-5-reactive/src/main/java/com/baeldung/jsonb/PersonController.java +++ /dev/null @@ -1,58 +0,0 @@ -package com.baeldung.jsonb; - -import java.math.BigDecimal; -import java.time.LocalDate; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; - -import javax.annotation.PostConstruct; - -import org.springframework.http.HttpStatus; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.ResponseBody; -import org.springframework.web.bind.annotation.ResponseStatus; -import org.springframework.web.bind.annotation.RestController; - -@RestController("/person") -public class PersonController { - - List personRepository; - - @PostConstruct - public void init() { - // @formatter:off - personRepository = new ArrayList<>(Arrays.asList( - new Person(1, "Jhon", "jhon@test.com", 20, LocalDate.of(2019, 9, 9), BigDecimal.valueOf(1000)), - new Person(2, "Jhon", "jhon1@test.com", 20, LocalDate.of(2019, 9, 9), BigDecimal.valueOf(1500)), - new Person(3, "Jhon", null, 20, LocalDate.of(2019, 9, 9), BigDecimal.valueOf(1000)), - new Person(4, "Tom", "tom@test.com", 21, LocalDate.of(2019, 9, 9), BigDecimal.valueOf(1500)), - new Person(5, "Mark", "mark@test.com", 21, LocalDate.of(2019, 9, 9), BigDecimal.valueOf(1200)), - new Person(6, "Julia", "jhon@test.com", 20, LocalDate.of(2019, 9, 9), BigDecimal.valueOf(1000)))); - // @formatter:on - - } - - @GetMapping("/person/{id}") - @ResponseBody - public Person findById(@PathVariable final int id) { - return personRepository.get(id); - } - - @PostMapping("/person") - @ResponseStatus(HttpStatus.OK) - @ResponseBody - public boolean insertPerson(@RequestBody final Person person) { - return personRepository.add(person); - } - - @GetMapping("/person") - @ResponseBody - public List findAll() { - return personRepository; - } - -} diff --git a/spring-5-reactive/src/main/java/com/baeldung/jsonb/Spring5Application.java b/spring-5-reactive/src/main/java/com/baeldung/jsonb/Spring5Application.java deleted file mode 100644 index 00fce06834..0000000000 --- a/spring-5-reactive/src/main/java/com/baeldung/jsonb/Spring5Application.java +++ /dev/null @@ -1,30 +0,0 @@ -package com.baeldung.jsonb; - -import java.util.ArrayList; -import java.util.Collection; - -import org.springframework.boot.SpringApplication; -import org.springframework.boot.autoconfigure.SpringBootApplication; -import org.springframework.boot.autoconfigure.http.HttpMessageConverters; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.ComponentScan; -import org.springframework.http.converter.HttpMessageConverter; -import org.springframework.http.converter.json.JsonbHttpMessageConverter; - -@SpringBootApplication -@ComponentScan(basePackages = { "com.baeldung.jsonb" }) -public class Spring5Application { - - public static void main(String[] args) { - SpringApplication.run(Spring5Application.class, args); - } - - @Bean - public HttpMessageConverters customConverters() { - Collection> messageConverters = new ArrayList<>(); - JsonbHttpMessageConverter jsonbHttpMessageConverter = new JsonbHttpMessageConverter(); - messageConverters.add(jsonbHttpMessageConverter); - return new HttpMessageConverters(true, messageConverters); - } - -} diff --git a/spring-5-reactive/src/main/java/com/baeldung/jupiter/MethodParameterFactory.java b/spring-5-reactive/src/main/java/com/baeldung/jupiter/MethodParameterFactory.java deleted file mode 100644 index 85bd505d11..0000000000 --- a/spring-5-reactive/src/main/java/com/baeldung/jupiter/MethodParameterFactory.java +++ /dev/null @@ -1,46 +0,0 @@ -package com.baeldung.jupiter; - -import org.springframework.core.MethodParameter; -import org.springframework.core.annotation.SynthesizingMethodParameter; -import org.springframework.util.Assert; - -import java.lang.reflect.Constructor; -import java.lang.reflect.Executable; -import java.lang.reflect.Method; -import java.lang.reflect.Parameter; - -abstract class MethodParameterFactory { - - private MethodParameterFactory() { - } - - public static MethodParameter createMethodParameter(Parameter parameter) { - Assert.notNull(parameter, "Parameter must not be null"); - Executable executable = parameter.getDeclaringExecutable(); - if (executable instanceof Method) { - return new MethodParameter((Method) executable, getIndex(parameter)); - } - return new MethodParameter((Constructor) executable, getIndex(parameter)); - } - - public static SynthesizingMethodParameter createSynthesizingMethodParameter(Parameter parameter) { - Assert.notNull(parameter, "Parameter must not be null"); - Executable executable = parameter.getDeclaringExecutable(); - if (executable instanceof Method) { - return new SynthesizingMethodParameter((Method) executable, getIndex(parameter)); - } - throw new UnsupportedOperationException("Cannot create a SynthesizingMethodParameter for a constructor parameter: " + parameter); - } - - private static int getIndex(Parameter parameter) { - Assert.notNull(parameter, "Parameter must not be null"); - Executable executable = parameter.getDeclaringExecutable(); - Parameter[] parameters = executable.getParameters(); - for (int i = 0; i < parameters.length; i++) { - if (parameters[i] == parameter) { - return i; - } - } - throw new IllegalStateException(String.format("Failed to resolve index of parameter [%s] in executable [%s]", parameter, executable.toGenericString())); - } -} diff --git a/spring-5-reactive/src/main/java/com/baeldung/jupiter/ParameterAutowireUtils.java b/spring-5-reactive/src/main/java/com/baeldung/jupiter/ParameterAutowireUtils.java deleted file mode 100644 index d1a4cc8b29..0000000000 --- a/spring-5-reactive/src/main/java/com/baeldung/jupiter/ParameterAutowireUtils.java +++ /dev/null @@ -1,44 +0,0 @@ -package com.baeldung.jupiter; - -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.beans.factory.annotation.Qualifier; -import org.springframework.beans.factory.annotation.Value; -import org.springframework.beans.factory.config.DependencyDescriptor; -import org.springframework.context.ApplicationContext; -import org.springframework.core.MethodParameter; -import org.springframework.core.annotation.AnnotatedElementUtils; - -import java.lang.annotation.Annotation; -import java.lang.reflect.AnnotatedElement; -import java.lang.reflect.Method; -import java.lang.reflect.Parameter; -import java.util.Optional; - -import static org.springframework.core.annotation.AnnotatedElementUtils.hasAnnotation; - -abstract class ParameterAutowireUtils { - - private ParameterAutowireUtils() { - } - - public static boolean isAutowirable(Parameter parameter) { - return ApplicationContext.class.isAssignableFrom(parameter.getType()) || hasAnnotation(parameter, Autowired.class) || hasAnnotation(parameter, Qualifier.class) || hasAnnotation(parameter, Value.class); - } - - public static Object resolveDependency(Parameter parameter, Class containingClass, ApplicationContext applicationContext) { - - boolean required = findMergedAnnotation(parameter, Autowired.class).map(Autowired::required) - .orElse(true); - MethodParameter methodParameter = (parameter.getDeclaringExecutable() instanceof Method ? MethodParameterFactory.createSynthesizingMethodParameter(parameter) : MethodParameterFactory.createMethodParameter(parameter)); - DependencyDescriptor descriptor = new DependencyDescriptor(methodParameter, required); - descriptor.setContainingClass(containingClass); - - return applicationContext.getAutowireCapableBeanFactory() - .resolveDependency(descriptor, null); - } - - private static Optional findMergedAnnotation(AnnotatedElement element, Class annotationType) { - - return Optional.ofNullable(AnnotatedElementUtils.findMergedAnnotation(element, annotationType)); - } -} diff --git a/spring-5-reactive/src/main/java/com/baeldung/jupiter/SpringExtension.java b/spring-5-reactive/src/main/java/com/baeldung/jupiter/SpringExtension.java deleted file mode 100644 index 7218d984ef..0000000000 --- a/spring-5-reactive/src/main/java/com/baeldung/jupiter/SpringExtension.java +++ /dev/null @@ -1,94 +0,0 @@ -package com.baeldung.jupiter; - -import java.lang.reflect.Constructor; -import java.lang.reflect.Executable; -import java.lang.reflect.Method; -import java.lang.reflect.Parameter; - -import org.junit.jupiter.api.extension.AfterAllCallback; -import org.junit.jupiter.api.extension.AfterEachCallback; -import org.junit.jupiter.api.extension.BeforeAllCallback; -import org.junit.jupiter.api.extension.BeforeEachCallback; -import org.junit.jupiter.api.extension.ExtensionContext; -import org.junit.jupiter.api.extension.ParameterContext; -import org.junit.jupiter.api.extension.ParameterResolutionException; -import org.junit.jupiter.api.extension.ParameterResolver; -import org.junit.jupiter.api.extension.TestInstancePostProcessor; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.context.ApplicationContext; -import org.springframework.core.annotation.AnnotatedElementUtils; -import org.springframework.test.context.TestContextManager; -import org.springframework.util.Assert; - -public class SpringExtension implements BeforeAllCallback, AfterAllCallback, TestInstancePostProcessor, BeforeEachCallback, AfterEachCallback, ParameterResolver { - - private static final ExtensionContext.Namespace namespace = ExtensionContext.Namespace.create(SpringExtension.class); - - @Override - public void beforeAll(ExtensionContext context) throws Exception { - getTestContextManager(context).beforeTestClass(); - } - - @Override - public void afterAll(ExtensionContext context) throws Exception { - try { - getTestContextManager(context).afterTestClass(); - } finally { - context.getStore(namespace) - .remove(context.getTestClass() - .get()); - } - } - - @Override - public void postProcessTestInstance(Object testInstance, ExtensionContext context) throws Exception { - getTestContextManager(context).prepareTestInstance(testInstance); - } - - @Override - public void beforeEach(ExtensionContext context) throws Exception { - Object testInstance = context.getTestInstance(); - Method testMethod = context.getTestMethod() - .get(); - getTestContextManager(context).beforeTestMethod(testInstance, testMethod); - } - - @Override - public void afterEach(ExtensionContext context) throws Exception { - Object testInstance = context.getTestInstance(); - Method testMethod = context.getTestMethod() - .get(); - Throwable testException = context.getExecutionException() - .orElse(null); - getTestContextManager(context).afterTestMethod(testInstance, testMethod, testException); - } - - @Override - public boolean supportsParameter(ParameterContext parameterContext, ExtensionContext extensionContext) throws ParameterResolutionException { - Parameter parameter = parameterContext.getParameter(); - Executable executable = parameter.getDeclaringExecutable(); - return ((executable instanceof Constructor) && AnnotatedElementUtils.hasAnnotation(executable, Autowired.class)) || ParameterAutowireUtils.isAutowirable(parameter); - } - - @Override - public Object resolveParameter(ParameterContext parameterContext, ExtensionContext extensionContext) throws ParameterResolutionException { - Parameter parameter = parameterContext.getParameter(); - Class testClass = extensionContext.getTestClass() - .get(); - ApplicationContext applicationContext = getApplicationContext(extensionContext); - return ParameterAutowireUtils.resolveDependency(parameter, testClass, applicationContext); - } - - private ApplicationContext getApplicationContext(ExtensionContext context) { - return getTestContextManager(context).getTestContext() - .getApplicationContext(); - } - - private TestContextManager getTestContextManager(ExtensionContext context) { - Assert.notNull(context, "ExtensionContext must not be null"); - Class testClass = context.getTestClass() - .get(); - ExtensionContext.Store store = context.getStore(namespace); - return store.getOrComputeIfAbsent(testClass, TestContextManager::new, TestContextManager.class); - } -} diff --git a/spring-5-reactive/src/main/java/com/baeldung/jupiter/SpringJUnit5Config.java b/spring-5-reactive/src/main/java/com/baeldung/jupiter/SpringJUnit5Config.java deleted file mode 100644 index 8f02d71d49..0000000000 --- a/spring-5-reactive/src/main/java/com/baeldung/jupiter/SpringJUnit5Config.java +++ /dev/null @@ -1,39 +0,0 @@ -package com.baeldung.jupiter; - -import org.junit.jupiter.api.extension.ExtendWith; -import org.springframework.context.ApplicationContextInitializer; -import org.springframework.context.ConfigurableApplicationContext; -import org.springframework.core.annotation.AliasFor; -import org.springframework.test.context.ContextConfiguration; - -import java.lang.annotation.*; - -@ExtendWith(SpringExtension.class) -@ContextConfiguration -@Documented -@Inherited -@Retention(RetentionPolicy.RUNTIME) -@Target(ElementType.TYPE) -public @interface SpringJUnit5Config { - - @AliasFor(annotation = ContextConfiguration.class, attribute = "classes") - Class[] value() default {}; - - @AliasFor(annotation = ContextConfiguration.class) - Class[] classes() default {}; - - @AliasFor(annotation = ContextConfiguration.class) - String[] locations() default {}; - - @AliasFor(annotation = ContextConfiguration.class) - Class>[] initializers() default {}; - - @AliasFor(annotation = ContextConfiguration.class) - boolean inheritLocations() default true; - - @AliasFor(annotation = ContextConfiguration.class) - boolean inheritInitializers() default true; - - @AliasFor(annotation = ContextConfiguration.class) - String name() default ""; -} diff --git a/spring-5-reactive/src/main/java/com/baeldung/jupiter/TestConfig.java b/spring-5-reactive/src/main/java/com/baeldung/jupiter/TestConfig.java deleted file mode 100644 index a29f77c5df..0000000000 --- a/spring-5-reactive/src/main/java/com/baeldung/jupiter/TestConfig.java +++ /dev/null @@ -1,20 +0,0 @@ -package com.baeldung.jupiter; - -import com.baeldung.web.reactive.Task; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; -import org.springframework.context.support.PropertySourcesPlaceholderConfigurer; - -@Configuration -public class TestConfig { - - @Bean - static PropertySourcesPlaceholderConfigurer placeholderConfigurer() { - return new PropertySourcesPlaceholderConfigurer(); - } - - @Bean - Task taskName() { - return new Task("taskName", 1); - } -} diff --git a/spring-5-reactive/src/main/java/com/baeldung/persistence/DataSetupBean.java b/spring-5-reactive/src/main/java/com/baeldung/persistence/DataSetupBean.java deleted file mode 100644 index 9f5d9ff6c2..0000000000 --- a/spring-5-reactive/src/main/java/com/baeldung/persistence/DataSetupBean.java +++ /dev/null @@ -1,27 +0,0 @@ -package com.baeldung.persistence; - -import static org.apache.commons.lang3.RandomStringUtils.randomAlphabetic; - -import java.util.stream.IntStream; - -import org.springframework.beans.factory.InitializingBean; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Component; - -import com.baeldung.web.Foo; - -@Component -public class DataSetupBean implements InitializingBean { - - @Autowired - private FooRepository repo; - - // - - @Override - public void afterPropertiesSet() throws Exception { - IntStream.range(1, 20) - .forEach(i -> repo.save(new Foo(randomAlphabetic(8)))); - } - -} diff --git a/spring-5-reactive/src/main/java/com/baeldung/persistence/FooRepository.java b/spring-5-reactive/src/main/java/com/baeldung/persistence/FooRepository.java deleted file mode 100644 index 1f1e071158..0000000000 --- a/spring-5-reactive/src/main/java/com/baeldung/persistence/FooRepository.java +++ /dev/null @@ -1,10 +0,0 @@ -package com.baeldung.persistence; - -import org.springframework.data.jpa.repository.JpaRepository; -import org.springframework.data.jpa.repository.JpaSpecificationExecutor; - -import com.baeldung.web.Foo; - -public interface FooRepository extends JpaRepository, JpaSpecificationExecutor { - -} diff --git a/spring-5-reactive/src/main/java/com/baeldung/reactive/Spring5ReactiveApplication.java b/spring-5-reactive/src/main/java/com/baeldung/reactive/Spring5ReactiveApplication.java new file mode 100644 index 0000000000..a9308124fa --- /dev/null +++ b/spring-5-reactive/src/main/java/com/baeldung/reactive/Spring5ReactiveApplication.java @@ -0,0 +1,13 @@ +package com.baeldung.reactive; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +public class Spring5ReactiveApplication { + + public static void main(String[] args) { + SpringApplication.run(Spring5ReactiveApplication.class, args); + } + +} diff --git a/spring-5-reactive/src/main/java/com/baeldung/reactive/controller/Foo.java b/spring-5-reactive/src/main/java/com/baeldung/reactive/controller/Foo.java new file mode 100644 index 0000000000..480782a551 --- /dev/null +++ b/spring-5-reactive/src/main/java/com/baeldung/reactive/controller/Foo.java @@ -0,0 +1,13 @@ +package com.baeldung.reactive.controller; + +import lombok.AllArgsConstructor; +import lombok.Data; + +@AllArgsConstructor +@Data +public class Foo { + + private long id; + private String name; + +} diff --git a/spring-5-reactive/src/main/java/com/baeldung/reactive/controller/FooReactiveController.java b/spring-5-reactive/src/main/java/com/baeldung/reactive/controller/FooReactiveController.java new file mode 100644 index 0000000000..d82692619d --- /dev/null +++ b/spring-5-reactive/src/main/java/com/baeldung/reactive/controller/FooReactiveController.java @@ -0,0 +1,34 @@ +package com.baeldung.reactive.controller; + +import static org.apache.commons.lang3.RandomStringUtils.randomAlphabetic; + +import java.time.Duration; + +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RestController; + +import reactor.core.publisher.ConnectableFlux; +import reactor.core.publisher.Flux; +import reactor.core.publisher.Mono; + +@RestController("/foos") +public class FooReactiveController { + + @GetMapping("/{id}") + public Mono getFoo(@PathVariable("id") long id) { + return Mono.just(new Foo(id, randomAlphabetic(6))); + } + + @GetMapping("/") + public Flux getAllFoos() { + final ConnectableFlux flux = Flux. create(fluxSink -> { + while (true) { + fluxSink.next(new Foo(System.currentTimeMillis(), randomAlphabetic(6))); + } + }).sample(Duration.ofSeconds(1)).publish(); + + return flux; + } + +} diff --git a/spring-5-reactive/src/main/java/com/baeldung/security/GreetController.java b/spring-5-reactive/src/main/java/com/baeldung/security/GreetController.java deleted file mode 100644 index 6b69e3bc9b..0000000000 --- a/spring-5-reactive/src/main/java/com/baeldung/security/GreetController.java +++ /dev/null @@ -1,37 +0,0 @@ -package com.baeldung.security; - -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.RestController; -import reactor.core.publisher.Mono; - -import java.security.Principal; - -@RestController -public class GreetController { - - private GreetService greetService; - - public GreetController(GreetService greetService) { - this.greetService = greetService; - } - - @GetMapping("/") - public Mono greet(Mono principal) { - return principal - .map(Principal::getName) - .map(name -> String.format("Hello, %s", name)); - } - - @GetMapping("/admin") - public Mono greetAdmin(Mono principal) { - return principal - .map(Principal::getName) - .map(name -> String.format("Admin access: %s", name)); - } - - @GetMapping("/greetService") - public Mono greetService() { - return greetService.greet(); - } - -} diff --git a/spring-5-reactive/src/main/java/com/baeldung/security/GreetService.java b/spring-5-reactive/src/main/java/com/baeldung/security/GreetService.java deleted file mode 100644 index 7622b360be..0000000000 --- a/spring-5-reactive/src/main/java/com/baeldung/security/GreetService.java +++ /dev/null @@ -1,15 +0,0 @@ -package com.baeldung.security; - -import org.springframework.security.access.prepost.PreAuthorize; -import org.springframework.stereotype.Service; -import reactor.core.publisher.Mono; - -@Service -public class GreetService { - - @PreAuthorize("hasRole('ADMIN')") - public Mono greet() { - return Mono.just("Hello from service!"); - } - -} diff --git a/spring-5-reactive/src/main/java/com/baeldung/security/SecurityConfig.java b/spring-5-reactive/src/main/java/com/baeldung/security/SecurityConfig.java deleted file mode 100644 index a9e44a2eee..0000000000 --- a/spring-5-reactive/src/main/java/com/baeldung/security/SecurityConfig.java +++ /dev/null @@ -1,42 +0,0 @@ -package com.baeldung.security; - -import org.springframework.context.annotation.Bean; -import org.springframework.security.config.annotation.method.configuration.EnableReactiveMethodSecurity; -import org.springframework.security.config.annotation.web.reactive.EnableWebFluxSecurity; -import org.springframework.security.config.web.server.ServerHttpSecurity; -import org.springframework.security.core.userdetails.MapReactiveUserDetailsService; -import org.springframework.security.core.userdetails.User; -import org.springframework.security.core.userdetails.UserDetails; -import org.springframework.security.web.server.SecurityWebFilterChain; - -@EnableWebFluxSecurity -@EnableReactiveMethodSecurity -public class SecurityConfig { - - @Bean - public SecurityWebFilterChain securitygWebFilterChain(ServerHttpSecurity http) { - return http.authorizeExchange() - .pathMatchers("/admin").hasAuthority("ROLE_ADMIN") - .anyExchange().authenticated() - .and().formLogin() - .and().build(); - } - - @Bean - public MapReactiveUserDetailsService userDetailsService() { - UserDetails user = User.withDefaultPasswordEncoder() - .username("user") - .password("password") - .roles("USER") - .build(); - - UserDetails admin = User.withDefaultPasswordEncoder() - .username("admin") - .password("password") - .roles("ADMIN") - .build(); - - return new MapReactiveUserDetailsService(user, admin); - } - -} diff --git a/spring-5-reactive/src/main/java/com/baeldung/web/Foo.java b/spring-5-reactive/src/main/java/com/baeldung/web/Foo.java deleted file mode 100644 index c4868a9958..0000000000 --- a/spring-5-reactive/src/main/java/com/baeldung/web/Foo.java +++ /dev/null @@ -1,84 +0,0 @@ -package com.baeldung.web; - -import javax.persistence.Entity; -import javax.persistence.GeneratedValue; -import javax.persistence.GenerationType; -import javax.persistence.Id; - -@Entity -public class Foo { - - @Id - @GeneratedValue(strategy = GenerationType.AUTO) - private long id; - - private String name; - - public Foo() { - super(); - } - - public Foo(final String name) { - super(); - - this.name = name; - } - - public Foo(final long id, final String name) { - super(); - - this.id = id; - this.name = name; - } - - // API - - public long getId() { - return id; - } - - public void setId(final long id) { - this.id = id; - } - - public String getName() { - return name; - } - - public void setName(final String name) { - this.name = name; - } - - // - - @Override - public int hashCode() { - final int prime = 31; - int result = 1; - result = prime * result + ((name == null) ? 0 : name.hashCode()); - return result; - } - - @Override - public boolean equals(Object obj) { - if (this == obj) - return true; - if (obj == null) - return false; - if (getClass() != obj.getClass()) - return false; - Foo other = (Foo) obj; - if (name == null) { - if (other.name != null) - return false; - } else if (!name.equals(other.name)) - return false; - return true; - } - - @Override - public String toString() { - return "Foo [name=" + name + "]"; - } - -} \ No newline at end of file diff --git a/spring-5-reactive/src/main/java/com/baeldung/web/FooController.java b/spring-5-reactive/src/main/java/com/baeldung/web/FooController.java deleted file mode 100644 index 925f2b49f4..0000000000 --- a/spring-5-reactive/src/main/java/com/baeldung/web/FooController.java +++ /dev/null @@ -1,53 +0,0 @@ -package com.baeldung.web; - -import com.baeldung.persistence.FooRepository; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.data.domain.PageRequest; -import org.springframework.http.HttpStatus; -import org.springframework.validation.annotation.Validated; -import org.springframework.web.bind.annotation.*; - -import javax.validation.constraints.Max; -import javax.validation.constraints.Min; -import java.util.List; - -@RestController("/foos") -public class FooController { - - @Autowired - private FooRepository repo; - - // API - read - - @GetMapping("/foos/{id}") - @ResponseBody - @Validated - public Foo findById(@PathVariable @Min(0) final long id) { - return repo.findById(id) - .orElse(null); - } - - @GetMapping - @ResponseBody - public List findAll() { - return repo.findAll(); - } - - @GetMapping(params = { "page", "size" }) - @ResponseBody - @Validated - public List findPaginated(@RequestParam("page") @Min(0) final int page, @Max(100) @RequestParam("size") final int size) { - return repo.findAll(PageRequest.of(page, size)) - .getContent(); - } - - // API - write - - @PutMapping("/foos/{id}") - @ResponseStatus(HttpStatus.OK) - @ResponseBody - public Foo update(@PathVariable("id") final String id, @RequestBody final Foo foo) { - return foo; - } - -} diff --git a/spring-5-reactive/src/main/java/com/baeldung/web/PathPatternController.java b/spring-5-reactive/src/main/java/com/baeldung/web/PathPatternController.java deleted file mode 100644 index fa413e4f00..0000000000 --- a/spring-5-reactive/src/main/java/com/baeldung/web/PathPatternController.java +++ /dev/null @@ -1,39 +0,0 @@ -package com.baeldung.web; - -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.RestController; - -@RestController -public class PathPatternController { - - @GetMapping("/spring5/{*id}") - public String URIVariableHandler(@PathVariable String id) { - return id; - } - - @GetMapping("/s?ring5") - public String wildcardTakingExactlyOneChar() { - return "/s?ring5"; - } - - @GetMapping("/spring5/*id") - public String wildcardTakingZeroOrMoreChar() { - return "/spring5/*id"; - } - - @GetMapping("/resources/**") - public String wildcardTakingZeroOrMorePathSegments() { - return "/resources/**"; - } - - @GetMapping("/{baeldung:[a-z]+}") - public String regexInPathVariable(@PathVariable String baeldung) { - return baeldung; - } - - @GetMapping("/{var1}_{var2}") - public String multiplePathVariablesInSameSegment(@PathVariable String var1, @PathVariable String var2) { - return "Two variables are var1=" + var1 + " and var2=" + var2; - } -} diff --git a/spring-5-reactive/src/main/java/com/baeldung/web/reactive/Task.java b/spring-5-reactive/src/main/java/com/baeldung/web/reactive/Task.java deleted file mode 100644 index 725fd931e1..0000000000 --- a/spring-5-reactive/src/main/java/com/baeldung/web/reactive/Task.java +++ /dev/null @@ -1,28 +0,0 @@ -package com.baeldung.web.reactive; - -import com.fasterxml.jackson.annotation.JsonProperty; - -public class Task { - - private final String name; - - private final int id; - - public Task(@JsonProperty("name") String name, @JsonProperty("id") int id) { - this.name = name; - this.id = id; - } - - public String getName() { - return this.name; - } - - public int getId() { - return this.id; - } - - @Override - public String toString() { - return "Task{" + "name='" + name + '\'' + ", id=" + id + '}'; - } -} diff --git a/spring-5-reactive/src/main/java/com/baeldung/web/reactive/client/WebClientController.java b/spring-5-reactive/src/main/java/com/baeldung/web/reactive/client/WebClientController.java deleted file mode 100644 index a218c6b7cf..0000000000 --- a/spring-5-reactive/src/main/java/com/baeldung/web/reactive/client/WebClientController.java +++ /dev/null @@ -1,85 +0,0 @@ -package com.baeldung.web.reactive.client; - -import org.reactivestreams.Publisher; -import org.reactivestreams.Subscriber; -import org.springframework.http.*; -import org.springframework.http.client.reactive.ClientHttpRequest; -import org.springframework.util.LinkedMultiValueMap; -import org.springframework.util.MultiValueMap; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.ResponseStatus; -import org.springframework.web.bind.annotation.RestController; -import org.springframework.web.reactive.function.BodyInserter; -import org.springframework.web.reactive.function.BodyInserters; -import org.springframework.web.reactive.function.client.WebClient; -import reactor.core.publisher.Mono; - -import java.net.URI; -import java.nio.charset.Charset; -import java.time.ZonedDateTime; -import java.util.Collections; - -@RestController -public class WebClientController { - - @ResponseStatus(HttpStatus.OK) - @GetMapping("/resource") - public void getResource() { - } - - public void demonstrateWebClient() { - // request - WebClient.UriSpec request1 = createWebClientWithServerURLAndDefaultValues().method(HttpMethod.POST); - WebClient.UriSpec request2 = createWebClientWithServerURLAndDefaultValues().post(); - - // request body specifications - WebClient.RequestBodySpec uri1 = createWebClientWithServerURLAndDefaultValues().method(HttpMethod.POST) - .uri("/resource"); - WebClient.RequestBodySpec uri2 = createWebClientWithServerURLAndDefaultValues().post() - .uri(URI.create("/resource")); - - // request header specification - WebClient.RequestHeadersSpec requestSpec1 = uri1.body(BodyInserters.fromPublisher(Mono.just("data"), String.class)); - WebClient.RequestHeadersSpec requestSpec2 = uri2.body(BodyInserters.fromObject("data")); - - // inserters - BodyInserter, ReactiveHttpOutputMessage> inserter1 = BodyInserters - .fromPublisher(Subscriber::onComplete, String.class); - - LinkedMultiValueMap map = new LinkedMultiValueMap<>(); - map.add("key1", "value1"); - map.add("key2", "value2"); - - BodyInserter, ClientHttpRequest> inserter2 = BodyInserters.fromMultipartData(map); - BodyInserter inserter3 = BodyInserters.fromObject("body"); - - // responses - WebClient.ResponseSpec response1 = uri1.body(inserter3) - .header(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE) - .accept(MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML) - .acceptCharset(Charset.forName("UTF-8")) - .ifNoneMatch("*") - .ifModifiedSince(ZonedDateTime.now()) - .retrieve(); - WebClient.ResponseSpec response2 = requestSpec2.retrieve(); - - } - - private WebClient createWebClient() { - return WebClient.create(); - } - - private WebClient createWebClientWithServerURL() { - return WebClient.create("http://localhost:8081"); - } - - private WebClient createWebClientWithServerURLAndDefaultValues() { - return WebClient.builder() - .baseUrl("http://localhost:8081") - .defaultCookie("cookieKey", "cookieValue") - .defaultHeader(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE) - .defaultUriVariables(Collections.singletonMap("url", "http://localhost:8080")) - .build(); - } - -} diff --git a/spring-5-reactive/src/main/resources/application.properties b/spring-5-reactive/src/main/resources/application.properties index ccec014c2b..4b49e8e8a2 100644 --- a/spring-5-reactive/src/main/resources/application.properties +++ b/spring-5-reactive/src/main/resources/application.properties @@ -1,3 +1 @@ -server.port=8081 - logging.level.root=INFO \ No newline at end of file diff --git a/spring-5-reactive/src/test/java/com/baeldung/Example1IntegrationTest.java b/spring-5-reactive/src/test/java/com/baeldung/Example1IntegrationTest.java deleted file mode 100644 index 8b9e66213f..0000000000 --- a/spring-5-reactive/src/test/java/com/baeldung/Example1IntegrationTest.java +++ /dev/null @@ -1,29 +0,0 @@ -package com.baeldung; - -import org.junit.Test; -import org.junit.runner.RunWith; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.test.context.junit4.SpringRunner; - -@RunWith(SpringRunner.class) -@SpringBootTest -public class Example1IntegrationTest { - - @Test - public void test1a() { - block(3000); - } - - @Test - public void test1b() { - block(3000); - } - - public static void block(long ms) { - try { - Thread.sleep(ms); - } catch (InterruptedException e) { - System.out.println("Thread interrupted"); - } - } -} diff --git a/spring-5-reactive/src/test/java/com/baeldung/Example2IntegrationTest.java b/spring-5-reactive/src/test/java/com/baeldung/Example2IntegrationTest.java deleted file mode 100644 index 6ed53ca4e9..0000000000 --- a/spring-5-reactive/src/test/java/com/baeldung/Example2IntegrationTest.java +++ /dev/null @@ -1,29 +0,0 @@ -package com.baeldung; - -import org.junit.Test; -import org.junit.runner.RunWith; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.test.context.junit4.SpringRunner; - -@RunWith(SpringRunner.class) -@SpringBootTest -public class Example2IntegrationTest { - - @Test - public void test1a() { - block(3000); - } - - @Test - public void test1b() { - block(3000); - } - - public static void block(long ms) { - try { - Thread.sleep(ms); - } catch (InterruptedException e) { - System.out.println("Thread Interrupted"); - } - } -} diff --git a/spring-5-reactive/src/test/java/com/baeldung/ParallelIntegrationTest.java b/spring-5-reactive/src/test/java/com/baeldung/ParallelIntegrationTest.java deleted file mode 100644 index 1ce96de4ef..0000000000 --- a/spring-5-reactive/src/test/java/com/baeldung/ParallelIntegrationTest.java +++ /dev/null @@ -1,24 +0,0 @@ -package com.baeldung; - -import org.junit.Test; -import org.junit.experimental.ParallelComputer; -import org.junit.runner.Computer; -import org.junit.runner.JUnitCore; - -public class ParallelIntegrationTest { - - @Test - public void runTests() { - final Class[] classes = { Example1IntegrationTest.class, Example2IntegrationTest.class }; - - JUnitCore.runClasses(new Computer(), classes); - } - - @Test - public void runTestsInParallel() { - final Class[] classes = { Example1IntegrationTest.class, Example2IntegrationTest.class }; - - JUnitCore.runClasses(new ParallelComputer(true, true), classes); - } - -} \ No newline at end of file diff --git a/spring-5-reactive/src/test/java/com/baeldung/Spring5ApplicationIntegrationTest.java b/spring-5-reactive/src/test/java/com/baeldung/Spring5ApplicationIntegrationTest.java deleted file mode 100644 index af288c3c2d..0000000000 --- a/spring-5-reactive/src/test/java/com/baeldung/Spring5ApplicationIntegrationTest.java +++ /dev/null @@ -1,16 +0,0 @@ -package com.baeldung; - -import org.junit.Test; -import org.junit.runner.RunWith; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.test.context.junit4.SpringRunner; - -@RunWith(SpringRunner.class) -@SpringBootTest -public class Spring5ApplicationIntegrationTest { - - @Test - public void contextLoads() { - } - -} diff --git a/spring-5-reactive/src/test/java/com/baeldung/Spring5JUnit4ConcurrentIntegrationTest.java b/spring-5-reactive/src/test/java/com/baeldung/Spring5JUnit4ConcurrentIntegrationTest.java deleted file mode 100644 index 7e494465b2..0000000000 --- a/spring-5-reactive/src/test/java/com/baeldung/Spring5JUnit4ConcurrentIntegrationTest.java +++ /dev/null @@ -1,52 +0,0 @@ -package com.baeldung; - -import org.junit.Test; -import org.junit.runner.RunWith; -import org.springframework.beans.BeansException; -import org.springframework.beans.factory.InitializingBean; -import org.springframework.context.ApplicationContext; -import org.springframework.context.ApplicationContextAware; -import org.springframework.context.annotation.Configuration; -import org.springframework.test.context.ContextConfiguration; -import org.springframework.test.context.junit4.SpringRunner; - -import java.util.concurrent.TimeUnit; - -import static org.junit.Assert.assertNotNull; -import static org.junit.Assert.assertTrue; - -@RunWith(SpringRunner.class) -@ContextConfiguration(classes = Spring5JUnit4ConcurrentIntegrationTest.SimpleConfiguration.class) -public class Spring5JUnit4ConcurrentIntegrationTest implements ApplicationContextAware, InitializingBean { - - @Configuration - public static class SimpleConfiguration { - } - - private ApplicationContext applicationContext; - - private boolean beanInitialized = false; - - @Override - public final void afterPropertiesSet() throws Exception { - this.beanInitialized = true; - } - - @Override - public final void setApplicationContext(final ApplicationContext applicationContext) throws BeansException { - this.applicationContext = applicationContext; - } - - @Test - public final void verifyApplicationContextSet() throws InterruptedException { - TimeUnit.SECONDS.sleep(2); - assertNotNull("The application context should have been set due to ApplicationContextAware semantics.", this.applicationContext); - } - - @Test - public final void verifyBeanInitialized() throws InterruptedException { - TimeUnit.SECONDS.sleep(2); - assertTrue("This test bean should have been initialized due to InitializingBean semantics.", this.beanInitialized); - } - -} diff --git a/spring-5-reactive/src/test/java/com/baeldung/functional/BeanRegistrationTest.java b/spring-5-reactive/src/test/java/com/baeldung/functional/BeanRegistrationTest.java deleted file mode 100644 index 0b1542dbbc..0000000000 --- a/spring-5-reactive/src/test/java/com/baeldung/functional/BeanRegistrationTest.java +++ /dev/null @@ -1,42 +0,0 @@ -package com.baeldung.functional; - -import static org.junit.Assert.*; - -import org.junit.Test; -import org.junit.runner.RunWith; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.test.context.junit4.SpringRunner; -import org.springframework.web.context.support.GenericWebApplicationContext; - -import com.baeldung.Spring5Application; - -@RunWith(SpringRunner.class) -@SpringBootTest(classes = Spring5Application.class) -public class BeanRegistrationTest { - - @Autowired - private GenericWebApplicationContext context; - - @Test - public void whenRegisterBean_thenOk() { - context.registerBean(MyService.class, () -> new MyService()); - MyService myService = (MyService) context.getBean("com.baeldung.functional.MyService"); - assertTrue(myService.getRandomNumber() < 10); - } - - @Test - public void whenRegisterBeanWithName_thenOk() { - context.registerBean("mySecondService", MyService.class, () -> new MyService()); - MyService mySecondService = (MyService) context.getBean("mySecondService"); - assertTrue(mySecondService.getRandomNumber() < 10); - } - - @Test - public void whenRegisterBeanWithCallback_thenOk() { - context.registerBean("myCallbackService", MyService.class, () -> new MyService(), bd -> bd.setAutowireCandidate(false)); - MyService myCallbackService = (MyService) context.getBean("myCallbackService"); - assertTrue(myCallbackService.getRandomNumber() < 10); - } - -} diff --git a/spring-5-reactive/src/test/java/com/baeldung/functional/ExploreSpring5URLPatternUsingRouterFunctionsTest.java b/spring-5-reactive/src/test/java/com/baeldung/functional/ExploreSpring5URLPatternUsingRouterFunctionsTest.java deleted file mode 100644 index 7a38fa697f..0000000000 --- a/spring-5-reactive/src/test/java/com/baeldung/functional/ExploreSpring5URLPatternUsingRouterFunctionsTest.java +++ /dev/null @@ -1,110 +0,0 @@ -package com.baeldung.functional; - -import org.junit.AfterClass; -import org.junit.BeforeClass; -import org.junit.Test; -import org.springframework.boot.web.server.WebServer; -import org.springframework.test.web.reactive.server.WebTestClient; - -public class ExploreSpring5URLPatternUsingRouterFunctionsTest { - - private static WebTestClient client; - private static WebServer server; - - @BeforeClass - public static void setup() throws Exception { - server = new ExploreSpring5URLPatternUsingRouterFunctions().start(); - client = WebTestClient.bindToServer() - .baseUrl("http://localhost:" + server.getPort()) - .build(); - } - - @AfterClass - public static void destroy() { - server.stop(); - } - - @Test - public void givenRouter_whenGetPathWithSingleCharWildcard_thenGotPathPattern() throws Exception { - client.get() - .uri("/paths") - .exchange() - .expectStatus() - .isOk() - .expectBody(String.class) - .isEqualTo("/p?ths"); - } - - @Test - public void givenRouter_whenMultipleURIVariablePattern_thenGotPathVariable() throws Exception { - client.get() - .uri("/test/ab/cd") - .exchange() - .expectStatus() - .isOk() - .expectBody(String.class) - .isEqualTo("/ab/cd"); - } - - @Test - public void givenRouter_whenGetMultipleCharWildcard_thenGotPathPattern() throws Exception { - - client.get() - .uri("/wildcard") - .exchange() - .expectStatus() - .isOk() - .expectBody(String.class) - .isEqualTo("/*card path was accessed"); - } - - @Test - public void givenRouter_whenGetMultiplePathVaribleInSameSegment_thenGotPathVariables() throws Exception { - - client.get() - .uri("/baeldung_tutorial") - .exchange() - .expectStatus() - .isOk() - .expectBody(String.class) - .isEqualTo("baeldung , tutorial"); - } - - @Test - public void givenRouter_whenGetRegexInPathVarible_thenGotPathVariable() throws Exception { - - client.get() - .uri("/abcd") - .exchange() - .expectStatus() - .isOk() - .expectBody(String.class) - .isEqualTo("/{baeldung:[a-z]+} was accessed and baeldung=abcd"); - - client.get() - .uri("/1234") - .exchange() - .expectStatus() - .is4xxClientError(); - } - - @Test - public void givenResources_whenAccess_thenGot() throws Exception { - client.get() - .uri("/files/test/test.txt") - .exchange() - .expectStatus() - .isOk() - .expectBody(String.class) - .isEqualTo("test"); - - client.get() - .uri("/files/hello.txt") - .exchange() - .expectStatus() - .isOk() - .expectBody(String.class) - .isEqualTo("hello"); - } - -} diff --git a/spring-5-reactive/src/test/java/com/baeldung/functional/FunctionalWebApplicationIntegrationTest.java b/spring-5-reactive/src/test/java/com/baeldung/functional/FunctionalWebApplicationIntegrationTest.java deleted file mode 100644 index a7b951b930..0000000000 --- a/spring-5-reactive/src/test/java/com/baeldung/functional/FunctionalWebApplicationIntegrationTest.java +++ /dev/null @@ -1,141 +0,0 @@ -package com.baeldung.functional; - -import org.junit.AfterClass; -import org.junit.BeforeClass; -import org.junit.Test; -import org.springframework.boot.web.server.WebServer; -import org.springframework.core.io.ClassPathResource; -import org.springframework.core.io.Resource; -import org.springframework.http.MediaType; -import org.springframework.test.web.reactive.server.WebTestClient; -import org.springframework.util.LinkedMultiValueMap; -import org.springframework.util.MultiValueMap; -import org.springframework.web.reactive.function.BodyInserters; - -import static org.springframework.web.reactive.function.BodyInserters.fromObject; -import static org.springframework.web.reactive.function.BodyInserters.fromResource; - -public class FunctionalWebApplicationIntegrationTest { - - private static WebTestClient client; - private static WebServer server; - - @BeforeClass - public static void setup() throws Exception { - server = new FunctionalWebApplication().start(); - client = WebTestClient.bindToServer() - .baseUrl("http://localhost:" + server.getPort()) - .build(); - } - - @AfterClass - public static void destroy() { - server.stop(); - } - - @Test - public void givenRouter_whenGetTest_thenGotHelloWorld() throws Exception { - client.get() - .uri("/test") - .exchange() - .expectStatus() - .isOk() - .expectBody(String.class) - .isEqualTo("helloworld"); - } - - @Test - public void givenIndexFilter_whenRequestRoot_thenRewrittenToTest() throws Exception { - client.get() - .uri("/") - .exchange() - .expectStatus() - .isOk() - .expectBody(String.class) - .isEqualTo("helloworld"); - } - - @Test - public void givenLoginForm_whenPostValidToken_thenSuccess() throws Exception { - MultiValueMap formData = new LinkedMultiValueMap<>(1); - formData.add("user", "baeldung"); - formData.add("token", "you_know_what_to_do"); - - client.post() - .uri("/login") - .contentType(MediaType.APPLICATION_FORM_URLENCODED) - .body(BodyInserters.fromFormData(formData)) - .exchange() - .expectStatus() - .isOk() - .expectBody(String.class) - .isEqualTo("welcome back!"); - } - - @Test - public void givenLoginForm_whenRequestWithInvalidToken_thenFail() throws Exception { - MultiValueMap formData = new LinkedMultiValueMap<>(2); - formData.add("user", "baeldung"); - formData.add("token", "try_again"); - - client.post() - .uri("/login") - .contentType(MediaType.APPLICATION_FORM_URLENCODED) - .body(BodyInserters.fromFormData(formData)) - .exchange() - .expectStatus() - .isBadRequest(); - } - - @Test - public void givenUploadForm_whenRequestWithMultipartData_thenSuccess() throws Exception { - Resource resource = new ClassPathResource("/baeldung-weekly.png"); - client.post() - .uri("/upload") - .contentType(MediaType.MULTIPART_FORM_DATA) - .body(fromResource(resource)) - .exchange() - .expectStatus() - .isOk() - .expectBody(String.class) - .isEqualTo(String.valueOf(resource.contentLength())); - } - - @Test - public void givenActors_whenAddActor_thenAdded() throws Exception { - client.get() - .uri("/actor") - .exchange() - .expectStatus() - .isOk() - .expectBodyList(Actor.class) - .hasSize(2); - - client.post() - .uri("/actor") - .body(fromObject(new Actor("Clint", "Eastwood"))) - .exchange() - .expectStatus() - .isOk(); - - client.get() - .uri("/actor") - .exchange() - .expectStatus() - .isOk() - .expectBodyList(Actor.class) - .hasSize(3); - } - - @Test - public void givenResources_whenAccess_thenGot() throws Exception { - client.get() - .uri("/files/hello.txt") - .exchange() - .expectStatus() - .isOk() - .expectBody(String.class) - .isEqualTo("hello"); - } - -} diff --git a/spring-5-reactive/src/test/java/com/baeldung/jsonb/JsonbIntegrationTest.java b/spring-5-reactive/src/test/java/com/baeldung/jsonb/JsonbIntegrationTest.java deleted file mode 100644 index 756b303f3b..0000000000 --- a/spring-5-reactive/src/test/java/com/baeldung/jsonb/JsonbIntegrationTest.java +++ /dev/null @@ -1,43 +0,0 @@ -package com.baeldung.jsonb; - -import static org.junit.Assert.assertTrue; - -import java.math.BigDecimal; -import java.time.LocalDate; - -import org.junit.Test; -import org.junit.runner.RunWith; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.beans.factory.annotation.Value; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.boot.test.web.client.TestRestTemplate; -import org.springframework.http.ResponseEntity; -import org.springframework.test.context.junit4.SpringRunner; - -@RunWith(SpringRunner.class) -@SpringBootTest(classes = Spring5Application.class, webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT) -public class JsonbIntegrationTest { - @Value("${security.user.name}") - private String username; - @Value("${security.user.password}") - private String password; - - @Autowired - private TestRestTemplate template; - - @Test - public void givenId_whenUriIsPerson_thenGetPerson() { - ResponseEntity response = template.withBasicAuth(username, password) - .getForEntity("/person/1", Person.class); - Person person = response.getBody(); - assertTrue(person.equals(new Person(2, "Jhon", "jhon1@test.com", 0, LocalDate.of(2019, 9, 9), BigDecimal.valueOf(1500.0)))); - } - - @Test - public void whenSendPostAPerson_thenGetOkStatus() { - ResponseEntity response = template.withBasicAuth(username, password) - .postForEntity("/person", "{\"birthDate\":\"07-09-2017\",\"email\":\"jhon1@test.com\",\"person-name\":\"Jhon\",\"id\":10}", Boolean.class); - assertTrue(response.getBody()); - } - -} diff --git a/spring-5-reactive/src/test/java/com/baeldung/jupiter/EnabledOnJava8.java b/spring-5-reactive/src/test/java/com/baeldung/jupiter/EnabledOnJava8.java deleted file mode 100644 index c6d3b7ff10..0000000000 --- a/spring-5-reactive/src/test/java/com/baeldung/jupiter/EnabledOnJava8.java +++ /dev/null @@ -1,18 +0,0 @@ -package com.baeldung.jupiter; - -import java.lang.annotation.ElementType; -import java.lang.annotation.Retention; -import java.lang.annotation.RetentionPolicy; -import java.lang.annotation.Target; - -import org.springframework.test.context.junit.jupiter.EnabledIf; - -@Target({ ElementType.TYPE, ElementType.METHOD }) -@Retention(RetentionPolicy.RUNTIME) -@EnabledIf( - expression = "#{systemProperties['java.version'].startsWith('1.8')}", - reason = "Enabled on Java 8" -) -public @interface EnabledOnJava8 { - -} diff --git a/spring-5-reactive/src/test/java/com/baeldung/jupiter/Spring5EnabledAnnotationTest.java b/spring-5-reactive/src/test/java/com/baeldung/jupiter/Spring5EnabledAnnotationTest.java deleted file mode 100644 index ae058bc8ba..0000000000 --- a/spring-5-reactive/src/test/java/com/baeldung/jupiter/Spring5EnabledAnnotationTest.java +++ /dev/null @@ -1,50 +0,0 @@ -package com.baeldung.jupiter; - -import static org.junit.jupiter.api.Assertions.assertTrue; - -import org.junit.jupiter.api.Test; -import org.springframework.context.annotation.Configuration; -import org.springframework.test.context.TestPropertySource; -import org.springframework.test.context.junit.jupiter.DisabledIf; -import org.springframework.test.context.junit.jupiter.EnabledIf; -import org.springframework.test.context.junit.jupiter.SpringJUnitConfig; - -@SpringJUnitConfig(Spring5EnabledAnnotationTest.Config.class) -@TestPropertySource(properties = { "tests.enabled=true" }) -public class Spring5EnabledAnnotationTest { - - @Configuration - static class Config { - } - - @EnabledIf("true") - @Test - void givenEnabledIfLiteral_WhenTrue_ThenTestExecuted() { - assertTrue(true); - } - - @EnabledIf(expression = "${tests.enabled}", loadContext = true) - @Test - void givenEnabledIfExpression_WhenTrue_ThenTestExecuted() { - assertTrue(true); - } - - @EnabledIf("#{systemProperties['java.version'].startsWith('1.8')}") - @Test - void givenEnabledIfSpel_WhenTrue_ThenTestExecuted() { - assertTrue(true); - } - - @EnabledOnJava8 - @Test - void givenEnabledOnJava8_WhenTrue_ThenTestExecuted() { - assertTrue(true); - } - - @DisabledIf("#{systemProperties['java.version'].startsWith('1.7')}") - @Test - void givenDisabledIf_WhenTrue_ThenTestNotExecuted() { - assertTrue(true); - } - -} diff --git a/spring-5-reactive/src/test/java/com/baeldung/jupiter/Spring5JUnit5ComposedAnnotationIntegrationTest.java b/spring-5-reactive/src/test/java/com/baeldung/jupiter/Spring5JUnit5ComposedAnnotationIntegrationTest.java deleted file mode 100644 index 42d27b90f4..0000000000 --- a/spring-5-reactive/src/test/java/com/baeldung/jupiter/Spring5JUnit5ComposedAnnotationIntegrationTest.java +++ /dev/null @@ -1,38 +0,0 @@ -package com.baeldung.jupiter; - -import com.baeldung.web.reactive.Task; -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Test; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.context.ApplicationContext; - -import java.util.List; - -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertNotNull; - -@SpringJUnit5Config(TestConfig.class) -@DisplayName("@SpringJUnit5Config Tests") -class Spring5JUnit5ComposedAnnotationIntegrationTest { - - @Autowired - private Task task; - - @Autowired - private List tasks; - - @Test - @DisplayName("ApplicationContext injected into method") - void givenAMethodName_whenInjecting_thenApplicationContextInjectedIntoMethod(ApplicationContext applicationContext) { - assertNotNull(applicationContext, "ApplicationContext should have been injected into method by Spring"); - assertEquals(this.task, applicationContext.getBean("taskName", Task.class)); - } - - @Test - @DisplayName("Spring @Beans injected into fields") - void givenAnObject_whenInjecting_thenSpringBeansInjected() { - assertNotNull(task, "Task should have been @Autowired by Spring"); - assertEquals("taskName", task.getName(), "Task's name"); - assertEquals(1, tasks.size(), "Number of Tasks in context"); - } -} diff --git a/spring-5-reactive/src/test/java/com/baeldung/jupiter/Spring5JUnit5IntegrationTest.java b/spring-5-reactive/src/test/java/com/baeldung/jupiter/Spring5JUnit5IntegrationTest.java deleted file mode 100644 index 0f00a85832..0000000000 --- a/spring-5-reactive/src/test/java/com/baeldung/jupiter/Spring5JUnit5IntegrationTest.java +++ /dev/null @@ -1,25 +0,0 @@ -package com.baeldung.jupiter; - -import com.baeldung.web.reactive.Task; -import org.junit.jupiter.api.Test; -import org.junit.jupiter.api.extension.ExtendWith; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.context.ApplicationContext; -import org.springframework.test.context.ContextConfiguration; - -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertNotNull; - -@ExtendWith(SpringExtension.class) -@ContextConfiguration(classes = TestConfig.class) -class Spring5JUnit5IntegrationTest { - - @Autowired - private Task task; - - @Test - void givenAMethodName_whenInjecting_thenApplicationContextInjectedIntoMetho(ApplicationContext applicationContext) { - assertNotNull(applicationContext, "ApplicationContext should have been injected by Spring"); - assertEquals(this.task, applicationContext.getBean("taskName", Task.class)); - } -} diff --git a/spring-5-reactive/src/test/java/com/baeldung/jupiter/Spring5JUnit5ParallelIntegrationTest.java b/spring-5-reactive/src/test/java/com/baeldung/jupiter/Spring5JUnit5ParallelIntegrationTest.java deleted file mode 100644 index 55b0fcf267..0000000000 --- a/spring-5-reactive/src/test/java/com/baeldung/jupiter/Spring5JUnit5ParallelIntegrationTest.java +++ /dev/null @@ -1,25 +0,0 @@ -package com.baeldung.jupiter; - -import com.baeldung.Example1IntegrationTest; -import com.baeldung.Example2IntegrationTest; -import org.junit.experimental.ParallelComputer; -import org.junit.jupiter.api.Test; -import org.junit.runner.Computer; -import org.junit.runner.JUnitCore; - -class Spring5JUnit5ParallelIntegrationTest { - - @Test - void givenTwoTestClasses_whenJUnitRunParallel_thenTheTestsExecutingParallel() { - final Class[] classes = { Example1IntegrationTest.class, Example2IntegrationTest.class }; - - JUnitCore.runClasses(new ParallelComputer(true, true), classes); - } - - @Test - void givenTwoTestClasses_whenJUnitRunParallel_thenTheTestsExecutingLinear() { - final Class[] classes = { Example1IntegrationTest.class, Example2IntegrationTest.class }; - - JUnitCore.runClasses(new Computer(), classes); - } -} \ No newline at end of file diff --git a/spring-5-reactive/src/test/java/com/baeldung/jupiter/Spring5Java8NewFeaturesIntegrationTest.java b/spring-5-reactive/src/test/java/com/baeldung/jupiter/Spring5Java8NewFeaturesIntegrationTest.java deleted file mode 100644 index f58bf9f3cd..0000000000 --- a/spring-5-reactive/src/test/java/com/baeldung/jupiter/Spring5Java8NewFeaturesIntegrationTest.java +++ /dev/null @@ -1,31 +0,0 @@ -package com.baeldung.jupiter; - -import org.junit.jupiter.api.Test; - -import java.util.function.Supplier; -import java.util.regex.Pattern; -import java.util.stream.Collectors; - -import static org.junit.jupiter.api.Assertions.assertEquals; - -class Spring5Java8NewFeaturesIntegrationTest { - - @FunctionalInterface - public interface FunctionalInterfaceExample { - Result reverseString(Input input); - } - - public class StringUtils { - FunctionalInterfaceExample functionLambdaString = s -> Pattern.compile(" +") - .splitAsStream(s) - .map(word -> new StringBuilder(word).reverse()) - .collect(Collectors.joining(" ")); - } - - @Test - void givenStringUtil_whenSupplierCall_thenFunctionalInterfaceReverseString() throws Exception { - Supplier stringUtilsSupplier = StringUtils::new; - - assertEquals(stringUtilsSupplier.get().functionLambdaString.reverseString("hello"), "olleh"); - } -} diff --git a/spring-5-reactive/src/test/java/com/baeldung/jupiter/Spring5ReactiveServerClientIntegrationTest.java b/spring-5-reactive/src/test/java/com/baeldung/jupiter/Spring5ReactiveServerClientIntegrationTest.java deleted file mode 100644 index bbd852d625..0000000000 --- a/spring-5-reactive/src/test/java/com/baeldung/jupiter/Spring5ReactiveServerClientIntegrationTest.java +++ /dev/null @@ -1,94 +0,0 @@ -package com.baeldung.jupiter; - -import com.baeldung.web.reactive.Task; -import org.junit.jupiter.api.AfterAll; -import org.junit.jupiter.api.BeforeAll; -import org.springframework.http.server.reactive.HttpHandler; -import org.springframework.http.server.reactive.ReactorHttpHandlerAdapter; -import org.springframework.web.reactive.function.server.RouterFunction; -import org.springframework.web.reactive.function.server.RouterFunctions; -import org.springframework.web.reactive.function.server.ServerResponse; -import reactor.core.publisher.Flux; -import reactor.core.publisher.Mono; -import reactor.ipc.netty.NettyContext; -import reactor.ipc.netty.http.server.HttpServer; - -import java.time.Duration; - -import static org.springframework.web.reactive.function.server.RequestPredicates.GET; -import static org.springframework.web.reactive.function.server.RequestPredicates.POST; - -public class Spring5ReactiveServerClientIntegrationTest { - - private static NettyContext nettyContext; - - @BeforeAll - public static void setUp() throws Exception { - HttpServer server = HttpServer.create("localhost", 8080); - RouterFunction route = RouterFunctions.route(POST("/task/process"), request -> ServerResponse.ok() - .body(request.bodyToFlux(Task.class) - .map(ll -> new Task("TaskName", 1)), Task.class)) - .and(RouterFunctions.route(GET("/task"), request -> ServerResponse.ok() - .body(Mono.just("server is alive"), String.class))); - HttpHandler httpHandler = RouterFunctions.toHttpHandler(route); - ReactorHttpHandlerAdapter adapter = new ReactorHttpHandlerAdapter(httpHandler); - nettyContext = server.newHandler(adapter) - .block(); - } - - @AfterAll - public static void shutDown() { - nettyContext.dispose(); - } - - // @Test - // public void givenCheckTask_whenServerHandle_thenServerResponseALiveString() throws Exception { - // WebClient client = WebClient.create("http://localhost:8080"); - // Mono result = client - // .get() - // .uri("/task") - // .exchange() - // .then(response -> response.bodyToMono(String.class)); - // - // assertThat(result.block()).isInstanceOf(String.class); - // } - - // @Test - // public void givenThreeTasks_whenServerHandleTheTasks_thenServerResponseATask() throws Exception { - // URI uri = URI.create("http://localhost:8080/task/process"); - // ExchangeFunction exchange = ExchangeFunctions.create(new ReactorClientHttpConnector()); - // ClientRequest request = ClientRequest - // .method(HttpMethod.POST, uri) - // .body(BodyInserters.fromPublisher(getLatLngs(), Task.class)) - // .build(); - // - // Flux taskResponse = exchange - // .exchange(request) - // .flatMap(response -> response.bodyToFlux(Task.class)); - // - // assertThat(taskResponse.blockFirst()).isInstanceOf(Task.class); - // } - - // @Test - // public void givenCheckTask_whenServerHandle_thenOragicServerResponseALiveString() throws Exception { - // URI uri = URI.create("http://localhost:8080/task"); - // ExchangeFunction exchange = ExchangeFunctions.create(new ReactorClientHttpConnector()); - // ClientRequest request = ClientRequest - // .method(HttpMethod.GET, uri) - // .body(BodyInserters.fromPublisher(getLatLngs(), Task.class)) - // .build(); - // - // Flux taskResponse = exchange - // .exchange(request) - // .flatMap(response -> response.bodyToFlux(String.class)); - // - // assertThat(taskResponse.blockFirst()).isInstanceOf(String.class); - // } - - private static Flux getLatLngs() { - return Flux.range(0, 3) - .zipWith(Flux.interval(Duration.ofSeconds(1))) - .map(x -> new Task("taskname", 1)) - .doOnNext(ll -> System.out.println("Produced: {}" + ll)); - } -} diff --git a/spring-5-reactive/src/test/java/com/baeldung/jupiter/SpringJUnitConfigTest.java b/spring-5-reactive/src/test/java/com/baeldung/jupiter/SpringJUnitConfigTest.java deleted file mode 100644 index 6b0a6f9808..0000000000 --- a/spring-5-reactive/src/test/java/com/baeldung/jupiter/SpringJUnitConfigTest.java +++ /dev/null @@ -1,33 +0,0 @@ -package com.baeldung.jupiter; - -import static org.junit.Assert.assertNotNull; - -import org.junit.jupiter.api.Test; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.context.ApplicationContext; -import org.springframework.context.annotation.Configuration; -import org.springframework.test.context.junit.jupiter.SpringJUnitConfig; - -/** - * @SpringJUnitConfig(SpringJUnitConfigTest.Config.class) is equivalent to: - * - * @ExtendWith(SpringExtension.class) - * @ContextConfiguration(classes = SpringJUnitConfigTest.Config.class ) - * - */ -@SpringJUnitConfig(SpringJUnitConfigTest.Config.class) -public class SpringJUnitConfigTest { - - @Configuration - static class Config { - } - - @Autowired - private ApplicationContext applicationContext; - - @Test - void givenAppContext_WhenInjected_ThenItShouldNotBeNull() { - assertNotNull(applicationContext); - } - -} diff --git a/spring-5-reactive/src/test/java/com/baeldung/jupiter/SpringJUnitWebConfigTest.java b/spring-5-reactive/src/test/java/com/baeldung/jupiter/SpringJUnitWebConfigTest.java deleted file mode 100644 index c679dce77f..0000000000 --- a/spring-5-reactive/src/test/java/com/baeldung/jupiter/SpringJUnitWebConfigTest.java +++ /dev/null @@ -1,34 +0,0 @@ -package com.baeldung.jupiter; - -import static org.junit.Assert.assertNotNull; - -import org.junit.jupiter.api.Test; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.context.annotation.Configuration; -import org.springframework.test.context.junit.jupiter.web.SpringJUnitWebConfig; -import org.springframework.web.context.WebApplicationContext; - -/** - * @SpringJUnitWebConfig(SpringJUnitWebConfigTest.Config.class) is equivalent to: - * - * @ExtendWith(SpringExtension.class) - * @WebAppConfiguration - * @ContextConfiguration(classes = SpringJUnitWebConfigTest.Config.class ) - * - */ -@SpringJUnitWebConfig(SpringJUnitWebConfigTest.Config.class) -public class SpringJUnitWebConfigTest { - - @Configuration - static class Config { - } - - @Autowired - private WebApplicationContext webAppContext; - - @Test - void givenWebAppContext_WhenInjected_ThenItShouldNotBeNull() { - assertNotNull(webAppContext); - } - -} diff --git a/spring-5-reactive/src/test/java/com/baeldung/security/SecurityTest.java b/spring-5-reactive/src/test/java/com/baeldung/security/SecurityTest.java deleted file mode 100644 index a1c940a17a..0000000000 --- a/spring-5-reactive/src/test/java/com/baeldung/security/SecurityTest.java +++ /dev/null @@ -1,48 +0,0 @@ -package com.baeldung.security; - -import com.baeldung.SpringSecurity5Application; -import org.junit.Before; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.context.ApplicationContext; -import org.springframework.security.test.context.support.WithMockUser; -import org.springframework.test.context.ContextConfiguration; -import org.springframework.test.context.junit4.SpringRunner; -import org.springframework.test.web.reactive.server.WebTestClient; - -@RunWith(SpringRunner.class) -@ContextConfiguration(classes = SpringSecurity5Application.class) -public class SecurityTest { - - @Autowired - ApplicationContext context; - - private WebTestClient rest; - - @Before - public void setup() { - this.rest = WebTestClient - .bindToApplicationContext(this.context) - .configureClient() - .build(); - } - - @Test - public void whenNoCredentials_thenRedirectToLogin() { - this.rest.get() - .uri("/") - .exchange() - .expectStatus().is3xxRedirection(); - } - - @Test - @WithMockUser - public void whenHasCredentials_thenSeesGreeting() { - this.rest.get() - .uri("/") - .exchange() - .expectStatus().isOk() - .expectBody(String.class).isEqualTo("Hello, user"); - } -} diff --git a/spring-5-reactive/src/test/java/com/baeldung/web/PathPatternsUsingHandlerMethodIntegrationTest.java b/spring-5-reactive/src/test/java/com/baeldung/web/PathPatternsUsingHandlerMethodIntegrationTest.java deleted file mode 100644 index c2ed8ff071..0000000000 --- a/spring-5-reactive/src/test/java/com/baeldung/web/PathPatternsUsingHandlerMethodIntegrationTest.java +++ /dev/null @@ -1,101 +0,0 @@ -package com.baeldung.web; - -import com.baeldung.Spring5Application; -import org.junit.BeforeClass; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.test.context.junit4.SpringRunner; -import org.springframework.test.web.reactive.server.WebTestClient; - -@RunWith(SpringRunner.class) -@SpringBootTest(classes = Spring5Application.class) -public class PathPatternsUsingHandlerMethodIntegrationTest { - - private static WebTestClient client; - - @BeforeClass - public static void setUp() { - client = WebTestClient.bindToController(new PathPatternController()) - .build(); - } - - @Test - public void givenHandlerMethod_whenMultipleURIVariablePattern_then200() { - - client.get() - .uri("/spring5/ab/cd") - .exchange() - .expectStatus() - .is2xxSuccessful() - .expectBody() - .equals("/ab/cd"); - } - - @Test - public void givenHandlerMethod_whenURLWithWildcardTakingZeroOrMoreChar_then200() { - - client.get() - .uri("/spring5/userid") - .exchange() - .expectStatus() - .is2xxSuccessful() - .expectBody() - .equals("/spring5/*id"); - } - - @Test - public void givenHandlerMethod_whenURLWithWildcardTakingExactlyOneChar_then200() { - - client.get() - .uri("/string5") - .exchange() - .expectStatus() - .is2xxSuccessful() - .expectBody() - .equals("/s?ring5"); - } - - @Test - public void givenHandlerMethod_whenURLWithWildcardTakingZeroOrMorePathSegments_then200() { - - client.get() - .uri("/resources/baeldung") - .exchange() - .expectStatus() - .is2xxSuccessful() - .expectBody() - .equals("/resources/**"); - } - - @Test - public void givenHandlerMethod_whenURLWithRegexInPathVariable_thenExpectedOutput() { - - client.get() - .uri("/abc") - .exchange() - .expectStatus() - .is2xxSuccessful() - .expectBody() - .equals("abc"); - - client.get() - .uri("/123") - .exchange() - .expectStatus() - .is4xxClientError(); - } - - @Test - public void givenHandlerMethod_whenURLWithMultiplePathVariablesInSameSegment_then200() { - - client.get() - .uri("/baeldung_tutorial") - .exchange() - .expectStatus() - .is2xxSuccessful() - .expectBody() - .equals("Two variables are var1=baeldung and var2=tutorial"); - } - -} diff --git a/spring-5-reactive/src/test/java/com/baeldung/web/client/WebTestClientTest.java b/spring-5-reactive/src/test/java/com/baeldung/web/client/WebTestClientTest.java deleted file mode 100644 index 43114b5b50..0000000000 --- a/spring-5-reactive/src/test/java/com/baeldung/web/client/WebTestClientTest.java +++ /dev/null @@ -1,60 +0,0 @@ -package com.baeldung.web.client; - -import com.baeldung.Spring5Application; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.boot.web.server.LocalServerPort; -import org.springframework.test.context.junit4.SpringRunner; -import org.springframework.test.web.reactive.server.WebTestClient; -import org.springframework.web.reactive.function.server.RequestPredicates; -import org.springframework.web.reactive.function.server.RouterFunction; -import org.springframework.web.reactive.function.server.RouterFunctions; -import org.springframework.web.reactive.function.server.ServerResponse; -import org.springframework.web.server.WebHandler; -import reactor.core.publisher.Mono; - -@RunWith(SpringRunner.class) -@SpringBootTest(classes = Spring5Application.class, webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT) -public class WebTestClientTest { - - @LocalServerPort - private int port; - - private final RouterFunction ROUTER_FUNCTION = RouterFunctions.route(RequestPredicates.GET("/resource"), request -> ServerResponse.ok() - .build()); - private final WebHandler WEB_HANDLER = exchange -> Mono.empty(); - - @Test - public void testWebTestClientWithServerWebHandler() { - WebTestClient.bindToWebHandler(WEB_HANDLER) - .build(); - } - - @Test - public void testWebTestClientWithRouterFunction() { - WebTestClient.bindToRouterFunction(ROUTER_FUNCTION) - .build() - .get() - .uri("/resource") - .exchange() - .expectStatus() - .isOk() - .expectBody() - .isEmpty(); - } - - @Test - public void testWebTestClientWithServerURL() { - WebTestClient.bindToServer() - .baseUrl("http://localhost:" + port) - .build() - .get() - .uri("/resource") - .exchange() - .expectStatus() - .is3xxRedirection() - .expectBody(); - } - -} diff --git a/spring-5-reactive/src/test/resources/baeldung-weekly.png b/spring-5-reactive/src/test/resources/baeldung-weekly.png deleted file mode 100644 index 5a27d61dae718016a947083e01411ed1bc14f90e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 22275 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 Date: Wed, 13 Dec 2017 14:32:44 +0100 Subject: [PATCH 194/236] Add main entry point (#3233) --- spring-security-acl/pom.xml | 1 - .../src/main/java/org/baeldung/acl/Application.java | 11 +++++++++++ 2 files changed, 11 insertions(+), 1 deletion(-) create mode 100644 spring-security-acl/src/main/java/org/baeldung/acl/Application.java diff --git a/spring-security-acl/pom.xml b/spring-security-acl/pom.xml index 67197bc2f8..a19a54dd88 100644 --- a/spring-security-acl/pom.xml +++ b/spring-security-acl/pom.xml @@ -3,7 +3,6 @@ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 - com.baeldung spring-security-acl 0.0.1-SNAPSHOT war diff --git a/spring-security-acl/src/main/java/org/baeldung/acl/Application.java b/spring-security-acl/src/main/java/org/baeldung/acl/Application.java new file mode 100644 index 0000000000..665ca64076 --- /dev/null +++ b/spring-security-acl/src/main/java/org/baeldung/acl/Application.java @@ -0,0 +1,11 @@ +package org.baeldung.acl; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +public class Application { + public static void main(String[] args) { + SpringApplication.run(Application.class, args); + } +} From c68acf03d9dd803c4f027fffa71574f7cb6d3906 Mon Sep 17 00:00:00 2001 From: Eugen Paraschiv Date: Wed, 13 Dec 2017 15:56:37 +0200 Subject: [PATCH 195/236] flux generating data on interval --- .../controller/FooReactiveController.java | 11 ++++--- .../com/baeldung/reactive/FluxUnitTest.java | 29 +++++++++++++++++++ 2 files changed, 34 insertions(+), 6 deletions(-) create mode 100644 spring-5-reactive/src/test/java/com/baeldung/reactive/FluxUnitTest.java diff --git a/spring-5-reactive/src/main/java/com/baeldung/reactive/controller/FooReactiveController.java b/spring-5-reactive/src/main/java/com/baeldung/reactive/controller/FooReactiveController.java index d82692619d..1115036ad3 100644 --- a/spring-5-reactive/src/main/java/com/baeldung/reactive/controller/FooReactiveController.java +++ b/spring-5-reactive/src/main/java/com/baeldung/reactive/controller/FooReactiveController.java @@ -8,25 +8,24 @@ import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RestController; -import reactor.core.publisher.ConnectableFlux; import reactor.core.publisher.Flux; import reactor.core.publisher.Mono; -@RestController("/foos") +@RestController public class FooReactiveController { - @GetMapping("/{id}") + @GetMapping("/foos/{id}") public Mono getFoo(@PathVariable("id") long id) { return Mono.just(new Foo(id, randomAlphabetic(6))); } - @GetMapping("/") + @GetMapping("/foos") public Flux getAllFoos() { - final ConnectableFlux flux = Flux. create(fluxSink -> { + final Flux flux = Flux. create(fluxSink -> { while (true) { fluxSink.next(new Foo(System.currentTimeMillis(), randomAlphabetic(6))); } - }).sample(Duration.ofSeconds(1)).publish(); + }).sample(Duration.ofSeconds(1)).log(); return flux; } diff --git a/spring-5-reactive/src/test/java/com/baeldung/reactive/FluxUnitTest.java b/spring-5-reactive/src/test/java/com/baeldung/reactive/FluxUnitTest.java new file mode 100644 index 0000000000..5499e72877 --- /dev/null +++ b/spring-5-reactive/src/test/java/com/baeldung/reactive/FluxUnitTest.java @@ -0,0 +1,29 @@ +package com.baeldung.reactive; + +import static org.apache.commons.lang3.RandomStringUtils.randomAlphabetic; +import static org.junit.Assert.assertNotNull; + +import java.time.Duration; + +import org.junit.jupiter.api.Test; + +import com.baeldung.reactive.controller.Foo; + +import reactor.core.publisher.Flux; + +public class FluxUnitTest { + + @Test + public void whenFluxIsConstructed_thenCorrect() { + final Flux flux = Flux. create(fluxSink -> { + while (true) { + fluxSink.next(new Foo(System.currentTimeMillis(), randomAlphabetic(6))); + } + }).sample(Duration.ofSeconds(1)).log(); + + flux.subscribe(); + + assertNotNull(flux); + } + +} From 471ed5d99297d2acd627bf80f55948749309d29c Mon Sep 17 00:00:00 2001 From: Eugen Paraschiv Date: Wed, 13 Dec 2017 18:59:17 +0200 Subject: [PATCH 196/236] new client project, general cleanup, testing work --- spring-5-reactive-client/.gitignore | 12 ++ spring-5-reactive-client/README.md | 15 ++ spring-5-reactive-client/pom.xml | 201 ++++++++++++++++++ .../com/baeldung/reactive/model}/Foo.java | 2 +- .../src/main/resources/application.properties | 3 + .../src/main/resources/logback.xml | 16 ++ .../src/main/webapp/WEB-INF/web.xml | 21 ++ .../reactive/ReactiveIntegrationTest.java | 42 ++++ .../Spring5ReactiveTestApplication.java | 35 +++ .../src/test/resources/logback-test.xml | 16 ++ .../controller/FooReactiveController.java | 17 +- .../java/com/baeldung/reactive/model/Foo.java | 13 ++ .../src/main/resources/files/hello.txt | 1 - .../src/main/resources/files/test/test.txt | 1 - .../com/baeldung/reactive/FluxUnitTest.java | 5 +- 15 files changed, 393 insertions(+), 7 deletions(-) create mode 100644 spring-5-reactive-client/.gitignore create mode 100644 spring-5-reactive-client/README.md create mode 100644 spring-5-reactive-client/pom.xml rename {spring-5-reactive/src/main/java/com/baeldung/reactive/controller => spring-5-reactive-client/src/main/java/com/baeldung/reactive/model}/Foo.java (78%) create mode 100644 spring-5-reactive-client/src/main/resources/application.properties create mode 100644 spring-5-reactive-client/src/main/resources/logback.xml create mode 100644 spring-5-reactive-client/src/main/webapp/WEB-INF/web.xml create mode 100644 spring-5-reactive-client/src/test/java/com/baeldung/reactive/ReactiveIntegrationTest.java create mode 100644 spring-5-reactive-client/src/test/java/com/baeldung/reactive/Spring5ReactiveTestApplication.java create mode 100644 spring-5-reactive-client/src/test/resources/logback-test.xml create mode 100644 spring-5-reactive/src/main/java/com/baeldung/reactive/model/Foo.java delete mode 100644 spring-5-reactive/src/main/resources/files/hello.txt delete mode 100644 spring-5-reactive/src/main/resources/files/test/test.txt diff --git a/spring-5-reactive-client/.gitignore b/spring-5-reactive-client/.gitignore new file mode 100644 index 0000000000..dec013dfa4 --- /dev/null +++ b/spring-5-reactive-client/.gitignore @@ -0,0 +1,12 @@ +#folders# +.idea +/target +/neoDb* +/data +/src/main/webapp/WEB-INF/classes +*/META-INF/* + +# Packaged files # +*.jar +*.war +*.ear \ No newline at end of file diff --git a/spring-5-reactive-client/README.md b/spring-5-reactive-client/README.md new file mode 100644 index 0000000000..400e343263 --- /dev/null +++ b/spring-5-reactive-client/README.md @@ -0,0 +1,15 @@ +## Spring REST Example Project + +### The Course +The "REST With Spring" Classes: http://bit.ly/restwithspring + +### Relevant Articles + +- [Concurrent Test Execution in Spring 5](http://www.baeldung.com/spring-5-concurrent-tests) +- [Introduction to the Functional Web Framework in Spring 5](http://www.baeldung.com/spring-5-functional-web) +- [Exploring the Spring 5 MVC URL Matching Improvements](http://www.baeldung.com/spring-5-mvc-url-matching) +- [Spring 5 WebClient](http://www.baeldung.com/spring-5-webclient) +- [Spring 5 Functional Bean Registration](http://www.baeldung.com/spring-5-functional-beans) +- [The SpringJUnitConfig and SpringJUnitWebConfig Annotations in Spring 5](http://www.baeldung.com/spring-5-junit-config) +- [Spring Security 5 for Reactive Applications](http://www.baeldung.com/spring-security-5-reactive) +- [Spring 5 Testing with @EnabledIf Annotation](https://github.com/eugenp/tutorials/tree/master/spring-5) diff --git a/spring-5-reactive-client/pom.xml b/spring-5-reactive-client/pom.xml new file mode 100644 index 0000000000..8aa579b724 --- /dev/null +++ b/spring-5-reactive-client/pom.xml @@ -0,0 +1,201 @@ + + + 4.0.0 + + com.baeldung + spring-5-reactive-client + 0.0.1-SNAPSHOT + jar + + spring-5 + spring 5 sample project about new features + + + org.springframework.boot + spring-boot-starter-parent + 2.0.0.M7 + + + + + + org.springframework.boot + spring-boot-starter-data-jpa + + + org.springframework.boot + spring-boot-starter-validation + + + org.springframework.boot + spring-boot-starter-web + + + org.springframework.boot + spring-boot-starter-webflux + + + org.projectreactor + reactor-spring + ${reactor-spring.version} + + + javax.json.bind + javax.json.bind-api + + + + + + + + + + + + + + + + + org.apache.geronimo.specs + geronimo-json_1.1_spec + ${geronimo-json_1.1_spec.version} + + + org.apache.johnzon + johnzon-jsonb + + + + org.apache.commons + commons-lang3 + + + + + + org.springframework.boot + spring-boot-devtools + runtime + + + com.h2database + h2 + runtime + + + + org.springframework + spring-test + + + org.springframework.boot + spring-boot-starter-test + test + + + + org.apache.commons + commons-collections4 + 4.1 + test + + + + org.junit.jupiter + junit-jupiter-api + + + org.junit.jupiter + junit-jupiter-engine + test + + + org.junit.platform + junit-platform-surefire-provider + ${junit.platform.version} + test + + + org.junit.platform + junit-platform-runner + ${junit.platform.version} + test + + + + org.projectlombok + lombok + + + org.apache.commons + commons-lang3 + + + + + + + + org.springframework.boot + spring-boot-maven-plugin + + com.baeldung.Spring5Application + JAR + + + + + org.apache.maven.plugins + maven-surefire-plugin + + 3 + true + methods + true + + **/*IntegrationTest.java + **/*LiveTest.java + + + + + + + + + spring-milestones + Spring Milestones + https://repo.spring.io/milestone + + false + + + + + + spring-milestones + Spring Milestones + https://repo.spring.io/milestone + + false + + + + + + UTF-8 + UTF-8 + 1.8 + 1.0.0 + 5.0.0 + 2.20 + 5.0.1.RELEASE + 1.0.1.RELEASE + 1.1.3 + 1.0 + 1.0 + + + diff --git a/spring-5-reactive/src/main/java/com/baeldung/reactive/controller/Foo.java b/spring-5-reactive-client/src/main/java/com/baeldung/reactive/model/Foo.java similarity index 78% rename from spring-5-reactive/src/main/java/com/baeldung/reactive/controller/Foo.java rename to spring-5-reactive-client/src/main/java/com/baeldung/reactive/model/Foo.java index 480782a551..2c49e6146a 100644 --- a/spring-5-reactive/src/main/java/com/baeldung/reactive/controller/Foo.java +++ b/spring-5-reactive-client/src/main/java/com/baeldung/reactive/model/Foo.java @@ -1,4 +1,4 @@ -package com.baeldung.reactive.controller; +package com.baeldung.reactive.model; import lombok.AllArgsConstructor; import lombok.Data; diff --git a/spring-5-reactive-client/src/main/resources/application.properties b/spring-5-reactive-client/src/main/resources/application.properties new file mode 100644 index 0000000000..2d93456aeb --- /dev/null +++ b/spring-5-reactive-client/src/main/resources/application.properties @@ -0,0 +1,3 @@ +logging.level.root=INFO + +server.port=8081 \ No newline at end of file diff --git a/spring-5-reactive-client/src/main/resources/logback.xml b/spring-5-reactive-client/src/main/resources/logback.xml new file mode 100644 index 0000000000..8bbe8c1d67 --- /dev/null +++ b/spring-5-reactive-client/src/main/resources/logback.xml @@ -0,0 +1,16 @@ + + + + + # Pattern of log message for console appender + %d{yyyy-MM-dd HH:mm:ss} %-5p %m%n + + + + + + + + + + \ No newline at end of file diff --git a/spring-5-reactive-client/src/main/webapp/WEB-INF/web.xml b/spring-5-reactive-client/src/main/webapp/WEB-INF/web.xml new file mode 100644 index 0000000000..bfcf43dad2 --- /dev/null +++ b/spring-5-reactive-client/src/main/webapp/WEB-INF/web.xml @@ -0,0 +1,21 @@ + + + + Spring Functional Application + + + functional + com.baeldung.functional.RootServlet + 1 + true + + + functional + / + + + + \ No newline at end of file diff --git a/spring-5-reactive-client/src/test/java/com/baeldung/reactive/ReactiveIntegrationTest.java b/spring-5-reactive-client/src/test/java/com/baeldung/reactive/ReactiveIntegrationTest.java new file mode 100644 index 0000000000..394ff42e5f --- /dev/null +++ b/spring-5-reactive-client/src/test/java/com/baeldung/reactive/ReactiveIntegrationTest.java @@ -0,0 +1,42 @@ +package com.baeldung.reactive; + +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.web.reactive.function.client.ClientResponse; +import org.springframework.web.reactive.function.client.WebClient; + +import com.baeldung.reactive.model.Foo; + +import reactor.core.publisher.Mono; + +@SpringBootTest +public class ReactiveIntegrationTest { + + private WebClient client; + + @BeforeEach + public void before() { + client = WebClient.create("http://localhost:8080"); + } + + // + + @Test + public void whenMonoReactiveEndpointIsConsumed_thenCorrectOutput() { + final Mono fooMono = client.get().uri("/foos/123").exchange().log(); + + System.out.println(fooMono.subscribe()); + } + + @Test + public void whenFluxReactiveEndpointIsConsumed_thenCorrectOutput() throws InterruptedException { + client.get().uri("/foos") + .retrieve() + .bodyToFlux(Foo.class).log() + .subscribe(System.out::println); + + System.out.println(); + } + +} diff --git a/spring-5-reactive-client/src/test/java/com/baeldung/reactive/Spring5ReactiveTestApplication.java b/spring-5-reactive-client/src/test/java/com/baeldung/reactive/Spring5ReactiveTestApplication.java new file mode 100644 index 0000000000..c884ace323 --- /dev/null +++ b/spring-5-reactive-client/src/test/java/com/baeldung/reactive/Spring5ReactiveTestApplication.java @@ -0,0 +1,35 @@ +package com.baeldung.reactive; + +import org.springframework.boot.CommandLineRunner; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.context.annotation.Bean; +import org.springframework.web.reactive.function.client.WebClient; + +import com.baeldung.reactive.model.Foo; + +@SpringBootApplication +public class Spring5ReactiveTestApplication { + + @Bean + public WebClient client() { + return WebClient.create("http://localhost:8080"); + } + + @Bean + CommandLineRunner cmd(WebClient client) { + return args -> { + client.get().uri("/foos2") + .retrieve() + .bodyToFlux(Foo.class).log() + .subscribe(System.out::println); + }; + } + + // + + public static void main(String[] args) { + SpringApplication.run(Spring5ReactiveTestApplication.class, args); + } + +} diff --git a/spring-5-reactive-client/src/test/resources/logback-test.xml b/spring-5-reactive-client/src/test/resources/logback-test.xml new file mode 100644 index 0000000000..8bbe8c1d67 --- /dev/null +++ b/spring-5-reactive-client/src/test/resources/logback-test.xml @@ -0,0 +1,16 @@ + + + + + # Pattern of log message for console appender + %d{yyyy-MM-dd HH:mm:ss} %-5p %m%n + + + + + + + + + + \ No newline at end of file diff --git a/spring-5-reactive/src/main/java/com/baeldung/reactive/controller/FooReactiveController.java b/spring-5-reactive/src/main/java/com/baeldung/reactive/controller/FooReactiveController.java index 1115036ad3..933d469f65 100644 --- a/spring-5-reactive/src/main/java/com/baeldung/reactive/controller/FooReactiveController.java +++ b/spring-5-reactive/src/main/java/com/baeldung/reactive/controller/FooReactiveController.java @@ -3,13 +3,19 @@ package com.baeldung.reactive.controller; import static org.apache.commons.lang3.RandomStringUtils.randomAlphabetic; import java.time.Duration; +import java.util.Random; +import java.util.stream.Stream; +import org.springframework.http.MediaType; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RestController; +import com.baeldung.reactive.model.Foo; + import reactor.core.publisher.Flux; import reactor.core.publisher.Mono; +import reactor.util.function.Tuple2; @RestController public class FooReactiveController { @@ -19,11 +25,18 @@ public class FooReactiveController { return Mono.just(new Foo(id, randomAlphabetic(6))); } - @GetMapping("/foos") + @GetMapping(produces = MediaType.TEXT_EVENT_STREAM_VALUE, value = "/foos") + public Flux getAllFoos2() { + final Flux foosFlux = Flux.fromStream(Stream.generate(() -> new Foo(new Random().nextLong(), randomAlphabetic(6)))); + final Flux emmitFlux = Flux.interval(Duration.ofSeconds(1)); + return Flux.zip(foosFlux, emmitFlux).map(Tuple2::getT1); + } + + @GetMapping(produces = MediaType.TEXT_EVENT_STREAM_VALUE, value = "/foos2") public Flux getAllFoos() { final Flux flux = Flux. create(fluxSink -> { while (true) { - fluxSink.next(new Foo(System.currentTimeMillis(), randomAlphabetic(6))); + fluxSink.next(new Foo(new Random().nextLong(), randomAlphabetic(6))); } }).sample(Duration.ofSeconds(1)).log(); diff --git a/spring-5-reactive/src/main/java/com/baeldung/reactive/model/Foo.java b/spring-5-reactive/src/main/java/com/baeldung/reactive/model/Foo.java new file mode 100644 index 0000000000..2c49e6146a --- /dev/null +++ b/spring-5-reactive/src/main/java/com/baeldung/reactive/model/Foo.java @@ -0,0 +1,13 @@ +package com.baeldung.reactive.model; + +import lombok.AllArgsConstructor; +import lombok.Data; + +@AllArgsConstructor +@Data +public class Foo { + + private long id; + private String name; + +} diff --git a/spring-5-reactive/src/main/resources/files/hello.txt b/spring-5-reactive/src/main/resources/files/hello.txt deleted file mode 100644 index b6fc4c620b..0000000000 --- a/spring-5-reactive/src/main/resources/files/hello.txt +++ /dev/null @@ -1 +0,0 @@ -hello \ No newline at end of file diff --git a/spring-5-reactive/src/main/resources/files/test/test.txt b/spring-5-reactive/src/main/resources/files/test/test.txt deleted file mode 100644 index 30d74d2584..0000000000 --- a/spring-5-reactive/src/main/resources/files/test/test.txt +++ /dev/null @@ -1 +0,0 @@ -test \ No newline at end of file diff --git a/spring-5-reactive/src/test/java/com/baeldung/reactive/FluxUnitTest.java b/spring-5-reactive/src/test/java/com/baeldung/reactive/FluxUnitTest.java index 5499e72877..bad5fc5f22 100644 --- a/spring-5-reactive/src/test/java/com/baeldung/reactive/FluxUnitTest.java +++ b/spring-5-reactive/src/test/java/com/baeldung/reactive/FluxUnitTest.java @@ -4,10 +4,11 @@ import static org.apache.commons.lang3.RandomStringUtils.randomAlphabetic; import static org.junit.Assert.assertNotNull; import java.time.Duration; +import java.util.Random; import org.junit.jupiter.api.Test; -import com.baeldung.reactive.controller.Foo; +import com.baeldung.reactive.model.Foo; import reactor.core.publisher.Flux; @@ -17,7 +18,7 @@ public class FluxUnitTest { public void whenFluxIsConstructed_thenCorrect() { final Flux flux = Flux. create(fluxSink -> { while (true) { - fluxSink.next(new Foo(System.currentTimeMillis(), randomAlphabetic(6))); + fluxSink.next(new Foo(new Random().nextLong(), randomAlphabetic(6))); } }).sample(Duration.ofSeconds(1)).log(); From 9e8e17b6893dad885872a5c5ff01b1670c1c484d Mon Sep 17 00:00:00 2001 From: abialas Date: Wed, 13 Dec 2017 22:45:14 +0100 Subject: [PATCH 197/236] BAEL-1304 --- persistence-modules/spring-data-eclipselink | 1 + 1 file changed, 1 insertion(+) create mode 160000 persistence-modules/spring-data-eclipselink diff --git a/persistence-modules/spring-data-eclipselink b/persistence-modules/spring-data-eclipselink new file mode 160000 index 0000000000..dd02630267 --- /dev/null +++ b/persistence-modules/spring-data-eclipselink @@ -0,0 +1 @@ +Subproject commit dd02630267da27e13452c5f91a0ccf7ed3743cbb From 92770e26eb15335f6215735790dd090af462a535 Mon Sep 17 00:00:00 2001 From: abialas Date: Wed, 13 Dec 2017 23:14:51 +0100 Subject: [PATCH 198/236] remove folder --- persistence-modules/spring-data-eclipselink | 1 - 1 file changed, 1 deletion(-) delete mode 160000 persistence-modules/spring-data-eclipselink diff --git a/persistence-modules/spring-data-eclipselink b/persistence-modules/spring-data-eclipselink deleted file mode 160000 index dd02630267..0000000000 --- a/persistence-modules/spring-data-eclipselink +++ /dev/null @@ -1 +0,0 @@ -Subproject commit dd02630267da27e13452c5f91a0ccf7ed3743cbb From 3210112a451ca39ed997a4d418f5508e8a666126 Mon Sep 17 00:00:00 2001 From: abialas Date: Wed, 13 Dec 2017 23:15:59 +0100 Subject: [PATCH 199/236] BAEL-1304 add files --- .../spring-data-eclipselink/pom.xml | 79 +++++++++++++++++++ .../EclipselinkSpringDataApplication.java | 12 +++ .../springdata/JpaConfiguration.java | 44 +++++++++++ .../eclipselink/springdata/model/Person.java | 43 ++++++++++ .../springdata/repo/PersonsRepository.java | 14 ++++ .../src/main/resources/application.properties | 2 + .../repo/PersonsRepositoryTest.java | 59 ++++++++++++++ 7 files changed, 253 insertions(+) create mode 100644 persistence-modules/spring-data-eclipselink/pom.xml create mode 100644 persistence-modules/spring-data-eclipselink/src/main/java/com/baeldung/eclipselink/springdata/EclipselinkSpringDataApplication.java create mode 100644 persistence-modules/spring-data-eclipselink/src/main/java/com/baeldung/eclipselink/springdata/JpaConfiguration.java create mode 100644 persistence-modules/spring-data-eclipselink/src/main/java/com/baeldung/eclipselink/springdata/model/Person.java create mode 100644 persistence-modules/spring-data-eclipselink/src/main/java/com/baeldung/eclipselink/springdata/repo/PersonsRepository.java create mode 100644 persistence-modules/spring-data-eclipselink/src/main/resources/application.properties create mode 100644 persistence-modules/spring-data-eclipselink/src/test/java/com/baeldung/eclipselink/springdata/repo/PersonsRepositoryTest.java diff --git a/persistence-modules/spring-data-eclipselink/pom.xml b/persistence-modules/spring-data-eclipselink/pom.xml new file mode 100644 index 0000000000..147901dc90 --- /dev/null +++ b/persistence-modules/spring-data-eclipselink/pom.xml @@ -0,0 +1,79 @@ + + + 4.0.0 + + com.baeldung + spring-data-eclipselink + 1.0.0-SNAPSHOT + + spring-data-eclipselink + + + com.baeldung + parent-modules + 1.0.0-SNAPSHOT + ../../ + + + + UTF-8 + UTF-8 + 1.8 + 1.5.9.RELEASE + 2.7.0 + 1.4.196 + + + + + org.springframework.boot + spring-boot-dependencies + ${spring.version} + pom + import + + + org.springframework.boot + spring-boot-starter-data-jpa + ${spring.version} + + + org.hibernate + hibernate-entitymanager + + + org.hibernate + hibernate-core + + + + + org.springframework.boot + spring-boot-starter-test + ${spring.version} + test + + + org.eclipse.persistence + org.eclipse.persistence.jpa + ${eclipselink.version} + + + com.h2database + h2 + runtime + ${h2.version} + + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + + + diff --git a/persistence-modules/spring-data-eclipselink/src/main/java/com/baeldung/eclipselink/springdata/EclipselinkSpringDataApplication.java b/persistence-modules/spring-data-eclipselink/src/main/java/com/baeldung/eclipselink/springdata/EclipselinkSpringDataApplication.java new file mode 100644 index 0000000000..63ce778022 --- /dev/null +++ b/persistence-modules/spring-data-eclipselink/src/main/java/com/baeldung/eclipselink/springdata/EclipselinkSpringDataApplication.java @@ -0,0 +1,12 @@ +package com.baeldung.eclipselink.springdata; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +public class EclipselinkSpringDataApplication { + + public static void main(String[] args) { + SpringApplication.run(EclipselinkSpringDataApplication.class, args); + } +} diff --git a/persistence-modules/spring-data-eclipselink/src/main/java/com/baeldung/eclipselink/springdata/JpaConfiguration.java b/persistence-modules/spring-data-eclipselink/src/main/java/com/baeldung/eclipselink/springdata/JpaConfiguration.java new file mode 100644 index 0000000000..60ff7909be --- /dev/null +++ b/persistence-modules/spring-data-eclipselink/src/main/java/com/baeldung/eclipselink/springdata/JpaConfiguration.java @@ -0,0 +1,44 @@ +package com.baeldung.eclipselink.springdata; + +import org.eclipse.persistence.config.PersistenceUnitProperties; +import org.springframework.beans.factory.ObjectProvider; +import org.springframework.boot.autoconfigure.orm.jpa.JpaBaseConfiguration; +import org.springframework.boot.autoconfigure.orm.jpa.JpaProperties; +import org.springframework.boot.autoconfigure.transaction.TransactionManagerCustomizers; +import org.springframework.context.annotation.Configuration; +import org.springframework.instrument.classloading.InstrumentationLoadTimeWeaver; +import org.springframework.orm.jpa.vendor.AbstractJpaVendorAdapter; +import org.springframework.orm.jpa.vendor.EclipseLinkJpaVendorAdapter; +import org.springframework.transaction.jta.JtaTransactionManager; + +import javax.sql.DataSource; +import java.util.HashMap; +import java.util.Map; + +/** + * Created by adam. + */ +@Configuration +public class JpaConfiguration extends JpaBaseConfiguration { + + protected JpaConfiguration(DataSource dataSource, JpaProperties properties, ObjectProvider jtaTransactionManager, ObjectProvider transactionManagerCustomizers) { + super(dataSource, properties, jtaTransactionManager, transactionManagerCustomizers); + } + + @Override + protected AbstractJpaVendorAdapter createJpaVendorAdapter() { + return new EclipseLinkJpaVendorAdapter(); + } + + @Override + protected Map getVendorProperties() { + HashMap map = new HashMap<>(); + map.put(PersistenceUnitProperties.WEAVING, detectWeavingMode()); + map.put(PersistenceUnitProperties.DDL_GENERATION, "drop-and-create-tables"); + return map; + } + + private String detectWeavingMode() { + return InstrumentationLoadTimeWeaver.isInstrumentationAvailable() ? "true" : "static"; + } +} diff --git a/persistence-modules/spring-data-eclipselink/src/main/java/com/baeldung/eclipselink/springdata/model/Person.java b/persistence-modules/spring-data-eclipselink/src/main/java/com/baeldung/eclipselink/springdata/model/Person.java new file mode 100644 index 0000000000..75161875bd --- /dev/null +++ b/persistence-modules/spring-data-eclipselink/src/main/java/com/baeldung/eclipselink/springdata/model/Person.java @@ -0,0 +1,43 @@ +package com.baeldung.eclipselink.springdata.model; + +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.GenerationType; +import javax.persistence.Id; + +/** + * Created by adam. + */ +@Entity +public class Person { + + @Id + @GeneratedValue(strategy = GenerationType.SEQUENCE) + private Long id; + private String firstName; + private String lastName; + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public String getFirstName() { + return firstName; + } + + public void setFirstName(String firstName) { + this.firstName = firstName; + } + + public String getLastName() { + return lastName; + } + + public void setLastName(String lastName) { + this.lastName = lastName; + } +} diff --git a/persistence-modules/spring-data-eclipselink/src/main/java/com/baeldung/eclipselink/springdata/repo/PersonsRepository.java b/persistence-modules/spring-data-eclipselink/src/main/java/com/baeldung/eclipselink/springdata/repo/PersonsRepository.java new file mode 100644 index 0000000000..86cd85d5fe --- /dev/null +++ b/persistence-modules/spring-data-eclipselink/src/main/java/com/baeldung/eclipselink/springdata/repo/PersonsRepository.java @@ -0,0 +1,14 @@ +package com.baeldung.eclipselink.springdata.repo; + +import org.springframework.data.repository.CrudRepository; + +import com.baeldung.eclipselink.springdata.model.Person; + +/** + * Created by adam. + */ +public interface PersonsRepository extends CrudRepository { + + Person findByFirstName(String firstName); + +} diff --git a/persistence-modules/spring-data-eclipselink/src/main/resources/application.properties b/persistence-modules/spring-data-eclipselink/src/main/resources/application.properties new file mode 100644 index 0000000000..549c0b4ada --- /dev/null +++ b/persistence-modules/spring-data-eclipselink/src/main/resources/application.properties @@ -0,0 +1,2 @@ +spring.datasource.url=jdbc:h2:mem:test +spring.jpa.show-sql=true \ No newline at end of file diff --git a/persistence-modules/spring-data-eclipselink/src/test/java/com/baeldung/eclipselink/springdata/repo/PersonsRepositoryTest.java b/persistence-modules/spring-data-eclipselink/src/test/java/com/baeldung/eclipselink/springdata/repo/PersonsRepositoryTest.java new file mode 100644 index 0000000000..4c24df9ee7 --- /dev/null +++ b/persistence-modules/spring-data-eclipselink/src/test/java/com/baeldung/eclipselink/springdata/repo/PersonsRepositoryTest.java @@ -0,0 +1,59 @@ +package com.baeldung.eclipselink.springdata.repo; + +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.test.annotation.DirtiesContext; +import org.springframework.test.context.junit4.SpringRunner; + +import com.baeldung.eclipselink.springdata.model.Person; +import com.baeldung.eclipselink.springdata.repo.PersonsRepository; + +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.core.IsEqual.equalTo; +import static org.hamcrest.core.IsNull.notNullValue; + +/** + * Created by adam. + */ +@RunWith(SpringRunner.class) +@SpringBootTest +@DirtiesContext(classMode = DirtiesContext.ClassMode.BEFORE_EACH_TEST_METHOD) +public class PersonsRepositoryTest { + + @Autowired + private PersonsRepository personsRepository; + + @Test + public void shouldAddOnePersonToDB() { + // when + personsRepository.save(new Person()); + + // then + assertThat(personsRepository.findAll() + .spliterator() + .getExactSizeIfKnown(), equalTo(1l)); + } + + @Test + public void shouldFindOnePersonWithNameAdam() { + // given + Person person1 = new Person(); + person1.setFirstName("Adam"); + + Person person2 = new Person(); + person2.setFirstName("Dave"); + + personsRepository.save(person1); + personsRepository.save(person2); + + // when + Person foundPerson = personsRepository.findByFirstName("Adam"); + + // then + assertThat(foundPerson.getFirstName(), equalTo("Adam")); + assertThat(foundPerson.getId(), notNullValue()); + } + +} From b1323faaf37adb8c1416e99c96fa27d4e98d4f04 Mon Sep 17 00:00:00 2001 From: abialas Date: Wed, 13 Dec 2017 23:20:56 +0100 Subject: [PATCH 200/236] BAEL-1304 add module spring-data-eclipselink --- pom.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/pom.xml b/pom.xml index 2c611e6efe..3e38efec4c 100644 --- a/pom.xml +++ b/pom.xml @@ -172,6 +172,7 @@ persistence-modules/spring-hibernate-3 spring-hibernate4 persistence-modules/spring-hibernate-5 + persistence-modules/spring-data-eclipselink spring-integration spring-jersey spring-jmeter-jenkins From 18c8747c98d0c89c64e1a7db8df80413737a4ef7 Mon Sep 17 00:00:00 2001 From: Loredana Crusoveanu Date: Thu, 14 Dec 2017 06:26:03 +0200 Subject: [PATCH 201/236] BAEL-1248 google sheets api example (#3189) * google sheets api example * add dependencies * rename test * update test * add comment * trigger build * trigger build * Formatting to standards * Getting rid of stray tabs * Applying formatting rules to source files as well * trigger build --- libraries/pom.xml | 25 +++- .../google/sheets/GoogleAuthorizeUtil.java | 42 ++++++ .../google/sheets/SheetsServiceUtil.java | 23 +++ .../google-sheets-client-secret.json | 1 + .../sheets/GoogleSheetsIntegrationTest.java | 140 ++++++++++++++++++ 5 files changed, 228 insertions(+), 3 deletions(-) create mode 100644 libraries/src/main/java/com/baeldung/google/sheets/GoogleAuthorizeUtil.java create mode 100644 libraries/src/main/java/com/baeldung/google/sheets/SheetsServiceUtil.java create mode 100644 libraries/src/main/resources/google-sheets-client-secret.json create mode 100644 libraries/src/test/java/com/baeldung/google/sheets/GoogleSheetsIntegrationTest.java diff --git a/libraries/pom.xml b/libraries/pom.xml index eaa2d9d38f..3627e74472 100644 --- a/libraries/pom.xml +++ b/libraries/pom.xml @@ -633,9 +633,26 @@ ${googleclient.version} - com.google.http-client - google-http-client-gson - ${googleclient.version} + com.google.http-client + google-http-client-gson + ${googleclient.version} + + + + + com.google.api-client + google-api-client + ${google-api.version} + + + com.google.oauth-client + google-oauth-client-jetty + ${google-api.version} + + + com.google.apis + google-api-services-sheets + ${google-sheets.version} @@ -710,5 +727,7 @@ 1.0.0 3.8.4 2.5.5 + 1.23.0 + v4-rev493-1.21.0 \ No newline at end of file diff --git a/libraries/src/main/java/com/baeldung/google/sheets/GoogleAuthorizeUtil.java b/libraries/src/main/java/com/baeldung/google/sheets/GoogleAuthorizeUtil.java new file mode 100644 index 0000000000..650a1d084c --- /dev/null +++ b/libraries/src/main/java/com/baeldung/google/sheets/GoogleAuthorizeUtil.java @@ -0,0 +1,42 @@ +package com.baeldung.google.sheets; + +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.security.GeneralSecurityException; +import java.util.Arrays; +import java.util.List; + +import com.google.api.client.auth.oauth2.Credential; +import com.google.api.client.extensions.java6.auth.oauth2.AuthorizationCodeInstalledApp; +import com.google.api.client.extensions.jetty.auth.oauth2.LocalServerReceiver; +import com.google.api.client.googleapis.auth.oauth2.GoogleAuthorizationCodeFlow; +import com.google.api.client.googleapis.auth.oauth2.GoogleClientSecrets; +import com.google.api.client.googleapis.javanet.GoogleNetHttpTransport; +import com.google.api.client.json.jackson2.JacksonFactory; +import com.google.api.client.util.store.MemoryDataStoreFactory; +import com.google.api.services.sheets.v4.SheetsScopes; + +public class GoogleAuthorizeUtil { + public static Credential authorize() throws IOException, GeneralSecurityException { + InputStream in = GoogleAuthorizeUtil.class.getResourceAsStream("/google-sheets-client-secret.json"); + GoogleClientSecrets clientSecrets = GoogleClientSecrets + .load(JacksonFactory.getDefaultInstance(), new InputStreamReader(in)); + + List scopes = Arrays.asList(SheetsScopes.SPREADSHEETS); + + GoogleAuthorizationCodeFlow flow = new GoogleAuthorizationCodeFlow + .Builder(GoogleNetHttpTransport.newTrustedTransport(), + JacksonFactory.getDefaultInstance(), + clientSecrets, + scopes) + .setDataStoreFactory(new MemoryDataStoreFactory()) + .setAccessType("offline") + .build(); + Credential credential = new AuthorizationCodeInstalledApp(flow, new LocalServerReceiver()) + .authorize("user"); + + return credential; + } + +} diff --git a/libraries/src/main/java/com/baeldung/google/sheets/SheetsServiceUtil.java b/libraries/src/main/java/com/baeldung/google/sheets/SheetsServiceUtil.java new file mode 100644 index 0000000000..bbce96f389 --- /dev/null +++ b/libraries/src/main/java/com/baeldung/google/sheets/SheetsServiceUtil.java @@ -0,0 +1,23 @@ +package com.baeldung.google.sheets; + +import java.io.IOException; +import java.security.GeneralSecurityException; + +import com.google.api.client.auth.oauth2.Credential; +import com.google.api.client.googleapis.javanet.GoogleNetHttpTransport; +import com.google.api.client.json.jackson2.JacksonFactory; +import com.google.api.services.sheets.v4.Sheets; + +public class SheetsServiceUtil { + + private static final String APPLICATION_NAME = "Google Sheets Example"; + + public static Sheets getSheetsService() throws IOException, GeneralSecurityException { + Credential credential = GoogleAuthorizeUtil.authorize(); + return new Sheets.Builder(GoogleNetHttpTransport.newTrustedTransport(), + JacksonFactory.getDefaultInstance(), credential) + .setApplicationName(APPLICATION_NAME) + .build(); + } + +} diff --git a/libraries/src/main/resources/google-sheets-client-secret.json b/libraries/src/main/resources/google-sheets-client-secret.json new file mode 100644 index 0000000000..c92ccd6b9b --- /dev/null +++ b/libraries/src/main/resources/google-sheets-client-secret.json @@ -0,0 +1 @@ +{"installed":{"client_id":"394827218507-2ev02b2ha8plt7g2lh5nqse02ee737cf.apps.googleusercontent.com","project_id":"decisive-octane-187810","auth_uri":"https://accounts.google.com/o/oauth2/auth","token_uri":"https://accounts.google.com/o/oauth2/token","auth_provider_x509_cert_url":"https://www.googleapis.com/oauth2/v1/certs","client_secret":"2MnN1DfenoCGWMay3v8Bf7eI","redirect_uris":["urn:ietf:wg:oauth:2.0:oob","http://localhost"]}} \ No newline at end of file diff --git a/libraries/src/test/java/com/baeldung/google/sheets/GoogleSheetsIntegrationTest.java b/libraries/src/test/java/com/baeldung/google/sheets/GoogleSheetsIntegrationTest.java new file mode 100644 index 0000000000..5280073be2 --- /dev/null +++ b/libraries/src/test/java/com/baeldung/google/sheets/GoogleSheetsIntegrationTest.java @@ -0,0 +1,140 @@ +package com.baeldung.google.sheets; + +import java.io.IOException; +import java.security.GeneralSecurityException; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +import org.junit.BeforeClass; +import org.junit.Test; + +import com.google.api.services.sheets.v4.Sheets; +import com.google.api.services.sheets.v4.model.AppendValuesResponse; +import com.google.api.services.sheets.v4.model.BatchGetValuesResponse; +import com.google.api.services.sheets.v4.model.BatchUpdateSpreadsheetRequest; +import com.google.api.services.sheets.v4.model.BatchUpdateValuesRequest; +import com.google.api.services.sheets.v4.model.BatchUpdateValuesResponse; +import com.google.api.services.sheets.v4.model.CopyPasteRequest; +import com.google.api.services.sheets.v4.model.GridRange; +import com.google.api.services.sheets.v4.model.Request; +import com.google.api.services.sheets.v4.model.Spreadsheet; +import com.google.api.services.sheets.v4.model.SpreadsheetProperties; +import com.google.api.services.sheets.v4.model.UpdateSpreadsheetPropertiesRequest; +import com.google.api.services.sheets.v4.model.UpdateValuesResponse; +import com.google.api.services.sheets.v4.model.ValueRange; + +import static org.assertj.core.api.Assertions.*; + +public class GoogleSheetsIntegrationTest { + + private static Sheets sheetsService; + + // this id can be replaced with your spreadsheet id + // otherwise be advised that multiple people may run this test and update the public spreadsheet + private static final String SPREADSHEET_ID = "1sILuxZUnyl_7-MlNThjt765oWshN3Xs-PPLfqYe4DhI"; + + @BeforeClass + public static void setup() throws GeneralSecurityException, IOException { + sheetsService = SheetsServiceUtil.getSheetsService(); + } + + @Test + public void whenWriteSheet_thenReadSheetOk() throws IOException { + ValueRange body = new ValueRange() + .setValues(Arrays.asList( + Arrays.asList("Expenses January"), + Arrays.asList("books", "30"), + Arrays.asList("pens", "10"), + Arrays.asList("Expenses February"), + Arrays.asList("clothes", "20"), + Arrays.asList("shoes", "5"))); + UpdateValuesResponse result = sheetsService.spreadsheets().values() + .update(SPREADSHEET_ID, "A1", body) + .setValueInputOption("RAW") + .execute(); + + List data = new ArrayList<>(); + data.add(new ValueRange() + .setRange("D1") + .setValues(Arrays.asList( + Arrays.asList("January Total", "=B2+B3")))); + data.add(new ValueRange() + .setRange("D4") + .setValues(Arrays.asList( + Arrays.asList("February Total", "=B5+B6")))); + + BatchUpdateValuesRequest batchBody = new BatchUpdateValuesRequest() + .setValueInputOption("USER_ENTERED") + .setData(data); + BatchUpdateValuesResponse batchResult = + sheetsService.spreadsheets().values() + .batchUpdate(SPREADSHEET_ID, batchBody) + .execute(); + + List ranges = Arrays.asList("E1","E4"); + BatchGetValuesResponse readResult = + sheetsService.spreadsheets().values() + .batchGet(SPREADSHEET_ID) + .setRanges(ranges) + .execute(); + + ValueRange januaryTotal = readResult.getValueRanges().get(0); + assertThat(januaryTotal.getValues().get(0).get(0)).isEqualTo("40"); + + ValueRange febTotal = readResult.getValueRanges().get(1); + assertThat(febTotal.getValues().get(0).get(0)).isEqualTo("25"); + + ValueRange appendBody = new ValueRange() + .setValues(Arrays.asList( + Arrays.asList("Total", "=E1+E4"))); + AppendValuesResponse appendResult = + sheetsService.spreadsheets().values() + .append(SPREADSHEET_ID, "A1", appendBody) + .setValueInputOption("USER_ENTERED") + .setInsertDataOption("INSERT_ROWS") + .setIncludeValuesInResponse(true) + .execute(); + + ValueRange total = appendResult.getUpdates().getUpdatedData(); + assertThat(total.getValues().get(0).get(1)).isEqualTo("65"); + } + + + @Test + public void whenUpdateSpreadSheetTitle_thenOk() throws IOException { + + UpdateSpreadsheetPropertiesRequest updateRequest = new UpdateSpreadsheetPropertiesRequest() + .setFields("*") + .setProperties(new SpreadsheetProperties().setTitle("Expenses")); + + CopyPasteRequest copyRequest = new CopyPasteRequest() + .setSource(new GridRange().setSheetId(0) + .setStartColumnIndex(0).setEndColumnIndex(2) + .setStartRowIndex(0).setEndRowIndex(1)) + .setDestination(new GridRange().setSheetId(1) + .setStartColumnIndex(0).setEndColumnIndex(2) + .setStartRowIndex(0).setEndRowIndex(1)) + .setPasteType("PASTE_VALUES"); + + List requests = new ArrayList<>(); + + requests.add(new Request().setCopyPaste(copyRequest)); + requests.add(new Request().setUpdateSpreadsheetProperties(updateRequest)); + + BatchUpdateSpreadsheetRequest body = + new BatchUpdateSpreadsheetRequest().setRequests(requests); + + sheetsService.spreadsheets().batchUpdate(SPREADSHEET_ID, body).execute(); + } + + @Test + public void whenCreateSpreadSheet_thenIdOk() throws IOException { + Spreadsheet spreadSheet = new Spreadsheet() + .setProperties(new SpreadsheetProperties().setTitle("My Spreadsheet")); + Spreadsheet result = sheetsService.spreadsheets().create(spreadSheet).execute(); + + assertThat(result.getSpreadsheetId()).isNotNull(); + } + +} From 07efbf9c01baf275cc34a595af9ac9c9357c1757 Mon Sep 17 00:00:00 2001 From: Dominik Date: Wed, 13 Dec 2017 23:53:42 +0100 Subject: [PATCH 202/236] VarHandles --- .../java9/varhandles/VariableHandlesTest.java | 91 +++++++++++++++++++ 1 file changed, 91 insertions(+) create mode 100644 core-java-9/src/test/java/com/baeldung/java9/varhandles/VariableHandlesTest.java diff --git a/core-java-9/src/test/java/com/baeldung/java9/varhandles/VariableHandlesTest.java b/core-java-9/src/test/java/com/baeldung/java9/varhandles/VariableHandlesTest.java new file mode 100644 index 0000000000..210c4f0654 --- /dev/null +++ b/core-java-9/src/test/java/com/baeldung/java9/varhandles/VariableHandlesTest.java @@ -0,0 +1,91 @@ +package com.baeldung.java9.varhandles; + +import org.junit.Assert; +import org.junit.Test; + +import java.lang.invoke.MethodHandles; +import java.lang.invoke.VarHandle; + +public class VariableHandlesTest { + public int publicTestVariable = 1; + private int privateTestVariable = 1; + public int variableToSet = 1; + public int variableToCompareAndSet = 1; + public int variableToGetAndAdd = 0; + public byte variableToBitwiseOr = 0; + @Test + public void whenVariableHandleForPublicVariableIsCreated_ThenItIsInitializedProperly() + throws NoSuchFieldException, IllegalAccessException { + VarHandle publicIntHandle = MethodHandles.lookup() + .in(VariableHandlesTest.class) + .findVarHandle(VariableHandlesTest.class,"publicTestVariable", int.class); + Assert.assertEquals(1, publicIntHandle.coordinateTypes().size()); + Assert.assertEquals(VariableHandlesTest.class, publicIntHandle.coordinateTypes().get(0)); + + } + + @Test + public void whenVariableHandleForPrivateVariableIsCreated_ThenItIsInitializedProperly() + throws NoSuchFieldException, IllegalAccessException { + VarHandle privateIntHandle = MethodHandles.privateLookupIn(VariableHandlesTest.class, MethodHandles.lookup()) + .findVarHandle(VariableHandlesTest.class,"privateTestVariable", int.class); + Assert.assertNotNull(privateIntHandle); + Assert.assertEquals(1, privateIntHandle.coordinateTypes().size()); + Assert.assertEquals(VariableHandlesTest.class, privateIntHandle.coordinateTypes().get(0)); + + } + + @Test + public void whenVariableHandleForArrayVariableIsCreated_ThenItIsInitializedProperly() + throws NoSuchFieldException, IllegalAccessException { + VarHandle arrayVarHandle = MethodHandles.arrayElementVarHandle(int[].class); + Assert.assertEquals(2, arrayVarHandle.coordinateTypes().size()); + Assert.assertEquals(int[].class, arrayVarHandle.coordinateTypes().get(0)); + } + + @Test + public void givenVarHandle_whenGetIsInvoked_ThenValueOfVariableIsReturned() throws NoSuchFieldException, IllegalAccessException { + VarHandle publicIntHandle = MethodHandles.lookup() + .in(VariableHandlesTest.class) + .findVarHandle(VariableHandlesTest.class,"publicTestVariable", int.class); + Assert.assertEquals(1, publicIntHandle.get(this)); + } + + @Test + public void givenVarHandle_whenSetIsInvoked_ThenValueOfVariableIsChanged() throws NoSuchFieldException, IllegalAccessException { + VarHandle publicIntHandle = MethodHandles.lookup() + .in(VariableHandlesTest.class) + .findVarHandle(VariableHandlesTest.class,"variableToSet", int.class); + publicIntHandle.set(this, 15); + Assert.assertEquals(15, publicIntHandle.get(this)); + } + + @Test + public void givenVarHandle_whenCompareAndSetIsInvoked_ThenValueOfVariableIsChanged() throws NoSuchFieldException, IllegalAccessException { + VarHandle publicIntHandle = MethodHandles.lookup() + .in(VariableHandlesTest.class) + .findVarHandle(VariableHandlesTest.class,"variableToCompareAndSet", int.class); + publicIntHandle.compareAndSet(this, 1,100); + Assert.assertEquals(100, publicIntHandle.get(this)); + } + + @Test + public void givenVarHandle_whenGetAndAddIsInvoked_ThenValueOfVariableIsChanged() throws NoSuchFieldException, IllegalAccessException { + VarHandle publicIntHandle = MethodHandles.lookup() + .in(VariableHandlesTest.class) + .findVarHandle(VariableHandlesTest.class,"variableToGetAndAdd", int.class); + int before = (int) publicIntHandle.getAndAdd(this, 200); + Assert.assertEquals(0, before); + Assert.assertEquals(200, publicIntHandle.get(this)); + } + + @Test + public void givenVarHandle_whenGetAndBitwiseOrIsInvoked_ThenValueOfVariableIsChanged() throws NoSuchFieldException, IllegalAccessException { + VarHandle publicIntHandle = MethodHandles.lookup() + .in(VariableHandlesTest.class) + .findVarHandle(VariableHandlesTest.class,"variableToBitwiseOr", byte.class); + byte before = (byte) publicIntHandle.getAndBitwiseOr(this, (byte) 127); + Assert.assertEquals(0, before); + Assert.assertEquals(127, variableToBitwiseOr); + } +} From 0d07e421ff2564c63923c9be1b80519b618787bc Mon Sep 17 00:00:00 2001 From: shouvikbhattacharya Date: Thu, 14 Dec 2017 20:15:00 +0530 Subject: [PATCH 203/236] BAEL-1433: Commit changes for treeset article. --- .../baeldung/collection/WhenUsingTreeSet.java | 105 ++++++++++++++++++ 1 file changed, 105 insertions(+) create mode 100644 core-java/src/test/java/com/baeldung/collection/WhenUsingTreeSet.java diff --git a/core-java/src/test/java/com/baeldung/collection/WhenUsingTreeSet.java b/core-java/src/test/java/com/baeldung/collection/WhenUsingTreeSet.java new file mode 100644 index 0000000000..48aff4d437 --- /dev/null +++ b/core-java/src/test/java/com/baeldung/collection/WhenUsingTreeSet.java @@ -0,0 +1,105 @@ +package com.baeldung.collection; + +import java.util.ConcurrentModificationException; +import java.util.Iterator; +import java.util.Set; +import java.util.TreeSet; + +import org.junit.Assert; +import org.junit.Test; + +public class WhenUsingTreeSet { + + @Test + public void whenAddingElement_shouldAddElement() { + Set treeSet = new TreeSet<>(); + Assert.assertTrue(treeSet.add("String Added")); + } + + @Test + public void whenCheckingForElement_shouldSearchForElement() { + Set treeSetContains = new TreeSet<>(); + treeSetContains.add("String Added"); + Assert.assertTrue(treeSetContains.contains("String Added")); + } + + @Test + public void whenRemovingElement_shouldRemoveElement() { + Set removeFromTreeSet = new TreeSet<>(); + removeFromTreeSet.add("String Added"); + Assert.assertTrue(removeFromTreeSet.remove("String Added")); + } + + @Test + public void whenClearingTreeSet_shouldClearTreeSet() { + Set clearTreeSet = new TreeSet<>(); + clearTreeSet.add("String Added"); + clearTreeSet.clear(); + Assert.assertTrue(clearTreeSet.isEmpty()); + } + + @Test + public void whenCheckingTheSizeOfTreeSet_shouldReturnThesize() { + Set treeSetSize = new TreeSet<>(); + treeSetSize.add("String Added"); + Assert.assertEquals(1, treeSetSize.size()); + } + + @Test + public void whenCheckingForEmptyTreeSet_shouldCheckForEmpty() { + Set emptyTreeSet = new TreeSet<>(); + Assert.assertTrue(emptyTreeSet.isEmpty()); + } + + @Test + public void whenIteratingTreeSet_shouldIterateTreeSetInAscendingOrder() { + Set treeSet = new TreeSet<>(); + treeSet.add("First"); + treeSet.add("Second"); + treeSet.add("Third"); + Iterator itr = treeSet.iterator(); + while (itr.hasNext()) { + System.out.println(itr.next()); + } + } + + @Test + public void whenIteratingTreeSet_shouldIterateTreeSetInDescendingOrder() { + TreeSet treeSet = new TreeSet<>(); + treeSet.add("First"); + treeSet.add("Second"); + treeSet.add("Third"); + Iterator itr = treeSet.descendingIterator(); + while (itr.hasNext()) { + System.out.println(itr.next()); + } + } + + @Test(expected = ConcurrentModificationException.class) + public void whenModifyingTreeSetWhileIterating_shouldThrowException() { + Set treeSet = new TreeSet<>(); + treeSet.add("First"); + treeSet.add("Second"); + treeSet.add("Third"); + Iterator itr = treeSet.iterator(); + while (itr.hasNext()) { + itr.next(); + treeSet.remove("Second"); + } + } + + @Test + public void whenRemovingElementUsingIterator_shouldRemoveElement() { + Set treeSet = new TreeSet<>(); + treeSet.add("First"); + treeSet.add("Second"); + treeSet.add("Third"); + Iterator itr = treeSet.iterator(); + while (itr.hasNext()) { + String element = itr.next(); + if (element.equals("Second")) + itr.remove(); + } + Assert.assertEquals(2, treeSet.size()); + } +} From 778177333f5d319cac1fef3e78f72e43169b424b Mon Sep 17 00:00:00 2001 From: linhvovn Date: Thu, 14 Dec 2017 23:38:56 +0800 Subject: [PATCH 204/236] [tlinh2110@gmail.com] Add resource for Testing Method Security --- .../config/MethodSecurityConfig.java | 11 ++++ .../testmethodsecurity/entity/CustomUser.java | 39 +++++++++++++ .../repository/UserRoleRepository.java | 41 +++++++++++++ .../service/CustomUserDetailsService.java | 19 +++++++ .../service/SystemPropImpl.java | 26 +++++++++ .../service/SystemPropInterface.java | 11 ++++ .../service/UserRoleService.java | 29 ++++++++++ .../TestCustomSecurityContext.java | 41 +++++++++++++ .../TestMethodSecurity.java | 57 +++++++++++++++++++ .../testmethodsecurity/TestSystemProp.java | 54 ++++++++++++++++++ .../TestWithMockUserAtClassLevel.java | 34 +++++++++++ .../TestWithUserDetails.java | 35 ++++++++++++ .../WithMockJohnViewer.java | 10 ++++ .../testmethodsecurity/WithMockSysUser.java | 12 ++++ ...WithMockSysUserSecurityContextFactory.java | 28 +++++++++ 15 files changed, 447 insertions(+) create mode 100644 spring-security-core/src/main/java/org/baeldung/testmethodsecurity/config/MethodSecurityConfig.java create mode 100644 spring-security-core/src/main/java/org/baeldung/testmethodsecurity/entity/CustomUser.java create mode 100644 spring-security-core/src/main/java/org/baeldung/testmethodsecurity/repository/UserRoleRepository.java create mode 100644 spring-security-core/src/main/java/org/baeldung/testmethodsecurity/service/CustomUserDetailsService.java create mode 100644 spring-security-core/src/main/java/org/baeldung/testmethodsecurity/service/SystemPropImpl.java create mode 100644 spring-security-core/src/main/java/org/baeldung/testmethodsecurity/service/SystemPropInterface.java create mode 100644 spring-security-core/src/main/java/org/baeldung/testmethodsecurity/service/UserRoleService.java create mode 100644 spring-security-core/src/test/java/org/baeldung/testmethodsecurity/TestCustomSecurityContext.java create mode 100644 spring-security-core/src/test/java/org/baeldung/testmethodsecurity/TestMethodSecurity.java create mode 100644 spring-security-core/src/test/java/org/baeldung/testmethodsecurity/TestSystemProp.java create mode 100644 spring-security-core/src/test/java/org/baeldung/testmethodsecurity/TestWithMockUserAtClassLevel.java create mode 100644 spring-security-core/src/test/java/org/baeldung/testmethodsecurity/TestWithUserDetails.java create mode 100644 spring-security-core/src/test/java/org/baeldung/testmethodsecurity/WithMockJohnViewer.java create mode 100644 spring-security-core/src/test/java/org/baeldung/testmethodsecurity/WithMockSysUser.java create mode 100644 spring-security-core/src/test/java/org/baeldung/testmethodsecurity/WithMockSysUserSecurityContextFactory.java diff --git a/spring-security-core/src/main/java/org/baeldung/testmethodsecurity/config/MethodSecurityConfig.java b/spring-security-core/src/main/java/org/baeldung/testmethodsecurity/config/MethodSecurityConfig.java new file mode 100644 index 0000000000..1b2227f9be --- /dev/null +++ b/spring-security-core/src/main/java/org/baeldung/testmethodsecurity/config/MethodSecurityConfig.java @@ -0,0 +1,11 @@ +package org.baeldung.testmethodsecurity.config; + +import org.springframework.context.annotation.Configuration; +import org.springframework.security.config.annotation.method.configuration.EnableGlobalMethodSecurity; +import org.springframework.security.config.annotation.method.configuration.GlobalMethodSecurityConfiguration; + +@Configuration +@EnableGlobalMethodSecurity(prePostEnabled = true, securedEnabled = true) +public class MethodSecurityConfig extends GlobalMethodSecurityConfiguration { + +} diff --git a/spring-security-core/src/main/java/org/baeldung/testmethodsecurity/entity/CustomUser.java b/spring-security-core/src/main/java/org/baeldung/testmethodsecurity/entity/CustomUser.java new file mode 100644 index 0000000000..8c5a5b2fb2 --- /dev/null +++ b/spring-security-core/src/main/java/org/baeldung/testmethodsecurity/entity/CustomUser.java @@ -0,0 +1,39 @@ +package org.baeldung.testmethodsecurity.entity; + +import java.util.Collection; + +import org.springframework.security.core.GrantedAuthority; +import org.springframework.security.core.userdetails.User; + +@SuppressWarnings("serial") +public class CustomUser extends User{ + + private String nickName; + private int age; + + public CustomUser(String username, String password, Collection authorities) { + super(username, password, authorities); + } + + public CustomUser(String username, String password, Collection authorities,String nickName) { + super(username, password, authorities); + this.nickName = nickName; + } + + public String getNickName() { + return nickName; + } + + public void setNickName(String nickName) { + this.nickName = nickName; + } + + public int getAge() { + return age; + } + + public void setAge(int age) { + this.age = age; + } + +} diff --git a/spring-security-core/src/main/java/org/baeldung/testmethodsecurity/repository/UserRoleRepository.java b/spring-security-core/src/main/java/org/baeldung/testmethodsecurity/repository/UserRoleRepository.java new file mode 100644 index 0000000000..565b46262d --- /dev/null +++ b/spring-security-core/src/main/java/org/baeldung/testmethodsecurity/repository/UserRoleRepository.java @@ -0,0 +1,41 @@ +package org.baeldung.testmethodsecurity.repository; + +import java.util.ArrayList; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; + +import org.baeldung.testmethodsecurity.entity.CustomUser; +import org.springframework.security.core.GrantedAuthority; +import org.springframework.security.core.authority.SimpleGrantedAuthority; +import org.springframework.security.core.userdetails.UsernameNotFoundException; +import org.springframework.stereotype.Service; + +@Service +public class UserRoleRepository { + + static Map DB_BASED_USER_MAPPING; + + static{ + DB_BASED_USER_MAPPING = new LinkedHashMap<>(); + DB_BASED_USER_MAPPING.put("jane", new CustomUser("jane","1234", getGrantedAuthorities("ROLE_USER","ROLE_VIEWER"),"jane")); + DB_BASED_USER_MAPPING.put("john", new CustomUser("john","1234", getGrantedAuthorities("ROLE_EDITOR","ROLE_ADMIN"),"jane")); + DB_BASED_USER_MAPPING.put("jack", new CustomUser("jack","1234", getGrantedAuthorities("ROLE_USER","ROLE_REVIEWER"),"jane")); + } + + private static List getGrantedAuthorities(String...roles){ + ArrayList authorities = new ArrayList<>(); + for (String role : roles){ + authorities.add(new SimpleGrantedAuthority(role)); + } + return authorities; + } + + public CustomUser loadUserByUserName(String username){ + if (DB_BASED_USER_MAPPING.containsKey(username)){ + return DB_BASED_USER_MAPPING.get(username); + } + throw new UsernameNotFoundException("User "+username+" cannot be found"); + } + +} diff --git a/spring-security-core/src/main/java/org/baeldung/testmethodsecurity/service/CustomUserDetailsService.java b/spring-security-core/src/main/java/org/baeldung/testmethodsecurity/service/CustomUserDetailsService.java new file mode 100644 index 0000000000..a5adcd3408 --- /dev/null +++ b/spring-security-core/src/main/java/org/baeldung/testmethodsecurity/service/CustomUserDetailsService.java @@ -0,0 +1,19 @@ +package org.baeldung.testmethodsecurity.service; + +import org.baeldung.testmethodsecurity.repository.UserRoleRepository; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.core.userdetails.UserDetails; +import org.springframework.security.core.userdetails.UserDetailsService; +import org.springframework.stereotype.Service; + +@Service("userDetailService") +public class CustomUserDetailsService implements UserDetailsService { + + @Autowired + UserRoleRepository userRoleRepo; + + @Override + public UserDetails loadUserByUsername(String username) { + return userRoleRepo.loadUserByUserName(username); + } +} \ No newline at end of file diff --git a/spring-security-core/src/main/java/org/baeldung/testmethodsecurity/service/SystemPropImpl.java b/spring-security-core/src/main/java/org/baeldung/testmethodsecurity/service/SystemPropImpl.java new file mode 100644 index 0000000000..7307fb63fe --- /dev/null +++ b/spring-security-core/src/main/java/org/baeldung/testmethodsecurity/service/SystemPropImpl.java @@ -0,0 +1,26 @@ +package org.baeldung.testmethodsecurity.service; + +import org.springframework.security.access.annotation.Secured; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.stereotype.Service; + +@Service +public class SystemPropImpl implements SystemPropInterface{ + + @PreAuthorize("permitAll") + @Override + public String getSystemName() { + return "Method Security"; + } + + @Override + public String sayHello(){ + return sayHi(); + } + + @Secured("ROLE_USER") + public String sayHi(){ + return "Hi"; + } + +} diff --git a/spring-security-core/src/main/java/org/baeldung/testmethodsecurity/service/SystemPropInterface.java b/spring-security-core/src/main/java/org/baeldung/testmethodsecurity/service/SystemPropInterface.java new file mode 100644 index 0000000000..b61d42083d --- /dev/null +++ b/spring-security-core/src/main/java/org/baeldung/testmethodsecurity/service/SystemPropInterface.java @@ -0,0 +1,11 @@ +package org.baeldung.testmethodsecurity.service; + +public interface SystemPropInterface { + + String getSystemName(); + + String sayHello(); + + String sayHi(); + +} diff --git a/spring-security-core/src/main/java/org/baeldung/testmethodsecurity/service/UserRoleService.java b/spring-security-core/src/main/java/org/baeldung/testmethodsecurity/service/UserRoleService.java new file mode 100644 index 0000000000..46cab5918a --- /dev/null +++ b/spring-security-core/src/main/java/org/baeldung/testmethodsecurity/service/UserRoleService.java @@ -0,0 +1,29 @@ +package org.baeldung.testmethodsecurity.service; + +import org.baeldung.testmethodsecurity.entity.CustomUser; +import org.baeldung.testmethodsecurity.repository.UserRoleRepository; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.access.prepost.PostAuthorize; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.security.core.context.SecurityContext; +import org.springframework.security.core.context.SecurityContextHolder; +import org.springframework.stereotype.Service; + +@Service +public class UserRoleService { + + @Autowired + UserRoleRepository userRoleRepository; + + @PreAuthorize("hasRole('ROLE_VIEWER') or hasAuthority('SYS_ADMIN')") + public String getUserName(){ + SecurityContext securityContext = SecurityContextHolder.getContext(); + return securityContext.getAuthentication().getName(); + } + + @PostAuthorize("returnObject.username == authentication.principal.nickName") + public CustomUser loadUserDetail(String username){ + return userRoleRepository.loadUserByUserName(username); + } + +} diff --git a/spring-security-core/src/test/java/org/baeldung/testmethodsecurity/TestCustomSecurityContext.java b/spring-security-core/src/test/java/org/baeldung/testmethodsecurity/TestCustomSecurityContext.java new file mode 100644 index 0000000000..f231437e40 --- /dev/null +++ b/spring-security-core/src/test/java/org/baeldung/testmethodsecurity/TestCustomSecurityContext.java @@ -0,0 +1,41 @@ +package org.baeldung.testmethodsecurity; + +import static org.junit.Assert.assertEquals; + +import org.baeldung.testmethodsecurity.service.UserRoleService; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.ComponentScan; +import org.springframework.context.annotation.Configuration; +import org.springframework.security.access.AccessDeniedException; +import org.springframework.test.context.ContextConfiguration; +import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; + +@RunWith(SpringJUnit4ClassRunner.class) +@ContextConfiguration +public class TestCustomSecurityContext { + + @Autowired + UserRoleService userRoleService; + + @Configuration + @ComponentScan("org.baeldung.testmethodsecurity.*") + public static class SpringConfig { + + } + + @Test + @WithMockSysUser(systemUserName="jane") + public void whenJane_callGetUserName_thenOK(){ + String userName = userRoleService.getUserName(); + assertEquals("jane",userName); + } + + @Test(expected=AccessDeniedException.class) + @WithMockSysUser(systemUserName="john") + public void whenJohn_callGetUserName_thenFail(){ + userRoleService.getUserName(); + } + +} diff --git a/spring-security-core/src/test/java/org/baeldung/testmethodsecurity/TestMethodSecurity.java b/spring-security-core/src/test/java/org/baeldung/testmethodsecurity/TestMethodSecurity.java new file mode 100644 index 0000000000..8b7b095187 --- /dev/null +++ b/spring-security-core/src/test/java/org/baeldung/testmethodsecurity/TestMethodSecurity.java @@ -0,0 +1,57 @@ +package org.baeldung.testmethodsecurity; + +import static org.junit.Assert.assertEquals; + +import org.baeldung.testmethodsecurity.service.UserRoleService; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.ComponentScan; +import org.springframework.context.annotation.Configuration; +import org.springframework.security.access.AccessDeniedException; +import org.springframework.security.test.context.support.WithAnonymousUser; +import org.springframework.security.test.context.support.WithMockUser; +import org.springframework.test.context.ContextConfiguration; +import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; + +@RunWith(SpringJUnit4ClassRunner.class) +@ContextConfiguration +public class TestMethodSecurity{ + + @Autowired + UserRoleService userRoleService; + + @Configuration + @ComponentScan("org.baeldung.testmethodsecurity.*") + public static class SpringConfig { + + } + + @Test + @WithMockUser(username="john",roles={"VIEWER"}) + public void whenRoleViewer_callGetUserName_thenOK(){ + String userName = userRoleService.getUserName(); + assertEquals("john", userName); + } + + @Test + @WithMockUser(username="john",authorities={"SYS_ADMIN"}) + public void whenSysAdmin_callGetUserName_thenOK(){ + String userName = userRoleService.getUserName(); + assertEquals("john", userName); + } + + @Test(expected=AccessDeniedException.class) + @WithAnonymousUser + public void whenAnomynous_callGetUserName_thenFail(){ + userRoleService.getUserName(); + } + + @Test + @WithMockJohnViewer + public void whenJohnViewer_callGetUserName_thenOK(){ + String userName = userRoleService.getUserName(); + assertEquals("john", userName); + } + +} \ No newline at end of file diff --git a/spring-security-core/src/test/java/org/baeldung/testmethodsecurity/TestSystemProp.java b/spring-security-core/src/test/java/org/baeldung/testmethodsecurity/TestSystemProp.java new file mode 100644 index 0000000000..1a36cf7ae1 --- /dev/null +++ b/spring-security-core/src/test/java/org/baeldung/testmethodsecurity/TestSystemProp.java @@ -0,0 +1,54 @@ +package org.baeldung.testmethodsecurity; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertTrue; + +import java.lang.reflect.Proxy; + +import org.baeldung.testmethodsecurity.service.SystemPropImpl; +import org.baeldung.testmethodsecurity.service.SystemPropInterface; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.ComponentScan; +import org.springframework.context.annotation.Configuration; +import org.springframework.security.authentication.AuthenticationCredentialsNotFoundException; +import org.springframework.security.test.context.support.WithMockUser; +import org.springframework.test.context.ContextConfiguration; +import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; + +@RunWith(SpringJUnit4ClassRunner.class) +@ContextConfiguration +public class TestSystemProp{ + + @Autowired + SystemPropInterface systemProp; + + @Test + @WithMockUser(username="test") + public void checkSystemPropInstance(){ + assertFalse(systemProp instanceof SystemPropImpl); + assertTrue(systemProp instanceof SystemPropInterface); + assertTrue(systemProp instanceof Proxy); + + assertEquals("Method Security", systemProp.getSystemName()); + } + + @Test + public void whenNotAuthentication_callSayHello_thenOK(){ + String hello = systemProp.sayHello(); + assertEquals("Hi", hello); + } + + @Test(expected=AuthenticationCredentialsNotFoundException.class) + public void whenNotAuthentication_callSayHi_thenFailed(){ + systemProp.sayHi(); + } + + @Configuration + @ComponentScan("org.baeldung.testmethodsecurity.*") + public static class SpringConfig { + + } +} diff --git a/spring-security-core/src/test/java/org/baeldung/testmethodsecurity/TestWithMockUserAtClassLevel.java b/spring-security-core/src/test/java/org/baeldung/testmethodsecurity/TestWithMockUserAtClassLevel.java new file mode 100644 index 0000000000..aaa1b84294 --- /dev/null +++ b/spring-security-core/src/test/java/org/baeldung/testmethodsecurity/TestWithMockUserAtClassLevel.java @@ -0,0 +1,34 @@ +package org.baeldung.testmethodsecurity; + +import static org.junit.Assert.assertEquals; + +import org.baeldung.testmethodsecurity.service.UserRoleService; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.ComponentScan; +import org.springframework.context.annotation.Configuration; +import org.springframework.security.test.context.support.WithMockUser; +import org.springframework.test.context.ContextConfiguration; +import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; + +@RunWith(SpringJUnit4ClassRunner.class) +@ContextConfiguration +@WithMockUser(username="john",roles={"VIEWER"}) +public class TestWithMockUserAtClassLevel { + + @Test + public void whenRoleViewerLogged_callGetUserName_thenOK(){ + String currentUserName = userService.getUserName(); + assertEquals("john",currentUserName); + } + + @Autowired + UserRoleService userService; + + @Configuration + @ComponentScan("org.baeldung.testmethodsecurity.*") + public static class SpringConfig { + + } +} diff --git a/spring-security-core/src/test/java/org/baeldung/testmethodsecurity/TestWithUserDetails.java b/spring-security-core/src/test/java/org/baeldung/testmethodsecurity/TestWithUserDetails.java new file mode 100644 index 0000000000..751062e223 --- /dev/null +++ b/spring-security-core/src/test/java/org/baeldung/testmethodsecurity/TestWithUserDetails.java @@ -0,0 +1,35 @@ +package org.baeldung.testmethodsecurity; + +import static org.junit.Assert.assertEquals; + +import org.baeldung.testmethodsecurity.entity.CustomUser; +import org.baeldung.testmethodsecurity.service.UserRoleService; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.ComponentScan; +import org.springframework.context.annotation.Configuration; +import org.springframework.security.test.context.support.WithUserDetails; +import org.springframework.test.context.ContextConfiguration; +import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; + +@RunWith(SpringJUnit4ClassRunner.class) +@ContextConfiguration +public class TestWithUserDetails { + + @Autowired + UserRoleService userService; + + @Configuration + @ComponentScan("org.baeldung.testmethodsecurity.*") + public static class SpringConfig { + + } + + @Test + @WithUserDetails(value="john",userDetailsServiceBeanName="userDetailService") + public void whenJohn_callLoadUserDetail_thenOK(){ + CustomUser user = userService.loadUserDetail("jane"); + assertEquals("jane",user.getNickName()); + } +} diff --git a/spring-security-core/src/test/java/org/baeldung/testmethodsecurity/WithMockJohnViewer.java b/spring-security-core/src/test/java/org/baeldung/testmethodsecurity/WithMockJohnViewer.java new file mode 100644 index 0000000000..994fe2e69b --- /dev/null +++ b/spring-security-core/src/test/java/org/baeldung/testmethodsecurity/WithMockJohnViewer.java @@ -0,0 +1,10 @@ +package org.baeldung.testmethodsecurity; + +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; + +import org.springframework.security.test.context.support.WithMockUser; + +@Retention(RetentionPolicy.RUNTIME) +@WithMockUser(value="john",roles="VIEWER") +public @interface WithMockJohnViewer { } \ No newline at end of file diff --git a/spring-security-core/src/test/java/org/baeldung/testmethodsecurity/WithMockSysUser.java b/spring-security-core/src/test/java/org/baeldung/testmethodsecurity/WithMockSysUser.java new file mode 100644 index 0000000000..34e6c78a9d --- /dev/null +++ b/spring-security-core/src/test/java/org/baeldung/testmethodsecurity/WithMockSysUser.java @@ -0,0 +1,12 @@ +package org.baeldung.testmethodsecurity; + +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; + +import org.springframework.security.test.context.support.WithSecurityContext; + +@Retention(RetentionPolicy.RUNTIME) +@WithSecurityContext(factory = WithMockSysUserSecurityContextFactory.class) +public @interface WithMockSysUser { + String systemUserName(); +} \ No newline at end of file diff --git a/spring-security-core/src/test/java/org/baeldung/testmethodsecurity/WithMockSysUserSecurityContextFactory.java b/spring-security-core/src/test/java/org/baeldung/testmethodsecurity/WithMockSysUserSecurityContextFactory.java new file mode 100644 index 0000000000..820f6f2d07 --- /dev/null +++ b/spring-security-core/src/test/java/org/baeldung/testmethodsecurity/WithMockSysUserSecurityContextFactory.java @@ -0,0 +1,28 @@ +package org.baeldung.testmethodsecurity; + +import org.baeldung.testmethodsecurity.entity.CustomUser; +import org.baeldung.testmethodsecurity.repository.UserRoleRepository; +import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; +import org.springframework.security.core.Authentication; +import org.springframework.security.core.context.SecurityContext; +import org.springframework.security.core.context.SecurityContextHolder; +import org.springframework.security.test.context.support.WithSecurityContextFactory; + +public class WithMockSysUserSecurityContextFactory + implements WithSecurityContextFactory { + + @Override + public SecurityContext createSecurityContext(WithMockSysUser customUser) { + SecurityContext context = SecurityContextHolder.createEmptyContext(); + UserRoleRepository userRoleRepo = new UserRoleRepository(); + + CustomUser user = userRoleRepo.loadUserByUserName(customUser.systemUserName()); + + Authentication auth = + new UsernamePasswordAuthenticationToken(user, user.getPassword(), user.getAuthorities()); + + context.setAuthentication(auth); + return context; + } + +} \ No newline at end of file From 04df1cfef043caec5f64a9aa4ed5e7737da74fae Mon Sep 17 00:00:00 2001 From: Grzegorz Piwowarek Date: Thu, 14 Dec 2017 17:06:17 +0100 Subject: [PATCH 205/236] Remove spring-flyway (#3240) * Remove spring-flyway * Remove spring-flyway --- ... WaitingForThreadsToFinishManualTest.java} | 66 +------------------ flyway/pom.xml | 52 --------------- flyway/spring-flyway/.gitignore | 24 ------- flyway/spring-flyway/pom.xml | 57 ---------------- .../springflyway/SpringFlywayApplication.java | 12 ---- .../springflyway/entities/Customer.java | 28 -------- .../migration/V2__uk_lastname_customer.java | 14 ---- .../repositories/CustomerRepository.java | 11 ---- ...sitoryInitialMigrationIntegrationTest.java | 28 -------- ...erRepositoryInsertDataIntegrationTest.java | 35 ---------- ...ullConstraintMigrationIntegrationTest.java | 25 ------- ...onstraintJavaMigrationIntegrationTest.java | 29 -------- ...queConstraintMigrationIntegrationTest.java | 27 -------- .../src/test/resources/application.properties | 1 - .../migration/V1_0__create_table_customer.sql | 6 -- .../db/migration/V1_1__insert_customer.sql | 6 -- .../migration/V1_2__make_email_not_null.sql | 1 - .../db/migration/V1_3__make_email_unique.sql | 1 - pom.xml | 1 - 19 files changed, 2 insertions(+), 422 deletions(-) rename core-java-concurrency/src/test/java/com/baeldung/concurrent/executorservice/{WaitingForThreadsToFinishTest.java => WaitingForThreadsToFinishManualTest.java} (72%) delete mode 100644 flyway/pom.xml delete mode 100644 flyway/spring-flyway/.gitignore delete mode 100644 flyway/spring-flyway/pom.xml delete mode 100644 flyway/spring-flyway/src/main/java/com/baeldung/springflyway/SpringFlywayApplication.java delete mode 100644 flyway/spring-flyway/src/main/java/com/baeldung/springflyway/entities/Customer.java delete mode 100644 flyway/spring-flyway/src/main/java/com/baeldung/springflyway/migration/V2__uk_lastname_customer.java delete mode 100644 flyway/spring-flyway/src/main/java/com/baeldung/springflyway/repositories/CustomerRepository.java delete mode 100644 flyway/spring-flyway/src/test/java/com/baeldung/springflyway/CustomerRepositoryInitialMigrationIntegrationTest.java delete mode 100644 flyway/spring-flyway/src/test/java/com/baeldung/springflyway/CustomerRepositoryInsertDataIntegrationTest.java delete mode 100644 flyway/spring-flyway/src/test/java/com/baeldung/springflyway/CustomerRepositoryNotNullConstraintMigrationIntegrationTest.java delete mode 100644 flyway/spring-flyway/src/test/java/com/baeldung/springflyway/CustomerRepositoryUniqueConstraintJavaMigrationIntegrationTest.java delete mode 100644 flyway/spring-flyway/src/test/java/com/baeldung/springflyway/CustomerRepositoryUniqueConstraintMigrationIntegrationTest.java delete mode 100644 flyway/spring-flyway/src/test/resources/application.properties delete mode 100644 flyway/spring-flyway/src/test/resources/db/migration/V1_0__create_table_customer.sql delete mode 100644 flyway/spring-flyway/src/test/resources/db/migration/V1_1__insert_customer.sql delete mode 100644 flyway/spring-flyway/src/test/resources/db/migration/V1_2__make_email_not_null.sql delete mode 100644 flyway/spring-flyway/src/test/resources/db/migration/V1_3__make_email_unique.sql diff --git a/core-java-concurrency/src/test/java/com/baeldung/concurrent/executorservice/WaitingForThreadsToFinishTest.java b/core-java-concurrency/src/test/java/com/baeldung/concurrent/executorservice/WaitingForThreadsToFinishManualTest.java similarity index 72% rename from core-java-concurrency/src/test/java/com/baeldung/concurrent/executorservice/WaitingForThreadsToFinishTest.java rename to core-java-concurrency/src/test/java/com/baeldung/concurrent/executorservice/WaitingForThreadsToFinishManualTest.java index 7e2bf590fd..cd8b015be2 100644 --- a/core-java-concurrency/src/test/java/com/baeldung/concurrent/executorservice/WaitingForThreadsToFinishTest.java +++ b/core-java-concurrency/src/test/java/com/baeldung/concurrent/executorservice/WaitingForThreadsToFinishManualTest.java @@ -10,9 +10,9 @@ import java.util.concurrent.*; import static junit.framework.TestCase.assertTrue; -public class WaitingForThreadsToFinishTest { +public class WaitingForThreadsToFinishManualTest { - private static final Logger LOG = LoggerFactory.getLogger(WaitingForThreadsToFinishTest.class); + private static final Logger LOG = LoggerFactory.getLogger(WaitingForThreadsToFinishManualTest.class); private final static ExecutorService WORKER_THREAD_POOL = Executors.newFixedThreadPool(10); public void awaitTerminationAfterShutdown(ExecutorService threadPool) { @@ -142,66 +142,4 @@ public class WaitingForThreadsToFinishTest { awaitTerminationAfterShutdown(WORKER_THREAD_POOL); } } - - @Test - public void givenMultipleThreads_whenUsingCompletableFutures_thenMainThreadShouldWaitForAllToFinish() { - - CompletableFuture future1 = CompletableFuture.supplyAsync(() -> { - - try { - Thread.sleep(1000); - } catch (InterruptedException e) { - e.printStackTrace(); - } - - return "Hello"; - }); - - CompletableFuture future2 = CompletableFuture.supplyAsync(() -> { - - try { - Thread.sleep(5000); - } catch (InterruptedException e) { - e.printStackTrace(); - } - - return "Beautiful"; - }); - - CompletableFuture future3 = CompletableFuture.supplyAsync(() -> { - - try { - Thread.sleep(3000); - } catch (InterruptedException e) { - e.printStackTrace(); - } - - return "World"; - }); - - long startProcessingTime = System.currentTimeMillis(); - CompletableFuture combinedFuture = CompletableFuture.allOf(future1, future2, future3); - combinedFuture.join(); - - long totalProcessingTime = System.currentTimeMillis() - startProcessingTime; - assertTrue(totalProcessingTime >= 5000 && totalProcessingTime < 6000); - - LOG.debug("Responses from all threads are available after " + totalProcessingTime + " milliseconds"); - - try { - String thread1Response = future1.get(); - assertTrue(thread1Response.equals("Hello")); - - String thread2Response = future2.get(); - assertTrue(thread2Response.equals("Beautiful")); - - String thread3Response = future3.get(); - assertTrue(thread3Response.equals("World")); - - } catch (InterruptedException | ExecutionException e) { - e.printStackTrace(); - } - - awaitTerminationAfterShutdown(WORKER_THREAD_POOL); - } } diff --git a/flyway/pom.xml b/flyway/pom.xml deleted file mode 100644 index 5cb8fabe67..0000000000 --- a/flyway/pom.xml +++ /dev/null @@ -1,52 +0,0 @@ - - 4.0.0 - flyway - 1.0 - flyway - pom - A sample project to demonstrate Flyway migrations - - - com.baeldung - parent-modules - 1.0.0-SNAPSHOT - - - - spring-flyway - - - - - mysql - mysql-connector-java - ${mysql.version} - - - - - - org.springframework.boot - spring-boot-dependencies - ${spring.boot.version} - pom - import - - - - - - - org.flywaydb - flyway-maven-plugin - ${flyway-maven-plugin.version} - - - - - 6.0.5 - 4.0.3 - 1.5.8.RELEASE - - \ No newline at end of file diff --git a/flyway/spring-flyway/.gitignore b/flyway/spring-flyway/.gitignore deleted file mode 100644 index 2af7cefb0a..0000000000 --- a/flyway/spring-flyway/.gitignore +++ /dev/null @@ -1,24 +0,0 @@ -target/ -!.mvn/wrapper/maven-wrapper.jar - -### STS ### -.apt_generated -.classpath -.factorypath -.project -.settings -.springBeans - -### IntelliJ IDEA ### -.idea -*.iws -*.iml -*.ipr - -### NetBeans ### -nbproject/private/ -build/ -nbbuild/ -dist/ -nbdist/ -.nb-gradle/ \ No newline at end of file diff --git a/flyway/spring-flyway/pom.xml b/flyway/spring-flyway/pom.xml deleted file mode 100644 index cf5703cfab..0000000000 --- a/flyway/spring-flyway/pom.xml +++ /dev/null @@ -1,57 +0,0 @@ - - - 4.0.0 - - spring-flyway - 0.0.1-SNAPSHOT - jar - - spring-flyway - Spring Boot Test Flyway Migrations - - - flyway - com.baeldung - 1.0 - ../../flyway - - - - UTF-8 - UTF-8 - 1.8 - - - - - org.springframework.boot - spring-boot-starter-data-jpa - - - org.flywaydb - flyway-core - - - org.projectlombok - lombok - - - com.h2database - h2 - - - org.springframework.boot - spring-boot-starter-test - test - - - - - - org.springframework.boot - spring-boot-maven-plugin - - - - diff --git a/flyway/spring-flyway/src/main/java/com/baeldung/springflyway/SpringFlywayApplication.java b/flyway/spring-flyway/src/main/java/com/baeldung/springflyway/SpringFlywayApplication.java deleted file mode 100644 index 9218fbc88d..0000000000 --- a/flyway/spring-flyway/src/main/java/com/baeldung/springflyway/SpringFlywayApplication.java +++ /dev/null @@ -1,12 +0,0 @@ -package com.baeldung.springflyway; - -import org.springframework.boot.SpringApplication; -import org.springframework.boot.autoconfigure.SpringBootApplication; - -@SpringBootApplication -public class SpringFlywayApplication { - - public static void main(String[] args) { - SpringApplication.run(SpringFlywayApplication.class, args); - } -} diff --git a/flyway/spring-flyway/src/main/java/com/baeldung/springflyway/entities/Customer.java b/flyway/spring-flyway/src/main/java/com/baeldung/springflyway/entities/Customer.java deleted file mode 100644 index 194b961d2d..0000000000 --- a/flyway/spring-flyway/src/main/java/com/baeldung/springflyway/entities/Customer.java +++ /dev/null @@ -1,28 +0,0 @@ -package com.baeldung.springflyway.entities; - -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; -import lombok.NoArgsConstructor; - -import javax.persistence.Entity; -import javax.persistence.GeneratedValue; -import javax.persistence.Id; - -@Entity -@Data -@AllArgsConstructor -@NoArgsConstructor -@Builder -public class Customer { - - @Id - @GeneratedValue - private Long id; - - private String firstName; - private String lastName; - - private String email; - -} diff --git a/flyway/spring-flyway/src/main/java/com/baeldung/springflyway/migration/V2__uk_lastname_customer.java b/flyway/spring-flyway/src/main/java/com/baeldung/springflyway/migration/V2__uk_lastname_customer.java deleted file mode 100644 index 52b851546b..0000000000 --- a/flyway/spring-flyway/src/main/java/com/baeldung/springflyway/migration/V2__uk_lastname_customer.java +++ /dev/null @@ -1,14 +0,0 @@ -package com.baeldung.springflyway.migration; - -import org.flywaydb.core.api.migration.spring.SpringJdbcMigration; -import org.springframework.jdbc.core.JdbcTemplate; - -public class V2__uk_lastname_customer implements SpringJdbcMigration { - - final String CUSTOMER_LASTNAME_UK = "ALTER TABLE customer ADD CONSTRAINT uk_customer_lastname UNIQUE(last_name);"; - - @Override - public void migrate(final JdbcTemplate jdbcTemplate) throws Exception { - jdbcTemplate.execute(CUSTOMER_LASTNAME_UK); - } -} diff --git a/flyway/spring-flyway/src/main/java/com/baeldung/springflyway/repositories/CustomerRepository.java b/flyway/spring-flyway/src/main/java/com/baeldung/springflyway/repositories/CustomerRepository.java deleted file mode 100644 index 0a1fb5a146..0000000000 --- a/flyway/spring-flyway/src/main/java/com/baeldung/springflyway/repositories/CustomerRepository.java +++ /dev/null @@ -1,11 +0,0 @@ -package com.baeldung.springflyway.repositories; - -import com.baeldung.springflyway.entities.Customer; -import org.springframework.data.jpa.repository.JpaRepository; - -import java.util.Optional; - -public interface CustomerRepository extends JpaRepository { - - Optional findByEmail(String email); -} diff --git a/flyway/spring-flyway/src/test/java/com/baeldung/springflyway/CustomerRepositoryInitialMigrationIntegrationTest.java b/flyway/spring-flyway/src/test/java/com/baeldung/springflyway/CustomerRepositoryInitialMigrationIntegrationTest.java deleted file mode 100644 index 59ef5820d7..0000000000 --- a/flyway/spring-flyway/src/test/java/com/baeldung/springflyway/CustomerRepositoryInitialMigrationIntegrationTest.java +++ /dev/null @@ -1,28 +0,0 @@ -package com.baeldung.springflyway; - -import com.baeldung.springflyway.entities.Customer; -import com.baeldung.springflyway.repositories.CustomerRepository; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.test.context.junit4.SpringRunner; - -import static org.junit.Assert.assertNotNull; - -@RunWith(SpringRunner.class) -@SpringBootTest -public class CustomerRepositoryInitialMigrationIntegrationTest { - - @Autowired CustomerRepository customerRepository; - - @Test - public void givenSchemaCreationMigration_whenTryingToCreateACustomer_thenSuccess() { - Customer customer = customerRepository.save(Customer - .builder() - .email("customer@email.com") - .build()); - assertNotNull(customer.getId()); - } - -} diff --git a/flyway/spring-flyway/src/test/java/com/baeldung/springflyway/CustomerRepositoryInsertDataIntegrationTest.java b/flyway/spring-flyway/src/test/java/com/baeldung/springflyway/CustomerRepositoryInsertDataIntegrationTest.java deleted file mode 100644 index 3feedf2fd9..0000000000 --- a/flyway/spring-flyway/src/test/java/com/baeldung/springflyway/CustomerRepositoryInsertDataIntegrationTest.java +++ /dev/null @@ -1,35 +0,0 @@ -package com.baeldung.springflyway; - -import com.baeldung.springflyway.entities.Customer; -import com.baeldung.springflyway.repositories.CustomerRepository; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.test.context.junit4.SpringRunner; - -import java.util.List; -import java.util.Optional; - -import static org.junit.Assert.*; - -@RunWith(SpringRunner.class) -@SpringBootTest -public class CustomerRepositoryInsertDataIntegrationTest { - - @Autowired CustomerRepository customerRepository; - - @Test - public void givenASetInsertData_whenRunningMigrationsWithSuccess_thenASpecificCustomerIsFound() { - Optional customerOptional = customerRepository.findByEmail("email@email.com"); - assertTrue(customerOptional.isPresent()); - } - - @Test - public void givenASetInsertData_whenRunningMigrationsWithSuccess_thenASetOfCustomersIsFound() { - List customers = customerRepository.findAll(); - assertNotNull(customers); - assertEquals(customers.size(), 6); - } - -} diff --git a/flyway/spring-flyway/src/test/java/com/baeldung/springflyway/CustomerRepositoryNotNullConstraintMigrationIntegrationTest.java b/flyway/spring-flyway/src/test/java/com/baeldung/springflyway/CustomerRepositoryNotNullConstraintMigrationIntegrationTest.java deleted file mode 100644 index 9ec5d4d77e..0000000000 --- a/flyway/spring-flyway/src/test/java/com/baeldung/springflyway/CustomerRepositoryNotNullConstraintMigrationIntegrationTest.java +++ /dev/null @@ -1,25 +0,0 @@ -package com.baeldung.springflyway; - -import com.baeldung.springflyway.entities.Customer; -import com.baeldung.springflyway.repositories.CustomerRepository; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.dao.DataIntegrityViolationException; -import org.springframework.test.context.junit4.SpringRunner; - -@RunWith(SpringRunner.class) -@SpringBootTest -public class CustomerRepositoryNotNullConstraintMigrationIntegrationTest { - - @Autowired CustomerRepository customerRepository; - - @Test(expected = DataIntegrityViolationException.class) - public void givenTheNotNullConstraintMigrations_whenInsertingACustomerWithNullEmail_thenThrowException() { - customerRepository.save(Customer - .builder() - .build()); - } - -} diff --git a/flyway/spring-flyway/src/test/java/com/baeldung/springflyway/CustomerRepositoryUniqueConstraintJavaMigrationIntegrationTest.java b/flyway/spring-flyway/src/test/java/com/baeldung/springflyway/CustomerRepositoryUniqueConstraintJavaMigrationIntegrationTest.java deleted file mode 100644 index f615f477bc..0000000000 --- a/flyway/spring-flyway/src/test/java/com/baeldung/springflyway/CustomerRepositoryUniqueConstraintJavaMigrationIntegrationTest.java +++ /dev/null @@ -1,29 +0,0 @@ -package com.baeldung.springflyway; - -import com.baeldung.springflyway.entities.Customer; -import com.baeldung.springflyway.repositories.CustomerRepository; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.dao.DataIntegrityViolationException; -import org.springframework.test.context.junit4.SpringRunner; - -@RunWith(SpringRunner.class) -@SpringBootTest(properties = { - "flyway.locations[0]=db/migration", "flyway.locations[1]=com/baeldung/springflyway/migration" -}) -public class CustomerRepositoryUniqueConstraintJavaMigrationIntegrationTest { - - @Autowired CustomerRepository customerRepository; - - @Test(expected = DataIntegrityViolationException.class) - public void givenTheUniqueConstraintMigrations_whenInsertingAnExistingLastNameCustomer_thenThrowException() { - customerRepository.save(Customer - .builder() - .lastName("LastName") - .build()); - - } - -} diff --git a/flyway/spring-flyway/src/test/java/com/baeldung/springflyway/CustomerRepositoryUniqueConstraintMigrationIntegrationTest.java b/flyway/spring-flyway/src/test/java/com/baeldung/springflyway/CustomerRepositoryUniqueConstraintMigrationIntegrationTest.java deleted file mode 100644 index e9ac34b384..0000000000 --- a/flyway/spring-flyway/src/test/java/com/baeldung/springflyway/CustomerRepositoryUniqueConstraintMigrationIntegrationTest.java +++ /dev/null @@ -1,27 +0,0 @@ -package com.baeldung.springflyway; - -import com.baeldung.springflyway.entities.Customer; -import com.baeldung.springflyway.repositories.CustomerRepository; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.dao.DataIntegrityViolationException; -import org.springframework.test.context.junit4.SpringRunner; - -@RunWith(SpringRunner.class) -@SpringBootTest -public class CustomerRepositoryUniqueConstraintMigrationIntegrationTest { - - @Autowired CustomerRepository customerRepository; - - @Test(expected = DataIntegrityViolationException.class) - public void givenTheUniqueConstraintMigrations_whenInsertingAnExistingEmailCustomer_thenThrowException() { - customerRepository.save(Customer - .builder() - .email("email@email.com") - .build()); - - } - -} diff --git a/flyway/spring-flyway/src/test/resources/application.properties b/flyway/spring-flyway/src/test/resources/application.properties deleted file mode 100644 index 5656ca79ce..0000000000 --- a/flyway/spring-flyway/src/test/resources/application.properties +++ /dev/null @@ -1 +0,0 @@ -spring.jpa.hibernate.ddl-auto=validate \ No newline at end of file diff --git a/flyway/spring-flyway/src/test/resources/db/migration/V1_0__create_table_customer.sql b/flyway/spring-flyway/src/test/resources/db/migration/V1_0__create_table_customer.sql deleted file mode 100644 index 8c65253ed8..0000000000 --- a/flyway/spring-flyway/src/test/resources/db/migration/V1_0__create_table_customer.sql +++ /dev/null @@ -1,6 +0,0 @@ -create table if not exists customer ( - id bigint AUTO_INCREMENT not null primary key, - first_name varchar(255) , - last_name varchar(255) , - email varchar(255) -); \ No newline at end of file diff --git a/flyway/spring-flyway/src/test/resources/db/migration/V1_1__insert_customer.sql b/flyway/spring-flyway/src/test/resources/db/migration/V1_1__insert_customer.sql deleted file mode 100644 index 6bba6e00a1..0000000000 --- a/flyway/spring-flyway/src/test/resources/db/migration/V1_1__insert_customer.sql +++ /dev/null @@ -1,6 +0,0 @@ -insert into customer (first_name, last_name, email) values ('FirstName', 'LastName', 'email@email.com'); -insert into customer (first_name, last_name, email) values ('FirstName1', 'LastName1', 'email1@email.com'); -insert into customer (first_name, last_name, email) values ('FirstName2', 'LastName2', 'email2@email.com'); -insert into customer (first_name, last_name, email) values ('FirstName3', 'LastName3', 'email3@email.com'); -insert into customer (first_name, last_name, email) values ('FirstName4', 'LastName4', 'email4@email.com'); -insert into customer (first_name, last_name, email) values ('FirstName5', 'LastName5', 'email5@email.com'); \ No newline at end of file diff --git a/flyway/spring-flyway/src/test/resources/db/migration/V1_2__make_email_not_null.sql b/flyway/spring-flyway/src/test/resources/db/migration/V1_2__make_email_not_null.sql deleted file mode 100644 index b1cc396741..0000000000 --- a/flyway/spring-flyway/src/test/resources/db/migration/V1_2__make_email_not_null.sql +++ /dev/null @@ -1 +0,0 @@ -ALTER TABLE customer ALTER email SET NOT NULL; \ No newline at end of file diff --git a/flyway/spring-flyway/src/test/resources/db/migration/V1_3__make_email_unique.sql b/flyway/spring-flyway/src/test/resources/db/migration/V1_3__make_email_unique.sql deleted file mode 100644 index 19d738fe46..0000000000 --- a/flyway/spring-flyway/src/test/resources/db/migration/V1_3__make_email_unique.sql +++ /dev/null @@ -1 +0,0 @@ -ALTER TABLE customer ADD CONSTRAINT uk_customer_email UNIQUE(email); \ No newline at end of file diff --git a/pom.xml b/pom.xml index 2c611e6efe..fa5eb83b0c 100644 --- a/pom.xml +++ b/pom.xml @@ -58,7 +58,6 @@ feign - flyway From ef4b5609653138d7d0d1654737087fd3f334312f Mon Sep 17 00:00:00 2001 From: shouvikbhattacharya Date: Thu, 14 Dec 2017 22:14:58 +0530 Subject: [PATCH 206/236] BAEL-1433: Article complete pushing final code. --- .../baeldung/collection/WhenUsingTreeSet.java | 118 ++++++++++++++++++ 1 file changed, 118 insertions(+) diff --git a/core-java/src/test/java/com/baeldung/collection/WhenUsingTreeSet.java b/core-java/src/test/java/com/baeldung/collection/WhenUsingTreeSet.java index 48aff4d437..887f6eba1d 100644 --- a/core-java/src/test/java/com/baeldung/collection/WhenUsingTreeSet.java +++ b/core-java/src/test/java/com/baeldung/collection/WhenUsingTreeSet.java @@ -1,8 +1,11 @@ package com.baeldung.collection; +import java.util.Comparator; import java.util.ConcurrentModificationException; import java.util.Iterator; +import java.util.NavigableSet; import java.util.Set; +import java.util.SortedSet; import java.util.TreeSet; import org.junit.Assert; @@ -10,6 +13,29 @@ import org.junit.Test; public class WhenUsingTreeSet { + private static class Element { + private Integer id; + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + @Override + public String toString() { + // TODO Auto-generated method stub + return id.toString(); + } + } + + private Comparator comparator = (ele1, ele2) -> { + return ele1.getId() + .compareTo(ele2.getId()); + }; + @Test public void whenAddingElement_shouldAddElement() { Set treeSet = new TreeSet<>(); @@ -102,4 +128,96 @@ public class WhenUsingTreeSet { } Assert.assertEquals(2, treeSet.size()); } + + @Test(expected = NullPointerException.class) + public void whenAddingNullToNonEmptyTreeSet_shouldThrowException() { + Set treeSet = new TreeSet<>(); + treeSet.add("First"); + treeSet.add(null); + } + + @Test + public void whenCheckingFirstElement_shouldReturnFirstElement() { + TreeSet treeSet = new TreeSet<>(); + treeSet.add("First"); + Assert.assertEquals("First", treeSet.first()); + } + + @Test + public void whenCheckingLastElement_shouldReturnLastElement() { + TreeSet treeSet = new TreeSet<>(); + treeSet.add("First"); + treeSet.add("Last"); + Assert.assertEquals("Last", treeSet.last()); + } + + @Test + public void whenUsingComparator_shouldSortAndInsertElements() { + Set treeSet = new TreeSet<>(comparator); + Element ele1 = new Element(); + ele1.setId(100); + Element ele2 = new Element(); + ele2.setId(200); + + treeSet.add(ele1); + treeSet.add(ele2); + + System.out.println(treeSet); + } + + @Test + public void whenUsingHeadSet_shouldReturnElementsLessThanSpecifiedElement() { + Set treeSet = new TreeSet<>(comparator); + Element ele1 = new Element(); + ele1.setId(100); + Element ele2 = new Element(); + ele2.setId(200); + + treeSet.add(ele1); + treeSet.add(ele2); + + System.out.println(treeSet); + } + + @Test + public void whenUsingSubSet_shouldReturnSubSetElements() { + SortedSet treeSet = new TreeSet<>(); + treeSet.add(1); + treeSet.add(2); + treeSet.add(3); + treeSet.add(4); + treeSet.add(5); + treeSet.add(6); + + Set subSet = treeSet.subSet(2, 6); + System.out.println(subSet); + } + + @Test + public void whenUsingHeadSet_shouldReturnHeadSetElements() { + SortedSet treeSet = new TreeSet<>(); + treeSet.add(1); + treeSet.add(2); + treeSet.add(3); + treeSet.add(4); + treeSet.add(5); + treeSet.add(6); + + Set subSet = treeSet.headSet(6); + Assert.assertEquals(subSet, treeSet.subSet(1, 6)); + } + + @Test + public void whenUsingTailSet_shouldReturnTailSetElements() { + NavigableSet treeSet = new TreeSet<>(); + treeSet.add(1); + treeSet.add(2); + treeSet.add(3); + treeSet.add(4); + treeSet.add(5); + treeSet.add(6); + + Set subSet = treeSet.tailSet(3); + Assert.assertEquals(subSet, treeSet.subSet(3, true, 6, true)); + } } From 9627971b46c2257a0213685108d0b250b1d00038 Mon Sep 17 00:00:00 2001 From: Muhammed Almas Date: Thu, 14 Dec 2017 22:24:27 +0530 Subject: [PATCH 207/236] BAEL-1375 Using compute for every usage. (#3242) --- .../java/com/baeldung/counter/CounterUtil.java | 15 +++------------ 1 file changed, 3 insertions(+), 12 deletions(-) diff --git a/core-java-8/src/test/java/com/baeldung/counter/CounterUtil.java b/core-java-8/src/test/java/com/baeldung/counter/CounterUtil.java index 647fbfb0cc..afd7202892 100644 --- a/core-java-8/src/test/java/com/baeldung/counter/CounterUtil.java +++ b/core-java-8/src/test/java/com/baeldung/counter/CounterUtil.java @@ -38,23 +38,14 @@ public class CounterUtil { public static void counterWithMutableInteger(Map counterMap) { for (String country : COUNTRY_NAMES) { - MutableInteger oldValue = counterMap.get(country); - if (oldValue != null) { - oldValue.increment(); - } else { - counterMap.put(country, new MutableInteger(1)); - } + counterMap.compute(country, (k, v) -> v == null ? new MutableInteger(0) : v) + .increment(); } } public static void counterWithPrimitiveArray(Map counterMap) { for (String country : COUNTRY_NAMES) { - int[] oldCounter = counterMap.get(country); - if (oldCounter != null) { - oldCounter[0] += 1; - } else { - counterMap.put(country, new int[] { 1 }); - } + counterMap.compute(country, (k, v) -> v == null ? new int[] { 0 } : v)[0]++; } } From 92c92ee96c49b97abbdc04e60fcef72f3b7afbcc Mon Sep 17 00:00:00 2001 From: Loredana Crusoveanu Date: Thu, 14 Dec 2017 22:24:31 +0200 Subject: [PATCH 208/236] fix windows jenkins script --- .../scripted-pipeline-unix-nonunix | 31 +++++-------------- 1 file changed, 8 insertions(+), 23 deletions(-) diff --git a/spring-jenkins-pipeline/scripted-pipeline-unix-nonunix b/spring-jenkins-pipeline/scripted-pipeline-unix-nonunix index 6b775b6e56..e9cae64d3d 100644 --- a/spring-jenkins-pipeline/scripted-pipeline-unix-nonunix +++ b/spring-jenkins-pipeline/scripted-pipeline-unix-nonunix @@ -14,8 +14,10 @@ node { stage("Checkstyle") { if (isUnix()) { sh "./mvnw checkstyle:checkstyle" - - step([$class: 'CheckStylePublisher', + } else { + bat "./mvnw.cmd checkstyle:checkstyle" + } + step([$class: 'CheckStylePublisher', canRunOnFailed: true, defaultEncoding: '', healthy: '100', @@ -23,18 +25,6 @@ node { unHealthy: '90', useStableBuildAsReference: true ]) - } else { - bat "./mvnw.cmd checkstyle:checkstyle" - - step([$class: 'CheckStylePublisher', - canRunOnFailed: true, - defaultEncoding: '', - healthy: '100', - pattern: '**\target\checkstyle-result.xml', - unHealthy: '90', - useStableBuildAsReference: true - ]) - } } } } @@ -44,32 +34,27 @@ node { stage("Runing unit tests") { if (isUnix()) { sh "./mvnw test -Punit" - - step([$class: 'JUnitResultArchiver', testResults: '**/target/surefire-reports/TEST-*UnitTest.xml']) } else { bat "./mvnw.cmd test -Punit" - - step([$class: 'JUnitResultArchiver', testResults: '**\target\surefire-reports\TEST-*UnitTest.xml']) } + step([$class: 'JUnitResultArchiver', testResults: '**/target/surefire-reports/TEST-*UnitTest.xml']) + } }, 'Integration tests': { stage("Runing integration tests") { if (isUnix()) { sh "./mvnw test -Pintegration" - - step([$class: 'JUnitResultArchiver', testResults: '**/target/surefire-reports/TEST-*IntegrationTest.xml']) } else { bat "./mvnw.cmd test -Pintegration" - - step([$class: 'JUnitResultArchiver', testResults: '**\target\surefire-reports\TEST-*IntegrationTest.xml']) } + step([$class: 'JUnitResultArchiver', testResults: '**/target/surefire-reports/TEST-*IntegrationTest.xml']) } }, 'Deployment': { stage("Staging") { if (isUnix()) { sh "pid=\$(lsof -i:8989 -t); kill -TERM \$pid || kill -KILL \$pid" } else { - bat "FOR /F 'tokens=5 delims= ' %%P IN ('netstat -ano ^| findstr :8989') DO TaskKill.exe /PID %%P" + bat "FOR /F \"tokens=5 delims= \" %%G IN (\"netstat -a | findstr :8989\") DO TaskKill.exe /PID %%G /fi \"memusage gt 0\"" } withEnv(['JENKINS_NODE_COOKIE=dontkill']) { From e13815415a366106183ece42108aa0d71da3bdfb Mon Sep 17 00:00:00 2001 From: chober Date: Thu, 14 Dec 2017 21:02:05 +0000 Subject: [PATCH 209/236] add flyway-callback demo per BAEL-1316 --- flyway/flyway-callbacks/.gitignore | 24 ++ .../.mvn/wrapper/maven-wrapper.jar | Bin 0 -> 47610 bytes .../.mvn/wrapper/maven-wrapper.properties | 1 + flyway/flyway-callbacks/mvnw | 225 ++++++++++++++++++ flyway/flyway-callbacks/mvnw.cmd | 143 +++++++++++ flyway/flyway-callbacks/pom.xml | 59 +++++ .../ExampleFlywayCallback.java | 33 +++ .../flywaycallbacks/FlywayApplication.java | 13 + .../src/main/resources/application.properties | 0 .../db/callbacks/beforeEachMigrate.sql | 1 + .../resources/db/callbacks/beforeMigrate.sql | 1 + .../db/migration/V1_0__add_table_one.sql | 5 + .../db/migration/V1_1__add_table_two.sql | 5 + .../src/main/resources/logback.xml | 19 ++ .../FlywayApplicationTest.java | 72 ++++++ .../FlywayCallbackTestConfig.java | 21 ++ 16 files changed, 622 insertions(+) create mode 100644 flyway/flyway-callbacks/.gitignore create mode 100644 flyway/flyway-callbacks/.mvn/wrapper/maven-wrapper.jar create mode 100644 flyway/flyway-callbacks/.mvn/wrapper/maven-wrapper.properties create mode 100644 flyway/flyway-callbacks/mvnw create mode 100644 flyway/flyway-callbacks/mvnw.cmd create mode 100644 flyway/flyway-callbacks/pom.xml create mode 100644 flyway/flyway-callbacks/src/main/java/com/baeldung/flywaycallbacks/ExampleFlywayCallback.java create mode 100644 flyway/flyway-callbacks/src/main/java/com/baeldung/flywaycallbacks/FlywayApplication.java create mode 100644 flyway/flyway-callbacks/src/main/resources/application.properties create mode 100644 flyway/flyway-callbacks/src/main/resources/db/callbacks/beforeEachMigrate.sql create mode 100644 flyway/flyway-callbacks/src/main/resources/db/callbacks/beforeMigrate.sql create mode 100644 flyway/flyway-callbacks/src/main/resources/db/migration/V1_0__add_table_one.sql create mode 100644 flyway/flyway-callbacks/src/main/resources/db/migration/V1_1__add_table_two.sql create mode 100644 flyway/flyway-callbacks/src/main/resources/logback.xml create mode 100644 flyway/flyway-callbacks/src/test/java/com/baeldung/flywaycallbacks/FlywayApplicationTest.java create mode 100644 flyway/flyway-callbacks/src/test/java/com/baeldung/flywaycallbacks/FlywayCallbackTestConfig.java diff --git a/flyway/flyway-callbacks/.gitignore b/flyway/flyway-callbacks/.gitignore new file mode 100644 index 0000000000..2af7cefb0a --- /dev/null +++ b/flyway/flyway-callbacks/.gitignore @@ -0,0 +1,24 @@ +target/ +!.mvn/wrapper/maven-wrapper.jar + +### STS ### +.apt_generated +.classpath +.factorypath +.project +.settings +.springBeans + +### IntelliJ IDEA ### +.idea +*.iws +*.iml +*.ipr + +### NetBeans ### +nbproject/private/ +build/ +nbbuild/ +dist/ +nbdist/ +.nb-gradle/ \ No newline at end of file diff --git a/flyway/flyway-callbacks/.mvn/wrapper/maven-wrapper.jar b/flyway/flyway-callbacks/.mvn/wrapper/maven-wrapper.jar new file mode 100644 index 0000000000000000000000000000000000000000..9cc84ea9b4d95453115d0c26488d6a78694e0bc6 GIT binary patch literal 47610 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 literal 0 HcmV?d00001 diff --git a/flyway/flyway-callbacks/.mvn/wrapper/maven-wrapper.properties b/flyway/flyway-callbacks/.mvn/wrapper/maven-wrapper.properties new file mode 100644 index 0000000000..9dda3b659b --- /dev/null +++ b/flyway/flyway-callbacks/.mvn/wrapper/maven-wrapper.properties @@ -0,0 +1 @@ +distributionUrl=https://repo1.maven.org/maven2/org/apache/maven/apache-maven/3.5.2/apache-maven-3.5.2-bin.zip diff --git a/flyway/flyway-callbacks/mvnw b/flyway/flyway-callbacks/mvnw new file mode 100644 index 0000000000..5bf251c077 --- /dev/null +++ b/flyway/flyway-callbacks/mvnw @@ -0,0 +1,225 @@ +#!/bin/sh +# ---------------------------------------------------------------------------- +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. +# ---------------------------------------------------------------------------- + +# ---------------------------------------------------------------------------- +# Maven2 Start Up Batch script +# +# Required ENV vars: +# ------------------ +# JAVA_HOME - location of a JDK home dir +# +# Optional ENV vars +# ----------------- +# M2_HOME - location of maven2's installed home dir +# MAVEN_OPTS - parameters passed to the Java VM when running Maven +# e.g. to debug Maven itself, use +# set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000 +# MAVEN_SKIP_RC - flag to disable loading of mavenrc files +# ---------------------------------------------------------------------------- + +if [ -z "$MAVEN_SKIP_RC" ] ; then + + if [ -f /etc/mavenrc ] ; then + . /etc/mavenrc + fi + + if [ -f "$HOME/.mavenrc" ] ; then + . "$HOME/.mavenrc" + fi + +fi + +# OS specific support. $var _must_ be set to either true or false. +cygwin=false; +darwin=false; +mingw=false +case "`uname`" in + CYGWIN*) cygwin=true ;; + MINGW*) mingw=true;; + Darwin*) darwin=true + # Use /usr/libexec/java_home if available, otherwise fall back to /Library/Java/Home + # See https://developer.apple.com/library/mac/qa/qa1170/_index.html + if [ -z "$JAVA_HOME" ]; then + if [ -x "/usr/libexec/java_home" ]; then + export JAVA_HOME="`/usr/libexec/java_home`" + else + export JAVA_HOME="/Library/Java/Home" + fi + fi + ;; +esac + +if [ -z "$JAVA_HOME" ] ; then + if [ -r /etc/gentoo-release ] ; then + JAVA_HOME=`java-config --jre-home` + fi +fi + +if [ -z "$M2_HOME" ] ; then + ## resolve links - $0 may be a link to maven's home + PRG="$0" + + # need this for relative symlinks + while [ -h "$PRG" ] ; do + ls=`ls -ld "$PRG"` + link=`expr "$ls" : '.*-> \(.*\)$'` + if expr "$link" : '/.*' > /dev/null; then + PRG="$link" + else + PRG="`dirname "$PRG"`/$link" + fi + done + + saveddir=`pwd` + + M2_HOME=`dirname "$PRG"`/.. + + # make it fully qualified + M2_HOME=`cd "$M2_HOME" && pwd` + + cd "$saveddir" + # echo Using m2 at $M2_HOME +fi + +# For Cygwin, ensure paths are in UNIX format before anything is touched +if $cygwin ; then + [ -n "$M2_HOME" ] && + M2_HOME=`cygpath --unix "$M2_HOME"` + [ -n "$JAVA_HOME" ] && + JAVA_HOME=`cygpath --unix "$JAVA_HOME"` + [ -n "$CLASSPATH" ] && + CLASSPATH=`cygpath --path --unix "$CLASSPATH"` +fi + +# For Migwn, ensure paths are in UNIX format before anything is touched +if $mingw ; then + [ -n "$M2_HOME" ] && + M2_HOME="`(cd "$M2_HOME"; pwd)`" + [ -n "$JAVA_HOME" ] && + JAVA_HOME="`(cd "$JAVA_HOME"; pwd)`" + # TODO classpath? +fi + +if [ -z "$JAVA_HOME" ]; then + javaExecutable="`which javac`" + if [ -n "$javaExecutable" ] && ! [ "`expr \"$javaExecutable\" : '\([^ ]*\)'`" = "no" ]; then + # readlink(1) is not available as standard on Solaris 10. + readLink=`which readlink` + if [ ! `expr "$readLink" : '\([^ ]*\)'` = "no" ]; then + if $darwin ; then + javaHome="`dirname \"$javaExecutable\"`" + javaExecutable="`cd \"$javaHome\" && pwd -P`/javac" + else + javaExecutable="`readlink -f \"$javaExecutable\"`" + fi + javaHome="`dirname \"$javaExecutable\"`" + javaHome=`expr "$javaHome" : '\(.*\)/bin'` + JAVA_HOME="$javaHome" + export JAVA_HOME + fi + fi +fi + +if [ -z "$JAVACMD" ] ; then + if [ -n "$JAVA_HOME" ] ; then + if [ -x "$JAVA_HOME/jre/sh/java" ] ; then + # IBM's JDK on AIX uses strange locations for the executables + JAVACMD="$JAVA_HOME/jre/sh/java" + else + JAVACMD="$JAVA_HOME/bin/java" + fi + else + JAVACMD="`which java`" + fi +fi + +if [ ! -x "$JAVACMD" ] ; then + echo "Error: JAVA_HOME is not defined correctly." >&2 + echo " We cannot execute $JAVACMD" >&2 + exit 1 +fi + +if [ -z "$JAVA_HOME" ] ; then + echo "Warning: JAVA_HOME environment variable is not set." +fi + +CLASSWORLDS_LAUNCHER=org.codehaus.plexus.classworlds.launcher.Launcher + +# traverses directory structure from process work directory to filesystem root +# first directory with .mvn subdirectory is considered project base directory +find_maven_basedir() { + + if [ -z "$1" ] + then + echo "Path not specified to find_maven_basedir" + return 1 + fi + + basedir="$1" + wdir="$1" + while [ "$wdir" != '/' ] ; do + if [ -d "$wdir"/.mvn ] ; then + basedir=$wdir + break + fi + # workaround for JBEAP-8937 (on Solaris 10/Sparc) + if [ -d "${wdir}" ]; then + wdir=`cd "$wdir/.."; pwd` + fi + # end of workaround + done + echo "${basedir}" +} + +# concatenates all lines of a file +concat_lines() { + if [ -f "$1" ]; then + echo "$(tr -s '\n' ' ' < "$1")" + fi +} + +BASE_DIR=`find_maven_basedir "$(pwd)"` +if [ -z "$BASE_DIR" ]; then + exit 1; +fi + +export MAVEN_PROJECTBASEDIR=${MAVEN_BASEDIR:-"$BASE_DIR"} +echo $MAVEN_PROJECTBASEDIR +MAVEN_OPTS="$(concat_lines "$MAVEN_PROJECTBASEDIR/.mvn/jvm.config") $MAVEN_OPTS" + +# For Cygwin, switch paths to Windows format before running java +if $cygwin; then + [ -n "$M2_HOME" ] && + M2_HOME=`cygpath --path --windows "$M2_HOME"` + [ -n "$JAVA_HOME" ] && + JAVA_HOME=`cygpath --path --windows "$JAVA_HOME"` + [ -n "$CLASSPATH" ] && + CLASSPATH=`cygpath --path --windows "$CLASSPATH"` + [ -n "$MAVEN_PROJECTBASEDIR" ] && + MAVEN_PROJECTBASEDIR=`cygpath --path --windows "$MAVEN_PROJECTBASEDIR"` +fi + +WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain + +exec "$JAVACMD" \ + $MAVEN_OPTS \ + -classpath "$MAVEN_PROJECTBASEDIR/.mvn/wrapper/maven-wrapper.jar" \ + "-Dmaven.home=${M2_HOME}" "-Dmaven.multiModuleProjectDirectory=${MAVEN_PROJECTBASEDIR}" \ + ${WRAPPER_LAUNCHER} $MAVEN_CONFIG "$@" diff --git a/flyway/flyway-callbacks/mvnw.cmd b/flyway/flyway-callbacks/mvnw.cmd new file mode 100644 index 0000000000..019bd74d76 --- /dev/null +++ b/flyway/flyway-callbacks/mvnw.cmd @@ -0,0 +1,143 @@ +@REM ---------------------------------------------------------------------------- +@REM Licensed to the Apache Software Foundation (ASF) under one +@REM or more contributor license agreements. See the NOTICE file +@REM distributed with this work for additional information +@REM regarding copyright ownership. The ASF licenses this file +@REM to you under the Apache License, Version 2.0 (the +@REM "License"); you may not use this file except in compliance +@REM with the License. You may obtain a copy of the License at +@REM +@REM http://www.apache.org/licenses/LICENSE-2.0 +@REM +@REM Unless required by applicable law or agreed to in writing, +@REM software distributed under the License is distributed on an +@REM "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +@REM KIND, either express or implied. See the License for the +@REM specific language governing permissions and limitations +@REM under the License. +@REM ---------------------------------------------------------------------------- + +@REM ---------------------------------------------------------------------------- +@REM Maven2 Start Up Batch script +@REM +@REM Required ENV vars: +@REM JAVA_HOME - location of a JDK home dir +@REM +@REM Optional ENV vars +@REM M2_HOME - location of maven2's installed home dir +@REM MAVEN_BATCH_ECHO - set to 'on' to enable the echoing of the batch commands +@REM MAVEN_BATCH_PAUSE - set to 'on' to wait for a key stroke before ending +@REM MAVEN_OPTS - parameters passed to the Java VM when running Maven +@REM e.g. to debug Maven itself, use +@REM set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000 +@REM MAVEN_SKIP_RC - flag to disable loading of mavenrc files +@REM ---------------------------------------------------------------------------- + +@REM Begin all REM lines with '@' in case MAVEN_BATCH_ECHO is 'on' +@echo off +@REM enable echoing my setting MAVEN_BATCH_ECHO to 'on' +@if "%MAVEN_BATCH_ECHO%" == "on" echo %MAVEN_BATCH_ECHO% + +@REM set %HOME% to equivalent of $HOME +if "%HOME%" == "" (set "HOME=%HOMEDRIVE%%HOMEPATH%") + +@REM Execute a user defined script before this one +if not "%MAVEN_SKIP_RC%" == "" goto skipRcPre +@REM check for pre script, once with legacy .bat ending and once with .cmd ending +if exist "%HOME%\mavenrc_pre.bat" call "%HOME%\mavenrc_pre.bat" +if exist "%HOME%\mavenrc_pre.cmd" call "%HOME%\mavenrc_pre.cmd" +:skipRcPre + +@setlocal + +set ERROR_CODE=0 + +@REM To isolate internal variables from possible post scripts, we use another setlocal +@setlocal + +@REM ==== START VALIDATION ==== +if not "%JAVA_HOME%" == "" goto OkJHome + +echo. +echo Error: JAVA_HOME not found in your environment. >&2 +echo Please set the JAVA_HOME variable in your environment to match the >&2 +echo location of your Java installation. >&2 +echo. +goto error + +:OkJHome +if exist "%JAVA_HOME%\bin\java.exe" goto init + +echo. +echo Error: JAVA_HOME is set to an invalid directory. >&2 +echo JAVA_HOME = "%JAVA_HOME%" >&2 +echo Please set the JAVA_HOME variable in your environment to match the >&2 +echo location of your Java installation. >&2 +echo. +goto error + +@REM ==== END VALIDATION ==== + +:init + +@REM Find the project base dir, i.e. the directory that contains the folder ".mvn". +@REM Fallback to current working directory if not found. + +set MAVEN_PROJECTBASEDIR=%MAVEN_BASEDIR% +IF NOT "%MAVEN_PROJECTBASEDIR%"=="" goto endDetectBaseDir + +set EXEC_DIR=%CD% +set WDIR=%EXEC_DIR% +:findBaseDir +IF EXIST "%WDIR%"\.mvn goto baseDirFound +cd .. +IF "%WDIR%"=="%CD%" goto baseDirNotFound +set WDIR=%CD% +goto findBaseDir + +:baseDirFound +set MAVEN_PROJECTBASEDIR=%WDIR% +cd "%EXEC_DIR%" +goto endDetectBaseDir + +:baseDirNotFound +set MAVEN_PROJECTBASEDIR=%EXEC_DIR% +cd "%EXEC_DIR%" + +:endDetectBaseDir + +IF NOT EXIST "%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config" goto endReadAdditionalConfig + +@setlocal EnableExtensions EnableDelayedExpansion +for /F "usebackq delims=" %%a in ("%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config") do set JVM_CONFIG_MAVEN_PROPS=!JVM_CONFIG_MAVEN_PROPS! %%a +@endlocal & set JVM_CONFIG_MAVEN_PROPS=%JVM_CONFIG_MAVEN_PROPS% + +:endReadAdditionalConfig + +SET MAVEN_JAVA_EXE="%JAVA_HOME%\bin\java.exe" + +set WRAPPER_JAR="%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.jar" +set WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain + +%MAVEN_JAVA_EXE% %JVM_CONFIG_MAVEN_PROPS% %MAVEN_OPTS% %MAVEN_DEBUG_OPTS% -classpath %WRAPPER_JAR% "-Dmaven.multiModuleProjectDirectory=%MAVEN_PROJECTBASEDIR%" %WRAPPER_LAUNCHER% %MAVEN_CONFIG% %* +if ERRORLEVEL 1 goto error +goto end + +:error +set ERROR_CODE=1 + +:end +@endlocal & set ERROR_CODE=%ERROR_CODE% + +if not "%MAVEN_SKIP_RC%" == "" goto skipRcPost +@REM check for post script, once with legacy .bat ending and once with .cmd ending +if exist "%HOME%\mavenrc_post.bat" call "%HOME%\mavenrc_post.bat" +if exist "%HOME%\mavenrc_post.cmd" call "%HOME%\mavenrc_post.cmd" +:skipRcPost + +@REM pause the script if MAVEN_BATCH_PAUSE is set to 'on' +if "%MAVEN_BATCH_PAUSE%" == "on" pause + +if "%MAVEN_TERMINATE_CMD%" == "on" exit %ERROR_CODE% + +exit /B %ERROR_CODE% diff --git a/flyway/flyway-callbacks/pom.xml b/flyway/flyway-callbacks/pom.xml new file mode 100644 index 0000000000..70dbef9b69 --- /dev/null +++ b/flyway/flyway-callbacks/pom.xml @@ -0,0 +1,59 @@ + + + 4.0.0 + + flyway-callbacks + 0.0.1-SNAPSHOT + jar + + flyway-callbacks + Flyway Callbacks Demo + + + flyway + com.baeldung + 1.0 + ../../flyway + + + + UTF-8 + UTF-8 + 1.8 + + + + + org.flywaydb + flyway-core + 4.2.0 + + + + org.springframework.boot + spring-boot-starter-jdbc + + + + com.h2database + h2 + + + org.springframework.boot + spring-boot-starter-test + test + + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + + + + diff --git a/flyway/flyway-callbacks/src/main/java/com/baeldung/flywaycallbacks/ExampleFlywayCallback.java b/flyway/flyway-callbacks/src/main/java/com/baeldung/flywaycallbacks/ExampleFlywayCallback.java new file mode 100644 index 0000000000..6ad4ce510c --- /dev/null +++ b/flyway/flyway-callbacks/src/main/java/com/baeldung/flywaycallbacks/ExampleFlywayCallback.java @@ -0,0 +1,33 @@ +package com.baeldung.flywaycallbacks; + +import java.sql.Connection; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.flywaydb.core.api.MigrationInfo; +import org.flywaydb.core.api.callback.BaseFlywayCallback; + +public class ExampleFlywayCallback extends BaseFlywayCallback { + + private Log log = LogFactory.getLog(getClass()); + + @Override + public void afterEachMigrate(Connection connection, MigrationInfo info) { + log.info("> afterEachMigrate"); + } + + @Override + public void afterMigrate(Connection connection) { + log.info("> afterMigrate"); + } + + @Override + public void beforeEachMigrate(Connection connection, MigrationInfo info) { + log.info("> beforeEachMigrate"); + } + + @Override + public void beforeMigrate(Connection connection) { + log.info("> beforeMigrate"); + } +} diff --git a/flyway/flyway-callbacks/src/main/java/com/baeldung/flywaycallbacks/FlywayApplication.java b/flyway/flyway-callbacks/src/main/java/com/baeldung/flywaycallbacks/FlywayApplication.java new file mode 100644 index 0000000000..34d794f7d1 --- /dev/null +++ b/flyway/flyway-callbacks/src/main/java/com/baeldung/flywaycallbacks/FlywayApplication.java @@ -0,0 +1,13 @@ +package com.baeldung.flywaycallbacks; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +public class FlywayApplication { + + public static void main(String[] args) { + SpringApplication.run(FlywayApplication.class, args); + } + +} diff --git a/flyway/flyway-callbacks/src/main/resources/application.properties b/flyway/flyway-callbacks/src/main/resources/application.properties new file mode 100644 index 0000000000..e69de29bb2 diff --git a/flyway/flyway-callbacks/src/main/resources/db/callbacks/beforeEachMigrate.sql b/flyway/flyway-callbacks/src/main/resources/db/callbacks/beforeEachMigrate.sql new file mode 100644 index 0000000000..7a8f142d22 --- /dev/null +++ b/flyway/flyway-callbacks/src/main/resources/db/callbacks/beforeEachMigrate.sql @@ -0,0 +1 @@ +SELECT 1 \ No newline at end of file diff --git a/flyway/flyway-callbacks/src/main/resources/db/callbacks/beforeMigrate.sql b/flyway/flyway-callbacks/src/main/resources/db/callbacks/beforeMigrate.sql new file mode 100644 index 0000000000..7a8f142d22 --- /dev/null +++ b/flyway/flyway-callbacks/src/main/resources/db/callbacks/beforeMigrate.sql @@ -0,0 +1 @@ +SELECT 1 \ No newline at end of file diff --git a/flyway/flyway-callbacks/src/main/resources/db/migration/V1_0__add_table_one.sql b/flyway/flyway-callbacks/src/main/resources/db/migration/V1_0__add_table_one.sql new file mode 100644 index 0000000000..526d8e2aea --- /dev/null +++ b/flyway/flyway-callbacks/src/main/resources/db/migration/V1_0__add_table_one.sql @@ -0,0 +1,5 @@ +create table table_one ( + id numeric, + name varchar(50), + constraint pk_table_one primary key (id) +); \ No newline at end of file diff --git a/flyway/flyway-callbacks/src/main/resources/db/migration/V1_1__add_table_two.sql b/flyway/flyway-callbacks/src/main/resources/db/migration/V1_1__add_table_two.sql new file mode 100644 index 0000000000..d51f4a5d56 --- /dev/null +++ b/flyway/flyway-callbacks/src/main/resources/db/migration/V1_1__add_table_two.sql @@ -0,0 +1,5 @@ +create table table_two ( + id numeric, + name varchar(50), + constraint pk_table_two primary key (id) +); \ No newline at end of file diff --git a/flyway/flyway-callbacks/src/main/resources/logback.xml b/flyway/flyway-callbacks/src/main/resources/logback.xml new file mode 100644 index 0000000000..7f4aa46e0d --- /dev/null +++ b/flyway/flyway-callbacks/src/main/resources/logback.xml @@ -0,0 +1,19 @@ + + + + + %date [%thread] %-5level %logger{36} - %message%n + + + + + + + + + + + + + + \ No newline at end of file diff --git a/flyway/flyway-callbacks/src/test/java/com/baeldung/flywaycallbacks/FlywayApplicationTest.java b/flyway/flyway-callbacks/src/test/java/com/baeldung/flywaycallbacks/FlywayApplicationTest.java new file mode 100644 index 0000000000..22edb5a007 --- /dev/null +++ b/flyway/flyway-callbacks/src/test/java/com/baeldung/flywaycallbacks/FlywayApplicationTest.java @@ -0,0 +1,72 @@ +package com.baeldung.flywaycallbacks; + +import java.util.Arrays; + +import javax.sql.DataSource; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.flywaydb.core.Flyway; +import org.flywaydb.core.api.MigrationInfoService; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.test.annotation.DirtiesContext; +import org.springframework.test.annotation.DirtiesContext.ClassMode; +import org.springframework.test.context.ContextConfiguration; +import org.springframework.test.context.junit4.SpringRunner; +import com.baeldung.flywaycallbacks.FlywayCallbackTestConfig; + +@RunWith(SpringRunner.class) +@DirtiesContext(classMode = ClassMode.AFTER_EACH_TEST_METHOD) +@ContextConfiguration(classes = FlywayCallbackTestConfig.class) +public class FlywayApplicationTest { + + private Log log = LogFactory.getLog(getClass()); + + @Autowired + private DataSource dataSource; + + @Test + public void migrateWithNoCallbacks() { + logTestBoundary("migrateWithNoCallbacks"); + Flyway flyway = new Flyway(); + flyway.setDataSource(dataSource); + flyway.setLocations("db/migration"); + flyway.migrate(); + } + + @Test + public void migrateWithJavaCallbacks() { + logTestBoundary("migrateWithJavaCallbacks"); + Flyway flyway = new Flyway(); + flyway.setDataSource(dataSource); + flyway.setLocations("db/migration"); + flyway.setCallbacks(new ExampleFlywayCallback()); + flyway.migrate(); + } + + @Test + public void migrateWithSqlCallbacks() { + logTestBoundary("migrateWithSqlCallbacks"); + Flyway flyway = new Flyway(); + flyway.setDataSource(dataSource); + flyway.setLocations("db/migration", "db/callbacks"); + flyway.migrate(); + } + + @Test + public void migrateWithSqlAndJavaCallbacks() { + logTestBoundary("migrateWithSqlAndJavaCallbacks"); + Flyway flyway = new Flyway(); + flyway.setDataSource(dataSource); + flyway.setLocations("db/migration", "db/callbacks"); + flyway.setCallbacks(new ExampleFlywayCallback()); + flyway.migrate(); + } + + private void logTestBoundary(String testName) { + System.out.println("\n"); + log.info("> " + testName); + } + } diff --git a/flyway/flyway-callbacks/src/test/java/com/baeldung/flywaycallbacks/FlywayCallbackTestConfig.java b/flyway/flyway-callbacks/src/test/java/com/baeldung/flywaycallbacks/FlywayCallbackTestConfig.java new file mode 100644 index 0000000000..f64b490dcf --- /dev/null +++ b/flyway/flyway-callbacks/src/test/java/com/baeldung/flywaycallbacks/FlywayCallbackTestConfig.java @@ -0,0 +1,21 @@ +package com.baeldung.flywaycallbacks; + +import javax.sql.DataSource; + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseBuilder; +import org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseType; + +@Configuration +public class FlywayCallbackTestConfig { + + @Bean + public DataSource createDatasource() { + EmbeddedDatabaseBuilder dbBuilder = new EmbeddedDatabaseBuilder(); + return dbBuilder.setType(EmbeddedDatabaseType.H2) + .setName("DATABASE") + .build(); + } + +} From f9a24e242060c471365f1c353af65351b1320c6c Mon Sep 17 00:00:00 2001 From: chober Date: Thu, 14 Dec 2017 21:03:53 +0000 Subject: [PATCH 210/236] remove maven wrapper --- .../.mvn/wrapper/maven-wrapper.jar | Bin 47610 -> 0 bytes .../.mvn/wrapper/maven-wrapper.properties | 1 - flyway/flyway-callbacks/mvnw | 225 ------------------ flyway/flyway-callbacks/mvnw.cmd | 143 ----------- 4 files changed, 369 deletions(-) delete mode 100644 flyway/flyway-callbacks/.mvn/wrapper/maven-wrapper.jar delete mode 100644 flyway/flyway-callbacks/.mvn/wrapper/maven-wrapper.properties delete mode 100644 flyway/flyway-callbacks/mvnw delete mode 100644 flyway/flyway-callbacks/mvnw.cmd diff --git a/flyway/flyway-callbacks/.mvn/wrapper/maven-wrapper.jar b/flyway/flyway-callbacks/.mvn/wrapper/maven-wrapper.jar deleted file mode 100644 index 9cc84ea9b4d95453115d0c26488d6a78694e0bc6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 47610 zcmbTd1CXW7vMxN+wr$(CZCk5to71*!+jjS~ZJX1!ds=tCefGhB{(HVS`>u$J^~PFn zW>r>YRc2N`sUQsug7OUl0^-}ZZ-jr^e|{kUJj#ly2+~T*iO~apQ;-J#>z!{v|9nH? zexD9D~4A70;F%I|$?{aX9)~)7!NMGs_XtoO(D2z3Q#5Lmj zOYWk1b{iMmsdX30UFmYyZk1gWICVeOtk^$+{3U2(8gx?WA2F!EfBPf&|1?AJ|5Z>M zfUAk^zcf#n|9^4|J34286~NKrUt&c5cZ~iqE?PH7fW5tm3-qG$) z56%`QPSn!0RMV3)jjXfG^UQ}*^yBojH!}58lPlDclX5iUhf*|DV=~e*bl;(l$Wn@r zPE*iH(NK!e9KQcU$rRM}aJc?-&H1PO&vOs*=U+QVvwuk-=zr1x>;XpRCjSyC;{TWQ z|824V8t*^*{x=5yn^pP#-?k<5|7|4y&Pd44&e_TN&sxg@ENqpX0glclj&w%W04Jwp zwJ}#@ag^@h5VV4H5U@i7V#A*a;4bzM-y_rd{0WG#jRFPJU}(#&o8vo@uM+B+$>Tiq zei^5$wg8CVf{+_#Vh`yPx-6TmB~zT_nocS_Rb6&EYp*KjbN#-aP<~3j=NVuR)S1wm zdy3AWx2r9uww3eNJxT>{tdmY4#pLw`*`_fIwSu;yzFYP)=W6iawn`s*omzNbR?E&LyC17rFcjWp!M~p?;{v!78DTxtF85BK4dT< zA5p)Z%6O}mP?<%Z{>nZmbVEbomm zLgy;;N&!y>Dma2sqmbvz&KY-j&s~dd#mWGlNF%7}vS7yt>Dm{P=X zG>Pyv2D!ba0CcTI*G6-v?!0}`EWm1d?K)DgZIQk9eucI&lBtR))NxqVz)+hBR1b|7 zgv&^46cI?mgCvp>lY9W(nJT#^<*kY3o#Php1RZLY@ffmLLq3A!Yd}O~n@BhXVp`<5 zJx`BjR%Svv)Sih_8TFg-9F-Gg3^kQrpDGej@uT5%y_9NSsk5SW>7{>&11u(JZHsZO zZweI|!&qHl0;7qxijraQo=oV^Pi~bNlzx;~b2+hXreonWGD%C$fyHs+8d1kKN>TgB z{Mu?~E{=l1osx|_8P*yC>81_GB7>NS7UA+x2k_c*cU-$gQjR{+IU)z069Ic$<)ci< zb?+V#^-MK!0s~wRP|grx?P^8EZ(9Jt0iA{`uVS6fNo>b@as5_-?e766V}&)8ZOEVtKB z*HtHAqat+2lbJbEI#fl~`XKNIF&J?PHKq)A!z(#j%)Uby=5d!bQP)-Mr!0#J=FV%@9G#Cby%r#(S=23H#9d)5Ndy>pIXJ%si!D=m*-QQZ(O9~#Jhx#AS3 z&Vs+*E5>d+{ib4>FEd#L15-ovl*zV%SYSWF>Z}j!vGn=g%w0~3XvAK&$Dl@t5hiUa#mT(4s9-JF1l zPi5d2YmuFJ4S(O>g~H)5l_`%h3qm?+8MmhXA>GRN}7GX;$4(!WTkYZB=TA^8ZFh^d9_@x$fK4qenP!zzaqQ1^(GQ- zjC$P$B5o{q&-H8UH_$orJTv0}#|9ja(vW9gA%l|@alYk+Uth1ey*ax8wmV7U?^Z9? zsQMrEzP8|_s0=bii4wDWa7te&Vmh9T>fcUXJS|dD3Y$A`s-7kY!+idEa`zB) zaW*%xb+#}9INSa62(M1kwL=m_3E2T|l5Sm9QmON8ewxr#QR`;vOGCgyMsA8$O(;=U z#sEw)37duzeM#9_7l!ly#5c+Mu3{;<9%O{e z`+0*{COEF^py;f6)y6NX)gycj`uU9pdZMum9h(bS!zu1gDXdmF4{Og{u;d(Dr~Co1 z1tm@i#5?>oL}-weK1zJRlLv*+M?l=eI~Sp9vg{R6csq=3tYSB2pqB8 z=#p`us7r|uH=cZnGj|juceAu8J#vb+&UFLFmGn~9O|TNeGH>sboBl%JI9v(@^|45? zLvr2ha)NWP4yxV8K%dU(Ae=zl)qdGyz={$my;Vs6?4?2*1?&u!OFyFbAquv6@1e)~&Rp#Ww9O88!mrze((=@F?&BPl_u9gK4VlHo@4gLK_pGtEA(gO4YpIIWTrFN zqVi%Q{adXq^Ez~dZ0VUC>DW`pGtpTY<9tMd;}WZUhT1iy+S^TfHCWXGuDwAv1Ik85 zh3!tSlWU3*aLtmdf?g(#WnLvVCXW$>gnT_{(%VilR=#2VKh~S}+Po#ha9C*<-l~Fx z$EK{1SO8np&{JC)7hdM8O+C( zF^s3HskJz@p3ot`SPKA92PG!PmC2d|9xA!CZxR!rK9-QYYBGAM-Gj zCqzBaIjtOZ6gu+lA%**RI7to$x^s8xIx}VF96=<29CjWtsl;tmNbuHgrCyB^VzEIB zt@sqnl8Vg`pnMppL6vbjNNKc?BrH<)fxiZ|WrYW%cnz-FMENGzMI+)@l7dit?oP|Wu zg-oLcv~79=fdqEM!zK%lI=R7S!Do!HBaD+*h^ULWVB}4jr^e5oUqY`zA&NUvzseI% z+XCvzS+n|m7WJoyjXXk(PE8;i^r$#Pq|NFd!{g~m2OecA1&>$7SYFw z;}Q{`F3LCE34Z>5;5dDtz&2Z&w|B9fwvU<@S<BBo(L4SbDV#X3%uS+<2q7iH+0baiGzlVP5n0fBDP z7kx+7|Cws+?T|cw-pt~SIa7BRDI_ATZ9^aQS^1I?WfnfEHZ*sGlT#Wk9djDL?dWLA zk%(B?<8L?iV*1m803UW|*sU$raq<(!N!CrQ&y7?7_g zF2!aAfw5cWqO}AX)+v)5_GvQ$1W8MV8bTMr3P{^!96Q4*YhS}9ne|+3GxDJmZEo zqh;%RqD5&32iTh7kT>EEo_%`8BeK&)$eXQ-o+pFIP!?lee z&kos;Q)_afg1H&{X|FTQ0V z@yxv4KGGN)X|n|J+(P6Q`wmGB;J}bBY{+LKVDN9#+_w9s$>*$z)mVQDOTe#JG)Zz9*<$LGBZ-umW@5k5b zbIHp=SJ13oX%IU>2@oqcN?)?0AFN#ovwS^|hpf5EGk0#N<)uC{F}GG}%;clhikp2* zu6ra2gL@2foI>7sL`(x5Q)@K2$nG$S?g`+JK(Q0hNjw9>kDM|Gpjmy=Sw5&{x5$&b zE%T6x(9i|z4?fMDhb%$*CIe2LvVjuHca`MiMcC|+IU51XfLx(BMMdLBq_ z65RKiOC$0w-t)Cyz0i-HEZpkfr$>LK%s5kga^FIY_|fadzu*r^$MkNMc!wMAz3b4P+Z3s(z^(%(04}dU>ef$Xmof(A|XXLbR z2`&3VeR1&jjKTut_i?rR_47Z`|1#$NE$&x#;NQM|hxDZ>biQ*+lg5E62o65ILRnOOOcz%Q;X$MJ?G5dYmk$oL_bONX4 zT^0yom^=NsRO^c$l02#s0T^dAAS&yYiA=;rLx;{ro6w08EeTdVF@j^}Bl;o=`L%h! zMKIUv(!a+>G^L3{z7^v3W$FUUHA+-AMv~<}e?2?VG|!itU~T>HcOKaqknSog zE}yY1^VrdNna1B6qA`s?grI>Y4W%)N;~*MH35iKGAp*gtkg=FE*mFDr5n2vbhwE|4 zZ!_Ss*NMZdOKsMRT=uU{bHGY%Gi=K{OD(YPa@i}RCc+mExn zQogd@w%>14cfQrB@d5G#>Lz1wEg?jJ0|(RwBzD74Eij@%3lyoBXVJpB{q0vHFmE7^ zc91!c%pt&uLa|(NyGF2_L6T{!xih@hpK;7B&bJ#oZM0`{T6D9)J2IXxP?DODPdc+T zC>+Zq8O%DXd5Gog2(s$BDE3suv=~s__JQnX@uGt+1r!vPd^MM}=0((G+QopU?VWgR zqj8EF0?sC`&&Nv-m-nagB}UhXPJUBn-UaDW9;(IX#)uc zL*h%hG>ry@a|U=^=7%k%V{n=eJ%Nl0Oqs!h^>_PgNbD>m;+b)XAk+4Cp=qYxTKDv& zq1soWt*hFf%X8}MpQZL-Lg7jc0?CcWuvAOE(i^j1Km^m8tav)lMx1GF{?J#*xwms2 z3N_KN-31f;@JcW(fTA`J5l$&Q8x{gb=9frpE8K0*0Rm;yzHnDY0J{EvLRF0 zRo6ca)gfv6C)@D#1I|tgL~uHJNA-{hwJQXS?Kw=8LU1J$)nQ-&Jhwxpe+%WeL@j0q z?)92i;tvzRki1P2#poL;YI?9DjGM4qvfpsHZQkJ{J^GNQCEgUn&Sg=966 zq?$JeQT+vq%zuq%%7JiQq(U!;Bsu% zzW%~rSk1e+_t89wUQOW<8%i|5_uSlI7BcpAO20?%EhjF%s%EE8aY15u(IC za2lfHgwc;nYnES7SD&Lf5IyZvj_gCpk47H}e05)rRbfh(K$!jv69r5oI| z?){!<{InPJF6m|KOe5R6++UPlf(KUeb+*gTPCvE6! z(wMCuOX{|-p(b~)zmNcTO%FA z$-6}lkc*MKjIJ(Fyj^jkrjVPS);3Qyq~;O$p+XT+m~0$HsjB@}3}r*h(8wGbH9ktQ zbaiiMSJf`6esxC3`u@nNqvxP1nBwerm|KN)aBzu$8v_liZ0(G8}*jB zv<8J%^S2E_cu+Wp1;gT66rI$>EwubN4I(Lo$t8kzF@?r0xu8JX`tUCpaZi(Q0~_^K zs6pBkie9~06l>(Jpy*d&;ZH{HJ^Ww6>Hs!DEcD{AO42KX(rTaj)0ox`;>}SRrt)N5 zX)8L4Fg)Y6EX?He?I`oHeQiGJRmWOAboAC4Jaf;FXzspuG{+3!lUW8?IY>3%)O546 z5}G94dk)Y>d_%DcszEgADP z8%?i~Ak~GQ!s(A4eVwxPxYy3|I~3I=7jf`yCDEk_W@yfaKjGmPdM}($H#8xGbi3l3 z5#?bjI$=*qS~odY6IqL-Q{=gdr2B5FVq7!lX}#Lw**Pyk!`PHN7M3Lp2c=T4l}?kn zVNWyrIb(k&`CckYH;dcAY7-kZ^47EPY6{K(&jBj1Jm>t$FD=u9U z#LI%MnI3wPice+0WeS5FDi<>~6&jlqx=)@n=g5TZVYdL@2BW3w{Q%MkE%sx}=1ihvj(HDjpx!*qqta?R?| zZ(Ju_SsUPK(ZK*&EdAE(Fj%eABf2+T>*fZ6;TBP%$xr(qv;}N@%vd5iGbzOgyMCk* z3X|-CcAz%}GQHalIwd<-FXzA3btVs-_;!9v7QP)V$ruRAURJhMlw7IO@SNM~UD)2= zv}eqKB^kiB))Yhh%v}$ubb#HBQHg3JMpgNF+pN*QbIx(Rx1ofpVIL5Y{)0y&bMO(@ zyK1vv{8CJQidtiI?rgYVynw{knuc!EoQ5-eete(AmM`32lI7{#eS#!otMBRl21|g^SVHWljl8jU?GU@#pYMIqrt3mF|SSYI&I+Vz|%xuXv8;pHg zlzFl!CZ>X%V#KWL3+-743fzYJY)FkKz>GJ<#uKB)6O8NbufCW%8&bQ^=8fHYfE(lY z1Fl@4l%|iaTqu=g7tTVk)wxjosZf2tZ2`8xs9a$b1X29h!9QP#WaP#~hRNL>=IZO@SX4uYQR_c0pSt89qQR@8gJhL*iXBTSBDtlsiNvc_ewvY-cm%bd&sJTnd@hE zwBGvqGW$X^oD~%`b@yeLW%An*as@4QzwdrpKY9-E%5PLqvO6B+bf>ph+TWiPD?8Ju z-V}p@%LcX{e)?*0o~#!S%XU<+9j>3{1gfU=%sHXhukgH+9z!)AOH_A{H3M}wmfmU8 z&9jjfwT-@iRwCbIEwNP4zQHvX3v-d*y87LoudeB9Jh5+mf9Mnj@*ZCpwpQ*2Z9kBWdL19Od7q|Hdbwv+zP*FuY zQc4CJ6}NIz7W+&BrB5V%{4Ty$#gf#V<%|igk)b@OV`0@<)cj(tl8~lLtt^c^l4{qP z=+n&U0LtyRpmg(_8Qo|3aXCW77i#f{VB?JO3nG!IpQ0Y~m!jBRchn`u>HfQuJwNll zVAMY5XHOX8T?hO@7Vp3b$H)uEOy{AMdsymZ=q)bJ%n&1;>4%GAjnju}Osg@ac*O?$ zpu9dxg-*L(%G^LSMhdnu=K)6ySa|}fPA@*Saj}Z>2Dlk~3%K(Py3yDG7wKij!7zVp zUZ@h$V0wJ|BvKc#AMLqMleA*+$rN%#d95$I;;Iy4PO6Cih{Usrvwt2P0lh!XUx~PGNySbq#P%`8 zb~INQw3Woiu#ONp_p!vp3vDl^#ItB06tRXw88L}lJV)EruM*!ZROYtrJHj!X@K$zJ zp?Tb=Dj_x1^)&>e@yn{^$B93%dFk~$Q|0^$=qT~WaEU-|YZZzi`=>oTodWz>#%%Xk z(GpkgQEJAibV%jL#dU)#87T0HOATp~V<(hV+CcO?GWZ_tOVjaCN13VQbCQo=Dt9cG znSF9X-~WMYDd66Rg8Ktop~CyS7@Pj@Vr<#Ja4zcq1}FIoW$@3mfd;rY_Ak^gzwqqD z^4<_kC2Eyd#=i8_-iZ&g_e#$P`;4v zduoZTdyRyEZ-5WOJwG-bfw*;7L7VXUZ8aIA{S3~?()Yly@ga|-v%?@2vQ;v&BVZlo7 z49aIo^>Cv=gp)o?3qOraF_HFQ$lO9vHVJHSqq4bNNL5j%YH*ok`>ah?-yjdEqtWPo z+8i0$RW|$z)pA_vvR%IVz4r$bG2kSVM&Z;@U*{Lug-ShiC+IScOl?O&8aFYXjs!(O z^xTJ|QgnnC2!|xtW*UOI#vInXJE!ZpDob9x`$ox|(r#A<5nqbnE)i<6#(=p?C~P-7 zBJN5xp$$)g^l};@EmMIe;PnE=vmPsTRMaMK;K`YTPGP0na6iGBR8bF%;crF3>ZPoLrlQytOQrfTAhp;g){Mr$zce#CA`sg^R1AT@tki!m1V zel8#WUNZfj(Fa#lT*nT>^pY*K7LxDql_!IUB@!u?F&(tfPspwuNRvGdC@z&Jg0(-N z(oBb3QX4em;U=P5G?Y~uIw@E7vUxBF-Ti*ccU05WZ7`m=#4?_38~VZvK2{MW*3I#fXoFG3?%B;ki#l%i#$G_bwYQR-4w>y;2` zMPWDvmL6|DP1GVXY)x+z8(hqaV5RloGn$l&imhzZEZP6v^d4qAgbQ~bHZEewbU~Z2 zGt?j~7`0?3DgK+)tAiA8rEst>p#;)W=V+8m+%}E$p-x#)mZa#{c^3pgZ9Cg}R@XB) zy_l7jHpy(u;fb+!EkZs6@Z?uEK+$x3Ehc8%~#4V?0AG0l(vy{8u@Md5r!O+5t zsa{*GBn?~+l4>rChlbuT9xzEx2yO_g!ARJO&;rZcfjzxpA0Chj!9rI_ZD!j` z6P@MWdDv&;-X5X8o2+9t%0f1vJk3R~7g8qL%-MY9+NCvQb)%(uPK4;>y4tozQ2Dl* zEoR_1#S~oFrd9s%NOkoS8$>EQV|uE<9U*1uqAYWCZigiGlMK~vSUU}f5M9o{<*WW? z$kP)2nG$My*fUNX3SE!g7^r#zTT^mVa#A*5sBP8kz4se+o3y}`EIa)6)VpKmto6Ew z1J-r2$%PM4XUaASlgVNv{BBeL{CqJfFO|+QpkvsvVBdCA7|vlwzf1p$Vq50$Vy*O+ z5Eb85s^J2MMVj53l4_?&Wpd1?faYE-X1ml-FNO-|a;ZRM*Vp!(ods{DY6~yRq%{*< zgq5#k|KJ70q47aO1o{*gKrMHt)6+m(qJi#(rAUw0Uy8~z8IX)>9&PTxhLzh#Oh*vZ zPd1b$Z&R{yc&TF^x?iQCw#tV}la&8^W)B*QZ${19LlRYgu#nF7Zj`~CtO^0S#xp+r zLYwM~si$I>+L}5gLGhN=dyAKO)KqPNXUOeFm#o+3 z&#!bD%aTBT@&;CD_5MMC&_Yi+d@nfuxWSKnYh0%~{EU`K&DLx}ZNI2osu#(gOF2}2 zZG#DdQ|k0vXj|PxxXg-MYSi9gI|hxI%iP)YF2$o< zeiC8qgODpT?j!l*pj_G(zXY2Kevy~q=C-SyPV$~s#f-PW2>yL}7V+0Iu^wH;AiI$W zcZDeX<2q%!-;Ah!x_Ld;bR@`bR4<`FTXYD(%@CI#biP z5BvN;=%AmP;G0>TpInP3gjTJanln8R9CNYJ#ziKhj(+V33zZorYh0QR{=jpSSVnSt zGt9Y7Bnb#Ke$slZGDKti&^XHptgL7 zkS)+b>fuz)B8Lwv&JV*};WcE2XRS63@Vv8V5vXeNsX5JB?e|7dy$DR9*J#J= zpKL@U)Kx?Y3C?A3oNyJ5S*L+_pG4+X*-P!Er~=Tq7=?t&wwky3=!x!~wkV$Ufm(N| z1HY?`Ik8?>%rf$6&0pxq8bQl16Jk*pwP`qs~x~Trcstqe-^hztuXOG zrYfI7ZKvK$eHWi9d{C${HirZ6JU_B`f$v@SJhq?mPpC-viPMpAVwE;v|G|rqJrE5p zRVf904-q{rjQ=P*MVKXIj7PSUEzu_jFvTksQ+BsRlArK&A*=>wZPK3T{Ki-=&WWX= z7x3VMFaCV5;Z=X&(s&M^6K=+t^W=1>_FFrIjwjQtlA|-wuN7&^v1ymny{51gZf4-V zU8|NSQuz!t<`JE%Qbs||u-6T*b*>%VZRWsLPk&umJ@?Noo5#{z$8Q0oTIv00`2A`# zrWm^tAp}17z72^NDu^95q1K)6Yl`Wvi-EZA+*i&8%HeLi*^9f$W;f1VF^Y*W;$3dk|eLMVb_H{;0f*w!SZMoon+#=CStnG-7ZU8V>Iy( zmk;42e941mi7!e>J0~5`=NMs5g)WrdUo^7sqtEvwz8>H$qk=nj(pMvAb4&hxobPA~p&-L5a_pTs&-0XCm zKXZ8BkkriiwE)L2CN$O-`#b15yhuQO7f_WdmmG<-lKeTBq_LojE&)|sqf;dt;llff znf|C$@+knhV_QYVxjq*>y@pDK|DuZg^L{eIgMZnyTEoe3hCgVMd|u)>9knXeBsbP_$(guzw>eV{?5l$ z063cqIysrx82-s6k;vE?0jxzV{@`jY3|*Wp?EdNUMl0#cBP$~CHqv$~sB5%50`m(( zSfD%qnxbGNM2MCwB+KA?F>u__Ti>vD%k0#C*Unf?d)bBG6-PYM!!q;_?YWptPiHo} z8q3M~_y9M6&&0#&uatQD6?dODSU)%_rHen`ANb z{*-xROTC1f9d!8`LsF&3jf{OE8~#;>BxHnOmR}D80c2Eh zd867kq@O$I#zEm!CCZJw8S`mCx}HrCl_Rh4Hsk{Cb_vJ4VA3GK+icku z%lgw)Y@$A0kzEV^#=Zj8i6jPk&Mt_bKDD!jqY3&W(*IPbzYu$@x$|3*aP{$bz-~xE^AOxtbyWvzwaCOHv6+99llI&xT_8)qX3u|y|0rDV z(Hu*#5#cN0mw4OSdY$g_xHo-zyZ-8WW&4r%qW(=5N>0O-t{k;#G9X81F~ynLV__Kz zbW1MA>Pjg0;3V?iV+-zQsll_0jimGuD|0GNW^av|4yes(PkR1bGZwO6xvgCy}ThR7?d&$N`kA3N!Xn5uSKKCT-`{lE1ZYYy?GzL}WF+mh|sgT6K2Z*c9YB zFSpGRNgYvk&#<2@G(vUM5GB|g?gk~-w+I4C{vGu{`%fiNuZIeu@V1qt`-x$E?OR;zu866Y@2^et5GTNCpX#3D=|jD5>lT^vD$ zr}{lRL#Lh4g45Yj43Vs7rxUb*kWC?bpKE1@75OJQ=XahF z5(C0DyF;at%HtwMTyL!*vq6CLGBi^Ey}Mx39TC2$a)UmekKDs&!h>4Hp2TmSUi!xo zWYGmyG)`$|PeDuEL3C6coVtit>%peYQ6S1F4AcA*F`OA;qM+1U6UaAI(0VbW#!q9* zz82f@(t35JH!N|P4_#WKK6Rc6H&5blD6XA&qXahn{AP=oKncRgH!&=b6WDz?eexo* z9pzh}_aBc_R&dZ+OLk+2mK-5UhF`>}{KN7nOxb{-1 zd`S-o1wgCh7k0u%QY&zoZH}!<;~!)3KTs-KYRg}MKP3Vl%p$e6*MOXLKhy)<1F5L* z+!IH!RHQKdpbT8@NA+BFd=!T==lzMU95xIyJ13Z6zysYQ1&zzH!$BNU(GUm1QKqm< zTo#f%;gJ@*o;{#swM4lKC(QQ<%@;7FBskc7$5}W9Bi=0heaVvuvz$Ml$TR8@}qVn>72?6W1VAc{Mt}M zkyTBhk|?V}z`z$;hFRu8Vq;IvnChm+no@^y9C1uugsSU`0`46G#kSN9>l_ozgzyqc zZnEVj_a-?v@?JmH1&c=~>-v^*zmt`_@3J^eF4e))l>}t2u4L`rueBR=jY9gZM;`nV z>z(i<0eedu2|u-*#`SH9lRJ7hhDI=unc z?g^30aePzkL`~hdH*V7IkDGnmHzVr%Q{d7sfb7(|)F}ijXMa7qg!3eHex)_-$X;~* z>Zd8WcNqR>!`m#~Xp;r4cjvfR{i04$&f1)7sgen9i>Y|3)DCt^f)`uq@!(SG?w|tdSLS+<;ID74 zTq8FJYHJHrhSwvKL|O1ZnSbG-=l6Eg-Suv60Xc;*bq~g+LYk*Q&e)tR_h3!(y)O}$ zLi*i5ec^uHkd)fz2KWiR;{RosL%peU`TxM7w*M9m#rAiG`M)FTB>=X@|A`7x)zn5- z$MB5>0qbweFB249EI@!zL~I7JSTZbzjSMMJ=!DrzgCS!+FeaLvx~jZXwR`BFxZ~+A z=!Pifk?+2awS3DVi32fgZRaqXZq2^->izZpIa1sEog@01#TuEzq%*v359787rZoC( z9%`mDR^Hdxb%XzUt&cJN3>Cl{wmv{@(h>R38qri1jLKds0d|I?%Mmhu2pLy=< zOkKo4UdS`E9Y~z3z{5_K+j~i7Ou}q0?Qv4YebBya1%VkkWzR%+oB!c?9(Ydaka32! zTEv*zgrNWs`|~Q{h?O|8s0Clv{Kg0$&U}?VFLkGg_y=0Qx#=P${6SNQFp!tDsTAPV z0Ra{(2I7LAoynS0GgeQ6_)?rYhUy}AE^$gwmg?i!x#<9eP=0N=>ZgB#LV9|aH8q#B za|O-vu(GR|$6Ty!mKtIfqWRS-RO4M0wwcSr9*)2A5`ZyAq1`;6Yo)PmDLstI zL2%^$1ikF}0w^)h&000z8Uc7bKN6^q3NBfZETM+CmMTMU`2f^a#BqoYm>bNXDxQ z`3s6f6zi5sj70>rMV-Mp$}lP|jm6Zxg}Sa*$gNGH)c-upqOC7vdwhw}e?`MEMdyaC zP-`+83ke+stJPTsknz0~Hr8ea+iL>2CxK-%tt&NIO-BvVt0+&zsr9xbguP-{3uW#$ z<&0$qcOgS{J|qTnP;&!vWtyvEIi!+IpD2G%Zs>;k#+d|wbodASsmHX_F#z?^$)zN5 zpQSLH`x4qglYj*{_=8p>!q39x(y`B2s$&MFQ>lNXuhth=8}R}Ck;1}MI2joNIz1h| zjlW@TIPxM_7 zKBG{Thg9AP%B2^OFC~3LG$3odFn_mr-w2v**>Ub7da@>xY&kTq;IGPK5;^_bY5BP~ z2fiPzvC&osO@RL)io905e4pY3Yq2%j&)cfqk|($w`l`7Pb@407?5%zIS9rDgVFfx! zo89sD58PGBa$S$Lt?@8-AzR)V{@Q#COHi-EKAa5v!WJtJSa3-Wo`#TR%I#UUb=>j2 z7o-PYd_OrbZ~3K`pn*aw2)XKfuZnUr(9*J<%z@WgC?fexFu%UY!Yxi6-63kAk7nsM zlrr5RjxV45AM~MPIJQqKpl6QmABgL~E+pMswV+Knrn!0T)Ojw{<(yD8{S|$(#Z!xX zpH9_Q>5MoBKjG%zzD*b6-v>z&GK8Dfh-0oW4tr(AwFsR(PHw_F^k((%TdkglzWR`iWX>hT1rSX;F90?IN4&}YIMR^XF-CEM(o(W@P#n?HF z!Ey(gDD_0vl+{DDDhPsxspBcks^JCEJ$X74}9MsLt=S?s3)m zQ0cSrmU*<u;KMgi1(@Ip7nX@4Zq>yz;E<(M8-d0ksf0a2Ig8w2N-T69?f}j}ufew}LYD zxr7FF3R7yV0Gu^%pXS^49){xT(nPupa(8aB1>tfKUxn{6m@m1lD>AYVP=<)fI_1Hp zIXJW9gqOV;iY$C&d=8V)JJIv9B;Cyp7cE}gOoz47P)h)Y?HIE73gOHmotX1WKFOvk z5(t$Wh^13vl;+pnYvJGDz&_0Hd3Z4;Iwa-i3p|*RN7n?VJ(whUPdW>Z-;6)Re8n2# z-mvf6o!?>6wheB9q}v~&dvd0V`8x&pQkUuK_D?Hw^j;RM-bi_`5eQE5AOIzG0y`Hr zceFx7x-<*yfAk|XDgPyOkJ?){VGnT`7$LeSO!n|o=;?W4SaGHt4ngsy@=h-_(^qX)(0u=Duy02~Fr}XWzKB5nkU$y`$67%d^(`GrAYwJ? zN75&RKTlGC%FP27M06zzm}Y6l2(iE*T6kdZPzneMK9~m)s7J^#Q=B(Okqm1xB7wy< zNC>)8Tr$IG3Q7?bxF%$vO1Y^Qhy>ZUwUmIW5J4=ZxC|U)R+zg4OD$pnQ{cD`lp+MM zS3RitxImPC0)C|_d18Shpt$RL5iIK~H z)F39SLwX^vpz;Dcl0*WK*$h%t0FVt`Wkn<=rQ6@wht+6|3?Yh*EUe+3ISF zbbV(J6NNG?VNIXC)AE#(m$5Q?&@mjIzw_9V!g0#+F?)2LW2+_rf>O&`o;DA!O39Rg ziOyYKXbDK!{#+cj_j{g;|IF`G77qoNBMl8r@EIUBf+7M|eND2#Y#-x=N_k3a52*fi zp-8K}C~U4$$76)@;@M@6ZF*IftXfwyZ0V+6QESKslI-u!+R+?PV=#65d04(UI%}`r z{q6{Q#z~xOh}J=@ZN<07>bOdbSI(Tfcu|gZ?{YVVcOPTTVV52>&GrxwumlIek}OL? zeGFo#sd|C_=JV#Cu^l9$fSlH*?X|e?MdAj8Uw^@Dh6+eJa?A?2Z#)K zvr7I|GqB~N_NU~GZ?o1A+fc@%HlF$71Bz{jOC{B*x=?TsmF0DbFiNcnIuRENZA43a zfFR89OAhqSn|1~L4sA9nVHsFV4xdIY_Ix>v0|gdP(tJ^7ifMR_2i4McL#;94*tSY) zbwcRqCo$AnpV)qGHZ~Iw_2Q1uDS2XvFff#5BXjO!w&1C^$Pv^HwXT~vN0l}QsTFOz zp|y%Om9}{#!%cPR8d8sc4Y@BM+smy{aU#SHY>>2oh1pK+%DhPqc2)`!?wF{8(K$=~ z<4Sq&*`ThyQETvmt^NaN{Ef2FQ)*)|ywK%o-@1Q9PQ_)$nJqzHjxk4}L zJRnK{sYP4Wy(5Xiw*@M^=SUS9iCbSS(P{bKcfQ(vU?F~)j{~tD>z2I#!`eFrSHf;v zquo)*?AW$#+qP}n$%<{;wr$()*yw5N`8_rOTs^kOqyY;dIjsdw*6k_mL}v2V9C_*sK<_L8 za<3)C%4nRybn^plZ(y?erFuRVE9g%mzsJzEi5CTx?wwx@dpDFSOAubRa_#m+=AzZ~ z^0W#O2zIvWEkxf^QF660(Gy8eyS`R$N#K)`J732O1rK4YHBmh|7zZ`!+_91uj&3d} zKUqDuDQ8YCmvx-Jv*$H%{MrhM zw`g@pJYDvZp6`2zsZ(dm)<*5p3nup(AE6}i#Oh=;dhOA=V7E}98CO<1Lp3*+&0^`P zs}2;DZ15cuT($%cwznqmtTvCvzazAVu5Ub5YVn#Oo1X|&MsVvz8c5iwRi43-d3T%tMhcK#ke{i-MYad@M~0B_p`Iq){RLadp-6!peP^OYHTq~^vM zqTr5=CMAw|k3QxxiH;`*;@GOl(PXrt(y@7xo$)a3Fq4_xRM_3+44!#E zO-YL^m*@}MVI$5PM|N8Z2kt-smM>Jj@Dkg5%`lYidMIbt4v=Miqj4-sEE z)1*5VCqF1I{KZVw`U0Wa!+)|uiOM|=gM65??+k|{E6%76MqT>T+;z{*&^5Q9ikL2D zN2}U$UY)=rIyUnWo=yQ@55#sCZeAC}cQA(tg5ZhqLtu*z>4}mbfoZ>JOj-|a2fR$L zQ(7N$spJL_BHb6Bf%ieO10~pQX%@^WKmQOQNOUe4h|M}XOTRL`^QVpN$MjJ7t+UdP zDdzcK3e7_fdv)PPR>O|-`kVC1_O08_WGcQXj*W5d?}3yE?-fZ_@mE-zcq6^Mn49!; zDDcus*@4dFIyZ%_d3*MO=kk3$MQ^?zaDR1-o<<7T=;`8 zz2(w>U9IQ+pZ<*B;4dE@LnlF7YwNG>la#rQ@mC4u@@0_pf40+<&t)+9(YOgCP9(aJ z5v7SRi(y4;fWR)oHRxf2|Va=?P zXq&7GtTYd+3U{Wm5?#e7gDwz#OFbvHL4Jq{BGhNYzh|U!1$_WEJef&NKDD9)*$d+e ztXF1-rvO5OBm{g9Mo8x?^YB;J|G*~3m@2y%Fyx6eb*O^lW- z`JUL?!exvd&SL_w89KoQxw5ZZ}7$FD4s>z`!3R}6vcFf0lWNYjH$#P z<)0DiPN%ASTkjWqlBB;8?RX+X+y>z*$H@l%_-0-}UJ>9l$`=+*lIln9lMi%Q7CK-3 z;bsfk5N?k~;PrMo)_!+-PO&)y-pbaIjn;oSYMM2dWJMX6tsA5>3QNGQII^3->manx z(J+2-G~b34{1^sgxplkf>?@Me476Wwog~$mri{^`b3K0p+sxG4oKSwG zbl!m9DE87k>gd9WK#bURBx%`(=$J!4d*;!0&q;LW82;wX{}KbPAZtt86v(tum_1hN z0{g%T0|c(PaSb+NAF^JX;-?=e$Lm4PAi|v%(9uXMU>IbAlv*f{Ye3USUIkK`^A=Vn zd))fSFUex3D@nsdx6-@cfO1%yfr4+0B!uZ)cHCJdZNcsl%q9;#%k@1jh9TGHRnH2(ef0~sB(`82IC_71#zbg=NL$r=_9UD-~ z8c54_zA@jEhkJpL?U`$p&|XF}OpRvr`~}+^BYBtiFB1!;FX;a3=7jkFSET)41C@V` zxhfS)O-$jRJ|R}CL{=N{{^0~c8WuLOC?`>JKmFGi?dlfss4Y^AAtV#FoLvWoHsEeg zAAOc+PXl@WoSOOu_6Tz~K=>OK@KL#^re(1oPrhcen@+#ouGG|g(;A5(SVuE~rp$?# zR$o(46m}O~QtU{!N-s}RfYh+?*m9v#w@;=DEXI;!CEf0bHEgI<~T7&VnIvtG%o=s@3c zG1AT(J>!bph%Z1^xT_aO>@%jWnTW=8Z^2k0?aJ(8R5VA}H+mDh>$b9ua{)I5X9$%b z&O%F;3AIW&9j3=Q1#8uL%4_2mc3xX2AdzYJi%#Q#PEY3lk<#u=Pc?EJ7qt4WZX)bH481F8hwMr^9C^N8KUiWIgcVa=V` z4_7By=0Fkq>M6N?Bis+nc$YOqN4Qs@KDdQCy0TTi;SQ7^#<wi9E4T)##ZVvS(SK4#6j^QjHIUh<0_ZD2Yl+t?Z2;4zA zvI<(>jLvJae#sIA`qHl0lnkcU$>Rrkcnp{E;VZwW`cucIIWi{hftjEx-7>xXWRsa4VH(CCyuleyG8a+wOY8l*y>n@ zxZb}o=p9lR)9N^FKfkvPH-t2{qDE=hG8Z!`JO>6aJ^hKJVyIV&qGo*YSpoU(d)&OE ziv2#o`&W>(IK~sH{_5aPL;qcn{2%Gae+r5G4yMl5U)EB>ZidEo|F@f)70WN%Pxo`= zQ+U-W9}iLlF=`VeGD0*EpI!(lVJHy(%9yFZkS_GMSF?J*$bq+2vW37rwn;9?9%g(Jhwc<`lHvf6@SfnQaA&aF=los z0>hw9*P}3mWaZ|N5+NXIqz#8EtCtYf-szHPI`%!HhjmeCnZCim3$IX?5Il%muqrPr zyUS#WRB(?RNxImUZHdS&sF8%5wkd0RIb*O#0HH zeH~m^Rxe1;4d(~&pWGyPBxAr}E(wVwlmCs*uyeB2mcsCT%kwX|8&Pygda=T}x{%^7 z)5lE5jl0|DKd|4N*_!(ZLrDL5Lp&WjO7B($n9!_R3H(B$7*D zLV}bNCevduAk2pJfxjpEUCw;q$yK=X-gH^$2f}NQyl(9ymTq>xq!x0a7-EitRR3OY zOYS2Qh?{_J_zKEI!g0gz1B=_K4TABrliLu6nr-`w~g2#zb zh7qeBbkWznjeGKNgUS8^^w)uLv*jd8eH~cG-wMN+{*42Z{m(E{)>K7O{rLflN(vC~ zRcceKP!kd)80=8ttH@14>_q|L&x0K^N0Ty{9~+c>m0S<$R@e11>wu&=*Uc^^`dE9RnW+)N$re2(N@%&3A?!JdI?Vx;X=8&1+=;krE8o%t z32Gi2=|qi=F?kmSo19LqgEPC5kGeJ5+<3TpUXV3Yik_6(^;SJw=Cz`dq(LN)F9G<$ za-aTiEiE}H(a>WITnJ+qG$3eCqrKgXFRiIv=@1C4zGNV!+ z{{7_AulEPXdR+~$sJ+yHA73j_w^4>UHZFnK$xsp}YtpklHa57+9!NfhOuU7m4@WQp z5_qb`)p|6atW#^b;KIj?8mWxF(!eN<#8h=Ohzw&bagGAS4;O^;d-~#Ct0*gpp_4&( ztwlS2Jf#9i>=e5+X8QSy**-JE&6{$GlkjNzNJY;K5&h|iDT-6%4@g;*JK&oA8auCovoA0+S(t~|vpG$yI+;aKSa{{Y(Tnm{ zzWuo^wgB?@?S9oKub=|NZNEDc;5v@IL*DBqaMkgn@z+IeaE^&%fZ0ZGLFYEubRxP0WG`S| zRCRXWt+ArtBMCRqB725odpDu(qdG;jez|6*MZE_Ml<4ehK_$06#r3*=zC9q}YtZ*S zBEb2?=5|Tt;&QV^qXpaf?<;2>07JVaR^L9-|MG6y=U9k{8-^iS4-l_D(;~l=zLoq% zVw05cIVj1qTLpYcQH0wS1yQ47L4OoP;otb02V!HGZhPnzw`@TRACZZ_pfB#ez4wObPJYcc%W>L8Z*`$ZPypyFuHJRW>NAha3z?^PfHsbP*-XPPq|`h} zljm&0NB7EFFgWo%0qK`TAhp220MRLHof1zNXAP6At4n#(ts2F+B`SaIKOHzEBmCJ3 z$7Z&kYcKWH&T!=#s5C8C_UMQ4F^CFeacQ{e0bG?p5J~*mOvg>zy_C{A4sbf!JT+JK z>9kMi=5@{1To&ILA)1wwVpOJ&%@yfuRwC9cD2`0CmsURi5pr2nYb6oBY&EmL9Gd@i zj{F}h!T*#a<@6mKzogszCSUCq5pxGeCq-w2|M>ZzLft79&A-&!AH~#ER1?Z=ZavC0 z)V05~!^Nl{E5wrkBLnrxLoO|AG&hoOa6AV2{KWL#X*UItj_W`}DEbIUxa;huN0S#` zUtXHi+cPyg-=Gad`2Aw-HWO*;`_&j9B3GHLy(f^@Do@Wu*5{FANC+>M*e6(YAz4k^ zcb_n4oJgrykBM1T!VN(2`&(rNBh+UcE}oL@A~Fj}xf0|qtJK?WzUk{t=M15p!)i7k zM!`qg^o;xR*VM49 zcY_1Yv0?~;V7`h7c&Rj;yapzw2+H%~-AhagWAfI0U`2d7$SXt=@8SEV_hpyni~8B| zmy7w?04R$7leh>WYSu8)oxD`88>7l=AWWJmm9iWfRO z!Aa*kd7^Z-3sEIny|bs9?8<1f)B$Xboi69*|j5E?lMH6PhhFTepWbjvh*7 zJEKyr89j`X>+v6k1O$NS-`gI;mQ(}DQdT*FCIIppRtRJd2|J?qHPGQut66-~F>RWs=TMIYl6K=k7`n1c%*gtLMgJM2|D;Hc|HNidlC>-nKm5q2 zBXyM)6euzXE&_r%C06K*fES5`6h-_u>4PZs^`^{bxR?=s!7Ld0`}aJ?Z6)7x1^ zt3Yi`DVtZ*({C;&E-sJ1W@dK29of-B1lIm)MV4F?HkZ_3t|LrpIuG~IZdWO@(2S6& zB2jA7qiiGi%HO2fU5|yY#aC<57DNc7T%q9L>B_Qh@v#)x(?}*zr1f4C4p8>~v2JFR z8=g|BIpG$W)QEc#GV1A}_(>v&=KTqZbfm)rqdM>}3n%;mv2z*|8%@%u)nQWi>X=%m?>Thn;V**6wQEj#$rU&_?y|xoCLe4=2`e&7P16L7LluN^#&f1#Gsf<{` z>33Bc8LbllJfhhAR?d7*ej*Rty)DHwVG)3$&{XFKdG?O-C=-L9DG$*)_*hQicm`!o zib(R-F%e@mD*&V`$#MCK=$95r$}E<4%o6EHLxM0&K$=;Z#6Ag0Tcl9i+g`$Pcz&tP zgds)TewipwlXh0T)!e~d+ES8zuwFIChK+c4;{!RC4P(|E4$^#0V*HhXG80C;ZD-no z!u+uQ;GCpm^iAW&odDVeo+LJU6qc$4+CJ6b6T&Y^K3(O_bN{@A{&*c6>f6y@EJ+34 zscmnr_m{V`e8HdZ>xs*=g6DK)q2H5Xew?8h;k{)KBl;fO@c_1uRV>l#Xr+^vzgsub zMUo8k!cQ>m1BnO>TQ<)|oBHVATk|}^c&`sg>V5)u-}xK*TOg%E__w<*=|;?? z!WptKGk*fFIEE-G&d8-jh%~oau#B1T9hDK;1a*op&z+MxJbO!Bz8~+V&p-f8KYw!B zIC4g_&BzWI98tBn?!7pt4|{3tm@l+K-O>Jq08C6x(uA)nuJ22n`meK;#J`UK0b>(e z2jhQ{rY;qcOyNJR9qioLiRT51gfXchi2#J*wD3g+AeK>lm_<>4jHCC>*)lfiQzGtl zPjhB%U5c@-(o}k!hiTtqIJQXHiBc8W8yVkYFSuV_I(oJ|U2@*IxKB1*8gJCSs|PS+EIlo~NEbD+RJ^T1 z@{_k(?!kjYU~8W&!;k1=Q+R-PDVW#EYa(xBJ2s8GKOk#QR92^EQ_p-?j2lBlArQgT z0RzL+zbx-Y>6^EYF-3F8`Z*qwIi_-B5ntw#~M}Q)kE% z@aDhS7%)rc#~=3b3TW~c_O8u!RnVEE10YdEBa!5@&)?!J0B{!Sg}Qh$2`7bZR_atZ zV0Nl8TBf4BfJ*2p_Xw+h;rK@{unC5$0%X}1U?=9!fc2j_qu13bL+5_?jg+f$u%)ZbkVg2a`{ZwQCdJhq%STYsK*R*aQKU z=lOv?*JBD5wQvdQIObh!v>HG3T&>vIWiT?@cp$SwbDoV(?STo3x^DR4Yq=9@L5NnN z_C?fdf!HDWyv(?Uw={r`jtv_67bQ5WLFEsf@p!P3pKvnKh_D}X@WTX^xml)D^Sj8Er?RRo2GLWxu`-Bsc ztZ*OU?k$jdB|C6uJtJ#yFm{8!oAQj<0X}2I(9uuw#fiv5bdF$ZBOl@h<#V401H;_` zu5-9V`$k1Mk44+9|F}wIIjra8>7jLUQF|q zIi8JCWez)_hj3aHBMn6(scZd9q#I<3MZzv}Yjc^t_gtGunP?|mAs+s!nGtNlDQ?ZO zgtG2b3s#J8Wh#0z1E|n_(y*F5-s7_LM0Rj3atDhs4HqmZc|?8LDFFu}YWZ}^8D`Yi z`AgJWbQ)dK(Qn?%Z=YDi#f%pLZu_kRnLrC2Qu|V>iD=z=8Y%}YY=g8bb~&dj;h7(T zPhji+7=m2hP~Xw`%Ma7o#?jo#+{IY&YkSeg^os)9>3?ZB z|Bt1-;uj0%|M_9k;#6c+)a)0oA}8+=h^#A_o=QR@jX^|y`YIR9V8ppGX>)FS%X>eB zD&v$!{eebt&-}u8z2t`KZLno>+UPceqXzuZe2u zHYz7U9}_Sw2da@ugQjBJCp(MNp~mVSk>b9nN*8UE`)88xXr88KXWmTa;FKKrd{Zy> zqL}@fo*7-ImF(Ad!5W7Z#;QLsABck0s8aWQohc@PmX3TK#f$`734%ifVd{M!J1;%A z)qjpf=kxPgv5NpUuUyc=C%MzLufCgTEFXQawxJo)rv4xG&{TKfV;V#ggkxefi`{sS zX+NQ8yc>qcdU zUuLM~0x32S& z|NdQ-wE6O{{U-(dCn@}Ty2i=)pJeb-?bP+BGRkLHp&;`Vup!}`pJdth`04rFPy;$a zkU=wWy;P$BMzf+0DM(IbYh`Dk*60l?3LAU;z3I^tHbXtB5H$Op=VEPL8!mydG>$T@S9;?^}mmDK)+x*TCN_Z`%SG{Hv0;P*>(P@^xe2%mUldaqF9$ zG+Oq<5)pQ+V4%%R>bK|~veGY4T&ALmnT@W*I)aT~2(zk>&L9PVG9&;LdC%xAUA`gC4KOGLHiqxbxMTA^!+T*7G;rF z;7ZNc3t&xd!^{e|E(7-FHu@!VrWQ8CB=pP;#jG#yi6(!BfCV(rrY~7D)0vCp_Ra@9 zSuu)to5ArdCAYX}MU&4u6}*{oe=Ipe09Z7|z41Y&lh`olz{lmO>wZpnwx+x4!~7@37|N~@wr=Tqf*+}4H{7GE*BvptMyhTAwu?VYEaj~BiJm7 zQw98FiwJTx0`qY8Y+268mkV#!grHt3S_69w?1TRi-P^2iNv=ajmQIkoX7OkY=Cpvk zs;-Gv?R(YEAb(%@0tNz)_r8bwE zPh75RwYWr?wPZ0rkG<5WwX|fjqCBP4^etDs4{ZF9+|c#@Y60nB)I_U5Z$FYe=SLXI zn}7T@%LLA>*fWf9X?vSD3tpXSEk%H{*`ZmRik>=se}`HWHKL|HHiXovNzTS~-4e?1 zgVLCWv@)(($B*C3rGn`N#nzUyVrSw>OiD;4`i15QHhdicm}A(CP)UO>PO(3!(=v-x zrsKIUCbJMb>=IB}20b{69IdU(vQ%Ti0Zm?VLQoL++HK(G%^P{wuH;|@Cn7Ncybw%D zDhWh??1)6j5j7RbEy-{rVefvMhV|Su8n9`m>4LU^TanMzUIy>S&UbSKJW56C(K5NX z*Ypzh@KaMD=ank_G}Di5SaDTz3@Ze;5$pkK$7Pz?SBj&njRD4so5e0Msp_p}|D8aq zDvU@2s@T_?)?f5XEWS3j_%6%AK-4aXU5!Xzk{fL%mI~AYWP?q}8X}}ZV3ZzKLFvmm zOHWR3OY0l)pZ#y@qGPkjS~mGj&J8uJnU<~+n?qrBTsf>8jN~i17c~Ry=4wM6YrgqZ@h`8`?iL&$8#fYrt7MinX)gEl7Sh_TS zOW{AyVh%SzW|QYBJo8iEVrA!yL(Lm&j6GB0|c?~N{~?Qyj^qjbs>E~lpWo!q!lNwfr(DPZVe zaazh2J{{o=*AQ|Wxz*!pBwYx_9+G$12{5G3V!0F=yB=tPa zEgh47ryFGZc;E%A{m4lJoik6@^k%E0{99pIL1gE;NqT!1dl5UV>RkEWtP)3f_5hG6 zs%M}qX?DNaI+4HN*-wn`HOjlEz0}K{o0fG~_%%c8sDq)6Z2)6msormgjhmtdzv;Hy{BwHXKp&3Bf9paw+J4r-E zBoWmEr6%r3t?F`38eCyr+)`In1&qS9`gcQ|rHBP`LlCl=_x?ck0lISju@hW*d~EQ) zU2sgl#~^(ye%SeZR%gZ=&?1ZxeU1v@44;`}yi^j0*Efg1lIFcC*xEj}Y~k|(I&}7z zXXi2xe>mc_cC`K=v8&-5p%=m=z47Z6HQUzNi5=oCeJ$-Bo#B0=i}CemYbux7I~B*e z3hSneMn$KHNXf4;wr5fkuA+)IzWs8gJ%$o0Q^vfnXQLnABJW;NRN(83Dcbu9dLnvo z6mweq2@yPK%0|R9vT)B$&|S!QO6f(~J^Z+b`G(j1;HKOq_fG$-36zvBI$`hvA94i( zGPGVo&Y%nRsodWyzn0bD0VZlG?=0M23Mc2V1_7>R^3`|z_5B;}JnIp0FI}9XNKJ^o z7xYKOFdYxX?UW~4PC!hVz86aP+dsOkBA(sz3J+6$KL`SU4tRwWnnCQN z&+C92x#?WNBaxf?Q^Q}@QD5rC=@aj8SIg;(QG06k^C5bZFwmiAyFl|qPX^@e2*J%m z1Fu_Jk5oZEB&%YN54Y8;?#l#GYHr->Q>-?72QSIc+Gx^C%;!$ezH>t<=o$&#w*Y_Y7=|PH*+o57yb>b&zpTUQv)0raRzrkL=hA-Z(10vNYDiT487% zzp2zr4ujA#rQ;Hxh7moX(VldzylrhKvPnl9Fb?LCt#|==!=?2aiZ`$Wx*^Lv@5r_ySpQ_vQ{h2_>I`Wd|GjXY?!>=X8v}wmTc+Nqi-?ln zQa28}pDfvjpheaM2>AYDC2x`+&QYH(jGqHDYLi}w55O5^e9s=Ui^hQ~xG*&TU8I}Y zeH~7!$!=a+1_RZe{6G$BICI6R2PKE{gYW8_ss!VY*4uXw8`?o>p=fC>n&DGzxJ$&w zoIxdMA4I503p(>m9*FnFeEJQ5Nd^WK*>I_79(IA)e#hr2qZ8Y!RMcbS}R z(2;{C#FXUv_o-0C=w18S!7fh!MXAN-iF!Oq4^n#Q{ktGsqj0nd~}H&v#Brb}6cd=q75>E;O8p?6a;CR4FiN zxyB?rmw)!Kxrh&7DbPei$lj)r+fDY&=qH+ zKX`VtQ=2fc?BwarW+heGX&C!Qk;F;mEuPC*8 z0Tv0h2v&J#wCU_0q-Wq9SHLOvx@F!QQQN+qN^-r-OgGRYhpu%J-L~SiU7o@0&q6t( zxtimUlrTO)Zk6SnXsm8l$`GW-ZHKNo1a}<%U4Ng z(k8=jTPjoZZ%$(tdr@17t|MV8uhdF4s|HbPO)SF`++T%r=cNRx&$BkW7|$)u%Anm; zGOv)GmwW*J5DzeI8Vk_HZ4v?Mmz$vpL#M%+vyeiW;BK6w|_S0 z{pqGZxI%-~r~b@=F#^|^+pwQE*qc8+b7!b}A$8OjqA%6=i?yI;3BcDP1xU_UVYa?^ z3o-aYI`X%p!w>>cRe_3rtp}@f1d&AQZ_2eeB;1_+9(`jpC22z+w%(kh6G3}Rz&~U_ z5_LxI)7~`nP=ZdVO&`rUP8`b-t^Vqi;Yt~Ckxauk>cj@W0v=E}$00?Jq(sxBcQHKc z(W}uAA*+e%Q)ybLANOe7gb4w^eX#gI%i56{GJz6NVMA{tQ! z3-}Mdjxfy6C#;%_-{5h|d0xP0YQ!qQ^uV*Y&_F9pP!A;qx#0w*)&xPF0?%{;8t+uWA#vrZ|CBD0wz@?M=ge(^#$y< zIEBv1wmL`NKAe&)7@UC9H^t0E0$}Odd>u4cQGdKdlfCn0`goK~uQ0xrP*{VJ*TjR; za16!CM>-msM@KcxU|HsEGgn{v>uy1R?slG}XL5)*rLTNHdYowI*;qe~TZH z|1Ez0TXrc@khWdmgZJKV6+aJVlFsv5z~PhdC>=^tL5BC|3tyMuXSdsEC3L0qw60S>ecX zi&`-rZ=GqxfrH{+JvkuOY?{d?;HZmv z2@4+ep(g+yG6W%NrdJe2%miVnb8nX{yXK>?5DC#GA6IIXU-`!?8+xm(8r)Vi;=?g! zmOK)$jQv~nakv-|`0=Z`-Ir1%2q8~>T7-k=DyG^Rjk7|!y(QO&)cBEKdBrv~E$7_y z&?K!6DP;Qr_0fbbj86^W(4M{lqGx6Mb;`H;>IDqqGG@3I+oZg_)nb=k|ItMkuX2Y@ zYzDmMV~3{y43}y%IT+)nBCIzi^Cr1gEfyrjrQ7gXAmE$4Hj(&CuyWXjDrkV~uP>9T zCX5cXn!1oEjO!P#71iyGh#q+8qrD8)h#wE#x;bz+a^sQyAntO(UhxFVUqR^dux8 zOsN=Nzw5imC7U~@t^#gLo}j#vge3C6o(%0V5<0d~1qlxe4%yD~{EDGzZ40)ZIXytB zg3^NFa(98n#OwV!DJqgy;xitYp)Q(W$(J0<0Xr5DHFYO$zuUkC(4}Zv2uB`O@_TR7 zG3Ehp!K;YLl%2&*oz3`{p|hj`Bzd(@BMVVA2ruucGsD0mj`^a1Qw3WsT7_z)c_<&j zvy(u5yod#@5~XT5KRPqKKp*2Q`rN!6gd#Wdh9;806oaWGi6~pB78)SYEhIYZDo*^} z-93olUg^Vh29G^}wQ8p(BK0(<7R6(8><}Bia@h%62o%ONE`~PiaIdfy!HGUm0GZdJ z&^aK^@JP|8YL`L(zI6Y#c%Q{6*APf`DU#$22PjfSP@T4xKHW~A(vL$pvf+~p{QLdx^j4sUA;?IZ zVWID3OA_VkZ_3?~Yy1yn?4Ev^r}1~c!n9;Z7pRn*D$^J%4QyWNvPkKF5{{bMBefvT zFZu|hco!0Me-__dyLe6S!}>m?I-x%1{Zr3_Qi!(T@)hh%zBE1my2AWl^XY#v%TSX3 z;?rn8Chf+?>SQ|v8gl$*f5dpix{i;?651ezum2tQCU`9sKxuZG2A9o(M~}G`*q2m#iW# z?0fJS+j_XxOk1fb+Nx6$rZqhg!x}eO!3nMy6a@4doqY&?(c`8$^B?0InG4T&{mu*3 zpcYaf)z__Dgr%+6UFYYXSu(oRrPYGviL~FKc{0X%tnt+9slAC|W0F8l^(@8qDXks~ zOZgs?O-6e-12Q>w5d?|E$P&oyah^mqd(Cu#uNtjCpp&F}G&biuW49LGkFCDEYe0S* zo-W_}-yR$%Z^03i8{&R&oU1BbY9$ER3RR5LjocL5er=CclJwCH>M6ge$R*Wi zd3zUoE*~?a1owq&DiT2#_Q)~tr$;Q=BJrMHrG@j3^J=#U3 zmd)ubgUu(9g(qmjx~7+!$9^%~fpi9$*n=+HfX&<>a}qkD;Ky@piqolGdF>VEX?(!DuO z{=7v}0Y|$@o3c`s^K3&3uMD0T1NMMrgwn$+g{=Tr&IHH@S`Aj4zn z{Mpln$!B->uUYTFe+75e!ee*euX`W%xA&g!-%s-YJ-sJP*(~t=44RSN6K5u7}a9;40`KN#fg#N>-s?YE6*qS9zkP2*=!a%O&aJ4>)JR>{O6n)(@ z$2mBny!kLLgnPgrX&!fTVnSXLEY}ZR{fLL4Jw;uI;)DhJJ<;%5&X%lg5)mYwwyHK=W zS`3yPe&Ncy_OA!;HvQV1TI3}7jib>EhqT!PZIoDg_Wm4OraFX|nGmCsXj|{&g!(_; z;(_uG68gxxy{T#wPPuETHggw6G8nCyc`=x89;arkuB%&7rbL&VzCm|jQFg8me78tu z2l-K|IsFgX@am)(c=1IWYX5fhCjIZ&9MBs9(Qg*`U5T`@H2xqzQxj`1bK#2gmDn2=yI!n0*6A2{JuA3~uX7 zsXocdxHHMV^?dsW+s}S8j8Mq!pjB8=NytY%-MEgx+HnavDcotwYmA{J%RzlLhZ{?t-W6 zr-JA(qw%OVMtv?N?75aid-cY`ZJLFT`fh-fZ0()^P(3wyQ`wDHG$9cUmEr^~!;iGV z#ukG&nXeLHarXD$=({)#Es!?%=2*`or!FE4N6XWEo>>`}ocE?kmQb+2JP;-))sn0V zoC6&be>gf!XD#yJO`FCF(Ts|~ zUbO#y44!V-U|&SEr1#r^_fJ1Ql3isjfCVAfvNga7OBJG^YAP`r8d{))?5D{xm+FB~ z*>D&s+(Z(o*)gx|EpJAYlnk@A&=zpkYvak{W~Y}~8M_p7Uu1bY#7m{Mq-#4-xw3lH z{(8=+O+WrU)^C(;qRm%NiKnO+<0W6EF|>n#fw%OKxr!@d%dWHOmv~#M2{eIlxaRW% z;k6v=< zZ{5W}@ik?!__~T?0QX0xX^^}Isw8Ey-yXCwQkS!)xT-ZdV6A`#HdMECf78X){%6)7 znLSKwqK}!hdkVk2QjAZ?j%&Id%WY~^<$ntL2p8J;eq$VCp%Cg{)oW&%Z3vp6ihm9D zIlPC#zVE^>62fNwZqsk)mt+E#rrU@%4vWtkYK)Qv$a*}$T2ZJCtTFI`tuLb*7j`!^eR`?d9h2TjF-h2Yr+ z){T|kWBNyrA5vpZE{Ez_)pG7Zf%QXqW)R@(<_0oOP?cwg&gib`IjKTzN_R*5A)G>_ z1r#qXr5i)U$$wv(kXfodOg=h$UZk78c@50K^wOMcKCx26s{q}vdOioj1n!&if0FRY zSi@$}gn4KW;2<;+lY?&>M6GNrRtfUTEIzqih@yLMQA2(17m3)hLTa@zlj=oHqaCG5 zYg71D3e}v36DjH++<*=MXgd2q&dP^6f&^KctfDe(SQrvy5JXC@BG#|N_^XbfxhcV) z>KV$aMxcL*ISc0|0;+<2ix7U7xq8m48=~j!a`g?SzE5}(Y;hxqEHJg_+qB99$}py7 z*ZPXL?FKLA>0uVicvq3okpoLZE#OG@fv^+k0{35pf`XdVT)1< z#mV4mcikkivZcE(=0rgfv&#+yZJrAOX&VDL(}Zx8@&$yi4Y1kmEK&uL<}ZqWr05mr zcSwaqH=squnLs+UCn@yp#WNQuIv$~B*sN_NAACD>N3k_$E(j~}Uvqda!_ zZcu7UrsR_q-P2YTrg|lijt8kyqL>T@ab#-a7i>%#*eoxFfgx(FoPa(y1nDI{z#Pz^ zfF~)6RBc?#ivEF<@XVD*#9r^r-;*<^(tE%UtWw^oom83;$5d{UoUbmAP(3Z)14YTK zMXQ#mz9yw>*8D^82vL^|%lyo|ZiQPd&{<*wCZI%up=wadl~C~cRJ!=Hjc&F)FNlnd zgNI|iSIMyqh=qV(z+HbldU4}!sqMs1R?t*RV!S*WW>qW_GF4NJ&vb-{2sJjiTIpL; z{bC@V&EhO|>GuDv7`%$kO<-P@^VI+y zl0tXGm|eISy)fiY3m8_Yaz>`Q=B(Yi8EH71{wfM*8ziS3BIju?26ujw==Xh4x5rH71h?Z859IWq(i#9 zLt0wt?(QBsL(q4yCv&g4t0jJvu^@FtJJk`8YXb{{(OdTS%rGxnPR)xY#6=?AWjD5M2n z5GZ@@ulO|JN34J-2y*-Nh@6|?RkFHwSj$e}p}mbc3Y}*el{O31RU0Z_E48@5O~5n;kDJy}a$x&Lc;27DTvAd@s^9>IA@$q{m6K?eZqOJGKpgCT!Zhld>#d^DAK+MDP}|3h zZ{i!ENw;mW62Pq^|FY#w?@8U6Nvjgi(sKW}&uvgjz0YIS>%Sxk1`5 z`qk`C2*bWd|0I4L=_~s(^2F$Bv7OTjo*G+gBD=Rq-~$7t{Bo|mmck(d6ywQ*UbIjkS>qtkH~Zs(sq zEYNB4xxdYmy+G=${gOjGGfSQQLi1D*{&en*3{wyd7U3M)y^FX(+d)eFi?9oMy@64c zwL?!q#*eJ$eayb4lc!B$W%M4B$4dH>9eFXwjfk5U@}6vXOWDiiLMYP3^VYlG$yDjaC({9tyL4NxPb{x=ADdJ7Bl5EHzU6h-Cbke zwi+34LGVF=G%>d5Q7C>n!)%!LT`UZ0v^YN1WrcjC(pS!&vek-SK#kj^EL9!l?TvY% zOkz%!#5Cf^2JFrvNeU5ZL1_aI(M~e4?~kId$T!A@Z$?f40q#~5HuElkRMQV+6r0>J zK9y=%I^m-_xwRNyO<2Zq-0W6!frE$jT$C3Qi3d>0911QPc`Ky6`~Y<)?mMy*u`nz8 z={b()Z;8DqbWJ?MdOsaF6Zn)$d>DQpRHM~bD3cq=Rw_fzWpiwtJFY`BF}hTFCeh+C zs-4A}MCP}`EInNzh3hRoZ6L1a`J7}T&wh9#HItmHBCRwefpQ97*u{--QH=5>MSZud zv_%DacJS+lsxlJ0q=40vs-8P$Q$_Pt)JM=)|1dcFO&JWY8KwhiP$a&Ua*Z z$BTW#lu4QZna#vZECq#Q?Up_(@`0#(@~0?mG{qA#^rZDq^&6T=pbGL8nU?BY-TwKE zPmMqhP_w?q1B~|43T5=Hl(Bi-+{yY;Acv4i9u}oWC+@^i*}l}=dg`Y~E%dTn;rqj5 z&3pLFHjC62jcxW_a@Jj2Ce%eToCB!6OV*6I0!XF9Hq7orpm-RpizSSHx890&_kCQ% z$cKVw-`WnDvv5Lq?L!qGDcUPtgmotX=C`~Smjg&oM5V?}gAzL%WkRwLmNZyrCbKwC zcsUD3O0ruLr%s`B5W)IYjzLTXcAqinas75T_j&1_m!m!^ORvk6_bYvK||DIVE@IUjWQ z0dQ(H9=a-c`@{Q=uj?JC8g`r$a>)gR#=2%vuea5B_BAp;*QX&I;N?>jHYFR=q?8sq zatBJBYX`tr1BQxIgACJ==*ivk$UjW^Maod6-=SzI3MMUbCqu!3wVHt!Be?M@)2aK+$Rv(?iH18-}e+rDznPRv< zi!{-5NNHE)eqVEeYl>F5S{6w^8L$0p7l|M;(^c+Ei|{V7!!8;xiDx@QK4Pl8Iel7N z*9%$ISyQPK_+5tc2c9jhX%sfIOCZf-E%K9X7Z6N0Nvp!~v(KAZvWnaHK^SQSragIF zVIC_7tGTXeU(TRqj?owTmj{SXNtf7;9evoBURMB5R`8R1$@$}FCS%ugA{4igxOhRi z*q_y$&&!mHF1$S}2279&m0^nFxDV#WvV&?Pphq(craPjcBtveg0Nqdm9tXL4lN{t= z?BLepVnp$U5KskjvVX-GjEf=M3mOTZb|Z$Hp*yytey0C^{cH*v>gqF&-j?gcEj4)l)cdGBmB(^HrSe_)qzf z+TZ^Yo4|GWz=Oi3m`r(hV`iZHb_mu63g(JXPMW4p9JhL_(tg+XQnmR0&52UUA|nZI zvjwOx(fNtZ`8!#|4$7GoJPQ`;T?hKOi`^`kFOyX;C4KfC(U-(CX?Qh2!RTe!4raMP zjLaC7qL_tJ?^0!T9ibZe!m-x!u7o%2dHK{uYZ~#+vERAv-G-MQeYQ*~DILuFpu02u z(Qc)=bHqb4{fs+hdKa5etlX z3EW#vlbEZmWT>X{3WbgW)8~u=8IGuRc<=?KoDXg5V`jf%i^Ai`Cd9=&FH6d|N9uJl z>QhxtW_{}H10BF}GQNitk~V=GnB%NI1Xv-6-OeaI&Amg0s{4i4;HhP$6oc(L-}yHt zej63({`5VLSoIef7D3Z9BA5x<9$^x?PhV=6A@Nu=QiJo@*o?M@*6-UA@EdV@bQCR< z9>{N%eK;Y#U-@XDBBCT^j=?<|y|lsAWrXsf`t%4VT{)63oxQe^u_5NuOq{rsrRd}Z zOx&OldRtR4leEX#r$9`gPJtbHccH!JgZK&3x`tJ<_{kv)E?$LhZ?brv`Cc}X%cWC7<@6yqM2O&m(rB`1v-TiqcQmA5n$rbGJ4zs({=R-I%6}*^UQ)wi9WuzW%Ri%&5 zTdd%>+GvADk+4q#3s5qne99`MC)X_#=p1!d?(mcKDW=Efc31Jso)9M49O0OMeP&7~ zIm!vorpxBSbvSiczr^?WP&e&-!3GLxCIaR5?PGeLgwYT;lYu9UE8SwmXR(D?A^s`7 z^F4di(+oHh%$DZjj7F3_-Y9}k^uCKeSC?Jd7h>RZIDZ{wcbh|9w4)p$dmv7|gX1n& zkrYjSso~;~qMMzZUQ5AC+GUvuj@y{4E&&v(+OE-rS^J7iE~Yz1 zCQ9hAI&0X2_H8CKZMqo00MsxtwjvM{`AdSaZ8#Y?5zPI;a+0`JF52!uVwr@5Ufctm zm;5G%gI&utfGa~fv6!jHh9d1r3TYD zEOlrbyFnDl5J%sEO>HErK~WWE6I$_eXp!dbphDf zc;~oWDQylVa=y?q;c>SKzvZ~R(ZE2csFwf@10@zaZxFAYWaV9TFMh(QuqxNhPUav~ zzCkoe8-lM{?vh}kdM6EMCH(eLK3Rt{HsEJ+4fve=xAVq(cUc9fO9g1%zI+QfFOb@0 zePFU(&?Np9w3&xs)ZwPnQniC0%xs8(Hyx{7*Ot51*`9&2^h7@!nmzuF`3pl8ep#Ls z<)nk7ts}`9tGgaVJWC-3w;B~$juY6m+7XgfzjR4I=oV}E9LRGf4@cI>d3z%CYyURI z7lRn11g!D34zI6|26>?CELeIh?cEv_GCCMd5&g<=9-)pe8iXINQ}4IljYsQyfRz|( z<%w=HN4ZOQKJ9e7DOUhjA7A%-xcR%2`@1?U&u}rvqNc_8l9dUT_S`4TKJ;yezIdp} z?qDAfx6IHQ7YlO;EAP%d4U2O7jU`Uh(um!J`hJ_3&mmQez8AqWLQEftYJuMdCj27t zoV#b!c0d8al0j1yveY6)U#kPCh%OfL>P=%WE^LQew^k-QqZ{rjX6PqOd2K7>1^VUB z`&H@+vW=wH0UY>88nXCH@RKCY&?bR%8-53b{;@>|;uzDd5f`Z% zaSC<8OLh|b@ZnBET?My38fV9~ku2cPfcWZl7nW|pkQKfFlp@xRt+K0Tj@gdvVAQXP z?i45RNE4W#Kf0%Pp2=?hESkG}EK557cwn0r1{uWeG53_tb!9bg&R8R_d4s5N0poc- zr>1g0W~1oha&#@_irbqnL)jJ@Z=y7J3fCQ@qlr{6(%rSs2rpkS1QIU^tieJ-xq%nd ze-C=#{@E+Kzb&SJ2KM~9q^4Yk^jyXa#{;P)y`YsFvfzX?%V~r6GciP4eX~$vk{-C? zeipAYsMSp`Z~&-Jc*dt}m-A_w&cnb#~sIdbU{uCayd>nWKDxQ9!%R zTrgS~+>TqXgrN~e2&eeWdPhuHP2*#K1=f^B@UGZBjFq- z;mtKYyul9ZNuq89XEoeSg7^qld5^R}FHpbyRyk1pRPMDO$_Kqi*sp1hk&UpUKc!V! zJZpCQc!)@X+%qOQMP)CU@Qe|=IG@|DZ~o#j>TBFQxH>8rJ#0y`XO9ukvc)kJ6LY3$ zY}{(tri#32!LjVY^exC3Ky)i$NY6v^*>X5y8F65pYYjt^T^X<=zm=)Cr=>dcId>?I zR^0I?)=)|}ak7wG)&Ar#A&60BRp}&NWFPy7zt)yl3aObS?sB8fxfU9ayR{$#%S<#3 zrsbmi#bDSP)@w%iYS%&wyyIB??LJ0Q%aD^!XXYk3)tQt~x_YU?y4KVKl{MJ)KSz&f zV;tJ1smY(dLM6zZXVAWND3L|(W=q~HjA6OkjQ+kx-EuqtaaQQPaa=2_wwuW@G*1>e z_TqB;+1@yuHg}YYpEJL&Sw~jD3Xeb(Wo(-nz6`#gbP7?agYT>j_R%+^h{1>7W&cP{s8epLY9Ky6mU*u*!QBn zI7T~WL-_qj+~Hdpr}qtfjZmD;eI%H0SP~~ifqoD59-q)R9_Z zKr6OeoZT!Za#k5yo&CCmzLbGP*6ggJ@2QPhIY^aMXjVjQ@D+-E#qmAjuL{o@NCUDF zFy)B~$j`rK7Iz$L>_Jl~O?IJu2P3 zlHQ@${Jgcvp`PKu7p;6Fr=4y1?8nJ;=~jls^gx4&_O4+)C-OGc5)L0+R!&uI&qQID zhV&ZQ@+2={Z|2F%WoOu9Ljt}|0r;!e zCBx(uAViqOffibUBOVEH_IlV=57ZQSQ~Te5(wmsO+o_CCNAgCJzZ3ly84J34_Zf#SwQ9q8i41 zE>u$JuO$kQq*W6MDo$Eu?3jJAFUt&>Qy#K{lT-Vx z6=kceU^v`;vBRoFxQED5TL+=>QJ!iaxV^Z2r#%CaaEWgbs1ysT$&~sem&74AEC!;< zcGDH;CENBJ&hfI!@G5ezCK!sXzdB@m#a(q8KeX;U=yl6AujNz z{}huJlo1yL$DlAsi{12aS?CJ*{xuIIV4wf-V6E?L4E!5BWMQ0Zh4uel*xZJ}QQuPE z-u#DdD6hH6`;nVJ>O}8iuWxH>Z2vc>a;iFbm)nrbj$ps$6aa4TjfVZVZr7dK+E_E# z+S`ErJDM9i{HX815lax33Wl(;H~m|sF28cs+hB$%2pjyXgubo5p_%ay3!*?212bxX z@1{$rzY6~DK*{`5@oRm0>(9INQX61!{Ip#NymIM*g~u=D)UFH!NcfQ(AsZXVOPv5) zX?=4bI9>9;>HvTACiBNDt)x;_}tsJousTuWrG- zDUSM9|4|IRSy@PhdB$sAk4b;vRr>Nt@t3OB<#_*dl_7P>FGcFF3-DA?KBW00A<;2=*&`^P8}cEZW!GSO9(+{;-V@ zd%%C8KEDYD$pC#x%zb4bfVJ|kgWcG0-UNZT9@2=R|Wz+H2iJ2A29LV z#Dye7Qn~^KUqOIS)8EGZC9w+k*Sq|}?ze$| zKpJrq7cvL=dV^7%ejE4Cn@aE>Q}b^ELnd#EUUf703IedX{*S;n6P|BELgooxW`$lE z2;lhae}w#VCPR>N+{A=T+qyn;-Jk!Dn2`C1H{l?&Wv&mW{)_(?+|T+JGMPf)s$;=d z5J27Mw}F4!tB`@`mkAnI1_G4%{WjW<(=~4PFy#B)>ubz@;O|2J^F9yq(EB<9e9})4 z{&vv)&j^s`f|tKquM7lG$@pD_AFY;q=hx31Z;lY;$;aa>NbnT| kh{^d0>dn0}#6IV5TMroUdkH8gdhnkj_&0LYo6ArC2O!h?t^fc4 diff --git a/flyway/flyway-callbacks/.mvn/wrapper/maven-wrapper.properties b/flyway/flyway-callbacks/.mvn/wrapper/maven-wrapper.properties deleted file mode 100644 index 9dda3b659b..0000000000 --- a/flyway/flyway-callbacks/.mvn/wrapper/maven-wrapper.properties +++ /dev/null @@ -1 +0,0 @@ -distributionUrl=https://repo1.maven.org/maven2/org/apache/maven/apache-maven/3.5.2/apache-maven-3.5.2-bin.zip diff --git a/flyway/flyway-callbacks/mvnw b/flyway/flyway-callbacks/mvnw deleted file mode 100644 index 5bf251c077..0000000000 --- a/flyway/flyway-callbacks/mvnw +++ /dev/null @@ -1,225 +0,0 @@ -#!/bin/sh -# ---------------------------------------------------------------------------- -# Licensed to the Apache Software Foundation (ASF) under one -# or more contributor license agreements. See the NOTICE file -# distributed with this work for additional information -# regarding copyright ownership. The ASF licenses this file -# to you under the Apache License, Version 2.0 (the -# "License"); you may not use this file except in compliance -# with the License. You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, -# software distributed under the License is distributed on an -# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY -# KIND, either express or implied. See the License for the -# specific language governing permissions and limitations -# under the License. -# ---------------------------------------------------------------------------- - -# ---------------------------------------------------------------------------- -# Maven2 Start Up Batch script -# -# Required ENV vars: -# ------------------ -# JAVA_HOME - location of a JDK home dir -# -# Optional ENV vars -# ----------------- -# M2_HOME - location of maven2's installed home dir -# MAVEN_OPTS - parameters passed to the Java VM when running Maven -# e.g. to debug Maven itself, use -# set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000 -# MAVEN_SKIP_RC - flag to disable loading of mavenrc files -# ---------------------------------------------------------------------------- - -if [ -z "$MAVEN_SKIP_RC" ] ; then - - if [ -f /etc/mavenrc ] ; then - . /etc/mavenrc - fi - - if [ -f "$HOME/.mavenrc" ] ; then - . "$HOME/.mavenrc" - fi - -fi - -# OS specific support. $var _must_ be set to either true or false. -cygwin=false; -darwin=false; -mingw=false -case "`uname`" in - CYGWIN*) cygwin=true ;; - MINGW*) mingw=true;; - Darwin*) darwin=true - # Use /usr/libexec/java_home if available, otherwise fall back to /Library/Java/Home - # See https://developer.apple.com/library/mac/qa/qa1170/_index.html - if [ -z "$JAVA_HOME" ]; then - if [ -x "/usr/libexec/java_home" ]; then - export JAVA_HOME="`/usr/libexec/java_home`" - else - export JAVA_HOME="/Library/Java/Home" - fi - fi - ;; -esac - -if [ -z "$JAVA_HOME" ] ; then - if [ -r /etc/gentoo-release ] ; then - JAVA_HOME=`java-config --jre-home` - fi -fi - -if [ -z "$M2_HOME" ] ; then - ## resolve links - $0 may be a link to maven's home - PRG="$0" - - # need this for relative symlinks - while [ -h "$PRG" ] ; do - ls=`ls -ld "$PRG"` - link=`expr "$ls" : '.*-> \(.*\)$'` - if expr "$link" : '/.*' > /dev/null; then - PRG="$link" - else - PRG="`dirname "$PRG"`/$link" - fi - done - - saveddir=`pwd` - - M2_HOME=`dirname "$PRG"`/.. - - # make it fully qualified - M2_HOME=`cd "$M2_HOME" && pwd` - - cd "$saveddir" - # echo Using m2 at $M2_HOME -fi - -# For Cygwin, ensure paths are in UNIX format before anything is touched -if $cygwin ; then - [ -n "$M2_HOME" ] && - M2_HOME=`cygpath --unix "$M2_HOME"` - [ -n "$JAVA_HOME" ] && - JAVA_HOME=`cygpath --unix "$JAVA_HOME"` - [ -n "$CLASSPATH" ] && - CLASSPATH=`cygpath --path --unix "$CLASSPATH"` -fi - -# For Migwn, ensure paths are in UNIX format before anything is touched -if $mingw ; then - [ -n "$M2_HOME" ] && - M2_HOME="`(cd "$M2_HOME"; pwd)`" - [ -n "$JAVA_HOME" ] && - JAVA_HOME="`(cd "$JAVA_HOME"; pwd)`" - # TODO classpath? -fi - -if [ -z "$JAVA_HOME" ]; then - javaExecutable="`which javac`" - if [ -n "$javaExecutable" ] && ! [ "`expr \"$javaExecutable\" : '\([^ ]*\)'`" = "no" ]; then - # readlink(1) is not available as standard on Solaris 10. - readLink=`which readlink` - if [ ! `expr "$readLink" : '\([^ ]*\)'` = "no" ]; then - if $darwin ; then - javaHome="`dirname \"$javaExecutable\"`" - javaExecutable="`cd \"$javaHome\" && pwd -P`/javac" - else - javaExecutable="`readlink -f \"$javaExecutable\"`" - fi - javaHome="`dirname \"$javaExecutable\"`" - javaHome=`expr "$javaHome" : '\(.*\)/bin'` - JAVA_HOME="$javaHome" - export JAVA_HOME - fi - fi -fi - -if [ -z "$JAVACMD" ] ; then - if [ -n "$JAVA_HOME" ] ; then - if [ -x "$JAVA_HOME/jre/sh/java" ] ; then - # IBM's JDK on AIX uses strange locations for the executables - JAVACMD="$JAVA_HOME/jre/sh/java" - else - JAVACMD="$JAVA_HOME/bin/java" - fi - else - JAVACMD="`which java`" - fi -fi - -if [ ! -x "$JAVACMD" ] ; then - echo "Error: JAVA_HOME is not defined correctly." >&2 - echo " We cannot execute $JAVACMD" >&2 - exit 1 -fi - -if [ -z "$JAVA_HOME" ] ; then - echo "Warning: JAVA_HOME environment variable is not set." -fi - -CLASSWORLDS_LAUNCHER=org.codehaus.plexus.classworlds.launcher.Launcher - -# traverses directory structure from process work directory to filesystem root -# first directory with .mvn subdirectory is considered project base directory -find_maven_basedir() { - - if [ -z "$1" ] - then - echo "Path not specified to find_maven_basedir" - return 1 - fi - - basedir="$1" - wdir="$1" - while [ "$wdir" != '/' ] ; do - if [ -d "$wdir"/.mvn ] ; then - basedir=$wdir - break - fi - # workaround for JBEAP-8937 (on Solaris 10/Sparc) - if [ -d "${wdir}" ]; then - wdir=`cd "$wdir/.."; pwd` - fi - # end of workaround - done - echo "${basedir}" -} - -# concatenates all lines of a file -concat_lines() { - if [ -f "$1" ]; then - echo "$(tr -s '\n' ' ' < "$1")" - fi -} - -BASE_DIR=`find_maven_basedir "$(pwd)"` -if [ -z "$BASE_DIR" ]; then - exit 1; -fi - -export MAVEN_PROJECTBASEDIR=${MAVEN_BASEDIR:-"$BASE_DIR"} -echo $MAVEN_PROJECTBASEDIR -MAVEN_OPTS="$(concat_lines "$MAVEN_PROJECTBASEDIR/.mvn/jvm.config") $MAVEN_OPTS" - -# For Cygwin, switch paths to Windows format before running java -if $cygwin; then - [ -n "$M2_HOME" ] && - M2_HOME=`cygpath --path --windows "$M2_HOME"` - [ -n "$JAVA_HOME" ] && - JAVA_HOME=`cygpath --path --windows "$JAVA_HOME"` - [ -n "$CLASSPATH" ] && - CLASSPATH=`cygpath --path --windows "$CLASSPATH"` - [ -n "$MAVEN_PROJECTBASEDIR" ] && - MAVEN_PROJECTBASEDIR=`cygpath --path --windows "$MAVEN_PROJECTBASEDIR"` -fi - -WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain - -exec "$JAVACMD" \ - $MAVEN_OPTS \ - -classpath "$MAVEN_PROJECTBASEDIR/.mvn/wrapper/maven-wrapper.jar" \ - "-Dmaven.home=${M2_HOME}" "-Dmaven.multiModuleProjectDirectory=${MAVEN_PROJECTBASEDIR}" \ - ${WRAPPER_LAUNCHER} $MAVEN_CONFIG "$@" diff --git a/flyway/flyway-callbacks/mvnw.cmd b/flyway/flyway-callbacks/mvnw.cmd deleted file mode 100644 index 019bd74d76..0000000000 --- a/flyway/flyway-callbacks/mvnw.cmd +++ /dev/null @@ -1,143 +0,0 @@ -@REM ---------------------------------------------------------------------------- -@REM Licensed to the Apache Software Foundation (ASF) under one -@REM or more contributor license agreements. See the NOTICE file -@REM distributed with this work for additional information -@REM regarding copyright ownership. The ASF licenses this file -@REM to you under the Apache License, Version 2.0 (the -@REM "License"); you may not use this file except in compliance -@REM with the License. You may obtain a copy of the License at -@REM -@REM http://www.apache.org/licenses/LICENSE-2.0 -@REM -@REM Unless required by applicable law or agreed to in writing, -@REM software distributed under the License is distributed on an -@REM "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY -@REM KIND, either express or implied. See the License for the -@REM specific language governing permissions and limitations -@REM under the License. -@REM ---------------------------------------------------------------------------- - -@REM ---------------------------------------------------------------------------- -@REM Maven2 Start Up Batch script -@REM -@REM Required ENV vars: -@REM JAVA_HOME - location of a JDK home dir -@REM -@REM Optional ENV vars -@REM M2_HOME - location of maven2's installed home dir -@REM MAVEN_BATCH_ECHO - set to 'on' to enable the echoing of the batch commands -@REM MAVEN_BATCH_PAUSE - set to 'on' to wait for a key stroke before ending -@REM MAVEN_OPTS - parameters passed to the Java VM when running Maven -@REM e.g. to debug Maven itself, use -@REM set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000 -@REM MAVEN_SKIP_RC - flag to disable loading of mavenrc files -@REM ---------------------------------------------------------------------------- - -@REM Begin all REM lines with '@' in case MAVEN_BATCH_ECHO is 'on' -@echo off -@REM enable echoing my setting MAVEN_BATCH_ECHO to 'on' -@if "%MAVEN_BATCH_ECHO%" == "on" echo %MAVEN_BATCH_ECHO% - -@REM set %HOME% to equivalent of $HOME -if "%HOME%" == "" (set "HOME=%HOMEDRIVE%%HOMEPATH%") - -@REM Execute a user defined script before this one -if not "%MAVEN_SKIP_RC%" == "" goto skipRcPre -@REM check for pre script, once with legacy .bat ending and once with .cmd ending -if exist "%HOME%\mavenrc_pre.bat" call "%HOME%\mavenrc_pre.bat" -if exist "%HOME%\mavenrc_pre.cmd" call "%HOME%\mavenrc_pre.cmd" -:skipRcPre - -@setlocal - -set ERROR_CODE=0 - -@REM To isolate internal variables from possible post scripts, we use another setlocal -@setlocal - -@REM ==== START VALIDATION ==== -if not "%JAVA_HOME%" == "" goto OkJHome - -echo. -echo Error: JAVA_HOME not found in your environment. >&2 -echo Please set the JAVA_HOME variable in your environment to match the >&2 -echo location of your Java installation. >&2 -echo. -goto error - -:OkJHome -if exist "%JAVA_HOME%\bin\java.exe" goto init - -echo. -echo Error: JAVA_HOME is set to an invalid directory. >&2 -echo JAVA_HOME = "%JAVA_HOME%" >&2 -echo Please set the JAVA_HOME variable in your environment to match the >&2 -echo location of your Java installation. >&2 -echo. -goto error - -@REM ==== END VALIDATION ==== - -:init - -@REM Find the project base dir, i.e. the directory that contains the folder ".mvn". -@REM Fallback to current working directory if not found. - -set MAVEN_PROJECTBASEDIR=%MAVEN_BASEDIR% -IF NOT "%MAVEN_PROJECTBASEDIR%"=="" goto endDetectBaseDir - -set EXEC_DIR=%CD% -set WDIR=%EXEC_DIR% -:findBaseDir -IF EXIST "%WDIR%"\.mvn goto baseDirFound -cd .. -IF "%WDIR%"=="%CD%" goto baseDirNotFound -set WDIR=%CD% -goto findBaseDir - -:baseDirFound -set MAVEN_PROJECTBASEDIR=%WDIR% -cd "%EXEC_DIR%" -goto endDetectBaseDir - -:baseDirNotFound -set MAVEN_PROJECTBASEDIR=%EXEC_DIR% -cd "%EXEC_DIR%" - -:endDetectBaseDir - -IF NOT EXIST "%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config" goto endReadAdditionalConfig - -@setlocal EnableExtensions EnableDelayedExpansion -for /F "usebackq delims=" %%a in ("%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config") do set JVM_CONFIG_MAVEN_PROPS=!JVM_CONFIG_MAVEN_PROPS! %%a -@endlocal & set JVM_CONFIG_MAVEN_PROPS=%JVM_CONFIG_MAVEN_PROPS% - -:endReadAdditionalConfig - -SET MAVEN_JAVA_EXE="%JAVA_HOME%\bin\java.exe" - -set WRAPPER_JAR="%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.jar" -set WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain - -%MAVEN_JAVA_EXE% %JVM_CONFIG_MAVEN_PROPS% %MAVEN_OPTS% %MAVEN_DEBUG_OPTS% -classpath %WRAPPER_JAR% "-Dmaven.multiModuleProjectDirectory=%MAVEN_PROJECTBASEDIR%" %WRAPPER_LAUNCHER% %MAVEN_CONFIG% %* -if ERRORLEVEL 1 goto error -goto end - -:error -set ERROR_CODE=1 - -:end -@endlocal & set ERROR_CODE=%ERROR_CODE% - -if not "%MAVEN_SKIP_RC%" == "" goto skipRcPost -@REM check for post script, once with legacy .bat ending and once with .cmd ending -if exist "%HOME%\mavenrc_post.bat" call "%HOME%\mavenrc_post.bat" -if exist "%HOME%\mavenrc_post.cmd" call "%HOME%\mavenrc_post.cmd" -:skipRcPost - -@REM pause the script if MAVEN_BATCH_PAUSE is set to 'on' -if "%MAVEN_BATCH_PAUSE%" == "on" pause - -if "%MAVEN_TERMINATE_CMD%" == "on" exit %ERROR_CODE% - -exit /B %ERROR_CODE% From 171d28a9d17c8bbb5576b78fe13773624a3e1aad Mon Sep 17 00:00:00 2001 From: ocheja Date: Fri, 15 Dec 2017 07:06:41 +0900 Subject: [PATCH 211/236] Remove verbose file info content (#3238) * Define beans for handling different message types in a lean chat app * Add class based spring beans configuration * Define spring configuration in XML for constructor based bean injection * Refactor package structure to separate constructor based bean injection code set from setter based bean injection code set * Define configuration and classes specific to setter-based bean injection. * Implement tests for constructor-based and setter-based bean injections * develop codes for explaining type erasure * Write unit tests for type erasure examples * Remove evaluation article code * Modify type erasure examples and unit tests * Modify type erasure examples and unit tests * Add expected exception in TypeErasureUnitTest * Correct grammar in class name * Implement File Manager app to demonstrate Polymorphism. Develop unit tests for Polymorphism article code * Add examples for static polymorphism * Change sysout statments to slf4j log info statements * Add assertions and expected errors check on Test * Add assertions and expected errors check on Test * Correct compile time error of symbol not found * Removed commented out non-compiling test. * Replace string concatenations with String.format * Replace string concatenations with String.format * Remove verbose file info descriptor and replace with simpler one --- .../src/main/java/com/baeldung/polymorphism/GenericFile.java | 2 +- .../src/main/java/com/baeldung/polymorphism/ImageFile.java | 2 +- core-java/src/main/java/com/baeldung/polymorphism/TextFile.java | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/core-java/src/main/java/com/baeldung/polymorphism/GenericFile.java b/core-java/src/main/java/com/baeldung/polymorphism/GenericFile.java index 03e704f36f..85acbc5be0 100644 --- a/core-java/src/main/java/com/baeldung/polymorphism/GenericFile.java +++ b/core-java/src/main/java/com/baeldung/polymorphism/GenericFile.java @@ -54,7 +54,7 @@ public class GenericFile { } public String getFileInfo() { - return String.format("File Name: %s\n" + " Extension: %s\n" + " Date Created: %s\n" + " Version: %s\n", this.getName(), this.getExtension(), this.getDateCreated(), this.getVersion()); + return "Generic File Impl"; } public Object read() { diff --git a/core-java/src/main/java/com/baeldung/polymorphism/ImageFile.java b/core-java/src/main/java/com/baeldung/polymorphism/ImageFile.java index e237f3f826..54eb24af5e 100644 --- a/core-java/src/main/java/com/baeldung/polymorphism/ImageFile.java +++ b/core-java/src/main/java/com/baeldung/polymorphism/ImageFile.java @@ -30,7 +30,7 @@ public class ImageFile extends GenericFile { } public String getFileInfo() { - return String.format(" %s Height: %d\n Width: %d", super.getFileInfo(), this.getHeight(), this.getWidth()); + return "Image File Impl"; } public String read() { diff --git a/core-java/src/main/java/com/baeldung/polymorphism/TextFile.java b/core-java/src/main/java/com/baeldung/polymorphism/TextFile.java index 2c28c968b8..0103291c5a 100644 --- a/core-java/src/main/java/com/baeldung/polymorphism/TextFile.java +++ b/core-java/src/main/java/com/baeldung/polymorphism/TextFile.java @@ -21,7 +21,7 @@ public class TextFile extends GenericFile { } public String getFileInfo() { - return String.format(" %s Word Count: %d", super.getFileInfo(), wordCount); + return "Text File Impl"; } public String read() { From ae109dfb7cf220cc1deffb010a226bf55acc81f7 Mon Sep 17 00:00:00 2001 From: Jose Bob Santos Jr Date: Fri, 15 Dec 2017 09:50:51 +0800 Subject: [PATCH 212/236] BAEL-1330 Primitive Type Streams in Java 8 (#3106) * initial commit for first article evaluation * fixed compilation error * removed final keywords for compliance * added unit tests and refactored as needed * refactored application-context.xml to use self-closing tags * renamed tests to use UnitTest suffix * removed unnecessary annotation * added code samples for primitive streams * removed sample code and tests for evaluation article * renamed unit test to proper unit test naming * added a test to show boxed method * added the assertion to the test fox boxed * changed mapToInt test to use Arrays.asList instead of a POJO as per Grzegorz and Eugen --- .../com/baeldung/stream/PrimitiveStreams.java | 23 +++++ .../stream/PrimitiveStreamsUnitTest.java | 97 +++++++++++++++++++ 2 files changed, 120 insertions(+) create mode 100644 core-java-8/src/main/java/com/baeldung/stream/PrimitiveStreams.java create mode 100644 core-java-8/src/test/java/com/baeldung/stream/PrimitiveStreamsUnitTest.java diff --git a/core-java-8/src/main/java/com/baeldung/stream/PrimitiveStreams.java b/core-java-8/src/main/java/com/baeldung/stream/PrimitiveStreams.java new file mode 100644 index 0000000000..b0afb65a35 --- /dev/null +++ b/core-java-8/src/main/java/com/baeldung/stream/PrimitiveStreams.java @@ -0,0 +1,23 @@ +package com.baeldung.stream; + +import java.util.Arrays; +import java.util.stream.IntStream; + +class PrimitiveStreams { + + int min(int[] integers) { + return Arrays.stream(integers).min().getAsInt(); + } + + int max(int... integers) { + return IntStream.of(integers).max().getAsInt(); + } + + int sum(int... integers) { + return IntStream.of(integers).sum(); + } + + double avg(int... integers) { + return IntStream.of(integers).average().getAsDouble(); + } +} diff --git a/core-java-8/src/test/java/com/baeldung/stream/PrimitiveStreamsUnitTest.java b/core-java-8/src/test/java/com/baeldung/stream/PrimitiveStreamsUnitTest.java new file mode 100644 index 0000000000..75078d75bc --- /dev/null +++ b/core-java-8/src/test/java/com/baeldung/stream/PrimitiveStreamsUnitTest.java @@ -0,0 +1,97 @@ +package com.baeldung.stream; + +import org.junit.Test; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.stream.Collectors; +import java.util.stream.IntStream; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertTrue; + +public class PrimitiveStreamsUnitTest { + + private PrimitiveStreams streams = new PrimitiveStreams(); + + @Test + public void givenAnArrayOfIntegersWhenMinIsCalledThenCorrectMinIsReturned() { + int[] integers = new int[] {20, 98, 12, 7, 35}; + int min = streams.min(integers); // returns 7 + + assertEquals(7, min); + } + + @Test + public void givenAnArrayOfIntegersWhenMaxIsCalledThenCorrectMaxIsReturned() { + int max = streams.max(20, 98, 12, 7, 35); + + assertEquals(98, max); + } + + @Test + public void givenAnArrayOfIntegersWhenSumIsCalledThenCorrectSumIsReturned() { + int sum = streams.sum(20, 98, 12, 7, 35); + + assertEquals(172, sum); + } + + @Test + public void givenAnArrayOfIntegersWhenAvgIsCalledThenCorrectAvgIsReturned() { + double avg = streams.avg(20, 98, 12, 7, 35); + + assertTrue(34.4 == avg); + } + + @Test + public void givenARangeOfIntegersWhenIntStreamSumIsCalledThenCorrectSumIsReturned() { + int sum = IntStream.range(1, 10).sum(); + + assertEquals(45, sum); + } + + @Test + public void givenARangeClosedOfIntegersWhenIntStreamSumIsCalledThenCorrectSumIsReturned() { + int sum = IntStream.rangeClosed(1, 10).sum(); + + assertEquals(55, sum); + } + + @Test + public void givenARangeWhenForEachIsCalledThenTheIndicesWillBePrinted() { + IntStream.rangeClosed(1, 5).parallel().forEach(System.out::println); + } + + @Test + public void givenAnArrayWhenSumIsCalledThenTheCorrectSumIsReturned() { + + int sum = Arrays.asList(33,45).stream().mapToInt(a -> a).sum(); + + assertEquals(78, sum); + } + + @Test + public void givenAnIntStreamThenGetTheEvenIntegers() { + List evenInts = IntStream.rangeClosed(1, 10) + .filter(i -> i % 2 == 0) + .boxed() + .collect(Collectors.toList()); + + List expected = IntStream.of(2, 4, 6, 8, 10).boxed().collect(Collectors.toList()); + + assertEquals(expected, evenInts); + } + + class Person { + private int age; + + Person(int age) { + this.age = age; + } + + int getAge() { + return age; + } + } +} \ No newline at end of file From 6809155a9195fa539071f3593f3c304ec89cfe89 Mon Sep 17 00:00:00 2001 From: ericgoebelbecker <@592Gbetz> Date: Fri, 15 Dec 2017 13:19:43 -0500 Subject: [PATCH 213/236] BAEL-1374 - same search in each loop. --- .../main/java/com/baeldung/array/SearchArrayTest.java | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/core-java/src/main/java/com/baeldung/array/SearchArrayTest.java b/core-java/src/main/java/com/baeldung/array/SearchArrayTest.java index 8b44138b32..345e1d48f3 100644 --- a/core-java/src/main/java/com/baeldung/array/SearchArrayTest.java +++ b/core-java/src/main/java/com/baeldung/array/SearchArrayTest.java @@ -26,7 +26,7 @@ public class SearchArrayTest { int count = 1000; String[] strings = seedArray(count); for (int i = 0; i < count; i++) { - searchList(strings, "W"); + searchList(strings, "T"); } } @@ -37,7 +37,7 @@ public class SearchArrayTest { int count = 1000; String[] strings = seedArray(count); for (int i = 0; i < count; i++) { - searchSet(strings, "S"); + searchSet(strings, "T"); } } @@ -51,7 +51,7 @@ public class SearchArrayTest { List asList = Arrays.asList(strings); for (int i = 0; i < count; i++) { - asList.contains("W"); + asList.contains("T"); } } @@ -63,7 +63,7 @@ public class SearchArrayTest { String[] strings = seedArray(count); Set asSet = new HashSet<>(Arrays.asList(strings)); for (int i = 0; i < count; i++) { - asSet.contains("S"); + asSet.contains("T"); } } @@ -77,7 +77,7 @@ public class SearchArrayTest { long startTime = System.nanoTime(); for (int i = 0; i < count; i++) { - Arrays.binarySearch(strings, "A"); + Arrays.binarySearch(strings, "T"); } long duration = System.nanoTime() - startTime; //System.out.println("Binary search: " + duration / 10000); From 15bc3244303470a77481cf338ce3c73f2557475e Mon Sep 17 00:00:00 2001 From: Marcos Date: Fri, 15 Dec 2017 20:26:16 +0100 Subject: [PATCH 214/236] binary tree changed to follow a recursive approach --- .../java/com/baeldung/tree/BinaryTree.java | 185 +++++++++--------- 1 file changed, 94 insertions(+), 91 deletions(-) diff --git a/core-java/src/main/java/com/baeldung/tree/BinaryTree.java b/core-java/src/main/java/com/baeldung/tree/BinaryTree.java index 3cc496e348..0b917ed452 100644 --- a/core-java/src/main/java/com/baeldung/tree/BinaryTree.java +++ b/core-java/src/main/java/com/baeldung/tree/BinaryTree.java @@ -16,29 +16,23 @@ public class BinaryTree { return; } - Node parent = root; - Node current = root; + addRecursive(root, value); + } - while (true) { + private Node addRecursive(Node current, int value) { - if (newNode.value < parent.value) { - current = parent.left; - - if (current == null) { - parent.left = newNode; - break; - } - } else { - current = parent.right; - - if (current == null) { - parent.right = newNode; - break; - } - } - - parent = current; + if (current == null) { + return new Node(value); } + + if (value < current.value) { + current.left = addRecursive(current.left, value); + } else { + current.right = addRecursive(current.right, value); + } + + return current; + } public boolean isEmpty() { @@ -46,115 +40,107 @@ public class BinaryTree { } public boolean containsNode(int value) { + return containsNodeRecursive(root, value); + } - Node current = root; - - while (current != null) { - - if (value == current.value) { - return true; - } - - if (value < current.value) { - current = current.left; - } else { - current = current.right; - } + private boolean containsNodeRecursive(Node current, int value) { + if (current == null) { + return false; + } else if (value == current.value) { + return true; + } else if (value < current.value) { + return containsNodeRecursive(current.left, value); + } else { + return containsNodeRecursive(current.right, value); } - return false; } public void delete(int value) { - Node current = root; - Node parent = root; - Node nodeToDelete = null; - boolean isLeftChild = false; + NodeVO nodeToDeleteAux = findNodeToDelete(root, root, false, value); - while (nodeToDelete == null && current != null) { - - if (value == current.value) { - nodeToDelete = current; - } else if (value < current.value) { - parent = current; - current = current.left; - isLeftChild = true; - } else { - parent = current; - current = current.right; - isLeftChild = false; - } - - } - - if (nodeToDelete == null) { + if (nodeToDeleteAux == null) { return; } // Case 1: no children - if (nodeToDelete.left == null && nodeToDelete.right == null) { - if (nodeToDelete == root) { + if (nodeToDeleteAux.node.left == null && nodeToDeleteAux.node.right == null) { + if (nodeToDeleteAux.node == root) { root = null; - } else if (isLeftChild) { - parent.left = null; + } else if (nodeToDeleteAux.isLeftChild) { + nodeToDeleteAux.parent.left = null; } else { - parent.right = null; + nodeToDeleteAux.parent.right = null; } } // Case 2: only 1 child - else if (nodeToDelete.right == null) { - if (nodeToDelete == root) { - root = nodeToDelete.left; - } else if (isLeftChild) { - parent.left = nodeToDelete.left; + else if (nodeToDeleteAux.node.right == null) { + if (nodeToDeleteAux.node == root) { + root = nodeToDeleteAux.node.left; + } else if (nodeToDeleteAux.isLeftChild) { + nodeToDeleteAux.parent.left = nodeToDeleteAux.node.left; } else { - parent.right = nodeToDelete.left; + nodeToDeleteAux.parent.right = nodeToDeleteAux.node.left; } - } else if (nodeToDelete.left == null) { - if (nodeToDelete == root) { - root = nodeToDelete.right; - } else if (isLeftChild) { - parent.left = nodeToDelete.right; + } else if (nodeToDeleteAux.node.left == null) { + if (nodeToDeleteAux.node == root) { + root = nodeToDeleteAux.node.right; + } else if (nodeToDeleteAux.isLeftChild) { + nodeToDeleteAux.parent.left = nodeToDeleteAux.node.right; } else { - parent.right = nodeToDelete.right; + nodeToDeleteAux.parent.right = nodeToDeleteAux.node.right; } } // Case 3: 2 children - else if (nodeToDelete.left != null && nodeToDelete.right != null) { - Node replacement = findReplacement(nodeToDelete); - if (nodeToDelete == root) { + else if (nodeToDeleteAux.node.left != null && nodeToDeleteAux.node.right != null) { + Node replacement = findReplacement(nodeToDeleteAux.node); + if (nodeToDeleteAux.node == root) { root = replacement; - } else if (isLeftChild) { - parent.left = replacement; + } else if (nodeToDeleteAux.isLeftChild) { + nodeToDeleteAux.parent.left = replacement; } else { - parent.right = replacement; + nodeToDeleteAux.parent.right = replacement; } } } + private NodeVO findNodeToDelete(Node current, Node parent, boolean isLeftChild, int value) { + + if (current == null) { + return null; + } else if (value == current.value) { + return new NodeVO(current, parent, isLeftChild); + } else if (value < current.value) { + return findNodeToDelete(current.left, current, true, value); + } else { + return findNodeToDelete(current.right, current, false, value); + } + } + private Node findReplacement(Node nodeToDelete) { - Node replacement = nodeToDelete; - Node parentReplacement = nodeToDelete; - Node current = nodeToDelete.right; + NodeVO replacementNodeVO = findSmallestNode(nodeToDelete, nodeToDelete); - while (current != null) { - parentReplacement = replacement; - replacement = current; - current = current.left; + if (replacementNodeVO.node != nodeToDelete.right) { + replacementNodeVO.parent.left = replacementNodeVO.node.right; + replacementNodeVO.node.right = nodeToDelete.right; } - if (replacement != nodeToDelete.right) { - parentReplacement.left = replacement.right; - replacement.right = nodeToDelete.right; + replacementNodeVO.node.left = nodeToDelete.left; + + return replacementNodeVO.node; + } + + private NodeVO findSmallestNode(Node root, Node parent) { + + if (root.left == null) { + return new NodeVO(root, parent); } - replacement.left = nodeToDelete.left; - - return replacement; + return findSmallestNode(root.left, root); } public void traverseInOrder(Node node) { @@ -202,6 +188,23 @@ public class BinaryTree { } } + class NodeVO { + Node node; + Node parent; + boolean isLeftChild; + + NodeVO(Node node, Node parent) { + this.node = node; + this.parent = parent; + } + + NodeVO(Node node, Node parent, boolean isLeftChild) { + this.node = node; + this.parent = parent; + this.isLeftChild = isLeftChild; + } + } + class Node { int value; Node left; From 9ead70be1bbab8515d4abdf7205b1eea79f5f11b Mon Sep 17 00:00:00 2001 From: Marcos Date: Fri, 15 Dec 2017 20:42:56 +0100 Subject: [PATCH 215/236] var renamed --- .../java/com/baeldung/tree/BinaryTree.java | 50 +++++++++---------- 1 file changed, 25 insertions(+), 25 deletions(-) diff --git a/core-java/src/main/java/com/baeldung/tree/BinaryTree.java b/core-java/src/main/java/com/baeldung/tree/BinaryTree.java index 0b917ed452..686136729e 100644 --- a/core-java/src/main/java/com/baeldung/tree/BinaryTree.java +++ b/core-java/src/main/java/com/baeldung/tree/BinaryTree.java @@ -59,49 +59,49 @@ public class BinaryTree { public void delete(int value) { - NodeVO nodeToDeleteAux = findNodeToDelete(root, root, false, value); + NodeVO nodeToDeleteVO = findNodeToDelete(root, root, false, value); - if (nodeToDeleteAux == null) { + if (nodeToDeleteVO == null) { return; } // Case 1: no children - if (nodeToDeleteAux.node.left == null && nodeToDeleteAux.node.right == null) { - if (nodeToDeleteAux.node == root) { + if (nodeToDeleteVO.node.left == null && nodeToDeleteVO.node.right == null) { + if (nodeToDeleteVO.node == root) { root = null; - } else if (nodeToDeleteAux.isLeftChild) { - nodeToDeleteAux.parent.left = null; + } else if (nodeToDeleteVO.isLeftChild) { + nodeToDeleteVO.parent.left = null; } else { - nodeToDeleteAux.parent.right = null; + nodeToDeleteVO.parent.right = null; } } // Case 2: only 1 child - else if (nodeToDeleteAux.node.right == null) { - if (nodeToDeleteAux.node == root) { - root = nodeToDeleteAux.node.left; - } else if (nodeToDeleteAux.isLeftChild) { - nodeToDeleteAux.parent.left = nodeToDeleteAux.node.left; + else if (nodeToDeleteVO.node.right == null) { + if (nodeToDeleteVO.node == root) { + root = nodeToDeleteVO.node.left; + } else if (nodeToDeleteVO.isLeftChild) { + nodeToDeleteVO.parent.left = nodeToDeleteVO.node.left; } else { - nodeToDeleteAux.parent.right = nodeToDeleteAux.node.left; + nodeToDeleteVO.parent.right = nodeToDeleteVO.node.left; } - } else if (nodeToDeleteAux.node.left == null) { - if (nodeToDeleteAux.node == root) { - root = nodeToDeleteAux.node.right; - } else if (nodeToDeleteAux.isLeftChild) { - nodeToDeleteAux.parent.left = nodeToDeleteAux.node.right; + } else if (nodeToDeleteVO.node.left == null) { + if (nodeToDeleteVO.node == root) { + root = nodeToDeleteVO.node.right; + } else if (nodeToDeleteVO.isLeftChild) { + nodeToDeleteVO.parent.left = nodeToDeleteVO.node.right; } else { - nodeToDeleteAux.parent.right = nodeToDeleteAux.node.right; + nodeToDeleteVO.parent.right = nodeToDeleteVO.node.right; } } // Case 3: 2 children - else if (nodeToDeleteAux.node.left != null && nodeToDeleteAux.node.right != null) { - Node replacement = findReplacement(nodeToDeleteAux.node); - if (nodeToDeleteAux.node == root) { + else if (nodeToDeleteVO.node.left != null && nodeToDeleteVO.node.right != null) { + Node replacement = findReplacement(nodeToDeleteVO.node); + if (nodeToDeleteVO.node == root) { root = replacement; - } else if (nodeToDeleteAux.isLeftChild) { - nodeToDeleteAux.parent.left = replacement; + } else if (nodeToDeleteVO.isLeftChild) { + nodeToDeleteVO.parent.left = replacement; } else { - nodeToDeleteAux.parent.right = replacement; + nodeToDeleteVO.parent.right = replacement; } } From 970de8173442a4aef7aaff10b7484c3b55844cf0 Mon Sep 17 00:00:00 2001 From: abialas Date: Fri, 15 Dec 2017 23:43:51 +0100 Subject: [PATCH 216/236] BAEL-1304 changes after code review --- .../spring-data-eclipselink/pom.xml | 1 + .../repo/PersonsRepositoryTest.java | 46 ++++++++----------- 2 files changed, 20 insertions(+), 27 deletions(-) diff --git a/persistence-modules/spring-data-eclipselink/pom.xml b/persistence-modules/spring-data-eclipselink/pom.xml index 147901dc90..65793fd1e0 100644 --- a/persistence-modules/spring-data-eclipselink/pom.xml +++ b/persistence-modules/spring-data-eclipselink/pom.xml @@ -72,6 +72,7 @@ org.springframework.boot spring-boot-maven-plugin + ${spring.version} diff --git a/persistence-modules/spring-data-eclipselink/src/test/java/com/baeldung/eclipselink/springdata/repo/PersonsRepositoryTest.java b/persistence-modules/spring-data-eclipselink/src/test/java/com/baeldung/eclipselink/springdata/repo/PersonsRepositoryTest.java index 4c24df9ee7..5947e6ffa0 100644 --- a/persistence-modules/spring-data-eclipselink/src/test/java/com/baeldung/eclipselink/springdata/repo/PersonsRepositoryTest.java +++ b/persistence-modules/spring-data-eclipselink/src/test/java/com/baeldung/eclipselink/springdata/repo/PersonsRepositoryTest.java @@ -22,38 +22,30 @@ import static org.hamcrest.core.IsNull.notNullValue; @DirtiesContext(classMode = DirtiesContext.ClassMode.BEFORE_EACH_TEST_METHOD) public class PersonsRepositoryTest { - @Autowired - private PersonsRepository personsRepository; + @Autowired + private PersonsRepository personsRepository; - @Test - public void shouldAddOnePersonToDB() { - // when - personsRepository.save(new Person()); + @Test + public void givenPerson_whenSave_thenAddOnePersonToDB() { + personsRepository.save(new Person()); + assertThat(personsRepository.findAll().spliterator().getExactSizeIfKnown(), equalTo(1l)); + } - // then - assertThat(personsRepository.findAll() - .spliterator() - .getExactSizeIfKnown(), equalTo(1l)); - } + @Test + public void givenPersonsAdamAndDaveInDB_whenSearchForPersonWithNameAdam_thenFindOnePerson() { + Person person1 = new Person(); + person1.setFirstName("Adam"); - @Test - public void shouldFindOnePersonWithNameAdam() { - // given - Person person1 = new Person(); - person1.setFirstName("Adam"); + Person person2 = new Person(); + person2.setFirstName("Dave"); - Person person2 = new Person(); - person2.setFirstName("Dave"); + personsRepository.save(person1); + personsRepository.save(person2); - personsRepository.save(person1); - personsRepository.save(person2); + Person foundPerson = personsRepository.findByFirstName("Adam"); - // when - Person foundPerson = personsRepository.findByFirstName("Adam"); - - // then - assertThat(foundPerson.getFirstName(), equalTo("Adam")); - assertThat(foundPerson.getId(), notNullValue()); - } + assertThat(foundPerson.getFirstName(), equalTo("Adam")); + assertThat(foundPerson.getId(), notNullValue()); + } } From e20d477733e5563afd006b91b835a5ea408ad54c Mon Sep 17 00:00:00 2001 From: ericgoebelbecker <@592Gbetz> Date: Fri, 15 Dec 2017 18:58:37 -0500 Subject: [PATCH 217/236] BAEL-1374 - reuse array --- .../com/baeldung/array/SearchArrayTest.java | 61 +++++++------------ 1 file changed, 21 insertions(+), 40 deletions(-) diff --git a/core-java/src/main/java/com/baeldung/array/SearchArrayTest.java b/core-java/src/main/java/com/baeldung/array/SearchArrayTest.java index 345e1d48f3..199ebdf036 100644 --- a/core-java/src/main/java/com/baeldung/array/SearchArrayTest.java +++ b/core-java/src/main/java/com/baeldung/array/SearchArrayTest.java @@ -10,47 +10,40 @@ import java.util.concurrent.TimeUnit; @OutputTimeUnit(TimeUnit.MICROSECONDS) public class SearchArrayTest { + @State(Scope.Benchmark) + public static class SearchData { + static int count = 1000; + static String[] strings = seedArray(1000); + } + + @Benchmark public void searchArrayLoop() { - - int count = 1000; - String[] strings = seedArray(count); - for (int i = 0; i < count; i++) { - searchLoop(strings, "T"); + for (int i = 0; i < SearchData.count; i++) { + searchLoop(SearchData.strings, "T"); } } @Benchmark public void searchArrayAllocNewList() { - - int count = 1000; - String[] strings = seedArray(count); - for (int i = 0; i < count; i++) { - searchList(strings, "T"); + for (int i = 0; i < SearchData.count; i++) { + searchList(SearchData.strings, "T"); } } @Benchmark public void searchArrayAllocNewSet() { - - int count = 1000; - String[] strings = seedArray(count); - for (int i = 0; i < count; i++) { - searchSet(strings, "T"); + for (int i = 0; i < SearchData.count; i++) { + searchSet(SearchData.strings, "T"); } } @Benchmark public void searchArrayReuseList() { - - int count = 1000; - String[] strings = seedArray(count); - - List asList = Arrays.asList(strings); - - for (int i = 0; i < count; i++) { + List asList = Arrays.asList(SearchData.strings); + for (int i = 0; i < SearchData.count; i++) { asList.contains("T"); } } @@ -58,11 +51,8 @@ public class SearchArrayTest { @Benchmark public void searchArrayReuseSet() { - - int count = 1000; - String[] strings = seedArray(count); - Set asSet = new HashSet<>(Arrays.asList(strings)); - for (int i = 0; i < count; i++) { + Set asSet = new HashSet<>(Arrays.asList(SearchData.strings)); + for (int i = 0; i < SearchData.count; i++) { asSet.contains("T"); } } @@ -70,18 +60,10 @@ public class SearchArrayTest { @Benchmark public void searchArrayBinarySearch() { - - int count = 1000; - String[] strings = seedArray(count); - Arrays.sort(strings); - - long startTime = System.nanoTime(); - for (int i = 0; i < count; i++) { - Arrays.binarySearch(strings, "T"); + Arrays.sort(SearchData.strings); + for (int i = 0; i < SearchData.count; i++) { + Arrays.binarySearch(SearchData.strings, "T"); } - long duration = System.nanoTime() - startTime; - //System.out.println("Binary search: " + duration / 10000); - } private boolean searchList(String[] strings, String searchString) { @@ -101,8 +83,7 @@ public class SearchArrayTest { return false; } - private String[] seedArray(int length) { - + private static String[] seedArray(int length) { String[] strings = new String[length]; Random random = new Random(); for (int i = 0; i < length; i++) From f7c32aabb179a8b888fa33a21611f5031cee57bf Mon Sep 17 00:00:00 2001 From: Loredana Crusoveanu Date: Sat, 16 Dec 2017 10:39:02 +0200 Subject: [PATCH 218/236] change test name --- .../eclipselink/springdata/repo/PersonsRepositoryTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/persistence-modules/spring-data-eclipselink/src/test/java/com/baeldung/eclipselink/springdata/repo/PersonsRepositoryTest.java b/persistence-modules/spring-data-eclipselink/src/test/java/com/baeldung/eclipselink/springdata/repo/PersonsRepositoryTest.java index 5947e6ffa0..1a7c28df6c 100644 --- a/persistence-modules/spring-data-eclipselink/src/test/java/com/baeldung/eclipselink/springdata/repo/PersonsRepositoryTest.java +++ b/persistence-modules/spring-data-eclipselink/src/test/java/com/baeldung/eclipselink/springdata/repo/PersonsRepositoryTest.java @@ -32,7 +32,7 @@ public class PersonsRepositoryTest { } @Test - public void givenPersonsAdamAndDaveInDB_whenSearchForPersonWithNameAdam_thenFindOnePerson() { + public void givenPersons_whenSearch_thenFindOk() { Person person1 = new Person(); person1.setFirstName("Adam"); From 7acbc7902d109fb3252fa8518c96e53a1ac8af66 Mon Sep 17 00:00:00 2001 From: Marcos Date: Sat, 16 Dec 2017 12:33:50 +0100 Subject: [PATCH 219/236] recursived deletion binary tree --- .../java/com/baeldung/tree/BinaryTree.java | 119 +++++------------- 1 file changed, 32 insertions(+), 87 deletions(-) diff --git a/core-java/src/main/java/com/baeldung/tree/BinaryTree.java b/core-java/src/main/java/com/baeldung/tree/BinaryTree.java index 686136729e..d5ccd05bdb 100644 --- a/core-java/src/main/java/com/baeldung/tree/BinaryTree.java +++ b/core-java/src/main/java/com/baeldung/tree/BinaryTree.java @@ -58,89 +58,51 @@ public class BinaryTree { } public void delete(int value) { - - NodeVO nodeToDeleteVO = findNodeToDelete(root, root, false, value); - - if (nodeToDeleteVO == null) { - return; - } - - // Case 1: no children - if (nodeToDeleteVO.node.left == null && nodeToDeleteVO.node.right == null) { - if (nodeToDeleteVO.node == root) { - root = null; - } else if (nodeToDeleteVO.isLeftChild) { - nodeToDeleteVO.parent.left = null; - } else { - nodeToDeleteVO.parent.right = null; - } - } - // Case 2: only 1 child - else if (nodeToDeleteVO.node.right == null) { - if (nodeToDeleteVO.node == root) { - root = nodeToDeleteVO.node.left; - } else if (nodeToDeleteVO.isLeftChild) { - nodeToDeleteVO.parent.left = nodeToDeleteVO.node.left; - } else { - nodeToDeleteVO.parent.right = nodeToDeleteVO.node.left; - } - } else if (nodeToDeleteVO.node.left == null) { - if (nodeToDeleteVO.node == root) { - root = nodeToDeleteVO.node.right; - } else if (nodeToDeleteVO.isLeftChild) { - nodeToDeleteVO.parent.left = nodeToDeleteVO.node.right; - } else { - nodeToDeleteVO.parent.right = nodeToDeleteVO.node.right; - } - } - // Case 3: 2 children - else if (nodeToDeleteVO.node.left != null && nodeToDeleteVO.node.right != null) { - Node replacement = findReplacement(nodeToDeleteVO.node); - if (nodeToDeleteVO.node == root) { - root = replacement; - } else if (nodeToDeleteVO.isLeftChild) { - nodeToDeleteVO.parent.left = replacement; - } else { - nodeToDeleteVO.parent.right = replacement; - } - } - + deleteRecursive(root, value); } - private NodeVO findNodeToDelete(Node current, Node parent, boolean isLeftChild, int value) { - + private Node deleteRecursive(Node current, int value) { if (current == null) { return null; - } else if (value == current.value) { - return new NodeVO(current, parent, isLeftChild); + } + + if (value == current.value) { + // Case 1: no children + if (current.left == null && current.right == null) { + return null; + } + + // Case 2: only 1 child + if (current.right == null) { + return current.left; + } + + if (current.left == null) { + return current.right; + } + + // Case 3: 2 children + int smallestValue = findSmallestNode(current.right); + current.value = smallestValue; + current.right = deleteRecursive(current.right, smallestValue); + return current; + } else if (value < current.value) { - return findNodeToDelete(current.left, current, true, value); + current.left = deleteRecursive(current.left, value); + return current; } else { - return findNodeToDelete(current.right, current, false, value); + current.right = deleteRecursive(current.right, value); + return current; } } - private Node findReplacement(Node nodeToDelete) { - - NodeVO replacementNodeVO = findSmallestNode(nodeToDelete, nodeToDelete); - - if (replacementNodeVO.node != nodeToDelete.right) { - replacementNodeVO.parent.left = replacementNodeVO.node.right; - replacementNodeVO.node.right = nodeToDelete.right; - } - - replacementNodeVO.node.left = nodeToDelete.left; - - return replacementNodeVO.node; - } - - private NodeVO findSmallestNode(Node root, Node parent) { + private int findSmallestNode(Node root) { if (root.left == null) { - return new NodeVO(root, parent); + return root.value; } - return findSmallestNode(root.left, root); + return findSmallestNode(root.left); } public void traverseInOrder(Node node) { @@ -188,23 +150,6 @@ public class BinaryTree { } } - class NodeVO { - Node node; - Node parent; - boolean isLeftChild; - - NodeVO(Node node, Node parent) { - this.node = node; - this.parent = parent; - } - - NodeVO(Node node, Node parent, boolean isLeftChild) { - this.node = node; - this.parent = parent; - this.isLeftChild = isLeftChild; - } - } - class Node { int value; Node left; From 959845621fc23dbb411b8f8585042a797dc84dde Mon Sep 17 00:00:00 2001 From: Marcos Date: Sat, 16 Dec 2017 12:37:30 +0100 Subject: [PATCH 220/236] refactor --- core-java/src/main/java/com/baeldung/tree/BinaryTree.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/core-java/src/main/java/com/baeldung/tree/BinaryTree.java b/core-java/src/main/java/com/baeldung/tree/BinaryTree.java index d5ccd05bdb..285dc12219 100644 --- a/core-java/src/main/java/com/baeldung/tree/BinaryTree.java +++ b/core-java/src/main/java/com/baeldung/tree/BinaryTree.java @@ -82,7 +82,7 @@ public class BinaryTree { } // Case 3: 2 children - int smallestValue = findSmallestNode(current.right); + int smallestValue = findSmallestValue(current.right); current.value = smallestValue; current.right = deleteRecursive(current.right, smallestValue); return current; @@ -96,13 +96,13 @@ public class BinaryTree { } } - private int findSmallestNode(Node root) { + private int findSmallestValue(Node root) { if (root.left == null) { return root.value; } - return findSmallestNode(root.left); + return findSmallestValue(root.left); } public void traverseInOrder(Node node) { From bac07e4dca4b1834038175f6e034ba9ace1d081d Mon Sep 17 00:00:00 2001 From: Grzegorz Piwowarek Date: Sat, 16 Dec 2017 13:15:22 +0100 Subject: [PATCH 221/236] Update README.md (#3252) --- libraries/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libraries/README.md b/libraries/README.md index ae2522ca9e..990a50e711 100644 --- a/libraries/README.md +++ b/libraries/README.md @@ -30,7 +30,7 @@ - [Introduction to Neuroph](http://www.baeldung.com/neuroph) - [Guide to Apache Commons CircularFifoQueue](http://www.baeldung.com/commons-circular-fifo-queue) - [Quick Guide to RSS with Rome](http://www.baeldung.com/rome-rss) -- [Introduction to NoException](http://www.baeldung.com/intrduction-to-noexception) +- [Introduction to NoException](http://www.baeldung.com/introduction-to-noexception) - [Introduction to PCollections](http://www.baeldung.com/java-pcollections) - [Introduction to Hoverfly in Java](http://www.baeldung.com/hoverfly) - [Apache Commons Chain](http://www.baeldung.com/apache-commons-chain) From a5f78cf7d5ff4044145e010dc429bf9444bfd128 Mon Sep 17 00:00:00 2001 From: Pazis Date: Sat, 16 Dec 2017 14:18:09 +0200 Subject: [PATCH 222/236] BAEL-1308 - Copy a File with Java (#3000) * Create Student.java * Create ApplicationContextTestBeanInjection.java * Update Student.java * added tests added tests * BAEL-1308 part 1 * Create test_stream.txt * Create test_files.txt * Create test_channel.txt * Create test_apache.txt * Create test.txt * Delete test.txt * Create readme.txt * Delete Student.java * Delete StudentInjectionTest.java * Delete ApplicationContextTestBeanInjection.java --- .../java/com/baeldung/stream/FileCopy.java | 48 +++++++++++++++++++ .../com/baeldung/stream/FileCopyTest.java | 47 ++++++++++++++++++ .../test/resources/copyTest/dest/readme.txt | 2 + .../resources/copyTest/src/test_apache.txt | 1 + .../resources/copyTest/src/test_channel.txt | 1 + .../resources/copyTest/src/test_files.txt | 1 + .../resources/copyTest/src/test_stream.txt | 1 + 7 files changed, 101 insertions(+) create mode 100644 core-java/src/main/java/com/baeldung/stream/FileCopy.java create mode 100644 core-java/src/test/java/com/baeldung/stream/FileCopyTest.java create mode 100644 core-java/src/test/resources/copyTest/dest/readme.txt create mode 100644 core-java/src/test/resources/copyTest/src/test_apache.txt create mode 100644 core-java/src/test/resources/copyTest/src/test_channel.txt create mode 100644 core-java/src/test/resources/copyTest/src/test_files.txt create mode 100644 core-java/src/test/resources/copyTest/src/test_stream.txt diff --git a/core-java/src/main/java/com/baeldung/stream/FileCopy.java b/core-java/src/main/java/com/baeldung/stream/FileCopy.java new file mode 100644 index 0000000000..ccc2066b36 --- /dev/null +++ b/core-java/src/main/java/com/baeldung/stream/FileCopy.java @@ -0,0 +1,48 @@ +package com.baeldung.stream; + +import java.io.File; +import java.io.FileInputStream; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.nio.channels.FileChannel; +import java.nio.file.Files; + +import org.apache.commons.io.FileUtils; + +public class FileCopy { + + public static void copyFileUsingStream(File source, File dest) throws IOException { + InputStream is = null; + OutputStream os = null; + is = new FileInputStream(source); + os = new FileOutputStream(dest); + byte[] buffer = new byte[1024]; + int length; + while ((length = is.read(buffer)) > 0) { + os.write(buffer, 0, length); + } + is.close(); + os.close(); + } + + public static void copyFileUsingChannel(File source, File dest) throws IOException { + FileChannel sourceChannel = null; + FileChannel destChannel = null; + sourceChannel = new FileInputStream(source).getChannel(); + destChannel = new FileOutputStream(dest).getChannel(); + destChannel.transferFrom(sourceChannel, 0, sourceChannel.size()); + sourceChannel.close(); + destChannel.close(); + } + + public static void copyFileUsingApacheCommonsIO(File source, File dest) throws IOException { + FileUtils.copyFile(source, dest); + } + + public static void copyFileUsingJavaFiles(File source, File dest) throws IOException { + Files.copy(source.toPath(), dest.toPath()); + } + +} diff --git a/core-java/src/test/java/com/baeldung/stream/FileCopyTest.java b/core-java/src/test/java/com/baeldung/stream/FileCopyTest.java new file mode 100644 index 0000000000..3b915a3829 --- /dev/null +++ b/core-java/src/test/java/com/baeldung/stream/FileCopyTest.java @@ -0,0 +1,47 @@ +package com.baeldung.stream; + +import static org.junit.Assert.assertTrue; + +import java.io.File; +import java.io.IOException; + +import org.junit.Test; + +public class FileCopyTest { + + @Test + public void whenUsingStream_thenCopyFile() throws IOException { + File src = new File("src" + File.separator + "test" + File.separator + "resources" + File.separator + "copyTest" + File.separator + "src" + File.separator + "test_stream.txt"); + File dest = new File("src" + File.separator + "test" + File.separator + "resources" + File.separator + "copyTest" + File.separator + "dest" + File.separator + "test_stream.txt"); + FileCopy.copyFileUsingStream(src, dest); + assertTrue(dest.exists()); + dest.delete(); + } + + @Test + public void whenUsingFiles_thenCopyFile() throws IOException { + File src = new File("src" + File.separator + "test" + File.separator + "resources" + File.separator + "copyTest" + File.separator + "src" + File.separator + "test_files.txt"); + File dest = new File("src" + File.separator + "test" + File.separator + "resources" + File.separator + "copyTest" + File.separator + "dest" + File.separator + "test_files.txt"); + FileCopy.copyFileUsingJavaFiles(src, dest); + assertTrue(dest.exists()); + dest.delete(); + } + + @Test + public void whenUsingChannel_thenCopyFile() throws IOException { + File src = new File("src" + File.separator + "test" + File.separator + "resources" + File.separator + "copyTest" + File.separator + "src" + File.separator + "test_channel.txt"); + File dest = new File("src" + File.separator + "test" + File.separator + "resources" + File.separator + "copyTest" + File.separator + "dest" + File.separator + "test_channel.txt"); + FileCopy.copyFileUsingChannel(src, dest); + assertTrue(dest.exists()); + dest.delete(); + } + + @Test + public void whenUsingApache_thenCopyFile() throws IOException { + File src = new File("src" + File.separator + "test" + File.separator + "resources" + File.separator + "copyTest" + File.separator + "src" + File.separator + "test_apache.txt"); + File dest = new File("src" + File.separator + "test" + File.separator + "resources" + File.separator + "copyTest" + File.separator + "dest" + File.separator + "test_apache.txt"); + FileCopy.copyFileUsingApacheCommonsIO(src, dest); + assertTrue(dest.exists()); + dest.delete(); + } +} diff --git a/core-java/src/test/resources/copyTest/dest/readme.txt b/core-java/src/test/resources/copyTest/dest/readme.txt new file mode 100644 index 0000000000..dfda31ee9f --- /dev/null +++ b/core-java/src/test/resources/copyTest/dest/readme.txt @@ -0,0 +1,2 @@ +files will be copied here and then deleted +remove `file.delete()` to see the files here diff --git a/core-java/src/test/resources/copyTest/src/test_apache.txt b/core-java/src/test/resources/copyTest/src/test_apache.txt new file mode 100644 index 0000000000..a6b651973d --- /dev/null +++ b/core-java/src/test/resources/copyTest/src/test_apache.txt @@ -0,0 +1 @@ +apache diff --git a/core-java/src/test/resources/copyTest/src/test_channel.txt b/core-java/src/test/resources/copyTest/src/test_channel.txt new file mode 100644 index 0000000000..6dca835871 --- /dev/null +++ b/core-java/src/test/resources/copyTest/src/test_channel.txt @@ -0,0 +1 @@ +channel diff --git a/core-java/src/test/resources/copyTest/src/test_files.txt b/core-java/src/test/resources/copyTest/src/test_files.txt new file mode 100644 index 0000000000..027271b9b2 --- /dev/null +++ b/core-java/src/test/resources/copyTest/src/test_files.txt @@ -0,0 +1 @@ +files diff --git a/core-java/src/test/resources/copyTest/src/test_stream.txt b/core-java/src/test/resources/copyTest/src/test_stream.txt new file mode 100644 index 0000000000..eac9b41cbe --- /dev/null +++ b/core-java/src/test/resources/copyTest/src/test_stream.txt @@ -0,0 +1 @@ +stream From afb95788476de5d238f71fc4d3d5fd58582c85ca Mon Sep 17 00:00:00 2001 From: Loredana Crusoveanu Date: Sat, 16 Dec 2017 17:46:57 +0200 Subject: [PATCH 223/236] change repo name --- spring-jenkins-pipeline/scripted-pipeline-unix-nonunix | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/spring-jenkins-pipeline/scripted-pipeline-unix-nonunix b/spring-jenkins-pipeline/scripted-pipeline-unix-nonunix index e9cae64d3d..fab940ad3d 100644 --- a/spring-jenkins-pipeline/scripted-pipeline-unix-nonunix +++ b/spring-jenkins-pipeline/scripted-pipeline-unix-nonunix @@ -1,6 +1,6 @@ node { stage 'Clone the project' - git 'https://github.com/dassiorleando/tutorials.git' + git 'https://github.com/eugenp/tutorials.git' dir('spring-jenkins-pipeline') { stage("Compilation and Analysis") { From 6b323c45cc3731d4447412e3b14faef1f3ba890d Mon Sep 17 00:00:00 2001 From: shouvikbhattacharya Date: Sat, 16 Dec 2017 21:28:03 +0530 Subject: [PATCH 224/236] BAEL-1433: Minor changes. --- .../java/com/baeldung/collection/WhenUsingTreeSet.java | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/core-java/src/test/java/com/baeldung/collection/WhenUsingTreeSet.java b/core-java/src/test/java/com/baeldung/collection/WhenUsingTreeSet.java index 887f6eba1d..52d5b08813 100644 --- a/core-java/src/test/java/com/baeldung/collection/WhenUsingTreeSet.java +++ b/core-java/src/test/java/com/baeldung/collection/WhenUsingTreeSet.java @@ -26,7 +26,6 @@ public class WhenUsingTreeSet { @Override public String toString() { - // TODO Auto-generated method stub return id.toString(); } } @@ -189,8 +188,14 @@ public class WhenUsingTreeSet { treeSet.add(5); treeSet.add(6); + Set expectedSet = new TreeSet<>(); + expectedSet.add(2); + expectedSet.add(3); + expectedSet.add(4); + expectedSet.add(5); + Set subSet = treeSet.subSet(2, 6); - System.out.println(subSet); + Assert.assertEquals(expectedSet, subSet); } @Test From ec95d9b208cae1d187b8428bbbe94f8982a3c504 Mon Sep 17 00:00:00 2001 From: Dominik Date: Sat, 16 Dec 2017 19:37:43 +0100 Subject: [PATCH 225/236] BAEL1367: VarHandles Article --- .../java9/varhandles/VariableHandlesTest.java | 101 ++++++++++-------- 1 file changed, 58 insertions(+), 43 deletions(-) diff --git a/core-java-9/src/test/java/com/baeldung/java9/varhandles/VariableHandlesTest.java b/core-java-9/src/test/java/com/baeldung/java9/varhandles/VariableHandlesTest.java index 210c4f0654..50766502ec 100644 --- a/core-java-9/src/test/java/com/baeldung/java9/varhandles/VariableHandlesTest.java +++ b/core-java-9/src/test/java/com/baeldung/java9/varhandles/VariableHandlesTest.java @@ -1,91 +1,106 @@ package com.baeldung.java9.varhandles; -import org.junit.Assert; import org.junit.Test; import java.lang.invoke.MethodHandles; import java.lang.invoke.VarHandle; +import static org.assertj.core.api.Assertions.assertThat; + public class VariableHandlesTest { + public int publicTestVariable = 1; private int privateTestVariable = 1; public int variableToSet = 1; public int variableToCompareAndSet = 1; public int variableToGetAndAdd = 0; public byte variableToBitwiseOr = 0; + @Test - public void whenVariableHandleForPublicVariableIsCreated_ThenItIsInitializedProperly() - throws NoSuchFieldException, IllegalAccessException { - VarHandle publicIntHandle = MethodHandles.lookup() - .in(VariableHandlesTest.class) - .findVarHandle(VariableHandlesTest.class,"publicTestVariable", int.class); - Assert.assertEquals(1, publicIntHandle.coordinateTypes().size()); - Assert.assertEquals(VariableHandlesTest.class, publicIntHandle.coordinateTypes().get(0)); + public void whenVariableHandleForPublicVariableIsCreated_ThenItIsInitializedProperly() throws NoSuchFieldException, IllegalAccessException { + VarHandle publicIntHandle = MethodHandles + .lookup() + .in(VariableHandlesTest.class) + .findVarHandle(VariableHandlesTest.class, "publicTestVariable", int.class); + + assertThat(publicIntHandle.coordinateTypes().size() == 1); + assertThat(publicIntHandle.coordinateTypes().get(0) == VariableHandles.class); } @Test - public void whenVariableHandleForPrivateVariableIsCreated_ThenItIsInitializedProperly() - throws NoSuchFieldException, IllegalAccessException { - VarHandle privateIntHandle = MethodHandles.privateLookupIn(VariableHandlesTest.class, MethodHandles.lookup()) - .findVarHandle(VariableHandlesTest.class,"privateTestVariable", int.class); - Assert.assertNotNull(privateIntHandle); - Assert.assertEquals(1, privateIntHandle.coordinateTypes().size()); - Assert.assertEquals(VariableHandlesTest.class, privateIntHandle.coordinateTypes().get(0)); + public void whenVariableHandleForPrivateVariableIsCreated_ThenItIsInitializedProperly() throws NoSuchFieldException, IllegalAccessException { + VarHandle privateIntHandle = MethodHandles + .privateLookupIn(VariableHandlesTest.class, MethodHandles.lookup()) + .findVarHandle(VariableHandlesTest.class, "privateTestVariable", int.class); + + assertThat(privateIntHandle.coordinateTypes().size() == 1); + assertThat(privateIntHandle.coordinateTypes().get(0) == VariableHandlesTest.class); } @Test - public void whenVariableHandleForArrayVariableIsCreated_ThenItIsInitializedProperly() - throws NoSuchFieldException, IllegalAccessException { - VarHandle arrayVarHandle = MethodHandles.arrayElementVarHandle(int[].class); - Assert.assertEquals(2, arrayVarHandle.coordinateTypes().size()); - Assert.assertEquals(int[].class, arrayVarHandle.coordinateTypes().get(0)); + public void whenVariableHandleForArrayVariableIsCreated_ThenItIsInitializedProperly() throws NoSuchFieldException, IllegalAccessException { + VarHandle arrayVarHandle = MethodHandles + .arrayElementVarHandle(int[].class); + + assertThat(arrayVarHandle.coordinateTypes().size() == 2); + assertThat(arrayVarHandle.coordinateTypes().get(0) == int[].class); } @Test public void givenVarHandle_whenGetIsInvoked_ThenValueOfVariableIsReturned() throws NoSuchFieldException, IllegalAccessException { - VarHandle publicIntHandle = MethodHandles.lookup() - .in(VariableHandlesTest.class) - .findVarHandle(VariableHandlesTest.class,"publicTestVariable", int.class); - Assert.assertEquals(1, publicIntHandle.get(this)); + VarHandle publicIntHandle = MethodHandles + .lookup() + .in(VariableHandlesTest.class) + .findVarHandle(VariableHandlesTest.class, "publicTestVariable", int.class); + + assertThat((int) publicIntHandle.get(this) == 1); } @Test public void givenVarHandle_whenSetIsInvoked_ThenValueOfVariableIsChanged() throws NoSuchFieldException, IllegalAccessException { - VarHandle publicIntHandle = MethodHandles.lookup() - .in(VariableHandlesTest.class) - .findVarHandle(VariableHandlesTest.class,"variableToSet", int.class); + VarHandle publicIntHandle = MethodHandles + .lookup() + .in(VariableHandlesTest.class) + .findVarHandle(VariableHandlesTest.class, "variableToSet", int.class); publicIntHandle.set(this, 15); - Assert.assertEquals(15, publicIntHandle.get(this)); + + assertThat((int) publicIntHandle.get(this) == 15); } @Test public void givenVarHandle_whenCompareAndSetIsInvoked_ThenValueOfVariableIsChanged() throws NoSuchFieldException, IllegalAccessException { - VarHandle publicIntHandle = MethodHandles.lookup() - .in(VariableHandlesTest.class) - .findVarHandle(VariableHandlesTest.class,"variableToCompareAndSet", int.class); - publicIntHandle.compareAndSet(this, 1,100); - Assert.assertEquals(100, publicIntHandle.get(this)); + VarHandle publicIntHandle = MethodHandles + .lookup() + .in(VariableHandlesTest.class) + .findVarHandle(VariableHandlesTest.class, "variableToCompareAndSet", int.class); + publicIntHandle.compareAndSet(this, 1, 100); + + assertThat((int) publicIntHandle.get(this) == 100); } @Test public void givenVarHandle_whenGetAndAddIsInvoked_ThenValueOfVariableIsChanged() throws NoSuchFieldException, IllegalAccessException { - VarHandle publicIntHandle = MethodHandles.lookup() - .in(VariableHandlesTest.class) - .findVarHandle(VariableHandlesTest.class,"variableToGetAndAdd", int.class); + VarHandle publicIntHandle = MethodHandles + .lookup() + .in(VariableHandlesTest.class) + .findVarHandle(VariableHandlesTest.class, "variableToGetAndAdd", int.class); int before = (int) publicIntHandle.getAndAdd(this, 200); - Assert.assertEquals(0, before); - Assert.assertEquals(200, publicIntHandle.get(this)); + + assertThat(before == 0); + assertThat((int) publicIntHandle.get(this) == 200); } @Test public void givenVarHandle_whenGetAndBitwiseOrIsInvoked_ThenValueOfVariableIsChanged() throws NoSuchFieldException, IllegalAccessException { - VarHandle publicIntHandle = MethodHandles.lookup() - .in(VariableHandlesTest.class) - .findVarHandle(VariableHandlesTest.class,"variableToBitwiseOr", byte.class); + VarHandle publicIntHandle = MethodHandles + .lookup() + .in(VariableHandlesTest.class) + .findVarHandle(VariableHandlesTest.class, "variableToBitwiseOr", byte.class); byte before = (byte) publicIntHandle.getAndBitwiseOr(this, (byte) 127); - Assert.assertEquals(0, before); - Assert.assertEquals(127, variableToBitwiseOr); + + assertThat(before == 0); + assertThat(variableToBitwiseOr == 127); } } From 8828d98fc7ad1a79a079f56f2fe56c0cd3cc3e7c Mon Sep 17 00:00:00 2001 From: chober Date: Mon, 18 Dec 2017 13:52:59 +0000 Subject: [PATCH 226/236] update flyway dependency to latest 5.0.2 release --- flyway/flyway-callbacks/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/flyway/flyway-callbacks/pom.xml b/flyway/flyway-callbacks/pom.xml index 70dbef9b69..e61a5742a4 100644 --- a/flyway/flyway-callbacks/pom.xml +++ b/flyway/flyway-callbacks/pom.xml @@ -27,7 +27,7 @@ org.flywaydb flyway-core - 4.2.0 + 5.0.2 From fb5dd0a85e44a469e0c32bd275c0ce7ff3f5d0d7 Mon Sep 17 00:00:00 2001 From: linhvovn Date: Mon, 18 Dec 2017 22:55:23 +0800 Subject: [PATCH 227/236] [tlinh2110@gmail.com] Remove unused test cases --- .../service/SystemPropImpl.java | 26 --------- .../service/SystemPropInterface.java | 11 ---- .../service/UserRoleService.java | 2 +- .../TestCustomSecurityContext.java | 41 -------------- .../TestMethodSecurity.java | 16 +++--- .../testmethodsecurity/TestSystemProp.java | 54 ------------------- .../TestWithMockUserAtClassLevel.java | 4 +- .../testmethodsecurity/WithMockSysUser.java | 12 ----- ...WithMockSysUserSecurityContextFactory.java | 28 ---------- 9 files changed, 11 insertions(+), 183 deletions(-) delete mode 100644 spring-security-core/src/main/java/org/baeldung/testmethodsecurity/service/SystemPropImpl.java delete mode 100644 spring-security-core/src/main/java/org/baeldung/testmethodsecurity/service/SystemPropInterface.java delete mode 100644 spring-security-core/src/test/java/org/baeldung/testmethodsecurity/TestCustomSecurityContext.java delete mode 100644 spring-security-core/src/test/java/org/baeldung/testmethodsecurity/TestSystemProp.java delete mode 100644 spring-security-core/src/test/java/org/baeldung/testmethodsecurity/WithMockSysUser.java delete mode 100644 spring-security-core/src/test/java/org/baeldung/testmethodsecurity/WithMockSysUserSecurityContextFactory.java diff --git a/spring-security-core/src/main/java/org/baeldung/testmethodsecurity/service/SystemPropImpl.java b/spring-security-core/src/main/java/org/baeldung/testmethodsecurity/service/SystemPropImpl.java deleted file mode 100644 index 7307fb63fe..0000000000 --- a/spring-security-core/src/main/java/org/baeldung/testmethodsecurity/service/SystemPropImpl.java +++ /dev/null @@ -1,26 +0,0 @@ -package org.baeldung.testmethodsecurity.service; - -import org.springframework.security.access.annotation.Secured; -import org.springframework.security.access.prepost.PreAuthorize; -import org.springframework.stereotype.Service; - -@Service -public class SystemPropImpl implements SystemPropInterface{ - - @PreAuthorize("permitAll") - @Override - public String getSystemName() { - return "Method Security"; - } - - @Override - public String sayHello(){ - return sayHi(); - } - - @Secured("ROLE_USER") - public String sayHi(){ - return "Hi"; - } - -} diff --git a/spring-security-core/src/main/java/org/baeldung/testmethodsecurity/service/SystemPropInterface.java b/spring-security-core/src/main/java/org/baeldung/testmethodsecurity/service/SystemPropInterface.java deleted file mode 100644 index b61d42083d..0000000000 --- a/spring-security-core/src/main/java/org/baeldung/testmethodsecurity/service/SystemPropInterface.java +++ /dev/null @@ -1,11 +0,0 @@ -package org.baeldung.testmethodsecurity.service; - -public interface SystemPropInterface { - - String getSystemName(); - - String sayHello(); - - String sayHi(); - -} diff --git a/spring-security-core/src/main/java/org/baeldung/testmethodsecurity/service/UserRoleService.java b/spring-security-core/src/main/java/org/baeldung/testmethodsecurity/service/UserRoleService.java index 46cab5918a..f4dc6cf335 100644 --- a/spring-security-core/src/main/java/org/baeldung/testmethodsecurity/service/UserRoleService.java +++ b/spring-security-core/src/main/java/org/baeldung/testmethodsecurity/service/UserRoleService.java @@ -16,7 +16,7 @@ public class UserRoleService { UserRoleRepository userRoleRepository; @PreAuthorize("hasRole('ROLE_VIEWER') or hasAuthority('SYS_ADMIN')") - public String getUserName(){ + public String getUsername(){ SecurityContext securityContext = SecurityContextHolder.getContext(); return securityContext.getAuthentication().getName(); } diff --git a/spring-security-core/src/test/java/org/baeldung/testmethodsecurity/TestCustomSecurityContext.java b/spring-security-core/src/test/java/org/baeldung/testmethodsecurity/TestCustomSecurityContext.java deleted file mode 100644 index f231437e40..0000000000 --- a/spring-security-core/src/test/java/org/baeldung/testmethodsecurity/TestCustomSecurityContext.java +++ /dev/null @@ -1,41 +0,0 @@ -package org.baeldung.testmethodsecurity; - -import static org.junit.Assert.assertEquals; - -import org.baeldung.testmethodsecurity.service.UserRoleService; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.context.annotation.ComponentScan; -import org.springframework.context.annotation.Configuration; -import org.springframework.security.access.AccessDeniedException; -import org.springframework.test.context.ContextConfiguration; -import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; - -@RunWith(SpringJUnit4ClassRunner.class) -@ContextConfiguration -public class TestCustomSecurityContext { - - @Autowired - UserRoleService userRoleService; - - @Configuration - @ComponentScan("org.baeldung.testmethodsecurity.*") - public static class SpringConfig { - - } - - @Test - @WithMockSysUser(systemUserName="jane") - public void whenJane_callGetUserName_thenOK(){ - String userName = userRoleService.getUserName(); - assertEquals("jane",userName); - } - - @Test(expected=AccessDeniedException.class) - @WithMockSysUser(systemUserName="john") - public void whenJohn_callGetUserName_thenFail(){ - userRoleService.getUserName(); - } - -} diff --git a/spring-security-core/src/test/java/org/baeldung/testmethodsecurity/TestMethodSecurity.java b/spring-security-core/src/test/java/org/baeldung/testmethodsecurity/TestMethodSecurity.java index 8b7b095187..6066212630 100644 --- a/spring-security-core/src/test/java/org/baeldung/testmethodsecurity/TestMethodSecurity.java +++ b/spring-security-core/src/test/java/org/baeldung/testmethodsecurity/TestMethodSecurity.java @@ -29,28 +29,28 @@ public class TestMethodSecurity{ @Test @WithMockUser(username="john",roles={"VIEWER"}) - public void whenRoleViewer_callGetUserName_thenOK(){ - String userName = userRoleService.getUserName(); + public void givenRoleViewer_whenCallGetUsername_thenReturnUsername(){ + String userName = userRoleService.getUsername(); assertEquals("john", userName); } @Test @WithMockUser(username="john",authorities={"SYS_ADMIN"}) - public void whenSysAdmin_callGetUserName_thenOK(){ - String userName = userRoleService.getUserName(); + public void givenAuthoritySysAdmin_whenCallGetUsername_thenReturnUsername(){ + String userName = userRoleService.getUsername(); assertEquals("john", userName); } @Test(expected=AccessDeniedException.class) @WithAnonymousUser - public void whenAnomynous_callGetUserName_thenFail(){ - userRoleService.getUserName(); + public void givenAnomynousUser_whenCallGetUsername_thenAccessDenied(){ + userRoleService.getUsername(); } @Test @WithMockJohnViewer - public void whenJohnViewer_callGetUserName_thenOK(){ - String userName = userRoleService.getUserName(); + public void givenMockedJohnViewer_whenCallGetUsername_thenReturnUsername(){ + String userName = userRoleService.getUsername(); assertEquals("john", userName); } diff --git a/spring-security-core/src/test/java/org/baeldung/testmethodsecurity/TestSystemProp.java b/spring-security-core/src/test/java/org/baeldung/testmethodsecurity/TestSystemProp.java deleted file mode 100644 index 1a36cf7ae1..0000000000 --- a/spring-security-core/src/test/java/org/baeldung/testmethodsecurity/TestSystemProp.java +++ /dev/null @@ -1,54 +0,0 @@ -package org.baeldung.testmethodsecurity; - -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertFalse; -import static org.junit.Assert.assertTrue; - -import java.lang.reflect.Proxy; - -import org.baeldung.testmethodsecurity.service.SystemPropImpl; -import org.baeldung.testmethodsecurity.service.SystemPropInterface; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.context.annotation.ComponentScan; -import org.springframework.context.annotation.Configuration; -import org.springframework.security.authentication.AuthenticationCredentialsNotFoundException; -import org.springframework.security.test.context.support.WithMockUser; -import org.springframework.test.context.ContextConfiguration; -import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; - -@RunWith(SpringJUnit4ClassRunner.class) -@ContextConfiguration -public class TestSystemProp{ - - @Autowired - SystemPropInterface systemProp; - - @Test - @WithMockUser(username="test") - public void checkSystemPropInstance(){ - assertFalse(systemProp instanceof SystemPropImpl); - assertTrue(systemProp instanceof SystemPropInterface); - assertTrue(systemProp instanceof Proxy); - - assertEquals("Method Security", systemProp.getSystemName()); - } - - @Test - public void whenNotAuthentication_callSayHello_thenOK(){ - String hello = systemProp.sayHello(); - assertEquals("Hi", hello); - } - - @Test(expected=AuthenticationCredentialsNotFoundException.class) - public void whenNotAuthentication_callSayHi_thenFailed(){ - systemProp.sayHi(); - } - - @Configuration - @ComponentScan("org.baeldung.testmethodsecurity.*") - public static class SpringConfig { - - } -} diff --git a/spring-security-core/src/test/java/org/baeldung/testmethodsecurity/TestWithMockUserAtClassLevel.java b/spring-security-core/src/test/java/org/baeldung/testmethodsecurity/TestWithMockUserAtClassLevel.java index aaa1b84294..2826dfed38 100644 --- a/spring-security-core/src/test/java/org/baeldung/testmethodsecurity/TestWithMockUserAtClassLevel.java +++ b/spring-security-core/src/test/java/org/baeldung/testmethodsecurity/TestWithMockUserAtClassLevel.java @@ -18,8 +18,8 @@ import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; public class TestWithMockUserAtClassLevel { @Test - public void whenRoleViewerLogged_callGetUserName_thenOK(){ - String currentUserName = userService.getUserName(); + public void givenRoleViewer_whenCallGetUsername_thenReturnUsername(){ + String currentUserName = userService.getUsername(); assertEquals("john",currentUserName); } diff --git a/spring-security-core/src/test/java/org/baeldung/testmethodsecurity/WithMockSysUser.java b/spring-security-core/src/test/java/org/baeldung/testmethodsecurity/WithMockSysUser.java deleted file mode 100644 index 34e6c78a9d..0000000000 --- a/spring-security-core/src/test/java/org/baeldung/testmethodsecurity/WithMockSysUser.java +++ /dev/null @@ -1,12 +0,0 @@ -package org.baeldung.testmethodsecurity; - -import java.lang.annotation.Retention; -import java.lang.annotation.RetentionPolicy; - -import org.springframework.security.test.context.support.WithSecurityContext; - -@Retention(RetentionPolicy.RUNTIME) -@WithSecurityContext(factory = WithMockSysUserSecurityContextFactory.class) -public @interface WithMockSysUser { - String systemUserName(); -} \ No newline at end of file diff --git a/spring-security-core/src/test/java/org/baeldung/testmethodsecurity/WithMockSysUserSecurityContextFactory.java b/spring-security-core/src/test/java/org/baeldung/testmethodsecurity/WithMockSysUserSecurityContextFactory.java deleted file mode 100644 index 820f6f2d07..0000000000 --- a/spring-security-core/src/test/java/org/baeldung/testmethodsecurity/WithMockSysUserSecurityContextFactory.java +++ /dev/null @@ -1,28 +0,0 @@ -package org.baeldung.testmethodsecurity; - -import org.baeldung.testmethodsecurity.entity.CustomUser; -import org.baeldung.testmethodsecurity.repository.UserRoleRepository; -import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; -import org.springframework.security.core.Authentication; -import org.springframework.security.core.context.SecurityContext; -import org.springframework.security.core.context.SecurityContextHolder; -import org.springframework.security.test.context.support.WithSecurityContextFactory; - -public class WithMockSysUserSecurityContextFactory - implements WithSecurityContextFactory { - - @Override - public SecurityContext createSecurityContext(WithMockSysUser customUser) { - SecurityContext context = SecurityContextHolder.createEmptyContext(); - UserRoleRepository userRoleRepo = new UserRoleRepository(); - - CustomUser user = userRoleRepo.loadUserByUserName(customUser.systemUserName()); - - Authentication auth = - new UsernamePasswordAuthenticationToken(user, user.getPassword(), user.getAuthorities()); - - context.setAuthentication(auth); - return context; - } - -} \ No newline at end of file From d145e559e2635f2dce21e71df4fd74f83c4c71ff Mon Sep 17 00:00:00 2001 From: linhvovn Date: Mon, 18 Dec 2017 22:57:20 +0800 Subject: [PATCH 228/236] [tlinh2110@gmail.com] remove unsed property --- .../baeldung/testmethodsecurity/entity/CustomUser.java | 9 --------- 1 file changed, 9 deletions(-) diff --git a/spring-security-core/src/main/java/org/baeldung/testmethodsecurity/entity/CustomUser.java b/spring-security-core/src/main/java/org/baeldung/testmethodsecurity/entity/CustomUser.java index 8c5a5b2fb2..b145a82c80 100644 --- a/spring-security-core/src/main/java/org/baeldung/testmethodsecurity/entity/CustomUser.java +++ b/spring-security-core/src/main/java/org/baeldung/testmethodsecurity/entity/CustomUser.java @@ -9,7 +9,6 @@ import org.springframework.security.core.userdetails.User; public class CustomUser extends User{ private String nickName; - private int age; public CustomUser(String username, String password, Collection authorities) { super(username, password, authorities); @@ -28,12 +27,4 @@ public class CustomUser extends User{ this.nickName = nickName; } - public int getAge() { - return age; - } - - public void setAge(int age) { - this.age = age; - } - } From 94ace2eda83eeff6f355877c30732d96d81497f9 Mon Sep 17 00:00:00 2001 From: Binesh Narayanan Date: Tue, 19 Dec 2017 14:37:35 +0800 Subject: [PATCH 229/236] BAEL-1348 | BatchProcessing example using jdbc (#3216) * BAEL-EVAL | Adding an example to demo Bean Injection ### Changes done A Spring boot app to demo bean injection * Adding @Autowired for Constructor Injection * BAEL-EVAL | Correcting the method name * BAEL-EVAL * BAEL-1348 | Adding example of Batch Processing in JDBC ### Changes done - Added one example using statement - Added one example using preparedstatement * Removing evaluation article * BAEL-1348 | Adding example of Batch Processing in JDBC ### Changes done - Added an example using statement - Added an example using preparedstatement * BAEL-1348 | BatchProcessing example using jdbc ### Changes done - Add example using statement - Add example using PreparedStatement - Add Unit Tests * BAEL-1348 | Changes to pom.xml and refactoring UnitTest * BAEL-1348 | Removing the example using spring-boot --- core-java/pom.xml | 891 +++++++++--------- .../com/baeldung/jdbc/BatchProcessing.java | 96 ++ .../baeldung/jdbc/BatchProcessingTest.java | 71 ++ 3 files changed, 612 insertions(+), 446 deletions(-) create mode 100644 core-java/src/main/java/com/baeldung/jdbc/BatchProcessing.java create mode 100644 core-java/src/test/java/com/baeldung/jdbc/BatchProcessingTest.java diff --git a/core-java/pom.xml b/core-java/pom.xml index 068a772c43..88ac6bca49 100644 --- a/core-java/pom.xml +++ b/core-java/pom.xml @@ -1,496 +1,495 @@ - 4.0.0 - com.baeldung - core-java - 0.1.0-SNAPSHOT - jar + xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> + 4.0.0 + com.baeldung + core-java + 0.1.0-SNAPSHOT + jar - core-java + core-java - + - - - net.sourceforge.collections - collections-generic - ${collections-generic.version} - - - com.google.guava - guava - ${guava.version} - + + + net.sourceforge.collections + collections-generic + ${collections-generic.version} + + + com.google.guava + guava + ${guava.version} + - - org.apache.commons - commons-collections4 - ${commons-collections4.version} - + + org.apache.commons + commons-collections4 + ${commons-collections4.version} + - - commons-io - commons-io - ${commons-io.version} - + + commons-io + commons-io + ${commons-io.version} + - - org.apache.commons - commons-lang3 - ${commons-lang3.version} - + + org.apache.commons + commons-lang3 + ${commons-lang3.version} + - - org.apache.commons - commons-math3 - ${commons-math3.version} - + + org.apache.commons + commons-math3 + ${commons-math3.version} + - - org.decimal4j - decimal4j - ${decimal4j.version} - + + org.decimal4j + decimal4j + ${decimal4j.version} + - - org.bouncycastle - bcprov-jdk15on - ${bouncycastle.version} - + + org.bouncycastle + bcprov-jdk15on + ${bouncycastle.version} + - - org.unix4j - unix4j-command - ${unix4j.version} - + + org.unix4j + unix4j-command + ${unix4j.version} + - - com.googlecode.grep4j - grep4j - ${grep4j.version} - - + + com.googlecode.grep4j + grep4j + ${grep4j.version} + + - + - - com.fasterxml.jackson.core - jackson-databind - ${jackson.version} - + + com.fasterxml.jackson.core + jackson-databind + ${jackson.version} + - - - log4j - log4j - 1.2.17 - - - org.slf4j - slf4j-api - ${org.slf4j.version} - - - ch.qos.logback - logback-classic - ${logback.version} - - - - org.slf4j - jcl-over-slf4j - ${org.slf4j.version} - - - - org.slf4j - log4j-over-slf4j - ${org.slf4j.version} - - - org.projectlombok - lombok - ${lombok.version} - provided - + + + log4j + log4j + 1.2.17 + + + org.slf4j + slf4j-api + ${org.slf4j.version} + + + ch.qos.logback + logback-classic + ${logback.version} + + + + org.slf4j + jcl-over-slf4j + ${org.slf4j.version} + + + + org.slf4j + log4j-over-slf4j + ${org.slf4j.version} + + + org.projectlombok + lombok + ${lombok.version} + provided + - + - - org.hamcrest - hamcrest-all - 1.3 - test - + + org.hamcrest + hamcrest-all + 1.3 + test + - - junit - junit - ${junit.version} - test - + + junit + junit + ${junit.version} + test + - - org.hamcrest - hamcrest-core - ${org.hamcrest.version} - test - - - org.hamcrest - hamcrest-library - ${org.hamcrest.version} - test - + + org.hamcrest + hamcrest-core + ${org.hamcrest.version} + test + + + org.hamcrest + hamcrest-library + ${org.hamcrest.version} + test + - - org.assertj - assertj-core - ${assertj.version} - test - + + org.assertj + assertj-core + ${assertj.version} + test + - - org.mockito - mockito-core - ${mockito.version} - test - - - com.jayway.awaitility - awaitility - ${avaitility.version} - test - + + org.mockito + mockito-core + ${mockito.version} + test + + + com.jayway.awaitility + awaitility + ${avaitility.version} + test + - - commons-codec - commons-codec - ${commons-codec.version} - + + commons-codec + commons-codec + ${commons-codec.version} + - - org.javamoney - moneta - 1.1 - + + org.javamoney + moneta + 1.1 + - - org.owasp.esapi - esapi - 2.1.0.1 - - - com.h2database - h2 - 1.4.196 - runtime - - - com.sun.messaging.mq - fscontext - ${fscontext.version} - - - com.codepoetics - protonpack - ${protonpack.version} - - - one.util - streamex - ${streamex.version} - - - io.vavr - vavr - ${vavr.version} - - - org.openjdk.jmh - jmh-core - 1.19 - - - org.openjdk.jmh - jmh-generator-annprocess - 1.19 - - - org.springframework - spring-web - 4.3.4.RELEASE - + + org.owasp.esapi + esapi + 2.1.0.1 + + + com.sun.messaging.mq + fscontext + ${fscontext.version} + + + com.codepoetics + protonpack + ${protonpack.version} + + + one.util + streamex + ${streamex.version} + + + io.vavr + vavr + ${vavr.version} + + + org.openjdk.jmh + jmh-core + 1.19 + + + org.openjdk.jmh + jmh-generator-annprocess + 1.19 + + org.springframework + spring-web + 4.3.4.RELEASE + + org.springframework.boot spring-boot-starter 1.5.8.RELEASE + + org.hsqldb + hsqldb + 2.4.0 + runtime + + - + + core-java + + + src/main/resources + true + + - - core-java - - - src/main/resources - true - - + - + + org.apache.maven.plugins + maven-compiler-plugin + ${maven-compiler-plugin.version} + + 1.8 + 1.8 + + - - org.apache.maven.plugins - maven-compiler-plugin - ${maven-compiler-plugin.version} - - 1.8 - 1.8 - - + + org.apache.maven.plugins + maven-surefire-plugin + + + **/*LiveTest.java + **/*IntegrationTest.java + **/*LongRunningUnitTest.java + **/*ManualTest.java + + true + + - - org.apache.maven.plugins - maven-surefire-plugin - - - **/*LiveTest.java - **/*IntegrationTest.java - **/*LongRunningUnitTest.java - **/*ManualTest.java - + + org.apache.maven.plugins + maven-dependency-plugin + + + copy-dependencies + prepare-package + + copy-dependencies + + + ${project.build.directory}/libs + + + + - - + + org.apache.maven.plugins + maven-jar-plugin + + + + true + libs/ + org.baeldung.executable.ExecutableMavenJar + + + + - - org.apache.maven.plugins - maven-dependency-plugin - - - copy-dependencies - prepare-package - - copy-dependencies - - - ${project.build.directory}/libs - - - - + + org.apache.maven.plugins + maven-assembly-plugin + + + package + + single + + + ${project.basedir} + + + org.baeldung.executable.ExecutableMavenJar + + + + jar-with-dependencies + + + + + - - org.apache.maven.plugins - maven-jar-plugin - - - - true - libs/ - org.baeldung.executable.ExecutableMavenJar - - - - + + org.apache.maven.plugins + maven-shade-plugin + + + + shade + + + true + + + org.baeldung.executable.ExecutableMavenJar + + + + + + - - org.apache.maven.plugins - maven-assembly-plugin - - - package - - single - - - ${project.basedir} - - - org.baeldung.executable.ExecutableMavenJar - - - - jar-with-dependencies - - - - - + + com.jolira + onejar-maven-plugin + + + + org.baeldung.executable.ExecutableMavenJar + true + ${project.build.finalName}-onejar.${project.packaging} + + + one-jar + + + + - - org.apache.maven.plugins - maven-shade-plugin - - - - shade - - - true - - - org.baeldung.executable.ExecutableMavenJar - - - - - - + + org.springframework.boot + spring-boot-maven-plugin + + + + repackage + + + spring-boot + org.baeldung.executable.ExecutableMavenJar + + + + - - com.jolira - onejar-maven-plugin - - - - org.baeldung.executable.ExecutableMavenJar - true - ${project.build.finalName}-onejar.${project.packaging} - - - one-jar - - - - - - - org.springframework.boot - spring-boot-maven-plugin - - - - repackage - - - spring-boot - org.baeldung.executable.ExecutableMavenJar - - - - - - - org.codehaus.mojo - exec-maven-plugin - 1.6.0 - - java - com.baeldung.outofmemoryerror.OutOfMemoryGCLimitExceed - - -Xmx300m - -XX:+UseParallelGC - -classpath - - com.baeldung.outofmemoryerror.OutOfMemoryGCLimitExceed - - - + + org.codehaus.mojo + exec-maven-plugin + 1.6.0 + + java + com.baeldung.outofmemoryerror.OutOfMemoryGCLimitExceed + + -Xmx300m + -XX:+UseParallelGC + -classpath + + com.baeldung.outofmemoryerror.OutOfMemoryGCLimitExceed + + + - + - + - - - integration - - - - org.apache.maven.plugins - maven-surefire-plugin - - - integration-test - - test - - - - **/*ManualTest.java - - - **/*IntegrationTest.java - - - - - - - json - - - - - org.codehaus.mojo - exec-maven-plugin + + + integration + + + + org.apache.maven.plugins + maven-surefire-plugin + + + integration-test + + test + + + + **/*ManualTest.java + + + **/*IntegrationTest.java + + + + + + + json + + + + + org.codehaus.mojo + exec-maven-plugin - - - run-benchmarks - - none - - exec - - - test - java - - -classpath - - org.openjdk.jmh.Main - .* - - - - - - - - - + + + run-benchmarks + + none + + exec + + + test + java + + -classpath + + org.openjdk.jmh.Main + .* + + + + + + + + + - - - 2.8.5 + + + 2.8.5 - - 1.7.21 - 1.1.7 + + 1.7.21 + 1.1.7 - - 22.0 - 3.5 - 1.55 - 1.10 - 3.6.1 - 1.0.3 - 2.5 - 4.1 - 4.01 - 0.4 - 1.8.7 - 1.16.12 - 4.6-b01 - 1.13 - 0.6.5 - 0.9.0 + + 22.0 + 3.5 + 1.55 + 1.10 + 3.6.1 + 1.0.3 + 2.5 + 4.1 + 4.01 + 0.4 + 1.8.7 + 1.16.12 + 4.6-b01 + 1.13 + 0.6.5 + 0.9.0 + + + 1.3 + 4.12 + 2.8.9 + 3.6.1 + 1.7.0 - - 1.3 - 4.12 - 2.8.9 - 3.6.1 - 1.7.0 - - - 3.6.0 - 2.19.1 - - + + 3.6.0 + 2.19.1 + + \ No newline at end of file diff --git a/core-java/src/main/java/com/baeldung/jdbc/BatchProcessing.java b/core-java/src/main/java/com/baeldung/jdbc/BatchProcessing.java new file mode 100644 index 0000000000..d5c53c3ffc --- /dev/null +++ b/core-java/src/main/java/com/baeldung/jdbc/BatchProcessing.java @@ -0,0 +1,96 @@ +package com.baeldung.jdbc; + +import java.sql.*; +import java.util.UUID; + +public class BatchProcessing { + + private final String[] EMPLOYEES = new String[]{"Zuck","Mike","Larry","Musk","Steve"}; + private final String[] DESIGNATIONS = new String[]{"CFO","CSO","CTO","CEO","CMO"}; + private final String[] ADDRESSES = new String[]{"China","York","Diego","Carolina","India"}; + + private Connection connection; + + public void getConnection(){ + try { + Class.forName("org.hsqldb.jdbcDriver"); + connection = DriverManager.getConnection("jdbc:hsqldb:file:C:\\EMPLOYEEDB", "SA", ""); + connection.setAutoCommit(false); + } catch (Exception e) { + e.printStackTrace(System.out); + } + } + + public void createTables(){ + try { + connection.createStatement().executeUpdate("create table EMPLOYEE (ID VARCHAR(36), NAME VARCHAR(45), DESIGNATION VARCHAR(15))"); + connection.createStatement().executeUpdate("create table EMP_ADDRESS (ID VARCHAR(36), EMP_ID VARCHAR(36), ADDRESS VARCHAR(45))"); + System.out.println("Tables Created!!!"); + } catch (SQLException e) { + e.printStackTrace(System.out); + } + } + + public void useStatement(){ + try { + String insertEmployeeSQL = "INSERT INTO EMPLOYEE(ID, NAME, DESIGNATION) VALUES ('%s','%s','%s');"; + String insertEmployeeAddrSQL = "INSERT INTO EMP_ADDRESS(ID, EMP_ID, ADDRESS) VALUES ('%s','%s','%s');"; + Statement statement = connection.createStatement(); + for(int i = 0; i < EMPLOYEES.length; i++){ + String employeeId = UUID.randomUUID().toString(); + statement.addBatch(String.format(insertEmployeeSQL, employeeId, EMPLOYEES[i],DESIGNATIONS[i])); + statement.addBatch(String.format(insertEmployeeAddrSQL, UUID.randomUUID().toString(),employeeId,ADDRESSES[i])); + } + statement.executeBatch(); + connection.commit(); + } catch (Exception e) { + try { + connection.rollback(); + } catch (SQLException ex) { + System.out.println("Error during rollback"); + System.out.println(ex.getMessage()); + } + e.printStackTrace(System.out); + } + } + + public void usePreparedStatement(){ + try { + String insertEmployeeSQL = "INSERT INTO EMPLOYEE(ID, NAME, DESIGNATION) VALUES (?,?,?);"; + String insertEmployeeAddrSQL = "INSERT INTO EMP_ADDRESS(ID, EMP_ID, ADDRESS) VALUES (?,?,?);"; + PreparedStatement employeeStmt = connection.prepareStatement(insertEmployeeSQL); + PreparedStatement empAddressStmt = connection.prepareStatement(insertEmployeeAddrSQL); + for(int i = 0; i < EMPLOYEES.length; i++){ + String employeeId = UUID.randomUUID().toString(); + employeeStmt.setString(1,employeeId); + employeeStmt.setString(2,EMPLOYEES[i]); + employeeStmt.setString(3,DESIGNATIONS[i]); + employeeStmt.addBatch(); + + empAddressStmt.setString(1,UUID.randomUUID().toString()); + empAddressStmt.setString(2,employeeId); + empAddressStmt.setString(3,ADDRESSES[i]); + empAddressStmt.addBatch(); + } + employeeStmt.executeBatch(); + empAddressStmt.executeBatch(); + connection.commit(); + } catch (Exception e) { + try { + connection.rollback(); + } catch (SQLException ex) { + System.out.println("Error during rollback"); + System.out.println(ex.getMessage()); + } + e.printStackTrace(System.out); + } + } + + public static void main(String[] args) { + BatchProcessing batchProcessing = new BatchProcessing(); + batchProcessing.getConnection(); + batchProcessing.createTables(); + batchProcessing.useStatement(); + batchProcessing.usePreparedStatement(); + } +} diff --git a/core-java/src/test/java/com/baeldung/jdbc/BatchProcessingTest.java b/core-java/src/test/java/com/baeldung/jdbc/BatchProcessingTest.java new file mode 100644 index 0000000000..90f2ea133f --- /dev/null +++ b/core-java/src/test/java/com/baeldung/jdbc/BatchProcessingTest.java @@ -0,0 +1,71 @@ +package com.baeldung.jdbc; + + +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.Mockito; +import org.mockito.MockitoAnnotations; +import org.mockito.junit.MockitoJUnitRunner; + +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.Statement; + +@RunWith(MockitoJUnitRunner.class) +public class BatchProcessingTest { + + + @InjectMocks + private BatchProcessing target = new BatchProcessing(); + + @Mock + private Connection connection; + + @Mock + private Statement statement; + + @Mock + private PreparedStatement employeeStatement; + + @Mock + private PreparedStatement employeeAddressStatement; + + @Before + public void before(){ + MockitoAnnotations.initMocks(this); + } + + + @Test + public void when_useStatement_thenInsertData_success() throws Exception { + Mockito.when(connection.createStatement()).thenReturn(statement); + target.useStatement(); + } + + @Test + public void when_useStatement_ifThrowException_thenCatchException() throws Exception { + Mockito.when(connection.createStatement()).thenThrow(new RuntimeException()); + target.useStatement(); + } + + @Test + public void when_usePreparedStatement_thenInsertData_success() throws Exception { + String insertEmployeeSQL = "INSERT INTO EMPLOYEE(ID, NAME, DESIGNATION) VALUES (?,?,?);"; + String insertEmployeeAddrSQL = "INSERT INTO EMP_ADDRESS(ID, EMP_ID, ADDRESS) VALUES (?,?,?);"; + Mockito.when(connection.prepareStatement(insertEmployeeSQL)).thenReturn(employeeStatement); + Mockito.when(connection.prepareStatement(insertEmployeeAddrSQL)).thenReturn(employeeAddressStatement); + target.usePreparedStatement(); + } + + @Test + public void when_usePreparedStatement_ifThrowException_thenCatchException() throws Exception { + String insertEmployeeSQL = "INSERT INTO EMPLOYEE(ID, NAME, DESIGNATION) VALUES (?,?,?);"; + String insertEmployeeAddrSQL = "INSERT INTO EMP_ADDRESS(ID, EMP_ID, ADDRESS) VALUES (?,?,?);"; + Mockito.when(connection.prepareStatement(insertEmployeeSQL)).thenReturn(employeeStatement); + Mockito.when(connection.prepareStatement(insertEmployeeAddrSQL)).thenThrow(new RuntimeException()); + target.usePreparedStatement(); + } +} From 3bcff4672e18c43e1e2135eee3e8e6e87bed94e6 Mon Sep 17 00:00:00 2001 From: Ahmed Tawila Date: Tue, 19 Dec 2017 08:38:39 +0200 Subject: [PATCH 230/236] fix spring boot project failure (#3267) --- .../resources/persistence-generic-entity.properties | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename spring-boot/src/{test => main}/resources/persistence-generic-entity.properties (100%) diff --git a/spring-boot/src/test/resources/persistence-generic-entity.properties b/spring-boot/src/main/resources/persistence-generic-entity.properties similarity index 100% rename from spring-boot/src/test/resources/persistence-generic-entity.properties rename to spring-boot/src/main/resources/persistence-generic-entity.properties From 87e7b6630039321d6780a521403af4b3816ac15c Mon Sep 17 00:00:00 2001 From: Seun Matt Date: Tue, 19 Dec 2017 11:02:45 +0100 Subject: [PATCH 231/236] Added Complete Source Code for VRaptor BAEL-1214 (#3237) * added updated example codes * updated example code StringToCharStream * deleted StringToCharStream.java locally * removed redundant file * added code for apache commons collection SetUtils * refactored example code * added example code for bytebuddy * added example code for PCollections * update pom * refactored tests for PCollections * spring security xml config * spring security xml config * remove redundant comment * example code for apache-shiro * updated example code for Vavr Collections * updated Vavr's Collection example * updated Vavr Collection file * updated example code for Apache Shiro * updated Vavr Collections example * added example code for N1QL * update example code for N1QL * added integration test for N1QL * update N1QL Example code * update the N1QL example Code * rename module to couchbase * rename module to couchbase * change module name in parent module and pom * added cas-server module * added cas secured app for Spring SSO with CAS * refactor cas modules into cas folder * updated files * removed redundant files * refactor the config for cas-server * added sql file to generate tables and database * added source code for VRaptor * update source code for VRaptor article * update pom and reformat code --- pom.xml | 1 + vraptor/.gitignore | 4 + vraptor/README.md | 13 + vraptor/pom.xml | 134 + .../java/com/baeldung/config/UserInfo.java | 23 + .../baeldung/controllers/AuthController.java | 99 + .../baeldung/controllers/IndexController.java | 40 + .../baeldung/controllers/PostController.java | 77 + .../main/java/com/baeldung/daos/PostDao.java | 54 + .../main/java/com/baeldung/daos/UserDao.java | 50 + .../main/java/com/baeldung/models/Post.java | 105 + .../main/java/com/baeldung/models/User.java | 101 + vraptor/src/main/resources/META-INF/beans.xml | 8 + vraptor/src/main/resources/database.sql | 55 + vraptor/src/main/resources/hibernate.cfg.xml | 31 + vraptor/src/main/resources/log4j.xml | 36 + .../main/resources/templates/auth/login.ftl | 172 + .../resources/templates/auth/register.ftl | 194 + .../src/main/resources/templates/index.ftl | 173 + .../main/resources/templates/posts/add.ftl | 164 + vraptor/src/main/resources/templates/view.ftl | 152 + vraptor/src/main/webapp/META-INF/MANIFEST.MF | 3 + .../main/webapp/WEB-INF/jsp/index/index.jsp | 10 + vraptor/src/main/webapp/WEB-INF/web.xml | 19 + vraptor/src/main/webapp/css/clean-blog.css | 400 + .../src/main/webapp/css/clean-blog.min.css | 5 + vraptor/src/main/webapp/img/about-bg.jpg | Bin 0 -> 33097 bytes vraptor/src/main/webapp/img/contact-bg.jpg | Bin 0 -> 290070 bytes vraptor/src/main/webapp/img/home-bg.jpg | Bin 0 -> 172779 bytes vraptor/src/main/webapp/img/post-bg.jpg | Bin 0 -> 140909 bytes .../src/main/webapp/img/post-sample-image.jpg | Bin 0 -> 115144 bytes vraptor/src/main/webapp/js/clean-blog.js | 40 + vraptor/src/main/webapp/js/clean-blog.min.js | 6 + vraptor/src/main/webapp/js/contact_me.js | 72 + .../main/webapp/js/jqBootstrapValidation.js | 912 ++ .../webapp/vendor/bootstrap/css/bootstrap.css | 6757 ++++++++++ .../vendor/bootstrap/css/bootstrap.min.css | 6 + .../fonts/glyphicons-halflings-regular.eot | Bin 0 -> 20127 bytes .../fonts/glyphicons-halflings-regular.svg | 288 + .../fonts/glyphicons-halflings-regular.ttf | Bin 0 -> 45404 bytes .../fonts/glyphicons-halflings-regular.woff | Bin 0 -> 23424 bytes .../fonts/glyphicons-halflings-regular.woff2 | Bin 0 -> 18028 bytes .../webapp/vendor/bootstrap/js/bootstrap.js | 2377 ++++ .../vendor/bootstrap/js/bootstrap.min.js | 7 + .../vendor/font-awesome/css/font-awesome.css | 2199 +++ .../font-awesome/css/font-awesome.min.css | 4 + .../vendor/font-awesome/fonts/FontAwesome.otf | Bin 0 -> 124988 bytes .../fonts/fontawesome-webfont.eot | Bin 0 -> 76518 bytes .../fonts/fontawesome-webfont.svg | 685 + .../fonts/fontawesome-webfont.ttf | Bin 0 -> 152796 bytes .../fonts/fontawesome-webfont.woff | Bin 0 -> 90412 bytes .../fonts/fontawesome-webfont.woff2 | Bin 0 -> 71896 bytes .../vendor/font-awesome/less/animated.less | 34 + .../font-awesome/less/bordered-pulled.less | 25 + .../webapp/vendor/font-awesome/less/core.less | 12 + .../vendor/font-awesome/less/fixed-width.less | 6 + .../font-awesome/less/font-awesome.less | 18 + .../vendor/font-awesome/less/icons.less | 733 + .../vendor/font-awesome/less/larger.less | 13 + .../webapp/vendor/font-awesome/less/list.less | 19 + .../vendor/font-awesome/less/mixins.less | 60 + .../webapp/vendor/font-awesome/less/path.less | 15 + .../font-awesome/less/rotated-flipped.less | 20 + .../font-awesome/less/screen-reader.less | 5 + .../vendor/font-awesome/less/stacked.less | 20 + .../vendor/font-awesome/less/variables.less | 744 ++ .../vendor/font-awesome/scss/_animated.scss | 34 + .../font-awesome/scss/_bordered-pulled.scss | 25 + .../vendor/font-awesome/scss/_core.scss | 12 + .../font-awesome/scss/_fixed-width.scss | 6 + .../vendor/font-awesome/scss/_icons.scss | 733 + .../vendor/font-awesome/scss/_larger.scss | 13 + .../vendor/font-awesome/scss/_list.scss | 19 + .../vendor/font-awesome/scss/_mixins.scss | 60 + .../vendor/font-awesome/scss/_path.scss | 15 + .../font-awesome/scss/_rotated-flipped.scss | 20 + .../font-awesome/scss/_screen-reader.scss | 5 + .../vendor/font-awesome/scss/_stacked.scss | 20 + .../vendor/font-awesome/scss/_variables.scss | 744 ++ .../font-awesome/scss/font-awesome.scss | 18 + .../src/main/webapp/vendor/jquery/jquery.js | 11008 ++++++++++++++++ .../main/webapp/vendor/jquery/jquery.min.js | 5 + 82 files changed, 29937 insertions(+) create mode 100644 vraptor/.gitignore create mode 100644 vraptor/README.md create mode 100644 vraptor/pom.xml create mode 100644 vraptor/src/main/java/com/baeldung/config/UserInfo.java create mode 100644 vraptor/src/main/java/com/baeldung/controllers/AuthController.java create mode 100644 vraptor/src/main/java/com/baeldung/controllers/IndexController.java create mode 100644 vraptor/src/main/java/com/baeldung/controllers/PostController.java create mode 100644 vraptor/src/main/java/com/baeldung/daos/PostDao.java create mode 100644 vraptor/src/main/java/com/baeldung/daos/UserDao.java create mode 100644 vraptor/src/main/java/com/baeldung/models/Post.java create mode 100644 vraptor/src/main/java/com/baeldung/models/User.java create mode 100644 vraptor/src/main/resources/META-INF/beans.xml create mode 100644 vraptor/src/main/resources/database.sql create mode 100644 vraptor/src/main/resources/hibernate.cfg.xml create mode 100644 vraptor/src/main/resources/log4j.xml create mode 100644 vraptor/src/main/resources/templates/auth/login.ftl create mode 100644 vraptor/src/main/resources/templates/auth/register.ftl create mode 100644 vraptor/src/main/resources/templates/index.ftl create mode 100644 vraptor/src/main/resources/templates/posts/add.ftl create mode 100644 vraptor/src/main/resources/templates/view.ftl create mode 100644 vraptor/src/main/webapp/META-INF/MANIFEST.MF create mode 100644 vraptor/src/main/webapp/WEB-INF/jsp/index/index.jsp create mode 100644 vraptor/src/main/webapp/WEB-INF/web.xml create mode 100644 vraptor/src/main/webapp/css/clean-blog.css create mode 100644 vraptor/src/main/webapp/css/clean-blog.min.css create mode 100644 vraptor/src/main/webapp/img/about-bg.jpg create mode 100644 vraptor/src/main/webapp/img/contact-bg.jpg create mode 100644 vraptor/src/main/webapp/img/home-bg.jpg create mode 100644 vraptor/src/main/webapp/img/post-bg.jpg create mode 100644 vraptor/src/main/webapp/img/post-sample-image.jpg create mode 100644 vraptor/src/main/webapp/js/clean-blog.js create mode 100644 vraptor/src/main/webapp/js/clean-blog.min.js create mode 100644 vraptor/src/main/webapp/js/contact_me.js create mode 100644 vraptor/src/main/webapp/js/jqBootstrapValidation.js create mode 100644 vraptor/src/main/webapp/vendor/bootstrap/css/bootstrap.css create mode 100644 vraptor/src/main/webapp/vendor/bootstrap/css/bootstrap.min.css create mode 100644 vraptor/src/main/webapp/vendor/bootstrap/fonts/glyphicons-halflings-regular.eot create mode 100644 vraptor/src/main/webapp/vendor/bootstrap/fonts/glyphicons-halflings-regular.svg create mode 100644 vraptor/src/main/webapp/vendor/bootstrap/fonts/glyphicons-halflings-regular.ttf create mode 100644 vraptor/src/main/webapp/vendor/bootstrap/fonts/glyphicons-halflings-regular.woff create mode 100644 vraptor/src/main/webapp/vendor/bootstrap/fonts/glyphicons-halflings-regular.woff2 create mode 100644 vraptor/src/main/webapp/vendor/bootstrap/js/bootstrap.js create mode 100644 vraptor/src/main/webapp/vendor/bootstrap/js/bootstrap.min.js create mode 100644 vraptor/src/main/webapp/vendor/font-awesome/css/font-awesome.css create mode 100644 vraptor/src/main/webapp/vendor/font-awesome/css/font-awesome.min.css create mode 100644 vraptor/src/main/webapp/vendor/font-awesome/fonts/FontAwesome.otf create mode 100644 vraptor/src/main/webapp/vendor/font-awesome/fonts/fontawesome-webfont.eot create mode 100644 vraptor/src/main/webapp/vendor/font-awesome/fonts/fontawesome-webfont.svg create mode 100644 vraptor/src/main/webapp/vendor/font-awesome/fonts/fontawesome-webfont.ttf create mode 100644 vraptor/src/main/webapp/vendor/font-awesome/fonts/fontawesome-webfont.woff create mode 100644 vraptor/src/main/webapp/vendor/font-awesome/fonts/fontawesome-webfont.woff2 create mode 100644 vraptor/src/main/webapp/vendor/font-awesome/less/animated.less create mode 100644 vraptor/src/main/webapp/vendor/font-awesome/less/bordered-pulled.less create mode 100644 vraptor/src/main/webapp/vendor/font-awesome/less/core.less create mode 100644 vraptor/src/main/webapp/vendor/font-awesome/less/fixed-width.less create mode 100644 vraptor/src/main/webapp/vendor/font-awesome/less/font-awesome.less create mode 100644 vraptor/src/main/webapp/vendor/font-awesome/less/icons.less create mode 100644 vraptor/src/main/webapp/vendor/font-awesome/less/larger.less create mode 100644 vraptor/src/main/webapp/vendor/font-awesome/less/list.less create mode 100644 vraptor/src/main/webapp/vendor/font-awesome/less/mixins.less create mode 100644 vraptor/src/main/webapp/vendor/font-awesome/less/path.less create mode 100644 vraptor/src/main/webapp/vendor/font-awesome/less/rotated-flipped.less create mode 100644 vraptor/src/main/webapp/vendor/font-awesome/less/screen-reader.less create mode 100644 vraptor/src/main/webapp/vendor/font-awesome/less/stacked.less create mode 100644 vraptor/src/main/webapp/vendor/font-awesome/less/variables.less create mode 100644 vraptor/src/main/webapp/vendor/font-awesome/scss/_animated.scss create mode 100644 vraptor/src/main/webapp/vendor/font-awesome/scss/_bordered-pulled.scss create mode 100644 vraptor/src/main/webapp/vendor/font-awesome/scss/_core.scss create mode 100644 vraptor/src/main/webapp/vendor/font-awesome/scss/_fixed-width.scss create mode 100644 vraptor/src/main/webapp/vendor/font-awesome/scss/_icons.scss create mode 100644 vraptor/src/main/webapp/vendor/font-awesome/scss/_larger.scss create mode 100644 vraptor/src/main/webapp/vendor/font-awesome/scss/_list.scss create mode 100644 vraptor/src/main/webapp/vendor/font-awesome/scss/_mixins.scss create mode 100644 vraptor/src/main/webapp/vendor/font-awesome/scss/_path.scss create mode 100644 vraptor/src/main/webapp/vendor/font-awesome/scss/_rotated-flipped.scss create mode 100644 vraptor/src/main/webapp/vendor/font-awesome/scss/_screen-reader.scss create mode 100644 vraptor/src/main/webapp/vendor/font-awesome/scss/_stacked.scss create mode 100644 vraptor/src/main/webapp/vendor/font-awesome/scss/_variables.scss create mode 100644 vraptor/src/main/webapp/vendor/font-awesome/scss/font-awesome.scss create mode 100644 vraptor/src/main/webapp/vendor/jquery/jquery.js create mode 100644 vraptor/src/main/webapp/vendor/jquery/jquery.min.js diff --git a/pom.xml b/pom.xml index 1216ee3b13..5eb1bb257d 100644 --- a/pom.xml +++ b/pom.xml @@ -264,6 +264,7 @@ deeplearning4j spring-boot-admin lucene + vraptor diff --git a/vraptor/.gitignore b/vraptor/.gitignore new file mode 100644 index 0000000000..27dc294cd1 --- /dev/null +++ b/vraptor/.gitignore @@ -0,0 +1,4 @@ + +/target/ +/.idea/ +/src/main/webapp/WEB-INF/classes/ diff --git a/vraptor/README.md b/vraptor/README.md new file mode 100644 index 0000000000..d547fc1274 --- /dev/null +++ b/vraptor/README.md @@ -0,0 +1,13 @@ +# VRaptor blank project + +This is a blank project to help you to use VRaptor. You can easily import in you IDE as Maven project. + +Este é um projeto em branco para ajudar você a usar o VRaptor. Você pode facilmente importá-lo na sua IDE favorita como um projeto Maven. + +Após criar seu projeto você pode rodá-lo com um tomcat7 ou +: + +``` +mvn tomcat7:run +``` + +Cuidado para *jamais* executar `mvn tomcat:run` pois ele usará um tomcat6 (incompatível). diff --git a/vraptor/pom.xml b/vraptor/pom.xml new file mode 100644 index 0000000000..49b0922ddd --- /dev/null +++ b/vraptor/pom.xml @@ -0,0 +1,134 @@ + + 4.0.0 + + com.baeldung + vraptor + 1.0.0 + war + + A demo project to start using VRaptor 4 + + + UTF-8 + 2.1.2.Final + + + + + br.com.caelum + vraptor + 4.2.0.Final + + + + org.jboss.weld.servlet + weld-servlet-core + 2.1.2.Final + + + org.jboss.spec.javax.el + jboss-el-api_3.0_spec + + + + + + org.jboss.weld + weld-core-impl + 2.1.2.Final + + + org.jboss.spec.javax.el + jboss-el-api_3.0_spec + + + + + + javax.el + el-api + 2.2 + provided + + + + org.hibernate + hibernate-validator-cdi + 5.1.1.Final + + + + javax.servlet + jstl + 1.2 + + + + javax.servlet + javax.servlet-api + 3.1.0 + provided + + + + org.slf4j + slf4j-log4j12 + 1.7.5 + + + + br.com.caelum.vraptor + vraptor-freemarker + 4.1.0-RC3 + + + + br.com.caelum.vraptor + vraptor-hibernate + 4.0.4 + + + + mysql + mysql-connector-java + 8.0.8-dmr + + + + org.mindrot + jbcrypt + 0.4 + + + + org.freemarker + freemarker + 2.3.27-incubating + + + + + + vraptor + src/main/webapp/WEB-INF/classes + + + org.apache.maven.plugins + maven-compiler-plugin + 3.1 + + 1.8 + 1.8 + + + + org.apache.tomcat.maven + tomcat7-maven-plugin + 2.1 + + / + + + + + diff --git a/vraptor/src/main/java/com/baeldung/config/UserInfo.java b/vraptor/src/main/java/com/baeldung/config/UserInfo.java new file mode 100644 index 0000000000..2613128790 --- /dev/null +++ b/vraptor/src/main/java/com/baeldung/config/UserInfo.java @@ -0,0 +1,23 @@ +package com.baeldung.config; + +import com.baeldung.models.User; + +import javax.enterprise.context.SessionScoped; +import java.io.Serializable; + +@SessionScoped +public class UserInfo implements Serializable { + + private User user; + + + public UserInfo() {} + + public User getUser() { + return user; + } + + public void setUser(User user) { + this.user = user; + } +} diff --git a/vraptor/src/main/java/com/baeldung/controllers/AuthController.java b/vraptor/src/main/java/com/baeldung/controllers/AuthController.java new file mode 100644 index 0000000000..ed2d3fdba7 --- /dev/null +++ b/vraptor/src/main/java/com/baeldung/controllers/AuthController.java @@ -0,0 +1,99 @@ +package com.baeldung.controllers; + +import br.com.caelum.vraptor.*; +import br.com.caelum.vraptor.freemarker.FreemarkerView; +import br.com.caelum.vraptor.validator.Validator; +import com.baeldung.config.UserInfo; +import com.baeldung.daos.UserDao; +import com.baeldung.models.User; +import org.mindrot.jbcrypt.BCrypt; + +import javax.inject.Inject; +import javax.servlet.http.HttpServletRequest; +import java.util.Objects; +import java.util.logging.Logger; + +@Controller +public class AuthController { + + private Validator validator; + private UserDao userDao; + private Result result; + private UserInfo userInfo; + private Logger logger = Logger.getLogger(getClass().getName()); + + public AuthController() { + this(null, null, null, null); + } + + @Inject + public AuthController(Validator validator, UserDao userDao, Result result, UserInfo userInfo) { + this.validator = validator; + this.userDao = userDao; + this.result = result; + this.userInfo = userInfo; + } + + @Get("/register") + public void registrationForm() { + result.use(FreemarkerView.class).withTemplate("auth/register"); + } + + @Post("/register") + public void register(User user, HttpServletRequest request) { + + validator.validate(user); + + if(validator.hasErrors()) { + result.include("errors", validator.getErrors()); + } + + validator.onErrorRedirectTo(this).registrationForm(); + + if(!user.getPassword() + .equals(request.getParameter("password_confirmation"))) { + result.include("error", "Passwords Do Not Match"); + result.redirectTo(this).registrationForm(); + } + + user.setPassword( + BCrypt.hashpw(user.getPassword(), BCrypt.gensalt())); + + Object resp = userDao.add(user); + + if(resp != null) { + result.include("status", "Registration Successful! Now Login"); + result.redirectTo(this).loginForm(); + } else { + result.include("error", "There was an error during registration"); + result.redirectTo(this).registrationForm(); + } + } + + @Get("/login") + public void loginForm() { + result.use(FreemarkerView.class).withTemplate("auth/login"); + } + + @Post("/login") + public void login(HttpServletRequest request) { + + String password = request.getParameter("user.password"); + String email = request.getParameter("user.email"); + + if(email.isEmpty() || password.isEmpty()) { + result.include("error", "Email/Password is Required!"); + result.redirectTo(AuthController.class).loginForm(); + } + + User user = userDao.findByEmail(email); + if(user != null && BCrypt.checkpw(password, user.getPassword())) { + userInfo.setUser(user); + result.include("status", "Login Successful!"); + result.redirectTo(IndexController.class).index(); + } else { + result.include("error", "Email/Password Does Not Match!"); + result.redirectTo(AuthController.class).loginForm(); + } + } +} diff --git a/vraptor/src/main/java/com/baeldung/controllers/IndexController.java b/vraptor/src/main/java/com/baeldung/controllers/IndexController.java new file mode 100644 index 0000000000..cca34f5447 --- /dev/null +++ b/vraptor/src/main/java/com/baeldung/controllers/IndexController.java @@ -0,0 +1,40 @@ +package com.baeldung.controllers; + +import br.com.caelum.vraptor.Controller; +import br.com.caelum.vraptor.Path; +import br.com.caelum.vraptor.Result; +import br.com.caelum.vraptor.freemarker.FreemarkerView; +import com.baeldung.daos.PostDao; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import javax.inject.Inject; + +@Controller +public class IndexController { + + private PostDao postDao; + private final Result result; + private static final Logger logger = LoggerFactory.getLogger(IndexController.class); + + public IndexController() { + this(null, null); + } + + @Inject + public IndexController(Result result, PostDao postDao) { + this.result = result; + this.postDao = postDao; + } + + @Path("/") + public void index() { + result.include("posts", postDao.all()); + result.use(FreemarkerView.class).withTemplate("index"); + } + + + + + +} \ No newline at end of file diff --git a/vraptor/src/main/java/com/baeldung/controllers/PostController.java b/vraptor/src/main/java/com/baeldung/controllers/PostController.java new file mode 100644 index 0000000000..979d0c28e2 --- /dev/null +++ b/vraptor/src/main/java/com/baeldung/controllers/PostController.java @@ -0,0 +1,77 @@ +package com.baeldung.controllers; + +import br.com.caelum.vraptor.Controller; +import br.com.caelum.vraptor.Get; +import br.com.caelum.vraptor.Path; +import br.com.caelum.vraptor.Result; +import br.com.caelum.vraptor.freemarker.FreemarkerView; +import br.com.caelum.vraptor.validator.Validator; +import com.baeldung.config.UserInfo; +import com.baeldung.daos.PostDao; +import com.baeldung.models.Post; + +import javax.inject.Inject; +import javax.servlet.http.HttpServletRequest; +import java.util.Objects; +import java.util.logging.Logger; + +@Controller +public class PostController { + + private Result result; + private Logger logger = Logger.getLogger(PostController.class.getName()); + private PostDao postDao; + private UserInfo userInfo; + private Validator validator; + + public PostController() {} + + @Inject + public PostController(Result result, PostDao postDao, UserInfo userInfo, Validator validator) { + this.result = result; + this.postDao = postDao; + this.userInfo = userInfo; + this.validator = validator; + } + + @Get("/post/add") + public void addForm() { + + if(Objects.isNull(userInfo.getUser())) { + result.include("error", "Please Login to Proceed"); + result.redirectTo(AuthController.class).loginForm(); + return; + } + + result.use(FreemarkerView.class).withTemplate("posts/add"); + } + + @br.com.caelum.vraptor.Post("/post/add") + public void add(Post post) { + post.setAuthor(userInfo.getUser()); + validator.validate(post); + if(validator.hasErrors()) + result.include("errors", validator.getErrors()); + validator.onErrorRedirectTo(this).addForm(); + + Object id = postDao.add(post); + + if(Objects.nonNull(id)) { + result.include("status", "Post Added Successfully"); + result.redirectTo(IndexController.class).index(); + } else { + result.include( + "error", "There was an error creating the post. Try Again"); + result.redirectTo(this).addForm(); + } + } + + @Get("/posts/{id}") + public void view(int id) { + result.include("post", postDao.findById(id)); + result.use(FreemarkerView.class).withTemplate("view"); + } + + + +} diff --git a/vraptor/src/main/java/com/baeldung/daos/PostDao.java b/vraptor/src/main/java/com/baeldung/daos/PostDao.java new file mode 100644 index 0000000000..e9a62b5b5e --- /dev/null +++ b/vraptor/src/main/java/com/baeldung/daos/PostDao.java @@ -0,0 +1,54 @@ +package com.baeldung.daos; + +import com.baeldung.controllers.PostController; +import com.baeldung.models.Post; +import org.hibernate.Session; +import org.hibernate.SessionFactory; + +import javax.enterprise.context.RequestScoped; +import javax.inject.Inject; +import java.util.List; +import java.util.logging.Logger; + +@RequestScoped +public class PostDao { + + private Logger logger = Logger.getLogger(PostController.class.getName()); + private SessionFactory sessionFactory; + + public PostDao() {} + + @Inject + public PostDao(SessionFactory sessionFactory) { + this.sessionFactory = sessionFactory; + } + + public Object add(Post post) { + Session session = sessionFactory.openSession(); + session.beginTransaction(); + Object id = session.save(post); + session.getTransaction().commit(); + session.close(); + return id; + } + + public Post findById(int id) { + Session session = sessionFactory.openSession(); + session.beginTransaction(); + Post post = (Post) session.get(Post.class, id); + session.getTransaction().commit(); + session.close(); + return post; + } + + + public List all() { + Session session = sessionFactory.openSession(); + session.beginTransaction(); + List posts = (List) session.createQuery("FROM Post p").list(); + session.getTransaction().commit(); + session.close(); + return posts; + } + +} diff --git a/vraptor/src/main/java/com/baeldung/daos/UserDao.java b/vraptor/src/main/java/com/baeldung/daos/UserDao.java new file mode 100644 index 0000000000..6af1a49d25 --- /dev/null +++ b/vraptor/src/main/java/com/baeldung/daos/UserDao.java @@ -0,0 +1,50 @@ +package com.baeldung.daos; + +import com.baeldung.models.User; +import org.hibernate.Criteria; +import org.hibernate.Session; +import org.hibernate.SessionFactory; +import org.hibernate.criterion.Criterion; +import org.hibernate.criterion.Restrictions; +import org.omg.PortableInterceptor.LOCATION_FORWARD; + +import javax.enterprise.context.RequestScoped; +import javax.inject.Inject; +import java.util.logging.Logger; + +@RequestScoped +public class UserDao { + + SessionFactory sessionFactory; + + public UserDao() { + this(null); + } + + @Inject + public UserDao(SessionFactory sessionFactory) { + this.sessionFactory = sessionFactory; + } + + + public Object add(User user) { + Session session = sessionFactory.openSession(); + session.beginTransaction(); + Object Id = session.save(user); + session.getTransaction().commit(); + return Id; + } + + public User findByEmail(String email) { + Session session = sessionFactory.openSession(); + session.beginTransaction(); + Criteria criteria = session.createCriteria(User.class); + criteria.add(Restrictions.eq("email", email)); + criteria.setMaxResults(1); + User u = (User) criteria.uniqueResult(); + session.getTransaction().commit(); + session.close(); + return u; + } + +} diff --git a/vraptor/src/main/java/com/baeldung/models/Post.java b/vraptor/src/main/java/com/baeldung/models/Post.java new file mode 100644 index 0000000000..6beb6e1682 --- /dev/null +++ b/vraptor/src/main/java/com/baeldung/models/Post.java @@ -0,0 +1,105 @@ +package com.baeldung.models; + + +import javax.persistence.*; +import javax.validation.constraints.NotNull; +import javax.validation.constraints.Size; +import java.time.LocalDateTime; +import java.util.Date; +import java.util.logging.Logger; + +@Entity +@Table(name = "posts") +public class Post { + + @Id + @GeneratedValue(strategy = GenerationType.AUTO) + private int id; + + @NotNull @Size(min = 10) + @Column(columnDefinition = "longtext") + private String post; + + @NotNull @Size(min = 5, max = 100) + @Column(unique = true) + private String title; + + @NotNull + @ManyToOne(targetEntity = User.class, optional = false) + private User author; + + @Column(name = "created_at") + private Date createdAt; + + @Column(name = "updated_at") + private Date updatedAt; + + @Transient + private Logger logger = Logger.getLogger(getClass().getName()); + + public Post() { + createdAt = new Date(); + updatedAt = new Date(); + } + + public Post(String title, String post, User author) { + this.title = title; + this.post = post; + this.author = author; + createdAt = new Date(); + updatedAt = new Date(); + } + + public int getId() { + return id; + } + + public String getPost() { + return post; + } + + public void setPost(String post) { + this.post = post; + } + + public String getTitle() { + return title; + } + + public void setTitle(String title) { + this.title = title; + } + + public User getAuthor() { + return author; + } + + public void setAuthor(User author) { + this.author = author; + } + + public Date getCreatedAt() { + return createdAt; + } + + public void setCreatedAt(Date createdAt) { + this.createdAt = createdAt; + } + + public Date getUpdatedAt() { + return updatedAt; + } + + public void setUpdatedAt(Date updatedAt) { + this.updatedAt = updatedAt; + } + + @Override + public String toString() { + return "title: " + this.title + + "\npost: " + this.post + + "\nauthor: " + this.author + +"\ncreatetdAt: " + this.createdAt + + "\nupdatedAt: " + this.updatedAt; + } +} diff --git a/vraptor/src/main/java/com/baeldung/models/User.java b/vraptor/src/main/java/com/baeldung/models/User.java new file mode 100644 index 0000000000..b0f3bd9500 --- /dev/null +++ b/vraptor/src/main/java/com/baeldung/models/User.java @@ -0,0 +1,101 @@ +package com.baeldung.models; + +import org.hibernate.validator.constraints.Email; + +import javax.persistence.*; +import javax.validation.constraints.NotNull; +import javax.validation.constraints.Pattern; +import javax.validation.constraints.Size; +import java.time.LocalDateTime; +import java.util.Date; + +@Entity +@Table(name = "users") +public class User { + + @Id + @GeneratedValue(strategy = GenerationType.AUTO) + private int id; + + @NotNull + @Size(min=3, max=255) + private String name; + + @Column(unique = true) + @NotNull @Email + private String email; + + @NotNull + @Size(min=6, max=255) + private String password; + + @Column(name = "created_at") + private Date createdAt; + + @Column(name = "updated_at") + private Date updatedAt; + + public User() { + updatedAt = new Date(); + createdAt = new Date(); + } + + public User(String name, String email, String password) { + this.name = name; + this.email = email; + this.password = password; + createdAt = new Date(); + updatedAt = new Date(); + } + + public int getId() { + return id; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getEmail() { + return email; + } + + public void setEmail(String email) { + this.email = email; + } + + public String getPassword() { + return password; + } + + public void setPassword(String password) { + this.password = password; + } + + public Date getCreatedAt() { + return createdAt; + } + + public void setCreatedAt(Date createdAt) { + this.createdAt = createdAt; + } + + public Date getUpdatedAt() { + return updatedAt; + } + + public void setUpdatedAt(Date updatedAt) { + this.updatedAt = updatedAt; + } + + + @Override + public String toString() { + return "Name: " + this.name + + "\nEmail: " + this.email; + } +} diff --git a/vraptor/src/main/resources/META-INF/beans.xml b/vraptor/src/main/resources/META-INF/beans.xml new file mode 100644 index 0000000000..9e32823437 --- /dev/null +++ b/vraptor/src/main/resources/META-INF/beans.xml @@ -0,0 +1,8 @@ + + + + \ No newline at end of file diff --git a/vraptor/src/main/resources/database.sql b/vraptor/src/main/resources/database.sql new file mode 100644 index 0000000000..bd4a1a6bde --- /dev/null +++ b/vraptor/src/main/resources/database.sql @@ -0,0 +1,55 @@ +/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */; +/*!40101 SET NAMES utf8 */; +/*!50503 SET NAMES utf8mb4 */; +/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */; +/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */; + +CREATE DATABASE IF NOT EXISTS `larablog` /*!40100 DEFAULT CHARACTER SET latin1 */; +USE `larablog`; + +CREATE TABLE IF NOT EXISTS `posts` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `title` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL, + `post` longtext COLLATE utf8mb4_unicode_ci NOT NULL, + `author_id` int(11) DEFAULT NULL, + `published` tinyint(1) NOT NULL DEFAULT 0, + `views` int(11) NOT NULL DEFAULT 0, + `created_at` timestamp NULL DEFAULT NULL, + `updated_at` timestamp NULL DEFAULT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; + +DELETE FROM `posts`; +/*!40000 ALTER TABLE `posts` DISABLE KEYS */; +INSERT INTO `posts` (`id`, `title`, `post`, `author_id`, `published`, `views`, `created_at`, `updated_at`) VALUES + (2, 'Sample Post 2', 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nunc lobortis, ante in pretium volutpat, risus metus molestie odio, non placerat magna diam sit amet augue. Donec ullamcorper ornare mauris, id bibendum lacus viverra vel. Curabitur in pellentesque metus. Quisque gravida molestie turpis, id tincidunt purus viverra vitae. In sollicitudin, arcu at interdum sagittis, massa mi cursus diam, eu sodales purus erat vitae dui. Curabitur tempus urna consequat odio pretium pellentesque. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Etiam tincidunt eros orci, sit amet pharetra eros accumsan vitae. Quisque a massa id nisi sodales rhoncus sed ut ante. Duis sed augue non velit feugiat varius eget eu velit. Nam commodo posuere massa sed convallis. Phasellus dapibus commodo lectus, vitae gravida lorem. Donec molestie a nisi ac mattis. Interdum et malesuada fames ac ante ipsum primis in faucibus. Aliquam tempor ante et rutrum consequat.', 11, 1, 100, '2017-12-12 18:48:19', NULL), + (3, 'Sample Post 3', 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nunc lobortis, ante in pretium volutpat, risus metus molestie odio, non placerat magna diam sit amet augue. Donec ullamcorper ornare mauris, id bibendum lacus viverra vel. Curabitur in pellentesque metus. Quisque gravida molestie turpis, id tincidunt purus viverra vitae. In sollicitudin, arcu at interdum sagittis, massa mi cursus diam, eu sodales purus erat vitae dui. Curabitur tempus urna consequat odio pretium pellentesque. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Etiam tincidunt eros orci, sit amet pharetra eros accumsan vitae. Quisque a massa id nisi sodales rhoncus sed ut ante. Duis sed augue non velit feugiat varius eget eu velit. Nam commodo posuere massa sed convallis. Phasellus dapibus commodo lectus, vitae gravida lorem. Donec molestie a nisi ac mattis. Interdum et malesuada fames ac ante ipsum primis in faucibus. Aliquam tempor ante et rutrum consequat.', 11, 1, 100, '2017-12-12 18:48:22', NULL), + (4, 'Sample Post 2212', 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nunc lobortis, ante in pretium volutpat, risus metus molestie odio, non placerat magna diam sit amet augue. Donec ullamcorper ornare mauris, id bibendum lacus viverra vel. Curabitur in pellentesque metus. Quisque gravida molestie turpis, id tincidunt purus viverra vitae. In sollicitudin, arcu at interdum sagittis, massa mi cursus diam, eu sodales purus erat vitae dui. Curabitur tempus urna consequat odio pretium pellentesque. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Etiam tincidunt eros orci, sit amet pharetra eros accumsan vitae. Quisque a massa id nisi sodales rhoncus sed ut ante. Duis sed augue non velit feugiat varius eget eu velit. Nam commodo posuere massa sed convallis. Phasellus dapibus commodo lectus, vitae gravida lorem. Donec molestie a nisi ac mattis. Interdum et malesuada fames ac ante ipsum primis in faucibus. Aliquam tempor ante et rutrum consequat.', 11, 1, 100, '2017-12-12 18:48:24', NULL), + (9, 'This is a Test', 'HJh sahjnasj hjas hjashj ashj ashj ashjsa sahjass naskjasnmas', 11, 0, 0, NULL, NULL), + (10, 'Test Title', 'hjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjj jjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjj', 11, 0, 0, NULL, NULL), + (11, 'Test Title 2', 'This is a as as sa asmas as as as as as', 11, 0, 0, NULL, NULL), + (12, 'This is another Test Article', 'There are many variations of passages of Lorem Ipsum available, but the majority have suffered alteration in some form, by injected humour, or randomised words which don\'t look even slightly believable. If you are going to use a passage of Lorem Ipsum, you need to be sure there isn\'t anything embarrassing hidden in the middle of text. All the Lorem Ipsum generators on the Internet tend to repeat predefined chunks as necessary, making this the first true generator on the Internet. It uses a dictionary of over 200 Latin words, combined with a handful of model sentence structures, to generate Lorem Ipsum which looks reasonable. The generated Lorem Ipsum is therefore always free from repetition, injected humour, or non-characteristic words etc.', 11, 0, 0, '2017-12-14 03:48:52', '2017-12-14 03:48:52'); +/*!40000 ALTER TABLE `posts` ENABLE KEYS */; + +CREATE TABLE IF NOT EXISTS `users` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `name` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL, + `email` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL, + `password` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL, + `is_admin` int(10) unsigned NULL DEFAULT 0, + `remember_token` varchar(100) COLLATE utf8mb4_unicode_ci DEFAULT NULL, + `created_at` timestamp NULL DEFAULT NULL, + `updated_at` timestamp NULL DEFAULT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `users_email_unique` (`email`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; + +DELETE FROM `users`; +/*!40000 ALTER TABLE `users` DISABLE KEYS */; +INSERT INTO `users` (`id`, `name`, `email`, `password`, `is_admin`, `remember_token`, `created_at`, `updated_at`) VALUES + (11, 'Test User', 'test@test.com', '$2a$10$i/TgIqC3xRMnqCEbDryfxuZqhfM/qekfsaQUjBVPUKiiB3Nofr/wO', 0, NULL, '2017-12-14 03:40:57', '2017-12-14 03:40:57'); +/*!40000 ALTER TABLE `users` ENABLE KEYS */; + +/*!40101 SET SQL_MODE=IFNULL(@OLD_SQL_MODE, '') */; +/*!40014 SET FOREIGN_KEY_CHECKS=IF(@OLD_FOREIGN_KEY_CHECKS IS NULL, 1, @OLD_FOREIGN_KEY_CHECKS) */; +/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */; diff --git a/vraptor/src/main/resources/hibernate.cfg.xml b/vraptor/src/main/resources/hibernate.cfg.xml new file mode 100644 index 0000000000..dad0b44683 --- /dev/null +++ b/vraptor/src/main/resources/hibernate.cfg.xml @@ -0,0 +1,31 @@ + + + + + + org.hibernate.dialect.MySQLDialect + + + com.mysql.cj.jdbc.Driver + + + jdbc:mysql://127.0.0.1:3306/larablog?serverTimezone=UTC + + + root + + + root + + + true + + + true + + + + + + \ No newline at end of file diff --git a/vraptor/src/main/resources/log4j.xml b/vraptor/src/main/resources/log4j.xml new file mode 100644 index 0000000000..4e4c4636bc --- /dev/null +++ b/vraptor/src/main/resources/log4j.xml @@ -0,0 +1,36 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/vraptor/src/main/resources/templates/auth/login.ftl b/vraptor/src/main/resources/templates/auth/login.ftl new file mode 100644 index 0000000000..56ab2900cd --- /dev/null +++ b/vraptor/src/main/resources/templates/auth/login.ftl @@ -0,0 +1,172 @@ + + + + + + + + + + + + Clean Blog - Contact + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+
+
+

Clean Blog

+
+ A Clean Blog Theme by Start Bootstrap +
+
+
+
+
+ + +
+
+
+

Login

+
${error!""} ${status!""}
+
+
+
+ + +

+
+
+
+
+
+ + +

+
+
+
+
+
+
+ +
+
+
+
+
+
+ +
+ + + + + + + + + + + + + + + + + + + + diff --git a/vraptor/src/main/resources/templates/auth/register.ftl b/vraptor/src/main/resources/templates/auth/register.ftl new file mode 100644 index 0000000000..c65264c834 --- /dev/null +++ b/vraptor/src/main/resources/templates/auth/register.ftl @@ -0,0 +1,194 @@ + + + + + + + + + + + + Clean Blog - Contact + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+
+
+

Clean Blog

+
+ A Clean Blog Theme by Start Bootstrap +
+
+
+
+
+ + +
+
+
+

Register

+
${error!""} ${status!""}
+ <#if errors??> + <#list errors as error> +
${error.category?upper_case}: ${error.message}
+ <#else> + + <#else> + +
+
+
+ + +

+
+
+
+
+ + +

+
+
+
+
+
+ + +

+
+
+
+
+
+ + +

+
+
+
+
+
+
+ +
+
+
+
+
+
+ +
+ + + + + + + + + + + + + + + + + + + + diff --git a/vraptor/src/main/resources/templates/index.ftl b/vraptor/src/main/resources/templates/index.ftl new file mode 100644 index 0000000000..d65d73f534 --- /dev/null +++ b/vraptor/src/main/resources/templates/index.ftl @@ -0,0 +1,173 @@ + + + + + + + + + + + + Clean Blog + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+
+
+

Clean Blog

+
+ A Clean Blog Theme by Start Bootstrap +
+
+
+
+
+ + +
+
+
+
${error!""} ${status!""}
+ <#list posts as post> +
+ +

+ ${post.title} +

+

+ <#if (post.post?length > 50) >${post.post?substring(0,50)} <#else> ${post.post} +

+
+ +
+
+ <#else> +

+ NO POSTS YET! +

+ + + +
+
+
+ +
+ + + + + + + + + + + + + + + + + + + + diff --git a/vraptor/src/main/resources/templates/posts/add.ftl b/vraptor/src/main/resources/templates/posts/add.ftl new file mode 100644 index 0000000000..de036cea20 --- /dev/null +++ b/vraptor/src/main/resources/templates/posts/add.ftl @@ -0,0 +1,164 @@ + + + + + + + + + + + + Clean Blog - Contact + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+

Compose the Next Viral Message!

+
${error!""} ${status!""}
+ <#if errors??> + <#list errors as error> +
${error.category?upper_case}: ${error.message}
+ <#else> + + <#else> + +
+
+
+ + +

+
+
+
+
+ + +

+
+
+
+
+
+
+ +
+
+
+
+
+
+ +
+ + + + + + + + + + + + + + + + + + + + diff --git a/vraptor/src/main/resources/templates/view.ftl b/vraptor/src/main/resources/templates/view.ftl new file mode 100644 index 0000000000..96525cc93a --- /dev/null +++ b/vraptor/src/main/resources/templates/view.ftl @@ -0,0 +1,152 @@ + + + + + + + + + + + + Clean Blog - Sample Post + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+
+
+

${post.title}

+ Posted by Start Bootstrap on ${post.createdAt!''} +
+
+
+
+
+ + +
+
+
+
+

+ ${post.post} +

+
+
+
+
+ +
+ + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/vraptor/src/main/webapp/META-INF/MANIFEST.MF b/vraptor/src/main/webapp/META-INF/MANIFEST.MF new file mode 100644 index 0000000000..254272e1c0 --- /dev/null +++ b/vraptor/src/main/webapp/META-INF/MANIFEST.MF @@ -0,0 +1,3 @@ +Manifest-Version: 1.0 +Class-Path: + diff --git a/vraptor/src/main/webapp/WEB-INF/jsp/index/index.jsp b/vraptor/src/main/webapp/WEB-INF/jsp/index/index.jsp new file mode 100644 index 0000000000..61efbb9e1d --- /dev/null +++ b/vraptor/src/main/webapp/WEB-INF/jsp/index/index.jsp @@ -0,0 +1,10 @@ + + + + +VRaptor Blank Project + + + It works!! JSP ${variable} ${linkTo[IndexController].index} + + \ No newline at end of file diff --git a/vraptor/src/main/webapp/WEB-INF/web.xml b/vraptor/src/main/webapp/WEB-INF/web.xml new file mode 100644 index 0000000000..f778a0e779 --- /dev/null +++ b/vraptor/src/main/webapp/WEB-INF/web.xml @@ -0,0 +1,19 @@ + + + + vraptor-blank-project + + + javax.servlet.jsp.jstl.fmt.localizationContext + messages + + + + org.jboss.weld.environment.servlet.Listener + + + \ No newline at end of file diff --git a/vraptor/src/main/webapp/css/clean-blog.css b/vraptor/src/main/webapp/css/clean-blog.css new file mode 100644 index 0000000000..04a94f0e0f --- /dev/null +++ b/vraptor/src/main/webapp/css/clean-blog.css @@ -0,0 +1,400 @@ +/*! + * Start Bootstrap - Clean Blog v3.3.7+1 (http://startbootstrap.com/template-overviews/clean-blog) + * Copyright 2013-2016 Start Bootstrap + * Licensed under MIT (https://github.com/BlackrockDigital/startbootstrap/blob/gh-pages/LICENSE) + */ +body { + font-family: 'Lora', 'Times New Roman', serif; + font-size: 20px; + color: #333333; +} +p { + line-height: 1.5; + margin: 30px 0; +} +p a { + text-decoration: underline; +} +h1, +h2, +h3, +h4, +h5, +h6 { + font-family: 'Open Sans', 'Helvetica Neue', Helvetica, Arial, sans-serif; + font-weight: 800; +} +a { + color: #333333; +} +a:hover, +a:focus { + color: #0085A1; +} +a img:hover, +a img:focus { + cursor: zoom-in; +} +blockquote { + color: #777777; + font-style: italic; +} +hr.small { + max-width: 100px; + margin: 15px auto; + border-width: 4px; + border-color: white; +} +.navbar-custom { + position: absolute; + top: 0; + left: 0; + width: 100%; + z-index: 3; + font-family: 'Open Sans', 'Helvetica Neue', Helvetica, Arial, sans-serif; +} +.navbar-custom .navbar-brand { + font-weight: 800; +} +.navbar-custom .navbar-header .navbar-toggle { + color: #777777; + font-weight: 800; + text-transform: uppercase; + font-size: 12px; +} +.navbar-custom .nav li a { + text-transform: uppercase; + font-size: 12px; + font-weight: 800; + letter-spacing: 1px; +} +@media only screen and (min-width: 768px) { + .navbar-custom { + background: transparent; + border-bottom: 1px solid transparent; + } + .navbar-custom .navbar-brand { + color: white; + padding: 20px; + } + .navbar-custom .navbar-brand:hover, + .navbar-custom .navbar-brand:focus { + color: rgba(255, 255, 255, 0.8); + } + .navbar-custom .nav li a { + color: white; + padding: 20px; + } + .navbar-custom .nav li a:hover, + .navbar-custom .nav li a:focus { + color: rgba(255, 255, 255, 0.8); + } +} +@media only screen and (min-width: 1170px) { + .navbar-custom { + -webkit-transition: background-color 0.3s; + -moz-transition: background-color 0.3s; + transition: background-color 0.3s; + /* Force Hardware Acceleration in WebKit */ + -webkit-transform: translate3d(0, 0, 0); + -moz-transform: translate3d(0, 0, 0); + -ms-transform: translate3d(0, 0, 0); + -o-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + -webkit-backface-visibility: hidden; + backface-visibility: hidden; + } + .navbar-custom.is-fixed { + /* when the user scrolls down, we hide the header right above the viewport */ + position: fixed; + top: -61px; + background-color: rgba(255, 255, 255, 0.9); + border-bottom: 1px solid #f2f2f2; + -webkit-transition: -webkit-transform 0.3s; + -moz-transition: -moz-transform 0.3s; + transition: transform 0.3s; + } + .navbar-custom.is-fixed .navbar-brand { + color: #333333; + } + .navbar-custom.is-fixed .navbar-brand:hover, + .navbar-custom.is-fixed .navbar-brand:focus { + color: #0085A1; + } + .navbar-custom.is-fixed .nav li a { + color: #333333; + } + .navbar-custom.is-fixed .nav li a:hover, + .navbar-custom.is-fixed .nav li a:focus { + color: #0085A1; + } + .navbar-custom.is-visible { + /* if the user changes the scrolling direction, we show the header */ + -webkit-transform: translate3d(0, 100%, 0); + -moz-transform: translate3d(0, 100%, 0); + -ms-transform: translate3d(0, 100%, 0); + -o-transform: translate3d(0, 100%, 0); + transform: translate3d(0, 100%, 0); + } +} +.intro-header { + background-color: #777777; + background: no-repeat center center; + background-attachment: scroll; + -webkit-background-size: cover; + -moz-background-size: cover; + background-size: cover; + -o-background-size: cover; + margin-bottom: 50px; +} +.intro-header .site-heading, +.intro-header .post-heading, +.intro-header .page-heading { + padding: 100px 0 50px; + color: white; +} +@media only screen and (min-width: 768px) { + .intro-header .site-heading, + .intro-header .post-heading, + .intro-header .page-heading { + padding: 150px 0; + } +} +.intro-header .site-heading, +.intro-header .page-heading { + text-align: center; +} +.intro-header .site-heading h1, +.intro-header .page-heading h1 { + margin-top: 0; + font-size: 50px; +} +.intro-header .site-heading .subheading, +.intro-header .page-heading .subheading { + font-size: 24px; + line-height: 1.1; + display: block; + font-family: 'Open Sans', 'Helvetica Neue', Helvetica, Arial, sans-serif; + font-weight: 300; + margin: 10px 0 0; +} +@media only screen and (min-width: 768px) { + .intro-header .site-heading h1, + .intro-header .page-heading h1 { + font-size: 80px; + } +} +.intro-header .post-heading h1 { + font-size: 35px; +} +.intro-header .post-heading .subheading, +.intro-header .post-heading .meta { + line-height: 1.1; + display: block; +} +.intro-header .post-heading .subheading { + font-family: 'Open Sans', 'Helvetica Neue', Helvetica, Arial, sans-serif; + font-size: 24px; + margin: 10px 0 30px; + font-weight: 600; +} +.intro-header .post-heading .meta { + font-family: 'Lora', 'Times New Roman', serif; + font-style: italic; + font-weight: 300; + font-size: 20px; +} +.intro-header .post-heading .meta a { + color: white; +} +@media only screen and (min-width: 768px) { + .intro-header .post-heading h1 { + font-size: 55px; + } + .intro-header .post-heading .subheading { + font-size: 30px; + } +} +.post-preview > a { + color: #333333; +} +.post-preview > a:hover, +.post-preview > a:focus { + text-decoration: none; + color: #0085A1; +} +.post-preview > a > .post-title { + font-size: 30px; + margin-top: 30px; + margin-bottom: 10px; +} +.post-preview > a > .post-subtitle { + margin: 0; + font-weight: 300; + margin-bottom: 10px; +} +.post-preview > .post-meta { + color: #777777; + font-size: 18px; + font-style: italic; + margin-top: 0; +} +.post-preview > .post-meta > a { + text-decoration: none; + color: #333333; +} +.post-preview > .post-meta > a:hover, +.post-preview > .post-meta > a:focus { + color: #0085A1; + text-decoration: underline; +} +@media only screen and (min-width: 768px) { + .post-preview > a > .post-title { + font-size: 36px; + } +} +.section-heading { + font-size: 36px; + margin-top: 60px; + font-weight: 700; +} +.caption { + text-align: center; + font-size: 14px; + padding: 10px; + font-style: italic; + margin: 0; + display: block; + border-bottom-right-radius: 5px; + border-bottom-left-radius: 5px; +} +footer { + padding: 50px 0 65px; +} +footer .list-inline { + margin: 0; + padding: 0; +} +footer .copyright { + font-size: 14px; + text-align: center; + margin-bottom: 0; +} +.floating-label-form-group { + font-size: 14px; + position: relative; + margin-bottom: 0; + padding-bottom: 0.5em; + border-bottom: 1px solid #eeeeee; +} +.floating-label-form-group input, +.floating-label-form-group textarea { + z-index: 1; + position: relative; + padding-right: 0; + padding-left: 0; + border: none; + border-radius: 0; + font-size: 1.5em; + background: none; + box-shadow: none !important; + resize: none; +} +.floating-label-form-group label { + display: block; + z-index: 0; + position: relative; + top: 2em; + margin: 0; + font-size: 0.85em; + line-height: 1.764705882em; + vertical-align: middle; + vertical-align: baseline; + opacity: 0; + -webkit-transition: top 0.3s ease,opacity 0.3s ease; + -moz-transition: top 0.3s ease,opacity 0.3s ease; + -ms-transition: top 0.3s ease,opacity 0.3s ease; + transition: top 0.3s ease,opacity 0.3s ease; +} +.floating-label-form-group::not(:first-child) { + padding-left: 14px; + border-left: 1px solid #eeeeee; +} +.floating-label-form-group-with-value label { + top: 0; + opacity: 1; +} +.floating-label-form-group-with-focus label { + color: #0085A1; +} +form .row:first-child .floating-label-form-group { + border-top: 1px solid #eeeeee; +} +.btn { + font-family: 'Open Sans', 'Helvetica Neue', Helvetica, Arial, sans-serif; + text-transform: uppercase; + font-size: 14px; + font-weight: 800; + letter-spacing: 1px; + border-radius: 0; + padding: 15px 25px; +} +.btn-lg { + font-size: 16px; + padding: 25px 35px; +} +.btn-default:hover, +.btn-default:focus { + background-color: #0085A1; + border: 1px solid #0085A1; + color: white; +} +.pager { + margin: 20px 0 0; +} +.pager li > a, +.pager li > span { + font-family: 'Open Sans', 'Helvetica Neue', Helvetica, Arial, sans-serif; + text-transform: uppercase; + font-size: 14px; + font-weight: 800; + letter-spacing: 1px; + padding: 15px 25px; + background-color: white; + border-radius: 0; +} +.pager li > a:hover, +.pager li > a:focus { + color: white; + background-color: #0085A1; + border: 1px solid #0085A1; +} +.pager .disabled > a, +.pager .disabled > a:hover, +.pager .disabled > a:focus, +.pager .disabled > span { + color: #777777; + background-color: #333333; + cursor: not-allowed; +} +::-moz-selection { + color: white; + text-shadow: none; + background: #0085A1; +} +::selection { + color: white; + text-shadow: none; + background: #0085A1; +} +img::selection { + color: white; + background: transparent; +} +img::-moz-selection { + color: white; + background: transparent; +} +body { + -webkit-tap-highlight-color: #0085A1; +} diff --git a/vraptor/src/main/webapp/css/clean-blog.min.css b/vraptor/src/main/webapp/css/clean-blog.min.css new file mode 100644 index 0000000000..faa3794436 --- /dev/null +++ b/vraptor/src/main/webapp/css/clean-blog.min.css @@ -0,0 +1,5 @@ +/*! + * Start Bootstrap - Clean Blog v3.3.7+1 (http://startbootstrap.com/template-overviews/clean-blog) + * Copyright 2013-2016 Start Bootstrap + * Licensed under MIT (https://github.com/BlackrockDigital/startbootstrap/blob/gh-pages/LICENSE) + */a,body{color:#333}.navbar-custom .nav li a,.navbar-custom .navbar-brand,h1,h2,h3,h4,h5,h6{font-weight:800}.caption,.intro-header .page-heading,.intro-header .site-heading,footer .copyright{text-align:center}body{font-family:Lora,'Times New Roman',serif;font-size:20px;-webkit-tap-highlight-color:#0085A1}.intro-header .page-heading .subheading,.intro-header .post-heading .subheading,.intro-header .site-heading .subheading,.navbar-custom,h1,h2,h3,h4,h5,h6{font-family:'Open Sans','Helvetica Neue',Helvetica,Arial,sans-serif}p{line-height:1.5;margin:30px 0}p a{text-decoration:underline}a:focus,a:hover{color:#0085A1}a img:focus,a img:hover{cursor:zoom-in}blockquote{color:#777;font-style:italic}hr.small{max-width:100px;margin:15px auto;border-width:4px;border-color:#fff}.navbar-custom{position:absolute;top:0;left:0;width:100%;z-index:3}.navbar-custom .navbar-header .navbar-toggle{color:#777;font-weight:800;text-transform:uppercase;font-size:12px}.navbar-custom .nav li a{text-transform:uppercase;font-size:12px;letter-spacing:1px}@media only screen and (min-width:768px){.navbar-custom{background:0 0;border-bottom:1px solid transparent}.navbar-custom .navbar-brand{color:#fff;padding:20px}.navbar-custom .navbar-brand:focus,.navbar-custom .navbar-brand:hover{color:rgba(255,255,255,.8)}.navbar-custom .nav li a{color:#fff;padding:20px}.navbar-custom .nav li a:focus,.navbar-custom .nav li a:hover{color:rgba(255,255,255,.8)}}@media only screen and (min-width:1170px){.navbar-custom{-webkit-transition:background-color .3s;-moz-transition:background-color .3s;transition:background-color .3s;-webkit-transform:translate3d(0,0,0);-moz-transform:translate3d(0,0,0);-ms-transform:translate3d(0,0,0);-o-transform:translate3d(0,0,0);transform:translate3d(0,0,0);-webkit-backface-visibility:hidden;backface-visibility:hidden}.navbar-custom.is-fixed{position:fixed;top:-61px;background-color:rgba(255,255,255,.9);border-bottom:1px solid #f2f2f2;-webkit-transition:-webkit-transform .3s;-moz-transition:-moz-transform .3s;transition:transform .3s}.navbar-custom.is-fixed .navbar-brand{color:#333}.navbar-custom.is-fixed .navbar-brand:focus,.navbar-custom.is-fixed .navbar-brand:hover{color:#0085A1}.navbar-custom.is-fixed .nav li a{color:#333}.navbar-custom.is-fixed .nav li a:focus,.navbar-custom.is-fixed .nav li a:hover{color:#0085A1}.navbar-custom.is-visible{-webkit-transform:translate3d(0,100%,0);-moz-transform:translate3d(0,100%,0);-ms-transform:translate3d(0,100%,0);-o-transform:translate3d(0,100%,0);transform:translate3d(0,100%,0)}}.intro-header{background:center center no-repeat;-webkit-background-size:cover;-moz-background-size:cover;background-size:cover;-o-background-size:cover;margin-bottom:50px}.intro-header .page-heading,.intro-header .post-heading,.intro-header .site-heading{padding:100px 0 50px;color:#fff}.intro-header .page-heading h1,.intro-header .site-heading h1{margin-top:0;font-size:50px}.intro-header .page-heading .subheading,.intro-header .site-heading .subheading{font-size:24px;line-height:1.1;display:block;font-weight:300;margin:10px 0 0}@media only screen and (min-width:768px){.intro-header .page-heading,.intro-header .post-heading,.intro-header .site-heading{padding:150px 0}.intro-header .page-heading h1,.intro-header .site-heading h1{font-size:80px}}.intro-header .post-heading h1{font-size:35px}.intro-header .post-heading .meta,.intro-header .post-heading .subheading{line-height:1.1;display:block}.intro-header .post-heading .subheading{font-size:24px;margin:10px 0 30px;font-weight:600}.intro-header .post-heading .meta{font-family:Lora,'Times New Roman',serif;font-style:italic;font-weight:300;font-size:20px}.intro-header .post-heading .meta a{color:#fff}@media only screen and (min-width:768px){.intro-header .post-heading h1{font-size:55px}.intro-header .post-heading .subheading{font-size:30px}}.post-preview>a{color:#333}.post-preview>a:focus,.post-preview>a:hover{text-decoration:none;color:#0085A1}.post-preview>a>.post-title{font-size:30px;margin-top:30px;margin-bottom:10px}.post-preview>a>.post-subtitle{margin:0 0 10px;font-weight:300}.post-preview>.post-meta{color:#777;font-size:18px;font-style:italic;margin-top:0}.post-preview>.post-meta>a{text-decoration:none;color:#333}.post-preview>.post-meta>a:focus,.post-preview>.post-meta>a:hover{color:#0085A1;text-decoration:underline}@media only screen and (min-width:768px){.post-preview>a>.post-title{font-size:36px}}.section-heading{font-size:36px;margin-top:60px;font-weight:700}.btn,.pager li>a,.pager li>span{font-family:'Open Sans','Helvetica Neue',Helvetica,Arial,sans-serif;text-transform:uppercase;font-weight:800;letter-spacing:1px}.caption{font-size:14px;padding:10px;font-style:italic;margin:0;display:block;border-bottom-right-radius:5px;border-bottom-left-radius:5px}footer{padding:50px 0 65px}footer .list-inline{margin:0;padding:0}footer .copyright{font-size:14px;margin-bottom:0}.floating-label-form-group{font-size:14px;position:relative;margin-bottom:0;padding-bottom:.5em;border-bottom:1px solid #eee}.floating-label-form-group input,.floating-label-form-group textarea{z-index:1;position:relative;padding-right:0;padding-left:0;border:none;border-radius:0;font-size:1.5em;background:0 0;box-shadow:none!important;resize:none}.floating-label-form-group label{display:block;z-index:0;position:relative;top:2em;margin:0;font-size:.85em;line-height:1.764705882em;vertical-align:middle;vertical-align:baseline;opacity:0;-webkit-transition:top .3s ease,opacity .3s ease;-moz-transition:top .3s ease,opacity .3s ease;-ms-transition:top .3s ease,opacity .3s ease;transition:top .3s ease,opacity .3s ease}.floating-label-form-group::not(:first-child){padding-left:14px;border-left:1px solid #eee}.floating-label-form-group-with-value label{top:0;opacity:1}.floating-label-form-group-with-focus label{color:#0085A1}form .row:first-child .floating-label-form-group{border-top:1px solid #eee}.btn{font-size:14px;border-radius:0;padding:15px 25px}.btn-lg{font-size:16px;padding:25px 35px}.btn-default:focus,.btn-default:hover{background-color:#0085A1;border:1px solid #0085A1;color:#fff}.pager{margin:20px 0 0}.pager li>a,.pager li>span{font-size:14px;padding:15px 25px;background-color:#fff;border-radius:0}.pager li>a:focus,.pager li>a:hover{color:#fff;background-color:#0085A1;border:1px solid #0085A1}.pager .disabled>a,.pager .disabled>a:focus,.pager .disabled>a:hover,.pager .disabled>span{color:#777;background-color:#333;cursor:not-allowed}::-moz-selection{color:#fff;text-shadow:none;background:#0085A1}::selection{color:#fff;text-shadow:none;background:#0085A1}img::selection{color:#fff;background:0 0}img::-moz-selection{color:#fff;background:0 0} \ No newline at end of file diff --git a/vraptor/src/main/webapp/img/about-bg.jpg b/vraptor/src/main/webapp/img/about-bg.jpg new file mode 100644 index 0000000000000000000000000000000000000000..af6d4d5cd1629f4cd396ced9b6c4302b24ec884b GIT binary patch literal 33097 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

@Z-2a*BRd+m_LKaU|KQH!g_W;; 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

8P(1GQRo*SRA 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

jYdCZgq3z;a905My}?ea1JCc3}Z=Ty_k`y1D3U( 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 z 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 z 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 Sk3UKZ`)&UK?D*cUEC1P4buf(p literal 0 HcmV?d00001 diff --git a/vraptor/src/main/webapp/img/home-bg.jpg b/vraptor/src/main/webapp/img/home-bg.jpg new file mode 100644 index 0000000000000000000000000000000000000000..a4d2108a3fc3c20414a6065d1a019d5bd788b8fd GIT binary patch literal 172779 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�-L^x4&McZ!dP@>a=XL}z6y<)W= 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 literal 0 HcmV?d00001 diff --git a/vraptor/src/main/webapp/img/post-bg.jpg b/vraptor/src/main/webapp/img/post-bg.jpg new file mode 100644 index 0000000000000000000000000000000000000000..21750a49b05043749df1d71e2ddcc3ee933a02ae GIT binary patch literal 140909 zcma&Nbx<5l)abpqJBtMf?hqCU5@dm0++p!0xVr|oV2eX=Uwm6)sk)73pab*kpb{La7s{%r$DRTWhf0chv|fX(v&{QC|dgZNrI2LR9j zm;eAk>RELGAeOUnx3UG;e0wg9&8YVgb2Ms`m&J4nk!_=|#B*%(iNh=kiz-}J;xv(Qod8x~aBW&fx28>kD zqe@3wi$KW!cTe^YYxCN_kc>N3j+?JR*T<)U0# zU}eojpe&ZF205R};YelmwJSOkAC}Y80;K#+-PR;77=q6g-VKxU_jDEqgS_~l(xejD zV)osK@3}6~BeQoS`bUXgAWJ;gxKt#$BMfVWor+T*8x4Yd703cpU0n6aC52(=90gWx z;rnht+?(Fxe*ge7*IM^Phic)}O$55=Emyigx+YUBf`P!Wn9(LLsh@QydFM4vKZFCz zpR35bF~^yt#f_))Fn{UaNdG;sfOCLhcRGqUSx^p3ol*EIis_PktfnJ2G3($$xx2UYkY(91NJJtyklvC0b-jTH&&)kUvMAn z#cu&DmA?P4nwIczgA|evaEWN|{*TEAEw8doA1!wtMFP89Eu3w?47jmKqgDARM%)+r z5Ae3o`($Qo>aE8_Hb-q|;|^;v_fp0sZ$;8>U%I~mG|lvATmq-8=0? zrVUuaz2Q~-6Nmn})UpP(6_=ndBR`v1G~fn~zF&rU1Q@h-2qSGi#n;|x202W~G5`xX znvd2}zrTosb2_4|5%3jD)bfe%;(sp5#u0yz2LZi5X#FoO-?M6!<9nN%`c(^`$8#LP z1_IQK{Da~w$LzF_*WPoWt6#a^THakG+W!FT#~G{*Ha@~`)*T-~dk=9I;sOEf@uCv} z5<;TvladXs!==&%ddW3cwas!-g>D9}TZC&L%5C9T00@9e#}E>v_LSv%6)(!WY!Cfu z7os{!z!ujy%dQUIOj6xoo=Oub&u0Luf8}cA; z)ocB?Da0*blo5C9H4#0UK})I!~PV#q?1HP!+jb9&e)b zZ_3@Qq<7oO`v&|l&^mo?ZcQV5elXd8A3gV?NNQno_xkoMhbocj8Y)fQ3nqpyWrFkT z{~O2u^lbikLZ3JqP=uqgN2jwYXitK}mY1OZE$;G7*%}&wq&4G_g%HMC=X@)UOehQF zvv$L;wZ!fY?{OWA9xWTn+nn${z5^}W3uMcOhx0pLswP`Kt$K)f{c*CzxCby3vjmeiUED1eH<6i1? zOHJ)Lle{_j2jH6Krg5DXCE)iSs|%PNJCo7XRQa;wlTPS04{+2qRG|h=OBH?CZBK~% z^L1es_|ZRmS42+=xON%#$83-0FrGq8pzFH&IzMcr@3jjnD>)n2XhZiLO7&N9dZ;Wz zjECPyffr@`f^+geKxXor{jtsMDCAjsLbEMp!lv~pd$t<~tAHP zXuo%JnGy^>PxYAc9((Hc-Mn*81Oo`LR+QLHb0&7BOAnCq-k+{6iwuWkd;*sQAkQOiw_8$YH59%`A;6spkm3G9#et|lOP zVDTzAfJVI&SX>Eu=L-tpAFyMQ?^_xJNoWc+>yhc7EtpYGkes4wCRwnYhtjO2D#5a( zIVdk1?`fC~F!3t>W+Gaq+0#vyH-q7iejkzGmB$1i^P>43zOg09)1)Rz_$ap)Xv2!_ zQumPAB{b#RIO+f)l5bi(=c1`H$HyD1{4M8^?YK+%L=fvpU242Q&NKQpjY$^O5#Ot) zVc@T@{SEP%sv}yRSx4##qpc)$T=k(OHJnmizZb2{N86BTY(`s^Ft8fh^}{XRqOA$T zTs0IONKcE27ud6c5ccSHxid$A=gEc9yllDA}zQmFtF=~&^{$c3ISr5sSKnp`Al| zQ*uO7jw|0N2CO6MYf}XX&?)p_%A`)t)i5yDa++Rzh$}La0w8@>b6Sb59CVEvmCswN z4eAoXXUTJfRyNZuCL?eR?4iDK0^n*VS*$Iy-zgpdlDr6sE@@pnWyfp5THZ)tWm`+8 zR*z&+QmJkUN4V<6A6N;9($x(=CSF3cQ4K|!h%(P6LZZuky%60^z#XB+Y&|V!#|%SN zB1q@WanZ-NBh*5x0nW39kzkCAZI=jw1qAy0&+7oB0dWV(}6o7TOk+4^um4Q;q9wY9PIw3k7`#$)zVZ7ujVP*h*;oRE92 zR#kD;vJptB76*BKjfr3Gf;6EjGv)C$SyL`R^LGsfSO)0 zr9=-L6s41(&r<^-$5>25vA#{7VwOO6Fcc_bfaVuOYQ8%yfTSS|Gaed}Y6a9VX3fmd zz9mvp?T&KK$V=8;>#hb_wg?H1(#=5!QCC54mI8Cfsiqz2X--}T0QZZ}byqoGo8RmF zXB;GcM1St})NrUXeuH!ht=#S%&e=Z5_HWa>>p79|PXl1(W)8qyjNU>K3C)KbwPHC* z@7O6c3}rHV0AkR&RY`kHJAgY>gyx3fi-kb;f09A2spDh-hJl*U>7+9QfoZy!lI^-Y zXBh|Fy)5;L@RlDlKSu-H+503aAzCe>wx>r0K8K*)Y&Xrl3WK#WzJqi{NV))JY8nOk z$nr6&VLW~~KYU1awoE`dV*Q2bvI-vAcnNx5rqfCUmC=%Lx*+53kVTrCFfH-1(O3Pk zi1WB3D?AtOH`7oEX_Sbnq3329`zak$<4KW~ zSx5c&A$Sf73l2{+y0}|2YpJQ%{vIE21bg#JnG|6!Xep1ufDhI`Oe&Z_-_pHJEt}@Y#ERd|sox}| zO30}8S}x_>y1YVZw{s@K<)?yk{6ug|4QF2A^^N`>-eK;2dh0IFCF6fLNdo!c@{9h2e`HuHdm!^dlhi<_RR>m<2gE9-#vz?QP3;souV31uhNQlI7 zS!Lr+UEt@k=|2FAPJx!-if$!8Ie&$Z0ckw&B_OXPw&s*FtJE*vJenWh$ZCGbI5^qQ z7?RF<+|vUojnO6K!5=;4XtP=edGWNa+O_YFu#)USr`C07Ry18I?ik#$c7^Vx_dP~O zSj{rFsTm(8vIbJI7e~Lpx4;B_G)4R}nH~#Bkthzy(;nyeM1+;C`R=bFeZW3hi8cF@ zPP$E`N+U1;hEdHK`CqbD?H#I#BQAwv5bBOE`r-t03?GYI_XCwuR?$YTMC!HqR)=D_!@BEhr1gazMumZUh<#kng=_Pj2kTY_ z+dV|+mw%v>^;eh9!Ni^MSMDuhIM7WCt^sw?du_@TNgRHAg1T*<$fmRcX`zKI$z z+=hr4J>VauzMwJ~(&-h|!vG{(3ab2G*4{i8Q3qT|^XXH8asDh~EfhOg>e=#)`LWF6!;o~_v=2BO%-HdP+MPWF^9{w6zhnO6cuQzbwo_%aB$`DPT^FMHq=;q zlV96Ved7DniA*)+BBRoSLX*(759H<}I}*F&$hZatUVC52qE66~)#U=K4tP6TnMR}~ z8r3~6#N;v4_1mK+S(!uE595Z7W|eRAqx`P=-HsJm?J$jz2>%KOqh>Vkk2;tI3k5Cj zs1zGbmntCR*lt(=V-(yLI9WUE1Rb>@K)ly=O3Bj}2?|T#j;c2}u{|CmV@ua8pk%_T z_y_3KNAu_7*Ti2|>LO))A0lGhPRvF=bJ%VuU%PsGh+tzlK`~`}R3gixaoKie64s__ zgaIZoHE~!u!dnYa9ED4R@CYxScMhpBa`vLQ6pIV!*nlrmHAIeF7Y3PqklJJlrIamca^_fRj%4(Uwu<;T#^lrAm9;d=%0Ug|L zZD)T-CH=a)l}j>88nO80r8|;-@1mki`Wr_fs>vU}mGiKe1%3t3BoL|M;H7cy80vl+ zZ+&tPwWUdS9(pIe5#ZJQU2vZwT*@#vV;(JoKH`p7Df}sW{AOZ;0Jhq>uo%3WTG?UJB?wO3LEZGAi;|l?8%iULBsv>A4e!-0i^L>I)6&;v?!G)mVlaJboHZ$d zNYoIPSZ^4kD!QHn?UW~LPl;iUqpxvF7yI#q5NIrFZ?$*$rCt4xl#do(Q|Q9ezafsK zt>a-awgG>pmH6JPp+S!izOZ)2n01#Xqa6valP$k#(c(=SkQZ-Owv4t-&d8={9P-+8 zCYShtbc87p&r-@YxH7mw~HuhVYqGwvxz_Q8J` zl4+j#@SglCi?!fe0OC2Q`)zt9bNIeb z(5swRdzQ8!XFx)nj|z2XqHgjFpt}}%;k4?~P}EBLh_jv?WJ7f|De;|$8A|8}w!?%? zV(2008e-;cTuZ(-6#&kXDl9!CS$>t-5TimT3f7|`6`)^Gjn~dzzzp|vhh!0&<~TlK zts|Cngd7ns|EeBcHFGOlV=zk28S;dExc42T8eu*38!BebC`yR!xwEhG|5Z2mRNyIz zHGKWoIE6J!U?@ncM}9&~LI;x}qlOp)kMK>*LAB!CCIbPq6iO zwB%~pwRP8Cz~;8QI=48RA}OPpN++M)x+}p?9L6#iYX1N>@32CFp;DZz8J1qH4xIz6 zUjZ9SL{ZCF;Q(&i)Z(OXQ*r464%J})7d~>_5YiF0GQJM7NnT%*zcUQQe^Xp#snM9E zTW-lkmf!sYw9K{F1oyp68>0Ckl;|7lN#-o{@U5sbw*p3Q%ms$KdwzH?fwn-aH8r+V8cz7`SuI1Ir!_!7^QeCf0VW=Y zQ?+TaD!p)M#q@+sw7K&LW$g~+-_0k-rd*~8yLYGh&zY=3_fOBg+lQWtr)@S4A88W6 z9z2&KX-8Kx@|Z-v@T#m_WXRT7tsl*Y@%AJwEOyFInY?mp?dPX3BXE;i1a33Z=tE&# zSA9UO)$Vuuhv>Xa7vcRxb)_$Es6jtU#1Th;4a%l~e}KsrKiBeW z<;6? z)fYqiTf3CxB*?dx;$Fd3*^?>M!9)%C1?PT8@r+@w($;@iGG{O)EVigE%r}hfXNkW! zucXoH#a0kdTaf%~)?Y9`OzEWM{nPZ$b3|BMaG=&xU!rkRkMu`|V4$(1htxRhkX-`E zO(>F1Up+?BNNPac)9S4fZ}xKjwBJi%`iOY8n(LpV2jy;ig4@gL_V~uozi5JnQYjVq zEj%^zk@8$0;&~=eN2v*coV;4L#*ob&3Th+++V z#Vo~*NCU@@y#TjcbyF$`qL8vKA292N%j8?{t1quxYqr_VZU&B8z2{}smhcrE*VW~d zt788;L;P(^6_Y?M3*4fdK9hjsooXD{^FerSt$K>>CLFdb%t^mjz06D&l>yOXdkG`e z&(kO7Rn-&^S{y`6dNg3c(q38&mi6qOBhAH`}9<)Kbk9r6-y2lQ-IT*cT`o=&Nfi zyx6&EouVU>cvUw0^NcdebaR6clF#*FoXFU;t5_Ki_Kvj(2@Gr5bAs_l#+je94JilaUP4#2 zmhBmP_(D~)FukG{ng>z@jWA`Mz9Z})%BN-(eHgiZqBg7|Dx-vLFxQvfL^|jcS zS_X}1Ba)2(wMSHleg;`SoAEm08;a#3kfT;}-bKikSQ=T8C7sROsL(QucaW&TOqaQL z9`pS%f(PS!61wNKw1En2@=NUktLWHOZ^Kgz(`O@rf?4Mx&na1L0czz_^GuFOSg1NJ zD6XJQn3#FU&bNk#BGrysg_?|(kJcn7+qbCPsa&zJAppZ<)VeF{O_8h=8ZFxhfw#Ha z?i(6^PixleX-zcGDOTy_w{U9BcXq3svjI_rN`xdm{?ATbLo;AC`$KQR#M0(!%_dzZ zF&a8%yW5SnaWZ-~$9KL=eurWg7P73+qwuvf)Cm;e5pIIoV8afeR_dboFAhS0wy1Q{(M^9SywjBw#cS~wlVlZJBOy{ z_WRA}49iSLe#(V6$``_U-GqOdE%<=#Sr@F9jFah#Pg}nvzaNlmhZ zt@N-=E0Az;sFu%QhnQ{Xr(?^%Cr#)>{KUqDc_1RvO72gfxYEX7I#i0He+8-z)Hl&n z(Td@eHKeatmz{KMtUfI-%Q4}2cnCdpDVrfI;k&vH!v_^V-`el6yN>4ASBI^EAoKn7=adT3Y+aLP(vSZO zl!0Y&@>i_+AAoaeC%z>9g1u`CGv3cfVddfC)s9V3w6^Co%rHnkXU$9~}0K z5-GPo?SUeOoP~jd9}802N4cT7SlYn$cPPR{{!0VgX4ZI{`05GlBa5~YYByX_%LwMR zghGWZNzeVtJP&>-w6NK-X1lcrQz$D%FuhKP_{tn4U2Bqa>?)Qqnl2m|rCD2SRw;cO zbG5K($#C>n&Z8?>IOmjnXBnT19V)NQLWUcSlm7HYCuYS=bqf{NsI)^=8rr z^EO>vpwGj+$X_G92N56EPX%%R5|)nS2gyRJp}ek2npnK`HZo0bFq|>^wI#_KK4Zbx*VHO z{nYMJw8|ok!I~TEA_$&X!-lw~YdF^%BGRKf1# zmg4D-d_rp(nEx#OlpHR{aYw!grG%YP5YH4=dW~3 zG22S;)?tt!6%j9FvE%uHReeRp&AtMTUyEbOo zwc4Qq*ECxsA|CtZ3>>ObdRbe%40zKozOYP|?YOe?7bQ=_Tr_;WAD&r&%`z1+>8gCK z%_PU?!gXwkc+o8aM&jrK^{|S~Q5@_koHk{gb*jGmjgH&F;i(DvjfLlXyjjwIgoSsT z9=1y9AB9{eT**la?#~<7r@7mmxCUaYs#MI}G*y2~0&u_rr_ob8G7#iyCp&q#8&M!j zudAbzP7g*G9hD|bKc>rwM>(cWP9NQE??(cVz6l zFgX!wCt%F8#F~%>KqaPwK|ZsD1q0FP9!`B?CtvL{Mq0gc&tsK2q9wi9L2ij!)1b3n zsGZ6x!+muU;lJ!S+w`%x2V?910U9m~2Gm}A|NcaI%{%$X=QDY4u8=WfBgWL~Ww;BZH>J_XGF^J33B4EHH5MQJcK9(R^Px{_6 z%%{u4xNV8UUg+g^9j4V$9uDYV$kM~j^LVSUFdl8V^Ru|i4vLkr z^=0DtC|_Pd&-Q57)dc*fk1W2s23}{;JT(0u164bLv~i#qNC>wB8$&(u8fO~ieqJ8qYs5vSHQVP-^g zqDjox(r+UrSqwKEBl<5i>s|mZRIvLgsv&`=B#ZC&c8`4&MPe6UoL%Nv4W^)7IEQfP z<_ko>1|o+;2osCV_PjCnm%skk4HIe_>GS?or27rRS z@kkDvE!xyy!0ZJznWXQzEt-rRR*i=&_?8Tz&6vw_T=9mHc-OX!Jn+FIDi+8(CLw0OkvvL0@uCI>DP*@&n~w=<`~#v;-+<_=1KpWz zb+V#v&}k1QF9-TWLse4uf_u)vViQ{shBnrk5^-j(!E+%sZ=Jc??3XIq-)a`eS@h4p zz(X2()Mzr=g4mtfDpBm%NCcl=fxon>7;kph*l#z~+LnO8BQEBpvEN~LYdrp$lO2B* zv;v_l0EZDfNt5YeK2+4`#fL3Jl*6z{{i*F>p6I-9j}htwFQ_3LE5)rWJ#HAubPW$v z?4v#eOqj;n>Jd!R1l*z8uaSu*I^MM(a2zRtdck=GmP%GCcf2>Eq4T2`x4EI;#4|X& z0$E7qHtN^@UVP75wdlNbroq>VDIJNw1CIZ+r0BX#nIsN17k$Aee2H>SB~HG zUmh`IR={eRg`927;ZbtBJoR&->nqe6ZvpDR5&mEW+TT3n;SouoY>t1vZJ7U$#k zH*k3)8xm=Qfw9sxIcsWq;4-TQ8XYF?OKpK1%WQjP`84#ULlnZVn-WYlkRTb}t8WPN zRO^lcI$A-n-9)iS%RvD)0Thcw-QETE<%Sl=b9If8DDvE z(hSrdUC)8wQfU`s3Vc)3qkq*}ANmce7FR?Wg+ew*L-2l{;e8iRLE!eqmHMF~VgMMS zQZO|18=q30XM6K#cz;~LG|R?8;prBLO2NqEgj35TZh`qfi(?lD8HdSQKhcF_{rb}% z5b$9A)Rz%G8r8B@ez1LoKL5-7MCuKcDbmTsAqjUQDS#>4v8yF=M#xcrSv9lzf`x_a z!26+GM|vc_qKkhHB0D)DdTmHenq{0-!?U|f{mSIHIu*Sxk5%C*g%XiiZZ2}FozsFz zIu1)9r5Qw)B$L}nR5tV$$vV-AmoR!;7-oN6X}b0t?Ob==>x`hIZ{0OaJ})coou%N2 zb3i}?#Sik0uI%2k*a~r5^phpFA3bIL1N^W7MaT3AY>b-+jLXO!J52kw*3`B21Yq?4 z<;I1D-HN7A>ThfL_E6f@KZc({0dLegXR*AZCqxz0+I}CR%6L!Ty=U1l?q#3QQIld% zy6d#l!H9-?_O;}ueJK8eKgZ%J09Zv>)meNLgBGf5(Hj??I+XcxrUG=2P$x4q$&B9% zzwlv2o^)SnxLoMSg+|-l3jye*Ja7o(C=smO*7HE>DX_1Lt-dW=6ju)5^2E{&bpKPR1J!H%rW{2hju zbQc_hL3*_8F;I(L?IxI2JCHz~fV|V>DABt$F4L4bdep2L=-Cpd0&X{&a3HzB5?69FX#pyDfPWLRizdR61ttcBj*81x6_g+LzwCyhXA3Ov%Em3MI-)l7Ri<(1el!5J!PH z-x|Vu?$sL6bBr+4Q~@x}q_wXB!kOaY2glR7leZP9Fkm3jMpwPrmB7R{x4)^}P7T4! ziR6tJJ>25_=E@Z?C#Q)`Ir_{N2ux85e^XzX?Q`o_?QP!q?TQy3pZWA1n0L=u87=luzdYR$=sFMjKZ8=9zh~ks+nk*~~I&~%aMr*>K#*&^kemYVlnX726_?FCfd{Fb= z$*)&7Z^Nz04_AShh?y+3yzbZO)Sx}J?+1#tv#)1|5=(xMF85x3d-0rqO5dD9oG15= z!aKI3I6^-g(q3%Es*J~&J(iMM5{VL2G4}sb^NjIM^D^uCt-^{c(K)NH%!sj|Mj6kD zMA#8@+%u!AN$^UmvKC9^3cN@!@T%Ki_W4K~F3uL&@;0hAVl@7xEYy`jdcb@JtQb-| zyJSo@DR7c*^We`d12h#Jyf#^CRq~0wXuq+$N(+=!qaC7)4U4Q!tuU*-#PEFbG$tqC zjZ4kwc+YL0sZ2hP%A^`*Lz-pgVu>c0{NifO+7`Bp;C^? zd<-F^4%1si0u{E$7FJ&T=I10Ng457Ia#Y zY)s12Ko$k65wops@cY4aZfA19oAu`lo3Cm3IaB8l{>i(~<}szth;hvkl}A_KZ&J(X zj!$q$!42QTa1lye)8^V`EcuJQU|?YvivWM zjethk(7*KzT0}cH>k@|(EQ~te;}1{=L7n@aVazm^9cg4Y!~cm8Ykb;5Zt@2N9E~CX zVV(qA^RJh@uk5`wG!yy`EwZ+xnh%nVvI^8b{?e-%pr$_DnC31x3~I5JUQ9m_|45ts zccDauYdOxEg^V-Ttl=bvH7PM^|Lt}~J1o)j)zETBWyj9fF?9lLw7J?8_)3%Qnl<{j z1mUlSr`6}yYoR1VZhmvZ1sL7=O7JR2#2h~P)^VpK@EKyDDO6oL2imNq1{tqZH5*s8 z3H)gTTJ?B;SAl7{rt0g%-TYQ+KocU3STzZPiE*ODBKr;1UeX~tg8s_b?)n&C{}@w} zGkivedA(bYEcpgTJgW5%3(DDTy;`59CBU#PsvK#)cq0Bu%5!!U z#G0{el`#SwrGGi$_eqDd-S@ios7ML3`G7h1`#>x;T%xWbiR!uxD~fa~+=$xO!onaE z9fc{Y0pubkU?4?bX24IC1dQ)i7cu_>@F|?~wT6-p)NHT4k+Ofx5pFE}ejiYqeV@4Q zf?Y9bdJR3;Y54M&=`c^k;lUW1Jh#TB36fjtFi5=h7K5NH3Wa}rb;)kf31 z@H#7{?Rp2P|Ekm6iTj2w2?n)iU@&MW>14sd>{Qc~-biy+TqD-hx<4j zh&e?o6{+90U$|~5oNEB1wLh12&i?_h$Jh5djY(eoCKZ(WtPH8CBM^R4RIywUKf zU54IlQPwBi5Gg62tb!dtwVPulJe^+eWrU8JM04t2f`-JljZXTSEMC-E%|PekkxSd=vN>(X5;|w2 z03IIYJB6C#yg1sN$-7mVdiYvU+nXNdP6_RmzkFI*a=BEKG1jQD>J3)p4X&W~Jdd^= zwf2cdU@P?m>QC}jPj}7pbq87gj;_`(jf;!nJ3)H0G77)CSl~=cr#TW!qeg9>(EdVK zAs$vT-9-=*mIIpLGH9=E2HD8m(^DPS^O7`crNd%O#mFwgIdy#Jg6k|&8?gpIAr;Ke zOh~hPY9K?uee+nk{sCYOR!nr$7U!7x41v6urGVuQgh|gJ!z(v6sxoybad~ti?bTSV z8G_{#Y`Yziti;|=nW`UJC5u(!Pcs#r!a!MO6Qo@JwpcXARLbqt$Qv@~V&&9*JDF1U zZu9dq$u$~hX3d|VsvH58x0qrx=8;O-e~Z|k&3-EICgzbd-TQiNY;Gunw{tV&1rJ?Y zYa-#{HvJ+^&ThRi8@(FJ0=k{N=xu0tKOL?mnt)xPo8rMXh?N|-=7kH!KJA+GJ1%qY zoFCX6Cnj{~&Z-E9_gr|2q@A`{e7)n(cCn?;|4QQ1C3)X*{r&7o@)zi!({xhPOJG0! zAn1>IL89*>UYgXkc@}VLhN_Z`ZlPLF1jJlVTq|Dw%rfYR7h>JjEznLtmU`hp<7(h> z9Vu&m5yNwyXp!5Grh6MHVS6*IxTnc2^|{%0QtqK5O5Kaf9hN|()zw<)yI^;(-!u{O zS!CI69wYds>Ct9$l`*JN!h6CpEw7KdHoxwh!MGsHc&>@nXj(>!tL_lf)`B`DoWxIW zhy1+x%PEgVlrIkl2{LlS+o`w4(gfs2{bsTrG{c5N-cpNMH_d#@z&(n&$6-u`M*`() zVZT0Zz;@IW^_67-pN;a93!&xfR_#+uZK~^^2NlBFF(OU1QQY$!IO(BOp#4-Q1Xk(v zH;uW1tbH2e1NpX+&B4e@)~db8EkeJu5$r$INU2RSk_FmNPWW)RuA~<@A^&rU#?NJD zqS#;RfX)kD6kLW!4~#aCoSWG)!kUY;^TLaWvXmdmf2-p6AK} zzlhQ7o8Fo@s>cO7G&oH(B)1{UZuEkYp3K96g_KRk8* zH+N99<;%!y%8|;C)E2F& zaO&@r4=Iy&@w=N7sxA&(%^|uC4bSYNolZP|jnM;L{06z~t+7l35~oKutHY!hZJnIp zGdCf4&x;%K$bn~dOVLPK7{(qq4PZj&@m+Sl$PqecvQ#CnyICG{DU$inb2i>iBkW>N zC+ep9+xwi|wnze^A6P$^hd9%#0#>MOfJ%9sDDq{pU|^gwIN*DTQyzv%D<#f+oB__J zeJ7wqKC?NnheYM>;yXH;D8cx}&RqYuaSwI?p6_mR0_l~}zy;?^U_h5r%&#Dp{Rkb{ z_un^5jS|dj$}8i@8|NAV*+~Ew&GJ8h4k1?b+3!M>Mr~qb8HH^4X-4-0Ulndm&zmbUA>#f;z?a0Z%Vn3o0?KLnC=z#vM~#_tO?fJZ*d|XPw(o&jAsy4&Gh>wG?~%) z2vr@e(VeowJ4dN9ZAXpEx643W=tfN{S6<^gD5BkA`KYpeTHY_Q7f_+Xu4`qZvR+qf zF=h+Ri!`WGah3twINR29M%$D6@15qYpg=6px)qpe{Vx-}T)t_(Pqi{Bp@=quTztkF zT=rMq6S6=an!D!KWtgCb4fJ~e3u#vWK((c~|1QGHWz7>eXOL0Z^jf#oYUhL4rETKU z$opLtuabh&54agr6c1XY>Bj{|0Fp^a`SO969_4?@J-nn9@)w!l(-9rjXzsY6#QeMv zrJg56NT_fz*WW#!z*i)_^XjW{8!A`(QYz+iGIYuMIqLbpdwwfH)MK5~wb(-qaUtp0 z1^6)$st(bZ|MhDqAuVus`H-{%qG)yEwW!4KFO|s?c;bv}6&U)y$Y*y0L2Q)kN;!ri66G-Ar`#8H6=(E;o`CZHxdkur9iRT!X%_8yQANDnV2EIqo=CIv9@Rn>NobryU4DvuLf`i_ zJLRJ_8q>!7NQ%c>>|5vY55T&qDkQ$E<$?mh!%TCPgvY^Cb_!~ZN*y~4{3G*gue|y; z#!k*V$&;Cr8Eks?3Y^w=KcJwZJZ}lK{IiPfX~S-nxnz22tp z#7j%{b8&&%p(F~ZP{p%A34OS{;GT~vw5-@ZM#qzYwGm+h{gKuHF-#!VPSkBsJ+0Zs79eQqB+d8bE z9$Byi9$?j?ptjjdN<%K(hUq=k4>b@Xwct#;j{O`mb2Vw;E2Kr5t!Q@h)7vRBlJ+d? ze*i7^gHvPU<}>DWAxd5oC*|syRPqWgI&O0DZ$T4(`t0d7G;80qcQX=%WejqX_tW=4 zv9qsX+65;g4pc~q$Ce<(?_Yv?QDnJ)R(eLqa`xhq6p9Gw_=W{e0Q{)=Fx)}U*Ab1- zA{?bpKW-iw>Z)*a-CDFK)>tEV9_h^+@7xP4uHJk-oaENjl6c02)ej_3-e>q<^DeXI zac)ykCUx;*;@%zCmC91$oep88fylhQkw;dgEGqoRom>iphjKFCoW=TJpU0EQYQ>kW z)}a!&@*>m*o=(lS)7&ciMkm1aB6T$?wQmR`Q3ZCiR=8DyrqZ&v!uu}#_X8}wrs~Ds zguW~ZlUvg|^H(&z!toQ@n|{~VJABp@6C?7x$Q>onn2Bu))?%@Me^y<<4og6##D6Vp zW=yGUUu~&y_-=c2nC2MNsi4sYPWlmIjiQ))>0s@e0AoWX54roE(S3&)hg|%IcLE7w z-;wo+HSW+fLC5(>@K7VRwmRu?oT7u=A`V$KL!aqY%1dxUu`)jqD_6+V zqBBo*gpX@Qx?zsMMF32$e<(|zHo^ZgY#*g>lsUArl$udX0zZ5DPI@Gj8Wx){t{6239CW zpD2}rpG&s%FVl+;JQow$Igra|_m;i(ySHx&nnz>lt5_{C8pT34Ko^5ApI%S_gaZKV zvge=pPy055`1u1j#09s*V`y-}Mi8Mfp2 z;0`q3fjEB?$jWiMv#$M^V7tyq^e3a*Z~qg>&hVdC2$gIdoPKwwno6eKz-opctXk-i zUVpJY^S%3z$=mN`beBd`J-P|&=1w>_k7iRl8iGTZv6S19o@8lKE9$JR$tq~?P7RJ) zCUQo5E;Y3r4tqU+sL}WRmDDMD$$ql82C^AS$DW&RJLNN=FA4)TNspmUQ)}0g^a&Zo z0!yPeOTin0B?1@PoE9fBukSX8h6`ZDu=%fZV=g~$WjF&b8IRat!58=5%^T#8sjR!* zhphAWN%{TM?r+Tv8CfS>=jcaAS9_D&7xU|U2WvgyvP3V=Dn4Tklxe`wi1&>PO40bN zzr^DTI52#lx+lyMYpB63+8nr%l*iFlFp(PYoqUf_v)3@x#u(3sI>`O zQ&QJwdz-$MsY$#wN?F~aD86l@1ua+_rTGS#)_X2;>YZQYP)k-BQZXu1d0v`LR6{zU zJ~i@ay@g#^zM4WGY;4I#Hr3c6;ejts%L%PzD&Q0})rU`1u1`#<=rM_NqTizjzwVzqw&jPk3H>J$y9tF=@N(K{EMq}_-7DiwJxUV-7$hN0jE)f z(2Sbt_X0kH@w<(sT*t|iz9}d=EoNiF7)*huW(%TucokA?%ly3OE1P<03rETDutY}s1 zZhRyT2KF@w+st{Xb`Th~X7_!)mwNMZ1hf}+?-e<0z&o_{`sOIqTzS4rQ$7Xu+_8Xv zSak7scLaU96)8XvE=e3MLoIml+(v^gPsZMzni?@-0i{IqXN`UHQ1S`~{aPx$RGWIw z09L|kS+by<2T!5X4nA&J{!&wM2Kl^ZNJZ69jpr}=UqU$YMHgoHpElAxT6Q%uJBsYOkLr7@zwbS}vb;8(p z1jTRb)%`lYDZa?Te(oG89yEWa5h$JYO(K}Be0ZSZ;T2Bje(|f~fP(TvQuYHn@`3C# zEuv79;McFmxk;NZ>LIsYY@b;6m+hB)zILnw#u5E~!RVWn(UDQ4_=>0|3u;s;ctjs{^XvF)d4NBi`dpRP0YFl!zJ|tVspN zUvCvEZ0j;@Z{dn^?vs`1@f_&_<*v(l;5QvsN*a%DDFjZSRHw*^6n~mvjai@7QlMO3 zsf!X5XRGs5AXCpi)7o#vPo~wMEZH+;FA{0RZ|fRWN2zjaTdITmt5#4;4`@73^HZ|4 z#$agGs93`jiFzr8U5<1CxrK`ibo@-jvVF2x8w)Q#wRvX1VF(u3B0@u{Bw{O0Qp)72sF?nu=cu!u77Gob)fIt_r zh@1#PU?AGdC~;*x6vYpsQ0h-bn+-V5K)sf1)r}apbpWhcs@;b)C391%#tVlKR8)me z0xYwLlttc!tga~#ODH7L3=QtCA|#f6B~?>7(}^gI*)lQbqD5ofWoX{KR^%(0l4Q-6 z;zWCx)T<(#W(=5EopeNYJae^H_>O(M5kA}WU7mVW`KQA)Xy?^H5CtgQ6)+H@h6;g( zl;Y|k4Q=}>(e~Nz$xBfC1=LucJYdPqmU^vn)fkW{xjMwB64t8CY0KWkRDTYvY396+ z7kVzdtgaqGRtEYl#@XfxEn>8>M1vOQs-airs-zs0MBJJ=1qFco6hUCZ{Ln7z8$PO- zJH5RB0A$Ex+x|cJ?tdqrwga;e{{YF5*ahPD`)|ZZ`ZtO2+dmnH?ck5N{do`6R|aj? z;y|fOQOoilkZksJC%#Ne4ojcj--XAO^BRCg27%Fa^<-<@>Plj>p;$Vh8hYa)>(d!Nv& z1B}a>)8wWY1dEXVseygj*W|7)CHH0YxUUUU6C!cXCudo_=(Zb~1474&&s=y#gMThA z2AV8iRv5A#LQi@YSiYgZ9{MIS_fc@`)UvFO@JNX9sb!z*O~83aXWx=OWS#?({tY8`+-G|>`yEeo-;b6M#tOfkfc z<6)+Y7XJVPEQfwqHb0`=s@FWiQH&!Gs5{5yN( zGsiaS62r5J?wq6>xD5jHdwudx40YG=^gob!j5|yb*ld7?EMvAYisS3%+qKS3d3>fA z@tpa~$o(TySEHHyHs?#oOm_%|eOGU%hNmpqGi1tr(sRvgnT<%Szxwr86!mT#)V@-Y zXQi6_)xf(AIBHQ^&hIu%aK$MT2!;W3`o=MF4Y!dLN%E1;HF`U`=;%xUv$m-zDUl!m zXF4EJBooVCDWD?khyy#_wM8K1$e_^z284XV1|;rJs8BBALleneQ1am4G(Z}x4PL4R zSliY5)m89jL4XFN*{p^UChWi>VURVgZ_NSjE@T{)0eIXJcpw<|lFh9(Rw*72N;gHC zhfrx+(dd>9J6+!66q+(DJmnW7r$x@ek8y%g zB8hAWou)qEdQQ zG*d9Qz@p#b7MO;tlvKK2bfUQyJDw27ykw9c=J3$K4n+ ziW0a_6pFS!Q**M&3?x_@#cuPaYt!NUrW3~#Did(H-fUwXJ)ZtMs0KG#=&C&QHu$!a zoXIU4B$-;}^ZI+F>?*wuu6FBj?r5D?emMNn)_0I{@BEi~LlGri5j{Gh;u3ndRx4jBjDcqsDsGypQs67aTvbGX;NOY_B;|>>>WhT(cd^wx zhZ0HY^Gp{;V3Awes}x%q00xItsJ0Uw!md|45wmHNvn*z1P-?mL&xW<>{^T=l#IEA2 z=hAT4ZiS@ z%QcG|@nwvK>a&%L7xfILA;20~Rb;6L)8L4e0k2gv&IWI8N)Q^hv;Nhb3?T zYM^w}=773tm>#7-zWg@xTh<6`y+Q$pX;c`f_ z+^X}NoNXcp6}ICf;K%rNsajJoVk@PJ(G_av;Hy9#0p@~n=9r0tL;58|q#DE3N%BG= z$8LhD`2$wey}xANBlI4_VYk@rqqo5x*hEz7PZGXlbJe-CLk=@JmH;}PcadayAIQHd zhxp?j*DDzSWY?)vj&E1XS&t!`b)Rxcl&e~=ZQ@Fns)pE@*0mKW*J)P_F^L5AS=|uH znh+$5xLTa)8S?K%8vIvIePa$y%*(O8*LlQ?B8f5Cz{B0{Sdh+|eg`G_9x-EzLIM?-JqW7-_+ za=iU|ab*~XW&o1C5EaX%eI8?Z5F3=bGLpnBrxjB z)5pDxakpMFQIQ}XE7!-kmCv3zz>y%_S7~)oy*r2Qs-@jVAP?1D3YH%f16BSVP-)n1 zC5C>}Nl>m`^WmPO*!Z2;kQH7o`E##Hi1*@ScBci#_(uoKY~AG5IxfDugT(m^Cl*pm zGWYS;$6i@Q>r!mXqd)@SiYZc@nqRvf3aK+W_@GWfr8z1BNj6;n1bC=$b{{U$qEpdD-Ws|P3N_l13+Z&NmqGG9G zmt(VnwXGuo*)U79{1v5jc6r2zi%?K<3Xt0kJ&P){5>2SIW@#An$!D7@}G4{py zT}rM#@V-(R!D}XZ1Y6X5GwBw1C$*|F8qRz>B zDX|k6J*;(8>}ssLc#^;;*=0cOB5GBg8ick{&=%ESzm?Pu#1|~D-kPpk77wb_?S9KK zc-TnQnM>MUonIf|c3DX8kQJ#bpI*x&H@fz|AHaS;u*LpHU$-g7uQsQm@^{^=>o4RV zmtc$z-(^y02(r9-x6Lu+Cy-+Yak@1&8n0J8{umbJ6}{pOP3(I;GmUlbNi~KZX<3!h-eJ%z!CZ+#9NAt=hbGVY0Lirfa%3& zJfjFPEI+iajhG{Xh)h7Q)%-HF(j+iq{{YPtr~%iKVS2pB~sL~1msZA8=JR8&>99lglZKCFch_s zQUa8y(L^rOeicjz)ayzCWmLVc05_p0ij+1NexVAxZ2>LBBXistbM{{eYv~_$dku)3 zC?yK~7w7)JZi?}fe7ngOb0X{N$(*IG(34|`YJp|rx64t#@hm$`{$5esF+HT?iLoJc z&klW8sPq0SZ#|6Xhzxlm9xX@Yv6#$wQIkJ;jG^unU9vRUwuVApO&If7s?#YJjA9rr zcqbSL$GFSU1rt5;Cym`)Rz1W)$RH|KxkjQpaZ^FjLPmG)iQ;uzg9b>n`DnV!;}Ix9 z?y@cHewSIME1Uy^b*WK2ISfdSkEioarlVBA$sTJ981rBt+KW<(B?em6DK}~07UgA{ zru5>vG`b85#li(;22(2|!G{;}V`8ndx7{9Pp zbL)b|zHiG+aLJFD7@aw<*1fwKkA(MHH4Rw=)Du+luUtJ3=vLA{s0uHVCc?x zDS;EE-_an6SMnf!Jh&^0Mxa;GGs>$jHKMq+OxR0^NJVG3+Q`wgS+qK;f;xeJ*<}bd zN~&P6732_E**TbjPHR3PBSt8g+=^LqrmlpBnpFH&F`D!~BRpq>z?y)(p6-0N!#A4S zi9@`9ZPoPk<$8}jF;W_*iuX#&nScX&tMZEbYWiBsOQ{0X8fb}A5|m4m*P@xH%VyIo zqvs!{VkIVgCTC7?|KI%|k$Lt3DL_ zL%+pl!6;-gs4u~0@~s%RgfJ@>D`q{+C9PD!ahM{DD9w{2xX>$ApCqc*>a`%rpCuZM zwIVrL=H$Pk={ZyY6s0(;L}d^|vn?*H+hTl<-l|+qo|j{f*c$qU*O>Er8rqE3TD8WP zBhfUY^i&S?(^Q^RIrLKqeawIalgomFPED?*B{3>7^i5Tm+UKgrRlZ`_KoaW~w;BTh zRnPL=QIjK*1z%kj;wjAt_L@~ZwH!_UFx9%$SDfEttcy`}YB{nDONbI z`u_l5e9^&#GUhKTuUCkT*zoqo)m(b(%Hn>=f=va$Dq!dC_uv!T z=)D|zye2uhcN3X=J=de2abm9L4o^j_@VFfIu^}NLHG?*)nsh#>6{Tux)j)SU3%!oN z6;}+lw?swg{B_pop!-^{M71pdcOTI-)A=^4sSr&`{((d=BtZ`PrUgI?@z(08MuLHh zsD^YP_2hx;O)K1hE!+VvIPgHen}-KpD5u;*Gad>eaLq74eonJ_(;G1P2?8r?E?s(} zH(~NLB%VQe`t+LLhjkf%39BzZUcakSv{A=x^(&TRNy8xr-K~~?$g$n^=B%bE&$f*2 z91yoVtk~vnd{B@Scd0AU$Gx0!H(Lyt3$--pz1;gHU1n;s=o|p#THyd92qEg8PbB15 zfmL3E!fwOHpq1qIa_3{(c>LgiynRL%c^$CHjL2%IJr5D)_Kn;?au>7H(_Fmu0V2%3 zZie)&8p@cBsET4P?PF9lm}pN#6Ty$}WrPI`k8OFCp09*=JhU-l`*<<^7^1J202YKJ<99ho_sBOkT>k)L@J~z5RQZBwv+UpwfMp1;MTU+v8?C>*X zo5-D4MO0*N)K>*^w*_LQ3D`Rg6F15&86AKpYxS^CkBKb41Z?H3+jB)Ot87`C7)ZvRR=QiSGjzErGg z=Izv^66AES=7KK8pXPzz_jD2@H)%vbL=Abem@dZeV5LgYx*|JwB}wv}v05UOe~Q~> zdpnDu9+%-=LIKM@fyh9+iQyBf0-d+74L&F%LL3j^EPzR>9+w1uisIq7aATzv{{Sc$ zo7ed%2t<+zuo|FlNHub5+z=qnS)JIrstF=LyD6vzLyNTv20^zQjZ^Rw`$HCg;m|M% zB)UL=0+(%g6bv+_YVj$B0En9oOr~j?=zcwh8GOFl5)2MN;M%Lt`&P~_74Cm3d|Np{ z8xjCt8}+>Oe8-USK+k;+;YX_azV95Pw~(;N)L=+n2-}Cb-)Gw9#g_z(azMB%-|F@3 zV>PmWoB1s881vhoQ z68f7jM=@F>G6w~l5FC+mLFyF2RLLQhxl)L&*>0NZZQSD;i}PMy)+pUewnPGW7h3hr zTFMXcqVB;S*L_t0G4({La?wDXzv`^{2pZn}QmQ6TqM|Y^+;mSX0g<_>;Fw|rP(HdP zrmD%>%vF(Ml5|x}J-q=@5daV5ia6>N(KvPj99rj^lytCm5kXQH3n((iF{^qjJfAA! z2`64^qod<999iP_E04FGi_5XR#4_QKI)&us<#ewvn*fC5`WmmH#n|S}I8?o~C2vhq zBO%j8sX^F5rPa{I3mP?2L|wO;`;h>bD>hRd{jNhOfJdlaUWKxW2a=rByokuZ6UlVf zJIcp!!B!Fke?=-J3xz)laV=IsB1W310@hi@M8xy{OE|KeXE>Jz%PP^2b0-dcR%we) zLTZ>+O!&bdn=M>O=;_FCpHp%$+-dJ8Ccti_I2`x}B=qSRNO-{K+2 zs_Dwd7I6TO!MH6qs%8s1(9a;i@ZuF|67&sEikgHRTE$gZ3s5&yF)%M`*)>qbbAM8*g2F@! z1rzXPn33~9N!qH_0BhP?RKPr0tObQoe_)-#SM$g9=#M%h4*B?U6i1 z09pu>>J-td$L>x%!$B?!pL4@DJ;#UKj@XBCbzUC%$2%T`HcU0Y?6{-M`MsbnKwbTI ztazQ?6OSpDULUM4ufdCYv5%lhX|Z#k1}8lt+dM?Eg% zH1?(GUW=^hVwvqE3o_T()fphcYF3o7do6q-$T&2w5SO99Y{IQlxmIgGmE6iCV1Ybl zx9Xpj<~foeg5mXDt716}YAR0z&0JbHBr|DcoM#dn*&nM!`j|5A41tNK6=Z~p2P^)H zshP|Q65%kx_j1T~lkFGgq=po`K_@~P)|7V_;u#`gHwPUNK#>8=nM~0yxgi=7rY0Zx zIr}LiTBaCdbDR*;rla>s#6Ga2xXNf`PX<;)5jhEGC!Zx^;kgCLE&l74OH!ixyC@R} zqYZv4se?`&RPcu)0rr=pdL;^gaOQzt(dewc7fc;Mc1Qyu-BR2U7vd77R%%td!Uj0R zr1?2x?iF~@)GcdCNW3XYb&ONu^&zSVS5%G*mlK2jSH~ zqR!-=oYGTHM7SpUA_7RQ_@H2eVo7QsMl!J!&~Z#w?+=i}$Y78)iEw%^KkUusvtGyY zebh5-@nr6QyY&uXe4o|lI$wz3_*g#Z%RmVW-}@bZsyFAGLm@iQFE=uHY3DqYhur{Z zzL%zWW-yZx7x=E(<*&*1i4a9;Qh@*u!tUw@0CxuZs}VeTC5(wgvDB$%_%YGj`JUMO z;$#;Ny+6WZW-rPPKm1rgj~*+X{ba?T{{S{fn&Wb${b>?Ly@u@Wq-4vNeEmk8@Ux1A zi9w1nZfaWwkq`r)ismDd1lej+8Rp=(8Y(HCI@92{EgCktObunCLv71ahNiR(oFJd|y$aiDX zycZsRS6q3?i4Q=#{uQTUVhh=0*$9UEW<&)!iskNS!%7wD<|`yz9y|i=JgUcT^EBRmF7hWM~MAADLcW=GLPg?;vvZtCn4TQ^HnpB4a|kOAw5JHNONfcTvZx zs04|6Q;Lc^%hITc2>>6Bom=5-BPQ#?Nem-;mn%RzR-@pR70ByBqoy^Ar`it()dfYh zN}z_hW2Y4mt|%+1NU%604OIXo{{V|58+Mt8ZB0cNF5tf;yRE9{1omPEPm;srv+Uo& zBTh`XVq^C1vClPYxwgnNZG??zyq(OhlgoqU@EB%x02S=?^|8*mrZ#&XE4}Fzn9|y@ zR^Wu@Sh!*|T9G0yNNHa{sJm=Oc+#sq4@0paKyhA9)pWu1S(R*8XXm2SxXv4p>rC1V$ySS0lqRg}R%4i;@LrK*ro60cq<xSSTqTadDQfQMita0gfny&Ht|K&@npt`s4un(& z)S?hHd+1eD7PA!~o)2z(WYgR_snqZ~Tf-^MtPj*zpPG*MgxtzL7d{+A{!E9q1FG}; zf9Tf_b+n$_G@&x`yqS7=>tag8T+g@#)lp(+!7xuFM2JK=)bm+Yd#W%Z!{WMfD35ez zC&0ZGuzC%@lqZ zfa2dJ5E)hDZC{coaAQ}kN(LkV0Qwb70zeIGR4@R-#ke9DwnPZmS5Z=-EutbMmul9k z>ZHQDo(L63t&~74`oGCl5{y8oq0^Fyqzgzswg-|1du;VpV0f@&Qk1FS#XQ;Z;)w1u zkPX#myOUD8K2O9QjPc`;X)~3>p7qXGH+aG$qV3FYmS?b`H(QMnH+pDU1Z6mq;*UYq zLkF?BwN->5&CK$uYJ(Hp)UCQ`mYO8d65?8@Lj;XIuX3VcNI4|eqCyZ91T);0x`hX} zj6Z;^t0~ln7SS;U#VIDx=zx&|=hPyAPs)mbjy2Y*YG@JdBo`v$s;DkO_yc7zFxuhk z#3lsoM{-($G$ScLElRl7HhAbrlNB zuTK%UrZnlIqEVSO`K1zY^t!hwPfFE5;%W;Q`K251$hV^5+fk2kC%e&g^`%u476hL~ z*3>B&=*N`NDtXciDHqAuX}=(TJg>$h1qkkNr<&p zeo<^g20zVUcYHQ-aF{r7yngxTT{uI`U^0h$J13{CzE0zVFvhexa$e}eJmdj9G+hi( zd7A3A0t9jNK|FZ?mjx{FW4W;02*g##1?BIbBy2chi2_X&rX(ymqJY)YlFbd4Y-$*xvl6it9Jx$m zR;tv9N+US}hTHtlypeSi$bim20+$MmJnz$XQs6d&8Z^Z&HS2Y5q zEKo~0#)N~xxuOs5Yqilu1M;^d z3C+l+sUd-b0&1b6k#5?Ds6;4$NfqWaRiWLEUGjK`jyDPxypg+(g9gsZ5Fn)C|cjs7ch_VS36Lsne9lUeEQ{8sO} zA$U8EZpKhD;-Cbw$0+i?UuoUky&k@YlHB6^c_kKbPr;YFi{aOrqq;WfT@`2n+Bp7- zhSn^_h#^Ev0Y7>MM}wzPY;Vt-ypax$xbw~Nad3U?oZMYLu)sGN1CYI{=NU|gK=y4`)jH@NJWwl5*#RS`#OqWr1^^X9 zU>)j}Ks0COY={duI&sxNyFruwi47DbtPmsI>z+zA~RsfbJna&_pDLy;;M;K`yvnwq;SYEmF*Kazl{&=3NuPp2JJ z16G<@Q7tV_ff49G2HL}O=Wz+e;}B#*^M1!)>d$w>rTMJi%NXbY57Bb{e}*}EUGw(< z@BEjqmrhxvBN5#Y+$1a6x}cx~g$% zgKH?1tn||1RWQ!q1N$XPjDu-$UMdjiYY|­rP^1HmX!sBJ94Sf*ma^&0Ax4)M?q zDg=929WP3uu_x!zce z`_m|7?BEwqU&Ari@Xj_fB(Zw*UQd6Xnv1tYM;1OLy2lgCRpocG{{ZAno;ok9>Yf>q zoC?&Qwp}%JI~D=PqoQGkD?v^^i2%=6uMm`=(~km(QI*3qxTT+!un`es$q>y&SUQ1; zi2I^g=$2`k>1{mT=Liuc#R%xQ_vw`}>AZG-@*pK9B!%JcoMpUYYf*9sWSx|vCIlTB zYSmSj0FZmjRMcexP>=$}Y73=`GYr)_sWwz&mMPduBqLQ$co6}?mq*r0&{-{P!YDOp`bauvVuR-g+r1!zr1P)J&ob#N&g zIW?sMp<>Q4=7itql>z|$q-mx~xfg7Eb+xww0szuM0z{j(V8LlK?K^P@DojN&rdNwXCneUEJ$+ac~kU zPsK!tk~BZ)l}Hi`(4rBocyUjaKG9=9XjV{*J#@Dg7t`ad zj#bZtxnM zz+kKt7~l0;)@r`mhZS4Y#gTZ5Ed7%g!zcuPi&C+9tKlF`{S{)Q&K*os06lJgY6n{X z02NuQ0iY-1>p0Uc=O_c1TjnF3ImS|c3#@{PkTnJMRw{U6;oX3#bi}E%8Xr}ViK+|s zm`+KC9;-DidR>m&vH|WxvYf{*>t#L*vxP2fsu=>@6ip5Wj!|fLsr63);Y6yG0Vb7M zt0MbHw0f*MzynZfqL>!qlvx8;d4Cy1f=y08G4y<8fOOq#k6>#CuaH@5{U3fZWN zjgMUrKGA-4LqRnl)vORI7iyHizzkZXim8Z*22A8ffe5V_b4mrD)n~3zw+{MZQF?=N zy#0E$9o?Sx89)Z3Md0>&>~x(r;xeS8XIw0;V))JyjdTW!7x_$N+~aV@qea`-WJ?@> zE#o6Re{uq&RqXWpn6c+_LQtC!ZpTIRC6+1Um)n>k{8Oo=dan(=5{y`{7qU4$X3sd3 zU*x>qGg$nl)JilLtA)NP9y`kI8@RPX_ImqjR};051~nQw^g56geJ+NXCBY8dtf&vQ zi_};prllOLI4M;>zatPG_zfzbSeOQKDX3Eu7h})*RWQV}WQ1_A`lO_UVZAPg^5SnSX7-+DkYz^)U$UYq+i!Vq9KO{wl;1kA_(ps$FKS)$OtbZ zQOQgLL^C-yCz7}V37|9_6;MeaQoK|^Trk&)0H5yHflUqEJJ|zZ0dractN^Lz2D}gg zA%XgUH9Dp$Bzui?qab9)L=!?kRL~k9)wD_@+5qkj;XvX53{H#*N>SPi#zcyr>S>s(@9S1v~SU{{m&z8w9Ee<{c^d7RvfC!%;~mz&<# zCrU3*G1r!P2!PgQs=7~J(fkUoD%Oq8T4mGFLZ;AE(bd* zBuhoyJ7uLYp(M~KWW6dg5n2l+{)Ila=-__8F5GVy++AFK3Koa+9!9;xn z{=3@Y+<4C+il1^_q4gAB7ykgz-@7*B%=z3W50c9Rp<)8|ez$wVy8b+N_{izqb>#P7 z_G&`%Q4uhY`(g^$r0L~15`6O{>b|G1{!)A(NU`{>$ViDYcKIc$VyyPLAzc9!{{Yl@ zASxK>)k+2=5%8_l0|s$^YJm4^)BP00MTB?}`X|c#fp!MJ#)T~_vEw|^+J=~TwIsaW z&rjKmcJcmIu`v&QPc`PhuhENP`A>~{lg&^5dMMm}Td*Jav6*ozT>iCOPi6TA+i+Sy zLG)Sg(_&u@^BD3p@yHjt=kS#Xf-mS)vqO|4AVJp1Fm7;m$>Kd%PI^pJ9Mgfljn_*x z8u0GpE1!bpdGajDiWvih(StS_N0`xco>nLzja3mee}k$bNP1aoOaKE!p;-(fKowe$ zLUJ)37Nl6omU5AEs@$K7uTA*xo%xjdeAc+OQRiofjD!H^n)XYr>r^6pFHo^@824H?rmI|5qbr*d8R)uWOEJu``90I{ z$+&9W>J<1>?~Pl9v}7?Xa`ystvd=?oB;XG~xOA+$sv4Tzb@hzo6MbyD>LXK5cH*j} zI9^)1l?3s2!@A9{?4+baMzoLUw6zde`&)oWf9M^+JKt165gG85Y0$ZXIyK1bZi!tPoEb8l><*E{KQC$|C z(rpI1DM3bmMp017HV06$y5;V(5^2$P=apu7vm337=uJIS1=ztL0*P9LF~SwE1)7Q_ z@0b8nMJl^~GiEMA<@ROUgnMGc;JWbP-8%xhITMNm4cykrfjR-HQl(R}pCa5qeMZVw zxk@F;RsG>!I=A;x7?(1?6e)IqioL5N}xLcs) ztBl7lB_D;+(khYkYAq_c^7taEW_}zsR0Dzuf$`Op6Nnv9N#cm~o?mhPHrR->$$5P~ zy{l`<&VJ`NcXjln#XuJi&dUB2Gt>r3l-+;=pz!FL5hu3FXb3dmr~v_sQ-?$h$@-fG zG%ApF;HX4Xw2GAg0W>;mt&sQ~Eu*V}RJqom`XY%JtJ=(^M1#0)PN-exyh(CXRP6L- z;({fO0AMJTHx}V!1W9-P9RX4v=ztNW6ESd$3zs9&G&{$W)RaJM;jLuA2$1pB7Lc<$ z1prQlteN1$pl8)wFvOgI?RIoTSn;jY1wqlPPF#^hY?EE@K^ z$-sszxO+L39*1GR6N3|KFPrT3<6QLUag2j$%s!8W;Kb^g6TS9#}~`^ za!1_9QUkbN??=D!Sg$)c$}(vJ;+&VzmsQd6TcZquB->TX+0MpndmkOUaT5Nk#n&!% z)-9VG5mLExzrsBK0F&A|EIKmudiowu$ZchgWPm``dpPOSn#D(BK;Da^Vy&g_fH5R8 zX{iBf-5^F<4JfE1Nfz`eq4$vNeM$hCn1WBCK%Ik|ppkYDabyY0QMi-=_Ky zTmFoY77Pgl`qe)tszirib)ZoQ$acNCB97-Gl{$n>HZS~qRZ!Y+7gC`xA+A&4_(!yg+zn2F zTjh68xDje`>asnr{dv3_Y}w~8{AMjL*?h16077|U#vjQ0GVdjxAO6gQt$wD?adEp7 ze}|4S8dY%b{+pi+-bP>ZR-WJ4bo9jO<@0~#lWTCkw?6^|ydP1;Y7o1F0m9lW`3Z$U zC5p9l%iK|oUxK=Z#f!5O@=}znUDyN+5W=R8QkDi5c6y=}UBr!Sfit-_{nXP$p8PCO zfH1uYuqXmc5y4CZYeR9tYTR3KAt?=6X2x3f-dlNuu$zq^g5}q$QypEmoil_D3U_A$~0iz$|a>%Qt~tt z4ACd#x!(k1++ZIa8pHtm6P(Io*Lay;=-{N)z&Y`8!?)O z`7S+0ig$o9_|mI>x-qyi&bUhXFXb3S zJdR*EmEZO6ho`5RpL5xR-FxM8LFD19)mw{*&Qc%~%uyurl6gMKc7s#E^H%(c;h$`P zCa?2TsjH6m%Ok`BZoGZQqfi8wt8rY`q}1k#h!GpzX_{scPFo<&M>j=5k23^iZi)x(4oSf4=&br8|NtBJ&)vE^Fo7+{3 z(>l61WMl{Gv#7dQq66wUsc5%hwK+0(ABxXZdM&;o2(Vn|mU?Ibx|QhV=IZGY@w(o# z1?-{%QkY*pXr?P<61g9`p9>b6MYULTgyav=6h!h;kzkVwDPu{&jZF^~nz1k+T~yx- zsLYD1%BYr3*xkum#%;z8$?hesb<##_kGhRWWu~K*o-HH$EY{;Yn~`K`2@Q2t3Z&n< z(v(RSsueh$P12%tV&19=Yso(<>3&U|oc)5VvHINj)RDuCsaB=9uV%D}3<7V1OqyEP zbpR+UbMRCSOh7PI9ta$apZ7u$BCLH6=!%q0 z9D-WP;e=udBvG!S3P`m%gJnW5{jFV5Qtm8yg*6Mb-{e*Bq-0pq^#hUuqA#yL0RRDU z#Y8af!rH2+#)h9HD65(o)-=UuDDjxjG|%$#Y)fD&Y~G1+X~h)spPfKOxWOlL*b=_ z4bCC$mZ5zg)%X4w%z5}^luL>=*Sh&D(D=Rkww%|S*~1n+M$dT}3)l5tZlgH2d4yzv zF}VpS^FB*rBn=(cqmI9WUTblS?PQRUp*CK=ZpT@5NfPc4LB&-!W^36*HUdO7IJ&W5 z0QWw+^h^OgNzn*Ez4WW91_Ze-4R|1zwZR`x6a_&wP!yphy6`H{ySr*A1=N9)K-Z{Z zs8Xay{+)QKfbMWl$yf$v9n40YQUJT#s({q+)vl-=tSWUt5X{1&jlmTAo!IGaXov`s z?#;(nMNWd@OhFPWsL@aX9xuf#DE9u$s(|1cH|tailo~U#P%t8~bE_a^wFC5iDj_iL zyMcE@Q3Q}=DL`FbcAknQ$|Au%vKJsPU1JVOwDw?rj}` zJc96k&GU{u{Jh5UecRl`U%0OPPxT{-xMP-WQ+4Q$v0IC1Eb8LnO3%miP=%;Be?+v< z1cB{3aCb_y8Z*c%=ysfzoZz_JA0 z(>3M-X{k;!Be|IAsAWf4DmG^>()zypSE|N)_AEojk;eGa%XO7u25!g%2(TTnWi88T3=~Bnyrl z)e$!h>Ov|`3&@&)Q4xsKla*Qqpcm~?kkKGo)Ci!KXVF9;Y}8>+DQQWFBvbiwRX{Ru zO-J)mlru|+6lhamgcJMc3;Ed2&e5{8f>t zP|;~A$ke)?MVOhuqR&`0OBAu!L-1IhQLks3G9PYBmrNY8qBNKXwuYwqD2;n)NVjM* zCxuGm-%5L|CJ+uO`zg0=OZ>`Q72E*xYV_hiNLjYAJtN>E%xH%CMS z5=gZys*}-$Yv`p18X9PbL`LnwnG_QiWQ0EJzs(Sb5$Y2FNN?2?i_=D+KpKh!1N?Xu zH4=o3CmC?6bv7%~Z9g^K?EnQq`o8fDc=3xdb>Zvu_WZXxW!?Fm-u6$DbUHNx-yVs~ zOV+EyYV}*{vh8>s!Nt7AAXte4SCicvnEGtDv6dkqXhQPN+@~I2GW?u_22`^Vqd7+e8pN_0eiZaN;RWp-nX@9+j$wBOl;}tV&ZPvwEa4W;phM%cm|~EPraQ zVC0_=X$-K)n+z}x&4;06AUb~YQ&>oPt|6%i*x~&Dwr%9+>~iVXrH7 zL8s48yL%w&`aT+tX%ug#xq2vzFmbAehxWU_7fMqtKpl_-fz1HrsboRjrwRm86rm5r zkS7&$K!QQ9!tKEVGLwYR0~YFl(d~L5L=)*=C;;X7ofXA17A?dxsfb0r1<)MD_$sCe zB7?c8c_andv^G*y(BR0hZa>KY39uB@s-$A#wz=S^!e|o&QuZXP6a!H!kTkbc&>0>z zHvvQ|wf)WqvC^6)~e82yXUs+T>!?gR48T>m5ge^Ikh9%Xc`Kp4X=WzR&A> ze%!Mec6sHBVyx`Db&xE^W6*803CFbRy!InL{{Uzu7XpiX-zf6F zQ)Ftv*QeLpT-OYO3mRy>I_s%K!?ml;3`N7x(US}W#(t_szPDd_RD5pXTP#sl32rk5M z4Mh|X1@x+pA5d+&xGO9qvgIBVuWcN_s;+hqj&%^0|gv4R|Q*o31##Q4* z^L^j;xA7UAv!$ z8fbtZk!Av{IH3%H3`Inm;Sh-;H7re|s$$4R&D_vCUa5v1B~Ioxu80W_Ltu$1io_5} z9MBFb!%Z&A#lTtG&sr%^oRE8kMyZR50ON@lS3(vKPF$1VGh*6)y;J0b`m-AW!9*t| zj;79_eWVfrsTS&}1vO;{w)}Hzl0S>*+{OEQi=Ip4e%0S&JLTpx8646e+|hjwXN9jx zwUNmTHJ~4&`Q7-pT8zF*Pm*Ei%eST-JhXuBI@jqR)qPn!1o38PWIUOVx#aW+N|TffM4L@Y zkv<3)VL||+0z#~AfUO4`6$ah3Ok=}}$5oo@?chXS#N4h`&YZwBw>=Y5Gvu%zK8niH z5rDnb(^d$8Ep?GxsbzFmDVr zsSJ3o{Lc%CW87t!F>}dV5tDZV-QH=%Ynt4p4%X(nC0CKHrlB>cfbMtD-D-;g(&K`K zOA&uZWsZ`smU;H}8i8V%mKHq5GI65MT$t&@dL@n|+%6ZKXBjs_GIL;bT{vnu`Qp=Z z3h&EtPj$^2!=Oc27hZp4-<9U4xN`zY_^feq zwOpL1wnX}`XFgfPOAcdRO4x!RfE^ zk3|rOq+DI=rPL0T(5rzGeN+L^Uz(VPBG)X`0Z^FS>VXMgQ0c1Cw8Qsu0M6A? z{3EP3O&fZzKVHwl5fF?nY_Y42TR9kHi4?6@FJ$oFG46KznNMdL*j;!!nOn~bb7!gGgd#y53ZhYKsFbHB3~03(sbeCGq;lzN)vv0o zDcwz@OPei1IaA9%`>n{{HSI@x8ChqfYRm13(Pkzw!eUY&i&d7aD)YDz05w)DG11r& zHZ0DuNb15YEToBQz<94rk2iFSm8J(v6u?*20Q!olXc+$CLKp<~MUiELeAZnNoT#jx zK>$l}QjutPV`VE#qZVBCs9-%!l&WNb>X@vVr&cY|bmg9_Jmepr$#upQ&$i`j@G))% zwB}J`nYn;3&1W0s&X}t#w<@^?cCxCfLyEenNHM5Sz)>6x6~$TCTKnATv0A1=CzI+miL`zWNkfma1>ZzCQaq#A%BXdh2VASe) zQ34`A`*f-Sh_#Ra3y}R4G>I~0V$_YT{jVT~T4Fu@&aCu zYM^cjcCM&}?ID2c%_`G0i;HMc2rwi$1nP@MtO&JU>VOa!k6IuABKn)803m}1Y5+MX zfDmfz+)ye3aH@bJMShSSlz@!EY3X1ag1bwonmK9{eGx%sZAFv}2M*P}N+LwHK&l}M z`+*~f;;-RIliJatu~14bV&>daOHUqI#Lze)ikF=oPanPeauRwK<@b8_Bhu}6G0Tir zrmN-m#g)=lhLkHCYPr_haAcGlFAX`Bj<1$%Rrx=Mj{9N$Mj`(IBtyxUf7SPWYm?_W zAv{x*WEg{DzU1p-wrn?M69L$)_s@oGdaoI}CA&=yi^<$`ccKPdONv($%WS{|jdWeP z>2>4$hTpR*iViE;$6FibvK?OB1zmJ(#6^y&siXrr;qXNrppZy$%{0?$KDq#i1$B2- zNrQ77Q~->a_Jo0#AOalOTL1v1=%fr8JDSm*zg0?Cv1Jh%JxF28`6|>fY@!i0C57sF zAd`?UL8h#l6n(~qgg6`(Pz%w^jwpb=3+YV|Fv8%FE)Nt6rOzLdD35a&xcH!v2G_GH zL!hzbSwsQIB0AN@(ol;6^0EaWBT-{d^*|Er%m*Y9CX@gwpjq3O5Rpzi3Y&?h0Ii0t zbkxxhHKE|FPyk{b+tt*-0tFh}I3yqh5JOb~AlINa0<=Up_L9*IEU7~?HC)`N0u6gW zy@9H#Lga(-KofF-0%%RXN>azvd>nqy;QhviVn^b>XS2_49elhbZ+4ctOKcOr(ojT5f8YzVMAUlh7bnsI3xstcP6xOn}h%YDPgLjUC+o_0%j~Pe?Qzt#$!k9aDq4sYlNvqJtr6l0rOv7$_m;gZ5XaL$6z$3QM&lcR=0SWf+PUnk z-k~Yb172RWpKhVW5}CyP}TS#WJ4EOwk378dto^Tuv~3&>bf$MtY^L1qP-rzyfai0Kt4-)n$xk^&v7#ti)y)h zeY2mIzFN0_JN!`|=#eQdUcZ0e;Om@o=Z(3J9G9k4#dLlFXe0BbP!a%8@v2iz!yD-6 zhD4YXVQxy%5(zF#pX8#C-rP_XEEa)~pJ)e%5p2|AWx-XsVo?T{+PI-iQE#oYEjI*1v z+-flxOS#YWR;!`2gAPlbO1n8Ev~QwM397!q0nPPG(&~tVJnSqKqtJNmtb`o9u3c1g zqBN_noJTI{o@=|#X50z^gP>o!C}vR%eE6uT;}<7QRI4Gs!fJv1t$D(MIzfX#x26Ibm#Y6-+ zwJZ{b>_Mw=0aXRdn++b6Q4o>P2Gf!#i6-rEJ_&{kFcp{R5HT-RbRSJ3?V(vhe&(?K zR-(ft>SIwt5CjqjN)#Y&+M1nM>ZSk}0<1*}1Sr+y6)EIAK=(CngaEN)V4wj6wyxxj z6$r2+x#?sL%@|PFsDMZj)fGHb?O;niKnisV>iF&Sv1E^Nc$$^t_WHIYdabs2X2uw} zJXg!>oUYQW#W551$)<~+MRt62<0zanV;N8d%Y3=@9xL-d1a`U3d~tZrrI*+JFMjx} z$CM5j>KD>id&F+)1KD}~yt(xD9y@RhL3bs1`iw5$ZN%VY$<0TO^IIcU8kSzaS53IZ6V^j;d%jjr16s7?$b2T(p7-Rt; z_2ht|BAVSmr13q??Vt*T3AOYpDpDjwu(kLiLeb67C1C(!0p;}BFe;Y z6MlUHpl9^CN|dYLT?Hk-t%@nVTUVeuDuLL6#XuQ3H9-)} z4vkZKqJnDH;@Tw%ffQyy2P_2;PNdnYh)rLg1PFlj4mcv29^e4EHB=p}H8i@F0WLvi zb5b-#Gu_IR4XPnX0?ZhW2tsl_uJ3M&v?JN2AK^|aCzE!pO*kqONF5(U4(v7SKvr$U zeMUpntZ&;J0o56kEI7-N~@z46vLmwWWlbZiHyKP5nE`q2V+p|en+BW5Lq zpMxTZMZ;b7)e3&&Cjrq69_SzaG#?a~z)}X(6mu#%U`!hP*#iLfin;iHs?wjdM96ap zc?`o!3jW9jW-$yL6xGn?_Zp~#WDASEm5U*{V8N6^a&6H=2A=PZs^Ez)5mo@{!4)C& z=w6Jf1_F)rg$J(uf6RZ4;PP#xFEV0uUmy0pHv2UkT(bL_%(#-pdgqQ&-`F0^SjptP zKF^m(r^*lcvhxlHqTlQIPM%JGQFB5{`tqVD>C>8^ljzi`3dMy}dYgp91D5Ruw^P8C zNVT}?fHSR)^hCfPjjHT`s~6PN*)PC}F>BD>F-Z0>aN|xcfFQVP9vxJP1dq6CerT|w zLz-3YiDRR)iKQxi7cTl@*L!D#M;IhBM!7yi)<(X~yUmbyNp%7ruockKKtOiqe*NcVaw7sXPu2>INAL zTY~g+T_Y|+Xzx$mZ(53>Hj(+QRa*&C*1xKWRzS46+^bf1(a1O5_zqD6%O+C zpwOlm)rNc*D-mAmC5a}SQ<|}YMTy|LWn5QM0Tt9OHHIa^?2t|bl0}K3S*Yl3;y&97 zuRXp*MB5`96tlv@++q@g-;$j5jaCW7i8i_~OtQvatMSgvUO&1xyYkLOk0tT{0CwBn zejWJubN>J&-saD^jAlD!j({&$==$X5);q39kTEY(Xjn!DwvBCGV z07C(&S?c6Rve;mTJYjfywRw!bOYKBS*-m`5WN{^uI$3v-nlX}O;44X8Tz+eLiwMUS zhzrlxqFUVThjqQpo?Y1smDi3WOLfo7C-q&UEapT|mt8SzDRW8Xn1|C=daGIxsi5Yk z;I78UAGR;8O7nXPC`7s8#g&MZTi~EZLcLa`O01qWD_F@Eu(H%e z&@4JFIdr2Wq+ftqo>5V8Z9RUj)=uy2%(g2|i3$ z*EVEmThmfL1;<-DZszT>f)zxA~`f)2% zOcyMzRNvU|P8`;8G1dH&8IDL6aaEtz>3=RPNvicj3%A>LZB<&Vz>h(xgfmepKbMaUt~w?Ysy z;FhkXNI?|c{QTwW-1f9vJ$w0?(6+h8f4$#c} z%95I0rI?K=>VOOyjBKc8u1)kI0+DFH`lv&x53djOKzC|&(GVW%>GDdZSXAAtsE2(E zeAF5+WUCwKx!zIQ@t#Il&)bpY7l+^K-zzJ-_dB8{4wqgJt~y%Vv)vbm5V-frU7h~V z2b0)J5+3HE=&!H5y5(c!{$ph=rt)}5U=0`F^mq2s@)Qv_Jb-Mudrb z-h)J;IsW3r8wFJ-8vS3ON{GF|*NSSLg9_^Q1pSbbio69O*e zQIG@{0rjW#R;YT0F5God4n{)sZ3R$(z>?*giA^O$0tt2|tAqR56SA|tlBogCL zphM|m{D&j}Boaj#s8v%EBi(q5(Ga3RsHxQIf=}&w^E$eK2leWxLaqU>gjGPtBVIgy zD)~H-AQo?TH8e5ZaBp$Tq5-H#_-d#gZ13n4LaVl|V2S|&!DbY2fCNN7j>>?LXlfJ^ z#OEwyZsSji$6pNJhtz!c{6C6q@$1rNb0@Q<=T9?h9#ZYogT}h zUT%Xn9GZrFS93u z5Fv;r-@0j_F)ZC2-2l{g7pI~cABgM4mCzOif#{}zoYcIv=2fAA+d|;~0JJC~W?hM) z(LV+saB9?xvPvWEu^iOXOiCk9xD49r`0I}Cu8MhvbABfy- z`wnRKzKhF!n&s7OEf}!VRAHMvL0VYl=5adFY0@miF%w#IQl*ZDDS{lV+RDcaMynMA z@v;CHsOS}d29-#rN`NN3I1~zD;>~NIuO0}-y7E_6tp(|R92D}7capti_Se$qv%TMb=h`z`Fx`byn5VppC2kbixXc;xn0-Nk{Z!+jTNdKCP_-O6l&eU{ zJAmhc26>)Nl?aJzZ4#)fSJf&5AYFw5P=O*&ie$KLKYvvaM0Xz03z~9OUGEpQ5F8Kg zxce(L-oRKdFL!HlIo?)rV_vHI^sXm(27#EkUX1X{+<6J0`6<*EN=_?fg_Ts~1#Wa( z#+h>gIK-Kl)mUu+_fC(Y0jJVPCTa&_6U(wanN+sq19~D`viD=PoYmH`+J9=Pb1X+Nw*TfNVqP%pR3yS^73O-`LsnNJ16=-Zf+JTVNK`XN)&Brx5QLq~o}QOLk7(7#fS^D{ix<&~DUJ41!f7i%6~nI;j-!M5 z&x8{Pb&OQ~Oc&7oFLqpWcoHgmox=MqI({pAEOHfaHPLbQbF6h9$Hw^%=m1R@kFFf+ zM*1+EDXNfpFE6xx81Y`OUBj9Q%LT6WV$uDLkbJ0Wq4%cU8 z1VDGW08k25SgAK{2=!DccC+0?gyXOq^HrpQW;QK#5NZLT0{S{)BILAWADXz^No!DC^*|aPG^i@yh5RkqNA7O0M?)aF z_wdh8rhaQLx8b(ffocKrUJq3N0A~(tlss;S7eZbqC@3r4f+(M$zy72x#{f9F<)Z`ci+YW7BK^A~0V!*9=ECW*Hti*xGX(#F;>X;ncQ=ty!U0os! zP5Ok>NS|$bq=bOUzzSGlc9K99Cc$TXBz-&Z4*)Q24(~oTl>UPuR$dR-?|e9Qbss;t z`Y3%5Tu6}>0{Fdc(h``W%()lLOl1b*uw zlHh)+K}5=lP>Nqvs*eh(fc_a!+#8;XU_{dDgyXpt9mE9jk##o*pWfr`ks2>g71x@` zDnqdvo(pQYMlHp@YHcb^*KSH_sLLq^mFTR&IOLqjbu$I>sHK2XR8T~tC-{ZE7evy_ z7D1al0U-4&QncCPd_=do3(P=qE04S1^;tEm$@m!Uu@;|k0;`v+_BORTs#{*(HsXAp8b)j6BywPfX(T_X7#a8b-aY)BYATw zdi`1C>baA}l5!ofrv>Ys$d0z(4#Q`*63g$*YDR#s7kzi#@$lS{%ir$*0LabUz(80p zXRD8|ELx$py6C|%XE)ITt6y6bij%#~G;1Oea$DeVbMyd^a z3@0W|=C-PJQoT0M01ZZU6Eua293c%X_+y) z#t~G$uhDKbz7)z=s}rbNN~y)3lJr+hR%KsRd<11$s|DL}-H!e2I@i^4&X!}BD5>PPn6FLZaWq92 zEZXPQ$5WE+COq9!0agl~A5|0=B8ygl0^g#a`UF$Q0#8MoRz;IFZVNHAI;t7QOBd)A z)}m1a$-XR>qfA2pxz|W(g1Jlzs50h}GIiQUEoPZ@(lUW+SE`~Shnfe^M9|ygXHu&^ z;xs%CsWqtP?s3qCF{tHb9^=-FKMloF6#bD^NImbOs}#!N&6c8~;1)VnOff!ggWm6U z-+KhZTxz~oqpYr-$A;WMtm$UOx z0RY^xp&rmGDa8~C7Gp-G6-m*2oLSl>WXzRX;G|*KwOZ=s;Xo)c&LGkg7>kaU>>&lRRBJl7P=pj3{3+K z9_SoqAy8PUM*XIFV#y4E^;|uiOA+euW`^egkSW6Vs z&Buy@J+iE1b$3b}N4V0~K#z4en`)Z6kq=TR6A=>=+T%}>LLvzgCb~K*M3P?mutZ78 z_Y&0kDkA!j?#!ehlLBb`IWj^Rb0bV{Hn!m`?91-r+S;BT7G1 z)Y2^?0e%6IeiD~+uyQTxrXY8@_2#uI!Y|uF>ZJ#8s|MnTYzZOh#Z}U?MS~j!JcH?v zY^W6ugOU9dL`fa5Qcd5AxVSrLHLj`}k*Ozz$W~G#+zA7Uh;kvoW&l@#(H8m1Q?KgcGRx}h~AjilKt1%=Klbuqtt9gV%MViz5ZK_erbS|Pdcu@ zuRNVsj+yt!XbSr=5f}Pw1xFR75vgHP6hH|S7rUSwP`ypQDKwIY`iVfuzxzXf6hHub zNz`#v0I)83a#9G$y@PW~0Vk%qvWQ?jPw-ZB*Guu;l(#-l7BD-HaMIOWy}e{(*?c~~ zyvZGpizDf1uwOdet})?rWiyma@Vxub`qL38-093#^t05_OEYRG$s{rrOFb*Gz2!bA_?yf1g zv(W0M4p)-IZUXDYZ8-Cm2cqJ8C?O-h&oz+K!~A|nSfAELM5twNSu?PV}ne(EYE zn$_a01WOhl1wkxvmZT}Qb?yHE7x8#M#*F(OYvp_Uzh>u%r}90dy~GPC=#EJE>>NvvJzgar0K0&vDu%!T8&n1)V1oiSjIedWvR=}-%T_nZN$G- zD0S+nVZB0C(mXvDLl0rCQ1i`qJ37E18Mke}jOGMbXS!qULeO1o{bN3Mh z9aODHBXt22>ayHrkshDAG_FCvs<4V?Iois_LC^9<4m(-LUTa1^m6!^~jzMk<;c?fO zUZci&?YG<99FY{2`meR<_H4@KjzKcL7+fzvaVCUmbwS-Df8eDEwZ#twFae1q8jAk_ z0aXz%S}?L85(l~NY6=39rj1kl$|;g)=9dVBCGI5Di-ZLzA6Fp&7*ecg2PCUQhb^N} zSun$TmwrfvAOK@uR9zBaLtpej5$J$tkO0?;2!?w(d+`cdRLL&mO9xd5z1hg8@aUuo zGzeH`QUSYNwF;OXbZVM_6G7b}ry^7lb`1B_a!^PIAdldp2DqgzRZu2KEvL-@M8I&y zIzFEi5fY&Q+|lf+q+;>2wf_Kh5)q|IU;{E~qyQv64X)^DkYd-fB{a;c>?u?cE?k-z z@YJhRz$7%NT7gVJ!23w8`t(c=P_YySoRdvmw#p(*4MA`hKDpLxb^K3|o&)yfVpos$ zJ#x)!n(qk$Mo5|gb@Q)}4vxo$-u8oxni~bn+2XU*a=$V0k;{YcKzoHs_I{tYJTYDZ zVWz~n1((^ERxaD;IL+IS^iw5E9sd9yzGe?zE6?99b~+g+-4}mF&PH6_?h!Z_;Z@t3 zt_E0~QzMCBy%P9!h!Y|io+8MkG#oXeV38(;s%U~F%ejpRu;PI3)-)fw25;zrMc9&W zV6H6$lI4Y+kMlq|H5X@P5EdW;dZvZ}5(ASmK==+#$pm6ZivdT!s;W^HCF(Ux3S^#i zxC%ssVdfJ1Aww11+0C=6zV;qkEzvAnc@SzZt4O=J*%Q>7%k1J zLI}IRxyK%AsF4I~`vo)%dzkC+R4_>_TFj+NQj2Nm5=DmYL)7RjfjnF@HlYC~Z3xia zl@SHQ3XV%5faDtyW6e;HaFg1tekq}V<(=F3WGRoNwFp3|cX6vF2rv(F)&6J$DG(W| zDf|@0$7AsvUw85yqzEL5f=5Ne-~RwEef&L7{e_U7?kEiaUVqnf;p04sc)$w_@m{_w zuPh|nom^Mqx@$oFHM5}zn9?BnSU;jgfvz9hW5G>LIJ{)e+(B1MQtokT3Ri+5UjG38 zD4>$v$LbU#)gb|;3G_gkMqbwbNF)TP)eY*Z_&rD^xl}2Mh=h|DfNFUu{#iheaXJ=db)%G`Sc1$rAc!UE9oA}B z)4XSs#h>wwt|EJ72$-Kv3-jLYEbgz@^6~Q^@7!xGSJLPHS+4d87#K^SE5+1plgR{j(!X4&w$`b5+cf#5EyU>8vsdrkAesrHw%PQ_Lc&V@KzBgU|PbJ zQ3-_stBdN22#76l`=vr4o-e3C0ahX8+*WY}Vcb|#fJ@Tr=>Guq--64G9sW?j(hj^I zvFzI6-P-E@VY$d57y{Vdql)3{n^?z_o=DINuT~hQMlyFrQ#ksqb5WVv%8@@caE=mriT3ygvb|>6?Nt3Wp5rwF2fdF zlkcBvXubUVES?z0FMYMagvad{YP$6C-KkwouINi`5i7GVKeLM|6mR=Po+6|z`mI+Q zCTAq92`s%{Fqx_3?rxV^=9NR1EG<{nbVDK{qu^Bvt-xxaIiG-3B1!0`21#b&WC+&( z03@N@KhK&$O;n01dLp8QIr7p4S20VAxNGm%>&y)YPxJl)@9^>0-hR?lye)J2hr z4e~2C>cX^}M8T*LAy0zl+^D@x9TiqdcE_66C1uGX>#jM~5-v;WqSQnSKQ*BJ%;7-d z9P&YAVQ-mPs|3huT_V*ps4Gaxo&W-}+mE}8y8*>qYA{QIu~@aWa(`7}6v?<(RduCO zlb#Hyk8yrn6*2U#KqqLpmA(6*nmXj- zJCp+nxzJEkUMK)4!uI5aBi*U4hpGUA2@myZP)eWQG}#h~hO$ zUmCnSnvART#R`&pr?gFCAzcsmB@+!o)Z3y7ETSQ0$a04@cM_stVrqV- zaBQdvCM30W2?#rfYm-5Ks)aKr?r~93qo>Nl1)0W;+M-ZP2WRFkngJ*scoINJU=9J| zHPomGkj~!j3Y6R28Om1vMMv8}iuG$TtQ6n&tEJb_hcG4_)5 zl@tMs061!>WDwoOzjO*FEOdUQ%XFa3Lq?tVptx6%ne1?T;X;m_Id>Hc?= zOU!oM#g{MFo*CvmpOTZx08^f>yFV`$JCRVrEph^hH2i-y1gdDJL_ z+|ES>eN}-onu>gsfizqIYr{mt3>PlXK}A$FTxj(nL@ALVDO)*083cy~hNFtHVKqji z=r2Vv0Wvc*u%apekxzg;RKp(A#by!l81c$2k^qqW*Tnbp{{Z@Fz8r`i?bT`itJ!99 z%fEoWIFoxX2VX75KQId(QC+`Z<-UkhY9+l5#7~%&b-&1#QfK6Ww(T)^p$umdi+u2e$+vISEE)`NE##} zxj8k{g40UoIy$!oT$tt_U9=Y}%Nms!$))Z}tr(?HeQFfdauCIloJ>Du5oKLC=2`-RHM1WGnYgWA|M@2!UW;yRHY42_SC8a zO?^}fk947e;fZ0z2A>>3-NZ{(k7e*{)8@wyvUs%@f?qAUA7JDq-It@AjJIrd*yAb| zJQeG@&354kMm+RhTYR@89^iwJfnj#C-!!VC05sOhTGlc71~KM1E}SEWo4v>Y8r^!i zWk5LvF14|vB*-cTblko6@^`94!zi*LCIg z^wf?0fB^PfqgsK#$ykU?7OmCf5O?C%;GPj|#Q-Sk>SGRU|9za_Yo;!T~_ zoa!>E=fzYI9_!ylDUJAmhA?h;EDAFdBHDh-P+-bIlThv75#1SH`mD?4pJaMm zMc^Lmv&B;_Pnsenn(Atw#l_T0eAxgIaN;T-T^4VJk)#0;)pK=`M5R^>auo5z-1-$Q z7BK+2&aNYlB2#WQS4h$*EX$tjaa4^R)~Au1E>3q{IgHxRK0I|@BNb77JywR!un5Fy+4K}PD4ZFN#b*Bf&XANE%oj%HU96=jD=sJ*^v zD#cT;@%pOPv&upL07an=@y^ZarZtbIZ6_YqkziNE_HyaXS(6AZ8RE-4cjT`l`3H|U za~!cA({^8L(d^ja{v0|z9+!3LQ4$-f6(`hma;OUnGo3;NTpnPTDoR3uV@k5Rv^(~L zt@@~i5_^l&nk@|yNdVJ_>X3&CKnhqLP_PpTM2PF6Y9sCfj6a%1Nq~=QSNLU5$yM3y zr(GQci6eu(8t90LURr24C0i0|OSH2ef(W%+xyHR!QwQ1!-(fa9gS0cRZuTS{b+!^ zMK!7G#T10%O+6Z@n3IxO+P54KB0-%EK3=FNj%G3s^qL-PHV&TJbK7NxM`*n{uQ#$z zqCGAQgK>kuT^W47rdLSm_?^#uCAY|2fZ=lXM6tsBlVSHEDFIj-747{`Yc@P=nd?Fe zReewiU$&2?ikR87+!#nl&@A3{n;mG#WQcEy<&J7|&M*XCM(cd6axw`CNRfM<3!|dB zc7xSeun4q8YHY{}0^|d)!pA^@Nys9+{6z|(*VhuQ>L>?#n{UMJGZ0J!~2a8gnS0mh#+5qMF{^-TdWa@J%G zJaZex?q=4yzRPfx;f^LzF=ZKCvXd^$#GkN^Wqy_ZEWz;fhypot6^0{Z^| z1r$*GS*(;egAr1}P~KA}tlFTHkw*+i@aiH0B2lw`iu^CZfm2Hb0O5$I8lnP01T!+Z zic+awMgNgnLg;0U-s0vyM8TVAT6-%8IQbTt=4BL?Bte+M20XOXxyk z6l6%fIP^^jG5U?ZX=>BQ7o0dgtDkozA64D>oI7s~hj)$u_TU0uqU+#!`!l=Y;c>)` z$Yu2U{{WSDw&JiFIC8ulUoAx*aCU)T?KE9~Tje@%8qup_ zfkpbgx~iZN+yrQKQ4Emgul&*>00luc*P69yk)f#3G}0_bH=>wfH!3~QNVzq#mZRE# z*E<b<;o}p7Nq`GM4>s541*<*sOA8~9v4VT$Y^Up!D=*92es^qsFAJCi%Mab)1go> z;5(!Uxq49rWvT(_tW{1#hXubXwdf>PY(>K)fQbj7S)$l(WN1wS=hrQ2bBtw=pAJhC z`r2!^lRjLD%N(6zOIjK-JXh#)9 zvE?wzB@t0(S?UhX-*dU#NB|7pofn&~XDhAI*yJ()0G?wQ1L@UpzR%&TS+#~7c}zhh z{{XnF_qfhFv&|2*8-nM4TE{yi>wi_!2*i@yzAH8=o#aGd_X~Vc!ri}li(FIDdijh+ z1|+kF>&0rdFc3AN7gZ`UfU9~Ykyq%i$%kTfWI)0A1krxe7?waZ7AqZeN1)okMgX^> z@pkDKNRM7NS&=nJktUY47Vt9Wf}GJ7Lm2=Q&@5UBH9*l{!XskV9FbC|=P#H4FH8l%eb>qQZeY|0h zwXPSQRIbk3FqAJ&YtzNoo7u}n{Vca!Ll5Sq2ctSz8p^|Kp%&r~Q|PhPZamg%5bSq^2#59FAt+_4^^ScGy$Jx!I9Q&{sCXZ2f=pR=F3gN{P! zT{*5!;v^ICT)K7Uvm1}uW;UvPu5PuWiM#V!m8DhgZ(d3M74#1myZgI%%e&ktzHjV$ z@~<`4?)#7gTrZzyS4Iybv-{X&Bs-ilmF)C;ez(h?QQ|k7Np16(O2K`OJC-pjfof@Z zh0#ocKpJS)QY0Wtb+)JjC#Ht!p&eKb2a>99AKz32eZYrD!D8fny7^!SaqTT=E*@2Xbl+M zRiYrdBp%XDT|nX`XQRY~w878C~6Wlo2>7ZIZ&s>+YF+M-gSCwtp|TnP7bKoau7WCiUz!6@ z`rSk>-~e;#pjB(o{{RlEo6uFq4yc$U4GTVup%D)sX$AD;RmE9=`{E61Da~{Cd{ljh z%7gy^@~m;1Ok#=n1^NE~x0(L{sXkvg!hhxxqrDf>>*00X!hVCH;Jj8g$@vCLQ~Ot= z^=FjoJcOo3za{meNQ=h3rRih?$iDKcMiQ3Qgf!4N&_YzHIyB}uTR}*Bddgg8B?Md zi7ezQxQ}!H05vo6Gh~fV@at_wGbD<7t1D3gMY*kF;ehASMAI&Bs(~9f3j_!jdR=NN zjDn@T0@R_w=^JoWbue#I#)~$25(LmX&I|EnEJbOm=hrK%aN>qcpse-QLme4xv6%bh zdo^X`{>%7oa~F?4;{0~s?QHNsWd7-&bcyCy8~VP_XJ72=vOLd_@_F~!&P=kQGy#2I zN9*(JnH;<8Sc{H;uIvL;p$4*;i9D;Qv#J$IBo-XeOcv)#A|m`zPqYeLoi2e4`iQ}cXnGH&MAHE*ruJuc)gv^h}7j?{{YEg1G5}&q0nt`0O*6y|7Mz%Id4K}&C;)q~(N{b`0<8~#Y;=EaTy`8L%sfdU)wfz^KU2RP2 zTBoAv86k|2{{S?!YQ=;^cN105st9LHUe3xEeugAx_M71Q+ zkP#PL2EDAzX2oyU)Yd!a!>buQXnHS8$JEL{f`|o8&`4AEQYnCBKonA|L?R;|WpnA) zM6!Jx&ZJY%>(~6;*Gaw=qqC!ps7E>AqMU7HKMn=zatc9v%-OHqoR;!(hD{hQAdx4Fv9uP8x`h&OumUqiu9 zPF9df6AGeDq(`(eDkQ>1g?Ss4)gec5)F6~vElyNb1dO91#D3IJ0;SpbhyB$J%(@4r zstABz(_TmeMzo&%dMc$7$J{Mr$pp1E^s-P0)Q&gmflvyBr4nbo0A^5xWP5Ja_W*&C zb)r%^AkVv|ek@n)G{IpK}ZG9aqlwOs&R^u23=@Q-0Z5bF+M{ zVDsKQXT>J0;t5{A)%Im#{{Sx=Q8`40lwEyL79dbo$Oy>9KR@A<3~$>^6H1ftS?QY{ z3{kZ@u3Ey(yAhToi;9(Jcx#2Y+x@wh7AvnkYow}J)r~X-X+wVn10k3@hCvtZhz+f1 zihj`gaRo#oBGlnmRZ_76gpiQ|C7y$UKpyZK^s=f>U4>-TDgny?t)XQR2D=u0KSWSP8Ob(06;LF^9u@RaF(Ccgj_Q-q zP>82+4t{6{1 z0M=0L@muWNOFuxoKeKkY`!AQ4-xEJ0nnXXiuKa(>^YG(tNS0~2=*z6W8;VPc5nt75 zqwTSk8p?$t1b}*RMUb1fQOKe4oIaS48R&=@nKjzXfIn3U4OCGU1*~okiu|X_AkfI% z>Y}7%9lmIo1W9P!0Oi`QO*kuxK)i|JZUI2UwF?A7EK8RIMxvfUt&25PQXqlISJ4A= zOA^k?A}?|%IP*xRD)s2JQq*cSdpeeyvuh*%MleVB1M^(Hv;AoL@0s3VJ|ng@Cjj=1 zD8E0?o|xu&eDetRhShyOz84+L0pJCQUM{O~&+|m~7r2X6dVg2s>b$5lrB4<05CeA? za!snPhZX=4RH;#u8V`o3qBOV^yXsT$5UJ76!2k)U^nDZL7bJ}ax+aDTb9&Q?0fc#R zDkG`kb~D{)jEy1)a=80?#yhzCCy16Yw8xGG#9{*Z-Cr&-yov-=;%KVJ2l7u9hjS5@ zadHDI8NME8ZL-w;Dn&J+&vFHBn|a0h*^&Uj_;0{1g%rk)wL4hAhXDP?TjI z7B4;p*}R5%zz5NmIrT+zGh>iF-xc0p2C8B?XtzKBavcpguoP~orAEc<3WzF6zd(Sc zk_7(%Bn-86=BnX?N|GH!D$oy)R9B|(8;o0AVpENJFCV|xdaEuEE#@-rf8)g&7eAus z>h#Wh)xB$-4->!3?wm-8)UNm2%t;nY7Azjqkjh*Fob_sA%p0*1(gyT&vsYX3jF%bHsOI6Pym<8;* zNsL>lnttly6zboykr^{Z-icf0xtq9Bwpp>;moFf=;<@>Dilr7hGLTa!`&hVjrPXa; zlB(N|VsU3_#>;&~dS3zLd!jMOxfBGio%=qu=DWgWnXbeY^RF(*=EwIUVq)i2zB~HX zdXFFG{B*HQ;FC;>q3!-3Hh zP5WP66H-zp^kR5b79Y9D1HXrS~^FX^pH>HzJAmM>_Hbn=xbkJys2{H|-*60Hw0q3CN zh8znDRLh0k3UO=LaORq6cTs>~H5WjLV;R`JN-2;@Ab~-0h*A|H+#7IBG{bjNhfnH( z$dfK-PH031jeQ@I2?qnMois$rfe`?A2P~xw9Zh(v1fmOROzIcc^mq1*a~$>` zy?>JIsCG*3A46bKb#5$@jK~ga@>4aOc6K=g&uzw~a__^RPUg-S%v()L;aPFK?#?jF z-2v@7uKvE8=D0Hwi$or7yX&r#AE%r1Ko=MEbV4QSEn<;jxTyZ(Ytay#hHYra^h&7) zpe4c5p7YeCFABLqwp^FgJFJI)UfZ)Wnd7)oW{1!iF@m8PxZ~xJ`;#mkcahRW1G&;7#Odg*g&oGuI5Gl4;rodA zDQTcRsNWi^iZ4JYHPHj@awYxDss0V#0#9lwP?~_6wYj3{if9dL>8L=sYmrWhtvMF} z5X=xL@D}|LGa67{y~k994IKkLIH;ONmU7nh=9Z}$0v}F%P%$Pqq54q3d#c6B;D{Up z% zl-1A(iFRYD{)wd`&rNtBPAK-VC?q?yt0X)T?qVM0>8iCukZEmE5{PMY&@A+o?td2X zlK%h@OSHKTO7MHS^7D6my>H`w$z*{w27%WL5$K9Gj7t_%QZxB1yLe$EEWmpLs&w*s zCAW@gOA!U`R^(x`X&?wDrDmmfc9{W+k$G;3aE`LPSN(~!iQ8k$-r!kpi{&}-Up*(9 z^}3}QH8oUS30sQJBGDl0C>_aq1wwj~{T2KG+5ROkCt=kDWmEd3Qhk0%h?7v&A2n2o zaEOT{hDfaWLmq2UxP=AQumY7z2L#@nk|{`+{z(W3p>o55mI}#(5pGOYm09+kT~rSB z=oRv&CsAHb=xT8^1LEr)K{o^z>ZS=eV16lq5gyhdMP{Bl(CbIwx_yd)#$2}^I;Yr+ zu=xGXS;w+H#zX)VzR3lW@Z0!M<17vNEPrn!9!yy=mY8Fz>CaF^xV?2+_zB$bPzCN# z0iKrBC;kmPOa~@Feo9)Fy(ZIb0T3hs8m}*R%0|pMwy}wnnmwlL&E2i@iuarR1);Zr znPzvQaqGV|t6b0iuXmPaWJV9fuKxhrC&GPnrQ_p``?7*Z1wXfbA@#&YQ;f7_+{*lw zZav?14HC>5w|Kkj66>cOVUBlXqDx%TtF5Ytf!2XrQh|y@fe`#dCF)@sw!Ra2n1Uc; z4yKEre)$(Q+uHa{SOD*=g7Wq6`xBPIiV+M2HD$|PBt}9ZxP;VKIWYFJ)QM^xp!zE- zB7jj)s&0J~brKFgnqxYSLr>5x#AP##PMyoV_+p$PDUeM-S+y$A1Vam{hydr%Z;wFWJriv#*|7XQ+ZpG-iASDvd_w=5PcI! zQm9k%s^ zsh;9!w-~7Z01mZ?1(68Z1vzRsvQ>_D>NovXaod+8JX%b-SnV0)90emv5#2%!KfCtmpp=Udr!VzXf!>s7VZ}5AUPOoGRzP=Z3FLtoy+wt_ssNG+ zV(wi48Qc~lK&Ww;YKo2tO9-?{aeC1}gr;Mp&+_}zi=c6kyI;3 z{{VF&2Nc5$mH=|Dr8Go`F7`as47}=2o%E^%3GO3}xv8LfP_&-L%7zIMbFRHmOBCgfQJ41XRV>la z@9oJPuq-K6=IU>Xk?8i@pSy-7w5s{t@s+t!#$qH!hQVXb48CV$9Q$HG_W7Sd3dQu)da0;JXSflrx+amYXSpzti_n)@>T5kmquOq}q8fl*dAjA! zrQ~8W;C(`I;Ey|(2MdMimD5==4%rQP6|HI_Bv>)2qoIUaQPP?!u@{IVfVsIrIZ5gX z{Q?Fe}XPl z8J^-U2OFYbF=ry$9TI`#QgpWjQCD|o(CV+?{3OP*Ah_YtF$84djO}uphruv*e{j>1 zC^o0-`XK{J`&q6~)FMd+t@R4^nZ zcI9;`UsL>kBM0E`Zt)}WUpv|V0B#+8yd#-UB%03a**r$$kuqLfNugb5!=x_f6lWDG zg;#zyQB1j^{_CrO0T9jTkW0K5Y7=c03=+;hqe4;$xeg6MpcbN7VTlH-KQ1~bB?dS6 zq(oXIS%^IqP+V9&c-2Y=Gyrw8;*`QFPEhwx!6^kU+bnH7+Wlfys#d^;E}C@x87+&zsufkR7wg9eF=*zpoV@ z!}A{e;--aKD>=%rQ^4flLC72 zQ>f?EdM%{;fHqvMbFtXjW&wiAI@qM>>CJgx`x9}1c(~$!`DGwtx5V<-KQEiu@m{$d z2zp}pcwJS{uo@LqRoMbzP}R{YqDXfVQ31(sRJ8%8R$zjen1JKemZGWe zEJlaXZBdVPXzq%-Jj@@586+z9H!RgS-7 z`Hqv7d!GZkg$8*@4yn(&U%~aLZG0@|NtBCld#T^PPl9u;pZz8{kEOV-Q}!!Ug;{)H za3e-r=iHZ-8FnHf<<{r1pQ{dBFofPgz_{YQ6TOL6;mhNoM}7|Ot36J?m6ketZSRVU zHaNhqKYVuFv8rB6YGMQ=8pB1I>#O#P{{YCxD@-xCRzx!>2)n6}v> zqy;p#s?fk~R8w{h@luryNLoxVJ4%&Ga-$E5yt8Vq99Gy0>I(k=91%*CL_;8PXXdV} z4tU(?v0XW?PVN;nWs2?1VU-P?V;xW|PYx`iEA98bpEZ8o7g8SJ3`+uRy((~-jE{9e zqbX*VJ02f@_A-c*?KWO-cdt@CPC55P7}OnC$o6rLywsy3cBPLs&8oq_@vzP$3~ngB zo{w#gU2^gp{iOEUOe86xgO0AOQh|Z0|)XRAUh2KTv>?Bp16?gQ9>44lI9E2nP*iRLJ(1Ex@89TUtYtx++1n zmn#1NG!M9oS4KnvR~8PS0|VS7LwpqoLB+ag6c4$Wkx)2lsEGsni#iDyg67Rafd-6e zeQTnCE<*u+XbAuV4KKpTKy>l524qW-{R_HcaF|*=avkbS@;F#_Vcq= zI(Z0SMa5{m)BLo$BxJ$|52;DkRL7C?dnsVfWGM+%*Vgp+_K6q(0f@KBcBK_y2?9K| zK;AT~9eE`kEuP@TgVA#8FZwAV<0-i#i$!AUm2^pV>ePiiZdIs-O|m=1>8T9LKK zqohbj=`Plx;Ia&Ne}X|FAsV%ALa;^s&P$8B0MenG;_5;daJZJNPb4tM0%+AeQv`dS zj@mKct}Y+6bU(5H2LxQ3bVLnT0QREkF=u9rrjEbj836o;Vof`82PJs_0C)Z=Uqbx) zL;MjPCPSW!<$Af_X0yk`!r%aI99Y?Vy0*ox_R<~FiDlvLw;X@UOG-naUhmS3-|-{Qp?b-dpxEDaZ<6<&~1E{JWv9p z=mOzw}ofRN!TdPH&n$_OQTFOJ|aayTE{!ckltng0D0gO>Y9+vo@M)s9aOx;wJ|A({X~<+Ok(trGvcN*Q8Il= zBFjlg8IsX=TEklK?Swt^HM=FOTAZ?yDNc(xm{Ex&XhEX8g4jd??^T`rs{C;S`Ku!} zR`YT8@sPJ7$08BQpD%UBjGbJV)2p<>+vvDoD30rWpBJ_gVP(^vG-1h~HcI4~E3eiF z#6)RcD_T1K7daE{c1c`)k?G?n0O`d?nK*(-92R<68lScxE>`Vzkb|*NOS6giBAbuq zqND?{O9*C68E3+?=9}4Xn3a-ekLtTf#;K8^eRNw&h;!84Q6fMbc&HOokwr5>!IA|V z-4I>TRZ7qDTaI>#8kFkjhmrwmY4ZRZU1b^w2Ly%A-PQYm^!=WVaBaJr9TSY(CV@4ZRo7{hvnpi#o?{ z5_cebOD~;crnKS^o+2+UJk~9<;I227@qgrEBoBD9`aX|#IdvXGHYwuBVKHLF8ZW2K zl!}FH9PzTMkRRJ4?lcF2Aqd&%#g8Gy6n2O9mmKv#qbKccEy)A4yM^=~s2s^O2BzR~ zM1%!;BAqNO%GeieD^(2-z%j8@NKi2}(}+zSDV|;blj~thEw$iacM5xC1 zPs;vM1c;kfr%hFWYm1#YD1=@$A&11EW!yP%N9dA(i1xeD?gFc!*`ucf3`kzQ(xna^ z#q>o>vh{D>RMbnBb5QI$CMkj&i|Ul78OvLWnuG}fm^U3tu|t}$<^`0fJIjJD)d(O7 z?s(8O!YFc!plrXD~Ml(RFM90|P*4!4yaf8)!wJ zMG(j>TU)hU4$sAs0QWlqqx?`PxQz`>Iiiq|U|q*Xx+WQG0qS(B05~U(oC;N?S8J0) z!A(P^gpPbTtAGLT>BRxZ_N7zimU$zW7{NJ{D6@n5uLtUL z=SK@-44Twlzh{VR(rrKE5pceDUoFR;{FY)<5Hu-t#n+NN4^a3#kzr_&H z9L3Mmq68cY{17{enm5mq1ZBrUp@|ohk5x~Ci&5Fd^gu`oXa$ySN6~)-*?qmY-e&Hq z@cZr8m)Ul^o_oz>@tZkJ*C8IzR~~t`v&`4a_ufl$z1+(-Nj%A*Ufy_;Ju*5QUB>zw zZ~!ra<=mB>bi7}K-gysvN4HW}KDxs6>PPT>%$$-2fnxg^y*pk%@IM`k3+@TYl#fBt zKJ?n)dCwWN@mrZnah^(l#SmBys`J&p8Jk{rYvlJsZ~@3+7pm{|@aboU&mrV74*rR0!9i)Kj&tl@p2Npqtm4Aa`{D=c)wvzcp~c=Bk*4iMnd) zB>Z@)K>XAcc1%s)hlvUO57b)LQm+dRUy0B8l4uu0^liKF0-K+ zxa|tcEBkMM{{W?5vf78bCiDyysI%Kbf-D)CiBPC91hHqZ=&Gd&ibSy@{M5cyt&h6Z zu) zcClO0>3nv~(6*^RPMaqJ*-GF7P7qhtxIFc`9D9KbtBqZGG9m4`qED4=hB!H;(8n7-X>Kz1!N_{9p9<=2HnD^S z1G4k=Ok14C9x^zmGe;LbLphUiqV&ihDy|7ehnfxEI&GL9DIEKr9=B{?7)tW=*SC$y zT)S(SyR?!T%Np6S2I?sakV=)K5d`&APqYDcS&>!BLg(VFh{c;BCW4EU(EfeeS-zIW_;bK!aE*?|y{KiY1*7CNkG&IAhZPH)!g zSo8j8#K$l*h-r(_eIG~cIN6ouvg65zA%vpDU(tOIdX=qKJDQaXSYeV{^cMut2#dr) zu3n|lQ|t~8z-Wn}#xF{6JyMz+_EZ-da&!oqQpSSr5FX-1Y0jRihA7qOO*K#^C65=X zw4ggNVNe`u$_F4Ej@NpiJhuv;x(m^Gay(3*0t3ziDCe-t$&&+*pOMzuS7yUrcY^Ws6{ugw7YsJf~@ays*#BA zcc%nRM6uA4qNPFYJRQ*u$7en$7ip`t1wx^LVIfwiC={HUR+SHB0Z5D7GZjOS4nQnL z{SZb)&tKxI5W~5Dj;g7aU_}VCYKTVF7pdf+?D(zrS$ORJJ>EG8m%!0^J>I$Yl`LDZ zo=vvv?B$_$W6g8+^DNj$YHVOz(RhA7TUaDAV`+3M^Kzrgd3}h%x+nht)g|?P9?gu$ zK0@_&u;k0SqVMf)(k^AiRW~$y0dyKR`Gp08S!Tv;bhi6|DC>t@v5uZOM>GgJSS)-p z#ks-SNI%1^^Vf!>o0|(cW?f}!F_9=9Crd5L(hl)=uBfLff!h6eDnbrNxH&2m-me<7 zf)NU~G-1lAU?3>&SZJ(Nftj$i!U7WaJ5zx`9?5&0jzIzdligtI!6Opl!1YlG$O$m0 z)sM*)Aixj{voJi>N`#5!N{XnYB~irRiUklsB#K+rK`Vx!YxPtEP(e)*i<_1=;(^pe zolo*WF)T~j(9>x+V*C&tuPOr9CsshH4|UqWqyQ5STj*@a2PUC`V8skNGn(nhpd6df z8y*U(QW4PAr~}oMNQ1c2f7=(Z)DLIdJ_HLiUL9HY1Qs2uNMtJUObS z9msaoh5kw*G_?%;_#{+>Ni=#I4lam^=1M{Wc>O0t2tR3N2%wr)pz%Q13ISSt5C-9c z7qVg<%L7eb>Zt(7ffgzvKJRfqJrPah9>K@Ul3{|RIiavXF`+zcfRovajwXzHB@rgJ zWUBOEgj38!k=-8MSI++c^grR3NAo<`=evN%5Da2_nR&lLc&0gCG#|JJ_Lb@Pd=E#r zb4>uDUq7!6yvO7+2O#E3`k$#hG5K+s!EJOGUd1S|<{Ipp2YVfCIjDewbhc%W`fbN`P_bpDTz6$#P0OI%~gT_FbQOfzg%eCXT%f)_c z&XP>X4=0yi^fmQ?CVV3di(OL9Obf73C$H^jhU&m_(A~zwu?N zwR|c{$|Ww~Ea4#$A?>cJ!Cp*8L6)UmMjqN*N}!&Ps8JD|L349ue2^y^P8f1XyHiJ5`zqM&>r(u= zsrD9#!ZeRnofbsPLF%(m<&wPgNdm0C35b(eGwK4eBK&a=?y%7-HKHVuz${`14efU; zQ=bCJMy^85qS%qwP_u&QM_FB1nwzjDM#{m+-|r_W7(~?AEzWVN8oXxCKnciIarSgq zSTqCZ*IaaRJci^sh&Q6|>*Ml{crF|YuF8-gF(@n)^-&jX<=d7rNY7snTd<#YFdsm* zUS6YqIS?6hva>5z4&ofHT}NJOL<3!H$~1wq1u;{A06SGnRutvISt2uKo6|+pn2eLV zny!*FYMIKsxh=?uoAFiv1H~~tu=ZIGpFm7Q=Tq$F(E>`OkTSdypZfh`!ds$~2PKk+(PTquB zdLvQ>(?MIRs53Ag=isF@+|iH1=rmy5n3sgT;NObn-zkq*;=H6c82e}S3x)H2{;aKY zT^Pz(qzEoGUQVN=ODtoO29-{F#IeBgz9?=3i2JnkUqjRG$2&3Ra^RjkpKl=THXOqG zGp&ZJ4ozy*S5)H6?_WegXwt&(OQM`idx36JD3s+WvyX7lr3#>R)Y*^+wviQUAUomR z!KqbL1*JgZ=b8dWwG|rF(I`i?{h*Pl2oWF< z3zI}pDo1ei322ZaRIM)8Wl)`ksBO&@tEbXb0R$eb=j5U^Z8tyT?je+YF=vT&pKm{I zaCZE>XP!~=7~+2v3^uVYQdSPZKBQR zS+UjIXXi!BsLO1-GR5^=_Qqold@S@^ohzNV#P9kp(zh7Q3?2Ozwl$!L(zGar7Y=Sk z!m42WF6b19t6xq*N*}tygxo3=UqDFKs2G(&7t_%Kch;kV2^j&v=r|%k9Pp(ZM9{>; zvGq3jsENIK*{bP+m|FTqGAOPxaq-MQ0xJ? zHz|fD@dKgu=!l3QNNPph0+1l_;+neO;IW*(TWb<3a>w;ty_drs-w&Yw0NAq;!MDfB zc|8-$k3TN~yD}SU3zh4iF48&uqqU`Za{U)pjKlyRO>{#{xEJZnphiHFY;{cx0`xtj zoyVeSrQXq?E`|wAkk9K)6wrG?uUG#7MO7Cs?W0(iWH91Dp{EXLQ)vQBhg3q3XcZMY zC?9cqzavF$5pqcf=>_X_QU)daV`TUY%($b&QN<~MF(+8H&WV5_n7c7jBq)`RwCl?QR^cmb>{$Q7oVT+j z*jtM9{=A=6UE-tNFhF(+d+NyV?ayvGK7n{T^3%!r^Zx)mSlNAV)t(rRNH%cg=vS>r z_g2G#1PB08haPAVMGj9sWf0uEJrE)}`;Ees(*TEaL>BF4Be{f#pdrG~UkQF6UGUr8 zzF!tQG>d$f&F)=z?DFx^@saW#c*almM7_(j>+8#=JViB?hil~O;AKb=6JBCE*;XL=_JE)AChYfKN zRla&&YsVd~U`XsNE?IY-M@>|2`slY*l{8R>vIN=`Pz^|`XtD&^nGrBu`RJZfgLe4U zAraS}hyrb*yWvW%QHm2|L26@AuH-vw9zg-GaGN_a|B5ey6RNi>9VyhZ77qz*ERJ9~zRYH^X5AoWkm zTDBrF=8W2yi6ga}S}C7|TaOzHKLn{(ff&);@X=>ePO{NH6>J~}Rh!Z+i0&;B>J-7I z7=#0wltCgQ9?XN4zw!k8AZy8Wk*;E1GhlK{?#y#8x%bgs*kcd?M$6AeZT942i38WF z-yD^}$ul|k8J&h&w=M8-%IQzg0cOb4Q(Rc25sYoY^0{DmMt zs(wa1(Wwend(@M0!xOk zBmk2FbkR*4He1Q#n3PKx{MSDC)^X|f9!498c9ZX4Gu`US-!-~2ln4f((623;+R+GP zhdm0LVp!z)KNX905*xQ5viEv@*ym(5TFTnFejG@h~|h);oIHAMO4A!DnGSA+0Ox~vlT+_abJi-5(T0( z)Kf$UaP4X~h?t3y4ehnRRdzHCgOhS~SwcO)TBf{EI*C-(wYR}h7_k6Uy|@B_v6O-M zfn@+MS_4<$s055+IqDDv!D=@SWdn%=+U#HWWKcjZBIki9f~UHUc_2N8j_iOj^fw4< zL4&grIM?8bNtlNX6Y*6=-Q4j0ssuqHsz)TC__cuw;=6x_VL3k{+C`iRzrk?#{{YLM zv*GJM?0lr|aX=djFF&F=@$&Hd^4OsnYJC^4oOR`hN+KY3>qB-crnDS@?MA3qRDDf; zL};P#cZ)b@x@u_%#IOuO)hg322n4rnABv#@E^5a76sb&hn6+41iK0Ek#JPS4)eID? zn`(+KSg}7ezyJxo!xE7Mj|lWkTqE3AlY5O+KuDwkW6I8|;3bc@)Toev2iBBBQj`Ax zFm8f0a7MbKk>VItP~McIABurkolTUp!H=td*SJJK7|lI$N^Uv^Ukmpy`*g*4-#OZM zSwN}Rg7p5c{KmRZ!^NUaoj+lDcH^OyH_uO0bm<2=mC-ZkS8zR&B=^GOVPC`Xpt>*1cBl2Q-Na%8^SgWavd zx{f~nalyEbSZHdaT)h^u6Yb9`M z8;Tk-XkD>2;Fi^^AwC)@VpY&*6snku3}RxjzEMew7HV@>S5?m#Vnt4?aaG1d1|o{& zEJq=Q_#`5NMXKd#pap+Yh#Q~9D%Fw0B6%9Rnwqf0Ge5~^1WaO2$c1rL%N&Q(T~(Dp zl%jQUW>dvQ@!hav=(BnJit}U!!`-P`<_C*DOkgycl+|0zMu_=r(I5cg)mXl@N`7Y} zFn|P=pXyy@&A!W)hJdY3FjL$K95{4Z@_-u9TSOta1)AC`itE2*af zS^fl-nzVMjtMLlrYH`F`x}mEhjt;~Z&=m_;2vh-1N-&U&N9dcTrX&HUyMkCO5}cXX ze#JEHjE4D&2F1%YTF7JvY8R9^7M9_h-e5;*(+03v5Uw+g)| zx^c?Lem};~EW7gcVyAt63h!aV2t)uZyw>T5mT|?6%GPM}oBh+}F?V(7NHkfwE)M9k z1whdetqOvilaq${Ex|@oKw62cc}t(wcIGgo{{R74nu%+Q6+k$fAYco+DUfc8jX##fo3x^to-Jo39p6zr%$Ru|YeNu=uXg(BBNRdaR8TWPL07p{5^!1Ed{7Fb;aX`eS5(B$Y1J(2{$QN(~KDwX) z{{VKDAVAo&3cJ|?ATSycLBOJcaok$8Z_xrE zxFCVYLg*zD(R*_gL=l)0rJ2tcO#qcZZ-M}x>b+j3#)ug)XB|QZLvz>QfjAvB;OH1* zW-rZ9Vw|Cy?naV{*OJd%?}4-K_v0Cd)b?DjIpEJO*NfaoEF9KCi^KaItZX!qkQEeM z6!$x5?zYo`xePk3di|eTmOOs%Z!8&3Dcl-A1@*Y@SdytdqSY4lTh#%JIBtjs6%SiA z83dt|wsbU29SyGG_*3*;`sIrqJQCy;KMi>}Yg9JrGC`O(-=$5-RNUx*}xJSS1pOV)_d*q0F|l zYiOE8Nr<4KHEkUzJ;e3>P!36YRZR*-stX=^pb3~FKe_;urS&Kx4Y+buQhI*j5cHv- z^gs|r>-sW*JqJ4TWDNl4Kp4Nt7Bm-B5d;GID3qR^);hJB6)+4)cRVyyM3M=wA?ktL zxv=1X)V*B(sY-POgHUXULBJKOfDvAw{=CL=eo2g)hyrQRdH(=n_;dDrI-j5A@AAE* z(kvG*M}~NL4DZXX|M6BCZkBk%!*)` zxW2Fcsi*-C!Hek!OGFJLSb zwJkBl#GB-S3K9)#?NvcFs~6Eh7a-ESIv^@;YB-_?db0zlMKCX6t#nmKeuBRzQxgLb zL11V~%}3L}6x_>e_?L93GD<`qtMmT=x7XXdBRS>cchVWR872h`sJ@S<{dtjFd~7Vs zkGA=0I}?$H-a)8rSDT+bE5ms?32!nIUbOUIZ`CuH%w=HVuVvR%J9=2?pdwnlZmCSk z;z<`YstD4>$mF0$PCBcqEJ%Mv5P=}sSg96Z9@kk%d+~25Hk-cEAG*(AxO;flF8O+$ zx0C+>=81y!sTOtRy!ddj>^Au$JW-ivH)YDQkpSBKRH(t_VIT3!GoC23yGSKXwf*OiYh?W{Sg*G*Mb!~D2SR5-Bm7uH3pBb1X3;iRgwssD?xh; zs2fxHpp1hG)2g~FpfyjGS2EG5Ojw{?o&|4wD#8Hj6wxN5`nrN4#GF%-rY?kmqRoiW z20E-?l&Iv!rqnAhin~99C>J8O4VeuvY-VtOMMstEfs2 z$3Xe_0dgD zP8iq%-Bc}1V-+9(mZ!o&m^t{S1H1<921y}?42@ZVtx!%F^^tx>OHp(p0ksx&7RIyz z>ZYRMh_`k_+S)x-2<2kfV&jTQ{Hn-_k=-NcrXZeSiY`cWlSeZ?>ppq*!N}sePGo7f zVdDUoe8ZDcS1$dPEq3wZjAFy!xZM&mfQcl59!f=Vyq}N~CNVbAcjJU{%$$R+uDjJp z7PrAliHBkus=)hzWj;|bOS+h1$Xq=*sXh_t`~`bQ=&ks0?mc!W2*e#%m#T9X5ceuw zZ4$t#B2)~$r$c3^D3wp{w2b+sAb)k!pOKPBx~%J?2uZybkqH+xREYuY>Xl5;TdK;z z5aHjNqBAPUmZ>L-+;c8!p%Yd>r~_-oP=^;#GE08Sfs0g7XoyV5fKg01ajCevp%O?c z3i4XN6vd8y<}MVjytzAw-KtkA?-`sus;0D~+5^qG$twdNTp2y*25 zsS+dFClYj6UT^NTgyqxKX$sBDJ?8v-0X2?jIreoO{BdZzh$2c*z;aP!{pmbx&WBm zvig3nbgb)~eyUXK{a0ne@2y1*#(`BzjNb;;F$zEqPhQPdY^){My?pX zoWgr$LjKkrI8_6T zOpKhp7@jB>aWNxJIU#}EIjd3J1O%yipXi`batI=Xda4*E zkOL4%BTgYuqjwgwAe5cYq)QRzw`M3CcC!9ggWX{AP`5UV5H)D}eqmNW#4lmvuM zygx(;FlMV<8=z)!r*U$AK~o5J2)HdS3I=LA`k)@RWCg$nf}jQ5{JEfS5E`H$V2Ze< z!E_1DD(rxxHm>8M07pltO0?vCv}Yla5gn`=!91Q`)Bdi)W#)3v{kY9~uP5x^4t~M; zo=)#MkP~A>^iK@(^8Q9&@AiLjQeH0Cd zeP|g|OcxjEc%=b};CZPM5v3lME{g+ug+Y5F69DG*MFr_g*q|Ala-b*?)#}x3CAW8$PSU z?Yh@7)7gOY;G0OtAU8{Ohs~tW{1Rjp4oFr_eO1KbBG*8L`9M`B#2#QzWf;G@9 zDwCh)gaxSl5GJWAW(c2%R4I19M9~7zN~;v563wcs6c`xU`MS2MQLyD#S)xF<@l|L< zQQ|!jQH+QzYfTc3IHp;()nS^v2LiWKQ4nl+J?Ov*h}dNr1Gx3NXd{FR z#m=1*MB|D8QYV^-pJXl~ekmwnt|7{*Xpkg-Xs_s>P zTuMDRit^FQBMhabqWS*+07hL|ao3n22}Rgdcz?rmcgHLkj;ZD&Hsfy-5+pmLsa-hs zSy{2?yq|?>nPC^veIH-!e=Phs)5c*g+0s$ah3c17i2`mLqNf>eH7 zYJn3`z}-*@ux$p2V6B^hZfFLf4_+M94uUnP>Z*cVGq7*r(Gf8{$4w}qsSDnR;;16f zcMgRrN~D@_P%=UGkYA;h3XR;)16;#0`iP1zlR9x}5G!Y%HUCC#3l+eyc z4rLU}3!aTsLy?zli<3iZAc&Bpn!1$(mm2G8ssme!=ujps1gaj0ra|o_2IJ8XQri3| zfdb@)Z<;9W?QYk-0s}{PBFu;Zk=NAlMKS>gaj^ zzdu@Q(MM~K%Ivak`-Ef+iHnB@?91odeRmQ~tiB&`B6}pa?wd4@xR`z*Ryr>trMZqg z*yR^-FuHoX%jG(c6}ZRtGtU_mi6My5eSUh_YM*U6+$x|3ccAA~Ku@@T>DI`wqJ2Q9 zL8EV!!sMQ6Se4Y<=NxOI4Le!y)mjLH{o~b0A8?TFBD!%`L?lg(Sw%^O%{UL{hyXHT z<-((GnWz!BB;4T#JxQ0|zs*_RJ&u3pIL%gN7SKKyOl zE46~-_0~SR^?obQZ6|^=l)c0Yu049}bG)FqZaSYm(=j+2Y=(gv(7?&EW5gpb+j})eK4wS5ZE6ZZu2>^Z3EJ7orJdlJ8 zkL6Lx32gSV_Mfg?R`}-I<#~?{D%JV?SFarqV#uJa3wKchDhGN+T$V4{7v5Asj?i?V{CP z1~lgC2xNnR{;I4(EbOHWHl~QWlZ#)c1PV}Slj_`%l%po7O08J3651?S!sdFOsEErQ z0SdLM%zk%JW6y^nE(7r^uQjPu#}mn{8tk{e7ko5e#TAyDf%f;$OJXhM5Bzz(jOTddA> zdHw$Yl%7&!6HQmApI$C7z!K(P70_vnbsq!L*&(i$-^1gBcl)`neS0a7OW}Jl!?q!VtbDQ5c1>G?j3GHwBYKr0R&#fM zMbXTQ`YIRj$Pq4U@LG@rhGMc8?y3UyOj3{oL<+;6hy!<2Bc~k{psQU5Y|t!~(pM{U zA9?*3I`7SM`%m1p9?K4z$5{KdwO3fwNcVb?!srv7YHY<&h^q=HB^g9e(zoV_i-JS^ z=z&@EQ9&nG=9DhF*l5b=yAFBdX#;93^(9B3@t$r>A&|UuE5q&mZ{ewN+Q*X|z?=`F z@mXifacpKJ@sQ>M)dYbcISxhH1USeRYM^FBwJ4|~BF-vD9%>ZyaP0M>up>x@y>&Hx^OpV@ZiwJVz_ z5hCv8?7B3A7?D>6Sf^5M=R^)Bi~$BF&t*a+Uti{+BF0bfLV`dI8izmzCEbDtM^qYY2XMefK_4W+FzoG43D+W zjAUuzw|*NBX&Fj1xIOA3n2Pe{auX5#_uxdOMC+Ge#P^SKF^ny^0V*qnWwLD z{a0^a{H*wKcTxvD$*{8Yb38i54hehNn5`+9JZnb%)TkW%EuyN6-?rR2s2L&LP=7Q) z!~w za*FVN?|IIDEZ4RC@-iEIaE-D_re*?msDa<^SiCa zf6FsR9?CEkC((BO8ND-JDZ#g+ud)EnN5umK2)4XRAqOVE0+ncZyNdF%1V|RvpA-Rb z;LxBzvl5COjV?7D6vV`ZtxgD1zwD^LVV~^oB3^{CSnHn*^*lXZ`yMIy@@O6}5WJIR zaF02Qd7l{(jEe(LMdY5MNVzXtuSD?ai0eY#Rf<(+L<9lRK#yzw>sqA~#=MgXwi34l z#9j;Q@KaEFD2S280wST6ibf|&godK3qajPvl8_IfQ~*(u2*_OmEJvccstpS>s?t;) z5EmTQbNLJx2To;E;S(13XrOq{Y_HqHfI}LgF(A&fSxv_j2WTvyjG$VU)mc?h#TRi! zudoIZY-ra>(5EKYipGT}O1p35x0_#Rtbb)X;&e=DK6)8xFvRM)&rWiVnfaL@8vDGy{Qk2vE|HGk_@EP37UhslJQz!^fs3ooJT_s)}C+KK{SPd)JK!Ki&{{XTEm#RZi1hea?RZM+RFVuuWXp6sYqg4a$sTV&42$6mstb%05 zwY{75R7BX){E!buiKj4vF`;`k>t94v!6HuHsDx-q1+P?A%n|#z!4#08Tza`uw`@03 z#XiD)uFSZ5J$gG>C+@uneoMpDG`xn~ZZ=sW&nw5#b@cU>E5@Gak`MM#eOS>{5J0Qf z_EZ8!=A4lc0Fz#%{M1t*kxPd+Hl zB>a?=ayM8-!;TzRetOpBVURCS&Th8R#QV4rs6vMBrOVX<4gn;BM-&c(jSvpwilKvG zPqcpO1PG(t)C~|yGWN3|hiNqwp>z%2CsDvAf*^(jmN(*nqZZRt03)!sMm$gkP0hb_ z&>Eifm zIQxkiW}Dg9qB=!pjzH_oBq2Op2EPp*RRO_b{ZL3)o3+Y_ixM3C3SfP=f2bStOw7}U;4Yad7P3WpJ<2R zzHje%#(H`W%s2SuoZxZnfg`D3H`mSUt!tkV;=F!7?Z}f+?!J$=uk}Zw+6T=+@m>zw zk3ac_bN8W$pQfz7hv@U;S$WxA*`jQ|mIbR*_y`jOf%dR6tMgPUKLDfyv+yZETrlHg z2#`zLL{mQms8x0qDg#Eh@>CAMHi{2Ju#~fGqGo-e#Z73u{miaCPcA-aftEvo`0!mP znB4ej$2pjRpbS=QOl;aQkX-t>mF~X_+eapO=4xXN9;JDDbFXS>6do(`&EMS4FoQv& z*9jhWT^ClEH*tv%s^2#jIp*wNqT8Vwlc7-qKc&`!ZWbX>~#>2$8{ER2rzDhti_TgvOx)XB`p*LshAw)m2l2pWP){P>B=?73xwz=s@715tInlnyo?z%z_K4OlXANoo1q7$aGV{n3X$AdZmD3Da9ZM z%|sG{x+|6tYr^R&>po4aTj}_%eV0^AZIUP0PbIl!T}0;HLWGt#OrI%;{pme^C2B=j zGQi%7(QIb`#njYk#hyT2(UrgDM2f&H;w#CPG7KOo!CY2J0uG%NjTd=pq?oJm$;Ijx zYbfQQd!VR1Np1?_qzxVZDu&^R72u{(b|1IeB{SPD31U>vZLpvYk|t9d&cXix9ys;6 zQo{)OE!LA^t0&cdq&%MV)9y>+lY{C%%-u{hrfQZ$3J{5yIV-`|cko|@=W&h#fC?<# z5tov~j1Wtm0>48UGx>azqysowp0gNoWyvWMBK((0&NU&&K3IJOj!BSoe1DgQFK&4E z4kUi-pIozJtNurV-eYnECb|Crv@;7C$BIB;%Na+4F^#x#%+gCW7G;SsdvWNq1h&N6 zxsKNR1(XrVIb(T3k{_bGl*XSQy!+AsmpU&*vm83(%c&yK zZB|iHsjsTIjQNX8lHVm$DGoK@w~0_P5A&+JfLX?d*v z1NtQm$kD(rMMC#>*22Zq53qpEQ)fd@+5jT5{?$Y!DFy>tVGcY z)(DVD3>LYhayK}PX1m8oqqrKH3(-}>0w$US5e7h?ZRq1v6YZ5iq8dU?QBr~+YHn_Y z4(ur05HXC9Nj2g7rUNp~R=h`aN1R?=%_{wb9(SV$%vEJx$aXyWW}`?;K*Q%uGJ583CJ(-K+P)@1N&-EwA=ZhiKL6) z=R{JC32|X$7GlMdG~*0l%2H|tFIfw5^mxbr~t49sp32srmU@N`oE>L}VJDj*L{5TMcAKLo(c zt8O;cC|%Ykm%u0iR{$ypFJGwu1x;zHff1uI7C`I$bW2CS{{XII9i9yP%)znDhzTBR z;r{^o9?$lYGg$usBHl+X^LLOJ0$s6g3jVhiNLDWw2Z1%AdamBNLC?MRGF$GIC)qo(I8j2wU06FM}ihv7>t5%SE zpG6QoY@h=@YBdNIZlw$d)rzVZpG{Sxso?P)#&LpEXqtffu0F>;+PvqCJ88mW={z(m z9Cxhq(-uDF2Fq2Z{j=Sjmmd7G`X}J|aQ^^>D97vWc@@K{<;wiM9`8JHV4TSThN~8p z^Ns#vpLLTVu`90=!m`g_lH67;!3|OBwfR`*Ou6K@xY{E1_@{tNM%7ysi{6TenpFb% zD^%h`hfx;BK%y>*rQH!RYI+4f@HP*@v_wKlBE(P0SujPMI%nlePtht4B{UTXs1aT& zz>FR=s=7vbhAmp^jl%?x3I^;cO({GrU$@-MFgWZx>N)L2NZ%bgLOAn1O#k!zeP1lSRh4gsj8>5#&|7G zs_L2e_`8jCSNkgJsqFH{>98)fJ0(N2aRJ?ZJ_}!Hqx_A)B8u!xOZ>cmF%G7t7x_fq zH9QpXxSU>OP?DymwBp<5lMxyzYFf1H@|w%E1EZ|zrZzAJvw&AqROP{d5)Mx8L0GcX z8Uic>b5>PA%EIa>U|5g=dLn7HzG?x5eWhJfIOf#8g+xMGB@e1$!qzIOZlpevOKK8w zDxQ3^AXEvd{~HIIJSPZy7Q8BDdp^G1X$kS}RL{msKMTL4W46RbE%@ zE~2@cedPB0!N9J(v($QwJAs=RF~1el94t;uB3_)(W}6a8D{(bUj|y_;w#|r!>Xa#Q zxY1lye3isFMdi~(wN{!lXtHKAv17y}wqp-L| z4l6}W29!1yKw5|ocQ+^_%vF#e>E%jMr9xpD^Tvh!61UA^>>qQI#yULd0E%$cSD^q% zEO6NnTV(~XW)U!`-Fu!F#Qk*v=d5d${-~1bD{o9)h^mI*_6aFCv&Ep z)d*3;*M^9vt?R)=MDR8`@I^8S(Y2-37Q=Ir6Nv)02Y<(T;=(yutXGTO`u_mI zJUbD|44_X5u8h2WOFUNM#}XnrW9qs80O5-AVlZyP;_S6OjMfeBj@xcw?uTsjB9&gB zU%tf5dEMWR&w^&1(a?@d=yB|w5sa`PJw^0g18DbZ{5qg41ANc`@$@JccWp_neOUu) z4jQ@!?|9T|IiLwFhmE5hT4GtPnV}7N|%Q#MIo~0CkBx z`lf@p_Zqotpc%aZQCIAD+pUK3 z8=bVwGh;o%Lzask-(2ox9?#0}cD`4{?8nr$J`fx*Y;(^uO44e-M3#!NQOPF?m;OB51|(5 zh&xz2(w!TcDE5{Sa!$G`0`&rnfw_#qc9x|FLu0 z-!-V^&K;$P$#spy32A&)58c{8dg;*vV^eXjssciwgF{k?Mcf?)kwN!RQMEdtbFef# zTapmR8)$+rMysF!K7xdxaxP1jZWcg3t;jNHW4s4?6IbG>3%fY#iUAB2lnl3N2Jb=@(?NK}pG^`G?f(GlFBOM#zR9`E z9_ZnZuo{Oe$NL>$hd$ju%e7t>viv$nKXHu4Z(CEU z-!-{ZL$qF@Yg*Ip4caPh>X=PiHx&>L*K%2l9-1PK;cM~c5e)YBfp$F=QllOmY|03i zH5%)p2{?BkzXsxgcC#CeP%TORlt4dmbM)$(0M2+dIVKon7p+@f3Q(R!!1_W2;2lpj zR4`|MiXn;`7Nto2)Cd4gsjoysAQEal5-ds)_r@U5=(+cDT92}2@Yu)V*fzL8#zrAI z9(}G?=l!2Ere*T^p6(ejNXAa?<=52pS!T59_{g>h%Tm1F>*c8J?a0Tro@o{li7UyT zO8MsZDa*Ubkk+KPs{8(_oW@i+H36SR)lP^Ilh7L=e%lIlQV7MqC=G6bf+V!+( zK&@+VK*hgQ0~cYgssQ&pXmm<6Y_l92jCrD4w2LhFJTueYZ#I$gUMKG1fbB7U^Tn5j zTPuw5UOqVG9EJz`OD|UVb=K@}9DEAnS#`V*ou7`$BmJ_vop8rox;{hlUC#7&ME2v= zbDSnQy|%jpka4-mERhZ_R!$wb=O6kXIv6o-3U8TT*pv z#M-9NF&MlgaHxIsqi5o9v}qORX?%;YLQDV5kU_o?H#1L z)Krc#bP8%GiZX>`r9!f$T5{$z4mu{p#0bg7&jmGc54R(7%Iwuk?K={r=`^LcBz;y^ zRg|NGK=iVGmsWNNk8lAs70+>sE*u_-^-NJc>i}aKm8rv0D3AH9lh7=_CD9UOa% zc>ofN6`G9^fFM!A&8U=P*;wC#YF3;%-21MgET3rtLrbDB+himF_Og^~fpEoUPvnb$ z`0A(1s?I%xwK%3ldA;nUGPt{~a<4<+_dWQ)C3M#wqotQ2u|Ea5Bb`$_R;y7J&cl+_ zK@ci#cp(s(pk-i%&+MqW00CNPvwW;WEQlRexrx6ndieMlGxu5~P z6F}8(iUlv|s7?j#qC*Qy`luagUaHVl0{JNdH=>|6;+iST8}L!7SsUMKS!L7k@{UY_ zn+E~uV(NxsST&FBsvsuP%m~(& z2mmgB-9pwt$Seso0-lP{yO=mMu8IKn63PTjtH#QSMx@q*OQ1|Uxzr$FpOugxXwOlg zK&t-$GN6=8o`dyN4ehs3PymbS5Wvx?56J=|LbNTx09}P@Z`A-DnY~>wZSi}P44-Os z#%c#O$J@^NOBUq@8=m0t1h@+m%vtd4Y_s=9zXjv=^W=_(A_(m@1#;Z0URTZRhTnH4 zq$lo=1@(PB{kcfzMd_~sy2SyQyRhJaxvAB^MNo+i&dfQerU;KQs-Te{>Y)xZF(N{Z zWlVH-+kn77Ma!tgjgkUzf9_bHDIBfV6BFFl;JWj5sLTKW7v$Qlv_KH<@1xZK(hn0+ zss|zkjSV=URdxg7fG*Lkg$9TKjxDZT{J7q0$mHK|rD1mwh>`u&6$Ygjlh^1pwD6`3H9-2+D$qp}V=)T|P(-h!8bbzd=a_f&?3(0;tzS-rTOp$C-G&-!$aVrjMHmtWis;C1g^joEL@M8c9 zE_I5wNBS&^a>!X~4)5W9JZIj|b2073K>SuazlM5re>ciM#*QJa!q2XGIr(rrALBpf zOS)tJFuHfr-q8H3!|nDW10DD$udQAy%j?66?&wAA6cM>0YZn0x>+w_IN(Qtx(OOlw z&3PhLh&S?CsAaBSnyCrM9F)MMA4F6o5-8MHO(HA%D}flD6b_nvRe+=3=pqgIty`)m z2lyyPX=p!yn$#+T(!?mKJ9?{vPeqhQk8Z0|!iPXRGlT^Iy-+Ubk3~p6^eo{)32xvX zuhCzs;<;|g`bVm>lNEjZ#0GKAuC7R@8RsUl`6a<yO8<~mcFZs&gVG~-F2)H8S|0#nsZkI?wMyKlf0g)lc} z;pnXeb-Gvw3~N;atAY}ahmYCHQWBQ6T)OF-T|AJ4Akn#X%TrMpo&=Fp(ap^{W6b{m z1zU8sJCP`~y%su**y%HhEV6{L<1gGjMbkw?uomu=N5yJj+p?Z8K@)yP>RaKP9V}&l zHz8!j@Q^X*qJ%8x{wWtxW6E#O{N^I}T_bVP@Ok@BYS%7(y&*CCZ?6Tn3a0j3XGp?S zeyOS=01sppPEJoMtwa%tcVx9vl&IVki>hW^uCdCXX+>iq;BZV-OX!dt5Ed2csCshZ zqzIFK7E}%iWhh-$D5t|j2oiw)0%#P_iPuFzM(3h}IS2YGva@#k)XLtxX_31yS$j{2 zZ`h!S7B60ZvY^rU+~}r>cTm{zL`2tC8YQ8~AMMwQxUk@7+Q5+fP^c2jTD=qp2R{T7 zqf}HP10eLE=c!E#x>Yi-1l2HT?#F|mKoUNxaO9{90L1(gO<%X(Wx*)O7HWW2I^uL@ zy$6r;nDR&o`$^S!eV?wg!?ldVBteX?P*;k}8{JRtcEky5M_9TmmMJ+d2v&88j&}b5 zVS{r5BmkJPUcXnm#w>Zg=a0{~B#>o{Yr%aEJ+q=RiIZ(TS5pa#KOIm6`&g1>fF_PZ z@Env91dVCIQ5jShI^97c00WN>iir1Cm4B!eGyv)GH?IXitWoBf731Q~|7m z>7c3yD6r?E1s5*#9FQ?N0%*jB;DJB6?ntOMK>eoP+8{;UjY+o@1seMLAViSj@#2Ak zOiyh!Kt@J6BQf;~vRS?r+udaw+*q>X4AB7f3&+ntTa}w}Uysg4PSaMPPj5ancd<+u z3e;#9hQ^ru?$i8@m)!y9il?IWez&vEGi%C%=CKV`^coFQc0U9_TrjsD1yv7PSlplq zatnGZGAKs8DovyPn}w=(%;vHZ9KqC+MuGlQbXH^RL}_reRvOofdEBG1Fr-UF7>{g${|w0og#o5<;I8| zJC35|0PpMiD~1LxOA^fLfUr8K7-9jr7j-}`Yev3~pmu9>Dug9g;%fX6aDo2OQ^!!E z7;S3d!m3VOi;jqb(L8lc1F>;VTv1E8ftAZJIw(3GD{x})cO)!#&avMsBnZq+Zj$&# z@hy4mv>F4!LF@kj>rJja{(HW0af%XW{i2Cg`-tO`@&s2aBFpmhU?7UF?g>f(k3-QP}VnhQ0qpk$C(01!p^ zT}=RyzsXuruPqq>WLOZOV31E8RRziTEZRPu{{UHduFbAZ~z1 z$~pG)abWAsd?c@$`3Y>Ns zUz&)43|aY=sZ_YQuM`1kGvA5`_ObmC)OssI6a!u?psy||P1vzo@VZchpw3-dE{Jz~ zDN?D-8lZF>lxivm+RtqgwO|6rL1kb&uB?JG%K@!*Dq$kIZgGLdsj9P;#7^bO0h*Qilj_aZ>Ny6c7@ZPaj6;gENl9$K&n{;m@}I292Ed+ zXr!P7n((5klf8vSQ&1B6tD#Vm{)#AI7~g^+8d{|kLIy+t9oA|(8(ou^A!h{Q zh>k35xnC@+jE+f;YK@(v?XaTFsOD~Qf?kVS+(&QS2@U~5yE|;1@N0sxSWLy8XW&Qe z#NPc-(tg=e>Wvt8lZ!n@siUKZJY)rEqcvvcO@>AEQK<5p%$?cqYE^WNMz0l=$1`YE zjQ1XnGzrC19N09|IPGnF|0>cpx^TXQK^ zj>IYlr|QXoObDG73H~Jm9CgtG5;{;I9SkB}(gDM=7-jE75hj!<0$ZX5#A>3MXXJP) zl!*4YuM|~H{{SO0&b09)l4Dx63XgFJw4YrLVUPKbbt8e2}Npa`%PI=N8_p{U^9 zAq>#5)le{Y`IHEdIQ2sS_#SEnQ6@A8hb2`e?jX0*ss$k9fEv}RfB<&5_=La*W(J0p zNE`cj4Nxf(!+}77Ac6}voY7rh73MNwn1tl#ho|4Z zD?5%b5)v^qYrhrgPzfQf-y{Hxd#_L*)c_8HhQ$M|7&t%=fZ$U=2w(+;#;SzO^mnlR z)X=+tuNxAARC-#1N`xwXx=<(p@hu@kVu6lEkMKaK1w)Nl1g}qmA|c!OvMI45l_uy0 z&>C8(08NgD=!lsRX~yWOwP{j_7q--z%2D;N3Hx9#BKbp9nKt?J90seG1YwU-S&0Om~|L@$A{12 z_op0rd1>D+N<3&V4m~A!a zpkd8jj;I|-b~nEi0R%gABr8D|b^(G3c7h0S`k+0-lYG@ua6lIS0Cx(ghY%frW~<#G z9)xk=s6Y`Yw!Bab0WN*d=$HZkE)R3nha~|3Z>ES+r*oTiK*09UHExPk648+t?I+uo zBvI&Um*Fd;xQ}e3A!W&!aV4qqL8BBq#G=|&Vx@5NM8_qDoS4#x8GZ;GOI>tCBSO~diUk9Zd87H=pErSwt6(KWH5n*!>~Uz#2GK-8@Ak;uyf39-0cW2CCsy{NRh zP8yU`KnP_*JW~P&sRW=%piwJEIT|`8Xa~4o_zEGj-_<~jZ}2LL$nBuAfP02>#H|RK z0dspYO>bA1^lR7@HAG1W8?14CrAsf5 z=8X9>%2MqX;I$&-R@N-XRXT{*DNv6<7BLw!LC;0LV^KhfbcVWHCloZ|v1>K6wvO6e zWKkhrNTy=({SqPs5kRaW?0L)-#KrrK*_PbI2Pm&Ol2ZHR$ZE`2Ukx_wB!2G>N=ABm zd=fH%f12$p&C=JaTbihl?E=3Qk|~^lG_O^;5~Ci9fy;w_X?!XZKI$#V#i-HNv66l| zpkJlb1stFsMpwlMHx_#!V~Mf^Yod?>{J1MY>r?^jYlTEyK;Yx)VpRkrVqfN( z5R^$_ZE30i_dP6h=vhFE7?8{?`k;}K05eona#SN3L|&YK)fY;Jg2(%`K-`kYjmD{> zOhBU-sUPTwkGJX3snrw~1DG!8fW~H^_4P$C95)M~iGJ#u3lthQ`^=a~V(kD4LH52- z#b>Wvracdg^DxQn$u8NqwDDdKf9u)svg5fEhcrZ@K*}xwp;*8JZz18aZclbEZb0kV>-~&pG3WOiY};v=-R1-haO zxV*TaPWJWSiVs2D%*YseIHwdsA*Dk=YV|->gP%oJGSL9twJ0lkfue$4q=IBkRR_7{ zrw(WU%nLcuK)`1bsX8hUh`o6P41sp5F%QK-82fe7yb=azC}}P#fv-muwGx**9EygJrvG?;1xco7WxV4=dxh z26)T~`fOLL+s-Scj&>tWR}U)U{!6upls7oVB}p9@(EV=qVn+;@4WMxA)v780I{aM$ z8WL1ML_-#HsS1VM(k?3Ls(Mn!)v^FP9z1y}2|EFH(LpH4z=;|V^h#@P-*hq#*&9`6 z%<|2Gc;PK5n}oQdHrikrM&G*By0WvoSTP?pY+DYbokKWK5{Yh2eNhp)uMH7IzPeGu zVG;zlucDx%+_Aa>mw!Y6Xcvh=!px z^irvv8mfRtT0b-h0$tPxX{&~1KyA!wphQu@*6IgVeJtwygnND(g%DBN<3rIEZVX>{ zEF%!|kpOy?&)eVDX|J>Y0QH!>cjK6_#v$?J23<(1{Qm&IpN_wp#_fFL%|PIsF^P9~ z4*7K}=zg`?)%b>p(zjaSb%+0K35NtX8#-xc@$ zT<18$KgjC3DZjg>h!F={DMJAIDhF$Xz^SU105Q|3NDU}1foV-tfcc^uhNr-ylkp5y z(E2Qq+Wc1l$>#R4H66hG7cX`2=j^^8amPpovo8~jGH8Rv{%?j^J0#XA#qx7}xLZg8 z8vIvVT4<1?g_&r{npGsNN-#~{yy~^BDv+;5xF-?-1B!)ob^%h@pi*pg_cVr^#uxTzV)19?Dcc(<^$qy1E03A|GvBTY>~*P8^g3 zqr`MpRfZtex@n?9L91ObRMaYo#qP6GrQQIjuN1IZ5(Pq;h_DtP zCs0E+Xv7yJ6{!|SBXhWxSu>Vhq-)`wsKC@Kpal0<)CFJ-{{T*5N(l}$;7}H4wUrFD z8k|Z74*;lT+}OPX=!*)}Q&9U%i$pq>jeC8qiL90{Sk0~Y_Rxs0!E?9DT6rWP(^Z^U z$vm=|0yb9{7huG~zKSDMTpB4+V8}q^rWk#qLbp-{_O(4|u8Z;ef11Tch-9Z80Yo`P z-4-jcK)?t1s!KvKA^!kWl@o_>4|wVmRYvD)k0^MCJd$;btovMYhG7%vS4r|$r`rN? zkBaS&H(x7*GwH!T8AmLl&GGbCm?$Q^g3cl2dL1*6B3e5F)R1<{H>R6=`;b44eh z5&6?VTCR7lFBS~>*foc{nM2-CT*YkrC;o*YL-P?#})PAUPxX0g>( zOILR0h(I%wbWm$5(dtnUCZK2yD2oz_luvY171;5fR#5htJbBT1z22F8rFZuG+*xAM zB2>Qx^ZlNzz8aNxe8Uk~h0ey5<`Kw${(FLL#wf>P(j-B3Ad8lW_CEEsS={-8AE zh((-4TdFC?svu|zUz!97E(BTbP%$zG7iTw3Q6e7IvLPPlBIjLD5_Sy6K?p##-nyu% zeZVLMv{yg~1f47r1zim}swC70)IHfiRGQ!QK%zU1O$P)E>bI%lft?=Ql?QPLw^RWK zTk#4Auzn3?S6+k1PI>%3LEZ1hTetrJNnQ_cKVI3am~tFB#}Cf|-{-vi?|`ya-!;}H)$J^2o#$U6C5^}cJ3 zeCU{uB`qphdbz*qzlTl)Ms3A%)nxKmM1@0=x_a(Zd0qYyk2#H(vzqJ8W@iMgC~X1J z17b-fzz7w+tlbn2R&7qIkc3@Yi))i(-Sh_BUR-6zQ59?xccXs z-r@fM9(!3345Gn&KWBHWk)CJe^1m;i@9zl)gWK?;`oFI;mhIP91~Cn$IEd8hyxz;b z5v$K;{{Robc0{zY(P#Cz`+F9?eoLRflLxI&L zh)1}NscM(2wF%^|glOfT^;S?s5?GF^Xx+8jl0$~zrDE4d{AP=qEN-)`o3YwBEy~v} zd6DkD4+U#T`_DdTu9uAPd(Gs#gh+zNUdb4}W2u|*%($Y)CX1Z!%Rgr`FOQZfdxGgY zS<(=~1uhn~b#!rKV1Ly-qS#=>?f~kVYfLuy`9Hx;Mos<*_L2p7E6r+G5@JF}m4e)k zvkoz%o`p3JusJ^^G}95if1*IUf2wJrgOCSRK-wk&uSEoa*W`f_UPVO!3yUgI5qC-g z9zUuCB3`NRQ(*Q%Apk;%VkBEtC;%qv%4lzvstDwqpdYztVb8dn(uEVEgs+D&UqDSU<~)P70{ zcT^4{ieZUYx!?MrLPgt6NEWWZ@5S}6v1F+6yt36>&(LlcM{ zp|n9pSs2O1mDOFh$B!(*CZS$$mTR?!CNKedBhOQmnk8yP)?!PF(QYLgB~t^96x1xG zgDrB+Rz|M2&7!W{Y^kW9;Oe3q*NQ0;?ZZSuWBpNR0**6 z#C;DWLJoeak#eAJ+=2x|BKF`AF47CVtME(`6cw!x3;~u*2cK&C9>0G4v#wEuqcZ~Fiq(2r zq`*{A*}18R29c*9R6`<%QTwYxVuN-ag-mJ>BDitvXInNiiNpxJR}XB;)1{6>wc3V-aaWh~ zdt-}xDF==@)M~z;r@47Z=aDN71y@kO1}(zM;BO|P1R68oY{QBucO0If0whuXC}Du) z{{a1^5QhL*9S}%rG;eYUh=5y<@aU~OZPf6|rDZyrmTS4T$&V-;bzh8s~+ zK!ENIc6yMin~t$+julZ6db_kw#2{w2bIVi!Gz2w1pilslMx#9tFa0FEg}EYv%|X|S z1_C8OBHHjecuAO@r)vZ^?EWpU2`cPyTPTAt-PlGWoZQ zE;(0#&RcvYE!|b?=6EN=eqF;Dw+CFHj$FOb238uaNMp^3B6=B-P^+FeId2tE{?lrq{ zK!Y*(q7W@cp*Ph<1T;esUW%G${{Zdc5H90mR0X+mN)vqetm&_D{{UNUBsY2YYzfC6 z*!3&q{{Z?O=0+=D<-6?j-Oh3L#|uZPE6w_nUzWcQGlB;;P+Fwbd;06^2cX;IGM+eT z7GFQB`EMNW&UZuZVcN#gi;>NHKm7hT%P%EMaJu?{5#i{C2n|^Q$L3H1*G<4Pl+!~J ze?^Y~l7B@nau=td+kPpR9wC!3W6g8E$2-~M+D0?&;GblGg2dc8@A5Jz?K*q<_HlZ3;iC0V!-TN!#E__x) za?0o#sbY(vqS=Ju9C(#JQ6fdSpi%%mXf;XfHvSK781z!9LiVjHdK@&Rk;;seUNcB)ElFE(y7?8l&=&+U0nD*89EDW>84VHyK zn8}H%vWuV`-Ii#Md~6*>8)*nmpfbM+W3z)GoCC7~>b)HGu06~=fNAQwM>|yr>+oF= zdMw3;2C9nYHCm2n)8e#%(x!}pCHQ)%g6mkIxhf$5c-d7x=-tmH3>CT{)2bRr<;fH^ zc_0C`eNYTa1b}i=Kqwsgg)}~YGODFR`>ddCerP-ahid`))TsId2_>zs?1D02Di8$r zv+HFHFk%RD<6qGM7BVA`8=#2=ti;_E`-AlLL^1S${Z&v{nhFn+hzJGT@IVq7kHt_L zP!4UPlmYGVR1Z+#+tJhyxC2n!2~-k@F4qjmBivkY*F;l13vnd^p$^PVSwO%grC>O4 zR1Xq+i7m(WL@5_7egqOmjHRT3n(X<#@gh?XrM(N#Xk zi30YxNI)%q=GRilh3+QoY(gjxTIiwxNqW}q%Bi!(f$B;jn=sU%iyLY!{1j6WG4`-7 zh&x_{)K-*5&|B#zf}yZ-Tyh0Kh<7Z+>&Z}13VN1M0yQ*$-2ezL!rYJroycY%6a_(v z;9b)EE9ibd@jb@>0Aq)7haduR2E5nBzp?(-V?9R?H;&wRz4W&EOOoP?(L0^QBIsI zr}aR9Cq_RcfN#_EKsf*q1-%&o7NyTcK_;z7RWwLZfvBw&7j1WP#UWpB1)CDbqS$X? zk}PVx{qv4iItObEk#OA?Ke8}xd|>S_7hC7GmB`$9xxln_Uha`QZS4Fwy zsI2v=4nuz>R5J^|^+17@L;nCI4TBe?v_KJ0)S`z3*^7H=svvm-N^vL)0yvZbBp=)= zr`=8*TZ)N<^1t^K3!!c(qD})}^h5xbKG0AhQbmS}E2-kVjPQ=fq4_Lz#<=BikAuaXb|Psi(mMHLjBW zG(;yhYKs7(lgjN~P!3*(oI(Nq1NBrl8qny0H5gFc07&EMWDDAC?W&Xk=)$}d0n`dL zRiOiYIdoG%#M;WJ1n5|(m|^5VBh^l>52=1DvxkcC823{REYB%)(SCpSyS?_u%ZcYV z_%isuz(?N6oXqiM+x5M6blt2zGYA;_kHvNO^`wtM%~agSyptkI1)k+<8p0 zHjJ2hFSq)(9IW%Cgdyv|*boXDXG`o_`}@F0>;!2?jPy2xG^J3a)faj*Dl0ub z5ICCfst>7tBZm}xWF;HQq^~z$E?MQ>F$}U}4)@04+{B5*7f~yRKf`vj$=pQ>*V>z1 zZHI!{Y~Ths07c4{+Aw}ax`rHIZa-A0ljM=-u;Zt6jZ3Yx%e}}W9zkAd97zf0${`T) zCV_RABX3>!{{Z2=(T;u4y?a+4yVpC`y{_A9iv}?aaS@21WrUGwMXcM8q^7f8Ys>-m z3#@9dp(wDWE~I{D&pY)T%ea7c%i8Kt}dW@x}rkd z-5{8V^+Z0=Lh3|g-RF!$0_AU*);Z=zM3vJNHyZ^+TvZfkfsISI1VB4ni?x&vKrtYI zs6y2&-xLo^Q$(Uzpl2~3ik6Mo@pkAKE_R~Z8efT6sEnK!;;dM4kY|66s3AT{7A?mv zT$m|YTqa1>X9S0FJrNTf=Gt*g3+?1Qxhdgbh6$5fET*sfG;8rq0K@Y^c057fTN1OV z(;nP)_$XsUXWtvtEUJ=6aRq4=<;AE92;r88=9XyDASDL5S*prOjL$2rBc-y+^fx-L zoK|{lnQ-gX9%_&9Q*Z)0YM+HhWa)KdHmfUfnqS2gK~YnEQ4s+8B8#8hPJ0_Nxt zZq^>4pk=At0SEX95pzJ@s2FJ$6>5|VM!Eh<>ZJXlj;t9Fsv=Ku3IT)jI-o_#Hv>*C zh5;hfridll2monP>V?|ml39gDjEWq{nOl+qhTh&N2ln+u0@ZP9q*4q%n>~3bi9;cY zc*%g{s<|)9w{85cNJvTFLJH&Gs#SU|kCerl5fiJ6FQ4r6*?cayoIpfQ1>+$@z^^v> z%F;6IlxnQh#!css!JY(8AcmxZ?dtZ}&OFxp#AVx)EPm`_ql)?-zkI(a=Q$HS)I1k* zq$_PKcp_4%tFbq95+prq#R8=Z-rko*25dtBNVh~lCI0}a!J-BSx%g;+lfBu=R)x)+ z4S6Dn$d)#H`Y90mVn(hme?>t~ElvmkLGio?%JyqtHy-{oW1&> zPH0cT0QY1HHElU05|NN*H@HC;>KxSuoxbW=GEkQN(#?rxy#~X|M6=54&)2Qa$8#1; zd7#CKyDm4JWnO)hWGFqyRGm@I-1x9Vw^h@hVH};$i6M+bON!~wvANTqlVh41J?^@F zo7Dy#p{DPm+JMY?iXaCrI-o92LSBd1gdvMG=r zk4qvB*>=6h0D?E`qavFSL48pZ8RXqHQz3~A`3R{=3`Ti7st>7Dh>~mzx&+j5>WXo4 z-PHr)s8tdm8ViL4iHTuX;i_ST;i!5l0!ss+`KUqMS*cpGY7k={91%qrQNgkV+FOY! zrjzN;$_Di2RnR?L+eHGY^hGw);+7zze#(AFSMiS;e2UDBt{~^nS5?Jv%F)M%{O@tUBPP#1@-vnIauv&aR_bk@hidZ>uq$A z*4fe?vZr<!6Av86pT$j#lmiyZ2nb zBw6D&Z0hI$BI3GQ=0A1s(xFXsfK*HhjvL4 zO5RVwU@|4SA|om)sCpHt6&GrSo8=!t{0qs6?d7$R_d>B8iu3mz`k7wIUvdU3YfbX<9;YK z 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⪼1uZQRCHW?a3^Ud0 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 literal 0 HcmV?d00001 diff --git a/vraptor/src/main/webapp/img/post-sample-image.jpg b/vraptor/src/main/webapp/img/post-sample-image.jpg new file mode 100644 index 0000000000000000000000000000000000000000..3fc4282987a99a4e54440480e0e54136e7d241d4 GIT binary patch literal 115144 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�M9e9MSx4n-hEiy z0Bq{Y?jcj=*?{Vi{kE(fNOp|#&>6%ksPVvl3QE=8b7{VT(d~GD?pttM){?Q^*Z*n7 zc8wIz&(gm#HUDVUvz94rFIvPdW1Jcnwxg?mmuKEn5Od_}*4CmTvYxFcR>mBgFZot^ z*zM-5xb4Yty;V15ut`K@zU%Dg2=<(4M#4Org=9-{xPuOV+q`V) z;Xgn!thR*(ZA*x6#$j;t;fc3oLDkTbBRkw)1zU)A1>}U6-_N%cK(aU)LW7ZgfVq#>1#6m zwyn_fDOsyO*%{if}P(+(?YRm)mH>Juf% zMhoHRv=3?u)7UVliI+bUUUV3HRk9^Q?xbo@4q^aw z|FxvMw23!lP}XSN+s?ZiGdPO9KW6u3zT}mWqGT{q^xgLPT&X{w{)TP`VMuNAP(Js8 zQv|`(>f?8?G)oBEf24KNe~0!*^{C^;U@03(eydO4)O`8cnts0JU;%J8L!PnpI*^(F zmhCT zBlX!y?w6hvCQ~wYa|>K3hFNQQTsJ|ASV2X6qAFN0-fo)a{8w5;u{Ry$M65ZL!c8cx ziIy_xv-fNN0X2U}ytox$IsoS5uWL(BTljsM=zH|Gbx;E%sN%>kHk!t!uMiAgZl)(_>%;(b}1sSjDTvdR0`p{ zl(a#2924p2?-pr)8Twx(bM0^FvXfdq=L+WOaoB&K{?O4iq~{AL!zj9^>a|kHd(u}G z@d*w5c4_toVUD1X*72a0DShrE5>r@h+Nc+VilUXx{q0(Grfo-lpeS*@Q)ZJQ4Mf>mt$O=6(nM_2Ao9>p7XnwG^H< zo$L|lcPwe1G1TUBPbK=qGu@G z@VitfkW(;=tGE^LJYD>4FA?RA_R2;m46vt^g92Y!-*X;{=|ZE$uK_z~zAzX(F>!!) z`r@fLd;Fpus2GBGYNG)GRoUHJLE#Z!dUgI60HZ)$ziZtQgGQ?7iqI53)!~V{ z%B_1WQQq6SdnQMhYO8JJlG}96SWk=(o`X(YJTW-2wkFH&#oTdj`&3(ntG<`YSR@Os zHy;|Xrx0J4M%S3^^$#BjsL z2`VcjBUute;+l|$T6;z&Q^Gb|Tbo8{BmCF^^F}zYkBG&~l;Oy?Yk5HdyvxLW*mpw9 zvRy@|GeOJSf=XEkE?3rIl2HEuEj+ldftRJ<9^9yz2A0cOwpI2V@cjg*;N7E_BvMa^ zIE$dk_Pf-zC_&-|3=DvhNM)1$VGN2*QApuVc)tP60wTl`7Ocg)+qo zZr<=S6lqANbs~%IY!(zXzg)z-9s8>S%LC*%<|&006z!=BS;VDt(kWgT(8Rq-;A%J= z0|uE+eR^=fYL9EFxB9;Xq3Ew8qa}H~d1E^TZv;2+1p2R*c)r066HZQ*9%Q( z-@JHX9Iu~m?mM^X&vGm09IAY$KSp?~_x{m>c3`&Aw)U5P+4o-9w-#PY$bk9F5=ONr zr%-XWxTq(%Y$Lipv`XS}@x;|2<9@BNN1i}=iMWxqbVgv766=Q`lT5n>$!Jli_JM2vZ|VX%sqPb9>Dh5FU{A?Kub!rW@_er z_`T%D3MRKs=8EbsP0*GZ)X;f`GS{aI_8qbJJ)AbWWndit05)|vj?Sx;%6|L2?BR@o z8D}7oq>6pGoqBCNsT-!{KH)d3DFaSXfG8An$7Y&(#ND!P%KGBcVI{nU9dgy-hrYQf zRv9<#;zU>@cAM1z)C}r#KJ0VOy;c(VZzy%l9Y-^r2ic3(>PWkriDw$5b6U|sIM-Q^ z3A+PgN$2nJ#)RcXYE4D}R#YuwlX>6U-B`iZwxCD$BYz!S6Y~Hzo zKtqA4RE{H!D~IneFb-(SNL4}7Go~(VRvOctIQU`Yjx3I*wd0wmKA1x(-re5iwVh)b z#N-BE0CKJ|?CZ=_slC@|f`3+9bNS2WbQzL3*M>3c-yBs{Yebzt7M=r+I(RQuvmk9v ztc=b>_hZXQJDFoz7MR9^iqeA>4h5d>2XKipC>hlA!;l-%3pTG?PdY|8;esB<)!SFb zpyXKRg_?O0ZD(&Js~V@9ks}}m7Tbi>P{(Y6R*IZWIFpQR$({}BAdv=WYAMWNRS1ZK z7nIZyQSZcjt2`s`CXo~Ze8 zI#V~p6IDWAsdo}h>-v+bwrYu?7KfM(slMD#vq_=-v+9J2I+~T!+Kx4wZFcC^mUwOa| zA!>MzSW0zR2@N{&9y#C+vJ%ACI^f7Al<}qjbqbIN3LGPPt6o(YMpZ^bg>V8}hqpWc z(-X@)G9;dTcvCC@lHGpX0Gj8PX8z9vA0(=%31OwGV?8`Et309}=54=nOSu04 zM&lz+1&0yu7-pCGM!Aq&?Ds~(SD~IYsfEGfbp96c8Dl(PWjPJzmq7W7X?8sF%#(uw zTAJ1gm*=d=TY03BQP+Xc#cDnH-(CI_VTiWDad5wzBk1!Qnu?DBio0-0lz^oafI#Pr z^O1uu3Vgz|P?M5_!oK`Dw*csSXkS!>r!F7E2p@a2B9X8@ztJqe~2rc22P;y|w+7$l(4bv69GN_q0dU?KaYgxGG_#zsm3_OKXooIzO% z#DH=G4<;q(S0k9`fCZB>c;LuUns1l-x3xJzrLH3LjEz`Rh~tRbo9Hu8a{DovIbOU@ z91ms6xFB+(xnyv|fvS3rVDP{g-_;($`3c*5+T;HKl9j7<3jYARW6%7piqfj`%@#+B zQ6iEGkaEa^4M*9HS+{Sdz4;#ZWSe#LgZiW^L~?&w6mkCmFy=8EY8QHd)ByW9XYa%r zK9ZN$!1#5;Bu933j?>)xW7uvHijYh*f#;3CnNA|>mFu^~eBZn5J<;^%xe{1qXypW( zd({WinJdAE4`?_w+tjw#<~I+e{qMJTO^mE0(YmERYSp;q_>-#RYqn<$;>Ejm^@ZTq zA^{*D8j51{?Xd8o-Rx4sG?A7BA)s;09vJM`vnaZwUI$qU6Q3?a7cNs_msUm0uH;ahGN0D^M$Gb0((|u@$K_H0zChp;%0o(;!_+RFRP&=kLMo zDPof(2Qp20b^W+xm`>&aIYF;4$U*+TGhqm{-tWo zXDD?XRfRJH9KY*YN~3O;t8Z~6PV{Q(%g2s8G}|cJBTig?%xs4<)NhYxJ-ow1X?oC_ z@;EFIZJo^PB1UB<2^?!HjP})0ahk_+dQEQ(b3jD_ljEmca?PYtD{-)}SY;EawVyUa zT88k;8f(4DVN`Gw&>F9XI+?p2ei7!UPBaINL;$ z5hMDlGtd^iF@D?`^nF0AFcs)n5J!$A9k;fgMym|DBam?d*H zURh%sa&AT@xL;YSszpMcI8?+!8ZZTFw4)CLg+e;(xpwPIgJSZ5Gv^kwrAr^fsN^fl z3k#DdXm`19cZPx|Z$&C3iGck|)1F`qQ1vm~+x!Wx#t92t08&b4q!B`J;MZ1HB$oTH za9eF3G+?o22|S7_NFRlKPYh?Z&kZDN-Lu=>vkXq#HroTGJt=SRYcY0SCOHC(clt|XZpQxrx9;A~;yltY^*MeN zdgttHJRiC@Wxu$)o=ZFQ^mi*F)X;V1m-k^%B$TZ~ zc;$&Qbp%6*t&!}gJY5w4yd7z~+~DWZ6!0nvpDo@1T> zs4c15UH03_rJe~Ht}Sj`kEUL}ok#Ly4~8pHkKOmHR*9|FjK#r(FX15Z_G3edF4elY zH{}{lF{MkRa~!cWtVMUm{{VA&cy`UMUo!*h$cBoDr_9YxLl>liL-xDHw#nMNBr-|s z2Mn!F1ZqBdbiu6VinML$ffh&zDKdu=F9sY&Cu)Imtp}Na1D+xn8>xRS%xmg3JfIFI z7pWt5*<_X@uUpQf)ucHF=ms>~_z5^YP}TU!<(4AQJ}GpiU3|xtF%}+8O7hD3X+`RA z{1A4r)cTpL)1bwBl|39Q5Hyp+JS?1uZt;bbU1%_pJW+kA?u%(C0M6Hq|ZD^6HdPoWD?_;JQWR<%V1T)1X6Qaoss#Zj7!BfOwHUsqovfH<}Dyvs*xg^_2K_GvD zzr-=FyA7hXV|vyXQQX_y80CbAjg%Uz4C{)hZ~cqjw%yORY9&)~w*hXT8CRCIuOp1? zJgoG~`y5HU2t0XVk}J78Z)xrwvQ58oh)ENVD}E$yOsAF=nK^L4JD0aN&cfbdxP_iL zp=#J&L*)!QKko+w+XHQWV^r*)sg|A7xBRuni(Tzg&jzfd{{R|)3~R1Dpn7c3$*pFQ z!?(tBsXZ~jz6&5O`+gYGeKIhaGl){UzT8~xw6L#BZFcdQ9wrExGgBct<@(tuE8D~Ohiqc1x~ z#zkh1FdLSVK&CHV>R45;`$GCACNK)u?#D*G@}}yDz1t+STFOSF@PUoB?8#kG;li+N zfaDH;-HXCkKGxlCeIag&98l#>c;)WbmXna(#FJeB#>}jMnmP_X(a#U6$?|)16_<)d zVi{ODE6?d?bPn77aDF_lD(Yp(JB1x|(P; z_G2BoWjU~0joeFdBeZ^^y>zP@(!DWS^^3FHWuD)7WH%QA*<%$0iEnws-r3+x2(>m4 zO#YC0(}0kS@jF^1z-#ylHnr8~t!k$rJaKyLR9?fn&$r#`L0H=<5xR94p3O4~RqyAm zf8#gldcW-S00*qkfbX`eqT&JqTX zP~}ltVrFmz$LSy^Pz3R&cvm4Gy51wIK(c6vomUU5K+(dQhGMu_R;p)j?vUJfZOzTA zG+TY8Eul$dqR3=o9fBOsA~2d`hJ_Nyl@8S)=G*`W12h)@0Ng%=Ot#*2Kz&&U06F{c z=BFbw-7iMrIgzT!4HUN@96Ht}dt&PA`kXS!Mld9j8Hw}hSer;$ zhCsJB%*`yUO+|A!4P5Q5y`%1E()2QV3iIYEsKlk0k1FFiuOcsk zCTB@GYg+yIyQ*wzcQzYV?F@e~qEJO)ofw9p%u$9jEQh!4OBf|t66WNDAgpZbN{sl0 z2L+~&?#|lvr(N#Ff9ByI^D!v>NcoZeA@|^dRw4CqF86!QqQcpMwz*<%f}b%&An7a6 zoGtuddgY}3GVP?XvNz1SbuXiCDfmam!}eg2TUEw!PaHfmb_px?Vc-c{fPi^*9-J_+ za9*PM(w+kdJLw0=lTNj!022Pts(O*pf|`&CErL;k);SDHLbzfmMKA(BV8*qZ(~D2y zcOS4<3Wyqh;M=1Vb*-Bu+yC(ASCbzLFr<{@^ zpMIvnU;^FU0+I}N(frsAkbzLQQ>|unbShad$Mq-T+UH=f z-YAgdBbUm4!=&NlU1;T<^w%c`njK$v95OG}R;>sJnCF0=Rsf8u!vG1n*hhP8(U3Jz znAnenh^AOFah%*+I_OCgOwh@qLBg5iNmh1ACxwU05@wWoVl~LMa;14;j0T!JduwOg zt>jm^n?1tlej+$Thxrrl!`I1BPV|flT6r*DYV%II@i!Z7<0=! zVNp^iLkf|XEUSbFco2@5G6G4q$1QaEPZGl{@l$d$6^7vv@=Ve%Ausn+6?cOJ?IF4J z*xWb_NFXLco;Ac<_&hx^w}~0#mr4Ova&iL%$T4fUZPP0>GnXsG6UPq9Ld4Jns*OgR zhI!!{2fZXe(xF-!HNs?gWC_J<xKzA8jd(*@uA4& z&;I}n0pn3ZcwhiGy_Uy$+hyDDmt0bchWtw3g_p!&IbSq)pKfklxxC3?c~(M8!8Tw> zmB@@4rL+&*UB|g>Tcj7(&qs{#HKQ*zU^yIKyC)B(J6pNzJBw(KaI|NutH&wZ` zc_p^>HQ3&zK|{${kHkLwEp62H*F46V^xx_wr*TA^cH-#{_ZsBJfo21m*YS8`qHUPV z3$4YZl?_lzpTsMNC`ax$U-EMZY_+W^CYlgxJTZFCO;^~iuHwBBBuCOG^CQ!pJ^1MC zlMLeW*D#GLppZZybU5U~inf7Ftug#r0flM79-N58!unFaWo*STp&gM?lk+K;GnNsv zj`9Cv+tn4RjeT#k7hsg9;;p55JLv${f|NEM(X7sWc^j(RQOjMduw8{kKMOTp54kdi%BOMX#*FgyHi%TtE;QqLFrm8y|6W=K+_xb z>m^NAnP@;DRPe`CLxg9?-{FQF%h)NMP7H^sQhNAv!Z*3__KX0KGS4H19z6*Zz#UUe z@CUV1huzZzETuMWD5Hz{>HBMpe^rOMr0m3X~)bn7`Yk9&o>?7;{50Y#cTK=UVrB6hPeW}i*@q@B+Zm@j<{EaMAu|1 zHt{TX026Zyq`cKs3ej`>P9}fc7l8Ex^Y6x2UaXyEGaD7s=nqNvgXkLCIHMkm$Is&4;>>i^E#n#7T zzIRgYcCaJMNAeM@WWHp;Gyt_S{BQ-zV0%WC@1+dG+6P39+Z za*Fu^pZ@@=zp=2agDZuHa~&%zY)Uu#*c>vEUP^Tju;9VvKV{v1qXlt8F~|XnhK5$&Z*IgE@Wg#)txY4+2O7%64|&6z3b4oY^LI-J zm2RN8orsV^k6LBsT|f{|Oh4O_TK3zb+hwM;^x0zy=)#&xiXYjD!#m`9NTn;NXUCQ& z1oKLQzRU(|=B8K3c{!eVtPp#P`Dzsuik~wYoV}QHP(rh}B2OAuhwi{Icje-LB#J#g zETmSa#<(+pC2Z}PMx;^)!T_Z)H*-A@iZSI=iO5$w?s8z;P*K zVQ>9`jHn$_IeW((22Dx!U?-?J*E->cK~g_<89X>2vj{jvKZY1ryWg}dyPs$_l7N?S z0@ibp@V7(HNx*ZL&Rd;?n`QL2S8#}KZP=rs9Q+UO!^|tKiEhj8`|jJ_R_YqG3~6<5 z%0&JnmMbNP(c4z*WxCiye`6??+I0-4m^{?@;%qT|de;DWH!cSV2HdvW9nQvEE7(?h zc~q+-aQAbr7?%&7exm(4-g{F1JKeS9eXO`P_Yv3Bj!OAe>77R-&k>s{uDO|AexLni zv)tnw7X2WDdWA})@8wy7iczb<@wS^v%J9%OjoWItwe(|Q6sb~UdIL_rINNnQf zpU}TYw~+d*b5-ZzjdYoUpNn>q2-DUhQO=IqO%F^>(gASy40@Cbflv-$@x8i~jOl?8F#rqV=Nnv0qt5MMgE zVfapBoQ^ivWZ5Bb$gx&MBuG9LWKQa&%{r%Y$pJ{48TFD@=yL&!x)rFc^t&16Ni6p_)GQz4akd$FV&V&? zFvNYBECPOGLe@g6f0cORa1h&COB70ONEIzR=HGe6>lL@* zobJ1W?mMK{0Y5U}0LZ3*DrBY4hf{}DAu&xnC1X@FG5BO!=^*v~UunUR>fJ{a{+l+r zpW>UT~!Ax%3yIetcsu-KqD#)w{^C=iZ2~=HFEY*1$tWR74U4p{q({j3JZ&oR7 zqIIJp8dG3?&CeR!?bogZ0L-r zb9#z1Qk->jJO(CeS%$X@-Kl1I^cRpKh!{C8TbG=3#mT{4rdrR_i6y>BuBQjqNSS0N znXvNI(=74Nve%gb9C0xy&BA!$jh(!zGa|G&s7QG?`#54V+(=`H<`|j^czEH{nxOYi z?euIK`rdTgEKnL>TNk4S=NBqX)di#FZ4PkPM*HRDg#&oQI z=6|ybns|rquKPQ+qxrea7LpJCI{n4X(-Hi-#TWgA#ZIwyXWh^L0H{r@N>gpNn{tqF zy18PJ`c4;QEb-giwX!$E4T@gggJSRg0%&|^E__>Cu5=)7Ix%z7u@}fBA0!Z25$6|A-hTeXjDKxUw zqyGTOQ}&!cP5%HR+frY0`gI{A<(Vtb(_lXAKTXDUBwPJBxF9UX7ClUfPqYz(J&=D= zf9(F;xv8?Oc9HRyjo8ni4tEu0Zfyuw_%i_1TsdQEksBqMtJ{{MRC+r{P@r zcw;?^)7MseM3Z%OrC&k(1YAJT{ z>Y!k1I^}}Ud?{8rWO?F2EXzVU^RJEq1#=)RLI!*rm2q$yf_D>zq0vt~GRLT^#70QWqy@W2Vw0MG65z#YRUl+cQfI6>-@$L#5fC#W-~XQlw4{Zs4|->gpO zVI6mCWzARp^keY<0GM*bt}tT-$f+rzmZ0h(a|fm$wo{BQUr#&wPTAZ96ThprT(B1q zu4N5BQGb3ko)Y>F+U5(Zc2j!=WD%%TXz~RA031w*R}R>=y10Z*Jj@b5DU1+m z-ATtUZIMyk&hFyhTvrzj3P=cwbp+7x^I+0T;9*0$W{zo9CG`UzjAdVTJ9KAEg+mUb zkq=IWhZXWz;qOOH4z3lTryMy(61}{z%XHD)C@8|Z$r*H|ahGgVTqE1ybZW-3v7lxn zG6xR~b9-S=e?!}DSzY1^0H&T9j32VVA8_oLWg6_8LsK;tSOp7})c<(%6RMwgY5&ig7#Juv_$dg8- zNURuFkzQB=eWhEdh)OeC}Cmh=ysmqcTc;F-+?AB1g*Ee!` z5E5WhLcnR&noH8A8tk;G)x#a`he_gkG=^hP^AL-W2NcpFu+#g{0 zQ}4#JTqkYqRN(E+_kM4ixOo}m&91IX7Ha!*#c#f{7QK5~nz!t2j>0crbD3V5lPd&H zxnqlN+k84dR$JaQh&$h?yX@XuVHKj9k0{pO z+O}BIbjXX@Y6kav-Y-t8i|M8msjHAa!9j}kkvXXLHKFEs9(ZCnNu~f#@4z0Z9B>D- zHh$_ zah}~1;iT;Rqz>8IJ;VvHkXm06Urw58Pb~){?#6!GY2@)X@U89}PWjunsV!ayLs)L% zBnpmmIpDyBM7!uawSSr|6Zvktx(a*P>!L~vD?FAlhV#e#lGw3S0mSyW=Zh8|mQO#+fy zoNJv<4CD}Gg${8SsI5gvs6H4l21R!Wqc|wk_-UWriLp^p?^~3cecRSDO2-2e%i?eD z#p^gXp*}&KDc1~OwpBdE4gf_OhbrZjkP=5ZGNWrdbJuYys&~l znnva9#0#{FD}6%xqu*DbBeW0c_H1bDYx!z`<@vLpH`$BVLiWn<+rLY@XSW$|`-*n(xjtJShXlA&)sc;u46l(=fLp*~a0sK(u0_IVhU zO1QV4Dx|1mWh4-JQyqHQQDFjFC=FICz?@bICA3;Qvq)*?^2QkHsrKVO&6Ohev&o>X zyp=Af1z3VT*yG(pWQ#)4YvnqK{n(ju9K77cnu$u1pjD~ihc(C(wr^G!@au)ZAkd>^ zaXV>X6+N}J%w=YbI-VhbI8xYXsk>Khc*ukZ>%*Qj*S3I`J5}!2dZEac)>3tm!{3VA zX|OTA?TvFg3rN-1itsxU{yJvNlvLL;Xy-%T0~~!1RE~NZLw_%matlaT%e?7 z__-iuKydMeD;IaOT@@_fl)nNB@up|maVBISKfK|BB)1KhUOpH=UAzerE`|7WpyqHH zVIw+E=bOXAnK^A0mhwi zQl^F^Q7S-DQcoZ-wh?F8W!i78#goe#%L`Ts<0++?g-XcAr;pi=Zq06T-dTkke3si_ z-RC-9E7&EW(tizVL$3w|WtX=b%PeQ&whfDLw~J(J>EF|jBE<5j@b=>`EbLczUhTiR zm;Ok#v_REgBO&oMs2aTF_H#ZBmmD((3BnYkOB`SG5$IqWVBn&wbcFMb92I09~sz#Dr+%*=pF2H+RfEdzk zB7JSEBv(5w!6c~me>=KHbotMcC*}@bW9-7)UAF%K3Y$${o9Z_D@tCdQf&y|3s!Mx( z#+Zrq;=grOw+s9GxtdG4npruQB+&Bk7{6H=`SK9CB$LmE7C|PWxz|zm;Ta`Z@D=u9 z9$hfVX~=av1`x^Utb~I~)uhgZa3Bm#*m7OXf4%cdAfj@^Jd>c(wc&<&aH$+d0V~SPq%xf>4M7|AIQFx2V(ZfrjMW4Bk#X*c+xyQj5NZ-On`ZE-%)a!86)I)bp}tHbRW ztvAmVJ8OC0X_Tgojo4)V2j$cX}SD(|$Spf>5^QA$q4^_#M zVedVPWnnL=58-2^I)ma;xPG<}`+JK^m{x0c62fX0Mc`?dw+f`@v(qlPV2ToIGU_k~ zsJg4n@CN`PsRmHypwy5$Xq4dMlkdmG)qO;b0qDoS!;!sK5>p6tOxwhmF*$qYRi4LJk;w;q|w( zZ@X4V_bs8PeWvM(tPu~>kmsR@{6EWx&6IX)nZqSpeb({)Tl?Gc{ z7?m$YTJFt20#Gw0f5rQ8o-nJd+A|*7?-@4f*KOT(3w3WzWqRt2gH0?CEO-5Hv+;a6 zx7QV`?C{&%JbEK(t=w1DO3)rnQI5U#8pVd@_6sXgBV#1g*k=XI)=vmHx#dh1hUs4 zGdS*KmxetyQA+RR4NT5!>=?&yD~ra#1Q4QJO>oi~2ap<9+t(bs+^Y)%C}aczC^E)D zAGz)Cb7LeCDAOQ5VohuA#+q%(pb{6gw~Q)!QbYpETPl&)8rzZ)weR-E;bHX|Zd)xN zl0N)S-FL`YVZ1`&T!7rE*BIc%dZ|JQ1$m$2g@TBwu6B!p$pzvhnU5<9*B2!;BiZhI zd1+9I;v|(|YDIeES+u8tJ3YhQ+nbA^-n3QH)TU#QI9p73CwFO9_SO*kW4Lzm8XD8D zh8DaLiMG#1HT93GvV1Bicw)V|2+`Yc?pG!|Sg9hM+;AS;Y5Q)ltXa0Nr`si~EZ2+k zb98K@2mHUs7ypmgrM*Q-p5W$k{#9IZ z<*a5`JC)4!M|LJs3!yat4ix2sCR}LY1x-iU`!E^Mw5L;$uiJn-8isvMpNBJq5)j*h z39gWM5-=I|vtpWRH1j!f7!0`V(lBakQA$@VAnPbvl{`FnVFMCg`c!Q|FzNlcVT$Cw zjP}bsWC13mcn8FUc<|EPzRVukFI950ZMNnQLP?Ql^Rd>DT&i@EG}FfkHZ$+3e^NI7 z%-g}Bx!tZo7M7Le!_<^-ftNh%;n)qK*N)jJ4M7 zTWyUaFWfGrzPh-)aYvp;c2Qp`JhAEPuNZL4lyr;f$y6r1j(Pj>7{aA`<{dG5yqh9U zcsJBT9+Zvd(iLe>v|}t8VPIA2!kHeP+)aha9-+@pT&Yf2K$9ucKnEJs=5VlhJ83Cb zEW|KU4ug>+pA7LdQ({(HH~{E56PUq;L$?=EJb~eeK@$N*1i7dbVoBzB;ayry@D=1b zjcHDUhAKo?3sef4<--9INYAfaF$m7M453G>_Vx7PZ0;;( zy0l3%RJ(v{Mox^tQ!Y4-{{SsCyjZO4*V5Q-c9*dlNpC7jz6DquU1gWuowA zY0_M}Eh(mxC#gaH)oF~Z!&PPI5Sn0v)^?sHdqE%OAO*aZu8fIz71Oc4r$etZeDieW&u2~VpVS`M$ znvwv)2;ZrtsGzepK=A|Lh7^tAnY+U5H3>wCYB+GNE_hN--KaQVpy_@i@4^NhfjM!* z$*Mn5;xDmA0n%1#*N-EI3mh#!L!@u}HfV{|W4n+Je-eX?xAJkK(x3tcAn^8*4ME8A zIpK%34C|4=PB+9W(+oK5V@6;L=mh8-O*sq@DVP1vcYNAnt-K)6NBGaQoN25UChg)o zmfITc5jsejqk>WE$<&WBoJPcpZsuLPxMJ9D47ZX=AF8vgWICw+a58+q5WzV*v&QN` zk}?@sd022D;Shb=!*1PdCfoN2gtk{oQdB%aEbABi}2;r;=ZQ(NA)f)=G#+m+#5#m zZh!`Cy;U5?_=YOXyENM|q8g08>`LA=Ak&TjNg3CVh5$jYT2}}&AF3ZoEcexuciLiD z_jMYjh-9-_+zt8O8^o8oGms?9K#V>@S+)I!zvenQCFA zwK?OHZB+s9TU3)q(pkt7W5ga0;Bi`Q&njlSm7U$R?AH+bT9}PIiN}7MOEDR31HH_$ zMzPkRPnX(xVy2{$UFUFuF%cj&29_Bzfx{WyC0wgk$=yNVRFZb}$Ki3Rzh*i6I=wWvlcCFIc>oK=>$oig4`W#l4>J%I68=bRq5xZ(ALnNwe zQC=Y9w_UxpO_*P{{mR**NN(JEtf7PRH63xswEP-Dt>h88Gtwb+sm zn7Y1(IU;APsjAR;5shxyhJNDq*-DMR=tNj)5EcxLmqUd$zad+>?i-t1he@N;FsOA_ zqLb7CmO3X~u{NYFH=8^AYh<3_Lo6pcoX@`zww4J~n{1btH|=EU>su{7JAse`p~hQr zG8YRQD|;((90;hV;-?aE&u&1G;6B_Tm%Ty!>(_zffMrsfc#ayET!%0Z5z9Pp=vYPW zJ<=v$NX4cj!IqW#F{Zs(Ao~^Z$qbXo*#wLYL=)7GJ|5gi zua$epxh}hpxi9y7hb`;K-h!S95HyVxashEnj`rTiV?D*a#`P(++a`Sx6O&Be%C+F5 z@ir%YvEf?J%T~7CEg-*>XNeZd2(9a8$Ta}`LX|v0ra5kM>DI=1-QCwF>3`_N`mHUz zv7hE~lQlefW51%}IQusCsC!$sMrsP`$nYl}I&X$$-RY2mt49MY^Un`^D3msa(iNJj zygz<2wv3xCQ$TXzsADmMMXSVSe|8l(Llf@)CkqOYgO>wBF*M4F^q)O+x5YpY?ZT!> zW+Na<)P=9xfQhYAgcC!N<%S8T_Wn2xXj&@{{N{=yF7f|EWVePJ($?fvaW~CwTc#taYyKTjbS2=0x#qHLa zk9fiQ{{R*XQr26})qAK~UdJ@|cfgGLU<4IzMli_utg)t=4myn%TPl z05pC+7sjtnAEB{0;LXRE5ug_1Kam~n&M}) zx0z$RLQIxybjXd*$bWVo1sYX}{kTIYj_>U~x4U*ZHjTgyW6xL@l+p7@`)w|KP)wOhCUL&S7*2X*QfYw{>{iW^&n1tOe)C;Ib;^nP;4kKxXlC5+e>`IAlhmHbp_2bt8l6v#Q4EyRo(<@%! zR@|%Od2cL{dltiyg)y89O|>dU81(jZufd%Vv#Ybv+*7oW2ZJm z{H)fyHq?pp6Ux%7jUkUOb~*OmszFwrvtxcs?dE9OGfhoRH61ZKc3I@{67dbz#znWe ztk&cTK3c&X>(3eHQG$0{iEZrNnlW$~9X?;f(Y$bL%@Iesx{J^>Qm)NaA&C^}o;xO} zwc&jsK`YAMvgDxh1BM@{%1>kNZO-0JDM&|EW6SN^HER~8t!fkwB=p8cUzLSLPmTg6gZW#o z0IFPEtkJqlZXO|>L8dxnI4JQzu}AQkkuESH_rF2#v<}dwU4s zfNFV)u9{S|k}ycu_v1XO#Z&9AaIVSQ7M-JMDfz3l6K*mCn?|QFf6o5^aK%P@-dPu9 zcC@|2x|rND*jlHrdmtPUcqs917&|xhitE!n`~vPR(oM^Al0t$AAs&UTu*gReWU4=Y z4JIQyay~xv+(yXTb0BGo`bl_C<}63>e(K_XRL)iJafA{R%h`?NDkdhV0B25r_+wpZ z4@&8bj+&2+Iunf|Ou9CwVM+s1a>U(4fc(^`ISTX#7}XFxGBs0&--)2v^R<6>EG0r2 zsM%pF4riI+?Z6)6U$+2pPaL@Lz$@BG{g?zK1NL&j9u?t+9MpN>4*{M4^*Z1W5uaQJ zlkJu(+&gx3{{Web{{VbpZQxHWpXwIHZ@g?b2uJ?_ob5eH?OU6AVy_q@s)Lpz#cj0q zhyMWd*8sHJH!aTLy*p=^DzWBKX_sG%6?~&v!%^-{({j4AXtu(tjta>_Jw^m_JO&)# zSgvi>JE68)NuntZRMx?m9*7pWyVz4!&D#57?Yl%VmD21zSx-J04{*j7=9N*lx7T61 z+-5#vb^*EOdi(Lw-zT=Q8r~{VA-s+y^sWg~2j$2rKKkP;>ZvvXceh(jFR684zNq0m z9!DNE7;|l>ia*RQ8Mg~nBFA-L2MBK$UmjIC;=gbI0BuVX@{+agZORq{a@+k_$NT#> z3=g#q7xca_BNZ`c-5VXzDwl~H{{X_A7}$U2rWNb6`58$srhhOvaZH&_SKUlal=vm* zI>G>0k^vvb2s0W@KXGnz1@e5u=g830D)Glgz5-SfI=X;7O=;5%3i=*oif!uFMPzUya;!5HByj1B`yocI8mtzhQ56b! zkTIH_p!Qb^8=#TP-GH193sB^FVdOe=YS3w{jaqroWl@79@C0Yb4tOX>?v`78@oKwO z2r~7Ll&Sv!HXd*hlBM>~5SlBMp2QGzOh6zXFzB)8=hyZM{G%4Zs;mPs0BI#}i_+nTowUU);*D=I+9}Idp z_L-HQQ+xDVeDI~+vD2=Ff{e&M7>=uD!tBgeCS4McDgZeX(Bq~e@Zf4UT4By5Yl)K=xmpQrSz?sMDxWHj73kjFOxuwaWw*1q^;T#^G6F=rXb9#HEOdK( zq&NMpeqld2nA}xL@je;i{{V3GKYiM=K#L`tlB9WrnKf{=?$46+S8h$#s!32((1xyF z>~F3Lz{ToLbu`PSF9~xZH7^4|c+(7FGugXvz29M06^VjUAy|=8z;YNss{a6pVFq)3Z!FNTSs$*H$bH!Cmy*IX-Q0^~ zW{3iwxv}@+@jRMSW&Z&4e%-lTyH(+~W<5ntG48$&Gq{#XBxxD-7NbA4s&UTL+^s5I z#!-BO;-IfQEZ{_{s3CstI00czbMVaJgVBS-@QxMbfa9wLNex^3m-*FklgJd210WvI$<9Bz|VgtuSN*l3CTyt-8T^j9;Fv(?*yR)`z%vku6YH`yXGIZIghc)FZ8HUL!6T#+))pB=~jX_Tp-Z zJWX>0I^sbi#Ak%5GE>1afL=FH-w7b+?5-5rE7p*BQ-JG+n&IR>W&rUt_VvI|9tSM` z>R>oYt^nm}#|$_RJO;A%9^GxYZr2vqDXtkUqz5XHO#oryF^_)!vn@Kcn_f_N_EOm1 z&1)#5!sQKl(BysN8tb-ZQD!a|PRO!N=WSTkN6+k6kln^WqdlzB1(i=-4@URnJ?=00 zYuB%|{{Ri^w077p_m+9oJW(?!MgoUeE5PEd;N-)bWwn*PfVQxKEiD#T^zEZis+2l& zr{c=Ety8h~6gso0;zt}_Q-r^5?>2j0>GPY6;wuz}LnM!wT&rC9^1|8`tHfQ|wcTtF zxmsOEExfQZ#!CR+U}y;IURa5*F*fk0?1)phV+2&oD>t`1Yu(Rp_$fcCbPR<){y4(6 zo*oRm38BQ`5iBsuD9EkQk^AvkE367^K!3@R<0Co)QG(fgruE-~XNGqgCWb4d{{Rwz ze%umc#|6*fALv17`mH3n+hpQOIVoTAnv7{T-f?*@K6o7t{{Y=E<{sN}LByZRmY(de zd-dNrgB1r2^bpSG{id~NV$^v5058mcnQM*xb2z1+$sNcyiLA`q8jZ>mZ#+`k!y>Df zlmLfjwKnreLNN?zGsyUyJc9dEXOFipE^ciZrZ;G@vP)V3rl5i`J91$6>(2On&KI*q zlF_bSS*C_v5{qdx27^oFqKWY-!8C_zROOMRu!!Ua>d@V$e!BVcWt9(x3Q98B+&{{{VKfzZYN&X_858h$^nJ*UAc3!`qu)^>K51c%GHr$U5$zKA8$X8O6Q9;A5BK4}&)Au&?@T#<`vgrZJ3Jp}usl{v6K1$V_ zV!uo6zA|JlaTE_$rRwRX3H)xcL zd!REs^uJMDM$x3^V!nDwH}1;b-p=|Gp<0vL){4Tv8lTv4zt``&-{H^M)$4Qc)OLA> z^|nPVjG{|MYKA;fxvO-?r#m&g#&TrU-K@6mR!~Ca zaPVQv2E1`k%4g(m+Lx}{8P>AIGhIWN_TnbN54>DSXDFV^1M5lUky&aFjy2L`Q#QN& zcRrkRTbSjpm!a~H9}GL!f|WM2EUD?mbhS`Mm!S*~w;5xTiq`dD*6XfTj#8QEre?k) zfcE2kDb-ftZKMUXh@=NK0;)&59XjQeKWAnpk3&WroYl2w?R}RD5p4Kag*k_7b;+-|mR?)UMe zGgg!h>QK^vV-2^@3!1a*D^^4&GgioxUxZT=8dHWJI&snsYtO@u84RH`Y7t&XBlls0 z=$y~L`wSz&=r zlPeQnQRq)iUKo-$bt`&0%W4{d0C25vwz-E9A5gbTr|bx!wU8sEmrpyWCPEm-8Ctne zflRSF_%7?jV_W9U@|)yQD$yoL-A{`ye|{c#bLSHYD@i3CySh|{l2(w*N`e8W9$Din z{?Vqpe_W~TD_Ucq9fsCf<6{yT838O5W)uq7-Gz3*&m>&b?!la6HJb2;n6#-47UzFua)Z-nF25hJ)Lx@wuO;2AO zPsnS%r?qx(Z}tV3cU*15c;D`B9ylSHi$M`WLh6W69=>dG_HAvmF8w6eSyMKDR{Nsw zciU}lcG&J3W&_YR(GY}iXaGaY!x+iNa=E?EELMK9c0TDBb5Fc&+cfa)mvF7a$s9yR z9+Z`cRRJ^49X)-s7;|^^T;?+GPd)~mX^xD!@==b9sk!~QSuC3?$P6=--6`+oflk!Y zoUq882ETnRw;wTiau$?Sh%xF-O)`+a0~MZMSz8up~?rl~rac3mQ}*I&1F5b@Q}kwcurnfwt}ObpX+l4l3wbJknefoXVi^uN*8-knJuI)Leo%(~b*+CFWwfgx+o$ z0!|#C!90bSR9p~gN>Kj%6i0Qk)mm03fXLxs$y5vgX(Xxe<@VqwO1e>1orfyrfbjCf z)f$Aq;Un9IFkFx^I`oxcnXf>IttKGoT<{eU=Ik*Gg=|Lk2>^&=`5njcewa^}ABa!N-o+ixrT(cOjpJbQ0ex2^p+Q|_@ z&V5v=^rerHTJ!P7oju;Qk7r&vU3Sg>-*>b5i+L)i^&?|eR_JT{aqM;NuG5D;QkF2< zPgIjq8dp%vVef1?1zK$i_iB*Msx~<~jK+K_dE$2L;PA9T+B<#QEK^GASB*$Kam{;d zUKahMZLzSm`FliApNNiU$Hy4&y|*+-?DNNOsia_GIT6iyVM9gk5eXVKjkN>jMhA!- zv8JIDceR#7BC4c>eqiK4@y3&KLCd+cEFfiNL^%pm+l{8VO{4AiXe2_ufSH_WZAUs{ zHqzx%tJ{Xu(ag;dD-#-~tibTb`fiP(sM1?ne8gI!lktK3#vQVW8b5A97~0}6f~ezA zB#ChX99u)5K`n}oxsOBr{vvYW$($WE`>*M^s{4Bz}d1C#` z{{W~?_1%jm#{t`IiO8z!mYqwtlwxkz@Q>R*BBB2Pd;L}a0P1(&sq22B`#AmBT&Le} z!|s-$<%x76`C;AY>OI_MMuPOa9DX_u2dD^Fc5)m??I91P6IpW=R!#KU;(agF&(Xb;6h!7#d_2-tMR4C>D0FDfTF@Ri{RoDciR@@wq>^}`T)J4Bl+b)3)7z62sAF~bm4z|Y zt;-*tR)3|CSlxGZwVn9_+TmnE7?n~=kwzmrXIw{bjJ4^R*%7~Of6)7a`)+2AVP`8w zj)zh@gH>R8`EjO~Gc5Zw#lQt}#=Oq~{j$cf7#(aR3Rn*)8H{bBX~~F@50;<+7_s;9 z#+w9uz%E=*E>y=gIAivaUmQ)VUVfBz1&4XwZdTWK62T?4y2)%I)8=+?zHL>@K3M1N z-pj+Mr>bo;TaB;MJ)3XX_RX&H{bGj7<*vkZ^;$`YrkMp*NL+F4t-n0F_1aD`;S=>B zT&H&IkFeT7CEdF_OEhsTMj*s_s64c%3?8yfCfk*dZ``-nw)xw+8eP6!R?8Nq3#m_> zH@Bw(FmrG4(T)9J?ESLV@Nb(WM&E9^Z%*de@QQj@$_L?bm>jXurp^zsr^_|@S0w2b zBzV%E+-vOSl!;;p4wFzhV3fkRHKEJL8bv}WmIHG-;lpZwO|48j8JWDM;#Ohe0Mb8Z zJnyx)_ICYwjY#^f5;o6gH{(gl`N^oBsJe5D*lSdxYrD_^kQ3iGK#=SS3vfIFjJhEEC zctssg*-Ue5eBb4*oWzi1_hD6#&b1)>uo*s5YfQ!vHFqn=Z!^XEij2$c0}e%NGgO<- z`rLNg{{TXGMa&vh>pn-La~V?{z5f7eb?u8D$6x$x?AJQc*8Tgj+y(UvmioE6>KXX0 zaaw(yHu-Y)f5&!f@sy-Hjg{VZ*AdLUQGv_ZjkVfe9Jw~@+g~vHtAmzQmwm8lG)Usn`KP@^~c=6A*aiU%X>`tg#tMCvsdcEaZnHNh78+{Y&;uY<-=to>ZNx1LRhw=M*8 zs3~)JqPke|Me4&D-GROO|0 zDgBs6=(n{bqOf8(kbyuRJaEYDHkQ$Yr9-uTCeH=|OzNX0P(d}I!C)~O3FnCmR5O7? zo)$zqC87yk2&DpI_Ub3x7ZJaMkpnI2Tz2iGQcNauBU>aZ zmV+hHZ9XSRt~2ZBRqc$Udy8_~Uij_nC1!(GwdA^0YJI?GgL}>jS%ja_F4j%Qd4~NX zFK)6)b1RYM6a*-*I@DtwXDzju)t!Ip3t)=Rzpp(7MOo4&L_tAaG$43oi_>gvhaY^! z%RlXSo<88)nGGA)Qb^Cs%x8@^vdW&F{{XPRsT-slpLgC}Kmk#vHGt3HcW-W+zo-nivI}USPzga01jxsa z7RY0dy8i%Ye@?j5{H@!j;Wh2Rhvq^&jIlGi>i{wMvgeF#%UKZno3_hy4b{wxc|AfT zfl9apX&JF&m$MVk$h<8!`@25VHKB@%rASr*N;X=mGC9_@#mZ`5)F~rg+`L(6W0)$0 zKh79vBM(+R*!4sGBkWD1dy8?p-EGA1z@Z>dRgj4Ytw>zRrWMVp=+b)Tv+nNOt*rN( zs4bU7D&!&)QUK+Ry6tjy&+M$sv^1u4&-UY@R6ypnX?~Mn+88zd?fq<$%z9whC+AJ%ZN@Zorr9lH4_1tS~JLW`< zwaUHRpW#rW!yLMCr}=9?*&*v?L7p1OGY`Zt94HndwaWlCcQVCkGw0++KWM>)X){@G za~5sU6jLabTkOY|{{SH~*+0YTzMRKeGAm|!g+fTqtDg@6jy-zq@f}xbJknMMjhoYA zvM&$9-*z0EYx80*y5EUfCumP1cJx!-$XFM3Mq*j0Ie6!fXX{&ZkDL42N!wxuNDYm zwWVk=Xg2bBXb(TT1UhBHN%5#|9C3Qv@Qg!d-Y{y6$VudK!}iaVdVUIJx+_L0aG%QH z92lP*3oJ*=V`Ea@gqDy0021AbkFvDI&G()zQ*rYM7rV8%rMBXi3P0UlAXfhX%%czY z&-`$ch`P+hDfMD z6?F!sKf4nujW5J%YB^$vrX3Dv-GT?W4K?!r01N@t;7H+sI4Q5kr?(6`Vu=_#f(c|P zBK}GIO_?1rKd!4M($O`ChGHXp!tluPu6Ucb1|guV(G5B+N0hU;HEyexGn><~CN{fi z5oC<%kP57c5bGr zrl13jd~mF?45PlLcg#Bm&ej`yi8tG&(G9wqvMCv}Q{l%R`^eHvF-@mukyy`kf_=c% zgl>N>HaXRgTyx#BHPhy*SDPPs_a|^2zF3?WZ7|HoOez8XY?lg5{{WVI`&)*$vUUZ= z-(?N9<-5QnMGDLbkmdeSjb^`=n(1Uq{{Y(i2mb(GP8xqkPmB0s{{XM$T>c+L(A4BV zzY@vGLDQ;(Q0su|oApV8_Utk6GF&OrIe-Z`XA~$y6%2mfIJF)`H5@!}5#(Cs!n}`O zxCA#Bmt3JW3AG|Q%!T}C*~<#W2l-f~e^G@BWP*V3%ZG*#dF<}xU}bP210~`1j4>Pn z7?(nj?aVJfeh@J%jB8f*0pW*0NiGzU3j#>az8FBq&P^PmL~^dJSjeX@4j5J$Gj|5! zU6`^n6I$pT{g_5_+V=kZ%83fga~v|sY!L_=z~)70DV1?M2*gDx+&^^8O-oSe~L03u5RFF!BKvhZb7|&UT`_Bx2{{U1QXgl`ZcmY(J z28qb(hbsGyBgV{oyk(JgeYdOKHW5a;$#X>lq>!ZLOlf>D>E^p(*_V5i^WV#L6^t@Z zD#Egcd1RvTK8YU-kovH zTQ*;(UrXOY?i;4&r2a2THCofC)J8A%?-#F5pUQW0{{YkO%eYy!*J|(LW&)xsfUKYS z(v<>n1K2P}+n-G1y$TxQ^;%}7H3HQU)C}oC&lzd?dN{_iFu$lVdRw~_Px*urH3#A~ z2liuK96j@uE>yMa+wRLJaCes3w$Qb$oI-o5a2lGSf7+%yx;TzL*`1e{-;&dKv$VA;BDU15 z!!fDXOMm5B<6Wj9P5%J0%eUP%;k3QWK}qeR)0h#XD=*!J*Us5#*?+1+Atr|YSq`dd zW1mt9#_@sO8F+HTN>5_8FC_A6p;b{_&ULTu!IG*sb8i9uqO>8a7Tp4+a>>|K{@fkA z`t|<+H9B**_)2XXipd+yTCDDJ}l0ZfM+C5nnb^zi0z5R)#ERRX;* z2#?+70>$&8kc9hAD@n^kV#OlXxIN#{w7UjYJ04J{Y$rg$BJ)?ED4+5fx29hYR@5qk~c3pL|73Jyndph>T zRyVtYw^>8C+sIfZpo~A3zG6IBoOAu1{{U9AU0$ct>;0Qv&5$;`WyR&%TH2tJc{3-H z^UoYTeK%_KJG=Gk*Ehh;&u6*Wr;cTm`l71xCy=9z{G@Rh>+I^ic(S>=yEN~YF>CGK z;+Fct;b$SQZBtcgO>4=r<~if5r+<0N$NQgG_3g)vk=H%rb7OkY+(IXa0ajC`v*I$==2?W&TM3#cOQ2PTKs%>$E$n%YC-<#G>{pde-i9 zC;67VLC0pB<&ww-+ZcD26@{4Q#YQiX1a13knO-;p1DB}354O0!YFr|NdQ&h))e>Y# zJdQQSVP}+qmMQkdk##TT`C5dUDB)ak_H8xWmYPh#yHwIDkS+qObTTZ0gag3)Fz;@( zdQwLh~r@y(#&!mV?n3K7~bq&BBxlN=@GICy&p&eY+WY*VcH-j$YaAv%^CFi_z#lMwF$CbBa z&n=`{Y_~gjFQc%I&`s z`+CpqRjkSy9ouAW&-z`&>jlH9SWro+b#kf4H(%P8{{XG^R@&o?@<0CD-G7|%uMzff z`|;cV0FVCwvp?PbDmzz zI0Ia63JKH)w=fN6OiC8Dw(8$O`vBtx2K#O%F^ggH1b; zm&4Ed3;^7P=l~UBXerF%O{IMy+2L=TyqR@8Y>2PRP|rG7wS;y2bSUAb&uNZsV^tH9uf z`GqA-Yn))`Tt;%!Y2iis>$O|%TQi+Ltkx{k7?jb<5J!$x#P2>!X_&=+k?hxx-}Vzv zZz|is&+Eygghnx)Ad$kS6Snfs5%s#P+c&~a!p12l(%PLMmPK(G)hZW!ln>?3mBu&A zePp>=Bed=NIGJwTOFXFhbu&^hpwJ&o0MDr8E0;W8yR^DPGw%JmXJoY7Se1!XOwzDj zT4>C}I_JO)Z!*hmpskfA7q)HN+oQvC@J$OSL}n^j06{vlT4pd>bDsk{wk6-78-H|I zi)*;Nv0N3ZB!h#*$1MK<9B0aTP~v9Ts@q9tFP^)LW88LK(rXLof=ZrcWv+)qnmQh8 zM+|lAwqwrUPg}|`^rl|l3<+r8OLt3=w%_f7Mk-~FNYb>Xs);n$g;yM(XUn(i?U{yw zF2%D(Osg0!+#J=j@vU)$jqJxLZsFe|wt`l2&X6cSE&u>!LP0#vFJCNsZy9ENx3=9KX`^L39xpT4y_65czhUDEC7=b9>t z06YN4rPHP(hr4Vm>1nx1aFW|VZVYPE+^W|&lmhi5g%^$^>}~K}8ryQW?0v-?do|p# z#;Fe313$6}&w#E1z-{8>7@=0? z<&UvOFJH@lt*&-vS2GFjrI7qA%+&UpH6AZT>f4+{Fimxe_x1iy&_*q;LvbK{nf_(vpQ9O$8UX= z?%268Zt#u*RcPP*tf!7S{;!vJ{EU~cKZ9MuRj=X{&(m6;9Pzhr`zz~zq)S8EVr`x) zwR2ZZOn`75XmPH(#|8V>-pk<&1@7muUzLVJ$&qNzXv%t5t})wdt>x9(^|kKTGs{D? znj5QBxrEhaT~z7ReYo2%2Yr2RE6j4|o&=e5L-+pd0qW`*W_aKLFO>R_$G|&`zsrZ5 zYf-m09PF_yw;Q$Yg6kyWBs>>PWBc*djA^W6ZgyE~5|1=t4QZQHVlZzmhFYt}I_a%& z!6sMIKz~x15UWqW2t2O3H3pGf8istRd?|wfWOK!MKjunBK0$5)^1u1VBjPZ;12RE8 zQWSBfqs!5}LEv!Z2AJnU03C4f9jyThYI6QTKNyAqv9;9L9Jl5@6 zmlg1?5G}3LC?%Mmbv^XKl6TUNO$zE2=1vTPkpk1o0QL+3st}~-PY>aRkb2g8t5RgQ za-{L*542#jCzYDlcCOlQB}(XUvZQ&?e?1N`+gwwXB?OU7fuUg{ky@z-8QD%4-FCYj z#>QJa=+;YVR*bL9#1p{aRLctPe!$#2b9}bB+b)&urhoZMonRGV_#cid_f2`D^*>wF2Mh<(-eK_{nYBT9_L9$O_oUlHnLN52)fcGp}UxRN>WG^1MRLk{cMdTKV>g--dKrltP;;_3h}dsRG6zC1v6u$^~Gt=l-FhLo&Nf3 zmAkl}4WX@q!E>!frcsr38h|-aV(b~nUeoTRx3DXHzB7o+Lp_;QX%a}zl2$@b9y#G_ z*@?+|OtUWe?|Vy2$-Y)OUK^)s%`1nNT5tsAMaL&*`K$1N?JEZEUg8mMF7~UYr~l=Z|IQ7O2?4n0#|qLy3%l#9gB_%D%xRj$tmoTB2N8BWC9FGR zysnTK_KTW7!tEJRvW;|G$ zViRi%-Q_R6-MMn)+_^6Kv7?;H%M}$4w##RA-+LU_^fqnk#>z*`4P3MGQh`gD@5DWLdy{wiw6CbCAm?Pjd=Xx<(x+nH@1NMyM>)A`Ub>(@LR zIr?|XPUJF(;DuRWXuPq=b&%-vcFQmu*@^3))vouP02eSoT^N)O#7CJb0`VjJ@zthl z3$jYi_BmhESlSt5BU&+|ig=C~(!n+lf8HC6HxpXS%{Jc>tF^p@kmi(TRy+vcFl(f- zmj3`_){(qzdi#2Xk%BcGQ8M z@X*@}-8Vne4goR3r_0BIG}ZQFdws4`*Qcbz zG5YPg*vH&Sw(Z_n;sQ&hT4^#9kx|I?#{GKb&ELN`RQvw&JA<`IgfKR0$2~+PoorRsPGb39cZg}LIXM0-X8pxF>MpVlKVpO_jrh}dg zn5Zu^&ww8MJf0E|U5bXTd}+%LRP7PH#kvHFcLtt}G!)2cd{<`vx?1h}T3b|mY4x>f zN`d{e$AKiQ{K4%4z&UH0|5%AsYIS^Z!t-ePIT9?qIiOj!Bu-?zTKw#t`^729?+ zvPUkc1Y!A|O;T~cUbw`bBbVOqzHiGv+-`)|*OFH-%s$M&c09iS0Qa@^9Xx9zM(wnC zHY*6SsE9HD0BbyYI!tRHFZM2bHowX*yjYuQv&=*|c)nP@{{YguzvKS^-Bj7gOZd+c zy*hw#&-JJFdVh9*yJV7A*J)ZtZOP!^!n>EJP@ zGWqSZw%$Hj_i;@VOp1oD8d2%uczdzW_I8%Ohw5o&t7mCQ<70?5brRG(Ir6SG)5FC3 znEjP6tW(*;6y*&pWROQ6zW_KJN(3CZ`+DIFqi^3t&nYxpc$tSDG{LmuPvxDz*jHp* z%@=Olu|}=Id78NcslSFhdvEq(tWGOJwbrqN$2O_^F`CVK(YKTu4j`f)ekTkTuIrKY z2t0TJ_g4rz=}g48q_m|fSpNWa081;WG}5)=0_Hz%7#nAF(Wj?yP1V2r87czxC`SW{ zunk)qdzCM@Qc}Miy8tI&cj6u+6Pqt47-|BIQA~|RF>;5r=c|W^>42Ox1ofsvjsWlk z=0$uC41)9?Spn_92%X}JEpnOyKu`rqCy*RTzz)I|Me>e(7*LM_4?HVm@-TBsu5Rjw z#Nsb@v*mxToQ~dS8li?slnlx#BkeTAU$G~_&cEd4oY$!txr*JE)Yn;Z0+2E~fyC?C zcA2p5nDCB+b=s|Mq-%}TTM;Wcw}|LvkBQGqn~-E)0#S zm4#NZ*12;S&l5OTwjBPqxZmx~akN>iw-;$q6wvC+Jt~zRQ{#<4R36B*?tR9^UJc&X z@(a6$tJp#dLrZ5&T=B&Ia0 z7h|BP6d@3J@Wk)-e+iQcZJzR*Tn_`>ymRi-micxSZ5+;{!z?W=sP@MzL>-IU{m-#W zrtz(}D`E}1`B_JdfRIKV^`9!%WeeK(w~=obTSn_5&vRix4AHpK>&bx`R~4qxl$f|& z;oY~pBQ3_=KBk=vcPl9^RXG+1`KgX?we>yuo?G?y`q7=g+c6iH=dNIe)nhjeaT^A3 z8-pi0^UHgBt@vr%x5>CvTFD@_k)=&U$1I>1C^#0abMVJ!{=B|fPRw{Y^HYB^ z{{ZApKlyQAq7T_$PmnpBbhyc2oa=yLo&8Ci9n#VPlB9Zw>!_N2n5|ALweqcVr`d|i zqmq0}o_zh70lT%8j7=1}9wsgnjY`>4jm&#+slyW8`fxLGJ{?9_CxTS>?a8FL5kLz_ zc&d(mIE%23Y+a{)z3vd&yB$(DnOB0RHe=9XSa@$8uiN`)ZEeQSYKSVcR$GUssUvW! zH|!j-I4iP#8TEh(&!uaF0y{iW%@ajBEU+-6qkzgsh&f?onZ=KGeLCCsx$G>VHt6p| zddRN;ag`TUTqlkdtCH2Taoncbw#jd!OL;By>y6Tij?I#qu12_WWjwK77KkFu0GnHMv8Pu9KHKj%O4FcRk$V-6pmqT-(y>0=#wG(b}AI z(W?(*T0Wgmb9HHbxZGSkw-*ItB%Hl5=Nv!Hj3Z0oVcczP=Bh}F>n21tb?J%PW?@p{ zOW*q*4ayX^g^jJFD_gr#zM4Oo%wnR1(wLj3xK-NT8CK);>wK{87-EVb_VNX48oeAtpp6aBNn?yuMKW%g&fmMb+?xmI;pQby1NHv>{~`*7yz z+pj5o<8<9FZML4@+qTuWxwVnvnn+xeGsr+jHS+m>8je_*wB%iO%#p43?_zBowKcBi zdm7zt$|JUleIxSBlmw{jt1P)cKRh-bYvYjJYM1eWJH8n+jjf?%Iz%dZOz5Qnk;CwKGJ!6aHyK)w)XdKp4{#K0F;|Y&fKtjpG=aWsla;% zJpS%>%fF{zU2q?F+gj>NYnIhPD%;yEbo0pMY8-e4##h4Z<*shgL223uvo4bYp;`(B zC@Q(*r(9zNv*!NTx4PbYmFA&&q;{^Zu1Nc^Z}@X{-0ayedwR0BsQgVa(uRBX~ zwCti!QDk#G!oP(w75nh+-nv@L8L}Yaj<-z82AIGDD)GlBT>h?$KezZ2$|y+T&lJ*- zP-R|tFmT%-91j!3VOV)0ebKC;)K^_dRbCY*#}8AQ`&=nI?{XW4HtKa9Wv5}yhav38 zFWK()p0VtGe!oa!%55o;rFa@+hHK1@zkEi=x1fs7-XX#`)qcT`ZcZcSH`_Z~`6qRo z@?soDvS>U3#+p{YU;UY!k5Mrr;wSdk9$quGeJ8dxYrA%pvbRyeVoDzkBOZ)=w)dO< zRo?Kq9*p^uR!G;~<~V(vX!O71wdD!hu?M=6Mj1yNAA5O6?Z$s!UR{58ZY2EBUV~lk zQX(2jEQL^$kR_>tZJnC$W}4+8x$Jws-i{hUM4=@K28SRk(e`fV@BS4PI(%RlTc%uO#0Y_iE9S;X>uGcg* z#B@1(@DZ(EVO||i93bPl_?I9!;g(Q4?cFx}=2B}Wm=c{>;`;T@@_*Hq*Nay@ziqX( zvA2L$vBZjN!n#KzjrO^ssTmXhAj%5b{N^$YS4%I^Z zG$*Oc--I0Wi{`CU(LuqGa6xp#HDU+zWrNrpOF6*}Q5=Icbta;oBL$|IS)-i-Zb|bD zI9$g?m}SqC`|*|j4bSKj$_$%yi+K>ts`+Ie)IYlpc796;#%Ke&8Bt`2m6b~kO2dd@ z$l-0@tn#_nX>b*|eKyF~55W3DqP;7_8Gr2lA^xm+KY3@mSy~&JESN+oMJx-S_C-z= z?%wkvwd>cw8%eBgA{TqD+&f|>qYQqcnd!lpRM1n0TrR%Nv6?s5XA&Z>_rBYXPnui9 zy4%AdqN901UL=qx$4@53+n#8X9uapxShhBhe5TZ`JXAK*iWR6I30`&UjBM852R1Z& z-|EKreJ!faXrN}O5yVgd)6{x?+&}G+n3CE%E4*$enttG(0F#j7+{n$Lg+By-Uv4zk zS>&=WboyJiUBT*3##y2oqtZPjRvyhv!~8g_GE-zDc0Sp;?=o+4?@`-Er37q{4^%W% z6dJvqFyz5)&0TMM#w$Bv5{WNLd46TlV%7f60X0Eh@3*aJ*D$Rs{_H)k z3XH?Mdy@8E;Io#>VQ^4Vsz_~2e8Bj7G0WTbb(LO~8N2;N-qLp2Vu@Dmr!YX` zaa;A_&+HR_j@H|6g5vek=HZ&LtR|&E;MEz7EhhQ(gK06Ep6s66?tbQxCEMZEX;m{L zNFofs;v|aU&Wms4YqhIQ?_utncJnpVX>A6z3T>hpC|-41*1d7O>AJ6Ll40GR-1=82 zQbER}A~9Or45c>tE#_Y?mnNjLjVqU2Ub1{1XqLCPA!%`?>yoZu9;BSHq=_%(5Az;1 z;m@xeKU2%KjK9r3)p(oww>8&FP06#N#rF* zh#r(I7YifT2>$Zidz$VDW3;$1LFuwgv9QrLujXYvFknc@?=0ntUox~(0(^~HSHR+I zP>W6baQQ{srMQ#jRjQB{B^A1b!7dJf-6pEYcu;5U!Lm=mavlgKZXg9cYP_*h@B;3g z*|*wmR(3MJyWdb3gaW`TanyNLd17rV*(Jhnw!5y&wrqC`7Ob;d$*$3POKl>95!Igs z$ony#+-0=6;h|dZ7W9wuQ%m6;l@)W?J+*!`1ZZ7+>dMt+r}QD23rd>J$kB$SPGvoWMPB zdeg!WY1(cE{{Rek>vL)H>}GjkLenZl3)Kfc9C4q@wfwCXpHvnpZse2H5?#!)LS!1! zIMpZyg{2xoGtVmGy^Ax!t-kK*@8<5!{Isi_c9v=xJyzn7#JqGb7jNH!b4Q4h+q?DT z+OIAyt={fqu1mm5m=PR+jLOF#m8M*9_?}L3dQa#ZJa#8>^sP?fNi7s=bwwQ?(W;O4 zrjg-dlJ4() zzFk{p#}~}XKb~$7#4G&IgSP(w+ZuH1iFT^{e9isjuFR}2&hVGxFf*^L*IpKN!418&)XX(ZtdnhwgDEfD>LUThx|>)-H6|8 zM@E`+z;8uww=b45gpMJqTAwlNq;ojp)_Ye@+#O3xSv#)TmH^4OqKN1`frzPMKbTh+ zyqUr^`lnl%V1sJ^H9hUqvuclqUJjU~RmKK3zeHMfd zFRLk_%<@&K!KKd0(_dMd)soUJK!Zr40*5XNC^6K5F*_9pDjMWEVz7~R2qe9M0H`bp z13HDz1-K;>db$3i-uso+YX;t;+7n&{elNcf_J7uDT{D|b*`W}Y{{V<}AKi$p`sW#? zO*AmBsR%^_$`2e1lOSi_EE9=fI?{vhIGbeoYdSZ-29vmUc3{6WsORv%mp|Ew_n(rz zJ5Pg?#cg>F1BoN8LnCk_okeMjl^n~T2y4F0+hvucLdhf6r;dGjVlP~+wEKI{8~9Me9$F`fGV0EYAL{$oe6oyD|kDF#r0IR}eVGArYbx0`&qxH*#7AXvsj z5zLMa_Z(KfTJ>#>rDu2WJ-qUvqa#;Kaw^;@jy?MEv*>i*Sh{xacWvvnLj}~DF5q8G zM&FB0Nk_*hEpN0- ze8W$yPo@twjA|$C;f*@(HMP&(efws=fE}YB%%&C$2E&Y!=1dH}RQ zOTU-C;Mw;(ywpPmO@6>hb zsMz14e{HYgIqm+l`Dkpi%KE)FZ}R2$;p87(zDA`NLE+{j@51*y7jBlRn#3+j{;aM_ z#<}tUisL)ARENK)TI(WfIHZoWUrwu+fv$KaMj_RMZk85%L7*tmpZ@yx6*8welu54DjCB3@sR_{B~d7gHuXJJzHqdRKn zTt(JT0&Iq#>o)ZOn#*8@HG)G}Ss~O=wrm3DT=*PEGr{{xX=3`X-19+nR`duniP-uP z=gos@9Qt6IbIDqc19?zXn;Zluv;5_*NQB7{(QQv)wn zjyJdtp$gBqNUKw!bSMLhXO%E30ULJRry)`ZY~eWvawKqlnG87s6MWpFutM90@9eA?b!rQjy zenH&AxA#IzSY#2L<1EDkHFKqZb~!tA)?*Wj*IeypM!huATHOjnl$5xi_Glo5yPYX?(TWy7W2CF_PzpJcb-rsHn>T0~(RXkgYLhX69`GmdFa>3?SsOzum4x5hG}G z8jBh&d*3j6S_7+JQzrCaoosW8W8oQ>0+bpHS(dXL(18NuaXwfb9jsupeh+k^OQ z;6(ob+mNyQu&v1U75@O}gSVPNH23%SG7c{+sMS4lQ%p(woS*4d+DI^OJDswR!jeWu z-yRXo>L<8_}%Hkd^}6P`ZqCkj;ExI%85RLLi-T*+`G*XoK?lbSFilVRA$ zZ8^zy*Hc{W5!|C0C)?^Ia%yC>k;!0ktznS;hZ$aDZFWv}zk6ToUZgRBC6w$MSWggm zc@JD;t;42n)GRlpM*sG@I^iWH1HEHzYJXI_4 z9AjrHl!onI*zL>1yiCU7Q_Evy)m>kR4nXk4@2uC6t3K`y?T+tynBKIDG)iQN zS2)x$&NUn`Oy3N)-b-i7M`qivf9-L*UQPWfIrWimHl1?E8Tj;!is~YR4-F*al8)VH zxor0qTb{XXiUr&6VXaa?!k{%qT25mZuRalEyjFd=eHq;ClUD0b*^Yg>?)AUC)dBK*Rh-gq7mCunL@X#6f=zl3xHp>X{!y&A znzHsT-88bvx=%#4b}}l{uk#c40gScgw($<{y`wj9cN8*S1~%`S!BgdqnFggYJapqp zGMo8LcP{?`wd__A_TJY7Zz`xWX#gxkmk-2orjkZm?UYY!Z#V6^3xjhVwW9fEj!h;h z7x4$z@eFBVB2rtOzDtKTPOSlAR3QaHCb@WGqD5QoBW;T3b7Mubf=N2(N(@xjHwoKp zMsv3;pCD#>{Kfo@E1m|fYm9p@w`cfNnA7~GS>u8dSkWT}zU)tzMAzX_-gik%q%Z5Z z%7@@nzz-9Sf3x4~#Paoizf6-V+cnJh3lb|!E7T1lq@N6MNp}8STW>YyjhD8!fgY)C z^wTj~5tj!#_Ar@SQf79GPloY7|) zGN18^P>&pR_4nt?i@WOMomRdJRbWBP9|~6;S#X_(>q)CH3OTkz4i^as?!y7;kjJW; z{>)IJFLoOn?Aoy&t3oPs_;6fV%U-ViwDC~4U6p>h+RT!!R8!?6?XEDr7vjAQf8=M( z6|{CVp0d6Cim1F}jkPfz+5j-L`u_kmJ>T*&%xWvRcbJg{oN;<;P{k4s2!Q8b9I>z1 z-fOR~<)_f;&-S7F5_?qNRb9X=ucovfYH-Id)w3&@W^7>xM?bUz7Srh9EAUQY;J>sJto8>X^MzBqO z&X@zvg~pXM>M#;Na4iM2j6erT$PrOq7<0;YxQN|>-s8ONl%aLo?OIJV;La#3_Tyfk z^tba^ZRSPwuC6r-ppT_a3>ll7#z>@Qn9!*MPE{wD{urAT5HH*-9n8B-a88#F6rLKU z2R$gD)C0_%W!b(b3)5Vtw#~P><}73|TdUB;8zCk-a@0zOILp_2&A3(DS@Du@Zg!h% zcWuXcmrPDpLu`svFkM;=0}xIk_0P*qcE1r3W4!jN?yVG(Tu&X;Lgv7*626g>AqRs4 zopkWUb!jJwlI*sPUi;jD3AAi*qneLe;$m8$@$#=RpB!{uZDTPIJNI$-#@iju{@WeA zt#KmjutL%p>yc=}Xs)B1VtsMpcI8$6r{B+V@^_3A+xGn6m5I-y7D8&KIJmj5EL6wJ zHM>inhi$v=%GxJvpTqWHj0SGw-EL}Pi_wXQA)Jy|opu>kK#B4 zioWUG{lH^r>}?}ACsM`gFjNEz>L#2qJ8ga!HHsCtalO{`+ji=7ZlZ|QZz*Cpdoem~ zn}lt)E)&;x>h|IY*Fx%}P|%$@P}w$^{YH!xD+%XFnU!3OC!1e$MT8 zxQ>lF?z1%kYqQx)b0xOQg5v(>PeRf~W{NaY+EvcKhNR{WIpGS0zabK{D@kioo}Np*4%9M_>3Srr|7dn487gV%(bYT)4Y z4aW;2mu&G~TRoHomR3+0L`t)C*Qbfa>r<7#X8K*aU+mCb#{`D#wuxbr@`wY2sWb!} zYbOZIN&f))7~g-HJ{@1EJ}>0qiots~A_+gg5Y5ddxs0%n44b|s^?S1FgY=aUQ#``g z7Zs{DD5toXK>{?hHw92woIIM#wS7MITuZ&lp*XFiZRS7cVZ+!lHmBKhu&~-J6s?uI zK~Mo?9%4LOiNuVJqLIY?xRB#Oj0hxxU|&u}yv2 zE2L|AMJ7Q_CyyQiyha?N!~1A78EYaSIXI;V1H@xCTaDT07n?zXTAPi$2xecz_U)W6?)ZJ96|Lb? z<^pe++pq29wrJMbwfe??g~0ffQ2D(?Y8vA@Q-`kXmesYw+U(~#tr+Io4-`Hqe5dWk zU6H&Q+x^jdu-!ADGT6##aToIc0Euxr?S;*-&?Mb$Z*8N$wUj(MYScU_%=%}{^TF5O@ zWSm>eG8NFlz7lIfcn@weyV}!T61yaKw$@NZyG46Ee=+Jz%Bw7TX-L&6=FFaWCj4Tn z*YG{|t%BLi(4?YyU8ZlD9(rd*A;-YJ7`;1gWQg0Yc@}LJ@6lgTQVBea@&L$+MQiLh z?Urlh&t=&V_i3-?Q}YBvLM=Ri59I?YV|{g){uo!V8f?EIOA@cW^G4g zo)ze0UtT!Wc_3O0bLryW%S$t~pMtkqn>vmf*1pQ&$5&VTMGtnE{N&Xj5X64rk2Amh z-qyE;gR^YlNG7?b=jzZ2_?3A3t6X(`U2&_-`@3I!EOc5{z9$_{EGvD%wr*DoIJJde z)nP-B$a{JC;yZQr*AC8(`K;wto40qkm{!h8bJ77Hb#ce~Hjb(G^sBDGF8=_d+ojwl zDWe4dZY4(oLC0rYxaH<{C@N4Q(L#nhMjrW9l3bej!oQqWss%Jx$X z4STlN#W!Qxn>-iM-NhRuh;;-FRU~_HI`zqO8g2G>+gw^JdW!9pWq^9C7-Q&zL#vU` z8tZUAzh=7LS>64n=MyowwU#o>Sg~I&emL^GI=9YV{{Uaw>e^ye@3Oa++;-1KY_2S{ z#^;WuKMQ+t+ta<Ccs{I9_ui;Sg6Zy9Bk^k=qg5enp2i8*{+(R=IwB^Z#TOZ&lp*^INs(;2yNg` zUQ$mz6&Vg><2&4`*H!rYp4BCtj>#?k)Jm!)nqZ-egP4q{3ZV4F-S(^WipO?uJFTw& z0JCq>*u!pse6*3mTT2>h0jsAjAX5`RlG^dWUh?lw@wJFcw=JyJSAa;7Gcj<{kU#@E zb*)A#Zo8fe_Tq4+?0a{8_ipg^@m^b6T-+T~gDS*x{6r>g!x?_6Q?qM%;iPuA(1qIf zC^t*);F??L4PzFOf;eUiNm_%`7p%eEf9lZfJ4z(nc^j$*=4@@ zxM?$YF5e6ut(CvcTo}yH5pP;jzu{)`jLt7Vg_(Zhwvy?lby)WaBai+?8(f^|8iU6V z+JDqx$KPIC@9EaYx6$d6;xY=TN>rUq$DpPa+ng!gzTC;Wt;XQSXpvv?$!b?ul$!mR zSh*ICe(STi?grSc=ZsHp7@Fdw0xB{K;Y>NVC1^dzxwh+NWof}HT1KY1_yLK#$SRrK zea$`Xqr+|uv}gV7heZhBdgC6>-1t;xn|{f>$=u6#0XI@Z=aOa*N9ClGho<)qeYLk{ zo7-}3`@ZuHjg_=>tRcn4qcIGuJ`%1fDecD6=4DyO3w8HocUsL8Tr@U2Yb{GhApkJ^ zEaZO7O!mLR@%RUIvNh}cyY3L1RbM-)=*81(( zt;XXz>doM2o^6TsR{O4jjTWs9!rj~1|eJz$Z^)6s#T1e_@rC4X} z#{U5E`|WkNZ}n&Pw4U4^?hDv2r_@44VGub|l>qbh^TO}n+Ti;1^?>ZReW6vZ9$ipH zO8RPZS3$A&q{ar#k2B2)#}Ct`E< z;r{@Eg1rsGWdg?9;$tRCRyI6+f|xExvSViYN8S5~6WprULdVVPx8@PoK*F7N`9)}9je!E+hGwyXEa0c$jhmT>dd%Qtw~4nubf3m@frR2Lk{Sf zO+W=l3Snf*SFaqffmEQ#;Tx5%5GF|DnF>k+sT85Zh6~Y13tPF@Z73?yIV2E84Gs*4 z&mHAqZLs%6?%im`?V@mFCbbIVR+4|iU$YT-tI7iEK=Leu;~xvJ9QggXc}<|&@Uw-I zf%zUyfjN5Kf0CEY{)%ErAMoF=`A#2$g0~I3=V7FOsJ>|5m_FWqII9KaRAYCv?vdU_ z4ymD1mlnVAV1Lw4X!w)I8K!Ykx0bed7U&R(_RID4Y~`hR@EPzR$fHCtZ36(Kg#9k2hJB%{t zHJvWzMn||P(*#8YQCBX!@Nox}e&4*Mm4LMLnt6g90hE!DsZyX zuJ?&!OFM*ZLeZ2cG+hYlgHrT0=Y{(&6*ZY1yX_Zuw;wick>QO(#T$(}V+MgvFHY$q zcIwSR?o$oE)=yod&=2L(T@_+7VtBHz@{C;Wh`m-!9ojoJE@NxEseNe~OCo}yR5t>1 zJ#km;{u8g(lgcZ(gkulYg|RsY2vfJnrzWNpBqiJ%G*RCfmE4UxT#_0^By>fd30&4gLkg@ zA~_)22@<_lOP}Rl6iW5$io4)it?iagB!X!xnW(O3`y6Sezb<{MdgL?~5PLEAR+UhECo35!z??r!RqfdVN|q2?A%7C;f*`LuV3?1*E7HP zSnSjo+E4g|k^WJ`8DkR-y1C@!@TAbZP4K=|9IL?lu&0*N;^j==_G^b`WKYjb&RIAd z#yS4SPq#7Y^mofJiQBhZ`w9GmOAMq(_*f1{9KC&)ui>X}RNu;e-@T(JO!nY^Ge&AY z{B=*Yugi~brL^&Kny}t%Z-pRwKO|xS_jSicyG^EJm$R#Fe8GPYI&;I$83(+$7V&Gy zyJU;iy5PdJ*Eb42^?4-H7}d2*WHdEv)h}A;q7#F`ouYkmoS6DijYX^c;h~~ zihZ2xT8wTZBCA}6XNbq9@T^n2l0flFnt&^CN|T;d#(n(i^?s$sp*w!oYpv21jQV&_5mQ#LN(?)RGU@61*Kl^7 z`?lODY2%g?&miD`<~3%vjYPl;XJR@3Z><0ES(1=C9U$qj&&oO|5P9 zQ}d@~i!TrkqwK~O#<>|MXWyzJn{tBLW3HhR4>F!A%+wSZS*n;+``fnmyWNWUEN^GL z-7Hh)&@f{YtX^Vc9#uRjNa2aRotcx!nkk&dK5cd3|044m3>8 z2!5#3-224M>FapWL1vE8DB4dwP0QVd@~j58+&06q&vm#;tvkv<^;okaD;(H2Iu1h` zArZN6J0-=S{H74iK?%%N^#Y|9x!^3Ickb@DvQJxZn86#hC!FTsa5M|d;%((OY$^MT z?6=#B#banKY=tL#nSW5R%(E#vs(+OGah2waWm&bz@H$z_V0VkrSz-fLk;4|LLhNO> z%dsr7MKZIiUFu-6Yf+IpxQtBTxmx4yZKCEGudO6mo(9o!>MBtP$;&Njy0SDmV_A>- zpRir`e%Gwj;MVOX~9d+qab7w}q5b$G)^uAs(&f6tK18OgQ0 zBMS_Doo~0O{Yiz(w*K8Wss_cgJj<1L3(g&xuLde4Y5 zy6k^Tqq%K6&Cn!@n@drqG6&!?al^CnR<1U7doIgrmitwVR*0iZEJ&;FCyB$61nwdo z#>MQfEyT9$2bQ^b5$waVRZE6B^&$=5YlLm_TN^E%!L8h6vrXXd_&u2M{{ZB>yEWo} ztI_(pYi52`9gDY8=@RDbI$49{g?!S>&?xESj(@B4uHV~l3-0feh_YVW-pnGmWLryR z{VPN@DmgTi=Z{lvyv$BDa?SpJLyd;awPy`*-^rO%{>a1Aqgl#!?6oUn^!K?p8KZRC z*jfS%YbX&Q1A)&!yBkdzTNjHjrB`gRoyz@fqh2=l%c#@*=P$b#B5vzG&)7Yuw>Xt7 zg~X$T_da&_4j8ONds?$0hBOGO5HG@r1qZlbBNN?O+bd0VI=~KW@~~gqhscpr-F~h1 zUfRYZd-Hb{qQ`DE=fjR1KUQ_$-P>!u+}K@Tq?V8(u!7jg$oh%+=qZuI#EO{1I^Da5 zUzwK9Ff_u|g6C5SMRU`r9L5?h&@cVZcmDv^C;d8nXXE}~i-sv4@%EJ0cJXm_t!Yg_ zXN)b4F+&;UlzND&+0kg(W$XtIS$tI7&nEtEZB%$pk)2V4XY9)iN^x%DBhTgVaYOdu z0?I=mtwm2hUueP(1axW!r$E`SvcJawC=lk1x*w+>vjMsWnvNp~5={kv@U8je* z)Pv%u93hgwCU~;}<3D%s!m5v-KB`Bzj^@0Q)O`?84d!RBu$1pqz)p zpWWk#l;}&?%SYlrb}0gFU*>K6=Cm3ec~oGBV6D1IZKf8^NsWI^n~)r_P)9d?y?0m) zkdT*gW~QAp8DZ@*R%Huk6tQh`sE0xs-{$R)!X#=E$;oTSEU`1eaz)&8%&{N(>Q_c?zl|`OYrvM(Arz=mzFhcwFrxT5Zw2k#qB~`IZZwnW#5E8X zGH5zruTC|)ix~@7670? z2{DgTl}8HK8gDTbtwCGfOc2K$XVP^9tTL+y&XvlUV=rpg*C@N~`)9JaSPGQ8auzrg z)r%a3LX(3j%nRRlG4_t@X@3^zCckRE#0W!46M#Ilr8M#bjxI(!?INSM{a71q%(s@? zbaUTJQ!UKw%uP*lP6HR~S$_RuYA>!g@#E8U?U zBk{_IRXjqt&kD+|d$p=2_r2~r-u1cM+TBTOwi4wM5>Pmd9Ro<_c${gO7<08lZbxsq zw~9OIf_h3l6hl%f1$9%6c;RVwmogsmZ82!x-r4rZPt71Qv}f|9Y`Jj*6Sr-(TJ+67 zm55&5J-D|7tYn(18zQ#DxH)0M&(3xD(V?e;Uc3C zC6s;E$F*FoCbtHe0tpnv?X13IS>3epRo&yXVz#7~uEkouN6v!KIId~Mxag{C^5fgJ?1~+ZT@yd(4$mc?w%?mLf z%>Mwx824?Php*MHH6PiK$RxP9IfYe4J|xui>5J-^jz77#GANe~>en6`-r5}5+ldWi^pjaUNzy8D=}W`q`zQ9J zJrYOXf}#b#dzhsjgoZsUMm)36JaGMpQ$>a#tkmLZk!-kN7)8n5Vn_t`8+%QeKQ(heqz*JMPq<-( zAAWAz^jivUw{pQ@91;N&M6c^0aizd65EW%KBL)iXh|IfM`WqTijL~Xg8l0GhH3-Y^ zv$=PD(gdE(U4)gO1fd|G#A{k%`lD{ZZ+r7W=9aS>nlA;Y75giNVts*)(&8Jz zbGWybB_=LPwdgSgc1Ou~4)|rBq1M&4A#ikhgW(+rUMCV)l`m@Er`xwV) z2rnesf2j8o+TL6&rB`yheG#Xd%Az*%u+yHU_v1^ptI}G&?Y*(Q_ayCVcl#?lWF!b| z+({zRdx{xyVMLE&QcoJ|ZNb`%WhIVLNt6j=k?b;2xXX z#SY&b!m0AnB5J1`&ZGC?-KuW%_iox<-^=sYEHAXR9w}IvMR+!6mM=;3PAu?l+jIe} zul9JQfD(RjRdx91#~W&V1h3QI_#ckHq})2<{h-8ajlNvD^_G=Et@M_yP9q|$0k0b4&~SygjWSf$>;*(= znfp%+04#7{L=2J=vDYD%usn3-Od}Hw(O?#puPy@!@^RH&O)}DIE0G=`-~>lGs82f<}^*1;cRRz<-Mo zY7H&Tz2r{>@sk+@HGUutRX@aGXD9K3MVUwh7cTb}QRi!QO3wv<2&cw_n8aOGuGsQs zUslytJCL(m%am79=NzBF_#9)lji%u@N$sGBxVrSTkAR$yuyMqC=fUl~ij-Z?ylvOd zb7grfQyQwur%BPotvX|`T_zlVvux%Od)!;L>2h}q`^TE$D1qIMs(5n2dg1%+c}!V% z-s;<2+db5b_A|P>F*RUQg)yG}Ts70a{GW>I;o(tfdgDb+Rf%u%njB&4hS#>=6y#TX zb&a}RiKml$69xP=)-Q;3e*O@%(c;iiG7;U}2 zOem7RR21V=pYO$Rj8{x-??P%v73ezP%sy>OSX&@dB!@&C1q})C9Wj>NwbR4blibFL zY?DMulThYIfWw;0<#T^p4jUUu?qmFhRwk~Ms3VytmMhz1+x6aXwOi4YMF^q{ss$7e z4yPH6r7i7>lv1UOd@3u#xt2VJIyKWCQFd8uY|ocas|7YEi@Hnpl z80XZT8Z}#xmz?wP}oFQ`@v|_PT-cp#|5d;e%f;zMMrPR7ET^(5Yl+bbh zUKsMbJ9nGjUdQUv&k6q8-M5?BTwJfIXaWBKn9>%EKMhC4j?b^zw$q;vGwpTht>enW zLF3@K>2g?)-JJv}86dMZqIxRkP8|HU=+`?&cW^aNEP&Thuikm%#@^>@_GC_MvphR( z#;l@u1)Hvwr3b$rk4N>>HO0SQw`Nf@Nj2@*0D6+hz$9Q~O>!9Hw(qmAY-uu(xa}>* z+9M~DL{M4uHe;?tW1{_A@m!ky&27a(&uuI>h>W99H96Oh3TKR_zPA_4r){$wuImu_5m zec0;OaPj;0&h;gj;hlIMSh&WjJN3;&4C^d}uQ8FOaQi$xFRd{h?TC!K#h^9Pgvd`_ z124ZAY5vRmHq9E1yGF`ZKpgSX)H!<&H?JyiYU{PO``JT&l7bsbsHr2BdLEe1ZDsQ6 z>-&4_ELp9s*iwRvz*EByE>Vh_TA6XooED4&mfCBZiM=>lT=cGmEx>c8IJTDdHJ2KT zi?{A&QxijfxcX&(RQ#+I96-{+j$SzKbJ~jCFSnhY9RC2@5Zc08jOiJ5ApZb7s7oKW z4-m46+55)pZL*fm-ZYVBYFUX-nl&w`g4wxI?Zr(CD*pg=ZWlZL-z?kI`s}?!=-R@e zeP>>Dp<|ya;`PxxT=0SIje+z@yI(-71S(2fpMX$gNGFf)#+bt`bpw5Iy6!I137$Pi zOb|zqRR=?xwv8JL& zA7(VMhrW1;z2CNE{*>!2%6ihNTB>89f(diNQU&OEB9Jy$i)Gvz^$>x%WnTfNAbasX&2^Xwz3jH| zO#|7>ad8deGKp@0iBX5bSX8lB9vF?S`1xry)_Ga}pY59+n2T!M?xDWkr!DgLOhJYr z_+nL%XkT!}X(x}AV+{vpv-B<|vfj4%?qW*0D;lS!0LhT1mkepd995>rSN{M}UE$gN z&2wkEx!pFQD;R9$HJUg{Iv3PFZ9#H1t|v_23GL#(hVAY4*SI!|UGmP}Ye9CRQ5@^0 zLHu#6JmoQK9Fok$F{31l(Q4Z5FAej@?)BI|a+%hl7f~>Gemlw!+IL=)1Y6=|fowKEYfWKUH&Z`oVi7 zUZst+8+;926W_=qBy|a!U=l`s++S2Lu8EFq-sbyJ3+Y%!VTz>i4%we@!n?o%Ex&%c zca!BUcIYBd_c!-N?j=A)f8J%Podzq`mQh=t*=0OpB$DTHp5Xrg%iJmS)qpfQW65dl z!RZAu{j~cdM{zo>+zxz_GU;S~X#7P+38$+&s$*`k7rS)g?`S)Xe4;v_0yf}Mv^B<` z9v37BxLWPk`+d!nR*i2ZsQifCO2~zIS3DS&Brj)0BU~9B0)nWDEz&E!$_qPJYl~n+X&NYw zGF##!PM#h(jQY!VgH3H(`#W#+1eXo~Ar>IuP-V${20Xv5eYV?YU)$e_6YnIlOl{*n zZZ7fGDR z(p@VUT7oGuAwcRliumBhLFZ+fl%o^y%TN^I11WaNA&Pw0fN{&){BRsN`hGOb9vA_M z(I=|C#?-daXp?6Ge&<`jTcYdP8fr5IH3GIz{3G< z01^Z6l4;@Lg-JiPTzdA}!%{$Wv8OfXPaIyViBgf?+k^h_4kNBB$D$5%ZVublfTI2^Je|{ILZmO350Jz-k)7x7MF&ctQuO>tu zfQ}f?ei58pJz>5@JX+v-DKub3MSsLOdqy9z3~1#svs*euvKqa#zG!6j6F?8V5r^w4 zvtqft>^9dfWz!|C)MBk|AuOZ}zb)yQ_UDZM0MxdbR&H%Bp>Y)O`CH*9koJsJtnZL7 zY@$yg%yMB&X*MWjp}9{onvQfhsbY&u$>ZV(6v&Ej$!hp7*{G{Z%jG8 zIyZMbVh&fD*0lFxe@OO7#Uyf~lMNdzz1YIcG@EdLR8iDWEe{@fc;R5>DhbkdD5q68 z`)kNx+F<7?7;L4J%SzXmFTW7hC9QVIbpS!0az!DHYHQ<6X{MPLr);*CLSErLI%Vne z_nsMeV{LSiHl*UWQ!<6*YPi=4OWVR!7Cbn0#YlKLGYIY8L7Nal`%Xg+gkW7FhdO0S zSB5iDxkwQbIpy}@P!%H=8_l(_6j(>AAT;H}8t2!l-^(lgyCQzi&hpFSq;$&}NsVM} zr#o79@-r=@v8^?-nhYr0ONyfJ7EH4|%BS-P)yqo`Amh#ZJyu-3&c4aC;Lh2*-)+@c zTByg&hcRDf7f;yRS&xQY-&Xkw$}*@`;|zew1n0ug&LgS zna2J7nf|)`Bd=U1`&(!+$NfU#Xz!E&@(1yI@zM4Ay=H6A`+fe`6T)k7Px&dc$Spq8 zj)^8*n%-iCy8w4q&pN2DJ^*8jx1HX^{{T<=EZgj~8gu-ZsZa4Y_Y8L5^>F=J&8oC% zB-atbo@RCkIp%T8q|L*-vwUl7K}ZB~Dk$=(3O(6lvkwnBHFoP2w32Yrr03R{sB&dO z-y2oR!$MgA1Ru2GJ1;L=u47YH*LN`;QAkynDubSQq`j0c>+R6^yC9CF`%tHaPi2*3tjx8eL957|bX&!96Na2UR){Stn3#&bcWjoI4BN0t#jzMO2&Vs!0hSjEVGg!ZK zcaHPi*Ruq*>J7eSuuZhAp3)iEM6)%_N&2cPgaTu!qiYgz@~{{U}o0>x>x zNo*-W46zXETZ(#0IF1-D)-;Nh{_nYN_cV~ScG2YPkTo2%_5GN}+?H>LL_aXFMGHJ} zf4qhwHkQ`Y*(HwO>M!OwP{~nDi&H{kHSg1FiCbR1q(6JV z_Lj}Ji%Umc>wAdNZU`m_k6M~)rZv0Igh_=WebVAfhPs+YGZU=NO$|nMuPS31MsmJ( zKh-HWD_h$>g}H@xKayo0*>W!ZNpZMxmAqWPQx zkeO#L4wz$O!AIi8n$KPpz4qm^?AyBB#CDC2GbhR*j$4pv9CQ>arMR{_Sd;P;b)75!f8{{Wy|@bx)-U4Od|-}tANr?c#nTuI&%-5oQHKCI3YQzFefXm^2Lq7gaaz-f$R+fy zN{Z3Ez;MeK4=G>)TIF9HQl3UKM+zAlBNGEuGz1PR!0`tN7~HnY4cJKq<*1PY(IskB zf-B`d2a&;q-EyeQ+K}vW83i8D5@H}^E6KR$i1orTgDrOkbG;h1UrQ|{c#e225YpdR zl|G!FkUtbIzN|;x#9@0%d3mmFH=UJZC_a#lj&#u8 zoBP%9y;F2T-1a2#S5K;=jTto$v{wa`rl_lq)!YNBhZksIf@!$Zq}X#$+Pzh%Bu~e^dJyQAKQu7U&^+WRDGY^vX%89 zC^*(uRr`sq9utb3+WQN2Swpdj5Pm9}e$4SZb=uciV&7%j_Hf7l05d6?yj6UO{7x@k zsTzAEV_Q2&3fsgWi1IgwgBiUn5}UpM8i1270$n4!m~UB8$3)TzQ1uzN796x@*Od+ z*_p<%msQ4gPg_Ol!i&z8_ntVQHj;JPRm~adO54wjO`+aS8<~k?c+Ii&{CuZ&upUQZpUl!7S{AGTn{I=KcPnZr~ z*4-daQg2E)YnctJNIb{`2ES7L_&N7wxR4B!+grxTWD82eOp~yo)6oYnZX zTY00qduThA&bO(yiiTD^`Y*o^>-BqFu=`#9vlGhsK(tUitB|HZ0m~kX$qTsvEG4f3 z0QZtG;=1Q59^wJr&U6AruOZ5~;@kb+y`Rx5y<7=N|Fw5&{!M@qF zS+^lIDI5T^dw4D*r(5M8cYI7O`YL(jrRD(Lq|+KBej};!9|HdXek)(gUY&EYiz~F( za!SXG5;}isW0P&(yw?fck7BaB+tz!9CFN!+L8p{tF9}*A=JicII^rEmjl7ygV_s92aaQr`_y!i7n+vCeW~r z)r~?sWUedJk9!M`0iU=OLrQ>G!zed%oI3Y6;t@JQeY(Z{fgq^BQjfDN}N#oWmi1G z8ua9FUEyJ6+BO@dxJPQm9CXyKz>`i?1miun5iPr0+s|z9T&R}WlSI*xsY;&#!^0D; z6^(sM`g><#X%p@7O7PF+sXn74kyYiuhfrWS z`!QQo>nvOQqqe(d=jA5erQ?R~wx*hK-_;<1ua zeM`s|v#g7rMAEv4TrIW9JK5h&B>5?2xl^~rF)a%)SGsJdrPzupj)NQ*>+RXj{{Z|t zCuGz8N5$C}aUxnn4YkGiKBU`?(lpATg_LJgiua1fJgOVV)b0NOahSE<<2}SRA)>ec0GCtYsMV>0Zi}+FF6(!=ZV^Xk zYX!J+L&(LYka+5lwio**?S2TqvfKsmg5jN(Orn-h!3y;ps4#lmmE|{Q*(OO$t#uMx zpa;^DK^%?;FbVihHJxz1PFg|R8;10|WzCqdwiyYaEh82m&y#Aeh8)*hd>z7m?`^g2 z9p*i&Y4U7adIXy3)T$_6B!f)xSoY)K>;ZS&7JDp>wd@zuZW0p6vdZNkLUQth$YFc@ zLBuDvb_p!6s}(mSL^R!LOxbw3Uw%$4OD`>c>}wzjQqmWJgh zw%0r3#xnI1Ga(yl63o$Vc*41058j@AHl zz3QoVJVi6F+l;-j{;{3fAiwXe-}$8dO(^fmF4p-Jk-(J#nw#P$;y9w=)`W84c;RHQ9!F|4P^tAeP=Tla00Dr*D_mRt zTf|*XZ6fAL{ulvXoK06nq45|-_nSJdr960k%o!zraP8@$k*@YxzEbPrcxm}EcopPN zQHH5a*!Mz7DYD$-lE(EoB!Y_mDt{36VIC62^{p$P#E!HyrUElotCayJ9~yFCcs2lt z?)|nM%eHT9=RjPv&~)GA3Lpm{|>G^yjm3S8C5woO4Ca?sUy&=K}vfa707DD$ex*H{Go z_wsgH%YWN8$ z5=nh&ZwIEPvNmjZ{>)x5c@wv&WvzX_&NxuQ-bt?UjeYJwIcdwQnpERniJjSZUJ`b)Z8Pnb_K9>LG10XVLR+6797krIlW%Nf_1jCXGJQqr z)GVnof#ILojIV6@m3ry4@m*_+q#k$;26a_YCVs4W8X{UDD z_@ZqrEo@-)ZKL$#1d=l~Cy6BC>#UOzJ8yQmr|DCkV<2%!MDMe_Fon?0xw#56BydrO zoHqLMWksGzX1ICXD9&p_2=`}>DJ|PCQtvV3RsGqPW91;KsHG?dH{Y6`yCf@b-0p0P zdNO)?>8)r8AaKQLaE{KYwdE$g%XU{xk5k050Hlh0F|6H%`ns68-DkM6o@qFeB81oQ z@i<%W{a4k~HK;PehK*X}7sTa`Pc_$kRrbW$!)Fu`%!Ok>ylI^|R~=Y*yG!#14St`H z<~SZWDqfGi_gEuqb8BBq$wgyIayj+J`nj#bD|GH1<8xgyeoeU}$PXGC)Z&q7i1%H+ zEmG#I>8HDi+(Tv+G{$II$f>VdRAWgb84olYtos$jHwRVdLn1YE z8i$a3h{480WVbuSa9esZO7cFUWr=G-PmVRhZC7shDI|~sRT7Y~B7#Xgf{u8Udka%< zZx~r=9L}{0KQ?kt_*S|}!rN&kYPHtXjlRRV&1#EjW_I+Rpj}-4tBwt!R9E-ogTL=h zc-Cdnr`Na2{k3+M_qS|JyIp~f2vE5)kh4yI69980_~Q+~cJn{$Km4`Ub?f}Bow?c9 zEw{Dp?Df33P|;hdsvzP69&P(Ezt`#geEk0aEc-h>xcD}JS=~3S2dj~!OlUQ)!^0hU zWkk>1{naMMFE)LmJ_m8PFPcnb=fzB+$`$_&9kc`f&$2=;!+3Mf^p0* zZdZ=(wX@#rWbb{1v&Aly?k%T_!0pCmAIr}M+W!FEJbbm6+J7ocHc++sdg`>NsLx+3 z1D;gti`GvpY~?YvcLvT&+T3ih%%{s4fSBeZg*D?zy!;7;{?16Y>l1Z*HKmeUrmJfy zBsUXAwBf0$D&82{ZNjjG7oEA?Y+;9Po_nOLBC4cp@*KR*lp#RG&t1zY&AYc?>|WZQ zSuG6rGisMvV9u4y3btcTD#@(iwb$iYj_Mv+woYls4X(kus#~?wPBm+a-~k&60j&TZho&DE0UP*+TNrHNcA6;~kEm#3 zRA*cXUB$T%N$aEGcuZk96&#Uir*06LJum@rQIio&T!9LPCf zBP>)6M!f5u9t;NKx7gpnVY-Y+yhU!bOfu&UIQ)jIlTe;I}dQF`qFK zS64w!zq=J6PkKt$#I=2gI&#M1nTA)1bs;6Vk%f|iR`Di>P@sD0BDs!uV<7K07-OK+ z2O@H=Sa~Z@SDV^{>7ulOjY&~KQ_C3pa$JV~tQ6^ZO>2?zxA*ia&Kc;+q zq*uV*uu0YU$J@vtZ%f{)5^TSel9KQPDjJfj`{5>}W{4^QU+m;K#aBfTM zMh^&;;d%lXsi4$N4>6TEVPp~{a*z+0^#Yp7ISd<}3a(3uv2b?U(8PgfX>MHCOX;Dh zJq0qtUbrga=?NMw*eda2K(D(5qihBjkF4n+a-!$`_;RNw?5|^Tz#6*zRsQ^3!AdM& zE`r4QM-lABWMuVfCt5yS!e@GAmlXyLYI14#hV zoGXS6Td0cJ7lRy)e*8FDKtp{M(UxeAwJyTE!3Tyh&Q%1fn&sCFINAENC*h?I5t+EQ zfW{C;10E!C1Ko`^?Amxm>(-h6oCR4Wk}^0`!|XWHcm88P(fFlAci8G-y4Ijn2RRP| zU09p?w(}J~Wbsc$yKm-ofZ8q0q=g8e8k6ilyAk?2uZw~EdncGK=H}`bWWL$%AZ5*n zMl>CGVE+Ku+JCOcch>oa;@tLz_--B+@u(la4(Zz`Gbxu(&IiLGdU_X0CqPIz&h}rO zYUZ|hr$m=a@x!jX)ZtC_JncRlH*nUDuN`>Q6N~lFia%`mhZ1;O;c;Ia9<@`lQ<`$6 zE6=TeZVpc*G9du6f=5sdJ?92Y)y;*az@*T|`DRMz_Ta(ItniMTwRVX?(;GzDX02L# zjvgaP-L&~fTy|4ZkX!=hln$hQ;|Hrg=Z7_e4SM$DXWBOSt*mX< z3kFgf)AF&PsABv{!;w%f+22nMs-?=j(!|t8KNOLZl~3~wUF*pr=k6=z+}`>WEYdrE zSNI$7)O4mansI`pHtD)c9R9S7#hplxR!K^er^cCA2do)MHt{4ICB39>#%r3-bn)jV zw?0(^pA1ElCn95N+_xdAcMr>v*FZ1C(uGJo@L36-cTUF3+;<|%(e8|dOsq1AHRncb zM*aHfKeq$*-Mksv{-51m-W0Lb?+k~Hz z@=0{>Sd8h#G=p06#aJX^o6miBXLHQWxZFx@gA%b1Bq{-=0x8cfxQQ~Gz0M>-%<+gl zIKrJw%&Zu-YsZdwTO`C4jdd_4fRW%%CQKZ7POV*DVh_Ixs#m5&b!yZ#J>KjPwu8H0 zxVH}5zFX@;9ciNC)x}b1kH(C=>M;CVmX@SDr*GS0v`yz?W^UiyTz|`cJ3Et7V1Mv8 z;5a;Z@YjA~0j{1TPzu3M_p3n0xlo*5YaE@hwX~l7W8E&^(#(K;aD~r}FimshWoNqY zOI@noEt|8!Wnu$eG=H4u!!CHeyFN8mWP&2vx6SfPcqNsgzLaaclJ4THRAo;{@F$ip z*8G6Y9Mp2IkxS#;yQPe zuUy|MXz!igKup3XRz6{%DIoZRTp8Q)j!4rE@Ir{Q&Afe1;FrO@RRSsBE6*zA9e4Wbb>9`-fKdfR&_p|d?f&`8St=KcfGB` zA`z-b$!SV`qbvn=8zs|~^&&n~@l(yGo&pOat;;e=5S4f_VOskz&jFrfP^y3;N9UlR z0avdNb{&d@T<=ir@|iAWbc#?NY|!bMx)wj~)cw8~igQ*)-_yytZ_RtA6(s^k9k`$f zG8G@UR%aORE=)CwszO57Sv8Oz8nE>aT)>*5mq}J8gag8uTMA}48`ZY2A2Tugu;#py zYABGX70!o%INCu`dW=%C5vZ>KbEvK&#Dv{$9wa`B)yXD42;RkEn^3E8=1dpT2e9KJ74C#kth`Z1mpK)F_(xX-%Nt7~^&&Hhw z9EEnZAs+cYfL!U!jWirTw}vFIW(tpdoc?0C)4{x}%kRM@KiYoFxaN7%DHxDNK?JWK zY3YL6y?Zj4YtK*yGQN?R9~C~@;pVgpJ^Dm_MtQuo&V&!$gpH})uW^d}Jddg^1c1lQ zS_~X7O|qFuU?PU*tOYAUpV>?+ui>`42fdEd<(^i!LOF&RQ{HhUwlJwY?IrchcCfF> z+mu-@V<+NaT@aUwL=1?{Z~REFnPlI%&# zNj&*t=5VQUylh%l&N?w>&ZW7Y7_Dn*5?-t8)D2B@9dPP|HOH?=hd zaH%BcmyaCq6RhGWixK8I0nDF%3SxFG19-C%Fjjd~mm?(=sV5S0wCld$63W|8ZyLPW z-fj=cKM|qeFkq;5*)|bwwuZ_ZfIc~8jY~ToEKND%S+$=voz@v2OnYklFQsSl%04;c zc1j<4BNhAhiM?_8T7u`dJJ7xa>XnvRCt5Ejud`SabT1OT2 zpluOKNJB4*D`_VM)2nabdv8CG7l(APG~ISdVW*c`sUoAH0RG$)qJP`5UHF;hPjLd$tmt}R|FaP_+1;Qh8J zT|@v58Z*mMoL{ffzxttafy5w~u$!lcT< zbJ<<5w$BB{{^@Zoq#B-BB_UDGDP2(jN3$6F+N&Ykp6cxltp(QEw=20Cgt0_Cv>bJu z6HTbft8d*`eZkz8)QrObV$tdcNMdxWJvjn#x9h~^9@$-XPTRG;R+jE&xwnb5rLvME zW*l9)(DcU_Z&tSE^44})Ftx#N3=s(6iDHOwL;+XdgT&!JRZi^so7tNRG&fgkb$T*e zOL8QAL-3Xci|;rkRiBkME$8ajcd?ISgZc)=Fci9<^#D9{GYv=mk%H?>+u&x!^xLxg zdS$-u%a7`tw5(b?o0r!ck)M(?=C8L85*97;7rDN?+1f`fr)}B*u=y6^WeS3y$q@bc zS;)3VX>r`Q{nffcyVl|$Nsgada>f-j$kA#PSEddsZuvhCb8q_@xY<&5XyBV$jat)M ziYqAwjh7>b>~R+~r6GHVV^*mrBb#T#3*coA%8gbGXiu4jdH&oiWd>qW)5twy=s>M< z0-Z3klZP0H(UO#af)09P5L@!=0(O$GJ-OJB&Xvu~F-(My32NYtx=DM9IySW4i6q zEoZWIY}gwGlPV}Vo_U^?#@?A29FuLmrEIsKEVnz;ucvPz14Kj$pKEyFwrM|;l20mK z?&;hc_5IEJ!*M*8;5@f6q0pn+xW?PJCGDRJe`4>wv$U&j8@tUm@hwbJ9c-$c06sX| zO{6%wZky%)>uC+<%H}PpMyZ9d8r<{OL0oH`@^|<*Z*8#2Vs9hAnmhCqm(wCigCD~} zID2tdl8A`=TXo)dXe8P%Rw&Y~B+`H+s_|D;9%|w?*8CNmrMs(tO@hx&0UrdZWx5BuL+G~x*@;BZ0n})X8?Ee5U5txG6Gb6RUl<^cJ9bWE`&)WUj9nxJiB48iXV3Mo4wI~i? zf9&CV0wvkEt9i`nX)3IqW>`T|8=DFae#{vHt?#!OKr#j=DkRF$u=nu7;3Xp8VR|gl zW@tS?)u*(N--*E_mU~&2h(xs<0iz1^VN5I&t!pF3P?0hp_fi2`c-JHE7&37Ub=ms_ z@-quXwYnmj;{3Mj@Q*3QN&}s?`r3*eS`-vkT7qfU0pv8sKx%SsDo$hGaA4xK-21_T z1UBocA|V^NAST_A{O56-p;_>wa~b~y3|;KSxIgtukduQ9+bf%?N_%2 zR+=!HRb5V?ppp%FlUmoV6-a1c5X`SyB$+rhrF!E(Tq+ve6sP1dsa7lxP(~GmO|F@@ z5~Ja_iB#A5pE`Y*(_Tq65HzhdH!N#{$VrkWlS$2i<;NM(gg)UMNejyu4El;jO?e7e z5p}d)BCTn*J?wWDS8|0Cu}Njr4FmAw(++gjK4uV!*w*%vO&mL^qPNB)__X`+rRtTP z)E)0*$1!;Z>#k<=QRAQ{l+1&N`l6n zl1NmuxZ)_G1}7@I@CMTEad?s_%?gFDI+|dyQ-!|L>f}U2wJ1nqP$^G#c#NuSh1{>? zmhi;SsRnINxK|GxGPDY|>?Q`)XZI^e=!*Bka@s+~l4uzomD~i4t z&AqDOwB0hqvFd8aRi#fn>x|`fYj{X}%hsft@Xrla@Zh?ZDHdctbTtRVpWTO&PD56< znS}{>+eta`Q%r3NsQt5JJa(xU38Si=CaXi3G~teEsM6stTf}zr4J-J8rhd%EA2Fo4 zI&QMkS5YJ}72-!)=ZUn^5lReNh|^rD{kh{wQ%|S`1M=n96f$VXt&6#&X~5wDTV<s z^#1@d>S>W!w5`X?c??dL>oF;J?>jfOTHSjCu=gvs`5P9qDnJw4NXi`eDbz91r*_fL zbc!E)ZBh2c{k^W;xKBBfGV&~hRVZjUWNVJDz2?)H%WZ7&P>J35af9kTY5d9v%h^ml zy88bB!e?&rCARO+x=LcVu@`bE1c;Q>S1y>!^=bbA+OBq6<|JA>xRjZ8dzgUZO7R$r z*M2rsv+yR~%Xqns9^Yr&BuNbsf}JPWP8HVvVeo(c*Y24VYT9Lq8G?qmof3rg6(^+nLV#<-JY%*og_OH5)t>d!Ch2rLe`tKovQ=4> z^3bPI{{U#?EJ!`A@SCvg@20(w1&f+r@TmdY^^+@s--ktCeY;J-Apa2f-4nXYu8&y7a?V3~nzOltfs1G3Oxs zTDb#UD@8}o8JA9q=mcu0&kCm;7STqr>57E&sHS}|?K}`ImHs0^(}ByTCJZQ!o$fj5)>;Z4K(YAkvTW(M@Le8!!S5Ej##atWp{77mfG$)Ak`aAJvIbT z(XurdjcuDB##$!rv)q8vG02msec0362Q|bGd-V@$-(zSj z_IOoC>V{CWfOxcI4kHG;N_kfz+P6Cfd%o4bxQZ!BZ4#|f+O?xHf}^Hm2kW!JVR-G{ z&A+g-P2y&0JBsObT*4(-U<%w+DHJ$zU~2_F-yX+jd4F**i5P2GiCscQ<3gu~H1K$5 zw{cr;6=j7@y0@s;QUj>SIOtGw#&?m7t3OsFiayxe6jT?O>duwRDvWc__jPvbj-`{d zw)?vcj@MjKTO!1)WRo@|{vZcGZacbkaqHuP_gAx=7L`3pV4iEsf+-7C#}M2wU}VeRZb+4L8!+O46Z(divOi;8E zLPcq;YF`hx1%?ZA^vWi$)PxZEJjF4Gv>J*Hc9Do~^uH}i zcn+1q%sV*%t14WydW#0&=P*6^tmX@*LmqitnMo$5nw0VS0{ z0y2146NKGwfjbnIw|9czu@b^4JoNiT4p^P7jWp8>Udwy`068pLwH-Q}j#M<~i1}}= zPkMmx1fD%G>qE*LNjeWKvl-#Rl*Z92y_2b^bR;l6DNugQZKW!P+trD=lZKWtr~nVM z8ACgGRc+ab1TmrZ0ZtfH@N&Z3%vGFZXjN&;t_iMABrl*y(E<%bjF*Z30K*SxB@GkY ztr4iIlwJhVwf1FPEI^Ri`+nBNg~KVH@x?^aQ&Bw4Gtxh?#EWQ) zjqcoPiWV<9^0c55Gw~d-U}5Why5i+pSs0cek5WUW0P9Xe+nybuO~-NV8&$g7Tg&rL z7^0+f3J-}GoLYEQHy+{KH#vkw^ob6Tk(wwc!>_j&H9D8|7Rt;nL84tMs%yvM@9 zBPi{ovHNR&j`MZh#JBgZ`dte&LNQMwMyh&qCk5=f_$#cwSxK9j8VYI&5?+l=omG~zD( zmA78+lD6r($D?mX(`#-`M9et5aPkkl;x?QJaOv zn3Nv^3FcM(Mp9|C}@te*jvIeTXl0Zv5@8J zy%~#Bh^|8tRB9g8i)2|ZR^tBvd}*ro&*Zi-4jy5cq0feN#M*Mi7jo}!y4=0{+d*h_ zBw{N>(1%E-tv}3h2epXJw$a{3Xwjx;G*wkK@ynJ8s$?0U#{-#l6+>17Cd-xzqzv#} zNqAl+(yvw}iJ>R1B21>_OfyV?D}VszGZpEA9Hq2~(y9a{O?5aqDdX+W3f@i0onby| zNlqEkhuezqM5Hp#f#m{+f#H|!!pF$+QzOIxMH*DqsB``}tYnQ`L+XSoKGDwr+8L3g zhUPWa45)mEr4KAc^9izBTY7euyL8&VRK~Az*{C^Hvm6OH?w%J5p5DW^A(rMi8j|_- z+vhD00PTfw1{F`~-_)-LI34Y7Bk6bAvYb1YF|rmu#Ru(GYT8H zi-w7-odD&6>k~!xb-w=qvfs%iiEYUFDz@UHf!}>=jS$yS@dZ1=FI`973+>%{{ZB}tFmXODa7t54#Q(T)XE@8kTpru zkfwehZRnGLi0A(Y1QX{#tabk~9L#?n09v8VYR=%@Ty zKbzxk)&BsA$Ku1o58b=;Ii5R{`p$G$NsmK?Co0t|jU%?9FMDqOW@#*U2<3C1r#86S zzve=JW(=xSCENFY+@#!ET^Qrc$rUbAgPlj44>JeD);-`|Roz->&*MNr2cD%lt{l{^ zsp$KQZ+MZJ{guz%Tq_fTpLBtgkcz^*vckcGnoYTmra-Nk282@#una?OGuAUEs?-#a zftMmPt_2vpcAce)<%~9P0rLvEyoIt zgZPQ3#m^0X6&w4pHQ=>``j(b@qk!Z!Eo)Lalh+OwLS0?BxQ(T4Ih0}m0*#pChEV0w z))J>6MOWL2R6T7YJRweGQHLy!41{+2#UPQXR&OBooUr0{7qr@lt)m2H6nk({2Dxa} ziyDs#3==0&b5Yrt(?5sD3c%_`r9CnQD?$%kEC{T31**e&48T)MX*A>;7b899Dw*6? z#vRe!Yo=f%0Pyk0Mw@Wt?4Q_dx7LfYTErud=4FHlBm>Mz=U%kMNtJD86{&3Q%ZYYfv_TVV zh!k%IJUCN4P3*Ms_(^SEirtuJRF)|LIjC&F@x#*GswO|AZEk8UAq3}7O>0bPYP}&x zX|dEl{gUH1Yswg0jPEka~#JkAs~ImuGZG; zQ>^)ig=%pbkX)*C2(<#AW;E2Gx_Zu7ojjEE9dH@33?-gd&p--*Wu6ud z$s(E<%Q2{I$6Wj{v4hDrH*yR6Wom0Kx&hz`Ic8~=C)n`RVT@Y48L9IMH9AU4XdK#^ z<&6_Y!GEO$(+x^0(8k#S2m9FvA7&=PB;H%@t@6-(^fF2DX@HGm{LCm5z+qnn!8S|qz)y8YfhBL{{XvO7o}Vv z`eEDqO}v+PjUMl*Q6WhSBCN#uiv>RoIAfn~`*@3*Ah%B0?1}e3oU>N9w2RAmW`xkc z;CQuaA#0Hsy>{5Hu-LYS>i!s#F#?bmLVzk4i%@gZhiOQM05RaApD<?ugSefd|4q*m);wmjdt^WYdJG24XjiCmURv^$&5uOy}CSvSf;oP@N zExHJU+|Hh>+Mx{bsN&N903go>+Tx#>w|9oax$OP3wcMo8*oG$F-qPMN9P>h)ZYFV^ zOJqDSXPy_18O{8qQ2}yTHl_l#Eyy)-8&p7kx=B=UBP9C)I9W4NTF!u)epeF1g$G*U z;U?YT^8^(ulC?P=xQwctiO{K51EF7MJow?lo(Y+!RXP~yU~|anByz))vQ4wGjC!rD z)qL-eENRA=P~~yfNm#5BQB-QL@WU!Ewd^ggJD$SUS42jcOp-`wq%L$d{%T;;oreu? zaeGO(d2Mec3t<@bZtGA0T!jeWG1)A_f^B`tu-{K5rHVU=4w&ub$SSY<#bd;E#Oq}U z-REa$9wvdG(FCZpQTb(?gBHaVgZp+H-HLgjxQEp3`Tqb~Pb+#%c$Exzb-|2(fgtVI zy0(Y}n`YMyy~Gdz%YIi%#!n%Tt9vkAl_H&c+%~bs{{Yj=i>JzK*$51L6Fjk<++iDO zI1x1Q7F*UjeM;*razRxnu67vYd zA)^{l@b(-TOxG^$_tzG8(B4LWGA0d9y+^!aH`Cf#`ES+P>$Iyz_^Ylx#w1^tzh6;E zrbn2d>5hJzaf|S;z0*Ctr;3R6hhAL=@yAA79>2r%39X((q62LyW9OYf4VHBB6>M!? zIXNV+YO03jQ6pr6PdWqB&MWuf8Rg!03uRFtj&>g!#@b)(H6Lac0zTpUQ*x2yksiY6 zk{;m)q)8lgaYpyx<{v2QzTDlQKDOS;e*cN;r^0=Jx+6{q&59uEmS2%T7-EIt%92E4Mw(x$E%cUzRTLWQ7e z)`Z6HMHtj(Ka?Jo#N|>UySH+;OKC0k$yD3h29D{40~rk$Dgl=odocBaC^5tqc**8Y zqH@liadYZLH;_TfI!fSY zPD}i8aWycJ#S|r&(xcn#!ZS|6(3u4k{>%UXKxZld(zK#uUTQ2Zq2 zpA2ZrD}Kw_((X3#UNe*u0(31YPFb8~dvROo)0EowBr>T+V07}QDq}si%URV3KTo#u z%FI03W@HbL#-SfB9e6x7EoD=`Y{iAdNe(hgi$ z_+eldqGlffC#HA^wT9o3m34+o%5}=%$uMBB{9k`WkZNTFsl~~reov#adBPnYRzB;wBI3ir0KnIxlMGFqS zFs(cU^vso(o>ud7$XBn9Bh^x@Ry(%tu?rc9+-+iD5(jV03N!qv26-NY`!P`bpF7pf z!?Cw#nivR?)D7TbjH|>CW;WAY5CRcs(q_luTo#4zx2-^LQj}Pu5U=^0%>Mvz#yizR+x6P4 zu_LyakxZ_{=>oYeN$3GMT0vdeEbZ)esU%4nMVz$Wqne#9@QU;Uh8EW}ife^7*9^5R zx`69lICv#4P3m8rlG$T2N9ij^7|&5*U%VV?6jjULC4fu75F~(G6sDrAIFZm{rB>XL zp}ruwVnAZq^XXg$Ugx@6+(Bh6)LyKSD?u%I&}OaooCe4Hn`_vuJBIFexSK`65(`+? zi>0}0=ZTTY+a_~POkn(RUOOunZFvf@JUL?cE=^pv;P)zxaQZ95 zQKfSnFUs=mNPF9Yzbiz6Yl~v5OD+&CVNGE#BuHOs{iw`A@ik`ObslC|`!GM>mA$35j9u2>X1?yj$JeZP(Gp+kNslm1AXUfaGg5 z6+TR}!FXJ@pu3N>Hwy?x=?&x?p4Q}2>ITxvPvDX!qpM;z*2*xe%)ra*I};ME3}-by zIrGHf7Lb$4a2f(xVPWKyR8qW-6y&mAkC7i3F`5Q+Yioz;Eme9&rfb9@5ciXJ+^m_$GB`ycXKjBGyqoJs5G9Uyt-lQ*(?*9srN5+ zO>p+svtPzG_UCSO5WGoXIh<#|U{;Osxw+F0qXN}qj;DoqviQ>(^OMMndE&X1ppXY_ zyvtsGJh8U17Q4Q8EuPZ@LP#^vX+)+~;Bl?r97I~pw=LTHaG%wfmZ_*yS^~UrjpaBQ zv(F~qeQ$TFsi-S}Ddm0{;~%lrogIHiyVJM)@C&-FK3{pb^y4W6$JU4*1UDKVZXed) z+euaTdZwL~4glg!PfT=IB{=djojDp)K2;nJ5W>;gGex;t$*@d7cdWK9c!vU|YmRRG z>wTlQrcT{1m(Rc-l(_!@fd2rk=zKr#f0r8j>-lhgjsF1r;r1n$cEuAFdq_np1G3cT z)q$=$Eozod?kbBSmIHwSmDAZq;e;@KH?6Mui(WviTO%?tg^&J9rU7D7-rH`ykrvZ& z(`ywyOLkG8Jls?tc)^-jdj8|(ol@G;NRXO*&9Mxm^88qbs(n?w-f53OGz$9)=oWCe*7#EqSs-xt-U$wk%v$4{{S3D(BU<^sPjOh zh_0?bZZlB~^H6KKfC0c$`|txM;z<;(z1%G7b3nB;`*5uo1H6lg=Z4vHU<|By3P(T> z+Sr;_5gy-i{$kXxfWeU=#oHz{)gvCXG#|47^({8lITv$YT8QD(0=-NAml+yen2uzV zg9JzPdtho;KBxQetSle5+bo&S<%5tE9ZALO4-alOmKK(BTolr=DQy<6+AxL;NO^>f{sD`Lr)fFQ$x{L_?%_NRI)@sUpdc=gm9)bFk)dX$#u=8 zKAb%Cpgv~z^2UEAerY{x#J5j{e8-kU4&FhBh~8chqw*tavvRK?_hM`@s*1oOQ%TH@ zR2d9B3iB}zA_Vlyfu|fWZfKn)4+$$)Aze7Fe)EN3DJFQAM5oJI7gA~O<~{hR55SUM zO&zofNRfgpYw@!jfcM~~8bzhX-P(3*U?LOlQ>||#jDi!Q20XDdTSY=ocK4E*W}qB& zjziy#=D0y4(b;3kc}JbIjI?J?9y0ZBK85<*ZQ|wKxTxhc-NE zj4jEl{oAxz?`kYBrJC9~nG44Q4N@ZJ6`F>Me-REQ{sF*Qn>?eD6Cy7srGwdsihfD4q#N9=0e-bjr zr$~^Hb2;fEyp9(K+HG=6>+dLx{#hc1DJ5W3)`Xn`zBnXdc;ehGeX-p= zy=icksdINYxn)*+jR8Y&1Ob@o#}8gBU3)e0mWK}MZ*4&Hrj8n1QGnr>1C8~WYidF{ z?d4j;=;J;N3H`Ws2t?)-T~w_pLGb`bOeicz-&`%UMp8+UzfDa6sqn^ge&yQ-JJE`w3E-t0AEY~v07pEFjQG&^lVbxAB z-*3X?4c|M{StN_KX@Ma~l_L+FkiVF{xIRq2+(t9yq~S%_E$w$r;XkNI5m}L8j#{W? zEmmh>a%yttg`~!9E%wiZ=XvhOWZX9!PT99u6)4Xl=tWqSa}ig}+-s4>lWT<7%=?t? zVPcZz-d~uzj9mHj>2!RMp%wDbbHYZ}p6n~0*%#)+da;$|nn=x-=WgYmCgG&O-bY?$ zxLU%Ne5I!DP4~1n%gY^$a+a~VYl6r<7d7MQ9Z87Z^4B<2rrbAXlHu=f=D8On$o9s9 zFvQlnMFuAA!a^;%C^gj(nyB{S2_BI_{IpO8S+5@hPYgT}rDH>HGOUQd&A{o;o(bfv zH7)Exm0$*vWZJU;^TW8wWJ)T-Mo9y(_<8G3jb zrH%nnJj?4Wj+}9UujN>??AuB1ZS3T> zaGA?`(o3&dcB*rw58AuIKK|UZ; z3=lN)nUr8I4aZ(zD9!KxTR$NIK zZbdb~`X7rSp;PT0F#Mifj_sO3^5DgF`0c+59aFFQaR=oox9*Q3pGmaJIH)>nPPD~K zlFCnQ?h$2hS(<32HLjTmRmQkL7E#Wm2sx<-d^L0IGji0e;@kWpHgc`sFe ze!1Lbo#18luiP1%&>1{@RMDyD96|RSD{08CTSYb8#pGgKW?a+m2RfdAW+N*tB)Aev z7-}*KGm)9k`>KS{scZ6}eh@HPFyLit zzJWS$6!F25!XMU?biXqnC5$Xt3*;M5<29uQSz@I~-q$y;!4x}BllsIct8NJsVQDywJ^b{ zTFx`(oCBA|A^Y>efMiLvvC>{Q{{U{kwBl*PzE<1JRy3y~04EvUe+S98fD$~5;gAOr zgOt#XJy#(@@KNFR;%wv?RB3l<#{nD(7(EL!Iq>O;`Bp|pYo&9QjSqnR*soYwchEqm zQ$2hbgZE+JWx;80TIs3lQ(AqvJw{$@Yf=Cyz;Y*t+k+5glfp>nheSJxG8)R5jF36U!B9psOVcB)Mv8WukHc zM+_1v+Y-xfadXB=4ul>&Ftrd=2}Ka8$v!q8ibL^cKFl){7;R<8w3E(J7 z&ZGnUFi0qX6$3k(A`deh=rG7T)Bs$oueA17?A(P8BeT|+84Os6e{XNDznA|iMajv8O zD9r);4j4t*n|T?nuHB=7kH)!`Jex`5L*cvUWDs?Afx%{L%jaEgPmezRzDW%gb)9 zxTuRO^fyiO7YPJZW@#m<00H609X}3#6{cSA{{T-f`vwic_eS32iXTeeSE9AF074sBPG`fkaGP{jS&|+n%z0<~_XSukZO>SMLll2KTsp@*y7~Iym{FUgXe8iam z$arADu3XDCV^E?&tIkQG0-S~&6qUD)nymUj^9INf;fEnuaA5MWeLdKvzU~7$ zL?)8NdZMSxtMIOP)2m)ewa(_;r`fjDp8i;4I()7T99M#c_Ty`^^_(%DRs`QNs>HJte4_La;iQG+|nTIv)%y0}SNMqT&4; z%F;Wo5y{X=Pldd39xA06m-0M@&i*qUz{w=0Wd8g=Z21&Tti>G0^k6b%HKSojc^WQ_ zs)TiGi&Dj-lvK+L9%{t!>M*Ychp@ShTemeV@-cQ|G}Mzu%kRM{4L1J(n8zciYVqTM zz!0r4RRC4VC;NLbG(*c7H&K^hN|s|!ei4Od0(ov27mT}q}SNE zSu)~6VMAQV=TF^>%t|izxFAM&t$>}7fh3G+8WUb8pA25QTmB1em3zM6xRAHazmz>A z3dK;ZIRTq^W2audV;j8)`}8zok*EVbT6mG2DoCz2n%}~1z>{`}%^F#gKp?m_@)qH%QdID$JO(-YI<>#WYd5O~-@Kct4ZX^Qxuro$>2Nu% zamBp#xUF^DBSZdXt|F%@^cc_OavQawo@f4NBQA?XAN#l<8>|&8%9X<+8P`sJb*pfqNdz@A3 z^m;|sh#n@RC?=Xm#Y$sa8h8{p2tG)P=2U6+(+b`dkyc|y-x2(7e=H8CiKZ656%sMT zB8sQsQ9|81;-oyAySXsJB1(M3)FpYUo)}wf1=!n|;98DZpWljr)yWMnr%Iw`#BgTh zGU4j*)xo2l= z@~dVfYOQAZ)>MsmO3q+>1VrR?uT*!347EY8XY z@3qz>THP3SoFe#t^H7&S8m$p1RWqWW4KbSH# zpyUrcR<+a9rJS`?x^buTDi~#vZ`qB$9XU5G^n|vMh=QloCy$K=CO|v1zNl^672LM7 z+5E%~{{WeEhx0+mQimcuF^_JxjcmwIs8{{G*79$AX6GF5cIQMC(=<$cfGY0H7a z(%%QRF_vX%y5CCDK^~Z+xgw=%9aLvPLC6uu7h@^48F6*<6H>IcwHi=YBEyOO*yqo- z-^6c!uAy!1VKU2f0WToaq?16t7}b<6X=k?EZmle%j0=zhs{o{FHS*I6m>rf^HaAww zAra3+xLr9o2D)lT3@a0*HrsWE-W1zL1h)rKp``%EcVn8#PdsMahsl_V1yfLcl){`Y zg_bE~D#5)sR;gNX0C2(wwJNC8eChxyC`Nq_0fOGxfvQ1O92T6%vkw$g4qR$feHwu( zt(XU{9?>&`k|hzZs6cQtKg@a1c;R6F9#CZRfFlBet)Jh50M~b)FAF3b7b^ZLo)kD& zY;g+>C$V?EhqAkMZ#OwZZWklhYjhyHIru^71~-`3U*%eBo>}L4cmD6)7tGVXm~`5~t?q}X zI;fa~Rs?)R9B+7-L{aw%Hal3%aH~x9I>NV@(=lIfh9?N(B33yW3)f16lxDRR%nZGl zR;C}hiQWJo%M*f80j@+=x$~|8lx&JwiH@%luA)tHp`&7?kpM_z`IV=z@;DDT zs}0eQcT(jw380@bu(wM{v zAXB28^X8`jg!;|=$A+Kwa0lCc=h<;Qe!Zl1kt$6H%|{xZxYKQO$;z#4_mjgPp*hx- z@`Kacho$_grF6n*>a-2SV(^m}R*_spROY=8?8Mk{6dpjyw_UXsw6M55V}3}-`CA!T z%AnhMS%oA8ZX!BmQ^zk8gCK8~Sl%)Zm{oim1rZf&#woor50$E?o_v1XOj3A-F|3_A zai}<;jkiTDBUI&DbmNIPr*Rm0I69`4<(pzn2e=7t5LrV?AJ%c>#9?5awc8@L0T2p~ zAX1g;aOR{l)m0RX>MQX#A&Q0?<8!sPLN$Wsyv10V z%)1=D*df#(bZ;?R2zJygqD2PbkbuEY1s>jb>FMkC^2>d(!j-sgwI<%zFHg$BbEbKL z$Kl6LvfuFM+iWA&JION;$o$D6h$pUN8pc-NmtNN9hOtSXGOT#`VuE_dvTvuhit6Z~ zFPOKRUQ5cMXliuJVoU++IH^GFbC1nLCDpGDky2k5A{kSTWamyp3nz^+%%k|kZK?f zK%N-Abda$XE1y#8=5a*<(9Q#FA4Zk>o4a3*ZKpcSSA*PXrxKAlLidS7z?V^AsP{3LOxI6{&6kT4|G55jO!23yF= zL%@Iiq$h##7&2!juv?Y&B0gR|p8}-duqwY$w%H%IOe_F&Wnn{5bJJfBiweeFv-+~_ zr(*6{E-i2VNz&RW7DFo#DyVa197yp43x*o$XDuVQy8~pCbe8vXt;0zpN|q!PjRPG+ z)cj0;!YS>=HJvj#tIVc*X*9-HMFOIQRYgVMss=$vL5(zxEhb&gIN@U>42E>4*fFl8 zuUv1kOw*tuH3$SS_@Bk&Og*)w?1Z)p2qm+pn0s)r&Upd4-y}#DX4Nc*TP|4+Kw^DG z*e|ATu03QzgDR0w$E|T2bS}app$r?<$NL39+Qb)w3bHq(C;a>j$kuW+s zohGrw06j%{oEBh0WJHm4medc!)K|v{5fm}Tq9v-QAir&KCy5O@M@J57vD7Iop5K16#oV_7TiS}Xj=MyK}b=QCE;7@s9X?U%zqVymj z6p&=i_VUKNc}DjN-L**@5^*f;IL{nWyoxsR? z=qNR2$(P-U`rW?MpD|x=qG`5giiIr9e8#xwa=oVvKSOsF>I5|WgXEZ+(LaDk(ZlK20qosYe>LX)JLG9p{EMh6hN+`34TK492Ewc z(C7QH2AF{Au_g1O8vC&F0Kx*o7?W2uBg2*=s5Q`LU@PVy7lAl(41|zJ5Y4o&;scMo z;ob-Z#oUaFw&Wmc(YUjF0sW^Fb^uYGizLq4n>rfMWx}|gMnbKPxSLe;2$_OTMz~)g zATGA^3i=MMP;?BbmNb?YRF3Z6_d9F&;)+oeI#@YX9CA7Pu&&N-?d-T!?t6;&GPARa z&^AZ-dvS9NZuX}87kGKQg5O+)!v+A8&|%^==-THEy3vZotHP$dIAFEd9#tpP0Md#H z9@AbpAgud(l(%$TET=V_NcII9K*v^_U)5Z;e|}NP+*=${`e3wYRS%Mx_~nCM{jB0- zuA1kXEbm)$jZnzUDUs0hr&`m7G}r8B;ICiuTK6W|V*|**Npuh81#rcNM<6mzIg_7E zSGA>`b%ypn=Ze+~tK0jz9^&e;+rXinS3KC)A)f(U8%|~wuH17_m)D87IEKa**4Z@7 z2C5DxoiO&9@|lE}Z*8q{x+Bo~HeeGkBcxD$rx|zgrWe=F*;?=C^em-ekulMHS^T1& z_Q#*M4yb-6(F%&x0BC)fAbI9Br(7^;=Fd;O;K>_iB#g(1!I1Hqry@EG1(HPQGp=1Y z=YVA0#n?nTDX9D)<}2ZX&>G%Y+3HTAQJ*Zb{kS0|Y@}N76zVagfK|oxcJL8V>M*2h z&b%v!XjIH<9;8wK01@%V1bG%cIhv2(_u<1y?eRf8O$5$XCKX}^ssWz?$JvV3i!%}y zvsq7kv0GY;OL&Hdc}--HjwXW!aw5z-TJCVKXbZ^vAtOt8Qxll3Q2ULw)tt>0%r6A- zR1}mIr}pYFC>5QolRly=sMVbN>7F;!R8+Yu8U$Z}4C&X$6==X&H4<3RS1kT4W(l2w zqUS<+e|8lR8=XLw$$Ie55@zBatbndagUkEQ2x(d6dyAOS-&4CTziA*-?87Ct=eZwm zwTQy2B(uuxAgLZj@{iexu%6!ccy|r1d7^x#wRL3T%F9x^yl_aRD$8(5ZNYrX{9SVA z?ZqZiU+sH!+>_ig zn~9_>VYm!@ilm6dR3l1&1qLo_Fv8we2>Ze1x{SWtBSghaw+%?-r#=*}Jx}(Gs3>K)mUHUmYzZ-dc>$GtYmDxx*76QNLmoa9_F{2? zjL{yHE9U@(KNSuq3Wj0rs3p1=mhAAYK`IFqCyjhDJ`45cr*6F~Z%P!ZYaf{7iKios zua@2e{KdRwl(;gEBD^bwf^nKnCD2nqp^eQ28!G*niw)@_2AYnM#C7{|3J)i%DwSF< zEq~vIK`hbRp# zZzwr*`>^9Mw=Xr>b+ks&6lJG;hC|{xk-%YVE#|cB+gwSnkY-q7T9d7p!!u7FgkwxH z*Uu&HQCmI9DJ^0OhBOsAi2|xf#$6j*Idpx!b=Pm|u zm8$#j{EP^aa2|TG$q`oe&2g=SL&rra8NRrS_gaUXRw3w_BzE0B?nLp^`Uf+-Z?clBcgRj-2tB z;M!SnP34A9(;H2IKxLV(6{nQu;2KkUqX_JBQUVy;su^6{%L_hJ@hl1R4* z^s)5afYZol(+ZKz!ZrDnZ6hQ01H%(%DjI4w+Um{MN{?yd_F>QpS#+k9_|#BypdY^z zfRB05v0ZxKi9{7A4DiipzAdG=Y1cI<(MXizrI$g)e2(u3?!($*UG7!8UtTXk znN{=i>Kw4<*&Q-$l%LbJ`h{mCN+VDbGNOQal#J<$_7Y>UwOSG^S-De=Db!4g+Op1? zRC|Fua7q;(_U+4=r)|>67kUp~Bo%6}2T}WRzgKUs7sX-O*PEE7Ce>|yc=LK>PJ>jz zN06}mOuT)x-BAI&L9ik+1o9UM+MX0+%oyhKqOI<&bhJnV_Wui_>8*#u9oL(z$Mr&B-FBzZEmD% zEKa7WpfofC8f&)Ja>uh>GslI4Ywh`E09uBM+l-UArlJV=dAIDwv$|{i(w%m#klEYV z*_ds`0L-`IX6k%#j@R4Ed`SXd$LrA!dRZLQ(!QGp1K&(zzL_&(c~EH4kmg7g`zwqw zgUK>oOI(EyF~1dc~krF zu1ElylTvW?gyrNxipfnN(^Yz(W**w8+(LzaeiSSuYz~RhwGayc#Bv7( zws=;vm98b&cKH+1Lp{r#DBl}Ybo?V84*lKzn`6Xx>(`{^a{7GR-20Tbf-swYlN`XE zMVp8^xOsdr*Y!FsxwhqxcJlFsle#-f%ebPAZlq|ZfS*Qm0G$VlFh3B-eA^CW2JzT- zmR7NgSzeswa1Nu;fj}|7y@{%Z>9o&gQDu=2sa+*O;yC1SUdo8}f`kUEH{l>sz8FSj z?WdLe-c|ff#0(UJOK5Ip3mN>iI#=1x3mF39fJH^(X;aSz1GcOG06zgdoG~Y&`M-7m zT-PrxyfQm#Z%^4xM^!%jFp;&}rh{X9`CV4d;x>pYA3GDkpy<5LBvn4#Ix&nBsQe@x z!5k0256U7>W;$%lQhA+SiKqC9Ibez$1;dbzzMO6PZAv$?m<*!|AgCkMUMe%p{{S)T zgbI!q3swd&b2SyOUuGD3dkbk}l7q~uNz<9(UueNgl_Jk%i*ei<7}g|^p^(WU<&YKk z;mI({=G+Ur+O|Eo6S!_AoDb21PNVJ`u{(BaBIi=SChKQD?)H|J@SNuor z#6&{&{l{^R^vQOtk-k9%bRv!eJa_$m)>*k(mgX-?qCx7F)Ii`zQA~90u6d0!9FYq} zsZOV@Okh)&5sbEmliIeHHEY$NrnJw1BN2FBuwj}OeJ~%(6h$K-I^q|2M&C2N%OpN# zW6b;^e-?P0Cb%IG$XI!qza2RHE5j4C5yncS@-eEt0HG271 z@PISV5w*nSU3%TG2+O zou82sJhxVfXwv$VO3LX|MFoXGAoIqOF~~dXQ)zSPGlB>N=lsLXUwFf*10=7jt2Yud z0F1EY873Q6X@W@FDtMfY4-6R`9%XeU7OO%^fHMxi5}#mQ&YK}4^1(M7((|fJVN^TJ){i)nyC)Qeg#B}NStBg9W*810f+SgvqXJ)_k zLs0l*rRP5L+IypMvX@L#5)q2cX*b?8%wwYxj4iS5wwtxHi(9EIZvd~PT7_6}W#q%C z#A6Aup7$hjZm~@r)x1l(Td`HXhzR7UIf(*!Tptl!7ez%`Eq9A{D9Np9n{dSPc}Ut$ z%~W+N!-za;IpTq_Dy)(MN|b7XIUja2wBhKF&DleB1FVEGV8bxQNexO@6Q7k}P1_(krNyppPmr{3D3VF~Yc=r#zMsa$6;p(?YPMP|rgVj)4FIqKBuB zBF;`KUFGY&qqKfkx0z9h70HD@{4a+;atE}wKkA*xmfMt)OKUuG77Il+MXJ;H;LJ~6 zp4XJ0aqJd*PjFd9w+2W+4Nl-LCA-9Q#$tgpuYb<#j3X9dR028EcsC*Jrp}OC0yN23gWnXDr2t3f$P??X<{~ zoW6&!b$bNTz^T#+A8s|vsubp$9={Wkd5rjAhE||zLC=vGVHddU+g0Nio)r>~Ge=Z@ zpAyjE?lNOSMf14BSZ_2%4_P7Bk1zd8Wr|#>6AS=x7;Xoh~2`8Y% z>q?X*Q&W+z1B;g>X_;IBn^W%l@ULD=AZ~7bKBk}An8STAa)6TZzFs`Q@agyCDh<8U z3IW5Fa?1`DT=mUQn=W)b@Z|?%nyr@;$2>Veh%S{2yS_zqbLou5Tl~W|GEu#+`8d4xrYA zV7lcQsLQmwONj(By{wKjv!JQcMGE`yZKnzLvgAdVW9|~FysWDk&s}N_e(%2=->JN| z!`J+9m)7B@TH3(Bp2o>d&*TReJrTRBL_4Qe*WB!w)f^mFbvTV=nI5 ztr~0X!4g@=Gy;efqb4w;fGS8d_TglD%p(oHiFB~0d4r8LytBF-hiZvk=TQEd3cO&| zMLA`T{;up!S^mCOy{~79f?bewx~_ygl;@2$+bfz6y9C?3YC^LB4^R#>v89{=x{lt~ z%~YKrP}K3D7@MkmBO#S_i1GUW1 z+1@^CO+3B>9XfS;YdxnihW);q-(M98b94%gB7l2IIOws4at14zr;(D;a|*<_LC&7z zgNfv6H@EtNo?lHQcJn{NbIzkac%~eMgiQ5$*ra4p2UE-K!?+WdZZ4lpP|z%Ka5NP) zp<13iF*@tcTHfn)_3;4urQ$JzrZH1abgo}!EtW8JUfe@&Z4!ne`t#~KaL9~J>z8k4 zv+V8Z>G0$ievIiZg=JQuR}~bkN4y+qFvAH;n>cUEnAAf%4RR7{0P&%~IlTNLV1Nf@ zjE0iFW^PQUkntEXle@^|@>@m~7;2GDO`S@%boU%M&lZHZl2FH68j=a=QNZEIxeT+j z8n?E+a2(;_LS<4%?FR-0aL{pKOo0RT;hUbJ4a3Xf&&L46f=~#`z6bW;7;#@ns`0>S z9hY^wvzki+)3}Y4I4fQ`@Ho%6S!1i}TkVWy2>y?0)cjii0NMUuW;y==e$P+; z0Qs~30Oj`H?PiQKZ z>q=MMionPtshE~ECpI+Zdf}EyiXin`eqRIpFrgN<;5$mcfLGtk4+aMQFtSt%WEqbw zT*ejGf{O0swcF*1NIxkpYI0!<3a*pw##h1N1HT({vu^hjIZ9jG$sV2tPf#G$;e?LK z!lbvI!)JeOaj-_S+?t?G0!o<%nkYUPopF?DY`iqBkLYLCE&f01d(==`y(=f6a=z+u?WlF}-Yiq;N|Zf?u09^VrJ>9}B;gt6yQoZ7JUh?Vn*^i&TPF7WV4u zvq%o2gH?D655E(xnXL8d#7w7X_U7Kt8Huh~5~byAnudVUX^xrIsYxQuw(e6_I1sO< zNK_vPP%@=(Z>Qn5yC~OZ6g`??#)!o(voR`$n0j7EmCwalfzr64JF3$;@a=eb*48pOipJI&hj=Edm*{0Fo zG4J11?PS}Lg@mv*s|Fd!fEL!npl%rI+pijOpKP^o92N`!TKQ;rjB=a8P}+0?%1H!_ zsZ1cOcfRAaS=+|Pu513nmdB8{A25LSbllY#=CDA)kQ%)A&94SWt6 z9SqbSVASGBq5Hpv77hiQc(aZ}6VDpR1$2{4k3&jgZNa%E#g)W#mh00>X2~LF_GgDI z7(icMcIBZW+g0_&Yer+~ss8{G{lgKrW(yHqlXSnH;LMKtV`2Gmk{3>3s9qSt+i7dE zQ|5$rD=J7?B;d-&FgX4AEm{^)9mUG29;c*g1%4@CfEeWLp8L&XT{xK*E$b#kQm5g_ z6OPT8n}){P^Ln?pWUO$hl5#Qxa0Bhb*PVrliT0ZtXylF*3F;A6ZydZaw$}yfCFDp` zERh8Qj|^+B*cdd@f`(S$;OEaSc#~I-r zJ;LhOAsVUVT5+l3F=UOmc4 z(9DsnWUU5jbLrO)^=m#;b+r-QA4iXFvq^Py(A7g0oerg8mz)aI1nZtz-4%=Prkj9< zd7)^oq=`eii9)uC1yq1}d+@gEqghpL&$YMBumgK)@l`~c^pd(y0vLI5ot7^sc?}H; z(1Z7mcohwoHOt+Gcygw-t!cvnz2@OeB6#q_4k@7=@Qq`$OL(DHgbc@}nKb(`8$*iq^_t0k zVjzoq)mVc60Qo>E9Zw>7j76M}DNWz#A9c5F-TKcAmlZ)Bk`pJWh}y@W%SH#5CTYSq zxr*P?ox0~?`kiB8x!Jv=TM16703d!{K^;6Ph}K!My8J$`f^~R z+|zJafEQ~=r#Tmg+A&$-T5`_2irOf4vbtQcAn1f@ZD--jj~pq%?|28Wb`N>)R#3Ei zWa!*IS%;*A4t08CS-itPRo2VsrTSX5m;0nv*R=*X!k3KuUZd_9o7ixk=Gt~%(25(5 z6S9Tma}4eYrOjgX_wHj^&%9k^SG7r=b-s%?8Dce1#VUT z`k!jqclqF+<<=X3E^SoIo6$7?%uyODW5UN)s%5X7%V zJ#bFleSN+T^ldivM_BHbcb5+W!6Xu*2hlAmRPf8+gHGwS!S?-oq|2ArF{og<2BPWr zjBA%Q0{6m>MF6Qa_GQPWSaB2#m+b9D8jm_x_hU&>O_jZniqbXcb2!u61<79`0XpPk z!<|27Dr|nGi(4Wn!oDP$;`3>6WuUWANQgBD5;)TtZIj@{fdKrthJ1jp9CPib;ZuS& zOxz=i{W)MU8rcLGB#6pXlg7R_)AlNxGq zM>L}!csMzw=@T10rS{)v@|I~FQ8ToRXlhxx)cx4kUds+^1Y2yIq}z?Oi!qXMI>{VD zw0GbE@S(!?n>uSwUH#-w-ujp3#a~EA5u9VDgm8qTy$w>+);Q9vwbk{E&gAc zzAa}IxxLldEi(hrIQ_VL_iL{a9$J@X{W#crSeflZTy74!Uh-OM0PzS0OO8GJZpxbA z{{V4!$8Bu17c+~C#LX>W^Syj|4}Ky`SC7j!-+rq17Uv^FVg}b`!Hh&SE3~49Vp1gS_6^wWYu24jBzAL)4!!#O>KUL4;!J4${d+cH@`b zjBVsj9sH$VRB=&I2LgH=93D_Rh2&6qr*Mwune!*6Ch*RW+3gvk5)sEeTyr>Qq;~de zHJ(&!bLgV#GNYKw9u)jQ`^GchY)rMB+#8BCSk=-WMVxuqv3V$YYCJu_Vmd9l=L+n^ zJsSlT0<@_o*^T99d$z3%kzDRIt6e^r`iRpZgQr|fogH;*CH(2+*2(ZfzlNO2#txd0NY#)A`gz^=(~w%csiQhAi1YBp2^d_EZH(|jWM%A_|IyhrrOjuPJr z(1V{-#~t!!Wy@~?E{uA$sH4)A>Fus72%x4fDbS2GP_<9r@5F5roP^zXTd1Kh#K9Ll z#$;2cw-{X-Yn6ND?xa|q6{Piv0+lCKcpPQ2r<^Q1e{M%_65L<;oRU@^Sz{fxt##}C zq$j#!qBKx~lyksPV;b6jfD+vuD3Pc~7pr!0vFz+tnYAeK~M z>U5&CLP_MAohxXy+6UukAJ4bTfw^46sipqo;qoz4OgW|B zh|{k6ZJWz=gSERe>CbJ!yEU-9-(+H}Wffp)!D=a_W2di4rvrN~YN5XOp5=QI?|VE^ zv)iz1n_#*pj+_W9lPTnJ)$hj+d%k=uU6b{HY=-td&ev@G+lc)Q-q8(B$ZCc@Y=aNK z8Qp#7@~tUE+EkV|5XbJXX4^PW~dH5IgOL*FE zHmhBN_U>u>jyRT0!YP$fSlQ`N!~k?>k>!i({8aWyj#&o7bv>s2ceC%+dziw*w=`R$34s@hKgc;fAtDZKE7 zyFW^MvSdj8O^t9^Z*Bm7?4>*<9I&z|}6gn^> zpo#wYz{8Go=9NGQ~nNp@C7E1Bt^2sug^v!~0VVI~_Ig z^7ALA2>`o!G|-HNcyRr=c?9kf0|7-e^+>7ZL7oZ{KTo!iHuWXUx=dD)m;BHj3o)XC z4p^KFvwL2#N0BMi6?yh|spvfX#u-49$ z^R7e6Yl*Yety=fa+wVQYY>#`eGdA4?s0w0@CvYR;1x}zm1|zpyd6nDs_ttS@kr3WD ziR|pRD4k-qCVQtVq&+?bIa0Xg)^ELI8zG-{Sh0HtkrsZoNsTPwJ#-2lk zbH@Fee`#ZzueN@>t@H2-@s?*as`-H;ojthLR~FPLO+HkOn4UG~ipptWCI*^9fH@E= zTvVwi(sD+p&yHWm8cl`{3vf*EEKWAIs5pWSFpj|5K@QUadVJt!4lSjyzv*V zo=t*^Gf`jNjBb?j@VJa+*ZXq9onzSQ-YB3nr(PIeuAJH)OVkV~H4a0LE_CF3ruI7> z>v*~OeXh<+iGLQ6MPC+UkRIF@u0xwOUexTUJ8{!<-|pdS>V8G48iYR6@f>C6!nrxz zz5f7lXDo7AL8{y_Ssj7T*nfsJ)2kxWE5F=tHq?se<<-ZOHEMd-!w=U3BYvFN?V#@0 zIyIYng^ey|6|ED@;GBk|(}1QYvef$I{{8h=wYJIL&fZ_@SLhC?ZSz$>;(vsDu@g&A z4ClChqxTl)syQw`O4+~oOJYM2{x{=|CbA5wjc`p$d373+e8=8#b7C{5S8Dm6r#$hV z(DFbo9IAPkR*M~7f%jxS++|{&63VZn3X}1Aju-Ag$M3tatwB-;;BD z<-3t?HI~v?mE*%n%9z$^3oWO%_mRA8w%daWG^f<}Y;Jf*hN1-xf=RVFu zJRxen>GQXV5m4x+pb=VOV=VJ>xN1l(LPj)%S^?1hFS`!d+HiuoQ*ktLgYkZ2j{(4A zkL+8un#R3zjGQv)^2&6P%>Mu!bxDbaR`QTbHlA4miY1j;wN8H#t{%FkqkH!D zCAW^xQjKF&pk;?|Ecn8 z34IA@XcmMID9_oQF*Xb!uT+%=O6mrbZ)P*vE+=+Py)CR3W!3A;R@2BS#}@q8PP%%` z{L`C_>^7hoWve{`#twWr4!Fx$D+y_wBT5IfcN7*t*xB8zTZ}}X?5{O_MdCscP8r%owR}rH6YzyISQzwj%O;7 zjkMD)TX}sMwnN%|p|!&n&1iQMZTXInsFmd_@jZFtvrS}*vkDJ!cel@9g};(k+jlm2 zj`Y92XP$P1#hl-!Ha;Zy*BSdfHv>cN<~>TZ?BtR{+!+FFaPaGyE{e ztp#y?5?#l4X>yj^?7nU5+Izcfw&QtdcYVQ~Qb~2i z1QJrJM5E&lMr+p#ee-#3uQ6Bd9h-FAyP_+JH&b!E?JgskC8(Bo)w3x4SbKS5CWCA7 zQoEJCp6tb3{{YO{MzU8VcZeLxQ(w%0=TXFCStP03Uu9dnt(FU7|l6rb+=v*_TO|^SQ#z1 z8(HPGxU6iAoJZ6iZ4bZ^#}%338gGyAi0+-YWwg3sduj7~b;6di+^s1b$fGSX0p()6 z>MqIy6@~3roK2zaIwy&wZI-Ea?D^3XMjHE z?ta}nKHy#iWw4x+5pnQ05|#e|-Nx}Ug^$dXEuV%j3UO0R$4vktr}*MPTc=rT8S_RP zfZ$FuyqqwQq)dG^pshwCXn9K7BnXgPv124k@;6#mfYaNHz{)do0%co)L9Vp}jYcDQ z0>LO{74ntK!lR}frXU=F8TA-sP#|Z=u6zy_0rfr=AIA)2sU!7G381D_=r9LucPQ;W zcw&@-)b%uHLcfI2^TV3tEgMgDSX*1@O|eqfO&;!D4DQ3C(CYheU2sUv&$(x~^%BiK zTHZ{g3;6x3@Q-#U0s*t%_dT)hWnI8L6QTiYC&Zdmua>61Y%3wg{f~zB#ZKy7hH@PYC$I;GvkSpNa)5?w?fsgsKUQ_>4>W`Z6cJA z@sN0mpC1Fu5whnXu67GnsT$Drt$%J2U1C0d-mX)q`kO#&)^Wq0b?J%qg@ub@`ggkS&KB0%Nd{GtnoxhV za>iS2BK;ayZ~YqDY)VhPN$S7gw~Wve(6=A67;W2r6*U>Z{XyC`I3H>4*dtd@A$Wia z2=;tO#NlhzZ#45FlWV(0b#o@;yWTvLu4!%#YJc;TDH=x5BQz?~1?KsXE1q0&ow;15_ipXKy|?*! zCs=G!p)75GDi!vD@gEk%;tZP#Lso7;XT;)6 zV#cviR*wGwiP#-EaMHEU+HrD&cao@OO-5ECuB4qHa`K7{RtkstnUDrxN`p-+K|$>B z#Njz3(pHvy(Y;|!pA))#}!1O z?ih__mrWXzpx}STJVq3!WFgt0CWJpwd10Uh#e_F4O#0NJCDyq?u7}G*{a;^=btIu_DE#)Ipz|&lukA-oZ zyp^wa7WoFjVlHH(TshMk6G2*Z#+&Vkowk#fJ-ct)hVOjMo5>-}1O2Iqk;}h4(H2%P zTBtKpOM_aP`BuC}S=SnCyE`~pHu=_Te@3~kRQ;aZcXaNpT%IGC$b*r~g*lvb*i<}L zX*KL|xGav~9Jq7ojC(F3x^?#70(V`~J994z9DrQ195Til=;`j?oGIxcxxZ`6fN32~ zM=bKhZ=(#Hw}wU&OyDa@PrM!&!+mgbn)GrAizupv9%5@!eb~izU@>CX0W;HDnt0?e zV5qf$7ETpmz*d>@7-c>UPGXJ0dKD(4Jo3y6VMSgYgK6CNJGgD_(8}`2BaH@BVsiFW zVa#|xU98W;f9<~6wb(XmZL|7(msZv?8=da>l}PTYo^vR?CYGxHY-KC z+orXJSwxwvZ@@PqI%kchvd0wLk-e|pd#2B44%u?+@~~Wbsp`Zf5KJ-+L*}9O;~yMX zM!Vs+ci!0!@!H#G)GLYYEw|{5NiDUIRApeqEQy_ zD{D^ew*LT_vRH{kxcn%7QhNzCFb&neSuI6=q#M{J(s zV!Vi4t+c+Rmf-m%P%4wc*?EZ1#}7-66ST$t6Wzafh6$|JSmm{zLp7Ti#+A4^dNU!+ z2l!1gzIG#o}B14{Iuu+}*1-(;=1?GTAc_ ztVJCN;;uY86_(W#HsEW1HSwL_j%lJqFFYr=GJJf=E<$*2O>B;Olk=nc;lv7 zNeHVf7n0gY+O!Z-QJS(gYF7$=47v3RD6a|=&WDw7wlLy45KjPW@5W$~DVIJ#;0LZ} zng|S#A=jcck+^`RiKcyVSl|;7j`G#zhsrBfPvs+s!p1-;&?^9gH5`0#G|7fgPevR^ z@4+a+_}HBO+&hqc2&V(XA;$m}Z4{C*C_Jhv%yLofCjrwIaNAkhO9L!-lSy>}`Wn4M75?rq=q%$#gJPGOH(+Yqv?pt)%PiY+LZdR0!hOc47&84FNcfa*0 zxf-Too;X_thi2R^Hmj?9%VR?bTB+d6%}yQ-u-op|w>wbW;0+{3Gb2Wsy;N0}okk-G zsz&kN7X86wt7aY>5(7HOG_xK-hbnZ%YpLM_CgpDhx1_YvO?cCWG?1!K>A!T_+}}?S zr==}Y-d=3coax|k8^dH@R=Zx`Yx;!t(W|E4yJ@+%jvyB|YDkr*^M2er;g_#1D}U{4 zsJ0!F{>IhXHn&J7iZmsambxmVJjPgwV|jU2w;i)^+e~YJZza3RHKIr;O8YrsoT%SW zEUGnmx&xjgXsu|Mg=J4MAU6&?#xrP%xv>F>rw$yju$mo|t(rzhn^6@10LKdjQI|~_ zg^{zaWQ>TW9L!CT32|jw6<_v-M-}XgskrQ9Bv6liYl@rTy-)uDO`T8{T}rvpO%FrI z74MOCD&1OH7AtktA@ZsLS0~wr`zZBkeXsO?x_1#A+k&p$Y``5-ol+2bApQ8-eTyLV zY5Nz`F4WpUcZcV$7c(^ZfP4^TjCSs{@SD8etZa(gN2EPGu%$8{AYw476mI@U>{L#@`#3Jjm&b)(hc~e4VwJQ@QRT=YBTPczEM~bVyCYU0pic?Kbkr z(qyR(T1F>^N(+7C5qB0QVeH7Z9j)fx(I2??H4$2E>qjstImsahz8c$wC6Ha$15i z=aDtUdvbDQ4d42MqE#iR8Ad=;Axu@<3BE&3A`7*R(b1w5R}6f?xRFoaf^JDGb0QCo z-G+3^l=h4q97r?~U4&&*<*uSQ1Io3*W>gi!N14s}432n1E-h0a0v;ao#Pk@P0TGs3 z74nglM;x#jIvcE=GrZzD3?FL$oz zzc)7weI@daArX2EFAjaXGCJDM3m6Jp#p=kSvPedM-HE#=`377DEKZ_+D)YmLv}WCW zW0s)OgDUYn@zc|~E@fDyqsAs&f#NzIc=UC=EY*d~NqoVNo;cn8)UO<8-Qm;qXZFwG zT)(?ptA>-Wzy?(1UI#2y!#%EPriWd+1wuxuxdMwt%Z@SG6NA?hu7ZRD)u2EqGw~T? zpKVt`l2=nXsCr6qw_gAi4N(yPno+SG){ZBuKVTL^= z<|3lQa+^i*3q|am$n;r?-M4@5=D#x zvd$#T&{IuUuM9=n?Ge71`D))md&=T|&)nfr1k&x%`ps@-tj;tVkT_C{!klr>d9AeD z+YC>6yuUZiz5Kd-gS@5}h-oYVqo$C?gE|pRYpld&-M2aTQu~1p(YT2%C3Uly39Q&P zSJIaIX6Hydu}a@PIF3wrifYr;w5;Q4cLcXj82>9iqi78fBGBjj^~JS)wjAquIFsHVC)i=*AtJ34tO@w zV=+G1^2;gXjF$WFxUBb42g+SDUE3ioZFVbBPAee%Cmk3}s@vK;s*W2>@a2%nl;Eaa z!n%c02BoI1p6o`-G)(}nTtqrTK`XHerk~rx6@sU?FqZpJGe@pRbV$^bL8OvPQ!~db zRzf1m{zz^~YG@}zr~m>zg9r_}fpU1wV|>RyZGD)W045-6crg4!5p_9ETbU%8U{o(B z1yux+eS;1J%v);20lEfBxm!kfAMv=$?87Xbn%4St0rbTZ{4p*{J>SO+WFU@&h7@e- zIp7Xyq4pkpKI|`&X4|AYg}-%fQH60UH>m>wMG=*%kxXNCvgQd_H;zlUvedezo+PLP ziyT?lv~GI_;bQ_xJS>s0%A%aHQkGNy08Y1o6!Yz}w~|lHhy1{KhrD8JJK<69#v2~< zJ*Bexa9sZY%tjCLxitcv8yZT9S^ofW?w5yWo=BhbG7>p7qF2vP8fA<3Ew2lI)0nO# zx3QYiCV5fADxj|e;f1x9DtKQz>wD}?hjQDuUHLt2;?Z2~up)<%eL+TjJTl}?Fv-aG zZ+%wnz4mpnwYZYT>O)B4xfIplgfJS9w+9OKLVar4H>o>M=QcwuyOorRLTU9`;$ue& zl;fRn^=ECz3=ubt_T8X+_L4ait4@rbok%%?C=M#?3r+UVEg}gO;zt>)XI}%u7-83! zt|Jm5%BG!hI5RQrvP_Gsg7PCg7zYl+V&I1yvp9H7h-=-lcq*APjs)UtDuubVlTl>I zo|rvTmuxOxDYVK1BjiEP6@!=Z)q5iL+h&YhT=3tPCY0jmmf&xR#7DLvWs4J@vIrELfoZuYiMo5ahK=! zi?uDK8nryqGI%1NiT=zkPYly_-Fu_CZstEZ1&xik^UpKriYopTK~l%Z4rHwd4(0Tp zx7XIXnr`IWMs5iy2BXT0nfJCU7PGfmP;N7llr5yBB(0*LmAsSs`M}Ey8@&s}uN-6mNba#NF(^ z5k1l0d*^j;QQmG(7`T|EWgtNk9Q1}NGSyCaQc~L8u3HRn!3BgiZzIT&s8JrG6%_z7 zFj1GnF{ZoU4Kcx1wu+X4gHfqk9wS#QWwgyyn1s)^+C+;aWsJJDDxPdcY%u*{P_siU zGs`NkuOh8ujg3^dDw9us7SjMtyWB0JNj!?vg{#vcQ^*b(VNI%q*~=L92Ph3rm_P+x5ErBiF?`{Ay zQl>%%N-$#(X{)=P+>WC{=Pq180ea##YF(14R(8k{r3mB)kB&LIwfElbTU(8AXL1sj zg3VgLF#ci7NHsX0Sl4Z;-dU)bCzlJ@XoMBDdwkhw3xxFpvxztqV%uaRdgTpC3u2wHj z8+bi5P?2y{6wBW#S)6HkP#c4j2A-_qEoXvQgdUEhk&Hch!Loy0}Vw4Ze1J4t*&zAi? zp1DHVqDwNXR4QhDxGhf9bk|KRU@GWT$!Gl_YYg z(n@nQ6`>;-ZT|qnSph|7y4*{tZRH?&su8F>ah2Lnm43UklUm-#ArEaJaB?MEfajRP z_n(n8v%|5)FU&;(M#fp4QaXdE5@<3!^TkYC!gkii&FWe9rqr8m-FEZbx+>Ahjx;i7 zD&41c)s8mAu^v?}`n;EOmJQnGGB0+5 zEH`-KUrtFO2gxz&c~>0XHa^MhiP5BE|EcMU8 zt^LEiJ;Sw3O_NH`b8J*7Ngv~)fx@FaUfNGEZEfWpwp+)(Sl-*mda~YGx2t8h$^fip ztl=2(&xSJff=jeO$#jjiixalM%+d)B!Aef7GGtZ<;pan)@s!Q5R^NZO+gZuB?r8NB z`QieMmCstY4`{_}aWHmgmE*U&Q-1Cn2e;YnPV4j_<;hNh@lwMeP!lU-F<2!bC+?r3BJJ}%3ayI+wQQb zsw|uqO&pQ=;~jG-+nJc;KPDUc#iY)Y#LAnMvI^3t%PeGa#<-O}*UVZr_J+%Mh_m|L zzkD@_t5it{s}Mg4=awr@7kuS2JXf~YM|JJXmcQGQGZo|pjWCb#RcV_bHSrj&r#V;n zR(Id0uO6-Ew`O?vNP^u)BLpmna}vVBgdR*Wj@@_6Rg0%<{Yr+y#W$_A$T#aa%I~`@ z>JO}>QRRwC5kP5BaT{%R^W^l}DZT05y~Fheb-J>-`Lsq>cqE6@dszUY#a-0cu||K|7O{Z3S52Uh}54hi|AkWf(YHxcsUv?LoU!LZ zDdT|M^u>5*ghcLJY&(U#aLZVlJdDwW*2!GZlgke@Bz9YyJ*xiz=cKeVv?#H_RSbeE zwF~JP;aGKR-#e>nz1tvHiTpTM!2D5tv{ z>x?tElq5TefY)0GQ>h#r!5M>Ga&Or+ytUUkeN))mto_B=HaAxVmhs~-%OE;iT4Wld zfjn_~*=AwwF;TWQH+$cyZ1K%`98S>5CHxRvMy#fWuOh)G*<37PrLcPaGuYA)FA-vq zTgsLNqll-7eP4DQi1$~!qp{y_Z<^bKO=85>ABsr1`&n^2YOOmJc5)LV?-+AMU4u05 zuDphH!9$Wu9Eg7x^C`&tu{b>C8F6O}hM?&OBi9u$SYJCqdkbr}j!U$TOP1o&uC@o? z!v(4J%Hwm~eV4geHI2hYZQM{LG|=)YM+4Icdf1>`?z@L>-riVkx6Ll!I0iNZA0Zi3 z@?p%3ITe*y+}kAYIP)=LCG^c$lf(w#IO385`fKa5LqDf%qKgq?&rUQar+~txYOOW& z)5tBEi^hbOBbgc1hd!9B$j0q$!nu7u-D`MbhBmmA9dbal(HP=MJOJmO9o>zRRim`N zo>=!qwZ+^UwXKcHOB$u5pq6nV&P4*ARj=EO+Hr#nLg#V=^LGhU zYbS*hk`Dokl17qYY?aa!)gy&YT&wQG!Nw!?f9tF}S({|pq=s2&Qt7gh!6V@x6k{)b z6&r1a2in%}+#T5z^TMkQvGwH8v=v;{3F^&+&sf&3plDEsB_@|5hw!C!HGEotVfx}V zHrF`>RxAM3DL!AaxQcluE7|3`M`n}Jh#COAsmDALgtD!h!l6Z2=1I=H@cfk;@*kDW}8k#g$d< zE)Cys&TB}aO$khg9A}!&T-5Q3I#e1k;&E7B9(QqVp{N<%K_B5BV^6aV4~I1`v>sIV z;ZSeVB-Lm#tvF!=GDZw?GM_jV73h`-?i=#9@>%S`KT-;v#YrZ`+yoNr91` zIH+Vbt!u*-B4jz-@=UvD$-_{R*HnWoDl_AbPqnt#;nCM5@~_%oXR0P4C?$4;jl zx4zAB@~NjOfg!hmP*kwU@c?79rg~|Hd)(ZC+T?e;pK_R1DE|N{26+L*=i`d&^OV|> zxZTP}>NJ{Tr<4;+vAsvKxxe=w<+v!@w$>q}`1E{7z@9@BZdq^J_%pV4jlHV+*Q_PF z<4?jp-0@a$nWxPf(g-6C`Hlp1#&)&w5x4uNsNR@L04f)U3`~ssdoAG$HO!^UYoP-w zd3fcY4w$IU-@)CPr;_Nes8%;0m}{LW%N2pH*CrrsH~eZfoX&r4H0u8VY$J5^5SPdv zy!d0%&LL`w-x-lY$VRI9c;*1Y+in-9ko#!S2dyAFTP(l3+laejG`L*0F2dcnS{*+x zZILp`<)YHH$2V`-k*{Ax*=n`zj>g(8%ihcVLUj0*Yp26JaCZHhd^`HSuCvP5u4=Xr(;?Y7TCjcq=Fr37NS ztB#+m*KcQ*UA?mFj3IYjyKUb0+qST{N$g^fu?#|;VAPebD&ybRT)ds;Y2CUAcAdIQ zw=%;W;Xf}J9zyHK&0aXHV5GoZb~}doVkKl2^8szRPcH!sr%MX zPx@p30Al(#n||Ofw)bK3m$10=ttjYp6QzJW_~Six%p3LHd4M~9;??fvC$wkxA0+!F>{b`&iU&nkVG%ePstg-#vr z{{T%Vx8Lj`5!mk$io``q%ms|*L-G=&RWn8#|ZN_wxI9cu`0bYi+k#Zk*EEvjl z+Z-*wOunRd57X`8<*~RawBMgf?iK-nb?O)$3_9UmF?sOcP1e5f-1g~rHr>+S1lHuxu?P7_JUz8% zraV+{c6Ns2+Bf$m)+sM`^+3>F=_+KjY}Q6x^5ueDCw{9h@Ly=|B4Pb5@dDXiFnej6 z%J9kfS!?)P6|Ko>wm4X%Yu&Et2GKBwxUGk)9lLo_@+J7-bv#;`q3Mk_nVc`hNH*mz z>$VGxmP2gL+MK zU;NeQhf=xR_ms~?w6_X)mXpj!xMB+k9n-ijW>*(Cg@_-a8&HyYX+=ZRQbdN}NkZ~ZM zBiVvOi2cjCiH1kpZRNRG6`D!bCTR6j%8N|N!M_n&>lBXdwsUEs%KwLt;o+W#n#jIC(rgD?(O7P;<lb_88O>oQ5>Fkr<$46^TOL`Fp9dg*hQ@VgdUTyFY1CzY91$%>4lQ@ ziVeqYZWmV%9fhQqaZmY^2#~viciot441fwePaGLD?dmEB zjHK%LsmNftH$=0dyo@}6`Dp0prk`-HLM{dlhvh8w&VS&iL(IYl8;9~8Q}n|8OD-mPFjXX zJQ*rb(Pt5rm((aKLF4z}g3KZw{bGuDL@71NBoX|?P-lg)OA%IaZ}K3Ia+F+0#5xKP z2P1`LOtzZb{{W<$t8pAj(z$yyGqt?f>n1YZ{!Yi*|c;*elKn{v7EOk zy~}s9v9(2s>OiQE`Hgv;PP6b^b|S4Myx!zk%ji})vETsW0OySy-0ZjQdv4#i#il&u zKOBadiT2{#>!u6bnI%xMoY#(haXTHV_3O;7rd1?^m2=A({G)4N380m#XetG2wa&c; z9E^6nBb@_OGJq+aX~D!K9uz!WDwSn283=QOV?Cf8?o zG{8X%$XdJ>qu)$*UdcXHr(V|hMs6Li+`G2!ZLRHEsA!eo02Mql##?txI(qtTxWhs1 z{>R$(ZMqwc*Yod3nmctA&bichISA{d^P@DJ#DiV4W!qcpm$x~YuLm-ly>kgMmWVQ zpEJbceRP_+_ukZ}V{P%?J=hU5dWyE`K}u^mn(`DF^uCU~+T`u1+rHVg+xH8bqq;?B z6CE+z1ZSwN514g0^yilq(#z!~+;=xN{k>~vc?`0{a-r-lNGiIQF{Qr|#a*X^z7=}bhII!AoTE1_Ue{^u{_6TIa=$SRzT>mUBoap!ez=XbLS|YPB#gma zar<3u!>UhiA3s~&+-;t;1+_;xq{+gR_*;<&8tb&yIBkQz^raK5yvBp z`!6jzyevJbduzPy^Y-QQ{(Zug}9D*zF^E4GXOPp)$PT54_j)gQd^5L}liWSGyROx@ zNo95}p=jD|j{Yb02!Q#X(p4mCQTTB0@Y3sWr)_)A-7yw7QAa1J#F&>QCyDgf=8s-n zFHRHpheSP)Hhqldk zwC*=D+sv1Cm#PKSYmfxy81qt3*m1VIU2o;jGbxS!?pt<~dV(S?ZxC7c1(J#^faJ63 z>PC9H<2>VRwa#KswMT`!D1F0POuM>XCUi({f9%s}VGDUPG6^8a7mS9h&z40CJtI zE8tRd< zB%UqQ*9D}6-aEeOZiS_pqo2j6EksldXSUyftXadq#dmXecW(AV?qlhrvK?d)O$rh{ z*q*tI$+XK2vhMLwE#qe)0dSy@DmmkHnwr)~By^X^$;2G62x`(>Y2{>y>L@D4o?e`A zdjV|>aZ}Z8EcGc8g3>qnP-cC&DIJQ|_EHNk$wN*R4RFJuVO5XaQ{#Xfp2F2F-ZxsK3Z~M;9>dsBWaN8ld z+^tvDj_p-fT|W%*u+qYZoiVNvhLs8Jd%dc{Yl}NbUj7*5iZ4w~Oo^*X(QAy#%u3}Es+9+gNW;3ya^auu-%NM?w)kCyS?uF38c0n^=*13T z9A`R}`!a>TMzx5#ni_yI;7$(C4kP2&E1CjH=0+lOMNMtpiM($%(zHcw?be1{*@#$B ze~pjq7}j;8%4fFi_CD8=QL%XoL2 znWefy65?=4Z?wz~j(e1+^zGN{?z03mKI*~>ZAj%~^9%I)PV|`@T!Rt#) z#&1>SYR(Ud<$4I4$ z;!?a^1!6gjF1}#WEiVus4s_w}#)~&BPJt&}y*JX;$Wg^AJ>vv7HMcy+I{wTeWF6Pv z9l>qfmr+{J=v&&pg@Tn+N>rNl!0UL#v?~E`TjWt&J+L0E%jJ!SUkpvz8}>-Ar)_-I%G_SmKon9Vkw0!0to7E@ z+r_oaX$tKssOUvc0Za|9vJM-Nx3*TelCD?Gyy^yci`yh=r(K}7>$u`{k?xvV?wFGi zHB<-T6dW;+UvAfb;immkYr$8OiEhrm0Mk$K$3?C?PMe5QA_(#>K+?26%sE0XYe6Xn zF;;BXE;Su6@XpNmOzmBTxZTG0S2}HNqZ*`^;OPJXUU-|^to~gcUrz1h{l|5EJlM1? zoDy$aieyUV5Pt^e?!%t@e-58cy*OC5jpMvGQ54KAwhKoDrMwYpnDnbR3i8Va+DYZ7 zR@-lQn2WC8duy@npD`$DcbSf;-RV-a$50o797~}5j_-m$|@+s~ujG>tpgW(jdF_xPCSGLj1t=vf%w^ODRJQpu{ z$40vTS#7vSF|uj^5_s1CWg!`Y1{va`8eyLRr^VeGrB*sWgj`gZj+ zp#Z7_q#XHU()!xjuMTd@f_r1Qtam$U<2I4R9nmFQloDto%qh$gdSkQF*_Jx*D#!Ih zwyrLFe{cSUd-F0|{{YQfE`2jsh#Q#X1A~>XkkgpU81~Cr_1Me4 zqjvT6{{VGv7pr8JsdF<)^0Ag(CEFk?k)?2JrHSt6Y@oN_q`mpKcH(c-?Q(xh5_)cG z2~%1MufzfCOlQ8+C8n3kjv?G_8Y|zHk_eg4qcf`nEQc@{id14%jKq%lG)?mN>nlk$ z&@VGo6%Aa}_~T8iXQsEpD9(U_oU#lF2N2WMHQF22&u840S9_hgmeps7%!t88g+6cg zyl`77dRDFf0H`gWwqt_FxjRbUTV0=df`x=-V0Q+r0X60K@WoH{@_R{{S+`?-K-_jY zBipVeEwns=nOJKvS0c$?0P`4qd*g*|FT!)`Z)&d9eQ&sJ?$d4ez+9n^BO9MHC^_}i zrxm=%EUd>rkzJSdCg$GuE4y;G`?LiSpaV=7=%<8-f=f<(@J+M)4s~0%&e_$v4(ixH zDlO4VUs}kNh_TJmyof)?8|gXBF3mH{K#k3PVJJZ@grvi8t(!+*jUSJ-P7SVE&GApQ zp5X@P1Y1tvP1f9^eY)(ZSqxHeK>Qd|qdXX=w8i4A{{Z)<@%+ofU+Ayuf5iU)Ki!RZ zYx{O@eZ^{|v@!sXQp?Rr@Wvm?+4cVIx9##gQ)`jI)FDqQfO(#{$8RditG;)WT_alB zMj)}RKmv^4<|7eyiS|H?$9nm+r#f)Ndn8`Z-BIlZSz@+H?%Yu%kZK8^5IW+f@*JzB zz45+)TqEmA3d!pa=E|m-bLEXQ!%Vq-zizCp408H0emw$=#PKZIlZ^JNf%lE0Zf?c$#IEEJ)N5Lme#SbFOqa%WZBIUE1uYN#?kkJ$DohE}F8YKv$-tikhTzS=ijq z9mKH*nlo74xgMZm@hLBzxw_nK>l+DCEm>l=R#;W{g?u!75p<_(Ny|vRTFXq{?URe z4wl_R)8f_TVc~`nTV=iO-!k3DB`L)ZoUlBY@)%YOx!wD|)pubO`o+HG3xnyg^0J(p z%rK#0R(|51Ps^~jHxnGS(1pvLFx8c&$9=ZiZA6TwOW9F9LoiiX$Qi6?wLE#8JQ5>y z?;FdIz`HW^9z_2D%0GS0W^ll3bD&bW|ilG1lhRqtux4+hA`H(txLDNDjm8J zd36ML8=(QAf@4Uau4-TTpZqwv8QqXSS*&-C7vwMxcGTKW0So`aiXIeV=yOt+x%li2h+ zfawF%DUlj@4-7`!w8kkL#pt%Tj%h+$r>e2~hM`MJborR_=Zeu6$}@78(+ecWOlrWz zc?$_4lS%kPjFg)2Y-=fDRqj2vw|86i+pm=E_h6~B++j^fbqu4PHTb{Ix#K>~6*7jn z+xthg6u##pZr9Y+4U{O+LP+4!$n9!Cw4J21qa{|$qjL{7Z3C)EL z7MA5!%qd&m^SJJJPc8MqnUK){$q*mHtH5JR<&Iar#QIA<=^5NN@0hZ*bPZ_=LRp=7 z`i#VB3(#UI$g(Z3(*3ARWtx4#p`gXyl$&VONyq z*#s zD?n?I&KXg4xgK3Sk2>KH7&gmr;zy%PUVH)f;YgfMky6{EucpOU{9Lo^i07Y$JG8n~RA%zZAAF~xZ_LBv_*NgVN~Z=KiOedB(y%I?UkA_?ZnFZx;^ebS`DbTv9fK-;e&ccsTt=^c*|XG+TE+a zy6e}CBDH4^G;g( z;4GViF&WfxYGY}p8C~-97mBPsL8)6NQOF-0ZLbXN5*}EaMxaoQQMGuf{up;pQufP| z&Ozl$jJW1;dZyNaXul;Dv==K_(m0-4iUSmek6Luqk9VtIT_kbsb5ODNR{Lw;jkfL4 z3H@hPgcs7U6Zw}jmktLH+l;gH#cTb;cQ0+vv^)?2I=~k4+HfU{KO~$8;<6SB#M z{<&g(!}Sxr<%0hJX5IIBWVF1Xl(<0~Nf;Vv0O92vIpOOi^24`#uMGYz?{Iq=c3Y{- zTO*sBc$|`Sprs9IiMsKHYizkh zS#7qLb2YG6j#V0%>I4EZB7|2N&2w5^?3p}!PJJ>sl|*q6BrFe>xq@lPj(C2Qe(%g_ zyEXT4ZeK}m`zl>?{G%JqvKH?!l&>@8!_s3dCfST~>e6dj40FcO$~>%#6bZhTT+)}} z0lmYzZF`x$ngVU_s<&|kDz8IA>OT)(ZZzLpE@PW%`5m^*BA&`A8NC?&Ni44+p_Ilm zk`kxN`hG1udSU0+3fGjc^)0*q0Qx&FKQZt(>2=}ypZ-r8e#m~Wr@M#s?mj=({{VT% zfc-DuiNEO`I{0Iq@BaW*laIi^4^-;rC+b7~lZV27 zKk;?KFO*+zf34g<{t`|fr~d%&f5p=ke3eJH>!00)0@r2w5PUqoJ{&N}#h3k3>-712 zU+Q>s{{ZrMng_QL$Bql+GK&xY0G)%6>dEnZJpLcwi2ne&TKH_2oDUv+J^0m}Ol)82 zW&Z$4@E?QY;r{c(5^RnC09H?j;&0RVelA`Zt$dtMT5w;BfcUuk@ES{T{{W?*)!=_i z;`iawXRZFM@c6&@o<95|S?#~j4~K{U01JjlIsPd=ENs-3p(oy-^i%%;?Ng5)d@#y0tKamq@clO9!x?t}0IKxzlk6Y*{?qz@ zuD`GFasJvoX^b@R+h*Gz`q_Rz$MJFF%lut@F{>zhfByiZU4N(j6aKUPKLPr`;lubv ze2Ltj9G~g`09AiS^nNeF;f$)a^4310{{Yk_{eSv(xB3s%{XfP2FWpR5tx|hW{{YJw zzt{f&sEhr7!T$j6ygK6bMRT^l>3g60ztMlt{{T(E{-^H7u^}!00PA}v$MDDgqmRNq zFCLg(hZRq$U-hT>{uTKD0JjV|;XR6sJX?pmhaPyS&rx=t>QmzQ$LaiBe-DpLPUou2 z+<){t&yRxqAF0pp>*I{|ZNG+P+u!tCPCQ%U`2I8co;`5qh7t5e>Hh#nPyXWn08XF( z01xmF{hpXkn#ITKKkM=T0DH%e;_$|3c3+2|55w^B{8(gu-~Bpq;&^c7#|FLtkHnuB z56A80iquCY_>aXS=WKAMzd;$96v}Ct`om4-eHo-*=8Hufp|BPw=nruJ&E;x;k;G5sk9@hAM-*y%ZmO z^*`MwANmFTZd^Vu_Iz>S^?$q5-~Cayd@epO)BgZt;^+P>b~*kI_Fw%%P9FjNFN2Tb z{n#qBC%%8`aQnFN;g3h^{{X9p?SH!Y^uP3G{SE{DH|zX7yfC{R-CiT-U#LI*>$m>Ap3lX{jye9% z`n@0c{{Z((_gDQE-{RuG2M>NX{{Z}%eZT(zVxJ!d_i*=c#~o&QIFDz$7|%7SnLkbb zE+hL4Ir5#JkB>Z4IB~uY#n1bDaOZ;_zvEVvZkn)qwid+P`NRv*ygAL;&&=%4KP w>i+<<{-@pIGcBv&i{k$Ps7LT{_`mpn9=;gIe+;LT@BaYmzw2My-+`n5*``uw0RR91 literal 0 HcmV?d00001 diff --git a/vraptor/src/main/webapp/js/clean-blog.js b/vraptor/src/main/webapp/js/clean-blog.js new file mode 100644 index 0000000000..26a60cce5f --- /dev/null +++ b/vraptor/src/main/webapp/js/clean-blog.js @@ -0,0 +1,40 @@ +// Floating label headings for the contact form +$(function() { + $("body").on("input propertychange", ".floating-label-form-group", function(e) { + $(this).toggleClass("floating-label-form-group-with-value", !!$(e.target).val()); + }).on("focus", ".floating-label-form-group", function() { + $(this).addClass("floating-label-form-group-with-focus"); + }).on("blur", ".floating-label-form-group", function() { + $(this).removeClass("floating-label-form-group-with-focus"); + }); +}); + +// Navigation Scripts to Show Header on Scroll-Up +jQuery(document).ready(function($) { + var MQL = 1170; + + //primary navigation slide-in effect + if ($(window).width() > MQL) { + var headerHeight = $('.navbar-custom').height(); + $(window).on('scroll', { + previousTop: 0 + }, + function() { + var currentTop = $(window).scrollTop(); + //check if user is scrolling up + if (currentTop < this.previousTop) { + //if scrolling up... + if (currentTop > 0 && $('.navbar-custom').hasClass('is-fixed')) { + $('.navbar-custom').addClass('is-visible'); + } else { + $('.navbar-custom').removeClass('is-visible is-fixed'); + } + } else if (currentTop > this.previousTop) { + //if scrolling down... + $('.navbar-custom').removeClass('is-visible'); + if (currentTop > headerHeight && !$('.navbar-custom').hasClass('is-fixed')) $('.navbar-custom').addClass('is-fixed'); + } + this.previousTop = currentTop; + }); + } +}); diff --git a/vraptor/src/main/webapp/js/clean-blog.min.js b/vraptor/src/main/webapp/js/clean-blog.min.js new file mode 100644 index 0000000000..852db7e938 --- /dev/null +++ b/vraptor/src/main/webapp/js/clean-blog.min.js @@ -0,0 +1,6 @@ +/*! + * Start Bootstrap - Clean Blog v3.3.7+1 (http://startbootstrap.com/template-overviews/clean-blog) + * Copyright 2013-2016 Start Bootstrap + * Licensed under MIT (https://github.com/BlackrockDigital/startbootstrap/blob/gh-pages/LICENSE) + */ +$(function(){$("body").on("input propertychange",".floating-label-form-group",function(o){$(this).toggleClass("floating-label-form-group-with-value",!!$(o.target).val())}).on("focus",".floating-label-form-group",function(){$(this).addClass("floating-label-form-group-with-focus")}).on("blur",".floating-label-form-group",function(){$(this).removeClass("floating-label-form-group-with-focus")})}),jQuery(document).ready(function(o){var s=1170;if(o(window).width()>s){var i=o(".navbar-custom").height();o(window).on("scroll",{previousTop:0},function(){var s=o(window).scrollTop();s0&&o(".navbar-custom").hasClass("is-fixed")?o(".navbar-custom").addClass("is-visible"):o(".navbar-custom").removeClass("is-visible is-fixed"):s>this.previousTop&&(o(".navbar-custom").removeClass("is-visible"),s>i&&!o(".navbar-custom").hasClass("is-fixed")&&o(".navbar-custom").addClass("is-fixed")),this.previousTop=s})}}); \ No newline at end of file diff --git a/vraptor/src/main/webapp/js/contact_me.js b/vraptor/src/main/webapp/js/contact_me.js new file mode 100644 index 0000000000..c3d8ecce26 --- /dev/null +++ b/vraptor/src/main/webapp/js/contact_me.js @@ -0,0 +1,72 @@ +// Contact Form Scripts + +$(function() { + + $("#contactForm input,#contactForm textarea").jqBootstrapValidation({ + preventSubmit: true, + submitError: function($form, event, errors) { + // additional error messages or events + }, + submitSuccess: function($form, event) { + event.preventDefault(); // prevent default submit behaviour + // get values from FORM + var name = $("input#name").val(); + var email = $("input#email").val(); + var phone = $("input#phone").val(); + var message = $("textarea#message").val(); + var firstName = name; // For Success/Failure Message + // Check for white space in name for Success/Fail message + if (firstName.indexOf(' ') >= 0) { + firstName = name.split(' ').slice(0, -1).join(' '); + } + $.ajax({ + url: "././mail/contact_me.php", + type: "POST", + data: { + name: name, + phone: phone, + email: email, + message: message + }, + cache: false, + success: function() { + // Success message + $('#success').html("

'); + + //clear all fields + $('#contactForm').trigger("reset"); + }, + error: function() { + // Fail message + $('#success').html("
"); + $('#success > .alert-danger').html(""); + $('#success > .alert-danger').append("Sorry " + firstName + ", it seems that my mail server is not responding. Please try again later!"); + $('#success > .alert-danger').append('
'); + //clear all fields + $('#contactForm').trigger("reset"); + }, + }); + }, + filter: function() { + return $(this).is(":visible"); + }, + }); + + $("a[data-toggle=\"tab\"]").click(function(e) { + e.preventDefault(); + $(this).tab("show"); + }); +}); + + +/*When clicking on Full hide fail/success boxes */ +$('#name').focus(function() { + $('#success').html(''); +}); diff --git a/vraptor/src/main/webapp/js/jqBootstrapValidation.js b/vraptor/src/main/webapp/js/jqBootstrapValidation.js new file mode 100644 index 0000000000..7b3b922251 --- /dev/null +++ b/vraptor/src/main/webapp/js/jqBootstrapValidation.js @@ -0,0 +1,912 @@ +/* jqBootstrapValidation + * A plugin for automating validation on Twitter Bootstrap formatted forms. + * + * v1.3.6 + * + * License: MIT - see LICENSE file + * + * http://ReactiveRaven.github.com/jqBootstrapValidation/ + */ + +(function( $ ){ + + var createdElements = []; + + var defaults = { + options: { + prependExistingHelpBlock: false, + sniffHtml: true, // sniff for 'required', 'maxlength', etc + preventSubmit: true, // stop the form submit event from firing if validation fails + submitError: false, // function called if there is an error when trying to submit + submitSuccess: false, // function called just before a successful submit event is sent to the server + semanticallyStrict: false, // set to true to tidy up generated HTML output + autoAdd: { + helpBlocks: true + }, + filter: function () { + // return $(this).is(":visible"); // only validate elements you can see + return true; // validate everything + } + }, + methods: { + init : function( options ) { + + var settings = $.extend(true, {}, defaults); + + settings.options = $.extend(true, settings.options, options); + + var $siblingElements = this; + + var uniqueForms = $.unique( + $siblingElements.map( function () { + return $(this).parents("form")[0]; + }).toArray() + ); + + $(uniqueForms).bind("submit", function (e) { + var $form = $(this); + var warningsFound = 0; + var $inputs = $form.find("input,textarea,select").not("[type=submit],[type=image]").filter(settings.options.filter); + $inputs.trigger("submit.validation").trigger("validationLostFocus.validation"); + + $inputs.each(function (i, el) { + var $this = $(el), + $controlGroup = $this.parents(".form-group").first(); + if ( + $controlGroup.hasClass("warning") + ) { + $controlGroup.removeClass("warning").addClass("error"); + warningsFound++; + } + }); + + $inputs.trigger("validationLostFocus.validation"); + + if (warningsFound) { + if (settings.options.preventSubmit) { + e.preventDefault(); + } + $form.addClass("error"); + if ($.isFunction(settings.options.submitError)) { + settings.options.submitError($form, e, $inputs.jqBootstrapValidation("collectErrors", true)); + } + } else { + $form.removeClass("error"); + if ($.isFunction(settings.options.submitSuccess)) { + settings.options.submitSuccess($form, e); + } + } + }); + + return this.each(function(){ + + // Get references to everything we're interested in + var $this = $(this), + $controlGroup = $this.parents(".form-group").first(), + $helpBlock = $controlGroup.find(".help-block").first(), + $form = $this.parents("form").first(), + validatorNames = []; + + // create message container if not exists + if (!$helpBlock.length && settings.options.autoAdd && settings.options.autoAdd.helpBlocks) { + $helpBlock = $('
'); + $controlGroup.find('.controls').append($helpBlock); + createdElements.push($helpBlock[0]); + } + + // ============================================================= + // SNIFF HTML FOR VALIDATORS + // ============================================================= + + // *snort sniff snuffle* + + if (settings.options.sniffHtml) { + var message = ""; + // --------------------------------------------------------- + // PATTERN + // --------------------------------------------------------- + if ($this.attr("pattern") !== undefined) { + message = "Not in the expected format"; + if ($this.data("validationPatternMessage")) { + message = $this.data("validationPatternMessage"); + } + $this.data("validationPatternMessage", message); + $this.data("validationPatternRegex", $this.attr("pattern")); + } + // --------------------------------------------------------- + // MAX + // --------------------------------------------------------- + if ($this.attr("max") !== undefined || $this.attr("aria-valuemax") !== undefined) { + var max = ($this.attr("max") !== undefined ? $this.attr("max") : $this.attr("aria-valuemax")); + message = "Too high: Maximum of '" + max + "'"; + if ($this.data("validationMaxMessage")) { + message = $this.data("validationMaxMessage"); + } + $this.data("validationMaxMessage", message); + $this.data("validationMaxMax", max); + } + // --------------------------------------------------------- + // MIN + // --------------------------------------------------------- + if ($this.attr("min") !== undefined || $this.attr("aria-valuemin") !== undefined) { + var min = ($this.attr("min") !== undefined ? $this.attr("min") : $this.attr("aria-valuemin")); + message = "Too low: Minimum of '" + min + "'"; + if ($this.data("validationMinMessage")) { + message = $this.data("validationMinMessage"); + } + $this.data("validationMinMessage", message); + $this.data("validationMinMin", min); + } + // --------------------------------------------------------- + // MAXLENGTH + // --------------------------------------------------------- + if ($this.attr("maxlength") !== undefined) { + message = "Too long: Maximum of '" + $this.attr("maxlength") + "' characters"; + if ($this.data("validationMaxlengthMessage")) { + message = $this.data("validationMaxlengthMessage"); + } + $this.data("validationMaxlengthMessage", message); + $this.data("validationMaxlengthMaxlength", $this.attr("maxlength")); + } + // --------------------------------------------------------- + // MINLENGTH + // --------------------------------------------------------- + if ($this.attr("minlength") !== undefined) { + message = "Too short: Minimum of '" + $this.attr("minlength") + "' characters"; + if ($this.data("validationMinlengthMessage")) { + message = $this.data("validationMinlengthMessage"); + } + $this.data("validationMinlengthMessage", message); + $this.data("validationMinlengthMinlength", $this.attr("minlength")); + } + // --------------------------------------------------------- + // REQUIRED + // --------------------------------------------------------- + if ($this.attr("required") !== undefined || $this.attr("aria-required") !== undefined) { + message = settings.builtInValidators.required.message; + if ($this.data("validationRequiredMessage")) { + message = $this.data("validationRequiredMessage"); + } + $this.data("validationRequiredMessage", message); + } + // --------------------------------------------------------- + // NUMBER + // --------------------------------------------------------- + if ($this.attr("type") !== undefined && $this.attr("type").toLowerCase() === "number") { + message = settings.builtInValidators.number.message; + if ($this.data("validationNumberMessage")) { + message = $this.data("validationNumberMessage"); + } + $this.data("validationNumberMessage", message); + } + // --------------------------------------------------------- + // EMAIL + // --------------------------------------------------------- + if ($this.attr("type") !== undefined && $this.attr("type").toLowerCase() === "email") { + message = "Not a valid email address"; + if ($this.data("validationValidemailMessage")) { + message = $this.data("validationValidemailMessage"); + } else if ($this.data("validationEmailMessage")) { + message = $this.data("validationEmailMessage"); + } + $this.data("validationValidemailMessage", message); + } + // --------------------------------------------------------- + // MINCHECKED + // --------------------------------------------------------- + if ($this.attr("minchecked") !== undefined) { + message = "Not enough options checked; Minimum of '" + $this.attr("minchecked") + "' required"; + if ($this.data("validationMincheckedMessage")) { + message = $this.data("validationMincheckedMessage"); + } + $this.data("validationMincheckedMessage", message); + $this.data("validationMincheckedMinchecked", $this.attr("minchecked")); + } + // --------------------------------------------------------- + // MAXCHECKED + // --------------------------------------------------------- + if ($this.attr("maxchecked") !== undefined) { + message = "Too many options checked; Maximum of '" + $this.attr("maxchecked") + "' required"; + if ($this.data("validationMaxcheckedMessage")) { + message = $this.data("validationMaxcheckedMessage"); + } + $this.data("validationMaxcheckedMessage", message); + $this.data("validationMaxcheckedMaxchecked", $this.attr("maxchecked")); + } + } + + // ============================================================= + // COLLECT VALIDATOR NAMES + // ============================================================= + + // Get named validators + if ($this.data("validation") !== undefined) { + validatorNames = $this.data("validation").split(","); + } + + // Get extra ones defined on the element's data attributes + $.each($this.data(), function (i, el) { + var parts = i.replace(/([A-Z])/g, ",$1").split(","); + if (parts[0] === "validation" && parts[1]) { + validatorNames.push(parts[1]); + } + }); + + // ============================================================= + // NORMALISE VALIDATOR NAMES + // ============================================================= + + var validatorNamesToInspect = validatorNames; + var newValidatorNamesToInspect = []; + + do // repeatedly expand 'shortcut' validators into their real validators + { + // Uppercase only the first letter of each name + $.each(validatorNames, function (i, el) { + validatorNames[i] = formatValidatorName(el); + }); + + // Remove duplicate validator names + validatorNames = $.unique(validatorNames); + + // Pull out the new validator names from each shortcut + newValidatorNamesToInspect = []; + $.each(validatorNamesToInspect, function(i, el) { + if ($this.data("validation" + el + "Shortcut") !== undefined) { + // Are these custom validators? + // Pull them out! + $.each($this.data("validation" + el + "Shortcut").split(","), function(i2, el2) { + newValidatorNamesToInspect.push(el2); + }); + } else if (settings.builtInValidators[el.toLowerCase()]) { + // Is this a recognised built-in? + // Pull it out! + var validator = settings.builtInValidators[el.toLowerCase()]; + if (validator.type.toLowerCase() === "shortcut") { + $.each(validator.shortcut.split(","), function (i, el) { + el = formatValidatorName(el); + newValidatorNamesToInspect.push(el); + validatorNames.push(el); + }); + } + } + }); + + validatorNamesToInspect = newValidatorNamesToInspect; + + } while (validatorNamesToInspect.length > 0) + + // ============================================================= + // SET UP VALIDATOR ARRAYS + // ============================================================= + + var validators = {}; + + $.each(validatorNames, function (i, el) { + // Set up the 'override' message + var message = $this.data("validation" + el + "Message"); + var hasOverrideMessage = (message !== undefined); + var foundValidator = false; + message = + ( + message + ? message + : "'" + el + "' validation failed " + ) + ; + + $.each( + settings.validatorTypes, + function (validatorType, validatorTemplate) { + if (validators[validatorType] === undefined) { + validators[validatorType] = []; + } + if (!foundValidator && $this.data("validation" + el + formatValidatorName(validatorTemplate.name)) !== undefined) { + validators[validatorType].push( + $.extend( + true, + { + name: formatValidatorName(validatorTemplate.name), + message: message + }, + validatorTemplate.init($this, el) + ) + ); + foundValidator = true; + } + } + ); + + if (!foundValidator && settings.builtInValidators[el.toLowerCase()]) { + + var validator = $.extend(true, {}, settings.builtInValidators[el.toLowerCase()]); + if (hasOverrideMessage) { + validator.message = message; + } + var validatorType = validator.type.toLowerCase(); + + if (validatorType === "shortcut") { + foundValidator = true; + } else { + $.each( + settings.validatorTypes, + function (validatorTemplateType, validatorTemplate) { + if (validators[validatorTemplateType] === undefined) { + validators[validatorTemplateType] = []; + } + if (!foundValidator && validatorType === validatorTemplateType.toLowerCase()) { + $this.data("validation" + el + formatValidatorName(validatorTemplate.name), validator[validatorTemplate.name.toLowerCase()]); + validators[validatorType].push( + $.extend( + validator, + validatorTemplate.init($this, el) + ) + ); + foundValidator = true; + } + } + ); + } + } + + if (! foundValidator) { + $.error("Cannot find validation info for '" + el + "'"); + } + }); + + // ============================================================= + // STORE FALLBACK VALUES + // ============================================================= + + $helpBlock.data( + "original-contents", + ( + $helpBlock.data("original-contents") + ? $helpBlock.data("original-contents") + : $helpBlock.html() + ) + ); + + $helpBlock.data( + "original-role", + ( + $helpBlock.data("original-role") + ? $helpBlock.data("original-role") + : $helpBlock.attr("role") + ) + ); + + $controlGroup.data( + "original-classes", + ( + $controlGroup.data("original-clases") + ? $controlGroup.data("original-classes") + : $controlGroup.attr("class") + ) + ); + + $this.data( + "original-aria-invalid", + ( + $this.data("original-aria-invalid") + ? $this.data("original-aria-invalid") + : $this.attr("aria-invalid") + ) + ); + + // ============================================================= + // VALIDATION + // ============================================================= + + $this.bind( + "validation.validation", + function (event, params) { + + var value = getValue($this); + + // Get a list of the errors to apply + var errorsFound = []; + + $.each(validators, function (validatorType, validatorTypeArray) { + if (value || value.length || (params && params.includeEmpty) || (!!settings.validatorTypes[validatorType].blockSubmit && params && !!params.submitting)) { + $.each(validatorTypeArray, function (i, validator) { + if (settings.validatorTypes[validatorType].validate($this, value, validator)) { + errorsFound.push(validator.message); + } + }); + } + }); + + return errorsFound; + } + ); + + $this.bind( + "getValidators.validation", + function () { + return validators; + } + ); + + // ============================================================= + // WATCH FOR CHANGES + // ============================================================= + $this.bind( + "submit.validation", + function () { + return $this.triggerHandler("change.validation", {submitting: true}); + } + ); + $this.bind( + [ + "keyup", + "focus", + "blur", + "click", + "keydown", + "keypress", + "change" + ].join(".validation ") + ".validation", + function (e, params) { + + var value = getValue($this); + + var errorsFound = []; + + $controlGroup.find("input,textarea,select").each(function (i, el) { + var oldCount = errorsFound.length; + $.each($(el).triggerHandler("validation.validation", params), function (j, message) { + errorsFound.push(message); + }); + if (errorsFound.length > oldCount) { + $(el).attr("aria-invalid", "true"); + } else { + var original = $this.data("original-aria-invalid"); + $(el).attr("aria-invalid", (original !== undefined ? original : false)); + } + }); + + $form.find("input,select,textarea").not($this).not("[name=\"" + $this.attr("name") + "\"]").trigger("validationLostFocus.validation"); + + errorsFound = $.unique(errorsFound.sort()); + + // Were there any errors? + if (errorsFound.length) { + // Better flag it up as a warning. + $controlGroup.removeClass("success error").addClass("warning"); + + // How many errors did we find? + if (settings.options.semanticallyStrict && errorsFound.length === 1) { + // Only one? Being strict? Just output it. + $helpBlock.html(errorsFound[0] + + ( settings.options.prependExistingHelpBlock ? $helpBlock.data("original-contents") : "" )); + } else { + // Multiple? Being sloppy? Glue them together into an UL. + $helpBlock.html("
  • " + errorsFound.join("
  • ") + "
" + + ( settings.options.prependExistingHelpBlock ? $helpBlock.data("original-contents") : "" )); + } + } else { + $controlGroup.removeClass("warning error success"); + if (value.length > 0) { + $controlGroup.addClass("success"); + } + $helpBlock.html($helpBlock.data("original-contents")); + } + + if (e.type === "blur") { + $controlGroup.removeClass("success"); + } + } + ); + $this.bind("validationLostFocus.validation", function () { + $controlGroup.removeClass("success"); + }); + }); + }, + destroy : function( ) { + + return this.each( + function() { + + var + $this = $(this), + $controlGroup = $this.parents(".form-group").first(), + $helpBlock = $controlGroup.find(".help-block").first(); + + // remove our events + $this.unbind('.validation'); // events are namespaced. + // reset help text + $helpBlock.html($helpBlock.data("original-contents")); + // reset classes + $controlGroup.attr("class", $controlGroup.data("original-classes")); + // reset aria + $this.attr("aria-invalid", $this.data("original-aria-invalid")); + // reset role + $helpBlock.attr("role", $this.data("original-role")); + // remove all elements we created + if (createdElements.indexOf($helpBlock[0]) > -1) { + $helpBlock.remove(); + } + + } + ); + + }, + collectErrors : function(includeEmpty) { + + var errorMessages = {}; + this.each(function (i, el) { + var $el = $(el); + var name = $el.attr("name"); + var errors = $el.triggerHandler("validation.validation", {includeEmpty: true}); + errorMessages[name] = $.extend(true, errors, errorMessages[name]); + }); + + $.each(errorMessages, function (i, el) { + if (el.length === 0) { + delete errorMessages[i]; + } + }); + + return errorMessages; + + }, + hasErrors: function() { + + var errorMessages = []; + + this.each(function (i, el) { + errorMessages = errorMessages.concat( + $(el).triggerHandler("getValidators.validation") ? $(el).triggerHandler("validation.validation", {submitting: true}) : [] + ); + }); + + return (errorMessages.length > 0); + }, + override : function (newDefaults) { + defaults = $.extend(true, defaults, newDefaults); + } + }, + validatorTypes: { + callback: { + name: "callback", + init: function ($this, name) { + return { + validatorName: name, + callback: $this.data("validation" + name + "Callback"), + lastValue: $this.val(), + lastValid: true, + lastFinished: true + }; + }, + validate: function ($this, value, validator) { + if (validator.lastValue === value && validator.lastFinished) { + return !validator.lastValid; + } + + if (validator.lastFinished === true) + { + validator.lastValue = value; + validator.lastValid = true; + validator.lastFinished = false; + + var rrjqbvValidator = validator; + var rrjqbvThis = $this; + executeFunctionByName( + validator.callback, + window, + $this, + value, + function (data) { + if (rrjqbvValidator.lastValue === data.value) { + rrjqbvValidator.lastValid = data.valid; + if (data.message) { + rrjqbvValidator.message = data.message; + } + rrjqbvValidator.lastFinished = true; + rrjqbvThis.data("validation" + rrjqbvValidator.validatorName + "Message", rrjqbvValidator.message); + // Timeout is set to avoid problems with the events being considered 'already fired' + setTimeout(function () { + rrjqbvThis.trigger("change.validation"); + }, 1); // doesn't need a long timeout, just long enough for the event bubble to burst + } + } + ); + } + + return false; + + } + }, + ajax: { + name: "ajax", + init: function ($this, name) { + return { + validatorName: name, + url: $this.data("validation" + name + "Ajax"), + lastValue: $this.val(), + lastValid: true, + lastFinished: true + }; + }, + validate: function ($this, value, validator) { + if (""+validator.lastValue === ""+value && validator.lastFinished === true) { + return validator.lastValid === false; + } + + if (validator.lastFinished === true) + { + validator.lastValue = value; + validator.lastValid = true; + validator.lastFinished = false; + $.ajax({ + url: validator.url, + data: "value=" + value + "&field=" + $this.attr("name"), + dataType: "json", + success: function (data) { + if (""+validator.lastValue === ""+data.value) { + validator.lastValid = !!(data.valid); + if (data.message) { + validator.message = data.message; + } + validator.lastFinished = true; + $this.data("validation" + validator.validatorName + "Message", validator.message); + // Timeout is set to avoid problems with the events being considered 'already fired' + setTimeout(function () { + $this.trigger("change.validation"); + }, 1); // doesn't need a long timeout, just long enough for the event bubble to burst + } + }, + failure: function () { + validator.lastValid = true; + validator.message = "ajax call failed"; + validator.lastFinished = true; + $this.data("validation" + validator.validatorName + "Message", validator.message); + // Timeout is set to avoid problems with the events being considered 'already fired' + setTimeout(function () { + $this.trigger("change.validation"); + }, 1); // doesn't need a long timeout, just long enough for the event bubble to burst + } + }); + } + + return false; + + } + }, + regex: { + name: "regex", + init: function ($this, name) { + return {regex: regexFromString($this.data("validation" + name + "Regex"))}; + }, + validate: function ($this, value, validator) { + return (!validator.regex.test(value) && ! validator.negative) + || (validator.regex.test(value) && validator.negative); + } + }, + required: { + name: "required", + init: function ($this, name) { + return {}; + }, + validate: function ($this, value, validator) { + return !!(value.length === 0 && ! validator.negative) + || !!(value.length > 0 && validator.negative); + }, + blockSubmit: true + }, + match: { + name: "match", + init: function ($this, name) { + var element = $this.parents("form").first().find("[name=\"" + $this.data("validation" + name + "Match") + "\"]").first(); + element.bind("validation.validation", function () { + $this.trigger("change.validation", {submitting: true}); + }); + return {"element": element}; + }, + validate: function ($this, value, validator) { + return (value !== validator.element.val() && ! validator.negative) + || (value === validator.element.val() && validator.negative); + }, + blockSubmit: true + }, + max: { + name: "max", + init: function ($this, name) { + return {max: $this.data("validation" + name + "Max")}; + }, + validate: function ($this, value, validator) { + return (parseFloat(value, 10) > parseFloat(validator.max, 10) && ! validator.negative) + || (parseFloat(value, 10) <= parseFloat(validator.max, 10) && validator.negative); + } + }, + min: { + name: "min", + init: function ($this, name) { + return {min: $this.data("validation" + name + "Min")}; + }, + validate: function ($this, value, validator) { + return (parseFloat(value) < parseFloat(validator.min) && ! validator.negative) + || (parseFloat(value) >= parseFloat(validator.min) && validator.negative); + } + }, + maxlength: { + name: "maxlength", + init: function ($this, name) { + return {maxlength: $this.data("validation" + name + "Maxlength")}; + }, + validate: function ($this, value, validator) { + return ((value.length > validator.maxlength) && ! validator.negative) + || ((value.length <= validator.maxlength) && validator.negative); + } + }, + minlength: { + name: "minlength", + init: function ($this, name) { + return {minlength: $this.data("validation" + name + "Minlength")}; + }, + validate: function ($this, value, validator) { + return ((value.length < validator.minlength) && ! validator.negative) + || ((value.length >= validator.minlength) && validator.negative); + } + }, + maxchecked: { + name: "maxchecked", + init: function ($this, name) { + var elements = $this.parents("form").first().find("[name=\"" + $this.attr("name") + "\"]"); + elements.bind("click.validation", function () { + $this.trigger("change.validation", {includeEmpty: true}); + }); + return {maxchecked: $this.data("validation" + name + "Maxchecked"), elements: elements}; + }, + validate: function ($this, value, validator) { + return (validator.elements.filter(":checked").length > validator.maxchecked && ! validator.negative) + || (validator.elements.filter(":checked").length <= validator.maxchecked && validator.negative); + }, + blockSubmit: true + }, + minchecked: { + name: "minchecked", + init: function ($this, name) { + var elements = $this.parents("form").first().find("[name=\"" + $this.attr("name") + "\"]"); + elements.bind("click.validation", function () { + $this.trigger("change.validation", {includeEmpty: true}); + }); + return {minchecked: $this.data("validation" + name + "Minchecked"), elements: elements}; + }, + validate: function ($this, value, validator) { + return (validator.elements.filter(":checked").length < validator.minchecked && ! validator.negative) + || (validator.elements.filter(":checked").length >= validator.minchecked && validator.negative); + }, + blockSubmit: true + } + }, + builtInValidators: { + email: { + name: "Email", + type: "shortcut", + shortcut: "validemail" + }, + validemail: { + name: "Validemail", + type: "regex", + regex: "[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\\\.[A-Za-z]{2,4}", + message: "Not a valid email address" + }, + passwordagain: { + name: "Passwordagain", + type: "match", + match: "password", + message: "Does not match the given password" + }, + positive: { + name: "Positive", + type: "shortcut", + shortcut: "number,positivenumber" + }, + negative: { + name: "Negative", + type: "shortcut", + shortcut: "number,negativenumber" + }, + number: { + name: "Number", + type: "regex", + regex: "([+-]?\\\d+(\\\.\\\d*)?([eE][+-]?[0-9]+)?)?", + message: "Must be a number" + }, + integer: { + name: "Integer", + type: "regex", + regex: "[+-]?\\\d+", + message: "No decimal places allowed" + }, + positivenumber: { + name: "Positivenumber", + type: "min", + min: 0, + message: "Must be a positive number" + }, + negativenumber: { + name: "Negativenumber", + type: "max", + max: 0, + message: "Must be a negative number" + }, + required: { + name: "Required", + type: "required", + message: "This is required" + }, + checkone: { + name: "Checkone", + type: "minchecked", + minchecked: 1, + message: "Check at least one option" + } + } + }; + + var formatValidatorName = function (name) { + return name + .toLowerCase() + .replace( + /(^|\s)([a-z])/g , + function(m,p1,p2) { + return p1+p2.toUpperCase(); + } + ) + ; + }; + + var getValue = function ($this) { + // Extract the value we're talking about + var value = $this.val(); + var type = $this.attr("type"); + if (type === "checkbox") { + value = ($this.is(":checked") ? value : ""); + } + if (type === "radio") { + value = ($('input[name="' + $this.attr("name") + '"]:checked').length > 0 ? value : ""); + } + return value; + }; + + function regexFromString(inputstring) { + return new RegExp("^" + inputstring + "$"); + } + + /** + * Thanks to Jason Bunting via StackOverflow.com + * + * http://stackoverflow.com/questions/359788/how-to-execute-a-javascript-function-when-i-have-its-name-as-a-string#answer-359910 + * Short link: http://tinyurl.com/executeFunctionByName + **/ + function executeFunctionByName(functionName, context /*, args*/) { + var args = Array.prototype.slice.call(arguments).splice(2); + var namespaces = functionName.split("."); + var func = namespaces.pop(); + for(var i = 0; i < namespaces.length; i++) { + context = context[namespaces[i]]; + } + return context[func].apply(this, args); + } + + $.fn.jqBootstrapValidation = function( method ) { + + if ( defaults.methods[method] ) { + return defaults.methods[method].apply( this, Array.prototype.slice.call( arguments, 1 )); + } else if ( typeof method === 'object' || ! method ) { + return defaults.methods.init.apply( this, arguments ); + } else { + $.error( 'Method ' + method + ' does not exist on jQuery.jqBootstrapValidation' ); + return null; + } + + }; + + $.jqBootstrapValidation = function (options) { + $(":input").not("[type=image],[type=submit]").jqBootstrapValidation.apply(this,arguments); + }; + +})( jQuery ); diff --git a/vraptor/src/main/webapp/vendor/bootstrap/css/bootstrap.css b/vraptor/src/main/webapp/vendor/bootstrap/css/bootstrap.css new file mode 100644 index 0000000000..6167622cec --- /dev/null +++ b/vraptor/src/main/webapp/vendor/bootstrap/css/bootstrap.css @@ -0,0 +1,6757 @@ +/*! + * Bootstrap v3.3.7 (http://getbootstrap.com) + * Copyright 2011-2016 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + */ +/*! normalize.css v3.0.3 | MIT License | github.com/necolas/normalize.css */ +html { + font-family: sans-serif; + -webkit-text-size-adjust: 100%; + -ms-text-size-adjust: 100%; +} +body { + margin: 0; +} +article, +aside, +details, +figcaption, +figure, +footer, +header, +hgroup, +main, +menu, +nav, +section, +summary { + display: block; +} +audio, +canvas, +progress, +video { + display: inline-block; + vertical-align: baseline; +} +audio:not([controls]) { + display: none; + height: 0; +} +[hidden], +template { + display: none; +} +a { + background-color: transparent; +} +a:active, +a:hover { + outline: 0; +} +abbr[title] { + border-bottom: 1px dotted; +} +b, +strong { + font-weight: bold; +} +dfn { + font-style: italic; +} +h1 { + margin: .67em 0; + font-size: 2em; +} +mark { + color: #000; + background: #ff0; +} +small { + font-size: 80%; +} +sub, +sup { + position: relative; + font-size: 75%; + line-height: 0; + vertical-align: baseline; +} +sup { + top: -.5em; +} +sub { + bottom: -.25em; +} +img { + border: 0; +} +svg:not(:root) { + overflow: hidden; +} +figure { + margin: 1em 40px; +} +hr { + height: 0; + -webkit-box-sizing: content-box; + -moz-box-sizing: content-box; + box-sizing: content-box; +} +pre { + overflow: auto; +} +code, +kbd, +pre, +samp { + font-family: monospace, monospace; + font-size: 1em; +} +button, +input, +optgroup, +select, +textarea { + margin: 0; + font: inherit; + color: inherit; +} +button { + overflow: visible; +} +button, +select { + text-transform: none; +} +button, +html input[type="button"], +input[type="reset"], +input[type="submit"] { + -webkit-appearance: button; + cursor: pointer; +} +button[disabled], +html input[disabled] { + cursor: default; +} +button::-moz-focus-inner, +input::-moz-focus-inner { + padding: 0; + border: 0; +} +input { + line-height: normal; +} +input[type="checkbox"], +input[type="radio"] { + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + padding: 0; +} +input[type="number"]::-webkit-inner-spin-button, +input[type="number"]::-webkit-outer-spin-button { + height: auto; +} +input[type="search"] { + -webkit-box-sizing: content-box; + -moz-box-sizing: content-box; + box-sizing: content-box; + -webkit-appearance: textfield; +} +input[type="search"]::-webkit-search-cancel-button, +input[type="search"]::-webkit-search-decoration { + -webkit-appearance: none; +} +fieldset { + padding: .35em .625em .75em; + margin: 0 2px; + border: 1px solid #c0c0c0; +} +legend { + padding: 0; + border: 0; +} +textarea { + overflow: auto; +} +optgroup { + font-weight: bold; +} +table { + border-spacing: 0; + border-collapse: collapse; +} +td, +th { + padding: 0; +} +/*! Source: https://github.com/h5bp/html5-boilerplate/blob/master/src/css/main.css */ +@media print { + *, + *:before, + *:after { + color: #000 !important; + text-shadow: none !important; + background: transparent !important; + -webkit-box-shadow: none !important; + box-shadow: none !important; + } + a, + a:visited { + text-decoration: underline; + } + a[href]:after { + content: " (" attr(href) ")"; + } + abbr[title]:after { + content: " (" attr(title) ")"; + } + a[href^="#"]:after, + a[href^="javascript:"]:after { + content: ""; + } + pre, + blockquote { + border: 1px solid #999; + + page-break-inside: avoid; + } + thead { + display: table-header-group; + } + tr, + img { + page-break-inside: avoid; + } + img { + max-width: 100% !important; + } + p, + h2, + h3 { + orphans: 3; + widows: 3; + } + h2, + h3 { + page-break-after: avoid; + } + .navbar { + display: none; + } + .btn > .caret, + .dropup > .btn > .caret { + border-top-color: #000 !important; + } + .label { + border: 1px solid #000; + } + .table { + border-collapse: collapse !important; + } + .table td, + .table th { + background-color: #fff !important; + } + .table-bordered th, + .table-bordered td { + border: 1px solid #ddd !important; + } +} +@font-face { + font-family: 'Glyphicons Halflings'; + + src: url('../fonts/glyphicons-halflings-regular.eot'); + src: url('../fonts/glyphicons-halflings-regular.eot?#iefix') format('embedded-opentype'), url('../fonts/glyphicons-halflings-regular.woff2') format('woff2'), url('../fonts/glyphicons-halflings-regular.woff') format('woff'), url('../fonts/glyphicons-halflings-regular.ttf') format('truetype'), url('../fonts/glyphicons-halflings-regular.svg#glyphicons_halflingsregular') format('svg'); +} +.glyphicon { + position: relative; + top: 1px; + display: inline-block; + font-family: 'Glyphicons Halflings'; + font-style: normal; + font-weight: normal; + line-height: 1; + + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} +.glyphicon-asterisk:before { + content: "\002a"; +} +.glyphicon-plus:before { + content: "\002b"; +} +.glyphicon-euro:before, +.glyphicon-eur:before { + content: "\20ac"; +} +.glyphicon-minus:before { + content: "\2212"; +} +.glyphicon-cloud:before { + content: "\2601"; +} +.glyphicon-envelope:before { + content: "\2709"; +} +.glyphicon-pencil:before { + content: "\270f"; +} +.glyphicon-glass:before { + content: "\e001"; +} +.glyphicon-music:before { + content: "\e002"; +} +.glyphicon-search:before { + content: "\e003"; +} +.glyphicon-heart:before { + content: "\e005"; +} +.glyphicon-star:before { + content: "\e006"; +} +.glyphicon-star-empty:before { + content: "\e007"; +} +.glyphicon-user:before { + content: "\e008"; +} +.glyphicon-film:before { + content: "\e009"; +} +.glyphicon-th-large:before { + content: "\e010"; +} +.glyphicon-th:before { + content: "\e011"; +} +.glyphicon-th-list:before { + content: "\e012"; +} +.glyphicon-ok:before { + content: "\e013"; +} +.glyphicon-remove:before { + content: "\e014"; +} +.glyphicon-zoom-in:before { + content: "\e015"; +} +.glyphicon-zoom-out:before { + content: "\e016"; +} +.glyphicon-off:before { + content: "\e017"; +} +.glyphicon-signal:before { + content: "\e018"; +} +.glyphicon-cog:before { + content: "\e019"; +} +.glyphicon-trash:before { + content: "\e020"; +} +.glyphicon-home:before { + content: "\e021"; +} +.glyphicon-file:before { + content: "\e022"; +} +.glyphicon-time:before { + content: "\e023"; +} +.glyphicon-road:before { + content: "\e024"; +} +.glyphicon-download-alt:before { + content: "\e025"; +} +.glyphicon-download:before { + content: "\e026"; +} +.glyphicon-upload:before { + content: "\e027"; +} +.glyphicon-inbox:before { + content: "\e028"; +} +.glyphicon-play-circle:before { + content: "\e029"; +} +.glyphicon-repeat:before { + content: "\e030"; +} +.glyphicon-refresh:before { + content: "\e031"; +} +.glyphicon-list-alt:before { + content: "\e032"; +} +.glyphicon-lock:before { + content: "\e033"; +} +.glyphicon-flag:before { + content: "\e034"; +} +.glyphicon-headphones:before { + content: "\e035"; +} +.glyphicon-volume-off:before { + content: "\e036"; +} +.glyphicon-volume-down:before { + content: "\e037"; +} +.glyphicon-volume-up:before { + content: "\e038"; +} +.glyphicon-qrcode:before { + content: "\e039"; +} +.glyphicon-barcode:before { + content: "\e040"; +} +.glyphicon-tag:before { + content: "\e041"; +} +.glyphicon-tags:before { + content: "\e042"; +} +.glyphicon-book:before { + content: "\e043"; +} +.glyphicon-bookmark:before { + content: "\e044"; +} +.glyphicon-print:before { + content: "\e045"; +} +.glyphicon-camera:before { + content: "\e046"; +} +.glyphicon-font:before { + content: "\e047"; +} +.glyphicon-bold:before { + content: "\e048"; +} +.glyphicon-italic:before { + content: "\e049"; +} +.glyphicon-text-height:before { + content: "\e050"; +} +.glyphicon-text-width:before { + content: "\e051"; +} +.glyphicon-align-left:before { + content: "\e052"; +} +.glyphicon-align-center:before { + content: "\e053"; +} +.glyphicon-align-right:before { + content: "\e054"; +} +.glyphicon-align-justify:before { + content: "\e055"; +} +.glyphicon-list:before { + content: "\e056"; +} +.glyphicon-indent-left:before { + content: "\e057"; +} +.glyphicon-indent-right:before { + content: "\e058"; +} +.glyphicon-facetime-video:before { + content: "\e059"; +} +.glyphicon-picture:before { + content: "\e060"; +} +.glyphicon-map-marker:before { + content: "\e062"; +} +.glyphicon-adjust:before { + content: "\e063"; +} +.glyphicon-tint:before { + content: "\e064"; +} +.glyphicon-edit:before { + content: "\e065"; +} +.glyphicon-share:before { + content: "\e066"; +} +.glyphicon-check:before { + content: "\e067"; +} +.glyphicon-move:before { + content: "\e068"; +} +.glyphicon-step-backward:before { + content: "\e069"; +} +.glyphicon-fast-backward:before { + content: "\e070"; +} +.glyphicon-backward:before { + content: "\e071"; +} +.glyphicon-play:before { + content: "\e072"; +} +.glyphicon-pause:before { + content: "\e073"; +} +.glyphicon-stop:before { + content: "\e074"; +} +.glyphicon-forward:before { + content: "\e075"; +} +.glyphicon-fast-forward:before { + content: "\e076"; +} +.glyphicon-step-forward:before { + content: "\e077"; +} +.glyphicon-eject:before { + content: "\e078"; +} +.glyphicon-chevron-left:before { + content: "\e079"; +} +.glyphicon-chevron-right:before { + content: "\e080"; +} +.glyphicon-plus-sign:before { + content: "\e081"; +} +.glyphicon-minus-sign:before { + content: "\e082"; +} +.glyphicon-remove-sign:before { + content: "\e083"; +} +.glyphicon-ok-sign:before { + content: "\e084"; +} +.glyphicon-question-sign:before { + content: "\e085"; +} +.glyphicon-info-sign:before { + content: "\e086"; +} +.glyphicon-screenshot:before { + content: "\e087"; +} +.glyphicon-remove-circle:before { + content: "\e088"; +} +.glyphicon-ok-circle:before { + content: "\e089"; +} +.glyphicon-ban-circle:before { + content: "\e090"; +} +.glyphicon-arrow-left:before { + content: "\e091"; +} +.glyphicon-arrow-right:before { + content: "\e092"; +} +.glyphicon-arrow-up:before { + content: "\e093"; +} +.glyphicon-arrow-down:before { + content: "\e094"; +} +.glyphicon-share-alt:before { + content: "\e095"; +} +.glyphicon-resize-full:before { + content: "\e096"; +} +.glyphicon-resize-small:before { + content: "\e097"; +} +.glyphicon-exclamation-sign:before { + content: "\e101"; +} +.glyphicon-gift:before { + content: "\e102"; +} +.glyphicon-leaf:before { + content: "\e103"; +} +.glyphicon-fire:before { + content: "\e104"; +} +.glyphicon-eye-open:before { + content: "\e105"; +} +.glyphicon-eye-close:before { + content: "\e106"; +} +.glyphicon-warning-sign:before { + content: "\e107"; +} +.glyphicon-plane:before { + content: "\e108"; +} +.glyphicon-calendar:before { + content: "\e109"; +} +.glyphicon-random:before { + content: "\e110"; +} +.glyphicon-comment:before { + content: "\e111"; +} +.glyphicon-magnet:before { + content: "\e112"; +} +.glyphicon-chevron-up:before { + content: "\e113"; +} +.glyphicon-chevron-down:before { + content: "\e114"; +} +.glyphicon-retweet:before { + content: "\e115"; +} +.glyphicon-shopping-cart:before { + content: "\e116"; +} +.glyphicon-folder-close:before { + content: "\e117"; +} +.glyphicon-folder-open:before { + content: "\e118"; +} +.glyphicon-resize-vertical:before { + content: "\e119"; +} +.glyphicon-resize-horizontal:before { + content: "\e120"; +} +.glyphicon-hdd:before { + content: "\e121"; +} +.glyphicon-bullhorn:before { + content: "\e122"; +} +.glyphicon-bell:before { + content: "\e123"; +} +.glyphicon-certificate:before { + content: "\e124"; +} +.glyphicon-thumbs-up:before { + content: "\e125"; +} +.glyphicon-thumbs-down:before { + content: "\e126"; +} +.glyphicon-hand-right:before { + content: "\e127"; +} +.glyphicon-hand-left:before { + content: "\e128"; +} +.glyphicon-hand-up:before { + content: "\e129"; +} +.glyphicon-hand-down:before { + content: "\e130"; +} +.glyphicon-circle-arrow-right:before { + content: "\e131"; +} +.glyphicon-circle-arrow-left:before { + content: "\e132"; +} +.glyphicon-circle-arrow-up:before { + content: "\e133"; +} +.glyphicon-circle-arrow-down:before { + content: "\e134"; +} +.glyphicon-globe:before { + content: "\e135"; +} +.glyphicon-wrench:before { + content: "\e136"; +} +.glyphicon-tasks:before { + content: "\e137"; +} +.glyphicon-filter:before { + content: "\e138"; +} +.glyphicon-briefcase:before { + content: "\e139"; +} +.glyphicon-fullscreen:before { + content: "\e140"; +} +.glyphicon-dashboard:before { + content: "\e141"; +} +.glyphicon-paperclip:before { + content: "\e142"; +} +.glyphicon-heart-empty:before { + content: "\e143"; +} +.glyphicon-link:before { + content: "\e144"; +} +.glyphicon-phone:before { + content: "\e145"; +} +.glyphicon-pushpin:before { + content: "\e146"; +} +.glyphicon-usd:before { + content: "\e148"; +} +.glyphicon-gbp:before { + content: "\e149"; +} +.glyphicon-sort:before { + content: "\e150"; +} +.glyphicon-sort-by-alphabet:before { + content: "\e151"; +} +.glyphicon-sort-by-alphabet-alt:before { + content: "\e152"; +} +.glyphicon-sort-by-order:before { + content: "\e153"; +} +.glyphicon-sort-by-order-alt:before { + content: "\e154"; +} +.glyphicon-sort-by-attributes:before { + content: "\e155"; +} +.glyphicon-sort-by-attributes-alt:before { + content: "\e156"; +} +.glyphicon-unchecked:before { + content: "\e157"; +} +.glyphicon-expand:before { + content: "\e158"; +} +.glyphicon-collapse-down:before { + content: "\e159"; +} +.glyphicon-collapse-up:before { + content: "\e160"; +} +.glyphicon-log-in:before { + content: "\e161"; +} +.glyphicon-flash:before { + content: "\e162"; +} +.glyphicon-log-out:before { + content: "\e163"; +} +.glyphicon-new-window:before { + content: "\e164"; +} +.glyphicon-record:before { + content: "\e165"; +} +.glyphicon-save:before { + content: "\e166"; +} +.glyphicon-open:before { + content: "\e167"; +} +.glyphicon-saved:before { + content: "\e168"; +} +.glyphicon-import:before { + content: "\e169"; +} +.glyphicon-export:before { + content: "\e170"; +} +.glyphicon-send:before { + content: "\e171"; +} +.glyphicon-floppy-disk:before { + content: "\e172"; +} +.glyphicon-floppy-saved:before { + content: "\e173"; +} +.glyphicon-floppy-remove:before { + content: "\e174"; +} +.glyphicon-floppy-save:before { + content: "\e175"; +} +.glyphicon-floppy-open:before { + content: "\e176"; +} +.glyphicon-credit-card:before { + content: "\e177"; +} +.glyphicon-transfer:before { + content: "\e178"; +} +.glyphicon-cutlery:before { + content: "\e179"; +} +.glyphicon-header:before { + content: "\e180"; +} +.glyphicon-compressed:before { + content: "\e181"; +} +.glyphicon-earphone:before { + content: "\e182"; +} +.glyphicon-phone-alt:before { + content: "\e183"; +} +.glyphicon-tower:before { + content: "\e184"; +} +.glyphicon-stats:before { + content: "\e185"; +} +.glyphicon-sd-video:before { + content: "\e186"; +} +.glyphicon-hd-video:before { + content: "\e187"; +} +.glyphicon-subtitles:before { + content: "\e188"; +} +.glyphicon-sound-stereo:before { + content: "\e189"; +} +.glyphicon-sound-dolby:before { + content: "\e190"; +} +.glyphicon-sound-5-1:before { + content: "\e191"; +} +.glyphicon-sound-6-1:before { + content: "\e192"; +} +.glyphicon-sound-7-1:before { + content: "\e193"; +} +.glyphicon-copyright-mark:before { + content: "\e194"; +} +.glyphicon-registration-mark:before { + content: "\e195"; +} +.glyphicon-cloud-download:before { + content: "\e197"; +} +.glyphicon-cloud-upload:before { + content: "\e198"; +} +.glyphicon-tree-conifer:before { + content: "\e199"; +} +.glyphicon-tree-deciduous:before { + content: "\e200"; +} +.glyphicon-cd:before { + content: "\e201"; +} +.glyphicon-save-file:before { + content: "\e202"; +} +.glyphicon-open-file:before { + content: "\e203"; +} +.glyphicon-level-up:before { + content: "\e204"; +} +.glyphicon-copy:before { + content: "\e205"; +} +.glyphicon-paste:before { + content: "\e206"; +} +.glyphicon-alert:before { + content: "\e209"; +} +.glyphicon-equalizer:before { + content: "\e210"; +} +.glyphicon-king:before { + content: "\e211"; +} +.glyphicon-queen:before { + content: "\e212"; +} +.glyphicon-pawn:before { + content: "\e213"; +} +.glyphicon-bishop:before { + content: "\e214"; +} +.glyphicon-knight:before { + content: "\e215"; +} +.glyphicon-baby-formula:before { + content: "\e216"; +} +.glyphicon-tent:before { + content: "\26fa"; +} +.glyphicon-blackboard:before { + content: "\e218"; +} +.glyphicon-bed:before { + content: "\e219"; +} +.glyphicon-apple:before { + content: "\f8ff"; +} +.glyphicon-erase:before { + content: "\e221"; +} +.glyphicon-hourglass:before { + content: "\231b"; +} +.glyphicon-lamp:before { + content: "\e223"; +} +.glyphicon-duplicate:before { + content: "\e224"; +} +.glyphicon-piggy-bank:before { + content: "\e225"; +} +.glyphicon-scissors:before { + content: "\e226"; +} +.glyphicon-bitcoin:before { + content: "\e227"; +} +.glyphicon-btc:before { + content: "\e227"; +} +.glyphicon-xbt:before { + content: "\e227"; +} +.glyphicon-yen:before { + content: "\00a5"; +} +.glyphicon-jpy:before { + content: "\00a5"; +} +.glyphicon-ruble:before { + content: "\20bd"; +} +.glyphicon-rub:before { + content: "\20bd"; +} +.glyphicon-scale:before { + content: "\e230"; +} +.glyphicon-ice-lolly:before { + content: "\e231"; +} +.glyphicon-ice-lolly-tasted:before { + content: "\e232"; +} +.glyphicon-education:before { + content: "\e233"; +} +.glyphicon-option-horizontal:before { + content: "\e234"; +} +.glyphicon-option-vertical:before { + content: "\e235"; +} +.glyphicon-menu-hamburger:before { + content: "\e236"; +} +.glyphicon-modal-window:before { + content: "\e237"; +} +.glyphicon-oil:before { + content: "\e238"; +} +.glyphicon-grain:before { + content: "\e239"; +} +.glyphicon-sunglasses:before { + content: "\e240"; +} +.glyphicon-text-size:before { + content: "\e241"; +} +.glyphicon-text-color:before { + content: "\e242"; +} +.glyphicon-text-background:before { + content: "\e243"; +} +.glyphicon-object-align-top:before { + content: "\e244"; +} +.glyphicon-object-align-bottom:before { + content: "\e245"; +} +.glyphicon-object-align-horizontal:before { + content: "\e246"; +} +.glyphicon-object-align-left:before { + content: "\e247"; +} +.glyphicon-object-align-vertical:before { + content: "\e248"; +} +.glyphicon-object-align-right:before { + content: "\e249"; +} +.glyphicon-triangle-right:before { + content: "\e250"; +} +.glyphicon-triangle-left:before { + content: "\e251"; +} +.glyphicon-triangle-bottom:before { + content: "\e252"; +} +.glyphicon-triangle-top:before { + content: "\e253"; +} +.glyphicon-console:before { + content: "\e254"; +} +.glyphicon-superscript:before { + content: "\e255"; +} +.glyphicon-subscript:before { + content: "\e256"; +} +.glyphicon-menu-left:before { + content: "\e257"; +} +.glyphicon-menu-right:before { + content: "\e258"; +} +.glyphicon-menu-down:before { + content: "\e259"; +} +.glyphicon-menu-up:before { + content: "\e260"; +} +* { + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; +} +*:before, +*:after { + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; +} +html { + font-size: 10px; + + -webkit-tap-highlight-color: rgba(0, 0, 0, 0); +} +body { + font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; + font-size: 14px; + line-height: 1.42857143; + color: #333; + background-color: #fff; +} +input, +button, +select, +textarea { + font-family: inherit; + font-size: inherit; + line-height: inherit; +} +a { + color: #337ab7; + text-decoration: none; +} +a:hover, +a:focus { + color: #23527c; + text-decoration: underline; +} +a:focus { + outline: 5px auto -webkit-focus-ring-color; + outline-offset: -2px; +} +figure { + margin: 0; +} +img { + vertical-align: middle; +} +.img-responsive, +.thumbnail > img, +.thumbnail a > img, +.carousel-inner > .item > img, +.carousel-inner > .item > a > img { + display: block; + max-width: 100%; + height: auto; +} +.img-rounded { + border-radius: 6px; +} +.img-thumbnail { + display: inline-block; + max-width: 100%; + height: auto; + padding: 4px; + line-height: 1.42857143; + background-color: #fff; + border: 1px solid #ddd; + border-radius: 4px; + -webkit-transition: all .2s ease-in-out; + -o-transition: all .2s ease-in-out; + transition: all .2s ease-in-out; +} +.img-circle { + border-radius: 50%; +} +hr { + margin-top: 20px; + margin-bottom: 20px; + border: 0; + border-top: 1px solid #eee; +} +.sr-only { + position: absolute; + width: 1px; + height: 1px; + padding: 0; + margin: -1px; + overflow: hidden; + clip: rect(0, 0, 0, 0); + border: 0; +} +.sr-only-focusable:active, +.sr-only-focusable:focus { + position: static; + width: auto; + height: auto; + margin: 0; + overflow: visible; + clip: auto; +} +[role="button"] { + cursor: pointer; +} +h1, +h2, +h3, +h4, +h5, +h6, +.h1, +.h2, +.h3, +.h4, +.h5, +.h6 { + font-family: inherit; + font-weight: 500; + line-height: 1.1; + color: inherit; +} +h1 small, +h2 small, +h3 small, +h4 small, +h5 small, +h6 small, +.h1 small, +.h2 small, +.h3 small, +.h4 small, +.h5 small, +.h6 small, +h1 .small, +h2 .small, +h3 .small, +h4 .small, +h5 .small, +h6 .small, +.h1 .small, +.h2 .small, +.h3 .small, +.h4 .small, +.h5 .small, +.h6 .small { + font-weight: normal; + line-height: 1; + color: #777; +} +h1, +.h1, +h2, +.h2, +h3, +.h3 { + margin-top: 20px; + margin-bottom: 10px; +} +h1 small, +.h1 small, +h2 small, +.h2 small, +h3 small, +.h3 small, +h1 .small, +.h1 .small, +h2 .small, +.h2 .small, +h3 .small, +.h3 .small { + font-size: 65%; +} +h4, +.h4, +h5, +.h5, +h6, +.h6 { + margin-top: 10px; + margin-bottom: 10px; +} +h4 small, +.h4 small, +h5 small, +.h5 small, +h6 small, +.h6 small, +h4 .small, +.h4 .small, +h5 .small, +.h5 .small, +h6 .small, +.h6 .small { + font-size: 75%; +} +h1, +.h1 { + font-size: 36px; +} +h2, +.h2 { + font-size: 30px; +} +h3, +.h3 { + font-size: 24px; +} +h4, +.h4 { + font-size: 18px; +} +h5, +.h5 { + font-size: 14px; +} +h6, +.h6 { + font-size: 12px; +} +p { + margin: 0 0 10px; +} +.lead { + margin-bottom: 20px; + font-size: 16px; + font-weight: 300; + line-height: 1.4; +} +@media (min-width: 768px) { + .lead { + font-size: 21px; + } +} +small, +.small { + font-size: 85%; +} +mark, +.mark { + padding: .2em; + background-color: #fcf8e3; +} +.text-left { + text-align: left; +} +.text-right { + text-align: right; +} +.text-center { + text-align: center; +} +.text-justify { + text-align: justify; +} +.text-nowrap { + white-space: nowrap; +} +.text-lowercase { + text-transform: lowercase; +} +.text-uppercase { + text-transform: uppercase; +} +.text-capitalize { + text-transform: capitalize; +} +.text-muted { + color: #777; +} +.text-primary { + color: #337ab7; +} +a.text-primary:hover, +a.text-primary:focus { + color: #286090; +} +.text-success { + color: #3c763d; +} +a.text-success:hover, +a.text-success:focus { + color: #2b542c; +} +.text-info { + color: #31708f; +} +a.text-info:hover, +a.text-info:focus { + color: #245269; +} +.text-warning { + color: #8a6d3b; +} +a.text-warning:hover, +a.text-warning:focus { + color: #66512c; +} +.text-danger { + color: #a94442; +} +a.text-danger:hover, +a.text-danger:focus { + color: #843534; +} +.bg-primary { + color: #fff; + background-color: #337ab7; +} +a.bg-primary:hover, +a.bg-primary:focus { + background-color: #286090; +} +.bg-success { + background-color: #dff0d8; +} +a.bg-success:hover, +a.bg-success:focus { + background-color: #c1e2b3; +} +.bg-info { + background-color: #d9edf7; +} +a.bg-info:hover, +a.bg-info:focus { + background-color: #afd9ee; +} +.bg-warning { + background-color: #fcf8e3; +} +a.bg-warning:hover, +a.bg-warning:focus { + background-color: #f7ecb5; +} +.bg-danger { + background-color: #f2dede; +} +a.bg-danger:hover, +a.bg-danger:focus { + background-color: #e4b9b9; +} +.page-header { + padding-bottom: 9px; + margin: 40px 0 20px; + border-bottom: 1px solid #eee; +} +ul, +ol { + margin-top: 0; + margin-bottom: 10px; +} +ul ul, +ol ul, +ul ol, +ol ol { + margin-bottom: 0; +} +.list-unstyled { + padding-left: 0; + list-style: none; +} +.list-inline { + padding-left: 0; + margin-left: -5px; + list-style: none; +} +.list-inline > li { + display: inline-block; + padding-right: 5px; + padding-left: 5px; +} +dl { + margin-top: 0; + margin-bottom: 20px; +} +dt, +dd { + line-height: 1.42857143; +} +dt { + font-weight: bold; +} +dd { + margin-left: 0; +} +@media (min-width: 768px) { + .dl-horizontal dt { + float: left; + width: 160px; + overflow: hidden; + clear: left; + text-align: right; + text-overflow: ellipsis; + white-space: nowrap; + } + .dl-horizontal dd { + margin-left: 180px; + } +} +abbr[title], +abbr[data-original-title] { + cursor: help; + border-bottom: 1px dotted #777; +} +.initialism { + font-size: 90%; + text-transform: uppercase; +} +blockquote { + padding: 10px 20px; + margin: 0 0 20px; + font-size: 17.5px; + border-left: 5px solid #eee; +} +blockquote p:last-child, +blockquote ul:last-child, +blockquote ol:last-child { + margin-bottom: 0; +} +blockquote footer, +blockquote small, +blockquote .small { + display: block; + font-size: 80%; + line-height: 1.42857143; + color: #777; +} +blockquote footer:before, +blockquote small:before, +blockquote .small:before { + content: '\2014 \00A0'; +} +.blockquote-reverse, +blockquote.pull-right { + padding-right: 15px; + padding-left: 0; + text-align: right; + border-right: 5px solid #eee; + border-left: 0; +} +.blockquote-reverse footer:before, +blockquote.pull-right footer:before, +.blockquote-reverse small:before, +blockquote.pull-right small:before, +.blockquote-reverse .small:before, +blockquote.pull-right .small:before { + content: ''; +} +.blockquote-reverse footer:after, +blockquote.pull-right footer:after, +.blockquote-reverse small:after, +blockquote.pull-right small:after, +.blockquote-reverse .small:after, +blockquote.pull-right .small:after { + content: '\00A0 \2014'; +} +address { + margin-bottom: 20px; + font-style: normal; + line-height: 1.42857143; +} +code, +kbd, +pre, +samp { + font-family: Menlo, Monaco, Consolas, "Courier New", monospace; +} +code { + padding: 2px 4px; + font-size: 90%; + color: #c7254e; + background-color: #f9f2f4; + border-radius: 4px; +} +kbd { + padding: 2px 4px; + font-size: 90%; + color: #fff; + background-color: #333; + border-radius: 3px; + -webkit-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, .25); + box-shadow: inset 0 -1px 0 rgba(0, 0, 0, .25); +} +kbd kbd { + padding: 0; + font-size: 100%; + font-weight: bold; + -webkit-box-shadow: none; + box-shadow: none; +} +pre { + display: block; + padding: 9.5px; + margin: 0 0 10px; + font-size: 13px; + line-height: 1.42857143; + color: #333; + word-break: break-all; + word-wrap: break-word; + background-color: #f5f5f5; + border: 1px solid #ccc; + border-radius: 4px; +} +pre code { + padding: 0; + font-size: inherit; + color: inherit; + white-space: pre-wrap; + background-color: transparent; + border-radius: 0; +} +.pre-scrollable { + max-height: 340px; + overflow-y: scroll; +} +.container { + padding-right: 15px; + padding-left: 15px; + margin-right: auto; + margin-left: auto; +} +@media (min-width: 768px) { + .container { + width: 750px; + } +} +@media (min-width: 992px) { + .container { + width: 970px; + } +} +@media (min-width: 1200px) { + .container { + width: 1170px; + } +} +.container-fluid { + padding-right: 15px; + padding-left: 15px; + margin-right: auto; + margin-left: auto; +} +.row { + margin-right: -15px; + margin-left: -15px; +} +.col-xs-1, .col-sm-1, .col-md-1, .col-lg-1, .col-xs-2, .col-sm-2, .col-md-2, .col-lg-2, .col-xs-3, .col-sm-3, .col-md-3, .col-lg-3, .col-xs-4, .col-sm-4, .col-md-4, .col-lg-4, .col-xs-5, .col-sm-5, .col-md-5, .col-lg-5, .col-xs-6, .col-sm-6, .col-md-6, .col-lg-6, .col-xs-7, .col-sm-7, .col-md-7, .col-lg-7, .col-xs-8, .col-sm-8, .col-md-8, .col-lg-8, .col-xs-9, .col-sm-9, .col-md-9, .col-lg-9, .col-xs-10, .col-sm-10, .col-md-10, .col-lg-10, .col-xs-11, .col-sm-11, .col-md-11, .col-lg-11, .col-xs-12, .col-sm-12, .col-md-12, .col-lg-12 { + position: relative; + min-height: 1px; + padding-right: 15px; + padding-left: 15px; +} +.col-xs-1, .col-xs-2, .col-xs-3, .col-xs-4, .col-xs-5, .col-xs-6, .col-xs-7, .col-xs-8, .col-xs-9, .col-xs-10, .col-xs-11, .col-xs-12 { + float: left; +} +.col-xs-12 { + width: 100%; +} +.col-xs-11 { + width: 91.66666667%; +} +.col-xs-10 { + width: 83.33333333%; +} +.col-xs-9 { + width: 75%; +} +.col-xs-8 { + width: 66.66666667%; +} +.col-xs-7 { + width: 58.33333333%; +} +.col-xs-6 { + width: 50%; +} +.col-xs-5 { + width: 41.66666667%; +} +.col-xs-4 { + width: 33.33333333%; +} +.col-xs-3 { + width: 25%; +} +.col-xs-2 { + width: 16.66666667%; +} +.col-xs-1 { + width: 8.33333333%; +} +.col-xs-pull-12 { + right: 100%; +} +.col-xs-pull-11 { + right: 91.66666667%; +} +.col-xs-pull-10 { + right: 83.33333333%; +} +.col-xs-pull-9 { + right: 75%; +} +.col-xs-pull-8 { + right: 66.66666667%; +} +.col-xs-pull-7 { + right: 58.33333333%; +} +.col-xs-pull-6 { + right: 50%; +} +.col-xs-pull-5 { + right: 41.66666667%; +} +.col-xs-pull-4 { + right: 33.33333333%; +} +.col-xs-pull-3 { + right: 25%; +} +.col-xs-pull-2 { + right: 16.66666667%; +} +.col-xs-pull-1 { + right: 8.33333333%; +} +.col-xs-pull-0 { + right: auto; +} +.col-xs-push-12 { + left: 100%; +} +.col-xs-push-11 { + left: 91.66666667%; +} +.col-xs-push-10 { + left: 83.33333333%; +} +.col-xs-push-9 { + left: 75%; +} +.col-xs-push-8 { + left: 66.66666667%; +} +.col-xs-push-7 { + left: 58.33333333%; +} +.col-xs-push-6 { + left: 50%; +} +.col-xs-push-5 { + left: 41.66666667%; +} +.col-xs-push-4 { + left: 33.33333333%; +} +.col-xs-push-3 { + left: 25%; +} +.col-xs-push-2 { + left: 16.66666667%; +} +.col-xs-push-1 { + left: 8.33333333%; +} +.col-xs-push-0 { + left: auto; +} +.col-xs-offset-12 { + margin-left: 100%; +} +.col-xs-offset-11 { + margin-left: 91.66666667%; +} +.col-xs-offset-10 { + margin-left: 83.33333333%; +} +.col-xs-offset-9 { + margin-left: 75%; +} +.col-xs-offset-8 { + margin-left: 66.66666667%; +} +.col-xs-offset-7 { + margin-left: 58.33333333%; +} +.col-xs-offset-6 { + margin-left: 50%; +} +.col-xs-offset-5 { + margin-left: 41.66666667%; +} +.col-xs-offset-4 { + margin-left: 33.33333333%; +} +.col-xs-offset-3 { + margin-left: 25%; +} +.col-xs-offset-2 { + margin-left: 16.66666667%; +} +.col-xs-offset-1 { + margin-left: 8.33333333%; +} +.col-xs-offset-0 { + margin-left: 0; +} +@media (min-width: 768px) { + .col-sm-1, .col-sm-2, .col-sm-3, .col-sm-4, .col-sm-5, .col-sm-6, .col-sm-7, .col-sm-8, .col-sm-9, .col-sm-10, .col-sm-11, .col-sm-12 { + float: left; + } + .col-sm-12 { + width: 100%; + } + .col-sm-11 { + width: 91.66666667%; + } + .col-sm-10 { + width: 83.33333333%; + } + .col-sm-9 { + width: 75%; + } + .col-sm-8 { + width: 66.66666667%; + } + .col-sm-7 { + width: 58.33333333%; + } + .col-sm-6 { + width: 50%; + } + .col-sm-5 { + width: 41.66666667%; + } + .col-sm-4 { + width: 33.33333333%; + } + .col-sm-3 { + width: 25%; + } + .col-sm-2 { + width: 16.66666667%; + } + .col-sm-1 { + width: 8.33333333%; + } + .col-sm-pull-12 { + right: 100%; + } + .col-sm-pull-11 { + right: 91.66666667%; + } + .col-sm-pull-10 { + right: 83.33333333%; + } + .col-sm-pull-9 { + right: 75%; + } + .col-sm-pull-8 { + right: 66.66666667%; + } + .col-sm-pull-7 { + right: 58.33333333%; + } + .col-sm-pull-6 { + right: 50%; + } + .col-sm-pull-5 { + right: 41.66666667%; + } + .col-sm-pull-4 { + right: 33.33333333%; + } + .col-sm-pull-3 { + right: 25%; + } + .col-sm-pull-2 { + right: 16.66666667%; + } + .col-sm-pull-1 { + right: 8.33333333%; + } + .col-sm-pull-0 { + right: auto; + } + .col-sm-push-12 { + left: 100%; + } + .col-sm-push-11 { + left: 91.66666667%; + } + .col-sm-push-10 { + left: 83.33333333%; + } + .col-sm-push-9 { + left: 75%; + } + .col-sm-push-8 { + left: 66.66666667%; + } + .col-sm-push-7 { + left: 58.33333333%; + } + .col-sm-push-6 { + left: 50%; + } + .col-sm-push-5 { + left: 41.66666667%; + } + .col-sm-push-4 { + left: 33.33333333%; + } + .col-sm-push-3 { + left: 25%; + } + .col-sm-push-2 { + left: 16.66666667%; + } + .col-sm-push-1 { + left: 8.33333333%; + } + .col-sm-push-0 { + left: auto; + } + .col-sm-offset-12 { + margin-left: 100%; + } + .col-sm-offset-11 { + margin-left: 91.66666667%; + } + .col-sm-offset-10 { + margin-left: 83.33333333%; + } + .col-sm-offset-9 { + margin-left: 75%; + } + .col-sm-offset-8 { + margin-left: 66.66666667%; + } + .col-sm-offset-7 { + margin-left: 58.33333333%; + } + .col-sm-offset-6 { + margin-left: 50%; + } + .col-sm-offset-5 { + margin-left: 41.66666667%; + } + .col-sm-offset-4 { + margin-left: 33.33333333%; + } + .col-sm-offset-3 { + margin-left: 25%; + } + .col-sm-offset-2 { + margin-left: 16.66666667%; + } + .col-sm-offset-1 { + margin-left: 8.33333333%; + } + .col-sm-offset-0 { + margin-left: 0; + } +} +@media (min-width: 992px) { + .col-md-1, .col-md-2, .col-md-3, .col-md-4, .col-md-5, .col-md-6, .col-md-7, .col-md-8, .col-md-9, .col-md-10, .col-md-11, .col-md-12 { + float: left; + } + .col-md-12 { + width: 100%; + } + .col-md-11 { + width: 91.66666667%; + } + .col-md-10 { + width: 83.33333333%; + } + .col-md-9 { + width: 75%; + } + .col-md-8 { + width: 66.66666667%; + } + .col-md-7 { + width: 58.33333333%; + } + .col-md-6 { + width: 50%; + } + .col-md-5 { + width: 41.66666667%; + } + .col-md-4 { + width: 33.33333333%; + } + .col-md-3 { + width: 25%; + } + .col-md-2 { + width: 16.66666667%; + } + .col-md-1 { + width: 8.33333333%; + } + .col-md-pull-12 { + right: 100%; + } + .col-md-pull-11 { + right: 91.66666667%; + } + .col-md-pull-10 { + right: 83.33333333%; + } + .col-md-pull-9 { + right: 75%; + } + .col-md-pull-8 { + right: 66.66666667%; + } + .col-md-pull-7 { + right: 58.33333333%; + } + .col-md-pull-6 { + right: 50%; + } + .col-md-pull-5 { + right: 41.66666667%; + } + .col-md-pull-4 { + right: 33.33333333%; + } + .col-md-pull-3 { + right: 25%; + } + .col-md-pull-2 { + right: 16.66666667%; + } + .col-md-pull-1 { + right: 8.33333333%; + } + .col-md-pull-0 { + right: auto; + } + .col-md-push-12 { + left: 100%; + } + .col-md-push-11 { + left: 91.66666667%; + } + .col-md-push-10 { + left: 83.33333333%; + } + .col-md-push-9 { + left: 75%; + } + .col-md-push-8 { + left: 66.66666667%; + } + .col-md-push-7 { + left: 58.33333333%; + } + .col-md-push-6 { + left: 50%; + } + .col-md-push-5 { + left: 41.66666667%; + } + .col-md-push-4 { + left: 33.33333333%; + } + .col-md-push-3 { + left: 25%; + } + .col-md-push-2 { + left: 16.66666667%; + } + .col-md-push-1 { + left: 8.33333333%; + } + .col-md-push-0 { + left: auto; + } + .col-md-offset-12 { + margin-left: 100%; + } + .col-md-offset-11 { + margin-left: 91.66666667%; + } + .col-md-offset-10 { + margin-left: 83.33333333%; + } + .col-md-offset-9 { + margin-left: 75%; + } + .col-md-offset-8 { + margin-left: 66.66666667%; + } + .col-md-offset-7 { + margin-left: 58.33333333%; + } + .col-md-offset-6 { + margin-left: 50%; + } + .col-md-offset-5 { + margin-left: 41.66666667%; + } + .col-md-offset-4 { + margin-left: 33.33333333%; + } + .col-md-offset-3 { + margin-left: 25%; + } + .col-md-offset-2 { + margin-left: 16.66666667%; + } + .col-md-offset-1 { + margin-left: 8.33333333%; + } + .col-md-offset-0 { + margin-left: 0; + } +} +@media (min-width: 1200px) { + .col-lg-1, .col-lg-2, .col-lg-3, .col-lg-4, .col-lg-5, .col-lg-6, .col-lg-7, .col-lg-8, .col-lg-9, .col-lg-10, .col-lg-11, .col-lg-12 { + float: left; + } + .col-lg-12 { + width: 100%; + } + .col-lg-11 { + width: 91.66666667%; + } + .col-lg-10 { + width: 83.33333333%; + } + .col-lg-9 { + width: 75%; + } + .col-lg-8 { + width: 66.66666667%; + } + .col-lg-7 { + width: 58.33333333%; + } + .col-lg-6 { + width: 50%; + } + .col-lg-5 { + width: 41.66666667%; + } + .col-lg-4 { + width: 33.33333333%; + } + .col-lg-3 { + width: 25%; + } + .col-lg-2 { + width: 16.66666667%; + } + .col-lg-1 { + width: 8.33333333%; + } + .col-lg-pull-12 { + right: 100%; + } + .col-lg-pull-11 { + right: 91.66666667%; + } + .col-lg-pull-10 { + right: 83.33333333%; + } + .col-lg-pull-9 { + right: 75%; + } + .col-lg-pull-8 { + right: 66.66666667%; + } + .col-lg-pull-7 { + right: 58.33333333%; + } + .col-lg-pull-6 { + right: 50%; + } + .col-lg-pull-5 { + right: 41.66666667%; + } + .col-lg-pull-4 { + right: 33.33333333%; + } + .col-lg-pull-3 { + right: 25%; + } + .col-lg-pull-2 { + right: 16.66666667%; + } + .col-lg-pull-1 { + right: 8.33333333%; + } + .col-lg-pull-0 { + right: auto; + } + .col-lg-push-12 { + left: 100%; + } + .col-lg-push-11 { + left: 91.66666667%; + } + .col-lg-push-10 { + left: 83.33333333%; + } + .col-lg-push-9 { + left: 75%; + } + .col-lg-push-8 { + left: 66.66666667%; + } + .col-lg-push-7 { + left: 58.33333333%; + } + .col-lg-push-6 { + left: 50%; + } + .col-lg-push-5 { + left: 41.66666667%; + } + .col-lg-push-4 { + left: 33.33333333%; + } + .col-lg-push-3 { + left: 25%; + } + .col-lg-push-2 { + left: 16.66666667%; + } + .col-lg-push-1 { + left: 8.33333333%; + } + .col-lg-push-0 { + left: auto; + } + .col-lg-offset-12 { + margin-left: 100%; + } + .col-lg-offset-11 { + margin-left: 91.66666667%; + } + .col-lg-offset-10 { + margin-left: 83.33333333%; + } + .col-lg-offset-9 { + margin-left: 75%; + } + .col-lg-offset-8 { + margin-left: 66.66666667%; + } + .col-lg-offset-7 { + margin-left: 58.33333333%; + } + .col-lg-offset-6 { + margin-left: 50%; + } + .col-lg-offset-5 { + margin-left: 41.66666667%; + } + .col-lg-offset-4 { + margin-left: 33.33333333%; + } + .col-lg-offset-3 { + margin-left: 25%; + } + .col-lg-offset-2 { + margin-left: 16.66666667%; + } + .col-lg-offset-1 { + margin-left: 8.33333333%; + } + .col-lg-offset-0 { + margin-left: 0; + } +} +table { + background-color: transparent; +} +caption { + padding-top: 8px; + padding-bottom: 8px; + color: #777; + text-align: left; +} +th { + text-align: left; +} +.table { + width: 100%; + max-width: 100%; + margin-bottom: 20px; +} +.table > thead > tr > th, +.table > tbody > tr > th, +.table > tfoot > tr > th, +.table > thead > tr > td, +.table > tbody > tr > td, +.table > tfoot > tr > td { + padding: 8px; + line-height: 1.42857143; + vertical-align: top; + border-top: 1px solid #ddd; +} +.table > thead > tr > th { + vertical-align: bottom; + border-bottom: 2px solid #ddd; +} +.table > caption + thead > tr:first-child > th, +.table > colgroup + thead > tr:first-child > th, +.table > thead:first-child > tr:first-child > th, +.table > caption + thead > tr:first-child > td, +.table > colgroup + thead > tr:first-child > td, +.table > thead:first-child > tr:first-child > td { + border-top: 0; +} +.table > tbody + tbody { + border-top: 2px solid #ddd; +} +.table .table { + background-color: #fff; +} +.table-condensed > thead > tr > th, +.table-condensed > tbody > tr > th, +.table-condensed > tfoot > tr > th, +.table-condensed > thead > tr > td, +.table-condensed > tbody > tr > td, +.table-condensed > tfoot > tr > td { + padding: 5px; +} +.table-bordered { + border: 1px solid #ddd; +} +.table-bordered > thead > tr > th, +.table-bordered > tbody > tr > th, +.table-bordered > tfoot > tr > th, +.table-bordered > thead > tr > td, +.table-bordered > tbody > tr > td, +.table-bordered > tfoot > tr > td { + border: 1px solid #ddd; +} +.table-bordered > thead > tr > th, +.table-bordered > thead > tr > td { + border-bottom-width: 2px; +} +.table-striped > tbody > tr:nth-of-type(odd) { + background-color: #f9f9f9; +} +.table-hover > tbody > tr:hover { + background-color: #f5f5f5; +} +table col[class*="col-"] { + position: static; + display: table-column; + float: none; +} +table td[class*="col-"], +table th[class*="col-"] { + position: static; + display: table-cell; + float: none; +} +.table > thead > tr > td.active, +.table > tbody > tr > td.active, +.table > tfoot > tr > td.active, +.table > thead > tr > th.active, +.table > tbody > tr > th.active, +.table > tfoot > tr > th.active, +.table > thead > tr.active > td, +.table > tbody > tr.active > td, +.table > tfoot > tr.active > td, +.table > thead > tr.active > th, +.table > tbody > tr.active > th, +.table > tfoot > tr.active > th { + background-color: #f5f5f5; +} +.table-hover > tbody > tr > td.active:hover, +.table-hover > tbody > tr > th.active:hover, +.table-hover > tbody > tr.active:hover > td, +.table-hover > tbody > tr:hover > .active, +.table-hover > tbody > tr.active:hover > th { + background-color: #e8e8e8; +} +.table > thead > tr > td.success, +.table > tbody > tr > td.success, +.table > tfoot > tr > td.success, +.table > thead > tr > th.success, +.table > tbody > tr > th.success, +.table > tfoot > tr > th.success, +.table > thead > tr.success > td, +.table > tbody > tr.success > td, +.table > tfoot > tr.success > td, +.table > thead > tr.success > th, +.table > tbody > tr.success > th, +.table > tfoot > tr.success > th { + background-color: #dff0d8; +} +.table-hover > tbody > tr > td.success:hover, +.table-hover > tbody > tr > th.success:hover, +.table-hover > tbody > tr.success:hover > td, +.table-hover > tbody > tr:hover > .success, +.table-hover > tbody > tr.success:hover > th { + background-color: #d0e9c6; +} +.table > thead > tr > td.info, +.table > tbody > tr > td.info, +.table > tfoot > tr > td.info, +.table > thead > tr > th.info, +.table > tbody > tr > th.info, +.table > tfoot > tr > th.info, +.table > thead > tr.info > td, +.table > tbody > tr.info > td, +.table > tfoot > tr.info > td, +.table > thead > tr.info > th, +.table > tbody > tr.info > th, +.table > tfoot > tr.info > th { + background-color: #d9edf7; +} +.table-hover > tbody > tr > td.info:hover, +.table-hover > tbody > tr > th.info:hover, +.table-hover > tbody > tr.info:hover > td, +.table-hover > tbody > tr:hover > .info, +.table-hover > tbody > tr.info:hover > th { + background-color: #c4e3f3; +} +.table > thead > tr > td.warning, +.table > tbody > tr > td.warning, +.table > tfoot > tr > td.warning, +.table > thead > tr > th.warning, +.table > tbody > tr > th.warning, +.table > tfoot > tr > th.warning, +.table > thead > tr.warning > td, +.table > tbody > tr.warning > td, +.table > tfoot > tr.warning > td, +.table > thead > tr.warning > th, +.table > tbody > tr.warning > th, +.table > tfoot > tr.warning > th { + background-color: #fcf8e3; +} +.table-hover > tbody > tr > td.warning:hover, +.table-hover > tbody > tr > th.warning:hover, +.table-hover > tbody > tr.warning:hover > td, +.table-hover > tbody > tr:hover > .warning, +.table-hover > tbody > tr.warning:hover > th { + background-color: #faf2cc; +} +.table > thead > tr > td.danger, +.table > tbody > tr > td.danger, +.table > tfoot > tr > td.danger, +.table > thead > tr > th.danger, +.table > tbody > tr > th.danger, +.table > tfoot > tr > th.danger, +.table > thead > tr.danger > td, +.table > tbody > tr.danger > td, +.table > tfoot > tr.danger > td, +.table > thead > tr.danger > th, +.table > tbody > tr.danger > th, +.table > tfoot > tr.danger > th { + background-color: #f2dede; +} +.table-hover > tbody > tr > td.danger:hover, +.table-hover > tbody > tr > th.danger:hover, +.table-hover > tbody > tr.danger:hover > td, +.table-hover > tbody > tr:hover > .danger, +.table-hover > tbody > tr.danger:hover > th { + background-color: #ebcccc; +} +.table-responsive { + min-height: .01%; + overflow-x: auto; +} +@media screen and (max-width: 767px) { + .table-responsive { + width: 100%; + margin-bottom: 15px; + overflow-y: hidden; + -ms-overflow-style: -ms-autohiding-scrollbar; + border: 1px solid #ddd; + } + .table-responsive > .table { + margin-bottom: 0; + } + .table-responsive > .table > thead > tr > th, + .table-responsive > .table > tbody > tr > th, + .table-responsive > .table > tfoot > tr > th, + .table-responsive > .table > thead > tr > td, + .table-responsive > .table > tbody > tr > td, + .table-responsive > .table > tfoot > tr > td { + white-space: nowrap; + } + .table-responsive > .table-bordered { + border: 0; + } + .table-responsive > .table-bordered > thead > tr > th:first-child, + .table-responsive > .table-bordered > tbody > tr > th:first-child, + .table-responsive > .table-bordered > tfoot > tr > th:first-child, + .table-responsive > .table-bordered > thead > tr > td:first-child, + .table-responsive > .table-bordered > tbody > tr > td:first-child, + .table-responsive > .table-bordered > tfoot > tr > td:first-child { + border-left: 0; + } + .table-responsive > .table-bordered > thead > tr > th:last-child, + .table-responsive > .table-bordered > tbody > tr > th:last-child, + .table-responsive > .table-bordered > tfoot > tr > th:last-child, + .table-responsive > .table-bordered > thead > tr > td:last-child, + .table-responsive > .table-bordered > tbody > tr > td:last-child, + .table-responsive > .table-bordered > tfoot > tr > td:last-child { + border-right: 0; + } + .table-responsive > .table-bordered > tbody > tr:last-child > th, + .table-responsive > .table-bordered > tfoot > tr:last-child > th, + .table-responsive > .table-bordered > tbody > tr:last-child > td, + .table-responsive > .table-bordered > tfoot > tr:last-child > td { + border-bottom: 0; + } +} +fieldset { + min-width: 0; + padding: 0; + margin: 0; + border: 0; +} +legend { + display: block; + width: 100%; + padding: 0; + margin-bottom: 20px; + font-size: 21px; + line-height: inherit; + color: #333; + border: 0; + border-bottom: 1px solid #e5e5e5; +} +label { + display: inline-block; + max-width: 100%; + margin-bottom: 5px; + font-weight: bold; +} +input[type="search"] { + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; +} +input[type="radio"], +input[type="checkbox"] { + margin: 4px 0 0; + margin-top: 1px \9; + line-height: normal; +} +input[type="file"] { + display: block; +} +input[type="range"] { + display: block; + width: 100%; +} +select[multiple], +select[size] { + height: auto; +} +input[type="file"]:focus, +input[type="radio"]:focus, +input[type="checkbox"]:focus { + outline: 5px auto -webkit-focus-ring-color; + outline-offset: -2px; +} +output { + display: block; + padding-top: 7px; + font-size: 14px; + line-height: 1.42857143; + color: #555; +} +.form-control { + display: block; + width: 100%; + height: 34px; + padding: 6px 12px; + font-size: 14px; + line-height: 1.42857143; + color: #555; + background-color: #fff; + background-image: none; + border: 1px solid #ccc; + border-radius: 4px; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075); + -webkit-transition: border-color ease-in-out .15s, -webkit-box-shadow ease-in-out .15s; + -o-transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s; + transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s; +} +.form-control:focus { + border-color: #66afe9; + outline: 0; + -webkit-box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(102, 175, 233, .6); + box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(102, 175, 233, .6); +} +.form-control::-moz-placeholder { + color: #999; + opacity: 1; +} +.form-control:-ms-input-placeholder { + color: #999; +} +.form-control::-webkit-input-placeholder { + color: #999; +} +.form-control::-ms-expand { + background-color: transparent; + border: 0; +} +.form-control[disabled], +.form-control[readonly], +fieldset[disabled] .form-control { + background-color: #eee; + opacity: 1; +} +.form-control[disabled], +fieldset[disabled] .form-control { + cursor: not-allowed; +} +textarea.form-control { + height: auto; +} +input[type="search"] { + -webkit-appearance: none; +} +@media screen and (-webkit-min-device-pixel-ratio: 0) { + input[type="date"].form-control, + input[type="time"].form-control, + input[type="datetime-local"].form-control, + input[type="month"].form-control { + line-height: 34px; + } + input[type="date"].input-sm, + input[type="time"].input-sm, + input[type="datetime-local"].input-sm, + input[type="month"].input-sm, + .input-group-sm input[type="date"], + .input-group-sm input[type="time"], + .input-group-sm input[type="datetime-local"], + .input-group-sm input[type="month"] { + line-height: 30px; + } + input[type="date"].input-lg, + input[type="time"].input-lg, + input[type="datetime-local"].input-lg, + input[type="month"].input-lg, + .input-group-lg input[type="date"], + .input-group-lg input[type="time"], + .input-group-lg input[type="datetime-local"], + .input-group-lg input[type="month"] { + line-height: 46px; + } +} +.form-group { + margin-bottom: 15px; +} +.radio, +.checkbox { + position: relative; + display: block; + margin-top: 10px; + margin-bottom: 10px; +} +.radio label, +.checkbox label { + min-height: 20px; + padding-left: 20px; + margin-bottom: 0; + font-weight: normal; + cursor: pointer; +} +.radio input[type="radio"], +.radio-inline input[type="radio"], +.checkbox input[type="checkbox"], +.checkbox-inline input[type="checkbox"] { + position: absolute; + margin-top: 4px \9; + margin-left: -20px; +} +.radio + .radio, +.checkbox + .checkbox { + margin-top: -5px; +} +.radio-inline, +.checkbox-inline { + position: relative; + display: inline-block; + padding-left: 20px; + margin-bottom: 0; + font-weight: normal; + vertical-align: middle; + cursor: pointer; +} +.radio-inline + .radio-inline, +.checkbox-inline + .checkbox-inline { + margin-top: 0; + margin-left: 10px; +} +input[type="radio"][disabled], +input[type="checkbox"][disabled], +input[type="radio"].disabled, +input[type="checkbox"].disabled, +fieldset[disabled] input[type="radio"], +fieldset[disabled] input[type="checkbox"] { + cursor: not-allowed; +} +.radio-inline.disabled, +.checkbox-inline.disabled, +fieldset[disabled] .radio-inline, +fieldset[disabled] .checkbox-inline { + cursor: not-allowed; +} +.radio.disabled label, +.checkbox.disabled label, +fieldset[disabled] .radio label, +fieldset[disabled] .checkbox label { + cursor: not-allowed; +} +.form-control-static { + min-height: 34px; + padding-top: 7px; + padding-bottom: 7px; + margin-bottom: 0; +} +.form-control-static.input-lg, +.form-control-static.input-sm { + padding-right: 0; + padding-left: 0; +} +.input-sm { + height: 30px; + padding: 5px 10px; + font-size: 12px; + line-height: 1.5; + border-radius: 3px; +} +select.input-sm { + height: 30px; + line-height: 30px; +} +textarea.input-sm, +select[multiple].input-sm { + height: auto; +} +.form-group-sm .form-control { + height: 30px; + padding: 5px 10px; + font-size: 12px; + line-height: 1.5; + border-radius: 3px; +} +.form-group-sm select.form-control { + height: 30px; + line-height: 30px; +} +.form-group-sm textarea.form-control, +.form-group-sm select[multiple].form-control { + height: auto; +} +.form-group-sm .form-control-static { + height: 30px; + min-height: 32px; + padding: 6px 10px; + font-size: 12px; + line-height: 1.5; +} +.input-lg { + height: 46px; + padding: 10px 16px; + font-size: 18px; + line-height: 1.3333333; + border-radius: 6px; +} +select.input-lg { + height: 46px; + line-height: 46px; +} +textarea.input-lg, +select[multiple].input-lg { + height: auto; +} +.form-group-lg .form-control { + height: 46px; + padding: 10px 16px; + font-size: 18px; + line-height: 1.3333333; + border-radius: 6px; +} +.form-group-lg select.form-control { + height: 46px; + line-height: 46px; +} +.form-group-lg textarea.form-control, +.form-group-lg select[multiple].form-control { + height: auto; +} +.form-group-lg .form-control-static { + height: 46px; + min-height: 38px; + padding: 11px 16px; + font-size: 18px; + line-height: 1.3333333; +} +.has-feedback { + position: relative; +} +.has-feedback .form-control { + padding-right: 42.5px; +} +.form-control-feedback { + position: absolute; + top: 0; + right: 0; + z-index: 2; + display: block; + width: 34px; + height: 34px; + line-height: 34px; + text-align: center; + pointer-events: none; +} +.input-lg + .form-control-feedback, +.input-group-lg + .form-control-feedback, +.form-group-lg .form-control + .form-control-feedback { + width: 46px; + height: 46px; + line-height: 46px; +} +.input-sm + .form-control-feedback, +.input-group-sm + .form-control-feedback, +.form-group-sm .form-control + .form-control-feedback { + width: 30px; + height: 30px; + line-height: 30px; +} +.has-success .help-block, +.has-success .control-label, +.has-success .radio, +.has-success .checkbox, +.has-success .radio-inline, +.has-success .checkbox-inline, +.has-success.radio label, +.has-success.checkbox label, +.has-success.radio-inline label, +.has-success.checkbox-inline label { + color: #3c763d; +} +.has-success .form-control { + border-color: #3c763d; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075); +} +.has-success .form-control:focus { + border-color: #2b542c; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 6px #67b168; + box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 6px #67b168; +} +.has-success .input-group-addon { + color: #3c763d; + background-color: #dff0d8; + border-color: #3c763d; +} +.has-success .form-control-feedback { + color: #3c763d; +} +.has-warning .help-block, +.has-warning .control-label, +.has-warning .radio, +.has-warning .checkbox, +.has-warning .radio-inline, +.has-warning .checkbox-inline, +.has-warning.radio label, +.has-warning.checkbox label, +.has-warning.radio-inline label, +.has-warning.checkbox-inline label { + color: #8a6d3b; +} +.has-warning .form-control { + border-color: #8a6d3b; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075); +} +.has-warning .form-control:focus { + border-color: #66512c; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 6px #c0a16b; + box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 6px #c0a16b; +} +.has-warning .input-group-addon { + color: #8a6d3b; + background-color: #fcf8e3; + border-color: #8a6d3b; +} +.has-warning .form-control-feedback { + color: #8a6d3b; +} +.has-error .help-block, +.has-error .control-label, +.has-error .radio, +.has-error .checkbox, +.has-error .radio-inline, +.has-error .checkbox-inline, +.has-error.radio label, +.has-error.checkbox label, +.has-error.radio-inline label, +.has-error.checkbox-inline label { + color: #a94442; +} +.has-error .form-control { + border-color: #a94442; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075); +} +.has-error .form-control:focus { + border-color: #843534; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 6px #ce8483; + box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 6px #ce8483; +} +.has-error .input-group-addon { + color: #a94442; + background-color: #f2dede; + border-color: #a94442; +} +.has-error .form-control-feedback { + color: #a94442; +} +.has-feedback label ~ .form-control-feedback { + top: 25px; +} +.has-feedback label.sr-only ~ .form-control-feedback { + top: 0; +} +.help-block { + display: block; + margin-top: 5px; + margin-bottom: 10px; + color: #737373; +} +@media (min-width: 768px) { + .form-inline .form-group { + display: inline-block; + margin-bottom: 0; + vertical-align: middle; + } + .form-inline .form-control { + display: inline-block; + width: auto; + vertical-align: middle; + } + .form-inline .form-control-static { + display: inline-block; + } + .form-inline .input-group { + display: inline-table; + vertical-align: middle; + } + .form-inline .input-group .input-group-addon, + .form-inline .input-group .input-group-btn, + .form-inline .input-group .form-control { + width: auto; + } + .form-inline .input-group > .form-control { + width: 100%; + } + .form-inline .control-label { + margin-bottom: 0; + vertical-align: middle; + } + .form-inline .radio, + .form-inline .checkbox { + display: inline-block; + margin-top: 0; + margin-bottom: 0; + vertical-align: middle; + } + .form-inline .radio label, + .form-inline .checkbox label { + padding-left: 0; + } + .form-inline .radio input[type="radio"], + .form-inline .checkbox input[type="checkbox"] { + position: relative; + margin-left: 0; + } + .form-inline .has-feedback .form-control-feedback { + top: 0; + } +} +.form-horizontal .radio, +.form-horizontal .checkbox, +.form-horizontal .radio-inline, +.form-horizontal .checkbox-inline { + padding-top: 7px; + margin-top: 0; + margin-bottom: 0; +} +.form-horizontal .radio, +.form-horizontal .checkbox { + min-height: 27px; +} +.form-horizontal .form-group { + margin-right: -15px; + margin-left: -15px; +} +@media (min-width: 768px) { + .form-horizontal .control-label { + padding-top: 7px; + margin-bottom: 0; + text-align: right; + } +} +.form-horizontal .has-feedback .form-control-feedback { + right: 15px; +} +@media (min-width: 768px) { + .form-horizontal .form-group-lg .control-label { + padding-top: 11px; + font-size: 18px; + } +} +@media (min-width: 768px) { + .form-horizontal .form-group-sm .control-label { + padding-top: 6px; + font-size: 12px; + } +} +.btn { + display: inline-block; + padding: 6px 12px; + margin-bottom: 0; + font-size: 14px; + font-weight: normal; + line-height: 1.42857143; + text-align: center; + white-space: nowrap; + vertical-align: middle; + -ms-touch-action: manipulation; + touch-action: manipulation; + cursor: pointer; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + background-image: none; + border: 1px solid transparent; + border-radius: 4px; +} +.btn:focus, +.btn:active:focus, +.btn.active:focus, +.btn.focus, +.btn:active.focus, +.btn.active.focus { + outline: 5px auto -webkit-focus-ring-color; + outline-offset: -2px; +} +.btn:hover, +.btn:focus, +.btn.focus { + color: #333; + text-decoration: none; +} +.btn:active, +.btn.active { + background-image: none; + outline: 0; + -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125); + box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125); +} +.btn.disabled, +.btn[disabled], +fieldset[disabled] .btn { + cursor: not-allowed; + filter: alpha(opacity=65); + -webkit-box-shadow: none; + box-shadow: none; + opacity: .65; +} +a.btn.disabled, +fieldset[disabled] a.btn { + pointer-events: none; +} +.btn-default { + color: #333; + background-color: #fff; + border-color: #ccc; +} +.btn-default:focus, +.btn-default.focus { + color: #333; + background-color: #e6e6e6; + border-color: #8c8c8c; +} +.btn-default:hover { + color: #333; + background-color: #e6e6e6; + border-color: #adadad; +} +.btn-default:active, +.btn-default.active, +.open > .dropdown-toggle.btn-default { + color: #333; + background-color: #e6e6e6; + border-color: #adadad; +} +.btn-default:active:hover, +.btn-default.active:hover, +.open > .dropdown-toggle.btn-default:hover, +.btn-default:active:focus, +.btn-default.active:focus, +.open > .dropdown-toggle.btn-default:focus, +.btn-default:active.focus, +.btn-default.active.focus, +.open > .dropdown-toggle.btn-default.focus { + color: #333; + background-color: #d4d4d4; + border-color: #8c8c8c; +} +.btn-default:active, +.btn-default.active, +.open > .dropdown-toggle.btn-default { + background-image: none; +} +.btn-default.disabled:hover, +.btn-default[disabled]:hover, +fieldset[disabled] .btn-default:hover, +.btn-default.disabled:focus, +.btn-default[disabled]:focus, +fieldset[disabled] .btn-default:focus, +.btn-default.disabled.focus, +.btn-default[disabled].focus, +fieldset[disabled] .btn-default.focus { + background-color: #fff; + border-color: #ccc; +} +.btn-default .badge { + color: #fff; + background-color: #333; +} +.btn-primary { + color: #fff; + background-color: #337ab7; + border-color: #2e6da4; +} +.btn-primary:focus, +.btn-primary.focus { + color: #fff; + background-color: #286090; + border-color: #122b40; +} +.btn-primary:hover { + color: #fff; + background-color: #286090; + border-color: #204d74; +} +.btn-primary:active, +.btn-primary.active, +.open > .dropdown-toggle.btn-primary { + color: #fff; + background-color: #286090; + border-color: #204d74; +} +.btn-primary:active:hover, +.btn-primary.active:hover, +.open > .dropdown-toggle.btn-primary:hover, +.btn-primary:active:focus, +.btn-primary.active:focus, +.open > .dropdown-toggle.btn-primary:focus, +.btn-primary:active.focus, +.btn-primary.active.focus, +.open > .dropdown-toggle.btn-primary.focus { + color: #fff; + background-color: #204d74; + border-color: #122b40; +} +.btn-primary:active, +.btn-primary.active, +.open > .dropdown-toggle.btn-primary { + background-image: none; +} +.btn-primary.disabled:hover, +.btn-primary[disabled]:hover, +fieldset[disabled] .btn-primary:hover, +.btn-primary.disabled:focus, +.btn-primary[disabled]:focus, +fieldset[disabled] .btn-primary:focus, +.btn-primary.disabled.focus, +.btn-primary[disabled].focus, +fieldset[disabled] .btn-primary.focus { + background-color: #337ab7; + border-color: #2e6da4; +} +.btn-primary .badge { + color: #337ab7; + background-color: #fff; +} +.btn-success { + color: #fff; + background-color: #5cb85c; + border-color: #4cae4c; +} +.btn-success:focus, +.btn-success.focus { + color: #fff; + background-color: #449d44; + border-color: #255625; +} +.btn-success:hover { + color: #fff; + background-color: #449d44; + border-color: #398439; +} +.btn-success:active, +.btn-success.active, +.open > .dropdown-toggle.btn-success { + color: #fff; + background-color: #449d44; + border-color: #398439; +} +.btn-success:active:hover, +.btn-success.active:hover, +.open > .dropdown-toggle.btn-success:hover, +.btn-success:active:focus, +.btn-success.active:focus, +.open > .dropdown-toggle.btn-success:focus, +.btn-success:active.focus, +.btn-success.active.focus, +.open > .dropdown-toggle.btn-success.focus { + color: #fff; + background-color: #398439; + border-color: #255625; +} +.btn-success:active, +.btn-success.active, +.open > .dropdown-toggle.btn-success { + background-image: none; +} +.btn-success.disabled:hover, +.btn-success[disabled]:hover, +fieldset[disabled] .btn-success:hover, +.btn-success.disabled:focus, +.btn-success[disabled]:focus, +fieldset[disabled] .btn-success:focus, +.btn-success.disabled.focus, +.btn-success[disabled].focus, +fieldset[disabled] .btn-success.focus { + background-color: #5cb85c; + border-color: #4cae4c; +} +.btn-success .badge { + color: #5cb85c; + background-color: #fff; +} +.btn-info { + color: #fff; + background-color: #5bc0de; + border-color: #46b8da; +} +.btn-info:focus, +.btn-info.focus { + color: #fff; + background-color: #31b0d5; + border-color: #1b6d85; +} +.btn-info:hover { + color: #fff; + background-color: #31b0d5; + border-color: #269abc; +} +.btn-info:active, +.btn-info.active, +.open > .dropdown-toggle.btn-info { + color: #fff; + background-color: #31b0d5; + border-color: #269abc; +} +.btn-info:active:hover, +.btn-info.active:hover, +.open > .dropdown-toggle.btn-info:hover, +.btn-info:active:focus, +.btn-info.active:focus, +.open > .dropdown-toggle.btn-info:focus, +.btn-info:active.focus, +.btn-info.active.focus, +.open > .dropdown-toggle.btn-info.focus { + color: #fff; + background-color: #269abc; + border-color: #1b6d85; +} +.btn-info:active, +.btn-info.active, +.open > .dropdown-toggle.btn-info { + background-image: none; +} +.btn-info.disabled:hover, +.btn-info[disabled]:hover, +fieldset[disabled] .btn-info:hover, +.btn-info.disabled:focus, +.btn-info[disabled]:focus, +fieldset[disabled] .btn-info:focus, +.btn-info.disabled.focus, +.btn-info[disabled].focus, +fieldset[disabled] .btn-info.focus { + background-color: #5bc0de; + border-color: #46b8da; +} +.btn-info .badge { + color: #5bc0de; + background-color: #fff; +} +.btn-warning { + color: #fff; + background-color: #f0ad4e; + border-color: #eea236; +} +.btn-warning:focus, +.btn-warning.focus { + color: #fff; + background-color: #ec971f; + border-color: #985f0d; +} +.btn-warning:hover { + color: #fff; + background-color: #ec971f; + border-color: #d58512; +} +.btn-warning:active, +.btn-warning.active, +.open > .dropdown-toggle.btn-warning { + color: #fff; + background-color: #ec971f; + border-color: #d58512; +} +.btn-warning:active:hover, +.btn-warning.active:hover, +.open > .dropdown-toggle.btn-warning:hover, +.btn-warning:active:focus, +.btn-warning.active:focus, +.open > .dropdown-toggle.btn-warning:focus, +.btn-warning:active.focus, +.btn-warning.active.focus, +.open > .dropdown-toggle.btn-warning.focus { + color: #fff; + background-color: #d58512; + border-color: #985f0d; +} +.btn-warning:active, +.btn-warning.active, +.open > .dropdown-toggle.btn-warning { + background-image: none; +} +.btn-warning.disabled:hover, +.btn-warning[disabled]:hover, +fieldset[disabled] .btn-warning:hover, +.btn-warning.disabled:focus, +.btn-warning[disabled]:focus, +fieldset[disabled] .btn-warning:focus, +.btn-warning.disabled.focus, +.btn-warning[disabled].focus, +fieldset[disabled] .btn-warning.focus { + background-color: #f0ad4e; + border-color: #eea236; +} +.btn-warning .badge { + color: #f0ad4e; + background-color: #fff; +} +.btn-danger { + color: #fff; + background-color: #d9534f; + border-color: #d43f3a; +} +.btn-danger:focus, +.btn-danger.focus { + color: #fff; + background-color: #c9302c; + border-color: #761c19; +} +.btn-danger:hover { + color: #fff; + background-color: #c9302c; + border-color: #ac2925; +} +.btn-danger:active, +.btn-danger.active, +.open > .dropdown-toggle.btn-danger { + color: #fff; + background-color: #c9302c; + border-color: #ac2925; +} +.btn-danger:active:hover, +.btn-danger.active:hover, +.open > .dropdown-toggle.btn-danger:hover, +.btn-danger:active:focus, +.btn-danger.active:focus, +.open > .dropdown-toggle.btn-danger:focus, +.btn-danger:active.focus, +.btn-danger.active.focus, +.open > .dropdown-toggle.btn-danger.focus { + color: #fff; + background-color: #ac2925; + border-color: #761c19; +} +.btn-danger:active, +.btn-danger.active, +.open > .dropdown-toggle.btn-danger { + background-image: none; +} +.btn-danger.disabled:hover, +.btn-danger[disabled]:hover, +fieldset[disabled] .btn-danger:hover, +.btn-danger.disabled:focus, +.btn-danger[disabled]:focus, +fieldset[disabled] .btn-danger:focus, +.btn-danger.disabled.focus, +.btn-danger[disabled].focus, +fieldset[disabled] .btn-danger.focus { + background-color: #d9534f; + border-color: #d43f3a; +} +.btn-danger .badge { + color: #d9534f; + background-color: #fff; +} +.btn-link { + font-weight: normal; + color: #337ab7; + border-radius: 0; +} +.btn-link, +.btn-link:active, +.btn-link.active, +.btn-link[disabled], +fieldset[disabled] .btn-link { + background-color: transparent; + -webkit-box-shadow: none; + box-shadow: none; +} +.btn-link, +.btn-link:hover, +.btn-link:focus, +.btn-link:active { + border-color: transparent; +} +.btn-link:hover, +.btn-link:focus { + color: #23527c; + text-decoration: underline; + background-color: transparent; +} +.btn-link[disabled]:hover, +fieldset[disabled] .btn-link:hover, +.btn-link[disabled]:focus, +fieldset[disabled] .btn-link:focus { + color: #777; + text-decoration: none; +} +.btn-lg, +.btn-group-lg > .btn { + padding: 10px 16px; + font-size: 18px; + line-height: 1.3333333; + border-radius: 6px; +} +.btn-sm, +.btn-group-sm > .btn { + padding: 5px 10px; + font-size: 12px; + line-height: 1.5; + border-radius: 3px; +} +.btn-xs, +.btn-group-xs > .btn { + padding: 1px 5px; + font-size: 12px; + line-height: 1.5; + border-radius: 3px; +} +.btn-block { + display: block; + width: 100%; +} +.btn-block + .btn-block { + margin-top: 5px; +} +input[type="submit"].btn-block, +input[type="reset"].btn-block, +input[type="button"].btn-block { + width: 100%; +} +.fade { + opacity: 0; + -webkit-transition: opacity .15s linear; + -o-transition: opacity .15s linear; + transition: opacity .15s linear; +} +.fade.in { + opacity: 1; +} +.collapse { + display: none; +} +.collapse.in { + display: block; +} +tr.collapse.in { + display: table-row; +} +tbody.collapse.in { + display: table-row-group; +} +.collapsing { + position: relative; + height: 0; + overflow: hidden; + -webkit-transition-timing-function: ease; + -o-transition-timing-function: ease; + transition-timing-function: ease; + -webkit-transition-duration: .35s; + -o-transition-duration: .35s; + transition-duration: .35s; + -webkit-transition-property: height, visibility; + -o-transition-property: height, visibility; + transition-property: height, visibility; +} +.caret { + display: inline-block; + width: 0; + height: 0; + margin-left: 2px; + vertical-align: middle; + border-top: 4px dashed; + border-top: 4px solid \9; + border-right: 4px solid transparent; + border-left: 4px solid transparent; +} +.dropup, +.dropdown { + position: relative; +} +.dropdown-toggle:focus { + outline: 0; +} +.dropdown-menu { + position: absolute; + top: 100%; + left: 0; + z-index: 1000; + display: none; + float: left; + min-width: 160px; + padding: 5px 0; + margin: 2px 0 0; + font-size: 14px; + text-align: left; + list-style: none; + background-color: #fff; + -webkit-background-clip: padding-box; + background-clip: padding-box; + border: 1px solid #ccc; + border: 1px solid rgba(0, 0, 0, .15); + border-radius: 4px; + -webkit-box-shadow: 0 6px 12px rgba(0, 0, 0, .175); + box-shadow: 0 6px 12px rgba(0, 0, 0, .175); +} +.dropdown-menu.pull-right { + right: 0; + left: auto; +} +.dropdown-menu .divider { + height: 1px; + margin: 9px 0; + overflow: hidden; + background-color: #e5e5e5; +} +.dropdown-menu > li > a { + display: block; + padding: 3px 20px; + clear: both; + font-weight: normal; + line-height: 1.42857143; + color: #333; + white-space: nowrap; +} +.dropdown-menu > li > a:hover, +.dropdown-menu > li > a:focus { + color: #262626; + text-decoration: none; + background-color: #f5f5f5; +} +.dropdown-menu > .active > a, +.dropdown-menu > .active > a:hover, +.dropdown-menu > .active > a:focus { + color: #fff; + text-decoration: none; + background-color: #337ab7; + outline: 0; +} +.dropdown-menu > .disabled > a, +.dropdown-menu > .disabled > a:hover, +.dropdown-menu > .disabled > a:focus { + color: #777; +} +.dropdown-menu > .disabled > a:hover, +.dropdown-menu > .disabled > a:focus { + text-decoration: none; + cursor: not-allowed; + background-color: transparent; + background-image: none; + filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); +} +.open > .dropdown-menu { + display: block; +} +.open > a { + outline: 0; +} +.dropdown-menu-right { + right: 0; + left: auto; +} +.dropdown-menu-left { + right: auto; + left: 0; +} +.dropdown-header { + display: block; + padding: 3px 20px; + font-size: 12px; + line-height: 1.42857143; + color: #777; + white-space: nowrap; +} +.dropdown-backdrop { + position: fixed; + top: 0; + right: 0; + bottom: 0; + left: 0; + z-index: 990; +} +.pull-right > .dropdown-menu { + right: 0; + left: auto; +} +.dropup .caret, +.navbar-fixed-bottom .dropdown .caret { + content: ""; + border-top: 0; + border-bottom: 4px dashed; + border-bottom: 4px solid \9; +} +.dropup .dropdown-menu, +.navbar-fixed-bottom .dropdown .dropdown-menu { + top: auto; + bottom: 100%; + margin-bottom: 2px; +} +@media (min-width: 768px) { + .navbar-right .dropdown-menu { + right: 0; + left: auto; + } + .navbar-right .dropdown-menu-left { + right: auto; + left: 0; + } +} +.btn-group, +.btn-group-vertical { + position: relative; + display: inline-block; + vertical-align: middle; +} +.btn-group > .btn, +.btn-group-vertical > .btn { + position: relative; + float: left; +} +.btn-group > .btn:hover, +.btn-group-vertical > .btn:hover, +.btn-group > .btn:focus, +.btn-group-vertical > .btn:focus, +.btn-group > .btn:active, +.btn-group-vertical > .btn:active, +.btn-group > .btn.active, +.btn-group-vertical > .btn.active { + z-index: 2; +} +.btn-group .btn + .btn, +.btn-group .btn + .btn-group, +.btn-group .btn-group + .btn, +.btn-group .btn-group + .btn-group { + margin-left: -1px; +} +.btn-toolbar { + margin-left: -5px; +} +.btn-toolbar .btn, +.btn-toolbar .btn-group, +.btn-toolbar .input-group { + float: left; +} +.btn-toolbar > .btn, +.btn-toolbar > .btn-group, +.btn-toolbar > .input-group { + margin-left: 5px; +} +.btn-group > .btn:not(:first-child):not(:last-child):not(.dropdown-toggle) { + border-radius: 0; +} +.btn-group > .btn:first-child { + margin-left: 0; +} +.btn-group > .btn:first-child:not(:last-child):not(.dropdown-toggle) { + border-top-right-radius: 0; + border-bottom-right-radius: 0; +} +.btn-group > .btn:last-child:not(:first-child), +.btn-group > .dropdown-toggle:not(:first-child) { + border-top-left-radius: 0; + border-bottom-left-radius: 0; +} +.btn-group > .btn-group { + float: left; +} +.btn-group > .btn-group:not(:first-child):not(:last-child) > .btn { + border-radius: 0; +} +.btn-group > .btn-group:first-child:not(:last-child) > .btn:last-child, +.btn-group > .btn-group:first-child:not(:last-child) > .dropdown-toggle { + border-top-right-radius: 0; + border-bottom-right-radius: 0; +} +.btn-group > .btn-group:last-child:not(:first-child) > .btn:first-child { + border-top-left-radius: 0; + border-bottom-left-radius: 0; +} +.btn-group .dropdown-toggle:active, +.btn-group.open .dropdown-toggle { + outline: 0; +} +.btn-group > .btn + .dropdown-toggle { + padding-right: 8px; + padding-left: 8px; +} +.btn-group > .btn-lg + .dropdown-toggle { + padding-right: 12px; + padding-left: 12px; +} +.btn-group.open .dropdown-toggle { + -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125); + box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125); +} +.btn-group.open .dropdown-toggle.btn-link { + -webkit-box-shadow: none; + box-shadow: none; +} +.btn .caret { + margin-left: 0; +} +.btn-lg .caret { + border-width: 5px 5px 0; + border-bottom-width: 0; +} +.dropup .btn-lg .caret { + border-width: 0 5px 5px; +} +.btn-group-vertical > .btn, +.btn-group-vertical > .btn-group, +.btn-group-vertical > .btn-group > .btn { + display: block; + float: none; + width: 100%; + max-width: 100%; +} +.btn-group-vertical > .btn-group > .btn { + float: none; +} +.btn-group-vertical > .btn + .btn, +.btn-group-vertical > .btn + .btn-group, +.btn-group-vertical > .btn-group + .btn, +.btn-group-vertical > .btn-group + .btn-group { + margin-top: -1px; + margin-left: 0; +} +.btn-group-vertical > .btn:not(:first-child):not(:last-child) { + border-radius: 0; +} +.btn-group-vertical > .btn:first-child:not(:last-child) { + border-top-left-radius: 4px; + border-top-right-radius: 4px; + border-bottom-right-radius: 0; + border-bottom-left-radius: 0; +} +.btn-group-vertical > .btn:last-child:not(:first-child) { + border-top-left-radius: 0; + border-top-right-radius: 0; + border-bottom-right-radius: 4px; + border-bottom-left-radius: 4px; +} +.btn-group-vertical > .btn-group:not(:first-child):not(:last-child) > .btn { + border-radius: 0; +} +.btn-group-vertical > .btn-group:first-child:not(:last-child) > .btn:last-child, +.btn-group-vertical > .btn-group:first-child:not(:last-child) > .dropdown-toggle { + border-bottom-right-radius: 0; + border-bottom-left-radius: 0; +} +.btn-group-vertical > .btn-group:last-child:not(:first-child) > .btn:first-child { + border-top-left-radius: 0; + border-top-right-radius: 0; +} +.btn-group-justified { + display: table; + width: 100%; + table-layout: fixed; + border-collapse: separate; +} +.btn-group-justified > .btn, +.btn-group-justified > .btn-group { + display: table-cell; + float: none; + width: 1%; +} +.btn-group-justified > .btn-group .btn { + width: 100%; +} +.btn-group-justified > .btn-group .dropdown-menu { + left: auto; +} +[data-toggle="buttons"] > .btn input[type="radio"], +[data-toggle="buttons"] > .btn-group > .btn input[type="radio"], +[data-toggle="buttons"] > .btn input[type="checkbox"], +[data-toggle="buttons"] > .btn-group > .btn input[type="checkbox"] { + position: absolute; + clip: rect(0, 0, 0, 0); + pointer-events: none; +} +.input-group { + position: relative; + display: table; + border-collapse: separate; +} +.input-group[class*="col-"] { + float: none; + padding-right: 0; + padding-left: 0; +} +.input-group .form-control { + position: relative; + z-index: 2; + float: left; + width: 100%; + margin-bottom: 0; +} +.input-group .form-control:focus { + z-index: 3; +} +.input-group-lg > .form-control, +.input-group-lg > .input-group-addon, +.input-group-lg > .input-group-btn > .btn { + height: 46px; + padding: 10px 16px; + font-size: 18px; + line-height: 1.3333333; + border-radius: 6px; +} +select.input-group-lg > .form-control, +select.input-group-lg > .input-group-addon, +select.input-group-lg > .input-group-btn > .btn { + height: 46px; + line-height: 46px; +} +textarea.input-group-lg > .form-control, +textarea.input-group-lg > .input-group-addon, +textarea.input-group-lg > .input-group-btn > .btn, +select[multiple].input-group-lg > .form-control, +select[multiple].input-group-lg > .input-group-addon, +select[multiple].input-group-lg > .input-group-btn > .btn { + height: auto; +} +.input-group-sm > .form-control, +.input-group-sm > .input-group-addon, +.input-group-sm > .input-group-btn > .btn { + height: 30px; + padding: 5px 10px; + font-size: 12px; + line-height: 1.5; + border-radius: 3px; +} +select.input-group-sm > .form-control, +select.input-group-sm > .input-group-addon, +select.input-group-sm > .input-group-btn > .btn { + height: 30px; + line-height: 30px; +} +textarea.input-group-sm > .form-control, +textarea.input-group-sm > .input-group-addon, +textarea.input-group-sm > .input-group-btn > .btn, +select[multiple].input-group-sm > .form-control, +select[multiple].input-group-sm > .input-group-addon, +select[multiple].input-group-sm > .input-group-btn > .btn { + height: auto; +} +.input-group-addon, +.input-group-btn, +.input-group .form-control { + display: table-cell; +} +.input-group-addon:not(:first-child):not(:last-child), +.input-group-btn:not(:first-child):not(:last-child), +.input-group .form-control:not(:first-child):not(:last-child) { + border-radius: 0; +} +.input-group-addon, +.input-group-btn { + width: 1%; + white-space: nowrap; + vertical-align: middle; +} +.input-group-addon { + padding: 6px 12px; + font-size: 14px; + font-weight: normal; + line-height: 1; + color: #555; + text-align: center; + background-color: #eee; + border: 1px solid #ccc; + border-radius: 4px; +} +.input-group-addon.input-sm { + padding: 5px 10px; + font-size: 12px; + border-radius: 3px; +} +.input-group-addon.input-lg { + padding: 10px 16px; + font-size: 18px; + border-radius: 6px; +} +.input-group-addon input[type="radio"], +.input-group-addon input[type="checkbox"] { + margin-top: 0; +} +.input-group .form-control:first-child, +.input-group-addon:first-child, +.input-group-btn:first-child > .btn, +.input-group-btn:first-child > .btn-group > .btn, +.input-group-btn:first-child > .dropdown-toggle, +.input-group-btn:last-child > .btn:not(:last-child):not(.dropdown-toggle), +.input-group-btn:last-child > .btn-group:not(:last-child) > .btn { + border-top-right-radius: 0; + border-bottom-right-radius: 0; +} +.input-group-addon:first-child { + border-right: 0; +} +.input-group .form-control:last-child, +.input-group-addon:last-child, +.input-group-btn:last-child > .btn, +.input-group-btn:last-child > .btn-group > .btn, +.input-group-btn:last-child > .dropdown-toggle, +.input-group-btn:first-child > .btn:not(:first-child), +.input-group-btn:first-child > .btn-group:not(:first-child) > .btn { + border-top-left-radius: 0; + border-bottom-left-radius: 0; +} +.input-group-addon:last-child { + border-left: 0; +} +.input-group-btn { + position: relative; + font-size: 0; + white-space: nowrap; +} +.input-group-btn > .btn { + position: relative; +} +.input-group-btn > .btn + .btn { + margin-left: -1px; +} +.input-group-btn > .btn:hover, +.input-group-btn > .btn:focus, +.input-group-btn > .btn:active { + z-index: 2; +} +.input-group-btn:first-child > .btn, +.input-group-btn:first-child > .btn-group { + margin-right: -1px; +} +.input-group-btn:last-child > .btn, +.input-group-btn:last-child > .btn-group { + z-index: 2; + margin-left: -1px; +} +.nav { + padding-left: 0; + margin-bottom: 0; + list-style: none; +} +.nav > li { + position: relative; + display: block; +} +.nav > li > a { + position: relative; + display: block; + padding: 10px 15px; +} +.nav > li > a:hover, +.nav > li > a:focus { + text-decoration: none; + background-color: #eee; +} +.nav > li.disabled > a { + color: #777; +} +.nav > li.disabled > a:hover, +.nav > li.disabled > a:focus { + color: #777; + text-decoration: none; + cursor: not-allowed; + background-color: transparent; +} +.nav .open > a, +.nav .open > a:hover, +.nav .open > a:focus { + background-color: #eee; + border-color: #337ab7; +} +.nav .nav-divider { + height: 1px; + margin: 9px 0; + overflow: hidden; + background-color: #e5e5e5; +} +.nav > li > a > img { + max-width: none; +} +.nav-tabs { + border-bottom: 1px solid #ddd; +} +.nav-tabs > li { + float: left; + margin-bottom: -1px; +} +.nav-tabs > li > a { + margin-right: 2px; + line-height: 1.42857143; + border: 1px solid transparent; + border-radius: 4px 4px 0 0; +} +.nav-tabs > li > a:hover { + border-color: #eee #eee #ddd; +} +.nav-tabs > li.active > a, +.nav-tabs > li.active > a:hover, +.nav-tabs > li.active > a:focus { + color: #555; + cursor: default; + background-color: #fff; + border: 1px solid #ddd; + border-bottom-color: transparent; +} +.nav-tabs.nav-justified { + width: 100%; + border-bottom: 0; +} +.nav-tabs.nav-justified > li { + float: none; +} +.nav-tabs.nav-justified > li > a { + margin-bottom: 5px; + text-align: center; +} +.nav-tabs.nav-justified > .dropdown .dropdown-menu { + top: auto; + left: auto; +} +@media (min-width: 768px) { + .nav-tabs.nav-justified > li { + display: table-cell; + width: 1%; + } + .nav-tabs.nav-justified > li > a { + margin-bottom: 0; + } +} +.nav-tabs.nav-justified > li > a { + margin-right: 0; + border-radius: 4px; +} +.nav-tabs.nav-justified > .active > a, +.nav-tabs.nav-justified > .active > a:hover, +.nav-tabs.nav-justified > .active > a:focus { + border: 1px solid #ddd; +} +@media (min-width: 768px) { + .nav-tabs.nav-justified > li > a { + border-bottom: 1px solid #ddd; + border-radius: 4px 4px 0 0; + } + .nav-tabs.nav-justified > .active > a, + .nav-tabs.nav-justified > .active > a:hover, + .nav-tabs.nav-justified > .active > a:focus { + border-bottom-color: #fff; + } +} +.nav-pills > li { + float: left; +} +.nav-pills > li > a { + border-radius: 4px; +} +.nav-pills > li + li { + margin-left: 2px; +} +.nav-pills > li.active > a, +.nav-pills > li.active > a:hover, +.nav-pills > li.active > a:focus { + color: #fff; + background-color: #337ab7; +} +.nav-stacked > li { + float: none; +} +.nav-stacked > li + li { + margin-top: 2px; + margin-left: 0; +} +.nav-justified { + width: 100%; +} +.nav-justified > li { + float: none; +} +.nav-justified > li > a { + margin-bottom: 5px; + text-align: center; +} +.nav-justified > .dropdown .dropdown-menu { + top: auto; + left: auto; +} +@media (min-width: 768px) { + .nav-justified > li { + display: table-cell; + width: 1%; + } + .nav-justified > li > a { + margin-bottom: 0; + } +} +.nav-tabs-justified { + border-bottom: 0; +} +.nav-tabs-justified > li > a { + margin-right: 0; + border-radius: 4px; +} +.nav-tabs-justified > .active > a, +.nav-tabs-justified > .active > a:hover, +.nav-tabs-justified > .active > a:focus { + border: 1px solid #ddd; +} +@media (min-width: 768px) { + .nav-tabs-justified > li > a { + border-bottom: 1px solid #ddd; + border-radius: 4px 4px 0 0; + } + .nav-tabs-justified > .active > a, + .nav-tabs-justified > .active > a:hover, + .nav-tabs-justified > .active > a:focus { + border-bottom-color: #fff; + } +} +.tab-content > .tab-pane { + display: none; +} +.tab-content > .active { + display: block; +} +.nav-tabs .dropdown-menu { + margin-top: -1px; + border-top-left-radius: 0; + border-top-right-radius: 0; +} +.navbar { + position: relative; + min-height: 50px; + margin-bottom: 20px; + border: 1px solid transparent; +} +@media (min-width: 768px) { + .navbar { + border-radius: 4px; + } +} +@media (min-width: 768px) { + .navbar-header { + float: left; + } +} +.navbar-collapse { + padding-right: 15px; + padding-left: 15px; + overflow-x: visible; + -webkit-overflow-scrolling: touch; + border-top: 1px solid transparent; + -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, .1); + box-shadow: inset 0 1px 0 rgba(255, 255, 255, .1); +} +.navbar-collapse.in { + overflow-y: auto; +} +@media (min-width: 768px) { + .navbar-collapse { + width: auto; + border-top: 0; + -webkit-box-shadow: none; + box-shadow: none; + } + .navbar-collapse.collapse { + display: block !important; + height: auto !important; + padding-bottom: 0; + overflow: visible !important; + } + .navbar-collapse.in { + overflow-y: visible; + } + .navbar-fixed-top .navbar-collapse, + .navbar-static-top .navbar-collapse, + .navbar-fixed-bottom .navbar-collapse { + padding-right: 0; + padding-left: 0; + } +} +.navbar-fixed-top .navbar-collapse, +.navbar-fixed-bottom .navbar-collapse { + max-height: 340px; +} +@media (max-device-width: 480px) and (orientation: landscape) { + .navbar-fixed-top .navbar-collapse, + .navbar-fixed-bottom .navbar-collapse { + max-height: 200px; + } +} +.container > .navbar-header, +.container-fluid > .navbar-header, +.container > .navbar-collapse, +.container-fluid > .navbar-collapse { + margin-right: -15px; + margin-left: -15px; +} +@media (min-width: 768px) { + .container > .navbar-header, + .container-fluid > .navbar-header, + .container > .navbar-collapse, + .container-fluid > .navbar-collapse { + margin-right: 0; + margin-left: 0; + } +} +.navbar-static-top { + z-index: 1000; + border-width: 0 0 1px; +} +@media (min-width: 768px) { + .navbar-static-top { + border-radius: 0; + } +} +.navbar-fixed-top, +.navbar-fixed-bottom { + position: fixed; + right: 0; + left: 0; + z-index: 1030; +} +@media (min-width: 768px) { + .navbar-fixed-top, + .navbar-fixed-bottom { + border-radius: 0; + } +} +.navbar-fixed-top { + top: 0; + border-width: 0 0 1px; +} +.navbar-fixed-bottom { + bottom: 0; + margin-bottom: 0; + border-width: 1px 0 0; +} +.navbar-brand { + float: left; + height: 50px; + padding: 15px 15px; + font-size: 18px; + line-height: 20px; +} +.navbar-brand:hover, +.navbar-brand:focus { + text-decoration: none; +} +.navbar-brand > img { + display: block; +} +@media (min-width: 768px) { + .navbar > .container .navbar-brand, + .navbar > .container-fluid .navbar-brand { + margin-left: -15px; + } +} +.navbar-toggle { + position: relative; + float: right; + padding: 9px 10px; + margin-top: 8px; + margin-right: 15px; + margin-bottom: 8px; + background-color: transparent; + background-image: none; + border: 1px solid transparent; + border-radius: 4px; +} +.navbar-toggle:focus { + outline: 0; +} +.navbar-toggle .icon-bar { + display: block; + width: 22px; + height: 2px; + border-radius: 1px; +} +.navbar-toggle .icon-bar + .icon-bar { + margin-top: 4px; +} +@media (min-width: 768px) { + .navbar-toggle { + display: none; + } +} +.navbar-nav { + margin: 7.5px -15px; +} +.navbar-nav > li > a { + padding-top: 10px; + padding-bottom: 10px; + line-height: 20px; +} +@media (max-width: 767px) { + .navbar-nav .open .dropdown-menu { + position: static; + float: none; + width: auto; + margin-top: 0; + background-color: transparent; + border: 0; + -webkit-box-shadow: none; + box-shadow: none; + } + .navbar-nav .open .dropdown-menu > li > a, + .navbar-nav .open .dropdown-menu .dropdown-header { + padding: 5px 15px 5px 25px; + } + .navbar-nav .open .dropdown-menu > li > a { + line-height: 20px; + } + .navbar-nav .open .dropdown-menu > li > a:hover, + .navbar-nav .open .dropdown-menu > li > a:focus { + background-image: none; + } +} +@media (min-width: 768px) { + .navbar-nav { + float: left; + margin: 0; + } + .navbar-nav > li { + float: left; + } + .navbar-nav > li > a { + padding-top: 15px; + padding-bottom: 15px; + } +} +.navbar-form { + padding: 10px 15px; + margin-top: 8px; + margin-right: -15px; + margin-bottom: 8px; + margin-left: -15px; + border-top: 1px solid transparent; + border-bottom: 1px solid transparent; + -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, .1), 0 1px 0 rgba(255, 255, 255, .1); + box-shadow: inset 0 1px 0 rgba(255, 255, 255, .1), 0 1px 0 rgba(255, 255, 255, .1); +} +@media (min-width: 768px) { + .navbar-form .form-group { + display: inline-block; + margin-bottom: 0; + vertical-align: middle; + } + .navbar-form .form-control { + display: inline-block; + width: auto; + vertical-align: middle; + } + .navbar-form .form-control-static { + display: inline-block; + } + .navbar-form .input-group { + display: inline-table; + vertical-align: middle; + } + .navbar-form .input-group .input-group-addon, + .navbar-form .input-group .input-group-btn, + .navbar-form .input-group .form-control { + width: auto; + } + .navbar-form .input-group > .form-control { + width: 100%; + } + .navbar-form .control-label { + margin-bottom: 0; + vertical-align: middle; + } + .navbar-form .radio, + .navbar-form .checkbox { + display: inline-block; + margin-top: 0; + margin-bottom: 0; + vertical-align: middle; + } + .navbar-form .radio label, + .navbar-form .checkbox label { + padding-left: 0; + } + .navbar-form .radio input[type="radio"], + .navbar-form .checkbox input[type="checkbox"] { + position: relative; + margin-left: 0; + } + .navbar-form .has-feedback .form-control-feedback { + top: 0; + } +} +@media (max-width: 767px) { + .navbar-form .form-group { + margin-bottom: 5px; + } + .navbar-form .form-group:last-child { + margin-bottom: 0; + } +} +@media (min-width: 768px) { + .navbar-form { + width: auto; + padding-top: 0; + padding-bottom: 0; + margin-right: 0; + margin-left: 0; + border: 0; + -webkit-box-shadow: none; + box-shadow: none; + } +} +.navbar-nav > li > .dropdown-menu { + margin-top: 0; + border-top-left-radius: 0; + border-top-right-radius: 0; +} +.navbar-fixed-bottom .navbar-nav > li > .dropdown-menu { + margin-bottom: 0; + border-top-left-radius: 4px; + border-top-right-radius: 4px; + border-bottom-right-radius: 0; + border-bottom-left-radius: 0; +} +.navbar-btn { + margin-top: 8px; + margin-bottom: 8px; +} +.navbar-btn.btn-sm { + margin-top: 10px; + margin-bottom: 10px; +} +.navbar-btn.btn-xs { + margin-top: 14px; + margin-bottom: 14px; +} +.navbar-text { + margin-top: 15px; + margin-bottom: 15px; +} +@media (min-width: 768px) { + .navbar-text { + float: left; + margin-right: 15px; + margin-left: 15px; + } +} +@media (min-width: 768px) { + .navbar-left { + float: left !important; + } + .navbar-right { + float: right !important; + margin-right: -15px; + } + .navbar-right ~ .navbar-right { + margin-right: 0; + } +} +.navbar-default { + background-color: #f8f8f8; + border-color: #e7e7e7; +} +.navbar-default .navbar-brand { + color: #777; +} +.navbar-default .navbar-brand:hover, +.navbar-default .navbar-brand:focus { + color: #5e5e5e; + background-color: transparent; +} +.navbar-default .navbar-text { + color: #777; +} +.navbar-default .navbar-nav > li > a { + color: #777; +} +.navbar-default .navbar-nav > li > a:hover, +.navbar-default .navbar-nav > li > a:focus { + color: #333; + background-color: transparent; +} +.navbar-default .navbar-nav > .active > a, +.navbar-default .navbar-nav > .active > a:hover, +.navbar-default .navbar-nav > .active > a:focus { + color: #555; + background-color: #e7e7e7; +} +.navbar-default .navbar-nav > .disabled > a, +.navbar-default .navbar-nav > .disabled > a:hover, +.navbar-default .navbar-nav > .disabled > a:focus { + color: #ccc; + background-color: transparent; +} +.navbar-default .navbar-toggle { + border-color: #ddd; +} +.navbar-default .navbar-toggle:hover, +.navbar-default .navbar-toggle:focus { + background-color: #ddd; +} +.navbar-default .navbar-toggle .icon-bar { + background-color: #888; +} +.navbar-default .navbar-collapse, +.navbar-default .navbar-form { + border-color: #e7e7e7; +} +.navbar-default .navbar-nav > .open > a, +.navbar-default .navbar-nav > .open > a:hover, +.navbar-default .navbar-nav > .open > a:focus { + color: #555; + background-color: #e7e7e7; +} +@media (max-width: 767px) { + .navbar-default .navbar-nav .open .dropdown-menu > li > a { + color: #777; + } + .navbar-default .navbar-nav .open .dropdown-menu > li > a:hover, + .navbar-default .navbar-nav .open .dropdown-menu > li > a:focus { + color: #333; + background-color: transparent; + } + .navbar-default .navbar-nav .open .dropdown-menu > .active > a, + .navbar-default .navbar-nav .open .dropdown-menu > .active > a:hover, + .navbar-default .navbar-nav .open .dropdown-menu > .active > a:focus { + color: #555; + background-color: #e7e7e7; + } + .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a, + .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a:hover, + .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a:focus { + color: #ccc; + background-color: transparent; + } +} +.navbar-default .navbar-link { + color: #777; +} +.navbar-default .navbar-link:hover { + color: #333; +} +.navbar-default .btn-link { + color: #777; +} +.navbar-default .btn-link:hover, +.navbar-default .btn-link:focus { + color: #333; +} +.navbar-default .btn-link[disabled]:hover, +fieldset[disabled] .navbar-default .btn-link:hover, +.navbar-default .btn-link[disabled]:focus, +fieldset[disabled] .navbar-default .btn-link:focus { + color: #ccc; +} +.navbar-inverse { + background-color: #222; + border-color: #080808; +} +.navbar-inverse .navbar-brand { + color: #9d9d9d; +} +.navbar-inverse .navbar-brand:hover, +.navbar-inverse .navbar-brand:focus { + color: #fff; + background-color: transparent; +} +.navbar-inverse .navbar-text { + color: #9d9d9d; +} +.navbar-inverse .navbar-nav > li > a { + color: #9d9d9d; +} +.navbar-inverse .navbar-nav > li > a:hover, +.navbar-inverse .navbar-nav > li > a:focus { + color: #fff; + background-color: transparent; +} +.navbar-inverse .navbar-nav > .active > a, +.navbar-inverse .navbar-nav > .active > a:hover, +.navbar-inverse .navbar-nav > .active > a:focus { + color: #fff; + background-color: #080808; +} +.navbar-inverse .navbar-nav > .disabled > a, +.navbar-inverse .navbar-nav > .disabled > a:hover, +.navbar-inverse .navbar-nav > .disabled > a:focus { + color: #444; + background-color: transparent; +} +.navbar-inverse .navbar-toggle { + border-color: #333; +} +.navbar-inverse .navbar-toggle:hover, +.navbar-inverse .navbar-toggle:focus { + background-color: #333; +} +.navbar-inverse .navbar-toggle .icon-bar { + background-color: #fff; +} +.navbar-inverse .navbar-collapse, +.navbar-inverse .navbar-form { + border-color: #101010; +} +.navbar-inverse .navbar-nav > .open > a, +.navbar-inverse .navbar-nav > .open > a:hover, +.navbar-inverse .navbar-nav > .open > a:focus { + color: #fff; + background-color: #080808; +} +@media (max-width: 767px) { + .navbar-inverse .navbar-nav .open .dropdown-menu > .dropdown-header { + border-color: #080808; + } + .navbar-inverse .navbar-nav .open .dropdown-menu .divider { + background-color: #080808; + } + .navbar-inverse .navbar-nav .open .dropdown-menu > li > a { + color: #9d9d9d; + } + .navbar-inverse .navbar-nav .open .dropdown-menu > li > a:hover, + .navbar-inverse .navbar-nav .open .dropdown-menu > li > a:focus { + color: #fff; + background-color: transparent; + } + .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a, + .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a:hover, + .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a:focus { + color: #fff; + background-color: #080808; + } + .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a, + .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a:hover, + .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a:focus { + color: #444; + background-color: transparent; + } +} +.navbar-inverse .navbar-link { + color: #9d9d9d; +} +.navbar-inverse .navbar-link:hover { + color: #fff; +} +.navbar-inverse .btn-link { + color: #9d9d9d; +} +.navbar-inverse .btn-link:hover, +.navbar-inverse .btn-link:focus { + color: #fff; +} +.navbar-inverse .btn-link[disabled]:hover, +fieldset[disabled] .navbar-inverse .btn-link:hover, +.navbar-inverse .btn-link[disabled]:focus, +fieldset[disabled] .navbar-inverse .btn-link:focus { + color: #444; +} +.breadcrumb { + padding: 8px 15px; + margin-bottom: 20px; + list-style: none; + background-color: #f5f5f5; + border-radius: 4px; +} +.breadcrumb > li { + display: inline-block; +} +.breadcrumb > li + li:before { + padding: 0 5px; + color: #ccc; + content: "/\00a0"; +} +.breadcrumb > .active { + color: #777; +} +.pagination { + display: inline-block; + padding-left: 0; + margin: 20px 0; + border-radius: 4px; +} +.pagination > li { + display: inline; +} +.pagination > li > a, +.pagination > li > span { + position: relative; + float: left; + padding: 6px 12px; + margin-left: -1px; + line-height: 1.42857143; + color: #337ab7; + text-decoration: none; + background-color: #fff; + border: 1px solid #ddd; +} +.pagination > li:first-child > a, +.pagination > li:first-child > span { + margin-left: 0; + border-top-left-radius: 4px; + border-bottom-left-radius: 4px; +} +.pagination > li:last-child > a, +.pagination > li:last-child > span { + border-top-right-radius: 4px; + border-bottom-right-radius: 4px; +} +.pagination > li > a:hover, +.pagination > li > span:hover, +.pagination > li > a:focus, +.pagination > li > span:focus { + z-index: 2; + color: #23527c; + background-color: #eee; + border-color: #ddd; +} +.pagination > .active > a, +.pagination > .active > span, +.pagination > .active > a:hover, +.pagination > .active > span:hover, +.pagination > .active > a:focus, +.pagination > .active > span:focus { + z-index: 3; + color: #fff; + cursor: default; + background-color: #337ab7; + border-color: #337ab7; +} +.pagination > .disabled > span, +.pagination > .disabled > span:hover, +.pagination > .disabled > span:focus, +.pagination > .disabled > a, +.pagination > .disabled > a:hover, +.pagination > .disabled > a:focus { + color: #777; + cursor: not-allowed; + background-color: #fff; + border-color: #ddd; +} +.pagination-lg > li > a, +.pagination-lg > li > span { + padding: 10px 16px; + font-size: 18px; + line-height: 1.3333333; +} +.pagination-lg > li:first-child > a, +.pagination-lg > li:first-child > span { + border-top-left-radius: 6px; + border-bottom-left-radius: 6px; +} +.pagination-lg > li:last-child > a, +.pagination-lg > li:last-child > span { + border-top-right-radius: 6px; + border-bottom-right-radius: 6px; +} +.pagination-sm > li > a, +.pagination-sm > li > span { + padding: 5px 10px; + font-size: 12px; + line-height: 1.5; +} +.pagination-sm > li:first-child > a, +.pagination-sm > li:first-child > span { + border-top-left-radius: 3px; + border-bottom-left-radius: 3px; +} +.pagination-sm > li:last-child > a, +.pagination-sm > li:last-child > span { + border-top-right-radius: 3px; + border-bottom-right-radius: 3px; +} +.pager { + padding-left: 0; + margin: 20px 0; + text-align: center; + list-style: none; +} +.pager li { + display: inline; +} +.pager li > a, +.pager li > span { + display: inline-block; + padding: 5px 14px; + background-color: #fff; + border: 1px solid #ddd; + border-radius: 15px; +} +.pager li > a:hover, +.pager li > a:focus { + text-decoration: none; + background-color: #eee; +} +.pager .next > a, +.pager .next > span { + float: right; +} +.pager .previous > a, +.pager .previous > span { + float: left; +} +.pager .disabled > a, +.pager .disabled > a:hover, +.pager .disabled > a:focus, +.pager .disabled > span { + color: #777; + cursor: not-allowed; + background-color: #fff; +} +.label { + display: inline; + padding: .2em .6em .3em; + font-size: 75%; + font-weight: bold; + line-height: 1; + color: #fff; + text-align: center; + white-space: nowrap; + vertical-align: baseline; + border-radius: .25em; +} +a.label:hover, +a.label:focus { + color: #fff; + text-decoration: none; + cursor: pointer; +} +.label:empty { + display: none; +} +.btn .label { + position: relative; + top: -1px; +} +.label-default { + background-color: #777; +} +.label-default[href]:hover, +.label-default[href]:focus { + background-color: #5e5e5e; +} +.label-primary { + background-color: #337ab7; +} +.label-primary[href]:hover, +.label-primary[href]:focus { + background-color: #286090; +} +.label-success { + background-color: #5cb85c; +} +.label-success[href]:hover, +.label-success[href]:focus { + background-color: #449d44; +} +.label-info { + background-color: #5bc0de; +} +.label-info[href]:hover, +.label-info[href]:focus { + background-color: #31b0d5; +} +.label-warning { + background-color: #f0ad4e; +} +.label-warning[href]:hover, +.label-warning[href]:focus { + background-color: #ec971f; +} +.label-danger { + background-color: #d9534f; +} +.label-danger[href]:hover, +.label-danger[href]:focus { + background-color: #c9302c; +} +.badge { + display: inline-block; + min-width: 10px; + padding: 3px 7px; + font-size: 12px; + font-weight: bold; + line-height: 1; + color: #fff; + text-align: center; + white-space: nowrap; + vertical-align: middle; + background-color: #777; + border-radius: 10px; +} +.badge:empty { + display: none; +} +.btn .badge { + position: relative; + top: -1px; +} +.btn-xs .badge, +.btn-group-xs > .btn .badge { + top: 0; + padding: 1px 5px; +} +a.badge:hover, +a.badge:focus { + color: #fff; + text-decoration: none; + cursor: pointer; +} +.list-group-item.active > .badge, +.nav-pills > .active > a > .badge { + color: #337ab7; + background-color: #fff; +} +.list-group-item > .badge { + float: right; +} +.list-group-item > .badge + .badge { + margin-right: 5px; +} +.nav-pills > li > a > .badge { + margin-left: 3px; +} +.jumbotron { + padding-top: 30px; + padding-bottom: 30px; + margin-bottom: 30px; + color: inherit; + background-color: #eee; +} +.jumbotron h1, +.jumbotron .h1 { + color: inherit; +} +.jumbotron p { + margin-bottom: 15px; + font-size: 21px; + font-weight: 200; +} +.jumbotron > hr { + border-top-color: #d5d5d5; +} +.container .jumbotron, +.container-fluid .jumbotron { + padding-right: 15px; + padding-left: 15px; + border-radius: 6px; +} +.jumbotron .container { + max-width: 100%; +} +@media screen and (min-width: 768px) { + .jumbotron { + padding-top: 48px; + padding-bottom: 48px; + } + .container .jumbotron, + .container-fluid .jumbotron { + padding-right: 60px; + padding-left: 60px; + } + .jumbotron h1, + .jumbotron .h1 { + font-size: 63px; + } +} +.thumbnail { + display: block; + padding: 4px; + margin-bottom: 20px; + line-height: 1.42857143; + background-color: #fff; + border: 1px solid #ddd; + border-radius: 4px; + -webkit-transition: border .2s ease-in-out; + -o-transition: border .2s ease-in-out; + transition: border .2s ease-in-out; +} +.thumbnail > img, +.thumbnail a > img { + margin-right: auto; + margin-left: auto; +} +a.thumbnail:hover, +a.thumbnail:focus, +a.thumbnail.active { + border-color: #337ab7; +} +.thumbnail .caption { + padding: 9px; + color: #333; +} +.alert { + padding: 15px; + margin-bottom: 20px; + border: 1px solid transparent; + border-radius: 4px; +} +.alert h4 { + margin-top: 0; + color: inherit; +} +.alert .alert-link { + font-weight: bold; +} +.alert > p, +.alert > ul { + margin-bottom: 0; +} +.alert > p + p { + margin-top: 5px; +} +.alert-dismissable, +.alert-dismissible { + padding-right: 35px; +} +.alert-dismissable .close, +.alert-dismissible .close { + position: relative; + top: -2px; + right: -21px; + color: inherit; +} +.alert-success { + color: #3c763d; + background-color: #dff0d8; + border-color: #d6e9c6; +} +.alert-success hr { + border-top-color: #c9e2b3; +} +.alert-success .alert-link { + color: #2b542c; +} +.alert-info { + color: #31708f; + background-color: #d9edf7; + border-color: #bce8f1; +} +.alert-info hr { + border-top-color: #a6e1ec; +} +.alert-info .alert-link { + color: #245269; +} +.alert-warning { + color: #8a6d3b; + background-color: #fcf8e3; + border-color: #faebcc; +} +.alert-warning hr { + border-top-color: #f7e1b5; +} +.alert-warning .alert-link { + color: #66512c; +} +.alert-danger { + color: #a94442; + background-color: #f2dede; + border-color: #ebccd1; +} +.alert-danger hr { + border-top-color: #e4b9c0; +} +.alert-danger .alert-link { + color: #843534; +} +@-webkit-keyframes progress-bar-stripes { + from { + background-position: 40px 0; + } + to { + background-position: 0 0; + } +} +@-o-keyframes progress-bar-stripes { + from { + background-position: 40px 0; + } + to { + background-position: 0 0; + } +} +@keyframes progress-bar-stripes { + from { + background-position: 40px 0; + } + to { + background-position: 0 0; + } +} +.progress { + height: 20px; + margin-bottom: 20px; + overflow: hidden; + background-color: #f5f5f5; + border-radius: 4px; + -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, .1); + box-shadow: inset 0 1px 2px rgba(0, 0, 0, .1); +} +.progress-bar { + float: left; + width: 0; + height: 100%; + font-size: 12px; + line-height: 20px; + color: #fff; + text-align: center; + background-color: #337ab7; + -webkit-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, .15); + box-shadow: inset 0 -1px 0 rgba(0, 0, 0, .15); + -webkit-transition: width .6s ease; + -o-transition: width .6s ease; + transition: width .6s ease; +} +.progress-striped .progress-bar, +.progress-bar-striped { + background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); + background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); + background-image: linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); + -webkit-background-size: 40px 40px; + background-size: 40px 40px; +} +.progress.active .progress-bar, +.progress-bar.active { + -webkit-animation: progress-bar-stripes 2s linear infinite; + -o-animation: progress-bar-stripes 2s linear infinite; + animation: progress-bar-stripes 2s linear infinite; +} +.progress-bar-success { + background-color: #5cb85c; +} +.progress-striped .progress-bar-success { + background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); + background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); + background-image: linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); +} +.progress-bar-info { + background-color: #5bc0de; +} +.progress-striped .progress-bar-info { + background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); + background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); + background-image: linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); +} +.progress-bar-warning { + background-color: #f0ad4e; +} +.progress-striped .progress-bar-warning { + background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); + background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); + background-image: linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); +} +.progress-bar-danger { + background-color: #d9534f; +} +.progress-striped .progress-bar-danger { + background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); + background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); + background-image: linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); +} +.media { + margin-top: 15px; +} +.media:first-child { + margin-top: 0; +} +.media, +.media-body { + overflow: hidden; + zoom: 1; +} +.media-body { + width: 10000px; +} +.media-object { + display: block; +} +.media-object.img-thumbnail { + max-width: none; +} +.media-right, +.media > .pull-right { + padding-left: 10px; +} +.media-left, +.media > .pull-left { + padding-right: 10px; +} +.media-left, +.media-right, +.media-body { + display: table-cell; + vertical-align: top; +} +.media-middle { + vertical-align: middle; +} +.media-bottom { + vertical-align: bottom; +} +.media-heading { + margin-top: 0; + margin-bottom: 5px; +} +.media-list { + padding-left: 0; + list-style: none; +} +.list-group { + padding-left: 0; + margin-bottom: 20px; +} +.list-group-item { + position: relative; + display: block; + padding: 10px 15px; + margin-bottom: -1px; + background-color: #fff; + border: 1px solid #ddd; +} +.list-group-item:first-child { + border-top-left-radius: 4px; + border-top-right-radius: 4px; +} +.list-group-item:last-child { + margin-bottom: 0; + border-bottom-right-radius: 4px; + border-bottom-left-radius: 4px; +} +a.list-group-item, +button.list-group-item { + color: #555; +} +a.list-group-item .list-group-item-heading, +button.list-group-item .list-group-item-heading { + color: #333; +} +a.list-group-item:hover, +button.list-group-item:hover, +a.list-group-item:focus, +button.list-group-item:focus { + color: #555; + text-decoration: none; + background-color: #f5f5f5; +} +button.list-group-item { + width: 100%; + text-align: left; +} +.list-group-item.disabled, +.list-group-item.disabled:hover, +.list-group-item.disabled:focus { + color: #777; + cursor: not-allowed; + background-color: #eee; +} +.list-group-item.disabled .list-group-item-heading, +.list-group-item.disabled:hover .list-group-item-heading, +.list-group-item.disabled:focus .list-group-item-heading { + color: inherit; +} +.list-group-item.disabled .list-group-item-text, +.list-group-item.disabled:hover .list-group-item-text, +.list-group-item.disabled:focus .list-group-item-text { + color: #777; +} +.list-group-item.active, +.list-group-item.active:hover, +.list-group-item.active:focus { + z-index: 2; + color: #fff; + background-color: #337ab7; + border-color: #337ab7; +} +.list-group-item.active .list-group-item-heading, +.list-group-item.active:hover .list-group-item-heading, +.list-group-item.active:focus .list-group-item-heading, +.list-group-item.active .list-group-item-heading > small, +.list-group-item.active:hover .list-group-item-heading > small, +.list-group-item.active:focus .list-group-item-heading > small, +.list-group-item.active .list-group-item-heading > .small, +.list-group-item.active:hover .list-group-item-heading > .small, +.list-group-item.active:focus .list-group-item-heading > .small { + color: inherit; +} +.list-group-item.active .list-group-item-text, +.list-group-item.active:hover .list-group-item-text, +.list-group-item.active:focus .list-group-item-text { + color: #c7ddef; +} +.list-group-item-success { + color: #3c763d; + background-color: #dff0d8; +} +a.list-group-item-success, +button.list-group-item-success { + color: #3c763d; +} +a.list-group-item-success .list-group-item-heading, +button.list-group-item-success .list-group-item-heading { + color: inherit; +} +a.list-group-item-success:hover, +button.list-group-item-success:hover, +a.list-group-item-success:focus, +button.list-group-item-success:focus { + color: #3c763d; + background-color: #d0e9c6; +} +a.list-group-item-success.active, +button.list-group-item-success.active, +a.list-group-item-success.active:hover, +button.list-group-item-success.active:hover, +a.list-group-item-success.active:focus, +button.list-group-item-success.active:focus { + color: #fff; + background-color: #3c763d; + border-color: #3c763d; +} +.list-group-item-info { + color: #31708f; + background-color: #d9edf7; +} +a.list-group-item-info, +button.list-group-item-info { + color: #31708f; +} +a.list-group-item-info .list-group-item-heading, +button.list-group-item-info .list-group-item-heading { + color: inherit; +} +a.list-group-item-info:hover, +button.list-group-item-info:hover, +a.list-group-item-info:focus, +button.list-group-item-info:focus { + color: #31708f; + background-color: #c4e3f3; +} +a.list-group-item-info.active, +button.list-group-item-info.active, +a.list-group-item-info.active:hover, +button.list-group-item-info.active:hover, +a.list-group-item-info.active:focus, +button.list-group-item-info.active:focus { + color: #fff; + background-color: #31708f; + border-color: #31708f; +} +.list-group-item-warning { + color: #8a6d3b; + background-color: #fcf8e3; +} +a.list-group-item-warning, +button.list-group-item-warning { + color: #8a6d3b; +} +a.list-group-item-warning .list-group-item-heading, +button.list-group-item-warning .list-group-item-heading { + color: inherit; +} +a.list-group-item-warning:hover, +button.list-group-item-warning:hover, +a.list-group-item-warning:focus, +button.list-group-item-warning:focus { + color: #8a6d3b; + background-color: #faf2cc; +} +a.list-group-item-warning.active, +button.list-group-item-warning.active, +a.list-group-item-warning.active:hover, +button.list-group-item-warning.active:hover, +a.list-group-item-warning.active:focus, +button.list-group-item-warning.active:focus { + color: #fff; + background-color: #8a6d3b; + border-color: #8a6d3b; +} +.list-group-item-danger { + color: #a94442; + background-color: #f2dede; +} +a.list-group-item-danger, +button.list-group-item-danger { + color: #a94442; +} +a.list-group-item-danger .list-group-item-heading, +button.list-group-item-danger .list-group-item-heading { + color: inherit; +} +a.list-group-item-danger:hover, +button.list-group-item-danger:hover, +a.list-group-item-danger:focus, +button.list-group-item-danger:focus { + color: #a94442; + background-color: #ebcccc; +} +a.list-group-item-danger.active, +button.list-group-item-danger.active, +a.list-group-item-danger.active:hover, +button.list-group-item-danger.active:hover, +a.list-group-item-danger.active:focus, +button.list-group-item-danger.active:focus { + color: #fff; + background-color: #a94442; + border-color: #a94442; +} +.list-group-item-heading { + margin-top: 0; + margin-bottom: 5px; +} +.list-group-item-text { + margin-bottom: 0; + line-height: 1.3; +} +.panel { + margin-bottom: 20px; + background-color: #fff; + border: 1px solid transparent; + border-radius: 4px; + -webkit-box-shadow: 0 1px 1px rgba(0, 0, 0, .05); + box-shadow: 0 1px 1px rgba(0, 0, 0, .05); +} +.panel-body { + padding: 15px; +} +.panel-heading { + padding: 10px 15px; + border-bottom: 1px solid transparent; + border-top-left-radius: 3px; + border-top-right-radius: 3px; +} +.panel-heading > .dropdown .dropdown-toggle { + color: inherit; +} +.panel-title { + margin-top: 0; + margin-bottom: 0; + font-size: 16px; + color: inherit; +} +.panel-title > a, +.panel-title > small, +.panel-title > .small, +.panel-title > small > a, +.panel-title > .small > a { + color: inherit; +} +.panel-footer { + padding: 10px 15px; + background-color: #f5f5f5; + border-top: 1px solid #ddd; + border-bottom-right-radius: 3px; + border-bottom-left-radius: 3px; +} +.panel > .list-group, +.panel > .panel-collapse > .list-group { + margin-bottom: 0; +} +.panel > .list-group .list-group-item, +.panel > .panel-collapse > .list-group .list-group-item { + border-width: 1px 0; + border-radius: 0; +} +.panel > .list-group:first-child .list-group-item:first-child, +.panel > .panel-collapse > .list-group:first-child .list-group-item:first-child { + border-top: 0; + border-top-left-radius: 3px; + border-top-right-radius: 3px; +} +.panel > .list-group:last-child .list-group-item:last-child, +.panel > .panel-collapse > .list-group:last-child .list-group-item:last-child { + border-bottom: 0; + border-bottom-right-radius: 3px; + border-bottom-left-radius: 3px; +} +.panel > .panel-heading + .panel-collapse > .list-group .list-group-item:first-child { + border-top-left-radius: 0; + border-top-right-radius: 0; +} +.panel-heading + .list-group .list-group-item:first-child { + border-top-width: 0; +} +.list-group + .panel-footer { + border-top-width: 0; +} +.panel > .table, +.panel > .table-responsive > .table, +.panel > .panel-collapse > .table { + margin-bottom: 0; +} +.panel > .table caption, +.panel > .table-responsive > .table caption, +.panel > .panel-collapse > .table caption { + padding-right: 15px; + padding-left: 15px; +} +.panel > .table:first-child, +.panel > .table-responsive:first-child > .table:first-child { + border-top-left-radius: 3px; + border-top-right-radius: 3px; +} +.panel > .table:first-child > thead:first-child > tr:first-child, +.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child, +.panel > .table:first-child > tbody:first-child > tr:first-child, +.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child { + border-top-left-radius: 3px; + border-top-right-radius: 3px; +} +.panel > .table:first-child > thead:first-child > tr:first-child td:first-child, +.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child td:first-child, +.panel > .table:first-child > tbody:first-child > tr:first-child td:first-child, +.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child td:first-child, +.panel > .table:first-child > thead:first-child > tr:first-child th:first-child, +.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child th:first-child, +.panel > .table:first-child > tbody:first-child > tr:first-child th:first-child, +.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child th:first-child { + border-top-left-radius: 3px; +} +.panel > .table:first-child > thead:first-child > tr:first-child td:last-child, +.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child td:last-child, +.panel > .table:first-child > tbody:first-child > tr:first-child td:last-child, +.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child td:last-child, +.panel > .table:first-child > thead:first-child > tr:first-child th:last-child, +.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child th:last-child, +.panel > .table:first-child > tbody:first-child > tr:first-child th:last-child, +.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child th:last-child { + border-top-right-radius: 3px; +} +.panel > .table:last-child, +.panel > .table-responsive:last-child > .table:last-child { + border-bottom-right-radius: 3px; + border-bottom-left-radius: 3px; +} +.panel > .table:last-child > tbody:last-child > tr:last-child, +.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child, +.panel > .table:last-child > tfoot:last-child > tr:last-child, +.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child { + border-bottom-right-radius: 3px; + border-bottom-left-radius: 3px; +} +.panel > .table:last-child > tbody:last-child > tr:last-child td:first-child, +.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child td:first-child, +.panel > .table:last-child > tfoot:last-child > tr:last-child td:first-child, +.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child td:first-child, +.panel > .table:last-child > tbody:last-child > tr:last-child th:first-child, +.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child th:first-child, +.panel > .table:last-child > tfoot:last-child > tr:last-child th:first-child, +.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child th:first-child { + border-bottom-left-radius: 3px; +} +.panel > .table:last-child > tbody:last-child > tr:last-child td:last-child, +.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child td:last-child, +.panel > .table:last-child > tfoot:last-child > tr:last-child td:last-child, +.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child td:last-child, +.panel > .table:last-child > tbody:last-child > tr:last-child th:last-child, +.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child th:last-child, +.panel > .table:last-child > tfoot:last-child > tr:last-child th:last-child, +.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child th:last-child { + border-bottom-right-radius: 3px; +} +.panel > .panel-body + .table, +.panel > .panel-body + .table-responsive, +.panel > .table + .panel-body, +.panel > .table-responsive + .panel-body { + border-top: 1px solid #ddd; +} +.panel > .table > tbody:first-child > tr:first-child th, +.panel > .table > tbody:first-child > tr:first-child td { + border-top: 0; +} +.panel > .table-bordered, +.panel > .table-responsive > .table-bordered { + border: 0; +} +.panel > .table-bordered > thead > tr > th:first-child, +.panel > .table-responsive > .table-bordered > thead > tr > th:first-child, +.panel > .table-bordered > tbody > tr > th:first-child, +.panel > .table-responsive > .table-bordered > tbody > tr > th:first-child, +.panel > .table-bordered > tfoot > tr > th:first-child, +.panel > .table-responsive > .table-bordered > tfoot > tr > th:first-child, +.panel > .table-bordered > thead > tr > td:first-child, +.panel > .table-responsive > .table-bordered > thead > tr > td:first-child, +.panel > .table-bordered > tbody > tr > td:first-child, +.panel > .table-responsive > .table-bordered > tbody > tr > td:first-child, +.panel > .table-bordered > tfoot > tr > td:first-child, +.panel > .table-responsive > .table-bordered > tfoot > tr > td:first-child { + border-left: 0; +} +.panel > .table-bordered > thead > tr > th:last-child, +.panel > .table-responsive > .table-bordered > thead > tr > th:last-child, +.panel > .table-bordered > tbody > tr > th:last-child, +.panel > .table-responsive > .table-bordered > tbody > tr > th:last-child, +.panel > .table-bordered > tfoot > tr > th:last-child, +.panel > .table-responsive > .table-bordered > tfoot > tr > th:last-child, +.panel > .table-bordered > thead > tr > td:last-child, +.panel > .table-responsive > .table-bordered > thead > tr > td:last-child, +.panel > .table-bordered > tbody > tr > td:last-child, +.panel > .table-responsive > .table-bordered > tbody > tr > td:last-child, +.panel > .table-bordered > tfoot > tr > td:last-child, +.panel > .table-responsive > .table-bordered > tfoot > tr > td:last-child { + border-right: 0; +} +.panel > .table-bordered > thead > tr:first-child > td, +.panel > .table-responsive > .table-bordered > thead > tr:first-child > td, +.panel > .table-bordered > tbody > tr:first-child > td, +.panel > .table-responsive > .table-bordered > tbody > tr:first-child > td, +.panel > .table-bordered > thead > tr:first-child > th, +.panel > .table-responsive > .table-bordered > thead > tr:first-child > th, +.panel > .table-bordered > tbody > tr:first-child > th, +.panel > .table-responsive > .table-bordered > tbody > tr:first-child > th { + border-bottom: 0; +} +.panel > .table-bordered > tbody > tr:last-child > td, +.panel > .table-responsive > .table-bordered > tbody > tr:last-child > td, +.panel > .table-bordered > tfoot > tr:last-child > td, +.panel > .table-responsive > .table-bordered > tfoot > tr:last-child > td, +.panel > .table-bordered > tbody > tr:last-child > th, +.panel > .table-responsive > .table-bordered > tbody > tr:last-child > th, +.panel > .table-bordered > tfoot > tr:last-child > th, +.panel > .table-responsive > .table-bordered > tfoot > tr:last-child > th { + border-bottom: 0; +} +.panel > .table-responsive { + margin-bottom: 0; + border: 0; +} +.panel-group { + margin-bottom: 20px; +} +.panel-group .panel { + margin-bottom: 0; + border-radius: 4px; +} +.panel-group .panel + .panel { + margin-top: 5px; +} +.panel-group .panel-heading { + border-bottom: 0; +} +.panel-group .panel-heading + .panel-collapse > .panel-body, +.panel-group .panel-heading + .panel-collapse > .list-group { + border-top: 1px solid #ddd; +} +.panel-group .panel-footer { + border-top: 0; +} +.panel-group .panel-footer + .panel-collapse .panel-body { + border-bottom: 1px solid #ddd; +} +.panel-default { + border-color: #ddd; +} +.panel-default > .panel-heading { + color: #333; + background-color: #f5f5f5; + border-color: #ddd; +} +.panel-default > .panel-heading + .panel-collapse > .panel-body { + border-top-color: #ddd; +} +.panel-default > .panel-heading .badge { + color: #f5f5f5; + background-color: #333; +} +.panel-default > .panel-footer + .panel-collapse > .panel-body { + border-bottom-color: #ddd; +} +.panel-primary { + border-color: #337ab7; +} +.panel-primary > .panel-heading { + color: #fff; + background-color: #337ab7; + border-color: #337ab7; +} +.panel-primary > .panel-heading + .panel-collapse > .panel-body { + border-top-color: #337ab7; +} +.panel-primary > .panel-heading .badge { + color: #337ab7; + background-color: #fff; +} +.panel-primary > .panel-footer + .panel-collapse > .panel-body { + border-bottom-color: #337ab7; +} +.panel-success { + border-color: #d6e9c6; +} +.panel-success > .panel-heading { + color: #3c763d; + background-color: #dff0d8; + border-color: #d6e9c6; +} +.panel-success > .panel-heading + .panel-collapse > .panel-body { + border-top-color: #d6e9c6; +} +.panel-success > .panel-heading .badge { + color: #dff0d8; + background-color: #3c763d; +} +.panel-success > .panel-footer + .panel-collapse > .panel-body { + border-bottom-color: #d6e9c6; +} +.panel-info { + border-color: #bce8f1; +} +.panel-info > .panel-heading { + color: #31708f; + background-color: #d9edf7; + border-color: #bce8f1; +} +.panel-info > .panel-heading + .panel-collapse > .panel-body { + border-top-color: #bce8f1; +} +.panel-info > .panel-heading .badge { + color: #d9edf7; + background-color: #31708f; +} +.panel-info > .panel-footer + .panel-collapse > .panel-body { + border-bottom-color: #bce8f1; +} +.panel-warning { + border-color: #faebcc; +} +.panel-warning > .panel-heading { + color: #8a6d3b; + background-color: #fcf8e3; + border-color: #faebcc; +} +.panel-warning > .panel-heading + .panel-collapse > .panel-body { + border-top-color: #faebcc; +} +.panel-warning > .panel-heading .badge { + color: #fcf8e3; + background-color: #8a6d3b; +} +.panel-warning > .panel-footer + .panel-collapse > .panel-body { + border-bottom-color: #faebcc; +} +.panel-danger { + border-color: #ebccd1; +} +.panel-danger > .panel-heading { + color: #a94442; + background-color: #f2dede; + border-color: #ebccd1; +} +.panel-danger > .panel-heading + .panel-collapse > .panel-body { + border-top-color: #ebccd1; +} +.panel-danger > .panel-heading .badge { + color: #f2dede; + background-color: #a94442; +} +.panel-danger > .panel-footer + .panel-collapse > .panel-body { + border-bottom-color: #ebccd1; +} +.embed-responsive { + position: relative; + display: block; + height: 0; + padding: 0; + overflow: hidden; +} +.embed-responsive .embed-responsive-item, +.embed-responsive iframe, +.embed-responsive embed, +.embed-responsive object, +.embed-responsive video { + position: absolute; + top: 0; + bottom: 0; + left: 0; + width: 100%; + height: 100%; + border: 0; +} +.embed-responsive-16by9 { + padding-bottom: 56.25%; +} +.embed-responsive-4by3 { + padding-bottom: 75%; +} +.well { + min-height: 20px; + padding: 19px; + margin-bottom: 20px; + background-color: #f5f5f5; + border: 1px solid #e3e3e3; + border-radius: 4px; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .05); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, .05); +} +.well blockquote { + border-color: #ddd; + border-color: rgba(0, 0, 0, .15); +} +.well-lg { + padding: 24px; + border-radius: 6px; +} +.well-sm { + padding: 9px; + border-radius: 3px; +} +.close { + float: right; + font-size: 21px; + font-weight: bold; + line-height: 1; + color: #000; + text-shadow: 0 1px 0 #fff; + filter: alpha(opacity=20); + opacity: .2; +} +.close:hover, +.close:focus { + color: #000; + text-decoration: none; + cursor: pointer; + filter: alpha(opacity=50); + opacity: .5; +} +button.close { + -webkit-appearance: none; + padding: 0; + cursor: pointer; + background: transparent; + border: 0; +} +.modal-open { + overflow: hidden; +} +.modal { + position: fixed; + top: 0; + right: 0; + bottom: 0; + left: 0; + z-index: 1050; + display: none; + overflow: hidden; + -webkit-overflow-scrolling: touch; + outline: 0; +} +.modal.fade .modal-dialog { + -webkit-transition: -webkit-transform .3s ease-out; + -o-transition: -o-transform .3s ease-out; + transition: transform .3s ease-out; + -webkit-transform: translate(0, -25%); + -ms-transform: translate(0, -25%); + -o-transform: translate(0, -25%); + transform: translate(0, -25%); +} +.modal.in .modal-dialog { + -webkit-transform: translate(0, 0); + -ms-transform: translate(0, 0); + -o-transform: translate(0, 0); + transform: translate(0, 0); +} +.modal-open .modal { + overflow-x: hidden; + overflow-y: auto; +} +.modal-dialog { + position: relative; + width: auto; + margin: 10px; +} +.modal-content { + position: relative; + background-color: #fff; + -webkit-background-clip: padding-box; + background-clip: padding-box; + border: 1px solid #999; + border: 1px solid rgba(0, 0, 0, .2); + border-radius: 6px; + outline: 0; + -webkit-box-shadow: 0 3px 9px rgba(0, 0, 0, .5); + box-shadow: 0 3px 9px rgba(0, 0, 0, .5); +} +.modal-backdrop { + position: fixed; + top: 0; + right: 0; + bottom: 0; + left: 0; + z-index: 1040; + background-color: #000; +} +.modal-backdrop.fade { + filter: alpha(opacity=0); + opacity: 0; +} +.modal-backdrop.in { + filter: alpha(opacity=50); + opacity: .5; +} +.modal-header { + padding: 15px; + border-bottom: 1px solid #e5e5e5; +} +.modal-header .close { + margin-top: -2px; +} +.modal-title { + margin: 0; + line-height: 1.42857143; +} +.modal-body { + position: relative; + padding: 15px; +} +.modal-footer { + padding: 15px; + text-align: right; + border-top: 1px solid #e5e5e5; +} +.modal-footer .btn + .btn { + margin-bottom: 0; + margin-left: 5px; +} +.modal-footer .btn-group .btn + .btn { + margin-left: -1px; +} +.modal-footer .btn-block + .btn-block { + margin-left: 0; +} +.modal-scrollbar-measure { + position: absolute; + top: -9999px; + width: 50px; + height: 50px; + overflow: scroll; +} +@media (min-width: 768px) { + .modal-dialog { + width: 600px; + margin: 30px auto; + } + .modal-content { + -webkit-box-shadow: 0 5px 15px rgba(0, 0, 0, .5); + box-shadow: 0 5px 15px rgba(0, 0, 0, .5); + } + .modal-sm { + width: 300px; + } +} +@media (min-width: 992px) { + .modal-lg { + width: 900px; + } +} +.tooltip { + position: absolute; + z-index: 1070; + display: block; + font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; + font-size: 12px; + font-style: normal; + font-weight: normal; + line-height: 1.42857143; + text-align: left; + text-align: start; + text-decoration: none; + text-shadow: none; + text-transform: none; + letter-spacing: normal; + word-break: normal; + word-spacing: normal; + word-wrap: normal; + white-space: normal; + filter: alpha(opacity=0); + opacity: 0; + + line-break: auto; +} +.tooltip.in { + filter: alpha(opacity=90); + opacity: .9; +} +.tooltip.top { + padding: 5px 0; + margin-top: -3px; +} +.tooltip.right { + padding: 0 5px; + margin-left: 3px; +} +.tooltip.bottom { + padding: 5px 0; + margin-top: 3px; +} +.tooltip.left { + padding: 0 5px; + margin-left: -3px; +} +.tooltip-inner { + max-width: 200px; + padding: 3px 8px; + color: #fff; + text-align: center; + background-color: #000; + border-radius: 4px; +} +.tooltip-arrow { + position: absolute; + width: 0; + height: 0; + border-color: transparent; + border-style: solid; +} +.tooltip.top .tooltip-arrow { + bottom: 0; + left: 50%; + margin-left: -5px; + border-width: 5px 5px 0; + border-top-color: #000; +} +.tooltip.top-left .tooltip-arrow { + right: 5px; + bottom: 0; + margin-bottom: -5px; + border-width: 5px 5px 0; + border-top-color: #000; +} +.tooltip.top-right .tooltip-arrow { + bottom: 0; + left: 5px; + margin-bottom: -5px; + border-width: 5px 5px 0; + border-top-color: #000; +} +.tooltip.right .tooltip-arrow { + top: 50%; + left: 0; + margin-top: -5px; + border-width: 5px 5px 5px 0; + border-right-color: #000; +} +.tooltip.left .tooltip-arrow { + top: 50%; + right: 0; + margin-top: -5px; + border-width: 5px 0 5px 5px; + border-left-color: #000; +} +.tooltip.bottom .tooltip-arrow { + top: 0; + left: 50%; + margin-left: -5px; + border-width: 0 5px 5px; + border-bottom-color: #000; +} +.tooltip.bottom-left .tooltip-arrow { + top: 0; + right: 5px; + margin-top: -5px; + border-width: 0 5px 5px; + border-bottom-color: #000; +} +.tooltip.bottom-right .tooltip-arrow { + top: 0; + left: 5px; + margin-top: -5px; + border-width: 0 5px 5px; + border-bottom-color: #000; +} +.popover { + position: absolute; + top: 0; + left: 0; + z-index: 1060; + display: none; + max-width: 276px; + padding: 1px; + font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; + font-size: 14px; + font-style: normal; + font-weight: normal; + line-height: 1.42857143; + text-align: left; + text-align: start; + text-decoration: none; + text-shadow: none; + text-transform: none; + letter-spacing: normal; + word-break: normal; + word-spacing: normal; + word-wrap: normal; + white-space: normal; + background-color: #fff; + -webkit-background-clip: padding-box; + background-clip: padding-box; + border: 1px solid #ccc; + border: 1px solid rgba(0, 0, 0, .2); + border-radius: 6px; + -webkit-box-shadow: 0 5px 10px rgba(0, 0, 0, .2); + box-shadow: 0 5px 10px rgba(0, 0, 0, .2); + + line-break: auto; +} +.popover.top { + margin-top: -10px; +} +.popover.right { + margin-left: 10px; +} +.popover.bottom { + margin-top: 10px; +} +.popover.left { + margin-left: -10px; +} +.popover-title { + padding: 8px 14px; + margin: 0; + font-size: 14px; + background-color: #f7f7f7; + border-bottom: 1px solid #ebebeb; + border-radius: 5px 5px 0 0; +} +.popover-content { + padding: 9px 14px; +} +.popover > .arrow, +.popover > .arrow:after { + position: absolute; + display: block; + width: 0; + height: 0; + border-color: transparent; + border-style: solid; +} +.popover > .arrow { + border-width: 11px; +} +.popover > .arrow:after { + content: ""; + border-width: 10px; +} +.popover.top > .arrow { + bottom: -11px; + left: 50%; + margin-left: -11px; + border-top-color: #999; + border-top-color: rgba(0, 0, 0, .25); + border-bottom-width: 0; +} +.popover.top > .arrow:after { + bottom: 1px; + margin-left: -10px; + content: " "; + border-top-color: #fff; + border-bottom-width: 0; +} +.popover.right > .arrow { + top: 50%; + left: -11px; + margin-top: -11px; + border-right-color: #999; + border-right-color: rgba(0, 0, 0, .25); + border-left-width: 0; +} +.popover.right > .arrow:after { + bottom: -10px; + left: 1px; + content: " "; + border-right-color: #fff; + border-left-width: 0; +} +.popover.bottom > .arrow { + top: -11px; + left: 50%; + margin-left: -11px; + border-top-width: 0; + border-bottom-color: #999; + border-bottom-color: rgba(0, 0, 0, .25); +} +.popover.bottom > .arrow:after { + top: 1px; + margin-left: -10px; + content: " "; + border-top-width: 0; + border-bottom-color: #fff; +} +.popover.left > .arrow { + top: 50%; + right: -11px; + margin-top: -11px; + border-right-width: 0; + border-left-color: #999; + border-left-color: rgba(0, 0, 0, .25); +} +.popover.left > .arrow:after { + right: 1px; + bottom: -10px; + content: " "; + border-right-width: 0; + border-left-color: #fff; +} +.carousel { + position: relative; +} +.carousel-inner { + position: relative; + width: 100%; + overflow: hidden; +} +.carousel-inner > .item { + position: relative; + display: none; + -webkit-transition: .6s ease-in-out left; + -o-transition: .6s ease-in-out left; + transition: .6s ease-in-out left; +} +.carousel-inner > .item > img, +.carousel-inner > .item > a > img { + line-height: 1; +} +@media all and (transform-3d), (-webkit-transform-3d) { + .carousel-inner > .item { + -webkit-transition: -webkit-transform .6s ease-in-out; + -o-transition: -o-transform .6s ease-in-out; + transition: transform .6s ease-in-out; + + -webkit-backface-visibility: hidden; + backface-visibility: hidden; + -webkit-perspective: 1000px; + perspective: 1000px; + } + .carousel-inner > .item.next, + .carousel-inner > .item.active.right { + left: 0; + -webkit-transform: translate3d(100%, 0, 0); + transform: translate3d(100%, 0, 0); + } + .carousel-inner > .item.prev, + .carousel-inner > .item.active.left { + left: 0; + -webkit-transform: translate3d(-100%, 0, 0); + transform: translate3d(-100%, 0, 0); + } + .carousel-inner > .item.next.left, + .carousel-inner > .item.prev.right, + .carousel-inner > .item.active { + left: 0; + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + } +} +.carousel-inner > .active, +.carousel-inner > .next, +.carousel-inner > .prev { + display: block; +} +.carousel-inner > .active { + left: 0; +} +.carousel-inner > .next, +.carousel-inner > .prev { + position: absolute; + top: 0; + width: 100%; +} +.carousel-inner > .next { + left: 100%; +} +.carousel-inner > .prev { + left: -100%; +} +.carousel-inner > .next.left, +.carousel-inner > .prev.right { + left: 0; +} +.carousel-inner > .active.left { + left: -100%; +} +.carousel-inner > .active.right { + left: 100%; +} +.carousel-control { + position: absolute; + top: 0; + bottom: 0; + left: 0; + width: 15%; + font-size: 20px; + color: #fff; + text-align: center; + text-shadow: 0 1px 2px rgba(0, 0, 0, .6); + background-color: rgba(0, 0, 0, 0); + filter: alpha(opacity=50); + opacity: .5; +} +.carousel-control.left { + background-image: -webkit-linear-gradient(left, rgba(0, 0, 0, .5) 0%, rgba(0, 0, 0, .0001) 100%); + background-image: -o-linear-gradient(left, rgba(0, 0, 0, .5) 0%, rgba(0, 0, 0, .0001) 100%); + background-image: -webkit-gradient(linear, left top, right top, from(rgba(0, 0, 0, .5)), to(rgba(0, 0, 0, .0001))); + background-image: linear-gradient(to right, rgba(0, 0, 0, .5) 0%, rgba(0, 0, 0, .0001) 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#80000000', endColorstr='#00000000', GradientType=1); + background-repeat: repeat-x; +} +.carousel-control.right { + right: 0; + left: auto; + background-image: -webkit-linear-gradient(left, rgba(0, 0, 0, .0001) 0%, rgba(0, 0, 0, .5) 100%); + background-image: -o-linear-gradient(left, rgba(0, 0, 0, .0001) 0%, rgba(0, 0, 0, .5) 100%); + background-image: -webkit-gradient(linear, left top, right top, from(rgba(0, 0, 0, .0001)), to(rgba(0, 0, 0, .5))); + background-image: linear-gradient(to right, rgba(0, 0, 0, .0001) 0%, rgba(0, 0, 0, .5) 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#00000000', endColorstr='#80000000', GradientType=1); + background-repeat: repeat-x; +} +.carousel-control:hover, +.carousel-control:focus { + color: #fff; + text-decoration: none; + filter: alpha(opacity=90); + outline: 0; + opacity: .9; +} +.carousel-control .icon-prev, +.carousel-control .icon-next, +.carousel-control .glyphicon-chevron-left, +.carousel-control .glyphicon-chevron-right { + position: absolute; + top: 50%; + z-index: 5; + display: inline-block; + margin-top: -10px; +} +.carousel-control .icon-prev, +.carousel-control .glyphicon-chevron-left { + left: 50%; + margin-left: -10px; +} +.carousel-control .icon-next, +.carousel-control .glyphicon-chevron-right { + right: 50%; + margin-right: -10px; +} +.carousel-control .icon-prev, +.carousel-control .icon-next { + width: 20px; + height: 20px; + font-family: serif; + line-height: 1; +} +.carousel-control .icon-prev:before { + content: '\2039'; +} +.carousel-control .icon-next:before { + content: '\203a'; +} +.carousel-indicators { + position: absolute; + bottom: 10px; + left: 50%; + z-index: 15; + width: 60%; + padding-left: 0; + margin-left: -30%; + text-align: center; + list-style: none; +} +.carousel-indicators li { + display: inline-block; + width: 10px; + height: 10px; + margin: 1px; + text-indent: -999px; + cursor: pointer; + background-color: #000 \9; + background-color: rgba(0, 0, 0, 0); + border: 1px solid #fff; + border-radius: 10px; +} +.carousel-indicators .active { + width: 12px; + height: 12px; + margin: 0; + background-color: #fff; +} +.carousel-caption { + position: absolute; + right: 15%; + bottom: 20px; + left: 15%; + z-index: 10; + padding-top: 20px; + padding-bottom: 20px; + color: #fff; + text-align: center; + text-shadow: 0 1px 2px rgba(0, 0, 0, .6); +} +.carousel-caption .btn { + text-shadow: none; +} +@media screen and (min-width: 768px) { + .carousel-control .glyphicon-chevron-left, + .carousel-control .glyphicon-chevron-right, + .carousel-control .icon-prev, + .carousel-control .icon-next { + width: 30px; + height: 30px; + margin-top: -10px; + font-size: 30px; + } + .carousel-control .glyphicon-chevron-left, + .carousel-control .icon-prev { + margin-left: -10px; + } + .carousel-control .glyphicon-chevron-right, + .carousel-control .icon-next { + margin-right: -10px; + } + .carousel-caption { + right: 20%; + left: 20%; + padding-bottom: 30px; + } + .carousel-indicators { + bottom: 20px; + } +} +.clearfix:before, +.clearfix:after, +.dl-horizontal dd:before, +.dl-horizontal dd:after, +.container:before, +.container:after, +.container-fluid:before, +.container-fluid:after, +.row:before, +.row:after, +.form-horizontal .form-group:before, +.form-horizontal .form-group:after, +.btn-toolbar:before, +.btn-toolbar:after, +.btn-group-vertical > .btn-group:before, +.btn-group-vertical > .btn-group:after, +.nav:before, +.nav:after, +.navbar:before, +.navbar:after, +.navbar-header:before, +.navbar-header:after, +.navbar-collapse:before, +.navbar-collapse:after, +.pager:before, +.pager:after, +.panel-body:before, +.panel-body:after, +.modal-header:before, +.modal-header:after, +.modal-footer:before, +.modal-footer:after { + display: table; + content: " "; +} +.clearfix:after, +.dl-horizontal dd:after, +.container:after, +.container-fluid:after, +.row:after, +.form-horizontal .form-group:after, +.btn-toolbar:after, +.btn-group-vertical > .btn-group:after, +.nav:after, +.navbar:after, +.navbar-header:after, +.navbar-collapse:after, +.pager:after, +.panel-body:after, +.modal-header:after, +.modal-footer:after { + clear: both; +} +.center-block { + display: block; + margin-right: auto; + margin-left: auto; +} +.pull-right { + float: right !important; +} +.pull-left { + float: left !important; +} +.hide { + display: none !important; +} +.show { + display: block !important; +} +.invisible { + visibility: hidden; +} +.text-hide { + font: 0/0 a; + color: transparent; + text-shadow: none; + background-color: transparent; + border: 0; +} +.hidden { + display: none !important; +} +.affix { + position: fixed; +} +@-ms-viewport { + width: device-width; +} +.visible-xs, +.visible-sm, +.visible-md, +.visible-lg { + display: none !important; +} +.visible-xs-block, +.visible-xs-inline, +.visible-xs-inline-block, +.visible-sm-block, +.visible-sm-inline, +.visible-sm-inline-block, +.visible-md-block, +.visible-md-inline, +.visible-md-inline-block, +.visible-lg-block, +.visible-lg-inline, +.visible-lg-inline-block { + display: none !important; +} +@media (max-width: 767px) { + .visible-xs { + display: block !important; + } + table.visible-xs { + display: table !important; + } + tr.visible-xs { + display: table-row !important; + } + th.visible-xs, + td.visible-xs { + display: table-cell !important; + } +} +@media (max-width: 767px) { + .visible-xs-block { + display: block !important; + } +} +@media (max-width: 767px) { + .visible-xs-inline { + display: inline !important; + } +} +@media (max-width: 767px) { + .visible-xs-inline-block { + display: inline-block !important; + } +} +@media (min-width: 768px) and (max-width: 991px) { + .visible-sm { + display: block !important; + } + table.visible-sm { + display: table !important; + } + tr.visible-sm { + display: table-row !important; + } + th.visible-sm, + td.visible-sm { + display: table-cell !important; + } +} +@media (min-width: 768px) and (max-width: 991px) { + .visible-sm-block { + display: block !important; + } +} +@media (min-width: 768px) and (max-width: 991px) { + .visible-sm-inline { + display: inline !important; + } +} +@media (min-width: 768px) and (max-width: 991px) { + .visible-sm-inline-block { + display: inline-block !important; + } +} +@media (min-width: 992px) and (max-width: 1199px) { + .visible-md { + display: block !important; + } + table.visible-md { + display: table !important; + } + tr.visible-md { + display: table-row !important; + } + th.visible-md, + td.visible-md { + display: table-cell !important; + } +} +@media (min-width: 992px) and (max-width: 1199px) { + .visible-md-block { + display: block !important; + } +} +@media (min-width: 992px) and (max-width: 1199px) { + .visible-md-inline { + display: inline !important; + } +} +@media (min-width: 992px) and (max-width: 1199px) { + .visible-md-inline-block { + display: inline-block !important; + } +} +@media (min-width: 1200px) { + .visible-lg { + display: block !important; + } + table.visible-lg { + display: table !important; + } + tr.visible-lg { + display: table-row !important; + } + th.visible-lg, + td.visible-lg { + display: table-cell !important; + } +} +@media (min-width: 1200px) { + .visible-lg-block { + display: block !important; + } +} +@media (min-width: 1200px) { + .visible-lg-inline { + display: inline !important; + } +} +@media (min-width: 1200px) { + .visible-lg-inline-block { + display: inline-block !important; + } +} +@media (max-width: 767px) { + .hidden-xs { + display: none !important; + } +} +@media (min-width: 768px) and (max-width: 991px) { + .hidden-sm { + display: none !important; + } +} +@media (min-width: 992px) and (max-width: 1199px) { + .hidden-md { + display: none !important; + } +} +@media (min-width: 1200px) { + .hidden-lg { + display: none !important; + } +} +.visible-print { + display: none !important; +} +@media print { + .visible-print { + display: block !important; + } + table.visible-print { + display: table !important; + } + tr.visible-print { + display: table-row !important; + } + th.visible-print, + td.visible-print { + display: table-cell !important; + } +} +.visible-print-block { + display: none !important; +} +@media print { + .visible-print-block { + display: block !important; + } +} +.visible-print-inline { + display: none !important; +} +@media print { + .visible-print-inline { + display: inline !important; + } +} +.visible-print-inline-block { + display: none !important; +} +@media print { + .visible-print-inline-block { + display: inline-block !important; + } +} +@media print { + .hidden-print { + display: none !important; + } +} +/*# sourceMappingURL=bootstrap.css.map */ diff --git a/vraptor/src/main/webapp/vendor/bootstrap/css/bootstrap.min.css b/vraptor/src/main/webapp/vendor/bootstrap/css/bootstrap.min.css new file mode 100644 index 0000000000..ed3905e0e0 --- /dev/null +++ b/vraptor/src/main/webapp/vendor/bootstrap/css/bootstrap.min.css @@ -0,0 +1,6 @@ +/*! + * Bootstrap v3.3.7 (http://getbootstrap.com) + * Copyright 2011-2016 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + *//*! normalize.css v3.0.3 | MIT License | github.com/necolas/normalize.css */html{font-family:sans-serif;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%}body{margin:0}article,aside,details,figcaption,figure,footer,header,hgroup,main,menu,nav,section,summary{display:block}audio,canvas,progress,video{display:inline-block;vertical-align:baseline}audio:not([controls]){display:none;height:0}[hidden],template{display:none}a{background-color:transparent}a:active,a:hover{outline:0}abbr[title]{border-bottom:1px dotted}b,strong{font-weight:700}dfn{font-style:italic}h1{margin:.67em 0;font-size:2em}mark{color:#000;background:#ff0}small{font-size:80%}sub,sup{position:relative;font-size:75%;line-height:0;vertical-align:baseline}sup{top:-.5em}sub{bottom:-.25em}img{border:0}svg:not(:root){overflow:hidden}figure{margin:1em 40px}hr{height:0;-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box}pre{overflow:auto}code,kbd,pre,samp{font-family:monospace,monospace;font-size:1em}button,input,optgroup,select,textarea{margin:0;font:inherit;color:inherit}button{overflow:visible}button,select{text-transform:none}button,html input[type=button],input[type=reset],input[type=submit]{-webkit-appearance:button;cursor:pointer}button[disabled],html input[disabled]{cursor:default}button::-moz-focus-inner,input::-moz-focus-inner{padding:0;border:0}input{line-height:normal}input[type=checkbox],input[type=radio]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;padding:0}input[type=number]::-webkit-inner-spin-button,input[type=number]::-webkit-outer-spin-button{height:auto}input[type=search]{-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;-webkit-appearance:textfield}input[type=search]::-webkit-search-cancel-button,input[type=search]::-webkit-search-decoration{-webkit-appearance:none}fieldset{padding:.35em .625em .75em;margin:0 2px;border:1px solid silver}legend{padding:0;border:0}textarea{overflow:auto}optgroup{font-weight:700}table{border-spacing:0;border-collapse:collapse}td,th{padding:0}/*! Source: https://github.com/h5bp/html5-boilerplate/blob/master/src/css/main.css */@media print{*,:after,:before{color:#000!important;text-shadow:none!important;background:0 0!important;-webkit-box-shadow:none!important;box-shadow:none!important}a,a:visited{text-decoration:underline}a[href]:after{content:" (" attr(href) ")"}abbr[title]:after{content:" (" attr(title) ")"}a[href^="javascript:"]:after,a[href^="#"]:after{content:""}blockquote,pre{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}img,tr{page-break-inside:avoid}img{max-width:100%!important}h2,h3,p{orphans:3;widows:3}h2,h3{page-break-after:avoid}.navbar{display:none}.btn>.caret,.dropup>.btn>.caret{border-top-color:#000!important}.label{border:1px solid #000}.table{border-collapse:collapse!important}.table td,.table th{background-color:#fff!important}.table-bordered td,.table-bordered th{border:1px solid #ddd!important}}@font-face{font-family:'Glyphicons Halflings';src:url(../fonts/glyphicons-halflings-regular.eot);src:url(../fonts/glyphicons-halflings-regular.eot?#iefix) format('embedded-opentype'),url(../fonts/glyphicons-halflings-regular.woff2) format('woff2'),url(../fonts/glyphicons-halflings-regular.woff) format('woff'),url(../fonts/glyphicons-halflings-regular.ttf) format('truetype'),url(../fonts/glyphicons-halflings-regular.svg#glyphicons_halflingsregular) format('svg')}.glyphicon{position:relative;top:1px;display:inline-block;font-family:'Glyphicons Halflings';font-style:normal;font-weight:400;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.glyphicon-asterisk:before{content:"\002a"}.glyphicon-plus:before{content:"\002b"}.glyphicon-eur:before,.glyphicon-euro:before{content:"\20ac"}.glyphicon-minus:before{content:"\2212"}.glyphicon-cloud:before{content:"\2601"}.glyphicon-envelope:before{content:"\2709"}.glyphicon-pencil:before{content:"\270f"}.glyphicon-glass:before{content:"\e001"}.glyphicon-music:before{content:"\e002"}.glyphicon-search:before{content:"\e003"}.glyphicon-heart:before{content:"\e005"}.glyphicon-star:before{content:"\e006"}.glyphicon-star-empty:before{content:"\e007"}.glyphicon-user:before{content:"\e008"}.glyphicon-film:before{content:"\e009"}.glyphicon-th-large:before{content:"\e010"}.glyphicon-th:before{content:"\e011"}.glyphicon-th-list:before{content:"\e012"}.glyphicon-ok:before{content:"\e013"}.glyphicon-remove:before{content:"\e014"}.glyphicon-zoom-in:before{content:"\e015"}.glyphicon-zoom-out:before{content:"\e016"}.glyphicon-off:before{content:"\e017"}.glyphicon-signal:before{content:"\e018"}.glyphicon-cog:before{content:"\e019"}.glyphicon-trash:before{content:"\e020"}.glyphicon-home:before{content:"\e021"}.glyphicon-file:before{content:"\e022"}.glyphicon-time:before{content:"\e023"}.glyphicon-road:before{content:"\e024"}.glyphicon-download-alt:before{content:"\e025"}.glyphicon-download:before{content:"\e026"}.glyphicon-upload:before{content:"\e027"}.glyphicon-inbox:before{content:"\e028"}.glyphicon-play-circle:before{content:"\e029"}.glyphicon-repeat:before{content:"\e030"}.glyphicon-refresh:before{content:"\e031"}.glyphicon-list-alt:before{content:"\e032"}.glyphicon-lock:before{content:"\e033"}.glyphicon-flag:before{content:"\e034"}.glyphicon-headphones:before{content:"\e035"}.glyphicon-volume-off:before{content:"\e036"}.glyphicon-volume-down:before{content:"\e037"}.glyphicon-volume-up:before{content:"\e038"}.glyphicon-qrcode:before{content:"\e039"}.glyphicon-barcode:before{content:"\e040"}.glyphicon-tag:before{content:"\e041"}.glyphicon-tags:before{content:"\e042"}.glyphicon-book:before{content:"\e043"}.glyphicon-bookmark:before{content:"\e044"}.glyphicon-print:before{content:"\e045"}.glyphicon-camera:before{content:"\e046"}.glyphicon-font:before{content:"\e047"}.glyphicon-bold:before{content:"\e048"}.glyphicon-italic:before{content:"\e049"}.glyphicon-text-height:before{content:"\e050"}.glyphicon-text-width:before{content:"\e051"}.glyphicon-align-left:before{content:"\e052"}.glyphicon-align-center:before{content:"\e053"}.glyphicon-align-right:before{content:"\e054"}.glyphicon-align-justify:before{content:"\e055"}.glyphicon-list:before{content:"\e056"}.glyphicon-indent-left:before{content:"\e057"}.glyphicon-indent-right:before{content:"\e058"}.glyphicon-facetime-video:before{content:"\e059"}.glyphicon-picture:before{content:"\e060"}.glyphicon-map-marker:before{content:"\e062"}.glyphicon-adjust:before{content:"\e063"}.glyphicon-tint:before{content:"\e064"}.glyphicon-edit:before{content:"\e065"}.glyphicon-share:before{content:"\e066"}.glyphicon-check:before{content:"\e067"}.glyphicon-move:before{content:"\e068"}.glyphicon-step-backward:before{content:"\e069"}.glyphicon-fast-backward:before{content:"\e070"}.glyphicon-backward:before{content:"\e071"}.glyphicon-play:before{content:"\e072"}.glyphicon-pause:before{content:"\e073"}.glyphicon-stop:before{content:"\e074"}.glyphicon-forward:before{content:"\e075"}.glyphicon-fast-forward:before{content:"\e076"}.glyphicon-step-forward:before{content:"\e077"}.glyphicon-eject:before{content:"\e078"}.glyphicon-chevron-left:before{content:"\e079"}.glyphicon-chevron-right:before{content:"\e080"}.glyphicon-plus-sign:before{content:"\e081"}.glyphicon-minus-sign:before{content:"\e082"}.glyphicon-remove-sign:before{content:"\e083"}.glyphicon-ok-sign:before{content:"\e084"}.glyphicon-question-sign:before{content:"\e085"}.glyphicon-info-sign:before{content:"\e086"}.glyphicon-screenshot:before{content:"\e087"}.glyphicon-remove-circle:before{content:"\e088"}.glyphicon-ok-circle:before{content:"\e089"}.glyphicon-ban-circle:before{content:"\e090"}.glyphicon-arrow-left:before{content:"\e091"}.glyphicon-arrow-right:before{content:"\e092"}.glyphicon-arrow-up:before{content:"\e093"}.glyphicon-arrow-down:before{content:"\e094"}.glyphicon-share-alt:before{content:"\e095"}.glyphicon-resize-full:before{content:"\e096"}.glyphicon-resize-small:before{content:"\e097"}.glyphicon-exclamation-sign:before{content:"\e101"}.glyphicon-gift:before{content:"\e102"}.glyphicon-leaf:before{content:"\e103"}.glyphicon-fire:before{content:"\e104"}.glyphicon-eye-open:before{content:"\e105"}.glyphicon-eye-close:before{content:"\e106"}.glyphicon-warning-sign:before{content:"\e107"}.glyphicon-plane:before{content:"\e108"}.glyphicon-calendar:before{content:"\e109"}.glyphicon-random:before{content:"\e110"}.glyphicon-comment:before{content:"\e111"}.glyphicon-magnet:before{content:"\e112"}.glyphicon-chevron-up:before{content:"\e113"}.glyphicon-chevron-down:before{content:"\e114"}.glyphicon-retweet:before{content:"\e115"}.glyphicon-shopping-cart:before{content:"\e116"}.glyphicon-folder-close:before{content:"\e117"}.glyphicon-folder-open:before{content:"\e118"}.glyphicon-resize-vertical:before{content:"\e119"}.glyphicon-resize-horizontal:before{content:"\e120"}.glyphicon-hdd:before{content:"\e121"}.glyphicon-bullhorn:before{content:"\e122"}.glyphicon-bell:before{content:"\e123"}.glyphicon-certificate:before{content:"\e124"}.glyphicon-thumbs-up:before{content:"\e125"}.glyphicon-thumbs-down:before{content:"\e126"}.glyphicon-hand-right:before{content:"\e127"}.glyphicon-hand-left:before{content:"\e128"}.glyphicon-hand-up:before{content:"\e129"}.glyphicon-hand-down:before{content:"\e130"}.glyphicon-circle-arrow-right:before{content:"\e131"}.glyphicon-circle-arrow-left:before{content:"\e132"}.glyphicon-circle-arrow-up:before{content:"\e133"}.glyphicon-circle-arrow-down:before{content:"\e134"}.glyphicon-globe:before{content:"\e135"}.glyphicon-wrench:before{content:"\e136"}.glyphicon-tasks:before{content:"\e137"}.glyphicon-filter:before{content:"\e138"}.glyphicon-briefcase:before{content:"\e139"}.glyphicon-fullscreen:before{content:"\e140"}.glyphicon-dashboard:before{content:"\e141"}.glyphicon-paperclip:before{content:"\e142"}.glyphicon-heart-empty:before{content:"\e143"}.glyphicon-link:before{content:"\e144"}.glyphicon-phone:before{content:"\e145"}.glyphicon-pushpin:before{content:"\e146"}.glyphicon-usd:before{content:"\e148"}.glyphicon-gbp:before{content:"\e149"}.glyphicon-sort:before{content:"\e150"}.glyphicon-sort-by-alphabet:before{content:"\e151"}.glyphicon-sort-by-alphabet-alt:before{content:"\e152"}.glyphicon-sort-by-order:before{content:"\e153"}.glyphicon-sort-by-order-alt:before{content:"\e154"}.glyphicon-sort-by-attributes:before{content:"\e155"}.glyphicon-sort-by-attributes-alt:before{content:"\e156"}.glyphicon-unchecked:before{content:"\e157"}.glyphicon-expand:before{content:"\e158"}.glyphicon-collapse-down:before{content:"\e159"}.glyphicon-collapse-up:before{content:"\e160"}.glyphicon-log-in:before{content:"\e161"}.glyphicon-flash:before{content:"\e162"}.glyphicon-log-out:before{content:"\e163"}.glyphicon-new-window:before{content:"\e164"}.glyphicon-record:before{content:"\e165"}.glyphicon-save:before{content:"\e166"}.glyphicon-open:before{content:"\e167"}.glyphicon-saved:before{content:"\e168"}.glyphicon-import:before{content:"\e169"}.glyphicon-export:before{content:"\e170"}.glyphicon-send:before{content:"\e171"}.glyphicon-floppy-disk:before{content:"\e172"}.glyphicon-floppy-saved:before{content:"\e173"}.glyphicon-floppy-remove:before{content:"\e174"}.glyphicon-floppy-save:before{content:"\e175"}.glyphicon-floppy-open:before{content:"\e176"}.glyphicon-credit-card:before{content:"\e177"}.glyphicon-transfer:before{content:"\e178"}.glyphicon-cutlery:before{content:"\e179"}.glyphicon-header:before{content:"\e180"}.glyphicon-compressed:before{content:"\e181"}.glyphicon-earphone:before{content:"\e182"}.glyphicon-phone-alt:before{content:"\e183"}.glyphicon-tower:before{content:"\e184"}.glyphicon-stats:before{content:"\e185"}.glyphicon-sd-video:before{content:"\e186"}.glyphicon-hd-video:before{content:"\e187"}.glyphicon-subtitles:before{content:"\e188"}.glyphicon-sound-stereo:before{content:"\e189"}.glyphicon-sound-dolby:before{content:"\e190"}.glyphicon-sound-5-1:before{content:"\e191"}.glyphicon-sound-6-1:before{content:"\e192"}.glyphicon-sound-7-1:before{content:"\e193"}.glyphicon-copyright-mark:before{content:"\e194"}.glyphicon-registration-mark:before{content:"\e195"}.glyphicon-cloud-download:before{content:"\e197"}.glyphicon-cloud-upload:before{content:"\e198"}.glyphicon-tree-conifer:before{content:"\e199"}.glyphicon-tree-deciduous:before{content:"\e200"}.glyphicon-cd:before{content:"\e201"}.glyphicon-save-file:before{content:"\e202"}.glyphicon-open-file:before{content:"\e203"}.glyphicon-level-up:before{content:"\e204"}.glyphicon-copy:before{content:"\e205"}.glyphicon-paste:before{content:"\e206"}.glyphicon-alert:before{content:"\e209"}.glyphicon-equalizer:before{content:"\e210"}.glyphicon-king:before{content:"\e211"}.glyphicon-queen:before{content:"\e212"}.glyphicon-pawn:before{content:"\e213"}.glyphicon-bishop:before{content:"\e214"}.glyphicon-knight:before{content:"\e215"}.glyphicon-baby-formula:before{content:"\e216"}.glyphicon-tent:before{content:"\26fa"}.glyphicon-blackboard:before{content:"\e218"}.glyphicon-bed:before{content:"\e219"}.glyphicon-apple:before{content:"\f8ff"}.glyphicon-erase:before{content:"\e221"}.glyphicon-hourglass:before{content:"\231b"}.glyphicon-lamp:before{content:"\e223"}.glyphicon-duplicate:before{content:"\e224"}.glyphicon-piggy-bank:before{content:"\e225"}.glyphicon-scissors:before{content:"\e226"}.glyphicon-bitcoin:before{content:"\e227"}.glyphicon-btc:before{content:"\e227"}.glyphicon-xbt:before{content:"\e227"}.glyphicon-yen:before{content:"\00a5"}.glyphicon-jpy:before{content:"\00a5"}.glyphicon-ruble:before{content:"\20bd"}.glyphicon-rub:before{content:"\20bd"}.glyphicon-scale:before{content:"\e230"}.glyphicon-ice-lolly:before{content:"\e231"}.glyphicon-ice-lolly-tasted:before{content:"\e232"}.glyphicon-education:before{content:"\e233"}.glyphicon-option-horizontal:before{content:"\e234"}.glyphicon-option-vertical:before{content:"\e235"}.glyphicon-menu-hamburger:before{content:"\e236"}.glyphicon-modal-window:before{content:"\e237"}.glyphicon-oil:before{content:"\e238"}.glyphicon-grain:before{content:"\e239"}.glyphicon-sunglasses:before{content:"\e240"}.glyphicon-text-size:before{content:"\e241"}.glyphicon-text-color:before{content:"\e242"}.glyphicon-text-background:before{content:"\e243"}.glyphicon-object-align-top:before{content:"\e244"}.glyphicon-object-align-bottom:before{content:"\e245"}.glyphicon-object-align-horizontal:before{content:"\e246"}.glyphicon-object-align-left:before{content:"\e247"}.glyphicon-object-align-vertical:before{content:"\e248"}.glyphicon-object-align-right:before{content:"\e249"}.glyphicon-triangle-right:before{content:"\e250"}.glyphicon-triangle-left:before{content:"\e251"}.glyphicon-triangle-bottom:before{content:"\e252"}.glyphicon-triangle-top:before{content:"\e253"}.glyphicon-console:before{content:"\e254"}.glyphicon-superscript:before{content:"\e255"}.glyphicon-subscript:before{content:"\e256"}.glyphicon-menu-left:before{content:"\e257"}.glyphicon-menu-right:before{content:"\e258"}.glyphicon-menu-down:before{content:"\e259"}.glyphicon-menu-up:before{content:"\e260"}*{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}:after,:before{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}html{font-size:10px;-webkit-tap-highlight-color:rgba(0,0,0,0)}body{font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:14px;line-height:1.42857143;color:#333;background-color:#fff}button,input,select,textarea{font-family:inherit;font-size:inherit;line-height:inherit}a{color:#337ab7;text-decoration:none}a:focus,a:hover{color:#23527c;text-decoration:underline}a:focus{outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}figure{margin:0}img{vertical-align:middle}.carousel-inner>.item>a>img,.carousel-inner>.item>img,.img-responsive,.thumbnail a>img,.thumbnail>img{display:block;max-width:100%;height:auto}.img-rounded{border-radius:6px}.img-thumbnail{display:inline-block;max-width:100%;height:auto;padding:4px;line-height:1.42857143;background-color:#fff;border:1px solid #ddd;border-radius:4px;-webkit-transition:all .2s ease-in-out;-o-transition:all .2s ease-in-out;transition:all .2s ease-in-out}.img-circle{border-radius:50%}hr{margin-top:20px;margin-bottom:20px;border:0;border-top:1px solid #eee}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;margin:0;overflow:visible;clip:auto}[role=button]{cursor:pointer}.h1,.h2,.h3,.h4,.h5,.h6,h1,h2,h3,h4,h5,h6{font-family:inherit;font-weight:500;line-height:1.1;color:inherit}.h1 .small,.h1 small,.h2 .small,.h2 small,.h3 .small,.h3 small,.h4 .small,.h4 small,.h5 .small,.h5 small,.h6 .small,.h6 small,h1 .small,h1 small,h2 .small,h2 small,h3 .small,h3 small,h4 .small,h4 small,h5 .small,h5 small,h6 .small,h6 small{font-weight:400;line-height:1;color:#777}.h1,.h2,.h3,h1,h2,h3{margin-top:20px;margin-bottom:10px}.h1 .small,.h1 small,.h2 .small,.h2 small,.h3 .small,.h3 small,h1 .small,h1 small,h2 .small,h2 small,h3 .small,h3 small{font-size:65%}.h4,.h5,.h6,h4,h5,h6{margin-top:10px;margin-bottom:10px}.h4 .small,.h4 small,.h5 .small,.h5 small,.h6 .small,.h6 small,h4 .small,h4 small,h5 .small,h5 small,h6 .small,h6 small{font-size:75%}.h1,h1{font-size:36px}.h2,h2{font-size:30px}.h3,h3{font-size:24px}.h4,h4{font-size:18px}.h5,h5{font-size:14px}.h6,h6{font-size:12px}p{margin:0 0 10px}.lead{margin-bottom:20px;font-size:16px;font-weight:300;line-height:1.4}@media (min-width:768px){.lead{font-size:21px}}.small,small{font-size:85%}.mark,mark{padding:.2em;background-color:#fcf8e3}.text-left{text-align:left}.text-right{text-align:right}.text-center{text-align:center}.text-justify{text-align:justify}.text-nowrap{white-space:nowrap}.text-lowercase{text-transform:lowercase}.text-uppercase{text-transform:uppercase}.text-capitalize{text-transform:capitalize}.text-muted{color:#777}.text-primary{color:#337ab7}a.text-primary:focus,a.text-primary:hover{color:#286090}.text-success{color:#3c763d}a.text-success:focus,a.text-success:hover{color:#2b542c}.text-info{color:#31708f}a.text-info:focus,a.text-info:hover{color:#245269}.text-warning{color:#8a6d3b}a.text-warning:focus,a.text-warning:hover{color:#66512c}.text-danger{color:#a94442}a.text-danger:focus,a.text-danger:hover{color:#843534}.bg-primary{color:#fff;background-color:#337ab7}a.bg-primary:focus,a.bg-primary:hover{background-color:#286090}.bg-success{background-color:#dff0d8}a.bg-success:focus,a.bg-success:hover{background-color:#c1e2b3}.bg-info{background-color:#d9edf7}a.bg-info:focus,a.bg-info:hover{background-color:#afd9ee}.bg-warning{background-color:#fcf8e3}a.bg-warning:focus,a.bg-warning:hover{background-color:#f7ecb5}.bg-danger{background-color:#f2dede}a.bg-danger:focus,a.bg-danger:hover{background-color:#e4b9b9}.page-header{padding-bottom:9px;margin:40px 0 20px;border-bottom:1px solid #eee}ol,ul{margin-top:0;margin-bottom:10px}ol ol,ol ul,ul ol,ul ul{margin-bottom:0}.list-unstyled{padding-left:0;list-style:none}.list-inline{padding-left:0;margin-left:-5px;list-style:none}.list-inline>li{display:inline-block;padding-right:5px;padding-left:5px}dl{margin-top:0;margin-bottom:20px}dd,dt{line-height:1.42857143}dt{font-weight:700}dd{margin-left:0}@media (min-width:768px){.dl-horizontal dt{float:left;width:160px;overflow:hidden;clear:left;text-align:right;text-overflow:ellipsis;white-space:nowrap}.dl-horizontal dd{margin-left:180px}}abbr[data-original-title],abbr[title]{cursor:help;border-bottom:1px dotted #777}.initialism{font-size:90%;text-transform:uppercase}blockquote{padding:10px 20px;margin:0 0 20px;font-size:17.5px;border-left:5px solid #eee}blockquote ol:last-child,blockquote p:last-child,blockquote ul:last-child{margin-bottom:0}blockquote .small,blockquote footer,blockquote small{display:block;font-size:80%;line-height:1.42857143;color:#777}blockquote .small:before,blockquote footer:before,blockquote small:before{content:'\2014 \00A0'}.blockquote-reverse,blockquote.pull-right{padding-right:15px;padding-left:0;text-align:right;border-right:5px solid #eee;border-left:0}.blockquote-reverse .small:before,.blockquote-reverse footer:before,.blockquote-reverse small:before,blockquote.pull-right .small:before,blockquote.pull-right footer:before,blockquote.pull-right small:before{content:''}.blockquote-reverse .small:after,.blockquote-reverse footer:after,.blockquote-reverse small:after,blockquote.pull-right .small:after,blockquote.pull-right footer:after,blockquote.pull-right small:after{content:'\00A0 \2014'}address{margin-bottom:20px;font-style:normal;line-height:1.42857143}code,kbd,pre,samp{font-family:Menlo,Monaco,Consolas,"Courier New",monospace}code{padding:2px 4px;font-size:90%;color:#c7254e;background-color:#f9f2f4;border-radius:4px}kbd{padding:2px 4px;font-size:90%;color:#fff;background-color:#333;border-radius:3px;-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,.25);box-shadow:inset 0 -1px 0 rgba(0,0,0,.25)}kbd kbd{padding:0;font-size:100%;font-weight:700;-webkit-box-shadow:none;box-shadow:none}pre{display:block;padding:9.5px;margin:0 0 10px;font-size:13px;line-height:1.42857143;color:#333;word-break:break-all;word-wrap:break-word;background-color:#f5f5f5;border:1px solid #ccc;border-radius:4px}pre code{padding:0;font-size:inherit;color:inherit;white-space:pre-wrap;background-color:transparent;border-radius:0}.pre-scrollable{max-height:340px;overflow-y:scroll}.container{padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}@media (min-width:768px){.container{width:750px}}@media (min-width:992px){.container{width:970px}}@media (min-width:1200px){.container{width:1170px}}.container-fluid{padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}.row{margin-right:-15px;margin-left:-15px}.col-lg-1,.col-lg-10,.col-lg-11,.col-lg-12,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9,.col-md-1,.col-md-10,.col-md-11,.col-md-12,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9,.col-sm-1,.col-sm-10,.col-sm-11,.col-sm-12,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9,.col-xs-1,.col-xs-10,.col-xs-11,.col-xs-12,.col-xs-2,.col-xs-3,.col-xs-4,.col-xs-5,.col-xs-6,.col-xs-7,.col-xs-8,.col-xs-9{position:relative;min-height:1px;padding-right:15px;padding-left:15px}.col-xs-1,.col-xs-10,.col-xs-11,.col-xs-12,.col-xs-2,.col-xs-3,.col-xs-4,.col-xs-5,.col-xs-6,.col-xs-7,.col-xs-8,.col-xs-9{float:left}.col-xs-12{width:100%}.col-xs-11{width:91.66666667%}.col-xs-10{width:83.33333333%}.col-xs-9{width:75%}.col-xs-8{width:66.66666667%}.col-xs-7{width:58.33333333%}.col-xs-6{width:50%}.col-xs-5{width:41.66666667%}.col-xs-4{width:33.33333333%}.col-xs-3{width:25%}.col-xs-2{width:16.66666667%}.col-xs-1{width:8.33333333%}.col-xs-pull-12{right:100%}.col-xs-pull-11{right:91.66666667%}.col-xs-pull-10{right:83.33333333%}.col-xs-pull-9{right:75%}.col-xs-pull-8{right:66.66666667%}.col-xs-pull-7{right:58.33333333%}.col-xs-pull-6{right:50%}.col-xs-pull-5{right:41.66666667%}.col-xs-pull-4{right:33.33333333%}.col-xs-pull-3{right:25%}.col-xs-pull-2{right:16.66666667%}.col-xs-pull-1{right:8.33333333%}.col-xs-pull-0{right:auto}.col-xs-push-12{left:100%}.col-xs-push-11{left:91.66666667%}.col-xs-push-10{left:83.33333333%}.col-xs-push-9{left:75%}.col-xs-push-8{left:66.66666667%}.col-xs-push-7{left:58.33333333%}.col-xs-push-6{left:50%}.col-xs-push-5{left:41.66666667%}.col-xs-push-4{left:33.33333333%}.col-xs-push-3{left:25%}.col-xs-push-2{left:16.66666667%}.col-xs-push-1{left:8.33333333%}.col-xs-push-0{left:auto}.col-xs-offset-12{margin-left:100%}.col-xs-offset-11{margin-left:91.66666667%}.col-xs-offset-10{margin-left:83.33333333%}.col-xs-offset-9{margin-left:75%}.col-xs-offset-8{margin-left:66.66666667%}.col-xs-offset-7{margin-left:58.33333333%}.col-xs-offset-6{margin-left:50%}.col-xs-offset-5{margin-left:41.66666667%}.col-xs-offset-4{margin-left:33.33333333%}.col-xs-offset-3{margin-left:25%}.col-xs-offset-2{margin-left:16.66666667%}.col-xs-offset-1{margin-left:8.33333333%}.col-xs-offset-0{margin-left:0}@media (min-width:768px){.col-sm-1,.col-sm-10,.col-sm-11,.col-sm-12,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9{float:left}.col-sm-12{width:100%}.col-sm-11{width:91.66666667%}.col-sm-10{width:83.33333333%}.col-sm-9{width:75%}.col-sm-8{width:66.66666667%}.col-sm-7{width:58.33333333%}.col-sm-6{width:50%}.col-sm-5{width:41.66666667%}.col-sm-4{width:33.33333333%}.col-sm-3{width:25%}.col-sm-2{width:16.66666667%}.col-sm-1{width:8.33333333%}.col-sm-pull-12{right:100%}.col-sm-pull-11{right:91.66666667%}.col-sm-pull-10{right:83.33333333%}.col-sm-pull-9{right:75%}.col-sm-pull-8{right:66.66666667%}.col-sm-pull-7{right:58.33333333%}.col-sm-pull-6{right:50%}.col-sm-pull-5{right:41.66666667%}.col-sm-pull-4{right:33.33333333%}.col-sm-pull-3{right:25%}.col-sm-pull-2{right:16.66666667%}.col-sm-pull-1{right:8.33333333%}.col-sm-pull-0{right:auto}.col-sm-push-12{left:100%}.col-sm-push-11{left:91.66666667%}.col-sm-push-10{left:83.33333333%}.col-sm-push-9{left:75%}.col-sm-push-8{left:66.66666667%}.col-sm-push-7{left:58.33333333%}.col-sm-push-6{left:50%}.col-sm-push-5{left:41.66666667%}.col-sm-push-4{left:33.33333333%}.col-sm-push-3{left:25%}.col-sm-push-2{left:16.66666667%}.col-sm-push-1{left:8.33333333%}.col-sm-push-0{left:auto}.col-sm-offset-12{margin-left:100%}.col-sm-offset-11{margin-left:91.66666667%}.col-sm-offset-10{margin-left:83.33333333%}.col-sm-offset-9{margin-left:75%}.col-sm-offset-8{margin-left:66.66666667%}.col-sm-offset-7{margin-left:58.33333333%}.col-sm-offset-6{margin-left:50%}.col-sm-offset-5{margin-left:41.66666667%}.col-sm-offset-4{margin-left:33.33333333%}.col-sm-offset-3{margin-left:25%}.col-sm-offset-2{margin-left:16.66666667%}.col-sm-offset-1{margin-left:8.33333333%}.col-sm-offset-0{margin-left:0}}@media (min-width:992px){.col-md-1,.col-md-10,.col-md-11,.col-md-12,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9{float:left}.col-md-12{width:100%}.col-md-11{width:91.66666667%}.col-md-10{width:83.33333333%}.col-md-9{width:75%}.col-md-8{width:66.66666667%}.col-md-7{width:58.33333333%}.col-md-6{width:50%}.col-md-5{width:41.66666667%}.col-md-4{width:33.33333333%}.col-md-3{width:25%}.col-md-2{width:16.66666667%}.col-md-1{width:8.33333333%}.col-md-pull-12{right:100%}.col-md-pull-11{right:91.66666667%}.col-md-pull-10{right:83.33333333%}.col-md-pull-9{right:75%}.col-md-pull-8{right:66.66666667%}.col-md-pull-7{right:58.33333333%}.col-md-pull-6{right:50%}.col-md-pull-5{right:41.66666667%}.col-md-pull-4{right:33.33333333%}.col-md-pull-3{right:25%}.col-md-pull-2{right:16.66666667%}.col-md-pull-1{right:8.33333333%}.col-md-pull-0{right:auto}.col-md-push-12{left:100%}.col-md-push-11{left:91.66666667%}.col-md-push-10{left:83.33333333%}.col-md-push-9{left:75%}.col-md-push-8{left:66.66666667%}.col-md-push-7{left:58.33333333%}.col-md-push-6{left:50%}.col-md-push-5{left:41.66666667%}.col-md-push-4{left:33.33333333%}.col-md-push-3{left:25%}.col-md-push-2{left:16.66666667%}.col-md-push-1{left:8.33333333%}.col-md-push-0{left:auto}.col-md-offset-12{margin-left:100%}.col-md-offset-11{margin-left:91.66666667%}.col-md-offset-10{margin-left:83.33333333%}.col-md-offset-9{margin-left:75%}.col-md-offset-8{margin-left:66.66666667%}.col-md-offset-7{margin-left:58.33333333%}.col-md-offset-6{margin-left:50%}.col-md-offset-5{margin-left:41.66666667%}.col-md-offset-4{margin-left:33.33333333%}.col-md-offset-3{margin-left:25%}.col-md-offset-2{margin-left:16.66666667%}.col-md-offset-1{margin-left:8.33333333%}.col-md-offset-0{margin-left:0}}@media (min-width:1200px){.col-lg-1,.col-lg-10,.col-lg-11,.col-lg-12,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9{float:left}.col-lg-12{width:100%}.col-lg-11{width:91.66666667%}.col-lg-10{width:83.33333333%}.col-lg-9{width:75%}.col-lg-8{width:66.66666667%}.col-lg-7{width:58.33333333%}.col-lg-6{width:50%}.col-lg-5{width:41.66666667%}.col-lg-4{width:33.33333333%}.col-lg-3{width:25%}.col-lg-2{width:16.66666667%}.col-lg-1{width:8.33333333%}.col-lg-pull-12{right:100%}.col-lg-pull-11{right:91.66666667%}.col-lg-pull-10{right:83.33333333%}.col-lg-pull-9{right:75%}.col-lg-pull-8{right:66.66666667%}.col-lg-pull-7{right:58.33333333%}.col-lg-pull-6{right:50%}.col-lg-pull-5{right:41.66666667%}.col-lg-pull-4{right:33.33333333%}.col-lg-pull-3{right:25%}.col-lg-pull-2{right:16.66666667%}.col-lg-pull-1{right:8.33333333%}.col-lg-pull-0{right:auto}.col-lg-push-12{left:100%}.col-lg-push-11{left:91.66666667%}.col-lg-push-10{left:83.33333333%}.col-lg-push-9{left:75%}.col-lg-push-8{left:66.66666667%}.col-lg-push-7{left:58.33333333%}.col-lg-push-6{left:50%}.col-lg-push-5{left:41.66666667%}.col-lg-push-4{left:33.33333333%}.col-lg-push-3{left:25%}.col-lg-push-2{left:16.66666667%}.col-lg-push-1{left:8.33333333%}.col-lg-push-0{left:auto}.col-lg-offset-12{margin-left:100%}.col-lg-offset-11{margin-left:91.66666667%}.col-lg-offset-10{margin-left:83.33333333%}.col-lg-offset-9{margin-left:75%}.col-lg-offset-8{margin-left:66.66666667%}.col-lg-offset-7{margin-left:58.33333333%}.col-lg-offset-6{margin-left:50%}.col-lg-offset-5{margin-left:41.66666667%}.col-lg-offset-4{margin-left:33.33333333%}.col-lg-offset-3{margin-left:25%}.col-lg-offset-2{margin-left:16.66666667%}.col-lg-offset-1{margin-left:8.33333333%}.col-lg-offset-0{margin-left:0}}table{background-color:transparent}caption{padding-top:8px;padding-bottom:8px;color:#777;text-align:left}th{text-align:left}.table{width:100%;max-width:100%;margin-bottom:20px}.table>tbody>tr>td,.table>tbody>tr>th,.table>tfoot>tr>td,.table>tfoot>tr>th,.table>thead>tr>td,.table>thead>tr>th{padding:8px;line-height:1.42857143;vertical-align:top;border-top:1px solid #ddd}.table>thead>tr>th{vertical-align:bottom;border-bottom:2px solid #ddd}.table>caption+thead>tr:first-child>td,.table>caption+thead>tr:first-child>th,.table>colgroup+thead>tr:first-child>td,.table>colgroup+thead>tr:first-child>th,.table>thead:first-child>tr:first-child>td,.table>thead:first-child>tr:first-child>th{border-top:0}.table>tbody+tbody{border-top:2px solid #ddd}.table .table{background-color:#fff}.table-condensed>tbody>tr>td,.table-condensed>tbody>tr>th,.table-condensed>tfoot>tr>td,.table-condensed>tfoot>tr>th,.table-condensed>thead>tr>td,.table-condensed>thead>tr>th{padding:5px}.table-bordered{border:1px solid #ddd}.table-bordered>tbody>tr>td,.table-bordered>tbody>tr>th,.table-bordered>tfoot>tr>td,.table-bordered>tfoot>tr>th,.table-bordered>thead>tr>td,.table-bordered>thead>tr>th{border:1px solid #ddd}.table-bordered>thead>tr>td,.table-bordered>thead>tr>th{border-bottom-width:2px}.table-striped>tbody>tr:nth-of-type(odd){background-color:#f9f9f9}.table-hover>tbody>tr:hover{background-color:#f5f5f5}table col[class*=col-]{position:static;display:table-column;float:none}table td[class*=col-],table th[class*=col-]{position:static;display:table-cell;float:none}.table>tbody>tr.active>td,.table>tbody>tr.active>th,.table>tbody>tr>td.active,.table>tbody>tr>th.active,.table>tfoot>tr.active>td,.table>tfoot>tr.active>th,.table>tfoot>tr>td.active,.table>tfoot>tr>th.active,.table>thead>tr.active>td,.table>thead>tr.active>th,.table>thead>tr>td.active,.table>thead>tr>th.active{background-color:#f5f5f5}.table-hover>tbody>tr.active:hover>td,.table-hover>tbody>tr.active:hover>th,.table-hover>tbody>tr:hover>.active,.table-hover>tbody>tr>td.active:hover,.table-hover>tbody>tr>th.active:hover{background-color:#e8e8e8}.table>tbody>tr.success>td,.table>tbody>tr.success>th,.table>tbody>tr>td.success,.table>tbody>tr>th.success,.table>tfoot>tr.success>td,.table>tfoot>tr.success>th,.table>tfoot>tr>td.success,.table>tfoot>tr>th.success,.table>thead>tr.success>td,.table>thead>tr.success>th,.table>thead>tr>td.success,.table>thead>tr>th.success{background-color:#dff0d8}.table-hover>tbody>tr.success:hover>td,.table-hover>tbody>tr.success:hover>th,.table-hover>tbody>tr:hover>.success,.table-hover>tbody>tr>td.success:hover,.table-hover>tbody>tr>th.success:hover{background-color:#d0e9c6}.table>tbody>tr.info>td,.table>tbody>tr.info>th,.table>tbody>tr>td.info,.table>tbody>tr>th.info,.table>tfoot>tr.info>td,.table>tfoot>tr.info>th,.table>tfoot>tr>td.info,.table>tfoot>tr>th.info,.table>thead>tr.info>td,.table>thead>tr.info>th,.table>thead>tr>td.info,.table>thead>tr>th.info{background-color:#d9edf7}.table-hover>tbody>tr.info:hover>td,.table-hover>tbody>tr.info:hover>th,.table-hover>tbody>tr:hover>.info,.table-hover>tbody>tr>td.info:hover,.table-hover>tbody>tr>th.info:hover{background-color:#c4e3f3}.table>tbody>tr.warning>td,.table>tbody>tr.warning>th,.table>tbody>tr>td.warning,.table>tbody>tr>th.warning,.table>tfoot>tr.warning>td,.table>tfoot>tr.warning>th,.table>tfoot>tr>td.warning,.table>tfoot>tr>th.warning,.table>thead>tr.warning>td,.table>thead>tr.warning>th,.table>thead>tr>td.warning,.table>thead>tr>th.warning{background-color:#fcf8e3}.table-hover>tbody>tr.warning:hover>td,.table-hover>tbody>tr.warning:hover>th,.table-hover>tbody>tr:hover>.warning,.table-hover>tbody>tr>td.warning:hover,.table-hover>tbody>tr>th.warning:hover{background-color:#faf2cc}.table>tbody>tr.danger>td,.table>tbody>tr.danger>th,.table>tbody>tr>td.danger,.table>tbody>tr>th.danger,.table>tfoot>tr.danger>td,.table>tfoot>tr.danger>th,.table>tfoot>tr>td.danger,.table>tfoot>tr>th.danger,.table>thead>tr.danger>td,.table>thead>tr.danger>th,.table>thead>tr>td.danger,.table>thead>tr>th.danger{background-color:#f2dede}.table-hover>tbody>tr.danger:hover>td,.table-hover>tbody>tr.danger:hover>th,.table-hover>tbody>tr:hover>.danger,.table-hover>tbody>tr>td.danger:hover,.table-hover>tbody>tr>th.danger:hover{background-color:#ebcccc}.table-responsive{min-height:.01%;overflow-x:auto}@media screen and (max-width:767px){.table-responsive{width:100%;margin-bottom:15px;overflow-y:hidden;-ms-overflow-style:-ms-autohiding-scrollbar;border:1px solid #ddd}.table-responsive>.table{margin-bottom:0}.table-responsive>.table>tbody>tr>td,.table-responsive>.table>tbody>tr>th,.table-responsive>.table>tfoot>tr>td,.table-responsive>.table>tfoot>tr>th,.table-responsive>.table>thead>tr>td,.table-responsive>.table>thead>tr>th{white-space:nowrap}.table-responsive>.table-bordered{border:0}.table-responsive>.table-bordered>tbody>tr>td:first-child,.table-responsive>.table-bordered>tbody>tr>th:first-child,.table-responsive>.table-bordered>tfoot>tr>td:first-child,.table-responsive>.table-bordered>tfoot>tr>th:first-child,.table-responsive>.table-bordered>thead>tr>td:first-child,.table-responsive>.table-bordered>thead>tr>th:first-child{border-left:0}.table-responsive>.table-bordered>tbody>tr>td:last-child,.table-responsive>.table-bordered>tbody>tr>th:last-child,.table-responsive>.table-bordered>tfoot>tr>td:last-child,.table-responsive>.table-bordered>tfoot>tr>th:last-child,.table-responsive>.table-bordered>thead>tr>td:last-child,.table-responsive>.table-bordered>thead>tr>th:last-child{border-right:0}.table-responsive>.table-bordered>tbody>tr:last-child>td,.table-responsive>.table-bordered>tbody>tr:last-child>th,.table-responsive>.table-bordered>tfoot>tr:last-child>td,.table-responsive>.table-bordered>tfoot>tr:last-child>th{border-bottom:0}}fieldset{min-width:0;padding:0;margin:0;border:0}legend{display:block;width:100%;padding:0;margin-bottom:20px;font-size:21px;line-height:inherit;color:#333;border:0;border-bottom:1px solid #e5e5e5}label{display:inline-block;max-width:100%;margin-bottom:5px;font-weight:700}input[type=search]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}input[type=checkbox],input[type=radio]{margin:4px 0 0;margin-top:1px\9;line-height:normal}input[type=file]{display:block}input[type=range]{display:block;width:100%}select[multiple],select[size]{height:auto}input[type=file]:focus,input[type=checkbox]:focus,input[type=radio]:focus{outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}output{display:block;padding-top:7px;font-size:14px;line-height:1.42857143;color:#555}.form-control{display:block;width:100%;height:34px;padding:6px 12px;font-size:14px;line-height:1.42857143;color:#555;background-color:#fff;background-image:none;border:1px solid #ccc;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075);-webkit-transition:border-color ease-in-out .15s,-webkit-box-shadow ease-in-out .15s;-o-transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s;transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s}.form-control:focus{border-color:#66afe9;outline:0;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(102,175,233,.6);box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(102,175,233,.6)}.form-control::-moz-placeholder{color:#999;opacity:1}.form-control:-ms-input-placeholder{color:#999}.form-control::-webkit-input-placeholder{color:#999}.form-control::-ms-expand{background-color:transparent;border:0}.form-control[disabled],.form-control[readonly],fieldset[disabled] .form-control{background-color:#eee;opacity:1}.form-control[disabled],fieldset[disabled] .form-control{cursor:not-allowed}textarea.form-control{height:auto}input[type=search]{-webkit-appearance:none}@media screen and (-webkit-min-device-pixel-ratio:0){input[type=date].form-control,input[type=time].form-control,input[type=datetime-local].form-control,input[type=month].form-control{line-height:34px}.input-group-sm input[type=date],.input-group-sm input[type=time],.input-group-sm input[type=datetime-local],.input-group-sm input[type=month],input[type=date].input-sm,input[type=time].input-sm,input[type=datetime-local].input-sm,input[type=month].input-sm{line-height:30px}.input-group-lg input[type=date],.input-group-lg input[type=time],.input-group-lg input[type=datetime-local],.input-group-lg input[type=month],input[type=date].input-lg,input[type=time].input-lg,input[type=datetime-local].input-lg,input[type=month].input-lg{line-height:46px}}.form-group{margin-bottom:15px}.checkbox,.radio{position:relative;display:block;margin-top:10px;margin-bottom:10px}.checkbox label,.radio label{min-height:20px;padding-left:20px;margin-bottom:0;font-weight:400;cursor:pointer}.checkbox input[type=checkbox],.checkbox-inline input[type=checkbox],.radio input[type=radio],.radio-inline input[type=radio]{position:absolute;margin-top:4px\9;margin-left:-20px}.checkbox+.checkbox,.radio+.radio{margin-top:-5px}.checkbox-inline,.radio-inline{position:relative;display:inline-block;padding-left:20px;margin-bottom:0;font-weight:400;vertical-align:middle;cursor:pointer}.checkbox-inline+.checkbox-inline,.radio-inline+.radio-inline{margin-top:0;margin-left:10px}fieldset[disabled] input[type=checkbox],fieldset[disabled] input[type=radio],input[type=checkbox].disabled,input[type=checkbox][disabled],input[type=radio].disabled,input[type=radio][disabled]{cursor:not-allowed}.checkbox-inline.disabled,.radio-inline.disabled,fieldset[disabled] .checkbox-inline,fieldset[disabled] .radio-inline{cursor:not-allowed}.checkbox.disabled label,.radio.disabled label,fieldset[disabled] .checkbox label,fieldset[disabled] .radio label{cursor:not-allowed}.form-control-static{min-height:34px;padding-top:7px;padding-bottom:7px;margin-bottom:0}.form-control-static.input-lg,.form-control-static.input-sm{padding-right:0;padding-left:0}.input-sm{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}select.input-sm{height:30px;line-height:30px}select[multiple].input-sm,textarea.input-sm{height:auto}.form-group-sm .form-control{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}.form-group-sm select.form-control{height:30px;line-height:30px}.form-group-sm select[multiple].form-control,.form-group-sm textarea.form-control{height:auto}.form-group-sm .form-control-static{height:30px;min-height:32px;padding:6px 10px;font-size:12px;line-height:1.5}.input-lg{height:46px;padding:10px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}select.input-lg{height:46px;line-height:46px}select[multiple].input-lg,textarea.input-lg{height:auto}.form-group-lg .form-control{height:46px;padding:10px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}.form-group-lg select.form-control{height:46px;line-height:46px}.form-group-lg select[multiple].form-control,.form-group-lg textarea.form-control{height:auto}.form-group-lg .form-control-static{height:46px;min-height:38px;padding:11px 16px;font-size:18px;line-height:1.3333333}.has-feedback{position:relative}.has-feedback .form-control{padding-right:42.5px}.form-control-feedback{position:absolute;top:0;right:0;z-index:2;display:block;width:34px;height:34px;line-height:34px;text-align:center;pointer-events:none}.form-group-lg .form-control+.form-control-feedback,.input-group-lg+.form-control-feedback,.input-lg+.form-control-feedback{width:46px;height:46px;line-height:46px}.form-group-sm .form-control+.form-control-feedback,.input-group-sm+.form-control-feedback,.input-sm+.form-control-feedback{width:30px;height:30px;line-height:30px}.has-success .checkbox,.has-success .checkbox-inline,.has-success .control-label,.has-success .help-block,.has-success .radio,.has-success .radio-inline,.has-success.checkbox label,.has-success.checkbox-inline label,.has-success.radio label,.has-success.radio-inline label{color:#3c763d}.has-success .form-control{border-color:#3c763d;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-success .form-control:focus{border-color:#2b542c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #67b168;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #67b168}.has-success .input-group-addon{color:#3c763d;background-color:#dff0d8;border-color:#3c763d}.has-success .form-control-feedback{color:#3c763d}.has-warning .checkbox,.has-warning .checkbox-inline,.has-warning .control-label,.has-warning .help-block,.has-warning .radio,.has-warning .radio-inline,.has-warning.checkbox label,.has-warning.checkbox-inline label,.has-warning.radio label,.has-warning.radio-inline label{color:#8a6d3b}.has-warning .form-control{border-color:#8a6d3b;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-warning .form-control:focus{border-color:#66512c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #c0a16b;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #c0a16b}.has-warning .input-group-addon{color:#8a6d3b;background-color:#fcf8e3;border-color:#8a6d3b}.has-warning .form-control-feedback{color:#8a6d3b}.has-error .checkbox,.has-error .checkbox-inline,.has-error .control-label,.has-error .help-block,.has-error .radio,.has-error .radio-inline,.has-error.checkbox label,.has-error.checkbox-inline label,.has-error.radio label,.has-error.radio-inline label{color:#a94442}.has-error .form-control{border-color:#a94442;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-error .form-control:focus{border-color:#843534;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #ce8483;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #ce8483}.has-error .input-group-addon{color:#a94442;background-color:#f2dede;border-color:#a94442}.has-error .form-control-feedback{color:#a94442}.has-feedback label~.form-control-feedback{top:25px}.has-feedback label.sr-only~.form-control-feedback{top:0}.help-block{display:block;margin-top:5px;margin-bottom:10px;color:#737373}@media (min-width:768px){.form-inline .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.form-inline .form-control{display:inline-block;width:auto;vertical-align:middle}.form-inline .form-control-static{display:inline-block}.form-inline .input-group{display:inline-table;vertical-align:middle}.form-inline .input-group .form-control,.form-inline .input-group .input-group-addon,.form-inline .input-group .input-group-btn{width:auto}.form-inline .input-group>.form-control{width:100%}.form-inline .control-label{margin-bottom:0;vertical-align:middle}.form-inline .checkbox,.form-inline .radio{display:inline-block;margin-top:0;margin-bottom:0;vertical-align:middle}.form-inline .checkbox label,.form-inline .radio label{padding-left:0}.form-inline .checkbox input[type=checkbox],.form-inline .radio input[type=radio]{position:relative;margin-left:0}.form-inline .has-feedback .form-control-feedback{top:0}}.form-horizontal .checkbox,.form-horizontal .checkbox-inline,.form-horizontal .radio,.form-horizontal .radio-inline{padding-top:7px;margin-top:0;margin-bottom:0}.form-horizontal .checkbox,.form-horizontal .radio{min-height:27px}.form-horizontal .form-group{margin-right:-15px;margin-left:-15px}@media (min-width:768px){.form-horizontal .control-label{padding-top:7px;margin-bottom:0;text-align:right}}.form-horizontal .has-feedback .form-control-feedback{right:15px}@media (min-width:768px){.form-horizontal .form-group-lg .control-label{padding-top:11px;font-size:18px}}@media (min-width:768px){.form-horizontal .form-group-sm .control-label{padding-top:6px;font-size:12px}}.btn{display:inline-block;padding:6px 12px;margin-bottom:0;font-size:14px;font-weight:400;line-height:1.42857143;text-align:center;white-space:nowrap;vertical-align:middle;-ms-touch-action:manipulation;touch-action:manipulation;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;background-image:none;border:1px solid transparent;border-radius:4px}.btn.active.focus,.btn.active:focus,.btn.focus,.btn:active.focus,.btn:active:focus,.btn:focus{outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}.btn.focus,.btn:focus,.btn:hover{color:#333;text-decoration:none}.btn.active,.btn:active{background-image:none;outline:0;-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,.125);box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}.btn.disabled,.btn[disabled],fieldset[disabled] .btn{cursor:not-allowed;filter:alpha(opacity=65);-webkit-box-shadow:none;box-shadow:none;opacity:.65}a.btn.disabled,fieldset[disabled] a.btn{pointer-events:none}.btn-default{color:#333;background-color:#fff;border-color:#ccc}.btn-default.focus,.btn-default:focus{color:#333;background-color:#e6e6e6;border-color:#8c8c8c}.btn-default:hover{color:#333;background-color:#e6e6e6;border-color:#adadad}.btn-default.active,.btn-default:active,.open>.dropdown-toggle.btn-default{color:#333;background-color:#e6e6e6;border-color:#adadad}.btn-default.active.focus,.btn-default.active:focus,.btn-default.active:hover,.btn-default:active.focus,.btn-default:active:focus,.btn-default:active:hover,.open>.dropdown-toggle.btn-default.focus,.open>.dropdown-toggle.btn-default:focus,.open>.dropdown-toggle.btn-default:hover{color:#333;background-color:#d4d4d4;border-color:#8c8c8c}.btn-default.active,.btn-default:active,.open>.dropdown-toggle.btn-default{background-image:none}.btn-default.disabled.focus,.btn-default.disabled:focus,.btn-default.disabled:hover,.btn-default[disabled].focus,.btn-default[disabled]:focus,.btn-default[disabled]:hover,fieldset[disabled] .btn-default.focus,fieldset[disabled] .btn-default:focus,fieldset[disabled] .btn-default:hover{background-color:#fff;border-color:#ccc}.btn-default .badge{color:#fff;background-color:#333}.btn-primary{color:#fff;background-color:#337ab7;border-color:#2e6da4}.btn-primary.focus,.btn-primary:focus{color:#fff;background-color:#286090;border-color:#122b40}.btn-primary:hover{color:#fff;background-color:#286090;border-color:#204d74}.btn-primary.active,.btn-primary:active,.open>.dropdown-toggle.btn-primary{color:#fff;background-color:#286090;border-color:#204d74}.btn-primary.active.focus,.btn-primary.active:focus,.btn-primary.active:hover,.btn-primary:active.focus,.btn-primary:active:focus,.btn-primary:active:hover,.open>.dropdown-toggle.btn-primary.focus,.open>.dropdown-toggle.btn-primary:focus,.open>.dropdown-toggle.btn-primary:hover{color:#fff;background-color:#204d74;border-color:#122b40}.btn-primary.active,.btn-primary:active,.open>.dropdown-toggle.btn-primary{background-image:none}.btn-primary.disabled.focus,.btn-primary.disabled:focus,.btn-primary.disabled:hover,.btn-primary[disabled].focus,.btn-primary[disabled]:focus,.btn-primary[disabled]:hover,fieldset[disabled] .btn-primary.focus,fieldset[disabled] .btn-primary:focus,fieldset[disabled] .btn-primary:hover{background-color:#337ab7;border-color:#2e6da4}.btn-primary .badge{color:#337ab7;background-color:#fff}.btn-success{color:#fff;background-color:#5cb85c;border-color:#4cae4c}.btn-success.focus,.btn-success:focus{color:#fff;background-color:#449d44;border-color:#255625}.btn-success:hover{color:#fff;background-color:#449d44;border-color:#398439}.btn-success.active,.btn-success:active,.open>.dropdown-toggle.btn-success{color:#fff;background-color:#449d44;border-color:#398439}.btn-success.active.focus,.btn-success.active:focus,.btn-success.active:hover,.btn-success:active.focus,.btn-success:active:focus,.btn-success:active:hover,.open>.dropdown-toggle.btn-success.focus,.open>.dropdown-toggle.btn-success:focus,.open>.dropdown-toggle.btn-success:hover{color:#fff;background-color:#398439;border-color:#255625}.btn-success.active,.btn-success:active,.open>.dropdown-toggle.btn-success{background-image:none}.btn-success.disabled.focus,.btn-success.disabled:focus,.btn-success.disabled:hover,.btn-success[disabled].focus,.btn-success[disabled]:focus,.btn-success[disabled]:hover,fieldset[disabled] .btn-success.focus,fieldset[disabled] .btn-success:focus,fieldset[disabled] .btn-success:hover{background-color:#5cb85c;border-color:#4cae4c}.btn-success .badge{color:#5cb85c;background-color:#fff}.btn-info{color:#fff;background-color:#5bc0de;border-color:#46b8da}.btn-info.focus,.btn-info:focus{color:#fff;background-color:#31b0d5;border-color:#1b6d85}.btn-info:hover{color:#fff;background-color:#31b0d5;border-color:#269abc}.btn-info.active,.btn-info:active,.open>.dropdown-toggle.btn-info{color:#fff;background-color:#31b0d5;border-color:#269abc}.btn-info.active.focus,.btn-info.active:focus,.btn-info.active:hover,.btn-info:active.focus,.btn-info:active:focus,.btn-info:active:hover,.open>.dropdown-toggle.btn-info.focus,.open>.dropdown-toggle.btn-info:focus,.open>.dropdown-toggle.btn-info:hover{color:#fff;background-color:#269abc;border-color:#1b6d85}.btn-info.active,.btn-info:active,.open>.dropdown-toggle.btn-info{background-image:none}.btn-info.disabled.focus,.btn-info.disabled:focus,.btn-info.disabled:hover,.btn-info[disabled].focus,.btn-info[disabled]:focus,.btn-info[disabled]:hover,fieldset[disabled] .btn-info.focus,fieldset[disabled] .btn-info:focus,fieldset[disabled] .btn-info:hover{background-color:#5bc0de;border-color:#46b8da}.btn-info .badge{color:#5bc0de;background-color:#fff}.btn-warning{color:#fff;background-color:#f0ad4e;border-color:#eea236}.btn-warning.focus,.btn-warning:focus{color:#fff;background-color:#ec971f;border-color:#985f0d}.btn-warning:hover{color:#fff;background-color:#ec971f;border-color:#d58512}.btn-warning.active,.btn-warning:active,.open>.dropdown-toggle.btn-warning{color:#fff;background-color:#ec971f;border-color:#d58512}.btn-warning.active.focus,.btn-warning.active:focus,.btn-warning.active:hover,.btn-warning:active.focus,.btn-warning:active:focus,.btn-warning:active:hover,.open>.dropdown-toggle.btn-warning.focus,.open>.dropdown-toggle.btn-warning:focus,.open>.dropdown-toggle.btn-warning:hover{color:#fff;background-color:#d58512;border-color:#985f0d}.btn-warning.active,.btn-warning:active,.open>.dropdown-toggle.btn-warning{background-image:none}.btn-warning.disabled.focus,.btn-warning.disabled:focus,.btn-warning.disabled:hover,.btn-warning[disabled].focus,.btn-warning[disabled]:focus,.btn-warning[disabled]:hover,fieldset[disabled] .btn-warning.focus,fieldset[disabled] .btn-warning:focus,fieldset[disabled] .btn-warning:hover{background-color:#f0ad4e;border-color:#eea236}.btn-warning .badge{color:#f0ad4e;background-color:#fff}.btn-danger{color:#fff;background-color:#d9534f;border-color:#d43f3a}.btn-danger.focus,.btn-danger:focus{color:#fff;background-color:#c9302c;border-color:#761c19}.btn-danger:hover{color:#fff;background-color:#c9302c;border-color:#ac2925}.btn-danger.active,.btn-danger:active,.open>.dropdown-toggle.btn-danger{color:#fff;background-color:#c9302c;border-color:#ac2925}.btn-danger.active.focus,.btn-danger.active:focus,.btn-danger.active:hover,.btn-danger:active.focus,.btn-danger:active:focus,.btn-danger:active:hover,.open>.dropdown-toggle.btn-danger.focus,.open>.dropdown-toggle.btn-danger:focus,.open>.dropdown-toggle.btn-danger:hover{color:#fff;background-color:#ac2925;border-color:#761c19}.btn-danger.active,.btn-danger:active,.open>.dropdown-toggle.btn-danger{background-image:none}.btn-danger.disabled.focus,.btn-danger.disabled:focus,.btn-danger.disabled:hover,.btn-danger[disabled].focus,.btn-danger[disabled]:focus,.btn-danger[disabled]:hover,fieldset[disabled] .btn-danger.focus,fieldset[disabled] .btn-danger:focus,fieldset[disabled] .btn-danger:hover{background-color:#d9534f;border-color:#d43f3a}.btn-danger .badge{color:#d9534f;background-color:#fff}.btn-link{font-weight:400;color:#337ab7;border-radius:0}.btn-link,.btn-link.active,.btn-link:active,.btn-link[disabled],fieldset[disabled] .btn-link{background-color:transparent;-webkit-box-shadow:none;box-shadow:none}.btn-link,.btn-link:active,.btn-link:focus,.btn-link:hover{border-color:transparent}.btn-link:focus,.btn-link:hover{color:#23527c;text-decoration:underline;background-color:transparent}.btn-link[disabled]:focus,.btn-link[disabled]:hover,fieldset[disabled] .btn-link:focus,fieldset[disabled] .btn-link:hover{color:#777;text-decoration:none}.btn-group-lg>.btn,.btn-lg{padding:10px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}.btn-group-sm>.btn,.btn-sm{padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}.btn-group-xs>.btn,.btn-xs{padding:1px 5px;font-size:12px;line-height:1.5;border-radius:3px}.btn-block{display:block;width:100%}.btn-block+.btn-block{margin-top:5px}input[type=button].btn-block,input[type=reset].btn-block,input[type=submit].btn-block{width:100%}.fade{opacity:0;-webkit-transition:opacity .15s linear;-o-transition:opacity .15s linear;transition:opacity .15s linear}.fade.in{opacity:1}.collapse{display:none}.collapse.in{display:block}tr.collapse.in{display:table-row}tbody.collapse.in{display:table-row-group}.collapsing{position:relative;height:0;overflow:hidden;-webkit-transition-timing-function:ease;-o-transition-timing-function:ease;transition-timing-function:ease;-webkit-transition-duration:.35s;-o-transition-duration:.35s;transition-duration:.35s;-webkit-transition-property:height,visibility;-o-transition-property:height,visibility;transition-property:height,visibility}.caret{display:inline-block;width:0;height:0;margin-left:2px;vertical-align:middle;border-top:4px dashed;border-top:4px solid\9;border-right:4px solid transparent;border-left:4px solid transparent}.dropdown,.dropup{position:relative}.dropdown-toggle:focus{outline:0}.dropdown-menu{position:absolute;top:100%;left:0;z-index:1000;display:none;float:left;min-width:160px;padding:5px 0;margin:2px 0 0;font-size:14px;text-align:left;list-style:none;background-color:#fff;-webkit-background-clip:padding-box;background-clip:padding-box;border:1px solid #ccc;border:1px solid rgba(0,0,0,.15);border-radius:4px;-webkit-box-shadow:0 6px 12px rgba(0,0,0,.175);box-shadow:0 6px 12px rgba(0,0,0,.175)}.dropdown-menu.pull-right{right:0;left:auto}.dropdown-menu .divider{height:1px;margin:9px 0;overflow:hidden;background-color:#e5e5e5}.dropdown-menu>li>a{display:block;padding:3px 20px;clear:both;font-weight:400;line-height:1.42857143;color:#333;white-space:nowrap}.dropdown-menu>li>a:focus,.dropdown-menu>li>a:hover{color:#262626;text-decoration:none;background-color:#f5f5f5}.dropdown-menu>.active>a,.dropdown-menu>.active>a:focus,.dropdown-menu>.active>a:hover{color:#fff;text-decoration:none;background-color:#337ab7;outline:0}.dropdown-menu>.disabled>a,.dropdown-menu>.disabled>a:focus,.dropdown-menu>.disabled>a:hover{color:#777}.dropdown-menu>.disabled>a:focus,.dropdown-menu>.disabled>a:hover{text-decoration:none;cursor:not-allowed;background-color:transparent;background-image:none;filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.open>.dropdown-menu{display:block}.open>a{outline:0}.dropdown-menu-right{right:0;left:auto}.dropdown-menu-left{right:auto;left:0}.dropdown-header{display:block;padding:3px 20px;font-size:12px;line-height:1.42857143;color:#777;white-space:nowrap}.dropdown-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:990}.pull-right>.dropdown-menu{right:0;left:auto}.dropup .caret,.navbar-fixed-bottom .dropdown .caret{content:"";border-top:0;border-bottom:4px dashed;border-bottom:4px solid\9}.dropup .dropdown-menu,.navbar-fixed-bottom .dropdown .dropdown-menu{top:auto;bottom:100%;margin-bottom:2px}@media (min-width:768px){.navbar-right .dropdown-menu{right:0;left:auto}.navbar-right .dropdown-menu-left{right:auto;left:0}}.btn-group,.btn-group-vertical{position:relative;display:inline-block;vertical-align:middle}.btn-group-vertical>.btn,.btn-group>.btn{position:relative;float:left}.btn-group-vertical>.btn.active,.btn-group-vertical>.btn:active,.btn-group-vertical>.btn:focus,.btn-group-vertical>.btn:hover,.btn-group>.btn.active,.btn-group>.btn:active,.btn-group>.btn:focus,.btn-group>.btn:hover{z-index:2}.btn-group .btn+.btn,.btn-group .btn+.btn-group,.btn-group .btn-group+.btn,.btn-group .btn-group+.btn-group{margin-left:-1px}.btn-toolbar{margin-left:-5px}.btn-toolbar .btn,.btn-toolbar .btn-group,.btn-toolbar .input-group{float:left}.btn-toolbar>.btn,.btn-toolbar>.btn-group,.btn-toolbar>.input-group{margin-left:5px}.btn-group>.btn:not(:first-child):not(:last-child):not(.dropdown-toggle){border-radius:0}.btn-group>.btn:first-child{margin-left:0}.btn-group>.btn:first-child:not(:last-child):not(.dropdown-toggle){border-top-right-radius:0;border-bottom-right-radius:0}.btn-group>.btn:last-child:not(:first-child),.btn-group>.dropdown-toggle:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0}.btn-group>.btn-group{float:left}.btn-group>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}.btn-group>.btn-group:first-child:not(:last-child)>.btn:last-child,.btn-group>.btn-group:first-child:not(:last-child)>.dropdown-toggle{border-top-right-radius:0;border-bottom-right-radius:0}.btn-group>.btn-group:last-child:not(:first-child)>.btn:first-child{border-top-left-radius:0;border-bottom-left-radius:0}.btn-group .dropdown-toggle:active,.btn-group.open .dropdown-toggle{outline:0}.btn-group>.btn+.dropdown-toggle{padding-right:8px;padding-left:8px}.btn-group>.btn-lg+.dropdown-toggle{padding-right:12px;padding-left:12px}.btn-group.open .dropdown-toggle{-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,.125);box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}.btn-group.open .dropdown-toggle.btn-link{-webkit-box-shadow:none;box-shadow:none}.btn .caret{margin-left:0}.btn-lg .caret{border-width:5px 5px 0;border-bottom-width:0}.dropup .btn-lg .caret{border-width:0 5px 5px}.btn-group-vertical>.btn,.btn-group-vertical>.btn-group,.btn-group-vertical>.btn-group>.btn{display:block;float:none;width:100%;max-width:100%}.btn-group-vertical>.btn-group>.btn{float:none}.btn-group-vertical>.btn+.btn,.btn-group-vertical>.btn+.btn-group,.btn-group-vertical>.btn-group+.btn,.btn-group-vertical>.btn-group+.btn-group{margin-top:-1px;margin-left:0}.btn-group-vertical>.btn:not(:first-child):not(:last-child){border-radius:0}.btn-group-vertical>.btn:first-child:not(:last-child){border-top-left-radius:4px;border-top-right-radius:4px;border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn:last-child:not(:first-child){border-top-left-radius:0;border-top-right-radius:0;border-bottom-right-radius:4px;border-bottom-left-radius:4px}.btn-group-vertical>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}.btn-group-vertical>.btn-group:first-child:not(:last-child)>.btn:last-child,.btn-group-vertical>.btn-group:first-child:not(:last-child)>.dropdown-toggle{border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn-group:last-child:not(:first-child)>.btn:first-child{border-top-left-radius:0;border-top-right-radius:0}.btn-group-justified{display:table;width:100%;table-layout:fixed;border-collapse:separate}.btn-group-justified>.btn,.btn-group-justified>.btn-group{display:table-cell;float:none;width:1%}.btn-group-justified>.btn-group .btn{width:100%}.btn-group-justified>.btn-group .dropdown-menu{left:auto}[data-toggle=buttons]>.btn input[type=checkbox],[data-toggle=buttons]>.btn input[type=radio],[data-toggle=buttons]>.btn-group>.btn input[type=checkbox],[data-toggle=buttons]>.btn-group>.btn input[type=radio]{position:absolute;clip:rect(0,0,0,0);pointer-events:none}.input-group{position:relative;display:table;border-collapse:separate}.input-group[class*=col-]{float:none;padding-right:0;padding-left:0}.input-group .form-control{position:relative;z-index:2;float:left;width:100%;margin-bottom:0}.input-group .form-control:focus{z-index:3}.input-group-lg>.form-control,.input-group-lg>.input-group-addon,.input-group-lg>.input-group-btn>.btn{height:46px;padding:10px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}select.input-group-lg>.form-control,select.input-group-lg>.input-group-addon,select.input-group-lg>.input-group-btn>.btn{height:46px;line-height:46px}select[multiple].input-group-lg>.form-control,select[multiple].input-group-lg>.input-group-addon,select[multiple].input-group-lg>.input-group-btn>.btn,textarea.input-group-lg>.form-control,textarea.input-group-lg>.input-group-addon,textarea.input-group-lg>.input-group-btn>.btn{height:auto}.input-group-sm>.form-control,.input-group-sm>.input-group-addon,.input-group-sm>.input-group-btn>.btn{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}select.input-group-sm>.form-control,select.input-group-sm>.input-group-addon,select.input-group-sm>.input-group-btn>.btn{height:30px;line-height:30px}select[multiple].input-group-sm>.form-control,select[multiple].input-group-sm>.input-group-addon,select[multiple].input-group-sm>.input-group-btn>.btn,textarea.input-group-sm>.form-control,textarea.input-group-sm>.input-group-addon,textarea.input-group-sm>.input-group-btn>.btn{height:auto}.input-group .form-control,.input-group-addon,.input-group-btn{display:table-cell}.input-group .form-control:not(:first-child):not(:last-child),.input-group-addon:not(:first-child):not(:last-child),.input-group-btn:not(:first-child):not(:last-child){border-radius:0}.input-group-addon,.input-group-btn{width:1%;white-space:nowrap;vertical-align:middle}.input-group-addon{padding:6px 12px;font-size:14px;font-weight:400;line-height:1;color:#555;text-align:center;background-color:#eee;border:1px solid #ccc;border-radius:4px}.input-group-addon.input-sm{padding:5px 10px;font-size:12px;border-radius:3px}.input-group-addon.input-lg{padding:10px 16px;font-size:18px;border-radius:6px}.input-group-addon input[type=checkbox],.input-group-addon input[type=radio]{margin-top:0}.input-group .form-control:first-child,.input-group-addon:first-child,.input-group-btn:first-child>.btn,.input-group-btn:first-child>.btn-group>.btn,.input-group-btn:first-child>.dropdown-toggle,.input-group-btn:last-child>.btn-group:not(:last-child)>.btn,.input-group-btn:last-child>.btn:not(:last-child):not(.dropdown-toggle){border-top-right-radius:0;border-bottom-right-radius:0}.input-group-addon:first-child{border-right:0}.input-group .form-control:last-child,.input-group-addon:last-child,.input-group-btn:first-child>.btn-group:not(:first-child)>.btn,.input-group-btn:first-child>.btn:not(:first-child),.input-group-btn:last-child>.btn,.input-group-btn:last-child>.btn-group>.btn,.input-group-btn:last-child>.dropdown-toggle{border-top-left-radius:0;border-bottom-left-radius:0}.input-group-addon:last-child{border-left:0}.input-group-btn{position:relative;font-size:0;white-space:nowrap}.input-group-btn>.btn{position:relative}.input-group-btn>.btn+.btn{margin-left:-1px}.input-group-btn>.btn:active,.input-group-btn>.btn:focus,.input-group-btn>.btn:hover{z-index:2}.input-group-btn:first-child>.btn,.input-group-btn:first-child>.btn-group{margin-right:-1px}.input-group-btn:last-child>.btn,.input-group-btn:last-child>.btn-group{z-index:2;margin-left:-1px}.nav{padding-left:0;margin-bottom:0;list-style:none}.nav>li{position:relative;display:block}.nav>li>a{position:relative;display:block;padding:10px 15px}.nav>li>a:focus,.nav>li>a:hover{text-decoration:none;background-color:#eee}.nav>li.disabled>a{color:#777}.nav>li.disabled>a:focus,.nav>li.disabled>a:hover{color:#777;text-decoration:none;cursor:not-allowed;background-color:transparent}.nav .open>a,.nav .open>a:focus,.nav .open>a:hover{background-color:#eee;border-color:#337ab7}.nav .nav-divider{height:1px;margin:9px 0;overflow:hidden;background-color:#e5e5e5}.nav>li>a>img{max-width:none}.nav-tabs{border-bottom:1px solid #ddd}.nav-tabs>li{float:left;margin-bottom:-1px}.nav-tabs>li>a{margin-right:2px;line-height:1.42857143;border:1px solid transparent;border-radius:4px 4px 0 0}.nav-tabs>li>a:hover{border-color:#eee #eee #ddd}.nav-tabs>li.active>a,.nav-tabs>li.active>a:focus,.nav-tabs>li.active>a:hover{color:#555;cursor:default;background-color:#fff;border:1px solid #ddd;border-bottom-color:transparent}.nav-tabs.nav-justified{width:100%;border-bottom:0}.nav-tabs.nav-justified>li{float:none}.nav-tabs.nav-justified>li>a{margin-bottom:5px;text-align:center}.nav-tabs.nav-justified>.dropdown .dropdown-menu{top:auto;left:auto}@media (min-width:768px){.nav-tabs.nav-justified>li{display:table-cell;width:1%}.nav-tabs.nav-justified>li>a{margin-bottom:0}}.nav-tabs.nav-justified>li>a{margin-right:0;border-radius:4px}.nav-tabs.nav-justified>.active>a,.nav-tabs.nav-justified>.active>a:focus,.nav-tabs.nav-justified>.active>a:hover{border:1px solid #ddd}@media (min-width:768px){.nav-tabs.nav-justified>li>a{border-bottom:1px solid #ddd;border-radius:4px 4px 0 0}.nav-tabs.nav-justified>.active>a,.nav-tabs.nav-justified>.active>a:focus,.nav-tabs.nav-justified>.active>a:hover{border-bottom-color:#fff}}.nav-pills>li{float:left}.nav-pills>li>a{border-radius:4px}.nav-pills>li+li{margin-left:2px}.nav-pills>li.active>a,.nav-pills>li.active>a:focus,.nav-pills>li.active>a:hover{color:#fff;background-color:#337ab7}.nav-stacked>li{float:none}.nav-stacked>li+li{margin-top:2px;margin-left:0}.nav-justified{width:100%}.nav-justified>li{float:none}.nav-justified>li>a{margin-bottom:5px;text-align:center}.nav-justified>.dropdown .dropdown-menu{top:auto;left:auto}@media (min-width:768px){.nav-justified>li{display:table-cell;width:1%}.nav-justified>li>a{margin-bottom:0}}.nav-tabs-justified{border-bottom:0}.nav-tabs-justified>li>a{margin-right:0;border-radius:4px}.nav-tabs-justified>.active>a,.nav-tabs-justified>.active>a:focus,.nav-tabs-justified>.active>a:hover{border:1px solid #ddd}@media (min-width:768px){.nav-tabs-justified>li>a{border-bottom:1px solid #ddd;border-radius:4px 4px 0 0}.nav-tabs-justified>.active>a,.nav-tabs-justified>.active>a:focus,.nav-tabs-justified>.active>a:hover{border-bottom-color:#fff}}.tab-content>.tab-pane{display:none}.tab-content>.active{display:block}.nav-tabs .dropdown-menu{margin-top:-1px;border-top-left-radius:0;border-top-right-radius:0}.navbar{position:relative;min-height:50px;margin-bottom:20px;border:1px solid transparent}@media (min-width:768px){.navbar{border-radius:4px}}@media (min-width:768px){.navbar-header{float:left}}.navbar-collapse{padding-right:15px;padding-left:15px;overflow-x:visible;-webkit-overflow-scrolling:touch;border-top:1px solid transparent;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.1);box-shadow:inset 0 1px 0 rgba(255,255,255,.1)}.navbar-collapse.in{overflow-y:auto}@media (min-width:768px){.navbar-collapse{width:auto;border-top:0;-webkit-box-shadow:none;box-shadow:none}.navbar-collapse.collapse{display:block!important;height:auto!important;padding-bottom:0;overflow:visible!important}.navbar-collapse.in{overflow-y:visible}.navbar-fixed-bottom .navbar-collapse,.navbar-fixed-top .navbar-collapse,.navbar-static-top .navbar-collapse{padding-right:0;padding-left:0}}.navbar-fixed-bottom .navbar-collapse,.navbar-fixed-top .navbar-collapse{max-height:340px}@media (max-device-width:480px) and (orientation:landscape){.navbar-fixed-bottom .navbar-collapse,.navbar-fixed-top .navbar-collapse{max-height:200px}}.container-fluid>.navbar-collapse,.container-fluid>.navbar-header,.container>.navbar-collapse,.container>.navbar-header{margin-right:-15px;margin-left:-15px}@media (min-width:768px){.container-fluid>.navbar-collapse,.container-fluid>.navbar-header,.container>.navbar-collapse,.container>.navbar-header{margin-right:0;margin-left:0}}.navbar-static-top{z-index:1000;border-width:0 0 1px}@media (min-width:768px){.navbar-static-top{border-radius:0}}.navbar-fixed-bottom,.navbar-fixed-top{position:fixed;right:0;left:0;z-index:1030}@media (min-width:768px){.navbar-fixed-bottom,.navbar-fixed-top{border-radius:0}}.navbar-fixed-top{top:0;border-width:0 0 1px}.navbar-fixed-bottom{bottom:0;margin-bottom:0;border-width:1px 0 0}.navbar-brand{float:left;height:50px;padding:15px 15px;font-size:18px;line-height:20px}.navbar-brand:focus,.navbar-brand:hover{text-decoration:none}.navbar-brand>img{display:block}@media (min-width:768px){.navbar>.container .navbar-brand,.navbar>.container-fluid .navbar-brand{margin-left:-15px}}.navbar-toggle{position:relative;float:right;padding:9px 10px;margin-top:8px;margin-right:15px;margin-bottom:8px;background-color:transparent;background-image:none;border:1px solid transparent;border-radius:4px}.navbar-toggle:focus{outline:0}.navbar-toggle .icon-bar{display:block;width:22px;height:2px;border-radius:1px}.navbar-toggle .icon-bar+.icon-bar{margin-top:4px}@media (min-width:768px){.navbar-toggle{display:none}}.navbar-nav{margin:7.5px -15px}.navbar-nav>li>a{padding-top:10px;padding-bottom:10px;line-height:20px}@media (max-width:767px){.navbar-nav .open .dropdown-menu{position:static;float:none;width:auto;margin-top:0;background-color:transparent;border:0;-webkit-box-shadow:none;box-shadow:none}.navbar-nav .open .dropdown-menu .dropdown-header,.navbar-nav .open .dropdown-menu>li>a{padding:5px 15px 5px 25px}.navbar-nav .open .dropdown-menu>li>a{line-height:20px}.navbar-nav .open .dropdown-menu>li>a:focus,.navbar-nav .open .dropdown-menu>li>a:hover{background-image:none}}@media (min-width:768px){.navbar-nav{float:left;margin:0}.navbar-nav>li{float:left}.navbar-nav>li>a{padding-top:15px;padding-bottom:15px}}.navbar-form{padding:10px 15px;margin-top:8px;margin-right:-15px;margin-bottom:8px;margin-left:-15px;border-top:1px solid transparent;border-bottom:1px solid transparent;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.1),0 1px 0 rgba(255,255,255,.1);box-shadow:inset 0 1px 0 rgba(255,255,255,.1),0 1px 0 rgba(255,255,255,.1)}@media (min-width:768px){.navbar-form .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.navbar-form .form-control{display:inline-block;width:auto;vertical-align:middle}.navbar-form .form-control-static{display:inline-block}.navbar-form .input-group{display:inline-table;vertical-align:middle}.navbar-form .input-group .form-control,.navbar-form .input-group .input-group-addon,.navbar-form .input-group .input-group-btn{width:auto}.navbar-form .input-group>.form-control{width:100%}.navbar-form .control-label{margin-bottom:0;vertical-align:middle}.navbar-form .checkbox,.navbar-form .radio{display:inline-block;margin-top:0;margin-bottom:0;vertical-align:middle}.navbar-form .checkbox label,.navbar-form .radio label{padding-left:0}.navbar-form .checkbox input[type=checkbox],.navbar-form .radio input[type=radio]{position:relative;margin-left:0}.navbar-form .has-feedback .form-control-feedback{top:0}}@media (max-width:767px){.navbar-form .form-group{margin-bottom:5px}.navbar-form .form-group:last-child{margin-bottom:0}}@media (min-width:768px){.navbar-form{width:auto;padding-top:0;padding-bottom:0;margin-right:0;margin-left:0;border:0;-webkit-box-shadow:none;box-shadow:none}}.navbar-nav>li>.dropdown-menu{margin-top:0;border-top-left-radius:0;border-top-right-radius:0}.navbar-fixed-bottom .navbar-nav>li>.dropdown-menu{margin-bottom:0;border-top-left-radius:4px;border-top-right-radius:4px;border-bottom-right-radius:0;border-bottom-left-radius:0}.navbar-btn{margin-top:8px;margin-bottom:8px}.navbar-btn.btn-sm{margin-top:10px;margin-bottom:10px}.navbar-btn.btn-xs{margin-top:14px;margin-bottom:14px}.navbar-text{margin-top:15px;margin-bottom:15px}@media (min-width:768px){.navbar-text{float:left;margin-right:15px;margin-left:15px}}@media (min-width:768px){.navbar-left{float:left!important}.navbar-right{float:right!important;margin-right:-15px}.navbar-right~.navbar-right{margin-right:0}}.navbar-default{background-color:#f8f8f8;border-color:#e7e7e7}.navbar-default .navbar-brand{color:#777}.navbar-default .navbar-brand:focus,.navbar-default .navbar-brand:hover{color:#5e5e5e;background-color:transparent}.navbar-default .navbar-text{color:#777}.navbar-default .navbar-nav>li>a{color:#777}.navbar-default .navbar-nav>li>a:focus,.navbar-default .navbar-nav>li>a:hover{color:#333;background-color:transparent}.navbar-default .navbar-nav>.active>a,.navbar-default .navbar-nav>.active>a:focus,.navbar-default .navbar-nav>.active>a:hover{color:#555;background-color:#e7e7e7}.navbar-default .navbar-nav>.disabled>a,.navbar-default .navbar-nav>.disabled>a:focus,.navbar-default .navbar-nav>.disabled>a:hover{color:#ccc;background-color:transparent}.navbar-default .navbar-toggle{border-color:#ddd}.navbar-default .navbar-toggle:focus,.navbar-default .navbar-toggle:hover{background-color:#ddd}.navbar-default .navbar-toggle .icon-bar{background-color:#888}.navbar-default .navbar-collapse,.navbar-default .navbar-form{border-color:#e7e7e7}.navbar-default .navbar-nav>.open>a,.navbar-default .navbar-nav>.open>a:focus,.navbar-default .navbar-nav>.open>a:hover{color:#555;background-color:#e7e7e7}@media (max-width:767px){.navbar-default .navbar-nav .open .dropdown-menu>li>a{color:#777}.navbar-default .navbar-nav .open .dropdown-menu>li>a:focus,.navbar-default .navbar-nav .open .dropdown-menu>li>a:hover{color:#333;background-color:transparent}.navbar-default .navbar-nav .open .dropdown-menu>.active>a,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:focus,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:hover{color:#555;background-color:#e7e7e7}.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:focus,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:hover{color:#ccc;background-color:transparent}}.navbar-default .navbar-link{color:#777}.navbar-default .navbar-link:hover{color:#333}.navbar-default .btn-link{color:#777}.navbar-default .btn-link:focus,.navbar-default .btn-link:hover{color:#333}.navbar-default .btn-link[disabled]:focus,.navbar-default .btn-link[disabled]:hover,fieldset[disabled] .navbar-default .btn-link:focus,fieldset[disabled] .navbar-default .btn-link:hover{color:#ccc}.navbar-inverse{background-color:#222;border-color:#080808}.navbar-inverse .navbar-brand{color:#9d9d9d}.navbar-inverse .navbar-brand:focus,.navbar-inverse .navbar-brand:hover{color:#fff;background-color:transparent}.navbar-inverse .navbar-text{color:#9d9d9d}.navbar-inverse .navbar-nav>li>a{color:#9d9d9d}.navbar-inverse .navbar-nav>li>a:focus,.navbar-inverse .navbar-nav>li>a:hover{color:#fff;background-color:transparent}.navbar-inverse .navbar-nav>.active>a,.navbar-inverse .navbar-nav>.active>a:focus,.navbar-inverse .navbar-nav>.active>a:hover{color:#fff;background-color:#080808}.navbar-inverse .navbar-nav>.disabled>a,.navbar-inverse .navbar-nav>.disabled>a:focus,.navbar-inverse .navbar-nav>.disabled>a:hover{color:#444;background-color:transparent}.navbar-inverse .navbar-toggle{border-color:#333}.navbar-inverse .navbar-toggle:focus,.navbar-inverse .navbar-toggle:hover{background-color:#333}.navbar-inverse .navbar-toggle .icon-bar{background-color:#fff}.navbar-inverse .navbar-collapse,.navbar-inverse .navbar-form{border-color:#101010}.navbar-inverse .navbar-nav>.open>a,.navbar-inverse .navbar-nav>.open>a:focus,.navbar-inverse .navbar-nav>.open>a:hover{color:#fff;background-color:#080808}@media (max-width:767px){.navbar-inverse .navbar-nav .open .dropdown-menu>.dropdown-header{border-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu .divider{background-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a{color:#9d9d9d}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:focus,.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:hover{color:#fff;background-color:transparent}.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:focus,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:hover{color:#fff;background-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:focus,.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:hover{color:#444;background-color:transparent}}.navbar-inverse .navbar-link{color:#9d9d9d}.navbar-inverse .navbar-link:hover{color:#fff}.navbar-inverse .btn-link{color:#9d9d9d}.navbar-inverse .btn-link:focus,.navbar-inverse .btn-link:hover{color:#fff}.navbar-inverse .btn-link[disabled]:focus,.navbar-inverse .btn-link[disabled]:hover,fieldset[disabled] .navbar-inverse .btn-link:focus,fieldset[disabled] .navbar-inverse .btn-link:hover{color:#444}.breadcrumb{padding:8px 15px;margin-bottom:20px;list-style:none;background-color:#f5f5f5;border-radius:4px}.breadcrumb>li{display:inline-block}.breadcrumb>li+li:before{padding:0 5px;color:#ccc;content:"/\00a0"}.breadcrumb>.active{color:#777}.pagination{display:inline-block;padding-left:0;margin:20px 0;border-radius:4px}.pagination>li{display:inline}.pagination>li>a,.pagination>li>span{position:relative;float:left;padding:6px 12px;margin-left:-1px;line-height:1.42857143;color:#337ab7;text-decoration:none;background-color:#fff;border:1px solid #ddd}.pagination>li:first-child>a,.pagination>li:first-child>span{margin-left:0;border-top-left-radius:4px;border-bottom-left-radius:4px}.pagination>li:last-child>a,.pagination>li:last-child>span{border-top-right-radius:4px;border-bottom-right-radius:4px}.pagination>li>a:focus,.pagination>li>a:hover,.pagination>li>span:focus,.pagination>li>span:hover{z-index:2;color:#23527c;background-color:#eee;border-color:#ddd}.pagination>.active>a,.pagination>.active>a:focus,.pagination>.active>a:hover,.pagination>.active>span,.pagination>.active>span:focus,.pagination>.active>span:hover{z-index:3;color:#fff;cursor:default;background-color:#337ab7;border-color:#337ab7}.pagination>.disabled>a,.pagination>.disabled>a:focus,.pagination>.disabled>a:hover,.pagination>.disabled>span,.pagination>.disabled>span:focus,.pagination>.disabled>span:hover{color:#777;cursor:not-allowed;background-color:#fff;border-color:#ddd}.pagination-lg>li>a,.pagination-lg>li>span{padding:10px 16px;font-size:18px;line-height:1.3333333}.pagination-lg>li:first-child>a,.pagination-lg>li:first-child>span{border-top-left-radius:6px;border-bottom-left-radius:6px}.pagination-lg>li:last-child>a,.pagination-lg>li:last-child>span{border-top-right-radius:6px;border-bottom-right-radius:6px}.pagination-sm>li>a,.pagination-sm>li>span{padding:5px 10px;font-size:12px;line-height:1.5}.pagination-sm>li:first-child>a,.pagination-sm>li:first-child>span{border-top-left-radius:3px;border-bottom-left-radius:3px}.pagination-sm>li:last-child>a,.pagination-sm>li:last-child>span{border-top-right-radius:3px;border-bottom-right-radius:3px}.pager{padding-left:0;margin:20px 0;text-align:center;list-style:none}.pager li{display:inline}.pager li>a,.pager li>span{display:inline-block;padding:5px 14px;background-color:#fff;border:1px solid #ddd;border-radius:15px}.pager li>a:focus,.pager li>a:hover{text-decoration:none;background-color:#eee}.pager .next>a,.pager .next>span{float:right}.pager .previous>a,.pager .previous>span{float:left}.pager .disabled>a,.pager .disabled>a:focus,.pager .disabled>a:hover,.pager .disabled>span{color:#777;cursor:not-allowed;background-color:#fff}.label{display:inline;padding:.2em .6em .3em;font-size:75%;font-weight:700;line-height:1;color:#fff;text-align:center;white-space:nowrap;vertical-align:baseline;border-radius:.25em}a.label:focus,a.label:hover{color:#fff;text-decoration:none;cursor:pointer}.label:empty{display:none}.btn .label{position:relative;top:-1px}.label-default{background-color:#777}.label-default[href]:focus,.label-default[href]:hover{background-color:#5e5e5e}.label-primary{background-color:#337ab7}.label-primary[href]:focus,.label-primary[href]:hover{background-color:#286090}.label-success{background-color:#5cb85c}.label-success[href]:focus,.label-success[href]:hover{background-color:#449d44}.label-info{background-color:#5bc0de}.label-info[href]:focus,.label-info[href]:hover{background-color:#31b0d5}.label-warning{background-color:#f0ad4e}.label-warning[href]:focus,.label-warning[href]:hover{background-color:#ec971f}.label-danger{background-color:#d9534f}.label-danger[href]:focus,.label-danger[href]:hover{background-color:#c9302c}.badge{display:inline-block;min-width:10px;padding:3px 7px;font-size:12px;font-weight:700;line-height:1;color:#fff;text-align:center;white-space:nowrap;vertical-align:middle;background-color:#777;border-radius:10px}.badge:empty{display:none}.btn .badge{position:relative;top:-1px}.btn-group-xs>.btn .badge,.btn-xs .badge{top:0;padding:1px 5px}a.badge:focus,a.badge:hover{color:#fff;text-decoration:none;cursor:pointer}.list-group-item.active>.badge,.nav-pills>.active>a>.badge{color:#337ab7;background-color:#fff}.list-group-item>.badge{float:right}.list-group-item>.badge+.badge{margin-right:5px}.nav-pills>li>a>.badge{margin-left:3px}.jumbotron{padding-top:30px;padding-bottom:30px;margin-bottom:30px;color:inherit;background-color:#eee}.jumbotron .h1,.jumbotron h1{color:inherit}.jumbotron p{margin-bottom:15px;font-size:21px;font-weight:200}.jumbotron>hr{border-top-color:#d5d5d5}.container .jumbotron,.container-fluid .jumbotron{padding-right:15px;padding-left:15px;border-radius:6px}.jumbotron .container{max-width:100%}@media screen and (min-width:768px){.jumbotron{padding-top:48px;padding-bottom:48px}.container .jumbotron,.container-fluid .jumbotron{padding-right:60px;padding-left:60px}.jumbotron .h1,.jumbotron h1{font-size:63px}}.thumbnail{display:block;padding:4px;margin-bottom:20px;line-height:1.42857143;background-color:#fff;border:1px solid #ddd;border-radius:4px;-webkit-transition:border .2s ease-in-out;-o-transition:border .2s ease-in-out;transition:border .2s ease-in-out}.thumbnail a>img,.thumbnail>img{margin-right:auto;margin-left:auto}a.thumbnail.active,a.thumbnail:focus,a.thumbnail:hover{border-color:#337ab7}.thumbnail .caption{padding:9px;color:#333}.alert{padding:15px;margin-bottom:20px;border:1px solid transparent;border-radius:4px}.alert h4{margin-top:0;color:inherit}.alert .alert-link{font-weight:700}.alert>p,.alert>ul{margin-bottom:0}.alert>p+p{margin-top:5px}.alert-dismissable,.alert-dismissible{padding-right:35px}.alert-dismissable .close,.alert-dismissible .close{position:relative;top:-2px;right:-21px;color:inherit}.alert-success{color:#3c763d;background-color:#dff0d8;border-color:#d6e9c6}.alert-success hr{border-top-color:#c9e2b3}.alert-success .alert-link{color:#2b542c}.alert-info{color:#31708f;background-color:#d9edf7;border-color:#bce8f1}.alert-info hr{border-top-color:#a6e1ec}.alert-info .alert-link{color:#245269}.alert-warning{color:#8a6d3b;background-color:#fcf8e3;border-color:#faebcc}.alert-warning hr{border-top-color:#f7e1b5}.alert-warning .alert-link{color:#66512c}.alert-danger{color:#a94442;background-color:#f2dede;border-color:#ebccd1}.alert-danger hr{border-top-color:#e4b9c0}.alert-danger .alert-link{color:#843534}@-webkit-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@-o-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}.progress{height:20px;margin-bottom:20px;overflow:hidden;background-color:#f5f5f5;border-radius:4px;-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,.1);box-shadow:inset 0 1px 2px rgba(0,0,0,.1)}.progress-bar{float:left;width:0;height:100%;font-size:12px;line-height:20px;color:#fff;text-align:center;background-color:#337ab7;-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,.15);box-shadow:inset 0 -1px 0 rgba(0,0,0,.15);-webkit-transition:width .6s ease;-o-transition:width .6s ease;transition:width .6s ease}.progress-bar-striped,.progress-striped .progress-bar{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);-webkit-background-size:40px 40px;background-size:40px 40px}.progress-bar.active,.progress.active .progress-bar{-webkit-animation:progress-bar-stripes 2s linear infinite;-o-animation:progress-bar-stripes 2s linear infinite;animation:progress-bar-stripes 2s linear infinite}.progress-bar-success{background-color:#5cb85c}.progress-striped .progress-bar-success{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.progress-bar-info{background-color:#5bc0de}.progress-striped .progress-bar-info{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.progress-bar-warning{background-color:#f0ad4e}.progress-striped .progress-bar-warning{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.progress-bar-danger{background-color:#d9534f}.progress-striped .progress-bar-danger{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.media{margin-top:15px}.media:first-child{margin-top:0}.media,.media-body{overflow:hidden;zoom:1}.media-body{width:10000px}.media-object{display:block}.media-object.img-thumbnail{max-width:none}.media-right,.media>.pull-right{padding-left:10px}.media-left,.media>.pull-left{padding-right:10px}.media-body,.media-left,.media-right{display:table-cell;vertical-align:top}.media-middle{vertical-align:middle}.media-bottom{vertical-align:bottom}.media-heading{margin-top:0;margin-bottom:5px}.media-list{padding-left:0;list-style:none}.list-group{padding-left:0;margin-bottom:20px}.list-group-item{position:relative;display:block;padding:10px 15px;margin-bottom:-1px;background-color:#fff;border:1px solid #ddd}.list-group-item:first-child{border-top-left-radius:4px;border-top-right-radius:4px}.list-group-item:last-child{margin-bottom:0;border-bottom-right-radius:4px;border-bottom-left-radius:4px}a.list-group-item,button.list-group-item{color:#555}a.list-group-item .list-group-item-heading,button.list-group-item .list-group-item-heading{color:#333}a.list-group-item:focus,a.list-group-item:hover,button.list-group-item:focus,button.list-group-item:hover{color:#555;text-decoration:none;background-color:#f5f5f5}button.list-group-item{width:100%;text-align:left}.list-group-item.disabled,.list-group-item.disabled:focus,.list-group-item.disabled:hover{color:#777;cursor:not-allowed;background-color:#eee}.list-group-item.disabled .list-group-item-heading,.list-group-item.disabled:focus .list-group-item-heading,.list-group-item.disabled:hover .list-group-item-heading{color:inherit}.list-group-item.disabled .list-group-item-text,.list-group-item.disabled:focus .list-group-item-text,.list-group-item.disabled:hover .list-group-item-text{color:#777}.list-group-item.active,.list-group-item.active:focus,.list-group-item.active:hover{z-index:2;color:#fff;background-color:#337ab7;border-color:#337ab7}.list-group-item.active .list-group-item-heading,.list-group-item.active .list-group-item-heading>.small,.list-group-item.active .list-group-item-heading>small,.list-group-item.active:focus .list-group-item-heading,.list-group-item.active:focus .list-group-item-heading>.small,.list-group-item.active:focus .list-group-item-heading>small,.list-group-item.active:hover .list-group-item-heading,.list-group-item.active:hover .list-group-item-heading>.small,.list-group-item.active:hover .list-group-item-heading>small{color:inherit}.list-group-item.active .list-group-item-text,.list-group-item.active:focus .list-group-item-text,.list-group-item.active:hover .list-group-item-text{color:#c7ddef}.list-group-item-success{color:#3c763d;background-color:#dff0d8}a.list-group-item-success,button.list-group-item-success{color:#3c763d}a.list-group-item-success .list-group-item-heading,button.list-group-item-success .list-group-item-heading{color:inherit}a.list-group-item-success:focus,a.list-group-item-success:hover,button.list-group-item-success:focus,button.list-group-item-success:hover{color:#3c763d;background-color:#d0e9c6}a.list-group-item-success.active,a.list-group-item-success.active:focus,a.list-group-item-success.active:hover,button.list-group-item-success.active,button.list-group-item-success.active:focus,button.list-group-item-success.active:hover{color:#fff;background-color:#3c763d;border-color:#3c763d}.list-group-item-info{color:#31708f;background-color:#d9edf7}a.list-group-item-info,button.list-group-item-info{color:#31708f}a.list-group-item-info .list-group-item-heading,button.list-group-item-info .list-group-item-heading{color:inherit}a.list-group-item-info:focus,a.list-group-item-info:hover,button.list-group-item-info:focus,button.list-group-item-info:hover{color:#31708f;background-color:#c4e3f3}a.list-group-item-info.active,a.list-group-item-info.active:focus,a.list-group-item-info.active:hover,button.list-group-item-info.active,button.list-group-item-info.active:focus,button.list-group-item-info.active:hover{color:#fff;background-color:#31708f;border-color:#31708f}.list-group-item-warning{color:#8a6d3b;background-color:#fcf8e3}a.list-group-item-warning,button.list-group-item-warning{color:#8a6d3b}a.list-group-item-warning .list-group-item-heading,button.list-group-item-warning .list-group-item-heading{color:inherit}a.list-group-item-warning:focus,a.list-group-item-warning:hover,button.list-group-item-warning:focus,button.list-group-item-warning:hover{color:#8a6d3b;background-color:#faf2cc}a.list-group-item-warning.active,a.list-group-item-warning.active:focus,a.list-group-item-warning.active:hover,button.list-group-item-warning.active,button.list-group-item-warning.active:focus,button.list-group-item-warning.active:hover{color:#fff;background-color:#8a6d3b;border-color:#8a6d3b}.list-group-item-danger{color:#a94442;background-color:#f2dede}a.list-group-item-danger,button.list-group-item-danger{color:#a94442}a.list-group-item-danger .list-group-item-heading,button.list-group-item-danger .list-group-item-heading{color:inherit}a.list-group-item-danger:focus,a.list-group-item-danger:hover,button.list-group-item-danger:focus,button.list-group-item-danger:hover{color:#a94442;background-color:#ebcccc}a.list-group-item-danger.active,a.list-group-item-danger.active:focus,a.list-group-item-danger.active:hover,button.list-group-item-danger.active,button.list-group-item-danger.active:focus,button.list-group-item-danger.active:hover{color:#fff;background-color:#a94442;border-color:#a94442}.list-group-item-heading{margin-top:0;margin-bottom:5px}.list-group-item-text{margin-bottom:0;line-height:1.3}.panel{margin-bottom:20px;background-color:#fff;border:1px solid transparent;border-radius:4px;-webkit-box-shadow:0 1px 1px rgba(0,0,0,.05);box-shadow:0 1px 1px rgba(0,0,0,.05)}.panel-body{padding:15px}.panel-heading{padding:10px 15px;border-bottom:1px solid transparent;border-top-left-radius:3px;border-top-right-radius:3px}.panel-heading>.dropdown .dropdown-toggle{color:inherit}.panel-title{margin-top:0;margin-bottom:0;font-size:16px;color:inherit}.panel-title>.small,.panel-title>.small>a,.panel-title>a,.panel-title>small,.panel-title>small>a{color:inherit}.panel-footer{padding:10px 15px;background-color:#f5f5f5;border-top:1px solid #ddd;border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.list-group,.panel>.panel-collapse>.list-group{margin-bottom:0}.panel>.list-group .list-group-item,.panel>.panel-collapse>.list-group .list-group-item{border-width:1px 0;border-radius:0}.panel>.list-group:first-child .list-group-item:first-child,.panel>.panel-collapse>.list-group:first-child .list-group-item:first-child{border-top:0;border-top-left-radius:3px;border-top-right-radius:3px}.panel>.list-group:last-child .list-group-item:last-child,.panel>.panel-collapse>.list-group:last-child .list-group-item:last-child{border-bottom:0;border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.panel-heading+.panel-collapse>.list-group .list-group-item:first-child{border-top-left-radius:0;border-top-right-radius:0}.panel-heading+.list-group .list-group-item:first-child{border-top-width:0}.list-group+.panel-footer{border-top-width:0}.panel>.panel-collapse>.table,.panel>.table,.panel>.table-responsive>.table{margin-bottom:0}.panel>.panel-collapse>.table caption,.panel>.table caption,.panel>.table-responsive>.table caption{padding-right:15px;padding-left:15px}.panel>.table-responsive:first-child>.table:first-child,.panel>.table:first-child{border-top-left-radius:3px;border-top-right-radius:3px}.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child,.panel>.table:first-child>thead:first-child>tr:first-child{border-top-left-radius:3px;border-top-right-radius:3px}.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child td:first-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child th:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child td:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child th:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child td:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child th:first-child,.panel>.table:first-child>thead:first-child>tr:first-child td:first-child,.panel>.table:first-child>thead:first-child>tr:first-child th:first-child{border-top-left-radius:3px}.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child td:last-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child th:last-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child td:last-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child th:last-child,.panel>.table:first-child>tbody:first-child>tr:first-child td:last-child,.panel>.table:first-child>tbody:first-child>tr:first-child th:last-child,.panel>.table:first-child>thead:first-child>tr:first-child td:last-child,.panel>.table:first-child>thead:first-child>tr:first-child th:last-child{border-top-right-radius:3px}.panel>.table-responsive:last-child>.table:last-child,.panel>.table:last-child{border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child,.panel>.table:last-child>tbody:last-child>tr:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child{border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child td:first-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child th:first-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child td:first-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child th:first-child,.panel>.table:last-child>tbody:last-child>tr:last-child td:first-child,.panel>.table:last-child>tbody:last-child>tr:last-child th:first-child,.panel>.table:last-child>tfoot:last-child>tr:last-child td:first-child,.panel>.table:last-child>tfoot:last-child>tr:last-child th:first-child{border-bottom-left-radius:3px}.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child td:last-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child th:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child td:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child th:last-child,.panel>.table:last-child>tbody:last-child>tr:last-child td:last-child,.panel>.table:last-child>tbody:last-child>tr:last-child th:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child td:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child th:last-child{border-bottom-right-radius:3px}.panel>.panel-body+.table,.panel>.panel-body+.table-responsive,.panel>.table+.panel-body,.panel>.table-responsive+.panel-body{border-top:1px solid #ddd}.panel>.table>tbody:first-child>tr:first-child td,.panel>.table>tbody:first-child>tr:first-child th{border-top:0}.panel>.table-bordered,.panel>.table-responsive>.table-bordered{border:0}.panel>.table-bordered>tbody>tr>td:first-child,.panel>.table-bordered>tbody>tr>th:first-child,.panel>.table-bordered>tfoot>tr>td:first-child,.panel>.table-bordered>tfoot>tr>th:first-child,.panel>.table-bordered>thead>tr>td:first-child,.panel>.table-bordered>thead>tr>th:first-child,.panel>.table-responsive>.table-bordered>tbody>tr>td:first-child,.panel>.table-responsive>.table-bordered>tbody>tr>th:first-child,.panel>.table-responsive>.table-bordered>tfoot>tr>td:first-child,.panel>.table-responsive>.table-bordered>tfoot>tr>th:first-child,.panel>.table-responsive>.table-bordered>thead>tr>td:first-child,.panel>.table-responsive>.table-bordered>thead>tr>th:first-child{border-left:0}.panel>.table-bordered>tbody>tr>td:last-child,.panel>.table-bordered>tbody>tr>th:last-child,.panel>.table-bordered>tfoot>tr>td:last-child,.panel>.table-bordered>tfoot>tr>th:last-child,.panel>.table-bordered>thead>tr>td:last-child,.panel>.table-bordered>thead>tr>th:last-child,.panel>.table-responsive>.table-bordered>tbody>tr>td:last-child,.panel>.table-responsive>.table-bordered>tbody>tr>th:last-child,.panel>.table-responsive>.table-bordered>tfoot>tr>td:last-child,.panel>.table-responsive>.table-bordered>tfoot>tr>th:last-child,.panel>.table-responsive>.table-bordered>thead>tr>td:last-child,.panel>.table-responsive>.table-bordered>thead>tr>th:last-child{border-right:0}.panel>.table-bordered>tbody>tr:first-child>td,.panel>.table-bordered>tbody>tr:first-child>th,.panel>.table-bordered>thead>tr:first-child>td,.panel>.table-bordered>thead>tr:first-child>th,.panel>.table-responsive>.table-bordered>tbody>tr:first-child>td,.panel>.table-responsive>.table-bordered>tbody>tr:first-child>th,.panel>.table-responsive>.table-bordered>thead>tr:first-child>td,.panel>.table-responsive>.table-bordered>thead>tr:first-child>th{border-bottom:0}.panel>.table-bordered>tbody>tr:last-child>td,.panel>.table-bordered>tbody>tr:last-child>th,.panel>.table-bordered>tfoot>tr:last-child>td,.panel>.table-bordered>tfoot>tr:last-child>th,.panel>.table-responsive>.table-bordered>tbody>tr:last-child>td,.panel>.table-responsive>.table-bordered>tbody>tr:last-child>th,.panel>.table-responsive>.table-bordered>tfoot>tr:last-child>td,.panel>.table-responsive>.table-bordered>tfoot>tr:last-child>th{border-bottom:0}.panel>.table-responsive{margin-bottom:0;border:0}.panel-group{margin-bottom:20px}.panel-group .panel{margin-bottom:0;border-radius:4px}.panel-group .panel+.panel{margin-top:5px}.panel-group .panel-heading{border-bottom:0}.panel-group .panel-heading+.panel-collapse>.list-group,.panel-group .panel-heading+.panel-collapse>.panel-body{border-top:1px solid #ddd}.panel-group .panel-footer{border-top:0}.panel-group .panel-footer+.panel-collapse .panel-body{border-bottom:1px solid #ddd}.panel-default{border-color:#ddd}.panel-default>.panel-heading{color:#333;background-color:#f5f5f5;border-color:#ddd}.panel-default>.panel-heading+.panel-collapse>.panel-body{border-top-color:#ddd}.panel-default>.panel-heading .badge{color:#f5f5f5;background-color:#333}.panel-default>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#ddd}.panel-primary{border-color:#337ab7}.panel-primary>.panel-heading{color:#fff;background-color:#337ab7;border-color:#337ab7}.panel-primary>.panel-heading+.panel-collapse>.panel-body{border-top-color:#337ab7}.panel-primary>.panel-heading .badge{color:#337ab7;background-color:#fff}.panel-primary>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#337ab7}.panel-success{border-color:#d6e9c6}.panel-success>.panel-heading{color:#3c763d;background-color:#dff0d8;border-color:#d6e9c6}.panel-success>.panel-heading+.panel-collapse>.panel-body{border-top-color:#d6e9c6}.panel-success>.panel-heading .badge{color:#dff0d8;background-color:#3c763d}.panel-success>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#d6e9c6}.panel-info{border-color:#bce8f1}.panel-info>.panel-heading{color:#31708f;background-color:#d9edf7;border-color:#bce8f1}.panel-info>.panel-heading+.panel-collapse>.panel-body{border-top-color:#bce8f1}.panel-info>.panel-heading .badge{color:#d9edf7;background-color:#31708f}.panel-info>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#bce8f1}.panel-warning{border-color:#faebcc}.panel-warning>.panel-heading{color:#8a6d3b;background-color:#fcf8e3;border-color:#faebcc}.panel-warning>.panel-heading+.panel-collapse>.panel-body{border-top-color:#faebcc}.panel-warning>.panel-heading .badge{color:#fcf8e3;background-color:#8a6d3b}.panel-warning>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#faebcc}.panel-danger{border-color:#ebccd1}.panel-danger>.panel-heading{color:#a94442;background-color:#f2dede;border-color:#ebccd1}.panel-danger>.panel-heading+.panel-collapse>.panel-body{border-top-color:#ebccd1}.panel-danger>.panel-heading .badge{color:#f2dede;background-color:#a94442}.panel-danger>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#ebccd1}.embed-responsive{position:relative;display:block;height:0;padding:0;overflow:hidden}.embed-responsive .embed-responsive-item,.embed-responsive embed,.embed-responsive iframe,.embed-responsive object,.embed-responsive video{position:absolute;top:0;bottom:0;left:0;width:100%;height:100%;border:0}.embed-responsive-16by9{padding-bottom:56.25%}.embed-responsive-4by3{padding-bottom:75%}.well{min-height:20px;padding:19px;margin-bottom:20px;background-color:#f5f5f5;border:1px solid #e3e3e3;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.05);box-shadow:inset 0 1px 1px rgba(0,0,0,.05)}.well blockquote{border-color:#ddd;border-color:rgba(0,0,0,.15)}.well-lg{padding:24px;border-radius:6px}.well-sm{padding:9px;border-radius:3px}.close{float:right;font-size:21px;font-weight:700;line-height:1;color:#000;text-shadow:0 1px 0 #fff;filter:alpha(opacity=20);opacity:.2}.close:focus,.close:hover{color:#000;text-decoration:none;cursor:pointer;filter:alpha(opacity=50);opacity:.5}button.close{-webkit-appearance:none;padding:0;cursor:pointer;background:0 0;border:0}.modal-open{overflow:hidden}.modal{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1050;display:none;overflow:hidden;-webkit-overflow-scrolling:touch;outline:0}.modal.fade .modal-dialog{-webkit-transition:-webkit-transform .3s ease-out;-o-transition:-o-transform .3s ease-out;transition:transform .3s ease-out;-webkit-transform:translate(0,-25%);-ms-transform:translate(0,-25%);-o-transform:translate(0,-25%);transform:translate(0,-25%)}.modal.in .modal-dialog{-webkit-transform:translate(0,0);-ms-transform:translate(0,0);-o-transform:translate(0,0);transform:translate(0,0)}.modal-open .modal{overflow-x:hidden;overflow-y:auto}.modal-dialog{position:relative;width:auto;margin:10px}.modal-content{position:relative;background-color:#fff;-webkit-background-clip:padding-box;background-clip:padding-box;border:1px solid #999;border:1px solid rgba(0,0,0,.2);border-radius:6px;outline:0;-webkit-box-shadow:0 3px 9px rgba(0,0,0,.5);box-shadow:0 3px 9px rgba(0,0,0,.5)}.modal-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1040;background-color:#000}.modal-backdrop.fade{filter:alpha(opacity=0);opacity:0}.modal-backdrop.in{filter:alpha(opacity=50);opacity:.5}.modal-header{padding:15px;border-bottom:1px solid #e5e5e5}.modal-header .close{margin-top:-2px}.modal-title{margin:0;line-height:1.42857143}.modal-body{position:relative;padding:15px}.modal-footer{padding:15px;text-align:right;border-top:1px solid #e5e5e5}.modal-footer .btn+.btn{margin-bottom:0;margin-left:5px}.modal-footer .btn-group .btn+.btn{margin-left:-1px}.modal-footer .btn-block+.btn-block{margin-left:0}.modal-scrollbar-measure{position:absolute;top:-9999px;width:50px;height:50px;overflow:scroll}@media (min-width:768px){.modal-dialog{width:600px;margin:30px auto}.modal-content{-webkit-box-shadow:0 5px 15px rgba(0,0,0,.5);box-shadow:0 5px 15px rgba(0,0,0,.5)}.modal-sm{width:300px}}@media (min-width:992px){.modal-lg{width:900px}}.tooltip{position:absolute;z-index:1070;display:block;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:12px;font-style:normal;font-weight:400;line-height:1.42857143;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;word-spacing:normal;word-wrap:normal;white-space:normal;filter:alpha(opacity=0);opacity:0;line-break:auto}.tooltip.in{filter:alpha(opacity=90);opacity:.9}.tooltip.top{padding:5px 0;margin-top:-3px}.tooltip.right{padding:0 5px;margin-left:3px}.tooltip.bottom{padding:5px 0;margin-top:3px}.tooltip.left{padding:0 5px;margin-left:-3px}.tooltip-inner{max-width:200px;padding:3px 8px;color:#fff;text-align:center;background-color:#000;border-radius:4px}.tooltip-arrow{position:absolute;width:0;height:0;border-color:transparent;border-style:solid}.tooltip.top .tooltip-arrow{bottom:0;left:50%;margin-left:-5px;border-width:5px 5px 0;border-top-color:#000}.tooltip.top-left .tooltip-arrow{right:5px;bottom:0;margin-bottom:-5px;border-width:5px 5px 0;border-top-color:#000}.tooltip.top-right .tooltip-arrow{bottom:0;left:5px;margin-bottom:-5px;border-width:5px 5px 0;border-top-color:#000}.tooltip.right .tooltip-arrow{top:50%;left:0;margin-top:-5px;border-width:5px 5px 5px 0;border-right-color:#000}.tooltip.left .tooltip-arrow{top:50%;right:0;margin-top:-5px;border-width:5px 0 5px 5px;border-left-color:#000}.tooltip.bottom .tooltip-arrow{top:0;left:50%;margin-left:-5px;border-width:0 5px 5px;border-bottom-color:#000}.tooltip.bottom-left .tooltip-arrow{top:0;right:5px;margin-top:-5px;border-width:0 5px 5px;border-bottom-color:#000}.tooltip.bottom-right .tooltip-arrow{top:0;left:5px;margin-top:-5px;border-width:0 5px 5px;border-bottom-color:#000}.popover{position:absolute;top:0;left:0;z-index:1060;display:none;max-width:276px;padding:1px;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:14px;font-style:normal;font-weight:400;line-height:1.42857143;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;word-spacing:normal;word-wrap:normal;white-space:normal;background-color:#fff;-webkit-background-clip:padding-box;background-clip:padding-box;border:1px solid #ccc;border:1px solid rgba(0,0,0,.2);border-radius:6px;-webkit-box-shadow:0 5px 10px rgba(0,0,0,.2);box-shadow:0 5px 10px rgba(0,0,0,.2);line-break:auto}.popover.top{margin-top:-10px}.popover.right{margin-left:10px}.popover.bottom{margin-top:10px}.popover.left{margin-left:-10px}.popover-title{padding:8px 14px;margin:0;font-size:14px;background-color:#f7f7f7;border-bottom:1px solid #ebebeb;border-radius:5px 5px 0 0}.popover-content{padding:9px 14px}.popover>.arrow,.popover>.arrow:after{position:absolute;display:block;width:0;height:0;border-color:transparent;border-style:solid}.popover>.arrow{border-width:11px}.popover>.arrow:after{content:"";border-width:10px}.popover.top>.arrow{bottom:-11px;left:50%;margin-left:-11px;border-top-color:#999;border-top-color:rgba(0,0,0,.25);border-bottom-width:0}.popover.top>.arrow:after{bottom:1px;margin-left:-10px;content:" ";border-top-color:#fff;border-bottom-width:0}.popover.right>.arrow{top:50%;left:-11px;margin-top:-11px;border-right-color:#999;border-right-color:rgba(0,0,0,.25);border-left-width:0}.popover.right>.arrow:after{bottom:-10px;left:1px;content:" ";border-right-color:#fff;border-left-width:0}.popover.bottom>.arrow{top:-11px;left:50%;margin-left:-11px;border-top-width:0;border-bottom-color:#999;border-bottom-color:rgba(0,0,0,.25)}.popover.bottom>.arrow:after{top:1px;margin-left:-10px;content:" ";border-top-width:0;border-bottom-color:#fff}.popover.left>.arrow{top:50%;right:-11px;margin-top:-11px;border-right-width:0;border-left-color:#999;border-left-color:rgba(0,0,0,.25)}.popover.left>.arrow:after{right:1px;bottom:-10px;content:" ";border-right-width:0;border-left-color:#fff}.carousel{position:relative}.carousel-inner{position:relative;width:100%;overflow:hidden}.carousel-inner>.item{position:relative;display:none;-webkit-transition:.6s ease-in-out left;-o-transition:.6s ease-in-out left;transition:.6s ease-in-out left}.carousel-inner>.item>a>img,.carousel-inner>.item>img{line-height:1}@media all and (transform-3d),(-webkit-transform-3d){.carousel-inner>.item{-webkit-transition:-webkit-transform .6s ease-in-out;-o-transition:-o-transform .6s ease-in-out;transition:transform .6s ease-in-out;-webkit-backface-visibility:hidden;backface-visibility:hidden;-webkit-perspective:1000px;perspective:1000px}.carousel-inner>.item.active.right,.carousel-inner>.item.next{left:0;-webkit-transform:translate3d(100%,0,0);transform:translate3d(100%,0,0)}.carousel-inner>.item.active.left,.carousel-inner>.item.prev{left:0;-webkit-transform:translate3d(-100%,0,0);transform:translate3d(-100%,0,0)}.carousel-inner>.item.active,.carousel-inner>.item.next.left,.carousel-inner>.item.prev.right{left:0;-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}}.carousel-inner>.active,.carousel-inner>.next,.carousel-inner>.prev{display:block}.carousel-inner>.active{left:0}.carousel-inner>.next,.carousel-inner>.prev{position:absolute;top:0;width:100%}.carousel-inner>.next{left:100%}.carousel-inner>.prev{left:-100%}.carousel-inner>.next.left,.carousel-inner>.prev.right{left:0}.carousel-inner>.active.left{left:-100%}.carousel-inner>.active.right{left:100%}.carousel-control{position:absolute;top:0;bottom:0;left:0;width:15%;font-size:20px;color:#fff;text-align:center;text-shadow:0 1px 2px rgba(0,0,0,.6);background-color:rgba(0,0,0,0);filter:alpha(opacity=50);opacity:.5}.carousel-control.left{background-image:-webkit-linear-gradient(left,rgba(0,0,0,.5) 0,rgba(0,0,0,.0001) 100%);background-image:-o-linear-gradient(left,rgba(0,0,0,.5) 0,rgba(0,0,0,.0001) 100%);background-image:-webkit-gradient(linear,left top,right top,from(rgba(0,0,0,.5)),to(rgba(0,0,0,.0001)));background-image:linear-gradient(to right,rgba(0,0,0,.5) 0,rgba(0,0,0,.0001) 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#80000000', endColorstr='#00000000', GradientType=1);background-repeat:repeat-x}.carousel-control.right{right:0;left:auto;background-image:-webkit-linear-gradient(left,rgba(0,0,0,.0001) 0,rgba(0,0,0,.5) 100%);background-image:-o-linear-gradient(left,rgba(0,0,0,.0001) 0,rgba(0,0,0,.5) 100%);background-image:-webkit-gradient(linear,left top,right top,from(rgba(0,0,0,.0001)),to(rgba(0,0,0,.5)));background-image:linear-gradient(to right,rgba(0,0,0,.0001) 0,rgba(0,0,0,.5) 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#00000000', endColorstr='#80000000', GradientType=1);background-repeat:repeat-x}.carousel-control:focus,.carousel-control:hover{color:#fff;text-decoration:none;filter:alpha(opacity=90);outline:0;opacity:.9}.carousel-control .glyphicon-chevron-left,.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next,.carousel-control .icon-prev{position:absolute;top:50%;z-index:5;display:inline-block;margin-top:-10px}.carousel-control .glyphicon-chevron-left,.carousel-control .icon-prev{left:50%;margin-left:-10px}.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next{right:50%;margin-right:-10px}.carousel-control .icon-next,.carousel-control .icon-prev{width:20px;height:20px;font-family:serif;line-height:1}.carousel-control .icon-prev:before{content:'\2039'}.carousel-control .icon-next:before{content:'\203a'}.carousel-indicators{position:absolute;bottom:10px;left:50%;z-index:15;width:60%;padding-left:0;margin-left:-30%;text-align:center;list-style:none}.carousel-indicators li{display:inline-block;width:10px;height:10px;margin:1px;text-indent:-999px;cursor:pointer;background-color:#000\9;background-color:rgba(0,0,0,0);border:1px solid #fff;border-radius:10px}.carousel-indicators .active{width:12px;height:12px;margin:0;background-color:#fff}.carousel-caption{position:absolute;right:15%;bottom:20px;left:15%;z-index:10;padding-top:20px;padding-bottom:20px;color:#fff;text-align:center;text-shadow:0 1px 2px rgba(0,0,0,.6)}.carousel-caption .btn{text-shadow:none}@media screen and (min-width:768px){.carousel-control .glyphicon-chevron-left,.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next,.carousel-control .icon-prev{width:30px;height:30px;margin-top:-10px;font-size:30px}.carousel-control .glyphicon-chevron-left,.carousel-control .icon-prev{margin-left:-10px}.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next{margin-right:-10px}.carousel-caption{right:20%;left:20%;padding-bottom:30px}.carousel-indicators{bottom:20px}}.btn-group-vertical>.btn-group:after,.btn-group-vertical>.btn-group:before,.btn-toolbar:after,.btn-toolbar:before,.clearfix:after,.clearfix:before,.container-fluid:after,.container-fluid:before,.container:after,.container:before,.dl-horizontal dd:after,.dl-horizontal dd:before,.form-horizontal .form-group:after,.form-horizontal .form-group:before,.modal-footer:after,.modal-footer:before,.modal-header:after,.modal-header:before,.nav:after,.nav:before,.navbar-collapse:after,.navbar-collapse:before,.navbar-header:after,.navbar-header:before,.navbar:after,.navbar:before,.pager:after,.pager:before,.panel-body:after,.panel-body:before,.row:after,.row:before{display:table;content:" "}.btn-group-vertical>.btn-group:after,.btn-toolbar:after,.clearfix:after,.container-fluid:after,.container:after,.dl-horizontal dd:after,.form-horizontal .form-group:after,.modal-footer:after,.modal-header:after,.nav:after,.navbar-collapse:after,.navbar-header:after,.navbar:after,.pager:after,.panel-body:after,.row:after{clear:both}.center-block{display:block;margin-right:auto;margin-left:auto}.pull-right{float:right!important}.pull-left{float:left!important}.hide{display:none!important}.show{display:block!important}.invisible{visibility:hidden}.text-hide{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}.hidden{display:none!important}.affix{position:fixed}@-ms-viewport{width:device-width}.visible-lg,.visible-md,.visible-sm,.visible-xs{display:none!important}.visible-lg-block,.visible-lg-inline,.visible-lg-inline-block,.visible-md-block,.visible-md-inline,.visible-md-inline-block,.visible-sm-block,.visible-sm-inline,.visible-sm-inline-block,.visible-xs-block,.visible-xs-inline,.visible-xs-inline-block{display:none!important}@media (max-width:767px){.visible-xs{display:block!important}table.visible-xs{display:table!important}tr.visible-xs{display:table-row!important}td.visible-xs,th.visible-xs{display:table-cell!important}}@media (max-width:767px){.visible-xs-block{display:block!important}}@media (max-width:767px){.visible-xs-inline{display:inline!important}}@media (max-width:767px){.visible-xs-inline-block{display:inline-block!important}}@media (min-width:768px) and (max-width:991px){.visible-sm{display:block!important}table.visible-sm{display:table!important}tr.visible-sm{display:table-row!important}td.visible-sm,th.visible-sm{display:table-cell!important}}@media (min-width:768px) and (max-width:991px){.visible-sm-block{display:block!important}}@media (min-width:768px) and (max-width:991px){.visible-sm-inline{display:inline!important}}@media (min-width:768px) and (max-width:991px){.visible-sm-inline-block{display:inline-block!important}}@media (min-width:992px) and (max-width:1199px){.visible-md{display:block!important}table.visible-md{display:table!important}tr.visible-md{display:table-row!important}td.visible-md,th.visible-md{display:table-cell!important}}@media (min-width:992px) and (max-width:1199px){.visible-md-block{display:block!important}}@media (min-width:992px) and (max-width:1199px){.visible-md-inline{display:inline!important}}@media (min-width:992px) and (max-width:1199px){.visible-md-inline-block{display:inline-block!important}}@media (min-width:1200px){.visible-lg{display:block!important}table.visible-lg{display:table!important}tr.visible-lg{display:table-row!important}td.visible-lg,th.visible-lg{display:table-cell!important}}@media (min-width:1200px){.visible-lg-block{display:block!important}}@media (min-width:1200px){.visible-lg-inline{display:inline!important}}@media (min-width:1200px){.visible-lg-inline-block{display:inline-block!important}}@media (max-width:767px){.hidden-xs{display:none!important}}@media (min-width:768px) and (max-width:991px){.hidden-sm{display:none!important}}@media (min-width:992px) and (max-width:1199px){.hidden-md{display:none!important}}@media (min-width:1200px){.hidden-lg{display:none!important}}.visible-print{display:none!important}@media print{.visible-print{display:block!important}table.visible-print{display:table!important}tr.visible-print{display:table-row!important}td.visible-print,th.visible-print{display:table-cell!important}}.visible-print-block{display:none!important}@media print{.visible-print-block{display:block!important}}.visible-print-inline{display:none!important}@media print{.visible-print-inline{display:inline!important}}.visible-print-inline-block{display:none!important}@media print{.visible-print-inline-block{display:inline-block!important}}@media print{.hidden-print{display:none!important}} +/*# sourceMappingURL=bootstrap.min.css.map */ \ No newline at end of file diff --git a/vraptor/src/main/webapp/vendor/bootstrap/fonts/glyphicons-halflings-regular.eot b/vraptor/src/main/webapp/vendor/bootstrap/fonts/glyphicons-halflings-regular.eot new file mode 100644 index 0000000000000000000000000000000000000000..b93a4953fff68df523aa7656497ee339d6026d64 GIT binary patch literal 20127 zcma%hV{j!vx9y2-`@~L8?1^pLwlPU2wr$&<*tR|KBoo`2;LUg6eW-eW-tKDb)vH%` z^`A!Vd<6hNSRMcX|Cb;E|1qflDggj6Kmr)xA10^t-vIc3*Z+F{r%|K(GyE^?|I{=9 zNq`(c8=wS`0!RZy0g3{M(8^tv41d}oRU?8#IBFtJy*9zAN5dcxqGlMZGL>GG%R#)4J zDJ2;)4*E1pyHia%>lMv3X7Q`UoFyoB@|xvh^)kOE3)IL&0(G&i;g08s>c%~pHkN&6 z($7!kyv|A2DsV2mq-5Ku)D#$Kn$CzqD-wm5Q*OtEOEZe^&T$xIb0NUL}$)W)Ck`6oter6KcQG9Zcy>lXip)%e&!lQgtQ*N`#abOlytt!&i3fo)cKV zP0BWmLxS1gQv(r_r|?9>rR0ZeEJPx;Vi|h1!Eo*dohr&^lJgqJZns>&vexP@fs zkPv93Nyw$-kM5Mw^{@wPU47Y1dSkiHyl3dtHLwV&6Tm1iv{ve;sYA}Z&kmH802s9Z zyJEn+cfl7yFu#1^#DbtP7k&aR06|n{LnYFYEphKd@dJEq@)s#S)UA&8VJY@S2+{~> z(4?M();zvayyd^j`@4>xCqH|Au>Sfzb$mEOcD7e4z8pPVRTiMUWiw;|gXHw7LS#U< zsT(}Z5SJ)CRMXloh$qPnK77w_)ctHmgh}QAe<2S{DU^`!uwptCoq!Owz$u6bF)vnb zL`bM$%>baN7l#)vtS3y6h*2?xCk z>w+s)@`O4(4_I{L-!+b%)NZcQ&ND=2lyP+xI#9OzsiY8$c)ys-MI?TG6 zEP6f=vuLo!G>J7F4v|s#lJ+7A`^nEQScH3e?B_jC&{sj>m zYD?!1z4nDG_Afi$!J(<{>z{~Q)$SaXWjj~%ZvF152Hd^VoG14rFykR=_TO)mCn&K$ z-TfZ!vMBvnToyBoKRkD{3=&=qD|L!vb#jf1f}2338z)e)g>7#NPe!FoaY*jY{f)Bf>ohk-K z4{>fVS}ZCicCqgLuYR_fYx2;*-4k>kffuywghn?15s1dIOOYfl+XLf5w?wtU2Og*f z%X5x`H55F6g1>m~%F`655-W1wFJtY>>qNSdVT`M`1Mlh!5Q6#3j={n5#za;!X&^OJ zgq;d4UJV-F>gg?c3Y?d=kvn3eV)Jb^ zO5vg0G0yN0%}xy#(6oTDSVw8l=_*2k;zTP?+N=*18H5wp`s90K-C67q{W3d8vQGmr zhpW^>1HEQV2TG#8_P_0q91h8QgHT~8=-Ij5snJ3cj?Jn5_66uV=*pq(j}yHnf$Ft;5VVC?bz%9X31asJeQF2jEa47H#j` zk&uxf3t?g!tltVP|B#G_UfDD}`<#B#iY^i>oDd-LGF}A@Fno~dR72c&hs6bR z2F}9(i8+PR%R|~FV$;Ke^Q_E_Bc;$)xN4Ti>Lgg4vaip!%M z06oxAF_*)LH57w|gCW3SwoEHwjO{}}U=pKhjKSZ{u!K?1zm1q? zXyA6y@)}_sONiJopF}_}(~}d4FDyp|(@w}Vb;Fl5bZL%{1`}gdw#i{KMjp2@Fb9pg ziO|u7qP{$kxH$qh8%L+)AvwZNgUT6^zsZq-MRyZid{D?t`f|KzSAD~C?WT3d0rO`0 z=qQ6{)&UXXuHY{9g|P7l_nd-%eh}4%VVaK#Nik*tOu9lBM$<%FS@`NwGEbP0&;Xbo zObCq=y%a`jSJmx_uTLa{@2@}^&F4c%z6oe-TN&idjv+8E|$FHOvBqg5hT zMB=7SHq`_-E?5g=()*!V>rIa&LcX(RU}aLm*38U_V$C_g4)7GrW5$GnvTwJZdBmy6 z*X)wi3=R8L=esOhY0a&eH`^fSpUHV8h$J1|o^3fKO|9QzaiKu>yZ9wmRkW?HTkc<*v7i*ylJ#u#j zD1-n&{B`04oG>0Jn{5PKP*4Qsz{~`VVA3578gA+JUkiPc$Iq!^K|}*p_z3(-c&5z@ zKxmdNpp2&wg&%xL3xZNzG-5Xt7jnI@{?c z25=M>-VF|;an2Os$Nn%HgQz7m(ujC}Ii0Oesa(y#8>D+P*_m^X##E|h$M6tJr%#=P zWP*)Px>7z`E~U^2LNCNiy%Z7!!6RI%6fF@#ZY3z`CK91}^J$F!EB0YF1je9hJKU7!S5MnXV{+#K;y zF~s*H%p@vj&-ru7#(F2L+_;IH46X(z{~HTfcThqD%b{>~u@lSc<+f5#xgt9L7$gSK ziDJ6D*R%4&YeUB@yu@4+&70MBNTnjRyqMRd+@&lU#rV%0t3OmouhC`mkN}pL>tXin zY*p)mt=}$EGT2E<4Q>E2`6)gZ`QJhGDNpI}bZL9}m+R>q?l`OzFjW?)Y)P`fUH(_4 zCb?sm1=DD0+Q5v}BW#0n5;Nm(@RTEa3(Y17H2H67La+>ptQHJ@WMy2xRQT$|7l`8c zYHCxYw2o-rI?(fR2-%}pbs$I%w_&LPYE{4bo}vRoAW>3!SY_zH3`ofx3F1PsQ?&iq z*BRG>?<6%z=x#`NhlEq{K~&rU7Kc7Y-90aRnoj~rVoKae)L$3^z*Utppk?I`)CX&& zZ^@Go9fm&fN`b`XY zt0xE5aw4t@qTg_k=!-5LXU+_~DlW?53!afv6W(k@FPPX-`nA!FBMp7b!ODbL1zh58 z*69I}P_-?qSLKj}JW7gP!la}K@M}L>v?rDD!DY-tu+onu9kLoJz20M4urX_xf2dfZ zORd9Zp&28_ff=wdMpXi%IiTTNegC}~RLkdYjA39kWqlA?jO~o1`*B&85Hd%VPkYZT z48MPe62;TOq#c%H(`wX5(Bu>nlh4Fbd*Npasdhh?oRy8a;NB2(eb}6DgwXtx=n}fE zx67rYw=(s0r?EsPjaya}^Qc-_UT5|*@|$Q}*|>V3O~USkIe6a0_>vd~6kHuP8=m}_ zo2IGKbv;yA+TBtlCpnw)8hDn&eq?26gN$Bh;SdxaS04Fsaih_Cfb98s39xbv)=mS0 z6M<@pM2#pe32w*lYSWG>DYqB95XhgAA)*9dOxHr{t)er0Xugoy)!Vz#2C3FaUMzYl zCxy{igFB901*R2*F4>grPF}+G`;Yh zGi@nRjWyG3mR(BVOeBPOF=_&}2IWT%)pqdNAcL{eP`L*^FDv#Rzql5U&Suq_X%JfR_lC!S|y|xd5mQ0{0!G#9hV46S~A` z0B!{yI-4FZEtol5)mNWXcX(`x&Pc*&gh4k{w%0S#EI>rqqlH2xv7mR=9XNCI$V#NG z4wb-@u{PfQP;tTbzK>(DF(~bKp3;L1-A*HS!VB)Ae>Acnvde15Anb`h;I&0)aZBS6 z55ZS7mL5Wp!LCt45^{2_70YiI_Py=X{I3>$Px5Ez0ahLQ+ z9EWUWSyzA|+g-Axp*Lx-M{!ReQO07EG7r4^)K(xbj@%ZU=0tBC5shl)1a!ifM5OkF z0w2xQ-<+r-h1fi7B6waX15|*GGqfva)S)dVcgea`lQ~SQ$KXPR+(3Tn2I2R<0 z9tK`L*pa^+*n%>tZPiqt{_`%v?Bb7CR-!GhMON_Fbs0$#|H}G?rW|{q5fQhvw!FxI zs-5ZK>hAbnCS#ZQVi5K0X3PjL1JRdQO+&)*!oRCqB{wen60P6!7bGiWn@vD|+E@Xq zb!!_WiU^I|@1M}Hz6fN-m04x=>Exm{b@>UCW|c8vC`aNbtA@KCHujh^2RWZC}iYhL^<*Z93chIBJYU&w>$CGZDRcHuIgF&oyesDZ#&mA;?wxx4Cm#c0V$xYG?9OL(Smh}#fFuX(K;otJmvRP{h ze^f-qv;)HKC7geB92_@3a9@MGijS(hNNVd%-rZ;%@F_f7?Fjinbe1( zn#jQ*jKZTqE+AUTEd3y6t>*=;AO##cmdwU4gc2&rT8l`rtKW2JF<`_M#p>cj+)yCG zgKF)y8jrfxTjGO&ccm8RU>qn|HxQ7Z#sUo$q)P5H%8iBF$({0Ya51-rA@!It#NHN8MxqK zrYyl_&=}WVfQ?+ykV4*@F6)=u_~3BebR2G2>>mKaEBPmSW3(qYGGXj??m3L zHec{@jWCsSD8`xUy0pqT?Sw0oD?AUK*WxZn#D>-$`eI+IT)6ki>ic}W)t$V32^ITD zR497@LO}S|re%A+#vdv-?fXsQGVnP?QB_d0cGE+U84Q=aM=XrOwGFN3`Lpl@P0fL$ zKN1PqOwojH*($uaQFh8_)H#>Acl&UBSZ>!2W1Dinei`R4dJGX$;~60X=|SG6#jci} z&t4*dVDR*;+6Y(G{KGj1B2!qjvDYOyPC}%hnPbJ@g(4yBJrViG1#$$X75y+Ul1{%x zBAuD}Q@w?MFNqF-m39FGpq7RGI?%Bvyyig&oGv)lR>d<`Bqh=p>urib5DE;u$c|$J zwim~nPb19t?LJZsm{<(Iyyt@~H!a4yywmHKW&=1r5+oj*Fx6c89heW@(2R`i!Uiy* zp)=`Vr8sR!)KChE-6SEIyi(dvG3<1KoVt>kGV=zZiG7LGonH1+~yOK-`g0)r#+O|Q>)a`I2FVW%wr3lhO(P{ksNQuR!G_d zeTx(M!%brW_vS9?IF>bzZ2A3mWX-MEaOk^V|4d38{1D|KOlZSjBKrj7Fgf^>JyL0k zLoI$adZJ0T+8i_Idsuj}C;6jgx9LY#Ukh;!8eJ^B1N}q=Gn4onF*a2vY7~`x$r@rJ z`*hi&Z2lazgu{&nz>gjd>#eq*IFlXed(%$s5!HRXKNm zDZld+DwDI`O6hyn2uJ)F^{^;ESf9sjJ)wMSKD~R=DqPBHyP!?cGAvL<1|7K-(=?VO zGcKcF1spUa+ki<`6K#@QxOTsd847N8WSWztG~?~ z!gUJn>z0O=_)VCE|56hkT~n5xXTp}Ucx$Ii%bQ{5;-a4~I2e|{l9ur#*ghd*hSqO= z)GD@ev^w&5%k}YYB~!A%3*XbPPU-N6&3Lp1LxyP@|C<{qcn&?l54+zyMk&I3YDT|E z{lXH-e?C{huu<@~li+73lMOk&k)3s7Asn$t6!PtXJV!RkA`qdo4|OC_a?vR!kE_}k zK5R9KB%V@R7gt@9=TGL{=#r2gl!@3G;k-6sXp&E4u20DgvbY$iE**Xqj3TyxK>3AU z!b9}NXuINqt>Htt6fXIy5mj7oZ{A&$XJ&thR5ySE{mkxq_YooME#VCHm2+3D!f`{) zvR^WSjy_h4v^|!RJV-RaIT2Ctv=)UMMn@fAgjQV$2G+4?&dGA8vK35c-8r)z9Qqa=%k(FU)?iec14<^olkOU3p zF-6`zHiDKPafKK^USUU+D01>C&Wh{{q?>5m zGQp|z*+#>IIo=|ae8CtrN@@t~uLFOeT{}vX(IY*;>wAU=u1Qo4c+a&R);$^VCr>;! zv4L{`lHgc9$BeM)pQ#XA_(Q#=_iSZL4>L~8Hx}NmOC$&*Q*bq|9Aq}rWgFnMDl~d*;7c44GipcpH9PWaBy-G$*MI^F0 z?Tdxir1D<2ui+Q#^c4?uKvq=p>)lq56=Eb|N^qz~w7rsZu)@E4$;~snz+wIxi+980O6M#RmtgLYh@|2}9BiHSpTs zacjGKvwkUwR3lwTSsCHlwb&*(onU;)$yvdhikonn|B44JMgs*&Lo!jn`6AE>XvBiO z*LKNX3FVz9yLcsnmL!cRVO_qv=yIM#X|u&}#f%_?Tj0>8)8P_0r0!AjWNw;S44tst zv+NXY1{zRLf9OYMr6H-z?4CF$Y%MdbpFIN@a-LEnmkcOF>h16cH_;A|e)pJTuCJ4O zY7!4FxT4>4aFT8a92}84>q0&?46h>&0Vv0p>u~k&qd5$C1A6Q$I4V(5X~6{15;PD@ ze6!s9xh#^QI`J+%8*=^(-!P!@9%~buBmN2VSAp@TOo6}C?az+ALP8~&a0FWZk*F5N z^8P8IREnN`N0i@>O0?{i-FoFShYbUB`D7O4HB`Im2{yzXmyrg$k>cY6A@>bf7i3n0 z5y&cf2#`zctT>dz+hNF&+d3g;2)U!#vsb-%LC+pqKRTiiSn#FH#e!bVwR1nAf*TG^ z!RKcCy$P>?Sfq6n<%M{T0I8?p@HlgwC!HoWO>~mT+X<{Ylm+$Vtj9};H3$EB}P2wR$3y!TO#$iY8eO-!}+F&jMu4%E6S>m zB(N4w9O@2=<`WNJay5PwP8javDp~o~xkSbd4t4t8)9jqu@bHmJHq=MV~Pt|(TghCA}fhMS?s-{klV>~=VrT$nsp7mf{?cze~KKOD4 z_1Y!F)*7^W+BBTt1R2h4f1X4Oy2%?=IMhZU8c{qk3xI1=!na*Sg<=A$?K=Y=GUR9@ zQ(ylIm4Lgm>pt#%p`zHxok%vx_=8Fap1|?OM02|N%X-g5_#S~sT@A!x&8k#wVI2lo z1Uyj{tDQRpb*>c}mjU^gYA9{7mNhFAlM=wZkXcA#MHXWMEs^3>p9X)Oa?dx7b%N*y zLz@K^%1JaArjgri;8ptNHwz1<0y8tcURSbHsm=26^@CYJ3hwMaEvC7 z3Wi-@AaXIQ)%F6#i@%M>?Mw7$6(kW@?et@wbk-APcvMCC{>iew#vkZej8%9h0JSc? zCb~K|!9cBU+))^q*co(E^9jRl7gR4Jihyqa(Z(P&ID#TPyysVNL7(^;?Gan!OU>au zN}miBc&XX-M$mSv%3xs)bh>Jq9#aD_l|zO?I+p4_5qI0Ms*OZyyxA`sXcyiy>-{YN zA70%HmibZYcHW&YOHk6S&PQ+$rJ3(utuUra3V0~@=_~QZy&nc~)AS>v&<6$gErZC3 zcbC=eVkV4Vu0#}E*r=&{X)Kgq|8MGCh(wsH4geLj@#8EGYa})K2;n z{1~=ghoz=9TSCxgzr5x3@sQZZ0FZ+t{?klSI_IZa16pSx6*;=O%n!uXVZ@1IL;JEV zfOS&yyfE9dtS*^jmgt6>jQDOIJM5Gx#Y2eAcC3l^lmoJ{o0T>IHpECTbfYgPI4#LZq0PKqnPCD}_ zyKxz;(`fE0z~nA1s?d{X2!#ZP8wUHzFSOoTWQrk%;wCnBV_3D%3@EC|u$Ao)tO|AO z$4&aa!wbf}rbNcP{6=ajgg(`p5kTeu$ji20`zw)X1SH*x zN?T36{d9TY*S896Ijc^!35LLUByY4QO=ARCQ#MMCjudFc7s!z%P$6DESz%zZ#>H|i zw3Mc@v4~{Eke;FWs`5i@ifeYPh-Sb#vCa#qJPL|&quSKF%sp8*n#t?vIE7kFWjNFh zJC@u^bRQ^?ra|%39Ux^Dn4I}QICyDKF0mpe+Bk}!lFlqS^WpYm&xwIYxUoS-rJ)N9 z1Tz*6Rl9;x`4lwS1cgW^H_M*)Dt*DX*W?ArBf?-t|1~ge&S}xM0K;U9Ibf{okZHf~ z#4v4qc6s6Zgm8iKch5VMbQc~_V-ZviirnKCi*ouN^c_2lo&-M;YSA>W>>^5tlXObg zacX$k0=9Tf$Eg+#9k6yV(R5-&F{=DHP8!yvSQ`Y~XRnUx@{O$-bGCksk~3&qH^dqX zkf+ZZ?Nv5u>LBM@2?k%k&_aUb5Xjqf#!&7%zN#VZwmv65ezo^Y4S#(ed0yUn4tFOB zh1f1SJ6_s?a{)u6VdwUC!Hv=8`%T9(^c`2hc9nt$(q{Dm2X)dK49ba+KEheQ;7^0) ziFKw$%EHy_B1)M>=yK^=Z$U-LT36yX>EKT zvD8IAom2&2?bTmX@_PBR4W|p?6?LQ+&UMzXxqHC5VHzf@Eb1u)kwyfy+NOM8Wa2y@ zNNDL0PE$F;yFyf^jy&RGwDXQwYw6yz>OMWvJt98X@;yr!*RQDBE- zE*l*u=($Zi1}0-Y4lGaK?J$yQjgb+*ljUvNQ!;QYAoCq@>70=sJ{o{^21^?zT@r~hhf&O;Qiq+ ziGQQLG*D@5;LZ%09mwMiE4Q{IPUx-emo*;a6#DrmWr(zY27d@ezre)Z1BGZdo&pXn z+);gOFelKDmnjq#8dL7CTiVH)dHOqWi~uE|NM^QI3EqxE6+_n>IW67~UB#J==QOGF zp_S)c8TJ}uiaEiaER}MyB(grNn=2m&0yztA=!%3xUREyuG_jmadN*D&1nxvjZ6^+2 zORi7iX1iPi$tKasppaR9$a3IUmrrX)m*)fg1>H+$KpqeB*G>AQV((-G{}h=qItj|d zz~{5@{?&Dab6;0c7!!%Se>w($RmlG7Jlv_zV3Ru8b2rugY0MVPOOYGlokI7%nhIy& z-B&wE=lh2dtD!F?noD{z^O1~Tq4MhxvchzuT_oF3-t4YyA*MJ*n&+1X3~6quEN z@m~aEp=b2~mP+}TUP^FmkRS_PDMA{B zaSy(P=$T~R!yc^Ye0*pl5xcpm_JWI;@-di+nruhqZ4gy7cq-)I&s&Bt3BkgT(Zdjf zTvvv0)8xzntEtp4iXm}~cT+pi5k{w{(Z@l2XU9lHr4Vy~3ycA_T?V(QS{qwt?v|}k z_ST!s;C4!jyV5)^6xC#v!o*uS%a-jQ6< z)>o?z7=+zNNtIz1*F_HJ(w@=`E+T|9TqhC(g7kKDc8z~?RbKQ)LRMn7A1p*PcX2YR zUAr{);~c7I#3Ssv<0i-Woj0&Z4a!u|@Xt2J1>N-|ED<3$o2V?OwL4oQ%$@!zLamVz zB)K&Ik^~GOmDAa143{I4?XUk1<3-k{<%?&OID&>Ud%z*Rkt*)mko0RwC2=qFf-^OV z=d@47?tY=A;=2VAh0mF(3x;!#X!%{|vn;U2XW{(nu5b&8kOr)Kop3-5_xnK5oO_3y z!EaIb{r%D{7zwtGgFVri4_!yUIGwR(xEV3YWSI_+E}Gdl>TINWsIrfj+7DE?xp+5^ zlr3pM-Cbse*WGKOd3+*Qen^*uHk)+EpH-{u@i%y}Z!YSid<}~kA*IRSk|nf+I1N=2 zIKi+&ej%Al-M5`cP^XU>9A(m7G>58>o|}j0ZWbMg&x`*$B9j#Rnyo0#=BMLdo%=ks zLa3(2EinQLXQ(3zDe7Bce%Oszu%?8PO648TNst4SMFvj=+{b%)ELyB!0`B?9R6aO{i-63|s@|raSQGL~s)9R#J#duFaTSZ2M{X z1?YuM*a!!|jP^QJ(hAisJuPOM`8Y-Hzl~%d@latwj}t&0{DNNC+zJARnuQfiN`HQ# z?boY_2?*q;Qk)LUB)s8(Lz5elaW56p&fDH*AWAq7Zrbeq1!?FBGYHCnFgRu5y1jwD zc|yBz+UW|X`zDsc{W~8m$sh@VVnZD$lLnKlq@Hg^;ky!}ZuPdKNi2BI70;hrpvaA4+Q_+K)I@|)q1N-H zrycZU`*YUW``Qi^`bDX-j7j^&bO+-Xg$cz2#i##($uyW{Nl&{DK{=lLWV3|=<&si||2)l=8^8_z+Vho-#5LB0EqQ3v5U#*DF7 zxT)1j^`m+lW}p$>WSIG1eZ>L|YR-@Feu!YNWiw*IZYh03mq+2QVtQ}1ezRJM?0PA< z;mK(J5@N8>u@<6Y$QAHWNE};rR|)U_&bv8dsnsza7{=zD1VBcxrALqnOf-qW(zzTn zTAp|pEo#FsQ$~*$j|~Q;$Zy&Liu9OM;VF@#_&*nL!N2hH!Q6l*OeTxq!l>dEc{;Hw zCQni{iN%jHU*C;?M-VUaXxf0FEJ_G=C8)C-wD!DvhY+qQ#FT3}Th8;GgV&AV94F`D ztT6=w_Xm8)*)dBnDkZd~UWL|W=Glu!$hc|1w7_7l!3MAt95oIp4Xp{M%clu&TXehO z+L-1#{mjkpTF@?|w1P98OCky~S%@OR&o75P&ZHvC}Y=(2_{ib(-Al_7aZ^U?s34#H}= zGfFi5%KnFVCKtdO^>Htpb07#BeCXMDO8U}crpe1Gm`>Q=6qB4i=nLoLZ%p$TY=OcP z)r}Et-Ed??u~f09d3Nx3bS@ja!fV(Dfa5lXxRs#;8?Y8G+Qvz+iv7fiRkL3liip}) z&G0u8RdEC9c$$rdU53=MH`p!Jn|DHjhOxHK$tW_pw9wCTf0Eo<){HoN=zG!!Gq4z4 z7PwGh)VNPXW-cE#MtofE`-$9~nmmj}m zlzZscQ2+Jq%gaB9rMgVJkbhup0Ggpb)&L01T=%>n7-?v@I8!Q(p&+!fd+Y^Pu9l+u zek(_$^HYFVRRIFt@0Fp52g5Q#I`tC3li`;UtDLP*rA{-#Yoa5qp{cD)QYhldihWe+ zG~zuaqLY~$-1sjh2lkbXCX;lq+p~!2Z=76cvuQe*Fl>IFwpUBP+d^&E4BGc{m#l%Kuo6#{XGoRyFc%Hqhf|%nYd<;yiC>tyEyk z4I+a`(%%Ie=-*n z-{mg=j&t12)LH3R?@-B1tEb7FLMePI1HK0`Ae@#)KcS%!Qt9p4_fmBl5zhO10n401 zBSfnfJ;?_r{%R)hh}BBNSl=$BiAKbuWrNGQUZ)+0=Mt&5!X*D@yGCSaMNY&@`;^a4 z;v=%D_!K!WXV1!3%4P-M*s%V2b#2jF2bk!)#2GLVuGKd#vNpRMyg`kstw0GQ8@^k^ zuqK5uR<>FeRZ#3{%!|4X!hh7hgirQ@Mwg%%ez8pF!N$xhMNQN((yS(F2-OfduxxKE zxY#7O(VGfNuLv-ImAw5+h@gwn%!ER;*Q+001;W7W^waWT%@(T+5k!c3A-j)a8y11t zx4~rSN0s$M8HEOzkcWW4YbKK9GQez2XJ|Nq?TFy;jmGbg;`m&%U4hIiarKmdTHt#l zL=H;ZHE?fYxKQQXKnC+K!TAU}r086{4m}r()-QaFmU(qWhJlc$eas&y?=H9EYQy8N$8^bni9TpDp zkA^WRs?KgYgjxX4T6?`SMs$`s3vlut(YU~f2F+id(Rf_)$BIMibk9lACI~LA+i7xn z%-+=DHV*0TCTJp~-|$VZ@g2vmd*|2QXV;HeTzt530KyK>v&253N1l}bP_J#UjLy4) zBJili9#-ey8Kj(dxmW^ctorxd;te|xo)%46l%5qE-YhAjP`Cc03vT)vV&GAV%#Cgb zX~2}uWNvh`2<*AuxuJpq>SyNtZwzuU)r@@dqC@v=Ocd(HnnzytN+M&|Qi#f4Q8D=h ziE<3ziFW%+!yy(q{il8H44g^5{_+pH60Mx5Z*FgC_3hKxmeJ+wVuX?T#ZfOOD3E4C zRJsj#wA@3uvwZwHKKGN{{Ag+8^cs?S4N@6(Wkd$CkoCst(Z&hp+l=ffZ?2m%%ffI3 zdV7coR`R+*dPbNx=*ivWeNJK=Iy_vKd`-_Hng{l?hmp=|T3U&epbmgXXWs9ySE|=G zeQ|^ioL}tveN{s72_&h+F+W;G}?;?_s@h5>DX(rp#eaZ!E=NivgLI zWykLKev+}sHH41NCRm7W>K+_qdoJ8x9o5Cf!)|qLtF7Izxk*p|fX8UqEY)_sI_45O zL2u>x=r5xLE%s|d%MO>zU%KV6QKFiEeo12g#bhei4!Hm+`~Fo~4h|BJ)%ENxy9)Up zOxupSf1QZWun=)gF{L0YWJ<(r0?$bPFANrmphJ>kG`&7E+RgrWQi}ZS#-CQJ*i#8j zM_A0?w@4Mq@xvk^>QSvEU|VYQoVI=TaOrsLTa`RZfe8{9F~mM{L+C`9YP9?OknLw| zmkvz>cS6`pF0FYeLdY%>u&XpPj5$*iYkj=m7wMzHqzZ5SG~$i_^f@QEPEC+<2nf-{ zE7W+n%)q$!5@2pBuXMxhUSi*%F>e_g!$T-_`ovjBh(3jK9Q^~OR{)}!0}vdTE^M+m z9QWsA?xG>EW;U~5gEuKR)Ubfi&YWnXV;3H6Zt^NE725*`;lpSK4HS1sN?{~9a4JkD z%}23oAovytUKfRN87XTH2c=kq1)O5(fH_M3M-o{{@&~KD`~TRot-gqg7Q2U2o-iiF}K>m?CokhmODaLB z1p6(6JYGntNOg(s!(>ZU&lzDf+Ur)^Lirm%*}Z>T)9)fAZ9>k(kvnM;ab$ptA=hoh zVgsVaveXbMpm{|4*d<0>?l_JUFOO8A3xNLQOh%nVXjYI6X8h?a@6kDe5-m&;M0xqx z+1U$s>(P9P)f0!{z%M@E7|9nn#IWgEx6A6JNJ(7dk`%6$3@!C!l;JK-p2?gg+W|d- ziEzgk$w7k48NMqg$CM*4O~Abj3+_yUKTyK1p6GDsGEs;}=E_q>^LI-~pym$qhXPJf z2`!PJDp4l(TTm#|n@bN!j;-FFOM__eLl!6{*}z=)UAcGYloj?bv!-XY1TA6Xz;82J zLRaF{8ayzGa|}c--}|^xh)xgX>6R(sZD|Z|qX50gu=d`gEwHqC@WYU7{%<5VOnf9+ zB@FX?|UL%`8EIAe!*UdYl|6wRz6Y>(#8x92$#y}wMeE|ZM2X*c}dKJ^4NIf;Fm zNwzq%QcO?$NR-7`su!*$dlIKo2y(N;qgH@1|8QNo$0wbyyJ2^}$iZ>M{BhBjTdMjK z>gPEzgX4;g3$rU?jvDeOq`X=>)zdt|jk1Lv3u~bjHI=EGLfIR&+K3ldcc4D&Um&04 z3^F*}WaxR(ZyaB>DlmF_UP@+Q*h$&nsOB#gwLt{1#F4i-{A5J@`>B9@{^i?g_Ce&O z<<}_We-RUFU&&MHa1#t56u_oM(Ljn7djja!T|gcxSoR=)@?owC*NkDarpBj=W4}=i1@)@L|C) zQKA+o<(pMVp*Su(`zBC0l1yTa$MRfQ#uby|$mlOMs=G`4J|?apMzKei%jZql#gP@IkOaOjB7MJM=@1j(&!jNnyVkn5;4lvro1!vq ztXiV8HYj5%)r1PPpIOj)f!>pc^3#LvfZ(hz}C@-3R(Cx7R427*Fwd!XO z4~j&IkPHcBm0h_|iG;ZNrYdJ4HI!$rSyo&sibmwIgm1|J#g6%>=ML1r!kcEhm(XY& zD@mIJt;!O%WP7CE&wwE3?1-dt;RTHdm~LvP7K`ccWXkZ0kfFa2S;wGtx_a}S2lslw z$<4^Jg-n#Ypc(3t2N67Juasu=h)j&UNTPNDil4MQMTlnI81kY46uMH5B^U{~nmc6+ z9>(lGhhvRK9ITfpAD!XQ&BPphL3p8B4PVBN0NF6U49;ZA0Tr75AgGw7(S=Yio+xg_ zepZ*?V#KD;sHH+15ix&yCs0eSB-Z%D%uujlXvT#V$Rz@$+w!u#3GIo*AwMI#Bm^oO zLr1e}k5W~G0xaO!C%Mb{sarxWZ4%Dn9vG`KHmPC9GWZwOOm11XJp#o0-P-${3m4g( z6~)X9FXw%Xm~&99tj>a-ri})ZcnsfJtc10F@t9xF5vq6E)X!iUXHq-ohlO`gQdS&k zZl})3k||u)!_=nNlvMbz%AuIr89l#I$;rG}qvDGiK?xTd5HzMQkw*p$YvFLGyQM!J zNC^gD!kP{A84nGosi~@MLKqWQNacfs7O$dkZtm4-BZ~iA8xWZPkTK!HpA5zr!9Z&+icfAJ1)NWkTd!-9`NWU>9uXXUr;`Js#NbKFgrNhTcY4GNv*71}}T zFJh?>=EcbUd2<|fiL+H=wMw8hbX6?+_cl4XnCB#ddwdG>bki* zt*&6Dy&EIPluL@A3_;R%)shA-tDQA1!Tw4ffBRyy;2n)vm_JV06(4Or&QAOKNZB5f(MVC}&_!B>098R{Simr!UG}?CW1Ah+X+0#~0`X)od zLYablwmFxN21L))!_zc`IfzWi`5>MxPe(DmjjO1}HHt7TJtAW+VXHt!aKZk>y6PoMsbDXRJnov;D~Ur~2R_7(Xr)aa%wJwZhS3gr7IGgt%@;`jpL@gyc6bGCVx!9CE7NgIbUNZ!Ur1RHror0~ zr(j$^yM4j`#c2KxSP61;(Tk^pe7b~}LWj~SZC=MEpdKf;B@on9=?_n|R|0q;Y*1_@ z>nGq>)&q!;u-8H)WCwtL&7F4vbnnfSAlK1mwnRq2&gZrEr!b1MA z(3%vAbh3aU-IX`d7b@q`-WiT6eitu}ZH9x#d&qx}?CtDuAXak%5<-P!{a`V=$|XmJ zUn@4lX6#ulB@a=&-9HG)a>KkH=jE7>&S&N~0X0zD=Q=t|7w;kuh#cU=NN7gBGbQTT z;?bdSt8V&IIi}sDTzA0dkU}Z-Qvg;RDe8v>468p3*&hbGT1I3hi9hh~Z(!H}{+>eUyF)H&gdrX=k$aB%J6I;6+^^kn1mL+E+?A!A}@xV(Qa@M%HD5C@+-4Mb4lI=Xp=@9+^x+jhtOc zYgF2aVa(uSR*n(O)e6tf3JEg2xs#dJfhEmi1iOmDYWk|wXNHU?g23^IGKB&yHnsm7 zm_+;p?YpA#N*7vXCkeN2LTNG`{QDa#U3fcFz7SB)83=<8rF)|udrEbrZL$o6W?oDR zQx!178Ih9B#D9Ko$H(jD{4MME&<|6%MPu|TfOc#E0B}!j^MMpV69D#h2`vsEQ{(?c zJ3Lh!3&=yS5fWL~;1wCZ?)%nmK`Eqgcu)O6rD^3%ijcxL50^z?OI(LaVDvfL0#zjZ z2?cPvC$QCzpxpt5jMFp05OxhK0F!Q`rPhDi5)y=-0C} zIM~ku&S@pl1&0=jl+rlS<4`riV~LC-#pqNde@44MB(j%)On$0Ko(@q?4`1?4149Z_ zZi!5aU@2vM$dHR6WSZpj+VboK+>u-CbNi7*lw4K^ZxxM#24_Yc`jvb9NPVi75L+MlM^U~`;a7`4H0L|TYK>%hfEfXLsu1JGM zbh|8{wuc7ucV+`Ys1kqxsj`dajwyM;^X^`)#<+a~$WFy8b2t_RS{8yNYKKlnv+>vB zX(QTf$kqrJ;%I@EwEs{cIcH@Z3|#^S@M+5jsP<^`@8^I4_8MlBb`~cE^n+{{;qW2q z=p1=&+fUo%T{GhVX@;56kH8K_%?X=;$OTYqW1L*)hzelm^$*?_K;9JyIWhsn4SK(| zSmXLTUE8VQX{se#8#Rj*lz`xHtT<61V~fb;WZUpu(M)f#;I+2_zR+)y5Jv?l`CxAinx|EY!`IJ*x9_gf_k&Gx2alL!hK zUWj1T_pk|?iv}4EP#PZvYD_-LpzU!NfcLL%fK&r$W8O1KH9c2&GV~N#T$kaXGvAOl)|T zuF9%6(i=Y3q?X%VK-D2YIYFPH3f|g$TrXW->&^Ab`WT z7>Oo!u1u40?jAJ8Hy`bv}qbgs8)cF0&qeVjD?e+3Ggn1Im>K77ZSpbU*08 zfZkIFcv?y)!*B{|>nx@cE{KoutP+seQU?bCGE`tS0GKUO3PN~t=2u7q_6$l;uw^4c zVu^f{uaqsZ{*a-N?2B8ngrLS8E&s6}Xtv9rR9C^b`@q8*iH)pFzf1|kCfiLw6u{Z%aC z!X^5CzF6qofFJgklJV3oc|Qc2XdFl+y5M9*P8}A>Kh{ zWRgRwMSZ(?Jw;m%0etU5BsWT-Dj-5F;Q$OQJrQd+lv`i6>MhVo^p*^w6{~=fhe|bN z*37oV0kji)4an^%3ABbg5RC;CS50@PV5_hKfXjYx+(DqQdKC^JIEMo6X66$qDdLRc z!YJPSKnbY`#Ht6`g@xGzJmKzzn|abYbP+_Q(v?~~ z96%cd{E0BCsH^0HaWt{y(Cuto4VE7jhB1Z??#UaU(*R&Eo+J`UN+8mcb51F|I|n*J zJCZ3R*OdyeS9hWkc_mA7-br>3Tw=CX2bl(=TpVt#WP8Bg^vE_9bP&6ccAf3lFMgr` z{3=h@?Ftb$RTe&@IQtiJfV;O&4fzh)e1>7seG; z=%mA4@c7{aXeJnhEg2J@Bm;=)j=O=cl#^NNkQ<{r;Bm|8Hg}bJ-S^g4`|itx)~!LN zXtL}?f1Hs6UQ+f0-X6&TBCW=A4>bU0{rv8C4T!(wD-h>VCK4YJk`6C9$by!fxOYw- zV#n+0{E(0ttq_#16B} ze8$E#X9o{B!0vbq#WUwmv5Xz6{(!^~+}sBW{xctdNHL4^vDk!0E}(g|W_q;jR|ZK< z8w>H-8G{%R#%f!E7cO_^B?yFRKLOH)RT9GJsb+kAKq~}WIF)NRLwKZ^Q;>!2MNa|} z-mh?=B;*&D{Nd-mQRcfVnHkChI=DRHU4ga%xJ%+QkBd|-d9uRI76@BT(bjsjwS+r) zvx=lGNLv1?SzZ;P)Gnn>04fO7Culg*?LmbEF0fATG8S@)oJ>NT3pYAXa*vX!eUTDF ziBrp(QyDqr0ZMTr?4uG_Nqs6f%S0g?h`1vO5fo=5S&u#wI2d4+3hWiolEU!=3_oFo zfie?+4W#`;1dd#X@g9Yj<53S<6OB!TM8w8})7k-$&q5(smc%;r z(BlXkTp`C47+%4JA{2X}MIaPbVF!35P#p;u7+fR*46{T+LR8+j25oduCfDzDv6R-hU{TVVo9fz?^N3ShMt!t0NsH)pB zRK8-S{Dn*y3b|k^*?_B70<2gHt==l7c&cT>r`C#{S}J2;s#d{M)ncW(#Y$C*lByLQ z&?+{dR7*gpdT~(1;M(FfF==3z`^eW)=5a9RqvF-)2?S-(G zhS;p(u~_qBum*q}On@$#08}ynd0+spzyVco0%G6;<-i5&016cV5UKzhQ~)fX03|>L z8ej+HzzgVr6_5ZUpa4HW0Ca!=r1%*}Oo;2no&Zz8DfR)L!@r<5 z2viSZpmvo5XqXyAz{Ms7`7kX>fnr1gi4X~7KpznRT0{Xc5Cfz@43PjBMBoH@z_{~( z(Wd}IPJ9hH+%)Fc)0!hrV+(A;76rhtI|YHbEDeERV~Ya>SQg^IvlazFkSK(KG9&{q zkPIR~EeQaaBmwA<20}mBO?)N$(z1@p)5?%}rM| zGF()~Z&Kx@OIDRI$d0T8;JX@vj3^2%pd_+@l9~a4lntZ;AvUIjqIZbuNTR6@hNJoV zk4F;ut)LN4ARuyn2M6F~eg-e#UH%2P;8uPGFW^vq1vj8mdIayFOZo(tphk8C7hpT~ z1Fv8?b_LNR3QD9J+!v=p%}# + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/vraptor/src/main/webapp/vendor/bootstrap/fonts/glyphicons-halflings-regular.ttf b/vraptor/src/main/webapp/vendor/bootstrap/fonts/glyphicons-halflings-regular.ttf new file mode 100644 index 0000000000000000000000000000000000000000..1413fc609ab6f21774de0cb7e01360095584f65b GIT binary patch literal 45404 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 G`u_lkUM?>H literal 0 HcmV?d00001 diff --git a/vraptor/src/main/webapp/vendor/bootstrap/fonts/glyphicons-halflings-regular.woff2 b/vraptor/src/main/webapp/vendor/bootstrap/fonts/glyphicons-halflings-regular.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..64539b54c3751a6d9adb44c8e3a45ba5a73b77f0 GIT binary patch literal 18028 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 literal 0 HcmV?d00001 diff --git a/vraptor/src/main/webapp/vendor/bootstrap/js/bootstrap.js b/vraptor/src/main/webapp/vendor/bootstrap/js/bootstrap.js new file mode 100644 index 0000000000..8a2e99a535 --- /dev/null +++ b/vraptor/src/main/webapp/vendor/bootstrap/js/bootstrap.js @@ -0,0 +1,2377 @@ +/*! + * Bootstrap v3.3.7 (http://getbootstrap.com) + * Copyright 2011-2016 Twitter, Inc. + * Licensed under the MIT license + */ + +if (typeof jQuery === 'undefined') { + throw new Error('Bootstrap\'s JavaScript requires jQuery') +} + ++function ($) { + 'use strict'; + var version = $.fn.jquery.split(' ')[0].split('.') + if ((version[0] < 2 && version[1] < 9) || (version[0] == 1 && version[1] == 9 && version[2] < 1) || (version[0] > 3)) { + throw new Error('Bootstrap\'s JavaScript requires jQuery version 1.9.1 or higher, but lower than version 4') + } +}(jQuery); + +/* ======================================================================== + * Bootstrap: transition.js v3.3.7 + * http://getbootstrap.com/javascript/#transitions + * ======================================================================== + * Copyright 2011-2016 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + * ======================================================================== */ + + ++function ($) { + 'use strict'; + + // CSS TRANSITION SUPPORT (Shoutout: http://www.modernizr.com/) + // ============================================================ + + function transitionEnd() { + var el = document.createElement('bootstrap') + + var transEndEventNames = { + WebkitTransition : 'webkitTransitionEnd', + MozTransition : 'transitionend', + OTransition : 'oTransitionEnd otransitionend', + transition : 'transitionend' + } + + for (var name in transEndEventNames) { + if (el.style[name] !== undefined) { + return { end: transEndEventNames[name] } + } + } + + return false // explicit for ie8 ( ._.) + } + + // http://blog.alexmaccaw.com/css-transitions + $.fn.emulateTransitionEnd = function (duration) { + var called = false + var $el = this + $(this).one('bsTransitionEnd', function () { called = true }) + var callback = function () { if (!called) $($el).trigger($.support.transition.end) } + setTimeout(callback, duration) + return this + } + + $(function () { + $.support.transition = transitionEnd() + + if (!$.support.transition) return + + $.event.special.bsTransitionEnd = { + bindType: $.support.transition.end, + delegateType: $.support.transition.end, + handle: function (e) { + if ($(e.target).is(this)) return e.handleObj.handler.apply(this, arguments) + } + } + }) + +}(jQuery); + +/* ======================================================================== + * Bootstrap: alert.js v3.3.7 + * http://getbootstrap.com/javascript/#alerts + * ======================================================================== + * Copyright 2011-2016 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + * ======================================================================== */ + + ++function ($) { + 'use strict'; + + // ALERT CLASS DEFINITION + // ====================== + + var dismiss = '[data-dismiss="alert"]' + var Alert = function (el) { + $(el).on('click', dismiss, this.close) + } + + Alert.VERSION = '3.3.7' + + Alert.TRANSITION_DURATION = 150 + + Alert.prototype.close = function (e) { + var $this = $(this) + var selector = $this.attr('data-target') + + if (!selector) { + selector = $this.attr('href') + selector = selector && selector.replace(/.*(?=#[^\s]*$)/, '') // strip for ie7 + } + + var $parent = $(selector === '#' ? [] : selector) + + if (e) e.preventDefault() + + if (!$parent.length) { + $parent = $this.closest('.alert') + } + + $parent.trigger(e = $.Event('close.bs.alert')) + + if (e.isDefaultPrevented()) return + + $parent.removeClass('in') + + function removeElement() { + // detach from parent, fire event then clean up data + $parent.detach().trigger('closed.bs.alert').remove() + } + + $.support.transition && $parent.hasClass('fade') ? + $parent + .one('bsTransitionEnd', removeElement) + .emulateTransitionEnd(Alert.TRANSITION_DURATION) : + removeElement() + } + + + // ALERT PLUGIN DEFINITION + // ======================= + + function Plugin(option) { + return this.each(function () { + var $this = $(this) + var data = $this.data('bs.alert') + + if (!data) $this.data('bs.alert', (data = new Alert(this))) + if (typeof option == 'string') data[option].call($this) + }) + } + + var old = $.fn.alert + + $.fn.alert = Plugin + $.fn.alert.Constructor = Alert + + + // ALERT NO CONFLICT + // ================= + + $.fn.alert.noConflict = function () { + $.fn.alert = old + return this + } + + + // ALERT DATA-API + // ============== + + $(document).on('click.bs.alert.data-api', dismiss, Alert.prototype.close) + +}(jQuery); + +/* ======================================================================== + * Bootstrap: button.js v3.3.7 + * http://getbootstrap.com/javascript/#buttons + * ======================================================================== + * Copyright 2011-2016 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + * ======================================================================== */ + + ++function ($) { + 'use strict'; + + // BUTTON PUBLIC CLASS DEFINITION + // ============================== + + var Button = function (element, options) { + this.$element = $(element) + this.options = $.extend({}, Button.DEFAULTS, options) + this.isLoading = false + } + + Button.VERSION = '3.3.7' + + Button.DEFAULTS = { + loadingText: 'loading...' + } + + Button.prototype.setState = function (state) { + var d = 'disabled' + var $el = this.$element + var val = $el.is('input') ? 'val' : 'html' + var data = $el.data() + + state += 'Text' + + if (data.resetText == null) $el.data('resetText', $el[val]()) + + // push to event loop to allow forms to submit + setTimeout($.proxy(function () { + $el[val](data[state] == null ? this.options[state] : data[state]) + + if (state == 'loadingText') { + this.isLoading = true + $el.addClass(d).attr(d, d).prop(d, true) + } else if (this.isLoading) { + this.isLoading = false + $el.removeClass(d).removeAttr(d).prop(d, false) + } + }, this), 0) + } + + Button.prototype.toggle = function () { + var changed = true + var $parent = this.$element.closest('[data-toggle="buttons"]') + + if ($parent.length) { + var $input = this.$element.find('input') + if ($input.prop('type') == 'radio') { + if ($input.prop('checked')) changed = false + $parent.find('.active').removeClass('active') + this.$element.addClass('active') + } else if ($input.prop('type') == 'checkbox') { + if (($input.prop('checked')) !== this.$element.hasClass('active')) changed = false + this.$element.toggleClass('active') + } + $input.prop('checked', this.$element.hasClass('active')) + if (changed) $input.trigger('change') + } else { + this.$element.attr('aria-pressed', !this.$element.hasClass('active')) + this.$element.toggleClass('active') + } + } + + + // BUTTON PLUGIN DEFINITION + // ======================== + + function Plugin(option) { + return this.each(function () { + var $this = $(this) + var data = $this.data('bs.button') + var options = typeof option == 'object' && option + + if (!data) $this.data('bs.button', (data = new Button(this, options))) + + if (option == 'toggle') data.toggle() + else if (option) data.setState(option) + }) + } + + var old = $.fn.button + + $.fn.button = Plugin + $.fn.button.Constructor = Button + + + // BUTTON NO CONFLICT + // ================== + + $.fn.button.noConflict = function () { + $.fn.button = old + return this + } + + + // BUTTON DATA-API + // =============== + + $(document) + .on('click.bs.button.data-api', '[data-toggle^="button"]', function (e) { + var $btn = $(e.target).closest('.btn') + Plugin.call($btn, 'toggle') + if (!($(e.target).is('input[type="radio"], input[type="checkbox"]'))) { + // Prevent double click on radios, and the double selections (so cancellation) on checkboxes + e.preventDefault() + // The target component still receive the focus + if ($btn.is('input,button')) $btn.trigger('focus') + else $btn.find('input:visible,button:visible').first().trigger('focus') + } + }) + .on('focus.bs.button.data-api blur.bs.button.data-api', '[data-toggle^="button"]', function (e) { + $(e.target).closest('.btn').toggleClass('focus', /^focus(in)?$/.test(e.type)) + }) + +}(jQuery); + +/* ======================================================================== + * Bootstrap: carousel.js v3.3.7 + * http://getbootstrap.com/javascript/#carousel + * ======================================================================== + * Copyright 2011-2016 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + * ======================================================================== */ + + ++function ($) { + 'use strict'; + + // CAROUSEL CLASS DEFINITION + // ========================= + + var Carousel = function (element, options) { + this.$element = $(element) + this.$indicators = this.$element.find('.carousel-indicators') + this.options = options + this.paused = null + this.sliding = null + this.interval = null + this.$active = null + this.$items = null + + this.options.keyboard && this.$element.on('keydown.bs.carousel', $.proxy(this.keydown, this)) + + this.options.pause == 'hover' && !('ontouchstart' in document.documentElement) && this.$element + .on('mouseenter.bs.carousel', $.proxy(this.pause, this)) + .on('mouseleave.bs.carousel', $.proxy(this.cycle, this)) + } + + Carousel.VERSION = '3.3.7' + + Carousel.TRANSITION_DURATION = 600 + + Carousel.DEFAULTS = { + interval: 5000, + pause: 'hover', + wrap: true, + keyboard: true + } + + Carousel.prototype.keydown = function (e) { + if (/input|textarea/i.test(e.target.tagName)) return + switch (e.which) { + case 37: this.prev(); break + case 39: this.next(); break + default: return + } + + e.preventDefault() + } + + Carousel.prototype.cycle = function (e) { + e || (this.paused = false) + + this.interval && clearInterval(this.interval) + + this.options.interval + && !this.paused + && (this.interval = setInterval($.proxy(this.next, this), this.options.interval)) + + return this + } + + Carousel.prototype.getItemIndex = function (item) { + this.$items = item.parent().children('.item') + return this.$items.index(item || this.$active) + } + + Carousel.prototype.getItemForDirection = function (direction, active) { + var activeIndex = this.getItemIndex(active) + var willWrap = (direction == 'prev' && activeIndex === 0) + || (direction == 'next' && activeIndex == (this.$items.length - 1)) + if (willWrap && !this.options.wrap) return active + var delta = direction == 'prev' ? -1 : 1 + var itemIndex = (activeIndex + delta) % this.$items.length + return this.$items.eq(itemIndex) + } + + Carousel.prototype.to = function (pos) { + var that = this + var activeIndex = this.getItemIndex(this.$active = this.$element.find('.item.active')) + + if (pos > (this.$items.length - 1) || pos < 0) return + + if (this.sliding) return this.$element.one('slid.bs.carousel', function () { that.to(pos) }) // yes, "slid" + if (activeIndex == pos) return this.pause().cycle() + + return this.slide(pos > activeIndex ? 'next' : 'prev', this.$items.eq(pos)) + } + + Carousel.prototype.pause = function (e) { + e || (this.paused = true) + + if (this.$element.find('.next, .prev').length && $.support.transition) { + this.$element.trigger($.support.transition.end) + this.cycle(true) + } + + this.interval = clearInterval(this.interval) + + return this + } + + Carousel.prototype.next = function () { + if (this.sliding) return + return this.slide('next') + } + + Carousel.prototype.prev = function () { + if (this.sliding) return + return this.slide('prev') + } + + Carousel.prototype.slide = function (type, next) { + var $active = this.$element.find('.item.active') + var $next = next || this.getItemForDirection(type, $active) + var isCycling = this.interval + var direction = type == 'next' ? 'left' : 'right' + var that = this + + if ($next.hasClass('active')) return (this.sliding = false) + + var relatedTarget = $next[0] + var slideEvent = $.Event('slide.bs.carousel', { + relatedTarget: relatedTarget, + direction: direction + }) + this.$element.trigger(slideEvent) + if (slideEvent.isDefaultPrevented()) return + + this.sliding = true + + isCycling && this.pause() + + if (this.$indicators.length) { + this.$indicators.find('.active').removeClass('active') + var $nextIndicator = $(this.$indicators.children()[this.getItemIndex($next)]) + $nextIndicator && $nextIndicator.addClass('active') + } + + var slidEvent = $.Event('slid.bs.carousel', { relatedTarget: relatedTarget, direction: direction }) // yes, "slid" + if ($.support.transition && this.$element.hasClass('slide')) { + $next.addClass(type) + $next[0].offsetWidth // force reflow + $active.addClass(direction) + $next.addClass(direction) + $active + .one('bsTransitionEnd', function () { + $next.removeClass([type, direction].join(' ')).addClass('active') + $active.removeClass(['active', direction].join(' ')) + that.sliding = false + setTimeout(function () { + that.$element.trigger(slidEvent) + }, 0) + }) + .emulateTransitionEnd(Carousel.TRANSITION_DURATION) + } else { + $active.removeClass('active') + $next.addClass('active') + this.sliding = false + this.$element.trigger(slidEvent) + } + + isCycling && this.cycle() + + return this + } + + + // CAROUSEL PLUGIN DEFINITION + // ========================== + + function Plugin(option) { + return this.each(function () { + var $this = $(this) + var data = $this.data('bs.carousel') + var options = $.extend({}, Carousel.DEFAULTS, $this.data(), typeof option == 'object' && option) + var action = typeof option == 'string' ? option : options.slide + + if (!data) $this.data('bs.carousel', (data = new Carousel(this, options))) + if (typeof option == 'number') data.to(option) + else if (action) data[action]() + else if (options.interval) data.pause().cycle() + }) + } + + var old = $.fn.carousel + + $.fn.carousel = Plugin + $.fn.carousel.Constructor = Carousel + + + // CAROUSEL NO CONFLICT + // ==================== + + $.fn.carousel.noConflict = function () { + $.fn.carousel = old + return this + } + + + // CAROUSEL DATA-API + // ================= + + var clickHandler = function (e) { + var href + var $this = $(this) + var $target = $($this.attr('data-target') || (href = $this.attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '')) // strip for ie7 + if (!$target.hasClass('carousel')) return + var options = $.extend({}, $target.data(), $this.data()) + var slideIndex = $this.attr('data-slide-to') + if (slideIndex) options.interval = false + + Plugin.call($target, options) + + if (slideIndex) { + $target.data('bs.carousel').to(slideIndex) + } + + e.preventDefault() + } + + $(document) + .on('click.bs.carousel.data-api', '[data-slide]', clickHandler) + .on('click.bs.carousel.data-api', '[data-slide-to]', clickHandler) + + $(window).on('load', function () { + $('[data-ride="carousel"]').each(function () { + var $carousel = $(this) + Plugin.call($carousel, $carousel.data()) + }) + }) + +}(jQuery); + +/* ======================================================================== + * Bootstrap: collapse.js v3.3.7 + * http://getbootstrap.com/javascript/#collapse + * ======================================================================== + * Copyright 2011-2016 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + * ======================================================================== */ + +/* jshint latedef: false */ + ++function ($) { + 'use strict'; + + // COLLAPSE PUBLIC CLASS DEFINITION + // ================================ + + var Collapse = function (element, options) { + this.$element = $(element) + this.options = $.extend({}, Collapse.DEFAULTS, options) + this.$trigger = $('[data-toggle="collapse"][href="#' + element.id + '"],' + + '[data-toggle="collapse"][data-target="#' + element.id + '"]') + this.transitioning = null + + if (this.options.parent) { + this.$parent = this.getParent() + } else { + this.addAriaAndCollapsedClass(this.$element, this.$trigger) + } + + if (this.options.toggle) this.toggle() + } + + Collapse.VERSION = '3.3.7' + + Collapse.TRANSITION_DURATION = 350 + + Collapse.DEFAULTS = { + toggle: true + } + + Collapse.prototype.dimension = function () { + var hasWidth = this.$element.hasClass('width') + return hasWidth ? 'width' : 'height' + } + + Collapse.prototype.show = function () { + if (this.transitioning || this.$element.hasClass('in')) return + + var activesData + var actives = this.$parent && this.$parent.children('.panel').children('.in, .collapsing') + + if (actives && actives.length) { + activesData = actives.data('bs.collapse') + if (activesData && activesData.transitioning) return + } + + var startEvent = $.Event('show.bs.collapse') + this.$element.trigger(startEvent) + if (startEvent.isDefaultPrevented()) return + + if (actives && actives.length) { + Plugin.call(actives, 'hide') + activesData || actives.data('bs.collapse', null) + } + + var dimension = this.dimension() + + this.$element + .removeClass('collapse') + .addClass('collapsing')[dimension](0) + .attr('aria-expanded', true) + + this.$trigger + .removeClass('collapsed') + .attr('aria-expanded', true) + + this.transitioning = 1 + + var complete = function () { + this.$element + .removeClass('collapsing') + .addClass('collapse in')[dimension]('') + this.transitioning = 0 + this.$element + .trigger('shown.bs.collapse') + } + + if (!$.support.transition) return complete.call(this) + + var scrollSize = $.camelCase(['scroll', dimension].join('-')) + + this.$element + .one('bsTransitionEnd', $.proxy(complete, this)) + .emulateTransitionEnd(Collapse.TRANSITION_DURATION)[dimension](this.$element[0][scrollSize]) + } + + Collapse.prototype.hide = function () { + if (this.transitioning || !this.$element.hasClass('in')) return + + var startEvent = $.Event('hide.bs.collapse') + this.$element.trigger(startEvent) + if (startEvent.isDefaultPrevented()) return + + var dimension = this.dimension() + + this.$element[dimension](this.$element[dimension]())[0].offsetHeight + + this.$element + .addClass('collapsing') + .removeClass('collapse in') + .attr('aria-expanded', false) + + this.$trigger + .addClass('collapsed') + .attr('aria-expanded', false) + + this.transitioning = 1 + + var complete = function () { + this.transitioning = 0 + this.$element + .removeClass('collapsing') + .addClass('collapse') + .trigger('hidden.bs.collapse') + } + + if (!$.support.transition) return complete.call(this) + + this.$element + [dimension](0) + .one('bsTransitionEnd', $.proxy(complete, this)) + .emulateTransitionEnd(Collapse.TRANSITION_DURATION) + } + + Collapse.prototype.toggle = function () { + this[this.$element.hasClass('in') ? 'hide' : 'show']() + } + + Collapse.prototype.getParent = function () { + return $(this.options.parent) + .find('[data-toggle="collapse"][data-parent="' + this.options.parent + '"]') + .each($.proxy(function (i, element) { + var $element = $(element) + this.addAriaAndCollapsedClass(getTargetFromTrigger($element), $element) + }, this)) + .end() + } + + Collapse.prototype.addAriaAndCollapsedClass = function ($element, $trigger) { + var isOpen = $element.hasClass('in') + + $element.attr('aria-expanded', isOpen) + $trigger + .toggleClass('collapsed', !isOpen) + .attr('aria-expanded', isOpen) + } + + function getTargetFromTrigger($trigger) { + var href + var target = $trigger.attr('data-target') + || (href = $trigger.attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '') // strip for ie7 + + return $(target) + } + + + // COLLAPSE PLUGIN DEFINITION + // ========================== + + function Plugin(option) { + return this.each(function () { + var $this = $(this) + var data = $this.data('bs.collapse') + var options = $.extend({}, Collapse.DEFAULTS, $this.data(), typeof option == 'object' && option) + + if (!data && options.toggle && /show|hide/.test(option)) options.toggle = false + if (!data) $this.data('bs.collapse', (data = new Collapse(this, options))) + if (typeof option == 'string') data[option]() + }) + } + + var old = $.fn.collapse + + $.fn.collapse = Plugin + $.fn.collapse.Constructor = Collapse + + + // COLLAPSE NO CONFLICT + // ==================== + + $.fn.collapse.noConflict = function () { + $.fn.collapse = old + return this + } + + + // COLLAPSE DATA-API + // ================= + + $(document).on('click.bs.collapse.data-api', '[data-toggle="collapse"]', function (e) { + var $this = $(this) + + if (!$this.attr('data-target')) e.preventDefault() + + var $target = getTargetFromTrigger($this) + var data = $target.data('bs.collapse') + var option = data ? 'toggle' : $this.data() + + Plugin.call($target, option) + }) + +}(jQuery); + +/* ======================================================================== + * Bootstrap: dropdown.js v3.3.7 + * http://getbootstrap.com/javascript/#dropdowns + * ======================================================================== + * Copyright 2011-2016 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + * ======================================================================== */ + + ++function ($) { + 'use strict'; + + // DROPDOWN CLASS DEFINITION + // ========================= + + var backdrop = '.dropdown-backdrop' + var toggle = '[data-toggle="dropdown"]' + var Dropdown = function (element) { + $(element).on('click.bs.dropdown', this.toggle) + } + + Dropdown.VERSION = '3.3.7' + + function getParent($this) { + var selector = $this.attr('data-target') + + if (!selector) { + selector = $this.attr('href') + selector = selector && /#[A-Za-z]/.test(selector) && selector.replace(/.*(?=#[^\s]*$)/, '') // strip for ie7 + } + + var $parent = selector && $(selector) + + return $parent && $parent.length ? $parent : $this.parent() + } + + function clearMenus(e) { + if (e && e.which === 3) return + $(backdrop).remove() + $(toggle).each(function () { + var $this = $(this) + var $parent = getParent($this) + var relatedTarget = { relatedTarget: this } + + if (!$parent.hasClass('open')) return + + if (e && e.type == 'click' && /input|textarea/i.test(e.target.tagName) && $.contains($parent[0], e.target)) return + + $parent.trigger(e = $.Event('hide.bs.dropdown', relatedTarget)) + + if (e.isDefaultPrevented()) return + + $this.attr('aria-expanded', 'false') + $parent.removeClass('open').trigger($.Event('hidden.bs.dropdown', relatedTarget)) + }) + } + + Dropdown.prototype.toggle = function (e) { + var $this = $(this) + + if ($this.is('.disabled, :disabled')) return + + var $parent = getParent($this) + var isActive = $parent.hasClass('open') + + clearMenus() + + if (!isActive) { + if ('ontouchstart' in document.documentElement && !$parent.closest('.navbar-nav').length) { + // if mobile we use a backdrop because click events don't delegate + $(document.createElement('div')) + .addClass('dropdown-backdrop') + .insertAfter($(this)) + .on('click', clearMenus) + } + + var relatedTarget = { relatedTarget: this } + $parent.trigger(e = $.Event('show.bs.dropdown', relatedTarget)) + + if (e.isDefaultPrevented()) return + + $this + .trigger('focus') + .attr('aria-expanded', 'true') + + $parent + .toggleClass('open') + .trigger($.Event('shown.bs.dropdown', relatedTarget)) + } + + return false + } + + Dropdown.prototype.keydown = function (e) { + if (!/(38|40|27|32)/.test(e.which) || /input|textarea/i.test(e.target.tagName)) return + + var $this = $(this) + + e.preventDefault() + e.stopPropagation() + + if ($this.is('.disabled, :disabled')) return + + var $parent = getParent($this) + var isActive = $parent.hasClass('open') + + if (!isActive && e.which != 27 || isActive && e.which == 27) { + if (e.which == 27) $parent.find(toggle).trigger('focus') + return $this.trigger('click') + } + + var desc = ' li:not(.disabled):visible a' + var $items = $parent.find('.dropdown-menu' + desc) + + if (!$items.length) return + + var index = $items.index(e.target) + + if (e.which == 38 && index > 0) index-- // up + if (e.which == 40 && index < $items.length - 1) index++ // down + if (!~index) index = 0 + + $items.eq(index).trigger('focus') + } + + + // DROPDOWN PLUGIN DEFINITION + // ========================== + + function Plugin(option) { + return this.each(function () { + var $this = $(this) + var data = $this.data('bs.dropdown') + + if (!data) $this.data('bs.dropdown', (data = new Dropdown(this))) + if (typeof option == 'string') data[option].call($this) + }) + } + + var old = $.fn.dropdown + + $.fn.dropdown = Plugin + $.fn.dropdown.Constructor = Dropdown + + + // DROPDOWN NO CONFLICT + // ==================== + + $.fn.dropdown.noConflict = function () { + $.fn.dropdown = old + return this + } + + + // APPLY TO STANDARD DROPDOWN ELEMENTS + // =================================== + + $(document) + .on('click.bs.dropdown.data-api', clearMenus) + .on('click.bs.dropdown.data-api', '.dropdown form', function (e) { e.stopPropagation() }) + .on('click.bs.dropdown.data-api', toggle, Dropdown.prototype.toggle) + .on('keydown.bs.dropdown.data-api', toggle, Dropdown.prototype.keydown) + .on('keydown.bs.dropdown.data-api', '.dropdown-menu', Dropdown.prototype.keydown) + +}(jQuery); + +/* ======================================================================== + * Bootstrap: modal.js v3.3.7 + * http://getbootstrap.com/javascript/#modals + * ======================================================================== + * Copyright 2011-2016 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + * ======================================================================== */ + + ++function ($) { + 'use strict'; + + // MODAL CLASS DEFINITION + // ====================== + + var Modal = function (element, options) { + this.options = options + this.$body = $(document.body) + this.$element = $(element) + this.$dialog = this.$element.find('.modal-dialog') + this.$backdrop = null + this.isShown = null + this.originalBodyPad = null + this.scrollbarWidth = 0 + this.ignoreBackdropClick = false + + if (this.options.remote) { + this.$element + .find('.modal-content') + .load(this.options.remote, $.proxy(function () { + this.$element.trigger('loaded.bs.modal') + }, this)) + } + } + + Modal.VERSION = '3.3.7' + + Modal.TRANSITION_DURATION = 300 + Modal.BACKDROP_TRANSITION_DURATION = 150 + + Modal.DEFAULTS = { + backdrop: true, + keyboard: true, + show: true + } + + Modal.prototype.toggle = function (_relatedTarget) { + return this.isShown ? this.hide() : this.show(_relatedTarget) + } + + Modal.prototype.show = function (_relatedTarget) { + var that = this + var e = $.Event('show.bs.modal', { relatedTarget: _relatedTarget }) + + this.$element.trigger(e) + + if (this.isShown || e.isDefaultPrevented()) return + + this.isShown = true + + this.checkScrollbar() + this.setScrollbar() + this.$body.addClass('modal-open') + + this.escape() + this.resize() + + this.$element.on('click.dismiss.bs.modal', '[data-dismiss="modal"]', $.proxy(this.hide, this)) + + this.$dialog.on('mousedown.dismiss.bs.modal', function () { + that.$element.one('mouseup.dismiss.bs.modal', function (e) { + if ($(e.target).is(that.$element)) that.ignoreBackdropClick = true + }) + }) + + this.backdrop(function () { + var transition = $.support.transition && that.$element.hasClass('fade') + + if (!that.$element.parent().length) { + that.$element.appendTo(that.$body) // don't move modals dom position + } + + that.$element + .show() + .scrollTop(0) + + that.adjustDialog() + + if (transition) { + that.$element[0].offsetWidth // force reflow + } + + that.$element.addClass('in') + + that.enforceFocus() + + var e = $.Event('shown.bs.modal', { relatedTarget: _relatedTarget }) + + transition ? + that.$dialog // wait for modal to slide in + .one('bsTransitionEnd', function () { + that.$element.trigger('focus').trigger(e) + }) + .emulateTransitionEnd(Modal.TRANSITION_DURATION) : + that.$element.trigger('focus').trigger(e) + }) + } + + Modal.prototype.hide = function (e) { + if (e) e.preventDefault() + + e = $.Event('hide.bs.modal') + + this.$element.trigger(e) + + if (!this.isShown || e.isDefaultPrevented()) return + + this.isShown = false + + this.escape() + this.resize() + + $(document).off('focusin.bs.modal') + + this.$element + .removeClass('in') + .off('click.dismiss.bs.modal') + .off('mouseup.dismiss.bs.modal') + + this.$dialog.off('mousedown.dismiss.bs.modal') + + $.support.transition && this.$element.hasClass('fade') ? + this.$element + .one('bsTransitionEnd', $.proxy(this.hideModal, this)) + .emulateTransitionEnd(Modal.TRANSITION_DURATION) : + this.hideModal() + } + + Modal.prototype.enforceFocus = function () { + $(document) + .off('focusin.bs.modal') // guard against infinite focus loop + .on('focusin.bs.modal', $.proxy(function (e) { + if (document !== e.target && + this.$element[0] !== e.target && + !this.$element.has(e.target).length) { + this.$element.trigger('focus') + } + }, this)) + } + + Modal.prototype.escape = function () { + if (this.isShown && this.options.keyboard) { + this.$element.on('keydown.dismiss.bs.modal', $.proxy(function (e) { + e.which == 27 && this.hide() + }, this)) + } else if (!this.isShown) { + this.$element.off('keydown.dismiss.bs.modal') + } + } + + Modal.prototype.resize = function () { + if (this.isShown) { + $(window).on('resize.bs.modal', $.proxy(this.handleUpdate, this)) + } else { + $(window).off('resize.bs.modal') + } + } + + Modal.prototype.hideModal = function () { + var that = this + this.$element.hide() + this.backdrop(function () { + that.$body.removeClass('modal-open') + that.resetAdjustments() + that.resetScrollbar() + that.$element.trigger('hidden.bs.modal') + }) + } + + Modal.prototype.removeBackdrop = function () { + this.$backdrop && this.$backdrop.remove() + this.$backdrop = null + } + + Modal.prototype.backdrop = function (callback) { + var that = this + var animate = this.$element.hasClass('fade') ? 'fade' : '' + + if (this.isShown && this.options.backdrop) { + var doAnimate = $.support.transition && animate + + this.$backdrop = $(document.createElement('div')) + .addClass('modal-backdrop ' + animate) + .appendTo(this.$body) + + this.$element.on('click.dismiss.bs.modal', $.proxy(function (e) { + if (this.ignoreBackdropClick) { + this.ignoreBackdropClick = false + return + } + if (e.target !== e.currentTarget) return + this.options.backdrop == 'static' + ? this.$element[0].focus() + : this.hide() + }, this)) + + if (doAnimate) this.$backdrop[0].offsetWidth // force reflow + + this.$backdrop.addClass('in') + + if (!callback) return + + doAnimate ? + this.$backdrop + .one('bsTransitionEnd', callback) + .emulateTransitionEnd(Modal.BACKDROP_TRANSITION_DURATION) : + callback() + + } else if (!this.isShown && this.$backdrop) { + this.$backdrop.removeClass('in') + + var callbackRemove = function () { + that.removeBackdrop() + callback && callback() + } + $.support.transition && this.$element.hasClass('fade') ? + this.$backdrop + .one('bsTransitionEnd', callbackRemove) + .emulateTransitionEnd(Modal.BACKDROP_TRANSITION_DURATION) : + callbackRemove() + + } else if (callback) { + callback() + } + } + + // these following methods are used to handle overflowing modals + + Modal.prototype.handleUpdate = function () { + this.adjustDialog() + } + + Modal.prototype.adjustDialog = function () { + var modalIsOverflowing = this.$element[0].scrollHeight > document.documentElement.clientHeight + + this.$element.css({ + paddingLeft: !this.bodyIsOverflowing && modalIsOverflowing ? this.scrollbarWidth : '', + paddingRight: this.bodyIsOverflowing && !modalIsOverflowing ? this.scrollbarWidth : '' + }) + } + + Modal.prototype.resetAdjustments = function () { + this.$element.css({ + paddingLeft: '', + paddingRight: '' + }) + } + + Modal.prototype.checkScrollbar = function () { + var fullWindowWidth = window.innerWidth + if (!fullWindowWidth) { // workaround for missing window.innerWidth in IE8 + var documentElementRect = document.documentElement.getBoundingClientRect() + fullWindowWidth = documentElementRect.right - Math.abs(documentElementRect.left) + } + this.bodyIsOverflowing = document.body.clientWidth < fullWindowWidth + this.scrollbarWidth = this.measureScrollbar() + } + + Modal.prototype.setScrollbar = function () { + var bodyPad = parseInt((this.$body.css('padding-right') || 0), 10) + this.originalBodyPad = document.body.style.paddingRight || '' + if (this.bodyIsOverflowing) this.$body.css('padding-right', bodyPad + this.scrollbarWidth) + } + + Modal.prototype.resetScrollbar = function () { + this.$body.css('padding-right', this.originalBodyPad) + } + + Modal.prototype.measureScrollbar = function () { // thx walsh + var scrollDiv = document.createElement('div') + scrollDiv.className = 'modal-scrollbar-measure' + this.$body.append(scrollDiv) + var scrollbarWidth = scrollDiv.offsetWidth - scrollDiv.clientWidth + this.$body[0].removeChild(scrollDiv) + return scrollbarWidth + } + + + // MODAL PLUGIN DEFINITION + // ======================= + + function Plugin(option, _relatedTarget) { + return this.each(function () { + var $this = $(this) + var data = $this.data('bs.modal') + var options = $.extend({}, Modal.DEFAULTS, $this.data(), typeof option == 'object' && option) + + if (!data) $this.data('bs.modal', (data = new Modal(this, options))) + if (typeof option == 'string') data[option](_relatedTarget) + else if (options.show) data.show(_relatedTarget) + }) + } + + var old = $.fn.modal + + $.fn.modal = Plugin + $.fn.modal.Constructor = Modal + + + // MODAL NO CONFLICT + // ================= + + $.fn.modal.noConflict = function () { + $.fn.modal = old + return this + } + + + // MODAL DATA-API + // ============== + + $(document).on('click.bs.modal.data-api', '[data-toggle="modal"]', function (e) { + var $this = $(this) + var href = $this.attr('href') + var $target = $($this.attr('data-target') || (href && href.replace(/.*(?=#[^\s]+$)/, ''))) // strip for ie7 + var option = $target.data('bs.modal') ? 'toggle' : $.extend({ remote: !/#/.test(href) && href }, $target.data(), $this.data()) + + if ($this.is('a')) e.preventDefault() + + $target.one('show.bs.modal', function (showEvent) { + if (showEvent.isDefaultPrevented()) return // only register focus restorer if modal will actually get shown + $target.one('hidden.bs.modal', function () { + $this.is(':visible') && $this.trigger('focus') + }) + }) + Plugin.call($target, option, this) + }) + +}(jQuery); + +/* ======================================================================== + * Bootstrap: tooltip.js v3.3.7 + * http://getbootstrap.com/javascript/#tooltip + * Inspired by the original jQuery.tipsy by Jason Frame + * ======================================================================== + * Copyright 2011-2016 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + * ======================================================================== */ + + ++function ($) { + 'use strict'; + + // TOOLTIP PUBLIC CLASS DEFINITION + // =============================== + + var Tooltip = function (element, options) { + this.type = null + this.options = null + this.enabled = null + this.timeout = null + this.hoverState = null + this.$element = null + this.inState = null + + this.init('tooltip', element, options) + } + + Tooltip.VERSION = '3.3.7' + + Tooltip.TRANSITION_DURATION = 150 + + Tooltip.DEFAULTS = { + animation: true, + placement: 'top', + selector: false, + template: '', + trigger: 'hover focus', + title: '', + delay: 0, + html: false, + container: false, + viewport: { + selector: 'body', + padding: 0 + } + } + + Tooltip.prototype.init = function (type, element, options) { + this.enabled = true + this.type = type + this.$element = $(element) + this.options = this.getOptions(options) + this.$viewport = this.options.viewport && $($.isFunction(this.options.viewport) ? this.options.viewport.call(this, this.$element) : (this.options.viewport.selector || this.options.viewport)) + this.inState = { click: false, hover: false, focus: false } + + if (this.$element[0] instanceof document.constructor && !this.options.selector) { + throw new Error('`selector` option must be specified when initializing ' + this.type + ' on the window.document object!') + } + + var triggers = this.options.trigger.split(' ') + + for (var i = triggers.length; i--;) { + var trigger = triggers[i] + + if (trigger == 'click') { + this.$element.on('click.' + this.type, this.options.selector, $.proxy(this.toggle, this)) + } else if (trigger != 'manual') { + var eventIn = trigger == 'hover' ? 'mouseenter' : 'focusin' + var eventOut = trigger == 'hover' ? 'mouseleave' : 'focusout' + + this.$element.on(eventIn + '.' + this.type, this.options.selector, $.proxy(this.enter, this)) + this.$element.on(eventOut + '.' + this.type, this.options.selector, $.proxy(this.leave, this)) + } + } + + this.options.selector ? + (this._options = $.extend({}, this.options, { trigger: 'manual', selector: '' })) : + this.fixTitle() + } + + Tooltip.prototype.getDefaults = function () { + return Tooltip.DEFAULTS + } + + Tooltip.prototype.getOptions = function (options) { + options = $.extend({}, this.getDefaults(), this.$element.data(), options) + + if (options.delay && typeof options.delay == 'number') { + options.delay = { + show: options.delay, + hide: options.delay + } + } + + return options + } + + Tooltip.prototype.getDelegateOptions = function () { + var options = {} + var defaults = this.getDefaults() + + this._options && $.each(this._options, function (key, value) { + if (defaults[key] != value) options[key] = value + }) + + return options + } + + Tooltip.prototype.enter = function (obj) { + var self = obj instanceof this.constructor ? + obj : $(obj.currentTarget).data('bs.' + this.type) + + if (!self) { + self = new this.constructor(obj.currentTarget, this.getDelegateOptions()) + $(obj.currentTarget).data('bs.' + this.type, self) + } + + if (obj instanceof $.Event) { + self.inState[obj.type == 'focusin' ? 'focus' : 'hover'] = true + } + + if (self.tip().hasClass('in') || self.hoverState == 'in') { + self.hoverState = 'in' + return + } + + clearTimeout(self.timeout) + + self.hoverState = 'in' + + if (!self.options.delay || !self.options.delay.show) return self.show() + + self.timeout = setTimeout(function () { + if (self.hoverState == 'in') self.show() + }, self.options.delay.show) + } + + Tooltip.prototype.isInStateTrue = function () { + for (var key in this.inState) { + if (this.inState[key]) return true + } + + return false + } + + Tooltip.prototype.leave = function (obj) { + var self = obj instanceof this.constructor ? + obj : $(obj.currentTarget).data('bs.' + this.type) + + if (!self) { + self = new this.constructor(obj.currentTarget, this.getDelegateOptions()) + $(obj.currentTarget).data('bs.' + this.type, self) + } + + if (obj instanceof $.Event) { + self.inState[obj.type == 'focusout' ? 'focus' : 'hover'] = false + } + + if (self.isInStateTrue()) return + + clearTimeout(self.timeout) + + self.hoverState = 'out' + + if (!self.options.delay || !self.options.delay.hide) return self.hide() + + self.timeout = setTimeout(function () { + if (self.hoverState == 'out') self.hide() + }, self.options.delay.hide) + } + + Tooltip.prototype.show = function () { + var e = $.Event('show.bs.' + this.type) + + if (this.hasContent() && this.enabled) { + this.$element.trigger(e) + + var inDom = $.contains(this.$element[0].ownerDocument.documentElement, this.$element[0]) + if (e.isDefaultPrevented() || !inDom) return + var that = this + + var $tip = this.tip() + + var tipId = this.getUID(this.type) + + this.setContent() + $tip.attr('id', tipId) + this.$element.attr('aria-describedby', tipId) + + if (this.options.animation) $tip.addClass('fade') + + var placement = typeof this.options.placement == 'function' ? + this.options.placement.call(this, $tip[0], this.$element[0]) : + this.options.placement + + var autoToken = /\s?auto?\s?/i + var autoPlace = autoToken.test(placement) + if (autoPlace) placement = placement.replace(autoToken, '') || 'top' + + $tip + .detach() + .css({ top: 0, left: 0, display: 'block' }) + .addClass(placement) + .data('bs.' + this.type, this) + + this.options.container ? $tip.appendTo(this.options.container) : $tip.insertAfter(this.$element) + this.$element.trigger('inserted.bs.' + this.type) + + var pos = this.getPosition() + var actualWidth = $tip[0].offsetWidth + var actualHeight = $tip[0].offsetHeight + + if (autoPlace) { + var orgPlacement = placement + var viewportDim = this.getPosition(this.$viewport) + + placement = placement == 'bottom' && pos.bottom + actualHeight > viewportDim.bottom ? 'top' : + placement == 'top' && pos.top - actualHeight < viewportDim.top ? 'bottom' : + placement == 'right' && pos.right + actualWidth > viewportDim.width ? 'left' : + placement == 'left' && pos.left - actualWidth < viewportDim.left ? 'right' : + placement + + $tip + .removeClass(orgPlacement) + .addClass(placement) + } + + var calculatedOffset = this.getCalculatedOffset(placement, pos, actualWidth, actualHeight) + + this.applyPlacement(calculatedOffset, placement) + + var complete = function () { + var prevHoverState = that.hoverState + that.$element.trigger('shown.bs.' + that.type) + that.hoverState = null + + if (prevHoverState == 'out') that.leave(that) + } + + $.support.transition && this.$tip.hasClass('fade') ? + $tip + .one('bsTransitionEnd', complete) + .emulateTransitionEnd(Tooltip.TRANSITION_DURATION) : + complete() + } + } + + Tooltip.prototype.applyPlacement = function (offset, placement) { + var $tip = this.tip() + var width = $tip[0].offsetWidth + var height = $tip[0].offsetHeight + + // manually read margins because getBoundingClientRect includes difference + var marginTop = parseInt($tip.css('margin-top'), 10) + var marginLeft = parseInt($tip.css('margin-left'), 10) + + // we must check for NaN for ie 8/9 + if (isNaN(marginTop)) marginTop = 0 + if (isNaN(marginLeft)) marginLeft = 0 + + offset.top += marginTop + offset.left += marginLeft + + // $.fn.offset doesn't round pixel values + // so we use setOffset directly with our own function B-0 + $.offset.setOffset($tip[0], $.extend({ + using: function (props) { + $tip.css({ + top: Math.round(props.top), + left: Math.round(props.left) + }) + } + }, offset), 0) + + $tip.addClass('in') + + // check to see if placing tip in new offset caused the tip to resize itself + var actualWidth = $tip[0].offsetWidth + var actualHeight = $tip[0].offsetHeight + + if (placement == 'top' && actualHeight != height) { + offset.top = offset.top + height - actualHeight + } + + var delta = this.getViewportAdjustedDelta(placement, offset, actualWidth, actualHeight) + + if (delta.left) offset.left += delta.left + else offset.top += delta.top + + var isVertical = /top|bottom/.test(placement) + var arrowDelta = isVertical ? delta.left * 2 - width + actualWidth : delta.top * 2 - height + actualHeight + var arrowOffsetPosition = isVertical ? 'offsetWidth' : 'offsetHeight' + + $tip.offset(offset) + this.replaceArrow(arrowDelta, $tip[0][arrowOffsetPosition], isVertical) + } + + Tooltip.prototype.replaceArrow = function (delta, dimension, isVertical) { + this.arrow() + .css(isVertical ? 'left' : 'top', 50 * (1 - delta / dimension) + '%') + .css(isVertical ? 'top' : 'left', '') + } + + Tooltip.prototype.setContent = function () { + var $tip = this.tip() + var title = this.getTitle() + + $tip.find('.tooltip-inner')[this.options.html ? 'html' : 'text'](title) + $tip.removeClass('fade in top bottom left right') + } + + Tooltip.prototype.hide = function (callback) { + var that = this + var $tip = $(this.$tip) + var e = $.Event('hide.bs.' + this.type) + + function complete() { + if (that.hoverState != 'in') $tip.detach() + if (that.$element) { // TODO: Check whether guarding this code with this `if` is really necessary. + that.$element + .removeAttr('aria-describedby') + .trigger('hidden.bs.' + that.type) + } + callback && callback() + } + + this.$element.trigger(e) + + if (e.isDefaultPrevented()) return + + $tip.removeClass('in') + + $.support.transition && $tip.hasClass('fade') ? + $tip + .one('bsTransitionEnd', complete) + .emulateTransitionEnd(Tooltip.TRANSITION_DURATION) : + complete() + + this.hoverState = null + + return this + } + + Tooltip.prototype.fixTitle = function () { + var $e = this.$element + if ($e.attr('title') || typeof $e.attr('data-original-title') != 'string') { + $e.attr('data-original-title', $e.attr('title') || '').attr('title', '') + } + } + + Tooltip.prototype.hasContent = function () { + return this.getTitle() + } + + Tooltip.prototype.getPosition = function ($element) { + $element = $element || this.$element + + var el = $element[0] + var isBody = el.tagName == 'BODY' + + var elRect = el.getBoundingClientRect() + if (elRect.width == null) { + // width and height are missing in IE8, so compute them manually; see https://github.com/twbs/bootstrap/issues/14093 + elRect = $.extend({}, elRect, { width: elRect.right - elRect.left, height: elRect.bottom - elRect.top }) + } + var isSvg = window.SVGElement && el instanceof window.SVGElement + // Avoid using $.offset() on SVGs since it gives incorrect results in jQuery 3. + // See https://github.com/twbs/bootstrap/issues/20280 + var elOffset = isBody ? { top: 0, left: 0 } : (isSvg ? null : $element.offset()) + var scroll = { scroll: isBody ? document.documentElement.scrollTop || document.body.scrollTop : $element.scrollTop() } + var outerDims = isBody ? { width: $(window).width(), height: $(window).height() } : null + + return $.extend({}, elRect, scroll, outerDims, elOffset) + } + + Tooltip.prototype.getCalculatedOffset = function (placement, pos, actualWidth, actualHeight) { + return placement == 'bottom' ? { top: pos.top + pos.height, left: pos.left + pos.width / 2 - actualWidth / 2 } : + placement == 'top' ? { top: pos.top - actualHeight, left: pos.left + pos.width / 2 - actualWidth / 2 } : + placement == 'left' ? { top: pos.top + pos.height / 2 - actualHeight / 2, left: pos.left - actualWidth } : + /* placement == 'right' */ { top: pos.top + pos.height / 2 - actualHeight / 2, left: pos.left + pos.width } + + } + + Tooltip.prototype.getViewportAdjustedDelta = function (placement, pos, actualWidth, actualHeight) { + var delta = { top: 0, left: 0 } + if (!this.$viewport) return delta + + var viewportPadding = this.options.viewport && this.options.viewport.padding || 0 + var viewportDimensions = this.getPosition(this.$viewport) + + if (/right|left/.test(placement)) { + var topEdgeOffset = pos.top - viewportPadding - viewportDimensions.scroll + var bottomEdgeOffset = pos.top + viewportPadding - viewportDimensions.scroll + actualHeight + if (topEdgeOffset < viewportDimensions.top) { // top overflow + delta.top = viewportDimensions.top - topEdgeOffset + } else if (bottomEdgeOffset > viewportDimensions.top + viewportDimensions.height) { // bottom overflow + delta.top = viewportDimensions.top + viewportDimensions.height - bottomEdgeOffset + } + } else { + var leftEdgeOffset = pos.left - viewportPadding + var rightEdgeOffset = pos.left + viewportPadding + actualWidth + if (leftEdgeOffset < viewportDimensions.left) { // left overflow + delta.left = viewportDimensions.left - leftEdgeOffset + } else if (rightEdgeOffset > viewportDimensions.right) { // right overflow + delta.left = viewportDimensions.left + viewportDimensions.width - rightEdgeOffset + } + } + + return delta + } + + Tooltip.prototype.getTitle = function () { + var title + var $e = this.$element + var o = this.options + + title = $e.attr('data-original-title') + || (typeof o.title == 'function' ? o.title.call($e[0]) : o.title) + + return title + } + + Tooltip.prototype.getUID = function (prefix) { + do prefix += ~~(Math.random() * 1000000) + while (document.getElementById(prefix)) + return prefix + } + + Tooltip.prototype.tip = function () { + if (!this.$tip) { + this.$tip = $(this.options.template) + if (this.$tip.length != 1) { + throw new Error(this.type + ' `template` option must consist of exactly 1 top-level element!') + } + } + return this.$tip + } + + Tooltip.prototype.arrow = function () { + return (this.$arrow = this.$arrow || this.tip().find('.tooltip-arrow')) + } + + Tooltip.prototype.enable = function () { + this.enabled = true + } + + Tooltip.prototype.disable = function () { + this.enabled = false + } + + Tooltip.prototype.toggleEnabled = function () { + this.enabled = !this.enabled + } + + Tooltip.prototype.toggle = function (e) { + var self = this + if (e) { + self = $(e.currentTarget).data('bs.' + this.type) + if (!self) { + self = new this.constructor(e.currentTarget, this.getDelegateOptions()) + $(e.currentTarget).data('bs.' + this.type, self) + } + } + + if (e) { + self.inState.click = !self.inState.click + if (self.isInStateTrue()) self.enter(self) + else self.leave(self) + } else { + self.tip().hasClass('in') ? self.leave(self) : self.enter(self) + } + } + + Tooltip.prototype.destroy = function () { + var that = this + clearTimeout(this.timeout) + this.hide(function () { + that.$element.off('.' + that.type).removeData('bs.' + that.type) + if (that.$tip) { + that.$tip.detach() + } + that.$tip = null + that.$arrow = null + that.$viewport = null + that.$element = null + }) + } + + + // TOOLTIP PLUGIN DEFINITION + // ========================= + + function Plugin(option) { + return this.each(function () { + var $this = $(this) + var data = $this.data('bs.tooltip') + var options = typeof option == 'object' && option + + if (!data && /destroy|hide/.test(option)) return + if (!data) $this.data('bs.tooltip', (data = new Tooltip(this, options))) + if (typeof option == 'string') data[option]() + }) + } + + var old = $.fn.tooltip + + $.fn.tooltip = Plugin + $.fn.tooltip.Constructor = Tooltip + + + // TOOLTIP NO CONFLICT + // =================== + + $.fn.tooltip.noConflict = function () { + $.fn.tooltip = old + return this + } + +}(jQuery); + +/* ======================================================================== + * Bootstrap: popover.js v3.3.7 + * http://getbootstrap.com/javascript/#popovers + * ======================================================================== + * Copyright 2011-2016 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + * ======================================================================== */ + + ++function ($) { + 'use strict'; + + // POPOVER PUBLIC CLASS DEFINITION + // =============================== + + var Popover = function (element, options) { + this.init('popover', element, options) + } + + if (!$.fn.tooltip) throw new Error('Popover requires tooltip.js') + + Popover.VERSION = '3.3.7' + + Popover.DEFAULTS = $.extend({}, $.fn.tooltip.Constructor.DEFAULTS, { + placement: 'right', + trigger: 'click', + content: '', + template: '' + }) + + + // NOTE: POPOVER EXTENDS tooltip.js + // ================================ + + Popover.prototype = $.extend({}, $.fn.tooltip.Constructor.prototype) + + Popover.prototype.constructor = Popover + + Popover.prototype.getDefaults = function () { + return Popover.DEFAULTS + } + + Popover.prototype.setContent = function () { + var $tip = this.tip() + var title = this.getTitle() + var content = this.getContent() + + $tip.find('.popover-title')[this.options.html ? 'html' : 'text'](title) + $tip.find('.popover-content').children().detach().end()[ // we use append for html objects to maintain js events + this.options.html ? (typeof content == 'string' ? 'html' : 'append') : 'text' + ](content) + + $tip.removeClass('fade top bottom left right in') + + // IE8 doesn't accept hiding via the `:empty` pseudo selector, we have to do + // this manually by checking the contents. + if (!$tip.find('.popover-title').html()) $tip.find('.popover-title').hide() + } + + Popover.prototype.hasContent = function () { + return this.getTitle() || this.getContent() + } + + Popover.prototype.getContent = function () { + var $e = this.$element + var o = this.options + + return $e.attr('data-content') + || (typeof o.content == 'function' ? + o.content.call($e[0]) : + o.content) + } + + Popover.prototype.arrow = function () { + return (this.$arrow = this.$arrow || this.tip().find('.arrow')) + } + + + // POPOVER PLUGIN DEFINITION + // ========================= + + function Plugin(option) { + return this.each(function () { + var $this = $(this) + var data = $this.data('bs.popover') + var options = typeof option == 'object' && option + + if (!data && /destroy|hide/.test(option)) return + if (!data) $this.data('bs.popover', (data = new Popover(this, options))) + if (typeof option == 'string') data[option]() + }) + } + + var old = $.fn.popover + + $.fn.popover = Plugin + $.fn.popover.Constructor = Popover + + + // POPOVER NO CONFLICT + // =================== + + $.fn.popover.noConflict = function () { + $.fn.popover = old + return this + } + +}(jQuery); + +/* ======================================================================== + * Bootstrap: scrollspy.js v3.3.7 + * http://getbootstrap.com/javascript/#scrollspy + * ======================================================================== + * Copyright 2011-2016 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + * ======================================================================== */ + + ++function ($) { + 'use strict'; + + // SCROLLSPY CLASS DEFINITION + // ========================== + + function ScrollSpy(element, options) { + this.$body = $(document.body) + this.$scrollElement = $(element).is(document.body) ? $(window) : $(element) + this.options = $.extend({}, ScrollSpy.DEFAULTS, options) + this.selector = (this.options.target || '') + ' .nav li > a' + this.offsets = [] + this.targets = [] + this.activeTarget = null + this.scrollHeight = 0 + + this.$scrollElement.on('scroll.bs.scrollspy', $.proxy(this.process, this)) + this.refresh() + this.process() + } + + ScrollSpy.VERSION = '3.3.7' + + ScrollSpy.DEFAULTS = { + offset: 10 + } + + ScrollSpy.prototype.getScrollHeight = function () { + return this.$scrollElement[0].scrollHeight || Math.max(this.$body[0].scrollHeight, document.documentElement.scrollHeight) + } + + ScrollSpy.prototype.refresh = function () { + var that = this + var offsetMethod = 'offset' + var offsetBase = 0 + + this.offsets = [] + this.targets = [] + this.scrollHeight = this.getScrollHeight() + + if (!$.isWindow(this.$scrollElement[0])) { + offsetMethod = 'position' + offsetBase = this.$scrollElement.scrollTop() + } + + this.$body + .find(this.selector) + .map(function () { + var $el = $(this) + var href = $el.data('target') || $el.attr('href') + var $href = /^#./.test(href) && $(href) + + return ($href + && $href.length + && $href.is(':visible') + && [[$href[offsetMethod]().top + offsetBase, href]]) || null + }) + .sort(function (a, b) { return a[0] - b[0] }) + .each(function () { + that.offsets.push(this[0]) + that.targets.push(this[1]) + }) + } + + ScrollSpy.prototype.process = function () { + var scrollTop = this.$scrollElement.scrollTop() + this.options.offset + var scrollHeight = this.getScrollHeight() + var maxScroll = this.options.offset + scrollHeight - this.$scrollElement.height() + var offsets = this.offsets + var targets = this.targets + var activeTarget = this.activeTarget + var i + + if (this.scrollHeight != scrollHeight) { + this.refresh() + } + + if (scrollTop >= maxScroll) { + return activeTarget != (i = targets[targets.length - 1]) && this.activate(i) + } + + if (activeTarget && scrollTop < offsets[0]) { + this.activeTarget = null + return this.clear() + } + + for (i = offsets.length; i--;) { + activeTarget != targets[i] + && scrollTop >= offsets[i] + && (offsets[i + 1] === undefined || scrollTop < offsets[i + 1]) + && this.activate(targets[i]) + } + } + + ScrollSpy.prototype.activate = function (target) { + this.activeTarget = target + + this.clear() + + var selector = this.selector + + '[data-target="' + target + '"],' + + this.selector + '[href="' + target + '"]' + + var active = $(selector) + .parents('li') + .addClass('active') + + if (active.parent('.dropdown-menu').length) { + active = active + .closest('li.dropdown') + .addClass('active') + } + + active.trigger('activate.bs.scrollspy') + } + + ScrollSpy.prototype.clear = function () { + $(this.selector) + .parentsUntil(this.options.target, '.active') + .removeClass('active') + } + + + // SCROLLSPY PLUGIN DEFINITION + // =========================== + + function Plugin(option) { + return this.each(function () { + var $this = $(this) + var data = $this.data('bs.scrollspy') + var options = typeof option == 'object' && option + + if (!data) $this.data('bs.scrollspy', (data = new ScrollSpy(this, options))) + if (typeof option == 'string') data[option]() + }) + } + + var old = $.fn.scrollspy + + $.fn.scrollspy = Plugin + $.fn.scrollspy.Constructor = ScrollSpy + + + // SCROLLSPY NO CONFLICT + // ===================== + + $.fn.scrollspy.noConflict = function () { + $.fn.scrollspy = old + return this + } + + + // SCROLLSPY DATA-API + // ================== + + $(window).on('load.bs.scrollspy.data-api', function () { + $('[data-spy="scroll"]').each(function () { + var $spy = $(this) + Plugin.call($spy, $spy.data()) + }) + }) + +}(jQuery); + +/* ======================================================================== + * Bootstrap: tab.js v3.3.7 + * http://getbootstrap.com/javascript/#tabs + * ======================================================================== + * Copyright 2011-2016 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + * ======================================================================== */ + + ++function ($) { + 'use strict'; + + // TAB CLASS DEFINITION + // ==================== + + var Tab = function (element) { + // jscs:disable requireDollarBeforejQueryAssignment + this.element = $(element) + // jscs:enable requireDollarBeforejQueryAssignment + } + + Tab.VERSION = '3.3.7' + + Tab.TRANSITION_DURATION = 150 + + Tab.prototype.show = function () { + var $this = this.element + var $ul = $this.closest('ul:not(.dropdown-menu)') + var selector = $this.data('target') + + if (!selector) { + selector = $this.attr('href') + selector = selector && selector.replace(/.*(?=#[^\s]*$)/, '') // strip for ie7 + } + + if ($this.parent('li').hasClass('active')) return + + var $previous = $ul.find('.active:last a') + var hideEvent = $.Event('hide.bs.tab', { + relatedTarget: $this[0] + }) + var showEvent = $.Event('show.bs.tab', { + relatedTarget: $previous[0] + }) + + $previous.trigger(hideEvent) + $this.trigger(showEvent) + + if (showEvent.isDefaultPrevented() || hideEvent.isDefaultPrevented()) return + + var $target = $(selector) + + this.activate($this.closest('li'), $ul) + this.activate($target, $target.parent(), function () { + $previous.trigger({ + type: 'hidden.bs.tab', + relatedTarget: $this[0] + }) + $this.trigger({ + type: 'shown.bs.tab', + relatedTarget: $previous[0] + }) + }) + } + + Tab.prototype.activate = function (element, container, callback) { + var $active = container.find('> .active') + var transition = callback + && $.support.transition + && ($active.length && $active.hasClass('fade') || !!container.find('> .fade').length) + + function next() { + $active + .removeClass('active') + .find('> .dropdown-menu > .active') + .removeClass('active') + .end() + .find('[data-toggle="tab"]') + .attr('aria-expanded', false) + + element + .addClass('active') + .find('[data-toggle="tab"]') + .attr('aria-expanded', true) + + if (transition) { + element[0].offsetWidth // reflow for transition + element.addClass('in') + } else { + element.removeClass('fade') + } + + if (element.parent('.dropdown-menu').length) { + element + .closest('li.dropdown') + .addClass('active') + .end() + .find('[data-toggle="tab"]') + .attr('aria-expanded', true) + } + + callback && callback() + } + + $active.length && transition ? + $active + .one('bsTransitionEnd', next) + .emulateTransitionEnd(Tab.TRANSITION_DURATION) : + next() + + $active.removeClass('in') + } + + + // TAB PLUGIN DEFINITION + // ===================== + + function Plugin(option) { + return this.each(function () { + var $this = $(this) + var data = $this.data('bs.tab') + + if (!data) $this.data('bs.tab', (data = new Tab(this))) + if (typeof option == 'string') data[option]() + }) + } + + var old = $.fn.tab + + $.fn.tab = Plugin + $.fn.tab.Constructor = Tab + + + // TAB NO CONFLICT + // =============== + + $.fn.tab.noConflict = function () { + $.fn.tab = old + return this + } + + + // TAB DATA-API + // ============ + + var clickHandler = function (e) { + e.preventDefault() + Plugin.call($(this), 'show') + } + + $(document) + .on('click.bs.tab.data-api', '[data-toggle="tab"]', clickHandler) + .on('click.bs.tab.data-api', '[data-toggle="pill"]', clickHandler) + +}(jQuery); + +/* ======================================================================== + * Bootstrap: affix.js v3.3.7 + * http://getbootstrap.com/javascript/#affix + * ======================================================================== + * Copyright 2011-2016 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + * ======================================================================== */ + + ++function ($) { + 'use strict'; + + // AFFIX CLASS DEFINITION + // ====================== + + var Affix = function (element, options) { + this.options = $.extend({}, Affix.DEFAULTS, options) + + this.$target = $(this.options.target) + .on('scroll.bs.affix.data-api', $.proxy(this.checkPosition, this)) + .on('click.bs.affix.data-api', $.proxy(this.checkPositionWithEventLoop, this)) + + this.$element = $(element) + this.affixed = null + this.unpin = null + this.pinnedOffset = null + + this.checkPosition() + } + + Affix.VERSION = '3.3.7' + + Affix.RESET = 'affix affix-top affix-bottom' + + Affix.DEFAULTS = { + offset: 0, + target: window + } + + Affix.prototype.getState = function (scrollHeight, height, offsetTop, offsetBottom) { + var scrollTop = this.$target.scrollTop() + var position = this.$element.offset() + var targetHeight = this.$target.height() + + if (offsetTop != null && this.affixed == 'top') return scrollTop < offsetTop ? 'top' : false + + if (this.affixed == 'bottom') { + if (offsetTop != null) return (scrollTop + this.unpin <= position.top) ? false : 'bottom' + return (scrollTop + targetHeight <= scrollHeight - offsetBottom) ? false : 'bottom' + } + + var initializing = this.affixed == null + var colliderTop = initializing ? scrollTop : position.top + var colliderHeight = initializing ? targetHeight : height + + if (offsetTop != null && scrollTop <= offsetTop) return 'top' + if (offsetBottom != null && (colliderTop + colliderHeight >= scrollHeight - offsetBottom)) return 'bottom' + + return false + } + + Affix.prototype.getPinnedOffset = function () { + if (this.pinnedOffset) return this.pinnedOffset + this.$element.removeClass(Affix.RESET).addClass('affix') + var scrollTop = this.$target.scrollTop() + var position = this.$element.offset() + return (this.pinnedOffset = position.top - scrollTop) + } + + Affix.prototype.checkPositionWithEventLoop = function () { + setTimeout($.proxy(this.checkPosition, this), 1) + } + + Affix.prototype.checkPosition = function () { + if (!this.$element.is(':visible')) return + + var height = this.$element.height() + var offset = this.options.offset + var offsetTop = offset.top + var offsetBottom = offset.bottom + var scrollHeight = Math.max($(document).height(), $(document.body).height()) + + if (typeof offset != 'object') offsetBottom = offsetTop = offset + if (typeof offsetTop == 'function') offsetTop = offset.top(this.$element) + if (typeof offsetBottom == 'function') offsetBottom = offset.bottom(this.$element) + + var affix = this.getState(scrollHeight, height, offsetTop, offsetBottom) + + if (this.affixed != affix) { + if (this.unpin != null) this.$element.css('top', '') + + var affixType = 'affix' + (affix ? '-' + affix : '') + var e = $.Event(affixType + '.bs.affix') + + this.$element.trigger(e) + + if (e.isDefaultPrevented()) return + + this.affixed = affix + this.unpin = affix == 'bottom' ? this.getPinnedOffset() : null + + this.$element + .removeClass(Affix.RESET) + .addClass(affixType) + .trigger(affixType.replace('affix', 'affixed') + '.bs.affix') + } + + if (affix == 'bottom') { + this.$element.offset({ + top: scrollHeight - height - offsetBottom + }) + } + } + + + // AFFIX PLUGIN DEFINITION + // ======================= + + function Plugin(option) { + return this.each(function () { + var $this = $(this) + var data = $this.data('bs.affix') + var options = typeof option == 'object' && option + + if (!data) $this.data('bs.affix', (data = new Affix(this, options))) + if (typeof option == 'string') data[option]() + }) + } + + var old = $.fn.affix + + $.fn.affix = Plugin + $.fn.affix.Constructor = Affix + + + // AFFIX NO CONFLICT + // ================= + + $.fn.affix.noConflict = function () { + $.fn.affix = old + return this + } + + + // AFFIX DATA-API + // ============== + + $(window).on('load', function () { + $('[data-spy="affix"]').each(function () { + var $spy = $(this) + var data = $spy.data() + + data.offset = data.offset || {} + + if (data.offsetBottom != null) data.offset.bottom = data.offsetBottom + if (data.offsetTop != null) data.offset.top = data.offsetTop + + Plugin.call($spy, data) + }) + }) + +}(jQuery); diff --git a/vraptor/src/main/webapp/vendor/bootstrap/js/bootstrap.min.js b/vraptor/src/main/webapp/vendor/bootstrap/js/bootstrap.min.js new file mode 100644 index 0000000000..9bcd2fccae --- /dev/null +++ b/vraptor/src/main/webapp/vendor/bootstrap/js/bootstrap.min.js @@ -0,0 +1,7 @@ +/*! + * Bootstrap v3.3.7 (http://getbootstrap.com) + * Copyright 2011-2016 Twitter, Inc. + * Licensed under the MIT license + */ +if("undefined"==typeof jQuery)throw new Error("Bootstrap's JavaScript requires jQuery");+function(a){"use strict";var b=a.fn.jquery.split(" ")[0].split(".");if(b[0]<2&&b[1]<9||1==b[0]&&9==b[1]&&b[2]<1||b[0]>3)throw new Error("Bootstrap's JavaScript requires jQuery version 1.9.1 or higher, but lower than version 4")}(jQuery),+function(a){"use strict";function b(){var a=document.createElement("bootstrap"),b={WebkitTransition:"webkitTransitionEnd",MozTransition:"transitionend",OTransition:"oTransitionEnd otransitionend",transition:"transitionend"};for(var c in b)if(void 0!==a.style[c])return{end:b[c]};return!1}a.fn.emulateTransitionEnd=function(b){var c=!1,d=this;a(this).one("bsTransitionEnd",function(){c=!0});var e=function(){c||a(d).trigger(a.support.transition.end)};return setTimeout(e,b),this},a(function(){a.support.transition=b(),a.support.transition&&(a.event.special.bsTransitionEnd={bindType:a.support.transition.end,delegateType:a.support.transition.end,handle:function(b){if(a(b.target).is(this))return b.handleObj.handler.apply(this,arguments)}})})}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var c=a(this),e=c.data("bs.alert");e||c.data("bs.alert",e=new d(this)),"string"==typeof b&&e[b].call(c)})}var c='[data-dismiss="alert"]',d=function(b){a(b).on("click",c,this.close)};d.VERSION="3.3.7",d.TRANSITION_DURATION=150,d.prototype.close=function(b){function c(){g.detach().trigger("closed.bs.alert").remove()}var e=a(this),f=e.attr("data-target");f||(f=e.attr("href"),f=f&&f.replace(/.*(?=#[^\s]*$)/,""));var g=a("#"===f?[]:f);b&&b.preventDefault(),g.length||(g=e.closest(".alert")),g.trigger(b=a.Event("close.bs.alert")),b.isDefaultPrevented()||(g.removeClass("in"),a.support.transition&&g.hasClass("fade")?g.one("bsTransitionEnd",c).emulateTransitionEnd(d.TRANSITION_DURATION):c())};var e=a.fn.alert;a.fn.alert=b,a.fn.alert.Constructor=d,a.fn.alert.noConflict=function(){return a.fn.alert=e,this},a(document).on("click.bs.alert.data-api",c,d.prototype.close)}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.button"),f="object"==typeof b&&b;e||d.data("bs.button",e=new c(this,f)),"toggle"==b?e.toggle():b&&e.setState(b)})}var c=function(b,d){this.$element=a(b),this.options=a.extend({},c.DEFAULTS,d),this.isLoading=!1};c.VERSION="3.3.7",c.DEFAULTS={loadingText:"loading..."},c.prototype.setState=function(b){var c="disabled",d=this.$element,e=d.is("input")?"val":"html",f=d.data();b+="Text",null==f.resetText&&d.data("resetText",d[e]()),setTimeout(a.proxy(function(){d[e](null==f[b]?this.options[b]:f[b]),"loadingText"==b?(this.isLoading=!0,d.addClass(c).attr(c,c).prop(c,!0)):this.isLoading&&(this.isLoading=!1,d.removeClass(c).removeAttr(c).prop(c,!1))},this),0)},c.prototype.toggle=function(){var a=!0,b=this.$element.closest('[data-toggle="buttons"]');if(b.length){var c=this.$element.find("input");"radio"==c.prop("type")?(c.prop("checked")&&(a=!1),b.find(".active").removeClass("active"),this.$element.addClass("active")):"checkbox"==c.prop("type")&&(c.prop("checked")!==this.$element.hasClass("active")&&(a=!1),this.$element.toggleClass("active")),c.prop("checked",this.$element.hasClass("active")),a&&c.trigger("change")}else this.$element.attr("aria-pressed",!this.$element.hasClass("active")),this.$element.toggleClass("active")};var d=a.fn.button;a.fn.button=b,a.fn.button.Constructor=c,a.fn.button.noConflict=function(){return a.fn.button=d,this},a(document).on("click.bs.button.data-api",'[data-toggle^="button"]',function(c){var d=a(c.target).closest(".btn");b.call(d,"toggle"),a(c.target).is('input[type="radio"], input[type="checkbox"]')||(c.preventDefault(),d.is("input,button")?d.trigger("focus"):d.find("input:visible,button:visible").first().trigger("focus"))}).on("focus.bs.button.data-api blur.bs.button.data-api",'[data-toggle^="button"]',function(b){a(b.target).closest(".btn").toggleClass("focus",/^focus(in)?$/.test(b.type))})}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.carousel"),f=a.extend({},c.DEFAULTS,d.data(),"object"==typeof b&&b),g="string"==typeof b?b:f.slide;e||d.data("bs.carousel",e=new c(this,f)),"number"==typeof b?e.to(b):g?e[g]():f.interval&&e.pause().cycle()})}var c=function(b,c){this.$element=a(b),this.$indicators=this.$element.find(".carousel-indicators"),this.options=c,this.paused=null,this.sliding=null,this.interval=null,this.$active=null,this.$items=null,this.options.keyboard&&this.$element.on("keydown.bs.carousel",a.proxy(this.keydown,this)),"hover"==this.options.pause&&!("ontouchstart"in document.documentElement)&&this.$element.on("mouseenter.bs.carousel",a.proxy(this.pause,this)).on("mouseleave.bs.carousel",a.proxy(this.cycle,this))};c.VERSION="3.3.7",c.TRANSITION_DURATION=600,c.DEFAULTS={interval:5e3,pause:"hover",wrap:!0,keyboard:!0},c.prototype.keydown=function(a){if(!/input|textarea/i.test(a.target.tagName)){switch(a.which){case 37:this.prev();break;case 39:this.next();break;default:return}a.preventDefault()}},c.prototype.cycle=function(b){return b||(this.paused=!1),this.interval&&clearInterval(this.interval),this.options.interval&&!this.paused&&(this.interval=setInterval(a.proxy(this.next,this),this.options.interval)),this},c.prototype.getItemIndex=function(a){return this.$items=a.parent().children(".item"),this.$items.index(a||this.$active)},c.prototype.getItemForDirection=function(a,b){var c=this.getItemIndex(b),d="prev"==a&&0===c||"next"==a&&c==this.$items.length-1;if(d&&!this.options.wrap)return b;var e="prev"==a?-1:1,f=(c+e)%this.$items.length;return this.$items.eq(f)},c.prototype.to=function(a){var b=this,c=this.getItemIndex(this.$active=this.$element.find(".item.active"));if(!(a>this.$items.length-1||a<0))return this.sliding?this.$element.one("slid.bs.carousel",function(){b.to(a)}):c==a?this.pause().cycle():this.slide(a>c?"next":"prev",this.$items.eq(a))},c.prototype.pause=function(b){return b||(this.paused=!0),this.$element.find(".next, .prev").length&&a.support.transition&&(this.$element.trigger(a.support.transition.end),this.cycle(!0)),this.interval=clearInterval(this.interval),this},c.prototype.next=function(){if(!this.sliding)return this.slide("next")},c.prototype.prev=function(){if(!this.sliding)return this.slide("prev")},c.prototype.slide=function(b,d){var e=this.$element.find(".item.active"),f=d||this.getItemForDirection(b,e),g=this.interval,h="next"==b?"left":"right",i=this;if(f.hasClass("active"))return this.sliding=!1;var j=f[0],k=a.Event("slide.bs.carousel",{relatedTarget:j,direction:h});if(this.$element.trigger(k),!k.isDefaultPrevented()){if(this.sliding=!0,g&&this.pause(),this.$indicators.length){this.$indicators.find(".active").removeClass("active");var l=a(this.$indicators.children()[this.getItemIndex(f)]);l&&l.addClass("active")}var m=a.Event("slid.bs.carousel",{relatedTarget:j,direction:h});return a.support.transition&&this.$element.hasClass("slide")?(f.addClass(b),f[0].offsetWidth,e.addClass(h),f.addClass(h),e.one("bsTransitionEnd",function(){f.removeClass([b,h].join(" ")).addClass("active"),e.removeClass(["active",h].join(" ")),i.sliding=!1,setTimeout(function(){i.$element.trigger(m)},0)}).emulateTransitionEnd(c.TRANSITION_DURATION)):(e.removeClass("active"),f.addClass("active"),this.sliding=!1,this.$element.trigger(m)),g&&this.cycle(),this}};var d=a.fn.carousel;a.fn.carousel=b,a.fn.carousel.Constructor=c,a.fn.carousel.noConflict=function(){return a.fn.carousel=d,this};var e=function(c){var d,e=a(this),f=a(e.attr("data-target")||(d=e.attr("href"))&&d.replace(/.*(?=#[^\s]+$)/,""));if(f.hasClass("carousel")){var g=a.extend({},f.data(),e.data()),h=e.attr("data-slide-to");h&&(g.interval=!1),b.call(f,g),h&&f.data("bs.carousel").to(h),c.preventDefault()}};a(document).on("click.bs.carousel.data-api","[data-slide]",e).on("click.bs.carousel.data-api","[data-slide-to]",e),a(window).on("load",function(){a('[data-ride="carousel"]').each(function(){var c=a(this);b.call(c,c.data())})})}(jQuery),+function(a){"use strict";function b(b){var c,d=b.attr("data-target")||(c=b.attr("href"))&&c.replace(/.*(?=#[^\s]+$)/,"");return a(d)}function c(b){return this.each(function(){var c=a(this),e=c.data("bs.collapse"),f=a.extend({},d.DEFAULTS,c.data(),"object"==typeof b&&b);!e&&f.toggle&&/show|hide/.test(b)&&(f.toggle=!1),e||c.data("bs.collapse",e=new d(this,f)),"string"==typeof b&&e[b]()})}var d=function(b,c){this.$element=a(b),this.options=a.extend({},d.DEFAULTS,c),this.$trigger=a('[data-toggle="collapse"][href="#'+b.id+'"],[data-toggle="collapse"][data-target="#'+b.id+'"]'),this.transitioning=null,this.options.parent?this.$parent=this.getParent():this.addAriaAndCollapsedClass(this.$element,this.$trigger),this.options.toggle&&this.toggle()};d.VERSION="3.3.7",d.TRANSITION_DURATION=350,d.DEFAULTS={toggle:!0},d.prototype.dimension=function(){var a=this.$element.hasClass("width");return a?"width":"height"},d.prototype.show=function(){if(!this.transitioning&&!this.$element.hasClass("in")){var b,e=this.$parent&&this.$parent.children(".panel").children(".in, .collapsing");if(!(e&&e.length&&(b=e.data("bs.collapse"),b&&b.transitioning))){var f=a.Event("show.bs.collapse");if(this.$element.trigger(f),!f.isDefaultPrevented()){e&&e.length&&(c.call(e,"hide"),b||e.data("bs.collapse",null));var g=this.dimension();this.$element.removeClass("collapse").addClass("collapsing")[g](0).attr("aria-expanded",!0),this.$trigger.removeClass("collapsed").attr("aria-expanded",!0),this.transitioning=1;var h=function(){this.$element.removeClass("collapsing").addClass("collapse in")[g](""),this.transitioning=0,this.$element.trigger("shown.bs.collapse")};if(!a.support.transition)return h.call(this);var i=a.camelCase(["scroll",g].join("-"));this.$element.one("bsTransitionEnd",a.proxy(h,this)).emulateTransitionEnd(d.TRANSITION_DURATION)[g](this.$element[0][i])}}}},d.prototype.hide=function(){if(!this.transitioning&&this.$element.hasClass("in")){var b=a.Event("hide.bs.collapse");if(this.$element.trigger(b),!b.isDefaultPrevented()){var c=this.dimension();this.$element[c](this.$element[c]())[0].offsetHeight,this.$element.addClass("collapsing").removeClass("collapse in").attr("aria-expanded",!1),this.$trigger.addClass("collapsed").attr("aria-expanded",!1),this.transitioning=1;var e=function(){this.transitioning=0,this.$element.removeClass("collapsing").addClass("collapse").trigger("hidden.bs.collapse")};return a.support.transition?void this.$element[c](0).one("bsTransitionEnd",a.proxy(e,this)).emulateTransitionEnd(d.TRANSITION_DURATION):e.call(this)}}},d.prototype.toggle=function(){this[this.$element.hasClass("in")?"hide":"show"]()},d.prototype.getParent=function(){return a(this.options.parent).find('[data-toggle="collapse"][data-parent="'+this.options.parent+'"]').each(a.proxy(function(c,d){var e=a(d);this.addAriaAndCollapsedClass(b(e),e)},this)).end()},d.prototype.addAriaAndCollapsedClass=function(a,b){var c=a.hasClass("in");a.attr("aria-expanded",c),b.toggleClass("collapsed",!c).attr("aria-expanded",c)};var e=a.fn.collapse;a.fn.collapse=c,a.fn.collapse.Constructor=d,a.fn.collapse.noConflict=function(){return a.fn.collapse=e,this},a(document).on("click.bs.collapse.data-api",'[data-toggle="collapse"]',function(d){var e=a(this);e.attr("data-target")||d.preventDefault();var f=b(e),g=f.data("bs.collapse"),h=g?"toggle":e.data();c.call(f,h)})}(jQuery),+function(a){"use strict";function b(b){var c=b.attr("data-target");c||(c=b.attr("href"),c=c&&/#[A-Za-z]/.test(c)&&c.replace(/.*(?=#[^\s]*$)/,""));var d=c&&a(c);return d&&d.length?d:b.parent()}function c(c){c&&3===c.which||(a(e).remove(),a(f).each(function(){var d=a(this),e=b(d),f={relatedTarget:this};e.hasClass("open")&&(c&&"click"==c.type&&/input|textarea/i.test(c.target.tagName)&&a.contains(e[0],c.target)||(e.trigger(c=a.Event("hide.bs.dropdown",f)),c.isDefaultPrevented()||(d.attr("aria-expanded","false"),e.removeClass("open").trigger(a.Event("hidden.bs.dropdown",f)))))}))}function d(b){return this.each(function(){var c=a(this),d=c.data("bs.dropdown");d||c.data("bs.dropdown",d=new g(this)),"string"==typeof b&&d[b].call(c)})}var e=".dropdown-backdrop",f='[data-toggle="dropdown"]',g=function(b){a(b).on("click.bs.dropdown",this.toggle)};g.VERSION="3.3.7",g.prototype.toggle=function(d){var e=a(this);if(!e.is(".disabled, :disabled")){var f=b(e),g=f.hasClass("open");if(c(),!g){"ontouchstart"in document.documentElement&&!f.closest(".navbar-nav").length&&a(document.createElement("div")).addClass("dropdown-backdrop").insertAfter(a(this)).on("click",c);var h={relatedTarget:this};if(f.trigger(d=a.Event("show.bs.dropdown",h)),d.isDefaultPrevented())return;e.trigger("focus").attr("aria-expanded","true"),f.toggleClass("open").trigger(a.Event("shown.bs.dropdown",h))}return!1}},g.prototype.keydown=function(c){if(/(38|40|27|32)/.test(c.which)&&!/input|textarea/i.test(c.target.tagName)){var d=a(this);if(c.preventDefault(),c.stopPropagation(),!d.is(".disabled, :disabled")){var e=b(d),g=e.hasClass("open");if(!g&&27!=c.which||g&&27==c.which)return 27==c.which&&e.find(f).trigger("focus"),d.trigger("click");var h=" li:not(.disabled):visible a",i=e.find(".dropdown-menu"+h);if(i.length){var j=i.index(c.target);38==c.which&&j>0&&j--,40==c.which&&jdocument.documentElement.clientHeight;this.$element.css({paddingLeft:!this.bodyIsOverflowing&&a?this.scrollbarWidth:"",paddingRight:this.bodyIsOverflowing&&!a?this.scrollbarWidth:""})},c.prototype.resetAdjustments=function(){this.$element.css({paddingLeft:"",paddingRight:""})},c.prototype.checkScrollbar=function(){var a=window.innerWidth;if(!a){var b=document.documentElement.getBoundingClientRect();a=b.right-Math.abs(b.left)}this.bodyIsOverflowing=document.body.clientWidth
',trigger:"hover focus",title:"",delay:0,html:!1,container:!1,viewport:{selector:"body",padding:0}},c.prototype.init=function(b,c,d){if(this.enabled=!0,this.type=b,this.$element=a(c),this.options=this.getOptions(d),this.$viewport=this.options.viewport&&a(a.isFunction(this.options.viewport)?this.options.viewport.call(this,this.$element):this.options.viewport.selector||this.options.viewport),this.inState={click:!1,hover:!1,focus:!1},this.$element[0]instanceof document.constructor&&!this.options.selector)throw new Error("`selector` option must be specified when initializing "+this.type+" on the window.document object!");for(var e=this.options.trigger.split(" "),f=e.length;f--;){var g=e[f];if("click"==g)this.$element.on("click."+this.type,this.options.selector,a.proxy(this.toggle,this));else if("manual"!=g){var h="hover"==g?"mouseenter":"focusin",i="hover"==g?"mouseleave":"focusout";this.$element.on(h+"."+this.type,this.options.selector,a.proxy(this.enter,this)),this.$element.on(i+"."+this.type,this.options.selector,a.proxy(this.leave,this))}}this.options.selector?this._options=a.extend({},this.options,{trigger:"manual",selector:""}):this.fixTitle()},c.prototype.getDefaults=function(){return c.DEFAULTS},c.prototype.getOptions=function(b){return b=a.extend({},this.getDefaults(),this.$element.data(),b),b.delay&&"number"==typeof b.delay&&(b.delay={show:b.delay,hide:b.delay}),b},c.prototype.getDelegateOptions=function(){var b={},c=this.getDefaults();return this._options&&a.each(this._options,function(a,d){c[a]!=d&&(b[a]=d)}),b},c.prototype.enter=function(b){var c=b instanceof this.constructor?b:a(b.currentTarget).data("bs."+this.type);return c||(c=new this.constructor(b.currentTarget,this.getDelegateOptions()),a(b.currentTarget).data("bs."+this.type,c)),b instanceof a.Event&&(c.inState["focusin"==b.type?"focus":"hover"]=!0),c.tip().hasClass("in")||"in"==c.hoverState?void(c.hoverState="in"):(clearTimeout(c.timeout),c.hoverState="in",c.options.delay&&c.options.delay.show?void(c.timeout=setTimeout(function(){"in"==c.hoverState&&c.show()},c.options.delay.show)):c.show())},c.prototype.isInStateTrue=function(){for(var a in this.inState)if(this.inState[a])return!0;return!1},c.prototype.leave=function(b){var c=b instanceof this.constructor?b:a(b.currentTarget).data("bs."+this.type);if(c||(c=new this.constructor(b.currentTarget,this.getDelegateOptions()),a(b.currentTarget).data("bs."+this.type,c)),b instanceof a.Event&&(c.inState["focusout"==b.type?"focus":"hover"]=!1),!c.isInStateTrue())return clearTimeout(c.timeout),c.hoverState="out",c.options.delay&&c.options.delay.hide?void(c.timeout=setTimeout(function(){"out"==c.hoverState&&c.hide()},c.options.delay.hide)):c.hide()},c.prototype.show=function(){var b=a.Event("show.bs."+this.type);if(this.hasContent()&&this.enabled){this.$element.trigger(b);var d=a.contains(this.$element[0].ownerDocument.documentElement,this.$element[0]);if(b.isDefaultPrevented()||!d)return;var e=this,f=this.tip(),g=this.getUID(this.type);this.setContent(),f.attr("id",g),this.$element.attr("aria-describedby",g),this.options.animation&&f.addClass("fade");var h="function"==typeof this.options.placement?this.options.placement.call(this,f[0],this.$element[0]):this.options.placement,i=/\s?auto?\s?/i,j=i.test(h);j&&(h=h.replace(i,"")||"top"),f.detach().css({top:0,left:0,display:"block"}).addClass(h).data("bs."+this.type,this),this.options.container?f.appendTo(this.options.container):f.insertAfter(this.$element),this.$element.trigger("inserted.bs."+this.type);var k=this.getPosition(),l=f[0].offsetWidth,m=f[0].offsetHeight;if(j){var n=h,o=this.getPosition(this.$viewport);h="bottom"==h&&k.bottom+m>o.bottom?"top":"top"==h&&k.top-mo.width?"left":"left"==h&&k.left-lg.top+g.height&&(e.top=g.top+g.height-i)}else{var j=b.left-f,k=b.left+f+c;jg.right&&(e.left=g.left+g.width-k)}return e},c.prototype.getTitle=function(){var a,b=this.$element,c=this.options;return a=b.attr("data-original-title")||("function"==typeof c.title?c.title.call(b[0]):c.title)},c.prototype.getUID=function(a){do a+=~~(1e6*Math.random());while(document.getElementById(a));return a},c.prototype.tip=function(){if(!this.$tip&&(this.$tip=a(this.options.template),1!=this.$tip.length))throw new Error(this.type+" `template` option must consist of exactly 1 top-level element!");return this.$tip},c.prototype.arrow=function(){return this.$arrow=this.$arrow||this.tip().find(".tooltip-arrow")},c.prototype.enable=function(){this.enabled=!0},c.prototype.disable=function(){this.enabled=!1},c.prototype.toggleEnabled=function(){this.enabled=!this.enabled},c.prototype.toggle=function(b){var c=this;b&&(c=a(b.currentTarget).data("bs."+this.type),c||(c=new this.constructor(b.currentTarget,this.getDelegateOptions()),a(b.currentTarget).data("bs."+this.type,c))),b?(c.inState.click=!c.inState.click,c.isInStateTrue()?c.enter(c):c.leave(c)):c.tip().hasClass("in")?c.leave(c):c.enter(c)},c.prototype.destroy=function(){var a=this;clearTimeout(this.timeout),this.hide(function(){a.$element.off("."+a.type).removeData("bs."+a.type),a.$tip&&a.$tip.detach(),a.$tip=null,a.$arrow=null,a.$viewport=null,a.$element=null})};var d=a.fn.tooltip;a.fn.tooltip=b,a.fn.tooltip.Constructor=c,a.fn.tooltip.noConflict=function(){return a.fn.tooltip=d,this}}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.popover"),f="object"==typeof b&&b;!e&&/destroy|hide/.test(b)||(e||d.data("bs.popover",e=new c(this,f)),"string"==typeof b&&e[b]())})}var c=function(a,b){this.init("popover",a,b)};if(!a.fn.tooltip)throw new Error("Popover requires tooltip.js");c.VERSION="3.3.7",c.DEFAULTS=a.extend({},a.fn.tooltip.Constructor.DEFAULTS,{placement:"right",trigger:"click",content:"",template:''}),c.prototype=a.extend({},a.fn.tooltip.Constructor.prototype),c.prototype.constructor=c,c.prototype.getDefaults=function(){return c.DEFAULTS},c.prototype.setContent=function(){var a=this.tip(),b=this.getTitle(),c=this.getContent();a.find(".popover-title")[this.options.html?"html":"text"](b),a.find(".popover-content").children().detach().end()[this.options.html?"string"==typeof c?"html":"append":"text"](c),a.removeClass("fade top bottom left right in"),a.find(".popover-title").html()||a.find(".popover-title").hide()},c.prototype.hasContent=function(){return this.getTitle()||this.getContent()},c.prototype.getContent=function(){var a=this.$element,b=this.options;return a.attr("data-content")||("function"==typeof b.content?b.content.call(a[0]):b.content)},c.prototype.arrow=function(){return this.$arrow=this.$arrow||this.tip().find(".arrow")};var d=a.fn.popover;a.fn.popover=b,a.fn.popover.Constructor=c,a.fn.popover.noConflict=function(){return a.fn.popover=d,this}}(jQuery),+function(a){"use strict";function b(c,d){this.$body=a(document.body),this.$scrollElement=a(a(c).is(document.body)?window:c),this.options=a.extend({},b.DEFAULTS,d),this.selector=(this.options.target||"")+" .nav li > a",this.offsets=[],this.targets=[],this.activeTarget=null,this.scrollHeight=0,this.$scrollElement.on("scroll.bs.scrollspy",a.proxy(this.process,this)),this.refresh(),this.process()}function c(c){return this.each(function(){var d=a(this),e=d.data("bs.scrollspy"),f="object"==typeof c&&c;e||d.data("bs.scrollspy",e=new b(this,f)),"string"==typeof c&&e[c]()})}b.VERSION="3.3.7",b.DEFAULTS={offset:10},b.prototype.getScrollHeight=function(){return this.$scrollElement[0].scrollHeight||Math.max(this.$body[0].scrollHeight,document.documentElement.scrollHeight)},b.prototype.refresh=function(){var b=this,c="offset",d=0;this.offsets=[],this.targets=[],this.scrollHeight=this.getScrollHeight(),a.isWindow(this.$scrollElement[0])||(c="position",d=this.$scrollElement.scrollTop()),this.$body.find(this.selector).map(function(){var b=a(this),e=b.data("target")||b.attr("href"),f=/^#./.test(e)&&a(e);return f&&f.length&&f.is(":visible")&&[[f[c]().top+d,e]]||null}).sort(function(a,b){return a[0]-b[0]}).each(function(){b.offsets.push(this[0]),b.targets.push(this[1])})},b.prototype.process=function(){var a,b=this.$scrollElement.scrollTop()+this.options.offset,c=this.getScrollHeight(),d=this.options.offset+c-this.$scrollElement.height(),e=this.offsets,f=this.targets,g=this.activeTarget;if(this.scrollHeight!=c&&this.refresh(),b>=d)return g!=(a=f[f.length-1])&&this.activate(a);if(g&&b=e[a]&&(void 0===e[a+1]||b .dropdown-menu > .active").removeClass("active").end().find('[data-toggle="tab"]').attr("aria-expanded",!1),b.addClass("active").find('[data-toggle="tab"]').attr("aria-expanded",!0),h?(b[0].offsetWidth,b.addClass("in")):b.removeClass("fade"),b.parent(".dropdown-menu").length&&b.closest("li.dropdown").addClass("active").end().find('[data-toggle="tab"]').attr("aria-expanded",!0),e&&e()}var g=d.find("> .active"),h=e&&a.support.transition&&(g.length&&g.hasClass("fade")||!!d.find("> .fade").length);g.length&&h?g.one("bsTransitionEnd",f).emulateTransitionEnd(c.TRANSITION_DURATION):f(),g.removeClass("in")};var d=a.fn.tab;a.fn.tab=b,a.fn.tab.Constructor=c,a.fn.tab.noConflict=function(){return a.fn.tab=d,this};var e=function(c){c.preventDefault(),b.call(a(this),"show")};a(document).on("click.bs.tab.data-api",'[data-toggle="tab"]',e).on("click.bs.tab.data-api",'[data-toggle="pill"]',e)}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.affix"),f="object"==typeof b&&b;e||d.data("bs.affix",e=new c(this,f)),"string"==typeof b&&e[b]()})}var c=function(b,d){this.options=a.extend({},c.DEFAULTS,d),this.$target=a(this.options.target).on("scroll.bs.affix.data-api",a.proxy(this.checkPosition,this)).on("click.bs.affix.data-api",a.proxy(this.checkPositionWithEventLoop,this)),this.$element=a(b),this.affixed=null,this.unpin=null,this.pinnedOffset=null,this.checkPosition()};c.VERSION="3.3.7",c.RESET="affix affix-top affix-bottom",c.DEFAULTS={offset:0,target:window},c.prototype.getState=function(a,b,c,d){var e=this.$target.scrollTop(),f=this.$element.offset(),g=this.$target.height();if(null!=c&&"top"==this.affixed)return e=a-d&&"bottom"},c.prototype.getPinnedOffset=function(){if(this.pinnedOffset)return this.pinnedOffset;this.$element.removeClass(c.RESET).addClass("affix");var a=this.$target.scrollTop(),b=this.$element.offset();return this.pinnedOffset=b.top-a},c.prototype.checkPositionWithEventLoop=function(){setTimeout(a.proxy(this.checkPosition,this),1)},c.prototype.checkPosition=function(){if(this.$element.is(":visible")){var b=this.$element.height(),d=this.options.offset,e=d.top,f=d.bottom,g=Math.max(a(document).height(),a(document.body).height());"object"!=typeof d&&(f=e=d),"function"==typeof e&&(e=d.top(this.$element)),"function"==typeof f&&(f=d.bottom(this.$element));var h=this.getState(g,b,e,f);if(this.affixed!=h){null!=this.unpin&&this.$element.css("top","");var i="affix"+(h?"-"+h:""),j=a.Event(i+".bs.affix");if(this.$element.trigger(j),j.isDefaultPrevented())return;this.affixed=h,this.unpin="bottom"==h?this.getPinnedOffset():null,this.$element.removeClass(c.RESET).addClass(i).trigger(i.replace("affix","affixed")+".bs.affix")}"bottom"==h&&this.$element.offset({top:g-b-f})}};var d=a.fn.affix;a.fn.affix=b,a.fn.affix.Constructor=c,a.fn.affix.noConflict=function(){return a.fn.affix=d,this},a(window).on("load",function(){a('[data-spy="affix"]').each(function(){var c=a(this),d=c.data();d.offset=d.offset||{},null!=d.offsetBottom&&(d.offset.bottom=d.offsetBottom),null!=d.offsetTop&&(d.offset.top=d.offsetTop),b.call(c,d)})})}(jQuery); \ No newline at end of file diff --git a/vraptor/src/main/webapp/vendor/font-awesome/css/font-awesome.css b/vraptor/src/main/webapp/vendor/font-awesome/css/font-awesome.css new file mode 100644 index 0000000000..a0b879fa00 --- /dev/null +++ b/vraptor/src/main/webapp/vendor/font-awesome/css/font-awesome.css @@ -0,0 +1,2199 @@ +/*! + * Font Awesome 4.6.3 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.6.3'); + src: url('../fonts/fontawesome-webfont.eot?#iefix&v=4.6.3') format('embedded-opentype'), url('../fonts/fontawesome-webfont.woff2?v=4.6.3') format('woff2'), url('../fonts/fontawesome-webfont.woff?v=4.6.3') format('woff'), url('../fonts/fontawesome-webfont.ttf?v=4.6.3') format('truetype'), url('../fonts/fontawesome-webfont.svg?v=4.6.3#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-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"; +} +.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/vraptor/src/main/webapp/vendor/font-awesome/css/font-awesome.min.css b/vraptor/src/main/webapp/vendor/font-awesome/css/font-awesome.min.css new file mode 100644 index 0000000000..9b27f8ea8f --- /dev/null +++ b/vraptor/src/main/webapp/vendor/font-awesome/css/font-awesome.min.css @@ -0,0 +1,4 @@ +/*! + * Font Awesome 4.6.3 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.6.3');src:url('../fonts/fontawesome-webfont.eot?#iefix&v=4.6.3') format('embedded-opentype'),url('../fonts/fontawesome-webfont.woff2?v=4.6.3') format('woff2'),url('../fonts/fontawesome-webfont.woff?v=4.6.3') format('woff'),url('../fonts/fontawesome-webfont.ttf?v=4.6.3') format('truetype'),url('../fonts/fontawesome-webfont.svg?v=4.6.3#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-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"}.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/vraptor/src/main/webapp/vendor/font-awesome/fonts/FontAwesome.otf b/vraptor/src/main/webapp/vendor/font-awesome/fonts/FontAwesome.otf new file mode 100644 index 0000000000000000000000000000000000000000..d4de13e832d567ff29c5b4e9561b8c370348cc9c GIT binary patch literal 124988 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ÐT?>-5aYhU|+1c>&YMpPK5x#-mbV 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'NS^o{z1ZKlHsAybrl=JE7AP369ntV%vB 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 CDx5C> literal 0 HcmV?d00001 diff --git a/vraptor/src/main/webapp/vendor/font-awesome/fonts/fontawesome-webfont.eot b/vraptor/src/main/webapp/vendor/font-awesome/fonts/fontawesome-webfont.eot new file mode 100644 index 0000000000000000000000000000000000000000..c7b00d2ba8896fd29de846b19f89fcf0d56ad152 GIT binary patch literal 76518 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%0DyT{kunD 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⋙XjcpMsTB<}!+~Xj9@I4si`Mf(~BgjqzaT6lI_+$E%T$QOUromM;gNW}?5k z^Qg2pRvrK!5~H09&w3&xi==ccDbs5<|MmKVClW;m@q4alkl3{nXp$fDJ`*A*e2^$+&R97WmDxMgGHPH6*d;JV3=A8_qjL-<3>U-~w+NP$GF}NE@&owc+eths zl_fU1u&E271H)ql!PocY!OQa_?YLE&)G=HRKwBc@CrIkGYPEW*l6^oDQxcQFgXp!;CU^&YN?DQtz#+sEv>C&fcS^cfSCa?cn30Qj=E3n- z2>~0GgSd)!wqB{t`E&VVXASrsW9AT(N+H!g57R`7&qkbNE}%AGg{3FVWdb9grR;U2 z6jNbvLE9}1-|3{WSCO3fi87nPi}C4l^+SgmlP1h=3gS(LWNkHxmYPhC#}O!gcyQ&Q z>vUEraxB64UPmB&EAMsii=p)9eq76=s=#juGfp5@*R!QZN1TkvR%y)@Zp1 zFD@A&7dEWb7M5A)CIq3rlg+nZFvOoixX`p&sB$JY(pfpuPU5j5(J~{%8lxtmqpi`L zlTaawVRoDsCvnU0-tsLrng7UE?2UA40CDDX!-JO>TxCBvBTE5tgu_gh1(d*ISm03k zwuzMxpAy~vEWySL1VzusdUVfSNf=XLjcQ9T5Q$R`)+59`7&N1Qq)}(gm6(J^peaR> zns0&P>~B%rIenl8Tt=F`{R#e97r@X)Tp)kckJWFbc;LY_;78B+Ch#rKD8g6lVkgtE zZ3xAv`Jdux`lo3KA5GcS&-*_B>=Yg)0E6^+31q!=wHXi|E}NE>M24L7S@wsofCphG zr?7+!cYwV;L9`u=W)4e+%!jTtRAk=aaTmZZPAAEe>OW-hL7^!xeMH@RoI&j8&4 zt(%0g!d#8Cn1j3NtvWSOS;TnBg_ znQp@-H+N##fXrrFC(pKa-Ud4p3Xrp5_vW?LKqUHQWX+V@&>kRW$$_H8~8}KKwFlk+cRs zfqz!a$UFpAV9DhPunM-{0Kz4JdK};8EIbS0bfr*a4nqp85D(dE=<5U&j3=O914}b- zoa0?TebDCRO#B5R>Z8h1dEKab8@NUFk4(PON5M5O3bicm?HgoDal@h145Lr}x3G_n z+xrlA2RGy$x&E>vM>Nd|%Spd*^;G_Es<7<0^AD$&TZk!=+#ImC8cbY}+nu4H8?|y= zD{G8kbFw%ai@8UO^0rIAYtCX;l> znnid?IB+@<)fYl;j?Hu66tG{3hlALiVJ370c-}TV^j6_)R8-0Tk1z{#=>V%q7g`9I z539w&=&KRaY$~E&huX`tt~MLCrs*Qle8xlhPtL3MyST_wt*eOyww!#MQQ&0#*|!g_ zUV&dt%Tv4d;g*OvAyY5}OI;I73sU+jxo^HagFY@u7%B`|UMN)RU8S0ny3QOze#a7tJw;nPII zLv)PfQYcJmNOyPOp(SubPM07R^R?AL*jAd5ms=`OnxB zqvn;4v>y%?P6Jyy+@RD)Q;{4e4ThJ*lr$0tfXGrro&kDmJQ?s|wI)Ql5&ZG)TVD$t z4=Cklei8%Vu^`gZ<37lc%L<@$6B~d>)UjIwQWQN)4VbelGj|~!Efsm({J2i1M73;G0 zS6qxC3>+N0v>_Qe45Bj6hq2jfF58kOR#(+lK_=v~U`iR$1r)&WvTO8P7A;??w@-*^ z($3aMU3N*Dd+Sc=RxHE|z&sdhV1>@sn8bPG0twdxtME2Oexx0AaCQ`9(oNwgvXe^z z9SF>FM5VHTk>!Dep(%epu{;UjD_%#q_6LM`0pnH-aNw`d>j1rf z&rD@^gri5rTKyF6z;zu(ollRE_B^A`>vJJJff@48Nb7bcO*!z8#@!ZmJ~~HO;)EZR z<(8C(ADfLEOV_-@P)^f|yI3)dOJs<})LZg@Tz0ZRM=W6wD2grZ(at%6!CQ+SaHSRa z>B05l;pP7&a-V#j9Mr&d8Z!i0h6gG$BP1SfvszZfX~55{2#MAfWX~u~O1CN^P54xV z&!6Z743m@$+2P%%%KsV7$kv;U*#OhRuR@R-3D=ez31Am@+h%h;i)js z49XSnbFIh_dBVU7S$)k-WfR}4rkJyp%X20{E9IIdyacBwKpZXyPb05|(_;r8vO@_b z?Ol2Z8?38fh{zCxpgI-8A|{;O{vDt$CBRu6!9AO{gujd$*^z(=dd0aM^1-Q$FoiLr z&Jj!b?1BSuaPU@V5X);*orRV*&WZpgHvB8=6=I$R0kla~*kgbS#~!Q>t1jbBsLmRu z@b{!}wIdHQpaIh%pn00=yrVM%-M1g;yOkeA9~e`G|0n_gWAE3PEX&eV{&INgL#aOf z>2=VPs=-gfGBD0KkkE-`jTEQXSA9w_yliWT$Fg;pk#;8J777VT*aKf`t`LV?pV}3U z@?q6+=uL5_GBz|W;%TtaQ$QENONE{u%-UXq-oL-o>=&n?hI8DE(uYO1&Qxv%~kU3+KCCP|z_k&7%%8 zQvuXAjMuFl!#CrV-9)=0rcb%_Ya#LNA;b|T&Jkv)l!|~>rqCwJngoz~E&(4T1Y6A? z0;@94QAps3<4J4v*v_^6E6M5Vr+NdVy)Of^}<){Misx*P-&=nzETu#gZ zRg%pm2j?i}UB%Cxz=76enl51HdBbJV5_WX7bx9Q{lTh2 zk)r{6L7z%oRQnp#24s4Pb@!sR7iw!=s$waM23=m4Lt#0Dr{u+Nvim~Y%P4W zHnQFu@^Jr?^U)6iuJBFlk9$VY)A`TZ&3Sui;9xvx$;$>y@F%MY=06KzhqryVGZAmx@SV#{}1F1i& zK?$sJ!+$;sM}n(JYz9NaY07LcIp!sj1nFdes8AQ!_?~?V(+ljIXym2v(w{Q5eSeo9 zdvCd+Q$ms+{7urVEY|C>Wh63m#1Z{IvLvz=D2d#Y+<95&IVAg(6WhL(5v;@{A1)z_ zS)Ow(k_m5gNSx+eNs#%)STuDaazE+^sfNg2?coUz9YjRvODvO8kcgVf;24c?ksYic zTiEkNl^@oapHYftC9AmM&C1#zDVo3`7LPd@59lG`c>~!jc^VSpDAmj&^aH$?hTSRm zwXsv^R#n8Zl$w^rb0co> zWUw;B(TM+PaRwg>SpbFw{OkSF_<-pH1^_wEBGe-n9?yGB?_r6&0yy!H=?~1q!>EGB z-aSOvvekfQ4S)GXq?IAbUd+i46+UOZj^T#IDt2-LjbLHVAZ{;bG$SJmLOVhOMVUXi zf!4w|I;j%0fyJNW7ASmhe@&x~i>w%VvARUFCsEK2Z5t#;7@|+#8vY9CA^yrMI8#kH z(?#ioug~g-DrN(~(5=W|nHi}vEoGm_Vd^I5wx~WKe=0?zOov*Qr$BMw&rPs)OPgTi zZdYxL(JcNJm6s~cAZ;dUeXt2Z0^&C+xD1|wwVnyGPz>wbP@Div7eWA6@Nu|!Tm1E4 zXv;7VX~=x$n(-rR=ls9sgwLCZxNK*fkUZr?UR4>@^kfF?gslsJN)|1loxIbSG+4Mp*C$mYth>TvH;3ZZ0#%q$<2O!0Ljbq1Fk3bNGO)!n6YRe zOH5TuXniQV59Bxp^Tg5um;{Gunor{cA!67P0-1|JLCC<$h?tE5qZ_L_m~B%6{}WA@ zL}yi+y%tOtM~4=&FpiQXuL;z22N}^y8r3+W$yaE+VkC~lYIGX{)8AlwPeaYT^ek-H zJZ2_u)>{F;l?Y<~ce2efjNTgk=4E~p>e)iHN+R-cBGq)O@fI1fX`M*4!-=zMA(!M7qCs$C*vH5NP=sj~$u z{UDA}zzP*Gh0FlQVcsPGg8Uj2wE!9BMig*4zc?&6SY4^zn21^Rj1l6zp87*ac5Q&0 zSChB|>%W~ttcVjQGADJ%5}FNt7%vwLoL0b=<}6B#Rm%h)%HN$iht5e1F4U9a*LvF` z3~(8ORA1mpPFW-p-hoYFmZN5=ay$izn><)C=x4=g3-1NQn&pzcgTDLmS6cm|864C2 zX$@lI-}{ zz#Jqd$Ms3(;!FczP=+nC-tgo8_i^)#NEP_X$e?QB&)9v1X_oJ(0_D66f^RTXqYs3p ziOE=Z=WA7sl!4Y#Mb}vawI9=p{_7D^K&q7vI1ujNV%rnwN;?(V=!8E1S|iPDw-7{0 zP?Fw=WJ{}hVT=LrK~c!`kT5;lxrB3+q<2(5pRSl&@Lm%LW0)NR$X8PKM|qv4xtJY`5Nd0Mnx4dhzx=#O3}#m9#0hG(7kZ0C$o<* zRlc?q$4T?^>whL|Hz+HOf#*jP@->8k{tnVScsrX=5VQubAlqo+8ep2HH9cA&yP%@3 zSE(q|<|pFnc(QRJF4NyTno(W?cX0C_s)(Fhf}Rt}2UDCR^w6Ns8hlL(s-@DjsLr5a z6@bN(BRR>VEhDCQQ_Pj9t=XYnSh-JZHZGFN2`K`1hS+?S9airR=eKgf@E!Xw8G{$e zk~^8L>zFYZyoxI0qX{i*=Gb8t>l`qkD$xFT=)hsE8x?k(F}5KPBcluL-9&!{fw2st zwGYyYcinq+J0lNy7=;}+F#NT!c_Db(C9Oo59Dxo=RgBe3g&a*mao|ZcL^CF5lo01s z5^#FqF(?HFWp#`xJqhczP^lVw8TY9M2zT&&ia!~zQOT^omAbsxqt;w88q1NOgzWa9 zxaNq78#=+jG$3FOtVk#;ZbTb{S})e7rW8SrHBE|a0gdq{&0so=Fc(qfhJGWEOYjWg zLrg~vS}pMJmH;8g_~f$vRy~vBdlPY7j{B#R*FlrhNk%H%j6?Q~BMUC!ONa1; zv+yzYD|%87m2%X$dsW=JyVM_*;3yHYlKRaSjE@=l`&EBuw^GhvvAX5|fqx{{P;*s! zqnb)HP*v1fk>zxww1_rPZaqb%QsWXCdAre|Lr*7Z3r=xF&oFTFV1=_ zP{=!R$AH32RKGjQt_t2|tm-CR9u_N9R`5-I_vcQNNQODri8-mOOWV{!nQIEHN=c}` zNvNKyC-oGVoQ1NI2emB1Ab>Nzwa^vnZV3&6AyrP~@FSkZ7Zvx9Z>W<6XtDK&)tcz-E7 zFWT!Z7$H|c1b9p>yk4X6L$T1UL*b8oP=0Oy2JGXV#yLGfB>iQVlGoq}&;=02`+zIF z9i_iOU0v5I@n|VC`VHh^^Ms8d0!Ay->IvVWeBs?yHE+_5SIXSUWWj5`q5DweLx4IZ z*Wd}VH#Q}l$FjL^0J=DqboWqChQr|xA3m3mW)uejGBy;brz1G=;3OK817SD-J-IR#_1WnFWWJBW6wwR@iLc7j$@JkeZ)YcTAHg_ut1x6HsX7 z@9Y*=!j0_FJ&BtLn%>Mcjt<5T8A!a3+F&r@bm9UrW+4o51rA_sUdjp#1C*+6$q-BN zz>Kcsi7Mwk6aYoM6lfU%1Q(@+oz}NaHgRL=j=396UCOZAbGUUX^GMKy06*fA8jYe$ zWHsrssWD!c>RFacvBriV%|RpTpwW6C3e>aMF^RyRo>PjHK&;kp~?hx6?fGU8kS4Fo1+s+Am4R4PakzYo0CL&l3AAj^I`m5Quf{ukC)2i!qZ_il!HO2nuJiJ z+Oq)B)E*i|qRgI0Ol(YqQb3B7SkMWJ`eG}MuaH9->aLEsNh<%t4FRg!0^2oqr*WgB z$BjeO5SV?Dv!?Hm3OTm64LgK#(&x)GaCks-XKEkt0|%aV0ED#cArQP0FvNr9q*T54xT{fn?GaoUE}RMpKk9{D zaq@*PELdG~>T&Xy-5T2HxbA|f+!~ADHc09(RF+{w2X@n`-!gs`^LzevCpBZo3JH!D zq-AiZQX&rymDozbI0S3bSp!#|c7Lg>DQzii*m|@l0p2ckORF-DkH%8GsdgkZb?w3# zcUn=zz-QX^!i2(>HTX(Wr2;THX8(|Seemq1)d)42JcH(Oxn~HEaV&&$b$8Zh)OVkX zce1XQyzS%FUxbu7P>oy$UvT!xK{Q}J zdlWdw0gIfm9DhnCMnm~Nq{0^DQ3#BEJ$!@d&s>s+5qUrh6t0cm2$ErP41%fz`2yiT zqjEk70W9PNV~!m_Hl3ut36QP~kU-)JT(44mCj-s?($$QOjmN{-ksf9q@j9b&#mRbU z1iC3Jb+}ET(>W;sRe9qHV#)dUV?PKLja>*d!z7K|o#95`*?h@7olBbHHjO3?`Am;n{y=i2 zv^f#-AF_<$;vf+KBE)Y=RxAH%$MY$J2zoBEnRFQXm+JDB)~fi#{TLW>|;_0>&8J+JTtet|VP#@Q&f zGS5zrsbK)3Gf36J&wa0DLgd`4V80B(1<_d?*h=sGW18Ec@n2@c(y#&wv!0@|2?T-&H)F@ANc!@a`WgN# zT_FI8;ZjooDk55`I>jf94^Y691yO{-K;us4q2XaUDhSq+aqIZz0LA z5lsy8j@SK$J_XOCbR@PO6j+I5II;Vd5{uY)NE|UM)yCW^X0cQ7s&AI_uT!iKw$c2S_o%JYM4-?smyGSb$e5a$r&WZ|WTwAQ7 zK4h-VJ#85rnp9cAP|EEn!X`=+hk1%h#YvEs<0mchQa#(&)y=mI9iz!WXGFgr%ED$d zc(giqqi>I!CkVj512ZaNdEaik2zvsy9+|{?mdPg=*y6UO1YYSc~~ zMHE<8Y&Iwnv4{VmC;_SLND3mly1;8nrg7*XgA6b)c}0)>+EqM=aXk+7wde9E;7`=3 zIDaP?NFu0GdiW_;;-|<5j)&8j5~wY4lr!i{4%vB{yI;}09R0L!s?brBsiD0FD`n~7}mELwwUD45V* zR=)*{(`tHnQi^hAa_tBmUc-j~i%<~!dH@Vh1~-Wf9RL+@ENL7Cw1}knAjYB)qsc@^ zoId#x$Z0MY?T&zf>RHRkq)O}(g!mw^?LSWmfnJ=7BeK0#6sAR?TK(g~rQxCS9b2c+ z(u`DMm%|Jc+j0?HhkwP`lf;fzVmbp*V_^x8g}{Lm5!^gTPAA_8pRcRcFEQmKhiqMu zJ*H3|4FHh^i^4ui!eow|FT-#zivV~ef%)kKsg8F3g(~@^3ppNbS`f`dGoCCV8%TsZ zXS-R9MZzx;TJWeRx!MN0h+o3Y{~d^31x1*mxw|@#AP+C~{nM7!~}V9~;j5D8(*2B!*870GjPz~Qeo%~UoVAVYp^k{@5c{1^$jdl`Sqm$$lG zR&OgRwyiq+Ne8f)QkSV_$lDF&8qqucW%h22qN4?Mdi|o z@dM3$frMNnEsv$)!s7@#4ce*~fi4enOOT>!6`Q&n`JGE1!22XXHL{+{uo)o>Ok|S{qsM>s*vTp{F!<#!hhY|#cq>4zAbc*vF@G$g?R^g5aEzm~~ zq>F!f0|jIl9%P(IZKr;GqlcKc9efpPt0O24%QFE07)I4muy1d769b229$*;3S*F~f zsa#59HFw6z?+HzvY3Dcq1|>TG$%u&W2q|vS7?Je>Pt0HNW7P72g`A)r{@BA#mfICo zVcU?3g$Iu2;M^^+SmPEpu+{>${}DsO%xEdYy z0`)iJSbshpFm(!BY_pR+Yy3ig9m7RE!=w5Yo^cj%?~o z8~PX6f|&U%584rT-33s=p=1FilPqY1{4st|=Rf%DwF{57i5hwc{pmqq!-B%$U9yv# zeSWmH*rm4Om9-^v`QZo){Ab01U`Ti@@pC1)Cm)$gX|y6XC5Z*#BztUjlemznJa)WY zfOMF5jQbsvMGf2GU6#%_a5M!EvXc@*6H_5fk8MtKIE@CTRD^_@(ibcTw$B=Z=_&4i znP7RmbvD92Y4a$$!V!ng@xl%Hnd(Ne_VX|hM<9F$Azh+Xea=e~QrWe#ejb@b%ocr4 z#EVTx7>JoYN$!0}rSjH@wkbr=U|q0Sz-5NMVMDL#QA+W9+!O)@wpwDkDf@e#yAr-i zl9lUP6mU8V=BVV$ZG62#&` zR|=qK_~HKQ6fb6?mKh=X(@G{@S&fv2Xq!?&v8=Rug$ZQtY1v+6t^H#Qmf6XHA$A;KPK87$whl$RDD5);QkByhlrQ?k8x(MAL- zgO(IUMsZ<8(EO3sN#GnlJMG3#Tj+?9hqoZ*8_J@Ps8>jF zTPtr23neK;xz{3msSjd^XS6OnXg#}I>SeFkDx}GzQ;V>rFyL1$%800!qH*AB&4>>t z+Gx}}GH^FAYJBVCp18Nfg~p9x{4w2D#wFWndmU5s~4khVw&`q` z8BJ>xX|G$wf`m*noq95?H*1AV%*A>@#D@ZE%+-+Sks?f444yMtAPs7b@mbJ*KaDXU z*xyYN`~#sg_otG5Sl<>U^TP1cHY*b2Gic`aI1r=m2VgF+s)UGWStj!pKpl?}Cg5m< z9niH%(1;@zYQZQlqbSSxjU3nj{tPzUeC6SS4xR+LNIUR4CoR|4d0zzwWbA>b*X#yJ zGegyw9NpRcCH8SfN8N>Q5f%>~?236Z)5D5=qniP$iP@oF4D2-z8ht}c zD-C^_AH@nX0OtZ#(`$ew=h2n3I!VQXGR`*al~=iK)l_Hshsx*9b+HgMS?AznM2{y? z%T$w=5a%Ht?h|lD`>}Cwnrz)L=_YzkTYM3pw(J4yS}Mr+1f;Bbe*5}YPqp6;R0dN0 zG`@{Llp?`+X{l#lH7J8MLXuVc!GRxukzCNrA%s9q|LK*543VO0)}sE1R^VYgq>;9` zHQWe*SYbK003suvL0-{Kw}=zp(&wS%LWAfvXkb{v5Gs-JpSrgK(xpp0N@G2cm`f51 zP24k&xFKBS*$W&N6%LqZbbxe@;RC1Fj4}ZU$zdFG6af{;8M+Wdx#CDawoK^-P^L!q zDUAD!=YHU+)^DzC)6CYZz%CpvHw{F9O%cX1W$c&5K{MkJ1;1pwC4NhXi>1Ks3+^^6 z;%u|@H8H`(kO=yh&zlw{U8y5OZk#Al3L?R6xJ)4qpkj}Jy+K5pTqNi9-?mb`3`HTl zSNR9D9|On$3kV*{aj5KRJOh;=;VIpDiHTwa4lOj-*)d>duKkU+T3Z^Thjg;2nkExk zoe}iCjJq<;et-#gSQ|>g3u=|{`W|%b20%3^DCrj!jHCepWom&}r()g%QZLpF&1rit zddP-ph zg&JxxNgFUR`3-af-5G(@W?p-gJ-L}8kP2EvP+b>bF-D}r%Iw_&xbgh=&B7TNsw z?q3GmRSY`0ef*?^5=G zsI=^mGU~6JgSlm?XsM-c%SE`dzEhBZ<`}Xm?c_cVXPJH%a!XG}5%!ayEy!~|CzLS? zc9Kz6pU~uu4NXwiO32T~!r%}2hg;SJfF6DDG|qIa&rcKe@aiCaFAi4O!kd ze_%-m4HLz8;zQ@kkJ}Wt*?fH2cE>EB*uy<5z;{V(`D1etY>eWuXkoEz!EOmbb-}n% zwGct+!A$!%!z*!arwm0q@UgfzwN1!jyZ5K#^t!6uHj2KE>=?aaS8G7ar(^ zS8ZU^oMg{#TCaL46OQaFnK}SAHtPS=W3RS&ZWZjZMQG~}K$fn2-LTXb-GR8qrE!x+ zugIkh#rbF?^GkwQT~3Y4T?W+mL!*inJw}GMs+VaU#37L zY2IT84ec#2F93@W4ZXJ)8N!TrvDWbuW4)hK`ueMi;1r-aBiXgAG3lld7a<@Dh0Id& zHes%%rp42Z!n$ZuAln)8hj`IYJw>xrOQ77#TPtO0vToGQxIP6oVQ3Q6#J}#NK`Rg~ z^|j$Djl&cX`kC9kY2d$~^2?}}+y_6(Em{L%0`E9o5N=dwg1&am^sKsskr=%QptUm` zE{UO}vj+n3j9f#70z;D7(wEJH97H!cfD9lF2cWC^9Q|X}co3Z5VC-AQ#Pa#HnRS(i zOJu103w%?J6ZohFfGyx^!wgYtxO}Drz^p~){>$A>sT%I{ad4evd$ z(^O@x!fD5WJy}IgP#zj^$6yHpr&#eqDTed>U^GsPJ8(=aB3O64bx39tV^#YK=Jtbe zMw4bXBbvaR(2sQ}zc(p$HS~m!d!*UyN2L4dtpWM*l~&0o*sv@Ax^P9T-VCoER6Jw4 zGzAgE-P=^oqmV^DZU!l>$O_e9k5B)i5Z@w2(%$K(UbtQT5GW6sN3vNh?9cnam6jL* z^pT)@K@^`&zPlfbCVCGBpt_I174gRma0je2B=j5NiyTYVWHfVGFkXNF1_jJBlDP?h zuhcEQ4bWw7zK#U|gWN9IxA0B(e3%e!lPtUn1OfHYcp*A1iP|GEo3whOB3*}#EP(oL zuUFA^FG|5EJCVi|mhRX4LOlWhL|<`o zuHN=@g0KZqw<8}LvMiHI5$3kt$`L0gBQw{|0rN+u_uuX)2PYn(CJef-zMl7wEC>Bn z$-?!)SzQd54-Y&84lsnK&`E)gv=U>93_s9Q?O<;3MA-PAc=Rz96Ghd>_^&+i%)%v* z$DTei4Lp04EGpXg=`%J!Tvwj~b3{(q%98y3>2mmf#SnF5T4g9d29E zS}G&VpJI&i?O0(=H8l!qDw?4}Rwx|BPG@XYScbQaG%;FoszO}K^J1$x#1m;c8!puT zZ1YCmqb8-7D)v~IXn>AFhyVrh=mCj}+6;Z$fV^V(&})soB7F=S!5Lu2Hoc>mL+hGe zP>KnRvaX9N-(onWC+_tDbD(BMB0`*c#1jY(ugus9bkU8dE=v#SOfSH#m6z#APDl3&k8}PvLdsL&CUCd8hwR!wxVOvj+fGj7;k= z98+)Dqy&&iv+yOd;WhwgH$Guva|gYHjHb;>8ydK%B^JSOhAImdXWaY1)AZ)S@fc$=sa>lZq>{YD+7} z;|h6SKG*Ap2f7pDR%ah-b7A8WTc~J=fxkq=lJWpmNRun!5=m&`6S~8k1S|G7%o+|M zwg<6NFv;jd%wcK>o? z2j}5YafuH_tF8lGBp^;O{~*RNa6>_;&^iIUqBr+JD@81s$G=oP4_H|8K2F-^fr1k% zoc!&6xVgZPNxB*EC~n3L0DVa?_n)0-G>xGm*#;RmFD{R{1HzjmfID`IpyHCr_Dw`I zSLr}fc1M;Hp3@GKfvve{tC=d)Q~}i@IFS$PQ|PI^UUG0-zo^z~$Wz;3Y++{e=t-#` zY_wHOD5wc7-qC@YW1+h_Rh5+q{@s+^Xd^=!DAC94`<2+S$nVAO>iouJ`cx<=26AYv zkT&sygn3EQe?!kf=0z>kdsK;&zJ!K;dWu^tbEAj{{7@yT05p30Cf0v^7h?W1mb0_j zF~{`iln3L}x@@WWW0NI^&_ez}m;v7ov8D8x9C*GEDF?o-{PaShpDPy@|ETddFH{LM zvjKD%{)89wfbax1EV7@ZpDqkv2HAsU`SK9Zw@k9+JOvaoa0!=ZFrY;*x^|RPaAZFr z{Tfh==5lmv+%fMu}x+p9WIg=M4eB=Rw+N}Xb#ujecQ{pHXg!QoM8D^gYoE0`z0ka|i z-_w-c5%QHJ?g5MQj5B8NzgeS{5NDhN)i_#&!GuReF&0_>G$TL~5J00m3z{^TMoRe% zJbZxBP#GHn6lX2Py35Eh5k*+&m3NlwNcADrc*KebiuutFg_B}wS+c^Y*(C6oKebOSau^u4Bf5sO&<{Pvz)%i> zBwOo@X)@$z5hQ6Y!M7Mb6}b75NnL(WFV;hrvcgD!Xi0Ub8S9NDYAkZNK{N<=G$N@@ zw_ON*vVBBU4t}-8g7t|-kTMK4xqKpdn~reICdGn9vteL2&WZ8I{i^}BNW6CdJ{DJk z&Asy-eLh(QzjS<2?Hk~vNQ2~nhi2kU?d0f&V(Fy{XlOA3G7ScH@CjWPMjO1~z)p`t zHs;Jb))g3Z(4PE5&RC8+l_>!Oqz|m)g{xj=H5Z&Lv^F50&iTk9OG~ZR*PkeSXj6;8 z4LwCHEXXzpC^=sl;EKz^fbpB@Rxq9s85qJTb*FiblP_@4a4F3-h7WY@(3iR5+kjAIeM2D>739S$7sjkIi9M4V>ZVjNRF*3Rq+G zAHqM#QPnZTdiLOaz%C-r3t4P*?VRsEW^fPIM81&TY@Mo%Nh{dj>hMH4I6 zG&gFpBEKQS8Oa5gxUaizFqO89N=6>@=^4W}fK5G#1}&|Q zaIP+n84u3N%mF);wyN1o2tA40wnIyHcF@nQ z@4&-WGW=%ervm7f8m6B~bs3DCs4et_PC!Wghfu{f*-MP(-Gw*$B#FNlKqH?p8y+5- zox;*_K--T&HAGH8rw`Q6>+29(pBNXn2VeVfi;?z)9pc&`6P+a{BVQRF4S?bP3S!$~ zmc^YYVG+fYGHkDT6N9XRZwba02H`g;Wv@hA16vCQ<}B|N3aqQL&6`VtAE3b1I>MBV zAPNvEA+=x_pGGZ%uxG7}B;A+#0-l`FAp$QLo@79Gi}*(VQ4H@4W(hoj28I=428M+2 zbV_H>O`KJ|dP+&Y!d67<;Y)I{mOH3eI8gX!L4KwCgW&lm7|d<_7R2vEqC&vkHZ^`II!}hIJp&0Q7?mb%zR2r zYv^fdx>VY)N6TlI$u5;N^D7gEBwur4k=+7`HcA?PDVh>o?ajt;{!&@uhY0GBL0OnI zxS{v!{NZrGpPDtrLZKQ`OYATMJD$;&vxCXlLin*PDRh|O+IV&`uGh!RZzM7ZRhWO3 zo(~{mT{A0k`wRc0-?yBlb>p5B0nFK(`GQG7&U-PNSa#;zaqlD+!Vk*0`UJDu=aVwh z!pwMZCA1yypaSX<97cG2oKV7ok(p~@skadz_C`n0B18-GerV%W;Ne}16SpDya#sK8 zhL?vTH*+*&UyY?0lFqk^aRkRcM2XfP1bG0uaUv<{Si8)$6H-(>5_sZz5|BcK%w-@Y z{JOLD+IFFEA{T_1?3CO|6*n>e!h&6|8$o$zx`WN1|M;clj* zs|8@7heRW}?vf;?Ng6^Va~ivr;b5V4mgAf|7d58tV%5ja!?F?a{EL(}tG$TQTTxJw zB1k|S!;l^xyf#%No50!f(g5%iuaG;NMBxa6q9CYG&&yUWxFvH+XR|z6ONxe(SKNpb zkp`EIBh&CBeT<)HF2Y!p>}!ck^8v92ddwXF@O0oJm}5aZ3nPfaCOG-=ohoo(at>a! zZs~n2Ik8&o#pCu68!Gvj*FNh#=IqA|IbvADisw4NS8Sjmb>5Sz@QH>6liPb@T?^+p+^&lRViZ;3u@95HTiC zO9rZ*VvU6a{I)$*sRYI+Ku3_Kk`xCxsTE6!NSKwnyB3{Z?HfG;U7#WZXE8D@SLZyX zrGt{d={_Zu{&HxpO@myO6~p9Gf+yeT64+$HpV}xZ4M>pjN@emk5y%h8(2$21)Iz|b zc^dSjkPi|OJ^+9-t=Ph3UAW(Tx+CJ;XwYJJ2!EJ@FRSQNsv&xmQ&YHxOlB3=W$AK%QUAxe%m1Oo}XOm!TeZjC3@O(=3=>!9ESxNawdpg5eA7y8||anN!Ii_*YK+liSFfd-Zb z;b_|!`YzJNE})>@Ixw#i z9|P0DuL8W{zOCaGFZQ5CuXeL}|7}~ptcP{`9Kp4)U5w91MM`vvUSxuZo zPKu0D>d{^l1xE3q!7096J+4WY8>uOwlR)!f2idum+LgitK=ESd?D0^f{Q22*ZN?I^ zk26vdF{#ZQl0KIx0e1+53BrVxZ5Ed}Wa{9&^hxEXFFL>oc9MCpM*+t+4B&gNEjO$l z*g&w|U*VVQ0wVg94_eihN|neeT+B-+?C-reS99l+k`a!{`vJUfc6mz_m5({xzc9I; zEb*XcaKh#n=5_JKyovVR^&wI#?G}b$<8f;G&pqH97V(_?c<9ZLSl}@>k57=n6r!{l zM8h{j_ejA|q=s=n{r=?Z`-HR1yN#1yBlc`uhBaiV{Z)4y%^@cFyraNoU>i9Sn#zb=GZ~;RPsS9L1!I0D zNf3!eTwWAHa!@-!_`@`Bz`u;`KO|T|w4n&$a+?C+X1!S(yK2P<5F@3H&kGGFv3aVN?NuM9hL6 zRXYl?q&8$S>F5-Q(jxf-NSyLwCt8QrVth>3`G8m$oh@={XJRO6_0m9ZtJJ)nvhZOczWp z!V?7S>pRp4CF`t^{K%@2n|R6)q5MbI%ihgbQm&10GNp*yYe_40_b67^vuAc@!*l5#%os{*10y)bcK zr2vJ-|HS*QOo~CbcCsi!Q7}P*JY)NMUgb<$7q=qDJ>f8l*iPKc@j?VqwpPl<$fWEL zqU@&ST4;>jrkD@gst9<&I4LdIn(%Gd=m!Q`6*K@l<}}&$^i)ON1%=saTZGTmu4(Z;9bIG&Lvxok1vuo0Y#)#-Sk0a%4Kb_hE5zTgn08op-VIX7P$DKP^O}Aj zB63T|hTLbq!R`y&G7+K5Z~Vmmn`KAK8dJa}R1+iD2*=DpY)M7PqY6V=nXDl+@CG~# z@0fZ*v(+dSB|}+M5XyV;mQT*d-8sUy=+l#I><3k{U<7lig(xy%T}8TYbps&BpfUO? z?f{?oO0|MC)e(6>3=1(qqv@p^&P5khW2;e^#$~KmI)g#T4ir)5^smMZhbi>$L^Ac|$_=3U^}0 zN@WJDXvi8T4Swtni^6^VU`PivOJh-}^h8+F$C{FRojqu;5&M98_D^ayMO=dh3fpMl z!Vsh`7tChJAVJV7^oY-gp&w_-k`S3+3Gp(a)87|F09II0Gid6D!ifPirgF5MZ=xC^ zUDcpN-I@wJzz6(Upr$)t)nRmw3aF41aVrY?AZ*fthYS@=P{xZkN-8!*<;DiZP6A3` zXmEBKcvk*?((WG z344d5sA^miUIQPmIC_-PGI^Z>Mp{rhysZ6Jj%4-vrYu;l|3B`{Ab^&X4x^x{T#Ve} z2Ir^7b6pyHRk+oOh=qc-=&-$SEBc05^TmOp;Fmvw5IZ5$xZsi+xZ$kfkuT93k-Pvuf#tG*+F^$^rGo$*Q5HABvpn6k^ucxq=bjhs-PILHuw=NBAGkJZa|3K zaGrov45Z>C5ul5md{ii;QSfL`m52m&aZvw2h=em+5t5{V6f%*Gg$`*OCI@_*31#u> z3JZKBR=FZgSz0lg5wNTQWG2AJZUy^@CK(6t3(L3DLX#Ji!IKFyF3Cz}6MVVpGcwJQ%hFiAYm0 zUx8l!{<0+n3w%2Q@<&aCRnUbZi(q*KK|St5A3F+Q6J1b_AC@W%!W>yh#jM}bWS&MX ze@zw?Qg(27u`rq3+v360SyN?L0BF>B=^bSO+2Mj`3p%BZsag|&M7c}~Yf)GRc@hCD z9(5fDx8(qyBPvqcMHLaQi5!3y4MKINJEd$17?LCRswuWPq z|7~sPdgWe@GF(r1*q<7CrJA~S^PCDx8~0(kLk18P4T?^{UKJV?K6HY01PK@@4TSV5 zYxEXO53*u8K7qqCxk-AR!aY4IWAlLY0y)G?VC_kOqfltlgP|l7m_Q?(69bgVhyjP) z``WGQR-V~AaHn$XjK;ZJ0T}l842u;#;9SABQS4$nj0;#(V*2ihCto@@X1MC|^{c3) zQV1_VRo!r_yYg2~J-?>XB*0$PeDvhf~Ok$U_X~fFbM^S z)FD&i(^9`FB836g95a1oIXHS(f0xRRK zAba8su3CmhM8Ff89V&|RZGDywf-D<+k>hPn83Lqx+Ad)Wu_!)>?eKAKvJB}4laB$A z>deSF_i59&?MB6#ie(P7;!fmMj&tY$&|%?7c(lqAk_wchdG9TkSw zM;4OpC(=~bg87(dTA=ikF$Ouno`qR}1gIT!*#iBEjZnBrhfnh%PYksmc?V7&T)Iwh zy8dSl(}|$+XbF_(!4KMHE%Iu7VVx5)p%EMEEP&jw2L_Y)k$Qc6N*A6t_wF~oW5Nm< zt3t`5;>p##e|p%x`v+I46xd44N^*(f#CjgO9M9>^mHg!!WEYwM6&^M(G-X{23NL$K-v*MLZ*A8=%$z8}M~YO2WjjL}rR!Wg z+DFt%kuJMZ*qeXRg7IgpFA8bp%Pnes^(0ZPo;>D;;H*%JuMww(aNEGKe_fPR=Tiz} zVLj_6(zgeVVVu7BT7>lw=D<|~e@vZCb1*p;Myz%?71QlET zE?Srx8Ux7LRk@~J?9S%0WwssU1HHKu>3p&AF}0)aMI)=UwL`GOlxjK>8Q6=JxdJiI zwzAzj0cA79t?gY#5-b@DP7rpqOv%j{kZBAy_>*qQW2rkegJUNK|X8B|+^2Nwcbvo&f zX0*uWcwr_%uIakr?Sv^$T9|y(1NrwY4qgHg88#OOotTZ4Z)p0!W85x-Y z{c-|;{$NA9H5~Nsx+<=Y``nMDJdX>+LZz5&rbn+8O4u7A@erZuE!9Y;HeSPFjaQA`10N${KB9&Z#Nc2eXFi}V`k~Gm>YSdMDdFN z#CCL?0s-_SGwXxJHyX#i5FG(iI<%U_F(&R>jiS^<=r7No4o zgr8Vi;$rd3Et+KK;G8Nnf{FNSkvH{h>Ok-rDjI=}M%Ex?HuLC0j zizrq)cBRr<<3cfi3zY3%uH%W>cG)Ms&MXCjSJ)8= zM4OxT?(8@nOyIAr;x(50!-~%;G4Un>oatJiip3*^-9_CU=x*F{ZW~6F4p0_Sgs8!j zBFuecVQEOAJVgtK2(Yj6f%m6M@|A~zL^xI)NvzQKy2pHP+e&8f`PD{u7yd& zj6B1#eH8O9=t!Qex77v(I2isuL}Vw(Yt zN25@L#WaYogEDKY7zvI-QW!SPXiA}|N>lKZgnI?1S~TG%gEcAyaG0DhQ;BEOfO`7+ zii-dJHk<|unqnOucu%`JIkJm6ea%+GnR29dWQ2gFq@PP_AXit9750&?^2BAU*}y+r75g&s@_EteQcF#YO? zI`c41MP&x)07EFzyJA9NXi>l(&{B$ik@oYGRG-2WpFmq>wHRhLfyWACLLVBS+VcGr z-Yd&OZLS8W$vuVIp8`9{t)f7|CCLsD2a<*%h#P>Dj{G=2v10^o+|go=j1?lUa&^jy z2WavT-c^6lT~p0H33!*_jtqF;rY|b@z>6p!{FoIEi4ZXD;6iVpMzHDBl&*s^Kmem~gCUxAFJTpFw0U#tGR8lgG2heZ_6XQhB3*Zs*p*zI6BJ;HpvqF_}HEQSRL z)sJsNYXoQeBqAB_pmPwY2v5wH)06%yb{|IrZ`)fUBp9%a<3 zQE?pN|G%+S{a|utDq(xLDv(}NES*-u?yH|mL2yiZ@Eue0>zQQ`g`3+o6H*_3LSTja z$VvS3QU5GrVnlX>;xc8#4ui|al!Dcjz(J8NI$x1#c3|JcD9xaP&viT=z?3LP7IL3c zi^c!A4AnSNw@qy88^;h~(hh7w5XqYMr^4oyM=V5L#|+vO-2$LkcbDms!}AJKcj&;o z3eVxDh;vOZ$oh+APuvDez!L$41kBxu%+#Zc5Zk=N2Hr0ic`Xs-2xqYh=nRz*V&FhE z0MRE%nO8LPWF_1H=lbHT2FVXUm~>5v)@&>+>sOjG5XFSbl|nT1@fp`rq?3@?^IjBo zkufr*sEhxNY$WEJ3F~E2^RyeJ&(epG0TIk#oU}t)qYpG-VTv@s;~+MImza&lgJUMW zI&3HBil!pgQ|!Jg4b`UUOIr$A>HsbC8QviOBrl0&rIP_!Q^y{Zlmc5(JvP4R8hwIf!rhE-zdg|yvt3ZR}7D2kE*}gxA}kZ8cYi8qgFQNQB~9 zAFFwhZii`ngT=B2R8)m7?H>Ce(+(m8!PaiEFeQ~y-W}n13M9SJI(gXZQVwwM(FU-U z0q#+?1&#-2)NQfzQ@uHan{{nDE1n1)dxL9O`MHQ};n$4Agl7q_SBNld@iwPo?%?NG6NX-Ll%{BzS_wFwnyghuiDqj%jHOOFRP?6prFB7kb!$Ut1_p@jS zd_C_l|HE_A?owD04%ik{#Gm|-l{O^UA&ayfI#42299wWP$~zOA)$IwbwB4PIW~sJX z7xF!}lLKU?x5147^fx!&xON_iDTXs2?f@=ht`i0rh7FQ-PbBg2bh%@2v7{GNfI*Dd zfi(g*1PI(sJLw==($xgcu*DDhu`|LbLF!2_7YkOIzGb`j0R~d zX~?yxp}dhWv)<9LDQ%EBz;N*-pq2W~+8YYh@^RhxOff)>RtNvMV{BAXmIXOaLcIdf zdWhySXjehMP3TlmE6l#nS*88IFy+4fI~?eo>do-*!_io@4{=B%M|X}-@DcCblv@a% zOGOux;6kxjHNMy+{c{Z)Rtg-8(e2c2t-8#(TF=;Exx6u3%l#%)xLZGHBZ0)bQ&( z$Tr@|p)tjjh2NEU`I@dJL+kkrVIbb}%%MQF8bPZf%?Jop?`xBq@_<`|3-yJbSq?nC z(uFjpc(Bt&Wg1CeM5tTUi+5Nu+8}^d#wA}f$nGFc=G+8tw32t_$zxrCy& z+&9XKcVNX5KebgMNgJoTWhi~zSzorG?_noHY!_`-_ia=wRQO7@xi%6jhpwC;Jkj4N zV66nJy};@7U6Dz4hnPTA!y%YgU{R?OIJyJ1X0T{PZ}3*_5I>$L)DnJU(3q%#jt5*5 zEEstN$d(PhdlM`fDNY0&g4+zAU&!B{mBsECDvMRR$oIM{g5=(!=m^VbKY+C&$-UgV zWSU^*$c_UIH2u&n8=|UM0ZpA}Bn~Z;hF#Hl9@KUCxx5=n)w<|Mn@Tn&Ykk4}K#Q4_ z^-fZ+r-@gJec_G)UJV57H-|e(4wY%2&M#Lw7uXvlh-PHb3y4T5SwyO^_FA8)oD7s7 zA0MebVRopa*dSn25)(wg&!oyxGp?9W`|TT0WkkWY$aD#}d)q#p7c> zeoDH(r;xRvlRY?4&_p(th)0(#U4o|Fda6gWWy@;yQRBa@z_d7qIA`vJH}wi4+9b=p z{`qZq{VeNb2RwUwb|^?UbH_Wv{LY}99hX7CA5e5Tsk-@mI5rRhQ0(Ln zoR-v6E}^)Wy2;|_Ild&|&A71!09RMd#25!Oa?M)uv~1S*2eFJ5Z7NP$!-Z|BZ$0;{ zs|P{mEtwacUpVL)OxfY_mn*;(sS6JNt{mssJY5V8CL&F>h^U5=>ryBTpRCc6sERU$ zvI?dJ%rQqx%cLCNq8>&EwW800KnM($faW9Yit3S~7Fa|H7Cny(5z0dHcuKW3 z51FVwhg?cRuzXY2+)?jU2~b5FR})F(ZK4Il4%l#C>v^$Zr;&L;n^54 zdNy+rLN`z>8Y=%zd4b3RRG3AvYm<5wfuK~K8kMqh-hdu_tdXQ3>fV4CL@F4 zQ9myxfs=FJ$LLx2tQZZ50&rKc=Md0fGl}aF;Z^F?%Wg1$!GdCW86^QlWsPcKjTK|S zNK1JkWEq4xLlxS%8Bao*r2NvLunr{BpqTM+Jr33dW6SF}Lzp0Cn;9)_n$4RMg*D|+ zoT3~}E*;mm!kPzXT(W-sdda1=W>7K&2>9nHRCSfGzV82Ww=xLHX)m|!^hE=sG=B3v zzl?&1S|r^n_g(IG*nxehYoEcVS|U-@;*X-XKp+W&*U}dV#f#QIBJ}e2TOg+R?iMX+ z7z82q_8SYkco9tlGZM`q0~RU1ojs<6`dp*=(Omd~TOAEjS8vC_4q~;vskmoxbN_uz zcLOihA_NXn>0&7gX#u2izG<-22SO-FOE{vJ-86<#qq1R4VkSIT_!m!>v$zMv#tz*j)&x({ZA(9v#WA! z=)R}DEpigrke+8R2e}iuL;|)hCIfO$Q@zSGU*Xc6H?Pe}+2#gUHyWh!0fN)YBVCyr z?Ku`c`lBKaP9>?0j_}s{TzSy}t|RgqXWp!82~(4~ajz_~&wE@-OcY%YWrnwT}m_)~!H+N~5n1!)wpLp$INqbM;k$3}}h56xIS z&ul2ElLh3fRyl&o!B1C1jxoCY^kxHyp}^>>rAm5CwYUea+vzu`55~{;gF1Tnv=+D>bupg zC$Vi15sIM_K*c9aRhi-G;+O^Cjpvco1`Mi4N&cy>0A8vGMbODu<9o;o5)720L1@jv zqz@4s zu1{jY8=gW?>$KF+wS1e{ICi^^F)Hq3Gx$WoGFnhRkAU-i!52y# z9eR&nbwswURWRUozX*03i&_B&=7H>{BTW|q75HNOr^T`baH+zJYV%^VOU3WlIl^Bw zNQ(IcA{NJ)y-TieZk2`Z#V)Q~Q8~Q7|Ru!}Q{-*Ty8Ey_at*sMdy)r`; zwvl|Ppc2B^Q5h-+zqLA!-p|+I#ZH5O`lDn7> z*C0$2OUT!;#MXAXuMWk&bb1ud~GW|O= zJuQMGOCI1UrK?KdJ2#&t>w^Oj7;_ zn37f)sK9Y~5^vHkkR`Qqt{IzF1Ee6sA*LP)6gi02G1OygBr9rVbWb8Rx#Rb&p% z0^vcOYaEq19^VhNM7Y5g8uPO#-U+PK8#^F*AW{e(qQ`LKOOvKI1VqB@=&qOCkfpV} z2AK8}EbRKi>0i(g-g0&dN(FAiJsK+k7=)1i`w{UAo)GeR1{hPX=0A)&`m|swq*ek# zUOwvLygDz+wi@Of5clii{BoJORwA{gi&WbDT{7;?a0j;0@0)5@2}XjgMidAiwj-+j zvI^NJcsZ-^CKBefS4Tt}(ETDE`{r%dFB68?Km*-E^Im4!pcZvxyg1q~9&*#IphP1n zq0muFNzD@sq{-h8mhYM_Tu$u+QtZVeHdIs~u0Luy4c?cu;^0V@WOR>P)=44r8$g>N>zB zJ-eadTgu%#FmO+@=Jv@fibqB8s_2`+L5QwA7)O#ttD}>Si}$o@;;V4QA|by(Nz?5T zk;6;^OkdZpBo;nkkcj#aXjTEeDMHrFnifcfmg(CW1OtWvFr`iJ_$GI|C_m$}jX49` zp#--KT!SoU<#UKR=md=5q~V;;lna-9Np(lMJTL->vsNO(jcqVxTRbJTtv}X^ivMMR zgqGnuV~_D|+l7PIY0)o;7~hL4C|AQE(QoLfA^Vw2N{lJOP7bgx8biGY54KGGZs;DQ znMFc|7{g#bZLZW_G#Le>Vmc&C$PprNEm1PDi8M?#O#}3}68cj_Nr}g&l7!KvB{D##~$7dU=jV zWP{M~>Q3)59xdzNSWdIN_M2h#D8YOhTx36$oiN?IA70+>0ciqt6s z0!lzOl>p_kf~9CeMzs&YL9ny+$vlkf@B)}u?n3XBa{5-o4vvftqo74)%%JZI2tB;g zJK6w#B}`4K0qgjQgF~$!^B*IE=RswqbY@@tlt3U2c0Z5C&cEd7VqL>Alx82hN;TDN zR1HY11`^^*_mLSNl6X@$$D)@5*y>3suH>yal~QZy4kb+r!A*Bs(1|)iOK$lTqkkYj z%~mW$Pti(68i$}lk&fSqjY0O`ZL%OS(%4D13GF-c{Wnfi67PwGte}BtWxfc|&dKgp ztFqYu)#_H#WnG+b%9}EK+@=sH_{W&toCq*z5xSB)wz$6y5o5kRy% z3F0S>i=mUqo-iL1&HWHn?4m%X*SMt1Z2*f#lPUY)Ts&PDq82INisCUK27Xo$;Q(mL zlofXto}ZEzlg-o%ZdW5c(HzlHsPkF`>n@SbIOK&%64+sZl@jBl4$1d*A}pX1Z82$u zqVzBZhr;9oWjiZkRT`!yb9bv&-p2ig zbhMo_9|xFr3<&&>`L5O^TPL9CPZ5mv%h*bkhBK-T}>r%v2As|G+Egn6F+P$MmV zN)Se9E>!Cm{~dhGWbqmJQ7HBnE(D2w&Y7!nqCPWQvCvr&vOCUiziknqj;vjp%nO9; z#818cp!SQu<@~#l&Oe+dPk|#z?pBU;R>l?c@TjxsC7gPmt zR*j1|fQgjuOb)SCXvI!R`CjT}5(ZZayOU}|1g0Y9M&`$WFXvnY-SBr~%MLG&md($1QueMht(wnEx^tqU9!9a$@1QF@l+02&`;&{xyaF)IN zmBHl&xgEuXzyXz|#~v1nswlpu3Iwb}0~~_#|89zlIB(Pg!ll;ePt-xnfr#WV0e*e` zk6v++;{hS8rd6g~3dtuNNCb(xr%%8#PwcV7I2av(qX5JjB2cNNZW!l?1R7I+9}8pw zmL0Ua1Ld>Wj%%P}JcHW$EU$TTy%AVbsW&0ix_x@82WCl2e}xjXu%e3>!%0?pRE1Ds zr7W7uAsv*&0KEDAn8au?GGOf7;}T5^Ykyt}BS}7W_C?eEYV|jr`)3T6X@w-YT=JR% z{XkqbDhvi5;EWYL2!#Auj3mtLHxsT>iFILsKM6`P4W)Hhtk=42R*TvYx(W$jcwEa3 zxCmmk<`;=&L3(2J%!5}7Gz_()w;6K|Fxtt2u%wLTz$j;)NOKL&Fnlg1iT8ZHxj%7C9l)b>XvqN#83306QiJ|DfZ?e%9wIbW!=jW|{fFVWN$f2?1lG?E}bFP5^#aOOKO$7+a0>;o^Z z{`8Nrl`#$8Vpxn~@h(^*SdZ69JWsJ|N%%hcuu6R3{TJM*3D+5C>lb#N*-&ChI${-) zTC_p!bdxX(MPyKyfh414L8usjz=43x;z!HiiYBka$;Za@3@Q=v68I>D+u|6w2W&X~ zf#-+f2_iWO4uJGwcylxoY06Iv+jzJ}68Q$b+tCmEi$6w+bW1YU)l z3II{dz}MgJK-0w6VlrmX1;W139bSTw`+Rgk>sn4z6ik?R3f|H-Kg4v;wiUGy7Vu4DR5@MxB5TTK=aTB}Fg z6hq0gK>`9nvWQz9GfxOB5pn9YF)vQ2=4zM$^bZ&XmNJac$;zjau~jw|D|HveR8j$M z)E%_;SjVJI=Np}6r1O)Powu-i5eHJTI5FIuwYGf0s2h4bP^=CR0urtY@`IFUW9azf z2H3)yD<}l03qV~HDhkN>Mv0k--(o@K#p)zQhAx@kj>h}!8VG(z_CVjC((%6zW~6sw zK_DCg0W7BGzi0*^@|RAhESKwumg~`CKw07`oIRPSNs0P=!xC>Z1{D`SUnk{;7|3@W z-)B3NY6YBqqv7nXq?3QV`=3z|16IxE>B+*j0=#>H4EebPTqP<-@gZScLoEl96|2>R z;bC)YZ9^OnxJb-{>Hw00UH#uQL$4kYDt;M7Iez~?dt;1Q~ii*Y+y zIQr7u=}};-rp^^W(1Mrt#-_ZO6~nn}*bsD;Q{f;hnBFX?)@Xc!D!uE*r`o+3lsFx- zb(Rolm*3uho7|2EFT-nJHW>-eIR{J|gj&HuC^r(^6ESHJ)_18OqH=P2PwPnVMT*IG z`!fe*W%a6bd;#iXp-1(QRwYO;;V}sIRs@i=@d7eZdc4^jUC`1KYo7BN{5NNzhJQ_N zzig5OTj+Fh=`VXg;L>LhBwcede~utonJw|SQ|^b~OePfH#Dkg_@^KbM!TIS~4me}B z_BFYj`zBzo?VJx~a^>B#%)kp|g?NlW)j)Rzx{5{ouC#RAZkKjcTy~)5BFT z6*N%-hM0h-%SM9j1yE^5f@Gq6q0$ETZV}kEgCi`iP!DRl{SLM44S&KMpjNm}z`%eu zutAMaIYnTE4FJjHf|3_}-J^J`!Xa-0L$E58OhBP}!G2GW#07+a9flhL{b_&{JpzGaC9ic`8B<;M?Wc`I_AbfSsp^RfPn?!3g zhJ5?qQ$lXX(UL6GF$0+JfAb9o1I6Eu62cbaW`(Zc+TbK0QqUEpHfxxvA2;sAjxY!` zfJ?Qz*)`v%{A`XoqZ^4@fQ(f{V73chf`Y8G;}dY7c2Mrdv@>tn7R?{G+8Ba@3Kwvl z#ZifJ^SbA*aTT&^$lst!E|FKp%|YeIf5UI+=FhJ3H6Bn5=EJwN)QW}2a+~CuDVe&_p-`jiM5j7G8bAKq9Jn|p-v|2r_hWxHpj5#0+t}et(B2Lt-O@|u_TwTTcj6f>G%a&Zk9uvK6yrBw!aDVi$u?g!t+|kjG9(PUfbvq zN_pTGfe`5oGqkfg6Neg^syIQC`+Hhgr$k%pz>4ot9!+5-$%J zkh>mM==3gXj8xIL0xm3@Jz<5oEfRep78#Tvq&rOOhY;Mnz&nv9mj)K47VZ6D&su12 zbLOH2nUqwPL7(#5b(+SK^2a~~lMSmx=}u&3HMgqAtMxsf75CZe?$LHSRyPtqY%ii% z?n^CPi*#q2^ZE-(3K^)MP`ULRlOk`}xspP`|Bmj2hDS)p*z6v`0Zn0>_rhpfze`Fe z8kmd~XO0PA(8=<%I=U$o5l|H%B+d|RqL@&`pxQQ2;VM^P(4LGDOCRxFji0Om=v8d! z%4>o7C{kfUxR#i1J9v23&tC#Vcg7_tKr{QRxQDN3=KdYV$+|D~lMZ#;!RlCbP+sg$ zY?vO&VoNCP;)-Ys*Iwbk1?)&B&uJ4+hE)Gg2uP|FlvP}TL>fiLjJRT~cVA;{1zo`O z5DS$H~#^P94YZu$=8$Ksmucr>u;%@2qt$5Jm46sKq!_D2-Q=K-X9~| zm(u~L18Bq;!@^iwBDHG8c2+p;2fIyp!m%E3z_qO$h=g`nO#xnp5JPsoi*l0UP#DCp(Maz@;b+Ik-U&pVLn*@)=VnLaAK)`q*;p|V83WG#t=%|*wwAm=EQgj@hmbwzVXLOhl? zwV}h4$~7+U!4SnEgVPCz*uZxEYR@OO0;uUphCc^05zd_c7VI-3;TVjewHKbZso;8cuJC5C&1O_^>V}(3kC4esa#bw_>VKtnBC;Vh-T?Wq5;^l~QuZiP4vmjB%ZivKrYymn_nUHM(Vjj-CF@D&|*U&2cez?T_(OaekXE}YU`?%+=s?}BZ|Q&w6^V#(iIL{i(tlxJOXelXY+GF3k+6e zkiQ$Y%2BWc=J9)XprH{7VcZ!D3c?T|R8(9y!NTFJJ+|1Tm1xM3Sb7v=X_%1;bidCxivs~!WE|o1!w0#C*pQq5G1cjb z7>9oC>`9;y_OiMnaS-|@Xv|C)DaJ_MXY<9XMU_>m@ZY?|qLxMlt`hQ7hFQ^EvaYtR z7zNc{`5h&8RRz(ff-4=~7OLTI6L#RZ33Tq`-AQu$l$tX+6=q1Ii8zR&%NTYr)2ecE zw(dkMO!kpz!H^<}e+75$m~muO%42d~@7*yql~!L5#aOh8O*a@krd#affsAPCq9PG&AOWHJfS(@F4<1zC32<;6Na3`8kezkhIE-BJ7S zI_%=#5o~-I{{$!pv@~jjdzU%Bx$GU)i+vp53@_W>KDa>L*C! zJA?>`hE&+XoGLj`r2TNOGPDx~3y)$aEm3}O5MW=1*B-i21!n&pe*@ro$WRB{=mGI3 zksS~#`SA9E$f;>Jap#4rFHr78_P6YV7 z8fF%#R4Iq}5210H*8{T2SQu9ay*lGHJa|}@N^!sapP*PQX4-`k5?thT4I3!ij_(Z^ zxpFQ6B3{Wu8+4XO893O;7UUcki9G6)Cv?!t;)~(kf>=%uo5}C%j-_O z1cvvCb@B_yk&r88rkBq(Iu5Ogi^vxXMT2l2mUe;*!BlQiMB&Go9ssavD4-I*6b=a$3^1F;Qh+7+1slm@ zp;@D9H}yp2FMnPhnpKIiF=*ml=t)3w{0NUwB`%>&5e%3e4XEi>gG0Q@W?Xv!Z?Oh1 ztCpZlP8t9ay<6Fc_C}J`{HR9K3~H_f3cQr13b#WyAPzVZOk~1#Uf|61L zNZBNre~s@#NdP>OA>E&+i^+NGL*1GAz&Hw0kqv#dw5Nblq5Z$!GL*9ZsaCcu37gOe zRM?&BHqJ-VEn@CaEQL1GbhtIe0EdNoSU_VP#0TS=VFxf^Fqq>C7(vRnYLIhGbDDGi z;=p;a9DmKb8>^Xx44tAjq9@NUn{t3+G$G70GI2cO5CMBDBPT5?(Qy-i#A7=xPu_#s zuHYG`n04O4tX%8VA+O6tfZc?+$R!AS-)D$n(PtQj5)1<~nnOQ^=fi9J3dQvKwgLxl z-|tEgE!f9>`&_Nd-7Fgaw=IMxk~*H*p!SxQ&3CZRZBVN&NQI~s#Oy%zNMQ?|fHCZA zO~en3C_ky{8AQRbNGQt|me9Fb_d7xRJGEpuDg4gRzc801pxsjFw}2AuWw1SWXd_WV z40J}s!`;QnK{G;*RU0WOd8k|gcJe;W3V#JcpZ3GD@_%Wmgtt?&;Mx^3;sn*)fM`rD zmx`8yUAGuVkw&l~`pLQLVWkG&>z8f-;CI`A`~d87hpht&`)Sv}J;pvy8qLOau(57u z!Ys%%2^P=r>Ci9C0Ks)~BPKZude)b#>M|)^`Iw)_@E)Qe zcGsQou*qPC-_HX4C{)F272hD?J`HT_X?)u(3NT~+JAGdT>#dJ;S6)&3St0+qZK z?1Q|W5qXsr%%rQStxYtfF(?&T551)UllK=`pm*9!N&xlpfNeidCv6k_!;69y%fnBNfVY z`AtMUA!9v%%%GK3j2x417|_^5s5k7w$O$RHJ*#7~;Mo?B&@f{1rHf!Y0=)6HZ0wan z@w68oysCSEWNb#!8(Q9Ej2*Ku7VaC*qTj#TBGy-+F{+j%)ToAW2s=Y4p4uIEWmR#Q z-rgIf!_zm~%OdkqQ{`T%I%JyTE)1Ri_n zHd=lcVFJ?0K)mY1mIC{%LFGcFw2dD#|C8f~J*+;=?)jyn8yQ?i&V+50u=aF67NS`T zIsznMzh^;1CWXw%D;IB!GN4phx$yQ>Blb_R@u7IT6a3sr375{LPWAbJ*?sG3;zPP! zjbNZP;({iCATuaPQ4FV|wLB7t3Q8(;p^;F%HwR2TDw`q$qe7%XhJhtzWTujlvHpM? z!0p=g3D6@VM!u-=y%XX{d5t50b=hYfG3P+2=^QMNk7=v{9M1tkGNltSfuzzvcqJgweVNcOzU7zAYTv(7%(uli`z!#laBTiv&waQ)I_|n z5b7_8SRJqMJzt)$z%M+&NED$t)?im{bcD}Ps6MdC#2>ZOL?kt_M`y{^z!TZTLMs|q zO)S(y!MyG1H1nn?ost@h{B;k8(Ry9I#DQEMMk%=%4bDvmNk0zoEyqIZis3*gpryyG zI&QSOE(cFbmC>5S)A;Yoamnj)M@LNjj|$EKV1pf22!Ft%n{0j~og}Q4qGV*P$r#84 zq2jovuy*`Aj=&%&dt8ySW(naXT$%!4NpT_EjRFZoei7GDtD#HS{#7J7hVqHH12(GJrIUIUssa zbf{~{UcEpH8A36ioDdW=JR$IG%mVraatquQph`hvg9--< z4!9MNBY<2$xLV|0AK(~G?9bAeSkXvngG}j za1g*Qz-0jB0Fndz23QOr44^5#Z2YI@UzWau`0MZQlzzeZ-}B#)|I7CO@1K(X6a8<% zFZ2I>__6sn_FuOD4f%)A|KNTZ^Dhwkf5jfy`!(;Ut)4ghS$Nj=AHcs&ya@V(;0N2^ z3O)zCS^8u3N##4F??~Q?ogRATbd2cn)x)U=Y2M0RQu{S@oa#f_7jo{*{akzdmVg3= z9(q67Uhef*v;BVKe;s+D!ao39`{DzHP7pW}=l22J5Aw%^ZWFjU=C3aJWyfwt<-?3l zPB@>&97o`HV!fd^3*Iws?XGt3+UCl3zuX&l?dmqN*yC-DxJE84633)^>c*XdodkOq z!jVANf~PSmISj1k4=Ox`AP&oMh%q2~=rdbNg%J6`cP43cs10lo9t9*Qalp26P9?qR zHo%-fb_KEN(*g*B<7a$q6RJ8h_YfgPm+(*{djb%E@Ndcnxx#c|%b*npK?O6i?G5X= zVX~}1(G@?ASeAak(>Pk6xC=4QHCO7RIp>T96`F#$$f=luJ!^mHV8eN7atDjZ2J%h^ z1QbBCO-j6wSmfwpZU7$i=noJO0qjx-ho-I+L%=A&R4YwUfiy@wFZNH9V|f93X)s`D zMM9_HD$j5#e8goHw1pDa!R;|Lu#Xb0EHQVY^^p3>WK=fk-oA zAu}O&^p$)eMDn*-3Bqllu6T8Z0Ns*UmywW=(*6~C$|i^h;HCtwb6-mkmZ=V2`JIwT zb>Ko#Nkp0sfVV=yc0{0XMrRPymr5m*3(>5KARkRkDWLdXje|VXq&}}ba}Vv}S8Knb z0Kz<>PT!NaBk#tjyburpFUq(LoDnWIa1mMp?JPCpoWNQJ^{XL&EF(@qJaH7q((aJ1 zLWsOV62kC;x7!hwJpC^#;5dA>&7X8Y0T+WnuX%~XOC=f&WKK^9xHIrd8S1^9?g-eO z9v5*vZ95YKb!XsDSZYCjJ}RdO^N2}MGVorS7**dRIZ*4tw6-`Xlsr;GNL*>eoeLL< z1l$e1GGYA88(TX<)!PZ3n~lh;WyficA(MC<4GX3`pN>qSFl%h8;352i0WqzjwU|6X z7-1B>nK*udYLYBOS;sjnn@NsV3sI-A;{FO{?1oc0AYoE!(I0$P`kF{pkq$xw*=Xc? zRRPhbu+l{a*y@5ri%f(f6XOO<5@^i7;scS)!`n_sF@iV97q^%a2nDz!WdU$$&}F*1 zy8?0s-NMA5GrvM*-;P>Qr8CkFGuS%#TrA;+)o`G1P$Xzn zk0Q<<|FUREIp}gI&$4P7Lg-7qXuoGClCSZ@#kYMV3O@`&kE+Ku(7OXDM^v`B6McVA zT=Hl9lE-S}>$H1mEB_PnwvMz(ES{ z?gjuYoGGc2YVy$W41Uv8ix~OX6tSELl2oN%pLX#`>sY^_DfXZg=801~a3*}?HrEpy ztfdGkvpPz8=5Flq-O;1GOHD-=Gw9WZst*P;z4z@DxeI4eYS8!xl2}79^$HK7Bk-Fh z02nw=k@)N`9A54d!XX)xF>}^(h9L##*T~AsX4oG2159o0j8tYPV@-Mm;>WbT2IciF zP*@L8(Zm>pWP5|h{Y?2cc{htgnB5~( z^4gd<_z7cDZ|#-zN+HUqb3q0^9m9P+P^OAXMpu-oI~KtgQ#~ zd=q36FQ=yEB0x$#v8MlGA{xbR0=`yQAIhSBW{xcD?NqP$$F&q5erfT~f(pa{Drr&* zCn+U$V%lIRU7ayuWCOG2l9w+moT20~W((634 zmJr1-oRDM`209QDceG<`BqInbt0be8QrV>ll=U`0>WQh_D8MAJotFu%W0Lhk+1Ldb zY?uN^sOUn3XYP{?d05oj1ke;N1GreR{SQEwD%foqHTN(vj_$q)E_q+|k^dH&w14xe z%=S^LE{JCc-VD$ZQ5*<@si^RLL~-dTxU=E<=uk@iyI>x|OuTbcU(_|(rjotr6%cr1 zBmpstr;Nus`UDOzE_2}th;c=-Bwaz4KfC!_h(b{BLU|yOS^G|M4c1GTV=l|z962Hr zA+6#o$B89gdxR%K6dB~@wb+?~-N{N6-+js?a_joB8l^tu^ionWYhdDN%}DgOwkhTRO9IT$=sM^gcFW-L8)7-3ZDak^`CRx+;u1Z%+H zraIVI!8VjFlp%C}=e~kdF`(eitLgJoR1xtQsEK3e zYseq1j?IZ8MKqUr5PmkO76F`1YtlEk^@V z9!4@iAz>|J)fsd|0YsLO-sU)-DZ)+sNliOpU>wS{K`RikZBiqax=RM{kdFP}a-E<9 zdIGKE;ROY=xCH=%i--#V#3>+NC{B(1(1gE_ngeM8iC=^ktulJVXL1*_K`=-|W;g0h z)sXW6A_OOb2`oD>6#=6(SJ3|2WHwATn@p3K-(FMz^;csO2qnwuO6Gb$E$e32!1hIM zLv+l7lbeWK2>=2}9D40wgu& zeMKWcZZru{Giw&xt^0dOv~<{T`fWf1xB-*E6<7Ql{j$AcUN&%unDG;(Wl#xgmMyu` zHs?BJyf)tG+Pi~l>WTJ4Hj2nGl0Y`i#4%Q%zv3)-jZx-*s}@qO*dPvLL-G$T=5qR+gX)R8jP{K+~B6 zOXLg_6lpvGr0>R%DrN`J(ZOme9(Hb;qb0r`&bt^U4N*Ubv#tigv>O7zYs%5CYDTr> zwH+w~Y63oy9T@tM2R?o#3c}FvlXMNp3L*XmKUMEh7n+0wB=fWsbD^9j=KG%1VBlMw z08@CLOU-Sp28WrIXo1Z16Fkt#C$U^$feY1g?V7u22Z~R|kgFGEdq$vFCWVdf=d>A>1|oxT0s}m)tIhmsEw85nN#PCu;$`nGhP-Pn{kDQHF_dt^k$9O6(G-qI{nX5(1RY zB{KO$j8ANu020&$u@Xu!1fLBO0g_GxlJO*rLu`irAg0Hw+Qy~N^rFj!)O6;qA@Nsl z + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/vraptor/src/main/webapp/vendor/font-awesome/fonts/fontawesome-webfont.ttf b/vraptor/src/main/webapp/vendor/font-awesome/fonts/fontawesome-webfont.ttf new file mode 100644 index 0000000000000000000000000000000000000000..f221e50a2ef60738ba30932d834530cdfe55cb3e GIT binary patch literal 152796 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

=v_rA!CPE#mM^4@)}X7qf;At+v)G*FZd&; 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 ALjV8( literal 0 HcmV?d00001 diff --git a/vraptor/src/main/webapp/vendor/font-awesome/fonts/fontawesome-webfont.woff b/vraptor/src/main/webapp/vendor/font-awesome/fonts/fontawesome-webfont.woff new file mode 100644 index 0000000000000000000000000000000000000000..6e7483cf61b490c08ed644d6ef802c69472eb247 GIT binary patch literal 90412 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%0Ded40&XED0GYFoIh+AV*?9!MR5pBW?X_8Bp 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 IH>08b4`|GD*#H0l literal 0 HcmV?d00001 diff --git a/vraptor/src/main/webapp/vendor/font-awesome/fonts/fontawesome-webfont.woff2 b/vraptor/src/main/webapp/vendor/font-awesome/fonts/fontawesome-webfont.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..7eb74fd127ee5eddf3b95fee6a20dc1684b0963b GIT binary patch literal 71896 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≠dR0E9ICQ{-tcR;@{R^I5P#1GUH!p=-{c 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 literal 0 HcmV?d00001 diff --git a/vraptor/src/main/webapp/vendor/font-awesome/less/animated.less b/vraptor/src/main/webapp/vendor/font-awesome/less/animated.less new file mode 100644 index 0000000000..66ad52a5ba --- /dev/null +++ b/vraptor/src/main/webapp/vendor/font-awesome/less/animated.less @@ -0,0 +1,34 @@ +// Animated Icons +// -------------------------- + +.@{fa-css-prefix}-spin { + -webkit-animation: fa-spin 2s infinite linear; + animation: fa-spin 2s infinite linear; +} + +.@{fa-css-prefix}-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); + } +} diff --git a/vraptor/src/main/webapp/vendor/font-awesome/less/bordered-pulled.less b/vraptor/src/main/webapp/vendor/font-awesome/less/bordered-pulled.less new file mode 100644 index 0000000000..f1c8ad75f5 --- /dev/null +++ b/vraptor/src/main/webapp/vendor/font-awesome/less/bordered-pulled.less @@ -0,0 +1,25 @@ +// Bordered & Pulled +// ------------------------- + +.@{fa-css-prefix}-border { + padding: .2em .25em .15em; + border: solid .08em @fa-border-color; + border-radius: .1em; +} + +.@{fa-css-prefix}-pull-left { float: left; } +.@{fa-css-prefix}-pull-right { float: right; } + +.@{fa-css-prefix} { + &.@{fa-css-prefix}-pull-left { margin-right: .3em; } + &.@{fa-css-prefix}-pull-right { margin-left: .3em; } +} + +/* Deprecated as of 4.4.0 */ +.pull-right { float: right; } +.pull-left { float: left; } + +.@{fa-css-prefix} { + &.pull-left { margin-right: .3em; } + &.pull-right { margin-left: .3em; } +} diff --git a/vraptor/src/main/webapp/vendor/font-awesome/less/core.less b/vraptor/src/main/webapp/vendor/font-awesome/less/core.less new file mode 100644 index 0000000000..c577ac84a6 --- /dev/null +++ b/vraptor/src/main/webapp/vendor/font-awesome/less/core.less @@ -0,0 +1,12 @@ +// Base Class Definition +// ------------------------- + +.@{fa-css-prefix} { + display: inline-block; + font: normal normal normal @fa-font-size-base/@fa-line-height-base FontAwesome; // shortening font declaration + font-size: inherit; // can't have font-size inherit on line above, so need to override + text-rendering: auto; // optimizelegibility throws things off #1094 + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; + +} diff --git a/vraptor/src/main/webapp/vendor/font-awesome/less/fixed-width.less b/vraptor/src/main/webapp/vendor/font-awesome/less/fixed-width.less new file mode 100644 index 0000000000..110289f2f4 --- /dev/null +++ b/vraptor/src/main/webapp/vendor/font-awesome/less/fixed-width.less @@ -0,0 +1,6 @@ +// Fixed Width Icons +// ------------------------- +.@{fa-css-prefix}-fw { + width: (18em / 14); + text-align: center; +} diff --git a/vraptor/src/main/webapp/vendor/font-awesome/less/font-awesome.less b/vraptor/src/main/webapp/vendor/font-awesome/less/font-awesome.less new file mode 100644 index 0000000000..c44e5f466a --- /dev/null +++ b/vraptor/src/main/webapp/vendor/font-awesome/less/font-awesome.less @@ -0,0 +1,18 @@ +/*! + * Font Awesome 4.6.3 by @davegandy - http://fontawesome.io - @fontawesome + * License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License) + */ + +@import "variables.less"; +@import "mixins.less"; +@import "path.less"; +@import "core.less"; +@import "larger.less"; +@import "fixed-width.less"; +@import "list.less"; +@import "bordered-pulled.less"; +@import "animated.less"; +@import "rotated-flipped.less"; +@import "stacked.less"; +@import "icons.less"; +@import "screen-reader.less"; diff --git a/vraptor/src/main/webapp/vendor/font-awesome/less/icons.less b/vraptor/src/main/webapp/vendor/font-awesome/less/icons.less new file mode 100644 index 0000000000..ba21b222d6 --- /dev/null +++ b/vraptor/src/main/webapp/vendor/font-awesome/less/icons.less @@ -0,0 +1,733 @@ +/* Font Awesome uses the Unicode Private Use Area (PUA) to ensure screen + readers do not read off random characters that represent icons */ + +.@{fa-css-prefix}-glass:before { content: @fa-var-glass; } +.@{fa-css-prefix}-music:before { content: @fa-var-music; } +.@{fa-css-prefix}-search:before { content: @fa-var-search; } +.@{fa-css-prefix}-envelope-o:before { content: @fa-var-envelope-o; } +.@{fa-css-prefix}-heart:before { content: @fa-var-heart; } +.@{fa-css-prefix}-star:before { content: @fa-var-star; } +.@{fa-css-prefix}-star-o:before { content: @fa-var-star-o; } +.@{fa-css-prefix}-user:before { content: @fa-var-user; } +.@{fa-css-prefix}-film:before { content: @fa-var-film; } +.@{fa-css-prefix}-th-large:before { content: @fa-var-th-large; } +.@{fa-css-prefix}-th:before { content: @fa-var-th; } +.@{fa-css-prefix}-th-list:before { content: @fa-var-th-list; } +.@{fa-css-prefix}-check:before { content: @fa-var-check; } +.@{fa-css-prefix}-remove:before, +.@{fa-css-prefix}-close:before, +.@{fa-css-prefix}-times:before { content: @fa-var-times; } +.@{fa-css-prefix}-search-plus:before { content: @fa-var-search-plus; } +.@{fa-css-prefix}-search-minus:before { content: @fa-var-search-minus; } +.@{fa-css-prefix}-power-off:before { content: @fa-var-power-off; } +.@{fa-css-prefix}-signal:before { content: @fa-var-signal; } +.@{fa-css-prefix}-gear:before, +.@{fa-css-prefix}-cog:before { content: @fa-var-cog; } +.@{fa-css-prefix}-trash-o:before { content: @fa-var-trash-o; } +.@{fa-css-prefix}-home:before { content: @fa-var-home; } +.@{fa-css-prefix}-file-o:before { content: @fa-var-file-o; } +.@{fa-css-prefix}-clock-o:before { content: @fa-var-clock-o; } +.@{fa-css-prefix}-road:before { content: @fa-var-road; } +.@{fa-css-prefix}-download:before { content: @fa-var-download; } +.@{fa-css-prefix}-arrow-circle-o-down:before { content: @fa-var-arrow-circle-o-down; } +.@{fa-css-prefix}-arrow-circle-o-up:before { content: @fa-var-arrow-circle-o-up; } +.@{fa-css-prefix}-inbox:before { content: @fa-var-inbox; } +.@{fa-css-prefix}-play-circle-o:before { content: @fa-var-play-circle-o; } +.@{fa-css-prefix}-rotate-right:before, +.@{fa-css-prefix}-repeat:before { content: @fa-var-repeat; } +.@{fa-css-prefix}-refresh:before { content: @fa-var-refresh; } +.@{fa-css-prefix}-list-alt:before { content: @fa-var-list-alt; } +.@{fa-css-prefix}-lock:before { content: @fa-var-lock; } +.@{fa-css-prefix}-flag:before { content: @fa-var-flag; } +.@{fa-css-prefix}-headphones:before { content: @fa-var-headphones; } +.@{fa-css-prefix}-volume-off:before { content: @fa-var-volume-off; } +.@{fa-css-prefix}-volume-down:before { content: @fa-var-volume-down; } +.@{fa-css-prefix}-volume-up:before { content: @fa-var-volume-up; } +.@{fa-css-prefix}-qrcode:before { content: @fa-var-qrcode; } +.@{fa-css-prefix}-barcode:before { content: @fa-var-barcode; } +.@{fa-css-prefix}-tag:before { content: @fa-var-tag; } +.@{fa-css-prefix}-tags:before { content: @fa-var-tags; } +.@{fa-css-prefix}-book:before { content: @fa-var-book; } +.@{fa-css-prefix}-bookmark:before { content: @fa-var-bookmark; } +.@{fa-css-prefix}-print:before { content: @fa-var-print; } +.@{fa-css-prefix}-camera:before { content: @fa-var-camera; } +.@{fa-css-prefix}-font:before { content: @fa-var-font; } +.@{fa-css-prefix}-bold:before { content: @fa-var-bold; } +.@{fa-css-prefix}-italic:before { content: @fa-var-italic; } +.@{fa-css-prefix}-text-height:before { content: @fa-var-text-height; } +.@{fa-css-prefix}-text-width:before { content: @fa-var-text-width; } +.@{fa-css-prefix}-align-left:before { content: @fa-var-align-left; } +.@{fa-css-prefix}-align-center:before { content: @fa-var-align-center; } +.@{fa-css-prefix}-align-right:before { content: @fa-var-align-right; } +.@{fa-css-prefix}-align-justify:before { content: @fa-var-align-justify; } +.@{fa-css-prefix}-list:before { content: @fa-var-list; } +.@{fa-css-prefix}-dedent:before, +.@{fa-css-prefix}-outdent:before { content: @fa-var-outdent; } +.@{fa-css-prefix}-indent:before { content: @fa-var-indent; } +.@{fa-css-prefix}-video-camera:before { content: @fa-var-video-camera; } +.@{fa-css-prefix}-photo:before, +.@{fa-css-prefix}-image:before, +.@{fa-css-prefix}-picture-o:before { content: @fa-var-picture-o; } +.@{fa-css-prefix}-pencil:before { content: @fa-var-pencil; } +.@{fa-css-prefix}-map-marker:before { content: @fa-var-map-marker; } +.@{fa-css-prefix}-adjust:before { content: @fa-var-adjust; } +.@{fa-css-prefix}-tint:before { content: @fa-var-tint; } +.@{fa-css-prefix}-edit:before, +.@{fa-css-prefix}-pencil-square-o:before { content: @fa-var-pencil-square-o; } +.@{fa-css-prefix}-share-square-o:before { content: @fa-var-share-square-o; } +.@{fa-css-prefix}-check-square-o:before { content: @fa-var-check-square-o; } +.@{fa-css-prefix}-arrows:before { content: @fa-var-arrows; } +.@{fa-css-prefix}-step-backward:before { content: @fa-var-step-backward; } +.@{fa-css-prefix}-fast-backward:before { content: @fa-var-fast-backward; } +.@{fa-css-prefix}-backward:before { content: @fa-var-backward; } +.@{fa-css-prefix}-play:before { content: @fa-var-play; } +.@{fa-css-prefix}-pause:before { content: @fa-var-pause; } +.@{fa-css-prefix}-stop:before { content: @fa-var-stop; } +.@{fa-css-prefix}-forward:before { content: @fa-var-forward; } +.@{fa-css-prefix}-fast-forward:before { content: @fa-var-fast-forward; } +.@{fa-css-prefix}-step-forward:before { content: @fa-var-step-forward; } +.@{fa-css-prefix}-eject:before { content: @fa-var-eject; } +.@{fa-css-prefix}-chevron-left:before { content: @fa-var-chevron-left; } +.@{fa-css-prefix}-chevron-right:before { content: @fa-var-chevron-right; } +.@{fa-css-prefix}-plus-circle:before { content: @fa-var-plus-circle; } +.@{fa-css-prefix}-minus-circle:before { content: @fa-var-minus-circle; } +.@{fa-css-prefix}-times-circle:before { content: @fa-var-times-circle; } +.@{fa-css-prefix}-check-circle:before { content: @fa-var-check-circle; } +.@{fa-css-prefix}-question-circle:before { content: @fa-var-question-circle; } +.@{fa-css-prefix}-info-circle:before { content: @fa-var-info-circle; } +.@{fa-css-prefix}-crosshairs:before { content: @fa-var-crosshairs; } +.@{fa-css-prefix}-times-circle-o:before { content: @fa-var-times-circle-o; } +.@{fa-css-prefix}-check-circle-o:before { content: @fa-var-check-circle-o; } +.@{fa-css-prefix}-ban:before { content: @fa-var-ban; } +.@{fa-css-prefix}-arrow-left:before { content: @fa-var-arrow-left; } +.@{fa-css-prefix}-arrow-right:before { content: @fa-var-arrow-right; } +.@{fa-css-prefix}-arrow-up:before { content: @fa-var-arrow-up; } +.@{fa-css-prefix}-arrow-down:before { content: @fa-var-arrow-down; } +.@{fa-css-prefix}-mail-forward:before, +.@{fa-css-prefix}-share:before { content: @fa-var-share; } +.@{fa-css-prefix}-expand:before { content: @fa-var-expand; } +.@{fa-css-prefix}-compress:before { content: @fa-var-compress; } +.@{fa-css-prefix}-plus:before { content: @fa-var-plus; } +.@{fa-css-prefix}-minus:before { content: @fa-var-minus; } +.@{fa-css-prefix}-asterisk:before { content: @fa-var-asterisk; } +.@{fa-css-prefix}-exclamation-circle:before { content: @fa-var-exclamation-circle; } +.@{fa-css-prefix}-gift:before { content: @fa-var-gift; } +.@{fa-css-prefix}-leaf:before { content: @fa-var-leaf; } +.@{fa-css-prefix}-fire:before { content: @fa-var-fire; } +.@{fa-css-prefix}-eye:before { content: @fa-var-eye; } +.@{fa-css-prefix}-eye-slash:before { content: @fa-var-eye-slash; } +.@{fa-css-prefix}-warning:before, +.@{fa-css-prefix}-exclamation-triangle:before { content: @fa-var-exclamation-triangle; } +.@{fa-css-prefix}-plane:before { content: @fa-var-plane; } +.@{fa-css-prefix}-calendar:before { content: @fa-var-calendar; } +.@{fa-css-prefix}-random:before { content: @fa-var-random; } +.@{fa-css-prefix}-comment:before { content: @fa-var-comment; } +.@{fa-css-prefix}-magnet:before { content: @fa-var-magnet; } +.@{fa-css-prefix}-chevron-up:before { content: @fa-var-chevron-up; } +.@{fa-css-prefix}-chevron-down:before { content: @fa-var-chevron-down; } +.@{fa-css-prefix}-retweet:before { content: @fa-var-retweet; } +.@{fa-css-prefix}-shopping-cart:before { content: @fa-var-shopping-cart; } +.@{fa-css-prefix}-folder:before { content: @fa-var-folder; } +.@{fa-css-prefix}-folder-open:before { content: @fa-var-folder-open; } +.@{fa-css-prefix}-arrows-v:before { content: @fa-var-arrows-v; } +.@{fa-css-prefix}-arrows-h:before { content: @fa-var-arrows-h; } +.@{fa-css-prefix}-bar-chart-o:before, +.@{fa-css-prefix}-bar-chart:before { content: @fa-var-bar-chart; } +.@{fa-css-prefix}-twitter-square:before { content: @fa-var-twitter-square; } +.@{fa-css-prefix}-facebook-square:before { content: @fa-var-facebook-square; } +.@{fa-css-prefix}-camera-retro:before { content: @fa-var-camera-retro; } +.@{fa-css-prefix}-key:before { content: @fa-var-key; } +.@{fa-css-prefix}-gears:before, +.@{fa-css-prefix}-cogs:before { content: @fa-var-cogs; } +.@{fa-css-prefix}-comments:before { content: @fa-var-comments; } +.@{fa-css-prefix}-thumbs-o-up:before { content: @fa-var-thumbs-o-up; } +.@{fa-css-prefix}-thumbs-o-down:before { content: @fa-var-thumbs-o-down; } +.@{fa-css-prefix}-star-half:before { content: @fa-var-star-half; } +.@{fa-css-prefix}-heart-o:before { content: @fa-var-heart-o; } +.@{fa-css-prefix}-sign-out:before { content: @fa-var-sign-out; } +.@{fa-css-prefix}-linkedin-square:before { content: @fa-var-linkedin-square; } +.@{fa-css-prefix}-thumb-tack:before { content: @fa-var-thumb-tack; } +.@{fa-css-prefix}-external-link:before { content: @fa-var-external-link; } +.@{fa-css-prefix}-sign-in:before { content: @fa-var-sign-in; } +.@{fa-css-prefix}-trophy:before { content: @fa-var-trophy; } +.@{fa-css-prefix}-github-square:before { content: @fa-var-github-square; } +.@{fa-css-prefix}-upload:before { content: @fa-var-upload; } +.@{fa-css-prefix}-lemon-o:before { content: @fa-var-lemon-o; } +.@{fa-css-prefix}-phone:before { content: @fa-var-phone; } +.@{fa-css-prefix}-square-o:before { content: @fa-var-square-o; } +.@{fa-css-prefix}-bookmark-o:before { content: @fa-var-bookmark-o; } +.@{fa-css-prefix}-phone-square:before { content: @fa-var-phone-square; } +.@{fa-css-prefix}-twitter:before { content: @fa-var-twitter; } +.@{fa-css-prefix}-facebook-f:before, +.@{fa-css-prefix}-facebook:before { content: @fa-var-facebook; } +.@{fa-css-prefix}-github:before { content: @fa-var-github; } +.@{fa-css-prefix}-unlock:before { content: @fa-var-unlock; } +.@{fa-css-prefix}-credit-card:before { content: @fa-var-credit-card; } +.@{fa-css-prefix}-feed:before, +.@{fa-css-prefix}-rss:before { content: @fa-var-rss; } +.@{fa-css-prefix}-hdd-o:before { content: @fa-var-hdd-o; } +.@{fa-css-prefix}-bullhorn:before { content: @fa-var-bullhorn; } +.@{fa-css-prefix}-bell:before { content: @fa-var-bell; } +.@{fa-css-prefix}-certificate:before { content: @fa-var-certificate; } +.@{fa-css-prefix}-hand-o-right:before { content: @fa-var-hand-o-right; } +.@{fa-css-prefix}-hand-o-left:before { content: @fa-var-hand-o-left; } +.@{fa-css-prefix}-hand-o-up:before { content: @fa-var-hand-o-up; } +.@{fa-css-prefix}-hand-o-down:before { content: @fa-var-hand-o-down; } +.@{fa-css-prefix}-arrow-circle-left:before { content: @fa-var-arrow-circle-left; } +.@{fa-css-prefix}-arrow-circle-right:before { content: @fa-var-arrow-circle-right; } +.@{fa-css-prefix}-arrow-circle-up:before { content: @fa-var-arrow-circle-up; } +.@{fa-css-prefix}-arrow-circle-down:before { content: @fa-var-arrow-circle-down; } +.@{fa-css-prefix}-globe:before { content: @fa-var-globe; } +.@{fa-css-prefix}-wrench:before { content: @fa-var-wrench; } +.@{fa-css-prefix}-tasks:before { content: @fa-var-tasks; } +.@{fa-css-prefix}-filter:before { content: @fa-var-filter; } +.@{fa-css-prefix}-briefcase:before { content: @fa-var-briefcase; } +.@{fa-css-prefix}-arrows-alt:before { content: @fa-var-arrows-alt; } +.@{fa-css-prefix}-group:before, +.@{fa-css-prefix}-users:before { content: @fa-var-users; } +.@{fa-css-prefix}-chain:before, +.@{fa-css-prefix}-link:before { content: @fa-var-link; } +.@{fa-css-prefix}-cloud:before { content: @fa-var-cloud; } +.@{fa-css-prefix}-flask:before { content: @fa-var-flask; } +.@{fa-css-prefix}-cut:before, +.@{fa-css-prefix}-scissors:before { content: @fa-var-scissors; } +.@{fa-css-prefix}-copy:before, +.@{fa-css-prefix}-files-o:before { content: @fa-var-files-o; } +.@{fa-css-prefix}-paperclip:before { content: @fa-var-paperclip; } +.@{fa-css-prefix}-save:before, +.@{fa-css-prefix}-floppy-o:before { content: @fa-var-floppy-o; } +.@{fa-css-prefix}-square:before { content: @fa-var-square; } +.@{fa-css-prefix}-navicon:before, +.@{fa-css-prefix}-reorder:before, +.@{fa-css-prefix}-bars:before { content: @fa-var-bars; } +.@{fa-css-prefix}-list-ul:before { content: @fa-var-list-ul; } +.@{fa-css-prefix}-list-ol:before { content: @fa-var-list-ol; } +.@{fa-css-prefix}-strikethrough:before { content: @fa-var-strikethrough; } +.@{fa-css-prefix}-underline:before { content: @fa-var-underline; } +.@{fa-css-prefix}-table:before { content: @fa-var-table; } +.@{fa-css-prefix}-magic:before { content: @fa-var-magic; } +.@{fa-css-prefix}-truck:before { content: @fa-var-truck; } +.@{fa-css-prefix}-pinterest:before { content: @fa-var-pinterest; } +.@{fa-css-prefix}-pinterest-square:before { content: @fa-var-pinterest-square; } +.@{fa-css-prefix}-google-plus-square:before { content: @fa-var-google-plus-square; } +.@{fa-css-prefix}-google-plus:before { content: @fa-var-google-plus; } +.@{fa-css-prefix}-money:before { content: @fa-var-money; } +.@{fa-css-prefix}-caret-down:before { content: @fa-var-caret-down; } +.@{fa-css-prefix}-caret-up:before { content: @fa-var-caret-up; } +.@{fa-css-prefix}-caret-left:before { content: @fa-var-caret-left; } +.@{fa-css-prefix}-caret-right:before { content: @fa-var-caret-right; } +.@{fa-css-prefix}-columns:before { content: @fa-var-columns; } +.@{fa-css-prefix}-unsorted:before, +.@{fa-css-prefix}-sort:before { content: @fa-var-sort; } +.@{fa-css-prefix}-sort-down:before, +.@{fa-css-prefix}-sort-desc:before { content: @fa-var-sort-desc; } +.@{fa-css-prefix}-sort-up:before, +.@{fa-css-prefix}-sort-asc:before { content: @fa-var-sort-asc; } +.@{fa-css-prefix}-envelope:before { content: @fa-var-envelope; } +.@{fa-css-prefix}-linkedin:before { content: @fa-var-linkedin; } +.@{fa-css-prefix}-rotate-left:before, +.@{fa-css-prefix}-undo:before { content: @fa-var-undo; } +.@{fa-css-prefix}-legal:before, +.@{fa-css-prefix}-gavel:before { content: @fa-var-gavel; } +.@{fa-css-prefix}-dashboard:before, +.@{fa-css-prefix}-tachometer:before { content: @fa-var-tachometer; } +.@{fa-css-prefix}-comment-o:before { content: @fa-var-comment-o; } +.@{fa-css-prefix}-comments-o:before { content: @fa-var-comments-o; } +.@{fa-css-prefix}-flash:before, +.@{fa-css-prefix}-bolt:before { content: @fa-var-bolt; } +.@{fa-css-prefix}-sitemap:before { content: @fa-var-sitemap; } +.@{fa-css-prefix}-umbrella:before { content: @fa-var-umbrella; } +.@{fa-css-prefix}-paste:before, +.@{fa-css-prefix}-clipboard:before { content: @fa-var-clipboard; } +.@{fa-css-prefix}-lightbulb-o:before { content: @fa-var-lightbulb-o; } +.@{fa-css-prefix}-exchange:before { content: @fa-var-exchange; } +.@{fa-css-prefix}-cloud-download:before { content: @fa-var-cloud-download; } +.@{fa-css-prefix}-cloud-upload:before { content: @fa-var-cloud-upload; } +.@{fa-css-prefix}-user-md:before { content: @fa-var-user-md; } +.@{fa-css-prefix}-stethoscope:before { content: @fa-var-stethoscope; } +.@{fa-css-prefix}-suitcase:before { content: @fa-var-suitcase; } +.@{fa-css-prefix}-bell-o:before { content: @fa-var-bell-o; } +.@{fa-css-prefix}-coffee:before { content: @fa-var-coffee; } +.@{fa-css-prefix}-cutlery:before { content: @fa-var-cutlery; } +.@{fa-css-prefix}-file-text-o:before { content: @fa-var-file-text-o; } +.@{fa-css-prefix}-building-o:before { content: @fa-var-building-o; } +.@{fa-css-prefix}-hospital-o:before { content: @fa-var-hospital-o; } +.@{fa-css-prefix}-ambulance:before { content: @fa-var-ambulance; } +.@{fa-css-prefix}-medkit:before { content: @fa-var-medkit; } +.@{fa-css-prefix}-fighter-jet:before { content: @fa-var-fighter-jet; } +.@{fa-css-prefix}-beer:before { content: @fa-var-beer; } +.@{fa-css-prefix}-h-square:before { content: @fa-var-h-square; } +.@{fa-css-prefix}-plus-square:before { content: @fa-var-plus-square; } +.@{fa-css-prefix}-angle-double-left:before { content: @fa-var-angle-double-left; } +.@{fa-css-prefix}-angle-double-right:before { content: @fa-var-angle-double-right; } +.@{fa-css-prefix}-angle-double-up:before { content: @fa-var-angle-double-up; } +.@{fa-css-prefix}-angle-double-down:before { content: @fa-var-angle-double-down; } +.@{fa-css-prefix}-angle-left:before { content: @fa-var-angle-left; } +.@{fa-css-prefix}-angle-right:before { content: @fa-var-angle-right; } +.@{fa-css-prefix}-angle-up:before { content: @fa-var-angle-up; } +.@{fa-css-prefix}-angle-down:before { content: @fa-var-angle-down; } +.@{fa-css-prefix}-desktop:before { content: @fa-var-desktop; } +.@{fa-css-prefix}-laptop:before { content: @fa-var-laptop; } +.@{fa-css-prefix}-tablet:before { content: @fa-var-tablet; } +.@{fa-css-prefix}-mobile-phone:before, +.@{fa-css-prefix}-mobile:before { content: @fa-var-mobile; } +.@{fa-css-prefix}-circle-o:before { content: @fa-var-circle-o; } +.@{fa-css-prefix}-quote-left:before { content: @fa-var-quote-left; } +.@{fa-css-prefix}-quote-right:before { content: @fa-var-quote-right; } +.@{fa-css-prefix}-spinner:before { content: @fa-var-spinner; } +.@{fa-css-prefix}-circle:before { content: @fa-var-circle; } +.@{fa-css-prefix}-mail-reply:before, +.@{fa-css-prefix}-reply:before { content: @fa-var-reply; } +.@{fa-css-prefix}-github-alt:before { content: @fa-var-github-alt; } +.@{fa-css-prefix}-folder-o:before { content: @fa-var-folder-o; } +.@{fa-css-prefix}-folder-open-o:before { content: @fa-var-folder-open-o; } +.@{fa-css-prefix}-smile-o:before { content: @fa-var-smile-o; } +.@{fa-css-prefix}-frown-o:before { content: @fa-var-frown-o; } +.@{fa-css-prefix}-meh-o:before { content: @fa-var-meh-o; } +.@{fa-css-prefix}-gamepad:before { content: @fa-var-gamepad; } +.@{fa-css-prefix}-keyboard-o:before { content: @fa-var-keyboard-o; } +.@{fa-css-prefix}-flag-o:before { content: @fa-var-flag-o; } +.@{fa-css-prefix}-flag-checkered:before { content: @fa-var-flag-checkered; } +.@{fa-css-prefix}-terminal:before { content: @fa-var-terminal; } +.@{fa-css-prefix}-code:before { content: @fa-var-code; } +.@{fa-css-prefix}-mail-reply-all:before, +.@{fa-css-prefix}-reply-all:before { content: @fa-var-reply-all; } +.@{fa-css-prefix}-star-half-empty:before, +.@{fa-css-prefix}-star-half-full:before, +.@{fa-css-prefix}-star-half-o:before { content: @fa-var-star-half-o; } +.@{fa-css-prefix}-location-arrow:before { content: @fa-var-location-arrow; } +.@{fa-css-prefix}-crop:before { content: @fa-var-crop; } +.@{fa-css-prefix}-code-fork:before { content: @fa-var-code-fork; } +.@{fa-css-prefix}-unlink:before, +.@{fa-css-prefix}-chain-broken:before { content: @fa-var-chain-broken; } +.@{fa-css-prefix}-question:before { content: @fa-var-question; } +.@{fa-css-prefix}-info:before { content: @fa-var-info; } +.@{fa-css-prefix}-exclamation:before { content: @fa-var-exclamation; } +.@{fa-css-prefix}-superscript:before { content: @fa-var-superscript; } +.@{fa-css-prefix}-subscript:before { content: @fa-var-subscript; } +.@{fa-css-prefix}-eraser:before { content: @fa-var-eraser; } +.@{fa-css-prefix}-puzzle-piece:before { content: @fa-var-puzzle-piece; } +.@{fa-css-prefix}-microphone:before { content: @fa-var-microphone; } +.@{fa-css-prefix}-microphone-slash:before { content: @fa-var-microphone-slash; } +.@{fa-css-prefix}-shield:before { content: @fa-var-shield; } +.@{fa-css-prefix}-calendar-o:before { content: @fa-var-calendar-o; } +.@{fa-css-prefix}-fire-extinguisher:before { content: @fa-var-fire-extinguisher; } +.@{fa-css-prefix}-rocket:before { content: @fa-var-rocket; } +.@{fa-css-prefix}-maxcdn:before { content: @fa-var-maxcdn; } +.@{fa-css-prefix}-chevron-circle-left:before { content: @fa-var-chevron-circle-left; } +.@{fa-css-prefix}-chevron-circle-right:before { content: @fa-var-chevron-circle-right; } +.@{fa-css-prefix}-chevron-circle-up:before { content: @fa-var-chevron-circle-up; } +.@{fa-css-prefix}-chevron-circle-down:before { content: @fa-var-chevron-circle-down; } +.@{fa-css-prefix}-html5:before { content: @fa-var-html5; } +.@{fa-css-prefix}-css3:before { content: @fa-var-css3; } +.@{fa-css-prefix}-anchor:before { content: @fa-var-anchor; } +.@{fa-css-prefix}-unlock-alt:before { content: @fa-var-unlock-alt; } +.@{fa-css-prefix}-bullseye:before { content: @fa-var-bullseye; } +.@{fa-css-prefix}-ellipsis-h:before { content: @fa-var-ellipsis-h; } +.@{fa-css-prefix}-ellipsis-v:before { content: @fa-var-ellipsis-v; } +.@{fa-css-prefix}-rss-square:before { content: @fa-var-rss-square; } +.@{fa-css-prefix}-play-circle:before { content: @fa-var-play-circle; } +.@{fa-css-prefix}-ticket:before { content: @fa-var-ticket; } +.@{fa-css-prefix}-minus-square:before { content: @fa-var-minus-square; } +.@{fa-css-prefix}-minus-square-o:before { content: @fa-var-minus-square-o; } +.@{fa-css-prefix}-level-up:before { content: @fa-var-level-up; } +.@{fa-css-prefix}-level-down:before { content: @fa-var-level-down; } +.@{fa-css-prefix}-check-square:before { content: @fa-var-check-square; } +.@{fa-css-prefix}-pencil-square:before { content: @fa-var-pencil-square; } +.@{fa-css-prefix}-external-link-square:before { content: @fa-var-external-link-square; } +.@{fa-css-prefix}-share-square:before { content: @fa-var-share-square; } +.@{fa-css-prefix}-compass:before { content: @fa-var-compass; } +.@{fa-css-prefix}-toggle-down:before, +.@{fa-css-prefix}-caret-square-o-down:before { content: @fa-var-caret-square-o-down; } +.@{fa-css-prefix}-toggle-up:before, +.@{fa-css-prefix}-caret-square-o-up:before { content: @fa-var-caret-square-o-up; } +.@{fa-css-prefix}-toggle-right:before, +.@{fa-css-prefix}-caret-square-o-right:before { content: @fa-var-caret-square-o-right; } +.@{fa-css-prefix}-euro:before, +.@{fa-css-prefix}-eur:before { content: @fa-var-eur; } +.@{fa-css-prefix}-gbp:before { content: @fa-var-gbp; } +.@{fa-css-prefix}-dollar:before, +.@{fa-css-prefix}-usd:before { content: @fa-var-usd; } +.@{fa-css-prefix}-rupee:before, +.@{fa-css-prefix}-inr:before { content: @fa-var-inr; } +.@{fa-css-prefix}-cny:before, +.@{fa-css-prefix}-rmb:before, +.@{fa-css-prefix}-yen:before, +.@{fa-css-prefix}-jpy:before { content: @fa-var-jpy; } +.@{fa-css-prefix}-ruble:before, +.@{fa-css-prefix}-rouble:before, +.@{fa-css-prefix}-rub:before { content: @fa-var-rub; } +.@{fa-css-prefix}-won:before, +.@{fa-css-prefix}-krw:before { content: @fa-var-krw; } +.@{fa-css-prefix}-bitcoin:before, +.@{fa-css-prefix}-btc:before { content: @fa-var-btc; } +.@{fa-css-prefix}-file:before { content: @fa-var-file; } +.@{fa-css-prefix}-file-text:before { content: @fa-var-file-text; } +.@{fa-css-prefix}-sort-alpha-asc:before { content: @fa-var-sort-alpha-asc; } +.@{fa-css-prefix}-sort-alpha-desc:before { content: @fa-var-sort-alpha-desc; } +.@{fa-css-prefix}-sort-amount-asc:before { content: @fa-var-sort-amount-asc; } +.@{fa-css-prefix}-sort-amount-desc:before { content: @fa-var-sort-amount-desc; } +.@{fa-css-prefix}-sort-numeric-asc:before { content: @fa-var-sort-numeric-asc; } +.@{fa-css-prefix}-sort-numeric-desc:before { content: @fa-var-sort-numeric-desc; } +.@{fa-css-prefix}-thumbs-up:before { content: @fa-var-thumbs-up; } +.@{fa-css-prefix}-thumbs-down:before { content: @fa-var-thumbs-down; } +.@{fa-css-prefix}-youtube-square:before { content: @fa-var-youtube-square; } +.@{fa-css-prefix}-youtube:before { content: @fa-var-youtube; } +.@{fa-css-prefix}-xing:before { content: @fa-var-xing; } +.@{fa-css-prefix}-xing-square:before { content: @fa-var-xing-square; } +.@{fa-css-prefix}-youtube-play:before { content: @fa-var-youtube-play; } +.@{fa-css-prefix}-dropbox:before { content: @fa-var-dropbox; } +.@{fa-css-prefix}-stack-overflow:before { content: @fa-var-stack-overflow; } +.@{fa-css-prefix}-instagram:before { content: @fa-var-instagram; } +.@{fa-css-prefix}-flickr:before { content: @fa-var-flickr; } +.@{fa-css-prefix}-adn:before { content: @fa-var-adn; } +.@{fa-css-prefix}-bitbucket:before { content: @fa-var-bitbucket; } +.@{fa-css-prefix}-bitbucket-square:before { content: @fa-var-bitbucket-square; } +.@{fa-css-prefix}-tumblr:before { content: @fa-var-tumblr; } +.@{fa-css-prefix}-tumblr-square:before { content: @fa-var-tumblr-square; } +.@{fa-css-prefix}-long-arrow-down:before { content: @fa-var-long-arrow-down; } +.@{fa-css-prefix}-long-arrow-up:before { content: @fa-var-long-arrow-up; } +.@{fa-css-prefix}-long-arrow-left:before { content: @fa-var-long-arrow-left; } +.@{fa-css-prefix}-long-arrow-right:before { content: @fa-var-long-arrow-right; } +.@{fa-css-prefix}-apple:before { content: @fa-var-apple; } +.@{fa-css-prefix}-windows:before { content: @fa-var-windows; } +.@{fa-css-prefix}-android:before { content: @fa-var-android; } +.@{fa-css-prefix}-linux:before { content: @fa-var-linux; } +.@{fa-css-prefix}-dribbble:before { content: @fa-var-dribbble; } +.@{fa-css-prefix}-skype:before { content: @fa-var-skype; } +.@{fa-css-prefix}-foursquare:before { content: @fa-var-foursquare; } +.@{fa-css-prefix}-trello:before { content: @fa-var-trello; } +.@{fa-css-prefix}-female:before { content: @fa-var-female; } +.@{fa-css-prefix}-male:before { content: @fa-var-male; } +.@{fa-css-prefix}-gittip:before, +.@{fa-css-prefix}-gratipay:before { content: @fa-var-gratipay; } +.@{fa-css-prefix}-sun-o:before { content: @fa-var-sun-o; } +.@{fa-css-prefix}-moon-o:before { content: @fa-var-moon-o; } +.@{fa-css-prefix}-archive:before { content: @fa-var-archive; } +.@{fa-css-prefix}-bug:before { content: @fa-var-bug; } +.@{fa-css-prefix}-vk:before { content: @fa-var-vk; } +.@{fa-css-prefix}-weibo:before { content: @fa-var-weibo; } +.@{fa-css-prefix}-renren:before { content: @fa-var-renren; } +.@{fa-css-prefix}-pagelines:before { content: @fa-var-pagelines; } +.@{fa-css-prefix}-stack-exchange:before { content: @fa-var-stack-exchange; } +.@{fa-css-prefix}-arrow-circle-o-right:before { content: @fa-var-arrow-circle-o-right; } +.@{fa-css-prefix}-arrow-circle-o-left:before { content: @fa-var-arrow-circle-o-left; } +.@{fa-css-prefix}-toggle-left:before, +.@{fa-css-prefix}-caret-square-o-left:before { content: @fa-var-caret-square-o-left; } +.@{fa-css-prefix}-dot-circle-o:before { content: @fa-var-dot-circle-o; } +.@{fa-css-prefix}-wheelchair:before { content: @fa-var-wheelchair; } +.@{fa-css-prefix}-vimeo-square:before { content: @fa-var-vimeo-square; } +.@{fa-css-prefix}-turkish-lira:before, +.@{fa-css-prefix}-try:before { content: @fa-var-try; } +.@{fa-css-prefix}-plus-square-o:before { content: @fa-var-plus-square-o; } +.@{fa-css-prefix}-space-shuttle:before { content: @fa-var-space-shuttle; } +.@{fa-css-prefix}-slack:before { content: @fa-var-slack; } +.@{fa-css-prefix}-envelope-square:before { content: @fa-var-envelope-square; } +.@{fa-css-prefix}-wordpress:before { content: @fa-var-wordpress; } +.@{fa-css-prefix}-openid:before { content: @fa-var-openid; } +.@{fa-css-prefix}-institution:before, +.@{fa-css-prefix}-bank:before, +.@{fa-css-prefix}-university:before { content: @fa-var-university; } +.@{fa-css-prefix}-mortar-board:before, +.@{fa-css-prefix}-graduation-cap:before { content: @fa-var-graduation-cap; } +.@{fa-css-prefix}-yahoo:before { content: @fa-var-yahoo; } +.@{fa-css-prefix}-google:before { content: @fa-var-google; } +.@{fa-css-prefix}-reddit:before { content: @fa-var-reddit; } +.@{fa-css-prefix}-reddit-square:before { content: @fa-var-reddit-square; } +.@{fa-css-prefix}-stumbleupon-circle:before { content: @fa-var-stumbleupon-circle; } +.@{fa-css-prefix}-stumbleupon:before { content: @fa-var-stumbleupon; } +.@{fa-css-prefix}-delicious:before { content: @fa-var-delicious; } +.@{fa-css-prefix}-digg:before { content: @fa-var-digg; } +.@{fa-css-prefix}-pied-piper-pp:before { content: @fa-var-pied-piper-pp; } +.@{fa-css-prefix}-pied-piper-alt:before { content: @fa-var-pied-piper-alt; } +.@{fa-css-prefix}-drupal:before { content: @fa-var-drupal; } +.@{fa-css-prefix}-joomla:before { content: @fa-var-joomla; } +.@{fa-css-prefix}-language:before { content: @fa-var-language; } +.@{fa-css-prefix}-fax:before { content: @fa-var-fax; } +.@{fa-css-prefix}-building:before { content: @fa-var-building; } +.@{fa-css-prefix}-child:before { content: @fa-var-child; } +.@{fa-css-prefix}-paw:before { content: @fa-var-paw; } +.@{fa-css-prefix}-spoon:before { content: @fa-var-spoon; } +.@{fa-css-prefix}-cube:before { content: @fa-var-cube; } +.@{fa-css-prefix}-cubes:before { content: @fa-var-cubes; } +.@{fa-css-prefix}-behance:before { content: @fa-var-behance; } +.@{fa-css-prefix}-behance-square:before { content: @fa-var-behance-square; } +.@{fa-css-prefix}-steam:before { content: @fa-var-steam; } +.@{fa-css-prefix}-steam-square:before { content: @fa-var-steam-square; } +.@{fa-css-prefix}-recycle:before { content: @fa-var-recycle; } +.@{fa-css-prefix}-automobile:before, +.@{fa-css-prefix}-car:before { content: @fa-var-car; } +.@{fa-css-prefix}-cab:before, +.@{fa-css-prefix}-taxi:before { content: @fa-var-taxi; } +.@{fa-css-prefix}-tree:before { content: @fa-var-tree; } +.@{fa-css-prefix}-spotify:before { content: @fa-var-spotify; } +.@{fa-css-prefix}-deviantart:before { content: @fa-var-deviantart; } +.@{fa-css-prefix}-soundcloud:before { content: @fa-var-soundcloud; } +.@{fa-css-prefix}-database:before { content: @fa-var-database; } +.@{fa-css-prefix}-file-pdf-o:before { content: @fa-var-file-pdf-o; } +.@{fa-css-prefix}-file-word-o:before { content: @fa-var-file-word-o; } +.@{fa-css-prefix}-file-excel-o:before { content: @fa-var-file-excel-o; } +.@{fa-css-prefix}-file-powerpoint-o:before { content: @fa-var-file-powerpoint-o; } +.@{fa-css-prefix}-file-photo-o:before, +.@{fa-css-prefix}-file-picture-o:before, +.@{fa-css-prefix}-file-image-o:before { content: @fa-var-file-image-o; } +.@{fa-css-prefix}-file-zip-o:before, +.@{fa-css-prefix}-file-archive-o:before { content: @fa-var-file-archive-o; } +.@{fa-css-prefix}-file-sound-o:before, +.@{fa-css-prefix}-file-audio-o:before { content: @fa-var-file-audio-o; } +.@{fa-css-prefix}-file-movie-o:before, +.@{fa-css-prefix}-file-video-o:before { content: @fa-var-file-video-o; } +.@{fa-css-prefix}-file-code-o:before { content: @fa-var-file-code-o; } +.@{fa-css-prefix}-vine:before { content: @fa-var-vine; } +.@{fa-css-prefix}-codepen:before { content: @fa-var-codepen; } +.@{fa-css-prefix}-jsfiddle:before { content: @fa-var-jsfiddle; } +.@{fa-css-prefix}-life-bouy:before, +.@{fa-css-prefix}-life-buoy:before, +.@{fa-css-prefix}-life-saver:before, +.@{fa-css-prefix}-support:before, +.@{fa-css-prefix}-life-ring:before { content: @fa-var-life-ring; } +.@{fa-css-prefix}-circle-o-notch:before { content: @fa-var-circle-o-notch; } +.@{fa-css-prefix}-ra:before, +.@{fa-css-prefix}-resistance:before, +.@{fa-css-prefix}-rebel:before { content: @fa-var-rebel; } +.@{fa-css-prefix}-ge:before, +.@{fa-css-prefix}-empire:before { content: @fa-var-empire; } +.@{fa-css-prefix}-git-square:before { content: @fa-var-git-square; } +.@{fa-css-prefix}-git:before { content: @fa-var-git; } +.@{fa-css-prefix}-y-combinator-square:before, +.@{fa-css-prefix}-yc-square:before, +.@{fa-css-prefix}-hacker-news:before { content: @fa-var-hacker-news; } +.@{fa-css-prefix}-tencent-weibo:before { content: @fa-var-tencent-weibo; } +.@{fa-css-prefix}-qq:before { content: @fa-var-qq; } +.@{fa-css-prefix}-wechat:before, +.@{fa-css-prefix}-weixin:before { content: @fa-var-weixin; } +.@{fa-css-prefix}-send:before, +.@{fa-css-prefix}-paper-plane:before { content: @fa-var-paper-plane; } +.@{fa-css-prefix}-send-o:before, +.@{fa-css-prefix}-paper-plane-o:before { content: @fa-var-paper-plane-o; } +.@{fa-css-prefix}-history:before { content: @fa-var-history; } +.@{fa-css-prefix}-circle-thin:before { content: @fa-var-circle-thin; } +.@{fa-css-prefix}-header:before { content: @fa-var-header; } +.@{fa-css-prefix}-paragraph:before { content: @fa-var-paragraph; } +.@{fa-css-prefix}-sliders:before { content: @fa-var-sliders; } +.@{fa-css-prefix}-share-alt:before { content: @fa-var-share-alt; } +.@{fa-css-prefix}-share-alt-square:before { content: @fa-var-share-alt-square; } +.@{fa-css-prefix}-bomb:before { content: @fa-var-bomb; } +.@{fa-css-prefix}-soccer-ball-o:before, +.@{fa-css-prefix}-futbol-o:before { content: @fa-var-futbol-o; } +.@{fa-css-prefix}-tty:before { content: @fa-var-tty; } +.@{fa-css-prefix}-binoculars:before { content: @fa-var-binoculars; } +.@{fa-css-prefix}-plug:before { content: @fa-var-plug; } +.@{fa-css-prefix}-slideshare:before { content: @fa-var-slideshare; } +.@{fa-css-prefix}-twitch:before { content: @fa-var-twitch; } +.@{fa-css-prefix}-yelp:before { content: @fa-var-yelp; } +.@{fa-css-prefix}-newspaper-o:before { content: @fa-var-newspaper-o; } +.@{fa-css-prefix}-wifi:before { content: @fa-var-wifi; } +.@{fa-css-prefix}-calculator:before { content: @fa-var-calculator; } +.@{fa-css-prefix}-paypal:before { content: @fa-var-paypal; } +.@{fa-css-prefix}-google-wallet:before { content: @fa-var-google-wallet; } +.@{fa-css-prefix}-cc-visa:before { content: @fa-var-cc-visa; } +.@{fa-css-prefix}-cc-mastercard:before { content: @fa-var-cc-mastercard; } +.@{fa-css-prefix}-cc-discover:before { content: @fa-var-cc-discover; } +.@{fa-css-prefix}-cc-amex:before { content: @fa-var-cc-amex; } +.@{fa-css-prefix}-cc-paypal:before { content: @fa-var-cc-paypal; } +.@{fa-css-prefix}-cc-stripe:before { content: @fa-var-cc-stripe; } +.@{fa-css-prefix}-bell-slash:before { content: @fa-var-bell-slash; } +.@{fa-css-prefix}-bell-slash-o:before { content: @fa-var-bell-slash-o; } +.@{fa-css-prefix}-trash:before { content: @fa-var-trash; } +.@{fa-css-prefix}-copyright:before { content: @fa-var-copyright; } +.@{fa-css-prefix}-at:before { content: @fa-var-at; } +.@{fa-css-prefix}-eyedropper:before { content: @fa-var-eyedropper; } +.@{fa-css-prefix}-paint-brush:before { content: @fa-var-paint-brush; } +.@{fa-css-prefix}-birthday-cake:before { content: @fa-var-birthday-cake; } +.@{fa-css-prefix}-area-chart:before { content: @fa-var-area-chart; } +.@{fa-css-prefix}-pie-chart:before { content: @fa-var-pie-chart; } +.@{fa-css-prefix}-line-chart:before { content: @fa-var-line-chart; } +.@{fa-css-prefix}-lastfm:before { content: @fa-var-lastfm; } +.@{fa-css-prefix}-lastfm-square:before { content: @fa-var-lastfm-square; } +.@{fa-css-prefix}-toggle-off:before { content: @fa-var-toggle-off; } +.@{fa-css-prefix}-toggle-on:before { content: @fa-var-toggle-on; } +.@{fa-css-prefix}-bicycle:before { content: @fa-var-bicycle; } +.@{fa-css-prefix}-bus:before { content: @fa-var-bus; } +.@{fa-css-prefix}-ioxhost:before { content: @fa-var-ioxhost; } +.@{fa-css-prefix}-angellist:before { content: @fa-var-angellist; } +.@{fa-css-prefix}-cc:before { content: @fa-var-cc; } +.@{fa-css-prefix}-shekel:before, +.@{fa-css-prefix}-sheqel:before, +.@{fa-css-prefix}-ils:before { content: @fa-var-ils; } +.@{fa-css-prefix}-meanpath:before { content: @fa-var-meanpath; } +.@{fa-css-prefix}-buysellads:before { content: @fa-var-buysellads; } +.@{fa-css-prefix}-connectdevelop:before { content: @fa-var-connectdevelop; } +.@{fa-css-prefix}-dashcube:before { content: @fa-var-dashcube; } +.@{fa-css-prefix}-forumbee:before { content: @fa-var-forumbee; } +.@{fa-css-prefix}-leanpub:before { content: @fa-var-leanpub; } +.@{fa-css-prefix}-sellsy:before { content: @fa-var-sellsy; } +.@{fa-css-prefix}-shirtsinbulk:before { content: @fa-var-shirtsinbulk; } +.@{fa-css-prefix}-simplybuilt:before { content: @fa-var-simplybuilt; } +.@{fa-css-prefix}-skyatlas:before { content: @fa-var-skyatlas; } +.@{fa-css-prefix}-cart-plus:before { content: @fa-var-cart-plus; } +.@{fa-css-prefix}-cart-arrow-down:before { content: @fa-var-cart-arrow-down; } +.@{fa-css-prefix}-diamond:before { content: @fa-var-diamond; } +.@{fa-css-prefix}-ship:before { content: @fa-var-ship; } +.@{fa-css-prefix}-user-secret:before { content: @fa-var-user-secret; } +.@{fa-css-prefix}-motorcycle:before { content: @fa-var-motorcycle; } +.@{fa-css-prefix}-street-view:before { content: @fa-var-street-view; } +.@{fa-css-prefix}-heartbeat:before { content: @fa-var-heartbeat; } +.@{fa-css-prefix}-venus:before { content: @fa-var-venus; } +.@{fa-css-prefix}-mars:before { content: @fa-var-mars; } +.@{fa-css-prefix}-mercury:before { content: @fa-var-mercury; } +.@{fa-css-prefix}-intersex:before, +.@{fa-css-prefix}-transgender:before { content: @fa-var-transgender; } +.@{fa-css-prefix}-transgender-alt:before { content: @fa-var-transgender-alt; } +.@{fa-css-prefix}-venus-double:before { content: @fa-var-venus-double; } +.@{fa-css-prefix}-mars-double:before { content: @fa-var-mars-double; } +.@{fa-css-prefix}-venus-mars:before { content: @fa-var-venus-mars; } +.@{fa-css-prefix}-mars-stroke:before { content: @fa-var-mars-stroke; } +.@{fa-css-prefix}-mars-stroke-v:before { content: @fa-var-mars-stroke-v; } +.@{fa-css-prefix}-mars-stroke-h:before { content: @fa-var-mars-stroke-h; } +.@{fa-css-prefix}-neuter:before { content: @fa-var-neuter; } +.@{fa-css-prefix}-genderless:before { content: @fa-var-genderless; } +.@{fa-css-prefix}-facebook-official:before { content: @fa-var-facebook-official; } +.@{fa-css-prefix}-pinterest-p:before { content: @fa-var-pinterest-p; } +.@{fa-css-prefix}-whatsapp:before { content: @fa-var-whatsapp; } +.@{fa-css-prefix}-server:before { content: @fa-var-server; } +.@{fa-css-prefix}-user-plus:before { content: @fa-var-user-plus; } +.@{fa-css-prefix}-user-times:before { content: @fa-var-user-times; } +.@{fa-css-prefix}-hotel:before, +.@{fa-css-prefix}-bed:before { content: @fa-var-bed; } +.@{fa-css-prefix}-viacoin:before { content: @fa-var-viacoin; } +.@{fa-css-prefix}-train:before { content: @fa-var-train; } +.@{fa-css-prefix}-subway:before { content: @fa-var-subway; } +.@{fa-css-prefix}-medium:before { content: @fa-var-medium; } +.@{fa-css-prefix}-yc:before, +.@{fa-css-prefix}-y-combinator:before { content: @fa-var-y-combinator; } +.@{fa-css-prefix}-optin-monster:before { content: @fa-var-optin-monster; } +.@{fa-css-prefix}-opencart:before { content: @fa-var-opencart; } +.@{fa-css-prefix}-expeditedssl:before { content: @fa-var-expeditedssl; } +.@{fa-css-prefix}-battery-4:before, +.@{fa-css-prefix}-battery-full:before { content: @fa-var-battery-full; } +.@{fa-css-prefix}-battery-3:before, +.@{fa-css-prefix}-battery-three-quarters:before { content: @fa-var-battery-three-quarters; } +.@{fa-css-prefix}-battery-2:before, +.@{fa-css-prefix}-battery-half:before { content: @fa-var-battery-half; } +.@{fa-css-prefix}-battery-1:before, +.@{fa-css-prefix}-battery-quarter:before { content: @fa-var-battery-quarter; } +.@{fa-css-prefix}-battery-0:before, +.@{fa-css-prefix}-battery-empty:before { content: @fa-var-battery-empty; } +.@{fa-css-prefix}-mouse-pointer:before { content: @fa-var-mouse-pointer; } +.@{fa-css-prefix}-i-cursor:before { content: @fa-var-i-cursor; } +.@{fa-css-prefix}-object-group:before { content: @fa-var-object-group; } +.@{fa-css-prefix}-object-ungroup:before { content: @fa-var-object-ungroup; } +.@{fa-css-prefix}-sticky-note:before { content: @fa-var-sticky-note; } +.@{fa-css-prefix}-sticky-note-o:before { content: @fa-var-sticky-note-o; } +.@{fa-css-prefix}-cc-jcb:before { content: @fa-var-cc-jcb; } +.@{fa-css-prefix}-cc-diners-club:before { content: @fa-var-cc-diners-club; } +.@{fa-css-prefix}-clone:before { content: @fa-var-clone; } +.@{fa-css-prefix}-balance-scale:before { content: @fa-var-balance-scale; } +.@{fa-css-prefix}-hourglass-o:before { content: @fa-var-hourglass-o; } +.@{fa-css-prefix}-hourglass-1:before, +.@{fa-css-prefix}-hourglass-start:before { content: @fa-var-hourglass-start; } +.@{fa-css-prefix}-hourglass-2:before, +.@{fa-css-prefix}-hourglass-half:before { content: @fa-var-hourglass-half; } +.@{fa-css-prefix}-hourglass-3:before, +.@{fa-css-prefix}-hourglass-end:before { content: @fa-var-hourglass-end; } +.@{fa-css-prefix}-hourglass:before { content: @fa-var-hourglass; } +.@{fa-css-prefix}-hand-grab-o:before, +.@{fa-css-prefix}-hand-rock-o:before { content: @fa-var-hand-rock-o; } +.@{fa-css-prefix}-hand-stop-o:before, +.@{fa-css-prefix}-hand-paper-o:before { content: @fa-var-hand-paper-o; } +.@{fa-css-prefix}-hand-scissors-o:before { content: @fa-var-hand-scissors-o; } +.@{fa-css-prefix}-hand-lizard-o:before { content: @fa-var-hand-lizard-o; } +.@{fa-css-prefix}-hand-spock-o:before { content: @fa-var-hand-spock-o; } +.@{fa-css-prefix}-hand-pointer-o:before { content: @fa-var-hand-pointer-o; } +.@{fa-css-prefix}-hand-peace-o:before { content: @fa-var-hand-peace-o; } +.@{fa-css-prefix}-trademark:before { content: @fa-var-trademark; } +.@{fa-css-prefix}-registered:before { content: @fa-var-registered; } +.@{fa-css-prefix}-creative-commons:before { content: @fa-var-creative-commons; } +.@{fa-css-prefix}-gg:before { content: @fa-var-gg; } +.@{fa-css-prefix}-gg-circle:before { content: @fa-var-gg-circle; } +.@{fa-css-prefix}-tripadvisor:before { content: @fa-var-tripadvisor; } +.@{fa-css-prefix}-odnoklassniki:before { content: @fa-var-odnoklassniki; } +.@{fa-css-prefix}-odnoklassniki-square:before { content: @fa-var-odnoklassniki-square; } +.@{fa-css-prefix}-get-pocket:before { content: @fa-var-get-pocket; } +.@{fa-css-prefix}-wikipedia-w:before { content: @fa-var-wikipedia-w; } +.@{fa-css-prefix}-safari:before { content: @fa-var-safari; } +.@{fa-css-prefix}-chrome:before { content: @fa-var-chrome; } +.@{fa-css-prefix}-firefox:before { content: @fa-var-firefox; } +.@{fa-css-prefix}-opera:before { content: @fa-var-opera; } +.@{fa-css-prefix}-internet-explorer:before { content: @fa-var-internet-explorer; } +.@{fa-css-prefix}-tv:before, +.@{fa-css-prefix}-television:before { content: @fa-var-television; } +.@{fa-css-prefix}-contao:before { content: @fa-var-contao; } +.@{fa-css-prefix}-500px:before { content: @fa-var-500px; } +.@{fa-css-prefix}-amazon:before { content: @fa-var-amazon; } +.@{fa-css-prefix}-calendar-plus-o:before { content: @fa-var-calendar-plus-o; } +.@{fa-css-prefix}-calendar-minus-o:before { content: @fa-var-calendar-minus-o; } +.@{fa-css-prefix}-calendar-times-o:before { content: @fa-var-calendar-times-o; } +.@{fa-css-prefix}-calendar-check-o:before { content: @fa-var-calendar-check-o; } +.@{fa-css-prefix}-industry:before { content: @fa-var-industry; } +.@{fa-css-prefix}-map-pin:before { content: @fa-var-map-pin; } +.@{fa-css-prefix}-map-signs:before { content: @fa-var-map-signs; } +.@{fa-css-prefix}-map-o:before { content: @fa-var-map-o; } +.@{fa-css-prefix}-map:before { content: @fa-var-map; } +.@{fa-css-prefix}-commenting:before { content: @fa-var-commenting; } +.@{fa-css-prefix}-commenting-o:before { content: @fa-var-commenting-o; } +.@{fa-css-prefix}-houzz:before { content: @fa-var-houzz; } +.@{fa-css-prefix}-vimeo:before { content: @fa-var-vimeo; } +.@{fa-css-prefix}-black-tie:before { content: @fa-var-black-tie; } +.@{fa-css-prefix}-fonticons:before { content: @fa-var-fonticons; } +.@{fa-css-prefix}-reddit-alien:before { content: @fa-var-reddit-alien; } +.@{fa-css-prefix}-edge:before { content: @fa-var-edge; } +.@{fa-css-prefix}-credit-card-alt:before { content: @fa-var-credit-card-alt; } +.@{fa-css-prefix}-codiepie:before { content: @fa-var-codiepie; } +.@{fa-css-prefix}-modx:before { content: @fa-var-modx; } +.@{fa-css-prefix}-fort-awesome:before { content: @fa-var-fort-awesome; } +.@{fa-css-prefix}-usb:before { content: @fa-var-usb; } +.@{fa-css-prefix}-product-hunt:before { content: @fa-var-product-hunt; } +.@{fa-css-prefix}-mixcloud:before { content: @fa-var-mixcloud; } +.@{fa-css-prefix}-scribd:before { content: @fa-var-scribd; } +.@{fa-css-prefix}-pause-circle:before { content: @fa-var-pause-circle; } +.@{fa-css-prefix}-pause-circle-o:before { content: @fa-var-pause-circle-o; } +.@{fa-css-prefix}-stop-circle:before { content: @fa-var-stop-circle; } +.@{fa-css-prefix}-stop-circle-o:before { content: @fa-var-stop-circle-o; } +.@{fa-css-prefix}-shopping-bag:before { content: @fa-var-shopping-bag; } +.@{fa-css-prefix}-shopping-basket:before { content: @fa-var-shopping-basket; } +.@{fa-css-prefix}-hashtag:before { content: @fa-var-hashtag; } +.@{fa-css-prefix}-bluetooth:before { content: @fa-var-bluetooth; } +.@{fa-css-prefix}-bluetooth-b:before { content: @fa-var-bluetooth-b; } +.@{fa-css-prefix}-percent:before { content: @fa-var-percent; } +.@{fa-css-prefix}-gitlab:before { content: @fa-var-gitlab; } +.@{fa-css-prefix}-wpbeginner:before { content: @fa-var-wpbeginner; } +.@{fa-css-prefix}-wpforms:before { content: @fa-var-wpforms; } +.@{fa-css-prefix}-envira:before { content: @fa-var-envira; } +.@{fa-css-prefix}-universal-access:before { content: @fa-var-universal-access; } +.@{fa-css-prefix}-wheelchair-alt:before { content: @fa-var-wheelchair-alt; } +.@{fa-css-prefix}-question-circle-o:before { content: @fa-var-question-circle-o; } +.@{fa-css-prefix}-blind:before { content: @fa-var-blind; } +.@{fa-css-prefix}-audio-description:before { content: @fa-var-audio-description; } +.@{fa-css-prefix}-volume-control-phone:before { content: @fa-var-volume-control-phone; } +.@{fa-css-prefix}-braille:before { content: @fa-var-braille; } +.@{fa-css-prefix}-assistive-listening-systems:before { content: @fa-var-assistive-listening-systems; } +.@{fa-css-prefix}-asl-interpreting:before, +.@{fa-css-prefix}-american-sign-language-interpreting:before { content: @fa-var-american-sign-language-interpreting; } +.@{fa-css-prefix}-deafness:before, +.@{fa-css-prefix}-hard-of-hearing:before, +.@{fa-css-prefix}-deaf:before { content: @fa-var-deaf; } +.@{fa-css-prefix}-glide:before { content: @fa-var-glide; } +.@{fa-css-prefix}-glide-g:before { content: @fa-var-glide-g; } +.@{fa-css-prefix}-signing:before, +.@{fa-css-prefix}-sign-language:before { content: @fa-var-sign-language; } +.@{fa-css-prefix}-low-vision:before { content: @fa-var-low-vision; } +.@{fa-css-prefix}-viadeo:before { content: @fa-var-viadeo; } +.@{fa-css-prefix}-viadeo-square:before { content: @fa-var-viadeo-square; } +.@{fa-css-prefix}-snapchat:before { content: @fa-var-snapchat; } +.@{fa-css-prefix}-snapchat-ghost:before { content: @fa-var-snapchat-ghost; } +.@{fa-css-prefix}-snapchat-square:before { content: @fa-var-snapchat-square; } +.@{fa-css-prefix}-pied-piper:before { content: @fa-var-pied-piper; } +.@{fa-css-prefix}-first-order:before { content: @fa-var-first-order; } +.@{fa-css-prefix}-yoast:before { content: @fa-var-yoast; } +.@{fa-css-prefix}-themeisle:before { content: @fa-var-themeisle; } +.@{fa-css-prefix}-google-plus-circle:before, +.@{fa-css-prefix}-google-plus-official:before { content: @fa-var-google-plus-official; } +.@{fa-css-prefix}-fa:before, +.@{fa-css-prefix}-font-awesome:before { content: @fa-var-font-awesome; } diff --git a/vraptor/src/main/webapp/vendor/font-awesome/less/larger.less b/vraptor/src/main/webapp/vendor/font-awesome/less/larger.less new file mode 100644 index 0000000000..c9d646770e --- /dev/null +++ b/vraptor/src/main/webapp/vendor/font-awesome/less/larger.less @@ -0,0 +1,13 @@ +// Icon Sizes +// ------------------------- + +/* makes the font 33% larger relative to the icon container */ +.@{fa-css-prefix}-lg { + font-size: (4em / 3); + line-height: (3em / 4); + vertical-align: -15%; +} +.@{fa-css-prefix}-2x { font-size: 2em; } +.@{fa-css-prefix}-3x { font-size: 3em; } +.@{fa-css-prefix}-4x { font-size: 4em; } +.@{fa-css-prefix}-5x { font-size: 5em; } diff --git a/vraptor/src/main/webapp/vendor/font-awesome/less/list.less b/vraptor/src/main/webapp/vendor/font-awesome/less/list.less new file mode 100644 index 0000000000..0b440382f6 --- /dev/null +++ b/vraptor/src/main/webapp/vendor/font-awesome/less/list.less @@ -0,0 +1,19 @@ +// List Icons +// ------------------------- + +.@{fa-css-prefix}-ul { + padding-left: 0; + margin-left: @fa-li-width; + list-style-type: none; + > li { position: relative; } +} +.@{fa-css-prefix}-li { + position: absolute; + left: -@fa-li-width; + width: @fa-li-width; + top: (2em / 14); + text-align: center; + &.@{fa-css-prefix}-lg { + left: (-@fa-li-width + (4em / 14)); + } +} diff --git a/vraptor/src/main/webapp/vendor/font-awesome/less/mixins.less b/vraptor/src/main/webapp/vendor/font-awesome/less/mixins.less new file mode 100644 index 0000000000..beef231d0e --- /dev/null +++ b/vraptor/src/main/webapp/vendor/font-awesome/less/mixins.less @@ -0,0 +1,60 @@ +// Mixins +// -------------------------- + +.fa-icon() { + display: inline-block; + font: normal normal normal @fa-font-size-base/@fa-line-height-base FontAwesome; // shortening font declaration + font-size: inherit; // can't have font-size inherit on line above, so need to override + text-rendering: auto; // optimizelegibility throws things off #1094 + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; + +} + +.fa-icon-rotate(@degrees, @rotation) { + -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=@{rotation})"; + -webkit-transform: rotate(@degrees); + -ms-transform: rotate(@degrees); + transform: rotate(@degrees); +} + +.fa-icon-flip(@horiz, @vert, @rotation) { + -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=@{rotation}, mirror=1)"; + -webkit-transform: scale(@horiz, @vert); + -ms-transform: scale(@horiz, @vert); + transform: scale(@horiz, @vert); +} + + +// Only display content to screen readers. A la Bootstrap 4. +// +// See: http://a11yproject.com/posts/how-to-hide-content/ + +.sr-only() { + position: absolute; + width: 1px; + height: 1px; + padding: 0; + margin: -1px; + overflow: hidden; + clip: rect(0,0,0,0); + border: 0; +} + +// Use in conjunction with .sr-only to only display content when it's focused. +// +// Useful for "Skip to main content" links; see http://www.w3.org/TR/2013/NOTE-WCAG20-TECHS-20130905/G1 +// +// Credit: HTML5 Boilerplate + +.sr-only-focusable() { + &:active, + &:focus { + position: static; + width: auto; + height: auto; + margin: 0; + overflow: visible; + clip: auto; + } +} diff --git a/vraptor/src/main/webapp/vendor/font-awesome/less/path.less b/vraptor/src/main/webapp/vendor/font-awesome/less/path.less new file mode 100644 index 0000000000..835be41f81 --- /dev/null +++ b/vraptor/src/main/webapp/vendor/font-awesome/less/path.less @@ -0,0 +1,15 @@ +/* FONT PATH + * -------------------------- */ + +@font-face { + font-family: 'FontAwesome'; + src: url('@{fa-font-path}/fontawesome-webfont.eot?v=@{fa-version}'); + src: url('@{fa-font-path}/fontawesome-webfont.eot?#iefix&v=@{fa-version}') format('embedded-opentype'), + url('@{fa-font-path}/fontawesome-webfont.woff2?v=@{fa-version}') format('woff2'), + url('@{fa-font-path}/fontawesome-webfont.woff?v=@{fa-version}') format('woff'), + url('@{fa-font-path}/fontawesome-webfont.ttf?v=@{fa-version}') format('truetype'), + url('@{fa-font-path}/fontawesome-webfont.svg?v=@{fa-version}#fontawesomeregular') format('svg'); + // src: url('@{fa-font-path}/FontAwesome.otf') format('opentype'); // used when developing fonts + font-weight: normal; + font-style: normal; +} diff --git a/vraptor/src/main/webapp/vendor/font-awesome/less/rotated-flipped.less b/vraptor/src/main/webapp/vendor/font-awesome/less/rotated-flipped.less new file mode 100644 index 0000000000..f6ba81475b --- /dev/null +++ b/vraptor/src/main/webapp/vendor/font-awesome/less/rotated-flipped.less @@ -0,0 +1,20 @@ +// Rotated & Flipped Icons +// ------------------------- + +.@{fa-css-prefix}-rotate-90 { .fa-icon-rotate(90deg, 1); } +.@{fa-css-prefix}-rotate-180 { .fa-icon-rotate(180deg, 2); } +.@{fa-css-prefix}-rotate-270 { .fa-icon-rotate(270deg, 3); } + +.@{fa-css-prefix}-flip-horizontal { .fa-icon-flip(-1, 1, 0); } +.@{fa-css-prefix}-flip-vertical { .fa-icon-flip(1, -1, 2); } + +// Hook for IE8-9 +// ------------------------- + +:root .@{fa-css-prefix}-rotate-90, +:root .@{fa-css-prefix}-rotate-180, +:root .@{fa-css-prefix}-rotate-270, +:root .@{fa-css-prefix}-flip-horizontal, +:root .@{fa-css-prefix}-flip-vertical { + filter: none; +} diff --git a/vraptor/src/main/webapp/vendor/font-awesome/less/screen-reader.less b/vraptor/src/main/webapp/vendor/font-awesome/less/screen-reader.less new file mode 100644 index 0000000000..11c188196d --- /dev/null +++ b/vraptor/src/main/webapp/vendor/font-awesome/less/screen-reader.less @@ -0,0 +1,5 @@ +// Screen Readers +// ------------------------- + +.sr-only { .sr-only(); } +.sr-only-focusable { .sr-only-focusable(); } diff --git a/vraptor/src/main/webapp/vendor/font-awesome/less/stacked.less b/vraptor/src/main/webapp/vendor/font-awesome/less/stacked.less new file mode 100644 index 0000000000..fc53fb0e7a --- /dev/null +++ b/vraptor/src/main/webapp/vendor/font-awesome/less/stacked.less @@ -0,0 +1,20 @@ +// Stacked Icons +// ------------------------- + +.@{fa-css-prefix}-stack { + position: relative; + display: inline-block; + width: 2em; + height: 2em; + line-height: 2em; + vertical-align: middle; +} +.@{fa-css-prefix}-stack-1x, .@{fa-css-prefix}-stack-2x { + position: absolute; + left: 0; + width: 100%; + text-align: center; +} +.@{fa-css-prefix}-stack-1x { line-height: inherit; } +.@{fa-css-prefix}-stack-2x { font-size: 2em; } +.@{fa-css-prefix}-inverse { color: @fa-inverse; } diff --git a/vraptor/src/main/webapp/vendor/font-awesome/less/variables.less b/vraptor/src/main/webapp/vendor/font-awesome/less/variables.less new file mode 100644 index 0000000000..2b3381975e --- /dev/null +++ b/vraptor/src/main/webapp/vendor/font-awesome/less/variables.less @@ -0,0 +1,744 @@ +// Variables +// -------------------------- + +@fa-font-path: "../fonts"; +@fa-font-size-base: 14px; +@fa-line-height-base: 1; +//@fa-font-path: "//netdna.bootstrapcdn.com/font-awesome/4.6.3/fonts"; // for referencing Bootstrap CDN font files directly +@fa-css-prefix: fa; +@fa-version: "4.6.3"; +@fa-border-color: #eee; +@fa-inverse: #fff; +@fa-li-width: (30em / 14); + +@fa-var-500px: "\f26e"; +@fa-var-adjust: "\f042"; +@fa-var-adn: "\f170"; +@fa-var-align-center: "\f037"; +@fa-var-align-justify: "\f039"; +@fa-var-align-left: "\f036"; +@fa-var-align-right: "\f038"; +@fa-var-amazon: "\f270"; +@fa-var-ambulance: "\f0f9"; +@fa-var-american-sign-language-interpreting: "\f2a3"; +@fa-var-anchor: "\f13d"; +@fa-var-android: "\f17b"; +@fa-var-angellist: "\f209"; +@fa-var-angle-double-down: "\f103"; +@fa-var-angle-double-left: "\f100"; +@fa-var-angle-double-right: "\f101"; +@fa-var-angle-double-up: "\f102"; +@fa-var-angle-down: "\f107"; +@fa-var-angle-left: "\f104"; +@fa-var-angle-right: "\f105"; +@fa-var-angle-up: "\f106"; +@fa-var-apple: "\f179"; +@fa-var-archive: "\f187"; +@fa-var-area-chart: "\f1fe"; +@fa-var-arrow-circle-down: "\f0ab"; +@fa-var-arrow-circle-left: "\f0a8"; +@fa-var-arrow-circle-o-down: "\f01a"; +@fa-var-arrow-circle-o-left: "\f190"; +@fa-var-arrow-circle-o-right: "\f18e"; +@fa-var-arrow-circle-o-up: "\f01b"; +@fa-var-arrow-circle-right: "\f0a9"; +@fa-var-arrow-circle-up: "\f0aa"; +@fa-var-arrow-down: "\f063"; +@fa-var-arrow-left: "\f060"; +@fa-var-arrow-right: "\f061"; +@fa-var-arrow-up: "\f062"; +@fa-var-arrows: "\f047"; +@fa-var-arrows-alt: "\f0b2"; +@fa-var-arrows-h: "\f07e"; +@fa-var-arrows-v: "\f07d"; +@fa-var-asl-interpreting: "\f2a3"; +@fa-var-assistive-listening-systems: "\f2a2"; +@fa-var-asterisk: "\f069"; +@fa-var-at: "\f1fa"; +@fa-var-audio-description: "\f29e"; +@fa-var-automobile: "\f1b9"; +@fa-var-backward: "\f04a"; +@fa-var-balance-scale: "\f24e"; +@fa-var-ban: "\f05e"; +@fa-var-bank: "\f19c"; +@fa-var-bar-chart: "\f080"; +@fa-var-bar-chart-o: "\f080"; +@fa-var-barcode: "\f02a"; +@fa-var-bars: "\f0c9"; +@fa-var-battery-0: "\f244"; +@fa-var-battery-1: "\f243"; +@fa-var-battery-2: "\f242"; +@fa-var-battery-3: "\f241"; +@fa-var-battery-4: "\f240"; +@fa-var-battery-empty: "\f244"; +@fa-var-battery-full: "\f240"; +@fa-var-battery-half: "\f242"; +@fa-var-battery-quarter: "\f243"; +@fa-var-battery-three-quarters: "\f241"; +@fa-var-bed: "\f236"; +@fa-var-beer: "\f0fc"; +@fa-var-behance: "\f1b4"; +@fa-var-behance-square: "\f1b5"; +@fa-var-bell: "\f0f3"; +@fa-var-bell-o: "\f0a2"; +@fa-var-bell-slash: "\f1f6"; +@fa-var-bell-slash-o: "\f1f7"; +@fa-var-bicycle: "\f206"; +@fa-var-binoculars: "\f1e5"; +@fa-var-birthday-cake: "\f1fd"; +@fa-var-bitbucket: "\f171"; +@fa-var-bitbucket-square: "\f172"; +@fa-var-bitcoin: "\f15a"; +@fa-var-black-tie: "\f27e"; +@fa-var-blind: "\f29d"; +@fa-var-bluetooth: "\f293"; +@fa-var-bluetooth-b: "\f294"; +@fa-var-bold: "\f032"; +@fa-var-bolt: "\f0e7"; +@fa-var-bomb: "\f1e2"; +@fa-var-book: "\f02d"; +@fa-var-bookmark: "\f02e"; +@fa-var-bookmark-o: "\f097"; +@fa-var-braille: "\f2a1"; +@fa-var-briefcase: "\f0b1"; +@fa-var-btc: "\f15a"; +@fa-var-bug: "\f188"; +@fa-var-building: "\f1ad"; +@fa-var-building-o: "\f0f7"; +@fa-var-bullhorn: "\f0a1"; +@fa-var-bullseye: "\f140"; +@fa-var-bus: "\f207"; +@fa-var-buysellads: "\f20d"; +@fa-var-cab: "\f1ba"; +@fa-var-calculator: "\f1ec"; +@fa-var-calendar: "\f073"; +@fa-var-calendar-check-o: "\f274"; +@fa-var-calendar-minus-o: "\f272"; +@fa-var-calendar-o: "\f133"; +@fa-var-calendar-plus-o: "\f271"; +@fa-var-calendar-times-o: "\f273"; +@fa-var-camera: "\f030"; +@fa-var-camera-retro: "\f083"; +@fa-var-car: "\f1b9"; +@fa-var-caret-down: "\f0d7"; +@fa-var-caret-left: "\f0d9"; +@fa-var-caret-right: "\f0da"; +@fa-var-caret-square-o-down: "\f150"; +@fa-var-caret-square-o-left: "\f191"; +@fa-var-caret-square-o-right: "\f152"; +@fa-var-caret-square-o-up: "\f151"; +@fa-var-caret-up: "\f0d8"; +@fa-var-cart-arrow-down: "\f218"; +@fa-var-cart-plus: "\f217"; +@fa-var-cc: "\f20a"; +@fa-var-cc-amex: "\f1f3"; +@fa-var-cc-diners-club: "\f24c"; +@fa-var-cc-discover: "\f1f2"; +@fa-var-cc-jcb: "\f24b"; +@fa-var-cc-mastercard: "\f1f1"; +@fa-var-cc-paypal: "\f1f4"; +@fa-var-cc-stripe: "\f1f5"; +@fa-var-cc-visa: "\f1f0"; +@fa-var-certificate: "\f0a3"; +@fa-var-chain: "\f0c1"; +@fa-var-chain-broken: "\f127"; +@fa-var-check: "\f00c"; +@fa-var-check-circle: "\f058"; +@fa-var-check-circle-o: "\f05d"; +@fa-var-check-square: "\f14a"; +@fa-var-check-square-o: "\f046"; +@fa-var-chevron-circle-down: "\f13a"; +@fa-var-chevron-circle-left: "\f137"; +@fa-var-chevron-circle-right: "\f138"; +@fa-var-chevron-circle-up: "\f139"; +@fa-var-chevron-down: "\f078"; +@fa-var-chevron-left: "\f053"; +@fa-var-chevron-right: "\f054"; +@fa-var-chevron-up: "\f077"; +@fa-var-child: "\f1ae"; +@fa-var-chrome: "\f268"; +@fa-var-circle: "\f111"; +@fa-var-circle-o: "\f10c"; +@fa-var-circle-o-notch: "\f1ce"; +@fa-var-circle-thin: "\f1db"; +@fa-var-clipboard: "\f0ea"; +@fa-var-clock-o: "\f017"; +@fa-var-clone: "\f24d"; +@fa-var-close: "\f00d"; +@fa-var-cloud: "\f0c2"; +@fa-var-cloud-download: "\f0ed"; +@fa-var-cloud-upload: "\f0ee"; +@fa-var-cny: "\f157"; +@fa-var-code: "\f121"; +@fa-var-code-fork: "\f126"; +@fa-var-codepen: "\f1cb"; +@fa-var-codiepie: "\f284"; +@fa-var-coffee: "\f0f4"; +@fa-var-cog: "\f013"; +@fa-var-cogs: "\f085"; +@fa-var-columns: "\f0db"; +@fa-var-comment: "\f075"; +@fa-var-comment-o: "\f0e5"; +@fa-var-commenting: "\f27a"; +@fa-var-commenting-o: "\f27b"; +@fa-var-comments: "\f086"; +@fa-var-comments-o: "\f0e6"; +@fa-var-compass: "\f14e"; +@fa-var-compress: "\f066"; +@fa-var-connectdevelop: "\f20e"; +@fa-var-contao: "\f26d"; +@fa-var-copy: "\f0c5"; +@fa-var-copyright: "\f1f9"; +@fa-var-creative-commons: "\f25e"; +@fa-var-credit-card: "\f09d"; +@fa-var-credit-card-alt: "\f283"; +@fa-var-crop: "\f125"; +@fa-var-crosshairs: "\f05b"; +@fa-var-css3: "\f13c"; +@fa-var-cube: "\f1b2"; +@fa-var-cubes: "\f1b3"; +@fa-var-cut: "\f0c4"; +@fa-var-cutlery: "\f0f5"; +@fa-var-dashboard: "\f0e4"; +@fa-var-dashcube: "\f210"; +@fa-var-database: "\f1c0"; +@fa-var-deaf: "\f2a4"; +@fa-var-deafness: "\f2a4"; +@fa-var-dedent: "\f03b"; +@fa-var-delicious: "\f1a5"; +@fa-var-desktop: "\f108"; +@fa-var-deviantart: "\f1bd"; +@fa-var-diamond: "\f219"; +@fa-var-digg: "\f1a6"; +@fa-var-dollar: "\f155"; +@fa-var-dot-circle-o: "\f192"; +@fa-var-download: "\f019"; +@fa-var-dribbble: "\f17d"; +@fa-var-dropbox: "\f16b"; +@fa-var-drupal: "\f1a9"; +@fa-var-edge: "\f282"; +@fa-var-edit: "\f044"; +@fa-var-eject: "\f052"; +@fa-var-ellipsis-h: "\f141"; +@fa-var-ellipsis-v: "\f142"; +@fa-var-empire: "\f1d1"; +@fa-var-envelope: "\f0e0"; +@fa-var-envelope-o: "\f003"; +@fa-var-envelope-square: "\f199"; +@fa-var-envira: "\f299"; +@fa-var-eraser: "\f12d"; +@fa-var-eur: "\f153"; +@fa-var-euro: "\f153"; +@fa-var-exchange: "\f0ec"; +@fa-var-exclamation: "\f12a"; +@fa-var-exclamation-circle: "\f06a"; +@fa-var-exclamation-triangle: "\f071"; +@fa-var-expand: "\f065"; +@fa-var-expeditedssl: "\f23e"; +@fa-var-external-link: "\f08e"; +@fa-var-external-link-square: "\f14c"; +@fa-var-eye: "\f06e"; +@fa-var-eye-slash: "\f070"; +@fa-var-eyedropper: "\f1fb"; +@fa-var-fa: "\f2b4"; +@fa-var-facebook: "\f09a"; +@fa-var-facebook-f: "\f09a"; +@fa-var-facebook-official: "\f230"; +@fa-var-facebook-square: "\f082"; +@fa-var-fast-backward: "\f049"; +@fa-var-fast-forward: "\f050"; +@fa-var-fax: "\f1ac"; +@fa-var-feed: "\f09e"; +@fa-var-female: "\f182"; +@fa-var-fighter-jet: "\f0fb"; +@fa-var-file: "\f15b"; +@fa-var-file-archive-o: "\f1c6"; +@fa-var-file-audio-o: "\f1c7"; +@fa-var-file-code-o: "\f1c9"; +@fa-var-file-excel-o: "\f1c3"; +@fa-var-file-image-o: "\f1c5"; +@fa-var-file-movie-o: "\f1c8"; +@fa-var-file-o: "\f016"; +@fa-var-file-pdf-o: "\f1c1"; +@fa-var-file-photo-o: "\f1c5"; +@fa-var-file-picture-o: "\f1c5"; +@fa-var-file-powerpoint-o: "\f1c4"; +@fa-var-file-sound-o: "\f1c7"; +@fa-var-file-text: "\f15c"; +@fa-var-file-text-o: "\f0f6"; +@fa-var-file-video-o: "\f1c8"; +@fa-var-file-word-o: "\f1c2"; +@fa-var-file-zip-o: "\f1c6"; +@fa-var-files-o: "\f0c5"; +@fa-var-film: "\f008"; +@fa-var-filter: "\f0b0"; +@fa-var-fire: "\f06d"; +@fa-var-fire-extinguisher: "\f134"; +@fa-var-firefox: "\f269"; +@fa-var-first-order: "\f2b0"; +@fa-var-flag: "\f024"; +@fa-var-flag-checkered: "\f11e"; +@fa-var-flag-o: "\f11d"; +@fa-var-flash: "\f0e7"; +@fa-var-flask: "\f0c3"; +@fa-var-flickr: "\f16e"; +@fa-var-floppy-o: "\f0c7"; +@fa-var-folder: "\f07b"; +@fa-var-folder-o: "\f114"; +@fa-var-folder-open: "\f07c"; +@fa-var-folder-open-o: "\f115"; +@fa-var-font: "\f031"; +@fa-var-font-awesome: "\f2b4"; +@fa-var-fonticons: "\f280"; +@fa-var-fort-awesome: "\f286"; +@fa-var-forumbee: "\f211"; +@fa-var-forward: "\f04e"; +@fa-var-foursquare: "\f180"; +@fa-var-frown-o: "\f119"; +@fa-var-futbol-o: "\f1e3"; +@fa-var-gamepad: "\f11b"; +@fa-var-gavel: "\f0e3"; +@fa-var-gbp: "\f154"; +@fa-var-ge: "\f1d1"; +@fa-var-gear: "\f013"; +@fa-var-gears: "\f085"; +@fa-var-genderless: "\f22d"; +@fa-var-get-pocket: "\f265"; +@fa-var-gg: "\f260"; +@fa-var-gg-circle: "\f261"; +@fa-var-gift: "\f06b"; +@fa-var-git: "\f1d3"; +@fa-var-git-square: "\f1d2"; +@fa-var-github: "\f09b"; +@fa-var-github-alt: "\f113"; +@fa-var-github-square: "\f092"; +@fa-var-gitlab: "\f296"; +@fa-var-gittip: "\f184"; +@fa-var-glass: "\f000"; +@fa-var-glide: "\f2a5"; +@fa-var-glide-g: "\f2a6"; +@fa-var-globe: "\f0ac"; +@fa-var-google: "\f1a0"; +@fa-var-google-plus: "\f0d5"; +@fa-var-google-plus-circle: "\f2b3"; +@fa-var-google-plus-official: "\f2b3"; +@fa-var-google-plus-square: "\f0d4"; +@fa-var-google-wallet: "\f1ee"; +@fa-var-graduation-cap: "\f19d"; +@fa-var-gratipay: "\f184"; +@fa-var-group: "\f0c0"; +@fa-var-h-square: "\f0fd"; +@fa-var-hacker-news: "\f1d4"; +@fa-var-hand-grab-o: "\f255"; +@fa-var-hand-lizard-o: "\f258"; +@fa-var-hand-o-down: "\f0a7"; +@fa-var-hand-o-left: "\f0a5"; +@fa-var-hand-o-right: "\f0a4"; +@fa-var-hand-o-up: "\f0a6"; +@fa-var-hand-paper-o: "\f256"; +@fa-var-hand-peace-o: "\f25b"; +@fa-var-hand-pointer-o: "\f25a"; +@fa-var-hand-rock-o: "\f255"; +@fa-var-hand-scissors-o: "\f257"; +@fa-var-hand-spock-o: "\f259"; +@fa-var-hand-stop-o: "\f256"; +@fa-var-hard-of-hearing: "\f2a4"; +@fa-var-hashtag: "\f292"; +@fa-var-hdd-o: "\f0a0"; +@fa-var-header: "\f1dc"; +@fa-var-headphones: "\f025"; +@fa-var-heart: "\f004"; +@fa-var-heart-o: "\f08a"; +@fa-var-heartbeat: "\f21e"; +@fa-var-history: "\f1da"; +@fa-var-home: "\f015"; +@fa-var-hospital-o: "\f0f8"; +@fa-var-hotel: "\f236"; +@fa-var-hourglass: "\f254"; +@fa-var-hourglass-1: "\f251"; +@fa-var-hourglass-2: "\f252"; +@fa-var-hourglass-3: "\f253"; +@fa-var-hourglass-end: "\f253"; +@fa-var-hourglass-half: "\f252"; +@fa-var-hourglass-o: "\f250"; +@fa-var-hourglass-start: "\f251"; +@fa-var-houzz: "\f27c"; +@fa-var-html5: "\f13b"; +@fa-var-i-cursor: "\f246"; +@fa-var-ils: "\f20b"; +@fa-var-image: "\f03e"; +@fa-var-inbox: "\f01c"; +@fa-var-indent: "\f03c"; +@fa-var-industry: "\f275"; +@fa-var-info: "\f129"; +@fa-var-info-circle: "\f05a"; +@fa-var-inr: "\f156"; +@fa-var-instagram: "\f16d"; +@fa-var-institution: "\f19c"; +@fa-var-internet-explorer: "\f26b"; +@fa-var-intersex: "\f224"; +@fa-var-ioxhost: "\f208"; +@fa-var-italic: "\f033"; +@fa-var-joomla: "\f1aa"; +@fa-var-jpy: "\f157"; +@fa-var-jsfiddle: "\f1cc"; +@fa-var-key: "\f084"; +@fa-var-keyboard-o: "\f11c"; +@fa-var-krw: "\f159"; +@fa-var-language: "\f1ab"; +@fa-var-laptop: "\f109"; +@fa-var-lastfm: "\f202"; +@fa-var-lastfm-square: "\f203"; +@fa-var-leaf: "\f06c"; +@fa-var-leanpub: "\f212"; +@fa-var-legal: "\f0e3"; +@fa-var-lemon-o: "\f094"; +@fa-var-level-down: "\f149"; +@fa-var-level-up: "\f148"; +@fa-var-life-bouy: "\f1cd"; +@fa-var-life-buoy: "\f1cd"; +@fa-var-life-ring: "\f1cd"; +@fa-var-life-saver: "\f1cd"; +@fa-var-lightbulb-o: "\f0eb"; +@fa-var-line-chart: "\f201"; +@fa-var-link: "\f0c1"; +@fa-var-linkedin: "\f0e1"; +@fa-var-linkedin-square: "\f08c"; +@fa-var-linux: "\f17c"; +@fa-var-list: "\f03a"; +@fa-var-list-alt: "\f022"; +@fa-var-list-ol: "\f0cb"; +@fa-var-list-ul: "\f0ca"; +@fa-var-location-arrow: "\f124"; +@fa-var-lock: "\f023"; +@fa-var-long-arrow-down: "\f175"; +@fa-var-long-arrow-left: "\f177"; +@fa-var-long-arrow-right: "\f178"; +@fa-var-long-arrow-up: "\f176"; +@fa-var-low-vision: "\f2a8"; +@fa-var-magic: "\f0d0"; +@fa-var-magnet: "\f076"; +@fa-var-mail-forward: "\f064"; +@fa-var-mail-reply: "\f112"; +@fa-var-mail-reply-all: "\f122"; +@fa-var-male: "\f183"; +@fa-var-map: "\f279"; +@fa-var-map-marker: "\f041"; +@fa-var-map-o: "\f278"; +@fa-var-map-pin: "\f276"; +@fa-var-map-signs: "\f277"; +@fa-var-mars: "\f222"; +@fa-var-mars-double: "\f227"; +@fa-var-mars-stroke: "\f229"; +@fa-var-mars-stroke-h: "\f22b"; +@fa-var-mars-stroke-v: "\f22a"; +@fa-var-maxcdn: "\f136"; +@fa-var-meanpath: "\f20c"; +@fa-var-medium: "\f23a"; +@fa-var-medkit: "\f0fa"; +@fa-var-meh-o: "\f11a"; +@fa-var-mercury: "\f223"; +@fa-var-microphone: "\f130"; +@fa-var-microphone-slash: "\f131"; +@fa-var-minus: "\f068"; +@fa-var-minus-circle: "\f056"; +@fa-var-minus-square: "\f146"; +@fa-var-minus-square-o: "\f147"; +@fa-var-mixcloud: "\f289"; +@fa-var-mobile: "\f10b"; +@fa-var-mobile-phone: "\f10b"; +@fa-var-modx: "\f285"; +@fa-var-money: "\f0d6"; +@fa-var-moon-o: "\f186"; +@fa-var-mortar-board: "\f19d"; +@fa-var-motorcycle: "\f21c"; +@fa-var-mouse-pointer: "\f245"; +@fa-var-music: "\f001"; +@fa-var-navicon: "\f0c9"; +@fa-var-neuter: "\f22c"; +@fa-var-newspaper-o: "\f1ea"; +@fa-var-object-group: "\f247"; +@fa-var-object-ungroup: "\f248"; +@fa-var-odnoklassniki: "\f263"; +@fa-var-odnoklassniki-square: "\f264"; +@fa-var-opencart: "\f23d"; +@fa-var-openid: "\f19b"; +@fa-var-opera: "\f26a"; +@fa-var-optin-monster: "\f23c"; +@fa-var-outdent: "\f03b"; +@fa-var-pagelines: "\f18c"; +@fa-var-paint-brush: "\f1fc"; +@fa-var-paper-plane: "\f1d8"; +@fa-var-paper-plane-o: "\f1d9"; +@fa-var-paperclip: "\f0c6"; +@fa-var-paragraph: "\f1dd"; +@fa-var-paste: "\f0ea"; +@fa-var-pause: "\f04c"; +@fa-var-pause-circle: "\f28b"; +@fa-var-pause-circle-o: "\f28c"; +@fa-var-paw: "\f1b0"; +@fa-var-paypal: "\f1ed"; +@fa-var-pencil: "\f040"; +@fa-var-pencil-square: "\f14b"; +@fa-var-pencil-square-o: "\f044"; +@fa-var-percent: "\f295"; +@fa-var-phone: "\f095"; +@fa-var-phone-square: "\f098"; +@fa-var-photo: "\f03e"; +@fa-var-picture-o: "\f03e"; +@fa-var-pie-chart: "\f200"; +@fa-var-pied-piper: "\f2ae"; +@fa-var-pied-piper-alt: "\f1a8"; +@fa-var-pied-piper-pp: "\f1a7"; +@fa-var-pinterest: "\f0d2"; +@fa-var-pinterest-p: "\f231"; +@fa-var-pinterest-square: "\f0d3"; +@fa-var-plane: "\f072"; +@fa-var-play: "\f04b"; +@fa-var-play-circle: "\f144"; +@fa-var-play-circle-o: "\f01d"; +@fa-var-plug: "\f1e6"; +@fa-var-plus: "\f067"; +@fa-var-plus-circle: "\f055"; +@fa-var-plus-square: "\f0fe"; +@fa-var-plus-square-o: "\f196"; +@fa-var-power-off: "\f011"; +@fa-var-print: "\f02f"; +@fa-var-product-hunt: "\f288"; +@fa-var-puzzle-piece: "\f12e"; +@fa-var-qq: "\f1d6"; +@fa-var-qrcode: "\f029"; +@fa-var-question: "\f128"; +@fa-var-question-circle: "\f059"; +@fa-var-question-circle-o: "\f29c"; +@fa-var-quote-left: "\f10d"; +@fa-var-quote-right: "\f10e"; +@fa-var-ra: "\f1d0"; +@fa-var-random: "\f074"; +@fa-var-rebel: "\f1d0"; +@fa-var-recycle: "\f1b8"; +@fa-var-reddit: "\f1a1"; +@fa-var-reddit-alien: "\f281"; +@fa-var-reddit-square: "\f1a2"; +@fa-var-refresh: "\f021"; +@fa-var-registered: "\f25d"; +@fa-var-remove: "\f00d"; +@fa-var-renren: "\f18b"; +@fa-var-reorder: "\f0c9"; +@fa-var-repeat: "\f01e"; +@fa-var-reply: "\f112"; +@fa-var-reply-all: "\f122"; +@fa-var-resistance: "\f1d0"; +@fa-var-retweet: "\f079"; +@fa-var-rmb: "\f157"; +@fa-var-road: "\f018"; +@fa-var-rocket: "\f135"; +@fa-var-rotate-left: "\f0e2"; +@fa-var-rotate-right: "\f01e"; +@fa-var-rouble: "\f158"; +@fa-var-rss: "\f09e"; +@fa-var-rss-square: "\f143"; +@fa-var-rub: "\f158"; +@fa-var-ruble: "\f158"; +@fa-var-rupee: "\f156"; +@fa-var-safari: "\f267"; +@fa-var-save: "\f0c7"; +@fa-var-scissors: "\f0c4"; +@fa-var-scribd: "\f28a"; +@fa-var-search: "\f002"; +@fa-var-search-minus: "\f010"; +@fa-var-search-plus: "\f00e"; +@fa-var-sellsy: "\f213"; +@fa-var-send: "\f1d8"; +@fa-var-send-o: "\f1d9"; +@fa-var-server: "\f233"; +@fa-var-share: "\f064"; +@fa-var-share-alt: "\f1e0"; +@fa-var-share-alt-square: "\f1e1"; +@fa-var-share-square: "\f14d"; +@fa-var-share-square-o: "\f045"; +@fa-var-shekel: "\f20b"; +@fa-var-sheqel: "\f20b"; +@fa-var-shield: "\f132"; +@fa-var-ship: "\f21a"; +@fa-var-shirtsinbulk: "\f214"; +@fa-var-shopping-bag: "\f290"; +@fa-var-shopping-basket: "\f291"; +@fa-var-shopping-cart: "\f07a"; +@fa-var-sign-in: "\f090"; +@fa-var-sign-language: "\f2a7"; +@fa-var-sign-out: "\f08b"; +@fa-var-signal: "\f012"; +@fa-var-signing: "\f2a7"; +@fa-var-simplybuilt: "\f215"; +@fa-var-sitemap: "\f0e8"; +@fa-var-skyatlas: "\f216"; +@fa-var-skype: "\f17e"; +@fa-var-slack: "\f198"; +@fa-var-sliders: "\f1de"; +@fa-var-slideshare: "\f1e7"; +@fa-var-smile-o: "\f118"; +@fa-var-snapchat: "\f2ab"; +@fa-var-snapchat-ghost: "\f2ac"; +@fa-var-snapchat-square: "\f2ad"; +@fa-var-soccer-ball-o: "\f1e3"; +@fa-var-sort: "\f0dc"; +@fa-var-sort-alpha-asc: "\f15d"; +@fa-var-sort-alpha-desc: "\f15e"; +@fa-var-sort-amount-asc: "\f160"; +@fa-var-sort-amount-desc: "\f161"; +@fa-var-sort-asc: "\f0de"; +@fa-var-sort-desc: "\f0dd"; +@fa-var-sort-down: "\f0dd"; +@fa-var-sort-numeric-asc: "\f162"; +@fa-var-sort-numeric-desc: "\f163"; +@fa-var-sort-up: "\f0de"; +@fa-var-soundcloud: "\f1be"; +@fa-var-space-shuttle: "\f197"; +@fa-var-spinner: "\f110"; +@fa-var-spoon: "\f1b1"; +@fa-var-spotify: "\f1bc"; +@fa-var-square: "\f0c8"; +@fa-var-square-o: "\f096"; +@fa-var-stack-exchange: "\f18d"; +@fa-var-stack-overflow: "\f16c"; +@fa-var-star: "\f005"; +@fa-var-star-half: "\f089"; +@fa-var-star-half-empty: "\f123"; +@fa-var-star-half-full: "\f123"; +@fa-var-star-half-o: "\f123"; +@fa-var-star-o: "\f006"; +@fa-var-steam: "\f1b6"; +@fa-var-steam-square: "\f1b7"; +@fa-var-step-backward: "\f048"; +@fa-var-step-forward: "\f051"; +@fa-var-stethoscope: "\f0f1"; +@fa-var-sticky-note: "\f249"; +@fa-var-sticky-note-o: "\f24a"; +@fa-var-stop: "\f04d"; +@fa-var-stop-circle: "\f28d"; +@fa-var-stop-circle-o: "\f28e"; +@fa-var-street-view: "\f21d"; +@fa-var-strikethrough: "\f0cc"; +@fa-var-stumbleupon: "\f1a4"; +@fa-var-stumbleupon-circle: "\f1a3"; +@fa-var-subscript: "\f12c"; +@fa-var-subway: "\f239"; +@fa-var-suitcase: "\f0f2"; +@fa-var-sun-o: "\f185"; +@fa-var-superscript: "\f12b"; +@fa-var-support: "\f1cd"; +@fa-var-table: "\f0ce"; +@fa-var-tablet: "\f10a"; +@fa-var-tachometer: "\f0e4"; +@fa-var-tag: "\f02b"; +@fa-var-tags: "\f02c"; +@fa-var-tasks: "\f0ae"; +@fa-var-taxi: "\f1ba"; +@fa-var-television: "\f26c"; +@fa-var-tencent-weibo: "\f1d5"; +@fa-var-terminal: "\f120"; +@fa-var-text-height: "\f034"; +@fa-var-text-width: "\f035"; +@fa-var-th: "\f00a"; +@fa-var-th-large: "\f009"; +@fa-var-th-list: "\f00b"; +@fa-var-themeisle: "\f2b2"; +@fa-var-thumb-tack: "\f08d"; +@fa-var-thumbs-down: "\f165"; +@fa-var-thumbs-o-down: "\f088"; +@fa-var-thumbs-o-up: "\f087"; +@fa-var-thumbs-up: "\f164"; +@fa-var-ticket: "\f145"; +@fa-var-times: "\f00d"; +@fa-var-times-circle: "\f057"; +@fa-var-times-circle-o: "\f05c"; +@fa-var-tint: "\f043"; +@fa-var-toggle-down: "\f150"; +@fa-var-toggle-left: "\f191"; +@fa-var-toggle-off: "\f204"; +@fa-var-toggle-on: "\f205"; +@fa-var-toggle-right: "\f152"; +@fa-var-toggle-up: "\f151"; +@fa-var-trademark: "\f25c"; +@fa-var-train: "\f238"; +@fa-var-transgender: "\f224"; +@fa-var-transgender-alt: "\f225"; +@fa-var-trash: "\f1f8"; +@fa-var-trash-o: "\f014"; +@fa-var-tree: "\f1bb"; +@fa-var-trello: "\f181"; +@fa-var-tripadvisor: "\f262"; +@fa-var-trophy: "\f091"; +@fa-var-truck: "\f0d1"; +@fa-var-try: "\f195"; +@fa-var-tty: "\f1e4"; +@fa-var-tumblr: "\f173"; +@fa-var-tumblr-square: "\f174"; +@fa-var-turkish-lira: "\f195"; +@fa-var-tv: "\f26c"; +@fa-var-twitch: "\f1e8"; +@fa-var-twitter: "\f099"; +@fa-var-twitter-square: "\f081"; +@fa-var-umbrella: "\f0e9"; +@fa-var-underline: "\f0cd"; +@fa-var-undo: "\f0e2"; +@fa-var-universal-access: "\f29a"; +@fa-var-university: "\f19c"; +@fa-var-unlink: "\f127"; +@fa-var-unlock: "\f09c"; +@fa-var-unlock-alt: "\f13e"; +@fa-var-unsorted: "\f0dc"; +@fa-var-upload: "\f093"; +@fa-var-usb: "\f287"; +@fa-var-usd: "\f155"; +@fa-var-user: "\f007"; +@fa-var-user-md: "\f0f0"; +@fa-var-user-plus: "\f234"; +@fa-var-user-secret: "\f21b"; +@fa-var-user-times: "\f235"; +@fa-var-users: "\f0c0"; +@fa-var-venus: "\f221"; +@fa-var-venus-double: "\f226"; +@fa-var-venus-mars: "\f228"; +@fa-var-viacoin: "\f237"; +@fa-var-viadeo: "\f2a9"; +@fa-var-viadeo-square: "\f2aa"; +@fa-var-video-camera: "\f03d"; +@fa-var-vimeo: "\f27d"; +@fa-var-vimeo-square: "\f194"; +@fa-var-vine: "\f1ca"; +@fa-var-vk: "\f189"; +@fa-var-volume-control-phone: "\f2a0"; +@fa-var-volume-down: "\f027"; +@fa-var-volume-off: "\f026"; +@fa-var-volume-up: "\f028"; +@fa-var-warning: "\f071"; +@fa-var-wechat: "\f1d7"; +@fa-var-weibo: "\f18a"; +@fa-var-weixin: "\f1d7"; +@fa-var-whatsapp: "\f232"; +@fa-var-wheelchair: "\f193"; +@fa-var-wheelchair-alt: "\f29b"; +@fa-var-wifi: "\f1eb"; +@fa-var-wikipedia-w: "\f266"; +@fa-var-windows: "\f17a"; +@fa-var-won: "\f159"; +@fa-var-wordpress: "\f19a"; +@fa-var-wpbeginner: "\f297"; +@fa-var-wpforms: "\f298"; +@fa-var-wrench: "\f0ad"; +@fa-var-xing: "\f168"; +@fa-var-xing-square: "\f169"; +@fa-var-y-combinator: "\f23b"; +@fa-var-y-combinator-square: "\f1d4"; +@fa-var-yahoo: "\f19e"; +@fa-var-yc: "\f23b"; +@fa-var-yc-square: "\f1d4"; +@fa-var-yelp: "\f1e9"; +@fa-var-yen: "\f157"; +@fa-var-yoast: "\f2b1"; +@fa-var-youtube: "\f167"; +@fa-var-youtube-play: "\f16a"; +@fa-var-youtube-square: "\f166"; + diff --git a/vraptor/src/main/webapp/vendor/font-awesome/scss/_animated.scss b/vraptor/src/main/webapp/vendor/font-awesome/scss/_animated.scss new file mode 100644 index 0000000000..8a020dbfff --- /dev/null +++ b/vraptor/src/main/webapp/vendor/font-awesome/scss/_animated.scss @@ -0,0 +1,34 @@ +// Spinning Icons +// -------------------------- + +.#{$fa-css-prefix}-spin { + -webkit-animation: fa-spin 2s infinite linear; + animation: fa-spin 2s infinite linear; +} + +.#{$fa-css-prefix}-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); + } +} diff --git a/vraptor/src/main/webapp/vendor/font-awesome/scss/_bordered-pulled.scss b/vraptor/src/main/webapp/vendor/font-awesome/scss/_bordered-pulled.scss new file mode 100644 index 0000000000..d4b85a02f2 --- /dev/null +++ b/vraptor/src/main/webapp/vendor/font-awesome/scss/_bordered-pulled.scss @@ -0,0 +1,25 @@ +// Bordered & Pulled +// ------------------------- + +.#{$fa-css-prefix}-border { + padding: .2em .25em .15em; + border: solid .08em $fa-border-color; + border-radius: .1em; +} + +.#{$fa-css-prefix}-pull-left { float: left; } +.#{$fa-css-prefix}-pull-right { float: right; } + +.#{$fa-css-prefix} { + &.#{$fa-css-prefix}-pull-left { margin-right: .3em; } + &.#{$fa-css-prefix}-pull-right { margin-left: .3em; } +} + +/* Deprecated as of 4.4.0 */ +.pull-right { float: right; } +.pull-left { float: left; } + +.#{$fa-css-prefix} { + &.pull-left { margin-right: .3em; } + &.pull-right { margin-left: .3em; } +} diff --git a/vraptor/src/main/webapp/vendor/font-awesome/scss/_core.scss b/vraptor/src/main/webapp/vendor/font-awesome/scss/_core.scss new file mode 100644 index 0000000000..7425ef85fc --- /dev/null +++ b/vraptor/src/main/webapp/vendor/font-awesome/scss/_core.scss @@ -0,0 +1,12 @@ +// Base Class Definition +// ------------------------- + +.#{$fa-css-prefix} { + display: inline-block; + font: normal normal normal #{$fa-font-size-base}/#{$fa-line-height-base} FontAwesome; // shortening font declaration + font-size: inherit; // can't have font-size inherit on line above, so need to override + text-rendering: auto; // optimizelegibility throws things off #1094 + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; + +} diff --git a/vraptor/src/main/webapp/vendor/font-awesome/scss/_fixed-width.scss b/vraptor/src/main/webapp/vendor/font-awesome/scss/_fixed-width.scss new file mode 100644 index 0000000000..b221c98133 --- /dev/null +++ b/vraptor/src/main/webapp/vendor/font-awesome/scss/_fixed-width.scss @@ -0,0 +1,6 @@ +// Fixed Width Icons +// ------------------------- +.#{$fa-css-prefix}-fw { + width: (18em / 14); + text-align: center; +} diff --git a/vraptor/src/main/webapp/vendor/font-awesome/scss/_icons.scss b/vraptor/src/main/webapp/vendor/font-awesome/scss/_icons.scss new file mode 100644 index 0000000000..2944344350 --- /dev/null +++ b/vraptor/src/main/webapp/vendor/font-awesome/scss/_icons.scss @@ -0,0 +1,733 @@ +/* Font Awesome uses the Unicode Private Use Area (PUA) to ensure screen + readers do not read off random characters that represent icons */ + +.#{$fa-css-prefix}-glass:before { content: $fa-var-glass; } +.#{$fa-css-prefix}-music:before { content: $fa-var-music; } +.#{$fa-css-prefix}-search:before { content: $fa-var-search; } +.#{$fa-css-prefix}-envelope-o:before { content: $fa-var-envelope-o; } +.#{$fa-css-prefix}-heart:before { content: $fa-var-heart; } +.#{$fa-css-prefix}-star:before { content: $fa-var-star; } +.#{$fa-css-prefix}-star-o:before { content: $fa-var-star-o; } +.#{$fa-css-prefix}-user:before { content: $fa-var-user; } +.#{$fa-css-prefix}-film:before { content: $fa-var-film; } +.#{$fa-css-prefix}-th-large:before { content: $fa-var-th-large; } +.#{$fa-css-prefix}-th:before { content: $fa-var-th; } +.#{$fa-css-prefix}-th-list:before { content: $fa-var-th-list; } +.#{$fa-css-prefix}-check:before { content: $fa-var-check; } +.#{$fa-css-prefix}-remove:before, +.#{$fa-css-prefix}-close:before, +.#{$fa-css-prefix}-times:before { content: $fa-var-times; } +.#{$fa-css-prefix}-search-plus:before { content: $fa-var-search-plus; } +.#{$fa-css-prefix}-search-minus:before { content: $fa-var-search-minus; } +.#{$fa-css-prefix}-power-off:before { content: $fa-var-power-off; } +.#{$fa-css-prefix}-signal:before { content: $fa-var-signal; } +.#{$fa-css-prefix}-gear:before, +.#{$fa-css-prefix}-cog:before { content: $fa-var-cog; } +.#{$fa-css-prefix}-trash-o:before { content: $fa-var-trash-o; } +.#{$fa-css-prefix}-home:before { content: $fa-var-home; } +.#{$fa-css-prefix}-file-o:before { content: $fa-var-file-o; } +.#{$fa-css-prefix}-clock-o:before { content: $fa-var-clock-o; } +.#{$fa-css-prefix}-road:before { content: $fa-var-road; } +.#{$fa-css-prefix}-download:before { content: $fa-var-download; } +.#{$fa-css-prefix}-arrow-circle-o-down:before { content: $fa-var-arrow-circle-o-down; } +.#{$fa-css-prefix}-arrow-circle-o-up:before { content: $fa-var-arrow-circle-o-up; } +.#{$fa-css-prefix}-inbox:before { content: $fa-var-inbox; } +.#{$fa-css-prefix}-play-circle-o:before { content: $fa-var-play-circle-o; } +.#{$fa-css-prefix}-rotate-right:before, +.#{$fa-css-prefix}-repeat:before { content: $fa-var-repeat; } +.#{$fa-css-prefix}-refresh:before { content: $fa-var-refresh; } +.#{$fa-css-prefix}-list-alt:before { content: $fa-var-list-alt; } +.#{$fa-css-prefix}-lock:before { content: $fa-var-lock; } +.#{$fa-css-prefix}-flag:before { content: $fa-var-flag; } +.#{$fa-css-prefix}-headphones:before { content: $fa-var-headphones; } +.#{$fa-css-prefix}-volume-off:before { content: $fa-var-volume-off; } +.#{$fa-css-prefix}-volume-down:before { content: $fa-var-volume-down; } +.#{$fa-css-prefix}-volume-up:before { content: $fa-var-volume-up; } +.#{$fa-css-prefix}-qrcode:before { content: $fa-var-qrcode; } +.#{$fa-css-prefix}-barcode:before { content: $fa-var-barcode; } +.#{$fa-css-prefix}-tag:before { content: $fa-var-tag; } +.#{$fa-css-prefix}-tags:before { content: $fa-var-tags; } +.#{$fa-css-prefix}-book:before { content: $fa-var-book; } +.#{$fa-css-prefix}-bookmark:before { content: $fa-var-bookmark; } +.#{$fa-css-prefix}-print:before { content: $fa-var-print; } +.#{$fa-css-prefix}-camera:before { content: $fa-var-camera; } +.#{$fa-css-prefix}-font:before { content: $fa-var-font; } +.#{$fa-css-prefix}-bold:before { content: $fa-var-bold; } +.#{$fa-css-prefix}-italic:before { content: $fa-var-italic; } +.#{$fa-css-prefix}-text-height:before { content: $fa-var-text-height; } +.#{$fa-css-prefix}-text-width:before { content: $fa-var-text-width; } +.#{$fa-css-prefix}-align-left:before { content: $fa-var-align-left; } +.#{$fa-css-prefix}-align-center:before { content: $fa-var-align-center; } +.#{$fa-css-prefix}-align-right:before { content: $fa-var-align-right; } +.#{$fa-css-prefix}-align-justify:before { content: $fa-var-align-justify; } +.#{$fa-css-prefix}-list:before { content: $fa-var-list; } +.#{$fa-css-prefix}-dedent:before, +.#{$fa-css-prefix}-outdent:before { content: $fa-var-outdent; } +.#{$fa-css-prefix}-indent:before { content: $fa-var-indent; } +.#{$fa-css-prefix}-video-camera:before { content: $fa-var-video-camera; } +.#{$fa-css-prefix}-photo:before, +.#{$fa-css-prefix}-image:before, +.#{$fa-css-prefix}-picture-o:before { content: $fa-var-picture-o; } +.#{$fa-css-prefix}-pencil:before { content: $fa-var-pencil; } +.#{$fa-css-prefix}-map-marker:before { content: $fa-var-map-marker; } +.#{$fa-css-prefix}-adjust:before { content: $fa-var-adjust; } +.#{$fa-css-prefix}-tint:before { content: $fa-var-tint; } +.#{$fa-css-prefix}-edit:before, +.#{$fa-css-prefix}-pencil-square-o:before { content: $fa-var-pencil-square-o; } +.#{$fa-css-prefix}-share-square-o:before { content: $fa-var-share-square-o; } +.#{$fa-css-prefix}-check-square-o:before { content: $fa-var-check-square-o; } +.#{$fa-css-prefix}-arrows:before { content: $fa-var-arrows; } +.#{$fa-css-prefix}-step-backward:before { content: $fa-var-step-backward; } +.#{$fa-css-prefix}-fast-backward:before { content: $fa-var-fast-backward; } +.#{$fa-css-prefix}-backward:before { content: $fa-var-backward; } +.#{$fa-css-prefix}-play:before { content: $fa-var-play; } +.#{$fa-css-prefix}-pause:before { content: $fa-var-pause; } +.#{$fa-css-prefix}-stop:before { content: $fa-var-stop; } +.#{$fa-css-prefix}-forward:before { content: $fa-var-forward; } +.#{$fa-css-prefix}-fast-forward:before { content: $fa-var-fast-forward; } +.#{$fa-css-prefix}-step-forward:before { content: $fa-var-step-forward; } +.#{$fa-css-prefix}-eject:before { content: $fa-var-eject; } +.#{$fa-css-prefix}-chevron-left:before { content: $fa-var-chevron-left; } +.#{$fa-css-prefix}-chevron-right:before { content: $fa-var-chevron-right; } +.#{$fa-css-prefix}-plus-circle:before { content: $fa-var-plus-circle; } +.#{$fa-css-prefix}-minus-circle:before { content: $fa-var-minus-circle; } +.#{$fa-css-prefix}-times-circle:before { content: $fa-var-times-circle; } +.#{$fa-css-prefix}-check-circle:before { content: $fa-var-check-circle; } +.#{$fa-css-prefix}-question-circle:before { content: $fa-var-question-circle; } +.#{$fa-css-prefix}-info-circle:before { content: $fa-var-info-circle; } +.#{$fa-css-prefix}-crosshairs:before { content: $fa-var-crosshairs; } +.#{$fa-css-prefix}-times-circle-o:before { content: $fa-var-times-circle-o; } +.#{$fa-css-prefix}-check-circle-o:before { content: $fa-var-check-circle-o; } +.#{$fa-css-prefix}-ban:before { content: $fa-var-ban; } +.#{$fa-css-prefix}-arrow-left:before { content: $fa-var-arrow-left; } +.#{$fa-css-prefix}-arrow-right:before { content: $fa-var-arrow-right; } +.#{$fa-css-prefix}-arrow-up:before { content: $fa-var-arrow-up; } +.#{$fa-css-prefix}-arrow-down:before { content: $fa-var-arrow-down; } +.#{$fa-css-prefix}-mail-forward:before, +.#{$fa-css-prefix}-share:before { content: $fa-var-share; } +.#{$fa-css-prefix}-expand:before { content: $fa-var-expand; } +.#{$fa-css-prefix}-compress:before { content: $fa-var-compress; } +.#{$fa-css-prefix}-plus:before { content: $fa-var-plus; } +.#{$fa-css-prefix}-minus:before { content: $fa-var-minus; } +.#{$fa-css-prefix}-asterisk:before { content: $fa-var-asterisk; } +.#{$fa-css-prefix}-exclamation-circle:before { content: $fa-var-exclamation-circle; } +.#{$fa-css-prefix}-gift:before { content: $fa-var-gift; } +.#{$fa-css-prefix}-leaf:before { content: $fa-var-leaf; } +.#{$fa-css-prefix}-fire:before { content: $fa-var-fire; } +.#{$fa-css-prefix}-eye:before { content: $fa-var-eye; } +.#{$fa-css-prefix}-eye-slash:before { content: $fa-var-eye-slash; } +.#{$fa-css-prefix}-warning:before, +.#{$fa-css-prefix}-exclamation-triangle:before { content: $fa-var-exclamation-triangle; } +.#{$fa-css-prefix}-plane:before { content: $fa-var-plane; } +.#{$fa-css-prefix}-calendar:before { content: $fa-var-calendar; } +.#{$fa-css-prefix}-random:before { content: $fa-var-random; } +.#{$fa-css-prefix}-comment:before { content: $fa-var-comment; } +.#{$fa-css-prefix}-magnet:before { content: $fa-var-magnet; } +.#{$fa-css-prefix}-chevron-up:before { content: $fa-var-chevron-up; } +.#{$fa-css-prefix}-chevron-down:before { content: $fa-var-chevron-down; } +.#{$fa-css-prefix}-retweet:before { content: $fa-var-retweet; } +.#{$fa-css-prefix}-shopping-cart:before { content: $fa-var-shopping-cart; } +.#{$fa-css-prefix}-folder:before { content: $fa-var-folder; } +.#{$fa-css-prefix}-folder-open:before { content: $fa-var-folder-open; } +.#{$fa-css-prefix}-arrows-v:before { content: $fa-var-arrows-v; } +.#{$fa-css-prefix}-arrows-h:before { content: $fa-var-arrows-h; } +.#{$fa-css-prefix}-bar-chart-o:before, +.#{$fa-css-prefix}-bar-chart:before { content: $fa-var-bar-chart; } +.#{$fa-css-prefix}-twitter-square:before { content: $fa-var-twitter-square; } +.#{$fa-css-prefix}-facebook-square:before { content: $fa-var-facebook-square; } +.#{$fa-css-prefix}-camera-retro:before { content: $fa-var-camera-retro; } +.#{$fa-css-prefix}-key:before { content: $fa-var-key; } +.#{$fa-css-prefix}-gears:before, +.#{$fa-css-prefix}-cogs:before { content: $fa-var-cogs; } +.#{$fa-css-prefix}-comments:before { content: $fa-var-comments; } +.#{$fa-css-prefix}-thumbs-o-up:before { content: $fa-var-thumbs-o-up; } +.#{$fa-css-prefix}-thumbs-o-down:before { content: $fa-var-thumbs-o-down; } +.#{$fa-css-prefix}-star-half:before { content: $fa-var-star-half; } +.#{$fa-css-prefix}-heart-o:before { content: $fa-var-heart-o; } +.#{$fa-css-prefix}-sign-out:before { content: $fa-var-sign-out; } +.#{$fa-css-prefix}-linkedin-square:before { content: $fa-var-linkedin-square; } +.#{$fa-css-prefix}-thumb-tack:before { content: $fa-var-thumb-tack; } +.#{$fa-css-prefix}-external-link:before { content: $fa-var-external-link; } +.#{$fa-css-prefix}-sign-in:before { content: $fa-var-sign-in; } +.#{$fa-css-prefix}-trophy:before { content: $fa-var-trophy; } +.#{$fa-css-prefix}-github-square:before { content: $fa-var-github-square; } +.#{$fa-css-prefix}-upload:before { content: $fa-var-upload; } +.#{$fa-css-prefix}-lemon-o:before { content: $fa-var-lemon-o; } +.#{$fa-css-prefix}-phone:before { content: $fa-var-phone; } +.#{$fa-css-prefix}-square-o:before { content: $fa-var-square-o; } +.#{$fa-css-prefix}-bookmark-o:before { content: $fa-var-bookmark-o; } +.#{$fa-css-prefix}-phone-square:before { content: $fa-var-phone-square; } +.#{$fa-css-prefix}-twitter:before { content: $fa-var-twitter; } +.#{$fa-css-prefix}-facebook-f:before, +.#{$fa-css-prefix}-facebook:before { content: $fa-var-facebook; } +.#{$fa-css-prefix}-github:before { content: $fa-var-github; } +.#{$fa-css-prefix}-unlock:before { content: $fa-var-unlock; } +.#{$fa-css-prefix}-credit-card:before { content: $fa-var-credit-card; } +.#{$fa-css-prefix}-feed:before, +.#{$fa-css-prefix}-rss:before { content: $fa-var-rss; } +.#{$fa-css-prefix}-hdd-o:before { content: $fa-var-hdd-o; } +.#{$fa-css-prefix}-bullhorn:before { content: $fa-var-bullhorn; } +.#{$fa-css-prefix}-bell:before { content: $fa-var-bell; } +.#{$fa-css-prefix}-certificate:before { content: $fa-var-certificate; } +.#{$fa-css-prefix}-hand-o-right:before { content: $fa-var-hand-o-right; } +.#{$fa-css-prefix}-hand-o-left:before { content: $fa-var-hand-o-left; } +.#{$fa-css-prefix}-hand-o-up:before { content: $fa-var-hand-o-up; } +.#{$fa-css-prefix}-hand-o-down:before { content: $fa-var-hand-o-down; } +.#{$fa-css-prefix}-arrow-circle-left:before { content: $fa-var-arrow-circle-left; } +.#{$fa-css-prefix}-arrow-circle-right:before { content: $fa-var-arrow-circle-right; } +.#{$fa-css-prefix}-arrow-circle-up:before { content: $fa-var-arrow-circle-up; } +.#{$fa-css-prefix}-arrow-circle-down:before { content: $fa-var-arrow-circle-down; } +.#{$fa-css-prefix}-globe:before { content: $fa-var-globe; } +.#{$fa-css-prefix}-wrench:before { content: $fa-var-wrench; } +.#{$fa-css-prefix}-tasks:before { content: $fa-var-tasks; } +.#{$fa-css-prefix}-filter:before { content: $fa-var-filter; } +.#{$fa-css-prefix}-briefcase:before { content: $fa-var-briefcase; } +.#{$fa-css-prefix}-arrows-alt:before { content: $fa-var-arrows-alt; } +.#{$fa-css-prefix}-group:before, +.#{$fa-css-prefix}-users:before { content: $fa-var-users; } +.#{$fa-css-prefix}-chain:before, +.#{$fa-css-prefix}-link:before { content: $fa-var-link; } +.#{$fa-css-prefix}-cloud:before { content: $fa-var-cloud; } +.#{$fa-css-prefix}-flask:before { content: $fa-var-flask; } +.#{$fa-css-prefix}-cut:before, +.#{$fa-css-prefix}-scissors:before { content: $fa-var-scissors; } +.#{$fa-css-prefix}-copy:before, +.#{$fa-css-prefix}-files-o:before { content: $fa-var-files-o; } +.#{$fa-css-prefix}-paperclip:before { content: $fa-var-paperclip; } +.#{$fa-css-prefix}-save:before, +.#{$fa-css-prefix}-floppy-o:before { content: $fa-var-floppy-o; } +.#{$fa-css-prefix}-square:before { content: $fa-var-square; } +.#{$fa-css-prefix}-navicon:before, +.#{$fa-css-prefix}-reorder:before, +.#{$fa-css-prefix}-bars:before { content: $fa-var-bars; } +.#{$fa-css-prefix}-list-ul:before { content: $fa-var-list-ul; } +.#{$fa-css-prefix}-list-ol:before { content: $fa-var-list-ol; } +.#{$fa-css-prefix}-strikethrough:before { content: $fa-var-strikethrough; } +.#{$fa-css-prefix}-underline:before { content: $fa-var-underline; } +.#{$fa-css-prefix}-table:before { content: $fa-var-table; } +.#{$fa-css-prefix}-magic:before { content: $fa-var-magic; } +.#{$fa-css-prefix}-truck:before { content: $fa-var-truck; } +.#{$fa-css-prefix}-pinterest:before { content: $fa-var-pinterest; } +.#{$fa-css-prefix}-pinterest-square:before { content: $fa-var-pinterest-square; } +.#{$fa-css-prefix}-google-plus-square:before { content: $fa-var-google-plus-square; } +.#{$fa-css-prefix}-google-plus:before { content: $fa-var-google-plus; } +.#{$fa-css-prefix}-money:before { content: $fa-var-money; } +.#{$fa-css-prefix}-caret-down:before { content: $fa-var-caret-down; } +.#{$fa-css-prefix}-caret-up:before { content: $fa-var-caret-up; } +.#{$fa-css-prefix}-caret-left:before { content: $fa-var-caret-left; } +.#{$fa-css-prefix}-caret-right:before { content: $fa-var-caret-right; } +.#{$fa-css-prefix}-columns:before { content: $fa-var-columns; } +.#{$fa-css-prefix}-unsorted:before, +.#{$fa-css-prefix}-sort:before { content: $fa-var-sort; } +.#{$fa-css-prefix}-sort-down:before, +.#{$fa-css-prefix}-sort-desc:before { content: $fa-var-sort-desc; } +.#{$fa-css-prefix}-sort-up:before, +.#{$fa-css-prefix}-sort-asc:before { content: $fa-var-sort-asc; } +.#{$fa-css-prefix}-envelope:before { content: $fa-var-envelope; } +.#{$fa-css-prefix}-linkedin:before { content: $fa-var-linkedin; } +.#{$fa-css-prefix}-rotate-left:before, +.#{$fa-css-prefix}-undo:before { content: $fa-var-undo; } +.#{$fa-css-prefix}-legal:before, +.#{$fa-css-prefix}-gavel:before { content: $fa-var-gavel; } +.#{$fa-css-prefix}-dashboard:before, +.#{$fa-css-prefix}-tachometer:before { content: $fa-var-tachometer; } +.#{$fa-css-prefix}-comment-o:before { content: $fa-var-comment-o; } +.#{$fa-css-prefix}-comments-o:before { content: $fa-var-comments-o; } +.#{$fa-css-prefix}-flash:before, +.#{$fa-css-prefix}-bolt:before { content: $fa-var-bolt; } +.#{$fa-css-prefix}-sitemap:before { content: $fa-var-sitemap; } +.#{$fa-css-prefix}-umbrella:before { content: $fa-var-umbrella; } +.#{$fa-css-prefix}-paste:before, +.#{$fa-css-prefix}-clipboard:before { content: $fa-var-clipboard; } +.#{$fa-css-prefix}-lightbulb-o:before { content: $fa-var-lightbulb-o; } +.#{$fa-css-prefix}-exchange:before { content: $fa-var-exchange; } +.#{$fa-css-prefix}-cloud-download:before { content: $fa-var-cloud-download; } +.#{$fa-css-prefix}-cloud-upload:before { content: $fa-var-cloud-upload; } +.#{$fa-css-prefix}-user-md:before { content: $fa-var-user-md; } +.#{$fa-css-prefix}-stethoscope:before { content: $fa-var-stethoscope; } +.#{$fa-css-prefix}-suitcase:before { content: $fa-var-suitcase; } +.#{$fa-css-prefix}-bell-o:before { content: $fa-var-bell-o; } +.#{$fa-css-prefix}-coffee:before { content: $fa-var-coffee; } +.#{$fa-css-prefix}-cutlery:before { content: $fa-var-cutlery; } +.#{$fa-css-prefix}-file-text-o:before { content: $fa-var-file-text-o; } +.#{$fa-css-prefix}-building-o:before { content: $fa-var-building-o; } +.#{$fa-css-prefix}-hospital-o:before { content: $fa-var-hospital-o; } +.#{$fa-css-prefix}-ambulance:before { content: $fa-var-ambulance; } +.#{$fa-css-prefix}-medkit:before { content: $fa-var-medkit; } +.#{$fa-css-prefix}-fighter-jet:before { content: $fa-var-fighter-jet; } +.#{$fa-css-prefix}-beer:before { content: $fa-var-beer; } +.#{$fa-css-prefix}-h-square:before { content: $fa-var-h-square; } +.#{$fa-css-prefix}-plus-square:before { content: $fa-var-plus-square; } +.#{$fa-css-prefix}-angle-double-left:before { content: $fa-var-angle-double-left; } +.#{$fa-css-prefix}-angle-double-right:before { content: $fa-var-angle-double-right; } +.#{$fa-css-prefix}-angle-double-up:before { content: $fa-var-angle-double-up; } +.#{$fa-css-prefix}-angle-double-down:before { content: $fa-var-angle-double-down; } +.#{$fa-css-prefix}-angle-left:before { content: $fa-var-angle-left; } +.#{$fa-css-prefix}-angle-right:before { content: $fa-var-angle-right; } +.#{$fa-css-prefix}-angle-up:before { content: $fa-var-angle-up; } +.#{$fa-css-prefix}-angle-down:before { content: $fa-var-angle-down; } +.#{$fa-css-prefix}-desktop:before { content: $fa-var-desktop; } +.#{$fa-css-prefix}-laptop:before { content: $fa-var-laptop; } +.#{$fa-css-prefix}-tablet:before { content: $fa-var-tablet; } +.#{$fa-css-prefix}-mobile-phone:before, +.#{$fa-css-prefix}-mobile:before { content: $fa-var-mobile; } +.#{$fa-css-prefix}-circle-o:before { content: $fa-var-circle-o; } +.#{$fa-css-prefix}-quote-left:before { content: $fa-var-quote-left; } +.#{$fa-css-prefix}-quote-right:before { content: $fa-var-quote-right; } +.#{$fa-css-prefix}-spinner:before { content: $fa-var-spinner; } +.#{$fa-css-prefix}-circle:before { content: $fa-var-circle; } +.#{$fa-css-prefix}-mail-reply:before, +.#{$fa-css-prefix}-reply:before { content: $fa-var-reply; } +.#{$fa-css-prefix}-github-alt:before { content: $fa-var-github-alt; } +.#{$fa-css-prefix}-folder-o:before { content: $fa-var-folder-o; } +.#{$fa-css-prefix}-folder-open-o:before { content: $fa-var-folder-open-o; } +.#{$fa-css-prefix}-smile-o:before { content: $fa-var-smile-o; } +.#{$fa-css-prefix}-frown-o:before { content: $fa-var-frown-o; } +.#{$fa-css-prefix}-meh-o:before { content: $fa-var-meh-o; } +.#{$fa-css-prefix}-gamepad:before { content: $fa-var-gamepad; } +.#{$fa-css-prefix}-keyboard-o:before { content: $fa-var-keyboard-o; } +.#{$fa-css-prefix}-flag-o:before { content: $fa-var-flag-o; } +.#{$fa-css-prefix}-flag-checkered:before { content: $fa-var-flag-checkered; } +.#{$fa-css-prefix}-terminal:before { content: $fa-var-terminal; } +.#{$fa-css-prefix}-code:before { content: $fa-var-code; } +.#{$fa-css-prefix}-mail-reply-all:before, +.#{$fa-css-prefix}-reply-all:before { content: $fa-var-reply-all; } +.#{$fa-css-prefix}-star-half-empty:before, +.#{$fa-css-prefix}-star-half-full:before, +.#{$fa-css-prefix}-star-half-o:before { content: $fa-var-star-half-o; } +.#{$fa-css-prefix}-location-arrow:before { content: $fa-var-location-arrow; } +.#{$fa-css-prefix}-crop:before { content: $fa-var-crop; } +.#{$fa-css-prefix}-code-fork:before { content: $fa-var-code-fork; } +.#{$fa-css-prefix}-unlink:before, +.#{$fa-css-prefix}-chain-broken:before { content: $fa-var-chain-broken; } +.#{$fa-css-prefix}-question:before { content: $fa-var-question; } +.#{$fa-css-prefix}-info:before { content: $fa-var-info; } +.#{$fa-css-prefix}-exclamation:before { content: $fa-var-exclamation; } +.#{$fa-css-prefix}-superscript:before { content: $fa-var-superscript; } +.#{$fa-css-prefix}-subscript:before { content: $fa-var-subscript; } +.#{$fa-css-prefix}-eraser:before { content: $fa-var-eraser; } +.#{$fa-css-prefix}-puzzle-piece:before { content: $fa-var-puzzle-piece; } +.#{$fa-css-prefix}-microphone:before { content: $fa-var-microphone; } +.#{$fa-css-prefix}-microphone-slash:before { content: $fa-var-microphone-slash; } +.#{$fa-css-prefix}-shield:before { content: $fa-var-shield; } +.#{$fa-css-prefix}-calendar-o:before { content: $fa-var-calendar-o; } +.#{$fa-css-prefix}-fire-extinguisher:before { content: $fa-var-fire-extinguisher; } +.#{$fa-css-prefix}-rocket:before { content: $fa-var-rocket; } +.#{$fa-css-prefix}-maxcdn:before { content: $fa-var-maxcdn; } +.#{$fa-css-prefix}-chevron-circle-left:before { content: $fa-var-chevron-circle-left; } +.#{$fa-css-prefix}-chevron-circle-right:before { content: $fa-var-chevron-circle-right; } +.#{$fa-css-prefix}-chevron-circle-up:before { content: $fa-var-chevron-circle-up; } +.#{$fa-css-prefix}-chevron-circle-down:before { content: $fa-var-chevron-circle-down; } +.#{$fa-css-prefix}-html5:before { content: $fa-var-html5; } +.#{$fa-css-prefix}-css3:before { content: $fa-var-css3; } +.#{$fa-css-prefix}-anchor:before { content: $fa-var-anchor; } +.#{$fa-css-prefix}-unlock-alt:before { content: $fa-var-unlock-alt; } +.#{$fa-css-prefix}-bullseye:before { content: $fa-var-bullseye; } +.#{$fa-css-prefix}-ellipsis-h:before { content: $fa-var-ellipsis-h; } +.#{$fa-css-prefix}-ellipsis-v:before { content: $fa-var-ellipsis-v; } +.#{$fa-css-prefix}-rss-square:before { content: $fa-var-rss-square; } +.#{$fa-css-prefix}-play-circle:before { content: $fa-var-play-circle; } +.#{$fa-css-prefix}-ticket:before { content: $fa-var-ticket; } +.#{$fa-css-prefix}-minus-square:before { content: $fa-var-minus-square; } +.#{$fa-css-prefix}-minus-square-o:before { content: $fa-var-minus-square-o; } +.#{$fa-css-prefix}-level-up:before { content: $fa-var-level-up; } +.#{$fa-css-prefix}-level-down:before { content: $fa-var-level-down; } +.#{$fa-css-prefix}-check-square:before { content: $fa-var-check-square; } +.#{$fa-css-prefix}-pencil-square:before { content: $fa-var-pencil-square; } +.#{$fa-css-prefix}-external-link-square:before { content: $fa-var-external-link-square; } +.#{$fa-css-prefix}-share-square:before { content: $fa-var-share-square; } +.#{$fa-css-prefix}-compass:before { content: $fa-var-compass; } +.#{$fa-css-prefix}-toggle-down:before, +.#{$fa-css-prefix}-caret-square-o-down:before { content: $fa-var-caret-square-o-down; } +.#{$fa-css-prefix}-toggle-up:before, +.#{$fa-css-prefix}-caret-square-o-up:before { content: $fa-var-caret-square-o-up; } +.#{$fa-css-prefix}-toggle-right:before, +.#{$fa-css-prefix}-caret-square-o-right:before { content: $fa-var-caret-square-o-right; } +.#{$fa-css-prefix}-euro:before, +.#{$fa-css-prefix}-eur:before { content: $fa-var-eur; } +.#{$fa-css-prefix}-gbp:before { content: $fa-var-gbp; } +.#{$fa-css-prefix}-dollar:before, +.#{$fa-css-prefix}-usd:before { content: $fa-var-usd; } +.#{$fa-css-prefix}-rupee:before, +.#{$fa-css-prefix}-inr:before { content: $fa-var-inr; } +.#{$fa-css-prefix}-cny:before, +.#{$fa-css-prefix}-rmb:before, +.#{$fa-css-prefix}-yen:before, +.#{$fa-css-prefix}-jpy:before { content: $fa-var-jpy; } +.#{$fa-css-prefix}-ruble:before, +.#{$fa-css-prefix}-rouble:before, +.#{$fa-css-prefix}-rub:before { content: $fa-var-rub; } +.#{$fa-css-prefix}-won:before, +.#{$fa-css-prefix}-krw:before { content: $fa-var-krw; } +.#{$fa-css-prefix}-bitcoin:before, +.#{$fa-css-prefix}-btc:before { content: $fa-var-btc; } +.#{$fa-css-prefix}-file:before { content: $fa-var-file; } +.#{$fa-css-prefix}-file-text:before { content: $fa-var-file-text; } +.#{$fa-css-prefix}-sort-alpha-asc:before { content: $fa-var-sort-alpha-asc; } +.#{$fa-css-prefix}-sort-alpha-desc:before { content: $fa-var-sort-alpha-desc; } +.#{$fa-css-prefix}-sort-amount-asc:before { content: $fa-var-sort-amount-asc; } +.#{$fa-css-prefix}-sort-amount-desc:before { content: $fa-var-sort-amount-desc; } +.#{$fa-css-prefix}-sort-numeric-asc:before { content: $fa-var-sort-numeric-asc; } +.#{$fa-css-prefix}-sort-numeric-desc:before { content: $fa-var-sort-numeric-desc; } +.#{$fa-css-prefix}-thumbs-up:before { content: $fa-var-thumbs-up; } +.#{$fa-css-prefix}-thumbs-down:before { content: $fa-var-thumbs-down; } +.#{$fa-css-prefix}-youtube-square:before { content: $fa-var-youtube-square; } +.#{$fa-css-prefix}-youtube:before { content: $fa-var-youtube; } +.#{$fa-css-prefix}-xing:before { content: $fa-var-xing; } +.#{$fa-css-prefix}-xing-square:before { content: $fa-var-xing-square; } +.#{$fa-css-prefix}-youtube-play:before { content: $fa-var-youtube-play; } +.#{$fa-css-prefix}-dropbox:before { content: $fa-var-dropbox; } +.#{$fa-css-prefix}-stack-overflow:before { content: $fa-var-stack-overflow; } +.#{$fa-css-prefix}-instagram:before { content: $fa-var-instagram; } +.#{$fa-css-prefix}-flickr:before { content: $fa-var-flickr; } +.#{$fa-css-prefix}-adn:before { content: $fa-var-adn; } +.#{$fa-css-prefix}-bitbucket:before { content: $fa-var-bitbucket; } +.#{$fa-css-prefix}-bitbucket-square:before { content: $fa-var-bitbucket-square; } +.#{$fa-css-prefix}-tumblr:before { content: $fa-var-tumblr; } +.#{$fa-css-prefix}-tumblr-square:before { content: $fa-var-tumblr-square; } +.#{$fa-css-prefix}-long-arrow-down:before { content: $fa-var-long-arrow-down; } +.#{$fa-css-prefix}-long-arrow-up:before { content: $fa-var-long-arrow-up; } +.#{$fa-css-prefix}-long-arrow-left:before { content: $fa-var-long-arrow-left; } +.#{$fa-css-prefix}-long-arrow-right:before { content: $fa-var-long-arrow-right; } +.#{$fa-css-prefix}-apple:before { content: $fa-var-apple; } +.#{$fa-css-prefix}-windows:before { content: $fa-var-windows; } +.#{$fa-css-prefix}-android:before { content: $fa-var-android; } +.#{$fa-css-prefix}-linux:before { content: $fa-var-linux; } +.#{$fa-css-prefix}-dribbble:before { content: $fa-var-dribbble; } +.#{$fa-css-prefix}-skype:before { content: $fa-var-skype; } +.#{$fa-css-prefix}-foursquare:before { content: $fa-var-foursquare; } +.#{$fa-css-prefix}-trello:before { content: $fa-var-trello; } +.#{$fa-css-prefix}-female:before { content: $fa-var-female; } +.#{$fa-css-prefix}-male:before { content: $fa-var-male; } +.#{$fa-css-prefix}-gittip:before, +.#{$fa-css-prefix}-gratipay:before { content: $fa-var-gratipay; } +.#{$fa-css-prefix}-sun-o:before { content: $fa-var-sun-o; } +.#{$fa-css-prefix}-moon-o:before { content: $fa-var-moon-o; } +.#{$fa-css-prefix}-archive:before { content: $fa-var-archive; } +.#{$fa-css-prefix}-bug:before { content: $fa-var-bug; } +.#{$fa-css-prefix}-vk:before { content: $fa-var-vk; } +.#{$fa-css-prefix}-weibo:before { content: $fa-var-weibo; } +.#{$fa-css-prefix}-renren:before { content: $fa-var-renren; } +.#{$fa-css-prefix}-pagelines:before { content: $fa-var-pagelines; } +.#{$fa-css-prefix}-stack-exchange:before { content: $fa-var-stack-exchange; } +.#{$fa-css-prefix}-arrow-circle-o-right:before { content: $fa-var-arrow-circle-o-right; } +.#{$fa-css-prefix}-arrow-circle-o-left:before { content: $fa-var-arrow-circle-o-left; } +.#{$fa-css-prefix}-toggle-left:before, +.#{$fa-css-prefix}-caret-square-o-left:before { content: $fa-var-caret-square-o-left; } +.#{$fa-css-prefix}-dot-circle-o:before { content: $fa-var-dot-circle-o; } +.#{$fa-css-prefix}-wheelchair:before { content: $fa-var-wheelchair; } +.#{$fa-css-prefix}-vimeo-square:before { content: $fa-var-vimeo-square; } +.#{$fa-css-prefix}-turkish-lira:before, +.#{$fa-css-prefix}-try:before { content: $fa-var-try; } +.#{$fa-css-prefix}-plus-square-o:before { content: $fa-var-plus-square-o; } +.#{$fa-css-prefix}-space-shuttle:before { content: $fa-var-space-shuttle; } +.#{$fa-css-prefix}-slack:before { content: $fa-var-slack; } +.#{$fa-css-prefix}-envelope-square:before { content: $fa-var-envelope-square; } +.#{$fa-css-prefix}-wordpress:before { content: $fa-var-wordpress; } +.#{$fa-css-prefix}-openid:before { content: $fa-var-openid; } +.#{$fa-css-prefix}-institution:before, +.#{$fa-css-prefix}-bank:before, +.#{$fa-css-prefix}-university:before { content: $fa-var-university; } +.#{$fa-css-prefix}-mortar-board:before, +.#{$fa-css-prefix}-graduation-cap:before { content: $fa-var-graduation-cap; } +.#{$fa-css-prefix}-yahoo:before { content: $fa-var-yahoo; } +.#{$fa-css-prefix}-google:before { content: $fa-var-google; } +.#{$fa-css-prefix}-reddit:before { content: $fa-var-reddit; } +.#{$fa-css-prefix}-reddit-square:before { content: $fa-var-reddit-square; } +.#{$fa-css-prefix}-stumbleupon-circle:before { content: $fa-var-stumbleupon-circle; } +.#{$fa-css-prefix}-stumbleupon:before { content: $fa-var-stumbleupon; } +.#{$fa-css-prefix}-delicious:before { content: $fa-var-delicious; } +.#{$fa-css-prefix}-digg:before { content: $fa-var-digg; } +.#{$fa-css-prefix}-pied-piper-pp:before { content: $fa-var-pied-piper-pp; } +.#{$fa-css-prefix}-pied-piper-alt:before { content: $fa-var-pied-piper-alt; } +.#{$fa-css-prefix}-drupal:before { content: $fa-var-drupal; } +.#{$fa-css-prefix}-joomla:before { content: $fa-var-joomla; } +.#{$fa-css-prefix}-language:before { content: $fa-var-language; } +.#{$fa-css-prefix}-fax:before { content: $fa-var-fax; } +.#{$fa-css-prefix}-building:before { content: $fa-var-building; } +.#{$fa-css-prefix}-child:before { content: $fa-var-child; } +.#{$fa-css-prefix}-paw:before { content: $fa-var-paw; } +.#{$fa-css-prefix}-spoon:before { content: $fa-var-spoon; } +.#{$fa-css-prefix}-cube:before { content: $fa-var-cube; } +.#{$fa-css-prefix}-cubes:before { content: $fa-var-cubes; } +.#{$fa-css-prefix}-behance:before { content: $fa-var-behance; } +.#{$fa-css-prefix}-behance-square:before { content: $fa-var-behance-square; } +.#{$fa-css-prefix}-steam:before { content: $fa-var-steam; } +.#{$fa-css-prefix}-steam-square:before { content: $fa-var-steam-square; } +.#{$fa-css-prefix}-recycle:before { content: $fa-var-recycle; } +.#{$fa-css-prefix}-automobile:before, +.#{$fa-css-prefix}-car:before { content: $fa-var-car; } +.#{$fa-css-prefix}-cab:before, +.#{$fa-css-prefix}-taxi:before { content: $fa-var-taxi; } +.#{$fa-css-prefix}-tree:before { content: $fa-var-tree; } +.#{$fa-css-prefix}-spotify:before { content: $fa-var-spotify; } +.#{$fa-css-prefix}-deviantart:before { content: $fa-var-deviantart; } +.#{$fa-css-prefix}-soundcloud:before { content: $fa-var-soundcloud; } +.#{$fa-css-prefix}-database:before { content: $fa-var-database; } +.#{$fa-css-prefix}-file-pdf-o:before { content: $fa-var-file-pdf-o; } +.#{$fa-css-prefix}-file-word-o:before { content: $fa-var-file-word-o; } +.#{$fa-css-prefix}-file-excel-o:before { content: $fa-var-file-excel-o; } +.#{$fa-css-prefix}-file-powerpoint-o:before { content: $fa-var-file-powerpoint-o; } +.#{$fa-css-prefix}-file-photo-o:before, +.#{$fa-css-prefix}-file-picture-o:before, +.#{$fa-css-prefix}-file-image-o:before { content: $fa-var-file-image-o; } +.#{$fa-css-prefix}-file-zip-o:before, +.#{$fa-css-prefix}-file-archive-o:before { content: $fa-var-file-archive-o; } +.#{$fa-css-prefix}-file-sound-o:before, +.#{$fa-css-prefix}-file-audio-o:before { content: $fa-var-file-audio-o; } +.#{$fa-css-prefix}-file-movie-o:before, +.#{$fa-css-prefix}-file-video-o:before { content: $fa-var-file-video-o; } +.#{$fa-css-prefix}-file-code-o:before { content: $fa-var-file-code-o; } +.#{$fa-css-prefix}-vine:before { content: $fa-var-vine; } +.#{$fa-css-prefix}-codepen:before { content: $fa-var-codepen; } +.#{$fa-css-prefix}-jsfiddle:before { content: $fa-var-jsfiddle; } +.#{$fa-css-prefix}-life-bouy:before, +.#{$fa-css-prefix}-life-buoy:before, +.#{$fa-css-prefix}-life-saver:before, +.#{$fa-css-prefix}-support:before, +.#{$fa-css-prefix}-life-ring:before { content: $fa-var-life-ring; } +.#{$fa-css-prefix}-circle-o-notch:before { content: $fa-var-circle-o-notch; } +.#{$fa-css-prefix}-ra:before, +.#{$fa-css-prefix}-resistance:before, +.#{$fa-css-prefix}-rebel:before { content: $fa-var-rebel; } +.#{$fa-css-prefix}-ge:before, +.#{$fa-css-prefix}-empire:before { content: $fa-var-empire; } +.#{$fa-css-prefix}-git-square:before { content: $fa-var-git-square; } +.#{$fa-css-prefix}-git:before { content: $fa-var-git; } +.#{$fa-css-prefix}-y-combinator-square:before, +.#{$fa-css-prefix}-yc-square:before, +.#{$fa-css-prefix}-hacker-news:before { content: $fa-var-hacker-news; } +.#{$fa-css-prefix}-tencent-weibo:before { content: $fa-var-tencent-weibo; } +.#{$fa-css-prefix}-qq:before { content: $fa-var-qq; } +.#{$fa-css-prefix}-wechat:before, +.#{$fa-css-prefix}-weixin:before { content: $fa-var-weixin; } +.#{$fa-css-prefix}-send:before, +.#{$fa-css-prefix}-paper-plane:before { content: $fa-var-paper-plane; } +.#{$fa-css-prefix}-send-o:before, +.#{$fa-css-prefix}-paper-plane-o:before { content: $fa-var-paper-plane-o; } +.#{$fa-css-prefix}-history:before { content: $fa-var-history; } +.#{$fa-css-prefix}-circle-thin:before { content: $fa-var-circle-thin; } +.#{$fa-css-prefix}-header:before { content: $fa-var-header; } +.#{$fa-css-prefix}-paragraph:before { content: $fa-var-paragraph; } +.#{$fa-css-prefix}-sliders:before { content: $fa-var-sliders; } +.#{$fa-css-prefix}-share-alt:before { content: $fa-var-share-alt; } +.#{$fa-css-prefix}-share-alt-square:before { content: $fa-var-share-alt-square; } +.#{$fa-css-prefix}-bomb:before { content: $fa-var-bomb; } +.#{$fa-css-prefix}-soccer-ball-o:before, +.#{$fa-css-prefix}-futbol-o:before { content: $fa-var-futbol-o; } +.#{$fa-css-prefix}-tty:before { content: $fa-var-tty; } +.#{$fa-css-prefix}-binoculars:before { content: $fa-var-binoculars; } +.#{$fa-css-prefix}-plug:before { content: $fa-var-plug; } +.#{$fa-css-prefix}-slideshare:before { content: $fa-var-slideshare; } +.#{$fa-css-prefix}-twitch:before { content: $fa-var-twitch; } +.#{$fa-css-prefix}-yelp:before { content: $fa-var-yelp; } +.#{$fa-css-prefix}-newspaper-o:before { content: $fa-var-newspaper-o; } +.#{$fa-css-prefix}-wifi:before { content: $fa-var-wifi; } +.#{$fa-css-prefix}-calculator:before { content: $fa-var-calculator; } +.#{$fa-css-prefix}-paypal:before { content: $fa-var-paypal; } +.#{$fa-css-prefix}-google-wallet:before { content: $fa-var-google-wallet; } +.#{$fa-css-prefix}-cc-visa:before { content: $fa-var-cc-visa; } +.#{$fa-css-prefix}-cc-mastercard:before { content: $fa-var-cc-mastercard; } +.#{$fa-css-prefix}-cc-discover:before { content: $fa-var-cc-discover; } +.#{$fa-css-prefix}-cc-amex:before { content: $fa-var-cc-amex; } +.#{$fa-css-prefix}-cc-paypal:before { content: $fa-var-cc-paypal; } +.#{$fa-css-prefix}-cc-stripe:before { content: $fa-var-cc-stripe; } +.#{$fa-css-prefix}-bell-slash:before { content: $fa-var-bell-slash; } +.#{$fa-css-prefix}-bell-slash-o:before { content: $fa-var-bell-slash-o; } +.#{$fa-css-prefix}-trash:before { content: $fa-var-trash; } +.#{$fa-css-prefix}-copyright:before { content: $fa-var-copyright; } +.#{$fa-css-prefix}-at:before { content: $fa-var-at; } +.#{$fa-css-prefix}-eyedropper:before { content: $fa-var-eyedropper; } +.#{$fa-css-prefix}-paint-brush:before { content: $fa-var-paint-brush; } +.#{$fa-css-prefix}-birthday-cake:before { content: $fa-var-birthday-cake; } +.#{$fa-css-prefix}-area-chart:before { content: $fa-var-area-chart; } +.#{$fa-css-prefix}-pie-chart:before { content: $fa-var-pie-chart; } +.#{$fa-css-prefix}-line-chart:before { content: $fa-var-line-chart; } +.#{$fa-css-prefix}-lastfm:before { content: $fa-var-lastfm; } +.#{$fa-css-prefix}-lastfm-square:before { content: $fa-var-lastfm-square; } +.#{$fa-css-prefix}-toggle-off:before { content: $fa-var-toggle-off; } +.#{$fa-css-prefix}-toggle-on:before { content: $fa-var-toggle-on; } +.#{$fa-css-prefix}-bicycle:before { content: $fa-var-bicycle; } +.#{$fa-css-prefix}-bus:before { content: $fa-var-bus; } +.#{$fa-css-prefix}-ioxhost:before { content: $fa-var-ioxhost; } +.#{$fa-css-prefix}-angellist:before { content: $fa-var-angellist; } +.#{$fa-css-prefix}-cc:before { content: $fa-var-cc; } +.#{$fa-css-prefix}-shekel:before, +.#{$fa-css-prefix}-sheqel:before, +.#{$fa-css-prefix}-ils:before { content: $fa-var-ils; } +.#{$fa-css-prefix}-meanpath:before { content: $fa-var-meanpath; } +.#{$fa-css-prefix}-buysellads:before { content: $fa-var-buysellads; } +.#{$fa-css-prefix}-connectdevelop:before { content: $fa-var-connectdevelop; } +.#{$fa-css-prefix}-dashcube:before { content: $fa-var-dashcube; } +.#{$fa-css-prefix}-forumbee:before { content: $fa-var-forumbee; } +.#{$fa-css-prefix}-leanpub:before { content: $fa-var-leanpub; } +.#{$fa-css-prefix}-sellsy:before { content: $fa-var-sellsy; } +.#{$fa-css-prefix}-shirtsinbulk:before { content: $fa-var-shirtsinbulk; } +.#{$fa-css-prefix}-simplybuilt:before { content: $fa-var-simplybuilt; } +.#{$fa-css-prefix}-skyatlas:before { content: $fa-var-skyatlas; } +.#{$fa-css-prefix}-cart-plus:before { content: $fa-var-cart-plus; } +.#{$fa-css-prefix}-cart-arrow-down:before { content: $fa-var-cart-arrow-down; } +.#{$fa-css-prefix}-diamond:before { content: $fa-var-diamond; } +.#{$fa-css-prefix}-ship:before { content: $fa-var-ship; } +.#{$fa-css-prefix}-user-secret:before { content: $fa-var-user-secret; } +.#{$fa-css-prefix}-motorcycle:before { content: $fa-var-motorcycle; } +.#{$fa-css-prefix}-street-view:before { content: $fa-var-street-view; } +.#{$fa-css-prefix}-heartbeat:before { content: $fa-var-heartbeat; } +.#{$fa-css-prefix}-venus:before { content: $fa-var-venus; } +.#{$fa-css-prefix}-mars:before { content: $fa-var-mars; } +.#{$fa-css-prefix}-mercury:before { content: $fa-var-mercury; } +.#{$fa-css-prefix}-intersex:before, +.#{$fa-css-prefix}-transgender:before { content: $fa-var-transgender; } +.#{$fa-css-prefix}-transgender-alt:before { content: $fa-var-transgender-alt; } +.#{$fa-css-prefix}-venus-double:before { content: $fa-var-venus-double; } +.#{$fa-css-prefix}-mars-double:before { content: $fa-var-mars-double; } +.#{$fa-css-prefix}-venus-mars:before { content: $fa-var-venus-mars; } +.#{$fa-css-prefix}-mars-stroke:before { content: $fa-var-mars-stroke; } +.#{$fa-css-prefix}-mars-stroke-v:before { content: $fa-var-mars-stroke-v; } +.#{$fa-css-prefix}-mars-stroke-h:before { content: $fa-var-mars-stroke-h; } +.#{$fa-css-prefix}-neuter:before { content: $fa-var-neuter; } +.#{$fa-css-prefix}-genderless:before { content: $fa-var-genderless; } +.#{$fa-css-prefix}-facebook-official:before { content: $fa-var-facebook-official; } +.#{$fa-css-prefix}-pinterest-p:before { content: $fa-var-pinterest-p; } +.#{$fa-css-prefix}-whatsapp:before { content: $fa-var-whatsapp; } +.#{$fa-css-prefix}-server:before { content: $fa-var-server; } +.#{$fa-css-prefix}-user-plus:before { content: $fa-var-user-plus; } +.#{$fa-css-prefix}-user-times:before { content: $fa-var-user-times; } +.#{$fa-css-prefix}-hotel:before, +.#{$fa-css-prefix}-bed:before { content: $fa-var-bed; } +.#{$fa-css-prefix}-viacoin:before { content: $fa-var-viacoin; } +.#{$fa-css-prefix}-train:before { content: $fa-var-train; } +.#{$fa-css-prefix}-subway:before { content: $fa-var-subway; } +.#{$fa-css-prefix}-medium:before { content: $fa-var-medium; } +.#{$fa-css-prefix}-yc:before, +.#{$fa-css-prefix}-y-combinator:before { content: $fa-var-y-combinator; } +.#{$fa-css-prefix}-optin-monster:before { content: $fa-var-optin-monster; } +.#{$fa-css-prefix}-opencart:before { content: $fa-var-opencart; } +.#{$fa-css-prefix}-expeditedssl:before { content: $fa-var-expeditedssl; } +.#{$fa-css-prefix}-battery-4:before, +.#{$fa-css-prefix}-battery-full:before { content: $fa-var-battery-full; } +.#{$fa-css-prefix}-battery-3:before, +.#{$fa-css-prefix}-battery-three-quarters:before { content: $fa-var-battery-three-quarters; } +.#{$fa-css-prefix}-battery-2:before, +.#{$fa-css-prefix}-battery-half:before { content: $fa-var-battery-half; } +.#{$fa-css-prefix}-battery-1:before, +.#{$fa-css-prefix}-battery-quarter:before { content: $fa-var-battery-quarter; } +.#{$fa-css-prefix}-battery-0:before, +.#{$fa-css-prefix}-battery-empty:before { content: $fa-var-battery-empty; } +.#{$fa-css-prefix}-mouse-pointer:before { content: $fa-var-mouse-pointer; } +.#{$fa-css-prefix}-i-cursor:before { content: $fa-var-i-cursor; } +.#{$fa-css-prefix}-object-group:before { content: $fa-var-object-group; } +.#{$fa-css-prefix}-object-ungroup:before { content: $fa-var-object-ungroup; } +.#{$fa-css-prefix}-sticky-note:before { content: $fa-var-sticky-note; } +.#{$fa-css-prefix}-sticky-note-o:before { content: $fa-var-sticky-note-o; } +.#{$fa-css-prefix}-cc-jcb:before { content: $fa-var-cc-jcb; } +.#{$fa-css-prefix}-cc-diners-club:before { content: $fa-var-cc-diners-club; } +.#{$fa-css-prefix}-clone:before { content: $fa-var-clone; } +.#{$fa-css-prefix}-balance-scale:before { content: $fa-var-balance-scale; } +.#{$fa-css-prefix}-hourglass-o:before { content: $fa-var-hourglass-o; } +.#{$fa-css-prefix}-hourglass-1:before, +.#{$fa-css-prefix}-hourglass-start:before { content: $fa-var-hourglass-start; } +.#{$fa-css-prefix}-hourglass-2:before, +.#{$fa-css-prefix}-hourglass-half:before { content: $fa-var-hourglass-half; } +.#{$fa-css-prefix}-hourglass-3:before, +.#{$fa-css-prefix}-hourglass-end:before { content: $fa-var-hourglass-end; } +.#{$fa-css-prefix}-hourglass:before { content: $fa-var-hourglass; } +.#{$fa-css-prefix}-hand-grab-o:before, +.#{$fa-css-prefix}-hand-rock-o:before { content: $fa-var-hand-rock-o; } +.#{$fa-css-prefix}-hand-stop-o:before, +.#{$fa-css-prefix}-hand-paper-o:before { content: $fa-var-hand-paper-o; } +.#{$fa-css-prefix}-hand-scissors-o:before { content: $fa-var-hand-scissors-o; } +.#{$fa-css-prefix}-hand-lizard-o:before { content: $fa-var-hand-lizard-o; } +.#{$fa-css-prefix}-hand-spock-o:before { content: $fa-var-hand-spock-o; } +.#{$fa-css-prefix}-hand-pointer-o:before { content: $fa-var-hand-pointer-o; } +.#{$fa-css-prefix}-hand-peace-o:before { content: $fa-var-hand-peace-o; } +.#{$fa-css-prefix}-trademark:before { content: $fa-var-trademark; } +.#{$fa-css-prefix}-registered:before { content: $fa-var-registered; } +.#{$fa-css-prefix}-creative-commons:before { content: $fa-var-creative-commons; } +.#{$fa-css-prefix}-gg:before { content: $fa-var-gg; } +.#{$fa-css-prefix}-gg-circle:before { content: $fa-var-gg-circle; } +.#{$fa-css-prefix}-tripadvisor:before { content: $fa-var-tripadvisor; } +.#{$fa-css-prefix}-odnoklassniki:before { content: $fa-var-odnoklassniki; } +.#{$fa-css-prefix}-odnoklassniki-square:before { content: $fa-var-odnoklassniki-square; } +.#{$fa-css-prefix}-get-pocket:before { content: $fa-var-get-pocket; } +.#{$fa-css-prefix}-wikipedia-w:before { content: $fa-var-wikipedia-w; } +.#{$fa-css-prefix}-safari:before { content: $fa-var-safari; } +.#{$fa-css-prefix}-chrome:before { content: $fa-var-chrome; } +.#{$fa-css-prefix}-firefox:before { content: $fa-var-firefox; } +.#{$fa-css-prefix}-opera:before { content: $fa-var-opera; } +.#{$fa-css-prefix}-internet-explorer:before { content: $fa-var-internet-explorer; } +.#{$fa-css-prefix}-tv:before, +.#{$fa-css-prefix}-television:before { content: $fa-var-television; } +.#{$fa-css-prefix}-contao:before { content: $fa-var-contao; } +.#{$fa-css-prefix}-500px:before { content: $fa-var-500px; } +.#{$fa-css-prefix}-amazon:before { content: $fa-var-amazon; } +.#{$fa-css-prefix}-calendar-plus-o:before { content: $fa-var-calendar-plus-o; } +.#{$fa-css-prefix}-calendar-minus-o:before { content: $fa-var-calendar-minus-o; } +.#{$fa-css-prefix}-calendar-times-o:before { content: $fa-var-calendar-times-o; } +.#{$fa-css-prefix}-calendar-check-o:before { content: $fa-var-calendar-check-o; } +.#{$fa-css-prefix}-industry:before { content: $fa-var-industry; } +.#{$fa-css-prefix}-map-pin:before { content: $fa-var-map-pin; } +.#{$fa-css-prefix}-map-signs:before { content: $fa-var-map-signs; } +.#{$fa-css-prefix}-map-o:before { content: $fa-var-map-o; } +.#{$fa-css-prefix}-map:before { content: $fa-var-map; } +.#{$fa-css-prefix}-commenting:before { content: $fa-var-commenting; } +.#{$fa-css-prefix}-commenting-o:before { content: $fa-var-commenting-o; } +.#{$fa-css-prefix}-houzz:before { content: $fa-var-houzz; } +.#{$fa-css-prefix}-vimeo:before { content: $fa-var-vimeo; } +.#{$fa-css-prefix}-black-tie:before { content: $fa-var-black-tie; } +.#{$fa-css-prefix}-fonticons:before { content: $fa-var-fonticons; } +.#{$fa-css-prefix}-reddit-alien:before { content: $fa-var-reddit-alien; } +.#{$fa-css-prefix}-edge:before { content: $fa-var-edge; } +.#{$fa-css-prefix}-credit-card-alt:before { content: $fa-var-credit-card-alt; } +.#{$fa-css-prefix}-codiepie:before { content: $fa-var-codiepie; } +.#{$fa-css-prefix}-modx:before { content: $fa-var-modx; } +.#{$fa-css-prefix}-fort-awesome:before { content: $fa-var-fort-awesome; } +.#{$fa-css-prefix}-usb:before { content: $fa-var-usb; } +.#{$fa-css-prefix}-product-hunt:before { content: $fa-var-product-hunt; } +.#{$fa-css-prefix}-mixcloud:before { content: $fa-var-mixcloud; } +.#{$fa-css-prefix}-scribd:before { content: $fa-var-scribd; } +.#{$fa-css-prefix}-pause-circle:before { content: $fa-var-pause-circle; } +.#{$fa-css-prefix}-pause-circle-o:before { content: $fa-var-pause-circle-o; } +.#{$fa-css-prefix}-stop-circle:before { content: $fa-var-stop-circle; } +.#{$fa-css-prefix}-stop-circle-o:before { content: $fa-var-stop-circle-o; } +.#{$fa-css-prefix}-shopping-bag:before { content: $fa-var-shopping-bag; } +.#{$fa-css-prefix}-shopping-basket:before { content: $fa-var-shopping-basket; } +.#{$fa-css-prefix}-hashtag:before { content: $fa-var-hashtag; } +.#{$fa-css-prefix}-bluetooth:before { content: $fa-var-bluetooth; } +.#{$fa-css-prefix}-bluetooth-b:before { content: $fa-var-bluetooth-b; } +.#{$fa-css-prefix}-percent:before { content: $fa-var-percent; } +.#{$fa-css-prefix}-gitlab:before { content: $fa-var-gitlab; } +.#{$fa-css-prefix}-wpbeginner:before { content: $fa-var-wpbeginner; } +.#{$fa-css-prefix}-wpforms:before { content: $fa-var-wpforms; } +.#{$fa-css-prefix}-envira:before { content: $fa-var-envira; } +.#{$fa-css-prefix}-universal-access:before { content: $fa-var-universal-access; } +.#{$fa-css-prefix}-wheelchair-alt:before { content: $fa-var-wheelchair-alt; } +.#{$fa-css-prefix}-question-circle-o:before { content: $fa-var-question-circle-o; } +.#{$fa-css-prefix}-blind:before { content: $fa-var-blind; } +.#{$fa-css-prefix}-audio-description:before { content: $fa-var-audio-description; } +.#{$fa-css-prefix}-volume-control-phone:before { content: $fa-var-volume-control-phone; } +.#{$fa-css-prefix}-braille:before { content: $fa-var-braille; } +.#{$fa-css-prefix}-assistive-listening-systems:before { content: $fa-var-assistive-listening-systems; } +.#{$fa-css-prefix}-asl-interpreting:before, +.#{$fa-css-prefix}-american-sign-language-interpreting:before { content: $fa-var-american-sign-language-interpreting; } +.#{$fa-css-prefix}-deafness:before, +.#{$fa-css-prefix}-hard-of-hearing:before, +.#{$fa-css-prefix}-deaf:before { content: $fa-var-deaf; } +.#{$fa-css-prefix}-glide:before { content: $fa-var-glide; } +.#{$fa-css-prefix}-glide-g:before { content: $fa-var-glide-g; } +.#{$fa-css-prefix}-signing:before, +.#{$fa-css-prefix}-sign-language:before { content: $fa-var-sign-language; } +.#{$fa-css-prefix}-low-vision:before { content: $fa-var-low-vision; } +.#{$fa-css-prefix}-viadeo:before { content: $fa-var-viadeo; } +.#{$fa-css-prefix}-viadeo-square:before { content: $fa-var-viadeo-square; } +.#{$fa-css-prefix}-snapchat:before { content: $fa-var-snapchat; } +.#{$fa-css-prefix}-snapchat-ghost:before { content: $fa-var-snapchat-ghost; } +.#{$fa-css-prefix}-snapchat-square:before { content: $fa-var-snapchat-square; } +.#{$fa-css-prefix}-pied-piper:before { content: $fa-var-pied-piper; } +.#{$fa-css-prefix}-first-order:before { content: $fa-var-first-order; } +.#{$fa-css-prefix}-yoast:before { content: $fa-var-yoast; } +.#{$fa-css-prefix}-themeisle:before { content: $fa-var-themeisle; } +.#{$fa-css-prefix}-google-plus-circle:before, +.#{$fa-css-prefix}-google-plus-official:before { content: $fa-var-google-plus-official; } +.#{$fa-css-prefix}-fa:before, +.#{$fa-css-prefix}-font-awesome:before { content: $fa-var-font-awesome; } diff --git a/vraptor/src/main/webapp/vendor/font-awesome/scss/_larger.scss b/vraptor/src/main/webapp/vendor/font-awesome/scss/_larger.scss new file mode 100644 index 0000000000..41e9a8184a --- /dev/null +++ b/vraptor/src/main/webapp/vendor/font-awesome/scss/_larger.scss @@ -0,0 +1,13 @@ +// Icon Sizes +// ------------------------- + +/* makes the font 33% larger relative to the icon container */ +.#{$fa-css-prefix}-lg { + font-size: (4em / 3); + line-height: (3em / 4); + vertical-align: -15%; +} +.#{$fa-css-prefix}-2x { font-size: 2em; } +.#{$fa-css-prefix}-3x { font-size: 3em; } +.#{$fa-css-prefix}-4x { font-size: 4em; } +.#{$fa-css-prefix}-5x { font-size: 5em; } diff --git a/vraptor/src/main/webapp/vendor/font-awesome/scss/_list.scss b/vraptor/src/main/webapp/vendor/font-awesome/scss/_list.scss new file mode 100644 index 0000000000..7d1e4d54d6 --- /dev/null +++ b/vraptor/src/main/webapp/vendor/font-awesome/scss/_list.scss @@ -0,0 +1,19 @@ +// List Icons +// ------------------------- + +.#{$fa-css-prefix}-ul { + padding-left: 0; + margin-left: $fa-li-width; + list-style-type: none; + > li { position: relative; } +} +.#{$fa-css-prefix}-li { + position: absolute; + left: -$fa-li-width; + width: $fa-li-width; + top: (2em / 14); + text-align: center; + &.#{$fa-css-prefix}-lg { + left: -$fa-li-width + (4em / 14); + } +} diff --git a/vraptor/src/main/webapp/vendor/font-awesome/scss/_mixins.scss b/vraptor/src/main/webapp/vendor/font-awesome/scss/_mixins.scss new file mode 100644 index 0000000000..c3bbd5745d --- /dev/null +++ b/vraptor/src/main/webapp/vendor/font-awesome/scss/_mixins.scss @@ -0,0 +1,60 @@ +// Mixins +// -------------------------- + +@mixin fa-icon() { + display: inline-block; + font: normal normal normal #{$fa-font-size-base}/#{$fa-line-height-base} FontAwesome; // shortening font declaration + font-size: inherit; // can't have font-size inherit on line above, so need to override + text-rendering: auto; // optimizelegibility throws things off #1094 + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; + +} + +@mixin fa-icon-rotate($degrees, $rotation) { + -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=#{$rotation})"; + -webkit-transform: rotate($degrees); + -ms-transform: rotate($degrees); + transform: rotate($degrees); +} + +@mixin fa-icon-flip($horiz, $vert, $rotation) { + -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=#{$rotation}, mirror=1)"; + -webkit-transform: scale($horiz, $vert); + -ms-transform: scale($horiz, $vert); + transform: scale($horiz, $vert); +} + + +// Only display content to screen readers. A la Bootstrap 4. +// +// See: http://a11yproject.com/posts/how-to-hide-content/ + +@mixin sr-only { + position: absolute; + width: 1px; + height: 1px; + padding: 0; + margin: -1px; + overflow: hidden; + clip: rect(0,0,0,0); + border: 0; +} + +// Use in conjunction with .sr-only to only display content when it's focused. +// +// Useful for "Skip to main content" links; see http://www.w3.org/TR/2013/NOTE-WCAG20-TECHS-20130905/G1 +// +// Credit: HTML5 Boilerplate + +@mixin sr-only-focusable { + &:active, + &:focus { + position: static; + width: auto; + height: auto; + margin: 0; + overflow: visible; + clip: auto; + } +} diff --git a/vraptor/src/main/webapp/vendor/font-awesome/scss/_path.scss b/vraptor/src/main/webapp/vendor/font-awesome/scss/_path.scss new file mode 100644 index 0000000000..bb457c23a8 --- /dev/null +++ b/vraptor/src/main/webapp/vendor/font-awesome/scss/_path.scss @@ -0,0 +1,15 @@ +/* FONT PATH + * -------------------------- */ + +@font-face { + font-family: 'FontAwesome'; + src: url('#{$fa-font-path}/fontawesome-webfont.eot?v=#{$fa-version}'); + src: url('#{$fa-font-path}/fontawesome-webfont.eot?#iefix&v=#{$fa-version}') format('embedded-opentype'), + url('#{$fa-font-path}/fontawesome-webfont.woff2?v=#{$fa-version}') format('woff2'), + url('#{$fa-font-path}/fontawesome-webfont.woff?v=#{$fa-version}') format('woff'), + url('#{$fa-font-path}/fontawesome-webfont.ttf?v=#{$fa-version}') format('truetype'), + url('#{$fa-font-path}/fontawesome-webfont.svg?v=#{$fa-version}#fontawesomeregular') format('svg'); +// src: url('#{$fa-font-path}/FontAwesome.otf') format('opentype'); // used when developing fonts + font-weight: normal; + font-style: normal; +} diff --git a/vraptor/src/main/webapp/vendor/font-awesome/scss/_rotated-flipped.scss b/vraptor/src/main/webapp/vendor/font-awesome/scss/_rotated-flipped.scss new file mode 100644 index 0000000000..a3558fd09c --- /dev/null +++ b/vraptor/src/main/webapp/vendor/font-awesome/scss/_rotated-flipped.scss @@ -0,0 +1,20 @@ +// Rotated & Flipped Icons +// ------------------------- + +.#{$fa-css-prefix}-rotate-90 { @include fa-icon-rotate(90deg, 1); } +.#{$fa-css-prefix}-rotate-180 { @include fa-icon-rotate(180deg, 2); } +.#{$fa-css-prefix}-rotate-270 { @include fa-icon-rotate(270deg, 3); } + +.#{$fa-css-prefix}-flip-horizontal { @include fa-icon-flip(-1, 1, 0); } +.#{$fa-css-prefix}-flip-vertical { @include fa-icon-flip(1, -1, 2); } + +// Hook for IE8-9 +// ------------------------- + +:root .#{$fa-css-prefix}-rotate-90, +:root .#{$fa-css-prefix}-rotate-180, +:root .#{$fa-css-prefix}-rotate-270, +:root .#{$fa-css-prefix}-flip-horizontal, +:root .#{$fa-css-prefix}-flip-vertical { + filter: none; +} diff --git a/vraptor/src/main/webapp/vendor/font-awesome/scss/_screen-reader.scss b/vraptor/src/main/webapp/vendor/font-awesome/scss/_screen-reader.scss new file mode 100644 index 0000000000..637426f0da --- /dev/null +++ b/vraptor/src/main/webapp/vendor/font-awesome/scss/_screen-reader.scss @@ -0,0 +1,5 @@ +// Screen Readers +// ------------------------- + +.sr-only { @include sr-only(); } +.sr-only-focusable { @include sr-only-focusable(); } diff --git a/vraptor/src/main/webapp/vendor/font-awesome/scss/_stacked.scss b/vraptor/src/main/webapp/vendor/font-awesome/scss/_stacked.scss new file mode 100644 index 0000000000..aef7403660 --- /dev/null +++ b/vraptor/src/main/webapp/vendor/font-awesome/scss/_stacked.scss @@ -0,0 +1,20 @@ +// Stacked Icons +// ------------------------- + +.#{$fa-css-prefix}-stack { + position: relative; + display: inline-block; + width: 2em; + height: 2em; + line-height: 2em; + vertical-align: middle; +} +.#{$fa-css-prefix}-stack-1x, .#{$fa-css-prefix}-stack-2x { + position: absolute; + left: 0; + width: 100%; + text-align: center; +} +.#{$fa-css-prefix}-stack-1x { line-height: inherit; } +.#{$fa-css-prefix}-stack-2x { font-size: 2em; } +.#{$fa-css-prefix}-inverse { color: $fa-inverse; } diff --git a/vraptor/src/main/webapp/vendor/font-awesome/scss/_variables.scss b/vraptor/src/main/webapp/vendor/font-awesome/scss/_variables.scss new file mode 100644 index 0000000000..a5a89ef97b --- /dev/null +++ b/vraptor/src/main/webapp/vendor/font-awesome/scss/_variables.scss @@ -0,0 +1,744 @@ +// Variables +// -------------------------- + +$fa-font-path: "../fonts" !default; +$fa-font-size-base: 14px !default; +$fa-line-height-base: 1 !default; +//$fa-font-path: "//netdna.bootstrapcdn.com/font-awesome/4.6.3/fonts" !default; // for referencing Bootstrap CDN font files directly +$fa-css-prefix: fa !default; +$fa-version: "4.6.3" !default; +$fa-border-color: #eee !default; +$fa-inverse: #fff !default; +$fa-li-width: (30em / 14) !default; + +$fa-var-500px: "\f26e"; +$fa-var-adjust: "\f042"; +$fa-var-adn: "\f170"; +$fa-var-align-center: "\f037"; +$fa-var-align-justify: "\f039"; +$fa-var-align-left: "\f036"; +$fa-var-align-right: "\f038"; +$fa-var-amazon: "\f270"; +$fa-var-ambulance: "\f0f9"; +$fa-var-american-sign-language-interpreting: "\f2a3"; +$fa-var-anchor: "\f13d"; +$fa-var-android: "\f17b"; +$fa-var-angellist: "\f209"; +$fa-var-angle-double-down: "\f103"; +$fa-var-angle-double-left: "\f100"; +$fa-var-angle-double-right: "\f101"; +$fa-var-angle-double-up: "\f102"; +$fa-var-angle-down: "\f107"; +$fa-var-angle-left: "\f104"; +$fa-var-angle-right: "\f105"; +$fa-var-angle-up: "\f106"; +$fa-var-apple: "\f179"; +$fa-var-archive: "\f187"; +$fa-var-area-chart: "\f1fe"; +$fa-var-arrow-circle-down: "\f0ab"; +$fa-var-arrow-circle-left: "\f0a8"; +$fa-var-arrow-circle-o-down: "\f01a"; +$fa-var-arrow-circle-o-left: "\f190"; +$fa-var-arrow-circle-o-right: "\f18e"; +$fa-var-arrow-circle-o-up: "\f01b"; +$fa-var-arrow-circle-right: "\f0a9"; +$fa-var-arrow-circle-up: "\f0aa"; +$fa-var-arrow-down: "\f063"; +$fa-var-arrow-left: "\f060"; +$fa-var-arrow-right: "\f061"; +$fa-var-arrow-up: "\f062"; +$fa-var-arrows: "\f047"; +$fa-var-arrows-alt: "\f0b2"; +$fa-var-arrows-h: "\f07e"; +$fa-var-arrows-v: "\f07d"; +$fa-var-asl-interpreting: "\f2a3"; +$fa-var-assistive-listening-systems: "\f2a2"; +$fa-var-asterisk: "\f069"; +$fa-var-at: "\f1fa"; +$fa-var-audio-description: "\f29e"; +$fa-var-automobile: "\f1b9"; +$fa-var-backward: "\f04a"; +$fa-var-balance-scale: "\f24e"; +$fa-var-ban: "\f05e"; +$fa-var-bank: "\f19c"; +$fa-var-bar-chart: "\f080"; +$fa-var-bar-chart-o: "\f080"; +$fa-var-barcode: "\f02a"; +$fa-var-bars: "\f0c9"; +$fa-var-battery-0: "\f244"; +$fa-var-battery-1: "\f243"; +$fa-var-battery-2: "\f242"; +$fa-var-battery-3: "\f241"; +$fa-var-battery-4: "\f240"; +$fa-var-battery-empty: "\f244"; +$fa-var-battery-full: "\f240"; +$fa-var-battery-half: "\f242"; +$fa-var-battery-quarter: "\f243"; +$fa-var-battery-three-quarters: "\f241"; +$fa-var-bed: "\f236"; +$fa-var-beer: "\f0fc"; +$fa-var-behance: "\f1b4"; +$fa-var-behance-square: "\f1b5"; +$fa-var-bell: "\f0f3"; +$fa-var-bell-o: "\f0a2"; +$fa-var-bell-slash: "\f1f6"; +$fa-var-bell-slash-o: "\f1f7"; +$fa-var-bicycle: "\f206"; +$fa-var-binoculars: "\f1e5"; +$fa-var-birthday-cake: "\f1fd"; +$fa-var-bitbucket: "\f171"; +$fa-var-bitbucket-square: "\f172"; +$fa-var-bitcoin: "\f15a"; +$fa-var-black-tie: "\f27e"; +$fa-var-blind: "\f29d"; +$fa-var-bluetooth: "\f293"; +$fa-var-bluetooth-b: "\f294"; +$fa-var-bold: "\f032"; +$fa-var-bolt: "\f0e7"; +$fa-var-bomb: "\f1e2"; +$fa-var-book: "\f02d"; +$fa-var-bookmark: "\f02e"; +$fa-var-bookmark-o: "\f097"; +$fa-var-braille: "\f2a1"; +$fa-var-briefcase: "\f0b1"; +$fa-var-btc: "\f15a"; +$fa-var-bug: "\f188"; +$fa-var-building: "\f1ad"; +$fa-var-building-o: "\f0f7"; +$fa-var-bullhorn: "\f0a1"; +$fa-var-bullseye: "\f140"; +$fa-var-bus: "\f207"; +$fa-var-buysellads: "\f20d"; +$fa-var-cab: "\f1ba"; +$fa-var-calculator: "\f1ec"; +$fa-var-calendar: "\f073"; +$fa-var-calendar-check-o: "\f274"; +$fa-var-calendar-minus-o: "\f272"; +$fa-var-calendar-o: "\f133"; +$fa-var-calendar-plus-o: "\f271"; +$fa-var-calendar-times-o: "\f273"; +$fa-var-camera: "\f030"; +$fa-var-camera-retro: "\f083"; +$fa-var-car: "\f1b9"; +$fa-var-caret-down: "\f0d7"; +$fa-var-caret-left: "\f0d9"; +$fa-var-caret-right: "\f0da"; +$fa-var-caret-square-o-down: "\f150"; +$fa-var-caret-square-o-left: "\f191"; +$fa-var-caret-square-o-right: "\f152"; +$fa-var-caret-square-o-up: "\f151"; +$fa-var-caret-up: "\f0d8"; +$fa-var-cart-arrow-down: "\f218"; +$fa-var-cart-plus: "\f217"; +$fa-var-cc: "\f20a"; +$fa-var-cc-amex: "\f1f3"; +$fa-var-cc-diners-club: "\f24c"; +$fa-var-cc-discover: "\f1f2"; +$fa-var-cc-jcb: "\f24b"; +$fa-var-cc-mastercard: "\f1f1"; +$fa-var-cc-paypal: "\f1f4"; +$fa-var-cc-stripe: "\f1f5"; +$fa-var-cc-visa: "\f1f0"; +$fa-var-certificate: "\f0a3"; +$fa-var-chain: "\f0c1"; +$fa-var-chain-broken: "\f127"; +$fa-var-check: "\f00c"; +$fa-var-check-circle: "\f058"; +$fa-var-check-circle-o: "\f05d"; +$fa-var-check-square: "\f14a"; +$fa-var-check-square-o: "\f046"; +$fa-var-chevron-circle-down: "\f13a"; +$fa-var-chevron-circle-left: "\f137"; +$fa-var-chevron-circle-right: "\f138"; +$fa-var-chevron-circle-up: "\f139"; +$fa-var-chevron-down: "\f078"; +$fa-var-chevron-left: "\f053"; +$fa-var-chevron-right: "\f054"; +$fa-var-chevron-up: "\f077"; +$fa-var-child: "\f1ae"; +$fa-var-chrome: "\f268"; +$fa-var-circle: "\f111"; +$fa-var-circle-o: "\f10c"; +$fa-var-circle-o-notch: "\f1ce"; +$fa-var-circle-thin: "\f1db"; +$fa-var-clipboard: "\f0ea"; +$fa-var-clock-o: "\f017"; +$fa-var-clone: "\f24d"; +$fa-var-close: "\f00d"; +$fa-var-cloud: "\f0c2"; +$fa-var-cloud-download: "\f0ed"; +$fa-var-cloud-upload: "\f0ee"; +$fa-var-cny: "\f157"; +$fa-var-code: "\f121"; +$fa-var-code-fork: "\f126"; +$fa-var-codepen: "\f1cb"; +$fa-var-codiepie: "\f284"; +$fa-var-coffee: "\f0f4"; +$fa-var-cog: "\f013"; +$fa-var-cogs: "\f085"; +$fa-var-columns: "\f0db"; +$fa-var-comment: "\f075"; +$fa-var-comment-o: "\f0e5"; +$fa-var-commenting: "\f27a"; +$fa-var-commenting-o: "\f27b"; +$fa-var-comments: "\f086"; +$fa-var-comments-o: "\f0e6"; +$fa-var-compass: "\f14e"; +$fa-var-compress: "\f066"; +$fa-var-connectdevelop: "\f20e"; +$fa-var-contao: "\f26d"; +$fa-var-copy: "\f0c5"; +$fa-var-copyright: "\f1f9"; +$fa-var-creative-commons: "\f25e"; +$fa-var-credit-card: "\f09d"; +$fa-var-credit-card-alt: "\f283"; +$fa-var-crop: "\f125"; +$fa-var-crosshairs: "\f05b"; +$fa-var-css3: "\f13c"; +$fa-var-cube: "\f1b2"; +$fa-var-cubes: "\f1b3"; +$fa-var-cut: "\f0c4"; +$fa-var-cutlery: "\f0f5"; +$fa-var-dashboard: "\f0e4"; +$fa-var-dashcube: "\f210"; +$fa-var-database: "\f1c0"; +$fa-var-deaf: "\f2a4"; +$fa-var-deafness: "\f2a4"; +$fa-var-dedent: "\f03b"; +$fa-var-delicious: "\f1a5"; +$fa-var-desktop: "\f108"; +$fa-var-deviantart: "\f1bd"; +$fa-var-diamond: "\f219"; +$fa-var-digg: "\f1a6"; +$fa-var-dollar: "\f155"; +$fa-var-dot-circle-o: "\f192"; +$fa-var-download: "\f019"; +$fa-var-dribbble: "\f17d"; +$fa-var-dropbox: "\f16b"; +$fa-var-drupal: "\f1a9"; +$fa-var-edge: "\f282"; +$fa-var-edit: "\f044"; +$fa-var-eject: "\f052"; +$fa-var-ellipsis-h: "\f141"; +$fa-var-ellipsis-v: "\f142"; +$fa-var-empire: "\f1d1"; +$fa-var-envelope: "\f0e0"; +$fa-var-envelope-o: "\f003"; +$fa-var-envelope-square: "\f199"; +$fa-var-envira: "\f299"; +$fa-var-eraser: "\f12d"; +$fa-var-eur: "\f153"; +$fa-var-euro: "\f153"; +$fa-var-exchange: "\f0ec"; +$fa-var-exclamation: "\f12a"; +$fa-var-exclamation-circle: "\f06a"; +$fa-var-exclamation-triangle: "\f071"; +$fa-var-expand: "\f065"; +$fa-var-expeditedssl: "\f23e"; +$fa-var-external-link: "\f08e"; +$fa-var-external-link-square: "\f14c"; +$fa-var-eye: "\f06e"; +$fa-var-eye-slash: "\f070"; +$fa-var-eyedropper: "\f1fb"; +$fa-var-fa: "\f2b4"; +$fa-var-facebook: "\f09a"; +$fa-var-facebook-f: "\f09a"; +$fa-var-facebook-official: "\f230"; +$fa-var-facebook-square: "\f082"; +$fa-var-fast-backward: "\f049"; +$fa-var-fast-forward: "\f050"; +$fa-var-fax: "\f1ac"; +$fa-var-feed: "\f09e"; +$fa-var-female: "\f182"; +$fa-var-fighter-jet: "\f0fb"; +$fa-var-file: "\f15b"; +$fa-var-file-archive-o: "\f1c6"; +$fa-var-file-audio-o: "\f1c7"; +$fa-var-file-code-o: "\f1c9"; +$fa-var-file-excel-o: "\f1c3"; +$fa-var-file-image-o: "\f1c5"; +$fa-var-file-movie-o: "\f1c8"; +$fa-var-file-o: "\f016"; +$fa-var-file-pdf-o: "\f1c1"; +$fa-var-file-photo-o: "\f1c5"; +$fa-var-file-picture-o: "\f1c5"; +$fa-var-file-powerpoint-o: "\f1c4"; +$fa-var-file-sound-o: "\f1c7"; +$fa-var-file-text: "\f15c"; +$fa-var-file-text-o: "\f0f6"; +$fa-var-file-video-o: "\f1c8"; +$fa-var-file-word-o: "\f1c2"; +$fa-var-file-zip-o: "\f1c6"; +$fa-var-files-o: "\f0c5"; +$fa-var-film: "\f008"; +$fa-var-filter: "\f0b0"; +$fa-var-fire: "\f06d"; +$fa-var-fire-extinguisher: "\f134"; +$fa-var-firefox: "\f269"; +$fa-var-first-order: "\f2b0"; +$fa-var-flag: "\f024"; +$fa-var-flag-checkered: "\f11e"; +$fa-var-flag-o: "\f11d"; +$fa-var-flash: "\f0e7"; +$fa-var-flask: "\f0c3"; +$fa-var-flickr: "\f16e"; +$fa-var-floppy-o: "\f0c7"; +$fa-var-folder: "\f07b"; +$fa-var-folder-o: "\f114"; +$fa-var-folder-open: "\f07c"; +$fa-var-folder-open-o: "\f115"; +$fa-var-font: "\f031"; +$fa-var-font-awesome: "\f2b4"; +$fa-var-fonticons: "\f280"; +$fa-var-fort-awesome: "\f286"; +$fa-var-forumbee: "\f211"; +$fa-var-forward: "\f04e"; +$fa-var-foursquare: "\f180"; +$fa-var-frown-o: "\f119"; +$fa-var-futbol-o: "\f1e3"; +$fa-var-gamepad: "\f11b"; +$fa-var-gavel: "\f0e3"; +$fa-var-gbp: "\f154"; +$fa-var-ge: "\f1d1"; +$fa-var-gear: "\f013"; +$fa-var-gears: "\f085"; +$fa-var-genderless: "\f22d"; +$fa-var-get-pocket: "\f265"; +$fa-var-gg: "\f260"; +$fa-var-gg-circle: "\f261"; +$fa-var-gift: "\f06b"; +$fa-var-git: "\f1d3"; +$fa-var-git-square: "\f1d2"; +$fa-var-github: "\f09b"; +$fa-var-github-alt: "\f113"; +$fa-var-github-square: "\f092"; +$fa-var-gitlab: "\f296"; +$fa-var-gittip: "\f184"; +$fa-var-glass: "\f000"; +$fa-var-glide: "\f2a5"; +$fa-var-glide-g: "\f2a6"; +$fa-var-globe: "\f0ac"; +$fa-var-google: "\f1a0"; +$fa-var-google-plus: "\f0d5"; +$fa-var-google-plus-circle: "\f2b3"; +$fa-var-google-plus-official: "\f2b3"; +$fa-var-google-plus-square: "\f0d4"; +$fa-var-google-wallet: "\f1ee"; +$fa-var-graduation-cap: "\f19d"; +$fa-var-gratipay: "\f184"; +$fa-var-group: "\f0c0"; +$fa-var-h-square: "\f0fd"; +$fa-var-hacker-news: "\f1d4"; +$fa-var-hand-grab-o: "\f255"; +$fa-var-hand-lizard-o: "\f258"; +$fa-var-hand-o-down: "\f0a7"; +$fa-var-hand-o-left: "\f0a5"; +$fa-var-hand-o-right: "\f0a4"; +$fa-var-hand-o-up: "\f0a6"; +$fa-var-hand-paper-o: "\f256"; +$fa-var-hand-peace-o: "\f25b"; +$fa-var-hand-pointer-o: "\f25a"; +$fa-var-hand-rock-o: "\f255"; +$fa-var-hand-scissors-o: "\f257"; +$fa-var-hand-spock-o: "\f259"; +$fa-var-hand-stop-o: "\f256"; +$fa-var-hard-of-hearing: "\f2a4"; +$fa-var-hashtag: "\f292"; +$fa-var-hdd-o: "\f0a0"; +$fa-var-header: "\f1dc"; +$fa-var-headphones: "\f025"; +$fa-var-heart: "\f004"; +$fa-var-heart-o: "\f08a"; +$fa-var-heartbeat: "\f21e"; +$fa-var-history: "\f1da"; +$fa-var-home: "\f015"; +$fa-var-hospital-o: "\f0f8"; +$fa-var-hotel: "\f236"; +$fa-var-hourglass: "\f254"; +$fa-var-hourglass-1: "\f251"; +$fa-var-hourglass-2: "\f252"; +$fa-var-hourglass-3: "\f253"; +$fa-var-hourglass-end: "\f253"; +$fa-var-hourglass-half: "\f252"; +$fa-var-hourglass-o: "\f250"; +$fa-var-hourglass-start: "\f251"; +$fa-var-houzz: "\f27c"; +$fa-var-html5: "\f13b"; +$fa-var-i-cursor: "\f246"; +$fa-var-ils: "\f20b"; +$fa-var-image: "\f03e"; +$fa-var-inbox: "\f01c"; +$fa-var-indent: "\f03c"; +$fa-var-industry: "\f275"; +$fa-var-info: "\f129"; +$fa-var-info-circle: "\f05a"; +$fa-var-inr: "\f156"; +$fa-var-instagram: "\f16d"; +$fa-var-institution: "\f19c"; +$fa-var-internet-explorer: "\f26b"; +$fa-var-intersex: "\f224"; +$fa-var-ioxhost: "\f208"; +$fa-var-italic: "\f033"; +$fa-var-joomla: "\f1aa"; +$fa-var-jpy: "\f157"; +$fa-var-jsfiddle: "\f1cc"; +$fa-var-key: "\f084"; +$fa-var-keyboard-o: "\f11c"; +$fa-var-krw: "\f159"; +$fa-var-language: "\f1ab"; +$fa-var-laptop: "\f109"; +$fa-var-lastfm: "\f202"; +$fa-var-lastfm-square: "\f203"; +$fa-var-leaf: "\f06c"; +$fa-var-leanpub: "\f212"; +$fa-var-legal: "\f0e3"; +$fa-var-lemon-o: "\f094"; +$fa-var-level-down: "\f149"; +$fa-var-level-up: "\f148"; +$fa-var-life-bouy: "\f1cd"; +$fa-var-life-buoy: "\f1cd"; +$fa-var-life-ring: "\f1cd"; +$fa-var-life-saver: "\f1cd"; +$fa-var-lightbulb-o: "\f0eb"; +$fa-var-line-chart: "\f201"; +$fa-var-link: "\f0c1"; +$fa-var-linkedin: "\f0e1"; +$fa-var-linkedin-square: "\f08c"; +$fa-var-linux: "\f17c"; +$fa-var-list: "\f03a"; +$fa-var-list-alt: "\f022"; +$fa-var-list-ol: "\f0cb"; +$fa-var-list-ul: "\f0ca"; +$fa-var-location-arrow: "\f124"; +$fa-var-lock: "\f023"; +$fa-var-long-arrow-down: "\f175"; +$fa-var-long-arrow-left: "\f177"; +$fa-var-long-arrow-right: "\f178"; +$fa-var-long-arrow-up: "\f176"; +$fa-var-low-vision: "\f2a8"; +$fa-var-magic: "\f0d0"; +$fa-var-magnet: "\f076"; +$fa-var-mail-forward: "\f064"; +$fa-var-mail-reply: "\f112"; +$fa-var-mail-reply-all: "\f122"; +$fa-var-male: "\f183"; +$fa-var-map: "\f279"; +$fa-var-map-marker: "\f041"; +$fa-var-map-o: "\f278"; +$fa-var-map-pin: "\f276"; +$fa-var-map-signs: "\f277"; +$fa-var-mars: "\f222"; +$fa-var-mars-double: "\f227"; +$fa-var-mars-stroke: "\f229"; +$fa-var-mars-stroke-h: "\f22b"; +$fa-var-mars-stroke-v: "\f22a"; +$fa-var-maxcdn: "\f136"; +$fa-var-meanpath: "\f20c"; +$fa-var-medium: "\f23a"; +$fa-var-medkit: "\f0fa"; +$fa-var-meh-o: "\f11a"; +$fa-var-mercury: "\f223"; +$fa-var-microphone: "\f130"; +$fa-var-microphone-slash: "\f131"; +$fa-var-minus: "\f068"; +$fa-var-minus-circle: "\f056"; +$fa-var-minus-square: "\f146"; +$fa-var-minus-square-o: "\f147"; +$fa-var-mixcloud: "\f289"; +$fa-var-mobile: "\f10b"; +$fa-var-mobile-phone: "\f10b"; +$fa-var-modx: "\f285"; +$fa-var-money: "\f0d6"; +$fa-var-moon-o: "\f186"; +$fa-var-mortar-board: "\f19d"; +$fa-var-motorcycle: "\f21c"; +$fa-var-mouse-pointer: "\f245"; +$fa-var-music: "\f001"; +$fa-var-navicon: "\f0c9"; +$fa-var-neuter: "\f22c"; +$fa-var-newspaper-o: "\f1ea"; +$fa-var-object-group: "\f247"; +$fa-var-object-ungroup: "\f248"; +$fa-var-odnoklassniki: "\f263"; +$fa-var-odnoklassniki-square: "\f264"; +$fa-var-opencart: "\f23d"; +$fa-var-openid: "\f19b"; +$fa-var-opera: "\f26a"; +$fa-var-optin-monster: "\f23c"; +$fa-var-outdent: "\f03b"; +$fa-var-pagelines: "\f18c"; +$fa-var-paint-brush: "\f1fc"; +$fa-var-paper-plane: "\f1d8"; +$fa-var-paper-plane-o: "\f1d9"; +$fa-var-paperclip: "\f0c6"; +$fa-var-paragraph: "\f1dd"; +$fa-var-paste: "\f0ea"; +$fa-var-pause: "\f04c"; +$fa-var-pause-circle: "\f28b"; +$fa-var-pause-circle-o: "\f28c"; +$fa-var-paw: "\f1b0"; +$fa-var-paypal: "\f1ed"; +$fa-var-pencil: "\f040"; +$fa-var-pencil-square: "\f14b"; +$fa-var-pencil-square-o: "\f044"; +$fa-var-percent: "\f295"; +$fa-var-phone: "\f095"; +$fa-var-phone-square: "\f098"; +$fa-var-photo: "\f03e"; +$fa-var-picture-o: "\f03e"; +$fa-var-pie-chart: "\f200"; +$fa-var-pied-piper: "\f2ae"; +$fa-var-pied-piper-alt: "\f1a8"; +$fa-var-pied-piper-pp: "\f1a7"; +$fa-var-pinterest: "\f0d2"; +$fa-var-pinterest-p: "\f231"; +$fa-var-pinterest-square: "\f0d3"; +$fa-var-plane: "\f072"; +$fa-var-play: "\f04b"; +$fa-var-play-circle: "\f144"; +$fa-var-play-circle-o: "\f01d"; +$fa-var-plug: "\f1e6"; +$fa-var-plus: "\f067"; +$fa-var-plus-circle: "\f055"; +$fa-var-plus-square: "\f0fe"; +$fa-var-plus-square-o: "\f196"; +$fa-var-power-off: "\f011"; +$fa-var-print: "\f02f"; +$fa-var-product-hunt: "\f288"; +$fa-var-puzzle-piece: "\f12e"; +$fa-var-qq: "\f1d6"; +$fa-var-qrcode: "\f029"; +$fa-var-question: "\f128"; +$fa-var-question-circle: "\f059"; +$fa-var-question-circle-o: "\f29c"; +$fa-var-quote-left: "\f10d"; +$fa-var-quote-right: "\f10e"; +$fa-var-ra: "\f1d0"; +$fa-var-random: "\f074"; +$fa-var-rebel: "\f1d0"; +$fa-var-recycle: "\f1b8"; +$fa-var-reddit: "\f1a1"; +$fa-var-reddit-alien: "\f281"; +$fa-var-reddit-square: "\f1a2"; +$fa-var-refresh: "\f021"; +$fa-var-registered: "\f25d"; +$fa-var-remove: "\f00d"; +$fa-var-renren: "\f18b"; +$fa-var-reorder: "\f0c9"; +$fa-var-repeat: "\f01e"; +$fa-var-reply: "\f112"; +$fa-var-reply-all: "\f122"; +$fa-var-resistance: "\f1d0"; +$fa-var-retweet: "\f079"; +$fa-var-rmb: "\f157"; +$fa-var-road: "\f018"; +$fa-var-rocket: "\f135"; +$fa-var-rotate-left: "\f0e2"; +$fa-var-rotate-right: "\f01e"; +$fa-var-rouble: "\f158"; +$fa-var-rss: "\f09e"; +$fa-var-rss-square: "\f143"; +$fa-var-rub: "\f158"; +$fa-var-ruble: "\f158"; +$fa-var-rupee: "\f156"; +$fa-var-safari: "\f267"; +$fa-var-save: "\f0c7"; +$fa-var-scissors: "\f0c4"; +$fa-var-scribd: "\f28a"; +$fa-var-search: "\f002"; +$fa-var-search-minus: "\f010"; +$fa-var-search-plus: "\f00e"; +$fa-var-sellsy: "\f213"; +$fa-var-send: "\f1d8"; +$fa-var-send-o: "\f1d9"; +$fa-var-server: "\f233"; +$fa-var-share: "\f064"; +$fa-var-share-alt: "\f1e0"; +$fa-var-share-alt-square: "\f1e1"; +$fa-var-share-square: "\f14d"; +$fa-var-share-square-o: "\f045"; +$fa-var-shekel: "\f20b"; +$fa-var-sheqel: "\f20b"; +$fa-var-shield: "\f132"; +$fa-var-ship: "\f21a"; +$fa-var-shirtsinbulk: "\f214"; +$fa-var-shopping-bag: "\f290"; +$fa-var-shopping-basket: "\f291"; +$fa-var-shopping-cart: "\f07a"; +$fa-var-sign-in: "\f090"; +$fa-var-sign-language: "\f2a7"; +$fa-var-sign-out: "\f08b"; +$fa-var-signal: "\f012"; +$fa-var-signing: "\f2a7"; +$fa-var-simplybuilt: "\f215"; +$fa-var-sitemap: "\f0e8"; +$fa-var-skyatlas: "\f216"; +$fa-var-skype: "\f17e"; +$fa-var-slack: "\f198"; +$fa-var-sliders: "\f1de"; +$fa-var-slideshare: "\f1e7"; +$fa-var-smile-o: "\f118"; +$fa-var-snapchat: "\f2ab"; +$fa-var-snapchat-ghost: "\f2ac"; +$fa-var-snapchat-square: "\f2ad"; +$fa-var-soccer-ball-o: "\f1e3"; +$fa-var-sort: "\f0dc"; +$fa-var-sort-alpha-asc: "\f15d"; +$fa-var-sort-alpha-desc: "\f15e"; +$fa-var-sort-amount-asc: "\f160"; +$fa-var-sort-amount-desc: "\f161"; +$fa-var-sort-asc: "\f0de"; +$fa-var-sort-desc: "\f0dd"; +$fa-var-sort-down: "\f0dd"; +$fa-var-sort-numeric-asc: "\f162"; +$fa-var-sort-numeric-desc: "\f163"; +$fa-var-sort-up: "\f0de"; +$fa-var-soundcloud: "\f1be"; +$fa-var-space-shuttle: "\f197"; +$fa-var-spinner: "\f110"; +$fa-var-spoon: "\f1b1"; +$fa-var-spotify: "\f1bc"; +$fa-var-square: "\f0c8"; +$fa-var-square-o: "\f096"; +$fa-var-stack-exchange: "\f18d"; +$fa-var-stack-overflow: "\f16c"; +$fa-var-star: "\f005"; +$fa-var-star-half: "\f089"; +$fa-var-star-half-empty: "\f123"; +$fa-var-star-half-full: "\f123"; +$fa-var-star-half-o: "\f123"; +$fa-var-star-o: "\f006"; +$fa-var-steam: "\f1b6"; +$fa-var-steam-square: "\f1b7"; +$fa-var-step-backward: "\f048"; +$fa-var-step-forward: "\f051"; +$fa-var-stethoscope: "\f0f1"; +$fa-var-sticky-note: "\f249"; +$fa-var-sticky-note-o: "\f24a"; +$fa-var-stop: "\f04d"; +$fa-var-stop-circle: "\f28d"; +$fa-var-stop-circle-o: "\f28e"; +$fa-var-street-view: "\f21d"; +$fa-var-strikethrough: "\f0cc"; +$fa-var-stumbleupon: "\f1a4"; +$fa-var-stumbleupon-circle: "\f1a3"; +$fa-var-subscript: "\f12c"; +$fa-var-subway: "\f239"; +$fa-var-suitcase: "\f0f2"; +$fa-var-sun-o: "\f185"; +$fa-var-superscript: "\f12b"; +$fa-var-support: "\f1cd"; +$fa-var-table: "\f0ce"; +$fa-var-tablet: "\f10a"; +$fa-var-tachometer: "\f0e4"; +$fa-var-tag: "\f02b"; +$fa-var-tags: "\f02c"; +$fa-var-tasks: "\f0ae"; +$fa-var-taxi: "\f1ba"; +$fa-var-television: "\f26c"; +$fa-var-tencent-weibo: "\f1d5"; +$fa-var-terminal: "\f120"; +$fa-var-text-height: "\f034"; +$fa-var-text-width: "\f035"; +$fa-var-th: "\f00a"; +$fa-var-th-large: "\f009"; +$fa-var-th-list: "\f00b"; +$fa-var-themeisle: "\f2b2"; +$fa-var-thumb-tack: "\f08d"; +$fa-var-thumbs-down: "\f165"; +$fa-var-thumbs-o-down: "\f088"; +$fa-var-thumbs-o-up: "\f087"; +$fa-var-thumbs-up: "\f164"; +$fa-var-ticket: "\f145"; +$fa-var-times: "\f00d"; +$fa-var-times-circle: "\f057"; +$fa-var-times-circle-o: "\f05c"; +$fa-var-tint: "\f043"; +$fa-var-toggle-down: "\f150"; +$fa-var-toggle-left: "\f191"; +$fa-var-toggle-off: "\f204"; +$fa-var-toggle-on: "\f205"; +$fa-var-toggle-right: "\f152"; +$fa-var-toggle-up: "\f151"; +$fa-var-trademark: "\f25c"; +$fa-var-train: "\f238"; +$fa-var-transgender: "\f224"; +$fa-var-transgender-alt: "\f225"; +$fa-var-trash: "\f1f8"; +$fa-var-trash-o: "\f014"; +$fa-var-tree: "\f1bb"; +$fa-var-trello: "\f181"; +$fa-var-tripadvisor: "\f262"; +$fa-var-trophy: "\f091"; +$fa-var-truck: "\f0d1"; +$fa-var-try: "\f195"; +$fa-var-tty: "\f1e4"; +$fa-var-tumblr: "\f173"; +$fa-var-tumblr-square: "\f174"; +$fa-var-turkish-lira: "\f195"; +$fa-var-tv: "\f26c"; +$fa-var-twitch: "\f1e8"; +$fa-var-twitter: "\f099"; +$fa-var-twitter-square: "\f081"; +$fa-var-umbrella: "\f0e9"; +$fa-var-underline: "\f0cd"; +$fa-var-undo: "\f0e2"; +$fa-var-universal-access: "\f29a"; +$fa-var-university: "\f19c"; +$fa-var-unlink: "\f127"; +$fa-var-unlock: "\f09c"; +$fa-var-unlock-alt: "\f13e"; +$fa-var-unsorted: "\f0dc"; +$fa-var-upload: "\f093"; +$fa-var-usb: "\f287"; +$fa-var-usd: "\f155"; +$fa-var-user: "\f007"; +$fa-var-user-md: "\f0f0"; +$fa-var-user-plus: "\f234"; +$fa-var-user-secret: "\f21b"; +$fa-var-user-times: "\f235"; +$fa-var-users: "\f0c0"; +$fa-var-venus: "\f221"; +$fa-var-venus-double: "\f226"; +$fa-var-venus-mars: "\f228"; +$fa-var-viacoin: "\f237"; +$fa-var-viadeo: "\f2a9"; +$fa-var-viadeo-square: "\f2aa"; +$fa-var-video-camera: "\f03d"; +$fa-var-vimeo: "\f27d"; +$fa-var-vimeo-square: "\f194"; +$fa-var-vine: "\f1ca"; +$fa-var-vk: "\f189"; +$fa-var-volume-control-phone: "\f2a0"; +$fa-var-volume-down: "\f027"; +$fa-var-volume-off: "\f026"; +$fa-var-volume-up: "\f028"; +$fa-var-warning: "\f071"; +$fa-var-wechat: "\f1d7"; +$fa-var-weibo: "\f18a"; +$fa-var-weixin: "\f1d7"; +$fa-var-whatsapp: "\f232"; +$fa-var-wheelchair: "\f193"; +$fa-var-wheelchair-alt: "\f29b"; +$fa-var-wifi: "\f1eb"; +$fa-var-wikipedia-w: "\f266"; +$fa-var-windows: "\f17a"; +$fa-var-won: "\f159"; +$fa-var-wordpress: "\f19a"; +$fa-var-wpbeginner: "\f297"; +$fa-var-wpforms: "\f298"; +$fa-var-wrench: "\f0ad"; +$fa-var-xing: "\f168"; +$fa-var-xing-square: "\f169"; +$fa-var-y-combinator: "\f23b"; +$fa-var-y-combinator-square: "\f1d4"; +$fa-var-yahoo: "\f19e"; +$fa-var-yc: "\f23b"; +$fa-var-yc-square: "\f1d4"; +$fa-var-yelp: "\f1e9"; +$fa-var-yen: "\f157"; +$fa-var-yoast: "\f2b1"; +$fa-var-youtube: "\f167"; +$fa-var-youtube-play: "\f16a"; +$fa-var-youtube-square: "\f166"; + diff --git a/vraptor/src/main/webapp/vendor/font-awesome/scss/font-awesome.scss b/vraptor/src/main/webapp/vendor/font-awesome/scss/font-awesome.scss new file mode 100644 index 0000000000..2308b14ca7 --- /dev/null +++ b/vraptor/src/main/webapp/vendor/font-awesome/scss/font-awesome.scss @@ -0,0 +1,18 @@ +/*! + * Font Awesome 4.6.3 by @davegandy - http://fontawesome.io - @fontawesome + * License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License) + */ + +@import "variables"; +@import "mixins"; +@import "path"; +@import "core"; +@import "larger"; +@import "fixed-width"; +@import "list"; +@import "bordered-pulled"; +@import "animated"; +@import "rotated-flipped"; +@import "stacked"; +@import "icons"; +@import "screen-reader"; diff --git a/vraptor/src/main/webapp/vendor/jquery/jquery.js b/vraptor/src/main/webapp/vendor/jquery/jquery.js new file mode 100644 index 0000000000..7fc60fca78 --- /dev/null +++ b/vraptor/src/main/webapp/vendor/jquery/jquery.js @@ -0,0 +1,11008 @@ +/*! + * jQuery JavaScript Library v1.12.4 + * http://jquery.com/ + * + * Includes Sizzle.js + * http://sizzlejs.com/ + * + * Copyright jQuery Foundation and other contributors + * Released under the MIT license + * http://jquery.org/license + * + * Date: 2016-05-20T17:17Z + */ + +(function( global, factory ) { + + if ( typeof module === "object" && typeof module.exports === "object" ) { + // For CommonJS and CommonJS-like environments where a proper `window` + // is present, execute the factory and get jQuery. + // For environments that do not have a `window` with a `document` + // (such as Node.js), expose a factory as module.exports. + // This accentuates the need for the creation of a real `window`. + // e.g. var jQuery = require("jquery")(window); + // See ticket #14549 for more info. + module.exports = global.document ? + factory( global, true ) : + function( w ) { + if ( !w.document ) { + throw new Error( "jQuery requires a window with a document" ); + } + return factory( w ); + }; + } else { + factory( global ); + } + +// Pass this if window is not defined yet +}(typeof window !== "undefined" ? window : this, function( window, noGlobal ) { + +// Support: Firefox 18+ +// Can't be in strict mode, several libs including ASP.NET trace +// the stack via arguments.caller.callee and Firefox dies if +// you try to trace through "use strict" call chains. (#13335) +//"use strict"; +var deletedIds = []; + +var document = window.document; + +var slice = deletedIds.slice; + +var concat = deletedIds.concat; + +var push = deletedIds.push; + +var indexOf = deletedIds.indexOf; + +var class2type = {}; + +var toString = class2type.toString; + +var hasOwn = class2type.hasOwnProperty; + +var support = {}; + + + +var + version = "1.12.4", + + // Define a local copy of jQuery + jQuery = function( selector, context ) { + + // The jQuery object is actually just the init constructor 'enhanced' + // Need init if jQuery is called (just allow error to be thrown if not included) + return new jQuery.fn.init( selector, context ); + }, + + // Support: Android<4.1, IE<9 + // Make sure we trim BOM and NBSP + rtrim = /^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g, + + // Matches dashed string for camelizing + rmsPrefix = /^-ms-/, + rdashAlpha = /-([\da-z])/gi, + + // Used by jQuery.camelCase as callback to replace() + fcamelCase = function( all, letter ) { + return letter.toUpperCase(); + }; + +jQuery.fn = jQuery.prototype = { + + // The current version of jQuery being used + jquery: version, + + constructor: jQuery, + + // Start with an empty selector + selector: "", + + // The default length of a jQuery object is 0 + length: 0, + + toArray: function() { + return slice.call( this ); + }, + + // Get the Nth element in the matched element set OR + // Get the whole matched element set as a clean array + get: function( num ) { + return num != null ? + + // Return just the one element from the set + ( num < 0 ? this[ num + this.length ] : this[ num ] ) : + + // Return all the elements in a clean array + slice.call( this ); + }, + + // Take an array of elements and push it onto the stack + // (returning the new matched element set) + pushStack: function( elems ) { + + // Build a new jQuery matched element set + var ret = jQuery.merge( this.constructor(), elems ); + + // Add the old object onto the stack (as a reference) + ret.prevObject = this; + ret.context = this.context; + + // Return the newly-formed element set + return ret; + }, + + // Execute a callback for every element in the matched set. + each: function( callback ) { + return jQuery.each( this, callback ); + }, + + map: function( callback ) { + return this.pushStack( jQuery.map( this, function( elem, i ) { + return callback.call( elem, i, elem ); + } ) ); + }, + + slice: function() { + return this.pushStack( slice.apply( this, arguments ) ); + }, + + first: function() { + return this.eq( 0 ); + }, + + last: function() { + return this.eq( -1 ); + }, + + eq: function( i ) { + var len = this.length, + j = +i + ( i < 0 ? len : 0 ); + return this.pushStack( j >= 0 && j < len ? [ this[ j ] ] : [] ); + }, + + end: function() { + return this.prevObject || this.constructor(); + }, + + // For internal use only. + // Behaves like an Array's method, not like a jQuery method. + push: push, + sort: deletedIds.sort, + splice: deletedIds.splice +}; + +jQuery.extend = jQuery.fn.extend = function() { + var src, copyIsArray, copy, name, options, clone, + target = arguments[ 0 ] || {}, + i = 1, + length = arguments.length, + deep = false; + + // Handle a deep copy situation + if ( typeof target === "boolean" ) { + deep = target; + + // skip the boolean and the target + target = arguments[ i ] || {}; + i++; + } + + // Handle case when target is a string or something (possible in deep copy) + if ( typeof target !== "object" && !jQuery.isFunction( target ) ) { + target = {}; + } + + // extend jQuery itself if only one argument is passed + if ( i === length ) { + target = this; + i--; + } + + for ( ; i < length; i++ ) { + + // Only deal with non-null/undefined values + if ( ( options = arguments[ i ] ) != null ) { + + // Extend the base object + for ( name in options ) { + src = target[ name ]; + copy = options[ name ]; + + // Prevent never-ending loop + if ( target === copy ) { + continue; + } + + // Recurse if we're merging plain objects or arrays + if ( deep && copy && ( jQuery.isPlainObject( copy ) || + ( copyIsArray = jQuery.isArray( copy ) ) ) ) { + + if ( copyIsArray ) { + copyIsArray = false; + clone = src && jQuery.isArray( src ) ? src : []; + + } else { + clone = src && jQuery.isPlainObject( src ) ? src : {}; + } + + // Never move original objects, clone them + target[ name ] = jQuery.extend( deep, clone, copy ); + + // Don't bring in undefined values + } else if ( copy !== undefined ) { + target[ name ] = copy; + } + } + } + } + + // Return the modified object + return target; +}; + +jQuery.extend( { + + // Unique for each copy of jQuery on the page + expando: "jQuery" + ( version + Math.random() ).replace( /\D/g, "" ), + + // Assume jQuery is ready without the ready module + isReady: true, + + error: function( msg ) { + throw new Error( msg ); + }, + + noop: function() {}, + + // See test/unit/core.js for details concerning isFunction. + // Since version 1.3, DOM methods and functions like alert + // aren't supported. They return false on IE (#2968). + isFunction: function( obj ) { + return jQuery.type( obj ) === "function"; + }, + + isArray: Array.isArray || function( obj ) { + return jQuery.type( obj ) === "array"; + }, + + isWindow: function( obj ) { + /* jshint eqeqeq: false */ + return obj != null && obj == obj.window; + }, + + isNumeric: function( obj ) { + + // parseFloat NaNs numeric-cast false positives (null|true|false|"") + // ...but misinterprets leading-number strings, particularly hex literals ("0x...") + // subtraction forces infinities to NaN + // adding 1 corrects loss of precision from parseFloat (#15100) + var realStringObj = obj && obj.toString(); + return !jQuery.isArray( obj ) && ( realStringObj - parseFloat( realStringObj ) + 1 ) >= 0; + }, + + isEmptyObject: function( obj ) { + var name; + for ( name in obj ) { + return false; + } + return true; + }, + + isPlainObject: function( obj ) { + var key; + + // Must be an Object. + // Because of IE, we also have to check the presence of the constructor property. + // Make sure that DOM nodes and window objects don't pass through, as well + if ( !obj || jQuery.type( obj ) !== "object" || obj.nodeType || jQuery.isWindow( obj ) ) { + return false; + } + + try { + + // Not own constructor property must be Object + if ( obj.constructor && + !hasOwn.call( obj, "constructor" ) && + !hasOwn.call( obj.constructor.prototype, "isPrototypeOf" ) ) { + return false; + } + } catch ( e ) { + + // IE8,9 Will throw exceptions on certain host objects #9897 + return false; + } + + // Support: IE<9 + // Handle iteration over inherited properties before own properties. + if ( !support.ownFirst ) { + for ( key in obj ) { + return hasOwn.call( obj, key ); + } + } + + // Own properties are enumerated firstly, so to speed up, + // if last one is own, then all properties are own. + for ( key in obj ) {} + + return key === undefined || hasOwn.call( obj, key ); + }, + + type: function( obj ) { + if ( obj == null ) { + return obj + ""; + } + return typeof obj === "object" || typeof obj === "function" ? + class2type[ toString.call( obj ) ] || "object" : + typeof obj; + }, + + // Workarounds based on findings by Jim Driscoll + // http://weblogs.java.net/blog/driscoll/archive/2009/09/08/eval-javascript-global-context + globalEval: function( data ) { + if ( data && jQuery.trim( data ) ) { + + // We use execScript on Internet Explorer + // We use an anonymous function so that context is window + // rather than jQuery in Firefox + ( window.execScript || function( data ) { + window[ "eval" ].call( window, data ); // jscs:ignore requireDotNotation + } )( data ); + } + }, + + // Convert dashed to camelCase; used by the css and data modules + // Microsoft forgot to hump their vendor prefix (#9572) + camelCase: function( string ) { + return string.replace( rmsPrefix, "ms-" ).replace( rdashAlpha, fcamelCase ); + }, + + nodeName: function( elem, name ) { + return elem.nodeName && elem.nodeName.toLowerCase() === name.toLowerCase(); + }, + + each: function( obj, callback ) { + var length, i = 0; + + if ( isArrayLike( obj ) ) { + length = obj.length; + for ( ; i < length; i++ ) { + if ( callback.call( obj[ i ], i, obj[ i ] ) === false ) { + break; + } + } + } else { + for ( i in obj ) { + if ( callback.call( obj[ i ], i, obj[ i ] ) === false ) { + break; + } + } + } + + return obj; + }, + + // Support: Android<4.1, IE<9 + trim: function( text ) { + return text == null ? + "" : + ( text + "" ).replace( rtrim, "" ); + }, + + // results is for internal usage only + makeArray: function( arr, results ) { + var ret = results || []; + + if ( arr != null ) { + if ( isArrayLike( Object( arr ) ) ) { + jQuery.merge( ret, + typeof arr === "string" ? + [ arr ] : arr + ); + } else { + push.call( ret, arr ); + } + } + + return ret; + }, + + inArray: function( elem, arr, i ) { + var len; + + if ( arr ) { + if ( indexOf ) { + return indexOf.call( arr, elem, i ); + } + + len = arr.length; + i = i ? i < 0 ? Math.max( 0, len + i ) : i : 0; + + for ( ; i < len; i++ ) { + + // Skip accessing in sparse arrays + if ( i in arr && arr[ i ] === elem ) { + return i; + } + } + } + + return -1; + }, + + merge: function( first, second ) { + var len = +second.length, + j = 0, + i = first.length; + + while ( j < len ) { + first[ i++ ] = second[ j++ ]; + } + + // Support: IE<9 + // Workaround casting of .length to NaN on otherwise arraylike objects (e.g., NodeLists) + if ( len !== len ) { + while ( second[ j ] !== undefined ) { + first[ i++ ] = second[ j++ ]; + } + } + + first.length = i; + + return first; + }, + + grep: function( elems, callback, invert ) { + var callbackInverse, + matches = [], + i = 0, + length = elems.length, + callbackExpect = !invert; + + // Go through the array, only saving the items + // that pass the validator function + for ( ; i < length; i++ ) { + callbackInverse = !callback( elems[ i ], i ); + if ( callbackInverse !== callbackExpect ) { + matches.push( elems[ i ] ); + } + } + + return matches; + }, + + // arg is for internal usage only + map: function( elems, callback, arg ) { + var length, value, + i = 0, + ret = []; + + // Go through the array, translating each of the items to their new values + if ( isArrayLike( elems ) ) { + length = elems.length; + for ( ; i < length; i++ ) { + value = callback( elems[ i ], i, arg ); + + if ( value != null ) { + ret.push( value ); + } + } + + // Go through every key on the object, + } else { + for ( i in elems ) { + value = callback( elems[ i ], i, arg ); + + if ( value != null ) { + ret.push( value ); + } + } + } + + // Flatten any nested arrays + return concat.apply( [], ret ); + }, + + // A global GUID counter for objects + guid: 1, + + // Bind a function to a context, optionally partially applying any + // arguments. + proxy: function( fn, context ) { + var args, proxy, tmp; + + if ( typeof context === "string" ) { + tmp = fn[ context ]; + context = fn; + fn = tmp; + } + + // Quick check to determine if target is callable, in the spec + // this throws a TypeError, but we will just return undefined. + if ( !jQuery.isFunction( fn ) ) { + return undefined; + } + + // Simulated bind + args = slice.call( arguments, 2 ); + proxy = function() { + return fn.apply( context || this, args.concat( slice.call( arguments ) ) ); + }; + + // Set the guid of unique handler to the same of original handler, so it can be removed + proxy.guid = fn.guid = fn.guid || jQuery.guid++; + + return proxy; + }, + + now: function() { + return +( new Date() ); + }, + + // jQuery.support is not used in Core but other projects attach their + // properties to it so it needs to exist. + support: support +} ); + +// JSHint would error on this code due to the Symbol not being defined in ES5. +// Defining this global in .jshintrc would create a danger of using the global +// unguarded in another place, it seems safer to just disable JSHint for these +// three lines. +/* jshint ignore: start */ +if ( typeof Symbol === "function" ) { + jQuery.fn[ Symbol.iterator ] = deletedIds[ Symbol.iterator ]; +} +/* jshint ignore: end */ + +// Populate the class2type map +jQuery.each( "Boolean Number String Function Array Date RegExp Object Error Symbol".split( " " ), +function( i, name ) { + class2type[ "[object " + name + "]" ] = name.toLowerCase(); +} ); + +function isArrayLike( obj ) { + + // Support: iOS 8.2 (not reproducible in simulator) + // `in` check used to prevent JIT error (gh-2145) + // hasOwn isn't used here due to false negatives + // regarding Nodelist length in IE + var length = !!obj && "length" in obj && obj.length, + type = jQuery.type( obj ); + + if ( type === "function" || jQuery.isWindow( obj ) ) { + return false; + } + + return type === "array" || length === 0 || + typeof length === "number" && length > 0 && ( length - 1 ) in obj; +} +var Sizzle = +/*! + * Sizzle CSS Selector Engine v2.2.1 + * http://sizzlejs.com/ + * + * Copyright jQuery Foundation and other contributors + * Released under the MIT license + * http://jquery.org/license + * + * Date: 2015-10-17 + */ +(function( window ) { + +var i, + support, + Expr, + getText, + isXML, + tokenize, + compile, + select, + outermostContext, + sortInput, + hasDuplicate, + + // Local document vars + setDocument, + document, + docElem, + documentIsHTML, + rbuggyQSA, + rbuggyMatches, + matches, + contains, + + // Instance-specific data + expando = "sizzle" + 1 * new Date(), + preferredDoc = window.document, + dirruns = 0, + done = 0, + classCache = createCache(), + tokenCache = createCache(), + compilerCache = createCache(), + sortOrder = function( a, b ) { + if ( a === b ) { + hasDuplicate = true; + } + return 0; + }, + + // General-purpose constants + MAX_NEGATIVE = 1 << 31, + + // Instance methods + hasOwn = ({}).hasOwnProperty, + arr = [], + pop = arr.pop, + push_native = arr.push, + push = arr.push, + slice = arr.slice, + // Use a stripped-down indexOf as it's faster than native + // http://jsperf.com/thor-indexof-vs-for/5 + indexOf = function( list, elem ) { + var i = 0, + len = list.length; + for ( ; i < len; i++ ) { + if ( list[i] === elem ) { + return i; + } + } + return -1; + }, + + booleans = "checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped", + + // Regular expressions + + // http://www.w3.org/TR/css3-selectors/#whitespace + whitespace = "[\\x20\\t\\r\\n\\f]", + + // http://www.w3.org/TR/CSS21/syndata.html#value-def-identifier + identifier = "(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+", + + // Attribute selectors: http://www.w3.org/TR/selectors/#attribute-selectors + attributes = "\\[" + whitespace + "*(" + identifier + ")(?:" + whitespace + + // Operator (capture 2) + "*([*^$|!~]?=)" + whitespace + + // "Attribute values must be CSS identifiers [capture 5] or strings [capture 3 or capture 4]" + "*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|(" + identifier + "))|)" + whitespace + + "*\\]", + + pseudos = ":(" + identifier + ")(?:\\((" + + // To reduce the number of selectors needing tokenize in the preFilter, prefer arguments: + // 1. quoted (capture 3; capture 4 or capture 5) + "('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|" + + // 2. simple (capture 6) + "((?:\\\\.|[^\\\\()[\\]]|" + attributes + ")*)|" + + // 3. anything else (capture 2) + ".*" + + ")\\)|)", + + // Leading and non-escaped trailing whitespace, capturing some non-whitespace characters preceding the latter + rwhitespace = new RegExp( whitespace + "+", "g" ), + rtrim = new RegExp( "^" + whitespace + "+|((?:^|[^\\\\])(?:\\\\.)*)" + whitespace + "+$", "g" ), + + rcomma = new RegExp( "^" + whitespace + "*," + whitespace + "*" ), + rcombinators = new RegExp( "^" + whitespace + "*([>+~]|" + whitespace + ")" + whitespace + "*" ), + + rattributeQuotes = new RegExp( "=" + whitespace + "*([^\\]'\"]*?)" + whitespace + "*\\]", "g" ), + + rpseudo = new RegExp( pseudos ), + ridentifier = new RegExp( "^" + identifier + "$" ), + + matchExpr = { + "ID": new RegExp( "^#(" + identifier + ")" ), + "CLASS": new RegExp( "^\\.(" + identifier + ")" ), + "TAG": new RegExp( "^(" + identifier + "|[*])" ), + "ATTR": new RegExp( "^" + attributes ), + "PSEUDO": new RegExp( "^" + pseudos ), + "CHILD": new RegExp( "^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\(" + whitespace + + "*(even|odd|(([+-]|)(\\d*)n|)" + whitespace + "*(?:([+-]|)" + whitespace + + "*(\\d+)|))" + whitespace + "*\\)|)", "i" ), + "bool": new RegExp( "^(?:" + booleans + ")$", "i" ), + // For use in libraries implementing .is() + // We use this for POS matching in `select` + "needsContext": new RegExp( "^" + whitespace + "*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\(" + + whitespace + "*((?:-\\d)?\\d*)" + whitespace + "*\\)|)(?=[^-]|$)", "i" ) + }, + + rinputs = /^(?:input|select|textarea|button)$/i, + rheader = /^h\d$/i, + + rnative = /^[^{]+\{\s*\[native \w/, + + // Easily-parseable/retrievable ID or TAG or CLASS selectors + rquickExpr = /^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/, + + rsibling = /[+~]/, + rescape = /'|\\/g, + + // CSS escapes http://www.w3.org/TR/CSS21/syndata.html#escaped-characters + runescape = new RegExp( "\\\\([\\da-f]{1,6}" + whitespace + "?|(" + whitespace + ")|.)", "ig" ), + funescape = function( _, escaped, escapedWhitespace ) { + var high = "0x" + escaped - 0x10000; + // NaN means non-codepoint + // Support: Firefox<24 + // Workaround erroneous numeric interpretation of +"0x" + return high !== high || escapedWhitespace ? + escaped : + high < 0 ? + // BMP codepoint + String.fromCharCode( high + 0x10000 ) : + // Supplemental Plane codepoint (surrogate pair) + String.fromCharCode( high >> 10 | 0xD800, high & 0x3FF | 0xDC00 ); + }, + + // Used for iframes + // See setDocument() + // Removing the function wrapper causes a "Permission Denied" + // error in IE + unloadHandler = function() { + setDocument(); + }; + +// Optimize for push.apply( _, NodeList ) +try { + push.apply( + (arr = slice.call( preferredDoc.childNodes )), + preferredDoc.childNodes + ); + // Support: Android<4.0 + // Detect silently failing push.apply + arr[ preferredDoc.childNodes.length ].nodeType; +} catch ( e ) { + push = { apply: arr.length ? + + // Leverage slice if possible + function( target, els ) { + push_native.apply( target, slice.call(els) ); + } : + + // Support: IE<9 + // Otherwise append directly + function( target, els ) { + var j = target.length, + i = 0; + // Can't trust NodeList.length + while ( (target[j++] = els[i++]) ) {} + target.length = j - 1; + } + }; +} + +function Sizzle( selector, context, results, seed ) { + var m, i, elem, nid, nidselect, match, groups, newSelector, + newContext = context && context.ownerDocument, + + // nodeType defaults to 9, since context defaults to document + nodeType = context ? context.nodeType : 9; + + results = results || []; + + // Return early from calls with invalid selector or context + if ( typeof selector !== "string" || !selector || + nodeType !== 1 && nodeType !== 9 && nodeType !== 11 ) { + + return results; + } + + // Try to shortcut find operations (as opposed to filters) in HTML documents + if ( !seed ) { + + if ( ( context ? context.ownerDocument || context : preferredDoc ) !== document ) { + setDocument( context ); + } + context = context || document; + + if ( documentIsHTML ) { + + // If the selector is sufficiently simple, try using a "get*By*" DOM method + // (excepting DocumentFragment context, where the methods don't exist) + if ( nodeType !== 11 && (match = rquickExpr.exec( selector )) ) { + + // ID selector + if ( (m = match[1]) ) { + + // Document context + if ( nodeType === 9 ) { + if ( (elem = context.getElementById( m )) ) { + + // Support: IE, Opera, Webkit + // TODO: identify versions + // getElementById can match elements by name instead of ID + if ( elem.id === m ) { + results.push( elem ); + return results; + } + } else { + return results; + } + + // Element context + } else { + + // Support: IE, Opera, Webkit + // TODO: identify versions + // getElementById can match elements by name instead of ID + if ( newContext && (elem = newContext.getElementById( m )) && + contains( context, elem ) && + elem.id === m ) { + + results.push( elem ); + return results; + } + } + + // Type selector + } else if ( match[2] ) { + push.apply( results, context.getElementsByTagName( selector ) ); + return results; + + // Class selector + } else if ( (m = match[3]) && support.getElementsByClassName && + context.getElementsByClassName ) { + + push.apply( results, context.getElementsByClassName( m ) ); + return results; + } + } + + // Take advantage of querySelectorAll + if ( support.qsa && + !compilerCache[ selector + " " ] && + (!rbuggyQSA || !rbuggyQSA.test( selector )) ) { + + if ( nodeType !== 1 ) { + newContext = context; + newSelector = selector; + + // qSA looks outside Element context, which is not what we want + // Thanks to Andrew Dupont for this workaround technique + // Support: IE <=8 + // Exclude object elements + } else if ( context.nodeName.toLowerCase() !== "object" ) { + + // Capture the context ID, setting it first if necessary + if ( (nid = context.getAttribute( "id" )) ) { + nid = nid.replace( rescape, "\\$&" ); + } else { + context.setAttribute( "id", (nid = expando) ); + } + + // Prefix every selector in the list + groups = tokenize( selector ); + i = groups.length; + nidselect = ridentifier.test( nid ) ? "#" + nid : "[id='" + nid + "']"; + while ( i-- ) { + groups[i] = nidselect + " " + toSelector( groups[i] ); + } + newSelector = groups.join( "," ); + + // Expand context for sibling selectors + newContext = rsibling.test( selector ) && testContext( context.parentNode ) || + context; + } + + if ( newSelector ) { + try { + push.apply( results, + newContext.querySelectorAll( newSelector ) + ); + return results; + } catch ( qsaError ) { + } finally { + if ( nid === expando ) { + context.removeAttribute( "id" ); + } + } + } + } + } + } + + // All others + return select( selector.replace( rtrim, "$1" ), context, results, seed ); +} + +/** + * Create key-value caches of limited size + * @returns {function(string, object)} Returns the Object data after storing it on itself with + * property name the (space-suffixed) string and (if the cache is larger than Expr.cacheLength) + * deleting the oldest entry + */ +function createCache() { + var keys = []; + + function cache( key, value ) { + // Use (key + " ") to avoid collision with native prototype properties (see Issue #157) + if ( keys.push( key + " " ) > Expr.cacheLength ) { + // Only keep the most recent entries + delete cache[ keys.shift() ]; + } + return (cache[ key + " " ] = value); + } + return cache; +} + +/** + * Mark a function for special use by Sizzle + * @param {Function} fn The function to mark + */ +function markFunction( fn ) { + fn[ expando ] = true; + return fn; +} + +/** + * Support testing using an element + * @param {Function} fn Passed the created div and expects a boolean result + */ +function assert( fn ) { + var div = document.createElement("div"); + + try { + return !!fn( div ); + } catch (e) { + return false; + } finally { + // Remove from its parent by default + if ( div.parentNode ) { + div.parentNode.removeChild( div ); + } + // release memory in IE + div = null; + } +} + +/** + * Adds the same handler for all of the specified attrs + * @param {String} attrs Pipe-separated list of attributes + * @param {Function} handler The method that will be applied + */ +function addHandle( attrs, handler ) { + var arr = attrs.split("|"), + i = arr.length; + + while ( i-- ) { + Expr.attrHandle[ arr[i] ] = handler; + } +} + +/** + * Checks document order of two siblings + * @param {Element} a + * @param {Element} b + * @returns {Number} Returns less than 0 if a precedes b, greater than 0 if a follows b + */ +function siblingCheck( a, b ) { + var cur = b && a, + diff = cur && a.nodeType === 1 && b.nodeType === 1 && + ( ~b.sourceIndex || MAX_NEGATIVE ) - + ( ~a.sourceIndex || MAX_NEGATIVE ); + + // Use IE sourceIndex if available on both nodes + if ( diff ) { + return diff; + } + + // Check if b follows a + if ( cur ) { + while ( (cur = cur.nextSibling) ) { + if ( cur === b ) { + return -1; + } + } + } + + return a ? 1 : -1; +} + +/** + * Returns a function to use in pseudos for input types + * @param {String} type + */ +function createInputPseudo( type ) { + return function( elem ) { + var name = elem.nodeName.toLowerCase(); + return name === "input" && elem.type === type; + }; +} + +/** + * Returns a function to use in pseudos for buttons + * @param {String} type + */ +function createButtonPseudo( type ) { + return function( elem ) { + var name = elem.nodeName.toLowerCase(); + return (name === "input" || name === "button") && elem.type === type; + }; +} + +/** + * Returns a function to use in pseudos for positionals + * @param {Function} fn + */ +function createPositionalPseudo( fn ) { + return markFunction(function( argument ) { + argument = +argument; + return markFunction(function( seed, matches ) { + var j, + matchIndexes = fn( [], seed.length, argument ), + i = matchIndexes.length; + + // Match elements found at the specified indexes + while ( i-- ) { + if ( seed[ (j = matchIndexes[i]) ] ) { + seed[j] = !(matches[j] = seed[j]); + } + } + }); + }); +} + +/** + * Checks a node for validity as a Sizzle context + * @param {Element|Object=} context + * @returns {Element|Object|Boolean} The input node if acceptable, otherwise a falsy value + */ +function testContext( context ) { + return context && typeof context.getElementsByTagName !== "undefined" && context; +} + +// Expose support vars for convenience +support = Sizzle.support = {}; + +/** + * Detects XML nodes + * @param {Element|Object} elem An element or a document + * @returns {Boolean} True iff elem is a non-HTML XML node + */ +isXML = Sizzle.isXML = function( elem ) { + // documentElement is verified for cases where it doesn't yet exist + // (such as loading iframes in IE - #4833) + var documentElement = elem && (elem.ownerDocument || elem).documentElement; + return documentElement ? documentElement.nodeName !== "HTML" : false; +}; + +/** + * Sets document-related variables once based on the current document + * @param {Element|Object} [doc] An element or document object to use to set the document + * @returns {Object} Returns the current document + */ +setDocument = Sizzle.setDocument = function( node ) { + var hasCompare, parent, + doc = node ? node.ownerDocument || node : preferredDoc; + + // Return early if doc is invalid or already selected + if ( doc === document || doc.nodeType !== 9 || !doc.documentElement ) { + return document; + } + + // Update global variables + document = doc; + docElem = document.documentElement; + documentIsHTML = !isXML( document ); + + // Support: IE 9-11, Edge + // Accessing iframe documents after unload throws "permission denied" errors (jQuery #13936) + if ( (parent = document.defaultView) && parent.top !== parent ) { + // Support: IE 11 + if ( parent.addEventListener ) { + parent.addEventListener( "unload", unloadHandler, false ); + + // Support: IE 9 - 10 only + } else if ( parent.attachEvent ) { + parent.attachEvent( "onunload", unloadHandler ); + } + } + + /* Attributes + ---------------------------------------------------------------------- */ + + // Support: IE<8 + // Verify that getAttribute really returns attributes and not properties + // (excepting IE8 booleans) + support.attributes = assert(function( div ) { + div.className = "i"; + return !div.getAttribute("className"); + }); + + /* getElement(s)By* + ---------------------------------------------------------------------- */ + + // Check if getElementsByTagName("*") returns only elements + support.getElementsByTagName = assert(function( div ) { + div.appendChild( document.createComment("") ); + return !div.getElementsByTagName("*").length; + }); + + // Support: IE<9 + support.getElementsByClassName = rnative.test( document.getElementsByClassName ); + + // Support: IE<10 + // Check if getElementById returns elements by name + // The broken getElementById methods don't pick up programatically-set names, + // so use a roundabout getElementsByName test + support.getById = assert(function( div ) { + docElem.appendChild( div ).id = expando; + return !document.getElementsByName || !document.getElementsByName( expando ).length; + }); + + // ID find and filter + if ( support.getById ) { + Expr.find["ID"] = function( id, context ) { + if ( typeof context.getElementById !== "undefined" && documentIsHTML ) { + var m = context.getElementById( id ); + return m ? [ m ] : []; + } + }; + Expr.filter["ID"] = function( id ) { + var attrId = id.replace( runescape, funescape ); + return function( elem ) { + return elem.getAttribute("id") === attrId; + }; + }; + } else { + // Support: IE6/7 + // getElementById is not reliable as a find shortcut + delete Expr.find["ID"]; + + Expr.filter["ID"] = function( id ) { + var attrId = id.replace( runescape, funescape ); + return function( elem ) { + var node = typeof elem.getAttributeNode !== "undefined" && + elem.getAttributeNode("id"); + return node && node.value === attrId; + }; + }; + } + + // Tag + Expr.find["TAG"] = support.getElementsByTagName ? + function( tag, context ) { + if ( typeof context.getElementsByTagName !== "undefined" ) { + return context.getElementsByTagName( tag ); + + // DocumentFragment nodes don't have gEBTN + } else if ( support.qsa ) { + return context.querySelectorAll( tag ); + } + } : + + function( tag, context ) { + var elem, + tmp = [], + i = 0, + // By happy coincidence, a (broken) gEBTN appears on DocumentFragment nodes too + results = context.getElementsByTagName( tag ); + + // Filter out possible comments + if ( tag === "*" ) { + while ( (elem = results[i++]) ) { + if ( elem.nodeType === 1 ) { + tmp.push( elem ); + } + } + + return tmp; + } + return results; + }; + + // Class + Expr.find["CLASS"] = support.getElementsByClassName && function( className, context ) { + if ( typeof context.getElementsByClassName !== "undefined" && documentIsHTML ) { + return context.getElementsByClassName( className ); + } + }; + + /* QSA/matchesSelector + ---------------------------------------------------------------------- */ + + // QSA and matchesSelector support + + // matchesSelector(:active) reports false when true (IE9/Opera 11.5) + rbuggyMatches = []; + + // qSa(:focus) reports false when true (Chrome 21) + // We allow this because of a bug in IE8/9 that throws an error + // whenever `document.activeElement` is accessed on an iframe + // So, we allow :focus to pass through QSA all the time to avoid the IE error + // See http://bugs.jquery.com/ticket/13378 + rbuggyQSA = []; + + if ( (support.qsa = rnative.test( document.querySelectorAll )) ) { + // Build QSA regex + // Regex strategy adopted from Diego Perini + assert(function( div ) { + // Select is set to empty string on purpose + // This is to test IE's treatment of not explicitly + // setting a boolean content attribute, + // since its presence should be enough + // http://bugs.jquery.com/ticket/12359 + docElem.appendChild( div ).innerHTML = "" + + ""; + + // Support: IE8, Opera 11-12.16 + // Nothing should be selected when empty strings follow ^= or $= or *= + // The test attribute must be unknown in Opera but "safe" for WinRT + // http://msdn.microsoft.com/en-us/library/ie/hh465388.aspx#attribute_section + if ( div.querySelectorAll("[msallowcapture^='']").length ) { + rbuggyQSA.push( "[*^$]=" + whitespace + "*(?:''|\"\")" ); + } + + // Support: IE8 + // Boolean attributes and "value" are not treated correctly + if ( !div.querySelectorAll("[selected]").length ) { + rbuggyQSA.push( "\\[" + whitespace + "*(?:value|" + booleans + ")" ); + } + + // Support: Chrome<29, Android<4.4, Safari<7.0+, iOS<7.0+, PhantomJS<1.9.8+ + if ( !div.querySelectorAll( "[id~=" + expando + "-]" ).length ) { + rbuggyQSA.push("~="); + } + + // Webkit/Opera - :checked should return selected option elements + // http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked + // IE8 throws error here and will not see later tests + if ( !div.querySelectorAll(":checked").length ) { + rbuggyQSA.push(":checked"); + } + + // Support: Safari 8+, iOS 8+ + // https://bugs.webkit.org/show_bug.cgi?id=136851 + // In-page `selector#id sibing-combinator selector` fails + if ( !div.querySelectorAll( "a#" + expando + "+*" ).length ) { + rbuggyQSA.push(".#.+[+~]"); + } + }); + + assert(function( div ) { + // Support: Windows 8 Native Apps + // The type and name attributes are restricted during .innerHTML assignment + var input = document.createElement("input"); + input.setAttribute( "type", "hidden" ); + div.appendChild( input ).setAttribute( "name", "D" ); + + // Support: IE8 + // Enforce case-sensitivity of name attribute + if ( div.querySelectorAll("[name=d]").length ) { + rbuggyQSA.push( "name" + whitespace + "*[*^$|!~]?=" ); + } + + // FF 3.5 - :enabled/:disabled and hidden elements (hidden elements are still enabled) + // IE8 throws error here and will not see later tests + if ( !div.querySelectorAll(":enabled").length ) { + rbuggyQSA.push( ":enabled", ":disabled" ); + } + + // Opera 10-11 does not throw on post-comma invalid pseudos + div.querySelectorAll("*,:x"); + rbuggyQSA.push(",.*:"); + }); + } + + if ( (support.matchesSelector = rnative.test( (matches = docElem.matches || + docElem.webkitMatchesSelector || + docElem.mozMatchesSelector || + docElem.oMatchesSelector || + docElem.msMatchesSelector) )) ) { + + assert(function( div ) { + // Check to see if it's possible to do matchesSelector + // on a disconnected node (IE 9) + support.disconnectedMatch = matches.call( div, "div" ); + + // This should fail with an exception + // Gecko does not error, returns false instead + matches.call( div, "[s!='']:x" ); + rbuggyMatches.push( "!=", pseudos ); + }); + } + + rbuggyQSA = rbuggyQSA.length && new RegExp( rbuggyQSA.join("|") ); + rbuggyMatches = rbuggyMatches.length && new RegExp( rbuggyMatches.join("|") ); + + /* Contains + ---------------------------------------------------------------------- */ + hasCompare = rnative.test( docElem.compareDocumentPosition ); + + // Element contains another + // Purposefully self-exclusive + // As in, an element does not contain itself + contains = hasCompare || rnative.test( docElem.contains ) ? + function( a, b ) { + var adown = a.nodeType === 9 ? a.documentElement : a, + bup = b && b.parentNode; + return a === bup || !!( bup && bup.nodeType === 1 && ( + adown.contains ? + adown.contains( bup ) : + a.compareDocumentPosition && a.compareDocumentPosition( bup ) & 16 + )); + } : + function( a, b ) { + if ( b ) { + while ( (b = b.parentNode) ) { + if ( b === a ) { + return true; + } + } + } + return false; + }; + + /* Sorting + ---------------------------------------------------------------------- */ + + // Document order sorting + sortOrder = hasCompare ? + function( a, b ) { + + // Flag for duplicate removal + if ( a === b ) { + hasDuplicate = true; + return 0; + } + + // Sort on method existence if only one input has compareDocumentPosition + var compare = !a.compareDocumentPosition - !b.compareDocumentPosition; + if ( compare ) { + return compare; + } + + // Calculate position if both inputs belong to the same document + compare = ( a.ownerDocument || a ) === ( b.ownerDocument || b ) ? + a.compareDocumentPosition( b ) : + + // Otherwise we know they are disconnected + 1; + + // Disconnected nodes + if ( compare & 1 || + (!support.sortDetached && b.compareDocumentPosition( a ) === compare) ) { + + // Choose the first element that is related to our preferred document + if ( a === document || a.ownerDocument === preferredDoc && contains(preferredDoc, a) ) { + return -1; + } + if ( b === document || b.ownerDocument === preferredDoc && contains(preferredDoc, b) ) { + return 1; + } + + // Maintain original order + return sortInput ? + ( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) : + 0; + } + + return compare & 4 ? -1 : 1; + } : + function( a, b ) { + // Exit early if the nodes are identical + if ( a === b ) { + hasDuplicate = true; + return 0; + } + + var cur, + i = 0, + aup = a.parentNode, + bup = b.parentNode, + ap = [ a ], + bp = [ b ]; + + // Parentless nodes are either documents or disconnected + if ( !aup || !bup ) { + return a === document ? -1 : + b === document ? 1 : + aup ? -1 : + bup ? 1 : + sortInput ? + ( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) : + 0; + + // If the nodes are siblings, we can do a quick check + } else if ( aup === bup ) { + return siblingCheck( a, b ); + } + + // Otherwise we need full lists of their ancestors for comparison + cur = a; + while ( (cur = cur.parentNode) ) { + ap.unshift( cur ); + } + cur = b; + while ( (cur = cur.parentNode) ) { + bp.unshift( cur ); + } + + // Walk down the tree looking for a discrepancy + while ( ap[i] === bp[i] ) { + i++; + } + + return i ? + // Do a sibling check if the nodes have a common ancestor + siblingCheck( ap[i], bp[i] ) : + + // Otherwise nodes in our document sort first + ap[i] === preferredDoc ? -1 : + bp[i] === preferredDoc ? 1 : + 0; + }; + + return document; +}; + +Sizzle.matches = function( expr, elements ) { + return Sizzle( expr, null, null, elements ); +}; + +Sizzle.matchesSelector = function( elem, expr ) { + // Set document vars if needed + if ( ( elem.ownerDocument || elem ) !== document ) { + setDocument( elem ); + } + + // Make sure that attribute selectors are quoted + expr = expr.replace( rattributeQuotes, "='$1']" ); + + if ( support.matchesSelector && documentIsHTML && + !compilerCache[ expr + " " ] && + ( !rbuggyMatches || !rbuggyMatches.test( expr ) ) && + ( !rbuggyQSA || !rbuggyQSA.test( expr ) ) ) { + + try { + var ret = matches.call( elem, expr ); + + // IE 9's matchesSelector returns false on disconnected nodes + if ( ret || support.disconnectedMatch || + // As well, disconnected nodes are said to be in a document + // fragment in IE 9 + elem.document && elem.document.nodeType !== 11 ) { + return ret; + } + } catch (e) {} + } + + return Sizzle( expr, document, null, [ elem ] ).length > 0; +}; + +Sizzle.contains = function( context, elem ) { + // Set document vars if needed + if ( ( context.ownerDocument || context ) !== document ) { + setDocument( context ); + } + return contains( context, elem ); +}; + +Sizzle.attr = function( elem, name ) { + // Set document vars if needed + if ( ( elem.ownerDocument || elem ) !== document ) { + setDocument( elem ); + } + + var fn = Expr.attrHandle[ name.toLowerCase() ], + // Don't get fooled by Object.prototype properties (jQuery #13807) + val = fn && hasOwn.call( Expr.attrHandle, name.toLowerCase() ) ? + fn( elem, name, !documentIsHTML ) : + undefined; + + return val !== undefined ? + val : + support.attributes || !documentIsHTML ? + elem.getAttribute( name ) : + (val = elem.getAttributeNode(name)) && val.specified ? + val.value : + null; +}; + +Sizzle.error = function( msg ) { + throw new Error( "Syntax error, unrecognized expression: " + msg ); +}; + +/** + * Document sorting and removing duplicates + * @param {ArrayLike} results + */ +Sizzle.uniqueSort = function( results ) { + var elem, + duplicates = [], + j = 0, + i = 0; + + // Unless we *know* we can detect duplicates, assume their presence + hasDuplicate = !support.detectDuplicates; + sortInput = !support.sortStable && results.slice( 0 ); + results.sort( sortOrder ); + + if ( hasDuplicate ) { + while ( (elem = results[i++]) ) { + if ( elem === results[ i ] ) { + j = duplicates.push( i ); + } + } + while ( j-- ) { + results.splice( duplicates[ j ], 1 ); + } + } + + // Clear input after sorting to release objects + // See https://github.com/jquery/sizzle/pull/225 + sortInput = null; + + return results; +}; + +/** + * Utility function for retrieving the text value of an array of DOM nodes + * @param {Array|Element} elem + */ +getText = Sizzle.getText = function( elem ) { + var node, + ret = "", + i = 0, + nodeType = elem.nodeType; + + if ( !nodeType ) { + // If no nodeType, this is expected to be an array + while ( (node = elem[i++]) ) { + // Do not traverse comment nodes + ret += getText( node ); + } + } else if ( nodeType === 1 || nodeType === 9 || nodeType === 11 ) { + // Use textContent for elements + // innerText usage removed for consistency of new lines (jQuery #11153) + if ( typeof elem.textContent === "string" ) { + return elem.textContent; + } else { + // Traverse its children + for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) { + ret += getText( elem ); + } + } + } else if ( nodeType === 3 || nodeType === 4 ) { + return elem.nodeValue; + } + // Do not include comment or processing instruction nodes + + return ret; +}; + +Expr = Sizzle.selectors = { + + // Can be adjusted by the user + cacheLength: 50, + + createPseudo: markFunction, + + match: matchExpr, + + attrHandle: {}, + + find: {}, + + relative: { + ">": { dir: "parentNode", first: true }, + " ": { dir: "parentNode" }, + "+": { dir: "previousSibling", first: true }, + "~": { dir: "previousSibling" } + }, + + preFilter: { + "ATTR": function( match ) { + match[1] = match[1].replace( runescape, funescape ); + + // Move the given value to match[3] whether quoted or unquoted + match[3] = ( match[3] || match[4] || match[5] || "" ).replace( runescape, funescape ); + + if ( match[2] === "~=" ) { + match[3] = " " + match[3] + " "; + } + + return match.slice( 0, 4 ); + }, + + "CHILD": function( match ) { + /* matches from matchExpr["CHILD"] + 1 type (only|nth|...) + 2 what (child|of-type) + 3 argument (even|odd|\d*|\d*n([+-]\d+)?|...) + 4 xn-component of xn+y argument ([+-]?\d*n|) + 5 sign of xn-component + 6 x of xn-component + 7 sign of y-component + 8 y of y-component + */ + match[1] = match[1].toLowerCase(); + + if ( match[1].slice( 0, 3 ) === "nth" ) { + // nth-* requires argument + if ( !match[3] ) { + Sizzle.error( match[0] ); + } + + // numeric x and y parameters for Expr.filter.CHILD + // remember that false/true cast respectively to 0/1 + match[4] = +( match[4] ? match[5] + (match[6] || 1) : 2 * ( match[3] === "even" || match[3] === "odd" ) ); + match[5] = +( ( match[7] + match[8] ) || match[3] === "odd" ); + + // other types prohibit arguments + } else if ( match[3] ) { + Sizzle.error( match[0] ); + } + + return match; + }, + + "PSEUDO": function( match ) { + var excess, + unquoted = !match[6] && match[2]; + + if ( matchExpr["CHILD"].test( match[0] ) ) { + return null; + } + + // Accept quoted arguments as-is + if ( match[3] ) { + match[2] = match[4] || match[5] || ""; + + // Strip excess characters from unquoted arguments + } else if ( unquoted && rpseudo.test( unquoted ) && + // Get excess from tokenize (recursively) + (excess = tokenize( unquoted, true )) && + // advance to the next closing parenthesis + (excess = unquoted.indexOf( ")", unquoted.length - excess ) - unquoted.length) ) { + + // excess is a negative index + match[0] = match[0].slice( 0, excess ); + match[2] = unquoted.slice( 0, excess ); + } + + // Return only captures needed by the pseudo filter method (type and argument) + return match.slice( 0, 3 ); + } + }, + + filter: { + + "TAG": function( nodeNameSelector ) { + var nodeName = nodeNameSelector.replace( runescape, funescape ).toLowerCase(); + return nodeNameSelector === "*" ? + function() { return true; } : + function( elem ) { + return elem.nodeName && elem.nodeName.toLowerCase() === nodeName; + }; + }, + + "CLASS": function( className ) { + var pattern = classCache[ className + " " ]; + + return pattern || + (pattern = new RegExp( "(^|" + whitespace + ")" + className + "(" + whitespace + "|$)" )) && + classCache( className, function( elem ) { + return pattern.test( typeof elem.className === "string" && elem.className || typeof elem.getAttribute !== "undefined" && elem.getAttribute("class") || "" ); + }); + }, + + "ATTR": function( name, operator, check ) { + return function( elem ) { + var result = Sizzle.attr( elem, name ); + + if ( result == null ) { + return operator === "!="; + } + if ( !operator ) { + return true; + } + + result += ""; + + return operator === "=" ? result === check : + operator === "!=" ? result !== check : + operator === "^=" ? check && result.indexOf( check ) === 0 : + operator === "*=" ? check && result.indexOf( check ) > -1 : + operator === "$=" ? check && result.slice( -check.length ) === check : + operator === "~=" ? ( " " + result.replace( rwhitespace, " " ) + " " ).indexOf( check ) > -1 : + operator === "|=" ? result === check || result.slice( 0, check.length + 1 ) === check + "-" : + false; + }; + }, + + "CHILD": function( type, what, argument, first, last ) { + var simple = type.slice( 0, 3 ) !== "nth", + forward = type.slice( -4 ) !== "last", + ofType = what === "of-type"; + + return first === 1 && last === 0 ? + + // Shortcut for :nth-*(n) + function( elem ) { + return !!elem.parentNode; + } : + + function( elem, context, xml ) { + var cache, uniqueCache, outerCache, node, nodeIndex, start, + dir = simple !== forward ? "nextSibling" : "previousSibling", + parent = elem.parentNode, + name = ofType && elem.nodeName.toLowerCase(), + useCache = !xml && !ofType, + diff = false; + + if ( parent ) { + + // :(first|last|only)-(child|of-type) + if ( simple ) { + while ( dir ) { + node = elem; + while ( (node = node[ dir ]) ) { + if ( ofType ? + node.nodeName.toLowerCase() === name : + node.nodeType === 1 ) { + + return false; + } + } + // Reverse direction for :only-* (if we haven't yet done so) + start = dir = type === "only" && !start && "nextSibling"; + } + return true; + } + + start = [ forward ? parent.firstChild : parent.lastChild ]; + + // non-xml :nth-child(...) stores cache data on `parent` + if ( forward && useCache ) { + + // Seek `elem` from a previously-cached index + + // ...in a gzip-friendly way + node = parent; + outerCache = node[ expando ] || (node[ expando ] = {}); + + // Support: IE <9 only + // Defend against cloned attroperties (jQuery gh-1709) + uniqueCache = outerCache[ node.uniqueID ] || + (outerCache[ node.uniqueID ] = {}); + + cache = uniqueCache[ type ] || []; + nodeIndex = cache[ 0 ] === dirruns && cache[ 1 ]; + diff = nodeIndex && cache[ 2 ]; + node = nodeIndex && parent.childNodes[ nodeIndex ]; + + while ( (node = ++nodeIndex && node && node[ dir ] || + + // Fallback to seeking `elem` from the start + (diff = nodeIndex = 0) || start.pop()) ) { + + // When found, cache indexes on `parent` and break + if ( node.nodeType === 1 && ++diff && node === elem ) { + uniqueCache[ type ] = [ dirruns, nodeIndex, diff ]; + break; + } + } + + } else { + // Use previously-cached element index if available + if ( useCache ) { + // ...in a gzip-friendly way + node = elem; + outerCache = node[ expando ] || (node[ expando ] = {}); + + // Support: IE <9 only + // Defend against cloned attroperties (jQuery gh-1709) + uniqueCache = outerCache[ node.uniqueID ] || + (outerCache[ node.uniqueID ] = {}); + + cache = uniqueCache[ type ] || []; + nodeIndex = cache[ 0 ] === dirruns && cache[ 1 ]; + diff = nodeIndex; + } + + // xml :nth-child(...) + // or :nth-last-child(...) or :nth(-last)?-of-type(...) + if ( diff === false ) { + // Use the same loop as above to seek `elem` from the start + while ( (node = ++nodeIndex && node && node[ dir ] || + (diff = nodeIndex = 0) || start.pop()) ) { + + if ( ( ofType ? + node.nodeName.toLowerCase() === name : + node.nodeType === 1 ) && + ++diff ) { + + // Cache the index of each encountered element + if ( useCache ) { + outerCache = node[ expando ] || (node[ expando ] = {}); + + // Support: IE <9 only + // Defend against cloned attroperties (jQuery gh-1709) + uniqueCache = outerCache[ node.uniqueID ] || + (outerCache[ node.uniqueID ] = {}); + + uniqueCache[ type ] = [ dirruns, diff ]; + } + + if ( node === elem ) { + break; + } + } + } + } + } + + // Incorporate the offset, then check against cycle size + diff -= last; + return diff === first || ( diff % first === 0 && diff / first >= 0 ); + } + }; + }, + + "PSEUDO": function( pseudo, argument ) { + // pseudo-class names are case-insensitive + // http://www.w3.org/TR/selectors/#pseudo-classes + // Prioritize by case sensitivity in case custom pseudos are added with uppercase letters + // Remember that setFilters inherits from pseudos + var args, + fn = Expr.pseudos[ pseudo ] || Expr.setFilters[ pseudo.toLowerCase() ] || + Sizzle.error( "unsupported pseudo: " + pseudo ); + + // The user may use createPseudo to indicate that + // arguments are needed to create the filter function + // just as Sizzle does + if ( fn[ expando ] ) { + return fn( argument ); + } + + // But maintain support for old signatures + if ( fn.length > 1 ) { + args = [ pseudo, pseudo, "", argument ]; + return Expr.setFilters.hasOwnProperty( pseudo.toLowerCase() ) ? + markFunction(function( seed, matches ) { + var idx, + matched = fn( seed, argument ), + i = matched.length; + while ( i-- ) { + idx = indexOf( seed, matched[i] ); + seed[ idx ] = !( matches[ idx ] = matched[i] ); + } + }) : + function( elem ) { + return fn( elem, 0, args ); + }; + } + + return fn; + } + }, + + pseudos: { + // Potentially complex pseudos + "not": markFunction(function( selector ) { + // Trim the selector passed to compile + // to avoid treating leading and trailing + // spaces as combinators + var input = [], + results = [], + matcher = compile( selector.replace( rtrim, "$1" ) ); + + return matcher[ expando ] ? + markFunction(function( seed, matches, context, xml ) { + var elem, + unmatched = matcher( seed, null, xml, [] ), + i = seed.length; + + // Match elements unmatched by `matcher` + while ( i-- ) { + if ( (elem = unmatched[i]) ) { + seed[i] = !(matches[i] = elem); + } + } + }) : + function( elem, context, xml ) { + input[0] = elem; + matcher( input, null, xml, results ); + // Don't keep the element (issue #299) + input[0] = null; + return !results.pop(); + }; + }), + + "has": markFunction(function( selector ) { + return function( elem ) { + return Sizzle( selector, elem ).length > 0; + }; + }), + + "contains": markFunction(function( text ) { + text = text.replace( runescape, funescape ); + return function( elem ) { + return ( elem.textContent || elem.innerText || getText( elem ) ).indexOf( text ) > -1; + }; + }), + + // "Whether an element is represented by a :lang() selector + // is based solely on the element's language value + // being equal to the identifier C, + // or beginning with the identifier C immediately followed by "-". + // The matching of C against the element's language value is performed case-insensitively. + // The identifier C does not have to be a valid language name." + // http://www.w3.org/TR/selectors/#lang-pseudo + "lang": markFunction( function( lang ) { + // lang value must be a valid identifier + if ( !ridentifier.test(lang || "") ) { + Sizzle.error( "unsupported lang: " + lang ); + } + lang = lang.replace( runescape, funescape ).toLowerCase(); + return function( elem ) { + var elemLang; + do { + if ( (elemLang = documentIsHTML ? + elem.lang : + elem.getAttribute("xml:lang") || elem.getAttribute("lang")) ) { + + elemLang = elemLang.toLowerCase(); + return elemLang === lang || elemLang.indexOf( lang + "-" ) === 0; + } + } while ( (elem = elem.parentNode) && elem.nodeType === 1 ); + return false; + }; + }), + + // Miscellaneous + "target": function( elem ) { + var hash = window.location && window.location.hash; + return hash && hash.slice( 1 ) === elem.id; + }, + + "root": function( elem ) { + return elem === docElem; + }, + + "focus": function( elem ) { + return elem === document.activeElement && (!document.hasFocus || document.hasFocus()) && !!(elem.type || elem.href || ~elem.tabIndex); + }, + + // Boolean properties + "enabled": function( elem ) { + return elem.disabled === false; + }, + + "disabled": function( elem ) { + return elem.disabled === true; + }, + + "checked": function( elem ) { + // In CSS3, :checked should return both checked and selected elements + // http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked + var nodeName = elem.nodeName.toLowerCase(); + return (nodeName === "input" && !!elem.checked) || (nodeName === "option" && !!elem.selected); + }, + + "selected": function( elem ) { + // Accessing this property makes selected-by-default + // options in Safari work properly + if ( elem.parentNode ) { + elem.parentNode.selectedIndex; + } + + return elem.selected === true; + }, + + // Contents + "empty": function( elem ) { + // http://www.w3.org/TR/selectors/#empty-pseudo + // :empty is negated by element (1) or content nodes (text: 3; cdata: 4; entity ref: 5), + // but not by others (comment: 8; processing instruction: 7; etc.) + // nodeType < 6 works because attributes (2) do not appear as children + for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) { + if ( elem.nodeType < 6 ) { + return false; + } + } + return true; + }, + + "parent": function( elem ) { + return !Expr.pseudos["empty"]( elem ); + }, + + // Element/input types + "header": function( elem ) { + return rheader.test( elem.nodeName ); + }, + + "input": function( elem ) { + return rinputs.test( elem.nodeName ); + }, + + "button": function( elem ) { + var name = elem.nodeName.toLowerCase(); + return name === "input" && elem.type === "button" || name === "button"; + }, + + "text": function( elem ) { + var attr; + return elem.nodeName.toLowerCase() === "input" && + elem.type === "text" && + + // Support: IE<8 + // New HTML5 attribute values (e.g., "search") appear with elem.type === "text" + ( (attr = elem.getAttribute("type")) == null || attr.toLowerCase() === "text" ); + }, + + // Position-in-collection + "first": createPositionalPseudo(function() { + return [ 0 ]; + }), + + "last": createPositionalPseudo(function( matchIndexes, length ) { + return [ length - 1 ]; + }), + + "eq": createPositionalPseudo(function( matchIndexes, length, argument ) { + return [ argument < 0 ? argument + length : argument ]; + }), + + "even": createPositionalPseudo(function( matchIndexes, length ) { + var i = 0; + for ( ; i < length; i += 2 ) { + matchIndexes.push( i ); + } + return matchIndexes; + }), + + "odd": createPositionalPseudo(function( matchIndexes, length ) { + var i = 1; + for ( ; i < length; i += 2 ) { + matchIndexes.push( i ); + } + return matchIndexes; + }), + + "lt": createPositionalPseudo(function( matchIndexes, length, argument ) { + var i = argument < 0 ? argument + length : argument; + for ( ; --i >= 0; ) { + matchIndexes.push( i ); + } + return matchIndexes; + }), + + "gt": createPositionalPseudo(function( matchIndexes, length, argument ) { + var i = argument < 0 ? argument + length : argument; + for ( ; ++i < length; ) { + matchIndexes.push( i ); + } + return matchIndexes; + }) + } +}; + +Expr.pseudos["nth"] = Expr.pseudos["eq"]; + +// Add button/input type pseudos +for ( i in { radio: true, checkbox: true, file: true, password: true, image: true } ) { + Expr.pseudos[ i ] = createInputPseudo( i ); +} +for ( i in { submit: true, reset: true } ) { + Expr.pseudos[ i ] = createButtonPseudo( i ); +} + +// Easy API for creating new setFilters +function setFilters() {} +setFilters.prototype = Expr.filters = Expr.pseudos; +Expr.setFilters = new setFilters(); + +tokenize = Sizzle.tokenize = function( selector, parseOnly ) { + var matched, match, tokens, type, + soFar, groups, preFilters, + cached = tokenCache[ selector + " " ]; + + if ( cached ) { + return parseOnly ? 0 : cached.slice( 0 ); + } + + soFar = selector; + groups = []; + preFilters = Expr.preFilter; + + while ( soFar ) { + + // Comma and first run + if ( !matched || (match = rcomma.exec( soFar )) ) { + if ( match ) { + // Don't consume trailing commas as valid + soFar = soFar.slice( match[0].length ) || soFar; + } + groups.push( (tokens = []) ); + } + + matched = false; + + // Combinators + if ( (match = rcombinators.exec( soFar )) ) { + matched = match.shift(); + tokens.push({ + value: matched, + // Cast descendant combinators to space + type: match[0].replace( rtrim, " " ) + }); + soFar = soFar.slice( matched.length ); + } + + // Filters + for ( type in Expr.filter ) { + if ( (match = matchExpr[ type ].exec( soFar )) && (!preFilters[ type ] || + (match = preFilters[ type ]( match ))) ) { + matched = match.shift(); + tokens.push({ + value: matched, + type: type, + matches: match + }); + soFar = soFar.slice( matched.length ); + } + } + + if ( !matched ) { + break; + } + } + + // Return the length of the invalid excess + // if we're just parsing + // Otherwise, throw an error or return tokens + return parseOnly ? + soFar.length : + soFar ? + Sizzle.error( selector ) : + // Cache the tokens + tokenCache( selector, groups ).slice( 0 ); +}; + +function toSelector( tokens ) { + var i = 0, + len = tokens.length, + selector = ""; + for ( ; i < len; i++ ) { + selector += tokens[i].value; + } + return selector; +} + +function addCombinator( matcher, combinator, base ) { + var dir = combinator.dir, + checkNonElements = base && dir === "parentNode", + doneName = done++; + + return combinator.first ? + // Check against closest ancestor/preceding element + function( elem, context, xml ) { + while ( (elem = elem[ dir ]) ) { + if ( elem.nodeType === 1 || checkNonElements ) { + return matcher( elem, context, xml ); + } + } + } : + + // Check against all ancestor/preceding elements + function( elem, context, xml ) { + var oldCache, uniqueCache, outerCache, + newCache = [ dirruns, doneName ]; + + // We can't set arbitrary data on XML nodes, so they don't benefit from combinator caching + if ( xml ) { + while ( (elem = elem[ dir ]) ) { + if ( elem.nodeType === 1 || checkNonElements ) { + if ( matcher( elem, context, xml ) ) { + return true; + } + } + } + } else { + while ( (elem = elem[ dir ]) ) { + if ( elem.nodeType === 1 || checkNonElements ) { + outerCache = elem[ expando ] || (elem[ expando ] = {}); + + // Support: IE <9 only + // Defend against cloned attroperties (jQuery gh-1709) + uniqueCache = outerCache[ elem.uniqueID ] || (outerCache[ elem.uniqueID ] = {}); + + if ( (oldCache = uniqueCache[ dir ]) && + oldCache[ 0 ] === dirruns && oldCache[ 1 ] === doneName ) { + + // Assign to newCache so results back-propagate to previous elements + return (newCache[ 2 ] = oldCache[ 2 ]); + } else { + // Reuse newcache so results back-propagate to previous elements + uniqueCache[ dir ] = newCache; + + // A match means we're done; a fail means we have to keep checking + if ( (newCache[ 2 ] = matcher( elem, context, xml )) ) { + return true; + } + } + } + } + } + }; +} + +function elementMatcher( matchers ) { + return matchers.length > 1 ? + function( elem, context, xml ) { + var i = matchers.length; + while ( i-- ) { + if ( !matchers[i]( elem, context, xml ) ) { + return false; + } + } + return true; + } : + matchers[0]; +} + +function multipleContexts( selector, contexts, results ) { + var i = 0, + len = contexts.length; + for ( ; i < len; i++ ) { + Sizzle( selector, contexts[i], results ); + } + return results; +} + +function condense( unmatched, map, filter, context, xml ) { + var elem, + newUnmatched = [], + i = 0, + len = unmatched.length, + mapped = map != null; + + for ( ; i < len; i++ ) { + if ( (elem = unmatched[i]) ) { + if ( !filter || filter( elem, context, xml ) ) { + newUnmatched.push( elem ); + if ( mapped ) { + map.push( i ); + } + } + } + } + + return newUnmatched; +} + +function setMatcher( preFilter, selector, matcher, postFilter, postFinder, postSelector ) { + if ( postFilter && !postFilter[ expando ] ) { + postFilter = setMatcher( postFilter ); + } + if ( postFinder && !postFinder[ expando ] ) { + postFinder = setMatcher( postFinder, postSelector ); + } + return markFunction(function( seed, results, context, xml ) { + var temp, i, elem, + preMap = [], + postMap = [], + preexisting = results.length, + + // Get initial elements from seed or context + elems = seed || multipleContexts( selector || "*", context.nodeType ? [ context ] : context, [] ), + + // Prefilter to get matcher input, preserving a map for seed-results synchronization + matcherIn = preFilter && ( seed || !selector ) ? + condense( elems, preMap, preFilter, context, xml ) : + elems, + + matcherOut = matcher ? + // If we have a postFinder, or filtered seed, or non-seed postFilter or preexisting results, + postFinder || ( seed ? preFilter : preexisting || postFilter ) ? + + // ...intermediate processing is necessary + [] : + + // ...otherwise use results directly + results : + matcherIn; + + // Find primary matches + if ( matcher ) { + matcher( matcherIn, matcherOut, context, xml ); + } + + // Apply postFilter + if ( postFilter ) { + temp = condense( matcherOut, postMap ); + postFilter( temp, [], context, xml ); + + // Un-match failing elements by moving them back to matcherIn + i = temp.length; + while ( i-- ) { + if ( (elem = temp[i]) ) { + matcherOut[ postMap[i] ] = !(matcherIn[ postMap[i] ] = elem); + } + } + } + + if ( seed ) { + if ( postFinder || preFilter ) { + if ( postFinder ) { + // Get the final matcherOut by condensing this intermediate into postFinder contexts + temp = []; + i = matcherOut.length; + while ( i-- ) { + if ( (elem = matcherOut[i]) ) { + // Restore matcherIn since elem is not yet a final match + temp.push( (matcherIn[i] = elem) ); + } + } + postFinder( null, (matcherOut = []), temp, xml ); + } + + // Move matched elements from seed to results to keep them synchronized + i = matcherOut.length; + while ( i-- ) { + if ( (elem = matcherOut[i]) && + (temp = postFinder ? indexOf( seed, elem ) : preMap[i]) > -1 ) { + + seed[temp] = !(results[temp] = elem); + } + } + } + + // Add elements to results, through postFinder if defined + } else { + matcherOut = condense( + matcherOut === results ? + matcherOut.splice( preexisting, matcherOut.length ) : + matcherOut + ); + if ( postFinder ) { + postFinder( null, results, matcherOut, xml ); + } else { + push.apply( results, matcherOut ); + } + } + }); +} + +function matcherFromTokens( tokens ) { + var checkContext, matcher, j, + len = tokens.length, + leadingRelative = Expr.relative[ tokens[0].type ], + implicitRelative = leadingRelative || Expr.relative[" "], + i = leadingRelative ? 1 : 0, + + // The foundational matcher ensures that elements are reachable from top-level context(s) + matchContext = addCombinator( function( elem ) { + return elem === checkContext; + }, implicitRelative, true ), + matchAnyContext = addCombinator( function( elem ) { + return indexOf( checkContext, elem ) > -1; + }, implicitRelative, true ), + matchers = [ function( elem, context, xml ) { + var ret = ( !leadingRelative && ( xml || context !== outermostContext ) ) || ( + (checkContext = context).nodeType ? + matchContext( elem, context, xml ) : + matchAnyContext( elem, context, xml ) ); + // Avoid hanging onto element (issue #299) + checkContext = null; + return ret; + } ]; + + for ( ; i < len; i++ ) { + if ( (matcher = Expr.relative[ tokens[i].type ]) ) { + matchers = [ addCombinator(elementMatcher( matchers ), matcher) ]; + } else { + matcher = Expr.filter[ tokens[i].type ].apply( null, tokens[i].matches ); + + // Return special upon seeing a positional matcher + if ( matcher[ expando ] ) { + // Find the next relative operator (if any) for proper handling + j = ++i; + for ( ; j < len; j++ ) { + if ( Expr.relative[ tokens[j].type ] ) { + break; + } + } + return setMatcher( + i > 1 && elementMatcher( matchers ), + i > 1 && toSelector( + // If the preceding token was a descendant combinator, insert an implicit any-element `*` + tokens.slice( 0, i - 1 ).concat({ value: tokens[ i - 2 ].type === " " ? "*" : "" }) + ).replace( rtrim, "$1" ), + matcher, + i < j && matcherFromTokens( tokens.slice( i, j ) ), + j < len && matcherFromTokens( (tokens = tokens.slice( j )) ), + j < len && toSelector( tokens ) + ); + } + matchers.push( matcher ); + } + } + + return elementMatcher( matchers ); +} + +function matcherFromGroupMatchers( elementMatchers, setMatchers ) { + var bySet = setMatchers.length > 0, + byElement = elementMatchers.length > 0, + superMatcher = function( seed, context, xml, results, outermost ) { + var elem, j, matcher, + matchedCount = 0, + i = "0", + unmatched = seed && [], + setMatched = [], + contextBackup = outermostContext, + // We must always have either seed elements or outermost context + elems = seed || byElement && Expr.find["TAG"]( "*", outermost ), + // Use integer dirruns iff this is the outermost matcher + dirrunsUnique = (dirruns += contextBackup == null ? 1 : Math.random() || 0.1), + len = elems.length; + + if ( outermost ) { + outermostContext = context === document || context || outermost; + } + + // Add elements passing elementMatchers directly to results + // Support: IE<9, Safari + // Tolerate NodeList properties (IE: "length"; Safari: ) matching elements by id + for ( ; i !== len && (elem = elems[i]) != null; i++ ) { + if ( byElement && elem ) { + j = 0; + if ( !context && elem.ownerDocument !== document ) { + setDocument( elem ); + xml = !documentIsHTML; + } + while ( (matcher = elementMatchers[j++]) ) { + if ( matcher( elem, context || document, xml) ) { + results.push( elem ); + break; + } + } + if ( outermost ) { + dirruns = dirrunsUnique; + } + } + + // Track unmatched elements for set filters + if ( bySet ) { + // They will have gone through all possible matchers + if ( (elem = !matcher && elem) ) { + matchedCount--; + } + + // Lengthen the array for every element, matched or not + if ( seed ) { + unmatched.push( elem ); + } + } + } + + // `i` is now the count of elements visited above, and adding it to `matchedCount` + // makes the latter nonnegative. + matchedCount += i; + + // Apply set filters to unmatched elements + // NOTE: This can be skipped if there are no unmatched elements (i.e., `matchedCount` + // equals `i`), unless we didn't visit _any_ elements in the above loop because we have + // no element matchers and no seed. + // Incrementing an initially-string "0" `i` allows `i` to remain a string only in that + // case, which will result in a "00" `matchedCount` that differs from `i` but is also + // numerically zero. + if ( bySet && i !== matchedCount ) { + j = 0; + while ( (matcher = setMatchers[j++]) ) { + matcher( unmatched, setMatched, context, xml ); + } + + if ( seed ) { + // Reintegrate element matches to eliminate the need for sorting + if ( matchedCount > 0 ) { + while ( i-- ) { + if ( !(unmatched[i] || setMatched[i]) ) { + setMatched[i] = pop.call( results ); + } + } + } + + // Discard index placeholder values to get only actual matches + setMatched = condense( setMatched ); + } + + // Add matches to results + push.apply( results, setMatched ); + + // Seedless set matches succeeding multiple successful matchers stipulate sorting + if ( outermost && !seed && setMatched.length > 0 && + ( matchedCount + setMatchers.length ) > 1 ) { + + Sizzle.uniqueSort( results ); + } + } + + // Override manipulation of globals by nested matchers + if ( outermost ) { + dirruns = dirrunsUnique; + outermostContext = contextBackup; + } + + return unmatched; + }; + + return bySet ? + markFunction( superMatcher ) : + superMatcher; +} + +compile = Sizzle.compile = function( selector, match /* Internal Use Only */ ) { + var i, + setMatchers = [], + elementMatchers = [], + cached = compilerCache[ selector + " " ]; + + if ( !cached ) { + // Generate a function of recursive functions that can be used to check each element + if ( !match ) { + match = tokenize( selector ); + } + i = match.length; + while ( i-- ) { + cached = matcherFromTokens( match[i] ); + if ( cached[ expando ] ) { + setMatchers.push( cached ); + } else { + elementMatchers.push( cached ); + } + } + + // Cache the compiled function + cached = compilerCache( selector, matcherFromGroupMatchers( elementMatchers, setMatchers ) ); + + // Save selector and tokenization + cached.selector = selector; + } + return cached; +}; + +/** + * A low-level selection function that works with Sizzle's compiled + * selector functions + * @param {String|Function} selector A selector or a pre-compiled + * selector function built with Sizzle.compile + * @param {Element} context + * @param {Array} [results] + * @param {Array} [seed] A set of elements to match against + */ +select = Sizzle.select = function( selector, context, results, seed ) { + var i, tokens, token, type, find, + compiled = typeof selector === "function" && selector, + match = !seed && tokenize( (selector = compiled.selector || selector) ); + + results = results || []; + + // Try to minimize operations if there is only one selector in the list and no seed + // (the latter of which guarantees us context) + if ( match.length === 1 ) { + + // Reduce context if the leading compound selector is an ID + tokens = match[0] = match[0].slice( 0 ); + if ( tokens.length > 2 && (token = tokens[0]).type === "ID" && + support.getById && context.nodeType === 9 && documentIsHTML && + Expr.relative[ tokens[1].type ] ) { + + context = ( Expr.find["ID"]( token.matches[0].replace(runescape, funescape), context ) || [] )[0]; + if ( !context ) { + return results; + + // Precompiled matchers will still verify ancestry, so step up a level + } else if ( compiled ) { + context = context.parentNode; + } + + selector = selector.slice( tokens.shift().value.length ); + } + + // Fetch a seed set for right-to-left matching + i = matchExpr["needsContext"].test( selector ) ? 0 : tokens.length; + while ( i-- ) { + token = tokens[i]; + + // Abort if we hit a combinator + if ( Expr.relative[ (type = token.type) ] ) { + break; + } + if ( (find = Expr.find[ type ]) ) { + // Search, expanding context for leading sibling combinators + if ( (seed = find( + token.matches[0].replace( runescape, funescape ), + rsibling.test( tokens[0].type ) && testContext( context.parentNode ) || context + )) ) { + + // If seed is empty or no tokens remain, we can return early + tokens.splice( i, 1 ); + selector = seed.length && toSelector( tokens ); + if ( !selector ) { + push.apply( results, seed ); + return results; + } + + break; + } + } + } + } + + // Compile and execute a filtering function if one is not provided + // Provide `match` to avoid retokenization if we modified the selector above + ( compiled || compile( selector, match ) )( + seed, + context, + !documentIsHTML, + results, + !context || rsibling.test( selector ) && testContext( context.parentNode ) || context + ); + return results; +}; + +// One-time assignments + +// Sort stability +support.sortStable = expando.split("").sort( sortOrder ).join("") === expando; + +// Support: Chrome 14-35+ +// Always assume duplicates if they aren't passed to the comparison function +support.detectDuplicates = !!hasDuplicate; + +// Initialize against the default document +setDocument(); + +// Support: Webkit<537.32 - Safari 6.0.3/Chrome 25 (fixed in Chrome 27) +// Detached nodes confoundingly follow *each other* +support.sortDetached = assert(function( div1 ) { + // Should return 1, but returns 4 (following) + return div1.compareDocumentPosition( document.createElement("div") ) & 1; +}); + +// Support: IE<8 +// Prevent attribute/property "interpolation" +// http://msdn.microsoft.com/en-us/library/ms536429%28VS.85%29.aspx +if ( !assert(function( div ) { + div.innerHTML = ""; + return div.firstChild.getAttribute("href") === "#" ; +}) ) { + addHandle( "type|href|height|width", function( elem, name, isXML ) { + if ( !isXML ) { + return elem.getAttribute( name, name.toLowerCase() === "type" ? 1 : 2 ); + } + }); +} + +// Support: IE<9 +// Use defaultValue in place of getAttribute("value") +if ( !support.attributes || !assert(function( div ) { + div.innerHTML = ""; + div.firstChild.setAttribute( "value", "" ); + return div.firstChild.getAttribute( "value" ) === ""; +}) ) { + addHandle( "value", function( elem, name, isXML ) { + if ( !isXML && elem.nodeName.toLowerCase() === "input" ) { + return elem.defaultValue; + } + }); +} + +// Support: IE<9 +// Use getAttributeNode to fetch booleans when getAttribute lies +if ( !assert(function( div ) { + return div.getAttribute("disabled") == null; +}) ) { + addHandle( booleans, function( elem, name, isXML ) { + var val; + if ( !isXML ) { + return elem[ name ] === true ? name.toLowerCase() : + (val = elem.getAttributeNode( name )) && val.specified ? + val.value : + null; + } + }); +} + +return Sizzle; + +})( window ); + + + +jQuery.find = Sizzle; +jQuery.expr = Sizzle.selectors; +jQuery.expr[ ":" ] = jQuery.expr.pseudos; +jQuery.uniqueSort = jQuery.unique = Sizzle.uniqueSort; +jQuery.text = Sizzle.getText; +jQuery.isXMLDoc = Sizzle.isXML; +jQuery.contains = Sizzle.contains; + + + +var dir = function( elem, dir, until ) { + var matched = [], + truncate = until !== undefined; + + while ( ( elem = elem[ dir ] ) && elem.nodeType !== 9 ) { + if ( elem.nodeType === 1 ) { + if ( truncate && jQuery( elem ).is( until ) ) { + break; + } + matched.push( elem ); + } + } + return matched; +}; + + +var siblings = function( n, elem ) { + var matched = []; + + for ( ; n; n = n.nextSibling ) { + if ( n.nodeType === 1 && n !== elem ) { + matched.push( n ); + } + } + + return matched; +}; + + +var rneedsContext = jQuery.expr.match.needsContext; + +var rsingleTag = ( /^<([\w-]+)\s*\/?>(?:<\/\1>|)$/ ); + + + +var risSimple = /^.[^:#\[\.,]*$/; + +// Implement the identical functionality for filter and not +function winnow( elements, qualifier, not ) { + if ( jQuery.isFunction( qualifier ) ) { + return jQuery.grep( elements, function( elem, i ) { + /* jshint -W018 */ + return !!qualifier.call( elem, i, elem ) !== not; + } ); + + } + + if ( qualifier.nodeType ) { + return jQuery.grep( elements, function( elem ) { + return ( elem === qualifier ) !== not; + } ); + + } + + if ( typeof qualifier === "string" ) { + if ( risSimple.test( qualifier ) ) { + return jQuery.filter( qualifier, elements, not ); + } + + qualifier = jQuery.filter( qualifier, elements ); + } + + return jQuery.grep( elements, function( elem ) { + return ( jQuery.inArray( elem, qualifier ) > -1 ) !== not; + } ); +} + +jQuery.filter = function( expr, elems, not ) { + var elem = elems[ 0 ]; + + if ( not ) { + expr = ":not(" + expr + ")"; + } + + return elems.length === 1 && elem.nodeType === 1 ? + jQuery.find.matchesSelector( elem, expr ) ? [ elem ] : [] : + jQuery.find.matches( expr, jQuery.grep( elems, function( elem ) { + return elem.nodeType === 1; + } ) ); +}; + +jQuery.fn.extend( { + find: function( selector ) { + var i, + ret = [], + self = this, + len = self.length; + + if ( typeof selector !== "string" ) { + return this.pushStack( jQuery( selector ).filter( function() { + for ( i = 0; i < len; i++ ) { + if ( jQuery.contains( self[ i ], this ) ) { + return true; + } + } + } ) ); + } + + for ( i = 0; i < len; i++ ) { + jQuery.find( selector, self[ i ], ret ); + } + + // Needed because $( selector, context ) becomes $( context ).find( selector ) + ret = this.pushStack( len > 1 ? jQuery.unique( ret ) : ret ); + ret.selector = this.selector ? this.selector + " " + selector : selector; + return ret; + }, + filter: function( selector ) { + return this.pushStack( winnow( this, selector || [], false ) ); + }, + not: function( selector ) { + return this.pushStack( winnow( this, selector || [], true ) ); + }, + is: function( selector ) { + return !!winnow( + this, + + // If this is a positional/relative selector, check membership in the returned set + // so $("p:first").is("p:last") won't return true for a doc with two "p". + typeof selector === "string" && rneedsContext.test( selector ) ? + jQuery( selector ) : + selector || [], + false + ).length; + } +} ); + + +// Initialize a jQuery object + + +// A central reference to the root jQuery(document) +var rootjQuery, + + // A simple way to check for HTML strings + // Prioritize #id over to avoid XSS via location.hash (#9521) + // Strict HTML recognition (#11290: must start with <) + rquickExpr = /^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]*))$/, + + init = jQuery.fn.init = function( selector, context, root ) { + var match, elem; + + // HANDLE: $(""), $(null), $(undefined), $(false) + if ( !selector ) { + return this; + } + + // init accepts an alternate rootjQuery + // so migrate can support jQuery.sub (gh-2101) + root = root || rootjQuery; + + // Handle HTML strings + if ( typeof selector === "string" ) { + if ( selector.charAt( 0 ) === "<" && + selector.charAt( selector.length - 1 ) === ">" && + selector.length >= 3 ) { + + // Assume that strings that start and end with <> are HTML and skip the regex check + match = [ null, selector, null ]; + + } else { + match = rquickExpr.exec( selector ); + } + + // Match html or make sure no context is specified for #id + if ( match && ( match[ 1 ] || !context ) ) { + + // HANDLE: $(html) -> $(array) + if ( match[ 1 ] ) { + context = context instanceof jQuery ? context[ 0 ] : context; + + // scripts is true for back-compat + // Intentionally let the error be thrown if parseHTML is not present + jQuery.merge( this, jQuery.parseHTML( + match[ 1 ], + context && context.nodeType ? context.ownerDocument || context : document, + true + ) ); + + // HANDLE: $(html, props) + if ( rsingleTag.test( match[ 1 ] ) && jQuery.isPlainObject( context ) ) { + for ( match in context ) { + + // Properties of context are called as methods if possible + if ( jQuery.isFunction( this[ match ] ) ) { + this[ match ]( context[ match ] ); + + // ...and otherwise set as attributes + } else { + this.attr( match, context[ match ] ); + } + } + } + + return this; + + // HANDLE: $(#id) + } else { + elem = document.getElementById( match[ 2 ] ); + + // Check parentNode to catch when Blackberry 4.6 returns + // nodes that are no longer in the document #6963 + if ( elem && elem.parentNode ) { + + // Handle the case where IE and Opera return items + // by name instead of ID + if ( elem.id !== match[ 2 ] ) { + return rootjQuery.find( selector ); + } + + // Otherwise, we inject the element directly into the jQuery object + this.length = 1; + this[ 0 ] = elem; + } + + this.context = document; + this.selector = selector; + return this; + } + + // HANDLE: $(expr, $(...)) + } else if ( !context || context.jquery ) { + return ( context || root ).find( selector ); + + // HANDLE: $(expr, context) + // (which is just equivalent to: $(context).find(expr) + } else { + return this.constructor( context ).find( selector ); + } + + // HANDLE: $(DOMElement) + } else if ( selector.nodeType ) { + this.context = this[ 0 ] = selector; + this.length = 1; + return this; + + // HANDLE: $(function) + // Shortcut for document ready + } else if ( jQuery.isFunction( selector ) ) { + return typeof root.ready !== "undefined" ? + root.ready( selector ) : + + // Execute immediately if ready is not present + selector( jQuery ); + } + + if ( selector.selector !== undefined ) { + this.selector = selector.selector; + this.context = selector.context; + } + + return jQuery.makeArray( selector, this ); + }; + +// Give the init function the jQuery prototype for later instantiation +init.prototype = jQuery.fn; + +// Initialize central reference +rootjQuery = jQuery( document ); + + +var rparentsprev = /^(?:parents|prev(?:Until|All))/, + + // methods guaranteed to produce a unique set when starting from a unique set + guaranteedUnique = { + children: true, + contents: true, + next: true, + prev: true + }; + +jQuery.fn.extend( { + has: function( target ) { + var i, + targets = jQuery( target, this ), + len = targets.length; + + return this.filter( function() { + for ( i = 0; i < len; i++ ) { + if ( jQuery.contains( this, targets[ i ] ) ) { + return true; + } + } + } ); + }, + + closest: function( selectors, context ) { + var cur, + i = 0, + l = this.length, + matched = [], + pos = rneedsContext.test( selectors ) || typeof selectors !== "string" ? + jQuery( selectors, context || this.context ) : + 0; + + for ( ; i < l; i++ ) { + for ( cur = this[ i ]; cur && cur !== context; cur = cur.parentNode ) { + + // Always skip document fragments + if ( cur.nodeType < 11 && ( pos ? + pos.index( cur ) > -1 : + + // Don't pass non-elements to Sizzle + cur.nodeType === 1 && + jQuery.find.matchesSelector( cur, selectors ) ) ) { + + matched.push( cur ); + break; + } + } + } + + return this.pushStack( matched.length > 1 ? jQuery.uniqueSort( matched ) : matched ); + }, + + // Determine the position of an element within + // the matched set of elements + index: function( elem ) { + + // No argument, return index in parent + if ( !elem ) { + return ( this[ 0 ] && this[ 0 ].parentNode ) ? this.first().prevAll().length : -1; + } + + // index in selector + if ( typeof elem === "string" ) { + return jQuery.inArray( this[ 0 ], jQuery( elem ) ); + } + + // Locate the position of the desired element + return jQuery.inArray( + + // If it receives a jQuery object, the first element is used + elem.jquery ? elem[ 0 ] : elem, this ); + }, + + add: function( selector, context ) { + return this.pushStack( + jQuery.uniqueSort( + jQuery.merge( this.get(), jQuery( selector, context ) ) + ) + ); + }, + + addBack: function( selector ) { + return this.add( selector == null ? + this.prevObject : this.prevObject.filter( selector ) + ); + } +} ); + +function sibling( cur, dir ) { + do { + cur = cur[ dir ]; + } while ( cur && cur.nodeType !== 1 ); + + return cur; +} + +jQuery.each( { + parent: function( elem ) { + var parent = elem.parentNode; + return parent && parent.nodeType !== 11 ? parent : null; + }, + parents: function( elem ) { + return dir( elem, "parentNode" ); + }, + parentsUntil: function( elem, i, until ) { + return dir( elem, "parentNode", until ); + }, + next: function( elem ) { + return sibling( elem, "nextSibling" ); + }, + prev: function( elem ) { + return sibling( elem, "previousSibling" ); + }, + nextAll: function( elem ) { + return dir( elem, "nextSibling" ); + }, + prevAll: function( elem ) { + return dir( elem, "previousSibling" ); + }, + nextUntil: function( elem, i, until ) { + return dir( elem, "nextSibling", until ); + }, + prevUntil: function( elem, i, until ) { + return dir( elem, "previousSibling", until ); + }, + siblings: function( elem ) { + return siblings( ( elem.parentNode || {} ).firstChild, elem ); + }, + children: function( elem ) { + return siblings( elem.firstChild ); + }, + contents: function( elem ) { + return jQuery.nodeName( elem, "iframe" ) ? + elem.contentDocument || elem.contentWindow.document : + jQuery.merge( [], elem.childNodes ); + } +}, function( name, fn ) { + jQuery.fn[ name ] = function( until, selector ) { + var ret = jQuery.map( this, fn, until ); + + if ( name.slice( -5 ) !== "Until" ) { + selector = until; + } + + if ( selector && typeof selector === "string" ) { + ret = jQuery.filter( selector, ret ); + } + + if ( this.length > 1 ) { + + // Remove duplicates + if ( !guaranteedUnique[ name ] ) { + ret = jQuery.uniqueSort( ret ); + } + + // Reverse order for parents* and prev-derivatives + if ( rparentsprev.test( name ) ) { + ret = ret.reverse(); + } + } + + return this.pushStack( ret ); + }; +} ); +var rnotwhite = ( /\S+/g ); + + + +// Convert String-formatted options into Object-formatted ones +function createOptions( options ) { + var object = {}; + jQuery.each( options.match( rnotwhite ) || [], function( _, flag ) { + object[ flag ] = true; + } ); + return object; +} + +/* + * Create a callback list using the following parameters: + * + * options: an optional list of space-separated options that will change how + * the callback list behaves or a more traditional option object + * + * By default a callback list will act like an event callback list and can be + * "fired" multiple times. + * + * Possible options: + * + * once: will ensure the callback list can only be fired once (like a Deferred) + * + * memory: will keep track of previous values and will call any callback added + * after the list has been fired right away with the latest "memorized" + * values (like a Deferred) + * + * unique: will ensure a callback can only be added once (no duplicate in the list) + * + * stopOnFalse: interrupt callings when a callback returns false + * + */ +jQuery.Callbacks = function( options ) { + + // Convert options from String-formatted to Object-formatted if needed + // (we check in cache first) + options = typeof options === "string" ? + createOptions( options ) : + jQuery.extend( {}, options ); + + var // Flag to know if list is currently firing + firing, + + // Last fire value for non-forgettable lists + memory, + + // Flag to know if list was already fired + fired, + + // Flag to prevent firing + locked, + + // Actual callback list + list = [], + + // Queue of execution data for repeatable lists + queue = [], + + // Index of currently firing callback (modified by add/remove as needed) + firingIndex = -1, + + // Fire callbacks + fire = function() { + + // Enforce single-firing + locked = options.once; + + // Execute callbacks for all pending executions, + // respecting firingIndex overrides and runtime changes + fired = firing = true; + for ( ; queue.length; firingIndex = -1 ) { + memory = queue.shift(); + while ( ++firingIndex < list.length ) { + + // Run callback and check for early termination + if ( list[ firingIndex ].apply( memory[ 0 ], memory[ 1 ] ) === false && + options.stopOnFalse ) { + + // Jump to end and forget the data so .add doesn't re-fire + firingIndex = list.length; + memory = false; + } + } + } + + // Forget the data if we're done with it + if ( !options.memory ) { + memory = false; + } + + firing = false; + + // Clean up if we're done firing for good + if ( locked ) { + + // Keep an empty list if we have data for future add calls + if ( memory ) { + list = []; + + // Otherwise, this object is spent + } else { + list = ""; + } + } + }, + + // Actual Callbacks object + self = { + + // Add a callback or a collection of callbacks to the list + add: function() { + if ( list ) { + + // If we have memory from a past run, we should fire after adding + if ( memory && !firing ) { + firingIndex = list.length - 1; + queue.push( memory ); + } + + ( function add( args ) { + jQuery.each( args, function( _, arg ) { + if ( jQuery.isFunction( arg ) ) { + if ( !options.unique || !self.has( arg ) ) { + list.push( arg ); + } + } else if ( arg && arg.length && jQuery.type( arg ) !== "string" ) { + + // Inspect recursively + add( arg ); + } + } ); + } )( arguments ); + + if ( memory && !firing ) { + fire(); + } + } + return this; + }, + + // Remove a callback from the list + remove: function() { + jQuery.each( arguments, function( _, arg ) { + var index; + while ( ( index = jQuery.inArray( arg, list, index ) ) > -1 ) { + list.splice( index, 1 ); + + // Handle firing indexes + if ( index <= firingIndex ) { + firingIndex--; + } + } + } ); + return this; + }, + + // Check if a given callback is in the list. + // If no argument is given, return whether or not list has callbacks attached. + has: function( fn ) { + return fn ? + jQuery.inArray( fn, list ) > -1 : + list.length > 0; + }, + + // Remove all callbacks from the list + empty: function() { + if ( list ) { + list = []; + } + return this; + }, + + // Disable .fire and .add + // Abort any current/pending executions + // Clear all callbacks and values + disable: function() { + locked = queue = []; + list = memory = ""; + return this; + }, + disabled: function() { + return !list; + }, + + // Disable .fire + // Also disable .add unless we have memory (since it would have no effect) + // Abort any pending executions + lock: function() { + locked = true; + if ( !memory ) { + self.disable(); + } + return this; + }, + locked: function() { + return !!locked; + }, + + // Call all callbacks with the given context and arguments + fireWith: function( context, args ) { + if ( !locked ) { + args = args || []; + args = [ context, args.slice ? args.slice() : args ]; + queue.push( args ); + if ( !firing ) { + fire(); + } + } + return this; + }, + + // Call all the callbacks with the given arguments + fire: function() { + self.fireWith( this, arguments ); + return this; + }, + + // To know if the callbacks have already been called at least once + fired: function() { + return !!fired; + } + }; + + return self; +}; + + +jQuery.extend( { + + Deferred: function( func ) { + var tuples = [ + + // action, add listener, listener list, final state + [ "resolve", "done", jQuery.Callbacks( "once memory" ), "resolved" ], + [ "reject", "fail", jQuery.Callbacks( "once memory" ), "rejected" ], + [ "notify", "progress", jQuery.Callbacks( "memory" ) ] + ], + state = "pending", + promise = { + state: function() { + return state; + }, + always: function() { + deferred.done( arguments ).fail( arguments ); + return this; + }, + then: function( /* fnDone, fnFail, fnProgress */ ) { + var fns = arguments; + return jQuery.Deferred( function( newDefer ) { + jQuery.each( tuples, function( i, tuple ) { + var fn = jQuery.isFunction( fns[ i ] ) && fns[ i ]; + + // deferred[ done | fail | progress ] for forwarding actions to newDefer + deferred[ tuple[ 1 ] ]( function() { + var returned = fn && fn.apply( this, arguments ); + if ( returned && jQuery.isFunction( returned.promise ) ) { + returned.promise() + .progress( newDefer.notify ) + .done( newDefer.resolve ) + .fail( newDefer.reject ); + } else { + newDefer[ tuple[ 0 ] + "With" ]( + this === promise ? newDefer.promise() : this, + fn ? [ returned ] : arguments + ); + } + } ); + } ); + fns = null; + } ).promise(); + }, + + // Get a promise for this deferred + // If obj is provided, the promise aspect is added to the object + promise: function( obj ) { + return obj != null ? jQuery.extend( obj, promise ) : promise; + } + }, + deferred = {}; + + // Keep pipe for back-compat + promise.pipe = promise.then; + + // Add list-specific methods + jQuery.each( tuples, function( i, tuple ) { + var list = tuple[ 2 ], + stateString = tuple[ 3 ]; + + // promise[ done | fail | progress ] = list.add + promise[ tuple[ 1 ] ] = list.add; + + // Handle state + if ( stateString ) { + list.add( function() { + + // state = [ resolved | rejected ] + state = stateString; + + // [ reject_list | resolve_list ].disable; progress_list.lock + }, tuples[ i ^ 1 ][ 2 ].disable, tuples[ 2 ][ 2 ].lock ); + } + + // deferred[ resolve | reject | notify ] + deferred[ tuple[ 0 ] ] = function() { + deferred[ tuple[ 0 ] + "With" ]( this === deferred ? promise : this, arguments ); + return this; + }; + deferred[ tuple[ 0 ] + "With" ] = list.fireWith; + } ); + + // Make the deferred a promise + promise.promise( deferred ); + + // Call given func if any + if ( func ) { + func.call( deferred, deferred ); + } + + // All done! + return deferred; + }, + + // Deferred helper + when: function( subordinate /* , ..., subordinateN */ ) { + var i = 0, + resolveValues = slice.call( arguments ), + length = resolveValues.length, + + // the count of uncompleted subordinates + remaining = length !== 1 || + ( subordinate && jQuery.isFunction( subordinate.promise ) ) ? length : 0, + + // the master Deferred. + // If resolveValues consist of only a single Deferred, just use that. + deferred = remaining === 1 ? subordinate : jQuery.Deferred(), + + // Update function for both resolve and progress values + updateFunc = function( i, contexts, values ) { + return function( value ) { + contexts[ i ] = this; + values[ i ] = arguments.length > 1 ? slice.call( arguments ) : value; + if ( values === progressValues ) { + deferred.notifyWith( contexts, values ); + + } else if ( !( --remaining ) ) { + deferred.resolveWith( contexts, values ); + } + }; + }, + + progressValues, progressContexts, resolveContexts; + + // add listeners to Deferred subordinates; treat others as resolved + if ( length > 1 ) { + progressValues = new Array( length ); + progressContexts = new Array( length ); + resolveContexts = new Array( length ); + for ( ; i < length; i++ ) { + if ( resolveValues[ i ] && jQuery.isFunction( resolveValues[ i ].promise ) ) { + resolveValues[ i ].promise() + .progress( updateFunc( i, progressContexts, progressValues ) ) + .done( updateFunc( i, resolveContexts, resolveValues ) ) + .fail( deferred.reject ); + } else { + --remaining; + } + } + } + + // if we're not waiting on anything, resolve the master + if ( !remaining ) { + deferred.resolveWith( resolveContexts, resolveValues ); + } + + return deferred.promise(); + } +} ); + + +// The deferred used on DOM ready +var readyList; + +jQuery.fn.ready = function( fn ) { + + // Add the callback + jQuery.ready.promise().done( fn ); + + return this; +}; + +jQuery.extend( { + + // Is the DOM ready to be used? Set to true once it occurs. + isReady: false, + + // A counter to track how many items to wait for before + // the ready event fires. See #6781 + readyWait: 1, + + // Hold (or release) the ready event + holdReady: function( hold ) { + if ( hold ) { + jQuery.readyWait++; + } else { + jQuery.ready( true ); + } + }, + + // Handle when the DOM is ready + ready: function( wait ) { + + // Abort if there are pending holds or we're already ready + if ( wait === true ? --jQuery.readyWait : jQuery.isReady ) { + return; + } + + // Remember that the DOM is ready + jQuery.isReady = true; + + // If a normal DOM Ready event fired, decrement, and wait if need be + if ( wait !== true && --jQuery.readyWait > 0 ) { + return; + } + + // If there are functions bound, to execute + readyList.resolveWith( document, [ jQuery ] ); + + // Trigger any bound ready events + if ( jQuery.fn.triggerHandler ) { + jQuery( document ).triggerHandler( "ready" ); + jQuery( document ).off( "ready" ); + } + } +} ); + +/** + * Clean-up method for dom ready events + */ +function detach() { + if ( document.addEventListener ) { + document.removeEventListener( "DOMContentLoaded", completed ); + window.removeEventListener( "load", completed ); + + } else { + document.detachEvent( "onreadystatechange", completed ); + window.detachEvent( "onload", completed ); + } +} + +/** + * The ready event handler and self cleanup method + */ +function completed() { + + // readyState === "complete" is good enough for us to call the dom ready in oldIE + if ( document.addEventListener || + window.event.type === "load" || + document.readyState === "complete" ) { + + detach(); + jQuery.ready(); + } +} + +jQuery.ready.promise = function( obj ) { + if ( !readyList ) { + + readyList = jQuery.Deferred(); + + // Catch cases where $(document).ready() is called + // after the browser event has already occurred. + // Support: IE6-10 + // Older IE sometimes signals "interactive" too soon + if ( document.readyState === "complete" || + ( document.readyState !== "loading" && !document.documentElement.doScroll ) ) { + + // Handle it asynchronously to allow scripts the opportunity to delay ready + window.setTimeout( jQuery.ready ); + + // Standards-based browsers support DOMContentLoaded + } else if ( document.addEventListener ) { + + // Use the handy event callback + document.addEventListener( "DOMContentLoaded", completed ); + + // A fallback to window.onload, that will always work + window.addEventListener( "load", completed ); + + // If IE event model is used + } else { + + // Ensure firing before onload, maybe late but safe also for iframes + document.attachEvent( "onreadystatechange", completed ); + + // A fallback to window.onload, that will always work + window.attachEvent( "onload", completed ); + + // If IE and not a frame + // continually check to see if the document is ready + var top = false; + + try { + top = window.frameElement == null && document.documentElement; + } catch ( e ) {} + + if ( top && top.doScroll ) { + ( function doScrollCheck() { + if ( !jQuery.isReady ) { + + try { + + // Use the trick by Diego Perini + // http://javascript.nwbox.com/IEContentLoaded/ + top.doScroll( "left" ); + } catch ( e ) { + return window.setTimeout( doScrollCheck, 50 ); + } + + // detach all dom ready events + detach(); + + // and execute any waiting functions + jQuery.ready(); + } + } )(); + } + } + } + return readyList.promise( obj ); +}; + +// Kick off the DOM ready check even if the user does not +jQuery.ready.promise(); + + + + +// Support: IE<9 +// Iteration over object's inherited properties before its own +var i; +for ( i in jQuery( support ) ) { + break; +} +support.ownFirst = i === "0"; + +// Note: most support tests are defined in their respective modules. +// false until the test is run +support.inlineBlockNeedsLayout = false; + +// Execute ASAP in case we need to set body.style.zoom +jQuery( function() { + + // Minified: var a,b,c,d + var val, div, body, container; + + body = document.getElementsByTagName( "body" )[ 0 ]; + if ( !body || !body.style ) { + + // Return for frameset docs that don't have a body + return; + } + + // Setup + div = document.createElement( "div" ); + container = document.createElement( "div" ); + container.style.cssText = "position:absolute;border:0;width:0;height:0;top:0;left:-9999px"; + body.appendChild( container ).appendChild( div ); + + if ( typeof div.style.zoom !== "undefined" ) { + + // Support: IE<8 + // Check if natively block-level elements act like inline-block + // elements when setting their display to 'inline' and giving + // them layout + div.style.cssText = "display:inline;margin:0;border:0;padding:1px;width:1px;zoom:1"; + + support.inlineBlockNeedsLayout = val = div.offsetWidth === 3; + if ( val ) { + + // Prevent IE 6 from affecting layout for positioned elements #11048 + // Prevent IE from shrinking the body in IE 7 mode #12869 + // Support: IE<8 + body.style.zoom = 1; + } + } + + body.removeChild( container ); +} ); + + +( function() { + var div = document.createElement( "div" ); + + // Support: IE<9 + support.deleteExpando = true; + try { + delete div.test; + } catch ( e ) { + support.deleteExpando = false; + } + + // Null elements to avoid leaks in IE. + div = null; +} )(); +var acceptData = function( elem ) { + var noData = jQuery.noData[ ( elem.nodeName + " " ).toLowerCase() ], + nodeType = +elem.nodeType || 1; + + // Do not set data on non-element DOM nodes because it will not be cleared (#8335). + return nodeType !== 1 && nodeType !== 9 ? + false : + + // Nodes accept data unless otherwise specified; rejection can be conditional + !noData || noData !== true && elem.getAttribute( "classid" ) === noData; +}; + + + + +var rbrace = /^(?:\{[\w\W]*\}|\[[\w\W]*\])$/, + rmultiDash = /([A-Z])/g; + +function dataAttr( elem, key, data ) { + + // If nothing was found internally, try to fetch any + // data from the HTML5 data-* attribute + if ( data === undefined && elem.nodeType === 1 ) { + + var name = "data-" + key.replace( rmultiDash, "-$1" ).toLowerCase(); + + data = elem.getAttribute( name ); + + if ( typeof data === "string" ) { + try { + data = data === "true" ? true : + data === "false" ? false : + data === "null" ? null : + + // Only convert to a number if it doesn't change the string + +data + "" === data ? +data : + rbrace.test( data ) ? jQuery.parseJSON( data ) : + data; + } catch ( e ) {} + + // Make sure we set the data so it isn't changed later + jQuery.data( elem, key, data ); + + } else { + data = undefined; + } + } + + return data; +} + +// checks a cache object for emptiness +function isEmptyDataObject( obj ) { + var name; + for ( name in obj ) { + + // if the public data object is empty, the private is still empty + if ( name === "data" && jQuery.isEmptyObject( obj[ name ] ) ) { + continue; + } + if ( name !== "toJSON" ) { + return false; + } + } + + return true; +} + +function internalData( elem, name, data, pvt /* Internal Use Only */ ) { + if ( !acceptData( elem ) ) { + return; + } + + var ret, thisCache, + internalKey = jQuery.expando, + + // We have to handle DOM nodes and JS objects differently because IE6-7 + // can't GC object references properly across the DOM-JS boundary + isNode = elem.nodeType, + + // Only DOM nodes need the global jQuery cache; JS object data is + // attached directly to the object so GC can occur automatically + cache = isNode ? jQuery.cache : elem, + + // Only defining an ID for JS objects if its cache already exists allows + // the code to shortcut on the same path as a DOM node with no cache + id = isNode ? elem[ internalKey ] : elem[ internalKey ] && internalKey; + + // Avoid doing any more work than we need to when trying to get data on an + // object that has no data at all + if ( ( !id || !cache[ id ] || ( !pvt && !cache[ id ].data ) ) && + data === undefined && typeof name === "string" ) { + return; + } + + if ( !id ) { + + // Only DOM nodes need a new unique ID for each element since their data + // ends up in the global cache + if ( isNode ) { + id = elem[ internalKey ] = deletedIds.pop() || jQuery.guid++; + } else { + id = internalKey; + } + } + + if ( !cache[ id ] ) { + + // Avoid exposing jQuery metadata on plain JS objects when the object + // is serialized using JSON.stringify + cache[ id ] = isNode ? {} : { toJSON: jQuery.noop }; + } + + // An object can be passed to jQuery.data instead of a key/value pair; this gets + // shallow copied over onto the existing cache + if ( typeof name === "object" || typeof name === "function" ) { + if ( pvt ) { + cache[ id ] = jQuery.extend( cache[ id ], name ); + } else { + cache[ id ].data = jQuery.extend( cache[ id ].data, name ); + } + } + + thisCache = cache[ id ]; + + // jQuery data() is stored in a separate object inside the object's internal data + // cache in order to avoid key collisions between internal data and user-defined + // data. + if ( !pvt ) { + if ( !thisCache.data ) { + thisCache.data = {}; + } + + thisCache = thisCache.data; + } + + if ( data !== undefined ) { + thisCache[ jQuery.camelCase( name ) ] = data; + } + + // Check for both converted-to-camel and non-converted data property names + // If a data property was specified + if ( typeof name === "string" ) { + + // First Try to find as-is property data + ret = thisCache[ name ]; + + // Test for null|undefined property data + if ( ret == null ) { + + // Try to find the camelCased property + ret = thisCache[ jQuery.camelCase( name ) ]; + } + } else { + ret = thisCache; + } + + return ret; +} + +function internalRemoveData( elem, name, pvt ) { + if ( !acceptData( elem ) ) { + return; + } + + var thisCache, i, + isNode = elem.nodeType, + + // See jQuery.data for more information + cache = isNode ? jQuery.cache : elem, + id = isNode ? elem[ jQuery.expando ] : jQuery.expando; + + // If there is already no cache entry for this object, there is no + // purpose in continuing + if ( !cache[ id ] ) { + return; + } + + if ( name ) { + + thisCache = pvt ? cache[ id ] : cache[ id ].data; + + if ( thisCache ) { + + // Support array or space separated string names for data keys + if ( !jQuery.isArray( name ) ) { + + // try the string as a key before any manipulation + if ( name in thisCache ) { + name = [ name ]; + } else { + + // split the camel cased version by spaces unless a key with the spaces exists + name = jQuery.camelCase( name ); + if ( name in thisCache ) { + name = [ name ]; + } else { + name = name.split( " " ); + } + } + } else { + + // If "name" is an array of keys... + // When data is initially created, via ("key", "val") signature, + // keys will be converted to camelCase. + // Since there is no way to tell _how_ a key was added, remove + // both plain key and camelCase key. #12786 + // This will only penalize the array argument path. + name = name.concat( jQuery.map( name, jQuery.camelCase ) ); + } + + i = name.length; + while ( i-- ) { + delete thisCache[ name[ i ] ]; + } + + // If there is no data left in the cache, we want to continue + // and let the cache object itself get destroyed + if ( pvt ? !isEmptyDataObject( thisCache ) : !jQuery.isEmptyObject( thisCache ) ) { + return; + } + } + } + + // See jQuery.data for more information + if ( !pvt ) { + delete cache[ id ].data; + + // Don't destroy the parent cache unless the internal data object + // had been the only thing left in it + if ( !isEmptyDataObject( cache[ id ] ) ) { + return; + } + } + + // Destroy the cache + if ( isNode ) { + jQuery.cleanData( [ elem ], true ); + + // Use delete when supported for expandos or `cache` is not a window per isWindow (#10080) + /* jshint eqeqeq: false */ + } else if ( support.deleteExpando || cache != cache.window ) { + /* jshint eqeqeq: true */ + delete cache[ id ]; + + // When all else fails, undefined + } else { + cache[ id ] = undefined; + } +} + +jQuery.extend( { + cache: {}, + + // The following elements (space-suffixed to avoid Object.prototype collisions) + // throw uncatchable exceptions if you attempt to set expando properties + noData: { + "applet ": true, + "embed ": true, + + // ...but Flash objects (which have this classid) *can* handle expandos + "object ": "clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" + }, + + hasData: function( elem ) { + elem = elem.nodeType ? jQuery.cache[ elem[ jQuery.expando ] ] : elem[ jQuery.expando ]; + return !!elem && !isEmptyDataObject( elem ); + }, + + data: function( elem, name, data ) { + return internalData( elem, name, data ); + }, + + removeData: function( elem, name ) { + return internalRemoveData( elem, name ); + }, + + // For internal use only. + _data: function( elem, name, data ) { + return internalData( elem, name, data, true ); + }, + + _removeData: function( elem, name ) { + return internalRemoveData( elem, name, true ); + } +} ); + +jQuery.fn.extend( { + data: function( key, value ) { + var i, name, data, + elem = this[ 0 ], + attrs = elem && elem.attributes; + + // Special expections of .data basically thwart jQuery.access, + // so implement the relevant behavior ourselves + + // Gets all values + if ( key === undefined ) { + if ( this.length ) { + data = jQuery.data( elem ); + + if ( elem.nodeType === 1 && !jQuery._data( elem, "parsedAttrs" ) ) { + i = attrs.length; + while ( i-- ) { + + // Support: IE11+ + // The attrs elements can be null (#14894) + if ( attrs[ i ] ) { + name = attrs[ i ].name; + if ( name.indexOf( "data-" ) === 0 ) { + name = jQuery.camelCase( name.slice( 5 ) ); + dataAttr( elem, name, data[ name ] ); + } + } + } + jQuery._data( elem, "parsedAttrs", true ); + } + } + + return data; + } + + // Sets multiple values + if ( typeof key === "object" ) { + return this.each( function() { + jQuery.data( this, key ); + } ); + } + + return arguments.length > 1 ? + + // Sets one value + this.each( function() { + jQuery.data( this, key, value ); + } ) : + + // Gets one value + // Try to fetch any internally stored data first + elem ? dataAttr( elem, key, jQuery.data( elem, key ) ) : undefined; + }, + + removeData: function( key ) { + return this.each( function() { + jQuery.removeData( this, key ); + } ); + } +} ); + + +jQuery.extend( { + queue: function( elem, type, data ) { + var queue; + + if ( elem ) { + type = ( type || "fx" ) + "queue"; + queue = jQuery._data( elem, type ); + + // Speed up dequeue by getting out quickly if this is just a lookup + if ( data ) { + if ( !queue || jQuery.isArray( data ) ) { + queue = jQuery._data( elem, type, jQuery.makeArray( data ) ); + } else { + queue.push( data ); + } + } + return queue || []; + } + }, + + dequeue: function( elem, type ) { + type = type || "fx"; + + var queue = jQuery.queue( elem, type ), + startLength = queue.length, + fn = queue.shift(), + hooks = jQuery._queueHooks( elem, type ), + next = function() { + jQuery.dequeue( elem, type ); + }; + + // If the fx queue is dequeued, always remove the progress sentinel + if ( fn === "inprogress" ) { + fn = queue.shift(); + startLength--; + } + + if ( fn ) { + + // Add a progress sentinel to prevent the fx queue from being + // automatically dequeued + if ( type === "fx" ) { + queue.unshift( "inprogress" ); + } + + // clear up the last queue stop function + delete hooks.stop; + fn.call( elem, next, hooks ); + } + + if ( !startLength && hooks ) { + hooks.empty.fire(); + } + }, + + // not intended for public consumption - generates a queueHooks object, + // or returns the current one + _queueHooks: function( elem, type ) { + var key = type + "queueHooks"; + return jQuery._data( elem, key ) || jQuery._data( elem, key, { + empty: jQuery.Callbacks( "once memory" ).add( function() { + jQuery._removeData( elem, type + "queue" ); + jQuery._removeData( elem, key ); + } ) + } ); + } +} ); + +jQuery.fn.extend( { + queue: function( type, data ) { + var setter = 2; + + if ( typeof type !== "string" ) { + data = type; + type = "fx"; + setter--; + } + + if ( arguments.length < setter ) { + return jQuery.queue( this[ 0 ], type ); + } + + return data === undefined ? + this : + this.each( function() { + var queue = jQuery.queue( this, type, data ); + + // ensure a hooks for this queue + jQuery._queueHooks( this, type ); + + if ( type === "fx" && queue[ 0 ] !== "inprogress" ) { + jQuery.dequeue( this, type ); + } + } ); + }, + dequeue: function( type ) { + return this.each( function() { + jQuery.dequeue( this, type ); + } ); + }, + clearQueue: function( type ) { + return this.queue( type || "fx", [] ); + }, + + // Get a promise resolved when queues of a certain type + // are emptied (fx is the type by default) + promise: function( type, obj ) { + var tmp, + count = 1, + defer = jQuery.Deferred(), + elements = this, + i = this.length, + resolve = function() { + if ( !( --count ) ) { + defer.resolveWith( elements, [ elements ] ); + } + }; + + if ( typeof type !== "string" ) { + obj = type; + type = undefined; + } + type = type || "fx"; + + while ( i-- ) { + tmp = jQuery._data( elements[ i ], type + "queueHooks" ); + if ( tmp && tmp.empty ) { + count++; + tmp.empty.add( resolve ); + } + } + resolve(); + return defer.promise( obj ); + } +} ); + + +( function() { + var shrinkWrapBlocksVal; + + support.shrinkWrapBlocks = function() { + if ( shrinkWrapBlocksVal != null ) { + return shrinkWrapBlocksVal; + } + + // Will be changed later if needed. + shrinkWrapBlocksVal = false; + + // Minified: var b,c,d + var div, body, container; + + body = document.getElementsByTagName( "body" )[ 0 ]; + if ( !body || !body.style ) { + + // Test fired too early or in an unsupported environment, exit. + return; + } + + // Setup + div = document.createElement( "div" ); + container = document.createElement( "div" ); + container.style.cssText = "position:absolute;border:0;width:0;height:0;top:0;left:-9999px"; + body.appendChild( container ).appendChild( div ); + + // Support: IE6 + // Check if elements with layout shrink-wrap their children + if ( typeof div.style.zoom !== "undefined" ) { + + // Reset CSS: box-sizing; display; margin; border + div.style.cssText = + + // Support: Firefox<29, Android 2.3 + // Vendor-prefix box-sizing + "-webkit-box-sizing:content-box;-moz-box-sizing:content-box;" + + "box-sizing:content-box;display:block;margin:0;border:0;" + + "padding:1px;width:1px;zoom:1"; + div.appendChild( document.createElement( "div" ) ).style.width = "5px"; + shrinkWrapBlocksVal = div.offsetWidth !== 3; + } + + body.removeChild( container ); + + return shrinkWrapBlocksVal; + }; + +} )(); +var pnum = ( /[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/ ).source; + +var rcssNum = new RegExp( "^(?:([+-])=|)(" + pnum + ")([a-z%]*)$", "i" ); + + +var cssExpand = [ "Top", "Right", "Bottom", "Left" ]; + +var isHidden = function( elem, el ) { + + // isHidden might be called from jQuery#filter function; + // in that case, element will be second argument + elem = el || elem; + return jQuery.css( elem, "display" ) === "none" || + !jQuery.contains( elem.ownerDocument, elem ); + }; + + + +function adjustCSS( elem, prop, valueParts, tween ) { + var adjusted, + scale = 1, + maxIterations = 20, + currentValue = tween ? + function() { return tween.cur(); } : + function() { return jQuery.css( elem, prop, "" ); }, + initial = currentValue(), + unit = valueParts && valueParts[ 3 ] || ( jQuery.cssNumber[ prop ] ? "" : "px" ), + + // Starting value computation is required for potential unit mismatches + initialInUnit = ( jQuery.cssNumber[ prop ] || unit !== "px" && +initial ) && + rcssNum.exec( jQuery.css( elem, prop ) ); + + if ( initialInUnit && initialInUnit[ 3 ] !== unit ) { + + // Trust units reported by jQuery.css + unit = unit || initialInUnit[ 3 ]; + + // Make sure we update the tween properties later on + valueParts = valueParts || []; + + // Iteratively approximate from a nonzero starting point + initialInUnit = +initial || 1; + + do { + + // If previous iteration zeroed out, double until we get *something*. + // Use string for doubling so we don't accidentally see scale as unchanged below + scale = scale || ".5"; + + // Adjust and apply + initialInUnit = initialInUnit / scale; + jQuery.style( elem, prop, initialInUnit + unit ); + + // Update scale, tolerating zero or NaN from tween.cur() + // Break the loop if scale is unchanged or perfect, or if we've just had enough. + } while ( + scale !== ( scale = currentValue() / initial ) && scale !== 1 && --maxIterations + ); + } + + if ( valueParts ) { + initialInUnit = +initialInUnit || +initial || 0; + + // Apply relative offset (+=/-=) if specified + adjusted = valueParts[ 1 ] ? + initialInUnit + ( valueParts[ 1 ] + 1 ) * valueParts[ 2 ] : + +valueParts[ 2 ]; + if ( tween ) { + tween.unit = unit; + tween.start = initialInUnit; + tween.end = adjusted; + } + } + return adjusted; +} + + +// Multifunctional method to get and set values of a collection +// The value/s can optionally be executed if it's a function +var access = function( elems, fn, key, value, chainable, emptyGet, raw ) { + var i = 0, + length = elems.length, + bulk = key == null; + + // Sets many values + if ( jQuery.type( key ) === "object" ) { + chainable = true; + for ( i in key ) { + access( elems, fn, i, key[ i ], true, emptyGet, raw ); + } + + // Sets one value + } else if ( value !== undefined ) { + chainable = true; + + if ( !jQuery.isFunction( value ) ) { + raw = true; + } + + if ( bulk ) { + + // Bulk operations run against the entire set + if ( raw ) { + fn.call( elems, value ); + fn = null; + + // ...except when executing function values + } else { + bulk = fn; + fn = function( elem, key, value ) { + return bulk.call( jQuery( elem ), value ); + }; + } + } + + if ( fn ) { + for ( ; i < length; i++ ) { + fn( + elems[ i ], + key, + raw ? value : value.call( elems[ i ], i, fn( elems[ i ], key ) ) + ); + } + } + } + + return chainable ? + elems : + + // Gets + bulk ? + fn.call( elems ) : + length ? fn( elems[ 0 ], key ) : emptyGet; +}; +var rcheckableType = ( /^(?:checkbox|radio)$/i ); + +var rtagName = ( /<([\w:-]+)/ ); + +var rscriptType = ( /^$|\/(?:java|ecma)script/i ); + +var rleadingWhitespace = ( /^\s+/ ); + +var nodeNames = "abbr|article|aside|audio|bdi|canvas|data|datalist|" + + "details|dialog|figcaption|figure|footer|header|hgroup|main|" + + "mark|meter|nav|output|picture|progress|section|summary|template|time|video"; + + + +function createSafeFragment( document ) { + var list = nodeNames.split( "|" ), + safeFrag = document.createDocumentFragment(); + + if ( safeFrag.createElement ) { + while ( list.length ) { + safeFrag.createElement( + list.pop() + ); + } + } + return safeFrag; +} + + +( function() { + var div = document.createElement( "div" ), + fragment = document.createDocumentFragment(), + input = document.createElement( "input" ); + + // Setup + div.innerHTML = "
a"; + + // IE strips leading whitespace when .innerHTML is used + support.leadingWhitespace = div.firstChild.nodeType === 3; + + // Make sure that tbody elements aren't automatically inserted + // IE will insert them into empty tables + support.tbody = !div.getElementsByTagName( "tbody" ).length; + + // Make sure that link elements get serialized correctly by innerHTML + // This requires a wrapper element in IE + support.htmlSerialize = !!div.getElementsByTagName( "link" ).length; + + // Makes sure cloning an html5 element does not cause problems + // Where outerHTML is undefined, this still works + support.html5Clone = + document.createElement( "nav" ).cloneNode( true ).outerHTML !== "<:nav>"; + + // Check if a disconnected checkbox will retain its checked + // value of true after appended to the DOM (IE6/7) + input.type = "checkbox"; + input.checked = true; + fragment.appendChild( input ); + support.appendChecked = input.checked; + + // Make sure textarea (and checkbox) defaultValue is properly cloned + // Support: IE6-IE11+ + div.innerHTML = ""; + support.noCloneChecked = !!div.cloneNode( true ).lastChild.defaultValue; + + // #11217 - WebKit loses check when the name is after the checked attribute + fragment.appendChild( div ); + + // Support: Windows Web Apps (WWA) + // `name` and `type` must use .setAttribute for WWA (#14901) + input = document.createElement( "input" ); + input.setAttribute( "type", "radio" ); + input.setAttribute( "checked", "checked" ); + input.setAttribute( "name", "t" ); + + div.appendChild( input ); + + // Support: Safari 5.1, iOS 5.1, Android 4.x, Android 2.3 + // old WebKit doesn't clone checked state correctly in fragments + support.checkClone = div.cloneNode( true ).cloneNode( true ).lastChild.checked; + + // Support: IE<9 + // Cloned elements keep attachEvent handlers, we use addEventListener on IE9+ + support.noCloneEvent = !!div.addEventListener; + + // Support: IE<9 + // Since attributes and properties are the same in IE, + // cleanData must set properties to undefined rather than use removeAttribute + div[ jQuery.expando ] = 1; + support.attributes = !div.getAttribute( jQuery.expando ); +} )(); + + +// We have to close these tags to support XHTML (#13200) +var wrapMap = { + option: [ 1, "" ], + legend: [ 1, "

", "
" ], + area: [ 1, "", "" ], + + // Support: IE8 + param: [ 1, "", "" ], + thead: [ 1, "", "
" ], + tr: [ 2, "", "
" ], + col: [ 2, "", "
" ], + td: [ 3, "", "
" ], + + // IE6-8 can't serialize link, script, style, or any html5 (NoScope) tags, + // unless wrapped in a div with non-breaking characters in front of it. + _default: support.htmlSerialize ? [ 0, "", "" ] : [ 1, "X
", "
" ] +}; + +// Support: IE8-IE9 +wrapMap.optgroup = wrapMap.option; + +wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead; +wrapMap.th = wrapMap.td; + + +function getAll( context, tag ) { + var elems, elem, + i = 0, + found = typeof context.getElementsByTagName !== "undefined" ? + context.getElementsByTagName( tag || "*" ) : + typeof context.querySelectorAll !== "undefined" ? + context.querySelectorAll( tag || "*" ) : + undefined; + + if ( !found ) { + for ( found = [], elems = context.childNodes || context; + ( elem = elems[ i ] ) != null; + i++ + ) { + if ( !tag || jQuery.nodeName( elem, tag ) ) { + found.push( elem ); + } else { + jQuery.merge( found, getAll( elem, tag ) ); + } + } + } + + return tag === undefined || tag && jQuery.nodeName( context, tag ) ? + jQuery.merge( [ context ], found ) : + found; +} + + +// Mark scripts as having already been evaluated +function setGlobalEval( elems, refElements ) { + var elem, + i = 0; + for ( ; ( elem = elems[ i ] ) != null; i++ ) { + jQuery._data( + elem, + "globalEval", + !refElements || jQuery._data( refElements[ i ], "globalEval" ) + ); + } +} + + +var rhtml = /<|&#?\w+;/, + rtbody = / from table fragments + if ( !support.tbody ) { + + // String was a , *may* have spurious + elem = tag === "table" && !rtbody.test( elem ) ? + tmp.firstChild : + + // String was a bare or + wrap[ 1 ] === "
" && !rtbody.test( elem ) ? + tmp : + 0; + + j = elem && elem.childNodes.length; + while ( j-- ) { + if ( jQuery.nodeName( ( tbody = elem.childNodes[ j ] ), "tbody" ) && + !tbody.childNodes.length ) { + + elem.removeChild( tbody ); + } + } + } + + jQuery.merge( nodes, tmp.childNodes ); + + // Fix #12392 for WebKit and IE > 9 + tmp.textContent = ""; + + // Fix #12392 for oldIE + while ( tmp.firstChild ) { + tmp.removeChild( tmp.firstChild ); + } + + // Remember the top-level container for proper cleanup + tmp = safe.lastChild; + } + } + } + + // Fix #11356: Clear elements from fragment + if ( tmp ) { + safe.removeChild( tmp ); + } + + // Reset defaultChecked for any radios and checkboxes + // about to be appended to the DOM in IE 6/7 (#8060) + if ( !support.appendChecked ) { + jQuery.grep( getAll( nodes, "input" ), fixDefaultChecked ); + } + + i = 0; + while ( ( elem = nodes[ i++ ] ) ) { + + // Skip elements already in the context collection (trac-4087) + if ( selection && jQuery.inArray( elem, selection ) > -1 ) { + if ( ignored ) { + ignored.push( elem ); + } + + continue; + } + + contains = jQuery.contains( elem.ownerDocument, elem ); + + // Append to fragment + tmp = getAll( safe.appendChild( elem ), "script" ); + + // Preserve script evaluation history + if ( contains ) { + setGlobalEval( tmp ); + } + + // Capture executables + if ( scripts ) { + j = 0; + while ( ( elem = tmp[ j++ ] ) ) { + if ( rscriptType.test( elem.type || "" ) ) { + scripts.push( elem ); + } + } + } + } + + tmp = null; + + return safe; +} + + +( function() { + var i, eventName, + div = document.createElement( "div" ); + + // Support: IE<9 (lack submit/change bubble), Firefox (lack focus(in | out) events) + for ( i in { submit: true, change: true, focusin: true } ) { + eventName = "on" + i; + + if ( !( support[ i ] = eventName in window ) ) { + + // Beware of CSP restrictions (https://developer.mozilla.org/en/Security/CSP) + div.setAttribute( eventName, "t" ); + support[ i ] = div.attributes[ eventName ].expando === false; + } + } + + // Null elements to avoid leaks in IE. + div = null; +} )(); + + +var rformElems = /^(?:input|select|textarea)$/i, + rkeyEvent = /^key/, + rmouseEvent = /^(?:mouse|pointer|contextmenu|drag|drop)|click/, + rfocusMorph = /^(?:focusinfocus|focusoutblur)$/, + rtypenamespace = /^([^.]*)(?:\.(.+)|)/; + +function returnTrue() { + return true; +} + +function returnFalse() { + return false; +} + +// Support: IE9 +// See #13393 for more info +function safeActiveElement() { + try { + return document.activeElement; + } catch ( err ) { } +} + +function on( elem, types, selector, data, fn, one ) { + var origFn, type; + + // Types can be a map of types/handlers + if ( typeof types === "object" ) { + + // ( types-Object, selector, data ) + if ( typeof selector !== "string" ) { + + // ( types-Object, data ) + data = data || selector; + selector = undefined; + } + for ( type in types ) { + on( elem, type, selector, data, types[ type ], one ); + } + return elem; + } + + if ( data == null && fn == null ) { + + // ( types, fn ) + fn = selector; + data = selector = undefined; + } else if ( fn == null ) { + if ( typeof selector === "string" ) { + + // ( types, selector, fn ) + fn = data; + data = undefined; + } else { + + // ( types, data, fn ) + fn = data; + data = selector; + selector = undefined; + } + } + if ( fn === false ) { + fn = returnFalse; + } else if ( !fn ) { + return elem; + } + + if ( one === 1 ) { + origFn = fn; + fn = function( event ) { + + // Can use an empty set, since event contains the info + jQuery().off( event ); + return origFn.apply( this, arguments ); + }; + + // Use same guid so caller can remove using origFn + fn.guid = origFn.guid || ( origFn.guid = jQuery.guid++ ); + } + return elem.each( function() { + jQuery.event.add( this, types, fn, data, selector ); + } ); +} + +/* + * Helper functions for managing events -- not part of the public interface. + * Props to Dean Edwards' addEvent library for many of the ideas. + */ +jQuery.event = { + + global: {}, + + add: function( elem, types, handler, data, selector ) { + var tmp, events, t, handleObjIn, + special, eventHandle, handleObj, + handlers, type, namespaces, origType, + elemData = jQuery._data( elem ); + + // Don't attach events to noData or text/comment nodes (but allow plain objects) + if ( !elemData ) { + return; + } + + // Caller can pass in an object of custom data in lieu of the handler + if ( handler.handler ) { + handleObjIn = handler; + handler = handleObjIn.handler; + selector = handleObjIn.selector; + } + + // Make sure that the handler has a unique ID, used to find/remove it later + if ( !handler.guid ) { + handler.guid = jQuery.guid++; + } + + // Init the element's event structure and main handler, if this is the first + if ( !( events = elemData.events ) ) { + events = elemData.events = {}; + } + if ( !( eventHandle = elemData.handle ) ) { + eventHandle = elemData.handle = function( e ) { + + // Discard the second event of a jQuery.event.trigger() and + // when an event is called after a page has unloaded + return typeof jQuery !== "undefined" && + ( !e || jQuery.event.triggered !== e.type ) ? + jQuery.event.dispatch.apply( eventHandle.elem, arguments ) : + undefined; + }; + + // Add elem as a property of the handle fn to prevent a memory leak + // with IE non-native events + eventHandle.elem = elem; + } + + // Handle multiple events separated by a space + types = ( types || "" ).match( rnotwhite ) || [ "" ]; + t = types.length; + while ( t-- ) { + tmp = rtypenamespace.exec( types[ t ] ) || []; + type = origType = tmp[ 1 ]; + namespaces = ( tmp[ 2 ] || "" ).split( "." ).sort(); + + // There *must* be a type, no attaching namespace-only handlers + if ( !type ) { + continue; + } + + // If event changes its type, use the special event handlers for the changed type + special = jQuery.event.special[ type ] || {}; + + // If selector defined, determine special event api type, otherwise given type + type = ( selector ? special.delegateType : special.bindType ) || type; + + // Update special based on newly reset type + special = jQuery.event.special[ type ] || {}; + + // handleObj is passed to all event handlers + handleObj = jQuery.extend( { + type: type, + origType: origType, + data: data, + handler: handler, + guid: handler.guid, + selector: selector, + needsContext: selector && jQuery.expr.match.needsContext.test( selector ), + namespace: namespaces.join( "." ) + }, handleObjIn ); + + // Init the event handler queue if we're the first + if ( !( handlers = events[ type ] ) ) { + handlers = events[ type ] = []; + handlers.delegateCount = 0; + + // Only use addEventListener/attachEvent if the special events handler returns false + if ( !special.setup || + special.setup.call( elem, data, namespaces, eventHandle ) === false ) { + + // Bind the global event handler to the element + if ( elem.addEventListener ) { + elem.addEventListener( type, eventHandle, false ); + + } else if ( elem.attachEvent ) { + elem.attachEvent( "on" + type, eventHandle ); + } + } + } + + if ( special.add ) { + special.add.call( elem, handleObj ); + + if ( !handleObj.handler.guid ) { + handleObj.handler.guid = handler.guid; + } + } + + // Add to the element's handler list, delegates in front + if ( selector ) { + handlers.splice( handlers.delegateCount++, 0, handleObj ); + } else { + handlers.push( handleObj ); + } + + // Keep track of which events have ever been used, for event optimization + jQuery.event.global[ type ] = true; + } + + // Nullify elem to prevent memory leaks in IE + elem = null; + }, + + // Detach an event or set of events from an element + remove: function( elem, types, handler, selector, mappedTypes ) { + var j, handleObj, tmp, + origCount, t, events, + special, handlers, type, + namespaces, origType, + elemData = jQuery.hasData( elem ) && jQuery._data( elem ); + + if ( !elemData || !( events = elemData.events ) ) { + return; + } + + // Once for each type.namespace in types; type may be omitted + types = ( types || "" ).match( rnotwhite ) || [ "" ]; + t = types.length; + while ( t-- ) { + tmp = rtypenamespace.exec( types[ t ] ) || []; + type = origType = tmp[ 1 ]; + namespaces = ( tmp[ 2 ] || "" ).split( "." ).sort(); + + // Unbind all events (on this namespace, if provided) for the element + if ( !type ) { + for ( type in events ) { + jQuery.event.remove( elem, type + types[ t ], handler, selector, true ); + } + continue; + } + + special = jQuery.event.special[ type ] || {}; + type = ( selector ? special.delegateType : special.bindType ) || type; + handlers = events[ type ] || []; + tmp = tmp[ 2 ] && + new RegExp( "(^|\\.)" + namespaces.join( "\\.(?:.*\\.|)" ) + "(\\.|$)" ); + + // Remove matching events + origCount = j = handlers.length; + while ( j-- ) { + handleObj = handlers[ j ]; + + if ( ( mappedTypes || origType === handleObj.origType ) && + ( !handler || handler.guid === handleObj.guid ) && + ( !tmp || tmp.test( handleObj.namespace ) ) && + ( !selector || selector === handleObj.selector || + selector === "**" && handleObj.selector ) ) { + handlers.splice( j, 1 ); + + if ( handleObj.selector ) { + handlers.delegateCount--; + } + if ( special.remove ) { + special.remove.call( elem, handleObj ); + } + } + } + + // Remove generic event handler if we removed something and no more handlers exist + // (avoids potential for endless recursion during removal of special event handlers) + if ( origCount && !handlers.length ) { + if ( !special.teardown || + special.teardown.call( elem, namespaces, elemData.handle ) === false ) { + + jQuery.removeEvent( elem, type, elemData.handle ); + } + + delete events[ type ]; + } + } + + // Remove the expando if it's no longer used + if ( jQuery.isEmptyObject( events ) ) { + delete elemData.handle; + + // removeData also checks for emptiness and clears the expando if empty + // so use it instead of delete + jQuery._removeData( elem, "events" ); + } + }, + + trigger: function( event, data, elem, onlyHandlers ) { + var handle, ontype, cur, + bubbleType, special, tmp, i, + eventPath = [ elem || document ], + type = hasOwn.call( event, "type" ) ? event.type : event, + namespaces = hasOwn.call( event, "namespace" ) ? event.namespace.split( "." ) : []; + + cur = tmp = elem = elem || document; + + // Don't do events on text and comment nodes + if ( elem.nodeType === 3 || elem.nodeType === 8 ) { + return; + } + + // focus/blur morphs to focusin/out; ensure we're not firing them right now + if ( rfocusMorph.test( type + jQuery.event.triggered ) ) { + return; + } + + if ( type.indexOf( "." ) > -1 ) { + + // Namespaced trigger; create a regexp to match event type in handle() + namespaces = type.split( "." ); + type = namespaces.shift(); + namespaces.sort(); + } + ontype = type.indexOf( ":" ) < 0 && "on" + type; + + // Caller can pass in a jQuery.Event object, Object, or just an event type string + event = event[ jQuery.expando ] ? + event : + new jQuery.Event( type, typeof event === "object" && event ); + + // Trigger bitmask: & 1 for native handlers; & 2 for jQuery (always true) + event.isTrigger = onlyHandlers ? 2 : 3; + event.namespace = namespaces.join( "." ); + event.rnamespace = event.namespace ? + new RegExp( "(^|\\.)" + namespaces.join( "\\.(?:.*\\.|)" ) + "(\\.|$)" ) : + null; + + // Clean up the event in case it is being reused + event.result = undefined; + if ( !event.target ) { + event.target = elem; + } + + // Clone any incoming data and prepend the event, creating the handler arg list + data = data == null ? + [ event ] : + jQuery.makeArray( data, [ event ] ); + + // Allow special events to draw outside the lines + special = jQuery.event.special[ type ] || {}; + if ( !onlyHandlers && special.trigger && special.trigger.apply( elem, data ) === false ) { + return; + } + + // Determine event propagation path in advance, per W3C events spec (#9951) + // Bubble up to document, then to window; watch for a global ownerDocument var (#9724) + if ( !onlyHandlers && !special.noBubble && !jQuery.isWindow( elem ) ) { + + bubbleType = special.delegateType || type; + if ( !rfocusMorph.test( bubbleType + type ) ) { + cur = cur.parentNode; + } + for ( ; cur; cur = cur.parentNode ) { + eventPath.push( cur ); + tmp = cur; + } + + // Only add window if we got to document (e.g., not plain obj or detached DOM) + if ( tmp === ( elem.ownerDocument || document ) ) { + eventPath.push( tmp.defaultView || tmp.parentWindow || window ); + } + } + + // Fire handlers on the event path + i = 0; + while ( ( cur = eventPath[ i++ ] ) && !event.isPropagationStopped() ) { + + event.type = i > 1 ? + bubbleType : + special.bindType || type; + + // jQuery handler + handle = ( jQuery._data( cur, "events" ) || {} )[ event.type ] && + jQuery._data( cur, "handle" ); + + if ( handle ) { + handle.apply( cur, data ); + } + + // Native handler + handle = ontype && cur[ ontype ]; + if ( handle && handle.apply && acceptData( cur ) ) { + event.result = handle.apply( cur, data ); + if ( event.result === false ) { + event.preventDefault(); + } + } + } + event.type = type; + + // If nobody prevented the default action, do it now + if ( !onlyHandlers && !event.isDefaultPrevented() ) { + + if ( + ( !special._default || + special._default.apply( eventPath.pop(), data ) === false + ) && acceptData( elem ) + ) { + + // Call a native DOM method on the target with the same name name as the event. + // Can't use an .isFunction() check here because IE6/7 fails that test. + // Don't do default actions on window, that's where global variables be (#6170) + if ( ontype && elem[ type ] && !jQuery.isWindow( elem ) ) { + + // Don't re-trigger an onFOO event when we call its FOO() method + tmp = elem[ ontype ]; + + if ( tmp ) { + elem[ ontype ] = null; + } + + // Prevent re-triggering of the same event, since we already bubbled it above + jQuery.event.triggered = type; + try { + elem[ type ](); + } catch ( e ) { + + // IE<9 dies on focus/blur to hidden element (#1486,#12518) + // only reproducible on winXP IE8 native, not IE9 in IE8 mode + } + jQuery.event.triggered = undefined; + + if ( tmp ) { + elem[ ontype ] = tmp; + } + } + } + } + + return event.result; + }, + + dispatch: function( event ) { + + // Make a writable jQuery.Event from the native event object + event = jQuery.event.fix( event ); + + var i, j, ret, matched, handleObj, + handlerQueue = [], + args = slice.call( arguments ), + handlers = ( jQuery._data( this, "events" ) || {} )[ event.type ] || [], + special = jQuery.event.special[ event.type ] || {}; + + // Use the fix-ed jQuery.Event rather than the (read-only) native event + args[ 0 ] = event; + event.delegateTarget = this; + + // Call the preDispatch hook for the mapped type, and let it bail if desired + if ( special.preDispatch && special.preDispatch.call( this, event ) === false ) { + return; + } + + // Determine handlers + handlerQueue = jQuery.event.handlers.call( this, event, handlers ); + + // Run delegates first; they may want to stop propagation beneath us + i = 0; + while ( ( matched = handlerQueue[ i++ ] ) && !event.isPropagationStopped() ) { + event.currentTarget = matched.elem; + + j = 0; + while ( ( handleObj = matched.handlers[ j++ ] ) && + !event.isImmediatePropagationStopped() ) { + + // Triggered event must either 1) have no namespace, or 2) have namespace(s) + // a subset or equal to those in the bound event (both can have no namespace). + if ( !event.rnamespace || event.rnamespace.test( handleObj.namespace ) ) { + + event.handleObj = handleObj; + event.data = handleObj.data; + + ret = ( ( jQuery.event.special[ handleObj.origType ] || {} ).handle || + handleObj.handler ).apply( matched.elem, args ); + + if ( ret !== undefined ) { + if ( ( event.result = ret ) === false ) { + event.preventDefault(); + event.stopPropagation(); + } + } + } + } + } + + // Call the postDispatch hook for the mapped type + if ( special.postDispatch ) { + special.postDispatch.call( this, event ); + } + + return event.result; + }, + + handlers: function( event, handlers ) { + var i, matches, sel, handleObj, + handlerQueue = [], + delegateCount = handlers.delegateCount, + cur = event.target; + + // Support (at least): Chrome, IE9 + // Find delegate handlers + // Black-hole SVG instance trees (#13180) + // + // Support: Firefox<=42+ + // Avoid non-left-click in FF but don't block IE radio events (#3861, gh-2343) + if ( delegateCount && cur.nodeType && + ( event.type !== "click" || isNaN( event.button ) || event.button < 1 ) ) { + + /* jshint eqeqeq: false */ + for ( ; cur != this; cur = cur.parentNode || this ) { + /* jshint eqeqeq: true */ + + // Don't check non-elements (#13208) + // Don't process clicks on disabled elements (#6911, #8165, #11382, #11764) + if ( cur.nodeType === 1 && ( cur.disabled !== true || event.type !== "click" ) ) { + matches = []; + for ( i = 0; i < delegateCount; i++ ) { + handleObj = handlers[ i ]; + + // Don't conflict with Object.prototype properties (#13203) + sel = handleObj.selector + " "; + + if ( matches[ sel ] === undefined ) { + matches[ sel ] = handleObj.needsContext ? + jQuery( sel, this ).index( cur ) > -1 : + jQuery.find( sel, this, null, [ cur ] ).length; + } + if ( matches[ sel ] ) { + matches.push( handleObj ); + } + } + if ( matches.length ) { + handlerQueue.push( { elem: cur, handlers: matches } ); + } + } + } + } + + // Add the remaining (directly-bound) handlers + if ( delegateCount < handlers.length ) { + handlerQueue.push( { elem: this, handlers: handlers.slice( delegateCount ) } ); + } + + return handlerQueue; + }, + + fix: function( event ) { + if ( event[ jQuery.expando ] ) { + return event; + } + + // Create a writable copy of the event object and normalize some properties + var i, prop, copy, + type = event.type, + originalEvent = event, + fixHook = this.fixHooks[ type ]; + + if ( !fixHook ) { + this.fixHooks[ type ] = fixHook = + rmouseEvent.test( type ) ? this.mouseHooks : + rkeyEvent.test( type ) ? this.keyHooks : + {}; + } + copy = fixHook.props ? this.props.concat( fixHook.props ) : this.props; + + event = new jQuery.Event( originalEvent ); + + i = copy.length; + while ( i-- ) { + prop = copy[ i ]; + event[ prop ] = originalEvent[ prop ]; + } + + // Support: IE<9 + // Fix target property (#1925) + if ( !event.target ) { + event.target = originalEvent.srcElement || document; + } + + // Support: Safari 6-8+ + // Target should not be a text node (#504, #13143) + if ( event.target.nodeType === 3 ) { + event.target = event.target.parentNode; + } + + // Support: IE<9 + // For mouse/key events, metaKey==false if it's undefined (#3368, #11328) + event.metaKey = !!event.metaKey; + + return fixHook.filter ? fixHook.filter( event, originalEvent ) : event; + }, + + // Includes some event props shared by KeyEvent and MouseEvent + props: ( "altKey bubbles cancelable ctrlKey currentTarget detail eventPhase " + + "metaKey relatedTarget shiftKey target timeStamp view which" ).split( " " ), + + fixHooks: {}, + + keyHooks: { + props: "char charCode key keyCode".split( " " ), + filter: function( event, original ) { + + // Add which for key events + if ( event.which == null ) { + event.which = original.charCode != null ? original.charCode : original.keyCode; + } + + return event; + } + }, + + mouseHooks: { + props: ( "button buttons clientX clientY fromElement offsetX offsetY " + + "pageX pageY screenX screenY toElement" ).split( " " ), + filter: function( event, original ) { + var body, eventDoc, doc, + button = original.button, + fromElement = original.fromElement; + + // Calculate pageX/Y if missing and clientX/Y available + if ( event.pageX == null && original.clientX != null ) { + eventDoc = event.target.ownerDocument || document; + doc = eventDoc.documentElement; + body = eventDoc.body; + + event.pageX = original.clientX + + ( doc && doc.scrollLeft || body && body.scrollLeft || 0 ) - + ( doc && doc.clientLeft || body && body.clientLeft || 0 ); + event.pageY = original.clientY + + ( doc && doc.scrollTop || body && body.scrollTop || 0 ) - + ( doc && doc.clientTop || body && body.clientTop || 0 ); + } + + // Add relatedTarget, if necessary + if ( !event.relatedTarget && fromElement ) { + event.relatedTarget = fromElement === event.target ? + original.toElement : + fromElement; + } + + // Add which for click: 1 === left; 2 === middle; 3 === right + // Note: button is not normalized, so don't use it + if ( !event.which && button !== undefined ) { + event.which = ( button & 1 ? 1 : ( button & 2 ? 3 : ( button & 4 ? 2 : 0 ) ) ); + } + + return event; + } + }, + + special: { + load: { + + // Prevent triggered image.load events from bubbling to window.load + noBubble: true + }, + focus: { + + // Fire native event if possible so blur/focus sequence is correct + trigger: function() { + if ( this !== safeActiveElement() && this.focus ) { + try { + this.focus(); + return false; + } catch ( e ) { + + // Support: IE<9 + // If we error on focus to hidden element (#1486, #12518), + // let .trigger() run the handlers + } + } + }, + delegateType: "focusin" + }, + blur: { + trigger: function() { + if ( this === safeActiveElement() && this.blur ) { + this.blur(); + return false; + } + }, + delegateType: "focusout" + }, + click: { + + // For checkbox, fire native event so checked state will be right + trigger: function() { + if ( jQuery.nodeName( this, "input" ) && this.type === "checkbox" && this.click ) { + this.click(); + return false; + } + }, + + // For cross-browser consistency, don't fire native .click() on links + _default: function( event ) { + return jQuery.nodeName( event.target, "a" ); + } + }, + + beforeunload: { + postDispatch: function( event ) { + + // Support: Firefox 20+ + // Firefox doesn't alert if the returnValue field is not set. + if ( event.result !== undefined && event.originalEvent ) { + event.originalEvent.returnValue = event.result; + } + } + } + }, + + // Piggyback on a donor event to simulate a different one + simulate: function( type, elem, event ) { + var e = jQuery.extend( + new jQuery.Event(), + event, + { + type: type, + isSimulated: true + + // Previously, `originalEvent: {}` was set here, so stopPropagation call + // would not be triggered on donor event, since in our own + // jQuery.event.stopPropagation function we had a check for existence of + // originalEvent.stopPropagation method, so, consequently it would be a noop. + // + // Guard for simulated events was moved to jQuery.event.stopPropagation function + // since `originalEvent` should point to the original event for the + // constancy with other events and for more focused logic + } + ); + + jQuery.event.trigger( e, null, elem ); + + if ( e.isDefaultPrevented() ) { + event.preventDefault(); + } + } +}; + +jQuery.removeEvent = document.removeEventListener ? + function( elem, type, handle ) { + + // This "if" is needed for plain objects + if ( elem.removeEventListener ) { + elem.removeEventListener( type, handle ); + } + } : + function( elem, type, handle ) { + var name = "on" + type; + + if ( elem.detachEvent ) { + + // #8545, #7054, preventing memory leaks for custom events in IE6-8 + // detachEvent needed property on element, by name of that event, + // to properly expose it to GC + if ( typeof elem[ name ] === "undefined" ) { + elem[ name ] = null; + } + + elem.detachEvent( name, handle ); + } + }; + +jQuery.Event = function( src, props ) { + + // Allow instantiation without the 'new' keyword + if ( !( this instanceof jQuery.Event ) ) { + return new jQuery.Event( src, props ); + } + + // Event object + if ( src && src.type ) { + this.originalEvent = src; + this.type = src.type; + + // Events bubbling up the document may have been marked as prevented + // by a handler lower down the tree; reflect the correct value. + this.isDefaultPrevented = src.defaultPrevented || + src.defaultPrevented === undefined && + + // Support: IE < 9, Android < 4.0 + src.returnValue === false ? + returnTrue : + returnFalse; + + // Event type + } else { + this.type = src; + } + + // Put explicitly provided properties onto the event object + if ( props ) { + jQuery.extend( this, props ); + } + + // Create a timestamp if incoming event doesn't have one + this.timeStamp = src && src.timeStamp || jQuery.now(); + + // Mark it as fixed + this[ jQuery.expando ] = true; +}; + +// jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding +// http://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html +jQuery.Event.prototype = { + constructor: jQuery.Event, + isDefaultPrevented: returnFalse, + isPropagationStopped: returnFalse, + isImmediatePropagationStopped: returnFalse, + + preventDefault: function() { + var e = this.originalEvent; + + this.isDefaultPrevented = returnTrue; + if ( !e ) { + return; + } + + // If preventDefault exists, run it on the original event + if ( e.preventDefault ) { + e.preventDefault(); + + // Support: IE + // Otherwise set the returnValue property of the original event to false + } else { + e.returnValue = false; + } + }, + stopPropagation: function() { + var e = this.originalEvent; + + this.isPropagationStopped = returnTrue; + + if ( !e || this.isSimulated ) { + return; + } + + // If stopPropagation exists, run it on the original event + if ( e.stopPropagation ) { + e.stopPropagation(); + } + + // Support: IE + // Set the cancelBubble property of the original event to true + e.cancelBubble = true; + }, + stopImmediatePropagation: function() { + var e = this.originalEvent; + + this.isImmediatePropagationStopped = returnTrue; + + if ( e && e.stopImmediatePropagation ) { + e.stopImmediatePropagation(); + } + + this.stopPropagation(); + } +}; + +// Create mouseenter/leave events using mouseover/out and event-time checks +// so that event delegation works in jQuery. +// Do the same for pointerenter/pointerleave and pointerover/pointerout +// +// Support: Safari 7 only +// Safari sends mouseenter too often; see: +// https://code.google.com/p/chromium/issues/detail?id=470258 +// for the description of the bug (it existed in older Chrome versions as well). +jQuery.each( { + mouseenter: "mouseover", + mouseleave: "mouseout", + pointerenter: "pointerover", + pointerleave: "pointerout" +}, function( orig, fix ) { + jQuery.event.special[ orig ] = { + delegateType: fix, + bindType: fix, + + handle: function( event ) { + var ret, + target = this, + related = event.relatedTarget, + handleObj = event.handleObj; + + // For mouseenter/leave call the handler if related is outside the target. + // NB: No relatedTarget if the mouse left/entered the browser window + if ( !related || ( related !== target && !jQuery.contains( target, related ) ) ) { + event.type = handleObj.origType; + ret = handleObj.handler.apply( this, arguments ); + event.type = fix; + } + return ret; + } + }; +} ); + +// IE submit delegation +if ( !support.submit ) { + + jQuery.event.special.submit = { + setup: function() { + + // Only need this for delegated form submit events + if ( jQuery.nodeName( this, "form" ) ) { + return false; + } + + // Lazy-add a submit handler when a descendant form may potentially be submitted + jQuery.event.add( this, "click._submit keypress._submit", function( e ) { + + // Node name check avoids a VML-related crash in IE (#9807) + var elem = e.target, + form = jQuery.nodeName( elem, "input" ) || jQuery.nodeName( elem, "button" ) ? + + // Support: IE <=8 + // We use jQuery.prop instead of elem.form + // to allow fixing the IE8 delegated submit issue (gh-2332) + // by 3rd party polyfills/workarounds. + jQuery.prop( elem, "form" ) : + undefined; + + if ( form && !jQuery._data( form, "submit" ) ) { + jQuery.event.add( form, "submit._submit", function( event ) { + event._submitBubble = true; + } ); + jQuery._data( form, "submit", true ); + } + } ); + + // return undefined since we don't need an event listener + }, + + postDispatch: function( event ) { + + // If form was submitted by the user, bubble the event up the tree + if ( event._submitBubble ) { + delete event._submitBubble; + if ( this.parentNode && !event.isTrigger ) { + jQuery.event.simulate( "submit", this.parentNode, event ); + } + } + }, + + teardown: function() { + + // Only need this for delegated form submit events + if ( jQuery.nodeName( this, "form" ) ) { + return false; + } + + // Remove delegated handlers; cleanData eventually reaps submit handlers attached above + jQuery.event.remove( this, "._submit" ); + } + }; +} + +// IE change delegation and checkbox/radio fix +if ( !support.change ) { + + jQuery.event.special.change = { + + setup: function() { + + if ( rformElems.test( this.nodeName ) ) { + + // IE doesn't fire change on a check/radio until blur; trigger it on click + // after a propertychange. Eat the blur-change in special.change.handle. + // This still fires onchange a second time for check/radio after blur. + if ( this.type === "checkbox" || this.type === "radio" ) { + jQuery.event.add( this, "propertychange._change", function( event ) { + if ( event.originalEvent.propertyName === "checked" ) { + this._justChanged = true; + } + } ); + jQuery.event.add( this, "click._change", function( event ) { + if ( this._justChanged && !event.isTrigger ) { + this._justChanged = false; + } + + // Allow triggered, simulated change events (#11500) + jQuery.event.simulate( "change", this, event ); + } ); + } + return false; + } + + // Delegated event; lazy-add a change handler on descendant inputs + jQuery.event.add( this, "beforeactivate._change", function( e ) { + var elem = e.target; + + if ( rformElems.test( elem.nodeName ) && !jQuery._data( elem, "change" ) ) { + jQuery.event.add( elem, "change._change", function( event ) { + if ( this.parentNode && !event.isSimulated && !event.isTrigger ) { + jQuery.event.simulate( "change", this.parentNode, event ); + } + } ); + jQuery._data( elem, "change", true ); + } + } ); + }, + + handle: function( event ) { + var elem = event.target; + + // Swallow native change events from checkbox/radio, we already triggered them above + if ( this !== elem || event.isSimulated || event.isTrigger || + ( elem.type !== "radio" && elem.type !== "checkbox" ) ) { + + return event.handleObj.handler.apply( this, arguments ); + } + }, + + teardown: function() { + jQuery.event.remove( this, "._change" ); + + return !rformElems.test( this.nodeName ); + } + }; +} + +// Support: Firefox +// Firefox doesn't have focus(in | out) events +// Related ticket - https://bugzilla.mozilla.org/show_bug.cgi?id=687787 +// +// Support: Chrome, Safari +// focus(in | out) events fire after focus & blur events, +// which is spec violation - http://www.w3.org/TR/DOM-Level-3-Events/#events-focusevent-event-order +// Related ticket - https://code.google.com/p/chromium/issues/detail?id=449857 +if ( !support.focusin ) { + jQuery.each( { focus: "focusin", blur: "focusout" }, function( orig, fix ) { + + // Attach a single capturing handler on the document while someone wants focusin/focusout + var handler = function( event ) { + jQuery.event.simulate( fix, event.target, jQuery.event.fix( event ) ); + }; + + jQuery.event.special[ fix ] = { + setup: function() { + var doc = this.ownerDocument || this, + attaches = jQuery._data( doc, fix ); + + if ( !attaches ) { + doc.addEventListener( orig, handler, true ); + } + jQuery._data( doc, fix, ( attaches || 0 ) + 1 ); + }, + teardown: function() { + var doc = this.ownerDocument || this, + attaches = jQuery._data( doc, fix ) - 1; + + if ( !attaches ) { + doc.removeEventListener( orig, handler, true ); + jQuery._removeData( doc, fix ); + } else { + jQuery._data( doc, fix, attaches ); + } + } + }; + } ); +} + +jQuery.fn.extend( { + + on: function( types, selector, data, fn ) { + return on( this, types, selector, data, fn ); + }, + one: function( types, selector, data, fn ) { + return on( this, types, selector, data, fn, 1 ); + }, + off: function( types, selector, fn ) { + var handleObj, type; + if ( types && types.preventDefault && types.handleObj ) { + + // ( event ) dispatched jQuery.Event + handleObj = types.handleObj; + jQuery( types.delegateTarget ).off( + handleObj.namespace ? + handleObj.origType + "." + handleObj.namespace : + handleObj.origType, + handleObj.selector, + handleObj.handler + ); + return this; + } + if ( typeof types === "object" ) { + + // ( types-object [, selector] ) + for ( type in types ) { + this.off( type, selector, types[ type ] ); + } + return this; + } + if ( selector === false || typeof selector === "function" ) { + + // ( types [, fn] ) + fn = selector; + selector = undefined; + } + if ( fn === false ) { + fn = returnFalse; + } + return this.each( function() { + jQuery.event.remove( this, types, fn, selector ); + } ); + }, + + trigger: function( type, data ) { + return this.each( function() { + jQuery.event.trigger( type, data, this ); + } ); + }, + triggerHandler: function( type, data ) { + var elem = this[ 0 ]; + if ( elem ) { + return jQuery.event.trigger( type, data, elem, true ); + } + } +} ); + + +var rinlinejQuery = / jQuery\d+="(?:null|\d+)"/g, + rnoshimcache = new RegExp( "<(?:" + nodeNames + ")[\\s/>]", "i" ), + rxhtmlTag = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:-]+)[^>]*)\/>/gi, + + // Support: IE 10-11, Edge 10240+ + // In IE/Edge using regex groups here causes severe slowdowns. + // See https://connect.microsoft.com/IE/feedback/details/1736512/ + rnoInnerhtml = /\s*$/g, + safeFragment = createSafeFragment( document ), + fragmentDiv = safeFragment.appendChild( document.createElement( "div" ) ); + +// Support: IE<8 +// Manipulating tables requires a tbody +function manipulationTarget( elem, content ) { + return jQuery.nodeName( elem, "table" ) && + jQuery.nodeName( content.nodeType !== 11 ? content : content.firstChild, "tr" ) ? + + elem.getElementsByTagName( "tbody" )[ 0 ] || + elem.appendChild( elem.ownerDocument.createElement( "tbody" ) ) : + elem; +} + +// Replace/restore the type attribute of script elements for safe DOM manipulation +function disableScript( elem ) { + elem.type = ( jQuery.find.attr( elem, "type" ) !== null ) + "/" + elem.type; + return elem; +} +function restoreScript( elem ) { + var match = rscriptTypeMasked.exec( elem.type ); + if ( match ) { + elem.type = match[ 1 ]; + } else { + elem.removeAttribute( "type" ); + } + return elem; +} + +function cloneCopyEvent( src, dest ) { + if ( dest.nodeType !== 1 || !jQuery.hasData( src ) ) { + return; + } + + var type, i, l, + oldData = jQuery._data( src ), + curData = jQuery._data( dest, oldData ), + events = oldData.events; + + if ( events ) { + delete curData.handle; + curData.events = {}; + + for ( type in events ) { + for ( i = 0, l = events[ type ].length; i < l; i++ ) { + jQuery.event.add( dest, type, events[ type ][ i ] ); + } + } + } + + // make the cloned public data object a copy from the original + if ( curData.data ) { + curData.data = jQuery.extend( {}, curData.data ); + } +} + +function fixCloneNodeIssues( src, dest ) { + var nodeName, e, data; + + // We do not need to do anything for non-Elements + if ( dest.nodeType !== 1 ) { + return; + } + + nodeName = dest.nodeName.toLowerCase(); + + // IE6-8 copies events bound via attachEvent when using cloneNode. + if ( !support.noCloneEvent && dest[ jQuery.expando ] ) { + data = jQuery._data( dest ); + + for ( e in data.events ) { + jQuery.removeEvent( dest, e, data.handle ); + } + + // Event data gets referenced instead of copied if the expando gets copied too + dest.removeAttribute( jQuery.expando ); + } + + // IE blanks contents when cloning scripts, and tries to evaluate newly-set text + if ( nodeName === "script" && dest.text !== src.text ) { + disableScript( dest ).text = src.text; + restoreScript( dest ); + + // IE6-10 improperly clones children of object elements using classid. + // IE10 throws NoModificationAllowedError if parent is null, #12132. + } else if ( nodeName === "object" ) { + if ( dest.parentNode ) { + dest.outerHTML = src.outerHTML; + } + + // This path appears unavoidable for IE9. When cloning an object + // element in IE9, the outerHTML strategy above is not sufficient. + // If the src has innerHTML and the destination does not, + // copy the src.innerHTML into the dest.innerHTML. #10324 + if ( support.html5Clone && ( src.innerHTML && !jQuery.trim( dest.innerHTML ) ) ) { + dest.innerHTML = src.innerHTML; + } + + } else if ( nodeName === "input" && rcheckableType.test( src.type ) ) { + + // IE6-8 fails to persist the checked state of a cloned checkbox + // or radio button. Worse, IE6-7 fail to give the cloned element + // a checked appearance if the defaultChecked value isn't also set + + dest.defaultChecked = dest.checked = src.checked; + + // IE6-7 get confused and end up setting the value of a cloned + // checkbox/radio button to an empty string instead of "on" + if ( dest.value !== src.value ) { + dest.value = src.value; + } + + // IE6-8 fails to return the selected option to the default selected + // state when cloning options + } else if ( nodeName === "option" ) { + dest.defaultSelected = dest.selected = src.defaultSelected; + + // IE6-8 fails to set the defaultValue to the correct value when + // cloning other types of input fields + } else if ( nodeName === "input" || nodeName === "textarea" ) { + dest.defaultValue = src.defaultValue; + } +} + +function domManip( collection, args, callback, ignored ) { + + // Flatten any nested arrays + args = concat.apply( [], args ); + + var first, node, hasScripts, + scripts, doc, fragment, + i = 0, + l = collection.length, + iNoClone = l - 1, + value = args[ 0 ], + isFunction = jQuery.isFunction( value ); + + // We can't cloneNode fragments that contain checked, in WebKit + if ( isFunction || + ( l > 1 && typeof value === "string" && + !support.checkClone && rchecked.test( value ) ) ) { + return collection.each( function( index ) { + var self = collection.eq( index ); + if ( isFunction ) { + args[ 0 ] = value.call( this, index, self.html() ); + } + domManip( self, args, callback, ignored ); + } ); + } + + if ( l ) { + fragment = buildFragment( args, collection[ 0 ].ownerDocument, false, collection, ignored ); + first = fragment.firstChild; + + if ( fragment.childNodes.length === 1 ) { + fragment = first; + } + + // Require either new content or an interest in ignored elements to invoke the callback + if ( first || ignored ) { + scripts = jQuery.map( getAll( fragment, "script" ), disableScript ); + hasScripts = scripts.length; + + // Use the original fragment for the last item + // instead of the first because it can end up + // being emptied incorrectly in certain situations (#8070). + for ( ; i < l; i++ ) { + node = fragment; + + if ( i !== iNoClone ) { + node = jQuery.clone( node, true, true ); + + // Keep references to cloned scripts for later restoration + if ( hasScripts ) { + + // Support: Android<4.1, PhantomJS<2 + // push.apply(_, arraylike) throws on ancient WebKit + jQuery.merge( scripts, getAll( node, "script" ) ); + } + } + + callback.call( collection[ i ], node, i ); + } + + if ( hasScripts ) { + doc = scripts[ scripts.length - 1 ].ownerDocument; + + // Reenable scripts + jQuery.map( scripts, restoreScript ); + + // Evaluate executable scripts on first document insertion + for ( i = 0; i < hasScripts; i++ ) { + node = scripts[ i ]; + if ( rscriptType.test( node.type || "" ) && + !jQuery._data( node, "globalEval" ) && + jQuery.contains( doc, node ) ) { + + if ( node.src ) { + + // Optional AJAX dependency, but won't run scripts if not present + if ( jQuery._evalUrl ) { + jQuery._evalUrl( node.src ); + } + } else { + jQuery.globalEval( + ( node.text || node.textContent || node.innerHTML || "" ) + .replace( rcleanScript, "" ) + ); + } + } + } + } + + // Fix #11809: Avoid leaking memory + fragment = first = null; + } + } + + return collection; +} + +function remove( elem, selector, keepData ) { + var node, + elems = selector ? jQuery.filter( selector, elem ) : elem, + i = 0; + + for ( ; ( node = elems[ i ] ) != null; i++ ) { + + if ( !keepData && node.nodeType === 1 ) { + jQuery.cleanData( getAll( node ) ); + } + + if ( node.parentNode ) { + if ( keepData && jQuery.contains( node.ownerDocument, node ) ) { + setGlobalEval( getAll( node, "script" ) ); + } + node.parentNode.removeChild( node ); + } + } + + return elem; +} + +jQuery.extend( { + htmlPrefilter: function( html ) { + return html.replace( rxhtmlTag, "<$1>" ); + }, + + clone: function( elem, dataAndEvents, deepDataAndEvents ) { + var destElements, node, clone, i, srcElements, + inPage = jQuery.contains( elem.ownerDocument, elem ); + + if ( support.html5Clone || jQuery.isXMLDoc( elem ) || + !rnoshimcache.test( "<" + elem.nodeName + ">" ) ) { + + clone = elem.cloneNode( true ); + + // IE<=8 does not properly clone detached, unknown element nodes + } else { + fragmentDiv.innerHTML = elem.outerHTML; + fragmentDiv.removeChild( clone = fragmentDiv.firstChild ); + } + + if ( ( !support.noCloneEvent || !support.noCloneChecked ) && + ( elem.nodeType === 1 || elem.nodeType === 11 ) && !jQuery.isXMLDoc( elem ) ) { + + // We eschew Sizzle here for performance reasons: http://jsperf.com/getall-vs-sizzle/2 + destElements = getAll( clone ); + srcElements = getAll( elem ); + + // Fix all IE cloning issues + for ( i = 0; ( node = srcElements[ i ] ) != null; ++i ) { + + // Ensure that the destination node is not null; Fixes #9587 + if ( destElements[ i ] ) { + fixCloneNodeIssues( node, destElements[ i ] ); + } + } + } + + // Copy the events from the original to the clone + if ( dataAndEvents ) { + if ( deepDataAndEvents ) { + srcElements = srcElements || getAll( elem ); + destElements = destElements || getAll( clone ); + + for ( i = 0; ( node = srcElements[ i ] ) != null; i++ ) { + cloneCopyEvent( node, destElements[ i ] ); + } + } else { + cloneCopyEvent( elem, clone ); + } + } + + // Preserve script evaluation history + destElements = getAll( clone, "script" ); + if ( destElements.length > 0 ) { + setGlobalEval( destElements, !inPage && getAll( elem, "script" ) ); + } + + destElements = srcElements = node = null; + + // Return the cloned set + return clone; + }, + + cleanData: function( elems, /* internal */ forceAcceptData ) { + var elem, type, id, data, + i = 0, + internalKey = jQuery.expando, + cache = jQuery.cache, + attributes = support.attributes, + special = jQuery.event.special; + + for ( ; ( elem = elems[ i ] ) != null; i++ ) { + if ( forceAcceptData || acceptData( elem ) ) { + + id = elem[ internalKey ]; + data = id && cache[ id ]; + + if ( data ) { + if ( data.events ) { + for ( type in data.events ) { + if ( special[ type ] ) { + jQuery.event.remove( elem, type ); + + // This is a shortcut to avoid jQuery.event.remove's overhead + } else { + jQuery.removeEvent( elem, type, data.handle ); + } + } + } + + // Remove cache only if it was not already removed by jQuery.event.remove + if ( cache[ id ] ) { + + delete cache[ id ]; + + // Support: IE<9 + // IE does not allow us to delete expando properties from nodes + // IE creates expando attributes along with the property + // IE does not have a removeAttribute function on Document nodes + if ( !attributes && typeof elem.removeAttribute !== "undefined" ) { + elem.removeAttribute( internalKey ); + + // Webkit & Blink performance suffers when deleting properties + // from DOM nodes, so set to undefined instead + // https://code.google.com/p/chromium/issues/detail?id=378607 + } else { + elem[ internalKey ] = undefined; + } + + deletedIds.push( id ); + } + } + } + } + } +} ); + +jQuery.fn.extend( { + + // Keep domManip exposed until 3.0 (gh-2225) + domManip: domManip, + + detach: function( selector ) { + return remove( this, selector, true ); + }, + + remove: function( selector ) { + return remove( this, selector ); + }, + + text: function( value ) { + return access( this, function( value ) { + return value === undefined ? + jQuery.text( this ) : + this.empty().append( + ( this[ 0 ] && this[ 0 ].ownerDocument || document ).createTextNode( value ) + ); + }, null, value, arguments.length ); + }, + + append: function() { + return domManip( this, arguments, function( elem ) { + if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) { + var target = manipulationTarget( this, elem ); + target.appendChild( elem ); + } + } ); + }, + + prepend: function() { + return domManip( this, arguments, function( elem ) { + if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) { + var target = manipulationTarget( this, elem ); + target.insertBefore( elem, target.firstChild ); + } + } ); + }, + + before: function() { + return domManip( this, arguments, function( elem ) { + if ( this.parentNode ) { + this.parentNode.insertBefore( elem, this ); + } + } ); + }, + + after: function() { + return domManip( this, arguments, function( elem ) { + if ( this.parentNode ) { + this.parentNode.insertBefore( elem, this.nextSibling ); + } + } ); + }, + + empty: function() { + var elem, + i = 0; + + for ( ; ( elem = this[ i ] ) != null; i++ ) { + + // Remove element nodes and prevent memory leaks + if ( elem.nodeType === 1 ) { + jQuery.cleanData( getAll( elem, false ) ); + } + + // Remove any remaining nodes + while ( elem.firstChild ) { + elem.removeChild( elem.firstChild ); + } + + // If this is a select, ensure that it displays empty (#12336) + // Support: IE<9 + if ( elem.options && jQuery.nodeName( elem, "select" ) ) { + elem.options.length = 0; + } + } + + return this; + }, + + clone: function( dataAndEvents, deepDataAndEvents ) { + dataAndEvents = dataAndEvents == null ? false : dataAndEvents; + deepDataAndEvents = deepDataAndEvents == null ? dataAndEvents : deepDataAndEvents; + + return this.map( function() { + return jQuery.clone( this, dataAndEvents, deepDataAndEvents ); + } ); + }, + + html: function( value ) { + return access( this, function( value ) { + var elem = this[ 0 ] || {}, + i = 0, + l = this.length; + + if ( value === undefined ) { + return elem.nodeType === 1 ? + elem.innerHTML.replace( rinlinejQuery, "" ) : + undefined; + } + + // See if we can take a shortcut and just use innerHTML + if ( typeof value === "string" && !rnoInnerhtml.test( value ) && + ( support.htmlSerialize || !rnoshimcache.test( value ) ) && + ( support.leadingWhitespace || !rleadingWhitespace.test( value ) ) && + !wrapMap[ ( rtagName.exec( value ) || [ "", "" ] )[ 1 ].toLowerCase() ] ) { + + value = jQuery.htmlPrefilter( value ); + + try { + for ( ; i < l; i++ ) { + + // Remove element nodes and prevent memory leaks + elem = this[ i ] || {}; + if ( elem.nodeType === 1 ) { + jQuery.cleanData( getAll( elem, false ) ); + elem.innerHTML = value; + } + } + + elem = 0; + + // If using innerHTML throws an exception, use the fallback method + } catch ( e ) {} + } + + if ( elem ) { + this.empty().append( value ); + } + }, null, value, arguments.length ); + }, + + replaceWith: function() { + var ignored = []; + + // Make the changes, replacing each non-ignored context element with the new content + return domManip( this, arguments, function( elem ) { + var parent = this.parentNode; + + if ( jQuery.inArray( this, ignored ) < 0 ) { + jQuery.cleanData( getAll( this ) ); + if ( parent ) { + parent.replaceChild( elem, this ); + } + } + + // Force callback invocation + }, ignored ); + } +} ); + +jQuery.each( { + appendTo: "append", + prependTo: "prepend", + insertBefore: "before", + insertAfter: "after", + replaceAll: "replaceWith" +}, function( name, original ) { + jQuery.fn[ name ] = function( selector ) { + var elems, + i = 0, + ret = [], + insert = jQuery( selector ), + last = insert.length - 1; + + for ( ; i <= last; i++ ) { + elems = i === last ? this : this.clone( true ); + jQuery( insert[ i ] )[ original ]( elems ); + + // Modern browsers can apply jQuery collections as arrays, but oldIE needs a .get() + push.apply( ret, elems.get() ); + } + + return this.pushStack( ret ); + }; +} ); + + +var iframe, + elemdisplay = { + + // Support: Firefox + // We have to pre-define these values for FF (#10227) + HTML: "block", + BODY: "block" + }; + +/** + * Retrieve the actual display of a element + * @param {String} name nodeName of the element + * @param {Object} doc Document object + */ + +// Called only from within defaultDisplay +function actualDisplay( name, doc ) { + var elem = jQuery( doc.createElement( name ) ).appendTo( doc.body ), + + display = jQuery.css( elem[ 0 ], "display" ); + + // We don't have any data stored on the element, + // so use "detach" method as fast way to get rid of the element + elem.detach(); + + return display; +} + +/** + * Try to determine the default display value of an element + * @param {String} nodeName + */ +function defaultDisplay( nodeName ) { + var doc = document, + display = elemdisplay[ nodeName ]; + + if ( !display ) { + display = actualDisplay( nodeName, doc ); + + // If the simple way fails, read from inside an iframe + if ( display === "none" || !display ) { + + // Use the already-created iframe if possible + iframe = ( iframe || jQuery( "