Просмотр исходного кода

SVI Исправления, тесты; 76.2%

SVI 2 лет назад
Родитель
Сommit
fe93cf77b7
33 измененных файлов с 2315 добавлено и 160 удалено
  1. 8 0
      Makefile
  2. 1 1
      README.md
  3. 2 2
      cmd/gostore/main_test.go
  4. 0 3
      dev.sh
  5. 3 3
      doc/anonym.md
  6. 346 0
      doc/graph.svg
  7. 3 0
      doc/named.md
  8. 1502 0
      doc/packages.graphml
  9. 2 3
      internal/service/service.go
  10. 3 3
      internal/service/service_test.go
  11. 157 107
      pkg/client_anonym/client_anonym.go
  12. 79 0
      pkg/client_anonym/client_anonym_test.go
  13. 26 0
      pkg/mock/mock.go
  14. 56 0
      pkg/msg_net/msg_net.go
  15. 79 0
      pkg/msg_net/msg_net_test.go
  16. 0 0
      pkg/serv_http/router_anonym/anonym_del/anonym_del.go
  17. 0 0
      pkg/serv_http/router_anonym/anonym_del/anonym_del_test.go
  18. 3 8
      pkg/serv_http/router_anonym/anonym_find/anonym_find.go
  19. 0 0
      pkg/serv_http/router_anonym/anonym_find/anonym_find_test.go
  20. 0 0
      pkg/serv_http/router_anonym/anonym_list/anonym_list.go
  21. 0 0
      pkg/serv_http/router_anonym/anonym_list/anonym_list_test.go
  22. 0 0
      pkg/serv_http/router_anonym/anonym_put/anonym_put.go
  23. 0 0
      pkg/serv_http/router_anonym/anonym_put/anonym_put_test.go
  24. 0 0
      pkg/serv_http/router_anonym/anonym_read/anoneym_read_test.go
  25. 0 0
      pkg/serv_http/router_anonym/anonym_read/anonym_read.go
  26. 7 6
      pkg/serv_http/router_anonym/router_anonym.go
  27. 0 0
      pkg/serv_http/router_anonym/router_anonym_test.go
  28. 4 4
      pkg/serv_http/serv_http.go
  29. 11 11
      pkg/serv_http/serv_http_test.go
  30. 3 3
      pkg/store/store.go
  31. 2 2
      pkg/store/store_test.go
  32. 9 0
      pkg/types/imsg_net.go
  33. 9 4
      pkg/types/iservice.go

+ 8 - 0
Makefile

@@ -1,6 +1,7 @@
 BUILD_DATE = $(shell date +%F_%T_%Z_%a)
 TAG=$(shell git describe --tags --abbrev=0)
 GO_VERS = $(shell go version | sed -e 's/ /_/g'| cut -b 12-)
+SERVICENAME=gostore
 build:
 	clear
 	go fmt ./...
@@ -32,3 +33,10 @@ lint:
 	golangci-lint run ./cmd/serv_old/...
 	golangci-lint run ./cmd/client_pwa/...
 	golangci-lint run ./internal/...
+SERVICEURL=./
+graph:
+	goda graph -f "{{.Package.Name}}" "shared($(SERVICEURL)... )" | dot -Tsvg -o ./doc/graph.svg
+dot:
+	goda graph -f "{{.Package.Name}}" "shared($(SERVICEURL)... )" > ./doc/graph.dot
+dot1:
+	image_packages ./ doc/packages.graphml

+ 1 - 1
README.md

@@ -14,7 +14,7 @@ Cетевое хранилище на `golang`.
 
 Запросы сделанными классическими специально, чтобы гарантировать правильную работу через прокси.
 
-## ообенности работы
+## Особенности работы
 
 Поддерживается `KeepAlive` с ожиданием следующего запроса 10 сек. Клиент должен
 присылать запросы не реже, чтобы поддерживать открытым соединение.

+ 2 - 2
cmd/gostore/main_test.go

