Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #NoEnv ; Recommended for performance and compatibility with future AutoHotkey releases.
- SendMode Input ; Recommended for new scripts due to its superior speed and reliability.
- SetWorkingDir %A_ScriptDir% ; Ensures a consistent starting directory.
- ; Endringslogg;
- ; Versjon 2 - Funksjonen msPaintSetColorDecimal() for endring av forgrunnsfarge. Nå husker den de forrige
- ; fargene. Dvs dersom grønn er uendret, så skippes feltet grønt. Dette kan spare noe tid totalt.
- ; Next: Opptegning én farge av gangen.
- ; Versjon 2b - Prøveversjon. Tegner opp strek der hvor samme farge gjentas.
- ; Testen viser at 2b ikke fungerer etter hensikt:
- ; * Tar lengre tid enn versjon 2 å fullføre tegning i Paint (samme skjermbilde)
- ; * BUG #1: Sort tekst på hvit bakgrunn. Tegner opp feil, fyller det hvite med sort (tror sjekk av hvit-farge er årsaken)
- ; * BUG #2: Bør sjekke NESTE pikselverdi snarere enn forrige. Dette pga nå tegner første piksel FØR linje tegner over samme pikselen.
- ; Versjon 2b.1
- ; x Prøve å luke ut feil med opptegning der bakgrunn matcher transparent farge
- ; x Sjekker NESTE pikselverdi heller enn forrige.
- ; NYE BUGS i testversjon 2b.1
- ; x Tegner feil. Ser ut til å være relatert til fargen 0x000000 (svart) [glemt å fjerne variabel lastColor under strekStart rutina]
- ; x Fargeskift. Skriver over i feltene selv om fargekomponenten hadde samme verdi som før [testet, feil ikke reell]
- ; x Statistikk burde vise antall opptegnede enkeltpiksler, antall hele linjer (alt over 2 px i lengde) + antall skippede hvite piksler.
- ; - Fargeskift. Ved påtruffet transparent farge og tilbake til neste farge, så er det full runde med "Rediger farger" - selv om samme farge som før transparent [skal utbedres i versjon 2b.2]
- ; Versjon 2b.2
- ; x Funksjonen msPaintSetColorDecimal() skal huske forrige verdisett. Dersom ingen verdier er endret så skippes åpning av "Rediger farger" vinduet. Sparer tid.
- ; x MsgBox etter opptegning - endrer litt så riktig overskrift fremtrer (ikke navnet på ahk fila) [1. argument av 3 settes til 0]
- ; Tidsbesparelse i forhold til 2b.1 - 1622 sekunder vs. 1808 sekunder (ca 10,3% besparelse i tid)
- ; Next - utnytte standardfarger i Windows.
- ; Versjon 2b.3
- ; Utnytter standardfarger i Windows. NB tilpasset engelsk versjon av Paint.
- ; BUG - Ved sort (0x000000) så klarer'n ikke å utnytte standardfarge [LØST]
- ; BUG #2 - Oppdaget i versjon 2b.4 (ikke fikset her)
- ; Versjon 2b.4
- ; Ctrl+1 og Ctrl+2 skal lese inn pikselverdier for hjørnekoordinater på skjerm uavhengig av skjermbilde.
- ; BUG - ved henting av mange standardfarger etter hverandre [LØST (linje 436)]
- ; Versjon 2b.5
- ; Ny feature som skal forbedre tegnetiden betydelig: Tegning av vertikale streker. Inntreffer når fargen under matcher.
- ; PROBLEM: Der store områder tegnes m ensarted farge, tar det lang tid å traversere det aktuelle området i etterkant.
- ; selv om ingenting tegnes inn. Oppleves som en "pause"
- ; Må legge til offset for å treffe riktig posisjon på tegneflata.
- canvasOffsetX := 64
- canvasOffsetY := 54
- PixelColorSkipWhiteValue := 0xFFFFFF
- ; ÅPNE PROGRAM
- /*
- EnvGet, envarSystemRoot, SystemRoot
- Run, %envarSystemRoot%\system32\mspaint.exe, , Max, msPaintOpenPID
- WinWaitActive, ahk_class MSPaintApp
- */
- #IfWInActive, ahk_class MSPaintApp
- ; Ctrl+P ---> Begynne å tegne inn.
- ^p::
- KeyWait, p
- If (!Width) {
- MsgBox, Skjerm ikke avlest, Skjermbilde må avleses før inntegning i Paint.
- Return
- }
- thisPixelTransparent := 0
- StartTime := A_TickCount
- r := 0
- g := 0
- b := 0
- ; 1. Setter dimensjon på tegneflaten
- msPaintsetImageDimensions(Width, Height)
- Sleep 500
- ; 2. Velger tegneverktøy, Blyant
- Click 18,134 ; Knappen "Blyant"
- Sleep 500
- ; 3. Påbegynner inntegning.
- progressTotal := Width * Height
- progressCurrent := 0
- progressPercent := 0
- statistikkHvitepiksler := 0
- statistikkStreker := 0
- statistikkEnkeltPiksler := 0
- statistikkVertikaleStreker := 0
- i = 1
- j = 1
- Loop, %Height%
- {
- j := A_Index
- strekStart := 0
- Loop, %Width%
- {
- If GetKeyState("Esc")
- ExitApp, 1
- i := A_Index
- i2 := i +1
- ; Sjekke for transparent pikselfarge
- If (PixelColorSkipWhiteValue = farge_%i%_%j%) {
- thisPixelTransparent := 1
- statistikkHvitepiksler++
- } Else {
- thisColor := farge_%i%_%j%
- thisPixelTransparent := 0
- }
- If (i < Width)
- nextColor := farge_%i2%_%j%
- ; VISUELL OPPDATERING AV FREMDRIFT. BALOONTIP
- progressCurrent++
- If (!Mod(progressCurrent, 50)) {
- progressPercent := Floor(((progressCurrent / progressTotal) * 100)+ 0.5)
- TrayTip, Prosentvis fremdrift opptegning, %progressPercent% prosent`nLinje/rad %j%`nBredde %Width% og høyde %Height%`nTotalt antall piksler er %progressTotal%`nCurrent progress er %progressCurrent%`nStatistikk:`n Transparente piksler (ikke inntegnet) = %statistikkHvitepiksler%`n Enkeststående piklser inntegnet = %statistikkEnkeltPiksler%`n Inntegnede linjer (alt over 2 px lange) = %statistikkStreker%`n Inntegnede vertikale linjer = %statistikkVertikaleStreker%
- }
- If (strekStart) {
- ; Modus - leter etter enden av samme fargen
- If (thisColor != nextColor) {
- ; Kommet over ulik farge (hvit piksel inkludert), dvs definerer slutt på strek
- ; 1. Endre forgrunnsfarge til thisColor
- fargedeling(thisColor, r, g, b)
- msPaintSetColorDecimal(r,g,b,thisColor)
- ; 2. Tegne strek fra "strekStart" --> i-1
- msPaintDrawLine(strekStart, j, i, j)
- statistikkStreker++
- ; 3. Nulle ut variabel "strekStart"
- strekStart := 0
- Continue
- } Else If (i = Width) {
- ; Kommet til piksel lengst til høyre. Ettersom "strekStart" ikke er nullet ut så må nødvendigvis streken tegnes hit.
- ; 1. Endre forgrunnsfarge til thisColor
- fargedeling(thisColor, r, g, b)
- msPaintSetColorDecimal(r,g,b,thisColor)
- ; 2. Tegne strek fra "strekStart" --> i
- msPaintDrawLine(strekStart, j, i, j)
- statistikkStreker++
- ; 3. Nulle ut variabel "strekStart"
- strekStart := 0
- Continue
- } Else
- ; Samme farge - fortsett å lete etter ulik fage.
- Continue
- } ; if strekStart (søkemodus etter samme farger)
- ; Dersom fargeverdien matcher transparent fargeverdi, gå videre
- If (thisPixelTransparent) {
- Continue
- }
- ; VERTIKAL STREK V 2b.5 START
- ; Tester for vertikal strek (nedover)
- If (j > Height -2)
- Goto, skipVertikalStrekSearch
- J2 := j +1
- If (farge_%i%_%j2% != thisColor)
- Goto, skipVertikalStrekSearch
- ; Kommer hit - Det eksisterer en fargeverdi under med samme fargeverdi. Initiere fortsatt søk i retning nedover
- While 1
- {
- If (thisColor != farge_%i%_%j2%) {
- ; Fargen er ulik. Forrige posisjon av J2 var siste matchende farge.
- J2--
- Break
- }
- ; Fargen er lik. Setter fargen under til hvit (så ikke samme piksel prosseseres to ganger)
- farge_%i%_%j2% := PixelColorSkipWhiteValue
- ; Hindrer å søke nedafor nederste linje.
- If (J2 = Height)
- Break
- J2++
- }
- ; Hit. J2 angir Y-posisjonen som streken skal tegnes TIL...
- ; 1. Endre forgrunnsfarge til thisColor
- fargedeling(thisColor, r, g, b)
- msPaintSetColorDecimal(r,g,b,thisColor)
- ; 2. Tegne strek fra (i,j) til (i,J2)
- msPaintDrawLine(i, j, i, J2)
- statistikkVertikaleStreker++
- ; Sette fargen for de aktuelle pikslene til hvit (så ikke samme piksel prosseseres to ganger)
- J3 := j
- Loop {
- J3++
- farge_%i%_%j3% := PixelColorSkipWhiteValue
- statistikkHvitepiksler--
- } Until (J3 = J2)
- Continue
- skipVertikalStrekSearch:
- ; VERTIKAL STREK V 2b.5 END
- ; Deteksjon av der NESTE farge er lik. Kan ikke forekomme på siste piksel i en px-rad
- ; Vil ikke kunne forekomme der fargeverdien er transparent (sjekk utført tidligere)
- If (thisColor=nextColor && i<Width) {
- ; Matcher neste farge. Angir hvor streken skal starte å tegnes FRA (x-verdi)
- strekStart := i
- ; Variabel statistikkStreker oppdateres etter at strekene faktisk er inntegnet.
- Continue
- }
- ; Foranstående tester har allerede utelukket muligheten for samme fargeverdi.
- ; Derfor er testen for farge-ulikhet fjernet herfra. Går rett på sak nemlig.
- fargedeling(thisColor, r, g, b)
- msPaintSetColorDecimal(r,g,b,thisColor)
- msPaintPaintDot(i, j, 0)
- statistikkEnkeltPiksler++
- } ; inner loop (i)
- } ; Outer loop (j)
- ; Oppdatere statistikk etter endt tegning.
- progressPercent := Floor(((progressCurrent / progressTotal) * 100)+ 0.5)
- tidsforbruk := Round((A_TickCount - StartTime) / 1000, 1)
- MsgBox, 0, Opptegning ferdig, %progressPercent% prosent`nLinje/rad %j%`nBredde %Width% og høyde %Height%`nTotalt antall piksler er %progressTotal%`nCurrent progress er %progressCurrent%`nStatistikk:`n Transparente piksler (ikke inntegnet) = %statistikkHvitepiksler%`n Enkeststående piklser inntegnet = %statistikkEnkeltPiksler%`n Inntegnede linjer (alt over 2 px lange) = %statistikkStreker%`n Inntegnede vertikale linjer = %statistikkVertikaleStreker%`n`nTidsforbruk på opptegning: %tidsforbruk% sekunder.
- Return
- ; Teste "Rediger farger"
- ^t::
- MsgBox, kjem hit
- Loop, 10
- {
- msPaintSetColorDecimal(100,100,100)
- msPaintSetColorDecimal(100,0,100)
- msPaintSetColorDecimal(100,100,0)
- msPaintSetColorDecimal(0,100,0)
- msPaintSetColorDecimal(0,100,100)
- }
- Return
- #If
- ; Ctrl+T ---> TEST
- ^t::
- r := g := b := 0
- fargedeling(0x88BBFF, r, g, b)
- MsgBox, 0, Fargeverdier oppdelt, Rød %r%`nGrønn %g%`nBlå %b%
- Return
- ; Ctrl+P ---> Laste inn fra PixelGetColor for aktuelt skjembilde.
- ^p::
- WinGetActiveStats, Title, Width, Height, X, Y
- progressTotal := Width * Height
- StartTime := A_TickCount
- KeyWait, p
- progressCurrent := 0
- progressPercent := 0
- i = 1
- j = 1
- Loop, %Height%
- {
- j := A_Index
- Loop, %Width%
- {
- If GetKeyState("Esc")
- ExitApp, 1
- i := A_Index
- PixelGetColor, memGetFarge, i, j, RGB
- farge_%i%_%j% := memGetFarge
- progressCurrent++
- ;MouseMove, j, i, 0
- If (!Mod(progressCurrent, 50)) {
- progressPercent := Floor(((progressCurrent / progressTotal) * 100)+ 0.5)
- TrayTip, Prosentvis fremdrift, %progressPercent% prosent`nLinjer = %i%`nPiksler neste linje %j%`nBredde %Width% og høyde %Height%`nTotalt antall piksler er %progressTotal%`nCurrent progress er %progressCurrent%
- }
- }
- }
- progressPercent := Floor(((progressCurrent / progressTotal) * 100)+ 0.5)
- TrayTip, Prosentvis fremdrift, %progressPercent% prosent`nLinjer = %i%`nPiksler neste linje %j%`nBredde %Width% og høyde %Height%`nTotalt antall piksler er %progressTotal%`nCurrent progress er %progressCurrent%
- tidsforbruk := Round((A_TickCount - StartTime) / 1000, 1)
- MsgBox, Tidsforbruk, Det tok følgende tid å lese inn pikselverdiene:`n%tidsforbruk% sekunder...
- Return
- ; Ctrl+1 - Venstre øvre hjørne defineres.
- ^1::
- MouseGetPos, offsetX, offsetY
- TrayTip, Offset verdier angitt, Offset X = %offsetX%`nOffset Y = %offsetY%
- Return
- ; Ctrl+2 - Høyre nedre hjørne defineres + innlesing utføres.
- ^2::
- ; Sjekker om offsetX er definert. Dette kan være et problem like etter at scriptet er startet opp.
- If (offsetX = "") {
- MsgBox, 0, Venstre øvre hjørne ikke angitt, Trykk på Ctrl+1 når musepeker er plassert over`nønsket posisjon.
- Return
- }
- MouseGetPos, corner2positionX, corner2positionY
- ; Sjekker at nedre høyre hjørne faktisk er lengre ned og lengre til høyre i forhold til offset.
- If !(offsetX < corner2positionX && offsetY < corner2positionY) {
- MsgBox, 0, Ugyldige hjørnekoordinater, Hjørne 2 er ikke reelt plassert lenger mot høyre og lenger ned enn offset.`nPrøv igjen - Husk at Ctrl+1 for offset kan kjøres utallige ganger etter hverandre...
- Return
- }
- Width := corner2positionX - offsetX
- Height := corner2positionY - offsetY
- progressTotal := Width * Height
- StartTime := A_TickCount
- KeyWait, 2
- progressCurrent := 0
- progressPercent := 0
- Loop, %Height%
- {
- j_offset := A_Index + offsetY -1
- j := A_Index
- Loop, %Width%
- {
- If GetKeyState("Esc")
- ExitApp, 1
- i_offset := A_Index + offsetX -1
- i := A_Index
- PixelGetColor, memGetFarge, i_offset, j_offset, RGB
- farge_%i%_%j% := memGetFarge
- progressCurrent++
- ;mmm := farge_%i%_%j%
- ;MouseMove, i, j, 0
- ;TrayTip, fargesjekk innlest verdi, farge_%i%_%j% `t%mmm%
- ;Sleep 20
- If (!Mod(progressCurrent, 50)) {
- progressPercent := Floor(((progressCurrent / progressTotal) * 100)+ 0.5)
- TrayTip, Prosentvis fremdrift, %progressPercent% prosent`nLinjer = %i%`nPiksler neste linje %j%`nBredde %Width% og høyde %Height%`nTotalt antall piksler er %progressTotal%`nCurrent progress er %progressCurrent%
- }
- }
- }
- progressPercent := Floor(((progressCurrent / progressTotal) * 100)+ 0.5)
- TrayTip, Prosentvis fremdrift, %progressPercent% prosent`nLinjer = %i%`nPiksler neste linje %j%`nBredde %Width% og høyde %Height%`nTotalt antall piksler er %progressTotal%`nCurrent progress er %progressCurrent%
- tidsforbruk := Round((A_TickCount - StartTime) / 1000, 1)
- MsgBox, Tidsforbruk, Det tok følgende tid å lese inn pikselverdiene:`n%tidsforbruk% sekunder...
- Return
- ; Ikke bruk for denne lenger.
- /*
- ; Ctrl+D ---> Dumpe.
- ^d::
- KeyWait, d
- If (!Width) {
- MsgBox, Skjerm ikke avlest, Skjermbilde må avleses før inntegning i Paint.
- Return
- }
- Loop, %Height%
- {
- j := A_Index
- Loop, %Width%
- {
- If GetKeyState("Esc")
- ExitApp, 1
- i := A_Index
- StringPaste := "Array(" . i . ", " . j . ") =`t" . farge_%i%_%j%
- ;MsgBox, 0, Stringpaste, %StringPaste%
- SendInput, %StringPaste%`n
- Sleep 2
- }
- }
- Return
- */
- ; -------------------------- FUNKSJONER -------------------------------
- ; Setter størrelsen på tegneflaten (canvas)
- msPaintsetImageDimensions(x,y) {
- IfWinNotActive, ahk_class MSPaintApp
- {
- MsgBox, Paint må være aktivt vindu for å kunne endre størrelse!
- Return
- }
- SendInput {Ctrl down}e{Ctrl up}
- SendInput %x%
- SendInput {Tab}
- SendInput %y%
- SendInput {Enter}
- WinWaitNotActive, ahk_class #32770
- }
- ; Definere farge (på "blyant") i Paint.
- ; Versjon 2: Static på hver fargeverdi og skippe aventuelle farger som IKKE er endret siden siste oppdatering. Dette for å unngå at samme verdien overskriver
- ; Versjon 2b.2 - Skipper åpning av "Rediger farger" dialogboks dersom ingen av verdiene er endret siden sist.
- msPaintSetColorDecimal(r,g,b, hexverdi:=0x000000) {
- Static r_last, g_last, b_last
- Static standardFarger, std_x, std_y, std_fargeIndeks
- If (!standardFarger.MaxIndex()) {
- standardFarger := [0x000000,0x400000,0x800000,0x804040,0xFF0000,0xFF8080, 0x808000,0x804000,0xFF8000,0xFF8040,0xFFFF00,0xFFFF80 ,0x808040,0x004000,0x008000,0x00FF00,0x80FF00,0x80FF80 ,0x808080,0x004040,0x008040,0x008080,0x00FF40,0x00FF80 ,0x408080,0x000080,0x0000FF,0x004080,0x00FFFF,0x80FFFF ,0xC0C0C0,0x000040,0x0000A0,0x8080FF,0x0080C0,0x0080FF ,0x400040,0x400040,0x800080,0x800040,0x8080C0,0xFF80C0 ,0xFFFFFF,0x400080,0x8000FF,0xFF0080,0xFF00FF,0xFF80FF]
- std_x := [22,22,22,22,22,22,48,48,48,48,48,48,71,71,71,71,71,71,96,96,96,96,96,96,121,121,121,121,121,121,147,147,147,147,147,147,172,172,172,172,172,172,197,197,197,197,197,197]
- std_y := [172,152,129,104,84,64,172,152,129,104,84,64,172,152,129,104,84,64,172,152,129,104,84,64,172,152,129,104,84,64,172,152,129,104,84,64,172,152,129,104,84,64,172,152,129,104,84,64]
- std_fargeIndeks := 0
- }
- If (r=r_last && g=g_last && b=b_last) ; Ingen endring
- Return
- IfWinNotActive, ahk_class MSPaintApp
- {
- MsgBox, Paint må være aktivt vindu for å kunne endre fargen!
- Return
- }
- MouseGetPos, musX, musY
- SendInput {Alt down}a{Alt up} ; Aktiverer menyen "Farger"
- SendInput {Enter} ; Velge eneste menyvalg "Rediger farger" (funker ikke i engelsk versjon av XP)
- WinWaitActive, Rediger farger
- ; Engelsk versjon (kommentert bort)
- /*
- Click 157,39 ; Meny "Farger"
- Sleep 5
- Click 178,62 ; undermeny "Edit Colors"
- WinWaitActive, Edit Colors
- */
- ; Kalle opp funksjon som håndterer matrise. Dvs leter etter standardfarger.
- If sjekkStandardFarger(hexverdi, standardFarger, std_x, std_y, std_fargeIndeks)
- {
- TrayTip, Standardfarge funnet, Fargeverdien er %hexverdi%
- MouseMove, std_x[std_fargeIndeks], std_y[std_fargeIndeks]
- Sleep 4
- Click
- }
- Else
- {
- ; Definere fargen selv, ikke representert blandt standardfargene...
- Click, 82,279 ; Knappen "Define Custom Colors >>"
- ; FReq: Vente/polle på at vinduet får en gitt bredde
- Sleep, 10
- If (r != r_last) {
- SendInput {Alt down}r{Alt up} ; Engelsk "r" (samme)
- Sleep 2
- SendInput %r%
- Sleep 2
- }
- If (g != g_last) {
- SendInput {Alt down}g{Alt up} ; Engelsk "g" (samme)
- Sleep 2
- SendInput %g%
- Sleep 2
- }
- If (b != b_last) {
- SendInput {Alt down}b{Alt up} ; Engelsk "u"
- Sleep 2
- SendInput %b%
- Sleep 2
- }
- }
- Sleep 10
- Click 45,304 ; Knappen "Ok"
- r_last := r
- g_last := g
- b_last := b
- WinWaitNotActive, Rediger farger
- If mouseReset
- MouseMove, musX, musY, 0
- }
- ; Hånderer matrise med stnadardfarger.
- ; Returverdier. 1=farge match, 0=ingen std. farge matcher
- sjekkStandardFarger(hexverdi, ByRef standardFarger, ByRef std_x, ByRef std_y, ByRef std_fargeIndeks) {
- Loop, 48
- {
- If (hexverdi = standardFarger[A_Index]) {
- If (A_Index < 3) {
- std_fargeIndeks := A_Index
- Return 1
- }
- n_minus := A_Index -1
- tmp_standardFarger := standardFarger[n_minus]
- tmp_x := std_x[n_minus]
- tmp_y := std_y[n_minus]
- standardFarger[n_minus] := standardFarger[A_Index]
- std_x[n_minus] := std_x[A_Index]
- std_y[n_minus] := std_y[A_Index]
- standardFarger[A_Index] := tmp_standardFarger
- std_x[A_Index] := tmp_x
- std_y[A_Index] := tmp_y
- std_fargeIndeks := n_minus
- Return 1
- }
- }
- Return 0
- }
- ; Tegner én enkelt pixel
- msPaintPaintDot(x, y, forsinke:=0) {
- ; ENGELSK: Verdier er hhv. 64x54
- static canvasOffsetX = 64
- static canvasOffsetY = 46
- paintDotX := canvasOffsetX + x
- paintDotY := canvasOffsetY + y
- Click, %paintDotX%, %paintDotY%
- If forsinke
- Sleep forsinke
- }
- ; Tegner linje fra startposisjon til sluttposisjon.
- msPaintDrawLine(x1, y1, x2, y2) {
- ; ENGELSK: Verdier er hhv. 64x54
- static canvasOffsetX = 64
- static canvasOffsetY = 46
- paintDotX1 := canvasOffsetX + x1
- paintDotY1 := canvasOffsetY + y1
- paintDotX2 := canvasOffsetX + x2
- paintDotY2 := canvasOffsetY + y2
- MouseMove, paintDotX1, paintDotY1
- Click down
- ;Sleep 20
- MouseMove, paintDotX2, paintDotY2
- ;Sleep 20
- Click up
- }
- ; Fargeverdi oppdeling.
- fargedeling(hexverdi, ByRef r_desimal, ByRef g_desimal, ByRef b_desimal) {
- ;http://www.autohotkey.com/board/topic/64390-getpixelcolor-how-to-separate-rgb-values/
- vblue := (hexverdi & 0xFF)
- vgreen := ((hexverdi & 0xFF00) >> 8)
- vred := ((hexverdi & 0xFF0000) >> 16)
- r_desimal := vred
- g_desimal := vgreen
- b_desimal := vblue
- }
- ; Konvertere HEX til desimal (ikke brukt)
- heksTilDesimal(HX) {
- ;MsgBox, funksjonen heksTilDesimal, Parameter er %HX%
- HK = 0x%HX%
- SetFormat Integer, H
- Nummer := HK + 0
- SetFormat Integer, D
- NummerD := Nummer + 0
- ;MsgBox, Nummeret desikmal er %NummerD%
- Return NummerD
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement