presentation, test: ~30min

main
Antonio De Lucreziis 11 months ago
parent 1ef109fcf9
commit 80f015a1ad

Binary file not shown.

@ -56,17 +56,19 @@
== Introduzione
*Def.* $X, Y$ spazi topologici, $f : X arrow Y$ continua è *embedding* se $X approx f(X) subset Y$.
// *Def.* $X, Y$ spazi topologici, $f : X arrow Y$ continua è *embedding* se $X approx f(X) subset Y$.
*Def.* $f : X arrow Y$ embedding, $p in X$ allora $f$ è *localmente piatto* in $p$ se esiste $U subset bb(R)^3$ intorno di $p$ tale che $U approx DD^2 times [0,1]$ e $U inter f(X) <-> {0} times [0, 1]$.
// *Def.* $f : X arrow Y$ embedding, $p in X$ allora $f$ è *localmente piatto* in $p$ se esiste $U subset bb(R)^3$ intorno di $p$ tale che $U approx DD^2 times [0,1]$ e $U inter f(X) <-> {0} times [0, 1]$.
\
// \
*Def.* $K subset bb(R)^3$ è un *nodo (tame)* se esiste $f : bb(S)^1 arrow.hook bb(R)^3$ embedding loc. piatto con $K = f(bb(S)^1)$.
*Def.* Possiamo generalizzare i nodi $bb(S)^1 arrow bb(R)^3$ a *link* sostituendo con $bb(S)^1 union.sq dots.c union.sq bb(S)^1 arrow bb(R)^3$.
== Isotopia Ambiente
\
#pause
*Def.* $K_0, K_1 subset bb(R)^3$ sono *equivalenti* se esiste un'*isotopia ambiente* che porta uno nell'altro, ovvero esiste $H : bb(R)^3 times [0, 1] arrow bb(R)^3$ continua, tale che:
@ -86,7 +88,6 @@ e posta $H_t (x) colon.eq H(x, t)$ si ha:
== Proiezioni e Diagrammi
*Fatto.* Sia $L subset bb(R)^3$ link poligonale, allora esiste un aperto denso $U subset bb(S)^2$ tale che $forall v in U$ e detta $pi_v : bb(R)^3 arrow v^perp$ la proiezione sul piano $v^perp$ come in figura, abbiamo che:
#grid(
@ -113,7 +114,7 @@ e posta $H_t (x) colon.eq H(x, t)$ si ha:
*Def.* Un *diagramma* $D subset bb(R)^2$ di un link $L subset bb(R)^3$ è l'immagine di $L$ attraverso una proiezione regolare decorata con l'informazione sopra/sotto ad ogni incrocio.
#pad(
top: 0.5em,
top: 1em,
grid(
columns: (1fr, auto),
gutter: 1em,
@ -147,6 +148,17 @@ e posta $H_t (x) colon.eq H(x, t)$ si ha:
#figure(image("assets/whitney-trick.png", width: 100%))
== Diagrammi in forma discendente
#align(center)[
Dato $K$ il *nodo banale standard* (o in _forma discendente_) associato è $hat(K)(cal(U), p)$:
#v(1em)
#image("assets/standard-unlink-construction.png", height: 8cm)
]
== Comportamento Isotopia Regolare
@ -158,7 +170,7 @@ Ovvero un nodo in forma discendente è _equivalente_ ad uno composto solo da ric
#pause
_Dim._ Consideriamo una successione di mosse $K = D_0 stretch(arrow) dots.c stretch(arrow) D_n = #skein.unit-medium$.
_Dim._ Consideriamo una successione di mosse $K = D_0 stretch(arrow) dots.c stretch(arrow) D_n = #skein.unit-large$. Modifichiamo le mosse nei seguenti casi:
- Mosse di tipo I che rimuovono un ricciolo
@ -171,6 +183,8 @@ _Dim._ Consideriamo una successione di mosse $K = D_0 stretch(arrow) dots.c stre
#figure(image("assets/modified-curl-add-before.png", width: 7% * 6.5))
$ #rotate(90deg, $~>$) $
#figure(image("assets/modified-curl-add-after.png", width: 7% * 13))
#align(center)[Mosse di tipo I che aggiungono un ricciolo]
@ -181,6 +195,8 @@ _Dim._ Consideriamo una successione di mosse $K = D_0 stretch(arrow) dots.c stre
#figure(image("assets/modified-r2-before.png", width: 8% * 6.5))
$ #rotate(90deg, $~>$) $
#figure(image("assets/modified-r2-after.png", width: 8% * 8.5))
#align(center)[Mosse di tipo II, III]
@ -212,15 +228,15 @@ $
== Assiomi
*Def.* Sia $K$ un diagramma di un link non orientato, $L_K in bb(Z)[a, a^(-1), z, z^(-1)]$ e verifica:
*Def.* Sia $K$ un diagramma di un link _non orientato_, $L_K in bb(Z)[a, a^(-1), z, z^(-1)]$ e verifica:
#set par(spacing: 1.5em)
#set enum(numbering: "i.a)", spacing: 1.5em)
1. $K tilde K' => L_K = L_K'$.
2. Valgono le seguenti relazioni:
#set par(spacing: 1.25em)
#set enum(numbering: "a)", spacing: 1.75em)
1. $L[#skein.over-large] + L[#skein.under-large] = z (L[#skein.h-large] + L[#skein.v-large])$
2. $L[#skein.unit-large] = 1$
@ -231,7 +247,7 @@ $
#pause
\
#v(0.5em)
*Osservazione.* A questo punto non sappiamo se $L_K$ sia ben definito.
@ -239,42 +255,137 @@ $
#let knot-picture(src, ..rest) = $thin #image("assets/derived/atlas-" + src, ..rest) thin$
#{
set align(center)
// #show image: it => rect(stroke: 1pt + red, inset: 0pt, it)
grid(
columns: 1,
row-gutter: 1.5em,
column-gutter: 3em,
align: center + top,
[*Link $L[#skein.unit-large #skein.unit-large]$*],
$
& L[ #knot-picture("infinity-0.png", height: 2.25em) ]
+
L[ #knot-picture("infinity-1.png", height: 2.25em) ] =
z (
L[ #knot-picture("infinity-2.png", height: 2.25em) ]
+
L[ #knot-picture("infinity-3.png", height: 2.25em) ]
) \
#pause & =>
a L[ #skein.unit-large ]
#slide(repeat: 5, self => [
#let (alternatives,) = utils.methods(self)
#set align(center + top)
#v(3em)
#alternatives(position: center + top)[
#grid(
columns: 1,
row-gutter: 1.5em,
column-gutter: 3em,
align: center,
[*Link $L[#skein.unit-large #skein.unit-large]$*],
)
][
#grid(
columns: 1,
row-gutter: 1.5em,
column-gutter: 3em,
align: center,
[*Link $L[#skein.unit-large #skein.unit-large]$*],
$
(
space & #knot-picture("infinity-0.png", width: 1.075em) space,
space && #knot-picture("infinity-1.png", width: 1.075em) space,
space && #knot-picture("infinity-2.png", width: 1.075em) space,
space && #knot-picture("infinity-3.png", width: 1.075em) space
) \
text(
fill: #white,
L[ & thin #rect(width: 1.075em, height: 2.25em, stroke: none) thin ]
+
a^(-1) L[ #skein.unit-large ] =
z (
delta
+
L [ #skein.unit-large ]
) \
& => a + a^(-1) = z ( delta + 1 ) \
& => delta = (a + 1 slash a) / z - 1
$,
)
}
L[ && thin #rect(width: 1.075em, height: 2.25em, stroke: none) thin ] =
z (
L[ && thin #rect(width: 1.075em, height: 2.25em, stroke: none) thin ]
+
L[ && thin #rect(width: 1.075em, height: 2.25em, stroke: none) thin ]
)
)
$,
)
][
#grid(
columns: 1,
row-gutter: 1.5em,
column-gutter: 3em,
align: center,
[*Link $L[#skein.unit-large #skein.unit-large]$*],
$
& L[ #knot-picture("infinity-0.png", height: 2.25em) ]
+
L[ #knot-picture("infinity-1.png", height: 2.25em) ] =
z (
L[ #knot-picture("infinity-2.png", height: 2.25em) ]
+
L[ #knot-picture("infinity-3.png", height: 2.25em) ]
)
$,
)
][
#grid(
columns: 1,
row-gutter: 1.5em,
column-gutter: 3em,
align: center,
[*Link $L[#skein.unit-large #skein.unit-large]$*],
$
& L[ #knot-picture("infinity-0.png", height: 2.25em) ]
+
L[ #knot-picture("infinity-1.png", height: 2.25em) ] =
z (
L[ #knot-picture("infinity-2.png", height: 2.25em) ]
+
L[ #knot-picture("infinity-3.png", height: 2.25em) ]
) \
pause & =>
a L[ #skein.unit-large ]
+
a^(-1) L[ #skein.unit-large ] =
z (
delta
+
L [ #skein.unit-large ]
) \
& => a + a^(-1) = z ( delta + 1 ) \
& => delta = (a + 1 slash a) / z - 1
$,
)
][
#grid(
columns: 1,
row-gutter: 1.5em,
column-gutter: 3em,
align: center,
[*Link $L[#skein.unit-large #skein.unit-large]$*],
{
$
& L[ #knot-picture("infinity-0.png", height: 2.25em) ]
+
L[ #knot-picture("infinity-1.png", height: 2.25em) ] =
z (
L[ #knot-picture("infinity-2.png", height: 2.25em) ]
+
L[ #knot-picture("infinity-3.png", height: 2.25em) ]
) \
#pause & =>
a L[ #skein.unit-large ]
+
a^(-1) L[ #skein.unit-large ] =
z (
delta
+
L [ #skein.unit-large ]
) \
& => a + a^(-1) = z ( delta + 1 ) \
& => delta = (a + 1 slash a) / z - 1
$
$
~> L[K_1 union.sq K_2] = delta L[K_1] L[K_2]
$
},
)
]
])
== Calcoli impliciti
#{
#slide({
set align(center)
show math.equation: set text(size: 15pt)
@ -331,24 +442,24 @@ $
-(2a + a^(-1)) + (1 + a^(-2)) z + (a + a^(-1)) z^2
$,
)
}
})
== Invariante di isotopia ambiente associato
// == Invariante di isotopia ambiente associato
*Def.* Definiamo $F_K in bb(Z)[a, a^(-1), z, z^(-1)]$ per diagrammi di link orientati $K$ come
$
F_K colon.eq a^(-w(K)) L_K
$
// *Def.* Definiamo $F_K in bb(Z)[a, a^(-1), z, z^(-1)]$ per diagrammi di link orientati $K$ come
// $
// F_K colon.eq a^(-w(K)) L_K
// $
dove $L_K$ di un diagramma orientato è definito dimenticando l'orientazione.
// dove $L_K$ di un diagramma orientato è definito dimenticando l'orientazione.
*Prop.* Il polinomio $F_K (a, z)$ è un invariante di isotopia ambiente.
// *Prop.* Il polinomio $F_K (a, z)$ è un invariante di isotopia ambiente.
== Considerazioni preliminari
*Def.* Sia $K$ un diagramma di un nodo, $p in K$ un punto di partenza direzionato e sia $lambda = (lambda_n, dots, lambda_0)$ una sequenza di etichette di incroci di $K$:
#slide({
[*Def.* Sia $K$ un diagramma di un nodo, $p in K$ un punto di partenza direzionato e sia $lambda = (lambda_n, dots, lambda_0)$ una sequenza di etichette di incroci di $K$:]
#{
set align(center)
v(1em)
@ -360,24 +471,38 @@ dove $L_K$ di un diagramma orientato è definito dimenticando l'orientazione.
align: center,
{
skein.over-large
place(center + top, dy: -0.25em, {
place(center + top, dy: -0.75em, {
show math.equation: set text(size: 15pt)
$i$
})
},
{
skein.under-large
place(center + top, dy: -0.25em, {
place(center + top, dy: -0.75em, {
show math.equation: set text(size: 15pt)
$i$
})
},
{
skein.h-large
place(center + top, dy: -0.75em, {
show math.equation: set text(size: 15pt)
$i$
})
},
{
skein.v-large
place(center + top, dy: -0.75em, {
show math.equation: set text(size: 15pt)
$i$
})
},
skein.h-large,
skein.v-large,
$K$, $S_i K$, $E_i K$, $e_i K$,
)
pause
v(1em)
$
@ -386,12 +511,14 @@ dove $L_K$ di un diagramma orientato è definito dimenticando l'orientazione.
B_i^lambda colon.eq e_lambda_i S_lambda_(i-1) dots.c space S_lambda_0
$
pause
v(1em)
$
sum_K (lambda) colon.eq sum_(i=0)^n (-1)^i (L[A_i^lambda K] + L[B_i^lambda K])
$
}
})
== Considerazioni preliminari
@ -399,23 +526,17 @@ dove $L_K$ di un diagramma orientato è definito dimenticando l'orientazione.
#slide(
repeat: 5,
self => [
#v(2em)
#{
set align(center)
self => {
let (only, uncover) = utils.methods(self)
set align(center)
{
[Sia $lambda$ una sequenza di scambi che porta $K$ a $hat(K)$:]
}
#v(1em)
v(1em)
#let (only, uncover) = utils.methods(self)
#only(
only(
"1-3",
$
& L[K] + L[S_0 K] = z( L[E_0 K] + L[e_0 K] ) \
@ -425,7 +546,7 @@ dove $L_K$ di un diagramma orientato è definito dimenticando l'orientazione.
$,
)
#only(
only(
4,
$
& L[K] + L[S_0 K] = z( L[E_0 K] + L[e_0 K] ) \
@ -435,7 +556,7 @@ dove $L_K$ di un diagramma orientato è definito dimenticando l'orientazione.
$,
)
#only(
only(
5,
$
& L[K] + cancel(L[S_0 K]) = z( L[E_0 K] + L[e_0 K] ) \
@ -445,7 +566,7 @@ dove $L_K$ di un diagramma orientato è definito dimenticando l'orientazione.
$,
)
#{
{
set text(fill: white)
v(1.5em)
@ -457,31 +578,14 @@ dove $L_K$ di un diagramma orientato è definito dimenticando l'orientazione.
L[E_i S_(i-1) dotss S_0 K] + L[e_i S_(i-1) dotss S_0 K]
)
)$
v(1.5em)
$
Omega_K (lambda) colon.eq (-1)^(abs(lambda) + 1) L[hat(K)(lambda)] + z sum_K (lambda)
$
}
],
},
)
#slide[
#v(2em)
#{
set align(center)
[Sia $lambda$ una sequenza di scambi che porta $K$ a $hat(K)$:]
}
#v(1em)
#slide({
align(center, [Sia $lambda$ una sequenza di scambi che porta $K$ a $hat(K)$:])
v(1em)
$
& L[K] + cancel(L[S_0 K]) = z( L[E_0 K] + L[e_0 K] ) \
@ -490,42 +594,21 @@ dove $L_K$ di un diagramma orientato è definito dimenticando l'orientazione.
(-1)^n (& cancel(L[S_(n-1) dotss S_0 K]) + L [hat(K)]) = (-1)^n z (L[E_n S_(n-1) dotss S_0 K] + L[e_n S_(n-1) dotss S_0 K])
$
#{
v(1.5em)
h(4.4em)
$display(
=> L[K] + (-1)^n L[hat(K)] =
z sum_(i=0)^n (-1)^i (
L[E_i S_(i-1) dotss S_0 K] + L[e_i S_(i-1) dotss S_0 K]
)
)$
}
#{
set text(fill: white)
v(1.5em)
$
Omega_K (lambda) colon.eq (-1)^(abs(lambda) + 1) L[hat(K)(lambda)] + z sum_K (lambda)
$
}
]
#slide[
v(1.5em)
#v(2em)
#{
set align(center)
[Sia $lambda$ una sequenza di scambi che porta $K$ a $hat(K)$:]
}
h(4.4em)
$display(
=> L[K] + (-1)^n L[hat(K)] =
z sum_(i=0)^n (-1)^i (
L[E_i S_(i-1) dotss S_0 K] + L[e_i S_(i-1) dotss S_0 K]
)
)$
})
#v(1em)
#slide({
align(center, [Sia $lambda$ una sequenza di scambi che porta $K$ a $hat(K)$:])
v(1em)
$
& L[K] + cancel(L[S_0 K]) = z( L[E_0 K] + L[e_0 K] ) \
@ -534,43 +617,21 @@ dove $L_K$ di un diagramma orientato è definito dimenticando l'orientazione.
(-1)^n (& cancel(L[S_(n-1) dotss S_0 K]) + L [hat(K)]) = (-1)^n z (L[E_n S_(n-1) dotss S_0 K] + L[e_n S_(n-1) dotss S_0 K])
$
#{
v(1.5em)
v(1.5em)
h(4.4em)
$display(
=> L[K] + (-1)^n L[hat(K)] =
z sum_(i=0)^n (-1)^i (
L[A_i^lambda K] + L[B_i^lambda K]
)
)$
}
#{
set text(fill: white)
v(1.5em)
$
Omega_K (lambda) colon.eq (-1)^(abs(lambda) + 1) L[hat(K)(lambda)] + z sum_K (lambda)
$
}
]
#slide[
#v(2em)
#{
set align(center)
[Sia $lambda$ una sequenza di scambi che porta $K$ a $hat(K)$:]
}
h(4.4em)
$display(
=> L[K] + (-1)^n L[hat(K)] =
z sum_(i=0)^n (-1)^i (
L[A_i^lambda K] + L[B_i^lambda K]
)
)$
})
#v(1em)
#slide({
align(center, [Sia $lambda$ una sequenza di scambi che porta $K$ a $hat(K)$:])
v(1em)
$
& L[K] + cancel(L[S_0 K]) = z( L[E_0 K] + L[e_0 K] ) \
@ -579,34 +640,20 @@ dove $L_K$ di un diagramma orientato è definito dimenticando l'orientazione.
(-1)^n (& cancel(L[S_(n-1) dotss S_0 K]) + L [hat(K)]) = (-1)^n z (L[E_n S_(n-1) dotss S_0 K] + L[e_n S_(n-1) dotss S_0 K])
$
#{
v(1.5em)
h(4.4em)
$display(
=> L[K] = (-1)^(n+1) L[hat(K)] +
z sum_(i=0)^n (-1)^i (
L[A_i^lambda K] + L[B_i^lambda K]
)
)$
}
#{
set text(fill: white)
v(1.5em)
v(1.5em)
$
Omega_K (lambda) colon.eq (-1)^(abs(lambda) + 1) L[hat(K)(lambda)] + z sum_K (lambda)
$
}
]
h(4.4em)
$display(
=> L[K] = (-1)^(n+1) L[hat(K)] +
z sum_(i=0)^n (-1)^i (
L[A_i^lambda K] + L[B_i^lambda K]
)
)$
})
#slide[
#v(2em)
#{
set align(center)
@ -629,18 +676,9 @@ dove $L_K$ di un diagramma orientato è definito dimenticando l'orientazione.
h(4.4em)
$display(
=> L[K] = (-1)^(n+1) L[hat(K)] +
z sum_(i=0)^n (-1)^i (
L[A_i^lambda K] + L[B_i^lambda K]
)
z sum_K^text(fill: #white, n) (lambda)
)$
}
#{
v(1.5em)
$
Omega_K (lambda) colon.eq (-1)^(abs(lambda) + 1) L[hat(K)(lambda)] + z sum_K (lambda)
$
}
]
== Definizione induttiva
@ -649,21 +687,15 @@ dove $L_K$ di un diagramma orientato è definito dimenticando l'orientazione.
// la definizione è sotto perché gli enumerate non vanno d'accordo con le figure
1. Se $K = hat(K)(cal(U), p)$ è in _forma discendente_ per un qualche $p$: $L_K (a, z) colon.eq a^w(K)$
1. Se $K$ è in _forma discendente_: $L_K (a, z) colon.eq a^w(K)$
2. Se $K = K_1 union K_2$ rispettivamente diagrammi di un nodo e di un link e con $K_1$ _sovrastante_ $K_2$:
$
L(K_1 union K_2) colon.eq delta L(K_1) L(K_2)
#h(2em)
delta colon.eq (a + a^(-1)) slash z - 1
$
2. Se $K = K_1 union K_2$: $L(K_1 union K_2) colon.eq delta L(K_1) L(K_2)$ #h(1fr) (con $delta colon.eq (a + 1 slash a) / z - 1$)
3. Altrimenti $K = K_1 union dotss union K_n$:
#v(0.75em)
a) Se $n > 1$: $display(
a) #h(0.35em) Se $n > 1$: $display(
L_K (a, z) colon.eq
1 / (2n)
sum_(i=1)^n sum_(q=p_i, overline(p)_i)
@ -672,7 +704,7 @@ dove $L_K$ di un diagramma orientato è definito dimenticando l'orientazione.
#v(1.5em)
b) Se $n=1$: $display(
b) #h(0.35em) Se $n=1$: $display(
L_K (a, z) colon.eq
1 / 2
sum_(q = p, overline(p))
@ -684,55 +716,86 @@ dove $L_K$ di un diagramma orientato è definito dimenticando l'orientazione.
== Ipotesi induttiva
Bla bla bla
#slide[
= Laboratorio Computazionale
L'ipotesi induttiva che useremo nel corso della dimostrazione è la seguente:
== Implementazione e Verifica
#set par(spacing: 1.5em)
#set list(spacing: 1.5em)
#set enum(numbering: "a)", spacing: 1.5em)
#slide[
*Progetto Computazionale:*
Per ogni diagramma di link $K$ con $< N$ incroci e per diagrammi contenenti $#skein.over-twist-large$ con $< N$ incroci:
1. $L_K$ è ben definito (non dipende dalla scelta di punto base).
- *Implementazione in Python*: Algoritmo basato sulle relazioni skein
- *Calcolo automatico* di $L_K$ e $F_K$ per diagrammi di nodi
- *Interfaccia user-friendly* per l'inserimento di diagrammi
2. $L_K$ verifica gli assiomi:
#pause
- $L[K] + L[S_i K] = z ( L[e_i K] + L[E_i K] )$
*Verifica sperimentale:*
- Confronto con il database *KnotInfo*
- Verifica su centinaia di nodi noti
- Test di coerenza con valori pubblicati
- $L[#skein.over-twist-large] = a L [#skein.strand-large]$, $L[#skein.under-twist-large] = a^(-1) L [#skein.strand-large]$
#pause
3. $L_K$ è invariante per mosse di tipo II e III che non aumentano il numero di incroci.
*Risultato Principale:* Trovato un *errore* nel valore per il nodo $10_125$.
4. Se $K$ ammette una _funzione di slacciamento_ allora $L_K = a^w(K)$
]
== Conclusioni
== Dimostrazione buona definizione
#slide[
*Percorso compiuto:*
1. Dal concetto geometrico di nodo alla formalizzazione tramite diagrammi
2. Definizione dell'isotopia regolare e degli invarianti
3. Costruzione rigorosa del polinomio di Kauffman
4. Dimostrazione della buona definizione
5. Estensione agli invarianti di isotopia ambiente
#pause
*Risultati principali:*
- *Dimostrazione* della buona definizione di $L_K$
- *Costruzione* di $F_K$ come invariante ambiente
- *Verifica computazionale* e scoperta di errori nella letteratura
#pause
#align(center)[
#text(size: 1.2em, weight: "bold")[
Grazie per l'attenzione!
]
]
#set par(spacing: 1.25em)
#set list(spacing: 1.25em)
#set enum(numbering: "a)", spacing: 1.25em)
_Dimostrazione._
*Domande?*
1. $L_K$ è ben definito (non dipende dalla scelta di punto base)
- Invarianza $sum_K (lambda)$ per $1$-rotazioni
- Caso più componenti
- Caso una sola componente
- Splice di un nodo in forma discendente
- Assiomi di $L_K$ per nodi in forma discendente
2. $L_K$ verifica gli assiomi
3. $L_K$ è invariante per mosse di tipo II e III che non aumentano il numero di incroci
4. Se $K$ ammette una _funzione di slacciamento_ allora $L_K = a^w(K)$
]
= Laboratorio Computazionale
== Implementazione in Python
#show raw: set text(size: 15pt)
#set par(spacing: 1.25em)
#set list(spacing: 1.25em)
#set enum(numbering: "a)", spacing: 1.25em)
Implementazioni esistenti:
- *KnotScape*: scritto in C, degli anni '90.
- *KnotTheory*: ultimo aggiornamento \~2011, per Mathematica.
#pause
Per il progetto di Lab. Comp. abbiamo scritto una *nuova implementazione* in _Python_ open source:
- Rappresentazione di nodi attraverso codici *PD* e *SG*.
- Algoritmo per il calcolo di $L_K$ e $F_K$.
#pause
- Verifica di tutti i polinomi contenuti nel *database di KnotInfo*.
- _Trovato un errore nel nodo_ $10_125$, c'è $L_m(K)$ invece di $L_K$.
== Fine
#" "

Loading…
Cancel
Save