@@ -26,8 +26,8 @@ func TestMain(t *testing.T) {
 
 func (sf *tester) createGood1() {
 	sf.t.Log("createGood1")
-	os.Unsetenv("HTTP_PORT")
-	os.Setenv("HTTP_PORT", "18080")
+	os.Unsetenv("STORE_HTTP_PORT")
+	os.Setenv("STORE_HTTP_PORT", "18080")
 	serv, err = service.NewService()
 	if err != nil {
 		sf.t.Fatalf("createGood1(): in create IStoreDisk, err=\n\t%v", err)

+ 0 - 3
dev.sh

@@ -1,6 +1,3 @@
-export STORE_USER="dev"
-export STORE_USER_PASS="dev"
 export STORE_HTTP_PORT="25000"
-export STORE_MEM_RECORD_POOL_SIZE="5000"
 cd ./bin_dev && \
 ./gostore_dev

+ 3 - 3
doc/anonym.md

@@ -15,12 +15,12 @@
 * `/anonym/del` (POST, удалить из хранилища).
 * `/anonym/find` (POST, искать ключи по префиксу).
 * `/anonym/time` (POST, возвращает текущее время на сервере; для поддержания `KeepAlive`).
-* `/anonym/list` (POST, возвращает список анонимных ключей на сервере, предлагает фильтр отбора по префиксу)
+* `/anonym/list` (POST, возвращает список анонимных ключей на сервере, предлагает фильтр отбора по префиксу, для работы веб-морды)
 
-Готовность к использованию:  **0.0%**
+Готовность к использованию:  **93.3%**
 
 ## Переменные окружения
 
 ```bash
-export HTTP_PORT="25000"
+export STORE_HTTP_PORT="25000"
 ```

+ 346 - 0
doc/graph.svg

@@ -0,0 +1,346 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
+ "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<!-- Generated by graphviz version 2.43.0 (0)
+ -->
+<!-- Title: G Pages: 1 -->
+<svg width="1268pt" height="693pt"
+ viewBox="0.00 0.00 1268.00 693.37" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+<g id="graph0" class="graph" transform="scale(1 1) rotate(0) translate(4 689.37)">
+<title>G</title>
+<polygon fill="white" stroke="transparent" points="-4,4 -4,-689.37 1264,-689.37 1264,4 -4,4"/>
+<!-- git.p78su.freemyip.com/svi/gostore/cmd/gostore -->
+<g id="node1" class="node">
+<title>git.p78su.freemyip.com/svi/gostore/cmd/gostore</title>
+<g id="a_node1"><a xlink:href="https://pkg.go.dev/git.p78su.freemyip.com/svi/gostore/cmd/gostore" xlink:title="main" target="_graphviz">
+<polygon fill="none" stroke="#639107" stroke-width="2" stroke-opacity="0.698039" points="72,-103.95 0,-103.95 0,-67.95 72,-67.95 72,-103.95"/>
+<text text-anchor="middle" x="36" y="-83.45" font-family="Times,serif" font-size="10.00">main</text>
+</a>
+</g>
+</g>
+<!-- git.p78su.freemyip.com/svi/gostore/internal/service -->
+<g id="node2" class="node">
+<title>git.p78su.freemyip.com/svi/gostore/internal/service</title>
+<g id="a_node2"><a xlink:href="https://pkg.go.dev/git.p78su.freemyip.com/svi/gostore/internal/service" xlink:title="service" target="_graphviz">
+<polygon fill="none" stroke="#3a9107" stroke-width="2" stroke-opacity="0.698039" points="252,-210.95 180,-210.95 180,-174.95 252,-174.95 252,-210.95"/>
+<text text-anchor="middle" x="216" y="-190.45" font-family="Times,serif" font-size="10.00">service</text>
+</a>
+</g>
+</g>
+<!-- git.p78su.freemyip.com/svi/gostore/cmd/gostore&#45;&gt;git.p78su.freemyip.com/svi/gostore/internal/service -->
+<g id="edge1" class="edge">
+<title>git.p78su.freemyip.com/svi/gostore/cmd/gostore:e&#45;&gt;git.p78su.freemyip.com/svi/gostore/internal/service</title>
+<path fill="none" stroke="#3a9107" stroke-width="2" stroke-opacity="0.698039" d="M72,-85.95C99.13,-85.95 155.98,-135.93 189.24,-167.58"/>
+<polygon fill="#3a9107" fill-opacity="0.698039" stroke="#3a9107" stroke-width="2" stroke-opacity="0.698039" points="187.13,-170.39 196.76,-174.8 191.97,-165.35 187.13,-170.39"/>
+</g>
+<!-- git.p78su.freemyip.com/svi/gostore/pkg/types -->
+<g id="node17" class="node">
+<title>git.p78su.freemyip.com/svi/gostore/pkg/types</title>
+<g id="a_node17"><a xlink:href="https://pkg.go.dev/git.p78su.freemyip.com/svi/gostore/pkg/types" xlink:title="types" target="_graphviz">
+<polygon fill="none" stroke="#919007" stroke-width="2" stroke-opacity="0.698039" points="1260,-359.95 1188,-359.95 1188,-323.95 1260,-323.95 1260,-359.95"/>
+<text text-anchor="middle" x="1224" y="-339.45" font-family="Times,serif" font-size="10.00">types</text>
+</a>
+</g>
+</g>
+<!-- git.p78su.freemyip.com/svi/gostore/cmd/gostore&#45;&gt;git.p78su.freemyip.com/svi/gostore/pkg/types -->
+<g id="edge2" class="edge">
+<title>git.p78su.freemyip.com/svi/gostore/cmd/gostore:e&#45;&gt;git.p78su.freemyip.com/svi/gostore/pkg/types</title>
+<path fill="none" stroke="#919007" stroke-width="2" stroke-opacity="0.698039" d="M72,-85.95C219.18,-85.95 247.82,-12.95 395,-12.95 395,-12.95 395,-12.95 811,-12.95 931.16,-12.95 981.81,29.31 1080,-39.95 1174.36,-106.5 1208.44,-252.14 1218.93,-313.64"/>
+<polygon fill="#919007" fill-opacity="0.698039" stroke="#919007" stroke-width="2" stroke-opacity="0.698039" points="1215.51,-314.46 1220.57,-323.77 1222.42,-313.34 1215.51,-314.46"/>
+</g>
+<!-- git.p78su.freemyip.com/svi/gostore/pkg/serv_http -->
+<g id="node9" class="node">
+<title>git.p78su.freemyip.com/svi/gostore/pkg/serv_http</title>
+<g id="a_node9"><a xlink:href="https://pkg.go.dev/git.p78su.freemyip.com/svi/gostore/pkg/serv_http" xlink:title="serv_http" target="_graphviz">
+<polygon fill="none" stroke="#8d0791" stroke-width="2" stroke-opacity="0.698039" points="432,-222.95 360,-222.95 360,-186.95 432,-186.95 432,-222.95"/>
+<text text-anchor="middle" x="396" y="-202.45" font-family="Times,serif" font-size="10.00">serv_http</text>
+</a>
+</g>
+</g>
+<!-- git.p78su.freemyip.com/svi/gostore/internal/service&#45;&gt;git.p78su.freemyip.com/svi/gostore/pkg/serv_http -->
+<g id="edge3" class="edge">
+<title>git.p78su.freemyip.com/svi/gostore/internal/service:e&#45;&gt;git.p78su.freemyip.com/svi/gostore/pkg/serv_http</title>
+<path fill="none" stroke="#8d0791" stroke-width="2" stroke-opacity="0.698039" d="M252,-192.95C284.7,-192.95 321.45,-196.1 349.51,-199.18"/>
+<polygon fill="#8d0791" fill-opacity="0.698039" stroke="#8d0791" stroke-width="2" stroke-opacity="0.698039" points="349.48,-202.69 359.81,-200.34 350.27,-195.74 349.48,-202.69"/>
+</g>
+<!-- git.p78su.freemyip.com/svi/gostore/pkg/store -->
+<g id="node16" class="node">
+<title>git.p78su.freemyip.com/svi/gostore/pkg/store</title>
+<g id="a_node16"><a xlink:href="https://pkg.go.dev/git.p78su.freemyip.com/svi/gostore/pkg/store" xlink:title="store" target="_graphviz">
+<polygon fill="none" stroke="#870791" stroke-width="2" stroke-opacity="0.698039" points="432,-168.95 360,-168.95 360,-132.95 432,-132.95 432,-168.95"/>
+<text text-anchor="middle" x="396" y="-148.45" font-family="Times,serif" font-size="10.00">store</text>
+</a>
+</g>
+</g>
+<!-- git.p78su.freemyip.com/svi/gostore/internal/service&#45;&gt;git.p78su.freemyip.com/svi/gostore/pkg/store -->
+<g id="edge4" class="edge">
+<title>git.p78su.freemyip.com/svi/gostore/internal/service:e&#45;&gt;git.p78su.freemyip.com/svi/gostore/pkg/store</title>
+<path fill="none" stroke="#870791" stroke-width="2" stroke-opacity="0.698039" d="M252,-192.95C286.02,-192.95 322.82,-181.87 350.57,-171.09"/>
+<polygon fill="#870791" fill-opacity="0.698039" stroke="#870791" stroke-width="2" stroke-opacity="0.698039" points="352.01,-174.28 359.99,-167.31 349.41,-167.78 352.01,-174.28"/>
+</g>
+<!-- git.p78su.freemyip.com/svi/gostore/internal/service&#45;&gt;git.p78su.freemyip.com/svi/gostore/pkg/types -->
+<g id="edge5" class="edge">
+<title>git.p78su.freemyip.com/svi/gostore/internal/service:e&#45;&gt;git.p78su.freemyip.com/svi/gostore/pkg/types</title>
+<path fill="none" stroke="#919007" stroke-width="2" stroke-opacity="0.698039" d="M252,-192.95C515.87,-192.95 329.13,-678.95 593,-678.95 593,-678.95 593,-678.95 811,-678.95 932.07,-678.95 982.76,-708.09 1080,-635.95 1170.3,-568.95 1206.48,-429.59 1218.22,-369.98"/>
+<polygon fill="#919007" fill-opacity="0.698039" stroke="#919007" stroke-width="2" stroke-opacity="0.698039" points="1221.66,-370.61 1220.08,-360.14 1214.79,-369.31 1221.66,-370.61"/>
+</g>
+<!-- git.p78su.freemyip.com/svi/gostore/pkg/client_anonym -->
+<g id="node3" class="node">
+<title>git.p78su.freemyip.com/svi/gostore/pkg/client_anonym</title>
+<g id="a_node3"><a xlink:href="https://pkg.go.dev/git.p78su.freemyip.com/svi/gostore/pkg/client_anonym" xlink:title="client_anonym" target="_graphviz">
+<polygon fill="none" stroke="#073591" stroke-width="2" stroke-opacity="0.698039" points="864,-589.95 756,-589.95 756,-553.95 864,-553.95 864,-589.95"/>
+<text text-anchor="middle" x="810" y="-569.45" font-family="Times,serif" font-size="10.00">client_anonym</text>
+</a>
+</g>
+</g>
+<!-- git.p78su.freemyip.com/svi/gostore/pkg/msg_net -->
+<g id="node8" class="node">
+<title>git.p78su.freemyip.com/svi/gostore/pkg/msg_net</title>
+<g id="a_node8"><a xlink:href="https://pkg.go.dev/git.p78su.freemyip.com/svi/gostore/pkg/msg_net" xlink:title="msg_net" target="_graphviz">
+<polygon fill="none" stroke="#509107" stroke-width="2" stroke-opacity="0.698039" points="1062,-574.95 990,-574.95 990,-538.95 1062,-538.95 1062,-574.95"/>
+<text text-anchor="middle" x="1026" y="-554.45" font-family="Times,serif" font-size="10.00">msg_net</text>
+</a>
+</g>
+</g>
+<!-- git.p78su.freemyip.com/svi/gostore/pkg/client_anonym&#45;&gt;git.p78su.freemyip.com/svi/gostore/pkg/msg_net -->
+<g id="edge6" class="edge">
+<title>git.p78su.freemyip.com/svi/gostore/pkg/client_anonym:e&#45;&gt;git.p78su.freemyip.com/svi/gostore/pkg/msg_net</title>
+<path fill="none" stroke="#509107" stroke-width="2" stroke-opacity="0.698039" d="M864,-571.95C903.26,-571.95 947.68,-567.47 979.9,-563.41"/>
+<polygon fill="#509107" fill-opacity="0.698039" stroke="#509107" stroke-width="2" stroke-opacity="0.698039" points="980.44,-566.87 989.91,-562.11 979.54,-559.93 980.44,-566.87"/>
+</g>
+<!-- git.p78su.freemyip.com/svi/gostore/pkg/client_anonym&#45;&gt;git.p78su.freemyip.com/svi/gostore/pkg/types -->
+<g id="edge7" class="edge">
+<title>git.p78su.freemyip.com/svi/gostore/pkg/client_anonym:e&#45;&gt;git.p78su.freemyip.com/svi/gostore/pkg/types</title>
+<path fill="none" stroke="#919007" stroke-width="2" stroke-opacity="0.698039" d="M864,-571.95C960.15,-571.95 996.49,-631.6 1080,-583.95 1162.06,-537.12 1201.78,-422.72 1216.28,-369.73"/>
+<polygon fill="#919007" fill-opacity="0.698039" stroke="#919007" stroke-width="2" stroke-opacity="0.698039" points="1219.68,-370.55 1218.85,-359.99 1212.91,-368.77 1219.68,-370.55"/>
+</g>
+<!-- git.p78su.freemyip.com/svi/gostore/pkg/mock -->
+<g id="node4" class="node">
+<title>git.p78su.freemyip.com/svi/gostore/pkg/mock</title>
+<g id="a_node4"><a xlink:href="https://pkg.go.dev/git.p78su.freemyip.com/svi/gostore/pkg/mock" xlink:title="mock" target="_graphviz">
+<polygon fill="none" stroke="#07918c" stroke-width="2" stroke-opacity="0.698039" points="252,-145.95 180,-145.95 180,-109.95 252,-109.95 252,-145.95"/>
+<text text-anchor="middle" x="216" y="-125.45" font-family="Times,serif" font-size="10.00">mock</text>
+</a>
+</g>
+</g>
+<!-- git.p78su.freemyip.com/svi/gostore/pkg/mock/mock_service -->
+<g id="node5" class="node">
+<title>git.p78su.freemyip.com/svi/gostore/pkg/mock/mock_service</title>
+<g id="a_node5"><a xlink:href="https://pkg.go.dev/git.p78su.freemyip.com/svi/gostore/pkg/mock/mock_service" xlink:title="mock_service" target="_graphviz">
+<polygon fill="none" stroke="#918e07" stroke-width="2" stroke-opacity="0.698039" points="648,-76.95 540,-76.95 540,-40.95 648,-40.95 648,-76.95"/>
+<text text-anchor="middle" x="594" y="-56.45" font-family="Times,serif" font-size="10.00">mock_service</text>
+</a>
+</g>
+</g>
+<!-- git.p78su.freemyip.com/svi/gostore/pkg/mock&#45;&gt;git.p78su.freemyip.com/svi/gostore/pkg/mock/mock_service -->
+<g id="edge8" class="edge">
+<title>git.p78su.freemyip.com/svi/gostore/pkg/mock:e&#45;&gt;git.p78su.freemyip.com/svi/gostore/pkg/mock/mock_service</title>
+<path fill="none" stroke="#918e07" stroke-width="2" stroke-opacity="0.698039" d="M252,-127.95C302.74,-127.95 310.64,-102.68 360,-90.95 416.62,-77.49 482.43,-69.1 529.63,-64.31"/>
+<polygon fill="#918e07" fill-opacity="0.698039" stroke="#918e07" stroke-width="2" stroke-opacity="0.698039" points="530.11,-67.78 539.71,-63.31 529.42,-60.81 530.11,-67.78"/>
+</g>
+<!-- git.p78su.freemyip.com/svi/gostore/pkg/mock&#45;&gt;git.p78su.freemyip.com/svi/gostore/pkg/serv_http -->
+<g id="edge9" class="edge">
+<title>git.p78su.freemyip.com/svi/gostore/pkg/mock:e&#45;&gt;git.p78su.freemyip.com/svi/gostore/pkg/serv_http</title>
+<path fill="none" stroke="#8d0791" stroke-width="2" stroke-opacity="0.698039" d="M252,-127.95C274.81,-127.95 325.9,-158.7 360.42,-181.34"/>
+<polygon fill="#8d0791" fill-opacity="0.698039" stroke="#8d0791" stroke-width="2" stroke-opacity="0.698039" points="358.54,-184.29 368.81,-186.89 362.41,-178.46 358.54,-184.29"/>
+</g>
+<!-- git.p78su.freemyip.com/svi/gostore/pkg/mock&#45;&gt;git.p78su.freemyip.com/svi/gostore/pkg/store -->
+<g id="edge10" class="edge">
+<title>git.p78su.freemyip.com/svi/gostore/pkg/mock:e&#45;&gt;git.p78su.freemyip.com/svi/gostore/pkg/store</title>
+<path fill="none" stroke="#870791" stroke-width="2" stroke-opacity="0.698039" d="M252,-127.95C285.14,-127.95 322.07,-134.05 350.09,-139.96"/>
+<polygon fill="#870791" fill-opacity="0.698039" stroke="#870791" stroke-width="2" stroke-opacity="0.698039" points="349.48,-143.41 359.99,-142.12 350.97,-136.57 349.48,-143.41"/>
+</g>
+<!-- git.p78su.freemyip.com/svi/gostore/pkg/mock&#45;&gt;git.p78su.freemyip.com/svi/gostore/pkg/types -->
+<g id="edge11" class="edge">
+<title>git.p78su.freemyip.com/svi/gostore/pkg/mock:e&#45;&gt;git.p78su.freemyip.com/svi/gostore/pkg/types</title>
+<path fill="none" stroke="#919007" stroke-width="2" stroke-opacity="0.698039" d="M252,-127.95C403.9,-127.95 441.1,-104.95 593,-104.95 593,-104.95 593,-104.95 811,-104.95 931.94,-104.95 976.64,-83.16 1080,-145.95 1146.77,-186.51 1191.85,-271.18 1211.62,-314.75"/>
+<polygon fill="#919007" fill-opacity="0.698039" stroke="#919007" stroke-width="2" stroke-opacity="0.698039" points="1208.42,-316.17 1215.67,-323.9 1214.82,-313.34 1208.42,-316.17"/>
+</g>
+<!-- git.p78su.freemyip.com/svi/gostore/pkg/mock/mock_service&#45;&gt;git.p78su.freemyip.com/svi/gostore/pkg/types -->
+<g id="edge12" class="edge">
+<title>git.p78su.freemyip.com/svi/gostore/pkg/mock/mock_service:e&#45;&gt;git.p78su.freemyip.com/svi/gostore/pkg/types</title>
+<path fill="none" stroke="#919007" stroke-width="2" stroke-opacity="0.698039" d="M648,-58.95C840.53,-58.95 917.23,11.88 1080,-90.95 1162.08,-142.8 1201.8,-259.77 1216.28,-313.72"/>
+<polygon fill="#919007" fill-opacity="0.698039" stroke="#919007" stroke-width="2" stroke-opacity="0.698039" points="1212.95,-314.82 1218.85,-323.63 1219.73,-313.07 1212.95,-314.82"/>
+</g>
+<!-- git.p78su.freemyip.com/svi/gostore/pkg/mock/mock_store -->
+<g id="node6" class="node">
+<title>git.p78su.freemyip.com/svi/gostore/pkg/mock/mock_store</title>
+<g id="a_node6"><a xlink:href="https://pkg.go.dev/git.p78su.freemyip.com/svi/gostore/pkg/mock/mock_store" xlink:title="mock_store" target="_graphviz">
+<polygon fill="none" stroke="#169107" stroke-width="2" stroke-opacity="0.698039" points="1080,-482.95 972,-482.95 972,-446.95 1080,-446.95 1080,-482.95"/>
+<text text-anchor="middle" x="1026" y="-462.45" font-family="Times,serif" font-size="10.00">mock_store</text>
+</a>
+</g>
+</g>
+<!-- git.p78su.freemyip.com/svi/gostore/pkg/mock/mock_store&#45;&gt;git.p78su.freemyip.com/svi/gostore/pkg/types -->
+<g id="edge13" class="edge">
+<title>git.p78su.freemyip.com/svi/gostore/pkg/mock/mock_store:e&#45;&gt;git.p78su.freemyip.com/svi/gostore/pkg/types</title>
+<path fill="none" stroke="#919007" stroke-width="2" stroke-opacity="0.698039" d="M1080,-464.95C1138.57,-464.95 1185.09,-404.92 1207.82,-368.73"/>
+<polygon fill="#919007" fill-opacity="0.698039" stroke="#919007" stroke-width="2" stroke-opacity="0.698039" points="1210.87,-370.46 1213.08,-360.1 1204.89,-366.82 1210.87,-370.46"/>
+</g>
+<!-- git.p78su.freemyip.com/svi/gostore/pkg/mock/mock_web -->
+<g id="node7" class="node">
+<title>git.p78su.freemyip.com/svi/gostore/pkg/mock/mock_web</title>
+<g id="a_node7"><a xlink:href="https://pkg.go.dev/git.p78su.freemyip.com/svi/gostore/pkg/mock/mock_web" xlink:title="mock_web" target="_graphviz">
+<polygon fill="none" stroke="#570791" stroke-width="2" stroke-opacity="0.698039" points="1062,-428.95 990,-428.95 990,-392.95 1062,-392.95 1062,-428.95"/>
+<text text-anchor="middle" x="1026" y="-408.45" font-family="Times,serif" font-size="10.00">mock_web</text>
+</a>
+</g>
+</g>
+<!-- git.p78su.freemyip.com/svi/gostore/pkg/mock/mock_web&#45;&gt;git.p78su.freemyip.com/svi/gostore/pkg/types -->
+<g id="edge14" class="edge">
+<title>git.p78su.freemyip.com/svi/gostore/pkg/mock/mock_web:e&#45;&gt;git.p78su.freemyip.com/svi/gostore/pkg/types</title>
+<path fill="none" stroke="#919007" stroke-width="2" stroke-opacity="0.698039" d="M1063,-410.95C1109.81,-410.95 1158.48,-385.74 1189.67,-365.8"/>
+<polygon fill="#919007" fill-opacity="0.698039" stroke="#919007" stroke-width="2" stroke-opacity="0.698039" points="1191.94,-368.49 1198.37,-360.08 1188.09,-362.65 1191.94,-368.49"/>
+</g>
+<!-- git.p78su.freemyip.com/svi/gostore/pkg/msg_net&#45;&gt;git.p78su.freemyip.com/svi/gostore/pkg/types -->
+<g id="edge15" class="edge">
+<title>git.p78su.freemyip.com/svi/gostore/pkg/msg_net:e&#45;&gt;git.p78su.freemyip.com/svi/gostore/pkg/types</title>
+<path fill="none" stroke="#919007" stroke-width="2" stroke-opacity="0.698039" d="M1063,-556.95C1155.17,-556.95 1200.51,-428.2 1216.29,-369.96"/>
+<polygon fill="#919007" fill-opacity="0.698039" stroke="#919007" stroke-width="2" stroke-opacity="0.698039" points="1219.68,-370.84 1218.82,-360.28 1212.91,-369.07 1219.68,-370.84"/>
+</g>
+<!-- git.p78su.freemyip.com/svi/gostore/pkg/serv_http/router_anonym -->
+<g id="node10" class="node">
+<title>git.p78su.freemyip.com/svi/gostore/pkg/serv_http/router_anonym</title>
+<g id="a_node10"><a xlink:href="https://pkg.go.dev/git.p78su.freemyip.com/svi/gostore/pkg/serv_http/router_anonym" xlink:title="router_anonym" target="_graphviz">
+<polygon fill="none" stroke="#079111" stroke-width="2" stroke-opacity="0.698039" points="648,-336.95 540,-336.95 540,-300.95 648,-300.95 648,-336.95"/>
+<text text-anchor="middle" x="594" y="-316.45" font-family="Times,serif" font-size="10.00">router_anonym</text>
+</a>
+</g>
+</g>
+<!-- git.p78su.freemyip.com/svi/gostore/pkg/serv_http&#45;&gt;git.p78su.freemyip.com/svi/gostore/pkg/serv_http/router_anonym -->
+<g id="edge16" class="edge">
+<title>git.p78su.freemyip.com/svi/gostore/pkg/serv_http:e&#45;&gt;git.p78su.freemyip.com/svi/gostore/pkg/serv_http/router_anonym</title>
+<path fill="none" stroke="#079111" stroke-width="2" stroke-opacity="0.698039" d="M432,-204.95C492.46,-204.95 546.1,-259.16 573.57,-292.82"/>
+<polygon fill="#079111" fill-opacity="0.698039" stroke="#079111" stroke-width="2" stroke-opacity="0.698039" points="571.02,-295.23 579.98,-300.88 576.5,-290.88 571.02,-295.23"/>
+</g>
+<!-- git.p78su.freemyip.com/svi/gostore/pkg/serv_http&#45;&gt;git.p78su.freemyip.com/svi/gostore/pkg/types -->
+<g id="edge17" class="edge">
+<title>git.p78su.freemyip.com/svi/gostore/pkg/serv_http:e&#45;&gt;git.p78su.freemyip.com/svi/gostore/pkg/types</title>
+<path fill="none" stroke="#919007" stroke-width="2" stroke-opacity="0.698039" d="M432,-204.95C720.05,-204.95 814,-106.41 1080,-216.95 1131.49,-238.34 1177.35,-286.02 1202.55,-315.91"/>
+<polygon fill="#919007" fill-opacity="0.698039" stroke="#919007" stroke-width="2" stroke-opacity="0.698039" points="1200.03,-318.36 1209.1,-323.84 1205.43,-313.9 1200.03,-318.36"/>
+</g>
+<!-- git.p78su.freemyip.com/svi/gostore/pkg/serv_http/router_anonym/anonym_del -->
+<g id="node11" class="node">
+<title>git.p78su.freemyip.com/svi/gostore/pkg/serv_http/router_anonym/anonym_del</title>
+<g id="a_node11"><a xlink:href="https://pkg.go.dev/git.p78su.freemyip.com/svi/gostore/pkg/serv_http/router_anonym/anonym_del" xlink:title="anonym_del" target="_graphviz">
+<polygon fill="none" stroke="#07915b" stroke-width="2" stroke-opacity="0.698039" points="1080,-336.95 972,-336.95 972,-300.95 1080,-300.95 1080,-336.95"/>
+<text text-anchor="middle" x="1026" y="-316.45" font-family="Times,serif" font-size="10.00">anonym_del</text>
+</a>
+</g>
+</g>
+<!-- git.p78su.freemyip.com/svi/gostore/pkg/serv_http/router_anonym&#45;&gt;git.p78su.freemyip.com/svi/gostore/pkg/serv_http/router_anonym/anonym_del -->
+<g id="edge18" class="edge">
+<title>git.p78su.freemyip.com/svi/gostore/pkg/serv_http/router_anonym:e&#45;&gt;git.p78su.freemyip.com/svi/gostore/pkg/serv_http/router_anonym/anonym_del</title>
+<path fill="none" stroke="#07915b" stroke-width="2" stroke-opacity="0.698039" d="M648,-318.95C758.33,-318.95 886.83,-318.95 961.73,-318.95"/>
+<polygon fill="#07915b" fill-opacity="0.698039" stroke="#07915b" stroke-width="2" stroke-opacity="0.698039" points="961.93,-322.45 971.93,-318.95 961.93,-315.45 961.93,-322.45"/>
+</g>
+<!-- git.p78su.freemyip.com/svi/gostore/pkg/serv_http/router_anonym/anonym_find -->
+<g id="node12" class="node">
+<title>git.p78su.freemyip.com/svi/gostore/pkg/serv_http/router_anonym/anonym_find</title>
+<g id="a_node12"><a xlink:href="https://pkg.go.dev/git.p78su.freemyip.com/svi/gostore/pkg/serv_http/router_anonym/anonym_find" xlink:title="anonym_find" target="_graphviz">
+<polygon fill="none" stroke="#072091" stroke-width="2" stroke-opacity="0.698039" points="864,-528.95 756,-528.95 756,-492.95 864,-492.95 864,-528.95"/>
+<text text-anchor="middle" x="810" y="-508.45" font-family="Times,serif" font-size="10.00">anonym_find</text>
+</a>
+</g>
+</g>
+<!-- git.p78su.freemyip.com/svi/gostore/pkg/serv_http/router_anonym&#45;&gt;git.p78su.freemyip.com/svi/gostore/pkg/serv_http/router_anonym/anonym_find -->
+<g id="edge19" class="edge">
+<title>git.p78su.freemyip.com/svi/gostore/pkg/serv_http/router_anonym:e&#45;&gt;git.p78su.freemyip.com/svi/gostore/pkg/serv_http/router_anonym/anonym_find</title>
+<path fill="none" stroke="#072091" stroke-width="2" stroke-opacity="0.698039" d="M648,-318.95C732.8,-318.95 781.81,-430.28 800.36,-483.39"/>
+<polygon fill="#072091" fill-opacity="0.698039" stroke="#072091" stroke-width="2" stroke-opacity="0.698039" points="797.06,-484.53 803.57,-492.89 803.69,-482.29 797.06,-484.53"/>
+</g>
+<!-- git.p78su.freemyip.com/svi/gostore/pkg/serv_http/router_anonym/anonym_list -->
+<g id="node13" class="node">
+<title>git.p78su.freemyip.com/svi/gostore/pkg/serv_http/router_anonym/anonym_list</title>
+<g id="a_node13"><a xlink:href="https://pkg.go.dev/git.p78su.freemyip.com/svi/gostore/pkg/serv_http/router_anonym/anonym_list" xlink:title="anonym_list" target="_graphviz">
+<polygon fill="none" stroke="#914c07" stroke-width="2" stroke-opacity="0.698039" points="1080,-282.95 972,-282.95 972,-246.95 1080,-246.95 1080,-282.95"/>
+<text text-anchor="middle" x="1026" y="-262.45" font-family="Times,serif" font-size="10.00">anonym_list</text>
+</a>
+</g>
+</g>
+<!-- git.p78su.freemyip.com/svi/gostore/pkg/serv_http/router_anonym&#45;&gt;git.p78su.freemyip.com/svi/gostore/pkg/serv_http/router_anonym/anonym_list -->
+<g id="edge20" class="edge">
+<title>git.p78su.freemyip.com/svi/gostore/pkg/serv_http/router_anonym:e&#45;&gt;git.p78su.freemyip.com/svi/gostore/pkg/serv_http/router_anonym/anonym_list</title>
+<path fill="none" stroke="#914c07" stroke-width="2" stroke-opacity="0.698039" d="M648,-318.95C759.3,-318.95 887.23,-295.6 961.8,-279.61"/>
+<polygon fill="#914c07" fill-opacity="0.698039" stroke="#914c07" stroke-width="2" stroke-opacity="0.698039" points="962.93,-282.95 971.96,-277.4 961.45,-276.1 962.93,-282.95"/>
+</g>
+<!-- git.p78su.freemyip.com/svi/gostore/pkg/serv_http/router_anonym/anonym_put -->
+<g id="node14" class="node">
+<title>git.p78su.freemyip.com/svi/gostore/pkg/serv_http/router_anonym/anonym_put</title>
+<g id="a_node14"><a xlink:href="https://pkg.go.dev/git.p78su.freemyip.com/svi/gostore/pkg/serv_http/router_anonym/anonym_put" xlink:title="anonym_put" target="_graphviz">
+<polygon fill="none" stroke="#910709" stroke-width="2" stroke-opacity="0.698039" points="864,-246.95 756,-246.95 756,-210.95 864,-210.95 864,-246.95"/>
+<text text-anchor="middle" x="810" y="-226.45" font-family="Times,serif" font-size="10.00">anonym_put</text>
+</a>
+</g>
+</g>
+<!-- git.p78su.freemyip.com/svi/gostore/pkg/serv_http/router_anonym&#45;&gt;git.p78su.freemyip.com/svi/gostore/pkg/serv_http/router_anonym/anonym_put -->
+<g id="edge21" class="edge">
+<title>git.p78su.freemyip.com/svi/gostore/pkg/serv_http/router_anonym:e&#45;&gt;git.p78su.freemyip.com/svi/gostore/pkg/serv_http/router_anonym/anonym_put</title>
+<path fill="none" stroke="#910709" stroke-width="2" stroke-opacity="0.698039" d="M648,-318.95C661.63,-318.95 728.35,-279.13 771.51,-252.47"/>
+<polygon fill="#910709" fill-opacity="0.698039" stroke="#910709" stroke-width="2" stroke-opacity="0.698039" points="773.42,-255.4 780.07,-247.16 769.73,-249.46 773.42,-255.4"/>
+</g>
+<!-- git.p78su.freemyip.com/svi/gostore/pkg/serv_http/router_anonym/anonym_read -->
+<g id="node15" class="node">
+<title>git.p78su.freemyip.com/svi/gostore/pkg/serv_http/router_anonym/anonym_read</title>
+<g id="a_node15"><a xlink:href="https://pkg.go.dev/git.p78su.freemyip.com/svi/gostore/pkg/serv_http/router_anonym/anonym_read" xlink:title="anonym_read" target="_graphviz">
+<polygon fill="none" stroke="#079151" stroke-width="2" stroke-opacity="0.698039" points="864,-647.95 756,-647.95 756,-611.95 864,-611.95 864,-647.95"/>
+<text text-anchor="middle" x="810" y="-627.45" font-family="Times,serif" font-size="10.00">anonym_read</text>
+</a>
+</g>
+</g>
+<!-- git.p78su.freemyip.com/svi/gostore/pkg/serv_http/router_anonym&#45;&gt;git.p78su.freemyip.com/svi/gostore/pkg/serv_http/router_anonym/anonym_read -->
+<g id="edge22" class="edge">
+<title>git.p78su.freemyip.com/svi/gostore/pkg/serv_http/router_anonym:e&#45;&gt;git.p78su.freemyip.com/svi/gostore/pkg/serv_http/router_anonym/anonym_read</title>
+<path fill="none" stroke="#079151" stroke-width="2" stroke-opacity="0.698039" d="M648,-318.95C781.38,-318.95 669.58,-497.35 756,-598.95 757.94,-601.23 760.1,-603.39 762.4,-605.42"/>
+<polygon fill="#079151" fill-opacity="0.698039" stroke="#079151" stroke-width="2" stroke-opacity="0.698039" points="760.61,-608.46 770.66,-611.83 764.9,-602.93 760.61,-608.46"/>
+</g>
+<!-- git.p78su.freemyip.com/svi/gostore/pkg/serv_http/router_anonym&#45;&gt;git.p78su.freemyip.com/svi/gostore/pkg/types -->
+<g id="edge23" class="edge">
+<title>git.p78su.freemyip.com/svi/gostore/pkg/serv_http/router_anonym:e&#45;&gt;git.p78su.freemyip.com/svi/gostore/pkg/types</title>
+<path fill="none" stroke="#919007" stroke-width="2" stroke-opacity="0.698039" d="M648,-318.95C696.4,-318.95 707.81,-328.38 756,-332.95 899.47,-346.55 935.9,-347.96 1080,-345.95 1112.59,-345.49 1149.35,-344.45 1177.43,-343.55"/>
+<polygon fill="#919007" fill-opacity="0.698039" stroke="#919007" stroke-width="2" stroke-opacity="0.698039" points="1177.87,-347.04 1187.75,-343.21 1177.64,-340.04 1177.87,-347.04"/>
+</g>
+<!-- git.p78su.freemyip.com/svi/gostore/pkg/serv_http/router_anonym/anonym_del&#45;&gt;git.p78su.freemyip.com/svi/gostore/pkg/types -->
+<g id="edge24" class="edge">
+<title>git.p78su.freemyip.com/svi/gostore/pkg/serv_http/router_anonym/anonym_del:e&#45;&gt;git.p78su.freemyip.com/svi/gostore/pkg/types</title>
+<path fill="none" stroke="#919007" stroke-width="2" stroke-opacity="0.698039" d="M1080,-318.95C1113.14,-318.95 1150.07,-325.05 1178.09,-330.96"/>
+<polygon fill="#919007" fill-opacity="0.698039" stroke="#919007" stroke-width="2" stroke-opacity="0.698039" points="1177.48,-334.41 1187.99,-333.12 1178.97,-327.57 1177.48,-334.41"/>
+</g>
+<!-- git.p78su.freemyip.com/svi/gostore/pkg/serv_http/router_anonym/anonym_find&#45;&gt;git.p78su.freemyip.com/svi/gostore/pkg/msg_net -->
+<g id="edge25" class="edge">
+<title>git.p78su.freemyip.com/svi/gostore/pkg/serv_http/router_anonym/anonym_find:e&#45;&gt;git.p78su.freemyip.com/svi/gostore/pkg/msg_net</title>
+<path fill="none" stroke="#509107" stroke-width="2" stroke-opacity="0.698039" d="M864,-510.95C904.44,-510.95 948.47,-524.53 980.25,-536.93"/>
+<polygon fill="#509107" fill-opacity="0.698039" stroke="#509107" stroke-width="2" stroke-opacity="0.698039" points="979.11,-540.25 989.7,-540.73 981.72,-533.76 979.11,-540.25"/>
+</g>
+<!-- git.p78su.freemyip.com/svi/gostore/pkg/serv_http/router_anonym/anonym_find&#45;&gt;git.p78su.freemyip.com/svi/gostore/pkg/types -->
+<g id="edge26" class="edge">
+<title>git.p78su.freemyip.com/svi/gostore/pkg/serv_http/router_anonym/anonym_find:e&#45;&gt;git.p78su.freemyip.com/svi/gostore/pkg/types</title>
+<path fill="none" stroke="#919007" stroke-width="2" stroke-opacity="0.698039" d="M864,-510.95C960.37,-510.95 993.16,-533.74 1080,-491.95 1136.99,-464.52 1183.14,-404.03 1206.47,-368.82"/>
+<polygon fill="#919007" fill-opacity="0.698039" stroke="#919007" stroke-width="2" stroke-opacity="0.698039" points="1209.66,-370.32 1212.16,-360.03 1203.79,-366.52 1209.66,-370.32"/>
+</g>
+<!-- git.p78su.freemyip.com/svi/gostore/pkg/serv_http/router_anonym/anonym_list&#45;&gt;git.p78su.freemyip.com/svi/gostore/pkg/types -->
+<g id="edge27" class="edge">
+<title>git.p78su.freemyip.com/svi/gostore/pkg/serv_http/router_anonym/anonym_list:e&#45;&gt;git.p78su.freemyip.com/svi/gostore/pkg/types</title>
+<path fill="none" stroke="#919007" stroke-width="2" stroke-opacity="0.698039" d="M1080,-264.95C1124.72,-264.95 1168.91,-294.5 1196.07,-316.99"/>
+<polygon fill="#919007" fill-opacity="0.698039" stroke="#919007" stroke-width="2" stroke-opacity="0.698039" points="1194.05,-319.87 1203.93,-323.7 1198.6,-314.55 1194.05,-319.87"/>
+</g>
+<!-- git.p78su.freemyip.com/svi/gostore/pkg/serv_http/router_anonym/anonym_put&#45;&gt;git.p78su.freemyip.com/svi/gostore/pkg/types -->
+<g id="edge28" class="edge">
+<title>git.p78su.freemyip.com/svi/gostore/pkg/serv_http/router_anonym/anonym_put:e&#45;&gt;git.p78su.freemyip.com/svi/gostore/pkg/types</title>
+<path fill="none" stroke="#919007" stroke-width="2" stroke-opacity="0.698039" d="M864,-228.95C960.08,-228.95 989.26,-206.34 1080,-237.95 1126.96,-254.31 1171.76,-291.61 1198.32,-316.8"/>
+<polygon fill="#919007" fill-opacity="0.698039" stroke="#919007" stroke-width="2" stroke-opacity="0.698039" points="1196.01,-319.44 1205.63,-323.87 1200.88,-314.41 1196.01,-319.44"/>
+</g>
+<!-- git.p78su.freemyip.com/svi/gostore/pkg/serv_http/router_anonym/anonym_read&#45;&gt;git.p78su.freemyip.com/svi/gostore/pkg/types -->
+<g id="edge29" class="edge">
+<title>git.p78su.freemyip.com/svi/gostore/pkg/serv_http/router_anonym/anonym_read:e&#45;&gt;git.p78su.freemyip.com/svi/gostore/pkg/types</title>
+<path fill="none" stroke="#919007" stroke-width="2" stroke-opacity="0.698039" d="M864,-629.95C960.54,-629.95 999.83,-660.74 1080,-606.95 1164.83,-550.03 1203.47,-425.6 1217.02,-369.89"/>
+<polygon fill="#919007" fill-opacity="0.698039" stroke="#919007" stroke-width="2" stroke-opacity="0.698039" points="1220.46,-370.55 1219.33,-360.01 1213.64,-368.95 1220.46,-370.55"/>
+</g>
+<!-- git.p78su.freemyip.com/svi/gostore/pkg/store&#45;&gt;git.p78su.freemyip.com/svi/gostore/pkg/types -->
+<g id="edge30" class="edge">
+<title>git.p78su.freemyip.com/svi/gostore/pkg/store:e&#45;&gt;git.p78su.freemyip.com/svi/gostore/pkg/types</title>
+<path fill="none" stroke="#919007" stroke-width="2" stroke-opacity="0.698039" d="M432,-150.95C576.12,-150.95 951.36,-111.99 1080,-176.95 1140.67,-207.59 1186.51,-276.25 1208.52,-314.64"/>
+<polygon fill="#919007" fill-opacity="0.698039" stroke="#919007" stroke-width="2" stroke-opacity="0.698039" points="1205.66,-316.7 1213.6,-323.71 1211.77,-313.27 1205.66,-316.7"/>
+</g>
+</g>
+</svg>

+ 3 - 0
doc/named.md

@@ -0,0 +1,3 @@
+# Именованное пространство
+
+Специальный раздел хранилища для именованного хранения ключей.

+ 1502 - 0
doc/packages.graphml

@@ -0,0 +1,1502 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<graphml xmlns="http://graphml.graphdrawing.org/xmlns" xmlns:java="http://www.yworks.com/xml/yfiles-common/1.0/java" xmlns:sys="http://www.yworks.com/xml/yfiles-common/markup/primitives/2.0" xmlns:x="http://www.yworks.com/xml/yfiles-common/markup/2.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:y="http://www.yworks.com/xml/graphml" xmlns:yed="http://www.yworks.com/xml/yed/3" xsi:schemaLocation="http://graphml.graphdrawing.org/xmlns http://www.yworks.com/xml/schema/graphml/1.1/ygraphml.xsd">
+  <!--Created by yEd 3.23.2-->
+  <key for="port" id="d0" yfiles.type="portgraphics"/>
+  <key for="port" id="d1" yfiles.type="portgeometry"/>
+  <key for="port" id="d2" yfiles.type="portuserdata"/>
+  <key attr.name="url" attr.type="string" for="node" id="d3"/>
+  <key attr.name="description" attr.type="string" for="node" id="d4"/>
+  <key for="node" id="d5" yfiles.type="nodegraphics"/>
+  <key for="graphml" id="d6" yfiles.type="resources"/>
+  <key attr.name="url" attr.type="string" for="edge" id="d7"/>
+  <key attr.name="description" attr.type="string" for="edge" id="d8"/>
+  <key for="edge" id="d9" yfiles.type="edgegraphics"/>
+  <graph edgedefault="directed" id="G">
+    <node id="n0" yfiles.foldertype="group">
+      <data key="d5">
+        <y:ProxyAutoBoundsNode>
+          <y:Realizers active="0">
+            <y:GroupNode>
+              <y:Geometry height="1363.1006892613002" width="1281.5149459838867" x="-54.51494598388672" y="-1363.1006892613002"/>
+              <y:Fill color="#F5F5F5" transparent="false"/>
+              <y:BorderStyle color="#F5F5F5" type="dashed" width="1.0"/>
+              <y:NodeLabel alignment="right" autoSizePolicy="content" backgroundColor="#EBEBEB" borderDistance="0.0" fontFamily="Dialog" fontSize="10" fontStyle="plain" hasLineColor="false" height="17.61998748779297" horizontalTextPosition="center" iconTextGap="4" modelName="sandwich" modelPosition="n" textColor="#000000" verticalTextPosition="bottom" visible="true" width="6.67999267578125" x="637.4174766540527" xml:space="preserve" y="-17.61998748779297">.</y:NodeLabel>
+              <y:Shape type="roundrectangle"/>
+              <y:State closed="false" closedHeight="80.0" closedWidth="100.0" innerGraphDisplayEnabled="false"/>
+              <y:Insets bottom="15" bottomF="15.0" left="15" leftF="15.0" right="15" rightF="15.0" top="15" topF="15.0"/>
+              <y:BorderInsets bottom="0" bottomF="0.0" left="0" leftF="0.0" right="0" rightF="0.0" top="0" topF="0.0"/>
+            </y:GroupNode>
+            <y:GroupNode>
+              <y:Geometry height="12.0" width="20.0" x="0.0" y="0.0"/>
+              <y:Fill color="#F5F5F5" transparent="false"/>
+              <y:BorderStyle color="#000000" type="dashed" width="1.0"/>
+              <y:NodeLabel alignment="right" autoSizePolicy="content" backgroundColor="#EBEBEB" borderDistance="0.0" fontFamily="Dialog" fontSize="10" fontStyle="plain" hasLineColor="false" hasText="false" height="4.0" horizontalTextPosition="center" iconTextGap="4" modelName="sandwich" modelPosition="n" textColor="#000000" verticalTextPosition="bottom" visible="true" width="4.0" x="8.0" y="-4.0"/>
+              <y:Shape type="roundrectangle"/>
+              <y:State closed="true" closedHeight="12.0" closedWidth="20.0" innerGraphDisplayEnabled="false"/>
+              <y:Insets bottom="15" bottomF="15.0" left="15" leftF="15.0" right="15" rightF="15.0" top="15" topF="15.0"/>
+              <y:BorderInsets bottom="54" bottomF="54.0" left="0" leftF="0.0" right="23" rightF="23.35" top="0" topF="0.0"/>
+            </y:GroupNode>
+          </y:Realizers>
+        </y:ProxyAutoBoundsNode>
+      </data>
+      <graph edgedefault="directed" id="n0:">
+        <node id="n0::n0" yfiles.foldertype="group">
+          <data key="d5">
+            <y:ProxyAutoBoundsNode>
+              <y:Realizers active="0">
+                <y:GroupNode>
+                  <y:Geometry height="119.24047619047633" width="100.0" x="-15.0" y="-1196.8607142857145"/>
+                  <y:Fill color="#F5F5F5" transparent="false"/>
+                  <y:BorderStyle color="#F5F5F5" type="dashed" width="1.0"/>
+                  <y:NodeLabel alignment="right" autoSizePolicy="content" backgroundColor="#EBEBEB" borderDistance="0.0" fontFamily="Dialog" fontSize="10" fontStyle="plain" hasLineColor="false" height="17.61998748779297" horizontalTextPosition="center" iconTextGap="4" modelName="sandwich" modelPosition="n" textColor="#000000" verticalTextPosition="bottom" visible="true" width="40.21998596191406" x="29.89000701904297" xml:space="preserve" y="-17.61998748779297">bin_dev</y:NodeLabel>
+                  <y:Shape type="roundrectangle"/>
+                  <y:State closed="false" closedHeight="80.0" closedWidth="100.0" innerGraphDisplayEnabled="false"/>
+                  <y:Insets bottom="15" bottomF="15.0" left="15" leftF="15.0" right="15" rightF="15.0" top="15" topF="15.0"/>
+                  <y:BorderInsets bottom="0" bottomF="0.0" left="0" leftF="0.0" right="0" rightF="0.0" top="0" topF="2.506074454231566E-4"/>
+                </y:GroupNode>
+                <y:GroupNode>
+                  <y:Geometry height="12.0" width="80.0" x="0.0" y="0.0"/>
+                  <y:Fill color="#F5F5F5" transparent="false"/>
+                  <y:BorderStyle color="#000000" type="dashed" width="1.0"/>
+                  <y:NodeLabel alignment="right" autoSizePolicy="content" backgroundColor="#EBEBEB" borderDistance="0.0" fontFamily="Dialog" fontSize="10" fontStyle="plain" hasLineColor="false" hasText="false" height="4.0" horizontalTextPosition="center" iconTextGap="4" modelName="sandwich" modelPosition="n" textColor="#000000" verticalTextPosition="bottom" visible="true" width="4.0" x="38.0" y="-4.0"/>
+                  <y:Shape type="roundrectangle"/>
+                  <y:State closed="true" closedHeight="12.0" closedWidth="80.0" innerGraphDisplayEnabled="false"/>
+                  <y:Insets bottom="15" bottomF="15.0" left="15" leftF="15.0" right="15" rightF="15.0" top="15" topF="15.0"/>
+                  <y:BorderInsets bottom="54" bottomF="54.0" left="0" leftF="0.0" right="23" rightF="23.35" top="0" topF="0.0"/>
+                </y:GroupNode>
+              </y:Realizers>
+            </y:ProxyAutoBoundsNode>
+          </data>
+          <graph edgedefault="directed" id="n0::n0:">
+            <node id="n0::n0::n0" yfiles.foldertype="group">
+              <data key="d5">
+                <y:ProxyAutoBoundsNode>
+                  <y:Realizers active="0">
+                    <y:GroupNode>
+                      <y:Geometry height="12.0" width="70.0" x="0.0" y="-1164.240476190476"/>
+                      <y:Fill color="#F5F5F5" transparent="false"/>
+                      <y:BorderStyle color="#F5F5F5" type="dashed" width="1.0"/>
+                      <y:NodeLabel alignment="right" autoSizePolicy="content" backgroundColor="#EBEBEB" borderDistance="0.0" fontFamily="Dialog" fontSize="10" fontStyle="plain" hasLineColor="false" height="17.61998748779297" horizontalTextPosition="center" iconTextGap="4" modelName="sandwich" modelPosition="n" textColor="#000000" verticalTextPosition="bottom" visible="true" width="29.0" x="20.5" xml:space="preserve" y="-17.61998748779297">static</y:NodeLabel>
+                      <y:Shape type="roundrectangle"/>
+                      <y:State closed="false" closedHeight="80.0" closedWidth="100.0" innerGraphDisplayEnabled="false"/>
+                      <y:Insets bottom="15" bottomF="15.0" left="15" leftF="15.0" right="15" rightF="15.0" top="15" topF="15.0"/>
+                      <y:BorderInsets bottom="54" bottomF="54.0" left="0" leftF="0.0" right="23" rightF="23.35" top="0" topF="0.0"/>
+                    </y:GroupNode>
+                    <y:GroupNode>
+                      <y:Geometry height="12.0" width="70.0" x="0.0" y="0.0"/>
+                      <y:Fill color="#F5F5F5" transparent="false"/>
+                      <y:BorderStyle color="#000000" type="dashed" width="1.0"/>
+                      <y:NodeLabel alignment="right" autoSizePolicy="content" backgroundColor="#EBEBEB" borderDistance="0.0" fontFamily="Dialog" fontSize="10" fontStyle="plain" hasLineColor="false" hasText="false" height="4.0" horizontalTextPosition="center" iconTextGap="4" modelName="sandwich" modelPosition="n" textColor="#000000" verticalTextPosition="bottom" visible="true" width="4.0" x="33.0" y="-4.0"/>
+                      <y:Shape type="roundrectangle"/>
+                      <y:State closed="true" closedHeight="12.0" closedWidth="70.0" innerGraphDisplayEnabled="false"/>
+                      <y:Insets bottom="15" bottomF="15.0" left="15" leftF="15.0" right="15" rightF="15.0" top="15" topF="15.0"/>
+                      <y:BorderInsets bottom="54" bottomF="54.0" left="0" leftF="0.0" right="23" rightF="23.35" top="0" topF="0.0"/>
+                    </y:GroupNode>
+                  </y:Realizers>
+                </y:ProxyAutoBoundsNode>
+              </data>
+              <graph edgedefault="directed" id="n0::n0::n0:"/>
+            </node>
+            <node id="n0::n0::n1" yfiles.foldertype="group">
+              <data key="d5">
+                <y:ProxyAutoBoundsNode>
+                  <y:Realizers active="0">
+                    <y:GroupNode>
+                      <y:Geometry height="12.0" width="60.0" x="5.0" y="-1104.6202380952382"/>
+                      <y:Fill color="#F5F5F5" transparent="false"/>
+                      <y:BorderStyle color="#F5F5F5" type="dashed" width="1.0"/>
+                      <y:NodeLabel alignment="right" autoSizePolicy="content" backgroundColor="#EBEBEB" borderDistance="0.0" fontFamily="Dialog" fontSize="10" fontStyle="plain" hasLineColor="false" height="17.61998748779297" horizontalTextPosition="center" iconTextGap="4" modelName="sandwich" modelPosition="n" textColor="#000000" verticalTextPosition="bottom" visible="true" width="28.219970703125" x="15.8900146484375" xml:space="preserve" y="-17.61998748779297">store</y:NodeLabel>
+                      <y:Shape type="roundrectangle"/>
+                      <y:State closed="false" closedHeight="80.0" closedWidth="100.0" innerGraphDisplayEnabled="false"/>
+                      <y:Insets bottom="15" bottomF="15.0" left="15" leftF="15.0" right="15" rightF="15.0" top="15" topF="15.0"/>
+                      <y:BorderInsets bottom="54" bottomF="54.0" left="0" leftF="0.0" right="23" rightF="23.35" top="0" topF="0.0"/>
+                    </y:GroupNode>
+                    <y:GroupNode>
+                      <y:Geometry height="12.0" width="60.0" x="0.0" y="0.0"/>
+                      <y:Fill color="#F5F5F5" transparent="false"/>
+                      <y:BorderStyle color="#000000" type="dashed" width="1.0"/>
+                      <y:NodeLabel alignment="right" autoSizePolicy="content" backgroundColor="#EBEBEB" borderDistance="0.0" fontFamily="Dialog" fontSize="10" fontStyle="plain" hasLineColor="false" hasText="false" height="4.0" horizontalTextPosition="center" iconTextGap="4" modelName="sandwich" modelPosition="n" textColor="#000000" verticalTextPosition="bottom" visible="true" width="4.0" x="28.0" y="-4.0"/>
+                      <y:Shape type="roundrectangle"/>
+                      <y:State closed="true" closedHeight="12.0" closedWidth="60.0" innerGraphDisplayEnabled="false"/>
+                      <y:Insets bottom="15" bottomF="15.0" left="15" leftF="15.0" right="15" rightF="15.0" top="15" topF="15.0"/>
+                      <y:BorderInsets bottom="54" bottomF="54.0" left="0" leftF="0.0" right="23" rightF="23.35" top="0" topF="0.0"/>
+                    </y:GroupNode>
+                  </y:Realizers>
+                </y:ProxyAutoBoundsNode>
+              </data>
+              <graph edgedefault="directed" id="n0::n0::n1:"/>
+            </node>
+          </graph>
+        </node>
+        <node id="n0::n1" yfiles.foldertype="group">
+          <data key="d5">
+            <y:ProxyAutoBoundsNode>
+              <y:Realizers active="0">
+                <y:GroupNode>
+                  <y:Geometry height="103.61998748779297" width="149.02989196777344" x="-39.51494598388672" y="-1330.4807017735072"/>
+                  <y:Fill color="#F5F5F5" transparent="false"/>
+                  <y:BorderStyle color="#F5F5F5" type="dashed" width="1.0"/>
+                  <y:NodeLabel alignment="right" autoSizePolicy="content" backgroundColor="#EBEBEB" borderDistance="0.0" fontFamily="Dialog" fontSize="10" fontStyle="plain" hasLineColor="false" height="17.61998748779297" horizontalTextPosition="center" iconTextGap="4" modelName="sandwich" modelPosition="n" textColor="#000000" verticalTextPosition="bottom" visible="true" width="24.29998779296875" x="62.364952087402344" xml:space="preserve" y="-17.61998748779297">cmd</y:NodeLabel>
+                  <y:Shape type="roundrectangle"/>
+                  <y:State closed="false" closedHeight="80.0" closedWidth="100.0" innerGraphDisplayEnabled="false"/>
+                  <y:Insets bottom="15" bottomF="15.0" left="15" leftF="15.0" right="15" rightF="15.0" top="15" topF="15.0"/>
+                  <y:BorderInsets bottom="0" bottomF="0.0" left="0" leftF="0.0" right="0" rightF="0.0" top="0" topF="0.0"/>
+                </y:GroupNode>
+                <y:GroupNode>
+                  <y:Geometry height="12.0" width="40.0" x="0.0" y="0.0"/>
+                  <y:Fill color="#F5F5F5" transparent="false"/>
+                  <y:BorderStyle color="#000000" type="dashed" width="1.0"/>
+                  <y:NodeLabel alignment="right" autoSizePolicy="content" backgroundColor="#EBEBEB" borderDistance="0.0" fontFamily="Dialog" fontSize="10" fontStyle="plain" hasLineColor="false" hasText="false" height="4.0" horizontalTextPosition="center" iconTextGap="4" modelName="sandwich" modelPosition="n" textColor="#000000" verticalTextPosition="bottom" visible="true" width="4.0" x="18.0" y="-4.0"/>
+                  <y:Shape type="roundrectangle"/>
+                  <y:State closed="true" closedHeight="12.0" closedWidth="40.0" innerGraphDisplayEnabled="false"/>
+                  <y:Insets bottom="15" bottomF="15.0" left="15" leftF="15.0" right="15" rightF="15.0" top="15" topF="15.0"/>
+                  <y:BorderInsets bottom="54" bottomF="54.0" left="0" leftF="0.0" right="23" rightF="23.35" top="0" topF="0.0"/>
+                </y:GroupNode>
+              </y:Realizers>
+            </y:ProxyAutoBoundsNode>
+          </data>
+          <graph edgedefault="directed" id="n0::n1:">
+            <node id="n0::n1::n0" yfiles.foldertype="group">
+              <data key="d5">
+                <y:ProxyAutoBoundsNode>
+                  <y:Realizers active="0">
+                    <y:GroupNode>
+                      <y:Geometry height="56.0" width="94.0" x="-12.0" y="-1297.8607142857143"/>
+                      <y:Fill color="#F5F5F5" transparent="false"/>
+                      <y:BorderStyle color="#F5F5F5" type="dashed" width="1.0"/>
+                      <y:NodeLabel alignment="right" autoSizePolicy="content" backgroundColor="#EBEBEB" borderDistance="0.0" fontFamily="Dialog" fontSize="10" fontStyle="plain" hasLineColor="false" height="17.61998748779297" horizontalTextPosition="center" iconTextGap="4" modelName="sandwich" modelPosition="n" textColor="#000000" verticalTextPosition="bottom" visible="true" width="119.02989196777344" x="-12.514945983886719" xml:space="preserve" y="-17.61998748779297">gostore (2 func, 37 lines)</y:NodeLabel>
+                      <y:Shape type="roundrectangle"/>
+                      <y:State closed="false" closedHeight="80.0" closedWidth="100.0" innerGraphDisplayEnabled="false"/>
+                      <y:Insets bottom="15" bottomF="15.0" left="15" leftF="15.0" right="15" rightF="15.0" top="15" topF="15.0"/>
+                      <y:BorderInsets bottom="0" bottomF="0.0" left="0" leftF="0.0" right="0" rightF="0.0" top="0" topF="0.0"/>
+                    </y:GroupNode>
+                    <y:GroupNode>
+                      <y:Geometry height="12.0" width="270.0" x="0.0" y="0.0"/>
+                      <y:Fill color="#F5F5F5" transparent="false"/>
+                      <y:BorderStyle color="#000000" type="dashed" width="1.0"/>
+                      <y:NodeLabel alignment="right" autoSizePolicy="content" backgroundColor="#EBEBEB" borderDistance="0.0" fontFamily="Dialog" fontSize="10" fontStyle="plain" hasLineColor="false" hasText="false" height="4.0" horizontalTextPosition="center" iconTextGap="4" modelName="sandwich" modelPosition="n" textColor="#000000" verticalTextPosition="bottom" visible="true" width="4.0" x="133.0" y="-4.0"/>
+                      <y:Shape type="roundrectangle"/>
+                      <y:State closed="true" closedHeight="12.0" closedWidth="270.0" innerGraphDisplayEnabled="false"/>
+                      <y:Insets bottom="15" bottomF="15.0" left="15" leftF="15.0" right="15" rightF="15.0" top="15" topF="15.0"/>
+                      <y:BorderInsets bottom="54" bottomF="54.0" left="0" leftF="0.0" right="23" rightF="23.35" top="0" topF="0.0"/>
+                    </y:GroupNode>
+                  </y:Realizers>
+                </y:ProxyAutoBoundsNode>
+              </data>
+              <graph edgedefault="directed" id="n0::n1::n0:">
+                <node id="n0::n1::n0::n0">
+                  <data key="d5">
+                    <y:ShapeNode>
+                      <y:Geometry height="26.0" width="64.0" x="3.0" y="-1282.8607142857143"/>
+                      <y:Fill color="#FFFFFF" transparent="false"/>
+                      <y:BorderStyle color="#000000" type="line" width="1.0"/>
+                      <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="16" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="25.792043685913086" horizontalTextPosition="center" iconTextGap="4" modelName="internal" modelPosition="c" textColor="#000000" verticalTextPosition="bottom" visible="true" width="41.95207214355469" x="11.023963928222656" xml:space="preserve" y="0.10397815704345703">main</y:NodeLabel>
+                      <y:Shape type="rectangle"/>
+                    </y:ShapeNode>
+                  </data>
+                </node>
+              </graph>
+            </node>
+          </graph>
+        </node>
+        <node id="n0::n2" yfiles.foldertype="group">
+          <data key="d5">
+            <y:ProxyAutoBoundsNode>
+              <y:Realizers active="0">
+                <y:GroupNode>
+                  <y:Geometry height="114.61998748779297" width="164.0" x="117.0" y="-129.61998748779297"/>
+                  <y:Fill color="#F5F5F5" transparent="false"/>
+                  <y:BorderStyle color="#F5F5F5" type="dashed" width="1.0"/>
+                  <y:NodeLabel alignment="right" autoSizePolicy="content" backgroundColor="#EBEBEB" borderDistance="0.0" fontFamily="Dialog" fontSize="10" fontStyle="plain" hasLineColor="false" height="17.61998748779297" horizontalTextPosition="center" iconTextGap="4" modelName="sandwich" modelPosition="n" textColor="#000000" verticalTextPosition="bottom" visible="true" width="40.509979248046875" x="61.74501037597656" xml:space="preserve" y="-17.61998748779297">internal</y:NodeLabel>
+                  <y:Shape type="roundrectangle"/>
+                  <y:State closed="false" closedHeight="80.0" closedWidth="100.0" innerGraphDisplayEnabled="false"/>
+                  <y:Insets bottom="15" bottomF="15.0" left="15" leftF="15.0" right="15" rightF="15.0" top="15" topF="15.0"/>
+                  <y:BorderInsets bottom="0" bottomF="0.0" left="0" leftF="0.0" right="0" rightF="0.0" top="0" topF="0.0"/>
+                </y:GroupNode>
+                <y:GroupNode>
+                  <y:Geometry height="12.0" width="90.0" x="0.0" y="0.0"/>
+                  <y:Fill color="#F5F5F5" transparent="false"/>
+                  <y:BorderStyle color="#000000" type="dashed" width="1.0"/>
+                  <y:NodeLabel alignment="right" autoSizePolicy="content" backgroundColor="#EBEBEB" borderDistance="0.0" fontFamily="Dialog" fontSize="10" fontStyle="plain" hasLineColor="false" hasText="false" height="4.0" horizontalTextPosition="center" iconTextGap="4" modelName="sandwich" modelPosition="n" textColor="#000000" verticalTextPosition="bottom" visible="true" width="4.0" x="43.0" y="-4.0"/>
+                  <y:Shape type="roundrectangle"/>
+                  <y:State closed="true" closedHeight="12.0" closedWidth="90.0" innerGraphDisplayEnabled="false"/>
+                  <y:Insets bottom="15" bottomF="15.0" left="15" leftF="15.0" right="15" rightF="15.0" top="15" topF="15.0"/>
+                  <y:BorderInsets bottom="54" bottomF="54.0" left="0" leftF="0.0" right="23" rightF="23.35" top="0" topF="0.0"/>
+                </y:GroupNode>
+              </y:Realizers>
+            </y:ProxyAutoBoundsNode>
+          </data>
+          <graph edgedefault="directed" id="n0::n2:">
+            <node id="n0::n2::n0" yfiles.foldertype="group">
+              <data key="d5">
+                <y:ProxyAutoBoundsNode>
+                  <y:Realizers active="0">
+                    <y:GroupNode>
+                      <y:Geometry height="67.0" width="134.0" x="132.0" y="-97.0"/>
+                      <y:Fill color="#F5F5F5" transparent="false"/>
+                      <y:BorderStyle color="#F5F5F5" type="dashed" width="1.0"/>
+                      <y:NodeLabel alignment="right" autoSizePolicy="content" backgroundColor="#EBEBEB" borderDistance="0.0" fontFamily="Dialog" fontSize="10" fontStyle="plain" hasLineColor="false" height="17.61998748779297" horizontalTextPosition="center" iconTextGap="4" modelName="sandwich" modelPosition="n" textColor="#000000" verticalTextPosition="bottom" visible="true" width="115.26992797851562" x="9.365036010742188" xml:space="preserve" y="-17.61998748779297">service (7 func, 84 lines)</y:NodeLabel>
+                      <y:Shape type="roundrectangle"/>
+                      <y:State closed="false" closedHeight="80.0" closedWidth="100.0" innerGraphDisplayEnabled="false"/>
+                      <y:Insets bottom="15" bottomF="15.0" left="15" leftF="15.0" right="15" rightF="15.0" top="15" topF="15.0"/>
+                      <y:BorderInsets bottom="11" bottomF="11.0" left="16" leftF="16.0" right="0" rightF="0.0" top="0" topF="0.0"/>
+                    </y:GroupNode>
+                    <y:GroupNode>
+                      <y:Geometry height="12.0" width="270.0" x="0.0" y="0.0"/>
+                      <y:Fill color="#F5F5F5" transparent="false"/>
+                      <y:BorderStyle color="#000000" type="dashed" width="1.0"/>
+                      <y:NodeLabel alignment="right" autoSizePolicy="content" backgroundColor="#EBEBEB" borderDistance="0.0" fontFamily="Dialog" fontSize="10" fontStyle="plain" hasLineColor="false" hasText="false" height="4.0" horizontalTextPosition="center" iconTextGap="4" modelName="sandwich" modelPosition="n" textColor="#000000" verticalTextPosition="bottom" visible="true" width="4.0" x="133.0" y="-4.0"/>
+                      <y:Shape type="roundrectangle"/>
+                      <y:State closed="true" closedHeight="12.0" closedWidth="270.0" innerGraphDisplayEnabled="false"/>
+                      <y:Insets bottom="15" bottomF="15.0" left="15" leftF="15.0" right="15" rightF="15.0" top="15" topF="15.0"/>
+                      <y:BorderInsets bottom="54" bottomF="54.0" left="0" leftF="0.0" right="23" rightF="23.35" top="0" topF="0.0"/>
+                    </y:GroupNode>
+                  </y:Realizers>
+                </y:ProxyAutoBoundsNode>
+              </data>
+              <graph edgedefault="directed" id="n0::n2::n0:">
+                <node id="n0::n2::n0::n0">
+                  <data key="d5">
+                    <y:ShapeNode>
+                      <y:Geometry height="26.0" width="88.0" x="163.0" y="-82.0"/>
+                      <y:Fill color="#FFFFFF" transparent="false"/>
+                      <y:BorderStyle color="#000000" type="line" width="1.0"/>
+                      <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="16" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="25.792043685913086" horizontalTextPosition="center" iconTextGap="4" modelName="internal" modelPosition="c" textColor="#000000" verticalTextPosition="bottom" visible="true" width="56.25611877441406" x="15.871940612792969" xml:space="preserve" y="0.10397815704345703">service</y:NodeLabel>
+                      <y:Shape type="rectangle"/>
+                    </y:ShapeNode>
+                  </data>
+                </node>
+              </graph>
+            </node>
+          </graph>
+        </node>
+        <node id="n0::n3" yfiles.foldertype="group">
+          <data key="d5">
+            <y:ProxyAutoBoundsNode>
+              <y:Realizers active="0">
+                <y:GroupNode>
+                  <y:Geometry height="1160.480701773507" width="1067.0" x="145.0" y="-1302.480701773507"/>
+                  <y:Fill color="#F5F5F5" transparent="false"/>
+                  <y:BorderStyle color="#F5F5F5" type="dashed" width="1.0"/>
+                  <y:NodeLabel alignment="right" autoSizePolicy="content" backgroundColor="#EBEBEB" borderDistance="0.0" fontFamily="Dialog" fontSize="10" fontStyle="plain" hasLineColor="false" height="17.61998748779297" horizontalTextPosition="center" iconTextGap="4" modelName="sandwich" modelPosition="n" textColor="#000000" verticalTextPosition="bottom" visible="true" width="21.639984130859375" x="522.6800079345703" xml:space="preserve" y="-17.61998748779297">pkg</y:NodeLabel>
+                  <y:Shape type="roundrectangle"/>
+                  <y:State closed="false" closedHeight="80.0" closedWidth="100.0" innerGraphDisplayEnabled="false"/>
+                  <y:Insets bottom="15" bottomF="15.0" left="15" leftF="15.0" right="15" rightF="15.0" top="15" topF="15.0"/>
+                  <y:BorderInsets bottom="15" bottomF="15.0" left="0" leftF="0.0" right="0" rightF="0.0" top="51" topF="51.00025060744497"/>
+                </y:GroupNode>
+                <y:GroupNode>
+                  <y:Geometry height="12.0" width="40.0" x="0.0" y="0.0"/>
+                  <y:Fill color="#F5F5F5" transparent="false"/>
+                  <y:BorderStyle color="#000000" type="dashed" width="1.0"/>
+                  <y:NodeLabel alignment="right" autoSizePolicy="content" backgroundColor="#EBEBEB" borderDistance="0.0" fontFamily="Dialog" fontSize="10" fontStyle="plain" hasLineColor="false" hasText="false" height="4.0" horizontalTextPosition="center" iconTextGap="4" modelName="sandwich" modelPosition="n" textColor="#000000" verticalTextPosition="bottom" visible="true" width="4.0" x="18.0" y="-4.0"/>
+                  <y:Shape type="roundrectangle"/>
+                  <y:State closed="true" closedHeight="12.0" closedWidth="40.0" innerGraphDisplayEnabled="false"/>
+                  <y:Insets bottom="15" bottomF="15.0" left="15" leftF="15.0" right="15" rightF="15.0" top="15" topF="15.0"/>
+                  <y:BorderInsets bottom="54" bottomF="54.0" left="0" leftF="0.0" right="23" rightF="23.35" top="0" topF="0.0"/>
+                </y:GroupNode>
+              </y:Realizers>
+            </y:ProxyAutoBoundsNode>
+          </data>
+          <graph edgedefault="directed" id="n0::n3:">
+            <node id="n0::n3::n0" yfiles.foldertype="group">
+              <data key="d5">
+                <y:ProxyAutoBoundsNode>
+                  <y:Realizers active="0">
+                    <y:GroupNode>
+                      <y:Geometry height="67.0" width="182.0" x="636.0" y="-239.0"/>
+                      <y:Fill color="#F5F5F5" transparent="false"/>
+                      <y:BorderStyle color="#F5F5F5" type="dashed" width="1.0"/>
+                      <y:NodeLabel alignment="right" autoSizePolicy="content" backgroundColor="#EBEBEB" borderDistance="0.0" fontFamily="Dialog" fontSize="10" fontStyle="plain" hasLineColor="false" height="17.61998748779297" horizontalTextPosition="center" iconTextGap="4" modelName="sandwich" modelPosition="n" textColor="#000000" verticalTextPosition="bottom" visible="true" width="156.62989807128906" x="12.685050964355469" xml:space="preserve" y="-17.61998748779297">client_anonym (8 func, 216 lines)</y:NodeLabel>
+                      <y:Shape type="roundrectangle"/>
+                      <y:State closed="false" closedHeight="80.0" closedWidth="100.0" innerGraphDisplayEnabled="false"/>
+                      <y:Insets bottom="15" bottomF="15.0" left="15" leftF="15.0" right="15" rightF="15.0" top="15" topF="15.0"/>
+                      <y:BorderInsets bottom="11" bottomF="11.0" left="16" leftF="16.0" right="0" rightF="0.0" top="0" topF="0.0"/>
+                    </y:GroupNode>
+                    <y:GroupNode>
+                      <y:Geometry height="12.0" width="340.0" x="0.0" y="0.0"/>
+                      <y:Fill color="#F5F5F5" transparent="false"/>
+                      <y:BorderStyle color="#000000" type="dashed" width="1.0"/>
+                      <y:NodeLabel alignment="right" autoSizePolicy="content" backgroundColor="#EBEBEB" borderDistance="0.0" fontFamily="Dialog" fontSize="10" fontStyle="plain" hasLineColor="false" hasText="false" height="4.0" horizontalTextPosition="center" iconTextGap="4" modelName="sandwich" modelPosition="n" textColor="#000000" verticalTextPosition="bottom" visible="true" width="4.0" x="168.0" y="-4.0"/>
+                      <y:Shape type="roundrectangle"/>
+                      <y:State closed="true" closedHeight="12.0" closedWidth="340.0" innerGraphDisplayEnabled="false"/>
+                      <y:Insets bottom="15" bottomF="15.0" left="15" leftF="15.0" right="15" rightF="15.0" top="15" topF="15.0"/>
+                      <y:BorderInsets bottom="54" bottomF="54.0" left="0" leftF="0.0" right="23" rightF="23.35" top="0" topF="0.0"/>
+                    </y:GroupNode>
+                  </y:Realizers>
+                </y:ProxyAutoBoundsNode>
+              </data>
+              <graph edgedefault="directed" id="n0::n3::n0:">
+                <node id="n0::n3::n0::n0">
+                  <data key="d5">
+                    <y:ShapeNode>
+                      <y:Geometry height="26.0" width="136.0" x="667.0" y="-224.0"/>
+                      <y:Fill color="#FFFFFF" transparent="false"/>
+                      <y:BorderStyle color="#000000" type="line" width="1.0"/>
+                      <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="16" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="25.792043685913086" horizontalTextPosition="center" iconTextGap="4" modelName="internal" modelPosition="c" textColor="#000000" verticalTextPosition="bottom" visible="true" width="113.28022766113281" x="11.359886169433594" xml:space="preserve" y="0.10397815704345703">client_anonym</y:NodeLabel>
+                      <y:Shape type="rectangle"/>
+                    </y:ShapeNode>
+                  </data>
+                </node>
+              </graph>
+            </node>
+            <node id="n0::n3::n1" yfiles.foldertype="group">
+              <data key="d5">
+                <y:ProxyAutoBoundsNode>
+                  <y:Realizers active="0">
+                    <y:GroupNode>
+                      <y:Geometry height="323.86046367826907" width="865.0" x="160.0" y="-1218.860463678269"/>
+                      <y:Fill color="#F5F5F5" transparent="false"/>
+                      <y:BorderStyle color="#F5F5F5" type="dashed" width="1.0"/>
+                      <y:NodeLabel alignment="right" autoSizePolicy="content" backgroundColor="#EBEBEB" borderDistance="0.0" fontFamily="Dialog" fontSize="10" fontStyle="plain" hasLineColor="false" height="17.61998748779297" horizontalTextPosition="center" iconTextGap="4" modelName="sandwich" modelPosition="n" textColor="#000000" verticalTextPosition="bottom" visible="true" width="108.14991760253906" x="378.42504119873047" xml:space="preserve" y="-17.61998748779297">mock (1 func, 28 lines)</y:NodeLabel>
+                      <y:Shape type="roundrectangle"/>
+                      <y:State closed="false" closedHeight="80.0" closedWidth="100.0" innerGraphDisplayEnabled="false"/>
+                      <y:Insets bottom="15" bottomF="15.0" left="15" leftF="15.0" right="15" rightF="15.0" top="15" topF="15.0"/>
+                      <y:BorderInsets bottom="0" bottomF="0.0" left="0" leftF="0.0" right="0" rightF="0.0" top="0" topF="0.0"/>
+                    </y:GroupNode>
+                    <y:GroupNode>
+                      <y:Geometry height="12.0" width="240.0" x="0.0" y="0.0"/>
+                      <y:Fill color="#F5F5F5" transparent="false"/>
+                      <y:BorderStyle color="#000000" type="dashed" width="1.0"/>
+                      <y:NodeLabel alignment="right" autoSizePolicy="content" backgroundColor="#EBEBEB" borderDistance="0.0" fontFamily="Dialog" fontSize="10" fontStyle="plain" hasLineColor="false" hasText="false" height="4.0" horizontalTextPosition="center" iconTextGap="4" modelName="sandwich" modelPosition="n" textColor="#000000" verticalTextPosition="bottom" visible="true" width="4.0" x="118.0" y="-4.0"/>
+                      <y:Shape type="roundrectangle"/>
+                      <y:State closed="true" closedHeight="12.0" closedWidth="240.0" innerGraphDisplayEnabled="false"/>
+                      <y:Insets bottom="15" bottomF="15.0" left="15" leftF="15.0" right="15" rightF="15.0" top="15" topF="15.0"/>
+                      <y:BorderInsets bottom="54" bottomF="54.0" left="0" leftF="0.0" right="23" rightF="23.35" top="0" topF="0.0"/>
+                    </y:GroupNode>
+                  </y:Realizers>
+                </y:ProxyAutoBoundsNode>
+              </data>
+              <graph edgedefault="directed" id="n0::n3::n1:">
+                <node id="n0::n3::n1::n0">
+                  <data key="d5">
+                    <y:ShapeNode>
+                      <y:Geometry height="26.0" width="64.0" x="175.0" y="-1111.6202380952382"/>
+                      <y:Fill color="#FFFFFF" transparent="false"/>
+                      <y:BorderStyle color="#000000" type="line" width="1.0"/>
+                      <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="16" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="25.792043685913086" horizontalTextPosition="center" iconTextGap="4" modelName="internal" modelPosition="c" textColor="#000000" verticalTextPosition="bottom" visible="true" width="44.864105224609375" x="9.567947387695312" xml:space="preserve" y="0.10397815704345703">mock</y:NodeLabel>
+                      <y:Shape type="rectangle"/>
+                    </y:ShapeNode>
+                  </data>
+                </node>
+                <node id="n0::n3::n1::n1" yfiles.foldertype="group">
+                  <data key="d5">
+                    <y:ProxyAutoBoundsNode>
+                      <y:Realizers active="0">
+                        <y:GroupNode>
+                          <y:Geometry height="56.0" width="158.0" x="315.0" y="-1186.240476190476"/>
+                          <y:Fill color="#F5F5F5" transparent="false"/>
+                          <y:BorderStyle color="#F5F5F5" type="dashed" width="1.0"/>
+                          <y:NodeLabel alignment="right" autoSizePolicy="content" backgroundColor="#EBEBEB" borderDistance="0.0" fontFamily="Dialog" fontSize="10" fontStyle="plain" hasLineColor="false" height="17.61998748779297" horizontalTextPosition="center" iconTextGap="4" modelName="sandwich" modelPosition="n" textColor="#000000" verticalTextPosition="bottom" visible="true" width="145.24990844726562" x="6.3750457763671875" xml:space="preserve" y="-17.61998748779297">mock_service (7 func, 61 lines)</y:NodeLabel>
+                          <y:Shape type="roundrectangle"/>
+                          <y:State closed="false" closedHeight="80.0" closedWidth="100.0" innerGraphDisplayEnabled="false"/>
+                          <y:Insets bottom="15" bottomF="15.0" left="15" leftF="15.0" right="15" rightF="15.0" top="15" topF="15.0"/>
+                          <y:BorderInsets bottom="0" bottomF="0.0" left="0" leftF="0.0" right="0" rightF="0.0" top="0" topF="0.0"/>
+                        </y:GroupNode>
+                        <y:GroupNode>
+                          <y:Geometry height="12.0" width="320.0" x="0.0" y="0.0"/>
+                          <y:Fill color="#F5F5F5" transparent="false"/>
+                          <y:BorderStyle color="#000000" type="dashed" width="1.0"/>
+                          <y:NodeLabel alignment="right" autoSizePolicy="content" backgroundColor="#EBEBEB" borderDistance="0.0" fontFamily="Dialog" fontSize="10" fontStyle="plain" hasLineColor="false" hasText="false" height="4.0" horizontalTextPosition="center" iconTextGap="4" modelName="sandwich" modelPosition="n" textColor="#000000" verticalTextPosition="bottom" visible="true" width="4.0" x="158.0" y="-4.0"/>
+                          <y:Shape type="roundrectangle"/>
+                          <y:State closed="true" closedHeight="12.0" closedWidth="320.0" innerGraphDisplayEnabled="false"/>
+                          <y:Insets bottom="15" bottomF="15.0" left="15" leftF="15.0" right="15" rightF="15.0" top="15" topF="15.0"/>
+                          <y:BorderInsets bottom="54" bottomF="54.0" left="0" leftF="0.0" right="23" rightF="23.35" top="0" topF="0.0"/>
+                        </y:GroupNode>
+                      </y:Realizers>
+                    </y:ProxyAutoBoundsNode>
+                  </data>
+                  <graph edgedefault="directed" id="n0::n3::n1::n1:">
+                    <node id="n0::n3::n1::n1::n0">
+                      <data key="d5">
+                        <y:ShapeNode>
+                          <y:Geometry height="26.0" width="128.0" x="330.0" y="-1171.240476190476"/>
+                          <y:Fill color="#FFFFFF" transparent="false"/>
+                          <y:BorderStyle color="#000000" type="line" width="1.0"/>
+                          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="16" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="25.792043685913086" horizontalTextPosition="center" iconTextGap="4" modelName="internal" modelPosition="c" textColor="#000000" verticalTextPosition="bottom" visible="true" width="104.2242431640625" x="11.88787841796875" xml:space="preserve" y="0.10397815704345703">mock_service</y:NodeLabel>
+                          <y:Shape type="rectangle"/>
+                        </y:ShapeNode>
+                      </data>
+                    </node>
+                  </graph>
+                </node>
+                <node id="n0::n3::n1::n2" yfiles.foldertype="group">
+                  <data key="d5">
+                    <y:ProxyAutoBoundsNode>
+                      <y:Realizers active="0">
+                        <y:GroupNode>
+                          <y:Geometry height="56.0" width="142.0" x="868.0" y="-966.0"/>
+                          <y:Fill color="#F5F5F5" transparent="false"/>
+                          <y:BorderStyle color="#F5F5F5" type="dashed" width="1.0"/>
+                          <y:NodeLabel alignment="right" autoSizePolicy="content" backgroundColor="#EBEBEB" borderDistance="0.0" fontFamily="Dialog" fontSize="10" fontStyle="plain" hasLineColor="false" height="17.61998748779297" horizontalTextPosition="center" iconTextGap="4" modelName="sandwich" modelPosition="n" textColor="#000000" verticalTextPosition="bottom" visible="true" width="136.8098907470703" x="2.5950546264648438" xml:space="preserve" y="-17.61998748779297">mock_store (5 func, 79 lines)</y:NodeLabel>
+                          <y:Shape type="roundrectangle"/>
+                          <y:State closed="false" closedHeight="80.0" closedWidth="100.0" innerGraphDisplayEnabled="false"/>
+                          <y:Insets bottom="15" bottomF="15.0" left="15" leftF="15.0" right="15" rightF="15.0" top="15" topF="15.0"/>
+                          <y:BorderInsets bottom="0" bottomF="0.0" left="0" leftF="0.0" right="0" rightF="0.0" top="0" topF="0.0"/>
+                        </y:GroupNode>
+                        <y:GroupNode>
+                          <y:Geometry height="12.0" width="300.0" x="0.0" y="0.0"/>
+                          <y:Fill color="#F5F5F5" transparent="false"/>
+                          <y:BorderStyle color="#000000" type="dashed" width="1.0"/>
+                          <y:NodeLabel alignment="right" autoSizePolicy="content" backgroundColor="#EBEBEB" borderDistance="0.0" fontFamily="Dialog" fontSize="10" fontStyle="plain" hasLineColor="false" hasText="false" height="4.0" horizontalTextPosition="center" iconTextGap="4" modelName="sandwich" modelPosition="n" textColor="#000000" verticalTextPosition="bottom" visible="true" width="4.0" x="148.0" y="-4.0"/>
+                          <y:Shape type="roundrectangle"/>
+                          <y:State closed="true" closedHeight="12.0" closedWidth="300.0" innerGraphDisplayEnabled="false"/>
+                          <y:Insets bottom="15" bottomF="15.0" left="15" leftF="15.0" right="15" rightF="15.0" top="15" topF="15.0"/>
+                          <y:BorderInsets bottom="54" bottomF="54.0" left="0" leftF="0.0" right="23" rightF="23.35" top="0" topF="0.0"/>
+                        </y:GroupNode>
+                      </y:Realizers>
+                    </y:ProxyAutoBoundsNode>
+                  </data>
+                  <graph edgedefault="directed" id="n0::n3::n1::n2:">
+                    <node id="n0::n3::n1::n2::n0">
+                      <data key="d5">
+                        <y:ShapeNode>
+                          <y:Geometry height="26.0" width="112.0" x="883.0" y="-951.0"/>
+                          <y:Fill color="#FFFFFF" transparent="false"/>
+                          <y:BorderStyle color="#000000" type="line" width="1.0"/>
+                          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="16" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="25.792043685913086" horizontalTextPosition="center" iconTextGap="4" modelName="internal" modelPosition="c" textColor="#000000" verticalTextPosition="bottom" visible="true" width="90.72021484375" x="10.639892578125" xml:space="preserve" y="0.10397815704345703">mock_store</y:NodeLabel>
+                          <y:Shape type="rectangle"/>
+                        </y:ShapeNode>
+                      </data>
+                    </node>
+                  </graph>
+                </node>
+                <node id="n0::n3::n1::n3" yfiles.foldertype="group">
+                  <data key="d5">
+                    <y:ProxyAutoBoundsNode>
+                      <y:Realizers active="0">
+                        <y:GroupNode>
+                          <y:Geometry height="56.0" width="126.0" x="876.0" y="-1052.0"/>
+                          <y:Fill color="#F5F5F5" transparent="false"/>
+                          <y:BorderStyle color="#F5F5F5" type="dashed" width="1.0"/>
+                          <y:NodeLabel alignment="right" autoSizePolicy="content" backgroundColor="#EBEBEB" borderDistance="0.0" fontFamily="Dialog" fontSize="10" fontStyle="plain" hasLineColor="false" height="17.61998748779297" horizontalTextPosition="center" iconTextGap="4" modelName="sandwich" modelPosition="n" textColor="#000000" verticalTextPosition="bottom" visible="true" width="132.23989868164062" x="-3.1199493408203125" xml:space="preserve" y="-17.61998748779297">mock_web (4 func, 43 lines)</y:NodeLabel>
+                          <y:Shape type="roundrectangle"/>
+                          <y:State closed="false" closedHeight="80.0" closedWidth="100.0" innerGraphDisplayEnabled="false"/>
+                          <y:Insets bottom="15" bottomF="15.0" left="15" leftF="15.0" right="15" rightF="15.0" top="15" topF="15.0"/>
+                          <y:BorderInsets bottom="0" bottomF="0.0" left="0" leftF="0.0" right="0" rightF="0.0" top="0" topF="0.0"/>
+                        </y:GroupNode>
+                        <y:GroupNode>
+                          <y:Geometry height="12.0" width="280.0" x="0.0" y="0.0"/>
+                          <y:Fill color="#F5F5F5" transparent="false"/>
+                          <y:BorderStyle color="#000000" type="dashed" width="1.0"/>
+                          <y:NodeLabel alignment="right" autoSizePolicy="content" backgroundColor="#EBEBEB" borderDistance="0.0" fontFamily="Dialog" fontSize="10" fontStyle="plain" hasLineColor="false" hasText="false" height="4.0" horizontalTextPosition="center" iconTextGap="4" modelName="sandwich" modelPosition="n" textColor="#000000" verticalTextPosition="bottom" visible="true" width="4.0" x="138.0" y="-4.0"/>
+                          <y:Shape type="roundrectangle"/>
+                          <y:State closed="true" closedHeight="12.0" closedWidth="280.0" innerGraphDisplayEnabled="false"/>
+                          <y:Insets bottom="15" bottomF="15.0" left="15" leftF="15.0" right="15" rightF="15.0" top="15" topF="15.0"/>
+                          <y:BorderInsets bottom="54" bottomF="54.0" left="0" leftF="0.0" right="23" rightF="23.35" top="0" topF="0.0"/>
+                        </y:GroupNode>
+                      </y:Realizers>
+                    </y:ProxyAutoBoundsNode>
+                  </data>
+                  <graph edgedefault="directed" id="n0::n3::n1::n3:">
+                    <node id="n0::n3::n1::n3::n0">
+                      <data key="d5">
+                        <y:ShapeNode>
+                          <y:Geometry height="26.0" width="96.0" x="891.0" y="-1037.0"/>
+                          <y:Fill color="#FFFFFF" transparent="false"/>
+                          <y:BorderStyle color="#000000" type="line" width="1.0"/>
+                          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="16" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="25.792043685913086" horizontalTextPosition="center" iconTextGap="4" modelName="internal" modelPosition="c" textColor="#000000" verticalTextPosition="bottom" visible="true" width="83.40818786621094" x="6.295906066894531" xml:space="preserve" y="0.10397815704345703">mock_web</y:NodeLabel>
+                          <y:Shape type="rectangle"/>
+                        </y:ShapeNode>
+                      </data>
+                    </node>
+                  </graph>
+                </node>
+              </graph>
+            </node>
+            <node id="n0::n3::n2" yfiles.foldertype="group">
+              <data key="d5">
+                <y:ProxyAutoBoundsNode>
+                  <y:Realizers active="0">
+                    <y:GroupNode>
+                      <y:Geometry height="56.0" width="118.0" x="880.0" y="-336.0"/>
+                      <y:Fill color="#F5F5F5" transparent="false"/>
+                      <y:BorderStyle color="#F5F5F5" type="dashed" width="1.0"/>
+                      <y:NodeLabel alignment="right" autoSizePolicy="content" backgroundColor="#EBEBEB" borderDistance="0.0" fontFamily="Dialog" fontSize="10" fontStyle="plain" hasLineColor="false" height="17.61998748779297" horizontalTextPosition="center" iconTextGap="4" modelName="sandwich" modelPosition="n" textColor="#000000" verticalTextPosition="bottom" visible="true" width="122.76991271972656" x="-2.3849563598632812" xml:space="preserve" y="-17.61998748779297">msg_net (5 func, 56 lines)</y:NodeLabel>
+                      <y:Shape type="roundrectangle"/>
+                      <y:State closed="false" closedHeight="80.0" closedWidth="100.0" innerGraphDisplayEnabled="false"/>
+                      <y:Insets bottom="15" bottomF="15.0" left="15" leftF="15.0" right="15" rightF="15.0" top="15" topF="15.0"/>
+                      <y:BorderInsets bottom="0" bottomF="0.0" left="0" leftF="0.0" right="0" rightF="0.0" top="0" topF="0.0"/>
+                    </y:GroupNode>
+                    <y:GroupNode>
+                      <y:Geometry height="12.0" width="270.0" x="0.0" y="0.0"/>
+                      <y:Fill color="#F5F5F5" transparent="false"/>
+                      <y:BorderStyle color="#000000" type="dashed" width="1.0"/>
+                      <y:NodeLabel alignment="right" autoSizePolicy="content" backgroundColor="#EBEBEB" borderDistance="0.0" fontFamily="Dialog" fontSize="10" fontStyle="plain" hasLineColor="false" hasText="false" height="4.0" horizontalTextPosition="center" iconTextGap="4" modelName="sandwich" modelPosition="n" textColor="#000000" verticalTextPosition="bottom" visible="true" width="4.0" x="133.0" y="-4.0"/>
+                      <y:Shape type="roundrectangle"/>
+                      <y:State closed="true" closedHeight="12.0" closedWidth="270.0" innerGraphDisplayEnabled="false"/>
+                      <y:Insets bottom="15" bottomF="15.0" left="15" leftF="15.0" right="15" rightF="15.0" top="15" topF="15.0"/>
+                      <y:BorderInsets bottom="54" bottomF="54.0" left="0" leftF="0.0" right="23" rightF="23.35" top="0" topF="0.0"/>
+                    </y:GroupNode>
+                  </y:Realizers>
+                </y:ProxyAutoBoundsNode>
+              </data>
+              <graph edgedefault="directed" id="n0::n3::n2:">
+                <node id="n0::n3::n2::n0">
+                  <data key="d5">
+                    <y:ShapeNode>
+                      <y:Geometry height="26.0" width="88.0" x="895.0" y="-321.0"/>
+                      <y:Fill color="#FFFFFF" transparent="false"/>
+                      <y:BorderStyle color="#000000" type="line" width="1.0"/>
+                      <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="16" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="25.792043685913086" horizontalTextPosition="center" iconTextGap="4" modelName="internal" modelPosition="c" textColor="#000000" verticalTextPosition="bottom" visible="true" width="68.25614929199219" x="9.871925354003906" xml:space="preserve" y="0.10397815704345703">msg_net</y:NodeLabel>
+                      <y:Shape type="rectangle"/>
+                    </y:ShapeNode>
+                  </data>
+                </node>
+              </graph>
+            </node>
+            <node id="n0::n3::n3" yfiles.foldertype="group">
+              <data key="d5">
+                <y:ProxyAutoBoundsNode>
+                  <y:Realizers active="0">
+                    <y:GroupNode>
+                      <y:Geometry height="534.2399749755859" width="529.0" x="311.0" y="-803.2399749755859"/>
+                      <y:Fill color="#F5F5F5" transparent="false"/>
+                      <y:BorderStyle color="#F5F5F5" type="dashed" width="1.0"/>
+                      <y:NodeLabel alignment="right" autoSizePolicy="content" backgroundColor="#EBEBEB" borderDistance="0.0" fontFamily="Dialog" fontSize="10" fontStyle="plain" hasLineColor="false" height="17.61998748779297" horizontalTextPosition="center" iconTextGap="4" modelName="sandwich" modelPosition="n" textColor="#000000" verticalTextPosition="bottom" visible="true" width="131.9599151611328" x="198.5200424194336" xml:space="preserve" y="-17.61998748779297">serv_http (6 func, 174 lines)</y:NodeLabel>
+                      <y:Shape type="roundrectangle"/>
+                      <y:State closed="false" closedHeight="80.0" closedWidth="100.0" innerGraphDisplayEnabled="false"/>
+                      <y:Insets bottom="15" bottomF="15.0" left="15" leftF="15.0" right="15" rightF="15.0" top="15" topF="15.0"/>
+                      <y:BorderInsets bottom="11" bottomF="11.0" left="16" leftF="16.0" right="0" rightF="0.0" top="0" topF="0.0"/>
+                    </y:GroupNode>
+                    <y:GroupNode>
+                      <y:Geometry height="12.0" width="300.0" x="0.0" y="0.0"/>
+                      <y:Fill color="#F5F5F5" transparent="false"/>
+                      <y:BorderStyle color="#000000" type="dashed" width="1.0"/>
+                      <y:NodeLabel alignment="right" autoSizePolicy="content" backgroundColor="#EBEBEB" borderDistance="0.0" fontFamily="Dialog" fontSize="10" fontStyle="plain" hasLineColor="false" hasText="false" height="4.0" horizontalTextPosition="center" iconTextGap="4" modelName="sandwich" modelPosition="n" textColor="#000000" verticalTextPosition="bottom" visible="true" width="4.0" x="148.0" y="-4.0"/>
+                      <y:Shape type="roundrectangle"/>
+                      <y:State closed="true" closedHeight="12.0" closedWidth="300.0" innerGraphDisplayEnabled="false"/>
+                      <y:Insets bottom="15" bottomF="15.0" left="15" leftF="15.0" right="15" rightF="15.0" top="15" topF="15.0"/>
+                      <y:BorderInsets bottom="54" bottomF="54.0" left="0" leftF="0.0" right="23" rightF="23.35" top="0" topF="0.0"/>
+                    </y:GroupNode>
+                  </y:Realizers>
+                </y:ProxyAutoBoundsNode>
+              </data>
+              <graph edgedefault="directed" id="n0::n3::n3:">
+                <node id="n0::n3::n3::n0">
+                  <data key="d5">
+                    <y:ShapeNode>
+                      <y:Geometry height="26.0" width="104.0" x="342.0" y="-321.0"/>
+                      <y:Fill color="#FFFFFF" transparent="false"/>
+                      <y:BorderStyle color="#000000" type="line" width="1.0"/>
+                      <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="16" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="25.792043685913086" horizontalTextPosition="center" iconTextGap="4" modelName="internal" modelPosition="c" textColor="#000000" verticalTextPosition="bottom" visible="true" width="73.80816650390625" x="15.095916748046875" xml:space="preserve" y="0.10397815704345703">serv_http</y:NodeLabel>
+                      <y:Shape type="rectangle"/>
+                    </y:ShapeNode>
+                  </data>
+                </node>
+                <node id="n0::n3::n3::n1" yfiles.foldertype="group">
+                  <data key="d5">
+                    <y:ProxyAutoBoundsNode>
+                      <y:Realizers active="0">
+                        <y:GroupNode>
+                          <y:Geometry height="447.61998748779297" width="352.0" x="473.0" y="-770.619987487793"/>
+                          <y:Fill color="#F5F5F5" transparent="false"/>
+                          <y:BorderStyle color="#F5F5F5" type="dashed" width="1.0"/>
+                          <y:NodeLabel alignment="right" autoSizePolicy="content" backgroundColor="#EBEBEB" borderDistance="0.0" fontFamily="Dialog" fontSize="10" fontStyle="plain" hasLineColor="false" height="17.61998748779297" horizontalTextPosition="center" iconTextGap="4" modelName="sandwich" modelPosition="n" textColor="#000000" verticalTextPosition="bottom" visible="true" width="155.25985717773438" x="98.37007141113281" xml:space="preserve" y="-17.61998748779297">router_anonym (3 func, 76 lines)</y:NodeLabel>
+                          <y:Shape type="roundrectangle"/>
+                          <y:State closed="false" closedHeight="80.0" closedWidth="100.0" innerGraphDisplayEnabled="false"/>
+                          <y:Insets bottom="15" bottomF="15.0" left="15" leftF="15.0" right="15" rightF="15.0" top="15" topF="15.0"/>
+                          <y:BorderInsets bottom="0" bottomF="0.0" left="0" leftF="0.0" right="0" rightF="0.0" top="0" topF="0.0"/>
+                        </y:GroupNode>
+                        <y:GroupNode>
+                          <y:Geometry height="12.0" width="330.0" x="0.0" y="0.0"/>
+                          <y:Fill color="#F5F5F5" transparent="false"/>
+                          <y:BorderStyle color="#000000" type="dashed" width="1.0"/>
+                          <y:NodeLabel alignment="right" autoSizePolicy="content" backgroundColor="#EBEBEB" borderDistance="0.0" fontFamily="Dialog" fontSize="10" fontStyle="plain" hasLineColor="false" hasText="false" height="4.0" horizontalTextPosition="center" iconTextGap="4" modelName="sandwich" modelPosition="n" textColor="#000000" verticalTextPosition="bottom" visible="true" width="4.0" x="163.0" y="-4.0"/>
+                          <y:Shape type="roundrectangle"/>
+                          <y:State closed="true" closedHeight="12.0" closedWidth="330.0" innerGraphDisplayEnabled="false"/>
+                          <y:Insets bottom="15" bottomF="15.0" left="15" leftF="15.0" right="15" rightF="15.0" top="15" topF="15.0"/>
+                          <y:BorderInsets bottom="54" bottomF="54.0" left="0" leftF="0.0" right="23" rightF="23.35" top="0" topF="0.0"/>
+                        </y:GroupNode>
+                      </y:Realizers>
+                    </y:ProxyAutoBoundsNode>
+                  </data>
+                  <graph edgedefault="directed" id="n0::n3::n3::n1:">
+                    <node id="n0::n3::n3::n1::n0">
+                      <data key="d5">
+                        <y:ShapeNode>
+                          <y:Geometry height="26.0" width="136.0" x="488.0" y="-508.0"/>
+                          <y:Fill color="#FFFFFF" transparent="false"/>
+                          <y:BorderStyle color="#000000" type="line" width="1.0"/>
+                          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="16" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="25.792043685913086" horizontalTextPosition="center" iconTextGap="4" modelName="internal" modelPosition="c" textColor="#000000" verticalTextPosition="bottom" visible="true" width="120.24024963378906" x="7.879875183105469" xml:space="preserve" y="0.10397815704345703">router_anonym</y:NodeLabel>
+                          <y:Shape type="rectangle"/>
+                        </y:ShapeNode>
+                      </data>
+                    </node>
+                    <node id="n0::n3::n3::n1::n1" yfiles.foldertype="group">
+                      <data key="d5">
+                        <y:ProxyAutoBoundsNode>
+                          <y:Realizers active="0">
+                            <y:GroupNode>
+                              <y:Geometry height="56.0" width="142.0" x="664.0" y="-566.0"/>
+                              <y:Fill color="#F5F5F5" transparent="false"/>
+                              <y:BorderStyle color="#F5F5F5" type="dashed" width="1.0"/>
+                              <y:NodeLabel alignment="right" autoSizePolicy="content" backgroundColor="#EBEBEB" borderDistance="0.0" fontFamily="Dialog" fontSize="10" fontStyle="plain" hasLineColor="false" height="17.61998748779297" horizontalTextPosition="center" iconTextGap="4" modelName="sandwich" modelPosition="n" textColor="#000000" verticalTextPosition="bottom" visible="true" width="139.889892578125" x="1.0550537109375" xml:space="preserve" y="-17.61998748779297">anonym_del (4 func, 84 lines)</y:NodeLabel>
+                              <y:Shape type="roundrectangle"/>
+                              <y:State closed="false" closedHeight="80.0" closedWidth="100.0" innerGraphDisplayEnabled="false"/>
+                              <y:Insets bottom="15" bottomF="15.0" left="15" leftF="15.0" right="15" rightF="15.0" top="15" topF="15.0"/>
+                              <y:BorderInsets bottom="0" bottomF="0.0" left="0" leftF="0.0" right="0" rightF="0.0" top="0" topF="0.0"/>
+                            </y:GroupNode>
+                            <y:GroupNode>
+                              <y:Geometry height="12.0" width="300.0" x="0.0" y="0.0"/>
+                              <y:Fill color="#F5F5F5" transparent="false"/>
+                              <y:BorderStyle color="#000000" type="dashed" width="1.0"/>
+                              <y:NodeLabel alignment="right" autoSizePolicy="content" backgroundColor="#EBEBEB" borderDistance="0.0" fontFamily="Dialog" fontSize="10" fontStyle="plain" hasLineColor="false" hasText="false" height="4.0" horizontalTextPosition="center" iconTextGap="4" modelName="sandwich" modelPosition="n" textColor="#000000" verticalTextPosition="bottom" visible="true" width="4.0" x="148.0" y="-4.0"/>
+                              <y:Shape type="roundrectangle"/>
+                              <y:State closed="true" closedHeight="12.0" closedWidth="300.0" innerGraphDisplayEnabled="false"/>
+                              <y:Insets bottom="15" bottomF="15.0" left="15" leftF="15.0" right="15" rightF="15.0" top="15" topF="15.0"/>
+                              <y:BorderInsets bottom="54" bottomF="54.0" left="0" leftF="0.0" right="23" rightF="23.35" top="0" topF="0.0"/>
+                            </y:GroupNode>
+                          </y:Realizers>
+                        </y:ProxyAutoBoundsNode>
+                      </data>
+                      <graph edgedefault="directed" id="n0::n3::n3::n1::n1:">
+                        <node id="n0::n3::n3::n1::n1::n0">
+                          <data key="d5">
+                            <y:ShapeNode>
+                              <y:Geometry height="26.0" width="112.0" x="679.0" y="-551.0"/>
+                              <y:Fill color="#FFFFFF" transparent="false"/>
+                              <y:BorderStyle color="#000000" type="line" width="1.0"/>
+                              <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="16" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="25.792043685913086" horizontalTextPosition="center" iconTextGap="4" modelName="internal" modelPosition="c" textColor="#000000" verticalTextPosition="bottom" visible="true" width="95.648193359375" x="8.1759033203125" xml:space="preserve" y="0.10397815704345703">anonym_del</y:NodeLabel>
+                              <y:Shape type="rectangle"/>
+                            </y:ShapeNode>
+                          </data>
+                        </node>
+                      </graph>
+                    </node>
+                    <node id="n0::n3::n3::n1::n2" yfiles.foldertype="group">
+                      <data key="d5">
+                        <y:ProxyAutoBoundsNode>
+                          <y:Realizers active="0">
+                            <y:GroupNode>
+                              <y:Geometry height="56.0" width="150.0" x="660.0" y="-394.0"/>
+                              <y:Fill color="#F5F5F5" transparent="false"/>
+                              <y:BorderStyle color="#F5F5F5" type="dashed" width="1.0"/>
+                              <y:NodeLabel alignment="right" autoSizePolicy="content" backgroundColor="#EBEBEB" borderDistance="0.0" fontFamily="Dialog" fontSize="10" fontStyle="plain" hasLineColor="false" height="17.61998748779297" horizontalTextPosition="center" iconTextGap="4" modelName="sandwich" modelPosition="n" textColor="#000000" verticalTextPosition="bottom" visible="true" width="143.86988830566406" x="3.0650558471679688" xml:space="preserve" y="-17.61998748779297">anonym_find (4 func, 87 lines)</y:NodeLabel>
+                              <y:Shape type="roundrectangle"/>
+                              <y:State closed="false" closedHeight="80.0" closedWidth="100.0" innerGraphDisplayEnabled="false"/>
+                              <y:Insets bottom="15" bottomF="15.0" left="15" leftF="15.0" right="15" rightF="15.0" top="15" topF="15.0"/>
+                              <y:BorderInsets bottom="0" bottomF="0.0" left="0" leftF="0.0" right="0" rightF="0.0" top="0" topF="0.0"/>
+                            </y:GroupNode>
+                            <y:GroupNode>
+                              <y:Geometry height="12.0" width="310.0" x="0.0" y="0.0"/>
+                              <y:Fill color="#F5F5F5" transparent="false"/>
+                              <y:BorderStyle color="#000000" type="dashed" width="1.0"/>
+                              <y:NodeLabel alignment="right" autoSizePolicy="content" backgroundColor="#EBEBEB" borderDistance="0.0" fontFamily="Dialog" fontSize="10" fontStyle="plain" hasLineColor="false" hasText="false" height="4.0" horizontalTextPosition="center" iconTextGap="4" modelName="sandwich" modelPosition="n" textColor="#000000" verticalTextPosition="bottom" visible="true" width="4.0" x="153.0" y="-4.0"/>
+                              <y:Shape type="roundrectangle"/>
+                              <y:State closed="true" closedHeight="12.0" closedWidth="310.0" innerGraphDisplayEnabled="false"/>
+                              <y:Insets bottom="15" bottomF="15.0" left="15" leftF="15.0" right="15" rightF="15.0" top="15" topF="15.0"/>
+                              <y:BorderInsets bottom="54" bottomF="54.0" left="0" leftF="0.0" right="23" rightF="23.35" top="0" topF="0.0"/>
+                            </y:GroupNode>
+                          </y:Realizers>
+                        </y:ProxyAutoBoundsNode>
+                      </data>
+                      <graph edgedefault="directed" id="n0::n3::n3::n1::n2:">
+                        <node id="n0::n3::n3::n1::n2::n0">
+                          <data key="d5">
+                            <y:ShapeNode>
+                              <y:Geometry height="26.0" width="120.0" x="675.0" y="-379.0"/>
+                              <y:Fill color="#FFFFFF" transparent="false"/>
+                              <y:BorderStyle color="#000000" type="line" width="1.0"/>
+                              <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="16" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="25.792043685913086" horizontalTextPosition="center" iconTextGap="4" modelName="internal" modelPosition="c" textColor="#000000" verticalTextPosition="bottom" visible="true" width="102.01620483398438" x="8.991897583007812" xml:space="preserve" y="0.10397815704345703">anonym_find</y:NodeLabel>
+                              <y:Shape type="rectangle"/>
+                            </y:ShapeNode>
+                          </data>
+                        </node>
+                      </graph>
+                    </node>
+                    <node id="n0::n3::n3::n1::n3" yfiles.foldertype="group">
+                      <data key="d5">
+                        <y:ProxyAutoBoundsNode>
+                          <y:Realizers active="0">
+                            <y:GroupNode>
+                              <y:Geometry height="56.0" width="150.0" x="660.0" y="-480.0"/>
+                              <y:Fill color="#F5F5F5" transparent="false"/>
+                              <y:BorderStyle color="#F5F5F5" type="dashed" width="1.0"/>
+                              <y:NodeLabel alignment="right" autoSizePolicy="content" backgroundColor="#EBEBEB" borderDistance="0.0" fontFamily="Dialog" fontSize="10" fontStyle="plain" hasLineColor="false" height="17.61998748779297" horizontalTextPosition="center" iconTextGap="4" modelName="sandwich" modelPosition="n" textColor="#000000" verticalTextPosition="bottom" visible="true" width="144.79989624023438" x="2.6000518798828125" xml:space="preserve" y="-17.61998748779297">anonym_list (3 func, 102 lines)</y:NodeLabel>
+                              <y:Shape type="roundrectangle"/>
+                              <y:State closed="false" closedHeight="80.0" closedWidth="100.0" innerGraphDisplayEnabled="false"/>
+                              <y:Insets bottom="15" bottomF="15.0" left="15" leftF="15.0" right="15" rightF="15.0" top="15" topF="15.0"/>
+                              <y:BorderInsets bottom="0" bottomF="0.0" left="0" leftF="0.0" right="0" rightF="0.0" top="0" topF="0.0"/>
+                            </y:GroupNode>
+                            <y:GroupNode>
+                              <y:Geometry height="12.0" width="320.0" x="0.0" y="0.0"/>
+                              <y:Fill color="#F5F5F5" transparent="false"/>
+                              <y:BorderStyle color="#000000" type="dashed" width="1.0"/>
+                              <y:NodeLabel alignment="right" autoSizePolicy="content" backgroundColor="#EBEBEB" borderDistance="0.0" fontFamily="Dialog" fontSize="10" fontStyle="plain" hasLineColor="false" hasText="false" height="4.0" horizontalTextPosition="center" iconTextGap="4" modelName="sandwich" modelPosition="n" textColor="#000000" verticalTextPosition="bottom" visible="true" width="4.0" x="158.0" y="-4.0"/>
+                              <y:Shape type="roundrectangle"/>
+                              <y:State closed="true" closedHeight="12.0" closedWidth="320.0" innerGraphDisplayEnabled="false"/>
+                              <y:Insets bottom="15" bottomF="15.0" left="15" leftF="15.0" right="15" rightF="15.0" top="15" topF="15.0"/>
+                              <y:BorderInsets bottom="54" bottomF="54.0" left="0" leftF="0.0" right="23" rightF="23.35" top="0" topF="0.0"/>
+                            </y:GroupNode>
+                          </y:Realizers>
+                        </y:ProxyAutoBoundsNode>
+                      </data>
+                      <graph edgedefault="directed" id="n0::n3::n3::n1::n3:">
+                        <node id="n0::n3::n3::n1::n3::n0">
+                          <data key="d5">
+                            <y:ShapeNode>
+                              <y:Geometry height="26.0" width="120.0" x="675.0" y="-465.0"/>
+                              <y:Fill color="#FFFFFF" transparent="false"/>
+                              <y:BorderStyle color="#000000" type="line" width="1.0"/>
+                              <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="16" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="25.792043685913086" horizontalTextPosition="center" iconTextGap="4" modelName="internal" modelPosition="c" textColor="#000000" verticalTextPosition="bottom" visible="true" width="94.35218811035156" x="12.823905944824219" xml:space="preserve" y="0.10397815704345703">anonym_list</y:NodeLabel>
+                              <y:Shape type="rectangle"/>
+                            </y:ShapeNode>
+                          </data>
+                        </node>
+                      </graph>
+                    </node>
+                    <node id="n0::n3::n3::n1::n4" yfiles.foldertype="group">
+                      <data key="d5">
+                        <y:ProxyAutoBoundsNode>
+                          <y:Realizers active="0">
+                            <y:GroupNode>
+                              <y:Geometry height="56.0" width="142.0" x="664.0" y="-738.0"/>
+                              <y:Fill color="#F5F5F5" transparent="false"/>
+                              <y:BorderStyle color="#F5F5F5" type="dashed" width="1.0"/>
+                              <y:NodeLabel alignment="right" autoSizePolicy="content" backgroundColor="#EBEBEB" borderDistance="0.0" fontFamily="Dialog" fontSize="10" fontStyle="plain" hasLineColor="false" height="17.61998748779297" horizontalTextPosition="center" iconTextGap="4" modelName="sandwich" modelPosition="n" textColor="#000000" verticalTextPosition="bottom" visible="true" width="141.4598846435547" x="0.27005767822265625" xml:space="preserve" y="-17.61998748779297">anonym_put (4 func, 87 lines)</y:NodeLabel>
+                              <y:Shape type="roundrectangle"/>
+                              <y:State closed="false" closedHeight="80.0" closedWidth="100.0" innerGraphDisplayEnabled="false"/>
+                              <y:Insets bottom="15" bottomF="15.0" left="15" leftF="15.0" right="15" rightF="15.0" top="15" topF="15.0"/>
+                              <y:BorderInsets bottom="0" bottomF="0.0" left="0" leftF="0.0" right="0" rightF="0.0" top="0" topF="0.0"/>
+                            </y:GroupNode>
+                            <y:GroupNode>
+                              <y:Geometry height="12.0" width="300.0" x="0.0" y="0.0"/>
+                              <y:Fill color="#F5F5F5" transparent="false"/>
+                              <y:BorderStyle color="#000000" type="dashed" width="1.0"/>
+                              <y:NodeLabel alignment="right" autoSizePolicy="content" backgroundColor="#EBEBEB" borderDistance="0.0" fontFamily="Dialog" fontSize="10" fontStyle="plain" hasLineColor="false" hasText="false" height="4.0" horizontalTextPosition="center" iconTextGap="4" modelName="sandwich" modelPosition="n" textColor="#000000" verticalTextPosition="bottom" visible="true" width="4.0" x="148.0" y="-4.0"/>
+                              <y:Shape type="roundrectangle"/>
+                              <y:State closed="true" closedHeight="12.0" closedWidth="300.0" innerGraphDisplayEnabled="false"/>
+                              <y:Insets bottom="15" bottomF="15.0" left="15" leftF="15.0" right="15" rightF="15.0" top="15" topF="15.0"/>
+                              <y:BorderInsets bottom="54" bottomF="54.0" left="0" leftF="0.0" right="23" rightF="23.35" top="0" topF="0.0"/>
+                            </y:GroupNode>
+                          </y:Realizers>
+                        </y:ProxyAutoBoundsNode>
+                      </data>
+                      <graph edgedefault="directed" id="n0::n3::n3::n1::n4:">
+                        <node id="n0::n3::n3::n1::n4::n0">
+                          <data key="d5">
+                            <y:ShapeNode>
+                              <y:Geometry height="26.0" width="112.0" x="679.0" y="-723.0"/>
+                              <y:Fill color="#FFFFFF" transparent="false"/>
+                              <y:BorderStyle color="#000000" type="line" width="1.0"/>
+                              <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="16" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="25.792043685913086" horizontalTextPosition="center" iconTextGap="4" modelName="internal" modelPosition="c" textColor="#000000" verticalTextPosition="bottom" visible="true" width="98.16020202636719" x="6.919898986816406" xml:space="preserve" y="0.10397815704345703">anonym_put</y:NodeLabel>
+                              <y:Shape type="rectangle"/>
+                            </y:ShapeNode>
+                          </data>
+                        </node>
+                      </graph>
+                    </node>
+                    <node id="n0::n3::n3::n1::n5" yfiles.foldertype="group">
+                      <data key="d5">
+                        <y:ProxyAutoBoundsNode>
+                          <y:Realizers active="0">
+                            <y:GroupNode>
+                              <y:Geometry height="56.0" width="150.0" x="660.0" y="-652.0"/>
+                              <y:Fill color="#F5F5F5" transparent="false"/>
+                              <y:BorderStyle color="#F5F5F5" type="dashed" width="1.0"/>
+                              <y:NodeLabel alignment="right" autoSizePolicy="content" backgroundColor="#EBEBEB" borderDistance="0.0" fontFamily="Dialog" fontSize="10" fontStyle="plain" hasLineColor="false" height="17.61998748779297" horizontalTextPosition="center" iconTextGap="4" modelName="sandwich" modelPosition="n" textColor="#000000" verticalTextPosition="bottom" visible="true" width="147.0498809814453" x="1.4750595092773438" xml:space="preserve" y="-17.61998748779297">anonym_read (4 func, 88 lines)</y:NodeLabel>
+                              <y:Shape type="roundrectangle"/>
+                              <y:State closed="false" closedHeight="80.0" closedWidth="100.0" innerGraphDisplayEnabled="false"/>
+                              <y:Insets bottom="15" bottomF="15.0" left="15" leftF="15.0" right="15" rightF="15.0" top="15" topF="15.0"/>
+                              <y:BorderInsets bottom="0" bottomF="0.0" left="0" leftF="0.0" right="0" rightF="0.0" top="0" topF="0.0"/>
+                            </y:GroupNode>
+                            <y:GroupNode>
+                              <y:Geometry height="12.0" width="310.0" x="0.0" y="0.0"/>
+                              <y:Fill color="#F5F5F5" transparent="false"/>
+                              <y:BorderStyle color="#000000" type="dashed" width="1.0"/>
+                              <y:NodeLabel alignment="right" autoSizePolicy="content" backgroundColor="#EBEBEB" borderDistance="0.0" fontFamily="Dialog" fontSize="10" fontStyle="plain" hasLineColor="false" hasText="false" height="4.0" horizontalTextPosition="center" iconTextGap="4" modelName="sandwich" modelPosition="n" textColor="#000000" verticalTextPosition="bottom" visible="true" width="4.0" x="153.0" y="-4.0"/>
+                              <y:Shape type="roundrectangle"/>
+                              <y:State closed="true" closedHeight="12.0" closedWidth="310.0" innerGraphDisplayEnabled="false"/>
+                              <y:Insets bottom="15" bottomF="15.0" left="15" leftF="15.0" right="15" rightF="15.0" top="15" topF="15.0"/>
+                              <y:BorderInsets bottom="54" bottomF="54.0" left="0" leftF="0.0" right="23" rightF="23.35" top="0" topF="0.0"/>
+                            </y:GroupNode>
+                          </y:Realizers>
+                        </y:ProxyAutoBoundsNode>
+                      </data>
+                      <graph edgedefault="directed" id="n0::n3::n3::n1::n5:">
+                        <node id="n0::n3::n3::n1::n5::n0">
+                          <data key="d5">
+                            <y:ShapeNode>
+                              <y:Geometry height="26.0" width="120.0" x="675.0" y="-637.0"/>
+                              <y:Fill color="#FFFFFF" transparent="false"/>
+                              <y:BorderStyle color="#000000" type="line" width="1.0"/>
+                              <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="16" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="25.792043685913086" horizontalTextPosition="center" iconTextGap="4" modelName="internal" modelPosition="c" textColor="#000000" verticalTextPosition="bottom" visible="true" width="107.10421752929688" x="6.4478912353515625" xml:space="preserve" y="0.10397815704345703">anonym_read</y:NodeLabel>
+                              <y:Shape type="rectangle"/>
+                            </y:ShapeNode>
+                          </data>
+                        </node>
+                      </graph>
+                    </node>
+                  </graph>
+                </node>
+              </graph>
+            </node>
+            <node id="n0::n3::n4" yfiles.foldertype="group">
+              <data key="d5">
+                <y:ProxyAutoBoundsNode>
+                  <y:Realizers active="0">
+                    <y:GroupNode>
+                      <y:Geometry height="67.0" width="118.0" x="327.0" y="-865.0"/>
+                      <y:Fill color="#F5F5F5" transparent="false"/>
+                      <y:BorderStyle color="#F5F5F5" type="dashed" width="1.0"/>
+                      <y:NodeLabel alignment="right" autoSizePolicy="content" backgroundColor="#EBEBEB" borderDistance="0.0" fontFamily="Dialog" fontSize="10" fontStyle="plain" hasLineColor="false" height="17.61998748779297" horizontalTextPosition="center" iconTextGap="4" modelName="sandwich" modelPosition="n" textColor="#000000" verticalTextPosition="bottom" visible="true" width="112.54991149902344" x="2.7250442504882812" xml:space="preserve" y="-17.61998748779297">store (7 func, 135 lines)</y:NodeLabel>
+                      <y:Shape type="roundrectangle"/>
+                      <y:State closed="false" closedHeight="80.0" closedWidth="100.0" innerGraphDisplayEnabled="false"/>
+                      <y:Insets bottom="15" bottomF="15.0" left="15" leftF="15.0" right="15" rightF="15.0" top="15" topF="15.0"/>
+                      <y:BorderInsets bottom="11" bottomF="11.0" left="16" leftF="16.0" right="0" rightF="0.0" top="0" topF="0.0"/>
+                    </y:GroupNode>
+                    <y:GroupNode>
+                      <y:Geometry height="12.0" width="260.0" x="0.0" y="0.0"/>
+                      <y:Fill color="#F5F5F5" transparent="false"/>
+                      <y:BorderStyle color="#000000" type="dashed" width="1.0"/>
+                      <y:NodeLabel alignment="right" autoSizePolicy="content" backgroundColor="#EBEBEB" borderDistance="0.0" fontFamily="Dialog" fontSize="10" fontStyle="plain" hasLineColor="false" hasText="false" height="4.0" horizontalTextPosition="center" iconTextGap="4" modelName="sandwich" modelPosition="n" textColor="#000000" verticalTextPosition="bottom" visible="true" width="4.0" x="128.0" y="-4.0"/>
+                      <y:Shape type="roundrectangle"/>
+                      <y:State closed="true" closedHeight="12.0" closedWidth="260.0" innerGraphDisplayEnabled="false"/>
+                      <y:Insets bottom="15" bottomF="15.0" left="15" leftF="15.0" right="15" rightF="15.0" top="15" topF="15.0"/>
+                      <y:BorderInsets bottom="54" bottomF="54.0" left="0" leftF="0.0" right="23" rightF="23.35" top="0" topF="0.0"/>
+                    </y:GroupNode>
+                  </y:Realizers>
+                </y:ProxyAutoBoundsNode>
+              </data>
+              <graph edgedefault="directed" id="n0::n3::n4:">
+                <node id="n0::n3::n4::n0">
+                  <data key="d5">
+                    <y:ShapeNode>
+                      <y:Geometry height="26.0" width="72.0" x="358.0" y="-850.0"/>
+                      <y:Fill color="#FFFFFF" transparent="false"/>
+                      <y:BorderStyle color="#000000" type="line" width="1.0"/>
+                      <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="16" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="25.792043685913086" horizontalTextPosition="center" iconTextGap="4" modelName="internal" modelPosition="c" textColor="#000000" verticalTextPosition="bottom" visible="true" width="42.75209045410156" x="14.623954772949219" xml:space="preserve" y="0.10397815704345703">store</y:NodeLabel>
+                      <y:Shape type="rectangle"/>
+                    </y:ShapeNode>
+                  </data>
+                </node>
+              </graph>
+            </node>
+            <node id="n0::n3::n5" yfiles.foldertype="group">
+              <data key="d5">
+                <y:ProxyAutoBoundsNode>
+                  <y:Realizers active="0">
+                    <y:GroupNode>
+                      <y:Geometry height="56.0" width="102.0" x="1095.0" y="-652.0"/>
+                      <y:Fill color="#F5F5F5" transparent="false"/>
+                      <y:BorderStyle color="#F5F5F5" type="dashed" width="1.0"/>
+                      <y:NodeLabel alignment="right" autoSizePolicy="content" backgroundColor="#EBEBEB" borderDistance="0.0" fontFamily="Dialog" fontSize="10" fontStyle="plain" hasLineColor="false" height="17.61998748779297" horizontalTextPosition="center" iconTextGap="4" modelName="sandwich" modelPosition="n" textColor="#000000" verticalTextPosition="bottom" visible="true" width="73.699951171875" x="14.1500244140625" xml:space="preserve" y="-17.61998748779297">types (63 lines)</y:NodeLabel>
+                      <y:Shape type="roundrectangle"/>
+                      <y:State closed="false" closedHeight="80.0" closedWidth="100.0" innerGraphDisplayEnabled="false"/>
+                      <y:Insets bottom="15" bottomF="15.0" left="15" leftF="15.0" right="15" rightF="15.0" top="15" topF="15.0"/>
+                      <y:BorderInsets bottom="0" bottomF="0.0" left="0" leftF="0.0" right="0" rightF="0.0" top="0" topF="0.0"/>
+                    </y:GroupNode>
+                    <y:GroupNode>
+                      <y:Geometry height="12.0" width="170.0" x="0.0" y="0.0"/>
+                      <y:Fill color="#F5F5F5" transparent="false"/>
+                      <y:BorderStyle color="#000000" type="dashed" width="1.0"/>
+                      <y:NodeLabel alignment="right" autoSizePolicy="content" backgroundColor="#EBEBEB" borderDistance="0.0" fontFamily="Dialog" fontSize="10" fontStyle="plain" hasLineColor="false" hasText="false" height="4.0" horizontalTextPosition="center" iconTextGap="4" modelName="sandwich" modelPosition="n" textColor="#000000" verticalTextPosition="bottom" visible="true" width="4.0" x="83.0" y="-4.0"/>
+                      <y:Shape type="roundrectangle"/>
+                      <y:State closed="true" closedHeight="12.0" closedWidth="170.0" innerGraphDisplayEnabled="false"/>
+                      <y:Insets bottom="15" bottomF="15.0" left="15" leftF="15.0" right="15" rightF="15.0" top="15" topF="15.0"/>
+                      <y:BorderInsets bottom="54" bottomF="54.0" left="0" leftF="0.0" right="23" rightF="23.35" top="0" topF="0.0"/>
+                    </y:GroupNode>
+                  </y:Realizers>
+                </y:ProxyAutoBoundsNode>
+              </data>
+              <graph edgedefault="directed" id="n0::n3::n5:">
+                <node id="n0::n3::n5::n0">
+                  <data key="d5">
+                    <y:ShapeNode>
+                      <y:Geometry height="26.0" width="72.0" x="1110.0" y="-637.0"/>
+                      <y:Fill color="#FFFFFF" transparent="false"/>
+                      <y:BorderStyle color="#000000" type="line" width="1.0"/>
+                      <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="16" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="25.792043685913086" horizontalTextPosition="center" iconTextGap="4" modelName="internal" modelPosition="c" textColor="#000000" verticalTextPosition="bottom" visible="true" width="44.46409606933594" x="13.767951965332031" xml:space="preserve" y="0.10397815704345703">types</y:NodeLabel>
+                      <y:Shape type="rectangle"/>
+                    </y:ShapeNode>
+                  </data>
+                </node>
+              </graph>
+            </node>
+          </graph>
+        </node>
+        <node id="n0::n4" yfiles.foldertype="group">
+          <data key="d5">
+            <y:ProxyAutoBoundsNode>
+              <y:Realizers active="0">
+                <y:GroupNode>
+                  <y:Geometry height="12.0" width="70.0" x="0.0" y="-1030.0"/>
+                  <y:Fill color="#F5F5F5" transparent="false"/>
+                  <y:BorderStyle color="#F5F5F5" type="dashed" width="1.0"/>
+                  <y:NodeLabel alignment="right" autoSizePolicy="content" backgroundColor="#EBEBEB" borderDistance="0.0" fontFamily="Dialog" fontSize="10" fontStyle="plain" hasLineColor="false" height="17.61998748779297" horizontalTextPosition="center" iconTextGap="4" modelName="sandwich" modelPosition="n" textColor="#000000" verticalTextPosition="bottom" visible="true" width="29.0" x="20.5" xml:space="preserve" y="-17.61998748779297">static</y:NodeLabel>
+                  <y:Shape type="roundrectangle"/>
+                  <y:State closed="false" closedHeight="80.0" closedWidth="100.0" innerGraphDisplayEnabled="false"/>
+                  <y:Insets bottom="15" bottomF="15.0" left="15" leftF="15.0" right="15" rightF="15.0" top="15" topF="15.0"/>
+                  <y:BorderInsets bottom="54" bottomF="54.0" left="0" leftF="0.0" right="23" rightF="23.35" top="0" topF="0.0"/>
+                </y:GroupNode>
+                <y:GroupNode>
+                  <y:Geometry height="12.0" width="70.0" x="0.0" y="0.0"/>
+                  <y:Fill color="#F5F5F5" transparent="false"/>
+                  <y:BorderStyle color="#000000" type="dashed" width="1.0"/>
+                  <y:NodeLabel alignment="right" autoSizePolicy="content" backgroundColor="#EBEBEB" borderDistance="0.0" fontFamily="Dialog" fontSize="10" fontStyle="plain" hasLineColor="false" hasText="false" height="4.0" horizontalTextPosition="center" iconTextGap="4" modelName="sandwich" modelPosition="n" textColor="#000000" verticalTextPosition="bottom" visible="true" width="4.0" x="33.0" y="-4.0"/>
+                  <y:Shape type="roundrectangle"/>
+                  <y:State closed="true" closedHeight="12.0" closedWidth="70.0" innerGraphDisplayEnabled="false"/>
+                  <y:Insets bottom="15" bottomF="15.0" left="15" leftF="15.0" right="15" rightF="15.0" top="15" topF="15.0"/>
+                  <y:BorderInsets bottom="54" bottomF="54.0" left="0" leftF="0.0" right="23" rightF="23.35" top="0" topF="0.0"/>
+                </y:GroupNode>
+              </y:Realizers>
+            </y:ProxyAutoBoundsNode>
+          </data>
+          <graph edgedefault="directed" id="n0::n4:"/>
+        </node>
+      </graph>
+    </node>
+    <edge id="n0::n3::e0" source="n0::n3::n3::n1::n5::n0" target="n0::n3::n5::n0">
+      <data key="d8" xml:space="preserve"><![CDATA[anonym_read -> types]]></data>
+      <data key="d9">
+        <y:PolyLineEdge>
+          <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/>
+          <y:LineStyle color="#000000" type="dashed" width="1.0"/>
+          <y:Arrows source="none" target="standard"/>
+          <y:EdgeLabel alignment="center" bottomInset="0" configuration="AutoFlippingLabel" distance="0.0" fontFamily="Dialog" fontSize="8" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="21.791717529296875" horizontalTextPosition="center" iconTextGap="4" leftInset="0" modelName="centered" modelPosition="center" preferredPlacement="anywhere" ratio="0.5" rightInset="0" textColor="#000000" topInset="0" verticalTextPosition="bottom" visible="true" width="24.95965576171875" x="145.02017211914062" xml:space="preserve" y="-10.895858764648438">
+            <y:PreferredPlacementDescriptor angle="0.0" angleOffsetOnRightSide="0" angleReference="absolute" angleRotationOnRightSide="co" distance="-1.0" frozen="true" placement="anywhere" side="anywhere" sideReference="relative_to_edge_flow"/></y:EdgeLabel>
+          <y:BendStyle smoothed="false"/>
+        </y:PolyLineEdge>
+      </data>
+    </edge>
+    <edge id="n0::n3::e1" source="n0::n3::n1::n1::n0" target="n0::n3::n5::n0">
+      <data key="d8" xml:space="preserve"><![CDATA[mock_service -> types]]></data>
+      <data key="d9">
+        <y:PolyLineEdge>
+          <y:Path sx="0.0" sy="0.0" tx="0.0" ty="-9.176470588235247">
+            <y:Point x="1075.0" y="-1158.240476190476"/>
+            <y:Point x="1075.0" y="-633.1764705882352"/>
+          </y:Path>
+          <y:LineStyle color="#000000" type="dashed" width="1.0"/>
+          <y:Arrows source="none" target="standard"/>
+          <y:EdgeLabel alignment="center" bottomInset="0" configuration="AutoFlippingLabel" distance="0.0" fontFamily="Dialog" fontSize="8" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="21.791717529296875" horizontalTextPosition="center" iconTextGap="4" leftInset="0" modelName="centered" modelPosition="center" preferredPlacement="anywhere" ratio="0.5" rightInset="0" textColor="#000000" topInset="0" verticalTextPosition="bottom" visible="true" width="24.95965576171875" x="300.5826721191406" xml:space="preserve" y="-10.89585643949954">
+            <y:PreferredPlacementDescriptor angle="0.0" angleOffsetOnRightSide="0" angleReference="absolute" angleRotationOnRightSide="co" distance="-1.0" frozen="true" placement="anywhere" side="anywhere" sideReference="relative_to_edge_flow"/></y:EdgeLabel>
+          <y:BendStyle smoothed="false"/>
+        </y:PolyLineEdge>
+      </data>
+    </edge>
+    <edge id="n0::n3::e2" source="n0::n3::n3::n1::n0" target="n0::n3::n5::n0">
+      <data key="d8" xml:space="preserve"><![CDATA[router_anonym -> types]]></data>
+      <data key="d9">
+        <y:PolyLineEdge>
+          <y:Path sx="0.0" sy="0.0" tx="0.0" ty="3.058823529411711">
+            <y:Point x="959.0" y="-495.0"/>
+            <y:Point x="959.0" y="-620.9411764705883"/>
+          </y:Path>
+          <y:LineStyle color="#000000" type="dashed" width="1.0"/>
+          <y:Arrows source="none" target="standard"/>
+          <y:EdgeLabel alignment="center" bottomInset="0" configuration="AutoFlippingLabel" distance="0.0" fontFamily="Dialog" fontSize="8" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="21.791717529296875" horizontalTextPosition="center" iconTextGap="4" leftInset="0" modelName="centered" modelPosition="center" preferredPlacement="anywhere" ratio="0.5" rightInset="0" textColor="#000000" topInset="0" verticalTextPosition="bottom" visible="true" width="24.95965576171875" x="159.58267211914062" xml:space="preserve" y="-10.895858764648438">
+            <y:PreferredPlacementDescriptor angle="0.0" angleOffsetOnRightSide="0" angleReference="absolute" angleRotationOnRightSide="co" distance="-1.0" frozen="true" placement="anywhere" side="anywhere" sideReference="relative_to_edge_flow"/></y:EdgeLabel>
+          <y:BendStyle smoothed="false"/>
+        </y:PolyLineEdge>
+      </data>
+    </edge>
+    <edge id="n0::n3::n3::n1::e0" source="n0::n3::n3::n1::n0" target="n0::n3::n3::n1::n5::n0">
+      <data key="d8" xml:space="preserve"><![CDATA[router_anonym -> anonym_read]]></data>
+      <data key="d9">
+        <y:PolyLineEdge>
+          <y:Path sx="0.0" sy="-7.428571428571445" tx="0.0" ty="0.0">
+            <y:Point x="644.0" y="-502.42857142857144"/>
+            <y:Point x="644.0" y="-624.0"/>
+          </y:Path>
+          <y:LineStyle color="#000000" type="line" width="1.0"/>
+          <y:Arrows source="none" target="standard"/>
+          <y:EdgeLabel alignment="center" bottomInset="0" configuration="AutoFlippingLabel" distance="0.0" fontFamily="Dialog" fontSize="8" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="21.791717529296875" horizontalTextPosition="center" iconTextGap="4" leftInset="0" modelName="centered" modelPosition="center" preferredPlacement="anywhere" ratio="0.5" rightInset="0" textColor="#000000" topInset="0" verticalTextPosition="bottom" visible="true" width="24.95965576171875" x="7.500640869140625" xml:space="preserve" y="-71.68158612932484">
+            <y:PreferredPlacementDescriptor angle="0.0" angleOffsetOnRightSide="0" angleReference="absolute" angleRotationOnRightSide="co" distance="-1.0" frozen="true" placement="anywhere" side="anywhere" sideReference="relative_to_edge_flow"/></y:EdgeLabel>
+          <y:BendStyle smoothed="false"/>
+        </y:PolyLineEdge>
+      </data>
+    </edge>
+    <edge id="n0::n3::n3::n1::e1" source="n0::n3::n3::n1::n0" target="n0::n3::n3::n1::n3::n0">
+      <data key="d8" xml:space="preserve"><![CDATA[router_anonym -> anonym_list]]></data>
+      <data key="d9">
+        <y:PolyLineEdge>
+          <y:Path sx="0.0" sy="5.199999999999989" tx="0.0" ty="0.0">
+            <y:Point x="644.0" y="-489.8"/>
+            <y:Point x="644.0" y="-452.0"/>
+          </y:Path>
+          <y:LineStyle color="#000000" type="line" width="1.0"/>
+          <y:Arrows source="none" target="standard"/>
+          <y:EdgeLabel alignment="center" bottomInset="0" configuration="AutoFlippingLabel" distance="0.0" fontFamily="Dialog" fontSize="8" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="21.791717529296875" horizontalTextPosition="center" iconTextGap="4" leftInset="0" modelName="centered" modelPosition="center" preferredPlacement="anywhere" ratio="0.5" rightInset="0" textColor="#000000" topInset="0" verticalTextPosition="bottom" visible="true" width="24.95965576171875" x="7.500640869140625" xml:space="preserve" y="8.004129028320335">
+            <y:PreferredPlacementDescriptor angle="0.0" angleOffsetOnRightSide="0" angleReference="absolute" angleRotationOnRightSide="co" distance="-1.0" frozen="true" placement="anywhere" side="anywhere" sideReference="relative_to_edge_flow"/></y:EdgeLabel>
+          <y:BendStyle smoothed="false"/>
+        </y:PolyLineEdge>
+      </data>
+    </edge>
+    <edge id="n0::n3::n3::n1::e2" source="n0::n3::n3::n1::n0" target="n0::n3::n3::n1::n4::n0">
+      <data key="d8" xml:space="preserve"><![CDATA[router_anonym -> anonym_put]]></data>
+      <data key="d9">
+        <y:PolyLineEdge>
+          <y:Path sx="0.0" sy="-11.142857142857167" tx="0.0" ty="0.0">
+            <y:Point x="634.0" y="-506.14285714285717"/>
+            <y:Point x="634.0" y="-710.0"/>
+          </y:Path>
+          <y:LineStyle color="#000000" type="line" width="1.0"/>
+          <y:Arrows source="none" target="standard"/>
+          <y:EdgeLabel alignment="center" bottomInset="0" configuration="AutoFlippingLabel" distance="0.0" fontFamily="Dialog" fontSize="8" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="21.791717529296875" horizontalTextPosition="center" iconTextGap="4" leftInset="0" modelName="centered" modelPosition="center" preferredPlacement="anywhere" ratio="0.5" rightInset="0" textColor="#000000" topInset="0" verticalTextPosition="bottom" visible="true" width="24.95965576171875" x="-2.463226318359375" xml:space="preserve" y="-112.82443455287387">
+            <y:PreferredPlacementDescriptor angle="0.0" angleOffsetOnRightSide="0" angleReference="absolute" angleRotationOnRightSide="co" distance="-1.0" frozen="true" placement="anywhere" side="anywhere" sideReference="relative_to_edge_flow"/></y:EdgeLabel>
+          <y:BendStyle smoothed="false"/>
+        </y:PolyLineEdge>
+      </data>
+    </edge>
+    <edge id="n0::n3::n3::n1::e3" source="n0::n3::n3::n1::n0" target="n0::n3::n3::n1::n1::n0">
+      <data key="d8" xml:space="preserve"><![CDATA[router_anonym -> anonym_del]]></data>
+      <data key="d9">
+        <y:PolyLineEdge>
+          <y:Path sx="0.0" sy="-3.7142857142857224" tx="0.0" ty="0.0">
+            <y:Point x="654.0" y="-498.7142857142857"/>
+            <y:Point x="654.0" y="-538.0"/>
+          </y:Path>
+          <y:LineStyle color="#000000" type="line" width="1.0"/>
+          <y:Arrows source="none" target="standard"/>
+          <y:EdgeLabel alignment="center" bottomInset="0" configuration="AutoFlippingLabel" distance="0.0" fontFamily="Dialog" fontSize="8" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="21.791717529296875" horizontalTextPosition="center" iconTextGap="4" leftInset="0" modelName="centered" modelPosition="center" preferredPlacement="anywhere" ratio="0.5" rightInset="0" textColor="#000000" topInset="0" verticalTextPosition="bottom" visible="true" width="24.95965576171875" x="17.523101806640625" xml:space="preserve" y="-30.538707188197577">
+            <y:PreferredPlacementDescriptor angle="0.0" angleOffsetOnRightSide="0" angleReference="absolute" angleRotationOnRightSide="co" distance="-1.0" frozen="true" placement="anywhere" side="anywhere" sideReference="relative_to_edge_flow"/></y:EdgeLabel>
+          <y:BendStyle smoothed="false"/>
+        </y:PolyLineEdge>
+      </data>
+    </edge>
+    <edge id="n0::n3::n3::n1::e4" source="n0::n3::n3::n1::n0" target="n0::n3::n3::n1::n2::n0">
+      <data key="d8" xml:space="preserve"><![CDATA[router_anonym -> anonym_find]]></data>
+      <data key="d9">
+        <y:PolyLineEdge>
+          <y:Path sx="0.0" sy="10.399999999999977" tx="0.0" ty="0.0">
+            <y:Point x="634.0" y="-484.6"/>
+            <y:Point x="634.0" y="-366.0"/>
+          </y:Path>
+          <y:LineStyle color="#000000" type="line" width="1.0"/>
+          <y:Arrows source="none" target="standard"/>
+          <y:EdgeLabel alignment="center" bottomInset="0" configuration="AutoFlippingLabel" distance="0.0" fontFamily="Dialog" fontSize="8" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="21.791717529296875" horizontalTextPosition="center" iconTextGap="4" leftInset="0" modelName="centered" modelPosition="center" preferredPlacement="anywhere" ratio="0.5" rightInset="0" textColor="#000000" topInset="0" verticalTextPosition="bottom" visible="true" width="24.95965576171875" x="-2.463226318359375" xml:space="preserve" y="48.404147338867176">
+            <y:PreferredPlacementDescriptor angle="0.0" angleOffsetOnRightSide="0" angleReference="absolute" angleRotationOnRightSide="co" distance="-1.0" frozen="true" placement="anywhere" side="anywhere" sideReference="relative_to_edge_flow"/></y:EdgeLabel>
+          <y:BendStyle smoothed="false"/>
+        </y:PolyLineEdge>
+      </data>
+    </edge>
+    <edge id="n0::n3::e3" source="n0::n3::n3::n1::n1::n0" target="n0::n3::n5::n0">
+      <data key="d8" xml:space="preserve"><![CDATA[anonym_del -> types]]></data>
+      <data key="d9">
+        <y:PolyLineEdge>
+          <y:Path sx="0.0" sy="0.0" tx="0.0" ty="1.5294117647058556">
+            <y:Point x="949.0" y="-538.0"/>
+            <y:Point x="949.0" y="-622.4705882352941"/>
+          </y:Path>
+          <y:LineStyle color="#000000" type="dashed" width="1.0"/>
+          <y:Arrows source="none" target="standard"/>
+          <y:EdgeLabel alignment="center" bottomInset="0" configuration="AutoFlippingLabel" distance="0.0" fontFamily="Dialog" fontSize="8" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="21.791717529296875" horizontalTextPosition="center" iconTextGap="4" leftInset="0" modelName="centered" modelPosition="center" preferredPlacement="anywhere" ratio="0.5" rightInset="0" textColor="#000000" topInset="0" verticalTextPosition="bottom" visible="true" width="24.95965576171875" x="221.45767211914062" xml:space="preserve" y="-95.36644699994258">
+            <y:PreferredPlacementDescriptor angle="0.0" angleOffsetOnRightSide="0" angleReference="absolute" angleRotationOnRightSide="co" distance="-1.0" frozen="true" placement="anywhere" side="anywhere" sideReference="relative_to_edge_flow"/></y:EdgeLabel>
+          <y:BendStyle smoothed="false"/>
+        </y:PolyLineEdge>
+      </data>
+    </edge>
+    <edge id="n0::e0" source="n0::n1::n0::n0" target="n0::n2::n0::n0">
+      <data key="d8" xml:space="preserve"><![CDATA[main -> service]]></data>
+      <data key="d9">
+        <y:PolyLineEdge>
+          <y:Path sx="0.0" sy="8.666666666666742" tx="0.0" ty="-6.5">
+            <y:Point x="107.0" y="-1261.1940476190475"/>
+            <y:Point x="107.0" y="-75.5"/>
+          </y:Path>
+          <y:LineStyle color="#000000" type="line" width="1.0"/>
+          <y:Arrows source="none" target="standard"/>
+          <y:EdgeLabel alignment="center" bottomInset="0" configuration="AutoFlippingLabel" distance="0.0" fontFamily="Dialog" fontSize="8" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="21.791717529296875" horizontalTextPosition="center" iconTextGap="4" leftInset="0" modelName="centered" modelPosition="center" preferredPlacement="anywhere" ratio="0.5" rightInset="0" textColor="#000000" topInset="0" verticalTextPosition="bottom" visible="true" width="24.95965576171875" x="27.492828369140625" xml:space="preserve" y="581.9512092227028">
+            <y:PreferredPlacementDescriptor angle="0.0" angleOffsetOnRightSide="0" angleReference="absolute" angleRotationOnRightSide="co" distance="-1.0" frozen="true" placement="anywhere" side="anywhere" sideReference="relative_to_edge_flow"/></y:EdgeLabel>
+          <y:BendStyle smoothed="false"/>
+        </y:PolyLineEdge>
+      </data>
+    </edge>
+    <edge id="n0::e1" source="n0::n1::n0::n0" target="n0::n3::n5::n0">
+      <data key="d8" xml:space="preserve"><![CDATA[main -> types]]></data>
+      <data key="d9">
+        <y:PolyLineEdge>
+          <y:Path sx="0.0" sy="0.0" tx="0.0" ty="-10.705882352941217">
+            <y:Point x="1085.0" y="-1269.8607142857143"/>
+            <y:Point x="1085.0" y="-634.7058823529412"/>
+          </y:Path>
+          <y:LineStyle color="#000000" type="dashed" width="1.0"/>
+          <y:Arrows source="none" target="standard"/>
+          <y:EdgeLabel alignment="center" bottomInset="0" configuration="AutoFlippingLabel" distance="0.0" fontFamily="Dialog" fontSize="8" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="21.791717529296875" horizontalTextPosition="center" iconTextGap="4" leftInset="0" modelName="centered" modelPosition="center" preferredPlacement="anywhere" ratio="0.5" rightInset="0" textColor="#000000" topInset="0" verticalTextPosition="bottom" visible="true" width="24.95965576171875" x="501.0826721191406" xml:space="preserve" y="-10.895855276925204">
+            <y:PreferredPlacementDescriptor angle="0.0" angleOffsetOnRightSide="0" angleReference="absolute" angleRotationOnRightSide="co" distance="-1.0" frozen="true" placement="anywhere" side="anywhere" sideReference="relative_to_edge_flow"/></y:EdgeLabel>
+          <y:BendStyle smoothed="false"/>
+        </y:PolyLineEdge>
+      </data>
+    </edge>
+    <edge id="n0::n3::e4" source="n0::n3::n0::n0" target="n0::n3::n2::n0">
+      <data key="d8" xml:space="preserve"><![CDATA[client_anonym -> msg_net]]></data>
+      <data key="d9">
+        <y:PolyLineEdge>
+          <y:Path sx="0.0" sy="-6.5" tx="0.0" ty="6.5">
+            <y:Point x="870.0" y="-217.5"/>
+            <y:Point x="870.0" y="-301.5"/>
+          </y:Path>
+          <y:LineStyle color="#000000" type="line" width="1.0"/>
+          <y:Arrows source="none" target="standard"/>
+          <y:EdgeLabel alignment="center" bottomInset="0" configuration="AutoFlippingLabel" distance="0.0" fontFamily="Dialog" fontSize="8" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="21.791717529296875" horizontalTextPosition="center" iconTextGap="4" leftInset="0" modelName="centered" modelPosition="center" preferredPlacement="anywhere" ratio="0.5" rightInset="0" textColor="#000000" topInset="0" verticalTextPosition="bottom" visible="true" width="24.95965576171875" x="54.525787353515625" xml:space="preserve" y="-52.89585876464844">
+            <y:PreferredPlacementDescriptor angle="0.0" angleOffsetOnRightSide="0" angleReference="absolute" angleRotationOnRightSide="co" distance="-1.0" frozen="true" placement="anywhere" side="anywhere" sideReference="relative_to_edge_flow"/></y:EdgeLabel>
+          <y:BendStyle smoothed="false"/>
+        </y:PolyLineEdge>
+      </data>
+    </edge>
+    <edge id="n0::n3::e5" source="n0::n3::n0::n0" target="n0::n3::n5::n0">
+      <data key="d8" xml:space="preserve"><![CDATA[client_anonym -> types]]></data>
+      <data key="d9">
+        <y:PolyLineEdge>
+          <y:Path sx="0.0" sy="6.5" tx="0.0" ty="10.705882352941217">
+            <y:Point x="1075.0" y="-204.5"/>
+            <y:Point x="1075.0" y="-613.2941176470588"/>
+          </y:Path>
+          <y:LineStyle color="#000000" type="dashed" width="1.0"/>
+          <y:Arrows source="none" target="standard"/>
+          <y:EdgeLabel alignment="center" bottomInset="0" configuration="AutoFlippingLabel" distance="0.0" fontFamily="Dialog" fontSize="8" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="21.791717529296875" horizontalTextPosition="center" iconTextGap="4" leftInset="0" modelName="centered" modelPosition="center" preferredPlacement="anywhere" ratio="0.5" rightInset="0" textColor="#000000" topInset="0" verticalTextPosition="bottom" visible="true" width="24.95965576171875" x="259.4952697753906" xml:space="preserve" y="-215.29291758817783">
+            <y:PreferredPlacementDescriptor angle="0.0" angleOffsetOnRightSide="0" angleReference="absolute" angleRotationOnRightSide="co" distance="-1.0" frozen="true" placement="anywhere" side="anywhere" sideReference="relative_to_edge_flow"/></y:EdgeLabel>
+          <y:BendStyle smoothed="false"/>
+        </y:PolyLineEdge>
+      </data>
+    </edge>
+    <edge id="n0::n3::e6" source="n0::n3::n1::n3::n0" target="n0::n3::n5::n0">
+      <data key="d8" xml:space="preserve"><![CDATA[mock_web -> types]]></data>
+      <data key="d9">
+        <y:PolyLineEdge>
+          <y:Path sx="0.0" sy="0.0" tx="0.0" ty="-6.117647058823536">
+            <y:Point x="1045.0" y="-1024.0"/>
+            <y:Point x="1045.0" y="-630.1176470588235"/>
+          </y:Path>
+          <y:LineStyle color="#000000" type="dashed" width="1.0"/>
+          <y:Arrows source="none" target="standard"/>
+          <y:EdgeLabel alignment="center" bottomInset="0" configuration="AutoFlippingLabel" distance="0.0" fontFamily="Dialog" fontSize="8" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="21.791717529296875" horizontalTextPosition="center" iconTextGap="4" leftInset="0" modelName="centered" modelPosition="center" preferredPlacement="anywhere" ratio="0.5" rightInset="0" textColor="#000000" topInset="0" verticalTextPosition="bottom" visible="true" width="24.95965576171875" x="45.520172119140625" xml:space="preserve" y="186.04531770593985">
+            <y:PreferredPlacementDescriptor angle="0.0" angleOffsetOnRightSide="0" angleReference="absolute" angleRotationOnRightSide="co" distance="-1.0" frozen="true" placement="anywhere" side="anywhere" sideReference="relative_to_edge_flow"/></y:EdgeLabel>
+          <y:BendStyle smoothed="false"/>
+        </y:PolyLineEdge>
+      </data>
+    </edge>
+    <edge id="n0::n3::e7" source="n0::n3::n2::n0" target="n0::n3::n5::n0">
+      <data key="d8" xml:space="preserve"><![CDATA[msg_net -> types]]></data>
+      <data key="d9">
+        <y:PolyLineEdge>
+          <y:Path sx="0.0" sy="0.0" tx="0.0" ty="7.647058823529392">
+            <y:Point x="1055.0" y="-308.0"/>
+            <y:Point x="1055.0" y="-616.3529411764706"/>
+          </y:Path>
+          <y:LineStyle color="#000000" type="dashed" width="1.0"/>
+          <y:Arrows source="none" target="standard"/>
+          <y:EdgeLabel alignment="center" bottomInset="0" configuration="AutoFlippingLabel" distance="0.0" fontFamily="Dialog" fontSize="8" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="21.791717529296875" horizontalTextPosition="center" iconTextGap="4" leftInset="0" modelName="centered" modelPosition="center" preferredPlacement="anywhere" ratio="0.5" rightInset="0" textColor="#000000" topInset="0" verticalTextPosition="bottom" visible="true" width="24.95965576171875" x="59.520172119140625" xml:space="preserve" y="-165.07232935288374">
+            <y:PreferredPlacementDescriptor angle="0.0" angleOffsetOnRightSide="0" angleReference="absolute" angleRotationOnRightSide="co" distance="-1.0" frozen="true" placement="anywhere" side="anywhere" sideReference="relative_to_edge_flow"/></y:EdgeLabel>
+          <y:BendStyle smoothed="false"/>
+        </y:PolyLineEdge>
+      </data>
+    </edge>
+    <edge id="n0::n3::e8" source="n0::n3::n3::n0" target="n0::n3::n5::n0">
+      <data key="d8" xml:space="preserve"><![CDATA[serv_http -> types]]></data>
+      <data key="d9">
+        <y:PolyLineEdge>
+          <y:Path sx="0.0" sy="0.0" tx="0.0" ty="9.176470588235247">
+            <y:Point x="850.0" y="-308.0"/>
+            <y:Point x="850.0" y="-265.0"/>
+            <y:Point x="1065.0" y="-265.0"/>
+            <y:Point x="1065.0" y="-614.8235294117648"/>
+          </y:Path>
+          <y:LineStyle color="#000000" type="dashed" width="1.0"/>
+          <y:Arrows source="none" target="standard"/>
+          <y:EdgeLabel alignment="center" bottomInset="0" configuration="AutoFlippingLabel" distance="0.0" fontFamily="Dialog" fontSize="8" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="21.791717529296875" horizontalTextPosition="center" iconTextGap="4" leftInset="0" modelName="centered" modelPosition="center" preferredPlacement="anywhere" ratio="0.5" rightInset="0" textColor="#000000" topInset="0" verticalTextPosition="bottom" visible="true" width="24.95965576171875" x="194.08267211914062" xml:space="preserve" y="-10.895858764648438">
+            <y:PreferredPlacementDescriptor angle="0.0" angleOffsetOnRightSide="0" angleReference="absolute" angleRotationOnRightSide="co" distance="-1.0" frozen="true" placement="anywhere" side="anywhere" sideReference="relative_to_edge_flow"/></y:EdgeLabel>
+          <y:BendStyle smoothed="false"/>
+        </y:PolyLineEdge>
+      </data>
+    </edge>
+    <edge id="n0::n3::n3::e0" source="n0::n3::n3::n0" target="n0::n3::n3::n1::n0">
+      <data key="d8" xml:space="preserve"><![CDATA[serv_http -> router_anonym]]></data>
+      <data key="d9">
+        <y:PolyLineEdge>
+          <y:Path sx="0.0" sy="-8.666666666666686" tx="0.0" ty="0.0">
+            <y:Point x="456.0" y="-316.6666666666667"/>
+            <y:Point x="456.0" y="-495.0"/>
+          </y:Path>
+          <y:LineStyle color="#000000" type="line" width="1.0"/>
+          <y:Arrows source="none" target="standard"/>
+          <y:EdgeLabel alignment="center" bottomInset="0" configuration="AutoFlippingLabel" distance="0.0" fontFamily="Dialog" fontSize="8" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="21.791717529296875" horizontalTextPosition="center" iconTextGap="4" leftInset="0" modelName="centered" modelPosition="center" preferredPlacement="anywhere" ratio="0.5" rightInset="0" textColor="#000000" topInset="0" verticalTextPosition="bottom" visible="true" width="24.95965576171875" x="-2.459320068359375" xml:space="preserve" y="-100.06253560384118">
+            <y:PreferredPlacementDescriptor angle="0.0" angleOffsetOnRightSide="0" angleReference="absolute" angleRotationOnRightSide="co" distance="-1.0" frozen="true" placement="anywhere" side="anywhere" sideReference="relative_to_edge_flow"/></y:EdgeLabel>
+          <y:BendStyle smoothed="false"/>
+        </y:PolyLineEdge>
+      </data>
+    </edge>
+    <edge id="n0::n3::e9" source="n0::n3::n3::n1::n3::n0" target="n0::n3::n5::n0">
+      <data key="d8" xml:space="preserve"><![CDATA[anonym_list -> types]]></data>
+      <data key="d9">
+        <y:PolyLineEdge>
+          <y:Path sx="0.0" sy="0.0" tx="0.0" ty="4.5882352941176805">
+            <y:Point x="969.0" y="-452.0"/>
+            <y:Point x="969.0" y="-619.4117647058823"/>
+          </y:Path>
+          <y:LineStyle color="#000000" type="dashed" width="1.0"/>
+          <y:Arrows source="none" target="standard"/>
+          <y:EdgeLabel alignment="center" bottomInset="0" configuration="AutoFlippingLabel" distance="0.0" fontFamily="Dialog" fontSize="8" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="21.791717529296875" horizontalTextPosition="center" iconTextGap="4" leftInset="0" modelName="centered" modelPosition="center" preferredPlacement="anywhere" ratio="0.5" rightInset="0" textColor="#000000" topInset="0" verticalTextPosition="bottom" visible="true" width="24.95965576171875" x="79.08267211914062" xml:space="preserve" y="-10.895858764648438">
+            <y:PreferredPlacementDescriptor angle="0.0" angleOffsetOnRightSide="0" angleReference="absolute" angleRotationOnRightSide="co" distance="-1.0" frozen="true" placement="anywhere" side="anywhere" sideReference="relative_to_edge_flow"/></y:EdgeLabel>
+          <y:BendStyle smoothed="false"/>
+        </y:PolyLineEdge>
+      </data>
+    </edge>
+    <edge id="n0::n3::e10" source="n0::n3::n3::n1::n4::n0" target="n0::n3::n5::n0">
+      <data key="d8" xml:space="preserve"><![CDATA[anonym_put -> types]]></data>
+      <data key="d9">
+        <y:PolyLineEdge>
+          <y:Path sx="0.0" sy="0.0" tx="0.0" ty="-1.5294117647058556">
+            <y:Point x="949.0" y="-710.0"/>
+            <y:Point x="949.0" y="-625.5294117647059"/>
+          </y:Path>
+          <y:LineStyle color="#000000" type="dashed" width="1.0"/>
+          <y:Arrows source="none" target="standard"/>
+          <y:EdgeLabel alignment="center" bottomInset="0" configuration="AutoFlippingLabel" distance="0.0" fontFamily="Dialog" fontSize="8" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="21.791717529296875" horizontalTextPosition="center" iconTextGap="4" leftInset="0" modelName="centered" modelPosition="center" preferredPlacement="anywhere" ratio="0.5" rightInset="0" textColor="#000000" topInset="0" verticalTextPosition="bottom" visible="true" width="24.95965576171875" x="221.45767211914062" xml:space="preserve" y="73.5747294706457">
+            <y:PreferredPlacementDescriptor angle="0.0" angleOffsetOnRightSide="0" angleReference="absolute" angleRotationOnRightSide="co" distance="-1.0" frozen="true" placement="anywhere" side="anywhere" sideReference="relative_to_edge_flow"/></y:EdgeLabel>
+          <y:BendStyle smoothed="false"/>
+        </y:PolyLineEdge>
+      </data>
+    </edge>
+    <edge id="n0::e2" source="n0::n2::n0::n0" target="n0::n3::n3::n0">
+      <data key="d8" xml:space="preserve"><![CDATA[service -> serv_http]]></data>
+      <data key="d9">
+        <y:PolyLineEdge>
+          <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0">
+            <y:Point x="301.0" y="-69.0"/>
+            <y:Point x="301.0" y="-308.0"/>
+          </y:Path>
+          <y:LineStyle color="#000000" type="line" width="1.0"/>
+          <y:Arrows source="none" target="standard"/>
+          <y:EdgeLabel alignment="center" bottomInset="0" configuration="AutoFlippingLabel" distance="0.0" fontFamily="Dialog" fontSize="8" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="21.791717529296875" horizontalTextPosition="center" iconTextGap="4" leftInset="0" modelName="centered" modelPosition="center" preferredPlacement="anywhere" ratio="0.5" rightInset="0" textColor="#000000" topInset="0" verticalTextPosition="bottom" visible="true" width="24.95965576171875" x="37.520172119140625" xml:space="preserve" y="-130.39585876464844">
+            <y:PreferredPlacementDescriptor angle="0.0" angleOffsetOnRightSide="0" angleReference="absolute" angleRotationOnRightSide="co" distance="-1.0" frozen="true" placement="anywhere" side="anywhere" sideReference="relative_to_edge_flow"/></y:EdgeLabel>
+          <y:BendStyle smoothed="false"/>
+        </y:PolyLineEdge>
+      </data>
+    </edge>
+    <edge id="n0::e3" source="n0::n2::n0::n0" target="n0::n3::n4::n0">
+      <data key="d8" xml:space="preserve"><![CDATA[service -> store]]></data>
+      <data key="d9">
+        <y:PolyLineEdge>
+          <y:Path sx="0.0" sy="-8.666666666666671" tx="0.0" ty="0.0">
+            <y:Point x="291.0" y="-77.66666666666667"/>
+            <y:Point x="291.0" y="-837.0"/>
+          </y:Path>
+          <y:LineStyle color="#000000" type="line" width="1.0"/>
+          <y:Arrows source="none" target="standard"/>
+          <y:EdgeLabel alignment="center" bottomInset="0" configuration="AutoFlippingLabel" distance="0.0" fontFamily="Dialog" fontSize="8" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="21.791717529296875" horizontalTextPosition="center" iconTextGap="4" leftInset="0" modelName="centered" modelPosition="center" preferredPlacement="anywhere" ratio="0.5" rightInset="0" textColor="#000000" topInset="0" verticalTextPosition="bottom" visible="true" width="24.95965576171875" x="27.510406494140625" xml:space="preserve" y="-390.56252797444665">
+            <y:PreferredPlacementDescriptor angle="0.0" angleOffsetOnRightSide="0" angleReference="absolute" angleRotationOnRightSide="co" distance="-1.0" frozen="true" placement="anywhere" side="anywhere" sideReference="relative_to_edge_flow"/></y:EdgeLabel>
+          <y:BendStyle smoothed="false"/>
+        </y:PolyLineEdge>
+      </data>
+    </edge>
+    <edge id="n0::e4" source="n0::n2::n0::n0" target="n0::n3::n5::n0">
+      <data key="d8" xml:space="preserve"><![CDATA[service -> types]]></data>
+      <data key="d9">
+        <y:PolyLineEdge>
+          <y:Path sx="0.0" sy="8.666666666666671" tx="0.0" ty="12.235294117647072">
+            <y:Point x="320.0" y="-60.33333333333333"/>
+            <y:Point x="320.0" y="-157.0"/>
+            <y:Point x="1085.0" y="-157.0"/>
+            <y:Point x="1085.0" y="-611.7647058823529"/>
+          </y:Path>
+          <y:LineStyle color="#000000" type="dashed" width="1.0"/>
+          <y:Arrows source="none" target="standard"/>
+          <y:EdgeLabel alignment="center" bottomInset="0" configuration="AutoFlippingLabel" distance="0.0" fontFamily="Dialog" fontSize="8" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="21.791717529296875" horizontalTextPosition="center" iconTextGap="4" leftInset="0" modelName="centered" modelPosition="center" preferredPlacement="anywhere" ratio="0.5" rightInset="0" textColor="#000000" topInset="0" verticalTextPosition="bottom" visible="true" width="24.95965576171875" x="439.0174865722656" xml:space="preserve" y="-107.56252670288086">
+            <y:PreferredPlacementDescriptor angle="0.0" angleOffsetOnRightSide="0" angleReference="absolute" angleRotationOnRightSide="co" distance="-1.0" frozen="true" placement="anywhere" side="anywhere" sideReference="relative_to_edge_flow"/></y:EdgeLabel>
+          <y:BendStyle smoothed="false"/>
+        </y:PolyLineEdge>
+      </data>
+    </edge>
+    <edge id="n0::n3::e11" source="n0::n3::n1::n0" target="n0::n3::n3::n0">
+      <data key="d8" xml:space="preserve"><![CDATA[mock -> serv_http]]></data>
+      <data key="d9">
+        <y:PolyLineEdge>
+          <y:Path sx="0.0" sy="10.400000000000091" tx="0.0" ty="-8.666666666666686">
+            <y:Point x="249.0" y="-1088.220238095238"/>
+            <y:Point x="249.0" y="-316.6666666666667"/>
+          </y:Path>
+          <y:LineStyle color="#000000" type="line" width="1.0"/>
+          <y:Arrows source="none" target="standard"/>
+          <y:EdgeLabel alignment="center" bottomInset="0" configuration="AutoFlippingLabel" distance="0.0" fontFamily="Dialog" fontSize="8" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="21.791717529296875" horizontalTextPosition="center" iconTextGap="4" leftInset="0" modelName="centered" modelPosition="center" preferredPlacement="anywhere" ratio="0.5" rightInset="0" textColor="#000000" topInset="0" verticalTextPosition="bottom" visible="true" width="24.95965576171875" x="-2.513031005859375" xml:space="preserve" y="374.88090369814915">
+            <y:PreferredPlacementDescriptor angle="0.0" angleOffsetOnRightSide="0" angleReference="absolute" angleRotationOnRightSide="co" distance="-1.0" frozen="true" placement="anywhere" side="anywhere" sideReference="relative_to_edge_flow"/></y:EdgeLabel>
+          <y:BendStyle smoothed="false"/>
+        </y:PolyLineEdge>
+      </data>
+    </edge>
+    <edge id="n0::n3::e12" source="n0::n3::n1::n0" target="n0::n3::n4::n0">
+      <data key="d8" xml:space="preserve"><![CDATA[mock -> store]]></data>
+      <data key="d9">
+        <y:PolyLineEdge>
+          <y:Path sx="0.0" sy="5.2000000000000455" tx="0.0" ty="-8.666666666666629">
+            <y:Point x="259.0" y="-1093.4202380952381"/>
+            <y:Point x="259.0" y="-845.6666666666666"/>
+          </y:Path>
+          <y:LineStyle color="#000000" type="line" width="1.0"/>
+          <y:Arrows source="none" target="standard"/>
+          <y:EdgeLabel alignment="center" bottomInset="0" configuration="AutoFlippingLabel" distance="0.0" fontFamily="Dialog" fontSize="8" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="21.791717529296875" horizontalTextPosition="center" iconTextGap="4" leftInset="0" modelName="centered" modelPosition="center" preferredPlacement="anywhere" ratio="0.5" rightInset="0" textColor="#000000" topInset="0" verticalTextPosition="bottom" visible="true" width="24.95965576171875" x="7.502593994140625" xml:space="preserve" y="112.98097694033663">
+            <y:PreferredPlacementDescriptor angle="0.0" angleOffsetOnRightSide="0" angleReference="absolute" angleRotationOnRightSide="co" distance="-1.0" frozen="true" placement="anywhere" side="anywhere" sideReference="relative_to_edge_flow"/></y:EdgeLabel>
+          <y:BendStyle smoothed="false"/>
+        </y:PolyLineEdge>
+      </data>
+    </edge>
+    <edge id="n0::n3::e13" source="n0::n3::n1::n0" target="n0::n3::n5::n0">
+      <data key="d8" xml:space="preserve"><![CDATA[mock -> types]]></data>
+      <data key="d9">
+        <y:PolyLineEdge>
+          <y:Path sx="0.0" sy="0.0" tx="0.0" ty="-7.647058823529392">
+            <y:Point x="1065.0" y="-1098.6202380952382"/>
+            <y:Point x="1065.0" y="-631.6470588235294"/>
+          </y:Path>
+          <y:LineStyle color="#000000" type="dashed" width="1.0"/>
+          <y:Arrows source="none" target="standard"/>
+          <y:EdgeLabel alignment="center" bottomInset="0" configuration="AutoFlippingLabel" distance="0.0" fontFamily="Dialog" fontSize="8" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="21.791717529296875" horizontalTextPosition="center" iconTextGap="4" leftInset="0" modelName="centered" modelPosition="center" preferredPlacement="anywhere" ratio="0.5" rightInset="0" textColor="#000000" topInset="0" verticalTextPosition="bottom" visible="true" width="24.95965576171875" x="405.0826721191406" xml:space="preserve" y="-10.895857602074102">
+            <y:PreferredPlacementDescriptor angle="0.0" angleOffsetOnRightSide="0" angleReference="absolute" angleRotationOnRightSide="co" distance="-1.0" frozen="true" placement="anywhere" side="anywhere" sideReference="relative_to_edge_flow"/></y:EdgeLabel>
+          <y:BendStyle smoothed="false"/>
+        </y:PolyLineEdge>
+      </data>
+    </edge>
+    <edge id="n0::n3::n1::e0" source="n0::n3::n1::n0" target="n0::n3::n1::n1::n0">
+      <data key="d8" xml:space="preserve"><![CDATA[mock -> mock_service]]></data>
+      <data key="d9">
+        <y:PolyLineEdge>
+          <y:Path sx="0.0" sy="-8.666666666666742" tx="0.0" ty="0.0">
+            <y:Point x="249.0" y="-1107.286904761905"/>
+            <y:Point x="249.0" y="-1158.240476190476"/>
+          </y:Path>
+          <y:LineStyle color="#000000" type="line" width="1.0"/>
+          <y:Arrows source="none" target="standard"/>
+          <y:EdgeLabel alignment="center" bottomInset="0" configuration="AutoFlippingLabel" distance="0.0" fontFamily="Dialog" fontSize="8" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="21.791717529296875" horizontalTextPosition="center" iconTextGap="4" leftInset="0" modelName="centered" modelPosition="center" preferredPlacement="anywhere" ratio="0.5" rightInset="0" textColor="#000000" topInset="0" verticalTextPosition="bottom" visible="true" width="24.95965576171875" x="33.424468994140625" xml:space="preserve" y="-61.84946972074954">
+            <y:PreferredPlacementDescriptor angle="0.0" angleOffsetOnRightSide="0" angleReference="absolute" angleRotationOnRightSide="co" distance="-1.0" frozen="true" placement="anywhere" side="anywhere" sideReference="relative_to_edge_flow"/></y:EdgeLabel>
+          <y:BendStyle smoothed="false"/>
+        </y:PolyLineEdge>
+      </data>
+    </edge>
+    <edge id="n0::n3::e14" source="n0::n3::n4::n0" target="n0::n3::n5::n0">
+      <data key="d8" xml:space="preserve"><![CDATA[store -> types]]></data>
+      <data key="d9">
+        <y:PolyLineEdge>
+          <y:Path sx="0.0" sy="0.0" tx="0.0" ty="-3.058823529411711">
+            <y:Point x="959.0" y="-837.0"/>
+            <y:Point x="959.0" y="-627.0588235294117"/>
+          </y:Path>
+          <y:LineStyle color="#000000" type="dashed" width="1.0"/>
+          <y:Arrows source="none" target="standard"/>
+          <y:EdgeLabel alignment="center" bottomInset="0" configuration="AutoFlippingLabel" distance="0.0" fontFamily="Dialog" fontSize="8" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="21.791717529296875" horizontalTextPosition="center" iconTextGap="4" leftInset="0" modelName="centered" modelPosition="center" preferredPlacement="anywhere" ratio="0.5" rightInset="0" textColor="#000000" topInset="0" verticalTextPosition="bottom" visible="true" width="24.95965576171875" x="256.5826721191406" xml:space="preserve" y="-10.895858764648438">
+            <y:PreferredPlacementDescriptor angle="0.0" angleOffsetOnRightSide="0" angleReference="absolute" angleRotationOnRightSide="co" distance="-1.0" frozen="true" placement="anywhere" side="anywhere" sideReference="relative_to_edge_flow"/></y:EdgeLabel>
+          <y:BendStyle smoothed="false"/>
+        </y:PolyLineEdge>
+      </data>
+    </edge>
+    <edge id="n0::n3::e15" source="n0::n3::n1::n2::n0" target="n0::n3::n5::n0">
+      <data key="d8" xml:space="preserve"><![CDATA[mock_store -> types]]></data>
+      <data key="d9">
+        <y:PolyLineEdge>
+          <y:Path sx="0.0" sy="0.0" tx="0.0" ty="-4.5882352941176805">
+            <y:Point x="1035.0" y="-938.0"/>
+            <y:Point x="1035.0" y="-628.5882352941177"/>
+          </y:Path>
+          <y:LineStyle color="#000000" type="dashed" width="1.0"/>
+          <y:Arrows source="none" target="standard"/>
+          <y:EdgeLabel alignment="center" bottomInset="0" configuration="AutoFlippingLabel" distance="0.0" fontFamily="Dialog" fontSize="8" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="21.791717529296875" horizontalTextPosition="center" iconTextGap="4" leftInset="0" modelName="centered" modelPosition="center" preferredPlacement="anywhere" ratio="0.5" rightInset="0" textColor="#000000" topInset="0" verticalTextPosition="bottom" visible="true" width="24.95965576171875" x="27.520172119140625" xml:space="preserve" y="143.81002358829278">
+            <y:PreferredPlacementDescriptor angle="0.0" angleOffsetOnRightSide="0" angleReference="absolute" angleRotationOnRightSide="co" distance="-1.0" frozen="true" placement="anywhere" side="anywhere" sideReference="relative_to_edge_flow"/></y:EdgeLabel>
+          <y:BendStyle smoothed="false"/>
+        </y:PolyLineEdge>
+      </data>
+    </edge>
+    <edge id="n0::n3::e16" source="n0::n3::n3::n1::n2::n0" target="n0::n3::n2::n0">
+      <data key="d8" xml:space="preserve"><![CDATA[anonym_find -> msg_net]]></data>
+      <data key="d9">
+        <y:PolyLineEdge>
+          <y:Path sx="0.0" sy="8.666666666666686" tx="0.0" ty="-6.5">
+            <y:Point x="860.0" y="-357.3333333333333"/>
+            <y:Point x="860.0" y="-314.5"/>
+          </y:Path>
+          <y:LineStyle color="#000000" type="dashed" width="1.0"/>
+          <y:Arrows source="none" target="standard"/>
+          <y:EdgeLabel alignment="center" bottomInset="0" configuration="AutoFlippingLabel" distance="0.0" fontFamily="Dialog" fontSize="8" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="21.791717529296875" horizontalTextPosition="center" iconTextGap="4" leftInset="0" modelName="centered" modelPosition="center" preferredPlacement="anywhere" ratio="0.5" rightInset="0" textColor="#000000" topInset="0" verticalTextPosition="bottom" visible="true" width="24.95965576171875" x="24.554595947265625" xml:space="preserve" y="-10.895848592122377">
+            <y:PreferredPlacementDescriptor angle="0.0" angleOffsetOnRightSide="0" angleReference="absolute" angleRotationOnRightSide="co" distance="-1.0" frozen="true" placement="anywhere" side="anywhere" sideReference="relative_to_edge_flow"/></y:EdgeLabel>
+          <y:BendStyle smoothed="false"/>
+        </y:PolyLineEdge>
+      </data>
+    </edge>
+    <edge id="n0::n3::e17" source="n0::n3::n3::n1::n2::n0" target="n0::n3::n5::n0">
+      <data key="d8" xml:space="preserve"><![CDATA[anonym_find -> types]]></data>
+      <data key="d9">
+        <y:PolyLineEdge>
+          <y:Path sx="0.0" sy="0.0" tx="0.0" ty="6.117647058823536">
+            <y:Point x="979.0" y="-366.0"/>
+            <y:Point x="979.0" y="-617.8823529411765"/>
+          </y:Path>
+          <y:LineStyle color="#000000" type="dashed" width="1.0"/>
+          <y:Arrows source="none" target="standard"/>
+          <y:EdgeLabel alignment="center" bottomInset="0" configuration="AutoFlippingLabel" distance="0.0" fontFamily="Dialog" fontSize="8" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="21.791717529296875" horizontalTextPosition="center" iconTextGap="4" leftInset="0" modelName="centered" modelPosition="center" preferredPlacement="anywhere" ratio="0.5" rightInset="0" textColor="#000000" topInset="0" verticalTextPosition="bottom" visible="true" width="24.95965576171875" x="171.52017211914062" xml:space="preserve" y="-136.83703523523667">
+            <y:PreferredPlacementDescriptor angle="0.0" angleOffsetOnRightSide="0" angleReference="absolute" angleRotationOnRightSide="co" distance="-1.0" frozen="true" placement="anywhere" side="anywhere" sideReference="relative_to_edge_flow"/></y:EdgeLabel>
+          <y:BendStyle smoothed="false"/>
+        </y:PolyLineEdge>
+      </data>
+    </edge>
+    <edge id="n0::n3::n0::e0" source="n0::n3::n0::n0" target="n0::n3::n0::n0">
+      <data key="d8" xml:space="preserve"><![CDATA[client_anonym -> sf]]></data>
+      <data key="d9">
+        <y:PolyLineEdge>
+          <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0">
+            <y:Point x="735.0" y="-188.0"/>
+            <y:Point x="657.0" y="-188.0"/>
+            <y:Point x="657.0" y="-211.0"/>
+          </y:Path>
+          <y:LineStyle color="#0000FF" type="line" width="1.0"/>
+          <y:Arrows source="none" target="standard"/>
+          <y:EdgeLabel alignment="center" bottomInset="0" configuration="AutoFlippingLabel" distance="0.0" fontFamily="Dialog" fontSize="8" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="21.791717529296875" horizontalTextPosition="center" iconTextGap="4" leftInset="0" modelName="centered" modelPosition="center" preferredPlacement="anywhere" ratio="0.5" rightInset="0" textColor="#0000FF" topInset="0" verticalTextPosition="bottom" visible="true" width="24.95965576171875" x="-51.479827880859375" xml:space="preserve" y="-0.8958587646484375">close()
+            <y:PreferredPlacementDescriptor angle="0.0" angleOffsetOnRightSide="0" angleReference="absolute" angleRotationOnRightSide="co" distance="-1.0" frozen="true" placement="anywhere" side="anywhere" sideReference="relative_to_edge_flow"/></y:EdgeLabel>
+          <y:BendStyle smoothed="false"/>
+        </y:PolyLineEdge>
+      </data>
+    </edge>
+    <edge id="n0::n2::n0::e0" source="n0::n2::n0::n0" target="n0::n2::n0::n0">
+      <data key="d8" xml:space="preserve"><![CDATA[service -> ]]></data>
+      <data key="d9">
+        <y:PolyLineEdge>
+          <y:Path sx="0.0" sy="0.0" tx="0.0" ty="4.5">
+            <y:Point x="207.0" y="-46.0"/>
+            <y:Point x="153.0" y="-46.0"/>
+            <y:Point x="153.0" y="-64.5"/>
+          </y:Path>
+          <y:LineStyle color="#0000FF" type="line" width="1.0"/>
+          <y:Arrows source="none" target="standard"/>
+          <y:EdgeLabel alignment="center" bottomInset="0" configuration="AutoFlippingLabel" distance="0.0" fontFamily="Dialog" fontSize="8" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="21.791717529296875" horizontalTextPosition="center" iconTextGap="4" leftInset="0" modelName="centered" modelPosition="center" preferredPlacement="anywhere" ratio="0.5" rightInset="0" textColor="#0000FF" topInset="0" verticalTextPosition="bottom" visible="true" width="24.95965576171875" x="-39.479827880859375" xml:space="preserve" y="-0.8958587646484375">
+            <y:PreferredPlacementDescriptor angle="0.0" angleOffsetOnRightSide="0" angleReference="absolute" angleRotationOnRightSide="co" distance="-1.0" frozen="true" placement="anywhere" side="anywhere" sideReference="relative_to_edge_flow"/></y:EdgeLabel>
+          <y:BendStyle smoothed="false"/>
+        </y:PolyLineEdge>
+      </data>
+    </edge>
+    <edge id="n0::n3::n3::e1" source="n0::n3::n3::n0" target="n0::n3::n3::n0">
+      <data key="d8" xml:space="preserve"><![CDATA[serv_http -> sf]]></data>
+      <data key="d9">
+        <y:PolyLineEdge>
+          <y:Path sx="0.0" sy="0.0" tx="0.0" ty="10.0">
+            <y:Point x="394.0" y="-285.0"/>
+            <y:Point x="332.0" y="-285.0"/>
+            <y:Point x="332.0" y="-298.0"/>
+          </y:Path>
+          <y:LineStyle color="#0000FF" type="line" width="1.0"/>
+          <y:Arrows source="none" target="standard"/>
+          <y:EdgeLabel alignment="center" bottomInset="0" configuration="AutoFlippingLabel" distance="0.0" fontFamily="Dialog" fontSize="8" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="21.791717529296875" horizontalTextPosition="center" iconTextGap="4" leftInset="0" modelName="centered" modelPosition="center" preferredPlacement="anywhere" ratio="0.5" rightInset="0" textColor="#0000FF" topInset="0" verticalTextPosition="bottom" visible="true" width="24.95965576171875" x="-43.479827880859375" xml:space="preserve" y="-0.8958587646484375">close()
+            <y:PreferredPlacementDescriptor angle="0.0" angleOffsetOnRightSide="0" angleReference="absolute" angleRotationOnRightSide="co" distance="-1.0" frozen="true" placement="anywhere" side="anywhere" sideReference="relative_to_edge_flow"/></y:EdgeLabel>
+          <y:BendStyle smoothed="false"/>
+        </y:PolyLineEdge>
+      </data>
+    </edge>
+    <edge id="n0::n3::n4::e0" source="n0::n3::n4::n0" target="n0::n3::n4::n0">
+      <data key="d8" xml:space="preserve"><![CDATA[store -> sf]]></data>
+      <data key="d9">
+        <y:PolyLineEdge>
+          <y:Path sx="0.0" sy="0.0" tx="0.0" ty="10.0">
+            <y:Point x="394.0" y="-814.0"/>
+            <y:Point x="348.0" y="-814.0"/>
+            <y:Point x="348.0" y="-827.0"/>
+          </y:Path>
+          <y:LineStyle color="#0000FF" type="line" width="1.0"/>
+          <y:Arrows source="none" target="standard"/>
+          <y:EdgeLabel alignment="center" bottomInset="0" configuration="AutoFlippingLabel" distance="0.0" fontFamily="Dialog" fontSize="8" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="21.791717529296875" horizontalTextPosition="center" iconTextGap="4" leftInset="0" modelName="centered" modelPosition="center" preferredPlacement="anywhere" ratio="0.5" rightInset="0" textColor="#0000FF" topInset="0" verticalTextPosition="bottom" visible="true" width="24.95965576171875" x="-35.479827880859375" xml:space="preserve" y="-0.8958587646484375">close()
+            <y:PreferredPlacementDescriptor angle="0.0" angleOffsetOnRightSide="0" angleReference="absolute" angleRotationOnRightSide="co" distance="-1.0" frozen="true" placement="anywhere" side="anywhere" sideReference="relative_to_edge_flow"/></y:EdgeLabel>
+          <y:BendStyle smoothed="false"/>
+        </y:PolyLineEdge>
+      </data>
+    </edge>
+  </graph>
+  <data key="d6">
+    <y:Resources/>
+  </data>
+</graphml>

+ 2 - 3
internal/service/service.go

@@ -7,10 +7,9 @@ import (
 	"log"
 	"sync"
 
-	"git.p78su.freemyip.com/svi/gostore/internal/serv_http"
-	"git.p78su.freemyip.com/svi/gostore/internal/store"
-
 	// "git.p78su.freemyip.com/svi/gostore/internal/store_user"
+	"git.p78su.freemyip.com/svi/gostore/pkg/serv_http"
+	"git.p78su.freemyip.com/svi/gostore/pkg/store"
 	"git.p78su.freemyip.com/svi/gostore/pkg/types"
 )
 

+ 3 - 3
internal/service/service_test.go

@@ -4,7 +4,7 @@ import (
 	"os"
 	"testing"
 
-	"git.p78su.freemyip.com/svi/gostore/internal/store"
+	"git.p78su.freemyip.com/svi/gostore/pkg/store"
 )
 
 type tester struct {
@@ -34,8 +34,8 @@ func (sf *tester) create() {
 func (sf *tester) createGood1() {
 	sf.t.Log("createGood1")
 	_ = os.RemoveAll("./store")
-	os.Unsetenv("HTTP_PORT")
-	os.Setenv("HTTP_PORT", "18080")
+	os.Unsetenv("STORE_HTTP_PORT")
+	os.Setenv("STORE_HTTP_PORT", "18080")
 	serv, err := NewService()
 	if err != nil {
 		sf.t.Fatalf("createGood1(): in create IStoreDisk, err=\n\t%v", err)

+ 157 - 107
pkg/client_anonym/client_anonym.go

@@ -1,166 +1,216 @@
 // package client_anonym -- HTTP-клиент для выполнения анонимных запросов на сервер
 package client_anonym
 
-/*
 import (
-	"context"
-	"encoding/json"
 	"fmt"
 	"io"
-	"log"
 	"net"
 	"net/http"
-	"os"
+	"net/url"
+	"strings"
+	"sync"
 	"time"
 
-	"git.p78su.freemyip.com/svi/gostore/internal/store_user"
+	"git.p78su.freemyip.com/svi/gostore/pkg/msg_net"
+	"git.p78su.freemyip.com/svi/gostore/pkg/types"
 )
 
-// IClient -- HTTP-клиент для выполнения запросов на сервер
-type IClient interface {
-	// Get -- получить значени ключа
-	Get(key string) ([]byte, error)
-	// Put -- разместить ключ на сервере
-	Put(key string, val []byte) error
-	// Del -- удаляет запись по ключу
-	Del(key string)
-	// Find -- найти ключи по префиксу
-	Find(prefixKey string) ([]string, error)
-	// Time -- возвращает время сервера
-	Time() (string, error)
+// ClientAnonym -- HTTP-клиент для выполнения анонимных запросов на сервер
+type ClientAnonym struct {
+	servCtx   types.IServCtx
+	client    *http.Client
+	url       string       // Базовый адрес сервера
+	urlTime   string       // URL для получения времени
+	urlPut    string       // URL для записи данных
+	urlRead   string       // URL для чтения данных
+	urlDelete string       // URL для удаления данных
+	urlFind   string       // URL для поиска данных
+	block     sync.RWMutex // Блокировка проверки работы клиента
+	isWork    bool         // Признак работы клиента
 }
 
-// StoreClient -- HTTP-клиент для выполнения запросов на сервер
-type StoreClient struct {
-	login    string
-	pass     string
-	url      string
-	urlParam string // Сумма логина и пароль
-	client   *http.Client
-}
-
-// NewStoreClient -- возвращает новый HTTP-клиент для выполнения запросов на сервер
-func NewStoreClient() (IClient, error) {
-	user, err := store_user.NewStoreUser()
-	if err != nil {
-		return nil, fmt.Errorf("NewStoreClient(): in create IStoreUser, err=\n\t%w", err)
-	}
-	url := os.Getenv("STORE_URL")
-	if url == "" {
-		return nil, fmt.Errorf("NewStoreClient(): env STORE_URL not set")
-	}
-	sf := &StoreClient{
-		login: user.Login(),
-		pass:  user.Pass(),
-		url:   url,
+// NewClientAnonym -- конструктор
+func NewClientAnonym(serv types.IServCtx, url string) (*ClientAnonym, error) {
+	{ // Предусловия
+		if serv == nil {
+			return nil, fmt.Errorf("NewClientAnonym(): IServCtx==nil")
+		}
+		if url == "" {
+			return nil, fmt.Errorf("NewClientAnonym(): url is empty")
+		}
+	}
+	sf := &ClientAnonym{
+		servCtx: serv,
 		client: &http.Client{
 			Transport: &http.Transport{
-				Dial: (&net.Dialer{
-					Timeout:   3 * time.Second,
-					KeepAlive: 6 * time.Second,
-				}).Dial,
-				IdleConnTimeout: 10 * time.Second,
+				Proxy: http.ProxyFromEnvironment,
+				DialContext: (&net.Dialer{
+					Timeout:   5 * time.Second,
+					KeepAlive: 30 * time.Second,
+				}).DialContext,
+				ForceAttemptHTTP2:     false,
+				MaxIdleConns:          10,
+				IdleConnTimeout:       30 * time.Second,
+				TLSHandshakeTimeout:   10 * time.Second,
+				ExpectContinueTimeout: 5 * time.Second,
 			},
 		},
-	}
-	sf.urlParam = "/" + sf.login + "/" + sf.pass + "/"
-	if _, err := sf.Time(); err != nil {
-		return nil, fmt.Errorf("NewStoreClient(): in check connect, err=\n\t%w", err)
-	}
-	go sf.ping()
+		url:       url,
+		urlTime:   url + "anonym/time",
+		urlPut:    url + "anonym/put",
+		urlRead:   url + "anonym/get",
+		urlDelete: url + "anonym/del",
+		urlFind:   url + "anonym/find",
+	}
+	sf.servCtx.Wg().Add(1)
+	go sf.close()
+	sf.isWork = true
 	return sf, nil
 }
 
-type ListValRequest struct {
-	Val_ []string `json:"val" form:"val"`
+// Проверка на признак работы клиента
+func (sf *ClientAnonym) isClosed() bool {
+	sf.block.RLock()
+	defer sf.block.RUnlock()
+	return !sf.isWork
 }
 
-// Find -- поиск ключей по префиксу
-func (sf *StoreClient) Find(prefixKey string) ([]string, error) {
-	ctx, fnCancel := context.WithTimeout(context.Background(), time.Second*6)
-	defer fnCancel()
-
-	req, err := http.NewRequestWithContext(ctx, http.MethodPost, sf.url+sf.urlParam+prefixKey, nil)
-	if err != nil {
-		return nil, fmt.Errorf("StoreClient.Find(): in create HTTP-request, err=\n\t%w", err)
+// Find -- ищет ключи по префиксу
+func (sf *ClientAnonym) Find(prefixKey string) ([]string, error) {
+	if sf.isClosed() {
+		return nil, fmt.Errorf("ClientAnonym.Find(): client is closed")
 	}
-	req.Header.Set("Content-Type", "application/json")
-	resp, err := sf.client.Do(req)
+	if prefixKey == "" {
+		return nil, fmt.Errorf("ClientAnonym.Find(): prefixKey is empty")
+	}
+	formPost := url.Values{
+		"key": {prefixKey},
+	}
+	resp, err := sf.client.Post(sf.urlFind, "application/x-www-form-urlencoded", strings.NewReader(formPost.Encode()))
 	if err != nil {
-		return nil, fmt.Errorf("StoreClient.Find(): in exec HTTP-request, err=\n\t%w", err)
+		return nil, fmt.Errorf("ClientAnonym.Find(): in get url(%q), err=\n\t%w", sf.urlFind, err)
 	}
 	defer resp.Body.Close()
 	if resp.StatusCode != http.StatusOK {
-		return nil, fmt.Errorf("StoreClient.Find(): bad status HTTP-request, code=%v", resp.Status)
+		return nil, fmt.Errorf("ClientAnonym.Find(): err=%s", resp.Status)
 	}
 	binBody, err := io.ReadAll(resp.Body)
 	if err != nil {
-		return nil, fmt.Errorf("StoreClient.Find(): in read body HTTP-request, err\n\t%w", err)
-	}
-	_resp := &ListValRequest{
-		Val_: []string{},
+		return nil, fmt.Errorf("ClientAnonym.Find(): in read body, err=\n\t%w", err)
 	}
-	err = json.Unmarshal(binBody, _resp)
+	req, err := msg_net.UnmarshalFindRequest(prefixKey, binBody)
 	if err != nil {
-		return nil, fmt.Errorf("StoreClient.Find(): in unmarshal body HTTP-response, err\n\t%w", err)
+		return nil, fmt.Errorf("ClientAnonym.Find(): in unmarshal find request, err=\n\t%w", err)
 	}
-	return _resp.Val_, nil
+	return req.Values(), nil
 }
 
-// Del -- удаляет ключ с сервера
-func (sf *StoreClient) Del(key string) {
-	ctx, fnCancel := context.WithTimeout(context.Background(), time.Second*6)
-	defer fnCancel()
-
-	req, err := http.NewRequestWithContext(ctx, http.MethodPost, sf.url+sf.urlParam+key, nil)
-	if err != nil {
-		log.Printf("StoreClient.Del(): in create HTTP-request, err=\n\t%w", err)
-		return
+// Delete -- удаление ключа из хранилища
+func (sf *ClientAnonym) Delete(key string) error {
+	if sf.isClosed() {
+		return fmt.Errorf("ClientAnonym.Delete(): client is closed")
 	}
-	req.Header.Set("Content-Type", "application/json")
-	resp, err := sf.client.Do(req)
+	if key == "" {
+		return fmt.Errorf("ClientAnonym.Delete(): key is empty")
+	}
+	formPost := url.Values{
+		"key": {key},
+	}
+	resp, err := sf.client.Post(sf.urlDelete, "application/x-www-form-urlencoded", strings.NewReader(formPost.Encode()))
 	if err != nil {
-		log.Printf("StoreClient.Del(): in exec HTTP-request, err=\n\t%w", err)
-		return
+		return fmt.Errorf("ClientAnonym.Delete(): in get url(%q), err=\n\t%w", sf.urlDelete, err)
 	}
 	defer resp.Body.Close()
 	if resp.StatusCode != http.StatusOK {
-		log.Printf("StoreClient.Del(): bad status HTTP-request, code=%v", resp.Status)
-		return
+		return fmt.Errorf("ClientAnonym.Delete(): err=%s", resp.Status)
 	}
+	return nil
 }
 
-// Time -- проверяет время сервера
-func (sf *StoreClient) Time() (string, error) {
-	ctx, fnCancel := context.WithTimeout(context.Background(), time.Second*6)
-	defer fnCancel()
-
-	req, err := http.NewRequestWithContext(ctx, http.MethodGet, sf.url+"/time", nil)
+// Read -- получает значение по ключу
+func (sf *ClientAnonym) Read(key string) (string, error) {
+	if sf.isClosed() {
+		return "", fmt.Errorf("ClientAnonym.Read(): client is closed")
+	}
+	if key == "" {
+		return "", fmt.Errorf("ClientAnonym.Read(): key is empty")
+	}
+	formPost := url.Values{
+		"key": {key},
+	}
+	resp, err := sf.client.Post(sf.urlRead, "application/x-www-form-urlencoded", strings.NewReader(formPost.Encode()))
 	if err != nil {
-		fmt.Println(err)
-		return "", fmt.Errorf("StoreClient.Time(): in create HTTP-request, err=\n\t%w", err)
+		return "", fmt.Errorf("ClientAnonym.Read(): in get url(%q), err=\n\t%w", sf.urlRead, err)
 	}
-	resp, err := sf.client.Do(req)
+	defer resp.Body.Close()
+	if resp.StatusCode != http.StatusOK {
+		return "", fmt.Errorf("ClientAnonym.Read(): err=%s", resp.Status)
+	}
+	binBody, err := io.ReadAll(resp.Body)
+	if err != nil {
+		return "", fmt.Errorf("ClientAnonym.Read(): err=\n\t%w", err)
+	}
+	strResp := string(binBody)
+	return strResp, nil
+}
+
+// Put -- помещает в хранилище ключ и значение
+func (sf *ClientAnonym) Put(key string, binData []byte) (string, error) {
+	if sf.isClosed() {
+		return "", fmt.Errorf("ClientAnonym.Ping(): client is closed")
+	}
+	if key == "" {
+		return "", fmt.Errorf("ClientAnonym.Put(): key is empty")
+	}
+	postForm := url.Values{
+		"key": {key},
+		"val": {string(binData)},
+	}
+	resp, err := sf.client.Post(sf.urlPut, "application/x-www-form-urlencoded", strings.NewReader(postForm.Encode()))
 	if err != nil {
-		return "", fmt.Errorf("StoreClient.Time(): in exec HTTP-request, err=\n\t%w", err)
+		return "", fmt.Errorf("ClientAnonym.Put(): in get url(%q), err=\n\t%w", sf.url, err)
 	}
 	defer resp.Body.Close()
 	if resp.StatusCode != http.StatusOK {
-		return "", fmt.Errorf("StoreClient.Time(): bad status HTTP-request, code=%v", resp.Status)
+		return "", fmt.Errorf("ClientAnonym.Put(): err=%s", resp.Status)
 	}
 	binBody, err := io.ReadAll(resp.Body)
 	if err != nil {
-		return "", fmt.Errorf("StoreClient.Time(): in read body HTTP-request, err\n\t%w", err)
+		return "", fmt.Errorf("ClientAnonym.Put(): err=\n\t%w", err)
 	}
-	return string(binBody), nil
+	strResp := string(binBody)
+	return strResp, nil
 }
 
-// Пингует в фоне сервер, чтобы не оборвался коннект
-func (sf *StoreClient) ping() {
-	for {
-		_, _ = sf.Time()
-		time.Sleep(time.Second * 7)
+// Time -- пингует указанный сервис в реальном времени
+func (sf *ClientAnonym) Time() error {
+	if sf.isClosed() {
+		return fmt.Errorf("ClientAnonym.Time(): client is closed")
 	}
+	resp, err := sf.client.Get(sf.urlTime)
+	if err != nil {
+		return fmt.Errorf("ClientAnonym.Time(): in get url(%q), err=\n\t%w", sf.urlTime, err)
+	}
+	defer resp.Body.Close()
+	if resp.StatusCode != http.StatusOK {
+		return fmt.Errorf("ClientAnonym.Time(): err=%s", resp.Status)
+	}
+	binBody, err := io.ReadAll(resp.Body)
+	if err != nil {
+		return fmt.Errorf("ClientAnonym.Time(): err=\n\t%w", err)
+	}
+	_ = binBody
+	return err
 }
 
-*/
+// Ожидает закрытия сервиса и освобождает сервис
+func (sf *ClientAnonym) close() {
+	<-sf.servCtx.Ctx().Done()
+	sf.block.Lock()
+	defer sf.block.Unlock()
+	if !sf.isWork {
+		return
+	}
+	sf.isWork = false
+	sf.servCtx.Wg().Done()
+}

+ 79 - 0
pkg/client_anonym/client_anonym_test.go

@@ -1 +1,80 @@
 package client_anonym
+
+import (
+	"os"
+	"testing"
+
+	"git.p78su.freemyip.com/svi/gostore/pkg/mock"
+	"git.p78su.freemyip.com/svi/gostore/pkg/types"
+)
+
+const (
+	strUrl = "http://localhost:25000/"
+)
+
+type tester struct {
+	t      *testing.T
+	serv   types.IService
+	client *ClientAnonym
+}
+
+func TestClientAnonym(t *testing.T) {
+	fnClear := func() {
+		_ = os.RemoveAll("./store")
+	}
+	fnClear()
+	defer fnClear()
+	sf := &tester{
+		t: t,
+	}
+	sf.create()
+}
+
+// Создание клиента
+func (sf *tester) create() {
+	sf.t.Log("create")
+	sf.createBad1()
+	sf.createBad2()
+	sf.createGood1()
+}
+
+func (sf *tester) createGood1() {
+	sf.t.Log("createGood1")
+	var err error
+	sf.client, err = NewClientAnonym(sf.serv, strUrl)
+	if err != nil {
+		sf.t.Fatalf("createGood1(): err=\n\t%v", err)
+	}
+	if sf.client == nil {
+		sf.t.Fatalf("createGood1(): client==nil")
+	}
+}
+
+// Нет адреса хранилища
+func (sf *tester) createBad2() {
+	sf.t.Log("createBad2")
+	var err error
+	sf.serv, err = mock.MakeMock()
+	if err != nil {
+		sf.t.Fatalf("createBad2(): err=\n\t%v", err)
+	}
+	client, err := NewClientAnonym(sf.serv, "")
+	if err == nil {
+		sf.t.Fatalf("createBad2(): err==nil")
+	}
+	if client != nil {
+		sf.t.Fatalf("createBad2(): client!=nil")
+	}
+}
+
+// Нет объекта сервиса
+func (sf *tester) createBad1() {
+	sf.t.Log("createBad1")
+	client, err := NewClientAnonym(nil, strUrl)
+	if err == nil {
+		sf.t.Fatalf("createBad1(): err==nil")
+	}
+	if client != nil {
+		sf.t.Fatalf("createBad1(): client!=nil")
+	}
+}

+ 26 - 0
pkg/mock/mock.go

@@ -1,2 +1,28 @@
 // package mock -- инфраструктура для тестирования
 package mock
+
+import (
+	"fmt"
+	"os"
+
+	"git.p78su.freemyip.com/svi/gostore/pkg/mock/mock_service"
+	"git.p78su.freemyip.com/svi/gostore/pkg/serv_http"
+	"git.p78su.freemyip.com/svi/gostore/pkg/store"
+	"git.p78su.freemyip.com/svi/gostore/pkg/types"
+)
+
+func MakeMock() (types.IService, error) {
+	os.Unsetenv("STORE_HTTP_PORT")
+	os.Setenv("STORE_HTTP_PORT", "25000")
+	serv := mock_service.NewMockService()
+	var err error
+	serv.Store_, err = store.NewStore(serv)
+	if err != nil {
+		return nil, fmt.Errorf("MakeMock(): in create Store, err=\n\t%w", err)
+	}
+	serv.ServHttp_, err = serv_http.NewServHttp(serv)
+	if err != nil {
+		return nil, fmt.Errorf("MakeMock(): in create ServHttp, err=\n\t%w", err)
+	}
+	return serv, err
+}

+ 56 - 0
pkg/msg_net/msg_net.go

@@ -0,0 +1,56 @@
+// package msg_net -- сетевые сообщения
+package msg_net
+
+import (
+	"encoding/json"
+	"fmt"
+
+	"git.p78su.freemyip.com/svi/gostore/pkg/types"
+)
+
+// Читает значение из анонимного хранилища
+type MsgFindRequest struct {
+	Key_    string   `json:"key" form:"key"`    // Ключ для поиска в хранилище (запрос)
+	Values_ []string `json:"values" form:"val"` // Ключи в хранилище по префиксу (ответ)
+}
+
+// NewFindRequest -- создание запроса на поиск
+func NewFindRequest(key string) (types.IFindRequest, error) {
+	if key == "" {
+		return nil, fmt.Errorf("NewFindRequest(): key is empty")
+	}
+	sf := &MsgFindRequest{
+		Key_:    key,
+		Values_: []string{},
+	}
+	return sf, nil
+}
+
+// UnmarshalFindRequest -- десериализация
+func UnmarshalFindRequest(key string, binData []byte) (types.IFindRequest, error) {
+	sf := &MsgFindRequest{}
+	err := json.Unmarshal(binData, sf)
+	if err != nil {
+		return nil, fmt.Errorf("Unmarshal(): in JSON decode, err=\n\t%w", err)
+	}
+	if sf.Key_ != key {
+		return nil, fmt.Errorf("Unmarshal(): key mismatch(%q, key=%q)", sf.Key_, key)
+	}
+	return sf, nil
+}
+
+// Marshal -- сериализация
+func (sf *MsgFindRequest) Marshal() []byte {
+	binData, _ := json.MarshalIndent(sf, "", "  ")
+	return binData
+}
+
+// Values -- возвращает список ключей по префиксу
+func (sf *MsgFindRequest) Values() []string {
+	return sf.Values_
+}
+
+// Key -- возвращает ключ запроса
+func (sf *MsgFindRequest) Key() string {
+	return sf.Key_
+}

+ 79 - 0
pkg/msg_net/msg_net_test.go

@@ -0,0 +1,79 @@
+package msg_net
+
+import (
+	"testing"
+)
+
+type tester struct {
+	t   *testing.T
+	msg *MsgFindRequest
+}
+
+func TestMsgNet(t *testing.T) {
+	sf := &tester{
+		t: t,
+	}
+	sf.create()
+}
+
+// Создание сообщения поиска
+func (sf *tester) create() {
+	sf.t.Log("create")
+	sf.createBad1()
+	sf.createGood1()
+}
+
+func (sf *tester) createGood1() {
+	sf.t.Log("createGood1")
+	msg, err := NewFindRequest("key")
+	if err != nil {
+		sf.t.Fatalf("createGood1(): err=\n\t%v", err)
+	}
+	if msg == nil {
+		sf.t.Fatalf("createGood1(): msg==nil")
+	}
+	sf.msg = msg.(*MsgFindRequest)
+	if val := sf.msg.Values(); len(val) != 0 {
+		sf.t.Fatalf("createGood1(): len(val)=%d", len(val))
+	}
+	if key := sf.msg.Key(); key != "key" {
+		sf.t.Fatalf("createGood1(): key=%q", key)
+	}
+	binData := sf.msg.Marshal()
+	msg, err = UnmarshalFindRequest("key", binData)
+	if err != nil {
+		sf.t.Fatalf("createGood1(): err=\n\t%v", err)
+	}
+	if msg == nil {
+		sf.t.Fatalf("createGood1(): msg==nil")
+	}
+	if key := msg.Key(); key != "key" {
+		sf.t.Fatalf("createGood1(): key=%q", key)
+	}
+	_msg, err := UnmarshalFindRequest("key", []byte{})
+	if err == nil {
+		sf.t.Fatalf("createGood1(): err==nil")
+	}
+	if _msg != nil {
+		sf.t.Fatalf("createGood1(): _msg!=nil")
+	}
+	_msg1, err := UnmarshalFindRequest("key", []byte(`{"key":"key_bad"}`))
+	if err == nil {
+		sf.t.Fatalf("createGood1(): err==nil")
+	}
+	if _msg1 != nil {
+		sf.t.Fatalf("createGood1(): _msg1!=nil")
+	}
+}
+
+// Нет ключа хранилища
+func (sf *tester) createBad1() {
+	sf.t.Log("createBad1")
+	msg, err := NewFindRequest("")
+	if err == nil {
+		sf.t.Fatalf("createBad1(): err==nil")
+	}
+	if msg != nil {
+		sf.t.Fatalf("createBad1(): msg!=nil")
+	}
+}

+ 0 - 0
internal/serv_http/router_anonym/anonym_del/anonym_del.go → pkg/serv_http/router_anonym/anonym_del/anonym_del.go


+ 0 - 0
internal/serv_http/router_anonym/anonym_del/anonym_del_test.go → pkg/serv_http/router_anonym/anonym_del/anonym_del_test.go


+ 3 - 8
internal/serv_http/router_anonym/anonym_find/anonym_find.go → pkg/serv_http/router_anonym/anonym_find/anonym_find.go

@@ -9,6 +9,7 @@ import (
 
 	"github.com/gofiber/fiber/v2"
 
+	"git.p78su.freemyip.com/svi/gostore/pkg/msg_net"
 	"git.p78su.freemyip.com/svi/gostore/pkg/types"
 )
 
@@ -38,17 +39,11 @@ func NewAnonymFind(servHttp types.IServHttp, router fiber.Router) (*AnonymFind,
 	return sf, nil
 }
 
-// FindRequest -- читает значение из анонимного хранилища
-type FindRequest struct {
-	Key_    string   `json:"key" form:"key"`    // Ключ для поиска в хранилище
-	Values_ []string `json:"values" form:"val"` // Ключи в хранилище по префиксу
-}
-
 // Проверяет допустимость ключа для анонимного хранилища
 func (sf *AnonymFind) findCheckPrefix(ctx *fiber.Ctx) error {
 	strBody := string(ctx.Body())
 	log.Println("AnonymFind.findCheckPrefix():", strBody)
-	req := &FindRequest{}
+	req := &msg_net.MsgFindRequest{}
 	err := ctx.BodyParser(req)
 	if err != nil {
 		return ctx.SendString("AnonymFind.findCheckPrefix(): " + err.Error())
@@ -66,7 +61,7 @@ func (sf *AnonymFind) get(ctx *fiber.Ctx) error {
 
 // Возвращает список ключей по префиксу из анонимного хранилища
 func (sf *AnonymFind) post(ctx *fiber.Ctx) error {
-	req := &FindRequest{}
+	req := &msg_net.MsgFindRequest{}
 	if err := ctx.BodyParser(req); err != nil {
 		return ctx.Render("anonym_find", fiber.Map{
 			"res": fmt.Sprintf("AnonymFind.post(): при парсинге формы, err=%v", err),

+ 0 - 0
internal/serv_http/router_anonym/anonym_find/anonym_find_test.go → pkg/serv_http/router_anonym/anonym_find/anonym_find_test.go


+ 0 - 0
internal/serv_http/router_anonym/anonym_list/anonym_list.go → pkg/serv_http/router_anonym/anonym_list/anonym_list.go


+ 0 - 0
internal/serv_http/router_anonym/anonym_list/anonym_list_test.go → pkg/serv_http/router_anonym/anonym_list/anonym_list_test.go


+ 0 - 0
internal/serv_http/router_anonym/anonym_put/anonym_put.go → pkg/serv_http/router_anonym/anonym_put/anonym_put.go


+ 0 - 0
internal/serv_http/router_anonym/anonym_put/anonym_put_test.go → pkg/serv_http/router_anonym/anonym_put/anonym_put_test.go


+ 0 - 0
internal/serv_http/router_anonym/anonym_read/anoneym_read_test.go → pkg/serv_http/router_anonym/anonym_read/anoneym_read_test.go


+ 0 - 0
internal/serv_http/router_anonym/anonym_read/anonym_read.go → pkg/serv_http/router_anonym/anonym_read/anonym_read.go


+ 7 - 6
internal/serv_http/router_anonym/router_anonym.go → pkg/serv_http/router_anonym/router_anonym.go

@@ -5,13 +5,14 @@ import (
 	"fmt"
 	"time"
 
-	"git.p78su.freemyip.com/svi/gostore/internal/serv_http/router_anonym/anonym_del"
-	"git.p78su.freemyip.com/svi/gostore/internal/serv_http/router_anonym/anonym_find"
-	"git.p78su.freemyip.com/svi/gostore/internal/serv_http/router_anonym/anonym_list"
-	"git.p78su.freemyip.com/svi/gostore/internal/serv_http/router_anonym/anonym_put"
-	"git.p78su.freemyip.com/svi/gostore/internal/serv_http/router_anonym/anonym_read"
-	"git.p78su.freemyip.com/svi/gostore/pkg/types"
 	"github.com/gofiber/fiber/v2"
+
+	"git.p78su.freemyip.com/svi/gostore/pkg/serv_http/router_anonym/anonym_del"
+	"git.p78su.freemyip.com/svi/gostore/pkg/serv_http/router_anonym/anonym_find"
+	"git.p78su.freemyip.com/svi/gostore/pkg/serv_http/router_anonym/anonym_list"
+	"git.p78su.freemyip.com/svi/gostore/pkg/serv_http/router_anonym/anonym_put"
+	"git.p78su.freemyip.com/svi/gostore/pkg/serv_http/router_anonym/anonym_read"
+	"git.p78su.freemyip.com/svi/gostore/pkg/types"
 )
 
 // RouterAnonym -- реализация HTTP-роутера с анонимным хранилищем

+ 0 - 0
internal/serv_http/router_anonym/router_anonym_test.go → pkg/serv_http/router_anonym/router_anonym_test.go


+ 4 - 4
internal/serv_http/serv_http.go → pkg/serv_http/serv_http.go

@@ -14,7 +14,7 @@ import (
 	"github.com/gofiber/fiber/v2/utils"
 	"github.com/gofiber/template/html/v2"
 
-	"git.p78su.freemyip.com/svi/gostore/internal/serv_http/router_anonym"
+	"git.p78su.freemyip.com/svi/gostore/pkg/serv_http/router_anonym"
 	"git.p78su.freemyip.com/svi/gostore/pkg/types"
 )
 
@@ -30,13 +30,13 @@ type ServHttp struct {
 }
 
 // NewServHttp -- возвращает новый HTTP-сервер
-func NewServHttp(serv types.IService) (*ServHttp, error) {
+func NewServHttp(serv types.IService) (types.IServHttp, error) {
 	if serv == nil {
 		return nil, fmt.Errorf("NewServHttp(): IService==nil")
 	}
-	port := os.Getenv("HTTP_PORT")
+	port := os.Getenv("STORE_HTTP_PORT")
 	if port == "" {
-		return nil, fmt.Errorf("NewServHttp(): env HTTP_PORT not set")
+		return nil, fmt.Errorf("NewServHttp(): env STORE_HTTP_PORT not set")
 	}
 	engineTmpl := html.New("./static/tmpl", ".tmpl.html")
 	appConf := fiber.Config{

+ 11 - 11
internal/serv_http/serv_http_test.go → pkg/serv_http/serv_http_test.go

@@ -6,13 +6,15 @@ import (
 	"testing"
 	"time"
 
-	"git.p78su.freemyip.com/svi/gostore/pkg/mock/mock_service"
 	"github.com/gofiber/fiber/v2"
+
+	"git.p78su.freemyip.com/svi/gostore/pkg/mock/mock_service"
+	"git.p78su.freemyip.com/svi/gostore/pkg/types"
 )
 
 type tester struct {
 	t    *testing.T
-	serv *mock_service.MockService
+	serv types.IService
 	web  *ServHttp
 }
 
@@ -59,12 +61,12 @@ func (sf *tester) create() {
 
 func (sf *tester) createGood1() {
 	sf.t.Log("createGood1")
-	var err error
-	os.Setenv("HTTP_PORT", "8080")
-	sf.web, err = NewServHttp(sf.serv)
+	os.Setenv("STORE_HTTP_PORT", "8080")
+	web, err := NewServHttp(sf.serv)
 	if err != nil {
 		sf.t.Fatalf("createGood1(): err=\n\t%v", err)
 	}
+	sf.web = web.(*ServHttp)
 	if sf.web == nil {
 		sf.t.Fatalf("createGood1(): web==nil")
 	}
@@ -80,12 +82,11 @@ func (sf *tester) createGood1() {
 func (sf *tester) createBad2() {
 	sf.t.Log("createBad2")
 	sf.serv = mock_service.NewMockService()
-	var err error
-	sf.web, err = NewServHttp(sf.serv)
+	web, err := NewServHttp(sf.serv)
 	if err == nil {
 		sf.t.Fatalf("createBad2(): err==nil")
 	}
-	if sf.web != nil {
+	if web != nil {
 		sf.t.Fatalf("createBad2(): web!=nil")
 	}
 }
@@ -94,12 +95,11 @@ func (sf *tester) createBad2() {
 func (sf *tester) createBad1() {
 	sf.t.Log("createBad1")
 	sf.serv = mock_service.NewMockService()
-	var err error
-	sf.web, err = NewServHttp(nil)
+	web, err := NewServHttp(nil)
 	if err == nil {
 		sf.t.Fatalf("createBad1(): err==nil")
 	}
-	if sf.web != nil {
+	if web != nil {
 		sf.t.Fatalf("createBad1(): web!=nil")
 	}
 }

+ 3 - 3
internal/store/store.go → pkg/store/store.go

@@ -16,7 +16,7 @@ import (
 
 // StoreDisk -- хранилище на диске
 type Store struct {
-	serv   types.IService
+	serv   types.IServCtx
 	db     *leveldb.DB
 	isWork bool
 	block  sync.RWMutex
@@ -25,12 +25,12 @@ type Store struct {
 var IsBad_ = false // Для тестов
 
 // NewStore -- возвращает новое хранилище на диске
-func NewStore(serv types.IService) (*Store, error) {
+func NewStore(serv types.IServCtx) (types.IStore, error) {
 	if IsBad_ {
 		return nil, fmt.Errorf("NewStore(): IsBad_==true")
 	}
 	if serv == nil {
-		return nil, fmt.Errorf("NewStore(): IService==nil")
+		return nil, fmt.Errorf("NewStore(): IServCtx==nil")
 	}
 	_ = os.MkdirAll("./store/db", 0750)
 	db, err := leveldb.OpenFile("./store/db", nil)

+ 2 - 2
internal/store/store_test.go → pkg/store/store_test.go

@@ -142,11 +142,11 @@ func (sf *tester) create() {
 
 func (sf *tester) createGood1() {
 	sf.t.Log("createGood1")
-	var err error
-	sf.store, err = NewStore(sf.serv)
+	store, err := NewStore(sf.serv)
 	if err != nil {
 		sf.t.Fatalf("createGood1(): in create IStoreDisk, err=\n\t%v", err)
 	}
+	sf.store = store.(*Store)
 	if sf.store == nil {
 		sf.t.Fatalf("createGood1(): store==nil")
 	}

+ 9 - 0
pkg/types/imsg_net.go

@@ -0,0 +1,9 @@
+package types
+
+// IFindRequest -- интерфейс запроса на поиск
+type IFindRequest interface {
+	// Key -- ключ для поиска в хранилище
+	Key() string
+	// Values -- ключи по префиксу
+	Values() []string
+}

+ 9 - 4
pkg/types/iservice.go

@@ -6,16 +6,21 @@ import (
 	"sync"
 )
 
-// IService -- объект сервиса
-type IService interface {
-	// Run -- запускает сервис в работу
-	Run()
+// IServCtx -- контекст сервиса
+type IServCtx interface {
 	// Ctx -- возвращает контекст приложения
 	Ctx() context.Context
 	// CancelApp -- отменяет контекст приложения
 	CancelApp()
 	// Wg -- возвращает ожидатель группы потоков
 	Wg() *sync.WaitGroup
+}
+
+// IService -- объект сервиса
+type IService interface {
+	IServCtx
+	// Run -- запускает сервис в работу
+	Run()
 	// Store -- хранилище
 	Store() IStore
 	// ServHttp -- HTTP-сервер