From fb9584e584cd6fad0104a46a943d7b446f3f28ba Mon Sep 17 00:00:00 2001 From: Hassan Usman Date: Tue, 31 Oct 2017 09:17:29 +0500 Subject: [PATCH] cheat sheet updated --- LICENSE | 202 ++++++++++ README-ZH.md | 594 +++++++++++++++++++++++++++ README.md | 713 ++++++++++++++++++++++++++++++++- assets/from_java_to_kotlin.png | Bin 0 -> 48354 bytes others/Developer.java | 53 +++ others/Developer.kt | 1 + others/JavaExample.java | 3 + others/KotlinExample.kt | 3 + 8 files changed, 1567 insertions(+), 2 deletions(-) create mode 100644 LICENSE create mode 100644 README-ZH.md create mode 100644 assets/from_java_to_kotlin.png create mode 100644 others/Developer.java create mode 100644 others/Developer.kt create mode 100644 others/JavaExample.java create mode 100644 others/KotlinExample.kt diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..7a4a3ea --- /dev/null +++ b/LICENSE @@ -0,0 +1,202 @@ + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + 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. \ No newline at end of file diff --git a/README-ZH.md b/README-ZH.md new file mode 100644 index 0000000..aafbe01 --- /dev/null +++ b/README-ZH.md @@ -0,0 +1,594 @@ +![](http://upload-images.jianshu.io/upload_images/1110736-25da08f052608195.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) + +# From Java To Kotlin +[![Mindorks](https://img.shields.io/badge/mindorks-opensource-blue.svg)](https://mindorks.com/open-source-projects) +[![Mindorks Community](https://img.shields.io/badge/join-community-blue.svg)](https://mindorks.com/join-community) + +## 打印日志 + - Java + +```java +System.out.print("Amit Shekhar"); +System.out.println("Amit Shekhar"); +``` + +- Kotlin + +```kotlin +print("Amit Shekhar") +println("Amit Shekhar") +``` + +--- + +## 常量与变量 +- Java + +```java +String name = "Amit Shekhar"; +final String name = "Amit Shekhar"; +``` + +- Kotlin + +```kotlin +var name = "Amit Shekhar" +val name = "Amit Shekhar" +``` + +--- +## null声明 +- Java + +```java +String otherName; +otherName = null; +``` + +- Kotlin + +```kotlin +var otherName : String? +otherName = null +``` + +--- +## 空判断 +- Java + +```java +if (text != null) { +  int length = text.length(); +} +``` + +- Kotlin + +```kotlin +text?.let { + val length = text.length +} +// or simply +val length = text?.length +``` + +--- +## 字符串拼接 + +- Java + +```java +String firstName = "Amit"; +String lastName = "Shekhar"; +String message = "My name is: " + firstName + " " + lastName; +``` + +- Kotlin + +```kotlin +val firstName = "Amit" +val lastName = "Shekhar" +val message = "My name is: $firstName $lastName" +``` + +--- +## 换行 +- Java + +```java +String text = "First Line\n" + +              "Second Line\n" + +              "Third Line"; +``` + +- Kotlin + +```kotlin +val text = """ +        |First Line +        |Second Line +        |Third Line +        """.trimMargin() +``` + +--- + +## 三元表达式 +- Java + +```java +String text = x > 5 ? "x > 5" : "x <= 5"; +``` + +- Kotlin + +```kotlin +val text = if (x > 5) +              "x > 5" +           else "x <= 5" +``` + +--- +## 操作符 +- java + +```java +final int andResult = a & b; +final int orResult = a | b; +final int xorResult = a ^ b; +final int rightShift = a >> 2; +final int leftShift = a << 2; +``` + +- Kotlin + +```kotlin +val andResult = a and b +val orResult = a or b +val xorResult = a xor b +val rightShift = a shr 2 +val leftShift = a shl 2 +``` + +--- +## 类型判断和转换 (声明式) +- Java + +```java +if (object instanceof Car) { +} +Car car = (Car) object; +``` + +- Kotlin + +```kotlin +if (object is Car) { +} +var car = object as Car +``` + +--- +## 类型判断和转换 (隐式) +- Java + +```java +if (object instanceof Car) { +   Car car = (Car) object; +} +``` + +- Kotlin + +```kotlin +if (object is Car) { +   var car = object // smart casting +} +``` + +--- +## 多重条件 +- Java + +```java +if (score >= 0 && score <= 300) { } +``` + +- Kotlin + +```kotlin +if (score in 0..300) { } +``` + +--- +## 更灵活的case语句 +- Java + +```java +int score = // some score; +String grade; +switch (score) { + case 10: + case 9: + grade = "Excellent"; + break; + case 8: + case 7: + case 6: + grade = "Good"; + break; + case 5: + case 4: + grade = "OK"; + break; + case 3: + case 2: + case 1: + grade = "Fail"; + break; + default: +     grade = "Fail"; +} +``` + +- Kotlin + +```kotlin +var score = // some score +var grade = when (score) { + 9, 10 -> "Excellent" + in 6..8 -> "Good" + 4, 5 -> "OK" + in 1..3 -> "Fail" + else -> "Fail" +} +``` + +--- +## for循环 +- Java + +```java +for (int i = 1; i <= 10 ; i++) { } + +for (int i = 1; i < 10 ; i++) { } + +for (int i = 10; i >= 0 ; i--) { } + +for (int i = 1; i <= 10 ; i+=2) { } + +for (int i = 10; i >= 0 ; i-=2) { } + +for (String item : collection) { } + +for (Map.Entry entry: map.entrySet()) { } +``` + +- Kotlin + +```kotlin +for (i in 1..10) { } + +for (i in 1 until 10) { } + +for (i in 10 downTo 0) { } + +for (i in 1..10 step 2) { } + +for (i in 10 downTo 1 step 2) { } + +for (item in collection) { } + +for ((key, value) in map) { } +``` + +--- +## 更方便的集合操作 +- Java + +```java +final List listOfNumber = Arrays.asList(1, 2, 3, 4); + +final Map keyValue = new HashMap(); +map.put(1, "Amit"); +map.put(2, "Ali"); +map.put(3, "Mindorks"); + +// Java 9 +final List listOfNumber = List.of(1, 2, 3, 4); + +final Map keyValue = Map.of(1, "Amit", + 2, "Ali", + 3, "Mindorks"); +``` + +- Kotlin + +```kotlin +val listOfNumber = listOf(1, 2, 3, 4) +val keyValue = mapOf(1 to "Amit", +                     2 to "Ali", +                     3 to "Mindorks") +``` + +--- +## 遍历 +- Java + +```java +// Java 7 and below +for (Car car : cars) { + System.out.println(car.speed); +} + +// Java 8+ +cars.forEach(car -> System.out.println(car.speed)); + +// Java 7 and below +for (Car car : cars) { + if (car.speed > 100) { + System.out.println(car.speed); + } +} + +// Java 8+ +cars.stream().filter(car -> car.speed > 100).forEach(car -> System.out.println(car.speed)); +``` + +- Kotlin + +```kotlin +cars.forEach { + println(it.speed) +} + +cars.filter { it.speed > 100 } + .forEach { println(it.speed)} +``` + +--- +## 方法定义 +- Java + +```java +void doSomething() { +   // logic here +} + +void doSomething(int... numbers) { + // logic here +} +``` + +- Kotlin + +```kotlin +fun doSomething() { +   // logic here +} + +fun doSomething(vararg numbers: Int) { + // logic here +} +``` + +--- +## 带返回值的方法 +- Java + +```java +int getScore() { +   // logic here +   return score; +} +``` + +- Kotlin + +```kotlin +fun getScore(): Int { +   // logic here +   return score +} + +// as a single-expression function + +fun getScore(): Int = score +``` + +--- + +## 无结束符号 +- Java + +```java +int getScore(int value) { +    // logic here +    return 2 * value; +} +``` + +- Kotlin + +```kotlin +fun getScore(value: Int): Int { +   // logic here +   return 2 * value +} + +// as a single-expression function + +fun getScore(value: Int): Int = 2 * value +``` + +--- +## constructor 构造器 +- Java + +```java +public class Utils { + +    private Utils() {  +      // This utility class is not publicly instantiable  +    } +     +    public static int getScore(int value) { +        return 2 * value; +    } +     +} +``` + +- Kotlin + +```kotlin +class Utils private constructor() { + +    companion object { +     +        fun getScore(value: Int): Int { +            return 2 * value +        } +         +    } +} + +// another way + +object Utils { + +    fun getScore(value: Int): Int { +        return 2 * value +    } + +} +``` + +--- +## Get Set 构造器 +- Java + +```java +public class Developer { + +    private String name; +    private int age; + +    public Developer(String name, int age) { +        this.name = name; +        this.age = age; +    } + +    public String getName() { +        return name; +    } + +    public void setName(String name) { +        this.name = name; +    } + +    public int getAge() { +        return age; +    } + +    public void setAge(int age) { +        this.age = age; +    } + +    @Override +    public boolean equals(Object o) { +        if (this == o) return true; +        if (o == null || getClass() != o.getClass()) return false; + +        Developer developer = (Developer) o; + +        if (age != developer.age) return false; +        return name != null ? name.equals(developer.name) : developer.name == null; + +    } + +    @Override +    public int hashCode() { +        int result = name != null ? name.hashCode() : 0; +        result = 31 * result + age; +        return result; +    } + +    @Override +    public String toString() { +        return "Developer{" + +                "name='" + name + '\'' + +                ", age=" + age + +                '}'; +    } +} +``` + +- Kotlin + +```kotlin +data class Developer(val name: String, val age: Int) + +``` + +- Java + +```java +public class Utils { + +    private Utils() {  +      // This utility class is not publicly instantiable  +    } +     +    public static int triple(int value) { +        return 3 * value; +    } +     +} + +int result = Utils.triple(3); + +``` + +- Kotlin + +```kotlin +fun Int.triple(): Int { +  return this * 3 +} + +var result = 3.triple() +``` + +--- + +### 你需要知道一些比较重要的事 +* [Learn Kotlin - lateinit vs lazy](https://mindorks.com/blog/learn-kotlin-lateinit-vs-lazy) +* [Learn Kotlin - apply vs with](https://mindorks.com/blog/learn-kotlin-apply-vs-with) +* [Learn Kotlin - Data Class](https://mindorks.com/blog/learn-kotlin-data-class) +* [Learn Kotlin - Destructuring Declarations](https://mindorks.com/blog/learn-kotlin-destructuring-declarations) +* [Learn Kotlin - Extension Functions](https://mindorks.com/blog/learn-kotlin-extension-functions) +* [Learn Kotlin - Sealed Classes](https://mindorks.com/blog/learn-kotlin-sealed-classes) + +### 如果你觉得这个项目对你有帮助 :heart: +* 你可以通过点击 :star:表示支持 :v: + +[Check out Mindorks awesome open source projects here](https://mindorks.com/open-source-projects) + + +### License +``` +   Copyright (C) 2017 MINDORKS NEXTGEN PRIVATE LIMITED + +   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. +``` diff --git a/README.md b/README.md index f9dca98..02697c4 100644 --- a/README.md +++ b/README.md @@ -1,2 +1,711 @@ -# Java-to-Kotlin -From Java To Kotlin - Your Cheat Sheet For Java To Kotlin +

+FromJavaToKotlin +

+ +# From Java To Kotlin +[![Mindorks](https://img.shields.io/badge/mindorks-opensource-blue.svg)](https://mindorks.com/open-source-projects) +[![Mindorks Community](https://img.shields.io/badge/join-community-blue.svg)](https://mindorks.com/join-community) +> From Java To Kotlin - Your Cheat Sheet For Java To Kotlin + +[中文支持](https://github.com/MindorksOpenSource/from-java-to-kotlin/blob/master/README-ZH.md) +--- + +> Java + +```java +System.out.print("Amit Shekhar"); +System.out.println("Amit Shekhar"); +``` + +> Kotlin + +```kotlin +print("Amit Shekhar") +println("Amit Shekhar") +``` + +--- + +> Java + +```java +String name = "Amit Shekhar"; +final String name = "Amit Shekhar"; +``` + +> Kotlin + +```kotlin +var name = "Amit Shekhar" +val name = "Amit Shekhar" +``` + +--- + +> Java + +```java +String otherName; +otherName = null; +``` + +> Kotlin + +```kotlin +var otherName : String? +otherName = null +``` + +--- + +> Java + +```java +if (text != null) { + int length = text.length(); +} +``` + +> Kotlin + +```kotlin +text?.let { + val length = text.length +} +// or simply +val length = text?.length +``` + +--- + +> Java + +```java +String firstName = "Amit"; +String lastName = "Shekhar"; +String message = "My name is: " + firstName + " " + lastName; +``` + +> Kotlin + +```kotlin +val firstName = "Amit" +val lastName = "Shekhar" +val message = "My name is: $firstName $lastName" +``` + +--- + +> Java + +```java +String text = "First Line\n" + + "Second Line\n" + + "Third Line"; +``` + +> Kotlin + +```kotlin +val text = """ + |First Line + |Second Line + |Third Line + """.trimMargin() +``` + +--- + +> Java + +```java +String text = x > 5 ? "x > 5" : "x <= 5"; + +String message = null; +log(message != null ? message : ""); +``` + +> Kotlin + +```kotlin +val text = if (x > 5) + "x > 5" + else "x <= 5" + +val message: String? = null +log(message ?: "") +``` + +--- + +> Java + +```java +final int andResult = a & b; +final int orResult = a | b; +final int xorResult = a ^ b; +final int rightShift = a >> 2; +final int leftShift = a << 2; +``` + +> Kotlin + +```kotlin +val andResult = a and b +val orResult = a or b +val xorResult = a xor b +val rightShift = a shr 2 +val leftShift = a shl 2 +``` + +--- + +> Java + +```java +if (object instanceof Car) { +} +Car car = (Car) object; +``` + +> Kotlin + +```kotlin +if (object is Car) { +} +var car = object as Car + +// if object is null +var car = object as? Car // var car = object as Car? +``` + +--- + +> Java + +```java +if (object instanceof Car) { + Car car = (Car) object; +} +``` + +> Kotlin + +```kotlin +if (object is Car) { + var car = object // smart casting +} + +// if object is null +if (object is Car?) { + var car = object // smart casting, car will be null +} +``` + +--- + +> Java + +```java +if (score >= 0 && score <= 300) { } +``` + +> Kotlin + +```kotlin +if (score in 0..300) { } +``` + +--- + +> Java + +```java +int score = // some score; +String grade; +switch (score) { + case 10: + case 9: + grade = "Excellent"; + break; + case 8: + case 7: + case 6: + grade = "Good"; + break; + case 5: + case 4: + grade = "OK"; + break; + case 3: + case 2: + case 1: + grade = "Fail"; + break; + default: + grade = "Fail"; +} +``` + +> Kotlin + +```kotlin +var score = // some score +var grade = when (score) { + 9, 10 -> "Excellent" + in 6..8 -> "Good" + 4, 5 -> "OK" + in 1..3 -> "Fail" + else -> "Fail" +} +``` + +--- + +> Java + +```java +for (int i = 1; i <= 10 ; i++) { } + +for (int i = 1; i < 10 ; i++) { } + +for (int i = 10; i >= 0 ; i--) { } + +for (int i = 1; i <= 10 ; i+=2) { } + +for (int i = 10; i >= 0 ; i-=2) { } + +for (String item : collection) { } + +for (Map.Entry entry: map.entrySet()) { } +``` + +> Kotlin + +```kotlin +for (i in 1..10) { } + +for (i in 1 until 10) { } + +for (i in 10 downTo 0) { } + +for (i in 1..10 step 2) { } + +for (i in 10 downTo 1 step 2) { } + +for (item in collection) { } + +for ((key, value) in map) { } +``` + +--- + +> Java + +```java +final List listOfNumber = Arrays.asList(1, 2, 3, 4); + +final Map keyValue = new HashMap(); +map.put(1, "Amit"); +map.put(2, "Ali"); +map.put(3, "Mindorks"); + +// Java 9 +final List listOfNumber = List.of(1, 2, 3, 4); + +final Map keyValue = Map.of(1, "Amit", + 2, "Ali", + 3, "Mindorks"); +``` + +> Kotlin + +```kotlin +val listOfNumber = listOf(1, 2, 3, 4) +val keyValue = mapOf(1 to "Amit", + 2 to "Ali", + 3 to "Mindorks") +``` + +--- + +> Java + +```java +// Java 7 and below +for (Car car : cars) { + System.out.println(car.speed); +} + +// Java 8+ +cars.forEach(car -> System.out.println(car.speed)); + +// Java 7 and below +for (Car car : cars) { + if (car.speed > 100) { + System.out.println(car.speed); + } +} + +// Java 8+ +cars.stream().filter(car -> car.speed > 100).forEach(car -> System.out.println(car.speed)); +``` + +> Kotlin + +```kotlin +cars.forEach { + println(it.speed) +} + +cars.filter { it.speed > 100 } + .forEach { println(it.speed)} + +// kotlin 1.1+ +cars.stream().filter { it.speed > 100 }.forEach { println(it.speed)} +cars.parallelStream().filter { it.speed > 100 }.forEach { println(it.speed)} +``` + +--- + +> java + +```java +String[] splits = "param=car".split("="); +String param = splits[0]; +String value = splits[1]; +``` + + +> kotlin + +```kotlin +val (param, value) = "param=car".split("=") +``` + +--- + +> Java + +```java +void doSomething() { + // logic here +} +``` + +> Kotlin + +```kotlin +fun doSomething() { + // logic here +} +``` + +--- + +> Java + +```java +void doSomething(int... numbers) { + // logic here +} +``` + +> Kotlin + +```kotlin +fun doSomething(vararg numbers: Int) { + // logic here +} +``` + +--- + +> Java + +```java +int getScore() { + // logic here + return score; +} +``` + +> Kotlin + +```kotlin +fun getScore(): Int { + // logic here + return score +} + +// as a single-expression function + +fun getScore(): Int = score + +// even simpler (type will be determined automatically) + +fun getScore() = score // return-type is Int +``` + +--- + +> Java + +```java +int getScore(int value) { + // logic here + return 2 * value; +} +``` + +> Kotlin + +```kotlin +fun getScore(value: Int): Int { + // logic here + return 2 * value +} + +// as a single-expression function +fun getScore(value: Int): Int = 2 * value + +// even simpler (type will be determined automatically) + +fun getScore(value: Int) = 2 * value // return-type is int +``` + +--- + +> Java + +```java +public class Utils { + + private Utils() { + // This utility class is not publicly instantiable + } + + public static int getScore(int value) { + return 2 * value; + } + +} +``` + +> Kotlin + +```kotlin +class Utils private constructor() { + + companion object { + + fun getScore(value: Int): Int { + return 2 * value + } + + } +} + +// another way + +object Utils { + + fun getScore(value: Int): Int { + return 2 * value + } + +} +``` + +--- + +> Java + +```java +public class Developer { + + private String name; + private int age; + + public Developer(String name, int age) { + this.name = name; + this.age = age; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public int getAge() { + return age; + } + + public void setAge(int age) { + this.age = age; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + + Developer developer = (Developer) o; + + if (age != developer.age) return false; + return name != null ? name.equals(developer.name) : developer.name == null; + + } + + @Override + public int hashCode() { + int result = name != null ? name.hashCode() : 0; + result = 31 * result + age; + return result; + } + + @Override + public String toString() { + return "Developer{" + + "name='" + name + '\'' + + ", age=" + age + + '}'; + } +} +``` + +> Kotlin + +```kotlin +data class Developer(var name: String, var age: Int) + +``` + +--- + +> Java + +```java +public class Developer implements Cloneable { + +    private String name; + private int age; + + public Developer(String name, int age) { + this.name = name; + this.age = age; + } + + @Override + protected Object clone() throws CloneNotSupportedException { + return (Developer)super.clone(); + } +} + +// cloning or copying +Developer dev = new Developer("Mindorks", 30); +try { + Developer dev2 = (Developer) dev.clone(); +} catch (CloneNotSupportedException e) { + // handle exception +} + +``` + +> Kotlin + +```kotlin +data class Developer(var name: String, var age: Int) + +// cloning or copying +val dev = Developer("Mindorks", 30) +val dev2 = dev.copy() +// in case you only want to copy selected properties +val dev2 = dev.copy(age = 25) + +``` + +--- + +> Java + +```java +public class Utils { + + private Utils() { + // This utility class is not publicly instantiable + } + + public static int triple(int value) { + return 3 * value; + } + +} + +int result = Utils.triple(3); + +``` + +> Kotlin + +```kotlin +fun Int.triple(): Int { + return this * 3 +} + +var result = 3.triple() +``` + +--- + +> Java + +```java +Person person; +``` + +> Kotlin + +```kotlin +internal lateinit var person: Person +``` + + +--- + +### Important things to know in Kotlin +* [Learn Kotlin - lateinit vs lazy](https://mindorks.com/blog/learn-kotlin-lateinit-vs-lazy) +* [Learn Kotlin - apply vs with](https://mindorks.com/blog/learn-kotlin-apply-vs-with) +* [Learn Kotlin - Data Class](https://mindorks.com/blog/learn-kotlin-data-class) +* [Learn Kotlin - Destructuring Declarations](https://mindorks.com/blog/learn-kotlin-destructuring-declarations) +* [Learn Kotlin - Extension Functions](https://mindorks.com/blog/learn-kotlin-extension-functions) +* [Learn Kotlin - Sealed Classes](https://mindorks.com/blog/learn-kotlin-sealed-classes) + +### Found this project useful :heart: +* Support by clicking the :star: button on the upper right of this page. :v: + +[Check out Mindorks awesome open source projects here](https://mindorks.com/open-source-projects) + + +### License +``` + Copyright (C) 2017 MINDORKS NEXTGEN PRIVATE LIMITED + + 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. +``` + +### Contributing to From Java To Kotlin +Just make a pull request. You are in! diff --git a/assets/from_java_to_kotlin.png b/assets/from_java_to_kotlin.png new file mode 100644 index 0000000000000000000000000000000000000000..5f03f2ccd568268ea04c8c13b5eb52bb7ccbeaab GIT binary patch literal 48354 zcmeFZ^;gsX-#-orN=OJQ(kLY@Ee#?dEz*tBF=~Y500ZgH5h@*{84ZF`8{II*P|1yw zuEA%#uJip|*XQN+7ktnAmvPR{&g1!f+~an?-HXVV+N$KF^rU!rc;sp?p1;DwBl?Vo zhkrnP6ZZ{#H%bck2Os!K^%-8}FyjUuo&uiQb4C5P_?yUE*>_j4Cx6y5k>#Qqnr~Jp zbl*g)#GaBkj+WHivHAHpJoX(seeC#T$pA-I$pXIa#IhqPLAWkkI4D;B;iH6Q2Q|%@ z7mp+EXz+bOZlxmqFH!gum4gdg+W;_fq{Fhhb!1Rx1-m)49kiC|kn$@GkARpp^gkc} zk->lL;6HBgA1L?_68;AX|AU18LBjta;eU|uKS=ohUnHc82#vF05LaaVLZEb?pLDXF zc^x1zhvlGk|GAz8ou-|%X(ZA)_ID`a3ocWOI zU8vAK!|(6nnM=FN@`UU`2t!$Z__kflHuv1!2Zb*DcFur&=uHCqI&puo(`iNUL6g{* z2T`vL2&okC@c*BWZ!-jhpM#OXmlYR{ZYGnBYT&y1+F@Z>c1euXD{eh17nkMl=ZS>n zGtPE~F1#nNJlSiV|I`bI2i82R4bdm~;>5whSs|E~%v$`|Mmu2yRnuGYwM2ZeE@`?& z&GORV67tHliih-W<#=NoR*}!YTHtTZE^*-#jE123^QH|{BGA#CGX5XMk6xI~t!aEa z-L(}}4iAh~DHWqmurz;}(70O~D0nVPx02wnO+0CMcv@D=hDx&j)5yMlv0__qu5#j@ zG_s|U24&{Ys@_>dIluO}hl>eTf9ma_{eq;r#qGnh`6T61hZ3w0ZbBfEAHupbV`8)mW$YgQ zJ8~)1;vT}KAs(^c?l_*@mr=C4rBeP=*jY5gjg$lp(NjkS8h6UYYh4YO4&Nn~p>pK1 zX5OCQtw+YB`uBlY^;{U|-9Fsq>>o%DD4g=vGxh*AGNAnBKPcyp@-Cp;-Lt$U?HVy;)yw)=Z4@8V?< zU&h^$AwoUm0}?b=lIpg3XTjdyjGl$~id|f&h=hO1UOzk~P9OGZZG5maQ$wr%@+CvC z-k$=kXp6L@_kTTv*tP->e?4Z49;ENO`=e(~`O#`4^&or`&yqnqGfiprJv0RPd1`;U z*#K1msLNw47V$C91p4ouoh|F*Z~65Q#GTPKy`tzX~x z?~Wkkn^jle`l`sD9|76#fy{30!O{#Zj^Zn`s)JX_L^Zd7&z`-y%XYZw6+RQlbh|xzk4=Qz7J_!u~kv3O?B{Z=Vg_xGa-wQ2v+0;)R*h zu;S&o$S(FAS&D{?aSQu&0fo`0p9SnwJ;5#jEV@3|XhC21i(LQ(^Bn87QI)#|+O`em z$&5YL%OD3h&)v*aUrkr0ad!Jvl*MoGHuf(KWU?#ZNhJrceaCo>y+`HPs6NtB+iec~ zXe73cR%3PllgNQomGz$ZK}CITd8D;zijpg2ksdH&;`VLH%WXtx7kQ4n0(bC5M!smv1eVqo8-W0Rm+AzWC6C4 zM~W%5xS2SCGFO8S3~*oUJI7}~H8B?bnZ--;ERZBI?yn1MP~$`-;Lnm8__L{p7Jfja zqxMp8J>S`{w9IrPJ&tcHZppLx`o}ATj$L7^xyql5axC%wZcth+~rxCEHpLs9VH&mhW5F6Q^Nm3 zc)TzQ91{73Cc~pY>hqyHfZzZFx2Lm$=}g&B7dU;LD=dMoc{_o7OM>!v!=O=C*pfk3 zS7nXXUcFtonE5RKSN9UhSe32a!Cb~+y3T5TlEJ7%TZU;5C< zC-sF!_&%4(H$EwWPG7GLa_XSP$NMrU<=r{5g`kI%RJj`sDc=8!BvJ`tLbVH_I4x3y!Wk9^l|N=Z*+q@vw; z*2-J`RW0X)ApyDGdG<>)lf7&vs8t#fSEFe^*pZ0h_J^tXe2dJ(|3y=_#7~G+h4q88 ziU)x~9Wlbe!^KlNY7GtJRk=9hnz@chNd&-(gwY$pan%fLe$M$S424e>r+Y4EOeF^N z8T)ACP)(K5CN+|ODTU%t~K!1qw^otv6k?z{YoGJ`CN&Z_*>U_#jD=_(KKmxcAe3Ug#EA4RNi? zzflgKP=<(DA#i+oI6R8fhA!U?o^#(1Qb^4%`vyKAYvjY9zOZPjvWjjQC{%hT*0A%y zMxH%Cm$Dy_xZGeVS9R+1b2N5Iuw}y=yEf`^F26cSC;JW2;WwSE3s%zfIJ5E8* zbD1GZcF{&?|5iCP8y`8eQIEOou#-euKc`_ZAVG?*E^$EB2919JVjmX_ocp+a#&U2{M>+GFCPABEy>lb zJP%>dtAsZ{!t?_9Z{_ZOQ5cQzDS|~(k5Y%GMf&^y5M<2{*=Lh}c7r`a{zqOksL?fh z{G3+{+A%``c0X&p*Q^HwOl}On@bTYG&yz-KYyA7j7v*?tpC@2>9o@Vf4-H{f7*mkyX%IYdV`dyIv;dcI^m6c2D#*5O! z`&U!h^nZa{C=1S>&ueC=U#@);!cr%Yn>-~@v1>29Hj0vm7db7}r!}G{cmyMIm+Oe4 z_{mEdJMxTRKoOmAKlafwo)4979ReXeTWa<b;tpe3Fj-N!^r4-jLH5}*?mPJZb}TOgoRd}_wF%1tp&J8EZ>yGV!7b)W zln0XCZq*>hxY?N(rRGeDQfDb?wyqW_;{@Ed|31U?+R=SGbz35U$1=<$)YVKnAh|)D zOFnzOuQXwedYl*eOzz(0W?zX5#DEp;WAgWVP_2K(S-SwinJ*9$Kn2n^-*MXN#H;^D zQ$iO=oTkRM!DQ3{+6!EdfWUEe0DNIySLENfq3RdM!NlBjzAjXiVJgSNCdF8{!k!l) z!S*>;NJ_M!o^O(>!^-kF?yG-Ak}^SW3B+WQG3$S%2MUH{*+Ok+a46)gMZ6Y#7-3MS zvg2W~nv~JsW?suhg1h_fT~@p;wPYk&jIjB~yjg*x4-O@@wl6IVHuUWVji?bpUi;CZ zP@LTrR+Vu552wCkSDD;pBkz$+EWZAm9h>I{Ul^y(OgFnMxK6n&ap9-k_Jt~IG$DO) zO784kp;V~Qn!RqFqk0elOK&5c*{%E-s zz_5Jtz3-x;Ghhbz=oX={+0x*hx_IZP_YTG7X%QBS7)&%A_Gp7A&+E=7gQYgzcwfZW z>~0&vSJ-DFYKp9PVFMZ?O1MCHMwxd>W`of~rWHzSnVn@$k-@l%TbVa_I`el_Ycd7J zJGH%$XOxf*r8s2)k0B#)HMFAKXhaaT*^>SITD@TvxHruavrto_N_e^dE|~0D?9ZKP zu}qfezRL{OQFVoKt+V;8Gef5~MOHGR?y^#_sEa~N*3ln%%A|c+8LHiQg>TSh%lo}p z_g+Iy@xvFSa^$u? zDCbA*(f_xfgxM0`W|RY3|9}<;uJE(v6~jJZP;dFUn67`q+KOYf4o0Byth=O+5D61g zR6_we>U2*EP-p(W=s>Q#vdp_oc(vfJc;45b$E@jw9qZqn_3ZxJ^jS!d`$7qboy&8K8IP|_v!+Yd64WD-~olf%Sh+aSQ4$jZs}LGh7>>EqK89M>d!I_P8F2`XTrm%Z1@L-CnAPV!Wh$$tMfORnu3P9F@~)I8n1t$ z`}!^{qkxxxt~1V8JUFoyF5F$kVLX~25|TQ@wv$`TD}cs>X{5$@&lI=LacQH&_Ik zJ2#Pp4$MBjt211iEM*9x0nz!!es2b%82`AexO+_akQLz<%*3qL-1~cFA8Zy>xi~&W zXhhKvs)-Y`E@^}rkii_h3x8oFhMIK3M=SByt)J{J!Te|17gI0h#Qh0&ux@6l%OPQA zBwoL)RTavkjfNQx!w_EM{{)y?GaLr{9t%P+Uqdfm2B;BDo!F%+UCsAY{90U)nQdg9 zq`I_34sXdPX&%K(vxyHng@wMV1JZ}~{&%=z*ZO=_jjr*sIRGO`6Ku*p8BUL;lBslV zK(nu}jTg2_i*rS6uqN4W>QQ&oG%=@*6yDr;mwiH4cKIc5NA-;-ByuR;sz5GQjoN-) z{L`_k;&2i%7hwIVD8v8t2G&RdY=luB#C4x{WTT8H!6Mdl>4&_fkRwI zu>P!Dz_X%T2cP)Yttu>EUScX!yQlvNp&_)pCrP`3btUoyLZpuETC4uK3rNF>`#KEN zruToZMw+&JdJU*)scS*CP8Oc8sL3_+vvTP#@^5-B1r<7bF@#V54{_;RFMaAeqD1(N z(Epax`n*7Rp1I$lFBcL^pFHX{@K2ol2EsWScE(}yX$^svdO7N*&zMfSCf$YFo4Po; z#+L?8?q-=$)j~#ai+rC0vszAq9Flb&Y|hMb+fB;<_HaUKwkIWT{Hr~;&U%Cmmd2PR zI~HZDJf2Hc@f?=W4*YX7Cn}ueZhA)z-o?j0SA4PqE#?(OCREaATIE%PN_@{LS0WIx z!bp`c^OoKlVed)$*VnSXF43-NAAqUTxab~+Dxe8(T8NxS$Hpcq_KK?xpnxpg&1xNj z;`i?otyN?Iw<0V`2Qt6gGr94e-!=okYY?(Z*~t@pY&WHm%i_d##n&L&1R7c44Y7dM z@vg8tBScgU(p4T6bw;f##n@4#CO6#b@1#uGT;tPlpYQCWwX_rt_OPf}$?;sNu=)P_ z{Hc?B>1-P8Ncq>F#Odh>!_l+f*VfPMl3Rgl4y9=#tuh0B1su$z2uEygjO5m?M3{mP z=SeFm=L4{x1ugd7DsNR)qc8ST%ET_9C{3uw_xVH0fj@8wbNJYqtcJ-utBgPc2xgC+ zeOz8mLF-wXgSj+@wN=3D<9JKsn6JAXW`quK$=eB(8%r~BH&GUZWJ{=bp!``w6`(l2 zHVkDhl+7XSPe-V0l#+~S^PX!I^Kv;6?OUV5U)r3Uwd5dnk{%tUzpG+TeGYBrvo=Au z1}tQ~6kr(jB@|Y+9!;H!5c{arTBoQ|-XccUcjRoMv&Pz@_JK=mIs(q|*mRvwgujD} z9?dpP?qx%vkSFA|-Q}zI{Q-%L)wpdp*A9d zF|$9`bI&fe)o{HVWJy8&VzK$`kI-Il(~i(`nzFK)+^o2|^V70YUGfADuMY{6zJ6lI z6^{Bp#L>wBmJo64w}%JeZ5LJ@2kTR2M=Rr(2Ff35EX~b=BW*dr=RfedCSDG z&uT%Xf{hy%7`kP$tul-_6hT}HBl%PYh)jBgaIvRqkOA9) z*n3`7SPr^L0T${OKVkzQ9vRicUKgD!b(C3d%6qreMYtS~hJEudUyb)g8a0?TN0Zd* zs?bTo|H=q@OteNBHO|wRL$Kf|9hVp@7@JG?hz@IJsE44c#={upa zR`{)XIVedL-wR*%<)GsZ?ukbI+?lGNkjlLGu9*Hn!VA8o=646c{1RybHv&^k1B}$X z#np5!bAwb4PASGzwki7vmnU$s%@?W5nlZVyPJu-Uf89wKIlt&85z|hHx2`ze(1 z4H4op`8Oo@-N%tDbKt#^2XYt;HREM#0jN{*WTCC%w0S8s_sThhX=s18rfM}u&b9ab z3q7nfwIMdrwNCnEVW9Wb3_)oh5fot5+31UrKcfVD>T-dfH#9-IwvX*Q6=wv|i`iXt zZ1&mE6)eF0Q`dK|7#_tpBvXDTPj1aZn;{)vUVjh$GL`NRK`-!OP8-Xwn1#>-$kPBw zGZ!-ByKQ?b0~);OdsdX(V6ype6f_z0o8$BD+9xIxZpDaNWS2vHsu_p0BI%)zL+j=D zqN_!^nnh<%E_cJ>PPbG-rOU0O%;Z2&(0MpR`aSO?<>F}6xyQMLU7@9$ow17Grsz9y z-U4`;mYCNiplC}%q*Uo9MV@EJg@sg~&=#}sDA(5;0VRZaSJQ5<324TV^1Vrzh=tAx z+26d>mgG%=02_>VVSmb z@Uu01Bx#T~I8lQcsCdctgZab^OKL^t|2eDnAb7 z2D_)jC4RgPB-7g1k8LR%pIO;Fw%NO}{As<>R*Ue>-BEPiqkBypy%1v@(;H`}nr>*% z`Fe{29OCqYLYgbiH1?C53BRPr1#6m5U`LmFbJ z;x0S3_f5D+M#^Mv(KN8SE{c%eJ@&aP31e1Bj_bHv4dZR;2@`($CqXLyhz~bZ24%{* zsV|cY`tJT%NR8L!xI=RaiX`oBgqVqU`e}!hsGJ*+NaanZ`obbZ-Ico&B?>8vC`*k~ zShOtn7+&6dSgvX@lbS4#xU5?Vnz0jNho$ffXN_!q(PBjn`k4JnP1EMBl3IDwl6M3y z-Dcr>@YqO5W*gTvfu-Rc4B`As4UJvcV39Z-R3}4(jYx}00UZy8q_gNR-Tjs%E2Utf zCO@aVK1?)w0)|wGSrc?|AyTAFxghfSNVQYbWW(CR2kJps8xK6x;IkXMxm?Z91^Xz^tcS zPkzPBGe7ZOB^p|}{XjSPi)IgNS1?ckXj(Bc{K-3ivp9QfuEq^qj?n-aZpodF{aKST zWhr)FdETGF@9v%>Z#(vA2G1DL#>dNw@90qd<~$;%T+k(tJ~)boIDMqYx{;rK7Yl;} z`&_-uR@2f*4BZZ44WgY}5_)s;!&6d;FKi=YLVQaAz+x@)yiXe;=20Ki}oO$dY7RfJ?3MG*JwXoaI&!-uKXBw7gvPR#urvDFjl}+GdgO{ zDEdqS^!~t4?PHmG;EZ9~Ac@O<3*)ZWG?as)Dw&g&O(%_3t0FU}o}m8$ zK4H>B4_o8%X6?|ry1^CLTnWMGuwn}n^y={`)4XmjHT!w|g&BX?JFaE_(oLmH9*o~p zzqZN!%^WRqkjHAr*5jRw^f~(&*ZqV(U&Qi9Wp_B=C_*-^Q3GmF03&%N1$+!jtrCfuJ&G>Luc0D0am-FMigfug23N$-izrf zg6@Iu^6+PdHeWwGx<_5@(*ck3g)5Egq)TS)q}xd}^T%^(?J+jHOFK0ij=;mvf<84N z{!cgVthNbfgAvL{pr{ zpIN>y1FKyfL|;A@F`#|j{3x1^bR1W0KPos7m|pb>ce$h0Fqr}QBD`sA37!Oy@DT)` z#uewtt4`BDvl+*~O3`KrRFei&dd>!sz(|Oy4(Q658{QKuYePB*hPT()Vq{8JOlK!B0|%0#x?Jxq`9R^`}X&yds5i16VMl|K^@Z=No4X7}h!BWvI3lrJyZ z!7|$t3bD(Y!D!a)l{r9*&q1A;ZOmx-pk8(x#LU~2>cS`Tpk0kl0mMd)%)^1qS$Vhf zEBx{E2spaL+P(M+*JYZiL2&^ zdu3>#U5Q+qc8G^&q7-$I+l($dyPiVG?3TWi$LpU3huSYc;#k~?z5>PYVy*YmtO2ed z#_Ya(I>_sg$9l`NG4RfMsE-A3cg`he^?+mI)(phtX_5Jn5D+|JD$l^b&ok1p)N3cu z)iv#+a-|J=@N(6=aS4c!VGlLw4EQ-a<`pWPzg4?>>{Z<&c)}OyrP1=RoS8+h`B%nLIbreB8g%}kt8<^T&Wn9)1ipCwi>+v&b{gWQ^P zVzfajDpE%Enl6X)>s@2!Nn6?G338y?Dd>>9Eydc~qGYE42ds$~eGxX5EU8L-nr&## z?;tzUkZDT7EdBIaIk}0=1A>XAcej0b6)RzL+6y~Zy5TaS6_I6$2$2jp_VwUrk%%Fwh2V#!I9%MgCI#&gC3)qcK|;Zg z*qYqr+E9soeC6~l{XT_v*{6+;B#SGZhcRAwa#e?RD%_8=A5l@^pVn~ZpH{$IwPtte zS#juWg@0;kW|oq7b-230`U{|@$1c+W7;TUgBq@@s4+uH!UOgU@JC<6n7OLHnUzko; z*!+o*3vq8k)SiqVXjRF`iI@3Tg7?#JECjX_^bBF1j?{Jry*d1C6M_c9F!xO_vi%J(Kg*_)p5J9%&U{WRn^_bi7=-bpN^4Y*ffv!*NM zkpL5fXfxdxmzTz8P3Px3?!cm-pEe$*M_X-ogkA0?zytg53hK%TPx3@%IZW|fqTD%) zrEkV%`+v>0&E(40MfBXx4z9e|x@{#3ssN%w3*^@G3idepfphLC#*urkB90I{ujhR0 zjCz(o_E_zksz~9I3aCQ4?!!zA1LufumGAlzE{FrHuX2$)!4E^G{;T_w#VC{r z95=WHQ&v#Po%O==u=rV^HO935>?0n5F!((h6SJ<)uFU%2WG0vU#;*}W48!H|Sh;+x z{Efo1_<)1`vYL<#LZW$DThN_h%Cdp2`_B`17nEqlZ$FUBS9e>M==1T(2eEE!!_6f; zbW)@QtgvtW_4ikygI&!7*$Y3mNKS*F)Y}D=&kP66!@SUR6W_*T$~!B+9cQ3 zU919LZ^eM5xwPg5k|n3%>_hvuN{GW8u$h~`7pBlHeIAY%c{;QYh9WDs&NUmH%|={9 zc8;<3kIq$!^65BH@x@|mP7-r{Pq`ekP>li8&I?%|Z1Mo9Y40Ttbf{nIC9gyaXPy3h z8)a&)JN?vp_TYTE?wDa_EB3UkK!iMkmm(4;eO!NIaGS-sQB^_Z<6N&XknG)bj*fQ6 zMZ0&`dmJOvP!6Go4n3BnO0uzICN9ug>P#!F$ZO%?m_twO2+0u=iaUT+&|M*}I*QrgW@ zpy!3UTxu=1Ctl$F)`)4kD)oDoO0{5pb&LW`Uxc3 z`yF!&m(z`&xrbR_+I?uOKxA~NzZ51QW`DVaeZO2dbn4|biG95hu|WGgy~XA3K{Yyp zV>T!qaUWVcl71j?^E1*bPGIO&BK^!j*0HOAL(J6!3vD+SI){*nMFEX~97*RzS`O@u zbUR6K{hOZ+V&iYuth$+{tl9ze$hx|Q;Dqy}qf#kHS?8=rTLhzfh)P5;LcZ-K^pmr` z#q9ek$Glea(&9;!Wv0ZL`*n{N6t_Q~cS`?oq-^erWseKd7G#F?k z)_m*pN}D@c4rKC0jg6|GG0b;g(oTD-L~WR?KL}*V`gR+r7m=G+xm1^F@ygg}Dlo`m zD=t=e-0mykXQXP{N{|D70uR1qQ*gyokKGNzJUtF=N#YYF>zP=*ST6w$z}4uPR_6KX z$`RQcjhgTeor%E-m^)vB+FCBOscEJdyy8iJ zow<4zBC@!h(3z?$%&)g#gne!%fTe-xA3=^|JJ{rtL;|$j_>)l&gLYcF5v9a#i>lSWtHH%0T{*QxR<-0-%uj`|@#^KzxVfC0G2g~&-DGR)&&S|JDMMN_*-?k7 z!NaBHS^FOWo6TOOf9^9C1dEOnZi&D__SpDff^7imwNqzs!Rc5Fsv#If(?Eiim@ z`4v4Ws-{k&I;dv(!Njx^)4(_F?NnxDsqDV>7Q1e|ud#kM|J!=X8xUttVjQ4d^V++> z;Tb}~UX8Y&msm!CZJpknl;_eGp-S6a(5OB>-_d5!ohwmmbNW3>awcRQ8dE=b*Sd4A z#cFxhB{s-v0ePVl61Z50IjJ~w4qP1ITFmgrs%jozY@0BKJ~bY*NR|n z)_nfGf&lT8TiyZ(ULPBELpDWu@I|Euji_Y0Ny|i1<3eCjz zcN1>dHisqW>X|=i(?Zo>{!W8m4+j1rF`m~nY4F(maRMD)fbiv0*0*zpPD71GpB~+G zYBvd|s6?3XoJh_Pm8y&OVyqjY#h&CE<@B4U=;~aJ_Ndzqtq$M4?_eRlMi#4u_F$r5 zapMhcdR|MB4t~eX!?tM=ul2~c$?Pj0`-`^2gV$4?=_8)4+!D(nN!s(jDB!}qVtD*q zJj@#&txxY4A$a0=&YfwFz>rprOA4cb?cI8vpFjy<{lE^)l%MSlo?mnMZH8(L z3M}wU2|8$VCD3DTf`jd4(~t`M@AkRQ;1@f-@cQ|Xb=rW-4vT| zzx^5!zi*^GOHmTo`O}@og)2yRUQxK|xq1ThzV{>@y#*gwxO3=-d@yTy74YYmlU**` z3bN5DC#%#D;*#mJBXexBDRF#wi2h*1oI<182M^5=I)8QCp41tAmB@NRIgSrL2JL+_%FYt~VSR)o z3N%5(Ih5ADQ2nB>CdD@bjQ-v2(HMorXcr#RXYZx ztnNxe{1p+d3-5mljYr|iokyA^FPZYx_)X0XIrqQu&M@4B%BGzgSU! zrMv+6h|d%{7+_-4l2@s1ZfXD(WzrHV>LxWvi@P2Cb(+r1U|<1sUYO6E5~;w850Os+ zw=EcZI}dpF{B|){HE%G@lfbpILZd@9oekEK+IR;pUDqxx;cv9kv8fK0UO@2?sUM~k zm~%7hZ`E{-4-l4oTzqmY1{(FwNi;QAX&^B2QjOW{D~#)7s%GxtCk(pR{K@*6@|Jed zZAQuc=b2Ik?&pAmB7^u?%Q-pOmb>!C$}`kgke(2cGdZvvcCv^7X;Fzc3T}fYh5kX_ z_-JUg+8{ISea2-dG_8vBJz=v@?x(`7pdc%0$xpKnB_3omuA4mdQR`W%XUdp1O3gJh z5-WZcKJ2yo?MB!ES-(Dm^z!9Ty=a3Gb=f~!nJ(k|$3bVj8st<8-zW)kCH{!vpA$PN zyjcws?;U_+zud_6@j!)6y54>8Bq$&gfY6h61_#}8O9f3VTe7+kC^lS@y$fu|#Hb(5 z+b?}G34WBgd$VfgPeE0#*(GHr;z*2cDo7o?6-|HH3aBpNcg%F_hGNzoG|K(=0*&6d z*T`SIxfcizs{61e7mc+)mou-i{=tP+9Xd&K)-SjF0gOL#>1WqcACe88jnQ(spVm1R z;y=iJpfhOedOhi8TY2q@TMVEXO-%L0{XEOh@8tc<(6v_uZs81vr248|H$ZfZ|C8juoUelhFKl0SAs4t2KR#V(wi;K*d;B%s>}Ne;&_mH0IXoy z5Z{rcqIvi#n|9JutMjLHIeP=`5%&N4UjTl}rnL^8bRw<5U-nD8bVe#M{-&3{3zbCz zX}mh$;}dkhWh|8)X)b zrfQKS;MVUyi+Jr`L^1B{DzLT_P-l3`MMXobFSq_-l8f^%uM@4DQ1QF~qK_QNz)7zd zDq-}HNCtrJeBwc!&Ef4k)nu4=&c&*BZyq3B%KML3_E&|pq8FlGZs@u&3tDaJzJew1 z8ypjn2dv#K1zMJOH^_m$`G^EoWQhetB!~2-*2R%WeDA9_RbA}wUlZe9O|5bVGYLgdM6wMWzChT_cN^1^EF%GO4vmdEPi*2Iw-fv8=WwAza>h z<3B3=d%tgn{g>AdL;wAoxYoW0VLipg_s7R{x7lAT(TTx zQFs+jIQ&2ov;5-egSgojb^u|X6X|78oOImZ_ zP`D5sO^`3oh9drFSs7u8%R*(59!=-mK?Tf_Xh z`as{ylOe*qQyE-`c$|=8{qj^EekiBqM$~Voz|~sVm*qP=tK4o2W!P6c4I zqJjqMgpD69aQE!!g-a8dcWFF7fMu$zdfHvi2|JBN(tR(BPg<%wcMOD}%w$2DAI{S@ zv{L857Vr9@^J3(Em9T-?Enj@c(^luv7Dru~hU0Pr8Nkpo4yk=1egRD0vk%sI@T$z0 z-?}zsFEztm{2ew9bR3@XT?5z!Zis2#3Y%)uFm)#H_3acp5fF0ORH*k+CNmC3r}z3p znY!u+IbBRlZ4UVMc6waEOHKlQqUF!t`GpYO9vT;I{_LhdJ^w|hh}o5_2M#PG&VrHr z?j*)XJMwSN)ZE~2)XEW1pL!ADNdQBponxw*lvCv0>c+qo&M=gmCH$*e`bhtnC1$|A zy=2?S+U)Gfh)jwpcNot|*O(WJ;l26d(G2T;&U=2z)o z{P68@XJ)L*F#yq(PXq_I4CgJH z{C)j94XG>}KJ%}Rmx;*E1i(@UM)&SHe3;O!IU6Wkn=%;kSK6+>EMcVL+T8o)UH?J2 zPFVp|!7p1`QgAM$Od~Obfpz&pKaEllQoYCtHJoOV(Wsk>&4qt8eyRJKFLUkp%_;+c zhG*>%8JFTlSLotuW~z_{nF4QcxZfgLY{ZVA))9M}=5E$L-3v^yEkBf5d{F*}Ctle? zI~Ny(IPEem^Z@mPxP1U3v#ql_@T1jVX&XaT{7k5!TYi8Yz4BG4!-UBBQ03w3mB54j z#KEnQ$mLgSxygxS#Di=%RP`HM=ZeqIAbJ~l)68v3*J|g(sePn9{a1^|lH?=&hRm+E z@cc9_x_}vxWWhNfo3y(|N@CiWKriI-qM%9&wk_uErB@leScY((w12(Yw6G$Nmc`h^ z_Rsq)r{LrHA2xi!cEUiR!YZEtz4j-qXBUA+~SVgGTa``N2$TpGQI0_gmGkZpU~3sEwXcEX~svL&jB5yqIZsc>&%Z( z*YC<*YJflo-1t!woag-@DSP zLfp#lnryE*CXZm>3g$h18(+QHYIsijuChXokI~6=Ge*U&Q`D0?&~54D7%CZc(o8Kb zRR?G}_}=YkG4IYRc{U4!$cAX!bY^BOnzefj(s*TRD&J~ma@Jhlc-Y9tgSO7`jlP(c z7hVViwyJEZC14M}Si)aiLxq}Bq633 zFRkGA#MmxtQd*eQuHYiMi3Jz;d0D&CiYvmu)gU?Dn9I4Qf-?RqB(heUu{v&W=jM;b zG~3|F%i0fTG3%3qt2k3ApF=(?dYygB0wj$5Q;6vw!bzdi&}2g%jsA1?3bCZIkf z4dA94J`JhuwF0l88)=2i0PuZyV5eEnxS@OnJVZpO{Q%ZI<_FKqUyGGoaX&4;9+NTa z(0OwPKGeH1PFq}tl*aE__EO`*1nc?rz#oXEZ|WIIB_PQ^SCubEYPsH_{A0x@-edtc zTl@68(*|kU715J!35iC(S6Ep)qfKfh2`ug>BnyKk6)`Se@4Dcmpz1$X7Q+d*uV?89 zNh`9gE@=n0@f-P8mgF5(A4T7aDLK0R6uK~+dE9(ez2T=`y%fPeVb%eyZw|rr?aZ-b z)Etpj`xKj!s@;&hru(l4!(tDAq7GSv@*6RG;*nl9)!+hm3)MmCa@a8vUNzWRnIGy0 zX3PN$BDSdgxbDuqJ|A-|3iCvR&PLHr(5Q-pnr^Fu{wn3#jm2MD3xfO6d#f7ygZq1@ zt1&AQduCOGEHucr*&&8zne#bVp=5{l8=NU^11sN4ZZ28Q^w+JSA~t~^VQNDxJ+Hpz zopD)5NdzjF)F-YX*wh2k4GFu4Ya4N+lv6DwUwEv!-mAG91DzZ&AO(EVSLQSIPI1}04$MVT_ot7S zl|-5KC~*E>)!vFq+sIp7(Fs^AHs5eX|D-*WL8?c@U*s~9(r|JEu&0Cg|uwz(!PN!ehirYrWM&3O#m7qslJLb5hfL3{<#$ZgX zNL6<5Gay5RJ|B$bsrT8~(2oCgfuPoewGy0aEAnC(s#P8!nGp22Q+079ud>P8rG*h) zuHIo{B<4`d_%_I-Q05?~(ooNhldM0!-_PgUMS;hHm@vBH*(&O~po*(lhZ2sX&*L-X zo+%%AaV>2cnyCp=BFfBFo>rxLmhbdS?Z9U$frVpV1S=qNx)dptz6dw>EW#%K@{^D4 zJN}8nVU~H)%V7YPP6^{P$IoV8#^aHx5aytrcaY8m-C?mkFdC5AzKIf+aFX{2)w)h> z5X;cT>>{V)EzUu1r+z8E{e|t!^LxwUnF2%Ezo5DM{wZf#hFW({i&F@@T^OEeAs40r z+Q9IUE}39Ay?jp=6G#1#RiD<&inUKO%DJbGcC@Q2va8K9ABip-qrTM08K+|He@Sf= zs#YyN(pxuo#`H&}aU~t4TGs>0CB5{zV{yIG5Fe|SW8S>O5t{KN7o;iM`PL<_!X&ZM zdfZuiQHPuGkk#BqE^Q*>e9ZFxnFaYNsCQGRJVLOW39V{X&+OHHsT&KDs{EeY$HB!=2O|@yzf7A@RT}`$$Ooe=} zVys}`eOsi-`!cyiN&|0u<>Kp-39p0I%xi0D-Ic`n)^GbFaCtI9vRi6YXCUOvCs~8N zvPM1(J#KuN?tJsAGN8YwZ;P>a!gRG0m|me~PtLn+((eXB zCd84H*gCJp5=vXp%G@>-kW?N5*#-G!PYUE*Z`88FulE5=B2*BJaMJ8f*ZEOkxI=bLXrC zF2A2<+QaS#RxxrA2gA4!a@lMndtCRC-zl*Z`=6DHU$hp(N%$ovw=N#$cj;^e@lRi` z3|#Qz*enW5>$jDz-TdpcNn*SE0EP`Uc<|Ch{#zTkCy&6fx zX70zEr6*{(Odwd*uNlq}$y13BrtKb@A1I9b`XiyR^>^W3OBGXjD}+eEIZ;%cZ;@TX z4Ri@b(Q)c_;S2j9c<*`(jJmp>RVkpI+%sSi;=QFCH0jLiW zyld%K%5wX{5&@Wq81yBQ3|LhL$jQp^3u#c-#E6K{UIz$T2bNTjLRDfC_!w0stb{A- z-I++G&0NGyjosaAKWEC+xndOZ$m!GN ze#;;&4}oRt3Xh+lyF+yWZ!?AFf=uzTb21bD#U%~xBJOv`OKRdRDO;_>ikMb#4Xebt}Ed@Q^U%mW}bM|OB@%`)Y=)f1ER=1ZP zg#25>o0~>}D=i-AFS+s95pGz*zW)9);&V&OlccEg;Ad`!Qj@m+{&!K$=I3)f5%O;zp7KoMEK@OS+fgIGgTG> znK#^l-f~g=&$$0HgLk2)(yY@Luh%H*k1FetJl1iQ(1}Atc!}3%`qdZ`dD#dN`lFSw zXb8gc@^I7SxGkVb|1$_6iA#NjG@|WVU2?dP39#XD8^#(oV*ZLtr|Ri{s-9lh(k3S-+{y#OPsXSx!hyMiJ2S#H=|w)&>M9!Y zGJRy^-Jb9ihz1&YQz-oN`H?W*3>^PkSUh|F&! zMs@cOz-u-$0y%6B$&X&UVbM=0jqLfuD@L8G!+oQF_6fT z_1&}k1!`J!{$Ioz^S5GXg)z97@5!1Zto4Zx?pBwwYEYh6=Pe{~P?mTL=QXaxyO=t2 z{`375v4cPrKR=t4l42Pzbd=7H-1KMLQkb~*)%nIP9P`-w7#--xNACFE_<5P(RM`T@ ztJeTR)&En>zZN*^D$nxr(k%Wy1}~%y?i*}H4OA>0i#mJ;pTGI=G?x?TJ$e}vRW>l| zrt=u=@a#W&@!vH37=6g8 zpZvcAc*g=LS3@y}D>c>0m3N)~-(95I1k8`^BL~pj2avsqtN$i>OJD&@Zm!X9n|6RlWw$F!i0NnsE8V(fc>bT_ic!&^ zyF(?%+ZL~NIRzKvx%4l0>BTkSVz-=AXQ7Kz&O`NyIFE6WL(jCG2H2j_W4Ud5PdpNVa^qVK7RhNMba{0l*r=d?jU zq5p?*S8*yEmUprsl#3@|kv?pt*DikD`?u#$2?Mq@{3s*i#ycNMT7^23p4NttxgP8- z1%Gk%|7_L&?zwMrl)`vR^=E($_(^41xt~6X6~U2^^KbYsN9f(V!}gE<0zmx)=>D;M zd(Av2UgdY{UFm@_lX%68Syk{I%X~wrSA7}Q|GSQ-Z}Ynkh)OR&B2k@3nljt1M3s$z zE}rXdBkZH1swTkS#h-Zo%W_gutH)4Ca-X5T^j)~H>3M!SQ18Jd6rqS7NTOsJadvU@#^*W{r+=1Ss22I z1}+FfT_ikiA=ZBy{r>O#U)lk4KMv}cO`&M4YZJSXp1C4DseN!*TTGkFl_^^=9&~@M zdkZc<{{8(?ns|Ael#V;ztent32YyZG*(Soz@Xts7$70`Xa-uFw?a!Ucb|-POSw-j@ z)SZcf0Bd2?Dir=x?aUM1q|K$+=*LFB0otD>D z-lR=FrwGt$ktn`HJGY+Jl3so_7;jqX9pdiXDs+n%6wZM@c{RBwV4ubkskocd-TmW7 z`8sTMd>Q&w_aCzdVygf;fDKR{#Xi7Ck*{&g%qlYOF4@OTe0!gzVuVTNnE&h74UzRR zbb-Q$q8rC*v~pOUaZlz|n@gYRX^ZQ|54-3yW`hrVu1VYfOUpHiSjp2y222sHZ*EcK zuX8<&I=oUX)xXSto24D*Ge%_S6B~s+?_$w@{aGI8W!l_oGP%6cVR`}R6ZV@bzSuFf zE=1}@jXBG|$(RAyeB&`7+6Px+hM(I$wB@{caGXL*?X@QDWj`I)$O5>I(NiaVF4^;k zy?}lC@x0j-VmUCTmT8(UqU+M(0H78Bu}A-EF1D)=tQ!E?zl$`+!_PJzKK=Q82=TSi zCeExQR7c712}T;XO(!rs$gjF7Gr7_WIt&v#qSYHCp_`*LR~vGb=j z;E|vaZQtw`(;BLEt+nB~bkLh}OB>`Fg=m1&EZarzb2ps^EP!su{-UQ&wWGcTRGhBR zD5bARN7+uap~V8H$le=zKT0Y#$jJzg`}eOieI29N?DLH#9JMd3kkA)u;+E6H6v(RoZx5J4&O++s{-g{k2v%t%2Rz z{YsD`_JCesuzmdF8ur(c6ZUtz_8_Zc?Uy3G#RIGi7p0`_mL#pP;|hq%S5c6v9OtmH zaVwd~pkIxS^X}ke;=ShSR60Oh4{JNWykeqn_L%Ym)mr?-JJ#94GH?dishqdh?*3+X zc>E>TjOUU$*r16+E|+zsgr1p&g|m*Am!P1hFA+D@?j5CuKoQ(aP*SfC;~fVwU{#)6 zt^#-betoN3eiM_rD>)v|S++!pGuzqU$pMjv`}!=J9QsmFO~aqdsah{yg^-h8su9*} zYHBc75+cUr-rTkCSw(;Ues6UArOdBxlBoiZjSaHy=2;w391K~427_u%qQ{zWq`fhp zQ}XcUGvEwX-lYmu;nAQ>47w8Mktw{C8PzZTgTYU!6?7_0o#JU-6mS7B=@KTKI-q1X07vhI%3PU4{JEB?7oY4 zq*I5p-4bbw5GYjQsCL6tUtTGDk2HcueZ`c+hYH6|f;M3L9bqTOhk{4-*c!$GMVeii zkXoY0Do9ff$}b}W)pOoGplGz+IoI!>0VyY&U3JT+Xrv!YEbI87Ab0J;3(vOqNUriK zEZ4Xm)kyfa4?y1cm=Ew^ycO?9UUE@W*-;Q<*sT}ah+KIg<$3eb!FtN;DkXWSr6W4n z!bn7Tg8wH?P%}lO&rFl>fx~Fy*U#?d$)sRseg0Fg^_>ePjj)*65B%-OZ;Y#=kbsE_ z0~w*1L%(WA_g{;)L>~E}T-!sE-`?sJ!)#=Au&qkTL~X_b;UlQB5o;2iWLUVJ!6Ixr zQy7!T-SIxLiP-UwzYQUHZyZ~rLp~uDpwINAq6+PNyAU^+-tWiLn# zN5z`vFH&iTLWot@BCiy(Z9QW#s;2m{=;;#*mVadW0&-f1KA=l zc(Dv~Wd4PR2U@yYQ!Ye5k(sNA{#YBu?0$dj#s~`~sbC9io6AYk5-fyg(<>Z$Ps-9O zpbg9d*QS{X6!ND+D>$XzSR_2=q*kDU)Kqt-A1-hhO3!I{$F0uQ$1}}_d6E*@$I1$- z!M&ZLB=Ior@~J~B0}H~J>HZYAWI+gE(pCCtcAsvs)4b=e_zf0p=F}Kx-|PN-!JpH_ zYj=4xT=Rwf2kk}!b(sr?4?^CHuk1j?F>CMLXZqq>7F6t z7fi6Cx9g%r9pX<`&6DB~D|ejjg}$|0kmMhkM0XmI5F0Zs4aoDM zh`Xl$jr6Ba8`NC9m~iP~edpE4ORWmtF_8|l6AWZ$bS2x6={?V%BR?HYqJ!@bpCQ`# z9ylpHYJO?tn^Y5Y-0I^Oc#AUj-un~=s`Fp8fAHDtz?6@;Y7brYJ;Zh{^J-*KetOa(xr$DMS+V{2hq|}y7u}_Kw^8^ehec1@l8%E1qncW>SgxfDkHEbnw}(0 zZXoZ@KNURh=0$Z-Xxhdc!zCZI8rv4MMt80?Jvn>qmuqTpHDlAf3GzmsHQH`OLpMZI zUYPE}g?9_EZF%j!-N_%($uC}<)g*1BBlj`;^`Se9YX{i(NvNRxeX`)o=+}lzS;Uq= zNo^Vv?8phX@FkLYZwpB*-nIZc;orJ_Z5s|Ns1=OyG7VZjsE#5LF_Wg7&IBAXeC0Us z{Zbn`OgHD`g7R$WQhrI}Qye;9Gc~-ve^`dH)7*Ax@p_qE@mK!!!?Lon#mw`$Gi!Sp zE0b_cB&M{&8;y_qbp6dfLBawB{UoW>qci90d1qgIL<*r3?*B>9)M!akxG+-Xw%r%O zH4M>;0XrBxkRh^YCgN#3FmGUIq^YbtM`|VbTUByUoi9zGF!CwYR5loR%k%+Xzq&e4 z2cFc|GTA)Ld)?X*zd&Cb95-wk*-Fd?v2jEM*(nhZBCEzf%x`sXKRAPlybaj8SYz6( z%P=~k?YxK`cVXSWR~ud{I6i5i1x@ES+Y+!cCjBhLORiz!+}dTLj~DpWLG$+ca|JNh z#twK~3#;&x!{&Y*rbWNSEN0@`n^E3qo6QQ389xM@)&7oP5@Pp0IjATbDS|`ohj5I56 zg7^1j9MYNAuCK}PW^$YI5Va)Sq%7GtlxPh7(}F6G$+iCb=as_8t_lnxxg&Q+J}Wc%zS>#MEWI;%o##-lI{v1V%G93^#x=*UkF zy#iDL?#4S)svNI*L7K}Qws&ee1cGsLJE_B^%90EZynu7Q%&IxEeVEq5%qq!owvmvP z&{GjPOiNR6-J*F@SP?ub$qYP9_)fs`NH`%@{+Jva7hWzf5)6iRvzLW`hzn!=bd+{t zpBRN{(o5h?PO#wCS}C5`16EQ>IvCV;@TWQ0P~j<@C6U~cJ>7yGGeahTW}!NCKDJ3=zT zYov7}c`KTLCi30=EDPMhuqj)>Q?*0&sE>Do0be*F;07d1&){ghDteyK`se|+XX1v9 zPFgj-+*XXXr6cg;RKA=D2zA!T2Z*S2DCCY)uh<~83R9Aay45ewNaudz$3axyi(7i+?8R?tuz zbwmhDo&2mxA%9NVsz_5)r-loD+trI&Cd)D@XQ9=WGyImQPUDAql(5_dA|`Wm4Yk0 z)O1Mgu124fR0$Gab7kL}xnK@Fj4r|2o(cY@sZytJ$T5^z=p_CVg3KTr6&#~P%oe90 zrZufvy|trvp^;^DLdI@kS2rHo?x$sxX}ru0&DJe!ErSPk(9YNvwv(52D^O^kvfR3M ztGEfv40q!noOGq$dtiT5`bl`0;_(P((l388oD0$dvfEy5U>;F4RVC2$Bcv29m7l>M zxr%Oq(Te%se1Z#bp0-C{*PFLb-f!FDy?X6i5K2cgm8gScW2jixaifAt$(Mq0?6*3} zxX7gJ0eP;4knM-LCy7gVK9)%Q-DJF5N?pOL){d{po8k>2b{skGJ&iPN?ZsVn`#!Ru2 zOdo23Yhp+Z?N1XT@1}Px0ls#;zIRPj7p?66imnACqf#`HJ>|3QkZO7JhiW&&99UHa z(7@awD@Mt@?(v6BZjckhc*3{$PFCDm=T^c9y!%;WBxp4GL;|yRF=LT0;iup=W(X-; zW2Ko+DR)PAlYe`LSj-w6 zoWU%$tTe9f_wg6#5ImrkfEBlz^ zK#ua($kocv6vz!|&RNIAlUc9FG30xQkL$HyU2;_sZ73#yb>!R<{}D0!CEn^j8&ja? z2zCJmdhP5U{?@q-S=Ay~b5i?eCf_pJ7==h&Zw}6`AchTWc7@g3L6uy@O->Vdr|l0# z6(1;$Yj-veRaDz8?qfDy#t9POP((0qVxYS0| z?8L0my_V^>qJN-yN_AAo&em5A4gy=1vJ2;>rm+M5tF4%l3yN)f*2s#UI$Xqtex}{n z@)UL>dwX2be{s;&kW&USs11}>$F*}(z>Q(O`f;Fb_y-%f4)%^Bq5J!=?QuT@L58Zhi)W=)XQAkWV>a`5d z+Pas8keL4&b*4t!BGfm9{G&QkS_KX|9e81T`yrS8qBY^>qp2!fvxcXv5d!s_knbm4 zMEc33?F4qnolb*17O}+O|#rCw*EN!3nL)HwdLjBVlpyxPPnfEOzfsGuN~iVLuVP=gZHktic|Ei%1?@-W8U|N!nA4n#l~KC-&fQW zIG7m~@bIsygdTmHZF0|S`B@~!RYgwqQ`C#ybw{4`2&Btd2BBO_f637llZ%$V3%LG1 zwXg=QSRswTUqxWlJpLm_tE zWNtUo1)GAijiY8@gcXYDQdsUlayh_=@=z1(mBPkUAZbe}_9# z>uk1K^gT|+49LkvyOD0~rJ;8P#VHzW^5sBlkSxV-1j$mgO{x_R9@`H^-)P&hF zD86SldV06xs96j5T%`!vi+; z8s@ohIPpbdP*Y3@s248{%J~H}vV3*vo1QxO*DDpol@H{MHS=*lFcO|s6_i|SULQO^ z2_CrL9QbPf`L>}+a)6kb>QOP{Gb?U32}j@26gGSL_AawlXeN<2CI(I&VBdveS#8yB zBDy*ZG2aZgRBe#f40-@YHOs`*>+-^z)gLwViqf>;S*rKe_ZR0eh_EZv%#RPgh-lzF zPsp{X-n(+^d`;{e9Nd%cg6*814_1!C_T9rjG#BizySv*M8LyU$Gmbv|sn$4SwlocD zbkd?nfR)XpijUw`Q)`QYkl3&_{SkMv2apvyAI6Ox??GuMT|d;7NKDvQ2}UiXjh*Q3 z;lXXTocVQoGZoH*JD(tMtUIs%Mqo1Dnd9MTP%nPE5Z;tP5H2Jyd;c22EMy6mt?y=3 zw&3AqYnx&+?W*qHt$UO6CfL3HhjVvrp^v_R1*k7Aw*#e>;auOdR0VY3C;ekpCLKc; z@Z35qeWkAx!o8>WPT~{M>~#~Gu*kh@@YJf;Wxg$R_ZdCUODkKLH;07SESPT~UXFh< zF+OeM_3(!!5~G6b4jx63lNBjd$-~_Mbh__FT1vLyYOBt zBZFlqTr5js+%^K-(={j;T?2kRy-Y}&NxIj*1ioE-@&%*o8rNtEH?Moo-6yCJ7(48r zs%|6nZHYloQ#Tct-{x&8Z9~XX0>b1H=1#crnz$Wx(}WHFoNLriWt=zui+ObXr8?Ez;ap!vV3Fwa7mf|y%XM|!OQ2M&U3-myF<$DWt;p#{L2Yxk%1UnWa zd^Ti>koIT6_k=EWKm*4)ZuGY57Levn#z!u!cVEl}^Xxw9b&V7IDF zBYUz3lhmwpKeB`+H!ZT=E45n(=*%>tOR1p}%=B(N{9TMEyv}NG<{b)3-U#&X;&a#P zR>C*Eu{1W7@;fq`9LgEp*;(WJ^+bjyFH*_{-}Q5W9uDbRxN@Gj|94S2Me>!(Er@_YNx2=~XPcNZM zS4I-ZXJ)ABtkx0j17T*$56BwM14vmXt=EcNbV}Ib zeAZB)6%yfPzg2N_E%N*lBdoVEDj$S>^*u8vckxAhPSAV;(QvM=DqU6*W|NK~Q{eS;O`YJs1r)uW1wae)tHj znP!%MC7{|$Ey>?dOK9W_Ju-Jn0Zk_=blb|u*Jk0ld>9Xay6z+psj^0s`wr~xUrB0?UcQjq`dExsI)bG(D` zwdm2yk*qY@Q4wa88NrT8TC}IdNrxR(qUgoieI6^|3Y#A!Ie^A&H)XjTd*m5O9%Lxp z6POFg4Ka{&^r@i^$qEZJj9I_85tK5?GzPB+0?Y7ouPKlx= zin}x&O^_+yM-PA|3Tkmpq^Xzr9K6k+bNgDQe=RJSRF2qypQN*m9Pi9Cdq~}VJL*&r zx}1alxxD0n+#hEzTg5g;W57B|aX{i)5Kz0*t-Erw@G>F^M1RJ@q5zR=N%lV)WAMb> zkS`iyH)-B|*Ii!~9;d6iqZ*`spPqLoi6(Ev@xcNz`gUbS|H{3)f~Qs13A*JoEwt4y zxQUyQK_MmiEHo>>jl(XB92TlRJ1HT}c6$Dr;2hQ4!6*&Yz>G`-L9aOvy3TRuElsWa zm@F}F@r?;|8=or_p-JgjuQ8ID)Zfm-|5{ue-uHkuh*Xy+hQxy8Qdfss0<*psiUW0X#BvO^~X!#D8S z4}h9T0b(+m*Q-=w`5>f)v|Sd$GZc0vm_|!04~(eJ*+*!sm^}NSdu>RXdlUuUgoEN8|3& z7)ZfBKXp5bUvKGOVxnW>|2 zWt}ntrQOosB}m*zPx@x8I`vJA5q{;pL$WR*GuV<|+Ya0mETVnT)MeBau88Na1o2`# zYse->bI-|Qe*2mhd<`82ul0{>PX%lH>Ixv(bSmm*!%F?Blgl60q8(|fyN_K7Sb?ni zlWb#S5B0Cx$KCZf;b!zC@$oky)Teqq67@Zn!1Y&-IQm$LAW2#Bb$QRxF2#?eMmE67 zP*RwnWoHBR87?m?t_>71 zyIXBlpNuEhk%$DVs$-eZ{%f_lo;jhd@)4^uE&eaAgf2afmgDkw4>tEvk5eaj7jF}c zm5U3cFqjn)hC7+vu2W zSyN1~tR?q-l5R|^6uVEZ#iQk&)B*=b$HP5$&X!vtN85`0Q%vo=Tl%aK&rzP@Fadg? zbEVi1(xrFDV}h4sndz5@276*y4xXN*JyHwPpZX-uf~>3vxz|?FjyqoTlqXQ$3rL-{ zxZ5ht!a4d%oaOn+9KUWCKRv(M*KPkEyQ zDg+l;xM3;jt}7MJW4BkMwYn(@Mp#u z!-^V5Q4l5R{i=iN6sd5;XjofG9}rYtUMYXeDZkhGGSX%?PdWNTI`P-r3-#ptfl*or zi4w>5Hr;6Ba8bf_?2Y7*#M}E09B8-Sh^Vx@iiqH){E?1C-CFm`E0LsC%bMSnwe6nM zAfYVlY+)kKD{^ohRPFdo9O&%)S6?4O4rIb+M8tA zv1@ds#D3>Vr=N^X_<)1;z_hTkMei6XF!wfpzbasS&#!L1kds0d8dIl;ZWb+ub_j~e z99=w`Yhsved|hhR$!u=k>@x#EJ}?!@t(xVfRLs*1luJ)^ubzD06g06n8y1MH;9&C= zI+sK7f`UTf`6G2z+m}u=Cadi)lC-Hz|u$S$f{+!FH`= zAzNriH~ncGHhd+}slAObVvT*n>>zI!O4dVUT%NX!GRdB;^P3&_OT>LJIC?wqbo-tb zel}JvDegPgOsR%y8&hS>udk<0&JnsPWS0uPz%&a5=cy|ITA-tz&$}}r<@(~}q<1x{ zCiim!{_v&kPMxc3?K#+PtFmof@Xpuw`@RLXtg|g!uwKi_RA0}{t5w_UNHINd=)Nng z3dYkS<5`c#i^yl=vw_45m=(BwQpJy^-Mc!)O1$jGJ1R<=eC3a4_CyXz^%qeJh;)&z zCFY5e5G}$AyW&yWJT>c;2tCzvUmy0cL+OJ9Vww@)FnbApe}%w)`X;e(B| z1W<(TovI(S?7tm;d@TkOP+H(SS5?Xu0maSb&Z7d@P z+0EGGhxpu~oSYn1$%Mr|ar1?mG+bWYl51F$*--+H?P7(HX9-BA@8AvH@7~*>%-4Yg zv}e@-)TBIkX4}MjCpB>A!Lvhn|4iNolT8aWVOyYkPEQ7B8+r7Ew;lZ+Pj@Hx$AQf(sUI~6o7rA?8HYOq>uqhVMPa#( zS(zN7J988I58r~y1<%VE3^eR2XdpJ7Z{|1Ht{_Y|Lo4^&jjMaxqA}7p0jHi&gH8$& zTSytfJGbLGvJ2Q`tMRcdUWzzbr;Z!MJdk~p_w$UOKN@WDP7}L>0`O~_c_%Aw;k87GWycAZ`J{Z8P{Md$E={zB* z)=2g&vncIc`$$)BQ}*N6@T6>+mo_2#F@c!k=93J6Z_-3VO-H@+#nakvuaSLCa7cb0@V6$9Koh&Lwa zOSr48L>TAIUqrTzR*eDuXgJ3%QPC#4vL4d|vRQEg}WjPm^YZ zHdF&l4~6elM03{iwRLcs3dGW$no||_KiWaleHXl)TWloo!JgRZ!mVLwUh;*dM#gxc z-UGiqBS=_WauSSo=~$Z2e+Sg74|Mv4)oA8~o}8=3feTf)J zk4rO)*8S;MdOhh~A3xo%j;CG`$n^H&eEW8(D^oLeKOcv}%lu4lO^se~wBIve)t&VnR*I0_ z)C+D`b^is*-+EJpqE*{tCE8HqT%o77|MMxct2#Ayi%TGOgN_LJljT$vov%NaY;nJ1 zJn)qs^3h+mvw2%3yQ|-n`LP4X+JB+be|-BPPq`SgXOsE3sFrRSod%@}`q6$I%OBCV z(d9g@!IU?M%iL#Zm_|zbgY;>xH ziF-bsilgiO7{$_3uqMg+p@uUyMzJVJ!__kf`W*K!@5sLjU~%+PeeYM%?AAQ`R=;+% zI@39NI4-U8$YitSSAA8~X@%a~%gda@FYW;*uo9B@`0|GuZipwQl|C>S-*xDF)u)<@ z-$g`NsP6aY;d!oo7yrQE{{J7xVgM$Q9I4J=Mf*L_V#>m9@;X9!u+4!KZON%M*7E?0 zTDY2FW>XLAv)p)I4dLwVdt)}*l+LtnN)c9CX3((JpBiB(R>-026n}p>f06#p1nLF* z|1K%8u6;~E5lF#Z3-=<%6Rm%)er=o{jAUKNsEKajun0VyIJK_UwvodCy2K7ZMAeD( zu3#4ir)7N?22;|5f+kl0z$R8t{9;*A%whNM2fuJFOV~q?I>~A!lYc?Y%K;3_)^Uft zcRGMMw}YOEO*yV4*bN9nq9wB(!v}_Qf+Jdt8&)ryqeB=JSF_OHzAa+OY|W~y!Z z1<%8zFCV5l3(?$Hj&L6$S`Kk`mx@}xCz}Fm{7sslW?zHOR*pSTsVnoA zk&!yK2N16pbu#6Q^#6&3FBCq_N)`9W(lP;Y?|cmBCq67LT)iueh($Xqq@-|cvt)=U zRr&Z4;tCfOYAU5WKp)Nqzw;#wmF3nG7xQmqPG3y%yEjBFnQ}7FrbMe`BI&ucG**o> zX8r#PaT*s>UwUZ)l#T|CZ|aoBP*o?guY`x&@;Lhd;58K5$WE(I_kgb4l(UfIE9R&9 z5QJ0MIOm&mZ_fVq>&x==dW{-W&4FgsOYcM#sRsi@_58=@;}_oOX(zKAY5&W#{Hdn$ zwe{Sn=Y$IjtA6*{v-6POuWGM!m;NHN|J`4{ytsB_F&UaEuUc*`CG=r8xqu5#3;WW$yYD_MbEGBPz(+5uuvhKr!26dS*GOtyzNA>(qgJs+B_S{7UC)=x*8=p z9ono>w4V7oETC*~+M}*kT8?DtRdCR6!V(H6oKfddItGaI6{KWJ@{O2awtKwt- zcvZ{>jRzL>j*d_LN$+m#qXPT;V$B58&JMY{h-cuL52>~t^cIqiqtLu3o6`PF_k!)9 znaxt+jtkGd-b+tVIonCp|yYov6i}R}18=T>zzhw82 zBNhMw+daQu1k;H>6RR@+nnhR$4T*3bhi0<&{;4f0h0b($`fHu{!c(j~y$w4LQ`)1B zI8&9&P7sxJO04N-oXYLhxQ(JGJJ>lO>sJr9nt5$e1_`s6e8f%*8^-jC8&T(NZFr)0 zp(%YPB#E*Iji+rgPBroPMxh;*ZBfpQ2gnlMTw)n09jSTfdkQc-{c9MALgvP5Xe6ld zD*o&Rad`B)=Uy@@!oz~_NEmH3vRtWs(ffk59XFkqyn~?fmbhd4fD;QZIT{x=3k!>25xb6v^0wq#|2fk-$$)tvBjTFw(F$~(8Ceo zk*+ktWpCA0u8|>fySnmvLCWD+I9Q?P55xD(fs!T}fh2#l$4CPor9wg$)rfu1+bO%1 z4b3xSr&~pDG94ynLDrC|Uzw}~wn1c& zS5towO>VhRi4vy&wyqvXW`2;9g@rLWEDU`v*ivs<)78+kitSm9(hsf?0EcT}+~E_k zHn(#1FGW?Mq84pkE}kLaQDR$X3rq$To0^(rZWVsYs=qBHM9kB$ODJE(Vc}$d z|E1wXyy8uu!>Ve!Yp8w=0h}eI@!Q`!x04q*pPqHOp=frUb}tJLbliq}e6Ffp8iPq7 z;5$>c-tgw1{Aj2we9V~RC|C@-E8hn2Hk^>eUf^(?^}RodTtQK}%{0f1^Z$Bo%B)wb z1otxSQ}isK|C`8nQ%eO1mzX1z`iAT_qPdlp3!jPlK#e{cM}lQ!WLVoAy=U7GAJ)_b zLgznD=+Z@VCr5nyTRX#QPxY@QlDi-Sy{BzqVQO$PL6iWhOOqVlZ57q6zlNmnC!F>7 zgU$62^h)9K4PJ}S?QlKMm)zOY3WJsLuA)EgO(n6kwz>ErrCevPR3-mG`cavtbt&CS z4?`SALg(m|;9!C;0A_fq{^3pcmA^C}pb!8Sn&Zx@mz_%25ShBVlX0h9hp4r&ofx=Q zt~WDUT>rqCIo(XTWVFcXWd1XgnPJ#Md%a&b_iZ#+P1Kyzy%l62=cKfQEb3~8$iXwP z^-tE@oNn*`Qjv9ffdd88E@ugb2LozdON@<%rIj+xtFvFJ{(iqoAtxo($l4Ddf!8sf zp3P?_)7odJG#7NyJ_Vj;&x=d74n#3&Yr=p@B}x5~R4!$t?&WXql)PP7TkjB`&T{Z# zaY33pCB)$!V7QkQVQVDE)ai#Le1FFEjyCFbRfZCXK z`Y&U3B$k4AS&m|Evz&_V_o(8_P4GUnu+N*wE@DlkAKTqBx5sxJ>`=d+505G!*3ZQn zoAmB4Ob%Tm2W(Bm^T+3??aOCKeBWmQ$9<%~XZkatt0wtvyPt*ckZ#HB8a5K0+s&QVfvWIEu#DA(IZoP`}xrvXz0srMRS=;5f27f zB@x@`(J{?+NJYhYg`Gi(gwQ?K<>O88BqQ?W+9t*2Ap??Aa5=5PrIV4z0u$RUAI<7) zi^{Y!Clly*t5-W7&8x20Ql2^6J`cO`yRYxZ>;j@Xa_f?!^1B5HV1FRMN2YD*!(Wul zzbVJ;P*cIp>l0SfEvBaHb=w2B$t#JzGj#h7lEo2+QA5MSkhmN8r6i{Qt?R!xorz_E zCPu5N_NV3qOHJU0luEwJZ)%l)CK^7iAQJkz>%Tf9O_CxN^Kp7Me_6qX7^<(K0FKri zEcfC}l_gxGYY84uHd~^ZtfUjWBnwbR6f8D+XJVSmD1xVm33+!Pt-{aC{t(+&Rn7N9fSCLXNzkC8{3KCY;9R$fJjE0?g<_m;Wd}^W)C(#IZXHI z3^Gj84OEF8+-VH-d?*t+$}wKSDu z=@I3XRj>JUs@oUR?A2;9PT$yWp=?{t^r|(r`j*eV~66GbaJC_tc@5tub1HVTXeci;Y+(rhs zOuoT*4hfPC&s-z0x{n&ZVA2;dI|k>#uzCW>qKy5gw|+K^?O zAZr=_ZZS{!O(WgDt(7m&I6zHLK&mD%USF9n zk$Cv|%O6tCi>!C(iR$`D9pi7puqWAZ5a4beK4m83$swwtx(Ttif-*q#yHx&&m>Ioo+8Nx zL~HaO0hGeDcsrpy>!#nXT~Mr+0r3YE-N+lGiEZsqktZyCHiwOpOX(Hm1)k|d3-b#VkVs3yr8D2&wz6_og>kTJdB!oOv-#f|0x_VRALtnZBi2W zJ@;=;@iz+KxMCZ5W#byB0XJQAX1y?+Ya0E=X3s&3>KzcD02lLFD?(+NBUE`oZ(7GL z4zGYzJRMziGtvnRqsp=STxg0o^fLlw8+v zf}i*J{^|6LJq8Q_dyu6%HvSD~p zm3TmVyYBjanx}I?DWjIn$vYPK^gAPK>g&$r7mx4wsT)|=^D+J9Eyu-B6`hlmkr5LX z6zs!mg$JG(%m+|3yS*`%UGC zn3|k8XU^T?-$OeV%V7~_YCEk!F%Wv2UxpKhVZxc4$?g$WXIq?}5A7%x!4!)UlbDFL z;AUTMrwOJU9gaUwlI4^baEHLyj)3CO^^shK>G?6(hjBwEu=|MU+=v;ZjyUzEObn+qXrihGJleE`cG_*|%a0SVN^UA+bmb73*F%K1dw-%DB^<#VYl@zw-swzwj#$hn z|2k2+hSL1mEj^p92GjD4rdO)+91AqvW>5ELiz7)s-WF4be3)>2^nISE?XA?bwY75! zFD$*53nT3GC00KPI2_()FlNvKN-42`pBEo;ut>I?9ISTkL&5hdc82YsbXOHaF0{EhQ~wsl^bME z9Y!!GoSYBF+@I|JEru>3&l~lP2);^WMxB0F;yk=;C#U0ptp8>TG_f(h@?xugGQx0- zgNeFXtg7taT6jR;lzEkTG+B!(mvHdcZA~B~;vIr>?ahitId(Uj9tu&Nv8l))0lru#h`+p6VHMe#2hiG&B|{jRT3aYawdoK6!<4@))csFtq^m_H*+GTYot2varYC%*QzA#K(#nW^S*wo zz`AT54Y;82SKk(7sOug>A=nJnec5sw5& ziZ*3KM*L+lNO#w`GaJX7>^u7mSNqK=#TH%u`4w-aE#@>H`$`WKKZ|)RaH2Khi`W1( zCg9#ybgU)ydzfbInZLv$nl#WiVm8xPvLxF>`!KDydh+1GgH94a@47C3t7ri;fVYnlQ0437y2*gVgdpJhCw9+E5xe{wf{)( z%R4uMW3E&YrAke}^QZi={n1M;iysoAIy5J$7UGkAKmVJ!5j)nf>4`v0KX;=A(l#9N zcOn+VE+C&Ty_#!ib$wE6dU+Z{v-++ZvKXz!S=^GI8-su>A0%;WKt}e?^o2WxO*xv2 z*H0%ORexVs7gp~`CF?fLzKdfw@V{lncAnNSc*^wp^=}|#O6k7C)-)ViV6k@?O6S

4L9Jx8ZK9p)vtTiqy440j&8X6uOSG2Nfj18t-%Z9X zI)tc~7|84P%HQJMzCHl-I;2#-SRM6&eN+k)R-e5(b-Pfq3$G*D^5m(ZYuidr1`HSM z*l2DHeN(zJ^Y2kK{M?z_3O)qxocquAs;8;iQOe3oQ(Y!2S~KhPze14!K+5wY@vf@~ z3gJ^d*9r8K#60`|=Er|W$aSY+RR5X5id+scs8r@?_tx~t%g)MLc~!**I$(Tbxzk2~ z<@_*h{A+=Tyn3@66&svf0nU*bJ)=oS+~{UJp6+{k7HVd*0<}r71flq@&>8dOL>3C2 zA||HE=}ynzHWOf>#A$n4|AQS&$4g549Z&Qi9}!y{a|rH;LW z6y$()@GHvb2#UT;rpUQorZ00c?fHM^`NA@%8FdYFIJCiaXG&$I0X5sAFuu7gNc0{_}15W3ka&H zGrFr;2d<@Gq#|DlAi38nj~G)2qs>&UWk>u{wA`dMg?gCQNI|!CAInra16y4EM(d#; zXKB3xC}VO@?+;Npn{S9f4jW%GZ?K*~6%Ql@3t`3t%1Yf6HsPWRn)&|Ld{qdm^yBYA zJd0^Gk-8Mr9ek&M-~Q2}L1P7?HOa;%(q7|8hA6y7M8w}gEIPtPcrRG;w|L_AC=~qm z)Y_kSVWS0FI!aYM_0_~*y2y2(1DTC6Gq+DKL@}NpFw7(yM{P^GHRx#c%``lplJP^^XCdah{09d<)NfpGQds7(gxh zs7e^sq>U{$CP+>+nyZ0QZxR;(^DFD zs+LxqyRvhdJEZAh1A9u;{+0J2g+6`=VeS$)Y?ODV=yijzqqoWjlAm|yUFwl_sI*DM zDg50@@lASLT2AKo2=ceho!|#65+E1M2WQ4X5d!nGNSegz35;6WjGdDjv+a;Oh`x^O zW$tVUX?3{>V=jhzt+4Z6-HnTeF#=v(O=?6I+#zu6=*Q+F3I*do7^?NGv6AG7MGij{ zAvv0*+GW;UIi2!>WK&i&G+e-YCPg@4XFuN$-2_avG{EU+McJ!eLfK-8MnKCgCj?eE6+3jMaJWBdU0fNi+?wt~Etu z#+2ykxipEqT0qDtLr;Dn9QaxYo`K2eq*KoN z^Ha3C#{CME4${WJT+CqN*pTt*89(0>Hs%V%p%M~DbjPDM=nIwC-j<&ioSiV=gRwiu zahkC>!dtXaVvJK4DZvJYi*?Fj&nF-j96$Y;e~XK0s=ZNEg!qf$35%$E5|Bxpe_iGh%3}XO)rl=cK;Ofd8NBk zPs}a~*RYIi-KEx!&A!;fblU={IVWZyk6tIn3L&q}X=+!n5+x=A7INH%+g~B7A7v?3}KQOzXe;<(L5AyzI4x#I+miaYWK(M$@1(=YZWj* zOyYQzYl|9-ebVRfKg8lH2e6~`5nG&cj612!VZwn*xW8IKs?ABc7}fD!bj5K_BR$;+ z5@i^)GWw)yH9pJtjsb3D!S`NMQuF-^DoRNK{>LtgF5i4j_t?lZ57-L=n`fXQt~vn$ zO9lm8zm>PVuies^l6Y(CWpGZkO+zW~MoE5YcB>0c)0Afvev(uM4GovY(W9IvJWbl* zQoCo?0TC+5xu?YvirmU%lMjBn55McZr2wx<3TGATQ>w;l5oV#8&!bg#4({>k z6?WZ3dHf~zb)B)G^e<5xmmujUmoCOqJRRyqEUp>PS=ttbb?ySTRl2~iqp>s%7c)DH zo88S77D?AwD$ApXQqk9Lz9!X=+eU8Iaz>`GCa^Yp_4yRwam0JBmH31U=YrX&z%C%y z9Vo&&vt{nMH9O*HoxI0Y$<7j6U2>Iy=aCdb!97#D5u4;UT_n8h^~hpEt?U+? zaQsa-oQ zwcxWZ@q`68IdF|=&QiL}*j+!hKa*M_xM;VlkKV9?i8QkIAP1VNRztSnu?BIVu=EFA zq;wQ`(0$4m$R&-q7}$71e0iC+9^Xt-Ut@jVh}bMQ;g`-Pnc&M{$?9bnr1Eht3vrnE zbv>Evje_?{Q!~=-8U69i_t%%iL?=Tl?r2PXzpuWHlCdmjA!<5PE0QG7>u;;d`l)1i zq78JgB>It}4iV22TRpJvrL^YpHKJd8b_p|pwRv6wD*F3kLk2zj8pRezCVq`!!j^)E zJmajqgI`dlfB27{<6sA*!)iUh34?l|0vk$^Nc8hIZ9?IB>x|>IgkN6N+lBZ@NC2SV z53|c1&#^cb_WyzE`5(h#RTU1K643<+Lb^F3 zg?tH4+L>_qY0)i}{QWdM3$0x8 z!-7G6IFS+EHS{@CCi~?9*n3j{A@^EXA=fo~(+P2fyDfDwf@0wzs+jU)!o|4k{*W_v zkHNFuO6rv1%(7}n9{ zn2$F@we*vH`Zt_nOr5JGExID>1XYq>;a1}=*B6^vBzwU`Ajs@vjf)P{c_PtO(yHAR zJD|RsDlot_Q{f@+BJA09a=F+D_#By+Z$59@hxa9q9h|PMZ7g>ildu}!Fp#$ox5t27 zqkMbQ#iQaiWJ8No?%46w!U!i*pGKDMuH5KrtLakX%7VK{1ab!%=&Q_J*n8r-`sK5K z*Bmg<8au2#ao+6@y>6;((|r8oWN%CmpH{l7?GUh&)4spX*DjC`Ji6@5O-EvT40HhVbZ z+Kij5(0fKJr5`r-4U;Y`Ww9lKoBob4-sTtO7G-1Fuj{+)4oN3|?7T^(;m*?tip@ZDm*PmOs_|b)aHEQs>5OhzDNByX6 zz1$nJEX%FD7CP6Xf+Spm`J5DFu|fU%sr{$*lhaePo9I)W2axYpQq7AVa0H!lFs3V& z9bamlD0(KD4MFk8O5KPp+{|TeoNyG&?<6QsFe5un4mbPQe6iT@r(6jGXNK>5hZvihB6dH{>UL(W|)^1H$IbM%uq zKVEe|+Vu#9;HM`1|Emd`MKD`Oo4ILAh+bXg QJ>YXyMf