trackler 2.0.8.34 → 2.0.8.35
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/trackler/version.rb +1 -1
- data/tracks/c/exercises/phone-number/src/example.c +6 -6
- data/tracks/c/exercises/phone-number/test/test_phone_number.c +50 -5
- data/tracks/csharp/exercises/beer-song/BeerSong.cs +2 -2
- data/tracks/csharp/exercises/beer-song/BeerSongTest.cs +390 -0
- data/tracks/csharp/exercises/beer-song/Example.cs +3 -8
- data/tracks/csharp/exercises/wordy/Example.cs +3 -3
- data/tracks/csharp/exercises/wordy/Wordy.cs +2 -2
- data/tracks/csharp/exercises/wordy/WordyTest.cs +35 -35
- data/tracks/csharp/generators/Data/CanonicalDataValue.cs +17 -3
- data/tracks/csharp/generators/Exercises/BeerSongExercise.cs +33 -0
- data/tracks/csharp/generators/Exercises/EqualityExercise.cs +6 -1
- data/tracks/csharp/generators/Exercises/FoodChainExercise.cs +1 -1
- data/tracks/csharp/generators/Exercises/HelloWorldExercise.cs +9 -0
- data/tracks/csharp/generators/Exercises/NthPrimeExercise.cs +7 -8
- data/tracks/csharp/generators/Exercises/WordyExercise.cs +20 -0
- data/tracks/csharp/generators/Methods/TestMethodOptions.cs +1 -0
- data/tracks/elixir/README.md +1 -1
- data/tracks/go/config.json +9 -0
- data/tracks/go/exercises/accumulate/accumulate.go +5 -0
- data/tracks/go/exercises/change/cases_test.go +83 -0
- data/tracks/go/exercises/change/change_test.go +48 -0
- data/tracks/go/exercises/change/example.go +153 -0
- data/tracks/go/exercises/change/example_gen.go +96 -0
- data/tracks/java/exercises/beer-song/src/example/java/BeerSong.java +4 -7
- data/tracks/java/exercises/beer-song/src/test/java/BeerSongTest.java +15 -7
- data/tracks/julia/img/icon.png +0 -0
- data/tracks/julia/img/icon.svg +49 -11
- data/tracks/objective-c/exercises/bracket-push/BracketPushExample.h +0 -1
- data/tracks/objective-c/exercises/bracket-push/BracketPushExample.m +41 -379
- data/tracks/objective-c/exercises/bracket-push/BracketPushTest.m +12 -32
- data/tracks/objective-c/exercises/sublist/SublistExample.h +8 -1
- data/tracks/objective-c/exercises/sublist/SublistExample.m +27 -42
- data/tracks/objective-c/exercises/sublist/SublistTest.m +17 -20
- data/tracks/python/exercises/say/say_test.py +16 -11
- data/tracks/scala/exercises/pangram/src/test/scala/PangramTest.scala +6 -5
- data/tracks/swift/exercises/bob/Sources/BobExample.swift +2 -2
- data/tracks/swift/exercises/bob/Tests/BobTests/BobTests.swift +8 -8
- metadata +11 -3
- data/tracks/csharp/exercises/beer-song/BeerTest.cs +0 -22
@@ -0,0 +1,48 @@
|
|
1
|
+
package change
|
2
|
+
|
3
|
+
import (
|
4
|
+
"reflect"
|
5
|
+
"testing"
|
6
|
+
)
|
7
|
+
|
8
|
+
const targetTestVersion = 1
|
9
|
+
|
10
|
+
func TestTestVersion(t *testing.T) {
|
11
|
+
if testVersion != targetTestVersion {
|
12
|
+
t.Fatalf("Found testVersion = %v, want %v", testVersion, targetTestVersion)
|
13
|
+
}
|
14
|
+
}
|
15
|
+
|
16
|
+
func TestChange(t *testing.T) {
|
17
|
+
for _, tc := range testCases {
|
18
|
+
actual, err := Change(tc.coins, tc.target)
|
19
|
+
if tc.valid {
|
20
|
+
if err != nil {
|
21
|
+
t.Fatalf("%s : Change(%v, %d): expected %v, got error %s",
|
22
|
+
tc.description, tc.coins, tc.target, tc.expectedChange, err)
|
23
|
+
} else {
|
24
|
+
if !reflect.DeepEqual(actual, tc.expectedChange) {
|
25
|
+
t.Fatalf("%s : Change(%v, %d): expected %v, actual %v",
|
26
|
+
tc.description, tc.coins, tc.target, tc.expectedChange, actual)
|
27
|
+
} else {
|
28
|
+
t.Logf("PASS: %s", tc.description)
|
29
|
+
}
|
30
|
+
}
|
31
|
+
} else {
|
32
|
+
if err == nil {
|
33
|
+
t.Fatalf("%s : Change(%v, %d): expected error, got %v",
|
34
|
+
tc.description, tc.coins, tc.target, actual)
|
35
|
+
} else {
|
36
|
+
t.Logf("PASS: %s", tc.description)
|
37
|
+
}
|
38
|
+
}
|
39
|
+
}
|
40
|
+
}
|
41
|
+
|
42
|
+
func BenchmarkChange(b *testing.B) {
|
43
|
+
for _, tc := range testCases {
|
44
|
+
for i := 0; i < b.N; i++ {
|
45
|
+
Change(tc.coins, tc.target)
|
46
|
+
}
|
47
|
+
}
|
48
|
+
}
|
@@ -0,0 +1,153 @@
|
|
1
|
+
// Package change demonstrates making change with fewest number of coins.
|
2
|
+
package change
|
3
|
+
|
4
|
+
import (
|
5
|
+
"errors"
|
6
|
+
"sort"
|
7
|
+
)
|
8
|
+
|
9
|
+
const testVersion = 1
|
10
|
+
|
11
|
+
var (
|
12
|
+
ErrNoSolutionFound = errors.New("No solution")
|
13
|
+
ErrNegativeTarget = errors.New("Negative Target")
|
14
|
+
)
|
15
|
+
|
16
|
+
// Change returns a list of coins in increasing value order to make
|
17
|
+
// change for target amount from the coins given; an infinite supply of coins is assumed.
|
18
|
+
func Change(coins []int, target int) ([]int, error) {
|
19
|
+
var solution []int
|
20
|
+
if target == 0 {
|
21
|
+
// No change needed for 0.
|
22
|
+
return []int{}, nil
|
23
|
+
}
|
24
|
+
if target < 0 {
|
25
|
+
// No change possible for negative.
|
26
|
+
return nil, ErrNegativeTarget
|
27
|
+
}
|
28
|
+
findSolution(coins, target, &solution)
|
29
|
+
if len(solution) == 0 {
|
30
|
+
// No solution possible with coins given.
|
31
|
+
return nil, ErrNoSolutionFound
|
32
|
+
}
|
33
|
+
return solution, nil
|
34
|
+
}
|
35
|
+
|
36
|
+
// findSolution attempts to find a change solution for target amount
|
37
|
+
// from the coins given.
|
38
|
+
func findSolution(coins []int, target int, s *[]int) {
|
39
|
+
// Find the coins to consider, less than the target change amount.
|
40
|
+
last := len(coins) - 1
|
41
|
+
for ; last >= 0; last-- {
|
42
|
+
if coins[last] == target {
|
43
|
+
// Perfect single coin solution, so done!
|
44
|
+
*s = []int{target}
|
45
|
+
return
|
46
|
+
}
|
47
|
+
if coins[last] > target {
|
48
|
+
// Cannot use this too large coin.
|
49
|
+
continue
|
50
|
+
}
|
51
|
+
// Now, 0 .. last are the coins to consider.
|
52
|
+
break
|
53
|
+
}
|
54
|
+
if last < 0 {
|
55
|
+
// All coins larger than target.
|
56
|
+
return
|
57
|
+
}
|
58
|
+
|
59
|
+
bestsize := target + 1 // an initial "worst" bestsize
|
60
|
+
findUsingPartialSolution(nil, coins[0:last+1], target, s, &bestsize)
|
61
|
+
}
|
62
|
+
|
63
|
+
// updateSolution updates solution with newsolution if no prior solution
|
64
|
+
// or when length of newsolution is better.
|
65
|
+
func updateSolution(newsolution []int, solution *[]int, bestsize *int) {
|
66
|
+
if len(*solution) == 0 || len(newsolution) < len(*solution) {
|
67
|
+
*bestsize = len(newsolution)
|
68
|
+
*solution = make([]int, len(newsolution))
|
69
|
+
copy(*solution, newsolution)
|
70
|
+
sort.Ints(*solution)
|
71
|
+
}
|
72
|
+
}
|
73
|
+
|
74
|
+
// findUsingPartialSolution takes a partial solution, and coin list c looking to meet target
|
75
|
+
// while updating solution s to include partial plus the coins meeting target.
|
76
|
+
func findUsingPartialSolution(partial []int, c []int, target int, s *[]int, bestsize *int) {
|
77
|
+
// We want to consider coins in c in largest to smallest order.
|
78
|
+
sort.Sort(sort.Reverse(sort.IntSlice(c)))
|
79
|
+
|
80
|
+
for e, coin := range c {
|
81
|
+
// Find n, which is highest number of coin that could be used in change.
|
82
|
+
n := target / coin
|
83
|
+
|
84
|
+
// Try n, n-1 ... 1
|
85
|
+
for k := n; k >= 1; k-- {
|
86
|
+
if (k * coin) == target {
|
87
|
+
// k coin(s) completes a solution.
|
88
|
+
if (len(partial) + k) < *bestsize {
|
89
|
+
list := append(partial, nCoins(k, coin)...)
|
90
|
+
updateSolution(list, s, bestsize)
|
91
|
+
}
|
92
|
+
// No need to consider smaller k for coin, so exit this loop.
|
93
|
+
break
|
94
|
+
}
|
95
|
+
if len(c) > 1 {
|
96
|
+
// k coin(s) might be potential partial solution.
|
97
|
+
newtarget := target - (k * coin)
|
98
|
+
// Use a heuristic estimate of whether a partial solution
|
99
|
+
// might be worth it: if the larget coin in c not yet used
|
100
|
+
// in an already found solution allows the new solution
|
101
|
+
// to be smaller, then it would be worth pursuing.
|
102
|
+
|
103
|
+
// Find the largest coin in c not yet used in *s solution
|
104
|
+
// omitting coin, since it is used in this partial solution.
|
105
|
+
largest := largestNotUsed(c, *s, coin)
|
106
|
+
// It will take at least the partial, plus k coins plus 1 more.
|
107
|
+
if (len(partial) + k + 1) < *bestsize {
|
108
|
+
// Calculate the minimum potential size of a solution
|
109
|
+
// which doesn't include this coin.
|
110
|
+
potentialSize := len(partial) + k + (newtarget / largest)
|
111
|
+
if (newtarget % largest) != 0 {
|
112
|
+
potentialSize++
|
113
|
+
}
|
114
|
+
if potentialSize < *bestsize {
|
115
|
+
// Put k instances of coin in a new partial solution.
|
116
|
+
newPartial := append(partial, nCoins(k, coin)...)
|
117
|
+
d := append(append([]int{}, c[:e]...), c[e+1:]...)
|
118
|
+
// Now look for solution meeting *new* target.
|
119
|
+
findUsingPartialSolution(newPartial, d, newtarget, s, bestsize)
|
120
|
+
}
|
121
|
+
}
|
122
|
+
}
|
123
|
+
}
|
124
|
+
}
|
125
|
+
}
|
126
|
+
|
127
|
+
// Find the largest coin in coins not yet used in solution, not including coin 'omit'.
|
128
|
+
// The coins are in largest to smallest order.
|
129
|
+
func largestNotUsed(coins []int, solution []int, omit int) int {
|
130
|
+
coinLoop:
|
131
|
+
for _, coin := range coins {
|
132
|
+
if coin == omit {
|
133
|
+
continue
|
134
|
+
}
|
135
|
+
for _, used := range solution {
|
136
|
+
if coin == used {
|
137
|
+
continue coinLoop
|
138
|
+
}
|
139
|
+
}
|
140
|
+
return coin
|
141
|
+
}
|
142
|
+
// Should not get here. But unity is safe return value.
|
143
|
+
return 1
|
144
|
+
}
|
145
|
+
|
146
|
+
// nCoins returns a list(slice) of length n of a specific coin value.
|
147
|
+
func nCoins(n int, coin int) []int {
|
148
|
+
coins := make([]int, n)
|
149
|
+
for i := 0; i < n; i++ {
|
150
|
+
coins[i] = coin
|
151
|
+
}
|
152
|
+
return coins
|
153
|
+
}
|
@@ -0,0 +1,96 @@
|
|
1
|
+
// +build ignore
|
2
|
+
|
3
|
+
package main
|
4
|
+
|
5
|
+
import (
|
6
|
+
"log"
|
7
|
+
"text/template"
|
8
|
+
|
9
|
+
"../../gen"
|
10
|
+
)
|
11
|
+
|
12
|
+
func main() {
|
13
|
+
t, err := template.New("").Parse(tmpl)
|
14
|
+
if err != nil {
|
15
|
+
log.Fatal(err)
|
16
|
+
}
|
17
|
+
var j js
|
18
|
+
if err := gen.Gen("change", &j, t); err != nil {
|
19
|
+
log.Fatal(err)
|
20
|
+
}
|
21
|
+
}
|
22
|
+
|
23
|
+
// The JSON structure we expect to be able to unmarshal into
|
24
|
+
type js struct {
|
25
|
+
Exercise string
|
26
|
+
Version string
|
27
|
+
Comments []string
|
28
|
+
Cases []OneCase
|
29
|
+
}
|
30
|
+
|
31
|
+
// template applied to above data structure generates the Go test cases
|
32
|
+
|
33
|
+
type OneCase struct {
|
34
|
+
Description string
|
35
|
+
Property string
|
36
|
+
Coins []int
|
37
|
+
Target int
|
38
|
+
Expected interface{}
|
39
|
+
}
|
40
|
+
|
41
|
+
func (c OneCase) Valid() bool {
|
42
|
+
valid, _ := determineExpected(c.Expected)
|
43
|
+
return valid
|
44
|
+
}
|
45
|
+
|
46
|
+
func (c OneCase) IntSlice() []int {
|
47
|
+
_, list := determineExpected(c.Expected)
|
48
|
+
return list
|
49
|
+
}
|
50
|
+
|
51
|
+
// determineExpected examines an .Expected interface{} object and determines
|
52
|
+
// whether an error is indicated by an int value (actually -1) in the JSON,
|
53
|
+
// or whether .Expected is a slice of integer coins.
|
54
|
+
func determineExpected(expected interface{}) (valid bool, list []int) {
|
55
|
+
_, ok := expected.(int)
|
56
|
+
if ok {
|
57
|
+
return false, nil
|
58
|
+
}
|
59
|
+
ilist, ok := expected.([]interface{})
|
60
|
+
if !ok {
|
61
|
+
return false, nil
|
62
|
+
}
|
63
|
+
list = make([]int, 0)
|
64
|
+
for _, iv := range ilist {
|
65
|
+
// The literals from the JSON are unmarshalled to float64 values,
|
66
|
+
// which are converted to int for the template output.
|
67
|
+
v, isFloat64 := iv.(float64)
|
68
|
+
if isFloat64 {
|
69
|
+
list = append(list, int(v))
|
70
|
+
}
|
71
|
+
}
|
72
|
+
return true, list
|
73
|
+
}
|
74
|
+
|
75
|
+
var tmpl = `package change
|
76
|
+
|
77
|
+
// Source: {{.Ori}}
|
78
|
+
{{if .Commit}}// Commit: {{.Commit}}
|
79
|
+
{{end}}
|
80
|
+
|
81
|
+
var testCases = []struct {
|
82
|
+
description string
|
83
|
+
coins []int
|
84
|
+
target int
|
85
|
+
valid bool // true => no error, false => error expected
|
86
|
+
expectedChange []int // when .valid == true, the expected change coins
|
87
|
+
}{
|
88
|
+
{{range .J.Cases}}{
|
89
|
+
{{printf "%q" .Description}},
|
90
|
+
{{printf "%#v" .Coins}},
|
91
|
+
{{printf "%d" .Target}},
|
92
|
+
{{printf "%v" .Valid}},
|
93
|
+
{{printf "%#v" .IntSlice}},
|
94
|
+
},
|
95
|
+
{{end}}}
|
96
|
+
`
|
@@ -1,8 +1,6 @@
|
|
1
1
|
public class BeerSong {
|
2
|
-
public
|
3
|
-
|
4
|
-
switch (number)
|
5
|
-
{
|
2
|
+
public String verse(int number) {
|
3
|
+
switch (number) {
|
6
4
|
case 0:
|
7
5
|
return "No more bottles of beer on the wall, no more bottles of beer.\nGo to the store and buy some more, 99 bottles of beer on the wall.\n\n";
|
8
6
|
case 1:
|
@@ -14,8 +12,7 @@ public class BeerSong {
|
|
14
12
|
}
|
15
13
|
}
|
16
14
|
|
17
|
-
public
|
18
|
-
{
|
15
|
+
public String sing(int start, int stop) {
|
19
16
|
StringBuilder songOutput = new StringBuilder();
|
20
17
|
|
21
18
|
for (int i=start; i>=stop; i--) {
|
@@ -25,7 +22,7 @@ public class BeerSong {
|
|
25
22
|
return songOutput.toString();
|
26
23
|
}
|
27
24
|
|
28
|
-
public
|
25
|
+
public String singSong() {
|
29
26
|
return sing(99,0);
|
30
27
|
}
|
31
28
|
}
|
@@ -1,15 +1,23 @@
|
|
1
1
|
import org.junit.Test;
|
2
2
|
import org.junit.Ignore;
|
3
|
+
import org.junit.Before;
|
3
4
|
|
4
5
|
import static org.junit.Assert.assertEquals;
|
5
6
|
|
6
7
|
public class BeerSongTest {
|
7
8
|
|
9
|
+
private BeerSong beerSong;
|
10
|
+
|
11
|
+
@Before
|
12
|
+
public void setup(){
|
13
|
+
beerSong = new BeerSong();
|
14
|
+
}
|
15
|
+
|
8
16
|
@Test
|
9
17
|
public void singFirstVerse() {
|
10
18
|
assertEquals("99 bottles of beer on the wall, 99 bottles of beer.\n" +
|
11
19
|
"Take one down and pass it around, 98 bottles of beer on the wall.\n\n",
|
12
|
-
|
20
|
+
beerSong.verse(99));
|
13
21
|
}
|
14
22
|
|
15
23
|
@Ignore
|
@@ -17,7 +25,7 @@ public class BeerSongTest {
|
|
17
25
|
public void singMiddleVerse() {
|
18
26
|
assertEquals("44 bottles of beer on the wall, 44 bottles of beer.\n" +
|
19
27
|
"Take one down and pass it around, 43 bottles of beer on the wall.\n\n",
|
20
|
-
|
28
|
+
beerSong.verse(44));
|
21
29
|
}
|
22
30
|
|
23
31
|
@Ignore
|
@@ -25,7 +33,7 @@ public class BeerSongTest {
|
|
25
33
|
public void singThirdToLastVerse() {
|
26
34
|
assertEquals("2 bottles of beer on the wall, 2 bottles of beer.\n" +
|
27
35
|
"Take one down and pass it around, 1 bottle of beer on the wall.\n\n",
|
28
|
-
|
36
|
+
beerSong.verse(2));
|
29
37
|
}
|
30
38
|
|
31
39
|
@Ignore
|
@@ -33,7 +41,7 @@ public class BeerSongTest {
|
|
33
41
|
public void singPenultimateVerse() {
|
34
42
|
assertEquals("1 bottle of beer on the wall, 1 bottle of beer.\n" +
|
35
43
|
"Take it down and pass it around, no more bottles of beer on the wall.\n\n",
|
36
|
-
|
44
|
+
beerSong.verse(1));
|
37
45
|
}
|
38
46
|
|
39
47
|
@Ignore
|
@@ -41,7 +49,7 @@ public class BeerSongTest {
|
|
41
49
|
public void singLastVerse() {
|
42
50
|
assertEquals("No more bottles of beer on the wall, no more bottles of beer.\n" +
|
43
51
|
"Go to the store and buy some more, 99 bottles of beer on the wall.\n\n",
|
44
|
-
|
52
|
+
beerSong.verse(0));
|
45
53
|
}
|
46
54
|
|
47
55
|
@Ignore
|
@@ -55,7 +63,7 @@ public class BeerSongTest {
|
|
55
63
|
"Take it down and pass it around, no more bottles of beer on the wall.\n\n" +
|
56
64
|
"No more bottles of beer on the wall, no more bottles of beer.\n" +
|
57
65
|
"Go to the store and buy some more, 99 bottles of beer on the wall.\n\n",
|
58
|
-
|
66
|
+
beerSong.sing(3,0));
|
59
67
|
}
|
60
68
|
|
61
69
|
@Ignore
|
@@ -161,7 +169,7 @@ public class BeerSongTest {
|
|
161
169
|
"2 bottles of beer on the wall, 2 bottles of beer.\nTake one down and pass it around, 1 bottle of beer on the wall.\n\n" +
|
162
170
|
"1 bottle of beer on the wall, 1 bottle of beer.\nTake it down and pass it around, no more bottles of beer on the wall.\n\n" +
|
163
171
|
"No more bottles of beer on the wall, no more bottles of beer.\nGo to the store and buy some more, 99 bottles of beer on the wall.\n\n",
|
164
|
-
|
172
|
+
beerSong.singSong());
|
165
173
|
}
|
166
174
|
|
167
175
|
}
|
data/tracks/julia/img/icon.png
CHANGED
Binary file
|
data/tracks/julia/img/icon.svg
CHANGED
@@ -1,11 +1,49 @@
|
|
1
|
-
<?xml version="1.0" encoding="
|
2
|
-
<!--
|
3
|
-
|
4
|
-
<svg
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
1
|
+
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
2
|
+
<!-- Created with Inkscape (http://www.inkscape.org/) -->
|
3
|
+
|
4
|
+
<svg
|
5
|
+
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
6
|
+
xmlns:cc="http://creativecommons.org/ns#"
|
7
|
+
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
8
|
+
xmlns:svg="http://www.w3.org/2000/svg"
|
9
|
+
xmlns="http://www.w3.org/2000/svg"
|
10
|
+
version="1.1"
|
11
|
+
width="450.052"
|
12
|
+
height="450.052"
|
13
|
+
viewBox="0 0 450.052 450.052"
|
14
|
+
id="Layer_1"
|
15
|
+
xml:space="preserve"><metadata
|
16
|
+
id="metadata17"><rdf:RDF><cc:Work
|
17
|
+
rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
|
18
|
+
rdf:resource="http://purl.org/dc/dcmitype/StillImage" /><dc:title></dc:title></cc:Work></rdf:RDF></metadata><defs
|
19
|
+
id="defs15" /><circle
|
20
|
+
cx="287.849"
|
21
|
+
cy="338.754"
|
22
|
+
r="219.026"
|
23
|
+
transform="translate(-62.822998,-113.728)"
|
24
|
+
id="circle3"
|
25
|
+
style="fill:#ffffff;fill-opacity:1;stroke:#212121;stroke-width:12;stroke-miterlimit:10" /><circle
|
26
|
+
cx="180.97301"
|
27
|
+
cy="398.638"
|
28
|
+
r="82.742996"
|
29
|
+
transform="translate(-62.822998,-113.728)"
|
30
|
+
id="circle5"
|
31
|
+
style="fill:#d71d4f;stroke:#212121;stroke-width:12;stroke-miterlimit:10" /><circle
|
32
|
+
cx="287.849"
|
33
|
+
cy="216.338"
|
34
|
+
r="82.742996"
|
35
|
+
transform="translate(-62.822998,-113.728)"
|
36
|
+
id="circle7"
|
37
|
+
style="fill:#ffffff;stroke:#212121;stroke-width:12;stroke-miterlimit:10" /><circle
|
38
|
+
cx="393.733"
|
39
|
+
cy="398.63901"
|
40
|
+
r="82.742996"
|
41
|
+
transform="translate(-62.822998,-113.728)"
|
42
|
+
id="circle9"
|
43
|
+
style="fill:#212121;stroke:#212121;stroke-width:12;stroke-miterlimit:10" /><circle
|
44
|
+
cx="393.733"
|
45
|
+
cy="398.63901"
|
46
|
+
r="76.547997"
|
47
|
+
transform="matrix(0.97336202,0,0,0.95144158,-52.334748,-94.370717)"
|
48
|
+
id="circle11"
|
49
|
+
style="fill:none;stroke:#ffffff;stroke-width:3.0999999;stroke-miterlimit:10;stroke-dasharray:none" /></svg>
|