This commit is contained in:
Boris Marinov 2023-01-28 22:25:12 +02:00
parent a7db5709df
commit 987730a2fe
19 changed files with 1152 additions and 924 deletions

View File

@ -37,14 +37,14 @@ We also defined a lot of *categories based on different things*, like the ones b
Finite categories
---
And most importantly, we saw some categories that are *completely made up*, such as my soccer hierarchy. Those are formally called *finite categories* and, although they are not useful by themselves, the idea of finite categories is important - we can draw any combination of points and arrows and call it a category, in the same way that we can construct a set out of every combination of objects.
And most importantly, we saw some categories that are *completely made up*, such as my soccer player hierarchy. Those are formally called *finite categories* and, although they are not useful by themselves, the idea of finite categories is important - we can draw any combination of points and arrows and call it a category, in the same way that we can construct a set out of every combination of objects.
![Finite categories](finite_categories.svg)
Examining some finite categories
---
For future reference, let's see some examples of finite categories.
For future reference, let's see some important finite categories.
The simplest category is $0$ (enjoy the minimalism of this diagram.)
@ -86,22 +86,23 @@ Then, in chapter 4, we encountered *order isomorphisms* and we saw that they are
Categorical isomorphisms
---
Now we will extend the definition of order isomorphisms, so it applies to categories that have more than one morphism between two objects. This will make the definition a little more complex, but not a lot.
Now we will extend the definition of order isomorphisms, so it applies to categories that have more than one morphism between two objects AKA categories different from orders. This will make the definition a little more complex, but not a lot.
The definition of categorical isomorphism is the following: given two categories, an isomorphism between them is an invertible function between the underlying sets of objects, *and* an invertible function between the morphisms that connect them, which maps each morphism from one category to a morphism *with the same signature*.
![Category isomorphism](category_isomorphism.svg)
If we examine it closely we will see that, although a little bit more complex, this definition is equivalent to the one we have for orders. It is just that when categories can potentially have just one morphism, we only need to to verify that the corresponding morphism actually exist in the other category (which is guaranteed by the *order-preserving* condition.)
If we examine it closely we will see that, although it *sounds* a bit more complex, this definition is actually the same definition as one we have for orders. It is just that morphism functions between categories that have just one morphism for any two objects, are trivial - we always map the single morphism of the source category to the single morphism of the target category (which, because of the *order-preserving* condition, is guaranteed to exist.)
![Order isomorphism](category_order_isomorphism_2.svg)
And when we can have more than one morphism between two given objects we need to make sure that each morphism in one category has a corresponding morphism in the other one.
However, when we can have more than one morphism between two given objects we need to make sure that each morphism in one category has a corresponding morphism in the other one.
![Category isomorphism](category_order_isomorphism.svg)
As you see, categorical isomorphisms are not hard to define, however there is another issue with them, namely that they are very rare in practice - the only one that comes to mind to me is the Curry-Howard-Lambek isomorphism from the last chapter. And the reason they are so rare is simple - if two categories are isomorphic, they basically contain the same data and it would be more accurate to refer to them as different *representations* of the same category than as separate categories.
As you see, categorical isomorphisms are not hard to define, however there is another issue with them, namely that they are *very rare in practice* - the only one that comes to mind to me is the Curry-Howard-Lambek isomorphism from the last chapter, as in order for them to be isomorphic, the categories they are basically the same category. We devise a more apt way to tell if two categories are equivalent, that is also more common than categorical isomorphisms, but we will do it in the next chapter.
For now we will review a relationship that is even more abundant than isomorphisms, which are *two-way connections* between categories, namely *one-way connections* between categories, i.e. *functors*.
<!--
comics:
@ -113,16 +114,20 @@ Pretty much.
Functors
===
Much more abundant than isomorphisms, which are *two-way connections* between categories, are the *one-way connections*, i.e. *functors*. Functors are like functions between categories - just like every set isomorphism is a function, every categorical isomorphism is also a functor, but not the other way around.
The logician Rudolf Carnap invented the word "functor" as part of his project to devise a formal syntax for the natural languages that we use to do science and just talk. Originally he took it to mean a phrase whose meaning can be customized by combining it with numerical values, like the phrase "the temperature at x o'clock" which has a different meaning depending on the value of x i.e. a phrase that acts as a function, only not between sets, but between linguistic concepts (such as times and temperature.)
![Functor, as envisioned by Rudolf Carnap.](functor_carnap.svg)
Later, the co-inventor or category theory Sanders Mac Lane borrowed the word, to describe a function between *categories*. Here is how he defined it: a functor between two categories (let's call them $A$ and $B$) consists of a pair of mappings - a mapping that maps each *object* in $A$ to an object in $B$ and a mapping that maps each *morphism* between any objects in $A$ to a morphism between objects in $B$ in a way that *preserves the structure* of the category.
![Functor](functor.svg)
And now for the full definition: a functor between two categories (let's call them $A$ and $B$) consists of a pair of mappings - a mapping that maps each *object* in $A$ to an object in $B$ and a mapping that maps each *morphism* between any objects in $A$ to a morphism between objects in $B$ in a way that preserves the structure of the category.
Now let's unpack this definition by going through each of its components.
Object mapping
---
Let's go through each component of this definition. Firstly, we have a mappings between the categories' objects. These are just regular old functions, so the definition from chapter 1 applies.
Firstly, a functor contains a mapping between the categories' objects. This mapping is just a regular old function, so the definition from chapter 1 applies:
> A function is a relationship between two sets that matches each element of one set, called the *source* of the function, with exactly one element from another set, called the converse domain, or the *target* of the function.
@ -137,7 +142,9 @@ The other mapping that forms the functor is a mapping between the categories' mo
![Functor for morphisms](functor_morphisms.svg)
A more rigorous definition of a morphism function involves the concept of the *homomorphism set* - this is a set that contains all morphisms that go between given two objects in a given category as its elements. Utilizing this concept, we can say that a function between the morphisms of the two categories is actually a collection of the functions between their respective homomorphism sets.
A more rigorous definition of a morphism function involves the concept of the *homomorphism set* - this is a set that contains all morphisms that go between given two objects in a given category as its elements.
Utilizing this concept, we can say that a function between the morphisms of the two categories is actually a collection of the functions between their respective homomorphism sets.
![Functor for morphisms](functor_morphisms_formal.svg)
@ -200,146 +207,15 @@ For maps, for example, they are called *routes*.
The law of preserving composition tells us that the route we create on a map corresponds to a real-world route.
Constant functor
---
When we think about diagram functors (and even functors in general), our intuition is to think of every object in the source category being mapped to a *different* object in the target. But that is not always the case. An interesting functor that doesn't follow that rule is the *constant functor* - one that maps *all* objects of the source category to a single object in the target (and all morphisms go to the identity morphism.
![Constant functor](constant_functor.svg)
This one that plays a part in some definitions that we will see later.
Functors in programming
What are functors for
===
Before we think about what functors are in programming languages, let's try to answer the million-dollar question: "How are functors *useful*?" (sometimes formulated also as "Why are you wasting my/your time with this?") We just saw that *maps are functors* and we know that *maps are useful*, so let's start from there.
So why is a map (or any other kind of diagram) useful? Well, it obviously has to do with the fact that the points and arrows of the map corresponds to the cities and the roads in the place you are visiting in i.e. because of the very fact that it is a functor, but there is a second aspect as well: *maps are simpler to work with than actual thing they are representing i.e.* it is much easier to go through all routes between two given places by following a map than to actually drive through all these routes in real life.
It the same point is valid also for programming: a functor from the realm of simple (primitive) types to the realm of more complex types allows you to work from the context of the simpler type while actually performing operations on the more complex one
If we think about the category of simple types (like `string`, `number`, `boolean` etc) there are numerous functions between those types, like, as we said before, there are a myriad functions that convert a number to boolean.
![Functions from array to boolean](set_arrows.svg)
For complex types, like `List`, there aren't that many functions. But there also doesn't need to be that many of them, as with `map` we can use every function that convert strings to numbers to convert string arrays to number arrays.
![A functor in programming](functor_programming.svg)
Because they are simpler, maps don't include *all* roads and *all* traveling options. And the same is true for functors in programming - having a functor doesn't allow you to do define *all* operations using only the simple type, only some of them (some are better than nothing, right?)
The list functor
===
Let's formalize some of the concepts from the previous section by revisiting the general functor definition in the context of programming in the context of the list functor.
We do that by just changing the terms we use, according to the table in chapter 2 and also (last but not least) changing the font we use in our formulas from modern to monospaced (mathematicians and programmers are two very different communities, that are united by their appreciation of peculiar typefaces.)
> A functor between two categories (let's call them `A` and `B`) consists of a mapping that maps each *type* in `A` to a type in `B` and a mapping that maps each *function* between types in `A` to a function between types in `B` in a way that preserves the structure of the category.
Type mapping
---
The first component of a functor is a mapping that converts one type (let's call it `A`) to another type (`B`). So it is *like a function, but between types*. Such constructions are supported by almost all programming languages that have static type checking in the first place - they go by the name of *generic types*.
A generic type is nothing but a function (sometimes called a *type-level function*) that maps one concrete type to another concrete type. For example, the type `Array<A>` maps the type `String` to `Array<String>`, `Number` to `Array<Number>` etc.
![A functor in programming - type mapping](functor_programming_objects.svg)
Function mapping
---
So the type mapping of a functor is simply a generic type in a programming language (we can also have functors between two generic types, but we will review those later.) However the nontrivial part of the functor is the *function mapping* - that is a mapping that convert any function operating on simple types, like `String ➞ Number` to a function between their more complex counterparts e.g. `Array<String> ➞ Array<Number>`.
![A functor in programming - function mapping](functor_programming_morphisms.svg)
In programming languages, this mapping is represented by a higher-order function called `map` with a signature (using Haskell notation), `(a ➞ b) ➞ (Fa ➞ Fb)`, where `F` represents the composite type.
Any function with that type signature that follows the laws gives rise to a functor, but not all such functors are useful. In practice, usually, there is only one of them that makes sense for a given generic type. For example, in the case of list and similar structures, `map` is a function that applies the original function (the one that converts simple types) to all elements of the list.
Because only one `map` function per generic type is useful (and also for simple convenience) you might sometimes see `map` defined directly in the generic datatype, as a method. For example, Here is how the list functor might look in TypeScript, implemented in the way that I described above:
```
class Array<A> {
map (f: A ➞ B): Array<B> {
let result = [];
for (obj of this) {
result.push(f(obj));
}
return result;
}
}
```
Functor laws
---
Aside from facilitating code reuse by bringing in all standard functions of simple types in a more complex context, `map` allows us to work in a way that is predictable, courtesy of the functor laws, which in programming context look like this.
```
a.map(a => a) == a
const compose = (f, g) => f(g)
a.map(f).map(g) == a.map(compose(g, f))
```
**Task:** Use examples to verify that the laws are followed.
Endofunctors
===
Up until now we acted like different type families belong to different categories. However, that is not the case - they are actually one category. So all functors used in programming are *endofunctors* (ones in which the source and target category is one and the same). This doesn't make any difference when it comes to the above definitions (you can also think of the different type families as belonging to different categories if that's easier for you), but it does make a difference in other situations, for example, you can apply an endofunctor $F$ to a given value $a$ infinitely many times, adding more and more levels of nesting.
![A functor in programming as endofunctor](endofunctor_programming.svg)
This might look weird, but it does not lead to any type of paradox - there is nothing wrong about a list that contains other lists, and you can have a list of lists of lists, or a list of lists of lists of lists etc (and the functor laws would still hold, provided that you called `map` the right number of times.)
Identity functors
---
There is one particular endofuctor that will probably look familiar to you - it is the *identity functor* of each category, the one that maps each object and morphism to itself.
![Identity functor](identity_functor.svg)
The reason this functor is defined is the same reason as the identity morphisms are defined - they allow us to talk about value-related stuff without actually involving values.
Pointed functors
---
An interesting "species" of the endofunctors that we can define using the identity functor are the so-called *pointed* functors. This is a name for the functors that are *isomorphic to the identity functor*. We still haven't said when two functors are isomorphic, but for now it suffices to say that they are isomorphic when below diagram commutes for all objects and functions.
![Pointed functor](pointed_functor.svg)
If we concentrate on the category of sets (or the category of types, if you will), then this would mean that there is a function that translates each value of what we called the "simple types" to a value of the functor's generic type, in a way that this diagram commutes (again, the function should make the diagram commute for all types (and not just **string** and **num**) for all functions that exist, not only the four we outlined here.)
![Pointed functor in Set](pointed_functor_set.svg)
The list functor is pointed, because such a function exist for the list functor - it is the function that puts every value in a "singleton" list.
![Pointed functor in Set](pointed_functor_set_internal.svg)
You can see that the definition of a pointed functor looks like an "upgrade" of the definition of a functor - we again have the relationship between a bunch of objects and a bunch of morphisms, such that there is a symmetry between them. The only difference is that with pointed functors we are working in one and the same category, and so the description of the laws is much simpler - the relationship is
And in programming context, the fact that the functor is pointed translates to the following:
```
[a].map(f) = [f(a)]
```
Homomorphism functors
===
Given any category, we can generate the set of the sets of all morphisms that have a specific type signature with respect to a given object from that category. This is called the *Homomorphism set*, denoted $Hom(B, - )$, $B$ being the object that you picked (for example, let's pick the brown ball.)
![Homomorphism set](hom_set.svg)
This set forms a category where the morphism sets are the objects (again morphism sets are *objects*) and the morphisms are the same as in the original category. And between those two categories (the original and the weird morphism-based one) there is a functor, called the homomorphism functor.
![Homomorphism set](hom_functor.svg)
**Question:** Which object should we pick so that the original and the homomorphism categories are isomorphic?
With the homomorphism functors, we can *represent* any category in the category of sets. This is why homomorphism functors and all functors that are isomorphic to them are called *representable* functors.
Functors in monoids
===
@ -429,154 +305,157 @@ If we compose the two morphisms in the source order, we get a morphism $g•f ::
But both morphisms $F(g•f)$ and $F(g)•F(f)$ have the signature $F(a) \to F(c)$ and so they must be equal to one another.
The category of small categories
Linear functions
===
Ha, I got you this time (or at least I hope I did) - you probably thought that I won't introduce another category in this chapter. But this is exactly what I am going to do. And (surprise again) the new category won't be the category of functors (don't worry, we will introduce that in the next chapter.) Instead, we will examine the category of (small) categories, that has all the categories that we saw so far as objects and functors as its morphisms, like $Set$ - the category of sets, $Mon,$ the category of monoids, $Ord,$ the category of orders etc.
In the previous two chapters, we examined functors between groups and orders in general. Now, we will concentrate on one specific group that we are already familiar with (and which can also be viewed as an order) - *the group of natural numbers under addition*.
![The category of categories](category_of_categories.svg)
A functor between this group and itself is also known as a *linear function*.
**Task:** Go through the functor definition and see how you can make functors compose.
**Question:** What are the initial and terminal object of the category of small categories.
Categories all the way down
---
The recursive nature of category theory might leave some of you confused: we started by saying that categories are *composed of objects and morphisms*, but now we are saying that there are *morphisms between categories* (functors). And on top of that, there is a category where *the objects are categories themselves*. Does that mean that categories are an example of... categories? Sounds a bit weird on intuitive level (as for example biscuits don't contain other biscuits and houses don't use houses as building material) but it is actually the case.
Category theory does *categorize* everything, so from a category-theoretic standpoint all of maths is categories all the way down and whether you would threat a given category as a universe, or as a point depends solemnly on your viewpoint.
Like, for example, every monoid is a category with one just object, but at the same time, monoids can be seen as belonging to one category - the category of monoids - with monoid homomorphisms acting as objects.
At the same time we have the category of groups, for example, which contains the category of monoids as a subcategory, as all monoids are groups.
There may be many more levels of categories from categories. However that does not mean that we have to cover all of them and think about them at all - it is like the concept of a derivative in calculus - the first derivative of a position of the object gives its *speed*, which is useful, the derivative of speed is also useful - it is *velocity*, but the derivative of velocity and those after it leave us indifferent. We can use the same tactic with our little journey in category theory - stick on the level that make sense for us and not be obsessed with forming picture of the whole thing, because there is no *whole thing* - category theory is an *abstract* theory. That is, it does not seek to represent an actual state of affairs, but to provide a language that you can use to express many different ideas, actual or purely imaginary. So view the category of categories not as a structure, but as a space, where all these concepts live.
{% if site.distribution == 'print' %}
Free and forgetful functors
Functors in programming
===
A lot of categories that are in $Cat$ are based on each other i.e. ones where one category is the same as the other plus some additional law - groups are monoids with added inversion, partial orders are antisymmetric preorders. And virtually all categories can be viewed as are sets with added morphisms. Between any two such categories there are two functors called the *forgetful* functor that goes from the richer category to the more plain one and the *free* functor, which goes the other way around.
Before we think about what functors are in programming languages, let's try to answer the million-dollar question: "How are functors *useful*?" (sometimes formulated also as "Why are you wasting my/your time with this?") We just saw that *maps are functors* and we know that *maps are useful*, so let's start from there.
![Free and forgetful functors](free_forgetful_functors.svg)
So why is a map (or any other kind of diagram) useful? Well, it obviously has to do with the fact that the points and arrows of the map corresponds to the cities and the roads in the place you are visiting in i.e. because of the very fact that it is a functor, but there is a second aspect as well: *maps are simpler to work with than actual thing they are representing i.e.* it is much easier to go through all routes between two given places by following a map than to actually drive through all these routes in real life.
It the same point is valid also for programming: a functor from the realm of simple (primitive) types to the realm of more complex types allows you to work from the context of the simpler type while actually performing operations on the more complex one
Forgetful functors
If we think about the category of simple types (like `string`, `number`, `boolean` etc) there are numerous functions between those types, like, as we said before, there are a myriad functions that convert a number to boolean.
![Functions from array to boolean](set_arrows.svg)
For complex types, like `List`, there aren't that many functions. But there also doesn't need to be that many of them, as with `map` we can use every function that convert strings to numbers to convert string arrays to number arrays.
![A functor in programming](functor_programming.svg)
Because they are simpler, maps don't include *all* roads and *all* traveling options. And the same is true for functors in programming - having a functor doesn't allow you to do define *all* operations using only the simple type, only some of them (some are better than nothing, right?)
The list functor
===
Forgetful functors map the objects from the more richer and featureful category to their corresponding objects in the simpler and more unstructured one.
Let's formalize some of the concepts from the previous section by revisiting the general functor definition in the context of programming in the context of the list functor.
![Forgetful functors](forgetful_functors.svg)
We do that by just changing the terms we use, according to the table in chapter 2 and also (last but not least) changing the font we use in our formulas from modern to monospaced (mathematicians and programmers are two very different communities, that are united by their appreciation of peculiar typefaces.)
They strip (forget) all the structure of the more complex category which is not present in the simpler one. i.e.
> A functor between two categories (let's call them `A` and `B`) consists of a mapping that maps each *type* in `A` to a type in `B` and a mapping that maps each *function* between types in `A` to a function between types in `B` in a way that preserves the structure of the category.
Object mapping
Type mapping
---
The object mapping of the forgetful functor consists of picking the object in the simpler category that corresponds to the one from the richer one. It works by just removing the extra structure or properties of each object in the richer category which is not present in the simpler one.
The first component of a functor is a mapping that converts one type (let's call it `A`) to another type (`B`). So it is *like a function, but between types*. Such constructions are supported by almost all programming languages that have static type checking in the first place - they go by the name of *generic types*.
Let's take the forgetful functor between the category of sets $Set$ and the category of monoids ($Mon$) as an example. A monoid is a set, combined with *a monoid operation*. The monoid operation is the extra structure. And if you do away with it, what is left from a monoid is its underlying set. This observation defines the object mapping of a forgetful functor that goes from the category of monoids to the category of sets - each monoid is mapped to it's underlying set.
A generic type is nothing but a function (sometimes called a *type-level function*) that maps one concrete type to another concrete type. For example, the type `Array<A>` maps the type `String` to `Array<String>`, `Number` to `Array<Number>` etc.
![Forgetful functor - object mapping](forgetful_functor_objects.svg)
![A functor in programming - type mapping](functor_programming_objects.svg)
This same type of functor exists for any two categories that are based on each other. And two categories are based on each other only if such a functor exists.
Morphism mapping
Function mapping
---
In order for the forgetful functor to really be a functor it also must map morphisms between the two categories i.e. to map every *monoid homomorphism* between two monoids to a function between their underlying sets.
So the type mapping of a functor is simply a generic type in a programming language (we can also have functors between two generic types, but we will review those later.) However the nontrivial part of the functor is the *function mapping* - that is a mapping that convert any function operating on simple types, like `String ➞ Number` to a function between their more complex counterparts e.g. `Array<String> ➞ Array<Number>`.
This is not hard - we said that monoid homomorphisms are function between the monoids' underlying sets which preserves the group operation. Which means that they are *functions between the monoids' underlying sets*. So all we need to do is to forget about the extra conditions.
![A functor in programming - function mapping](functor_programming_morphisms.svg)
In programming languages, this mapping is represented by a higher-order function called `map` with a signature (using Haskell notation), `(a ➞ b) ➞ (Fa ➞ Fb)`, where `F` represents the composite type.
Any function with that type signature that follows the laws gives rise to a functor, but not all such functors are useful. In practice, usually, there is only one of them that makes sense for a given generic type. For example, in the case of list and similar structures, `map` is a function that applies the original function (the one that converts simple types) to all elements of the list.
Because only one `map` function per generic type is useful (and also for simple convenience) you might sometimes see `map` defined directly in the generic datatype, as a method. For example, Here is how the list functor might look in TypeScript, implemented in the way that I described above:
```
class Array<A> {
map (f: A ➞ B): Array<B> {
let result = [];
for (obj of this) {
result.push(f(obj));
}
return result;
}
}
```
Functor laws
---
Since we basically copied the structure of one category into the other one, the functor laws are obviously followed.
Aside from facilitating code reuse by bringing in all standard functions of simple types in a more complex context, `map` allows us to work in a way that is predictable, courtesy of the functor laws, which in programming context look like this.
Free functors
```
a.map(a => a) == a
const compose = (f, g) => f(g)
a.map(f).map(g) == a.map(compose(g, f))
```
**Task:** Use examples to verify that the laws are followed.
Special types of functors
===
Now let's review the functor that has certain relation to the forgetful functor, but goes the other way around - from richer to simpler categories.
![Free functors](free_functors.svg)
Saying "going the other way around" is actually not entirely accurate, as we cannot literary reverse the mapping from the forgetful functor. This is so, simply due to the fact that given one simple structure (such as a set) there can be more than one richer structures that correspond to it (e.g. the set of natural numbers is the underlying set of both the monoid of natural numbers under addition and the monoid of natural numbers under mutliplication.)
But, although we cannot create a functor that is the reverse of the forgetful functor, there is one functor that still has some interesting connection to it - this functor is called the *free functor* for a given category. It works by connecting each object from the simpler category to the *free object* corresponding to it. In our case the case of monoids it is the free monoid generated by a given set.
Object mapping
Endofunctors
---
The object mapping of the free functor is the procedure for generating *free objects*. For any given object $o$ from the simpler category the free object of $o$, $F(o)$ is an object of the more complex category that adds the minimum structure needed for the $o$ to become an object of the more complex category.
Up until now we acted like different type families belong to different categories. However, that is not the case - they are actually one category. So all functors used in programming are *endofunctors* (ones in which the source and target category is one and the same). This doesn't make any difference when it comes to the above definitions (you can also think of the different type families as belonging to different categories if that's easier for you), but it does make a difference in other situations, for example, you can apply an endofunctor $F$ to a given value $a$ infinitely many times, adding more and more levels of nesting.
This concept is complex, so let's take the free monoids as an example. When we reviewed them (in chapter 3) we said that the free monoid of a given set of is just the monoid that "does nothing" i.e. the one that has no laws.
![A functor in programming as endofunctor](endofunctor_programming.svg)
What does that mean? We said that each monoid can be represented by a set of basic elements, called generators, (such as the 60 degree rotation of a right triangle)
This might look weird, but it does not lead to any type of paradox - there is nothing wrong about a list that contains other lists, and you can have a list of lists of lists, or a list of lists of lists of lists etc (and the functor laws would still hold, provided that you called `map` the right number of times.)
![Generator of the monoid of rotations](generator_rotations.svg)
And a bunch of rules or equations describing how sequences of these generators collapse to a single element (e.g. the fact that rotating the triangle three times gets you to its initial position.)
![Rule of the monoid of rotations](rule_rotations.svg)
Here the rules for a given set of generators can be arbitrary, so the free monoid is the monoid that has no such rules. As a result, the free monoid of a given set is the monoid of all possible (endless) sequences of elements of a that set (which is taken as the monoid's set of generators.
If you think about this definition we would realize that the free monoid is actually just the *list datatype* that we are familiar from programming. And the free functor converting sets to monoids is actually the list functor that we saw in one of the previous sections.
![Free functors](free_functor_objects.svg)
Formally the free monoid over a set $A$ is just the type $[A]$ and the free functor is the function $a \to [a]$ for all $a:A$.
Morphism mapping
Identity functors
---
Once we established that the free functor for set $A$ is just the list functor we already know how the the morphism mapping that converts function between sets to functions between lists of sets, and the way to construct this mapping is to apply the function to every element of that list.
There is one particular endofuctor that will probably look familiar to you - it is the *identity functor* of each category, the one that maps each object and morphism to itself.
Adjoint functors
===
![Identity functor](identity_functor.svg)
If the concept of a free object and the corresponding free functor seemed somewhat arbitrary to you, don't worry, it will seem clearer once we pinpoint the relationship it has with the (arguably more straightforward) concept of forgetful functor.
The reason this functor is defined is the same reason as the identity morphisms are defined - they allow us to talk about value-related stuff without actually involving values.
The relationship is a little bit complex - explaining it involves three steps.
Step one: Given a free object, in our case a free monoid from a given set of generators, there exists a monoid homomorphism from it, to any other monoid that is composed of the same set of generators. The homomorphism consists of just applying the monoid laws and, by doing that, converting each elements of the free monoid to an element of the other one.
So for example, by applying the color-mixing rule we can convert any element of the free monoid generated by the set of the red blue and yellow balls to an element of the color-mixing monoid.
![Adjunction](adjunction_1.svg)
Step two: there exist a morphism from any set to the underlying set of any monoid that is generated by the elements of that set as generators.
![Adjunction](adjunction_2.svg)
Finally, there is a isomorphism between these two sets of functions, which in turn translates to a relationship between the free and forgetful functor that looks like this (the free fuctor is in green and the forgetful one is in red).
![Adjunction](adjunction_3.svg)
You see that This relationship is called an *adjunction* and it defines what the free functor is in terms of the forgetful one, or vice versa.
Unit and counit
Pointed functors
---
An interesting "species" of the endofunctors that we can define using the identity functor are the so-called *pointed* functors. This is a name for the functors that are *isomorphic to the identity functor*. We still haven't said when two functors are isomorphic, but for now it suffices to say that they are isomorphic when below diagram commutes for all objects and functions.
Another example
![Pointed functor](pointed_functor.svg)
If we concentrate on the category of sets (or the category of types, if you will), then this would mean that there is a function that translates each value of what we called the "simple types" to a value of the functor's generic type, in a way that this diagram commutes (again, the function should make the diagram commute for all types (and not just **string** and **num**) for all functions that exist, not only the four we outlined here.)
![Pointed functor in Set](pointed_functor_set.svg)
The list functor is pointed, because such a function exist for the list functor - it is the function that puts every value in a "singleton" list.
![Pointed functor in Set](pointed_functor_set_internal.svg)
You can see that the definition of a pointed functor looks like an "upgrade" of the definition of a functor - we again have the relationship between a bunch of objects and a bunch of morphisms, such that there is a symmetry between them. The only difference is that with pointed functors we are working in one and the same category, and so the description of the laws is much simpler - the relationship is
And in programming context, the fact that the functor is pointed translates to the following:
```
[a].map(f) = [f(a)]
```
Constant functor
---
Let's take another example. The free monoid comprised of just one generator object (which for our purposes we identify with $1$) can be mapped to all cyclic monoids like $Z_{1}$, $Z_{2}$, $Z_{3}$ etc. as well as to the monoid of natural numbers under addition, pictured below
When we think about diagram functors (and even functors in general), our intuition is to think of every object in the source category being mapped to a *different* object in the target. But that is not always the case. An interesting functor that doesn't follow that rule is the *constant functor* - one that maps *all* objects of the source category to a single object in the target (and all morphisms go to the identity morphism.
![Adjunction](adjunction_numbers_1.svg)
![Constant functor](constant_functor.svg)
And in the category of sets, there exist a function between a singleton set and any other set that features its element.
This one that plays a part in some definitions that we will see later.
![Adjunction](adjunction_numbers_2.svg)
Homomorphism functors
---
The equivalence of those two functions is actually another instance of the adjunction between monoids and sets, created by the free and forgetful functor.
Given any category, we can generate the set of the sets of all morphisms that have a specific type signature with respect to a given object from that category. This is called the *Homomorphism set*, denoted $Hom(B, - )$, $B$ being the object that you picked (for example, let's pick the brown ball.)
![Adjunction](adjunction_numbers.svg)
![Homomorphism set](hom_set.svg)
There definitely is more to be said about free and forgetful functors, as well as for adjunctions, but as always, I will leave things at the most interesting moment in order to revisit them from a different perspective later.
This set forms a category where the morphism sets are the objects (again morphism sets are *objects*) and the morphisms are the same as in the original category. And between those two categories (the original and the weird morphism-based one) there is a functor, called the homomorphism functor.
{%endif%}
![Homomorphism set](hom_functor.svg)
**Question:** Which object should we pick so that the original and the homomorphism categories are isomorphic?
With the homomorphism functors, we can *represent* any category in the category of sets. This is why homomorphism functors and all functors that are isomorphic to them are called *representable* functors.

View File

@ -0,0 +1,137 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
width="595.3"
height="200"
version="1.1"
id="svg9949"
sodipodi:docname="functor_carnap.svg"
inkscape:version="1.2.2 (1:1.2.2+202212051552+b0a8486541)"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:dc="http://purl.org/dc/elements/1.1/">
<metadata
id="metadata9955">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
</cc:Work>
</rdf:RDF>
</metadata>
<defs
id="defs9953" />
<sodipodi:namedview
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1"
objecttolerance="10"
gridtolerance="10"
guidetolerance="10"
inkscape:pageopacity="0"
inkscape:pageshadow="2"
inkscape:window-width="1080"
inkscape:window-height="1864"
id="namedview9951"
showgrid="false"
inkscape:zoom="0.8362224"
inkscape:cx="248.73766"
inkscape:cy="173.39885"
inkscape:window-x="0"
inkscape:window-y="0"
inkscape:window-maximized="1"
inkscape:current-layer="svg9949"
inkscape:document-rotation="0"
inkscape:showpageshadow="2"
inkscape:pagecheckerboard="0"
inkscape:deskcolor="#d1d1d1" />
<ellipse
cx="323.95346"
cy="-196.79048"
id="circle3369-5-5"
style="opacity:0.13;fill:#cccccc;stroke:#666666;stroke-width:10.5407;stroke-miterlimit:10"
transform="matrix(0.66780806,0.74433353,-0.74562262,0.66636844,0,0)"
rx="43.369255"
ry="43.064896" />
<ellipse
cx="316.0036"
cy="-200.53165"
id="circle3383-6-6"
style="fill:#cccccc;stroke:#666666;stroke-width:7.00001;stroke-miterlimit:10;stroke-dasharray:none"
transform="matrix(0.66780806,0.74433353,-0.74562262,0.66636844,0,0)"
rx="43.369255"
ry="43.064896" />
<ellipse
cx="217.67821"
cy="-47.948502"
id="circle3369-33-3-6"
style="opacity:0.13;fill:#cccccc;stroke:#666666;stroke-width:10.5407;stroke-miterlimit:10"
transform="matrix(0.75543444,0.65522425,-0.65531183,0.75535846,0,0)"
rx="43.37484"
ry="43.059269" />
<ellipse
cx="211.65361"
cy="-51.671986"
id="circle3383-85-2-8"
style="fill:#cccccc;stroke:#666666;stroke-width:7;stroke-miterlimit:10;stroke-dasharray:none"
transform="matrix(0.75543444,0.65522425,-0.65531183,0.75535846,0,0)"
rx="43.37484"
ry="43.059269" />
<g
style="display:inline;fill:#dddddd;stroke:#838383;stroke-width:6.389;stroke-miterlimit:10"
id="g1482-7-0-25-1-3-3"
transform="matrix(0.53875641,0.00719671,-0.10670711,0.73234657,159.10815,-64.604571)"
inkscape:transform-center-x="10.989635"
inkscape:transform-center-y="-11.723396">
<path
style="stroke-width:35.526"
inkscape:connector-curvature="0"
id="path1478-7-9-8-5-1-6"
transform="matrix(0.4768,-0.02932,0.03214,0.42867,147.58,197.367)"
d="m 315.1,101.79 c 10.682,-4.135 21.77,-7.738 33.127,-11.074 -8.518,-8.139 -17.577,-16.01 -27.178,-23.616 -2.04,12.119 -3.103,21.663 -5.949,34.69 z" />
<path
style="stroke-width:10.649;paint-order:markers fill stroke"
inkscape:connector-curvature="0"
id="path1480-1-3-9-5-4-7"
transform="matrix(0.89574,0,0,0.81736,18.384,154.236)"
d="m 197.036,89.49 c 39.237,-9.724 89.303,-9.828 120.462,-3.317" />
</g>
<text
xml:space="preserve"
style="font-size:17.1306px;line-height:1.25;font-family:sans-serif;word-spacing:0px;stroke-width:0.428265"
x="174.49605"
y="105.00381"
id="text2040"><tspan
sodipodi:role="line"
id="tspan2038"
x="174.49605"
y="105.00381"
style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';fill:#4d4d4d;stroke-width:0.428265">time</tspan></text>
<text
xml:space="preserve"
style="font-size:17.1306px;line-height:1.25;font-family:sans-serif;word-spacing:0px;stroke-width:0.428265"
x="244.25206"
y="-107.07389"
id="text2040-7"><tspan
sodipodi:role="line"
id="tspan2038-5"
x="244.25206"
y="-107.07389"
style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';fill:#4d4d4d;stroke-width:0.428265" /></text>
<text
xml:space="preserve"
style="font-size:17.1306px;line-height:1.25;font-family:sans-serif;word-spacing:0px;stroke-width:0.428265"
x="336.7706"
y="106.71346"
id="text2040-3"><tspan
sodipodi:role="line"
id="tspan2038-6"
x="336.7706"
y="106.71346"
style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';fill:#4d4d4d;stroke-width:0.428265">temp</tspan></text>
</svg>

After

Width:  |  Height:  |  Size: 5.2 KiB

View File

@ -205,4 +205,11 @@ https://www.math3ma.com/blog/what-is-a-natural-transformation
https://graphicallinearalgebra.net/2015/04/23/makelele-and-linear-algebra/
https://www.math.toronto.edu/gscott/WhatVS.pdf
https://www.youtube.com/playlist?list=PLk-BCMYCWSzW-nPNnw19Y6oQJnvaAcp1I
https://brilliant.org/courses/linear-algebra/linear-equations-5/
https://www.math3ma.com/blog/what-is-category-theory-anyway
*/

View File

@ -34,12 +34,12 @@
guidetolerance="10"
inkscape:pageopacity="0"
inkscape:pageshadow="2"
inkscape:window-width="1080"
inkscape:window-height="1864"
inkscape:window-width="1920"
inkscape:window-height="1024"
id="namedview15615"
showgrid="false"
inkscape:zoom="2.6170507"
inkscape:cx="238.43634"
inkscape:cx="289.25691"
inkscape:cy="123.80349"
inkscape:window-x="0"
inkscape:window-y="0"
@ -50,287 +50,69 @@
inkscape:deskcolor="#d1d1d1" />
<g
id="g42748"
transform="matrix(1.8064408,-0.18998633,0.18891275,1.7424528,-330.75204,152.75635)" />
transform="matrix(2.0948447,-0.22031824,0.21907326,2.0206408,-379.30058,157.60761)" />
<g
id="g42748-8"
transform="matrix(1.8064408,-0.18998633,0.18891275,1.7424528,96.344053,113.32562)" />
transform="matrix(2.0948447,-0.22031824,0.21907326,2.0206408,115.98273,111.88164)" />
<g
id="g42748-3"
transform="matrix(1.8064408,-0.18998633,0.18891275,1.7424528,-426.34254,-26.478175)" />
transform="matrix(2.0948447,-0.22031824,0.21907326,2.0206408,-490.1524,-50.242259)" />
<g
id="g42748-8-7"
transform="matrix(1.8064408,-0.18998633,0.18891275,1.7424528,0.75353121,-65.908903)" />
transform="matrix(2.0948447,-0.22031824,0.21907326,2.0206408,5.1308884,-95.968225)" />
<ellipse
style="fill:#e6e7e8;stroke:#bbbcbe;stroke-width:0;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1"
id="circle15601-9-4-4-6-1"
cy="126.61151"
cx="293.09616"
id="circle15601-9-4-4-6-1-3"
cy="125.19369"
cx="286.64761"
transform="matrix(0.99480921,-0.10175774,0.11080699,0.99384194,0,0)"
rx="97.769707"
ry="93.323944" />
rx="97.906227"
ry="93.454262" />
<g
style="display:inline;fill:none;stroke:#008000;stroke-width:6.389;stroke-miterlimit:10;stroke-opacity:1"
id="g1482-7-0-1-0-3-0-1"
transform="matrix(0.26158411,-0.08541428,0.05502802,0.32097145,217.19349,5.8482411)"
inkscape:transform-center-x="10.68732"
inkscape:transform-center-y="-12.050429">
id="g1482-7-0-1-0-3-0-1-6"
transform="matrix(0.06777586,0.26709531,-0.32439131,0.03342784,400.45737,13.346566)"
inkscape:transform-center-x="-43.598954"
inkscape:transform-center-y="-13.016745">
<path
style="fill:none;stroke:#008000;stroke-width:35.526;stroke-opacity:1"
inkscape:connector-curvature="0"
id="path1478-7-9-0-19-0-2-9"
id="path1478-7-9-0-19-0-2-9-5"
transform="matrix(0.4768,-0.02932,0.03214,0.42867,147.58,197.367)"
d="m 315.1,101.79 c 10.682,-4.135 21.77,-7.738 33.127,-11.074 -8.518,-8.139 -17.577,-16.01 -27.178,-23.616 -2.04,12.119 -3.103,21.663 -5.949,34.69 z" />
<path
style="fill:none;stroke:#008000;stroke-width:10.649;stroke-opacity:1;paint-order:markers fill stroke"
inkscape:connector-curvature="0"
id="path1480-1-3-1-5-7-3-4"
id="path1480-1-3-1-5-7-3-4-63"
d="M 127.38575,78.377847 C 176.95734,66.301724 277.68509,72.076365 317.498,86.173"
sodipodi:nodetypes="cc"
transform="matrix(0.89574,0,0,0.81736,18.384,154.236)" />
</g>
<g
style="display:inline;fill:none;stroke:#008000;stroke-width:6.389;stroke-miterlimit:10;stroke-opacity:1"
id="g1482-7-0-1-0-3-0-1-9"
transform="matrix(0.26158411,-0.08541428,0.05502802,0.32097145,229.54823,96.554507)"
inkscape:transform-center-x="10.68732"
inkscape:transform-center-y="-12.050429">
id="g1482-7-0-1-0-3-0-1-9-9"
transform="matrix(0.09370596,0.25913831,-0.31953354,0.06515716,302.64843,17.223577)"
inkscape:transform-center-x="48.487651"
inkscape:transform-center-y="-1.9225934">
<path
style="fill:none;stroke:#008000;stroke-width:35.526;stroke-opacity:1"
inkscape:connector-curvature="0"
id="path1478-7-9-0-19-0-2-9-2"
id="path1478-7-9-0-19-0-2-9-2-4"
transform="matrix(0.4768,-0.02932,0.03214,0.42867,147.58,197.367)"
d="m 315.1,101.79 c 10.682,-4.135 21.77,-7.738 33.127,-11.074 -8.518,-8.139 -17.577,-16.01 -27.178,-23.616 -2.04,12.119 -3.103,21.663 -5.949,34.69 z" />
<path
style="fill:none;stroke:#008000;stroke-width:10.649;stroke-opacity:1;paint-order:markers fill stroke"
inkscape:connector-curvature="0"
id="path1480-1-3-1-5-7-3-4-6"
id="path1480-1-3-1-5-7-3-4-6-8"
d="M 127.38575,78.377847 C 176.95734,66.301724 277.68509,72.076365 317.498,86.173"
sodipodi:nodetypes="cc"
transform="matrix(0.89574,0,0,0.81736,18.384,154.236)" />
</g>
<g
style="display:inline;fill:#dddddd;stroke:#aa0000;stroke-width:6.389;stroke-miterlimit:10"
id="g1482-7-0-1-0-3-0"
transform="matrix(0.05911836,0.26875057,-0.32484067,0.02300631,408.43203,19.280994)"
inkscape:transform-center-x="-13.251422"
inkscape:transform-center-y="-9.5329332">
<path
style="stroke:#aa0000;stroke-width:35.526"
inkscape:connector-curvature="0"
id="path1478-7-9-0-19-0-2"
transform="matrix(0.4768,-0.02932,0.03214,0.42867,147.58,197.367)"
d="m 315.1,101.79 c 10.682,-4.135 21.77,-7.738 33.127,-11.074 -8.518,-8.139 -17.577,-16.01 -27.178,-23.616 -2.04,12.119 -3.103,21.663 -5.949,34.69 z" />
<path
style="fill:none;stroke:#aa0000;stroke-width:10.649;paint-order:markers fill stroke"
inkscape:connector-curvature="0"
id="path1480-1-3-1-5-7-3"
d="M 127.38575,78.377847 C 176.95734,66.301724 277.68509,72.076365 317.498,86.173"
sodipodi:nodetypes="cc"
transform="matrix(0.89574,0,0,0.81736,18.384,154.236)" />
</g>
<g
style="display:inline;fill:#dddddd;stroke:#aa0000;stroke-width:6.389;stroke-miterlimit:10"
id="g1482-7-0-1-0-3-0-0"
transform="matrix(0.09164294,0.25946757,-0.3195643,0.062685,305.95693,20.796554)"
inkscape:transform-center-x="-11.742481"
inkscape:transform-center-y="-10.950547">
<path
style="stroke:#aa0000;stroke-width:35.526"
inkscape:connector-curvature="0"
id="path1478-7-9-0-19-0-2-6"
transform="matrix(0.4768,-0.02932,0.03214,0.42867,147.58,197.367)"
d="m 315.1,101.79 c 10.682,-4.135 21.77,-7.738 33.127,-11.074 -8.518,-8.139 -17.577,-16.01 -27.178,-23.616 -2.04,12.119 -3.103,21.663 -5.949,34.69 z" />
<path
style="fill:none;stroke:#aa0000;stroke-width:10.649;paint-order:markers fill stroke"
inkscape:connector-curvature="0"
id="path1480-1-3-1-5-7-3-8"
d="M 127.38575,78.377847 C 176.95734,66.301724 277.68509,72.076365 317.498,86.173"
sodipodi:nodetypes="cc"
transform="matrix(0.89574,0,0,0.81736,18.384,154.236)" />
</g>
<g
id="g22110"
transform="matrix(0.74973096,0,0,0.74973096,63.63187,-143.46508)">
id="g22129-5"
transform="matrix(0.75077789,0,0,0.75077789,-1.704702,-92.520435)">
<g
id="g16126-2-7-1-6"
transform="matrix(2.7210883,-0.31550515,0.31550515,2.7210883,-249.93277,163.80122)"
inkscape:transform-center-x="-1.7534042"
inkscape:transform-center-y="7.747707"
style="fill:#000000;fill-opacity:1;stroke-width:0.890368;stroke-dasharray:none">
<ellipse
ry="11.964526"
rx="12.399649"
transform="matrix(0.99721659,-0.07455915,0.0777593,0.99697216,0,0)"
style="opacity:0.203;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.89037;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1"
id="circle15601-9-4-6-28-8-06-1"
cy="76.348717"
cx="173.35909" />
<ellipse
ry="11.964526"
rx="12.399649"
transform="matrix(0.99721659,-0.07455915,0.0777593,0.99697216,0,0)"
style="fill:#ffffff;fill-opacity:1;stroke:#bbbcbe;stroke-width:0.89037;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1"
id="circle15601-9-4-9-4-32-5"
cy="73.518608"
cx="172.10857" />
</g>
<g
id="g16126-2"
transform="matrix(1.3429807,-0.15571613,0.15571613,1.3429807,32.435996,270.30315)"
inkscape:transform-center-x="-0.86538355"
inkscape:transform-center-y="3.8238437">
<ellipse
ry="11.964526"
rx="12.399649"
transform="matrix(0.99721659,-0.07455915,0.0777593,0.99697216,0,0)"
style="fill:#e6e7e8;stroke:#bbbcbe;stroke-width:2.21405;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1"
id="circle15601-9-4-9"
cy="35.279018"
cx="171.4617" />
</g>
<g
id="g16126-2-7"
transform="matrix(1.3429807,-0.15571613,0.15571613,1.3429807,-17.352618,119.10263)"
inkscape:transform-center-x="-0.86537927"
inkscape:transform-center-y="3.8238434"
style="fill:#000000;fill-opacity:1">
<g
id="g21847"
transform="translate(14.664614,100.86343)">
<ellipse
ry="11.964526"
rx="12.399649"
transform="matrix(0.99721659,-0.07455915,0.0777593,0.99697216,0,0)"
style="fill:#ffffff;fill-opacity:1;stroke:#bbbcbe;stroke-width:2.21405;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1"
id="circle15601-9-4-9-4"
cy="45.03503"
cx="154.82559" />
<path
fill="#808285"
d="m 160.16385,39.610842 -3.45322,-0.295187 0.56732,-6.636634 c 0.0692,-0.809346 0.13375,-1.564735 0.24301,-2.207605 -0.2389,0.251334 -0.53175,0.498054 -0.87854,0.740162 l -1.50433,1.067121 -1.59608,-2.310462 4.61631,-3.13818 3.07552,0.262902 z"
id="path12009"
style="stroke-width:0.541531" />
</g>
</g>
</g>
<g
id="g22140"
transform="matrix(0.74973096,0,0,0.74973096,69.203436,-141.27083)">
<ellipse
ry="32.774647"
rx="33.966583"
transform="matrix(0.98199269,-0.1889189,0.1920696,0.98138131,0,0)"
style="opacity:0.203;fill:#000000;fill-opacity:1;stroke:none;stroke-width:2.43901;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1"
id="circle15601-9-4-6-28-8-06-1-7"
cy="325.43878"
cx="313.86319" />
<ellipse
ry="32.774647"
rx="33.966583"
transform="matrix(0.98199269,-0.1889189,0.1920696,0.98138131,0,0)"
style="fill:#ffffff;fill-opacity:1;stroke:#bbbcbe;stroke-width:2.43901;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1"
id="circle15601-9-4-9-4-32-5-6"
cy="317.68619"
cx="310.43762" />
<g
id="g16126-2-5"
transform="matrix(1.3429807,-0.15571613,0.15571613,1.3429807,146.58262,251.0522)"
inkscape:transform-center-x="-0.86538355"
inkscape:transform-center-y="3.8238437">
<ellipse
ry="11.964526"
rx="12.399649"
transform="matrix(0.99721659,-0.07455915,0.0777593,0.99697216,0,0)"
style="fill:#e6e7e8;stroke:#bbbcbe;stroke-width:2.21405;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1"
id="circle15601-9-4-9-6"
cy="35.279018"
cx="171.4617" />
</g>
<g
id="g16126-2-7-5"
transform="matrix(1.3429807,-0.15571613,0.15571613,1.3429807,102.42212,200.0054)"
inkscape:transform-center-x="-0.8653801"
inkscape:transform-center-y="3.8238434"
style="fill:#000000;fill-opacity:1">
<ellipse
ry="11.964526"
rx="12.399649"
transform="matrix(0.99721659,-0.07455915,0.0777593,0.99697216,0,0)"
style="fill:#ffffff;fill-opacity:1;stroke:#bbbcbe;stroke-width:2.21405;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1"
id="circle15601-9-4-9-4-3"
cy="73.518608"
cx="172.10857" />
<path
fill="#808285"
d="m 182.04407,67.08842 -9.37018,-0.800982 0.19432,-2.273238 3.43525,-2.945649 c 0.96769,-0.86673 1.63446,-1.479933 1.94012,-1.788904 0.30566,-0.308972 0.50044,-0.627422 0.63029,-0.839722 0.12984,-0.2123 0.20898,-0.484785 0.23268,-0.76201 0.0284,-0.332668 -0.0588,-0.619372 -0.26631,-0.804664 -0.20282,-0.240738 -0.47531,-0.319881 -0.91887,-0.357797 -0.38811,-0.03318 -0.84115,0.0398 -1.24822,0.2284 -0.40708,0.188602 -0.93452,0.478615 -1.47617,0.934963 l -1.74625,-2.439122 c 0.71747,-0.553019 1.30509,-0.893738 1.77235,-1.133045 0.46726,-0.239308 0.98048,-0.362987 1.54915,-0.481926 0.56867,-0.11894 1.12785,-0.126989 1.79319,-0.07011 0.83167,0.07109 1.59368,0.303781 2.17988,0.63314 0.58619,0.329359 1.10273,0.820313 1.44344,1.407938 0.34072,0.587625 0.45492,1.211737 0.39805,1.877075 -0.0427,0.499004 -0.14076,0.993267 -0.28483,1.371903 -0.1488,0.434079 -0.40376,0.803235 -0.7189,1.223096 -0.31514,0.419861 -0.68098,0.779538 -1.1672,1.240625 -0.48147,0.405642 -1.49987,1.21219 -3.05044,2.364193 l -0.009,0.11089 4.87914,0.417079 -0.24645,2.883131 z"
id="path12021"
style="stroke-width:0.55647" />
</g>
</g>
<g
id="g22120"
transform="matrix(0.74973096,0,0,0.74973096,7.3467682,-96.2666)">
<g
id="g16126-2-7-1-6-5"
transform="matrix(2.7210883,-0.31550515,0.31550515,2.7210883,-151.68119,214.18784)"
inkscape:transform-center-x="-1.7534042"
inkscape:transform-center-y="7.747707"
style="fill:#000000;fill-opacity:1;stroke-width:0.890368;stroke-dasharray:none">
<ellipse
ry="11.964526"
rx="12.399649"
transform="matrix(0.99721659,-0.07455915,0.0777593,0.99697216,0,0)"
style="opacity:0.203;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.89037;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1"
id="circle15601-9-4-6-28-8-06-1-2"
cy="76.348717"
cx="173.35909" />
<ellipse
ry="11.964526"
rx="12.399649"
transform="matrix(0.99721659,-0.07455915,0.0777593,0.99697216,0,0)"
style="fill:#ffffff;fill-opacity:1;stroke:#bbbcbe;stroke-width:0.89037;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1"
id="circle15601-9-4-9-4-32-5-5"
cy="73.518608"
cx="172.10857" />
</g>
<g
id="g16126-2-7-4"
transform="matrix(1.3429807,-0.15571613,0.15571613,1.3429807,80.898965,169.48925)"
inkscape:transform-center-x="-0.86537927"
inkscape:transform-center-y="3.8238434"
style="fill:#000000;fill-opacity:1">
<g
id="g21847-4"
transform="translate(14.664614,100.86343)">
<ellipse
ry="11.964526"
rx="12.399649"
transform="matrix(0.99721659,-0.07455915,0.0777593,0.99697216,0,0)"
style="fill:#ffffff;fill-opacity:1;stroke:#bbbcbe;stroke-width:2.21405;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1"
id="circle15601-9-4-9-4-30"
cy="45.03503"
cx="154.82559" />
<path
fill="#808285"
d="m 160.16385,39.610842 -3.45322,-0.295187 0.56732,-6.636634 c 0.0692,-0.809346 0.13375,-1.564735 0.24301,-2.207605 -0.2389,0.251334 -0.53175,0.498054 -0.87854,0.740162 l -1.50433,1.067121 -1.59608,-2.310462 4.61631,-3.13818 3.07552,0.262902 z"
id="path12009-7"
style="stroke-width:0.541531" />
</g>
</g>
<ellipse
ry="15.883503"
rx="16.461149"
transform="matrix(-0.10421827,-0.99455445,0.99421484,-0.10740972,0,0)"
style="fill:#fce600;fill-opacity:1;stroke:#ffcc00;stroke-width:2.26678;stroke-miterlimit:10;stroke-opacity:1"
id="circle15605-9-9"
cy="331.84833"
cx="-361.1647" />
</g>
<g
id="g22129"
transform="matrix(0.74973096,0,0,0.74973096,6.8485312,-89.944011)">
<g
id="g16126-2-7-1-6-4-8"
id="g16126-2-7-1-6-4-8-9"
transform="matrix(2.7210883,-0.31550515,0.31550515,2.7210883,-37.534557,194.93688)"
inkscape:transform-center-x="-1.7534042"
inkscape:transform-center-y="7.747707"
@ -340,7 +122,7 @@
rx="12.399649"
transform="matrix(0.99721659,-0.07455915,0.0777593,0.99697216,0,0)"
style="opacity:0.203;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.89037;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1"
id="circle15601-9-4-6-28-8-06-1-7-6"
id="circle15601-9-4-6-28-8-06-1-7-6-6"
cy="76.348717"
cx="173.35909" />
<ellipse
@ -348,37 +130,255 @@
rx="12.399649"
transform="matrix(0.99721659,-0.07455915,0.0777593,0.99697216,0,0)"
style="fill:#ffffff;fill-opacity:1;stroke:#bbbcbe;stroke-width:0.89037;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1"
id="circle15601-9-4-9-4-32-5-6-8"
id="circle15601-9-4-9-4-32-5-6-8-2"
cy="73.518608"
cx="172.10857" />
</g>
<g
id="g16126-2-7-5-3"
transform="matrix(1.3429807,-0.15571613,0.15571613,1.3429807,200.6737,250.39202)"
inkscape:transform-center-x="-0.8653801"
id="g16126-2-7-4-7"
transform="matrix(1.3429807,-0.15571613,0.15571613,1.3429807,195.70974,150.87981)"
inkscape:transform-center-x="-0.86537927"
inkscape:transform-center-y="3.8238434"
style="fill:#000000;fill-opacity:1">
<ellipse
ry="11.964526"
rx="12.399649"
transform="matrix(0.99721659,-0.07455915,0.0777593,0.99697216,0,0)"
style="fill:#ffffff;fill-opacity:1;stroke:#bbbcbe;stroke-width:2.21405;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1"
id="circle15601-9-4-9-4-3-1"
cy="73.518608"
cx="172.10857" />
<path
fill="#808285"
d="m 182.04407,67.08842 -9.37018,-0.800982 0.19432,-2.273238 3.43525,-2.945649 c 0.96769,-0.86673 1.63446,-1.479933 1.94012,-1.788904 0.30566,-0.308972 0.50044,-0.627422 0.63029,-0.839722 0.12984,-0.2123 0.20898,-0.484785 0.23268,-0.76201 0.0284,-0.332668 -0.0588,-0.619372 -0.26631,-0.804664 -0.20282,-0.240738 -0.47531,-0.319881 -0.91887,-0.357797 -0.38811,-0.03318 -0.84115,0.0398 -1.24822,0.2284 -0.40708,0.188602 -0.93452,0.478615 -1.47617,0.934963 l -1.74625,-2.439122 c 0.71747,-0.553019 1.30509,-0.893738 1.77235,-1.133045 0.46726,-0.239308 0.98048,-0.362987 1.54915,-0.481926 0.56867,-0.11894 1.12785,-0.126989 1.79319,-0.07011 0.83167,0.07109 1.59368,0.303781 2.17988,0.63314 0.58619,0.329359 1.10273,0.820313 1.44344,1.407938 0.34072,0.587625 0.45492,1.211737 0.39805,1.877075 -0.0427,0.499004 -0.14076,0.993267 -0.28483,1.371903 -0.1488,0.434079 -0.40376,0.803235 -0.7189,1.223096 -0.31514,0.419861 -0.68098,0.779538 -1.1672,1.240625 -0.48147,0.405642 -1.49987,1.21219 -3.05044,2.364193 l -0.009,0.11089 4.87914,0.417079 -0.24645,2.883131 z"
id="path12021-4"
style="stroke-width:0.55647" />
<g
id="g21847-4-6"
transform="translate(14.664614,100.86343)">
<ellipse
ry="11.964526"
rx="12.399649"
transform="matrix(0.99721659,-0.07455915,0.0777593,0.99697216,0,0)"
style="fill:#ffffff;fill-opacity:1;stroke:#bbbcbe;stroke-width:2.21405;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1"
id="circle15601-9-4-9-4-30-3"
cy="45.03503"
cx="154.82559" />
<path
fill="#808285"
d="m 160.16385,39.610842 -3.45322,-0.295187 0.56732,-6.636634 c 0.0692,-0.809346 0.13375,-1.564735 0.24301,-2.207605 -0.2389,0.251334 -0.53175,0.498054 -0.87854,0.740162 l -1.50433,1.067121 -1.59608,-2.310462 4.61631,-3.13818 3.07552,0.262902 z"
id="path12009-7-1"
style="stroke-width:0.541531" />
</g>
</g>
<ellipse
ry="15.883503"
rx="16.461149"
transform="matrix(-0.10421827,-0.99455445,0.99421484,-0.10740972,0,0)"
style="fill:#fce600;fill-opacity:1;stroke:#ffcc00;stroke-width:2.26678;stroke-miterlimit:10;stroke-opacity:1"
id="circle15605-9-9-2"
id="circle15605-9-9-2-5"
cy="447.02319"
cx="-353.06204" />
</g>
<g
id="g22120-4"
transform="matrix(0.75077789,0,0,0.75077789,72.689648,-198.55003)">
<g
id="g16126-2-7-1-6-5-4"
transform="matrix(2.7210883,-0.31550515,0.31550515,2.7210883,-151.68119,214.18784)"
inkscape:transform-center-x="-1.7534042"
inkscape:transform-center-y="7.747707"
style="fill:#000000;fill-opacity:1;stroke-width:0.890368;stroke-dasharray:none">
<ellipse
ry="11.964526"
rx="12.399649"
transform="matrix(0.99721659,-0.07455915,0.0777593,0.99697216,0,0)"
style="opacity:0.203;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.89037;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1"
id="circle15601-9-4-6-28-8-06-1-2-4"
cy="76.348717"
cx="173.35909" />
<ellipse
ry="11.964526"
rx="12.399649"
transform="matrix(0.99721659,-0.07455915,0.0777593,0.99697216,0,0)"
style="fill:#ffffff;fill-opacity:1;stroke:#bbbcbe;stroke-width:0.89037;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1"
id="circle15601-9-4-9-4-32-5-5-4"
cy="73.518608"
cx="172.10857" />
</g>
<g
id="g16126-2-7-5-0-8"
transform="matrix(1.3429807,-0.15571612,0.15571612,1.3429807,86.90606,270.21479)"
inkscape:transform-center-x="-0.8653801"
inkscape:transform-center-y="3.8238434"
style="fill:#000000;fill-opacity:1;stroke-width:0.890368;stroke-dasharray:none">
<ellipse
ry="11.964526"
rx="12.399649"
transform="matrix(0.99721659,-0.07455915,0.0777593,0.99697216,0,0)"
style="fill:#ffffff;fill-opacity:1;stroke:#bbbcbe;stroke-width:2.21405;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1"
id="circle15601-9-4-9-4-3-3-1"
cy="73.518608"
cx="172.10857" />
<path
fill="#808285"
d="m 181.85943,61.164775 c -0.24926,2.149772 -0.79868,3.680219 -1.65435,4.643774 -0.84958,0.911121 -2.01147,1.307785 -3.47961,1.137558 -1.46814,-0.170228 -2.50845,-0.822234 -3.12092,-1.956017 -0.61248,-1.133783 -0.79712,-2.749343 -0.56002,-4.794247 0.24926,-2.149772 0.80476,-3.732653 1.65434,-4.643774 0.84958,-0.911122 2.01148,-1.307785 3.47962,-1.137558 1.46813,0.170228 2.50844,0.822234 3.12091,1.956016 0.61857,1.08135 0.80321,2.69691 0.56003,4.794248 z m -5.55795,-0.644433 c -0.15807,1.363269 -0.16871,2.371665 -0.0661,2.861804 0.0965,0.542573 0.3807,0.841218 0.80017,0.889855 0.41947,0.04863 0.71203,-0.183134 0.98256,-0.68315 0.2181,-0.506096 0.4324,-1.437739 0.59047,-2.801009 0.15806,-1.363269 0.16263,-2.319231 0.0661,-2.861803 -0.0965,-0.542575 -0.37462,-0.893652 -0.79409,-0.942289 -0.41947,-0.04863 -0.71203,0.183134 -0.98256,0.68315 -0.2181,0.506096 -0.43848,1.490172 -0.59655,2.853442 z"
id="path38364-2"
style="stroke-width:0.527847" />
</g>
<ellipse
ry="15.883503"
rx="16.461149"
transform="matrix(-0.10421827,-0.99455445,0.99421484,-0.10740972,0,0)"
style="fill:#fce600;fill-opacity:1;stroke:#ffcc00;stroke-width:2.26678;stroke-miterlimit:10;stroke-opacity:1"
id="circle15605-9-9-7"
cy="331.84833"
cx="-361.1647" />
</g>
<g
style="display:inline;fill:#dddddd;stroke:#aa0000;stroke-width:6.389;stroke-miterlimit:10"
id="g1482-7-0-1-0-3-0-12"
transform="matrix(0.2654269,-0.07404078,0.04105019,0.3235151,211.51572,-2.3281985)"
inkscape:transform-center-x="17.307267"
inkscape:transform-center-y="-45.741577">
<path
style="fill:none;stroke:#aa0000;stroke-width:10.649;paint-order:markers fill stroke"
inkscape:connector-curvature="0"
id="path1480-1-3-1-5-7-3-9"
d="M 127.38575,78.377847 C 176.95734,66.301724 277.68509,72.076365 317.498,86.173"
sodipodi:nodetypes="cc"
transform="matrix(0.89574,0,0,0.81736,18.384,154.236)" />
<path
style="stroke:#aa0000;stroke-width:35.526"
inkscape:connector-curvature="0"
id="path1478-7-9-0-19-0-2-93"
transform="matrix(0.4768,-0.02932,0.03214,0.42867,147.58,197.367)"
d="m 315.1,101.79 c 10.682,-4.135 21.77,-7.738 33.127,-11.074 -8.518,-8.139 -17.577,-16.01 -27.178,-23.616 -2.04,12.119 -3.103,21.663 -5.949,34.69 z" />
</g>
<g
id="g22110-5"
transform="matrix(0.75077789,0,0,0.75077789,49.878651,-155.69515)">
<g
id="g16126-2-7-1-6-0"
transform="matrix(2.7210883,-0.31550515,0.31550515,2.7210883,-244.98632,172.91485)"
inkscape:transform-center-x="-1.7534042"
inkscape:transform-center-y="7.747707"
style="fill:#000000;fill-opacity:1;stroke-width:0.890368;stroke-dasharray:none">
<ellipse
ry="11.964526"
rx="12.399649"
transform="matrix(0.99721659,-0.07455915,0.0777593,0.99697216,0,0)"
style="opacity:0.203;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.89037;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1"
id="circle15601-9-4-6-28-8-06-1-9"
cy="76.348717"
cx="173.35909" />
<ellipse
ry="11.964526"
rx="12.399649"
transform="matrix(0.99721659,-0.07455915,0.0777593,0.99697216,0,0)"
style="fill:#ffffff;fill-opacity:1;stroke:#bbbcbe;stroke-width:0.89037;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1"
id="circle15601-9-4-9-4-32-5-63"
cy="73.518608"
cx="172.10857" />
<g
id="g16126-2-7-5-0"
transform="matrix(0.49354543,0,0,0.49354543,83.859552,30.156513)"
inkscape:transform-center-x="-0.8653801"
inkscape:transform-center-y="3.8238434"
style="fill:#000000;fill-opacity:1">
<ellipse
ry="11.964526"
rx="12.399649"
transform="matrix(0.99721659,-0.07455915,0.0777593,0.99697216,0,0)"
style="fill:#ffffff;fill-opacity:1;stroke:#bbbcbe;stroke-width:2.21405;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1"
id="circle15601-9-4-9-4-3-3"
cy="73.518608"
cx="172.10857" />
<path
fill="#808285"
d="m 181.85943,61.164775 c -0.24926,2.149772 -0.79868,3.680219 -1.65435,4.643774 -0.84958,0.911121 -2.01147,1.307785 -3.47961,1.137558 -1.46814,-0.170228 -2.50845,-0.822234 -3.12092,-1.956017 -0.61248,-1.133783 -0.79712,-2.749343 -0.56002,-4.794247 0.24926,-2.149772 0.80476,-3.732653 1.65434,-4.643774 0.84958,-0.911122 2.01148,-1.307785 3.47962,-1.137558 1.46813,0.170228 2.50844,0.822234 3.12091,1.956016 0.61857,1.08135 0.80321,2.69691 0.56003,4.794248 z m -5.55795,-0.644433 c -0.15807,1.363269 -0.16871,2.371665 -0.0661,2.861804 0.0965,0.542573 0.3807,0.841218 0.80017,0.889855 0.41947,0.04863 0.71203,-0.183134 0.98256,-0.68315 0.2181,-0.506096 0.4324,-1.437739 0.59047,-2.801009 0.15806,-1.363269 0.16263,-2.319231 0.0661,-2.861803 -0.0965,-0.542575 -0.37462,-0.893652 -0.79409,-0.942289 -0.41947,-0.04863 -0.71203,0.183134 -0.98256,0.68315 -0.2181,0.506096 -0.43848,1.490172 -0.59655,2.853442 z"
id="path38364"
style="stroke-width:0.527847" />
</g>
</g>
<g
id="g16126-2-8"
transform="matrix(1.3429807,-0.15571613,0.15571613,1.3429807,37.123071,278.37585)"
inkscape:transform-center-x="-0.86538355"
inkscape:transform-center-y="3.8238437">
<ellipse
ry="11.964526"
rx="12.399649"
transform="matrix(0.99721659,-0.07455915,0.0777593,0.99697216,0,0)"
style="fill:#e6e7e8;stroke:#bbbcbe;stroke-width:2.21405;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1"
id="circle15601-9-4-9-5"
cy="35.279018"
cx="171.4617" />
</g>
</g>
<g
style="display:inline;fill:#dddddd;stroke:#aa0000;stroke-width:6.389;stroke-miterlimit:10"
id="g1482-7-0-1-0-3-0-0-0"
transform="matrix(0.25911998,-0.09375663,0.06521966,0.3195208,218.70056,96.274997)"
inkscape:transform-center-x="6.1686214"
inkscape:transform-center-y="47.701648">
<path
style="stroke:#aa0000;stroke-width:35.526"
inkscape:connector-curvature="0"
id="path1478-7-9-0-19-0-2-6-8"
transform="matrix(0.4768,-0.02932,0.03214,0.42867,147.58,197.367)"
d="m 315.1,101.79 c 10.682,-4.135 21.77,-7.738 33.127,-11.074 -8.518,-8.139 -17.577,-16.01 -27.178,-23.616 -2.04,12.119 -3.103,21.663 -5.949,34.69 z" />
<path
style="fill:none;stroke:#aa0000;stroke-width:10.649;paint-order:markers fill stroke"
inkscape:connector-curvature="0"
id="path1480-1-3-1-5-7-3-8-8"
d="M 127.38575,78.377847 C 176.95734,66.301724 277.68509,72.076365 317.498,86.173"
sodipodi:nodetypes="cc"
transform="matrix(0.89574,0,0,0.81736,18.384,154.236)" />
</g>
<g
id="g22140-9"
transform="matrix(0.75077789,0,0,0.75077789,-13.548448,-45.978509)">
<ellipse
ry="32.774647"
rx="33.966583"
transform="matrix(0.98199269,-0.1889189,0.1920696,0.98138131,0,0)"
style="opacity:0.203;fill:#000000;fill-opacity:1;stroke:none;stroke-width:2.43901;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1"
id="circle15601-9-4-6-28-8-06-1-7-8"
cy="325.43878"
cx="313.86319" />
<ellipse
ry="32.774647"
rx="33.966583"
transform="matrix(0.98199269,-0.1889189,0.1920696,0.98138131,0,0)"
style="fill:#ffffff;fill-opacity:1;stroke:#bbbcbe;stroke-width:2.43901;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1"
id="circle15601-9-4-9-4-32-5-6-4"
cy="317.68619"
cx="310.43762" />
<g
id="g16126-2-5-8"
transform="matrix(1.3429807,-0.15571613,0.15571613,1.3429807,146.58262,251.0522)"
inkscape:transform-center-x="-0.86538355"
inkscape:transform-center-y="3.8238437">
<ellipse
ry="11.964526"
rx="12.399649"
transform="matrix(0.99721659,-0.07455915,0.0777593,0.99697216,0,0)"
style="fill:#e6e7e8;stroke:#bbbcbe;stroke-width:2.21405;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1"
id="circle15601-9-4-9-6-1"
cy="35.279018"
cx="171.4617" />
</g>
<g
id="g16126-2-7-6"
transform="matrix(1.3429807,-0.15571613,0.15571613,1.3429807,96.602137,99.513079)"
inkscape:transform-center-x="-0.86537927"
inkscape:transform-center-y="3.8238434"
style="fill:#000000;fill-opacity:1">
<g
id="g21847-1"
transform="translate(14.664614,100.86343)">
<ellipse
ry="11.964526"
rx="12.399649"
transform="matrix(0.99721659,-0.07455915,0.0777593,0.99697216,0,0)"
style="fill:#ffffff;fill-opacity:1;stroke:#bbbcbe;stroke-width:2.21405;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1"
id="circle15601-9-4-9-4-1"
cy="45.03503"
cx="154.82559" />
<path
fill="#808285"
d="m 160.16385,39.610842 -3.45322,-0.295187 0.56732,-6.636634 c 0.0692,-0.809346 0.13375,-1.564735 0.24301,-2.207605 -0.2389,0.251334 -0.53175,0.498054 -0.87854,0.740162 l -1.50433,1.067121 -1.59608,-2.310462 4.61631,-3.13818 3.07552,0.262902 z"
id="path12009-5"
style="stroke-width:0.541531" />
</g>
</g>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 18 KiB

After

Width:  |  Height:  |  Size: 18 KiB

View File

@ -34,13 +34,13 @@
guidetolerance="10"
inkscape:pageopacity="0"
inkscape:pageshadow="2"
inkscape:window-width="1080"
inkscape:window-height="1864"
inkscape:window-width="1920"
inkscape:window-height="1024"
id="namedview15615"
showgrid="false"
inkscape:zoom="1.8505343"
inkscape:cx="244.25378"
inkscape:cy="138.87881"
inkscape:cx="161.03457"
inkscape:cy="43.771142"
inkscape:window-x="0"
inkscape:window-y="0"
inkscape:window-maximized="1"
@ -98,7 +98,7 @@
</g>
<g
id="g22129-5"
transform="matrix(0.64741592,0,0,0.64741592,-104.90418,-66.111568)">
transform="matrix(0.64741592,0,0,0.64741592,-106.25276,-67.460146)">
<g
id="g16126-2-7-1-6-4-8-9"
transform="matrix(2.7210883,-0.31550515,0.31550515,2.7210883,-37.534557,194.93688)"
@ -123,24 +123,28 @@
cx="172.10857" />
</g>
<g
id="g16126-2-7-5-3-1"
transform="matrix(1.3429807,-0.15571613,0.15571613,1.3429807,200.6737,250.39202)"
inkscape:transform-center-x="-0.8653801"
id="g16126-2-7-4-7"
transform="matrix(1.3429807,-0.15571613,0.15571613,1.3429807,195.70974,150.87981)"
inkscape:transform-center-x="-0.86537927"
inkscape:transform-center-y="3.8238434"
style="fill:#000000;fill-opacity:1">
<ellipse
ry="11.964526"
rx="12.399649"
transform="matrix(0.99721659,-0.07455915,0.0777593,0.99697216,0,0)"
style="fill:#ffffff;fill-opacity:1;stroke:#bbbcbe;stroke-width:2.21405;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1"
id="circle15601-9-4-9-4-3-1-7"
cy="73.518608"
cx="172.10857" />
<path
fill="#808285"
d="m 182.04407,67.08842 -9.37018,-0.800982 0.19432,-2.273238 3.43525,-2.945649 c 0.96769,-0.86673 1.63446,-1.479933 1.94012,-1.788904 0.30566,-0.308972 0.50044,-0.627422 0.63029,-0.839722 0.12984,-0.2123 0.20898,-0.484785 0.23268,-0.76201 0.0284,-0.332668 -0.0588,-0.619372 -0.26631,-0.804664 -0.20282,-0.240738 -0.47531,-0.319881 -0.91887,-0.357797 -0.38811,-0.03318 -0.84115,0.0398 -1.24822,0.2284 -0.40708,0.188602 -0.93452,0.478615 -1.47617,0.934963 l -1.74625,-2.439122 c 0.71747,-0.553019 1.30509,-0.893738 1.77235,-1.133045 0.46726,-0.239308 0.98048,-0.362987 1.54915,-0.481926 0.56867,-0.11894 1.12785,-0.126989 1.79319,-0.07011 0.83167,0.07109 1.59368,0.303781 2.17988,0.63314 0.58619,0.329359 1.10273,0.820313 1.44344,1.407938 0.34072,0.587625 0.45492,1.211737 0.39805,1.877075 -0.0427,0.499004 -0.14076,0.993267 -0.28483,1.371903 -0.1488,0.434079 -0.40376,0.803235 -0.7189,1.223096 -0.31514,0.419861 -0.68098,0.779538 -1.1672,1.240625 -0.48147,0.405642 -1.49987,1.21219 -3.05044,2.364193 l -0.009,0.11089 4.87914,0.417079 -0.24645,2.883131 z"
id="path12021-4-8"
style="stroke-width:0.55647" />
<g
id="g21847-4-6"
transform="translate(14.664614,100.86343)">
<ellipse
ry="11.964526"
rx="12.399649"
transform="matrix(0.99721659,-0.07455915,0.0777593,0.99697216,0,0)"
style="fill:#ffffff;fill-opacity:1;stroke:#bbbcbe;stroke-width:2.21405;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1"
id="circle15601-9-4-9-4-30-3"
cy="45.03503"
cx="154.82559" />
<path
fill="#808285"
d="m 160.16385,39.610842 -3.45322,-0.295187 0.56732,-6.636634 c 0.0692,-0.809346 0.13375,-1.564735 0.24301,-2.207605 -0.2389,0.251334 -0.53175,0.498054 -0.87854,0.740162 l -1.50433,1.067121 -1.59608,-2.310462 4.61631,-3.13818 3.07552,0.262902 z"
id="path12009-7-1"
style="stroke-width:0.541531" />
</g>
</g>
<ellipse
ry="15.883503"
@ -426,28 +430,24 @@
cx="172.10857" />
</g>
<g
id="g16126-2-7-4-7"
transform="matrix(1.3429807,-0.15571613,0.15571613,1.3429807,80.898965,169.48925)"
inkscape:transform-center-x="-0.86537927"
id="g16126-2-7-5-0-8"
transform="matrix(1.3429807,-0.15571612,0.15571612,1.3429807,86.90606,270.21479)"
inkscape:transform-center-x="-0.8653801"
inkscape:transform-center-y="3.8238434"
style="fill:#000000;fill-opacity:1">
<g
id="g21847-4-6"
transform="translate(14.664614,100.86343)">
<ellipse
ry="11.964526"
rx="12.399649"
transform="matrix(0.99721659,-0.07455915,0.0777593,0.99697216,0,0)"
style="fill:#ffffff;fill-opacity:1;stroke:#bbbcbe;stroke-width:2.21405;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1"
id="circle15601-9-4-9-4-30-3"
cy="45.03503"
cx="154.82559" />
<path
fill="#808285"
d="m 160.16385,39.610842 -3.45322,-0.295187 0.56732,-6.636634 c 0.0692,-0.809346 0.13375,-1.564735 0.24301,-2.207605 -0.2389,0.251334 -0.53175,0.498054 -0.87854,0.740162 l -1.50433,1.067121 -1.59608,-2.310462 4.61631,-3.13818 3.07552,0.262902 z"
id="path12009-7-1"
style="stroke-width:0.541531" />
</g>
style="fill:#000000;fill-opacity:1;stroke-width:0.890368;stroke-dasharray:none">
<ellipse
ry="11.964526"
rx="12.399649"
transform="matrix(0.99721659,-0.07455915,0.0777593,0.99697216,0,0)"
style="fill:#ffffff;fill-opacity:1;stroke:#bbbcbe;stroke-width:2.21405;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1"
id="circle15601-9-4-9-4-3-3-1"
cy="73.518608"
cx="172.10857" />
<path
fill="#808285"
d="m 181.85943,61.164775 c -0.24926,2.149772 -0.79868,3.680219 -1.65435,4.643774 -0.84958,0.911121 -2.01147,1.307785 -3.47961,1.137558 -1.46814,-0.170228 -2.50845,-0.822234 -3.12092,-1.956017 -0.61248,-1.133783 -0.79712,-2.749343 -0.56002,-4.794247 0.24926,-2.149772 0.80476,-3.732653 1.65434,-4.643774 0.84958,-0.911122 2.01148,-1.307785 3.47962,-1.137558 1.46813,0.170228 2.50844,0.822234 3.12091,1.956016 0.61857,1.08135 0.80321,2.69691 0.56003,4.794248 z m -5.55795,-0.644433 c -0.15807,1.363269 -0.16871,2.371665 -0.0661,2.861804 0.0965,0.542573 0.3807,0.841218 0.80017,0.889855 0.41947,0.04863 0.71203,-0.183134 0.98256,-0.68315 0.2181,-0.506096 0.4324,-1.437739 0.59047,-2.801009 0.15806,-1.363269 0.16263,-2.319231 0.0661,-2.861803 -0.0965,-0.542575 -0.37462,-0.893652 -0.79409,-0.942289 -0.41947,-0.04863 -0.71203,0.183134 -0.98256,0.68315 -0.2181,0.506096 -0.43848,1.490172 -0.59655,2.853442 z"
id="path38364-2"
style="stroke-width:0.527847" />
</g>
<ellipse
ry="15.883503"
@ -480,10 +480,10 @@
</g>
<g
id="g22110-5"
transform="matrix(0.64741592,0,0,0.64741592,-55.869996,-112.32867)">
transform="matrix(0.64741592,0,0,0.64741592,-61.771051,-121.93739)">
<g
id="g16126-2-7-1-6-0"
transform="matrix(2.7210883,-0.31550515,0.31550515,2.7210883,-249.93277,163.80122)"
transform="matrix(2.7210883,-0.31550515,0.31550515,2.7210883,-244.98632,172.91485)"
inkscape:transform-center-x="-1.7534042"
inkscape:transform-center-y="7.747707"
style="fill:#000000;fill-opacity:1;stroke-width:0.890368;stroke-dasharray:none">
@ -503,10 +503,30 @@
id="circle15601-9-4-9-4-32-5-63"
cy="73.518608"
cx="172.10857" />
<g
id="g16126-2-7-5-0"
transform="matrix(0.49354543,0,0,0.49354543,83.859552,30.156513)"
inkscape:transform-center-x="-0.8653801"
inkscape:transform-center-y="3.8238434"
style="fill:#000000;fill-opacity:1">
<ellipse
ry="11.964526"
rx="12.399649"
transform="matrix(0.99721659,-0.07455915,0.0777593,0.99697216,0,0)"
style="fill:#ffffff;fill-opacity:1;stroke:#bbbcbe;stroke-width:2.21405;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1"
id="circle15601-9-4-9-4-3-3"
cy="73.518608"
cx="172.10857" />
<path
fill="#808285"
d="m 181.85943,61.164775 c -0.24926,2.149772 -0.79868,3.680219 -1.65435,4.643774 -0.84958,0.911121 -2.01147,1.307785 -3.47961,1.137558 -1.46814,-0.170228 -2.50845,-0.822234 -3.12092,-1.956017 -0.61248,-1.133783 -0.79712,-2.749343 -0.56002,-4.794247 0.24926,-2.149772 0.80476,-3.732653 1.65434,-4.643774 0.84958,-0.911122 2.01148,-1.307785 3.47962,-1.137558 1.46813,0.170228 2.50844,0.822234 3.12091,1.956016 0.61857,1.08135 0.80321,2.69691 0.56003,4.794248 z m -5.55795,-0.644433 c -0.15807,1.363269 -0.16871,2.371665 -0.0661,2.861804 0.0965,0.542573 0.3807,0.841218 0.80017,0.889855 0.41947,0.04863 0.71203,-0.183134 0.98256,-0.68315 0.2181,-0.506096 0.4324,-1.437739 0.59047,-2.801009 0.15806,-1.363269 0.16263,-2.319231 0.0661,-2.861803 -0.0965,-0.542575 -0.37462,-0.893652 -0.79409,-0.942289 -0.41947,-0.04863 -0.71203,0.183134 -0.98256,0.68315 -0.2181,0.506096 -0.43848,1.490172 -0.59655,2.853442 z"
id="path38364"
style="stroke-width:0.527847" />
</g>
</g>
<g
id="g16126-2-8"
transform="matrix(1.3429807,-0.15571613,0.15571613,1.3429807,32.435996,270.30315)"
transform="matrix(1.3429807,-0.15571613,0.15571613,1.3429807,37.123071,278.37585)"
inkscape:transform-center-x="-0.86538355"
inkscape:transform-center-y="3.8238437">
<ellipse
@ -518,30 +538,6 @@
cy="35.279018"
cx="171.4617" />
</g>
<g
id="g16126-2-7-6"
transform="matrix(1.3429807,-0.15571613,0.15571613,1.3429807,-17.352618,119.10263)"
inkscape:transform-center-x="-0.86537927"
inkscape:transform-center-y="3.8238434"
style="fill:#000000;fill-opacity:1">
<g
id="g21847-1"
transform="translate(14.664614,100.86343)">
<ellipse
ry="11.964526"
rx="12.399649"
transform="matrix(0.99721659,-0.07455915,0.0777593,0.99697216,0,0)"
style="fill:#ffffff;fill-opacity:1;stroke:#bbbcbe;stroke-width:2.21405;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1"
id="circle15601-9-4-9-4-1"
cy="45.03503"
cx="154.82559" />
<path
fill="#808285"
d="m 160.16385,39.610842 -3.45322,-0.295187 0.56732,-6.636634 c 0.0692,-0.809346 0.13375,-1.564735 0.24301,-2.207605 -0.2389,0.251334 -0.53175,0.498054 -0.87854,0.740162 l -1.50433,1.067121 -1.59608,-2.310462 4.61631,-3.13818 3.07552,0.262902 z"
id="path12009-5"
style="stroke-width:0.541531" />
</g>
</g>
</g>
<g
style="display:inline;fill:#dddddd;stroke:#aa0000;stroke-width:6.389;stroke-miterlimit:10"
@ -597,24 +593,28 @@
cx="171.4617" />
</g>
<g
id="g16126-2-7-5-0"
transform="matrix(1.3429807,-0.15571613,0.15571613,1.3429807,102.42212,200.0054)"
inkscape:transform-center-x="-0.8653801"
id="g16126-2-7-6"
transform="matrix(1.3429807,-0.15571613,0.15571613,1.3429807,96.602137,99.513079)"
inkscape:transform-center-x="-0.86537927"
inkscape:transform-center-y="3.8238434"
style="fill:#000000;fill-opacity:1">
<ellipse
ry="11.964526"
rx="12.399649"
transform="matrix(0.99721659,-0.07455915,0.0777593,0.99697216,0,0)"
style="fill:#ffffff;fill-opacity:1;stroke:#bbbcbe;stroke-width:2.21405;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1"
id="circle15601-9-4-9-4-3-3"
cy="73.518608"
cx="172.10857" />
<path
fill="#808285"
d="m 182.04407,67.08842 -9.37018,-0.800982 0.19432,-2.273238 3.43525,-2.945649 c 0.96769,-0.86673 1.63446,-1.479933 1.94012,-1.788904 0.30566,-0.308972 0.50044,-0.627422 0.63029,-0.839722 0.12984,-0.2123 0.20898,-0.484785 0.23268,-0.76201 0.0284,-0.332668 -0.0588,-0.619372 -0.26631,-0.804664 -0.20282,-0.240738 -0.47531,-0.319881 -0.91887,-0.357797 -0.38811,-0.03318 -0.84115,0.0398 -1.24822,0.2284 -0.40708,0.188602 -0.93452,0.478615 -1.47617,0.934963 l -1.74625,-2.439122 c 0.71747,-0.553019 1.30509,-0.893738 1.77235,-1.133045 0.46726,-0.239308 0.98048,-0.362987 1.54915,-0.481926 0.56867,-0.11894 1.12785,-0.126989 1.79319,-0.07011 0.83167,0.07109 1.59368,0.303781 2.17988,0.63314 0.58619,0.329359 1.10273,0.820313 1.44344,1.407938 0.34072,0.587625 0.45492,1.211737 0.39805,1.877075 -0.0427,0.499004 -0.14076,0.993267 -0.28483,1.371903 -0.1488,0.434079 -0.40376,0.803235 -0.7189,1.223096 -0.31514,0.419861 -0.68098,0.779538 -1.1672,1.240625 -0.48147,0.405642 -1.49987,1.21219 -3.05044,2.364193 l -0.009,0.11089 4.87914,0.417079 -0.24645,2.883131 z"
id="path12021-0"
style="stroke-width:0.55647" />
<g
id="g21847-1"
transform="translate(14.664614,100.86343)">
<ellipse
ry="11.964526"
rx="12.399649"
transform="matrix(0.99721659,-0.07455915,0.0777593,0.99697216,0,0)"
style="fill:#ffffff;fill-opacity:1;stroke:#bbbcbe;stroke-width:2.21405;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1"
id="circle15601-9-4-9-4-1"
cy="45.03503"
cx="154.82559" />
<path
fill="#808285"
d="m 160.16385,39.610842 -3.45322,-0.295187 0.56732,-6.636634 c 0.0692,-0.809346 0.13375,-1.564735 0.24301,-2.207605 -0.2389,0.251334 -0.53175,0.498054 -0.87854,0.740162 l -1.50433,1.067121 -1.59608,-2.310462 4.61631,-3.13818 3.07552,0.262902 z"
id="path12009-5"
style="stroke-width:0.541531" />
</g>
</g>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 31 KiB

After

Width:  |  Height:  |  Size: 30 KiB

View File

@ -34,12 +34,12 @@
guidetolerance="10"
inkscape:pageopacity="0"
inkscape:pageshadow="2"
inkscape:window-width="1080"
inkscape:window-height="1864"
inkscape:window-width="1920"
inkscape:window-height="1024"
id="namedview15615"
showgrid="false"
inkscape:zoom="1.8505343"
inkscape:cx="306.398"
inkscape:cx="306.93838"
inkscape:cy="75.653826"
inkscape:window-x="0"
inkscape:window-y="0"
@ -61,327 +61,6 @@
<g
id="g42748-8-7"
transform="matrix(1.8064408,-0.18998633,0.18891275,1.7424528,0.75353121,-65.908903)" />
<ellipse
style="fill:#e6e7e8;stroke:#bbbcbe;stroke-width:0;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1"
id="circle15601-9-4-4-6-1"
cy="115.18488"
cx="153.36613"
transform="matrix(0.99480921,-0.10175774,0.11080699,0.99384194,0,0)"
rx="84.42717"
ry="80.58812" />
<g
style="display:inline;fill:none;stroke:#008000;stroke-width:6.389;stroke-miterlimit:10;stroke-opacity:1"
id="g1482-7-0-1-0-3-0-1"
transform="matrix(0.05844494,0.23032345,-0.27973133,0.02882572,252.7951,28.238267)"
inkscape:transform-center-x="-37.596545"
inkscape:transform-center-y="-11.22469">
<path
style="fill:none;stroke:#008000;stroke-width:35.526;stroke-opacity:1"
inkscape:connector-curvature="0"
id="path1478-7-9-0-19-0-2-9"
transform="matrix(0.4768,-0.02932,0.03214,0.42867,147.58,197.367)"
d="m 315.1,101.79 c 10.682,-4.135 21.77,-7.738 33.127,-11.074 -8.518,-8.139 -17.577,-16.01 -27.178,-23.616 -2.04,12.119 -3.103,21.663 -5.949,34.69 z" />
<path
style="fill:none;stroke:#008000;stroke-width:10.649;stroke-opacity:1;paint-order:markers fill stroke"
inkscape:connector-curvature="0"
id="path1480-1-3-1-5-7-3-4"
d="M 127.38575,78.377847 C 176.95734,66.301724 277.68509,72.076365 317.498,86.173"
sodipodi:nodetypes="cc"
transform="matrix(0.89574,0,0,0.81736,18.384,154.236)" />
</g>
<g
style="display:inline;fill:none;stroke:#008000;stroke-width:6.389;stroke-miterlimit:10;stroke-opacity:1"
id="g1482-7-0-1-0-3-0-1-9"
transform="matrix(0.08080516,0.22346192,-0.27554235,0.05618677,168.45183,31.581522)"
inkscape:transform-center-x="41.812203"
inkscape:transform-center-y="-1.6579031">
<path
style="fill:none;stroke:#008000;stroke-width:35.526;stroke-opacity:1"
inkscape:connector-curvature="0"
id="path1478-7-9-0-19-0-2-9-2"
transform="matrix(0.4768,-0.02932,0.03214,0.42867,147.58,197.367)"
d="m 315.1,101.79 c 10.682,-4.135 21.77,-7.738 33.127,-11.074 -8.518,-8.139 -17.577,-16.01 -27.178,-23.616 -2.04,12.119 -3.103,21.663 -5.949,34.69 z" />
<path
style="fill:none;stroke:#008000;stroke-width:10.649;stroke-opacity:1;paint-order:markers fill stroke"
inkscape:connector-curvature="0"
id="path1480-1-3-1-5-7-3-4-6"
d="M 127.38575,78.377847 C 176.95734,66.301724 277.68509,72.076365 317.498,86.173"
sodipodi:nodetypes="cc"
transform="matrix(0.89574,0,0,0.81736,18.384,154.236)" />
</g>
<g
style="display:inline;fill:#dddddd;stroke:#aa0000;stroke-width:6.389;stroke-miterlimit:10"
id="g1482-7-0-1-0-3-0"
transform="matrix(0.22888474,-0.06384735,0.03539868,0.27897575,89.865653,14.721504)"
inkscape:transform-center-x="14.924518"
inkscape:transform-center-y="-39.444189">
<path
style="stroke:#aa0000;stroke-width:35.526"
inkscape:connector-curvature="0"
id="path1478-7-9-0-19-0-2"
transform="matrix(0.4768,-0.02932,0.03214,0.42867,147.58,197.367)"
d="m 315.1,101.79 c 10.682,-4.135 21.77,-7.738 33.127,-11.074 -8.518,-8.139 -17.577,-16.01 -27.178,-23.616 -2.04,12.119 -3.103,21.663 -5.949,34.69 z" />
<path
style="fill:none;stroke:#aa0000;stroke-width:10.649;paint-order:markers fill stroke"
inkscape:connector-curvature="0"
id="path1480-1-3-1-5-7-3"
d="M 127.38575,78.377847 C 176.95734,66.301724 277.68509,72.076365 317.498,86.173"
sodipodi:nodetypes="cc"
transform="matrix(0.89574,0,0,0.81736,18.384,154.236)" />
</g>
<g
style="display:inline;fill:#dddddd;stroke:#aa0000;stroke-width:6.389;stroke-miterlimit:10"
id="g1482-7-0-1-0-3-0-0"
transform="matrix(0.22344611,-0.08084886,0.05624066,0.27553136,96.061332,99.749679)"
inkscape:transform-center-x="5.3193666"
inkscape:transform-center-y="41.134411">
<path
style="stroke:#aa0000;stroke-width:35.526"
inkscape:connector-curvature="0"
id="path1478-7-9-0-19-0-2-6"
transform="matrix(0.4768,-0.02932,0.03214,0.42867,147.58,197.367)"
d="m 315.1,101.79 c 10.682,-4.135 21.77,-7.738 33.127,-11.074 -8.518,-8.139 -17.577,-16.01 -27.178,-23.616 -2.04,12.119 -3.103,21.663 -5.949,34.69 z" />
<path
style="fill:none;stroke:#aa0000;stroke-width:10.649;paint-order:markers fill stroke"
inkscape:connector-curvature="0"
id="path1480-1-3-1-5-7-3-8"
d="M 127.38575,78.377847 C 176.95734,66.301724 277.68509,72.076365 317.498,86.173"
sodipodi:nodetypes="cc"
transform="matrix(0.89574,0,0,0.81736,18.384,154.236)" />
</g>
<g
id="g22110"
transform="matrix(0.64741592,0,0,0.64741592,-43.617283,-107.92221)">
<g
id="g16126-2-7-1-6"
transform="matrix(2.7210883,-0.31550515,0.31550515,2.7210883,-249.93277,163.80122)"
inkscape:transform-center-x="-1.7534042"
inkscape:transform-center-y="7.747707"
style="fill:#000000;fill-opacity:1;stroke-width:0.890368;stroke-dasharray:none">
<ellipse
ry="11.964526"
rx="12.399649"
transform="matrix(0.99721659,-0.07455915,0.0777593,0.99697216,0,0)"
style="opacity:0.203;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.89037;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1"
id="circle15601-9-4-6-28-8-06-1"
cy="76.348717"
cx="173.35909" />
<ellipse
ry="11.964526"
rx="12.399649"
transform="matrix(0.99721659,-0.07455915,0.0777593,0.99697216,0,0)"
style="fill:#ffffff;fill-opacity:1;stroke:#bbbcbe;stroke-width:0.89037;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1"
id="circle15601-9-4-9-4-32-5"
cy="73.518608"
cx="172.10857" />
</g>
<g
id="g16126-2"
transform="matrix(1.3429807,-0.15571613,0.15571613,1.3429807,32.435996,270.30315)"
inkscape:transform-center-x="-0.86538355"
inkscape:transform-center-y="3.8238437">
<ellipse
ry="11.964526"
rx="12.399649"
transform="matrix(0.99721659,-0.07455915,0.0777593,0.99697216,0,0)"
style="fill:#e6e7e8;stroke:#bbbcbe;stroke-width:2.21405;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1"
id="circle15601-9-4-9"
cy="35.279018"
cx="171.4617" />
</g>
<g
id="g16126-2-7"
transform="matrix(1.3429807,-0.15571613,0.15571613,1.3429807,-17.352618,119.10263)"
inkscape:transform-center-x="-0.86537927"
inkscape:transform-center-y="3.8238434"
style="fill:#000000;fill-opacity:1">
<g
id="g21847"
transform="translate(14.664614,100.86343)">
<ellipse
ry="11.964526"
rx="12.399649"
transform="matrix(0.99721659,-0.07455915,0.0777593,0.99697216,0,0)"
style="fill:#ffffff;fill-opacity:1;stroke:#bbbcbe;stroke-width:2.21405;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1"
id="circle15601-9-4-9-4"
cy="45.03503"
cx="154.82559" />
<path
fill="#808285"
d="m 160.16385,39.610842 -3.45322,-0.295187 0.56732,-6.636634 c 0.0692,-0.809346 0.13375,-1.564735 0.24301,-2.207605 -0.2389,0.251334 -0.53175,0.498054 -0.87854,0.740162 l -1.50433,1.067121 -1.59608,-2.310462 4.61631,-3.13818 3.07552,0.262902 z"
id="path12009"
style="stroke-width:0.541531" />
</g>
</g>
</g>
<g
id="g22140"
transform="matrix(0.64741592,0,0,0.64741592,-104.21322,-22.919335)">
<ellipse
ry="32.774647"
rx="33.966583"
transform="matrix(0.98199269,-0.1889189,0.1920696,0.98138131,0,0)"
style="opacity:0.203;fill:#000000;fill-opacity:1;stroke:none;stroke-width:2.43901;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1"
id="circle15601-9-4-6-28-8-06-1-7"
cy="325.43878"
cx="313.86319" />
<ellipse
ry="32.774647"
rx="33.966583"
transform="matrix(0.98199269,-0.1889189,0.1920696,0.98138131,0,0)"
style="fill:#ffffff;fill-opacity:1;stroke:#bbbcbe;stroke-width:2.43901;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1"
id="circle15601-9-4-9-4-32-5-6"
cy="317.68619"
cx="310.43762" />
<g
id="g16126-2-5"
transform="matrix(1.3429807,-0.15571613,0.15571613,1.3429807,146.58262,251.0522)"
inkscape:transform-center-x="-0.86538355"
inkscape:transform-center-y="3.8238437">
<ellipse
ry="11.964526"
rx="12.399649"
transform="matrix(0.99721659,-0.07455915,0.0777593,0.99697216,0,0)"
style="fill:#e6e7e8;stroke:#bbbcbe;stroke-width:2.21405;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1"
id="circle15601-9-4-9-6"
cy="35.279018"
cx="171.4617" />
</g>
<g
id="g16126-2-7-5"
transform="matrix(1.3429807,-0.15571613,0.15571613,1.3429807,102.42212,200.0054)"
inkscape:transform-center-x="-0.8653801"
inkscape:transform-center-y="3.8238434"
style="fill:#000000;fill-opacity:1">
<ellipse
ry="11.964526"
rx="12.399649"
transform="matrix(0.99721659,-0.07455915,0.0777593,0.99697216,0,0)"
style="fill:#ffffff;fill-opacity:1;stroke:#bbbcbe;stroke-width:2.21405;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1"
id="circle15601-9-4-9-4-3"
cy="73.518608"
cx="172.10857" />
<path
fill="#808285"
d="m 182.04407,67.08842 -9.37018,-0.800982 0.19432,-2.273238 3.43525,-2.945649 c 0.96769,-0.86673 1.63446,-1.479933 1.94012,-1.788904 0.30566,-0.308972 0.50044,-0.627422 0.63029,-0.839722 0.12984,-0.2123 0.20898,-0.484785 0.23268,-0.76201 0.0284,-0.332668 -0.0588,-0.619372 -0.26631,-0.804664 -0.20282,-0.240738 -0.47531,-0.319881 -0.91887,-0.357797 -0.38811,-0.03318 -0.84115,0.0398 -1.24822,0.2284 -0.40708,0.188602 -0.93452,0.478615 -1.47617,0.934963 l -1.74625,-2.439122 c 0.71747,-0.553019 1.30509,-0.893738 1.77235,-1.133045 0.46726,-0.239308 0.98048,-0.362987 1.54915,-0.481926 0.56867,-0.11894 1.12785,-0.126989 1.79319,-0.07011 0.83167,0.07109 1.59368,0.303781 2.17988,0.63314 0.58619,0.329359 1.10273,0.820313 1.44344,1.407938 0.34072,0.587625 0.45492,1.211737 0.39805,1.877075 -0.0427,0.499004 -0.14076,0.993267 -0.28483,1.371903 -0.1488,0.434079 -0.40376,0.803235 -0.7189,1.223096 -0.31514,0.419861 -0.68098,0.779538 -1.1672,1.240625 -0.48147,0.405642 -1.49987,1.21219 -3.05044,2.364193 l -0.009,0.11089 4.87914,0.417079 -0.24645,2.883131 z"
id="path12021"
style="stroke-width:0.55647" />
</g>
</g>
<g
id="g22120"
transform="matrix(0.64741592,0,0,0.64741592,-29.847805,-154.48584)">
<g
id="g16126-2-7-1-6-5"
transform="matrix(2.7210883,-0.31550515,0.31550515,2.7210883,-151.68119,214.18784)"
inkscape:transform-center-x="-1.7534042"
inkscape:transform-center-y="7.747707"
style="fill:#000000;fill-opacity:1;stroke-width:0.890368;stroke-dasharray:none">
<ellipse
ry="11.964526"
rx="12.399649"
transform="matrix(0.99721659,-0.07455915,0.0777593,0.99697216,0,0)"
style="opacity:0.203;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.89037;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1"
id="circle15601-9-4-6-28-8-06-1-2"
cy="76.348717"
cx="173.35909" />
<ellipse
ry="11.964526"
rx="12.399649"
transform="matrix(0.99721659,-0.07455915,0.0777593,0.99697216,0,0)"
style="fill:#ffffff;fill-opacity:1;stroke:#bbbcbe;stroke-width:0.89037;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1"
id="circle15601-9-4-9-4-32-5-5"
cy="73.518608"
cx="172.10857" />
</g>
<g
id="g16126-2-7-4"
transform="matrix(1.3429807,-0.15571613,0.15571613,1.3429807,80.898965,169.48925)"
inkscape:transform-center-x="-0.86537927"
inkscape:transform-center-y="3.8238434"
style="fill:#000000;fill-opacity:1">
<g
id="g21847-4"
transform="translate(14.664614,100.86343)">
<ellipse
ry="11.964526"
rx="12.399649"
transform="matrix(0.99721659,-0.07455915,0.0777593,0.99697216,0,0)"
style="fill:#ffffff;fill-opacity:1;stroke:#bbbcbe;stroke-width:2.21405;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1"
id="circle15601-9-4-9-4-30"
cy="45.03503"
cx="154.82559" />
<path
fill="#808285"
d="m 160.16385,39.610842 -3.45322,-0.295187 0.56732,-6.636634 c 0.0692,-0.809346 0.13375,-1.564735 0.24301,-2.207605 -0.2389,0.251334 -0.53175,0.498054 -0.87854,0.740162 l -1.50433,1.067121 -1.59608,-2.310462 4.61631,-3.13818 3.07552,0.262902 z"
id="path12009-7"
style="stroke-width:0.541531" />
</g>
</g>
<ellipse
ry="15.883503"
rx="16.461149"
transform="matrix(-0.10421827,-0.99455445,0.99421484,-0.10740972,0,0)"
style="fill:#fce600;fill-opacity:1;stroke:#ffcc00;stroke-width:2.26678;stroke-miterlimit:10;stroke-opacity:1"
id="circle15605-9-9"
cy="331.84833"
cx="-361.1647" />
</g>
<g
id="g22129"
transform="matrix(0.64741592,0,0,0.64741592,-92.65146,-61.705109)">
<g
id="g16126-2-7-1-6-4-8"
transform="matrix(2.7210883,-0.31550515,0.31550515,2.7210883,-37.534557,194.93688)"
inkscape:transform-center-x="-1.7534042"
inkscape:transform-center-y="7.747707"
style="fill:#000000;fill-opacity:1;stroke-width:0.890368;stroke-dasharray:none">
<ellipse
ry="11.964526"
rx="12.399649"
transform="matrix(0.99721659,-0.07455915,0.0777593,0.99697216,0,0)"
style="opacity:0.203;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.89037;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1"
id="circle15601-9-4-6-28-8-06-1-7-6"
cy="76.348717"
cx="173.35909" />
<ellipse
ry="11.964526"
rx="12.399649"
transform="matrix(0.99721659,-0.07455915,0.0777593,0.99697216,0,0)"
style="fill:#ffffff;fill-opacity:1;stroke:#bbbcbe;stroke-width:0.89037;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1"
id="circle15601-9-4-9-4-32-5-6-8"
cy="73.518608"
cx="172.10857" />
</g>
<g
id="g16126-2-7-5-3"
transform="matrix(1.3429807,-0.15571613,0.15571613,1.3429807,200.6737,250.39202)"
inkscape:transform-center-x="-0.8653801"
inkscape:transform-center-y="3.8238434"
style="fill:#000000;fill-opacity:1">
<ellipse
ry="11.964526"
rx="12.399649"
transform="matrix(0.99721659,-0.07455915,0.0777593,0.99697216,0,0)"
style="fill:#ffffff;fill-opacity:1;stroke:#bbbcbe;stroke-width:2.21405;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1"
id="circle15601-9-4-9-4-3-1"
cy="73.518608"
cx="172.10857" />
<path
fill="#808285"
d="m 182.04407,67.08842 -9.37018,-0.800982 0.19432,-2.273238 3.43525,-2.945649 c 0.96769,-0.86673 1.63446,-1.479933 1.94012,-1.788904 0.30566,-0.308972 0.50044,-0.627422 0.63029,-0.839722 0.12984,-0.2123 0.20898,-0.484785 0.23268,-0.76201 0.0284,-0.332668 -0.0588,-0.619372 -0.26631,-0.804664 -0.20282,-0.240738 -0.47531,-0.319881 -0.91887,-0.357797 -0.38811,-0.03318 -0.84115,0.0398 -1.24822,0.2284 -0.40708,0.188602 -0.93452,0.478615 -1.47617,0.934963 l -1.74625,-2.439122 c 0.71747,-0.553019 1.30509,-0.893738 1.77235,-1.133045 0.46726,-0.239308 0.98048,-0.362987 1.54915,-0.481926 0.56867,-0.11894 1.12785,-0.126989 1.79319,-0.07011 0.83167,0.07109 1.59368,0.303781 2.17988,0.63314 0.58619,0.329359 1.10273,0.820313 1.44344,1.407938 0.34072,0.587625 0.45492,1.211737 0.39805,1.877075 -0.0427,0.499004 -0.14076,0.993267 -0.28483,1.371903 -0.1488,0.434079 -0.40376,0.803235 -0.7189,1.223096 -0.31514,0.419861 -0.68098,0.779538 -1.1672,1.240625 -0.48147,0.405642 -1.49987,1.21219 -3.05044,2.364193 l -0.009,0.11089 4.87914,0.417079 -0.24645,2.883131 z"
id="path12021-4"
style="stroke-width:0.55647" />
</g>
<ellipse
ry="15.883503"
rx="16.461149"
transform="matrix(-0.10421827,-0.99455445,0.99421484,-0.10740972,0,0)"
style="fill:#fce600;fill-opacity:1;stroke:#ffcc00;stroke-width:2.26678;stroke-miterlimit:10;stroke-opacity:1"
id="circle15605-9-9-2"
cy="447.02319"
cx="-353.06204" />
</g>
<g
id="g42748-6"
transform="matrix(1.3397762,-0.10017139,0.10080481,1.2924446,-325.03638,-197.30771)" />
@ -556,4 +235,337 @@
id="path1480-1-3-7-9-1"
d="M 130.14688,279.92717 C 185.21577,267.47379 255.4831,267.3406 299.21457,275.67914" />
</g>
<g
id="g42748-62"
transform="matrix(2.0948447,-0.22031824,0.21907326,2.0206408,-509.89097,158.00365)" />
<g
id="g42748-8-9"
transform="matrix(2.0948447,-0.22031824,0.21907326,2.0206408,-14.607647,112.27768)" />
<g
id="g42748-3-1"
transform="matrix(2.0948447,-0.22031824,0.21907326,2.0206408,-620.74279,-49.846221)" />
<g
id="g42748-8-7-2"
transform="matrix(2.0948447,-0.22031824,0.21907326,2.0206408,-125.45949,-95.572186)" />
<ellipse
style="fill:#e6e7e8;stroke:#bbbcbe;stroke-width:0;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1"
id="circle15601-9-4-4-6-1-3"
cy="114.69264"
cx="166.13007"
transform="matrix(0.99480921,-0.10175774,0.11080699,0.99384194,0,0)"
rx="93.142242"
ry="88.906906" />
<g
style="display:inline;fill:none;stroke:#008000;stroke-width:6.389;stroke-miterlimit:10;stroke-opacity:1"
id="g1482-7-0-1-0-3-0-1-6"
transform="matrix(0.06447798,0.25409881,-0.30860687,0.03180129,274.46659,19.159294)"
inkscape:transform-center-x="-41.477488"
inkscape:transform-center-y="-12.383368">
<path
style="fill:none;stroke:#008000;stroke-width:35.526;stroke-opacity:1"
inkscape:connector-curvature="0"
id="path1478-7-9-0-19-0-2-9-5"
transform="matrix(0.4768,-0.02932,0.03214,0.42867,147.58,197.367)"
d="m 315.1,101.79 c 10.682,-4.135 21.77,-7.738 33.127,-11.074 -8.518,-8.139 -17.577,-16.01 -27.178,-23.616 -2.04,12.119 -3.103,21.663 -5.949,34.69 z" />
<path
style="fill:none;stroke:#008000;stroke-width:10.649;stroke-opacity:1;paint-order:markers fill stroke"
inkscape:connector-curvature="0"
id="path1480-1-3-1-5-7-3-4-63"
d="M 127.38575,78.377847 C 176.95734,66.301724 277.68509,72.076365 317.498,86.173"
sodipodi:nodetypes="cc"
transform="matrix(0.89574,0,0,0.81736,18.384,154.236)" />
</g>
<g
style="display:inline;fill:none;stroke:#008000;stroke-width:6.389;stroke-miterlimit:10;stroke-opacity:1"
id="g1482-7-0-1-0-3-0-1-9-9"
transform="matrix(0.08914635,0.24652899,-0.30398547,0.0619867,181.4169,22.847654)"
inkscape:transform-center-x="46.128309"
inkscape:transform-center-y="-1.8290426">
<path
style="fill:none;stroke:#008000;stroke-width:35.526;stroke-opacity:1"
inkscape:connector-curvature="0"
id="path1478-7-9-0-19-0-2-9-2-4"
transform="matrix(0.4768,-0.02932,0.03214,0.42867,147.58,197.367)"
d="m 315.1,101.79 c 10.682,-4.135 21.77,-7.738 33.127,-11.074 -8.518,-8.139 -17.577,-16.01 -27.178,-23.616 -2.04,12.119 -3.103,21.663 -5.949,34.69 z" />
<path
style="fill:none;stroke:#008000;stroke-width:10.649;stroke-opacity:1;paint-order:markers fill stroke"
inkscape:connector-curvature="0"
id="path1480-1-3-1-5-7-3-4-6-8"
d="M 127.38575,78.377847 C 176.95734,66.301724 277.68509,72.076365 317.498,86.173"
sodipodi:nodetypes="cc"
transform="matrix(0.89574,0,0,0.81736,18.384,154.236)" />
</g>
<g
id="g22129-5"
transform="matrix(0.71424605,0,0,0.71424605,-108.12681,-81.556365)">
<g
id="g16126-2-7-1-6-4-8-9"
transform="matrix(2.7210883,-0.31550515,0.31550515,2.7210883,-37.534557,194.93688)"
inkscape:transform-center-x="-1.7534042"
inkscape:transform-center-y="7.747707"
style="fill:#000000;fill-opacity:1;stroke-width:0.890368;stroke-dasharray:none">
<ellipse
ry="11.964526"
rx="12.399649"
transform="matrix(0.99721659,-0.07455915,0.0777593,0.99697216,0,0)"
style="opacity:0.203;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.89037;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1"
id="circle15601-9-4-6-28-8-06-1-7-6-6"
cy="76.348717"
cx="173.35909" />
<ellipse
ry="11.964526"
rx="12.399649"
transform="matrix(0.99721659,-0.07455915,0.0777593,0.99697216,0,0)"
style="fill:#ffffff;fill-opacity:1;stroke:#bbbcbe;stroke-width:0.89037;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1"
id="circle15601-9-4-9-4-32-5-6-8-2"
cy="73.518608"
cx="172.10857" />
</g>
<g
id="g16126-2-7-4-7"
transform="matrix(1.3429807,-0.15571613,0.15571613,1.3429807,195.70974,150.87981)"
inkscape:transform-center-x="-0.86537927"
inkscape:transform-center-y="3.8238434"
style="fill:#000000;fill-opacity:1">
<g
id="g21847-4-6"
transform="translate(14.664614,100.86343)">
<ellipse
ry="11.964526"
rx="12.399649"
transform="matrix(0.99721659,-0.07455915,0.0777593,0.99697216,0,0)"
style="fill:#ffffff;fill-opacity:1;stroke:#bbbcbe;stroke-width:2.21405;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1"
id="circle15601-9-4-9-4-30-3"
cy="45.03503"
cx="154.82559" />
<path
fill="#808285"
d="m 160.16385,39.610842 -3.45322,-0.295187 0.56732,-6.636634 c 0.0692,-0.809346 0.13375,-1.564735 0.24301,-2.207605 -0.2389,0.251334 -0.53175,0.498054 -0.87854,0.740162 l -1.50433,1.067121 -1.59608,-2.310462 4.61631,-3.13818 3.07552,0.262902 z"
id="path12009-7-1"
style="stroke-width:0.541531" />
</g>
</g>
<ellipse
ry="15.883503"
rx="16.461149"
transform="matrix(-0.10421827,-0.99455445,0.99421484,-0.10740972,0,0)"
style="fill:#fce600;fill-opacity:1;stroke:#ffcc00;stroke-width:2.26678;stroke-miterlimit:10;stroke-opacity:1"
id="circle15605-9-9-2-5"
cy="447.02319"
cx="-353.06204" />
</g>
<g
id="g22120-4"
transform="matrix(0.71424605,0,0,0.71424605,-37.352388,-182.42671)">
<g
id="g16126-2-7-1-6-5-4"
transform="matrix(2.7210883,-0.31550515,0.31550515,2.7210883,-151.68119,214.18784)"
inkscape:transform-center-x="-1.7534042"
inkscape:transform-center-y="7.747707"
style="fill:#000000;fill-opacity:1;stroke-width:0.890368;stroke-dasharray:none">
<ellipse
ry="11.964526"
rx="12.399649"
transform="matrix(0.99721659,-0.07455915,0.0777593,0.99697216,0,0)"
style="opacity:0.203;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.89037;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1"
id="circle15601-9-4-6-28-8-06-1-2-4"
cy="76.348717"
cx="173.35909" />
<ellipse
ry="11.964526"
rx="12.399649"
transform="matrix(0.99721659,-0.07455915,0.0777593,0.99697216,0,0)"
style="fill:#ffffff;fill-opacity:1;stroke:#bbbcbe;stroke-width:0.89037;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1"
id="circle15601-9-4-9-4-32-5-5-4"
cy="73.518608"
cx="172.10857" />
</g>
<g
id="g16126-2-7-5-0-8"
transform="matrix(1.3429807,-0.15571612,0.15571612,1.3429807,86.90606,270.21479)"
inkscape:transform-center-x="-0.8653801"
inkscape:transform-center-y="3.8238434"
style="fill:#000000;fill-opacity:1;stroke-width:0.890368;stroke-dasharray:none">
<ellipse
ry="11.964526"
rx="12.399649"
transform="matrix(0.99721659,-0.07455915,0.0777593,0.99697216,0,0)"
style="fill:#ffffff;fill-opacity:1;stroke:#bbbcbe;stroke-width:2.21405;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1"
id="circle15601-9-4-9-4-3-3-1"
cy="73.518608"
cx="172.10857" />
<path
fill="#808285"
d="m 181.85943,61.164775 c -0.24926,2.149772 -0.79868,3.680219 -1.65435,4.643774 -0.84958,0.911121 -2.01147,1.307785 -3.47961,1.137558 -1.46814,-0.170228 -2.50845,-0.822234 -3.12092,-1.956017 -0.61248,-1.133783 -0.79712,-2.749343 -0.56002,-4.794247 0.24926,-2.149772 0.80476,-3.732653 1.65434,-4.643774 0.84958,-0.911122 2.01148,-1.307785 3.47962,-1.137558 1.46813,0.170228 2.50844,0.822234 3.12091,1.956016 0.61857,1.08135 0.80321,2.69691 0.56003,4.794248 z m -5.55795,-0.644433 c -0.15807,1.363269 -0.16871,2.371665 -0.0661,2.861804 0.0965,0.542573 0.3807,0.841218 0.80017,0.889855 0.41947,0.04863 0.71203,-0.183134 0.98256,-0.68315 0.2181,-0.506096 0.4324,-1.437739 0.59047,-2.801009 0.15806,-1.363269 0.16263,-2.319231 0.0661,-2.861803 -0.0965,-0.542575 -0.37462,-0.893652 -0.79409,-0.942289 -0.41947,-0.04863 -0.71203,0.183134 -0.98256,0.68315 -0.2181,0.506096 -0.43848,1.490172 -0.59655,2.853442 z"
id="path38364-2"
style="stroke-width:0.527847" />
</g>
<ellipse
ry="15.883503"
rx="16.461149"
transform="matrix(-0.10421827,-0.99455445,0.99421484,-0.10740972,0,0)"
style="fill:#fce600;fill-opacity:1;stroke:#ffcc00;stroke-width:2.26678;stroke-miterlimit:10;stroke-opacity:1"
id="circle15605-9-9-7"
cy="331.84833"
cx="-361.1647" />
</g>
<g
style="display:inline;fill:#dddddd;stroke:#aa0000;stroke-width:6.389;stroke-miterlimit:10"
id="g1482-7-0-1-0-3-0-12"
transform="matrix(0.25251158,-0.07043806,0.03905274,0.30777329,94.718589,4.2472384)"
inkscape:transform-center-x="16.465121"
inkscape:transform-center-y="-43.515855">
<path
style="fill:none;stroke:#aa0000;stroke-width:10.649;paint-order:markers fill stroke"
inkscape:connector-curvature="0"
id="path1480-1-3-1-5-7-3-9"
d="M 127.38575,78.377847 C 176.95734,66.301724 277.68509,72.076365 317.498,86.173"
sodipodi:nodetypes="cc"
transform="matrix(0.89574,0,0,0.81736,18.384,154.236)" />
<path
style="stroke:#aa0000;stroke-width:35.526"
inkscape:connector-curvature="0"
id="path1478-7-9-0-19-0-2-93"
transform="matrix(0.4768,-0.02932,0.03214,0.42867,147.58,197.367)"
d="m 315.1,101.79 c 10.682,-4.135 21.77,-7.738 33.127,-11.074 -8.518,-8.139 -17.577,-16.01 -27.178,-23.616 -2.04,12.119 -3.103,21.663 -5.949,34.69 z" />
</g>
<g
id="g22110-5"
transform="matrix(0.71424605,0,0,0.71424605,-59.053433,-141.65709)">
<g
id="g16126-2-7-1-6-0"
transform="matrix(2.7210883,-0.31550515,0.31550515,2.7210883,-244.98632,172.91485)"
inkscape:transform-center-x="-1.7534042"
inkscape:transform-center-y="7.747707"
style="fill:#000000;fill-opacity:1;stroke-width:0.890368;stroke-dasharray:none">
<ellipse
ry="11.964526"
rx="12.399649"
transform="matrix(0.99721659,-0.07455915,0.0777593,0.99697216,0,0)"
style="opacity:0.203;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.89037;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1"
id="circle15601-9-4-6-28-8-06-1-9"
cy="76.348717"
cx="173.35909" />
<ellipse
ry="11.964526"
rx="12.399649"
transform="matrix(0.99721659,-0.07455915,0.0777593,0.99697216,0,0)"
style="fill:#ffffff;fill-opacity:1;stroke:#bbbcbe;stroke-width:0.89037;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1"
id="circle15601-9-4-9-4-32-5-63"
cy="73.518608"
cx="172.10857" />
<g
id="g16126-2-7-5-0"
transform="matrix(0.49354543,0,0,0.49354543,83.859552,30.156513)"
inkscape:transform-center-x="-0.8653801"
inkscape:transform-center-y="3.8238434"
style="fill:#000000;fill-opacity:1">
<ellipse
ry="11.964526"
rx="12.399649"
transform="matrix(0.99721659,-0.07455915,0.0777593,0.99697216,0,0)"
style="fill:#ffffff;fill-opacity:1;stroke:#bbbcbe;stroke-width:2.21405;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1"
id="circle15601-9-4-9-4-3-3"
cy="73.518608"
cx="172.10857" />
<path
fill="#808285"
d="m 181.85943,61.164775 c -0.24926,2.149772 -0.79868,3.680219 -1.65435,4.643774 -0.84958,0.911121 -2.01147,1.307785 -3.47961,1.137558 -1.46814,-0.170228 -2.50845,-0.822234 -3.12092,-1.956017 -0.61248,-1.133783 -0.79712,-2.749343 -0.56002,-4.794247 0.24926,-2.149772 0.80476,-3.732653 1.65434,-4.643774 0.84958,-0.911122 2.01148,-1.307785 3.47962,-1.137558 1.46813,0.170228 2.50844,0.822234 3.12091,1.956016 0.61857,1.08135 0.80321,2.69691 0.56003,4.794248 z m -5.55795,-0.644433 c -0.15807,1.363269 -0.16871,2.371665 -0.0661,2.861804 0.0965,0.542573 0.3807,0.841218 0.80017,0.889855 0.41947,0.04863 0.71203,-0.183134 0.98256,-0.68315 0.2181,-0.506096 0.4324,-1.437739 0.59047,-2.801009 0.15806,-1.363269 0.16263,-2.319231 0.0661,-2.861803 -0.0965,-0.542575 -0.37462,-0.893652 -0.79409,-0.942289 -0.41947,-0.04863 -0.71203,0.183134 -0.98256,0.68315 -0.2181,0.506096 -0.43848,1.490172 -0.59655,2.853442 z"
id="path38364"
style="stroke-width:0.527847" />
</g>
</g>
<g
id="g16126-2-8"
transform="matrix(1.3429807,-0.15571613,0.15571613,1.3429807,37.123071,278.37585)"
inkscape:transform-center-x="-0.86538355"
inkscape:transform-center-y="3.8238437">
<ellipse
ry="11.964526"
rx="12.399649"
transform="matrix(0.99721659,-0.07455915,0.0777593,0.99697216,0,0)"
style="fill:#e6e7e8;stroke:#bbbcbe;stroke-width:2.21405;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1"
id="circle15601-9-4-9-5"
cy="35.279018"
cx="171.4617" />
</g>
</g>
<g
style="display:inline;fill:#dddddd;stroke:#aa0000;stroke-width:6.389;stroke-miterlimit:10"
id="g1482-7-0-1-0-3-0-0-0"
transform="matrix(0.24651155,-0.08919456,0.06204616,0.30397335,101.55382,98.052539)"
inkscape:transform-center-x="5.8684643"
inkscape:transform-center-y="45.380551">
<path
style="stroke:#aa0000;stroke-width:35.526"
inkscape:connector-curvature="0"
id="path1478-7-9-0-19-0-2-6-8"
transform="matrix(0.4768,-0.02932,0.03214,0.42867,147.58,197.367)"
d="m 315.1,101.79 c 10.682,-4.135 21.77,-7.738 33.127,-11.074 -8.518,-8.139 -17.577,-16.01 -27.178,-23.616 -2.04,12.119 -3.103,21.663 -5.949,34.69 z" />
<path
style="fill:none;stroke:#aa0000;stroke-width:10.649;paint-order:markers fill stroke"
inkscape:connector-curvature="0"
id="path1480-1-3-1-5-7-3-8-8"
d="M 127.38575,78.377847 C 176.95734,66.301724 277.68509,72.076365 317.498,86.173"
sodipodi:nodetypes="cc"
transform="matrix(0.89574,0,0,0.81736,18.384,154.236)" />
</g>
<g
id="g22140-9"
transform="matrix(0.71424605,0,0,0.71424605,-119.39426,-37.279107)">
<ellipse
ry="32.774647"
rx="33.966583"
transform="matrix(0.98199269,-0.1889189,0.1920696,0.98138131,0,0)"
style="opacity:0.203;fill:#000000;fill-opacity:1;stroke:none;stroke-width:2.43901;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1"
id="circle15601-9-4-6-28-8-06-1-7-8"
cy="325.43878"
cx="313.86319" />
<ellipse
ry="32.774647"
rx="33.966583"
transform="matrix(0.98199269,-0.1889189,0.1920696,0.98138131,0,0)"
style="fill:#ffffff;fill-opacity:1;stroke:#bbbcbe;stroke-width:2.43901;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1"
id="circle15601-9-4-9-4-32-5-6-4"
cy="317.68619"
cx="310.43762" />
<g
id="g16126-2-5-8"
transform="matrix(1.3429807,-0.15571613,0.15571613,1.3429807,146.58262,251.0522)"
inkscape:transform-center-x="-0.86538355"
inkscape:transform-center-y="3.8238437">
<ellipse
ry="11.964526"
rx="12.399649"
transform="matrix(0.99721659,-0.07455915,0.0777593,0.99697216,0,0)"
style="fill:#e6e7e8;stroke:#bbbcbe;stroke-width:2.21405;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1"
id="circle15601-9-4-9-6-1"
cy="35.279018"
cx="171.4617" />
</g>
<g
id="g16126-2-7-6"
transform="matrix(1.3429807,-0.15571613,0.15571613,1.3429807,96.602137,99.513079)"
inkscape:transform-center-x="-0.86537927"
inkscape:transform-center-y="3.8238434"
style="fill:#000000;fill-opacity:1">
<g
id="g21847-1"
transform="translate(14.664614,100.86343)">
<ellipse
ry="11.964526"
rx="12.399649"
transform="matrix(0.99721659,-0.07455915,0.0777593,0.99697216,0,0)"
style="fill:#ffffff;fill-opacity:1;stroke:#bbbcbe;stroke-width:2.21405;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1"
id="circle15601-9-4-9-4-1"
cy="45.03503"
cx="154.82559" />
<path
fill="#808285"
d="m 160.16385,39.610842 -3.45322,-0.295187 0.56732,-6.636634 c 0.0692,-0.809346 0.13375,-1.564735 0.24301,-2.207605 -0.2389,0.251334 -0.53175,0.498054 -0.87854,0.740162 l -1.50433,1.067121 -1.59608,-2.310462 4.61631,-3.13818 3.07552,0.262902 z"
id="path12009-5"
style="stroke-width:0.541531" />
</g>
</g>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 27 KiB

After

Width:  |  Height:  |  Size: 27 KiB

View File

@ -39,15 +39,16 @@
id="namedview15615"
showgrid="false"
inkscape:zoom="3.7010686"
inkscape:cx="308.55953"
inkscape:cy="100.24132"
inkscape:cx="257.4932"
inkscape:cy="122.93747"
inkscape:window-x="0"
inkscape:window-y="0"
inkscape:window-maximized="1"
inkscape:current-layer="svg15613"
inkscape:showpageshadow="2"
inkscape:pagecheckerboard="0"
inkscape:deskcolor="#d1d1d1" />
inkscape:deskcolor="#d1d1d1"
inkscape:lockguides="true" />
<g
id="g42748"
transform="matrix(1.8064408,-0.18998633,0.18891275,1.7424528,-318.95142,153.14016)" />
@ -133,8 +134,8 @@
<ellipse
style="fill:#e6e7e8;stroke:#bbbcbe;stroke-width:0;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1"
id="circle15601-9-4-4-6-1"
cy="109.81017"
cx="159.48772"
cy="109.13467"
cx="153.3223"
transform="matrix(0.99404451,-0.10897482,0.10347127,0.99463244,0,0)"
rx="84.861298"
ry="86.678589" />
@ -160,7 +161,7 @@
</g>
<g
id="g16126-2-7"
transform="matrix(1.3429807,-0.15571613,0.15571613,1.3429807,-110.74407,31.108483)"
transform="matrix(1.3429807,-0.15571613,0.15571613,1.3429807,-41.607577,35.875899)"
inkscape:transform-center-x="-0.86537927"
inkscape:transform-center-y="3.8238434"
style="fill:#000000;fill-opacity:1">
@ -188,7 +189,7 @@
</g>
<g
id="g16126-2-7-5"
transform="matrix(1.3429807,-0.15571613,0.15571613,1.3429807,-41.876468,37.498401)"
transform="matrix(1.3429807,-0.15571613,0.15571613,1.3429807,-122.93414,35.829754)"
inkscape:transform-center-x="-0.8653801"
inkscape:transform-center-y="3.8238434"
style="fill:#000000;fill-opacity:1">
@ -210,8 +211,20 @@
cx="172.10857" />
<path
fill="#808285"
d="m 182.04407,67.08842 -9.37018,-0.800982 0.19432,-2.273238 3.43525,-2.945649 c 0.96769,-0.86673 1.63446,-1.479933 1.94012,-1.788904 0.30566,-0.308972 0.50044,-0.627422 0.63029,-0.839722 0.12984,-0.2123 0.20898,-0.484785 0.23268,-0.76201 0.0284,-0.332668 -0.0588,-0.619372 -0.26631,-0.804664 -0.20282,-0.240738 -0.47531,-0.319881 -0.91887,-0.357797 -0.38811,-0.03318 -0.84115,0.0398 -1.24822,0.2284 -0.40708,0.188602 -0.93452,0.478615 -1.47617,0.934963 l -1.74625,-2.439122 c 0.71747,-0.553019 1.30509,-0.893738 1.77235,-1.133045 0.46726,-0.239308 0.98048,-0.362987 1.54915,-0.481926 0.56867,-0.11894 1.12785,-0.126989 1.79319,-0.07011 0.83167,0.07109 1.59368,0.303781 2.17988,0.63314 0.58619,0.329359 1.10273,0.820313 1.44344,1.407938 0.34072,0.587625 0.45492,1.211737 0.39805,1.877075 -0.0427,0.499004 -0.14076,0.993267 -0.28483,1.371903 -0.1488,0.434079 -0.40376,0.803235 -0.7189,1.223096 -0.31514,0.419861 -0.68098,0.779538 -1.1672,1.240625 -0.48147,0.405642 -1.49987,1.21219 -3.05044,2.364193 l -0.009,0.11089 4.87914,0.417079 -0.24645,2.883131 z"
id="path12021"
style="stroke-width:0.55647" />
d="m 182.58162,60.948283 c -0.28628,2.469036 -0.91729,4.226771 -1.90004,5.333424 -0.97576,1.046431 -2.3102,1.502005 -3.99638,1.306497 -1.68616,-0.195508 -2.88098,-0.944344 -3.5844,-2.246506 -0.70344,-1.302161 -0.91551,-3.15765 -0.6432,-5.506244 0.28628,-2.469036 0.92428,-4.286991 1.90004,-5.333423 0.97574,-1.046434 2.3102,-1.502004 3.99638,-1.306498 1.68616,0.19551 2.88097,0.944344 3.5844,2.246506 0.71043,1.241941 0.92249,3.097429 0.6432,5.506244 z m -6.38337,-0.740138 c -0.18155,1.565729 -0.19376,2.723883 -0.0759,3.286812 0.11091,0.623151 0.43725,0.966148 0.91901,1.022009 0.48176,0.05585 0.81778,-0.210332 1.12849,-0.784605 0.25048,-0.581257 0.4966,-1.651259 0.67815,-3.21699 0.18154,-1.565728 0.18679,-2.66366 0.0759,-3.28681 -0.11091,-0.623154 -0.43026,-1.026369 -0.91203,-1.082229 -0.48177,-0.05585 -0.81778,0.210331 -1.12847,0.784605 -0.2505,0.581257 -0.5036,1.711478 -0.68515,3.277208 z"
id="path38364"
style="fill:#666666;fill-opacity:1;stroke-width:0.606238;stroke-dasharray:none" />
</g>
<g
id="g42748-7"
transform="matrix(2.0948447,-0.22031824,0.21907326,2.0206408,-417.78813,349.73881)" />
<g
id="g42748-8-0"
transform="matrix(2.0948447,-0.22031824,0.21907326,2.0206408,77.495182,304.01284)" />
<g
id="g42748-3-9"
transform="matrix(2.0948447,-0.22031824,0.21907326,2.0206408,-528.63995,141.88895)" />
<g
id="g42748-8-7-3"
transform="matrix(2.0948447,-0.22031824,0.21907326,2.0206408,-33.35666,96.162979)" />
</svg>

Before

Width:  |  Height:  |  Size: 9.8 KiB

After

Width:  |  Height:  |  Size: 10 KiB

View File

@ -10,7 +10,168 @@ Then in the chapter on *natural transformations* we saw categories that are equi
And now we will relax the condition even more and will review a relationship that is not exactly an equality, , but it is not non-equality either. It is not two-way, but at the same time it is not exactly one-way as well. A relationship called *adjunction*.
As you can see, I am not very good at explaining, so I got some examples alligned. But before we proceed with them, we will go through some of the basic terminology.
As you can see, I am not very good at explaining, so I got some examples alligned. But before we proceed with them, we will go through something else.
The category of small categories
===
Ha, I got you this time (or at least I hope I did) - you probably thought that I won't introduce another category in this chapter. But this is exactly what I am going to do. And (surprise again) the new category won't be the category of functors (don't worry, we will introduce that in the next chapter.) Instead, we will examine the category of (small) categories, that has all the categories that we saw so far as objects and functors as its morphisms, like $Set$ - the category of sets, $Mon,$ the category of monoids, $Ord,$ the category of orders etc.
![The category of categories](category_of_categories.svg)
**Task:** Go through the functor definition and see how you can make functors compose.
**Question:** What are the initial and terminal object of the category of small categories.
Categories all the way down
---
The recursive nature of category theory might leave some of you confused: we started by saying that categories are *composed of objects and morphisms*, but now we are saying that there are *morphisms between categories* (functors). And on top of that, there is a category where *the objects are categories themselves*. Does that mean that categories are an example of... categories? Sounds a bit weird on intuitive level (as for example biscuits don't contain other biscuits and houses don't use houses as building material) but it is actually the case.
Category theory does *categorize* everything, so from a category-theoretic standpoint all of maths is categories all the way down and whether you would threat a given category as a universe, or as a point depends solemnly on your viewpoint.
Like, for example, every monoid is a category with one just object, but at the same time, monoids can be seen as belonging to one category - the category of monoids - with monoid homomorphisms acting as objects.
At the same time we have the category of groups, for example, which contains the category of monoids as a subcategory, as all monoids are groups.
There may be many more levels of categories from categories. However that does not mean that we have to cover all of them and think about them at all - it is like the concept of a derivative in calculus - the first derivative of a position of the object gives its *speed*, which is useful, the derivative of speed is also useful - it is *velocity*, but the derivative of velocity and those after it leave us indifferent. We can use the same tactic with our little journey in category theory - stick on the level that make sense for us and not be obsessed with forming picture of the whole thing, because there is no *whole thing* - category theory is an *abstract* theory. That is, it does not seek to represent an actual state of affairs, but to provide a language that you can use to express many different ideas, actual or purely imaginary. So view the category of categories not as a structure, but as a space, where all these concepts live.
{% if site.distribution == 'print' %}
Free and forgetful functors
===
A lot of categories that are in $Cat$ are based on each other i.e. ones where one category is the same as the other plus some additional law - groups are monoids with added inversion, partial orders are antisymmetric preorders. And virtually all categories can be viewed as are sets with added morphisms. Between any two such categories there are two functors called the *forgetful* functor that goes from the richer category to the more plain one and the *free* functor, which goes the other way around.
![Free and forgetful functors](free_forgetful_functors.svg)
Forgetful functors
===
Forgetful functors map the objects from the more richer and featureful category to their corresponding objects in the simpler and more unstructured one.
![Forgetful functors](forgetful_functors.svg)
They strip (forget) all the structure of the more complex category which is not present in the simpler one. i.e.
Object mapping
---
The object mapping of the forgetful functor consists of picking the object in the simpler category that corresponds to the one from the richer one. It works by just removing the extra structure or properties of each object in the richer category which is not present in the simpler one.
Let's take the forgetful functor between the category of sets $Set$ and the category of monoids ($Mon$) as an example. A monoid is a set, combined with *a monoid operation*. The monoid operation is the extra structure. And if you do away with it, what is left from a monoid is its underlying set. This observation defines the object mapping of a forgetful functor that goes from the category of monoids to the category of sets - each monoid is mapped to it's underlying set.
![Forgetful functor - object mapping](forgetful_functor_objects.svg)
This same type of functor exists for any two categories that are based on each other. And two categories are based on each other only if such a functor exists.
Morphism mapping
---
In order for the forgetful functor to really be a functor it also must map morphisms between the two categories i.e. to map every *monoid homomorphism* between two monoids to a function between their underlying sets.
This is not hard - we said that monoid homomorphisms are function between the monoids' underlying sets which preserves the group operation. Which means that they are *functions between the monoids' underlying sets*. So all we need to do is to forget about the extra conditions.
Functor laws
---
Since we basically copied the structure of one category into the other one, the functor laws are obviously followed.
Free functors
===
Now let's review the functor that has certain relation to the forgetful functor, but goes the other way around - from richer to simpler categories.
![Free functors](free_functors.svg)
Saying "going the other way around" is actually not entirely accurate, as we cannot literary reverse the mapping from the forgetful functor. This is so, simply due to the fact that given one simple structure (such as a set) there can be more than one richer structures that correspond to it (e.g. the set of natural numbers is the underlying set of both the monoid of natural numbers under addition and the monoid of natural numbers under mutliplication.)
But, although we cannot create a functor that is the reverse of the forgetful functor, there is one functor that still has some interesting connection to it - this functor is called the *free functor* for a given category. It works by connecting each object from the simpler category to the *free object* corresponding to it. In our case the case of monoids it is the free monoid generated by a given set.
Object mapping
---
The object mapping of the free functor is the procedure for generating *free objects*. For any given object $o$ from the simpler category the free object of $o$, $F(o)$ is an object of the more complex category that adds the minimum structure needed for the $o$ to become an object of the more complex category.
This concept is complex, so let's take the free monoids as an example. When we reviewed them (in chapter 3) we said that the free monoid of a given set of is just the monoid that "does nothing" i.e. the one that has no laws.
What does that mean? We said that each monoid can be represented by a set of basic elements, called generators, (such as the 60 degree rotation of a right triangle)
![Generator of the monoid of rotations](generator_rotations.svg)
And a bunch of rules or equations describing how sequences of these generators collapse to a single element (e.g. the fact that rotating the triangle three times gets you to its initial position.)
![Rule of the monoid of rotations](rule_rotations.svg)
Here the rules for a given set of generators can be arbitrary, so the free monoid is the monoid that has no such rules. As a result, the free monoid of a given set is the monoid of all possible (endless) sequences of elements of a that set (which is taken as the monoid's set of generators.
If you think about this definition we would realize that the free monoid is actually just the *list datatype* that we are familiar from programming. And the free functor converting sets to monoids is actually the list functor that we saw in one of the previous sections.
![Free functors](free_functor_objects.svg)
Formally the free monoid over a set $A$ is just the type $[A]$ and the free functor is the function $a \to [a]$ for all $a:A$.
Morphism mapping
---
Once we established that the free functor for set $A$ is just the list functor we already know how the the morphism mapping that converts function between sets to functions between lists of sets, and the way to construct this mapping is to apply the function to every element of that list.
Adjoint functors
===
If the concept of a free object and the corresponding free functor seemed somewhat arbitrary to you, don't worry, it will seem clearer once we pinpoint the relationship it has with the (arguably more straightforward) concept of forgetful functor.
The relationship is a little bit complex - explaining it involves three steps.
Step one: Given a free object, in our case a free monoid from a given set of generators, there exists a monoid homomorphism from it, to any other monoid that is composed of the same set of generators. The homomorphism consists of just applying the monoid laws and, by doing that, converting each elements of the free monoid to an element of the other one.
So for example, by applying the color-mixing rule we can convert any element of the free monoid generated by the set of the red blue and yellow balls to an element of the color-mixing monoid.
![Adjunction](adjunction_1.svg)
Step two: there exist a morphism from any set to the underlying set of any monoid that is generated by the elements of that set as generators.
![Adjunction](adjunction_2.svg)
Finally, there is a isomorphism between these two sets of functions, which in turn translates to a relationship between the free and forgetful functor that looks like this (the free fuctor is in green and the forgetful one is in red).
![Adjunction](adjunction_3.svg)
You see that This relationship is called an *adjunction* and it defines what the free functor is in terms of the forgetful one, or vice versa.
Unit and counit
---
Another example
---
Let's take another example. The free monoid comprised of just one generator object (which for our purposes we identify with $1$) can be mapped to all cyclic monoids like $Z_{1}$, $Z_{2}$, $Z_{3}$ etc. as well as to the monoid of natural numbers under addition, pictured below
![Adjunction](adjunction_numbers_1.svg)
And in the category of sets, there exist a function between a singleton set and any other set that features its element.
![Adjunction](adjunction_numbers_2.svg)
The equivalence of those two functions is actually another instance of the adjunction between monoids and sets, created by the free and forgetful functor.
![Adjunction](adjunction_numbers.svg)
There definitely is more to be said about free and forgetful functors, as well as for adjunctions, but as always, I will leave things at the most interesting moment in order to revisit them from a different perspective later.
{%endif%}
Like equivalence, adjunction is a relationship between two categories. Like equivalence, it is composed of two functors.
@ -24,10 +185,11 @@ $F \bullet G \to id_{D}$
$G \bullet F \to id_{C}$
Free-forgetful adjunctions
===
Formal concept analysis
===
@ -38,6 +200,7 @@ The tensor-hom adjunction is actually a codename for the curry-uncurry function
Adjunctions
===

View File

Before

Width:  |  Height:  |  Size: 21 KiB

After

Width:  |  Height:  |  Size: 21 KiB

View File

Before

Width:  |  Height:  |  Size: 14 KiB

After

Width:  |  Height:  |  Size: 14 KiB

View File

Before

Width:  |  Height:  |  Size: 42 KiB

After

Width:  |  Height:  |  Size: 42 KiB

View File

Before

Width:  |  Height:  |  Size: 37 KiB

After

Width:  |  Height:  |  Size: 37 KiB

View File

Before

Width:  |  Height:  |  Size: 21 KiB

After

Width:  |  Height:  |  Size: 21 KiB

View File

Before

Width:  |  Height:  |  Size: 13 KiB

After

Width:  |  Height:  |  Size: 13 KiB

View File

Before

Width:  |  Height:  |  Size: 22 KiB

After

Width:  |  Height:  |  Size: 22 KiB

View File

Before

Width:  |  Height:  |  Size: 20 KiB

After

Width:  |  Height:  |  Size: 20 KiB

View File

Before

Width:  |  Height:  |  Size: 15 KiB

After

Width:  |  Height:  |  Size: 15 KiB

View File

Before

Width:  |  Height:  |  Size: 20 KiB

After

Width:  |  Height:  |  Size: 20 KiB

17
_chapters/reading.md Normal file
View File

@ -0,0 +1,17 @@
Reading list
===
[Mathematical toolkit](https://www.youtube.com/watch?v=8j9AF2cfmFo&list=PLk-BCMYCWSzW-nPNnw19Y6oQJnvaAcp1I)
[Number theory from first principles](https://explained-from-first-principles.com/number-theory/)
[Awodey on Carnap](https://www.youtube.com/watch?v=alLgEf0uVkg&t=111s)
[Carnap's book where the word functor originates](https://ia601205.us.archive.org/22/items/in.ernet.dli.2015.136409/2015.136409.The-Logical-Syntax-Of-Language.pdf)
[Math3ma article on functors](https://www.math3ma.com/blog/what-is-a-functor-part-1)
[Graphical linear algebra with string diagrams](https://graphicallinearalgebra.net/2015/04/26/adding-part-1-and-mr-fibonacci/)
[The functions of functors](https://www.lifeoflevi.com/)