SlideShare uma empresa Scribd logo
1 de 97
Baixar para ler offline
Privet Kotlin
Hello Kotlin
Hello Kotlin
Cody Engel
Senior Software Engineer @ Yello
Free T-Shirts & Clean Code
Nick Cruz
Android Engineer @ Yello
Mr. Plantastic & Crispy Animations
2. Getting Started
3. Null Safety
4. Our Favorite Things About Kotlin
5. Kotlin At Work
1. Fun Facts
2. Getting Started
3. Null Safety
4. Our Favorite Things About Kotlin
5. Kotlin At Work
1. Fun Facts
Developed in 2011 by JetBrains
(IntelliJ IDEA, RubyMine, PhpStorm, Android Studio)
Released 2012
Statically typed programming language
for the JVM
Developed in 2011 by JetBrains
(IntelliJ IDEA, RubyMine, PhpStorm)
Released 2012
Statically typed programming language
for the JVM
Runs on JVM = 100% Interoperability with Java
2. Getting Started
3. Null Safety
4. Our Favorite Things About Kotlin
5. Kotlin At Work
1. Fun Facts
1. Fun Facts
3. Null Safety
4. Our Favorite Things About Kotlin
5. Kotlin At Work
2. Getting Started
Functions
sum( , b:Int) {
return a + b
}
fun a: Int : Int
Functions
Functions
sum( , b:Int) {
return a + b
}
fun a: Int : Int
Functions
sum( , b:Int) {
return a + b
}
fun a: Int : Int
Functions
sum( , b:Int) {
return a + b
}
fun a: Int : Int
Functions
sum( , b:Int) {
return a + b
}
fun a: Int : Int
Functions
sum( , b:Int) {
return a + b
}
fun a: Int : Int
fun sum(a: Int, b: Int) = a + b
Functions
Functions
fun printSum(a: Int, b: Int): Unit {
println("sum of $a and $b is ${a + b}")
}
fun printSum(a: Int, b: Int) {
println("sum of $a and $b is ${a + b}")
}
Functions
Variables
val immutable: Int = 1
Variables
val immutable = 2
Variables
val immutable: Int
immutable = 3
Variables
var mutable = 0
mutable++
mutable++
Variables
Properties
class Address {
var name: String = ...
var street: String = ...
var city: String = ...
var state: String? = ...
var zip: String = ...
}
Properties
fun copyAddress(address: Address): Address {
val result = Address()
result.name = address.name
result.street = address.street
return result
}
Properties
val isEmpty: Boolean
get() = this.size == 0
Properties
var stringRepresentation: String
get() = this.toString()
set(value) {
field = value.toString()
}
Properties
String Templates
val = "Java"
println(
String.format("The way is terrible!", )
)
java
java%s
String Templates
String Templates
val = "Java"
println(
String.format("The way is terrible!", )
)
java
java%s
val = "Kotlin"
println("The way is awesome!")
kotlin
$kotlin
String Templates
String Templates
val = "Kotlin"
println("The way is awesome!")
kotlin
$kotlin
Control Flow
var max = a
if (a < b) max = b
Control Flow - If Expression
var max: Int
if (a > b) {
max = a
} else {
max = b
}
Control Flow - If Expression
val max = if (a > b) a else b
Control Flow - If Expression
val max = if (a > b) {
print("Returns a")
a
} else {
print("Returns b")
b
}
Control Flow - If Expression
when (x) {
1 -> print("x == 1")
2 -> print("x == 2")
else -> {
print(“x is neither 1 nor 2")
}
}
When Expression - Replaces Switch
when (x) {
1, 2 -> print("x == 1 or a == 2")
else -> print(“x is neither 1 nor 2”)
}
When Expression - Replaces Switch
when (x) {
in 1..10 -> print("x is in the range")
in validNumbers -> print("x is valid")
!in 10..20 -> print("x is outside the range")
else -> print("none of the above")
}
When Expression - Replaces Switch
when {
x.isOdd() -> print("x is odd")
x.isEven() -> print("x is even")
else -> print("x is funny")
}
When Expression - Replaces If/Else If
for (item in collection) {
print(item)
}
For Loops
for (i in array.indices) {
print(array[i])
}
For Loops
for ((index, value) in array.withIndex()) {
println("the element at $index is $value")
}
For Loops
2. Getting Started
3. Null Safety
4. Our Favorite Things About Kotlin
5. Kotlin At Work
1. Fun Facts
1. Fun Facts
2. Getting Started
4. Our Favorite Things About Kotlin
5. Kotlin At Work
3. Null Safety
Null Safety
(and Immutability)
Caused by: java.lang.NullPointerException: Attempt
to invoke virtual method 'java.lang.String
java.lang.String.trim()' on a null object
reference
Nullable String s; val s: String?
NonNull String s; val s: String
val length = s!!.length
NonNull Assert
val length = s!!.length
NonNull Assert
kotlin.KotlinNullPointerException
at part2.delegation.interceptor.LoggerList.add(LoggerList.kt:39)
(don’t do this)
val length = s!!.length
val length = s?.length // Int?
NonNull Assert
Safe call, returns optional
kotlin.KotlinNullPointerException
at part2.delegation.interceptor.LoggerList.add(LoggerList.kt:39)
(don’t do this)
val length = s?.length ?: 0 // Int
Safe Call and Elvis Operator
val length = s?.length ?: 0 // Int
Safe Call and Elvis Operator
Other helpful operators
with, apply, let, run
s?.let {
val length = it.length // Int
// Do stuff with length
}
What about variables that become null?
What about variables that become non-null?
Mutable
Nullable
String s; var s: String?
Mutable
NonNull
String s; var s: String
Immutable
Nullable
final String s; val s: String?
Immutable
NonNull
final String s; val s: String
2. Getting Started
3. Null Safety
4. Our Favorite Things About Kotlin
5. Kotlin At Work
1. Fun Facts
1. Fun Facts
2. Getting Started
3. Null Safety
5. Kotlin At Work
4. Our Favorite Things About Kotlin
Classes
Data Classes
We frequently create classes whose main purpose is to
hold data. In such a class some standard functionality
and utility functions are often mechanically derivable
from the data. In Kotlin, this is called a data class.
Data Classes
data class User(val name: String, val age: Int)
data class User(
val name: String = "",
val age: Int = 0
)
Data Classes
val user = User(“Jane Smith", 27)
user.name
user.age
user.toString()
user.hashCode()
user.equals()
Data Classes
val jack = User(name = "Jack", age = 1)
val olderJack = jack.copy(age = 2)
Data Classes
val jane = User("Jane", 35)
val (name, age) = jane
println("$name, $age years of age")
Data Classes
Sealed Classes
Sealed classes are used for representing restricted
class hierarchies, when a value can have one of the
types from a limited set, but cannot have any other type.
They are, in a sense, an extension of enum classes: the
set of values for an enum type is also restricted, but
each enum constant exists only as a single instance,
whereas a subclass of a sealed class can have multiple
instances which can contain state.
sealed class Expr {
data class Const(val number: Double) : Expr()
data class Sum(val e1: Expr, val e2: Expr) : Expr()
object NotANumber : Expr()
}
Sealed Classes
Sealed Classes
fun eval(expr: Expr): Double = when(expr) {
is Const -> expr.number
is Sum -> eval(expr.e1) + eval(expr.e2)
NotANumber -> Double.NaN
}
Lambdas
& Higher-Order Functions
A higher-order function is a function
that takes functions as parameters,
or returns a function.
fun transform1Through5(transform: (Int) -> Int) {
for (int in 1..5) {
println(transform(int))
}
}
fun transform1Through5(transform: (Int) -> Int) {
for (int in 1..5) {
println(transform(int))
}
}
Method Reference
class NumberDoubler {
fun run(int: Int) = int * 2
}
fun doubleNumbersMethodReference() {
val numberDoubler = NumberDoubler()
transform1Through5(numberDoubler::run)
}
Lambda
fun transform1Through5(transform: (Int) -> Int) {
for (int in 1..5) {
println(transform(int))
}
}
fun doubleNumbersLambda() {
transform1Through5 { num -> num * 2 }
}
transform1Through5 { num -> num * 2 }
transform1Through5 { it * 2 }
transform1Through5 { it * 3 }
transform1Through5 { it * 30 }
transform1Through5 { it * it }
listOf(1, 2, 3, 4, 5)
.filter { it % 2 == 1 } // Filter evens: [1, 3, 5]
.map { it * 2 } // Double the results: [2, 6, 10]
.forEach { println(it) } // Print them
Kotlin Collections
listOf(1, 2, 3, 4, 5)
.filter { it % 2 == 1 } // Filter evens: [1, 3, 5]
.map { it * 2 } // Double the results: [2, 6, 10]
.forEach { println(it) } // Print them
Kotlin Collections
Observable.just(1, 2, 3, 4, 5)
.filter { it % 2 == 1 }
.map { it * 2 }
.forEach { println(it) }
RxJava Observable (in Kotlin)
2. Getting Started
3. Null Safety
4. Our Favorite Things About Kotlin
5. Kotlin At Work
1. Fun Facts
1. Fun Facts
2. Getting Started
3. Null Safety
4. Our Favorite Things About Kotlin
5. Kotlin At Work
@
Introduce Kotlin
@
Introduce Kotlin
• Discuss the benefits of Kotlin.
• Give snippets in Pull Request comments.
• Get others on our team interested.
@
Learn Together
@
Learn Together
• Work through Kotlin Koans together.
• Watch Kotlin videos together.
• Make this a team effort.
@
Kotlin In Production
@
Kotlin In Production
• Determine code style rules as a team.
• Find the path of least resistance.
• Java-style Kotlin in the beginning.
• Focus on continuous improvement.
@
twitter.com/POTUS404
medium.com/@CodyEngel
github.com/CodyEngel github.com/NickCruz
medium.com/@NickCruz26
twitter.com/ReactiveNick
medium.com/yello-offline
instagram.com/yello_offline
twitter.com/yello_offline
Resources
Kotlin Koans
https://goo.gl/MTLEYg
KotlinLang
https://kotlinlang.org
Life is Great and Everything Will Be Ok, Kotlin Is Here
https://goo.gl/yhp2Gn
Kotlin Uncovered
https://goo.gl/fbAFW5
Introduction To Kotlin
https://goo.gl/iCwYHd

Mais conteúdo relacionado

Mais procurados

Kotlin advanced - language reference for android developers
Kotlin advanced - language reference for android developersKotlin advanced - language reference for android developers
Kotlin advanced - language reference for android developers
Bartosz Kosarzycki
 
AST Transformations
AST TransformationsAST Transformations
AST Transformations
HamletDRC
 
Clojure for Java developers - Stockholm
Clojure for Java developers - StockholmClojure for Java developers - Stockholm
Clojure for Java developers - Stockholm
Jan Kronquist
 
Orthogonal Functional Architecture
Orthogonal Functional ArchitectureOrthogonal Functional Architecture
Orthogonal Functional Architecture
John De Goes
 

Mais procurados (20)

Kotlin Bytecode Generation and Runtime Performance
Kotlin Bytecode Generation and Runtime PerformanceKotlin Bytecode Generation and Runtime Performance
Kotlin Bytecode Generation and Runtime Performance
 
Into Clojure
Into ClojureInto Clojure
Into Clojure
 
Kotlin – the future of android
Kotlin – the future of androidKotlin – the future of android
Kotlin – the future of android
 
Advanced Debugging Using Java Bytecodes
Advanced Debugging Using Java BytecodesAdvanced Debugging Using Java Bytecodes
Advanced Debugging Using Java Bytecodes
 
3 kotlin vs. java- what kotlin has that java does not
3  kotlin vs. java- what kotlin has that java does not3  kotlin vs. java- what kotlin has that java does not
3 kotlin vs. java- what kotlin has that java does not
 
Lezione03
Lezione03Lezione03
Lezione03
 
2 kotlin vs. java: what java has that kotlin does not
2  kotlin vs. java: what java has that kotlin does not2  kotlin vs. java: what java has that kotlin does not
2 kotlin vs. java: what java has that kotlin does not
 
What can be done with Java, but should better be done with Erlang (@pavlobaron)
What can be done with Java, but should better be done with Erlang (@pavlobaron)What can be done with Java, but should better be done with Erlang (@pavlobaron)
What can be done with Java, but should better be done with Erlang (@pavlobaron)
 
Kotlin advanced - language reference for android developers
Kotlin advanced - language reference for android developersKotlin advanced - language reference for android developers
Kotlin advanced - language reference for android developers
 
Kotlin
KotlinKotlin
Kotlin
 
Kotlin: a better Java
Kotlin: a better JavaKotlin: a better Java
Kotlin: a better Java
 
AST Transformations
AST TransformationsAST Transformations
AST Transformations
 
Kotlin collections
Kotlin collectionsKotlin collections
Kotlin collections
 
Haskell in the Real World
Haskell in the Real WorldHaskell in the Real World
Haskell in the Real World
 
Ast transformations
Ast transformationsAst transformations
Ast transformations
 
Why Haskell
Why HaskellWhy Haskell
Why Haskell
 
Clojure for Java developers - Stockholm
Clojure for Java developers - StockholmClojure for Java developers - Stockholm
Clojure for Java developers - Stockholm
 
core.logic introduction
core.logic introductioncore.logic introduction
core.logic introduction
 
Orthogonal Functional Architecture
Orthogonal Functional ArchitectureOrthogonal Functional Architecture
Orthogonal Functional Architecture
 
Introduction to Kotlin
Introduction to KotlinIntroduction to Kotlin
Introduction to Kotlin
 

Semelhante a Privet Kotlin (Windy City DevFest)

Semelhante a Privet Kotlin (Windy City DevFest) (20)

Kotlin for Android Developers - 3
Kotlin for Android Developers - 3Kotlin for Android Developers - 3
Kotlin for Android Developers - 3
 
Meetup di GDG Italia - Leonardo Pirro - Codemotion Rome 2018
Meetup di GDG Italia - Leonardo Pirro -  Codemotion Rome 2018 Meetup di GDG Italia - Leonardo Pirro -  Codemotion Rome 2018
Meetup di GDG Italia - Leonardo Pirro - Codemotion Rome 2018
 
Kotlin 1.2: Sharing code between platforms
Kotlin 1.2: Sharing code between platformsKotlin 1.2: Sharing code between platforms
Kotlin 1.2: Sharing code between platforms
 
Kotlin, smarter development for the jvm
Kotlin, smarter development for the jvmKotlin, smarter development for the jvm
Kotlin, smarter development for the jvm
 
Introduction kot iin
Introduction kot iinIntroduction kot iin
Introduction kot iin
 
Scala for curious
Scala for curiousScala for curious
Scala for curious
 
Game Design and Development Workshop Day 1
Game Design and Development Workshop Day 1Game Design and Development Workshop Day 1
Game Design and Development Workshop Day 1
 
K is for Kotlin
K is for KotlinK is for Kotlin
K is for Kotlin
 
Introduction to Scala
Introduction to ScalaIntroduction to Scala
Introduction to Scala
 
Intro to Kotlin
Intro to KotlinIntro to Kotlin
Intro to Kotlin
 
Introduction to Scala
Introduction to ScalaIntroduction to Scala
Introduction to Scala
 
Kotlin for Android devs
Kotlin for Android devsKotlin for Android devs
Kotlin for Android devs
 
Scala coated JVM
Scala coated JVMScala coated JVM
Scala coated JVM
 
Davide Cerbo - Kotlin: forse è la volta buona - Codemotion Milan 2017
Davide Cerbo - Kotlin: forse è la volta buona - Codemotion Milan 2017 Davide Cerbo - Kotlin: forse è la volta buona - Codemotion Milan 2017
Davide Cerbo - Kotlin: forse è la volta buona - Codemotion Milan 2017
 
Develop your next app with kotlin @ AndroidMakersFr 2017
Develop your next app with kotlin @ AndroidMakersFr 2017Develop your next app with kotlin @ AndroidMakersFr 2017
Develop your next app with kotlin @ AndroidMakersFr 2017
 
Scala ntnu
Scala ntnuScala ntnu
Scala ntnu
 
Kotlin @ Coupang Backend 2017
Kotlin @ Coupang Backend 2017Kotlin @ Coupang Backend 2017
Kotlin @ Coupang Backend 2017
 
Kotlin 101 for Java Developers
Kotlin 101 for Java DevelopersKotlin 101 for Java Developers
Kotlin 101 for Java Developers
 
Lezione03
Lezione03Lezione03
Lezione03
 
Android & Kotlin - The code awakens #03
Android & Kotlin - The code awakens #03Android & Kotlin - The code awakens #03
Android & Kotlin - The code awakens #03
 

Último

Abortion Pill Prices Tembisa [(+27832195400*)] 🏥 Women's Abortion Clinic in T...
Abortion Pill Prices Tembisa [(+27832195400*)] 🏥 Women's Abortion Clinic in T...Abortion Pill Prices Tembisa [(+27832195400*)] 🏥 Women's Abortion Clinic in T...
Abortion Pill Prices Tembisa [(+27832195400*)] 🏥 Women's Abortion Clinic in T...
Medical / Health Care (+971588192166) Mifepristone and Misoprostol tablets 200mg
 
%+27788225528 love spells in new york Psychic Readings, Attraction spells,Bri...
%+27788225528 love spells in new york Psychic Readings, Attraction spells,Bri...%+27788225528 love spells in new york Psychic Readings, Attraction spells,Bri...
%+27788225528 love spells in new york Psychic Readings, Attraction spells,Bri...
masabamasaba
 
Large-scale Logging Made Easy: Meetup at Deutsche Bank 2024
Large-scale Logging Made Easy: Meetup at Deutsche Bank 2024Large-scale Logging Made Easy: Meetup at Deutsche Bank 2024
Large-scale Logging Made Easy: Meetup at Deutsche Bank 2024
VictoriaMetrics
 
%+27788225528 love spells in Boston Psychic Readings, Attraction spells,Bring...
%+27788225528 love spells in Boston Psychic Readings, Attraction spells,Bring...%+27788225528 love spells in Boston Psychic Readings, Attraction spells,Bring...
%+27788225528 love spells in Boston Psychic Readings, Attraction spells,Bring...
masabamasaba
 
Abortion Pill Prices Boksburg [(+27832195400*)] 🏥 Women's Abortion Clinic in ...
Abortion Pill Prices Boksburg [(+27832195400*)] 🏥 Women's Abortion Clinic in ...Abortion Pill Prices Boksburg [(+27832195400*)] 🏥 Women's Abortion Clinic in ...
Abortion Pill Prices Boksburg [(+27832195400*)] 🏥 Women's Abortion Clinic in ...
Medical / Health Care (+971588192166) Mifepristone and Misoprostol tablets 200mg
 

Último (20)

Abortion Pill Prices Tembisa [(+27832195400*)] 🏥 Women's Abortion Clinic in T...
Abortion Pill Prices Tembisa [(+27832195400*)] 🏥 Women's Abortion Clinic in T...Abortion Pill Prices Tembisa [(+27832195400*)] 🏥 Women's Abortion Clinic in T...
Abortion Pill Prices Tembisa [(+27832195400*)] 🏥 Women's Abortion Clinic in T...
 
Direct Style Effect Systems - The Print[A] Example - A Comprehension Aid
Direct Style Effect Systems -The Print[A] Example- A Comprehension AidDirect Style Effect Systems -The Print[A] Example- A Comprehension Aid
Direct Style Effect Systems - The Print[A] Example - A Comprehension Aid
 
WSO2CON 2024 - Building the API First Enterprise – Running an API Program, fr...
WSO2CON 2024 - Building the API First Enterprise – Running an API Program, fr...WSO2CON 2024 - Building the API First Enterprise – Running an API Program, fr...
WSO2CON 2024 - Building the API First Enterprise – Running an API Program, fr...
 
%in Rustenburg+277-882-255-28 abortion pills for sale in Rustenburg
%in Rustenburg+277-882-255-28 abortion pills for sale in Rustenburg%in Rustenburg+277-882-255-28 abortion pills for sale in Rustenburg
%in Rustenburg+277-882-255-28 abortion pills for sale in Rustenburg
 
WSO2CON 2024 - Navigating API Complexity: REST, GraphQL, gRPC, Websocket, Web...
WSO2CON 2024 - Navigating API Complexity: REST, GraphQL, gRPC, Websocket, Web...WSO2CON 2024 - Navigating API Complexity: REST, GraphQL, gRPC, Websocket, Web...
WSO2CON 2024 - Navigating API Complexity: REST, GraphQL, gRPC, Websocket, Web...
 
%+27788225528 love spells in new york Psychic Readings, Attraction spells,Bri...
%+27788225528 love spells in new york Psychic Readings, Attraction spells,Bri...%+27788225528 love spells in new york Psychic Readings, Attraction spells,Bri...
%+27788225528 love spells in new york Psychic Readings, Attraction spells,Bri...
 
Large-scale Logging Made Easy: Meetup at Deutsche Bank 2024
Large-scale Logging Made Easy: Meetup at Deutsche Bank 2024Large-scale Logging Made Easy: Meetup at Deutsche Bank 2024
Large-scale Logging Made Easy: Meetup at Deutsche Bank 2024
 
WSO2CON 2024 - Does Open Source Still Matter?
WSO2CON 2024 - Does Open Source Still Matter?WSO2CON 2024 - Does Open Source Still Matter?
WSO2CON 2024 - Does Open Source Still Matter?
 
WSO2Con2024 - From Code To Cloud: Fast Track Your Cloud Native Journey with C...
WSO2Con2024 - From Code To Cloud: Fast Track Your Cloud Native Journey with C...WSO2Con2024 - From Code To Cloud: Fast Track Your Cloud Native Journey with C...
WSO2Con2024 - From Code To Cloud: Fast Track Your Cloud Native Journey with C...
 
%+27788225528 love spells in Boston Psychic Readings, Attraction spells,Bring...
%+27788225528 love spells in Boston Psychic Readings, Attraction spells,Bring...%+27788225528 love spells in Boston Psychic Readings, Attraction spells,Bring...
%+27788225528 love spells in Boston Psychic Readings, Attraction spells,Bring...
 
%in tembisa+277-882-255-28 abortion pills for sale in tembisa
%in tembisa+277-882-255-28 abortion pills for sale in tembisa%in tembisa+277-882-255-28 abortion pills for sale in tembisa
%in tembisa+277-882-255-28 abortion pills for sale in tembisa
 
WSO2Con2024 - From Blueprint to Brilliance: WSO2's Guide to API-First Enginee...
WSO2Con2024 - From Blueprint to Brilliance: WSO2's Guide to API-First Enginee...WSO2Con2024 - From Blueprint to Brilliance: WSO2's Guide to API-First Enginee...
WSO2Con2024 - From Blueprint to Brilliance: WSO2's Guide to API-First Enginee...
 
Crypto Cloud Review - How To Earn Up To $500 Per DAY Of Bitcoin 100% On AutoP...
Crypto Cloud Review - How To Earn Up To $500 Per DAY Of Bitcoin 100% On AutoP...Crypto Cloud Review - How To Earn Up To $500 Per DAY Of Bitcoin 100% On AutoP...
Crypto Cloud Review - How To Earn Up To $500 Per DAY Of Bitcoin 100% On AutoP...
 
WSO2Con2024 - GitOps in Action: Navigating Application Deployment in the Plat...
WSO2Con2024 - GitOps in Action: Navigating Application Deployment in the Plat...WSO2Con2024 - GitOps in Action: Navigating Application Deployment in the Plat...
WSO2Con2024 - GitOps in Action: Navigating Application Deployment in the Plat...
 
%in Bahrain+277-882-255-28 abortion pills for sale in Bahrain
%in Bahrain+277-882-255-28 abortion pills for sale in Bahrain%in Bahrain+277-882-255-28 abortion pills for sale in Bahrain
%in Bahrain+277-882-255-28 abortion pills for sale in Bahrain
 
Architecture decision records - How not to get lost in the past
Architecture decision records - How not to get lost in the pastArchitecture decision records - How not to get lost in the past
Architecture decision records - How not to get lost in the past
 
MarTech Trend 2024 Book : Marketing Technology Trends (2024 Edition) How Data...
MarTech Trend 2024 Book : Marketing Technology Trends (2024 Edition) How Data...MarTech Trend 2024 Book : Marketing Technology Trends (2024 Edition) How Data...
MarTech Trend 2024 Book : Marketing Technology Trends (2024 Edition) How Data...
 
WSO2Con2024 - Hello Choreo Presentation - Kanchana
WSO2Con2024 - Hello Choreo Presentation - KanchanaWSO2Con2024 - Hello Choreo Presentation - Kanchana
WSO2Con2024 - Hello Choreo Presentation - Kanchana
 
WSO2CON 2024 Slides - Open Source to SaaS
WSO2CON 2024 Slides - Open Source to SaaSWSO2CON 2024 Slides - Open Source to SaaS
WSO2CON 2024 Slides - Open Source to SaaS
 
Abortion Pill Prices Boksburg [(+27832195400*)] 🏥 Women's Abortion Clinic in ...
Abortion Pill Prices Boksburg [(+27832195400*)] 🏥 Women's Abortion Clinic in ...Abortion Pill Prices Boksburg [(+27832195400*)] 🏥 Women's Abortion Clinic in ...
Abortion Pill Prices Boksburg [(+27832195400*)] 🏥 Women's Abortion Clinic in ...
 

Privet Kotlin (Windy City DevFest)