diff --git a/.phpactor.json b/.phpactor.json
new file mode 100644
index 0000000..4d42bbb
--- /dev/null
+++ b/.phpactor.json
@@ -0,0 +1,4 @@
+{
+ "$schema": "/phpactor.schema.json",
+ "language_server_phpstan.enabled": true
+}
\ No newline at end of file
diff --git a/.phpunit.cache/code-coverage/012e54d5c8b0488695480eb77a9af01b8a63a25afde9cdf74ef8e0d1a4ae1e0d b/.phpunit.cache/code-coverage/012e54d5c8b0488695480eb77a9af01b8a63a25afde9cdf74ef8e0d1a4ae1e0d
new file mode 100644
index 0000000..fed6827
Binary files /dev/null and b/.phpunit.cache/code-coverage/012e54d5c8b0488695480eb77a9af01b8a63a25afde9cdf74ef8e0d1a4ae1e0d differ
diff --git a/.phpunit.cache/code-coverage/01a603683bc40906780b61f3fadd9a937384faf97b43a8e11a2ccff51fd94551 b/.phpunit.cache/code-coverage/01a603683bc40906780b61f3fadd9a937384faf97b43a8e11a2ccff51fd94551
new file mode 100644
index 0000000..0cf22a3
Binary files /dev/null and b/.phpunit.cache/code-coverage/01a603683bc40906780b61f3fadd9a937384faf97b43a8e11a2ccff51fd94551 differ
diff --git a/.phpunit.cache/code-coverage/01f15c06362be3f7156dde133744005dd0efa24ea6f128f000b7f62ca92757d5 b/.phpunit.cache/code-coverage/01f15c06362be3f7156dde133744005dd0efa24ea6f128f000b7f62ca92757d5
new file mode 100644
index 0000000..8d913de
Binary files /dev/null and b/.phpunit.cache/code-coverage/01f15c06362be3f7156dde133744005dd0efa24ea6f128f000b7f62ca92757d5 differ
diff --git a/.phpunit.cache/code-coverage/032d20e914ec18582e7ba0088454d926b397c576ae2d77536f02adc983134435 b/.phpunit.cache/code-coverage/032d20e914ec18582e7ba0088454d926b397c576ae2d77536f02adc983134435
new file mode 100644
index 0000000..ad78f73
Binary files /dev/null and b/.phpunit.cache/code-coverage/032d20e914ec18582e7ba0088454d926b397c576ae2d77536f02adc983134435 differ
diff --git a/.phpunit.cache/code-coverage/05b1733f15ae4d24c1ed1bc29981f49634f03200d97f382c052cd9b18175f0e9 b/.phpunit.cache/code-coverage/05b1733f15ae4d24c1ed1bc29981f49634f03200d97f382c052cd9b18175f0e9
new file mode 100644
index 0000000..d5c275f
Binary files /dev/null and b/.phpunit.cache/code-coverage/05b1733f15ae4d24c1ed1bc29981f49634f03200d97f382c052cd9b18175f0e9 differ
diff --git a/.phpunit.cache/code-coverage/083757a40ac5b891a5eca3c381650ba5ed5fa0c4307f7a9b1d21ebe901726c21 b/.phpunit.cache/code-coverage/083757a40ac5b891a5eca3c381650ba5ed5fa0c4307f7a9b1d21ebe901726c21
new file mode 100644
index 0000000..f9a19d9
Binary files /dev/null and b/.phpunit.cache/code-coverage/083757a40ac5b891a5eca3c381650ba5ed5fa0c4307f7a9b1d21ebe901726c21 differ
diff --git a/.phpunit.cache/code-coverage/0bb43d21c74ab1c92038da46d9a408fe926dde480e74222463d31b7760b44142 b/.phpunit.cache/code-coverage/0bb43d21c74ab1c92038da46d9a408fe926dde480e74222463d31b7760b44142
new file mode 100644
index 0000000..b26ce64
Binary files /dev/null and b/.phpunit.cache/code-coverage/0bb43d21c74ab1c92038da46d9a408fe926dde480e74222463d31b7760b44142 differ
diff --git a/.phpunit.cache/code-coverage/0bc628d1b9e749bbbdb7df14cbd416134aab0acb18bc6221057423bbfc398de0 b/.phpunit.cache/code-coverage/0bc628d1b9e749bbbdb7df14cbd416134aab0acb18bc6221057423bbfc398de0
new file mode 100644
index 0000000..003a45f
Binary files /dev/null and b/.phpunit.cache/code-coverage/0bc628d1b9e749bbbdb7df14cbd416134aab0acb18bc6221057423bbfc398de0 differ
diff --git a/.phpunit.cache/code-coverage/0c9b9a3ae15104870c2c37b4cef006a87772b8ae39932003cec7939c913d6662 b/.phpunit.cache/code-coverage/0c9b9a3ae15104870c2c37b4cef006a87772b8ae39932003cec7939c913d6662
new file mode 100644
index 0000000..8963f43
Binary files /dev/null and b/.phpunit.cache/code-coverage/0c9b9a3ae15104870c2c37b4cef006a87772b8ae39932003cec7939c913d6662 differ
diff --git a/.phpunit.cache/code-coverage/0d5ddb3107d998e5d69bd60e5a8b3956da573312ec1b81d5529d893f63a53d27 b/.phpunit.cache/code-coverage/0d5ddb3107d998e5d69bd60e5a8b3956da573312ec1b81d5529d893f63a53d27
new file mode 100644
index 0000000..de14308
Binary files /dev/null and b/.phpunit.cache/code-coverage/0d5ddb3107d998e5d69bd60e5a8b3956da573312ec1b81d5529d893f63a53d27 differ
diff --git a/.phpunit.cache/code-coverage/0ffc11b25fae4aae2958e77ee2026fd450964d240d64b759f0954da94960980b b/.phpunit.cache/code-coverage/0ffc11b25fae4aae2958e77ee2026fd450964d240d64b759f0954da94960980b
new file mode 100644
index 0000000..cbb98cd
Binary files /dev/null and b/.phpunit.cache/code-coverage/0ffc11b25fae4aae2958e77ee2026fd450964d240d64b759f0954da94960980b differ
diff --git a/.phpunit.cache/code-coverage/10436d5acfa3545ff9ce1499a6748ca5025c3e47f752880cc67ef5c514f721b3 b/.phpunit.cache/code-coverage/10436d5acfa3545ff9ce1499a6748ca5025c3e47f752880cc67ef5c514f721b3
new file mode 100644
index 0000000..200a41c
Binary files /dev/null and b/.phpunit.cache/code-coverage/10436d5acfa3545ff9ce1499a6748ca5025c3e47f752880cc67ef5c514f721b3 differ
diff --git a/.phpunit.cache/code-coverage/107f3b7990a8d610d330d14d216c2fc329617af7d719d533c680f60c5ba5cd86 b/.phpunit.cache/code-coverage/107f3b7990a8d610d330d14d216c2fc329617af7d719d533c680f60c5ba5cd86
new file mode 100644
index 0000000..e8e810c
Binary files /dev/null and b/.phpunit.cache/code-coverage/107f3b7990a8d610d330d14d216c2fc329617af7d719d533c680f60c5ba5cd86 differ
diff --git a/.phpunit.cache/code-coverage/143c164a1c6b0358752de99c8676715a73e3d79d86e0965db63076e28cf07bc6 b/.phpunit.cache/code-coverage/143c164a1c6b0358752de99c8676715a73e3d79d86e0965db63076e28cf07bc6
new file mode 100644
index 0000000..3dc1e1c
Binary files /dev/null and b/.phpunit.cache/code-coverage/143c164a1c6b0358752de99c8676715a73e3d79d86e0965db63076e28cf07bc6 differ
diff --git a/.phpunit.cache/code-coverage/183696210de2b8f5316e1736be329a25c0d3a4839f19a6983e5147e4ed7f90c7 b/.phpunit.cache/code-coverage/183696210de2b8f5316e1736be329a25c0d3a4839f19a6983e5147e4ed7f90c7
new file mode 100644
index 0000000..464f944
Binary files /dev/null and b/.phpunit.cache/code-coverage/183696210de2b8f5316e1736be329a25c0d3a4839f19a6983e5147e4ed7f90c7 differ
diff --git a/.phpunit.cache/code-coverage/19fd1b5b65f4f7b84094d256389adca102e064b7ea0e301770e4d8a4e0f86df4 b/.phpunit.cache/code-coverage/19fd1b5b65f4f7b84094d256389adca102e064b7ea0e301770e4d8a4e0f86df4
new file mode 100644
index 0000000..be7f4cc
Binary files /dev/null and b/.phpunit.cache/code-coverage/19fd1b5b65f4f7b84094d256389adca102e064b7ea0e301770e4d8a4e0f86df4 differ
diff --git a/.phpunit.cache/code-coverage/22c41f0865858261924a5c580f7beaf7a6faebc3da73642c1c3110ddaac0de45 b/.phpunit.cache/code-coverage/22c41f0865858261924a5c580f7beaf7a6faebc3da73642c1c3110ddaac0de45
new file mode 100644
index 0000000..509772c
Binary files /dev/null and b/.phpunit.cache/code-coverage/22c41f0865858261924a5c580f7beaf7a6faebc3da73642c1c3110ddaac0de45 differ
diff --git a/.phpunit.cache/code-coverage/252eb511128084f01499ea654f740ca1132e302037f24b4a6ad380ad5464e87e b/.phpunit.cache/code-coverage/252eb511128084f01499ea654f740ca1132e302037f24b4a6ad380ad5464e87e
new file mode 100644
index 0000000..b271643
Binary files /dev/null and b/.phpunit.cache/code-coverage/252eb511128084f01499ea654f740ca1132e302037f24b4a6ad380ad5464e87e differ
diff --git a/.phpunit.cache/code-coverage/2668dec7d91d4575ff0659c5cf2015ea025a78664d4d725523a1c7ce09418ae2 b/.phpunit.cache/code-coverage/2668dec7d91d4575ff0659c5cf2015ea025a78664d4d725523a1c7ce09418ae2
new file mode 100644
index 0000000..fed6827
Binary files /dev/null and b/.phpunit.cache/code-coverage/2668dec7d91d4575ff0659c5cf2015ea025a78664d4d725523a1c7ce09418ae2 differ
diff --git a/.phpunit.cache/code-coverage/26ad1e9da43f14c8708008a220611c9d0459a4eb60102228aab4b30b2d75290d b/.phpunit.cache/code-coverage/26ad1e9da43f14c8708008a220611c9d0459a4eb60102228aab4b30b2d75290d
new file mode 100644
index 0000000..ab3f125
Binary files /dev/null and b/.phpunit.cache/code-coverage/26ad1e9da43f14c8708008a220611c9d0459a4eb60102228aab4b30b2d75290d differ
diff --git a/.phpunit.cache/code-coverage/271f5c5c2fe8b2ae5fc709062f4f99e8a0687cdad9ea973afc2ceeedce23392a b/.phpunit.cache/code-coverage/271f5c5c2fe8b2ae5fc709062f4f99e8a0687cdad9ea973afc2ceeedce23392a
new file mode 100644
index 0000000..a9cb686
Binary files /dev/null and b/.phpunit.cache/code-coverage/271f5c5c2fe8b2ae5fc709062f4f99e8a0687cdad9ea973afc2ceeedce23392a differ
diff --git a/.phpunit.cache/code-coverage/2878eb060d79ef24f4b5fa12f25c9e4dd32df2f176c53d4c8278f49242d0883b b/.phpunit.cache/code-coverage/2878eb060d79ef24f4b5fa12f25c9e4dd32df2f176c53d4c8278f49242d0883b
new file mode 100644
index 0000000..53d7dee
Binary files /dev/null and b/.phpunit.cache/code-coverage/2878eb060d79ef24f4b5fa12f25c9e4dd32df2f176c53d4c8278f49242d0883b differ
diff --git a/.phpunit.cache/code-coverage/2988f0c65f9a2c4d19906da3118157bc071220da9147af3f0215ee9ce0d6df45 b/.phpunit.cache/code-coverage/2988f0c65f9a2c4d19906da3118157bc071220da9147af3f0215ee9ce0d6df45
new file mode 100644
index 0000000..4a580b9
Binary files /dev/null and b/.phpunit.cache/code-coverage/2988f0c65f9a2c4d19906da3118157bc071220da9147af3f0215ee9ce0d6df45 differ
diff --git a/.phpunit.cache/code-coverage/2a9a7a4e8fc65aa14acf0760056a18a7cfa253bb68e01dda54477df308fb479c b/.phpunit.cache/code-coverage/2a9a7a4e8fc65aa14acf0760056a18a7cfa253bb68e01dda54477df308fb479c
new file mode 100644
index 0000000..a26116b
Binary files /dev/null and b/.phpunit.cache/code-coverage/2a9a7a4e8fc65aa14acf0760056a18a7cfa253bb68e01dda54477df308fb479c differ
diff --git a/.phpunit.cache/code-coverage/2cd7e0307c50ffaf9c8acaf7bce8a95e36a32a868fd7afe197d6cb2d439f6ac5 b/.phpunit.cache/code-coverage/2cd7e0307c50ffaf9c8acaf7bce8a95e36a32a868fd7afe197d6cb2d439f6ac5
new file mode 100644
index 0000000..c6e32be
Binary files /dev/null and b/.phpunit.cache/code-coverage/2cd7e0307c50ffaf9c8acaf7bce8a95e36a32a868fd7afe197d6cb2d439f6ac5 differ
diff --git a/.phpunit.cache/code-coverage/2f3bbb85ee2e6098bdabb94eef454d92a222a2daff35d71c3ea5191b2252d382 b/.phpunit.cache/code-coverage/2f3bbb85ee2e6098bdabb94eef454d92a222a2daff35d71c3ea5191b2252d382
new file mode 100644
index 0000000..ad78f73
Binary files /dev/null and b/.phpunit.cache/code-coverage/2f3bbb85ee2e6098bdabb94eef454d92a222a2daff35d71c3ea5191b2252d382 differ
diff --git a/.phpunit.cache/code-coverage/2f858588914cf36b01005f57a90a51dc9d9b43427c9732b9e045b226219cbcd9 b/.phpunit.cache/code-coverage/2f858588914cf36b01005f57a90a51dc9d9b43427c9732b9e045b226219cbcd9
new file mode 100644
index 0000000..53cef34
Binary files /dev/null and b/.phpunit.cache/code-coverage/2f858588914cf36b01005f57a90a51dc9d9b43427c9732b9e045b226219cbcd9 differ
diff --git a/.phpunit.cache/code-coverage/2fdd65422f654f9f3ca3bee830fd1a64378ee66184313d72a733744c5c220be3 b/.phpunit.cache/code-coverage/2fdd65422f654f9f3ca3bee830fd1a64378ee66184313d72a733744c5c220be3
new file mode 100644
index 0000000..4111838
Binary files /dev/null and b/.phpunit.cache/code-coverage/2fdd65422f654f9f3ca3bee830fd1a64378ee66184313d72a733744c5c220be3 differ
diff --git a/.phpunit.cache/code-coverage/30106748c8398aded9e429eed2206539f16e6f71abf3bbd2b7546942930c6646 b/.phpunit.cache/code-coverage/30106748c8398aded9e429eed2206539f16e6f71abf3bbd2b7546942930c6646
new file mode 100644
index 0000000..436bc71
Binary files /dev/null and b/.phpunit.cache/code-coverage/30106748c8398aded9e429eed2206539f16e6f71abf3bbd2b7546942930c6646 differ
diff --git a/.phpunit.cache/code-coverage/30134be138c297ec7a57610cdb78b96bb6b4ff6b769b2218927230e80be43d30 b/.phpunit.cache/code-coverage/30134be138c297ec7a57610cdb78b96bb6b4ff6b769b2218927230e80be43d30
new file mode 100644
index 0000000..072f510
Binary files /dev/null and b/.phpunit.cache/code-coverage/30134be138c297ec7a57610cdb78b96bb6b4ff6b769b2218927230e80be43d30 differ
diff --git a/.phpunit.cache/code-coverage/31d15339824d7a09d09a62761530bb0c0f91d6bf9b75eb5cca273a01395d43e9 b/.phpunit.cache/code-coverage/31d15339824d7a09d09a62761530bb0c0f91d6bf9b75eb5cca273a01395d43e9
new file mode 100644
index 0000000..f1278dc
Binary files /dev/null and b/.phpunit.cache/code-coverage/31d15339824d7a09d09a62761530bb0c0f91d6bf9b75eb5cca273a01395d43e9 differ
diff --git a/.phpunit.cache/code-coverage/373ed2d0cfc0fc97c62676e9fd5baa7e75355fdeb746533fc0d5235158cbbb30 b/.phpunit.cache/code-coverage/373ed2d0cfc0fc97c62676e9fd5baa7e75355fdeb746533fc0d5235158cbbb30
new file mode 100644
index 0000000..d39b003
Binary files /dev/null and b/.phpunit.cache/code-coverage/373ed2d0cfc0fc97c62676e9fd5baa7e75355fdeb746533fc0d5235158cbbb30 differ
diff --git a/.phpunit.cache/code-coverage/39653e6715ccc52daca4125f8eb5f1c27d1e0b249db0471196cc97ae387175fe b/.phpunit.cache/code-coverage/39653e6715ccc52daca4125f8eb5f1c27d1e0b249db0471196cc97ae387175fe
new file mode 100644
index 0000000..556cf5c
Binary files /dev/null and b/.phpunit.cache/code-coverage/39653e6715ccc52daca4125f8eb5f1c27d1e0b249db0471196cc97ae387175fe differ
diff --git a/.phpunit.cache/code-coverage/3a5cb2d0775e437a44492cbbbfe25c1d06a41a279c7c43ecd94745bab2dff00c b/.phpunit.cache/code-coverage/3a5cb2d0775e437a44492cbbbfe25c1d06a41a279c7c43ecd94745bab2dff00c
new file mode 100644
index 0000000..77ad484
Binary files /dev/null and b/.phpunit.cache/code-coverage/3a5cb2d0775e437a44492cbbbfe25c1d06a41a279c7c43ecd94745bab2dff00c differ
diff --git a/.phpunit.cache/code-coverage/3b4759d01d4f56730a93f702f2d4f39ca349c1ae09d938a4a2f6a9d88b5bbd6e b/.phpunit.cache/code-coverage/3b4759d01d4f56730a93f702f2d4f39ca349c1ae09d938a4a2f6a9d88b5bbd6e
new file mode 100644
index 0000000..bff5aec
Binary files /dev/null and b/.phpunit.cache/code-coverage/3b4759d01d4f56730a93f702f2d4f39ca349c1ae09d938a4a2f6a9d88b5bbd6e differ
diff --git a/.phpunit.cache/code-coverage/3c3584a71f2bccef11fc3f68d14723cd8e87f8684fd0e321b46f1a5b17212efc b/.phpunit.cache/code-coverage/3c3584a71f2bccef11fc3f68d14723cd8e87f8684fd0e321b46f1a5b17212efc
new file mode 100644
index 0000000..218a653
Binary files /dev/null and b/.phpunit.cache/code-coverage/3c3584a71f2bccef11fc3f68d14723cd8e87f8684fd0e321b46f1a5b17212efc differ
diff --git a/.phpunit.cache/code-coverage/3c70c0ff274b0beda5e7f64f053f988fe711fb26208a7e56cdc930cc79c74a6c b/.phpunit.cache/code-coverage/3c70c0ff274b0beda5e7f64f053f988fe711fb26208a7e56cdc930cc79c74a6c
new file mode 100644
index 0000000..231d47a
Binary files /dev/null and b/.phpunit.cache/code-coverage/3c70c0ff274b0beda5e7f64f053f988fe711fb26208a7e56cdc930cc79c74a6c differ
diff --git a/.phpunit.cache/code-coverage/3ea18c701f45e4136423051df0e3fd049e42af6b5eba59903bf436a93f771a6a b/.phpunit.cache/code-coverage/3ea18c701f45e4136423051df0e3fd049e42af6b5eba59903bf436a93f771a6a
new file mode 100644
index 0000000..4fd3e77
Binary files /dev/null and b/.phpunit.cache/code-coverage/3ea18c701f45e4136423051df0e3fd049e42af6b5eba59903bf436a93f771a6a differ
diff --git a/.phpunit.cache/code-coverage/3ec6405a054b830394eea333a426488852b602c086632bc96f274a1e6852bd4f b/.phpunit.cache/code-coverage/3ec6405a054b830394eea333a426488852b602c086632bc96f274a1e6852bd4f
new file mode 100644
index 0000000..ea70719
Binary files /dev/null and b/.phpunit.cache/code-coverage/3ec6405a054b830394eea333a426488852b602c086632bc96f274a1e6852bd4f differ
diff --git a/.phpunit.cache/code-coverage/42e41b43013e209d73902ceb758810eda072b3903198fa0b2408b21b41b10104 b/.phpunit.cache/code-coverage/42e41b43013e209d73902ceb758810eda072b3903198fa0b2408b21b41b10104
new file mode 100644
index 0000000..f9008c3
Binary files /dev/null and b/.phpunit.cache/code-coverage/42e41b43013e209d73902ceb758810eda072b3903198fa0b2408b21b41b10104 differ
diff --git a/.phpunit.cache/code-coverage/461a5172ded254232103b74f759919a9a312a8eca39f0dfb48aa76db9a1e0d7a b/.phpunit.cache/code-coverage/461a5172ded254232103b74f759919a9a312a8eca39f0dfb48aa76db9a1e0d7a
new file mode 100644
index 0000000..ae35325
Binary files /dev/null and b/.phpunit.cache/code-coverage/461a5172ded254232103b74f759919a9a312a8eca39f0dfb48aa76db9a1e0d7a differ
diff --git a/.phpunit.cache/code-coverage/472958917a1e48b762aff9f5da7522e3f55210d6fe22da36c6483a7b5c2c26e3 b/.phpunit.cache/code-coverage/472958917a1e48b762aff9f5da7522e3f55210d6fe22da36c6483a7b5c2c26e3
new file mode 100644
index 0000000..d8543d0
Binary files /dev/null and b/.phpunit.cache/code-coverage/472958917a1e48b762aff9f5da7522e3f55210d6fe22da36c6483a7b5c2c26e3 differ
diff --git a/.phpunit.cache/code-coverage/476e79bfcb78e78ce5eb2c553379217fce9cd7f6c5effd086f95d0733c265ffd b/.phpunit.cache/code-coverage/476e79bfcb78e78ce5eb2c553379217fce9cd7f6c5effd086f95d0733c265ffd
new file mode 100644
index 0000000..bb1d634
Binary files /dev/null and b/.phpunit.cache/code-coverage/476e79bfcb78e78ce5eb2c553379217fce9cd7f6c5effd086f95d0733c265ffd differ
diff --git a/.phpunit.cache/code-coverage/4c9a909c76cf3c6d79ad4ca4b1a223630c9d470a0c887c070b88fde736b234a5 b/.phpunit.cache/code-coverage/4c9a909c76cf3c6d79ad4ca4b1a223630c9d470a0c887c070b88fde736b234a5
new file mode 100644
index 0000000..caf24b6
Binary files /dev/null and b/.phpunit.cache/code-coverage/4c9a909c76cf3c6d79ad4ca4b1a223630c9d470a0c887c070b88fde736b234a5 differ
diff --git a/.phpunit.cache/code-coverage/4ecd312b6a5a3d5e1dcc45c6bb31f544e3f55db103ec84d97e04acfdf0053e13 b/.phpunit.cache/code-coverage/4ecd312b6a5a3d5e1dcc45c6bb31f544e3f55db103ec84d97e04acfdf0053e13
new file mode 100644
index 0000000..4bc79b6
Binary files /dev/null and b/.phpunit.cache/code-coverage/4ecd312b6a5a3d5e1dcc45c6bb31f544e3f55db103ec84d97e04acfdf0053e13 differ
diff --git a/.phpunit.cache/code-coverage/4f06cee570176b1924f7674d68bef16d085e884dac05124ed5a8f23fcbc67891 b/.phpunit.cache/code-coverage/4f06cee570176b1924f7674d68bef16d085e884dac05124ed5a8f23fcbc67891
new file mode 100644
index 0000000..5fc8131
Binary files /dev/null and b/.phpunit.cache/code-coverage/4f06cee570176b1924f7674d68bef16d085e884dac05124ed5a8f23fcbc67891 differ
diff --git a/.phpunit.cache/code-coverage/505f79cff095e8d183ea33853c6710bec395a6ffaf9835fb5231a316fe7d62e4 b/.phpunit.cache/code-coverage/505f79cff095e8d183ea33853c6710bec395a6ffaf9835fb5231a316fe7d62e4
new file mode 100644
index 0000000..f5df172
Binary files /dev/null and b/.phpunit.cache/code-coverage/505f79cff095e8d183ea33853c6710bec395a6ffaf9835fb5231a316fe7d62e4 differ
diff --git a/.phpunit.cache/code-coverage/5384b49fdb5ae5fa91f4ce811ac3c71d2699e7f578a5fe46c3521fe1d367f7ec b/.phpunit.cache/code-coverage/5384b49fdb5ae5fa91f4ce811ac3c71d2699e7f578a5fe46c3521fe1d367f7ec
new file mode 100644
index 0000000..3178c84
Binary files /dev/null and b/.phpunit.cache/code-coverage/5384b49fdb5ae5fa91f4ce811ac3c71d2699e7f578a5fe46c3521fe1d367f7ec differ
diff --git a/.phpunit.cache/code-coverage/543d30469abc90e40ccc2ff2d327af1d9347126805ce680e3e280df9794ac262 b/.phpunit.cache/code-coverage/543d30469abc90e40ccc2ff2d327af1d9347126805ce680e3e280df9794ac262
new file mode 100644
index 0000000..37dd502
Binary files /dev/null and b/.phpunit.cache/code-coverage/543d30469abc90e40ccc2ff2d327af1d9347126805ce680e3e280df9794ac262 differ
diff --git a/.phpunit.cache/code-coverage/56d37fb26998ba09589ef3267c21edea4df08a37afde5efc6a4494d33f52ae0e b/.phpunit.cache/code-coverage/56d37fb26998ba09589ef3267c21edea4df08a37afde5efc6a4494d33f52ae0e
new file mode 100644
index 0000000..fab688b
Binary files /dev/null and b/.phpunit.cache/code-coverage/56d37fb26998ba09589ef3267c21edea4df08a37afde5efc6a4494d33f52ae0e differ
diff --git a/.phpunit.cache/code-coverage/577abd178bf9cb7207883a61e52431c2aafe24081c7076fb89b04b209413d884 b/.phpunit.cache/code-coverage/577abd178bf9cb7207883a61e52431c2aafe24081c7076fb89b04b209413d884
new file mode 100644
index 0000000..3dfe2c3
Binary files /dev/null and b/.phpunit.cache/code-coverage/577abd178bf9cb7207883a61e52431c2aafe24081c7076fb89b04b209413d884 differ
diff --git a/.phpunit.cache/code-coverage/583ad3d1ad7f737c2645517d62e62abcfc937162a3971b440fcf285e94ebe060 b/.phpunit.cache/code-coverage/583ad3d1ad7f737c2645517d62e62abcfc937162a3971b440fcf285e94ebe060
new file mode 100644
index 0000000..97f282e
Binary files /dev/null and b/.phpunit.cache/code-coverage/583ad3d1ad7f737c2645517d62e62abcfc937162a3971b440fcf285e94ebe060 differ
diff --git a/.phpunit.cache/code-coverage/5dc90b5a28b82a104e9f8f2d7779adefa2ab28b13407116142d783a61db35e9a b/.phpunit.cache/code-coverage/5dc90b5a28b82a104e9f8f2d7779adefa2ab28b13407116142d783a61db35e9a
new file mode 100644
index 0000000..8ae42fd
Binary files /dev/null and b/.phpunit.cache/code-coverage/5dc90b5a28b82a104e9f8f2d7779adefa2ab28b13407116142d783a61db35e9a differ
diff --git a/.phpunit.cache/code-coverage/5dd537ecf090a413b5b71586d88c43ddb081455692a47887417db1cfbbd89421 b/.phpunit.cache/code-coverage/5dd537ecf090a413b5b71586d88c43ddb081455692a47887417db1cfbbd89421
new file mode 100644
index 0000000..a992147
Binary files /dev/null and b/.phpunit.cache/code-coverage/5dd537ecf090a413b5b71586d88c43ddb081455692a47887417db1cfbbd89421 differ
diff --git a/.phpunit.cache/code-coverage/5e293181648e7578929365675f161b2295862e37b09d86a9a40e592c1f4ffd2c b/.phpunit.cache/code-coverage/5e293181648e7578929365675f161b2295862e37b09d86a9a40e592c1f4ffd2c
new file mode 100644
index 0000000..00499aa
Binary files /dev/null and b/.phpunit.cache/code-coverage/5e293181648e7578929365675f161b2295862e37b09d86a9a40e592c1f4ffd2c differ
diff --git a/.phpunit.cache/code-coverage/5e832fd9d4079828d29563aae03f64fe69c4a62b3c75f483542d94fb1204922d b/.phpunit.cache/code-coverage/5e832fd9d4079828d29563aae03f64fe69c4a62b3c75f483542d94fb1204922d
new file mode 100644
index 0000000..cbb98cd
Binary files /dev/null and b/.phpunit.cache/code-coverage/5e832fd9d4079828d29563aae03f64fe69c4a62b3c75f483542d94fb1204922d differ
diff --git a/.phpunit.cache/code-coverage/60e3560c249b13efc778e33a2f807eb73916d256f0da69cc33112464033c98f1 b/.phpunit.cache/code-coverage/60e3560c249b13efc778e33a2f807eb73916d256f0da69cc33112464033c98f1
new file mode 100644
index 0000000..e18cd96
Binary files /dev/null and b/.phpunit.cache/code-coverage/60e3560c249b13efc778e33a2f807eb73916d256f0da69cc33112464033c98f1 differ
diff --git a/.phpunit.cache/code-coverage/60e877f873751653177e206af3bceefb5325ac2c04dfebc37ab704855109c20c b/.phpunit.cache/code-coverage/60e877f873751653177e206af3bceefb5325ac2c04dfebc37ab704855109c20c
new file mode 100644
index 0000000..9b3fcb4
Binary files /dev/null and b/.phpunit.cache/code-coverage/60e877f873751653177e206af3bceefb5325ac2c04dfebc37ab704855109c20c differ
diff --git a/.phpunit.cache/code-coverage/62ace4b29fd381b91924f61ef02b1f45e5dfe25f4194d115387181bb200ca67a b/.phpunit.cache/code-coverage/62ace4b29fd381b91924f61ef02b1f45e5dfe25f4194d115387181bb200ca67a
new file mode 100644
index 0000000..d02f395
Binary files /dev/null and b/.phpunit.cache/code-coverage/62ace4b29fd381b91924f61ef02b1f45e5dfe25f4194d115387181bb200ca67a differ
diff --git a/.phpunit.cache/code-coverage/64ac040bfc1f68d13d8a187d89d5d26e7a5245f46b2107e00a060fef01bc9535 b/.phpunit.cache/code-coverage/64ac040bfc1f68d13d8a187d89d5d26e7a5245f46b2107e00a060fef01bc9535
new file mode 100644
index 0000000..03a9fa2
Binary files /dev/null and b/.phpunit.cache/code-coverage/64ac040bfc1f68d13d8a187d89d5d26e7a5245f46b2107e00a060fef01bc9535 differ
diff --git a/.phpunit.cache/code-coverage/659c396e7d4288deb6b82308fc070584c445f7e588c01243c4e4f7ef0f8f1971 b/.phpunit.cache/code-coverage/659c396e7d4288deb6b82308fc070584c445f7e588c01243c4e4f7ef0f8f1971
new file mode 100644
index 0000000..e7aa953
Binary files /dev/null and b/.phpunit.cache/code-coverage/659c396e7d4288deb6b82308fc070584c445f7e588c01243c4e4f7ef0f8f1971 differ
diff --git a/.phpunit.cache/code-coverage/673515d5d8d2751e89c893439977498e4f492c0199326862d3bf9be8e6ffa776 b/.phpunit.cache/code-coverage/673515d5d8d2751e89c893439977498e4f492c0199326862d3bf9be8e6ffa776
new file mode 100644
index 0000000..3e8b1ad
Binary files /dev/null and b/.phpunit.cache/code-coverage/673515d5d8d2751e89c893439977498e4f492c0199326862d3bf9be8e6ffa776 differ
diff --git a/.phpunit.cache/code-coverage/677feebf72100d628733e70d75987c62d2f7ab46f6dd5cfa76e22aed4d0db64b b/.phpunit.cache/code-coverage/677feebf72100d628733e70d75987c62d2f7ab46f6dd5cfa76e22aed4d0db64b
new file mode 100644
index 0000000..a6718ac
Binary files /dev/null and b/.phpunit.cache/code-coverage/677feebf72100d628733e70d75987c62d2f7ab46f6dd5cfa76e22aed4d0db64b differ
diff --git a/.phpunit.cache/code-coverage/67959c07853fbd8415b83f7456917ef659395ac70aeddeb98e5521ee806b1b59 b/.phpunit.cache/code-coverage/67959c07853fbd8415b83f7456917ef659395ac70aeddeb98e5521ee806b1b59
new file mode 100644
index 0000000..f01edb9
Binary files /dev/null and b/.phpunit.cache/code-coverage/67959c07853fbd8415b83f7456917ef659395ac70aeddeb98e5521ee806b1b59 differ
diff --git a/.phpunit.cache/code-coverage/681517ba3b619a067812884c54d07722307281bb254049901259bc9d43ebc8e7 b/.phpunit.cache/code-coverage/681517ba3b619a067812884c54d07722307281bb254049901259bc9d43ebc8e7
new file mode 100644
index 0000000..0badf5c
Binary files /dev/null and b/.phpunit.cache/code-coverage/681517ba3b619a067812884c54d07722307281bb254049901259bc9d43ebc8e7 differ
diff --git a/.phpunit.cache/code-coverage/687aaacd1e81f7030881458f664315886a89bc2b02a28e62c6dbce0b420858e8 b/.phpunit.cache/code-coverage/687aaacd1e81f7030881458f664315886a89bc2b02a28e62c6dbce0b420858e8
new file mode 100644
index 0000000..5202a43
Binary files /dev/null and b/.phpunit.cache/code-coverage/687aaacd1e81f7030881458f664315886a89bc2b02a28e62c6dbce0b420858e8 differ
diff --git a/.phpunit.cache/code-coverage/69459d717d21d6862e6b90506ec536acf665d6372cd1aef1dfb5c8d713ae5188 b/.phpunit.cache/code-coverage/69459d717d21d6862e6b90506ec536acf665d6372cd1aef1dfb5c8d713ae5188
new file mode 100644
index 0000000..e7f94c9
Binary files /dev/null and b/.phpunit.cache/code-coverage/69459d717d21d6862e6b90506ec536acf665d6372cd1aef1dfb5c8d713ae5188 differ
diff --git a/.phpunit.cache/code-coverage/6a294d7688671c08f9fcd8fd7262020ef548ba3fe93639441fcfa425d381aee5 b/.phpunit.cache/code-coverage/6a294d7688671c08f9fcd8fd7262020ef548ba3fe93639441fcfa425d381aee5
new file mode 100644
index 0000000..68604a8
Binary files /dev/null and b/.phpunit.cache/code-coverage/6a294d7688671c08f9fcd8fd7262020ef548ba3fe93639441fcfa425d381aee5 differ
diff --git a/.phpunit.cache/code-coverage/6b591c37727859264b390521a3bfed41627f83964b2c1cc514528d91f98a22cb b/.phpunit.cache/code-coverage/6b591c37727859264b390521a3bfed41627f83964b2c1cc514528d91f98a22cb
new file mode 100644
index 0000000..e47ddc5
Binary files /dev/null and b/.phpunit.cache/code-coverage/6b591c37727859264b390521a3bfed41627f83964b2c1cc514528d91f98a22cb differ
diff --git a/.phpunit.cache/code-coverage/6c22512389ebe9aaf850070d142a22c0406113b1f1e9a722eaf6d62e945d9903 b/.phpunit.cache/code-coverage/6c22512389ebe9aaf850070d142a22c0406113b1f1e9a722eaf6d62e945d9903
new file mode 100644
index 0000000..7317a03
Binary files /dev/null and b/.phpunit.cache/code-coverage/6c22512389ebe9aaf850070d142a22c0406113b1f1e9a722eaf6d62e945d9903 differ
diff --git a/.phpunit.cache/code-coverage/6c395cc5f46ab9638fc477f46fb56ba37025a8019487c95e41e60d3f6be13b92 b/.phpunit.cache/code-coverage/6c395cc5f46ab9638fc477f46fb56ba37025a8019487c95e41e60d3f6be13b92
new file mode 100644
index 0000000..95d5bc3
Binary files /dev/null and b/.phpunit.cache/code-coverage/6c395cc5f46ab9638fc477f46fb56ba37025a8019487c95e41e60d3f6be13b92 differ
diff --git a/.phpunit.cache/code-coverage/6d837209ee8deb4eb2f1d948d4c5f2f5134ca1a70e2637e1d72961b7ec76013e b/.phpunit.cache/code-coverage/6d837209ee8deb4eb2f1d948d4c5f2f5134ca1a70e2637e1d72961b7ec76013e
new file mode 100644
index 0000000..0073eb9
Binary files /dev/null and b/.phpunit.cache/code-coverage/6d837209ee8deb4eb2f1d948d4c5f2f5134ca1a70e2637e1d72961b7ec76013e differ
diff --git a/.phpunit.cache/code-coverage/6da487a5b943cd80fc7e2eb4517ea089d55ffaf55ccd2efc746457b34bfa6515 b/.phpunit.cache/code-coverage/6da487a5b943cd80fc7e2eb4517ea089d55ffaf55ccd2efc746457b34bfa6515
new file mode 100644
index 0000000..b771f53
Binary files /dev/null and b/.phpunit.cache/code-coverage/6da487a5b943cd80fc7e2eb4517ea089d55ffaf55ccd2efc746457b34bfa6515 differ
diff --git a/.phpunit.cache/code-coverage/6eef50ea947ff2f56b1905740c53a70d3401f762b678e9c415a2581022f09d97 b/.phpunit.cache/code-coverage/6eef50ea947ff2f56b1905740c53a70d3401f762b678e9c415a2581022f09d97
new file mode 100644
index 0000000..cbb98cd
Binary files /dev/null and b/.phpunit.cache/code-coverage/6eef50ea947ff2f56b1905740c53a70d3401f762b678e9c415a2581022f09d97 differ
diff --git a/.phpunit.cache/code-coverage/6f6b736d495558abd7e4449df340ad78d14fe665aa38c59fa4e3c4104fb6a4d6 b/.phpunit.cache/code-coverage/6f6b736d495558abd7e4449df340ad78d14fe665aa38c59fa4e3c4104fb6a4d6
new file mode 100644
index 0000000..de14308
Binary files /dev/null and b/.phpunit.cache/code-coverage/6f6b736d495558abd7e4449df340ad78d14fe665aa38c59fa4e3c4104fb6a4d6 differ
diff --git a/.phpunit.cache/code-coverage/717c0c1adcc2afabc59efd35933e592ce47764648e6e68f59b76c7a8444b59ec b/.phpunit.cache/code-coverage/717c0c1adcc2afabc59efd35933e592ce47764648e6e68f59b76c7a8444b59ec
new file mode 100644
index 0000000..9e29533
Binary files /dev/null and b/.phpunit.cache/code-coverage/717c0c1adcc2afabc59efd35933e592ce47764648e6e68f59b76c7a8444b59ec differ
diff --git a/.phpunit.cache/code-coverage/74a51c4dd08c7491e712aad70a79750618f4760f12ea8226e5707cc3d9d589d1 b/.phpunit.cache/code-coverage/74a51c4dd08c7491e712aad70a79750618f4760f12ea8226e5707cc3d9d589d1
new file mode 100644
index 0000000..74e1519
Binary files /dev/null and b/.phpunit.cache/code-coverage/74a51c4dd08c7491e712aad70a79750618f4760f12ea8226e5707cc3d9d589d1 differ
diff --git a/.phpunit.cache/code-coverage/787f210913b554b0c2bcb83fd1cdef9915a858f4a0468ef987b1bbe29449dc94 b/.phpunit.cache/code-coverage/787f210913b554b0c2bcb83fd1cdef9915a858f4a0468ef987b1bbe29449dc94
new file mode 100644
index 0000000..412aec6
Binary files /dev/null and b/.phpunit.cache/code-coverage/787f210913b554b0c2bcb83fd1cdef9915a858f4a0468ef987b1bbe29449dc94 differ
diff --git a/.phpunit.cache/code-coverage/78b99be928d8a8b26188c87ed2a95724fc8ab1195f4d837ea4f3c1c7799be525 b/.phpunit.cache/code-coverage/78b99be928d8a8b26188c87ed2a95724fc8ab1195f4d837ea4f3c1c7799be525
new file mode 100644
index 0000000..948ce9c
Binary files /dev/null and b/.phpunit.cache/code-coverage/78b99be928d8a8b26188c87ed2a95724fc8ab1195f4d837ea4f3c1c7799be525 differ
diff --git a/.phpunit.cache/code-coverage/7910ba259fad99aa2bab014353bb136e0d3a5798af37a8721cef3b67c9aa0756 b/.phpunit.cache/code-coverage/7910ba259fad99aa2bab014353bb136e0d3a5798af37a8721cef3b67c9aa0756
new file mode 100644
index 0000000..bd4c9ca
Binary files /dev/null and b/.phpunit.cache/code-coverage/7910ba259fad99aa2bab014353bb136e0d3a5798af37a8721cef3b67c9aa0756 differ
diff --git a/.phpunit.cache/code-coverage/7d779e6605a2b1981feea76927669bc11959acd049afd5a3be02b8721d511e55 b/.phpunit.cache/code-coverage/7d779e6605a2b1981feea76927669bc11959acd049afd5a3be02b8721d511e55
new file mode 100644
index 0000000..d60ccd9
Binary files /dev/null and b/.phpunit.cache/code-coverage/7d779e6605a2b1981feea76927669bc11959acd049afd5a3be02b8721d511e55 differ
diff --git a/.phpunit.cache/code-coverage/7f087b6a52aa9e4b64e538272010b716faf17a42bca4414dc0f0448db1c45229 b/.phpunit.cache/code-coverage/7f087b6a52aa9e4b64e538272010b716faf17a42bca4414dc0f0448db1c45229
new file mode 100644
index 0000000..cb52022
Binary files /dev/null and b/.phpunit.cache/code-coverage/7f087b6a52aa9e4b64e538272010b716faf17a42bca4414dc0f0448db1c45229 differ
diff --git a/.phpunit.cache/code-coverage/81555a7bb827fb19a964af3807f320e1375b8428296e762f874c81f7249df91d b/.phpunit.cache/code-coverage/81555a7bb827fb19a964af3807f320e1375b8428296e762f874c81f7249df91d
new file mode 100644
index 0000000..8524b71
Binary files /dev/null and b/.phpunit.cache/code-coverage/81555a7bb827fb19a964af3807f320e1375b8428296e762f874c81f7249df91d differ
diff --git a/.phpunit.cache/code-coverage/8161f3f988d050859460da9f382ccd625851b5fb80c05970a669df692814f66b b/.phpunit.cache/code-coverage/8161f3f988d050859460da9f382ccd625851b5fb80c05970a669df692814f66b
new file mode 100644
index 0000000..76da7e6
Binary files /dev/null and b/.phpunit.cache/code-coverage/8161f3f988d050859460da9f382ccd625851b5fb80c05970a669df692814f66b differ
diff --git a/.phpunit.cache/code-coverage/81fec0efe26b4c35f2454e323331ce24493239f7135c300d797369095fee25e1 b/.phpunit.cache/code-coverage/81fec0efe26b4c35f2454e323331ce24493239f7135c300d797369095fee25e1
new file mode 100644
index 0000000..05696b1
Binary files /dev/null and b/.phpunit.cache/code-coverage/81fec0efe26b4c35f2454e323331ce24493239f7135c300d797369095fee25e1 differ
diff --git a/.phpunit.cache/code-coverage/82ca45ba749968fe0ce15c0cfd1c0d4d66068ffa55c53a273d1d3357c03a34dc b/.phpunit.cache/code-coverage/82ca45ba749968fe0ce15c0cfd1c0d4d66068ffa55c53a273d1d3357c03a34dc
new file mode 100644
index 0000000..7a376c1
Binary files /dev/null and b/.phpunit.cache/code-coverage/82ca45ba749968fe0ce15c0cfd1c0d4d66068ffa55c53a273d1d3357c03a34dc differ
diff --git a/.phpunit.cache/code-coverage/83025a9e95b24b4f2604d8a91c382b36c18cd1112281def956dc98c3e948378c b/.phpunit.cache/code-coverage/83025a9e95b24b4f2604d8a91c382b36c18cd1112281def956dc98c3e948378c
new file mode 100644
index 0000000..2954956
Binary files /dev/null and b/.phpunit.cache/code-coverage/83025a9e95b24b4f2604d8a91c382b36c18cd1112281def956dc98c3e948378c differ
diff --git a/.phpunit.cache/code-coverage/8724c36d3b6ad2a4957461f34febdadcc3d070d594d6920bccee10267fa26d7d b/.phpunit.cache/code-coverage/8724c36d3b6ad2a4957461f34febdadcc3d070d594d6920bccee10267fa26d7d
new file mode 100644
index 0000000..b4af911
Binary files /dev/null and b/.phpunit.cache/code-coverage/8724c36d3b6ad2a4957461f34febdadcc3d070d594d6920bccee10267fa26d7d differ
diff --git a/.phpunit.cache/code-coverage/87bd6b2081bbf09d234d6a5ca0d5d0ef9e2ee77ea10a88f189ae11c20bff29a5 b/.phpunit.cache/code-coverage/87bd6b2081bbf09d234d6a5ca0d5d0ef9e2ee77ea10a88f189ae11c20bff29a5
new file mode 100644
index 0000000..8d913de
Binary files /dev/null and b/.phpunit.cache/code-coverage/87bd6b2081bbf09d234d6a5ca0d5d0ef9e2ee77ea10a88f189ae11c20bff29a5 differ
diff --git a/.phpunit.cache/code-coverage/88513f775607812c5a32d762c5a1b80cc83f06e626821baeca63680512cbbd58 b/.phpunit.cache/code-coverage/88513f775607812c5a32d762c5a1b80cc83f06e626821baeca63680512cbbd58
new file mode 100644
index 0000000..df0f5f2
Binary files /dev/null and b/.phpunit.cache/code-coverage/88513f775607812c5a32d762c5a1b80cc83f06e626821baeca63680512cbbd58 differ
diff --git a/.phpunit.cache/code-coverage/9134e670e9a51a45732bcc55647293a0ca876792dda59d406af7e3058f7aeba4 b/.phpunit.cache/code-coverage/9134e670e9a51a45732bcc55647293a0ca876792dda59d406af7e3058f7aeba4
new file mode 100644
index 0000000..0785ab3
Binary files /dev/null and b/.phpunit.cache/code-coverage/9134e670e9a51a45732bcc55647293a0ca876792dda59d406af7e3058f7aeba4 differ
diff --git a/.phpunit.cache/code-coverage/92375bf38956db9d5d90c2e5c6141d79cce21685925f8f88f3a1f56a8acf0cf0 b/.phpunit.cache/code-coverage/92375bf38956db9d5d90c2e5c6141d79cce21685925f8f88f3a1f56a8acf0cf0
new file mode 100644
index 0000000..4a580b9
Binary files /dev/null and b/.phpunit.cache/code-coverage/92375bf38956db9d5d90c2e5c6141d79cce21685925f8f88f3a1f56a8acf0cf0 differ
diff --git a/.phpunit.cache/code-coverage/940c503d4c3b995721481b64c98f9cda7a1e03bf98da2850d5913adb9b260e30 b/.phpunit.cache/code-coverage/940c503d4c3b995721481b64c98f9cda7a1e03bf98da2850d5913adb9b260e30
new file mode 100644
index 0000000..e9ce33f
Binary files /dev/null and b/.phpunit.cache/code-coverage/940c503d4c3b995721481b64c98f9cda7a1e03bf98da2850d5913adb9b260e30 differ
diff --git a/.phpunit.cache/code-coverage/95e8f0c5633df17449a9c4dac7c83db34aa6dfb3d386030061c966f555afb05e b/.phpunit.cache/code-coverage/95e8f0c5633df17449a9c4dac7c83db34aa6dfb3d386030061c966f555afb05e
new file mode 100644
index 0000000..c07556a
Binary files /dev/null and b/.phpunit.cache/code-coverage/95e8f0c5633df17449a9c4dac7c83db34aa6dfb3d386030061c966f555afb05e differ
diff --git a/.phpunit.cache/code-coverage/9736dfc98e14ad06e20bd8d865875c6823967236b28fab887718666729b375d7 b/.phpunit.cache/code-coverage/9736dfc98e14ad06e20bd8d865875c6823967236b28fab887718666729b375d7
new file mode 100644
index 0000000..c6f9abb
Binary files /dev/null and b/.phpunit.cache/code-coverage/9736dfc98e14ad06e20bd8d865875c6823967236b28fab887718666729b375d7 differ
diff --git a/.phpunit.cache/code-coverage/977fbe6927d30c9b8402a8b4d61f2d8f3c25aa8b5b10971ee7c903678de3f24a b/.phpunit.cache/code-coverage/977fbe6927d30c9b8402a8b4d61f2d8f3c25aa8b5b10971ee7c903678de3f24a
new file mode 100644
index 0000000..39ffc23
Binary files /dev/null and b/.phpunit.cache/code-coverage/977fbe6927d30c9b8402a8b4d61f2d8f3c25aa8b5b10971ee7c903678de3f24a differ
diff --git a/.phpunit.cache/code-coverage/994ded48695bbd6cab97dc7c0590bd080039f39551b5284452f77431b54c3adb b/.phpunit.cache/code-coverage/994ded48695bbd6cab97dc7c0590bd080039f39551b5284452f77431b54c3adb
new file mode 100644
index 0000000..123b3ef
Binary files /dev/null and b/.phpunit.cache/code-coverage/994ded48695bbd6cab97dc7c0590bd080039f39551b5284452f77431b54c3adb differ
diff --git a/.phpunit.cache/code-coverage/9c15bf1ea310802f2555166807fd5ba29f6c7ec281507505bd3a6c85dcd9f38e b/.phpunit.cache/code-coverage/9c15bf1ea310802f2555166807fd5ba29f6c7ec281507505bd3a6c85dcd9f38e
new file mode 100644
index 0000000..dbeca8e
Binary files /dev/null and b/.phpunit.cache/code-coverage/9c15bf1ea310802f2555166807fd5ba29f6c7ec281507505bd3a6c85dcd9f38e differ
diff --git a/.phpunit.cache/code-coverage/9d0ba74b57d047a8753cbb1caf5498bd58954ff8550bafdf681504b8eefa9d06 b/.phpunit.cache/code-coverage/9d0ba74b57d047a8753cbb1caf5498bd58954ff8550bafdf681504b8eefa9d06
new file mode 100644
index 0000000..5f1296f
Binary files /dev/null and b/.phpunit.cache/code-coverage/9d0ba74b57d047a8753cbb1caf5498bd58954ff8550bafdf681504b8eefa9d06 differ
diff --git a/.phpunit.cache/code-coverage/9e6a57203c7516bf062ec4cabbaad56fc45ec0b335a0f27631c2c215bfabc502 b/.phpunit.cache/code-coverage/9e6a57203c7516bf062ec4cabbaad56fc45ec0b335a0f27631c2c215bfabc502
new file mode 100644
index 0000000..f01edb9
Binary files /dev/null and b/.phpunit.cache/code-coverage/9e6a57203c7516bf062ec4cabbaad56fc45ec0b335a0f27631c2c215bfabc502 differ
diff --git a/.phpunit.cache/code-coverage/9ea1759d72943a95103cafa5e9af71e702144b1e476e0e129f9554a4264c50ee b/.phpunit.cache/code-coverage/9ea1759d72943a95103cafa5e9af71e702144b1e476e0e129f9554a4264c50ee
new file mode 100644
index 0000000..a6491c5
Binary files /dev/null and b/.phpunit.cache/code-coverage/9ea1759d72943a95103cafa5e9af71e702144b1e476e0e129f9554a4264c50ee differ
diff --git a/.phpunit.cache/code-coverage/a0012e20e6a32b65b701ea46320c702d3bb3db69ad816e1e92184993f8b3d625 b/.phpunit.cache/code-coverage/a0012e20e6a32b65b701ea46320c702d3bb3db69ad816e1e92184993f8b3d625
new file mode 100644
index 0000000..e30678f
Binary files /dev/null and b/.phpunit.cache/code-coverage/a0012e20e6a32b65b701ea46320c702d3bb3db69ad816e1e92184993f8b3d625 differ
diff --git a/.phpunit.cache/code-coverage/a0b6ceb731de526ec5381f3e075c409ccffe45d06780b4df002b2622dc3cb0a1 b/.phpunit.cache/code-coverage/a0b6ceb731de526ec5381f3e075c409ccffe45d06780b4df002b2622dc3cb0a1
new file mode 100644
index 0000000..5cbf1b8
Binary files /dev/null and b/.phpunit.cache/code-coverage/a0b6ceb731de526ec5381f3e075c409ccffe45d06780b4df002b2622dc3cb0a1 differ
diff --git a/.phpunit.cache/code-coverage/a199f392b3f2663e4ffe7ef9e25cab369a747ae1c83d817162e33604a49cd022 b/.phpunit.cache/code-coverage/a199f392b3f2663e4ffe7ef9e25cab369a747ae1c83d817162e33604a49cd022
new file mode 100644
index 0000000..37dd502
Binary files /dev/null and b/.phpunit.cache/code-coverage/a199f392b3f2663e4ffe7ef9e25cab369a747ae1c83d817162e33604a49cd022 differ
diff --git a/.phpunit.cache/code-coverage/a9eaa4db72c4c55f4ded53d71ee680138165d7022b281359522a02eca17a8d7a b/.phpunit.cache/code-coverage/a9eaa4db72c4c55f4ded53d71ee680138165d7022b281359522a02eca17a8d7a
new file mode 100644
index 0000000..f0c0173
Binary files /dev/null and b/.phpunit.cache/code-coverage/a9eaa4db72c4c55f4ded53d71ee680138165d7022b281359522a02eca17a8d7a differ
diff --git a/.phpunit.cache/code-coverage/aaac9602c0fcb0e0feb213b67868831f0f9015b01eeb17d00176f99f11a9aa3d b/.phpunit.cache/code-coverage/aaac9602c0fcb0e0feb213b67868831f0f9015b01eeb17d00176f99f11a9aa3d
new file mode 100644
index 0000000..168932a
Binary files /dev/null and b/.phpunit.cache/code-coverage/aaac9602c0fcb0e0feb213b67868831f0f9015b01eeb17d00176f99f11a9aa3d differ
diff --git a/.phpunit.cache/code-coverage/ab9eaac7d32860a2b4bde7b5bb569acc957b22baa9098e77e3bd8ac839883e9e b/.phpunit.cache/code-coverage/ab9eaac7d32860a2b4bde7b5bb569acc957b22baa9098e77e3bd8ac839883e9e
new file mode 100644
index 0000000..9050eba
Binary files /dev/null and b/.phpunit.cache/code-coverage/ab9eaac7d32860a2b4bde7b5bb569acc957b22baa9098e77e3bd8ac839883e9e differ
diff --git a/.phpunit.cache/code-coverage/ade3d9eecd14b6521a7c4a5da29e3b42eb662171ad1a65590c172eb28ab8da44 b/.phpunit.cache/code-coverage/ade3d9eecd14b6521a7c4a5da29e3b42eb662171ad1a65590c172eb28ab8da44
new file mode 100644
index 0000000..7c294ee
Binary files /dev/null and b/.phpunit.cache/code-coverage/ade3d9eecd14b6521a7c4a5da29e3b42eb662171ad1a65590c172eb28ab8da44 differ
diff --git a/.phpunit.cache/code-coverage/ae1febd61d5c2a800b669e66d078e4c7fe9a2abfab1dd66a6d0551240008585f b/.phpunit.cache/code-coverage/ae1febd61d5c2a800b669e66d078e4c7fe9a2abfab1dd66a6d0551240008585f
new file mode 100644
index 0000000..e006742
Binary files /dev/null and b/.phpunit.cache/code-coverage/ae1febd61d5c2a800b669e66d078e4c7fe9a2abfab1dd66a6d0551240008585f differ
diff --git a/.phpunit.cache/code-coverage/b0090333aaf2e5272ce3bcc122d22a9088bd817358b8b970153b4b22e500f9ce b/.phpunit.cache/code-coverage/b0090333aaf2e5272ce3bcc122d22a9088bd817358b8b970153b4b22e500f9ce
new file mode 100644
index 0000000..fabf72d
Binary files /dev/null and b/.phpunit.cache/code-coverage/b0090333aaf2e5272ce3bcc122d22a9088bd817358b8b970153b4b22e500f9ce differ
diff --git a/.phpunit.cache/code-coverage/b0e0e038ce1dcfea2232d8940e2bdc472f18bff3fce31d3e65e19f9eb7ea0ee3 b/.phpunit.cache/code-coverage/b0e0e038ce1dcfea2232d8940e2bdc472f18bff3fce31d3e65e19f9eb7ea0ee3
new file mode 100644
index 0000000..abe038d
Binary files /dev/null and b/.phpunit.cache/code-coverage/b0e0e038ce1dcfea2232d8940e2bdc472f18bff3fce31d3e65e19f9eb7ea0ee3 differ
diff --git a/.phpunit.cache/code-coverage/b191131ba5ded43e7194d2981d362a85edcba7e774d76e9afca5253dbb88a336 b/.phpunit.cache/code-coverage/b191131ba5ded43e7194d2981d362a85edcba7e774d76e9afca5253dbb88a336
new file mode 100644
index 0000000..961b59b
Binary files /dev/null and b/.phpunit.cache/code-coverage/b191131ba5ded43e7194d2981d362a85edcba7e774d76e9afca5253dbb88a336 differ
diff --git a/.phpunit.cache/code-coverage/b6685eadb39b3e99cdf681c8121911f0d8fda1b7f8acbe5c3f6c114887bb0395 b/.phpunit.cache/code-coverage/b6685eadb39b3e99cdf681c8121911f0d8fda1b7f8acbe5c3f6c114887bb0395
new file mode 100644
index 0000000..6563300
Binary files /dev/null and b/.phpunit.cache/code-coverage/b6685eadb39b3e99cdf681c8121911f0d8fda1b7f8acbe5c3f6c114887bb0395 differ
diff --git a/.phpunit.cache/code-coverage/b7bc27e4393d1690d822ebc4a2bcfc4e5297cb360766bf10106d4034724cf9da b/.phpunit.cache/code-coverage/b7bc27e4393d1690d822ebc4a2bcfc4e5297cb360766bf10106d4034724cf9da
new file mode 100644
index 0000000..4842ee1
Binary files /dev/null and b/.phpunit.cache/code-coverage/b7bc27e4393d1690d822ebc4a2bcfc4e5297cb360766bf10106d4034724cf9da differ
diff --git a/.phpunit.cache/code-coverage/baf90f37f21b1b5fe14a0dc38b56b748fda59742318db809d2c4276b22b45d40 b/.phpunit.cache/code-coverage/baf90f37f21b1b5fe14a0dc38b56b748fda59742318db809d2c4276b22b45d40
new file mode 100644
index 0000000..7107a04
Binary files /dev/null and b/.phpunit.cache/code-coverage/baf90f37f21b1b5fe14a0dc38b56b748fda59742318db809d2c4276b22b45d40 differ
diff --git a/.phpunit.cache/code-coverage/bfd4f49c9f98ab49f455e3e98f2f24c9da3ee7323d659b7e23a8226a227660ec b/.phpunit.cache/code-coverage/bfd4f49c9f98ab49f455e3e98f2f24c9da3ee7323d659b7e23a8226a227660ec
new file mode 100644
index 0000000..ca7f34b
Binary files /dev/null and b/.phpunit.cache/code-coverage/bfd4f49c9f98ab49f455e3e98f2f24c9da3ee7323d659b7e23a8226a227660ec differ
diff --git a/.phpunit.cache/code-coverage/c1a535a49b929c1d688f4002228685acb1ef81f91eda26ef476d9e9ecda8357e b/.phpunit.cache/code-coverage/c1a535a49b929c1d688f4002228685acb1ef81f91eda26ef476d9e9ecda8357e
new file mode 100644
index 0000000..035a0cc
Binary files /dev/null and b/.phpunit.cache/code-coverage/c1a535a49b929c1d688f4002228685acb1ef81f91eda26ef476d9e9ecda8357e differ
diff --git a/.phpunit.cache/code-coverage/c24db00ed6258bf639ddf6e8572d106e645f6cc8485b18cd4abf73dad60b2e5e b/.phpunit.cache/code-coverage/c24db00ed6258bf639ddf6e8572d106e645f6cc8485b18cd4abf73dad60b2e5e
new file mode 100644
index 0000000..c972764
Binary files /dev/null and b/.phpunit.cache/code-coverage/c24db00ed6258bf639ddf6e8572d106e645f6cc8485b18cd4abf73dad60b2e5e differ
diff --git a/.phpunit.cache/code-coverage/c314c3dedf5977fd97702c0912e4f54176c11b8fcbdb2cd1030ecdcdea7ef357 b/.phpunit.cache/code-coverage/c314c3dedf5977fd97702c0912e4f54176c11b8fcbdb2cd1030ecdcdea7ef357
new file mode 100644
index 0000000..7035bd0
Binary files /dev/null and b/.phpunit.cache/code-coverage/c314c3dedf5977fd97702c0912e4f54176c11b8fcbdb2cd1030ecdcdea7ef357 differ
diff --git a/.phpunit.cache/code-coverage/c4c6afc616f19b4bf91b96d95fd99b1ffd3285d459801f2e9d935aa1e564c376 b/.phpunit.cache/code-coverage/c4c6afc616f19b4bf91b96d95fd99b1ffd3285d459801f2e9d935aa1e564c376
new file mode 100644
index 0000000..8ae42fd
Binary files /dev/null and b/.phpunit.cache/code-coverage/c4c6afc616f19b4bf91b96d95fd99b1ffd3285d459801f2e9d935aa1e564c376 differ
diff --git a/.phpunit.cache/code-coverage/c58c91423cc2123664be86bbc616b9bd6f5caff6e0db9d4356f52d324e51caeb b/.phpunit.cache/code-coverage/c58c91423cc2123664be86bbc616b9bd6f5caff6e0db9d4356f52d324e51caeb
new file mode 100644
index 0000000..7f05038
Binary files /dev/null and b/.phpunit.cache/code-coverage/c58c91423cc2123664be86bbc616b9bd6f5caff6e0db9d4356f52d324e51caeb differ
diff --git a/.phpunit.cache/code-coverage/c5ca95397c1446abad3b3ae1bdb3024d02c5ce42b477a90cdb46877b55e2e0d0 b/.phpunit.cache/code-coverage/c5ca95397c1446abad3b3ae1bdb3024d02c5ce42b477a90cdb46877b55e2e0d0
new file mode 100644
index 0000000..c8072b9
Binary files /dev/null and b/.phpunit.cache/code-coverage/c5ca95397c1446abad3b3ae1bdb3024d02c5ce42b477a90cdb46877b55e2e0d0 differ
diff --git a/.phpunit.cache/code-coverage/c7a7583699ade0157248982af4a89a816cd63fa12981f92e1b3a1fc6ce621e69 b/.phpunit.cache/code-coverage/c7a7583699ade0157248982af4a89a816cd63fa12981f92e1b3a1fc6ce621e69
new file mode 100644
index 0000000..c793b44
Binary files /dev/null and b/.phpunit.cache/code-coverage/c7a7583699ade0157248982af4a89a816cd63fa12981f92e1b3a1fc6ce621e69 differ
diff --git a/.phpunit.cache/code-coverage/c825970e34ec65e2e3959927c496e4eee29e7507f5c95e966e0438e43b3d7083 b/.phpunit.cache/code-coverage/c825970e34ec65e2e3959927c496e4eee29e7507f5c95e966e0438e43b3d7083
new file mode 100644
index 0000000..1c74441
Binary files /dev/null and b/.phpunit.cache/code-coverage/c825970e34ec65e2e3959927c496e4eee29e7507f5c95e966e0438e43b3d7083 differ
diff --git a/.phpunit.cache/code-coverage/c83d59ed5c72ad3962ae82b93abd49504eb016fbbbdb9a0ff33c9f8cbbb33b68 b/.phpunit.cache/code-coverage/c83d59ed5c72ad3962ae82b93abd49504eb016fbbbdb9a0ff33c9f8cbbb33b68
new file mode 100644
index 0000000..fa69f94
Binary files /dev/null and b/.phpunit.cache/code-coverage/c83d59ed5c72ad3962ae82b93abd49504eb016fbbbdb9a0ff33c9f8cbbb33b68 differ
diff --git a/.phpunit.cache/code-coverage/c9f61d746e5f8a533ed25a9b527856b3a6e93bd99da4202e41831cdd2a2b42ed b/.phpunit.cache/code-coverage/c9f61d746e5f8a533ed25a9b527856b3a6e93bd99da4202e41831cdd2a2b42ed
new file mode 100644
index 0000000..669469a
Binary files /dev/null and b/.phpunit.cache/code-coverage/c9f61d746e5f8a533ed25a9b527856b3a6e93bd99da4202e41831cdd2a2b42ed differ
diff --git a/.phpunit.cache/code-coverage/ca47fcf77b416a5cbb5ccb765f6d89e4d8082f222376127d3796089c6ca27561 b/.phpunit.cache/code-coverage/ca47fcf77b416a5cbb5ccb765f6d89e4d8082f222376127d3796089c6ca27561
new file mode 100644
index 0000000..b23dda4
Binary files /dev/null and b/.phpunit.cache/code-coverage/ca47fcf77b416a5cbb5ccb765f6d89e4d8082f222376127d3796089c6ca27561 differ
diff --git a/.phpunit.cache/code-coverage/d1a733f0983f6af25ea7e0b4240e1c918422bfe24d9339689d7c71d182cc276b b/.phpunit.cache/code-coverage/d1a733f0983f6af25ea7e0b4240e1c918422bfe24d9339689d7c71d182cc276b
new file mode 100644
index 0000000..1e756cc
Binary files /dev/null and b/.phpunit.cache/code-coverage/d1a733f0983f6af25ea7e0b4240e1c918422bfe24d9339689d7c71d182cc276b differ
diff --git a/.phpunit.cache/code-coverage/d45ebca55eb939d53afa7d51a004e247753d0bd209ea2e64b9c9a994cc3fb047 b/.phpunit.cache/code-coverage/d45ebca55eb939d53afa7d51a004e247753d0bd209ea2e64b9c9a994cc3fb047
new file mode 100644
index 0000000..cbb98cd
Binary files /dev/null and b/.phpunit.cache/code-coverage/d45ebca55eb939d53afa7d51a004e247753d0bd209ea2e64b9c9a994cc3fb047 differ
diff --git a/.phpunit.cache/code-coverage/d68e23eace34afc8d8c99fbc3679f1135ddd9dc7b0023db6e997b4c4e9e79fe3 b/.phpunit.cache/code-coverage/d68e23eace34afc8d8c99fbc3679f1135ddd9dc7b0023db6e997b4c4e9e79fe3
new file mode 100644
index 0000000..c52ddff
Binary files /dev/null and b/.phpunit.cache/code-coverage/d68e23eace34afc8d8c99fbc3679f1135ddd9dc7b0023db6e997b4c4e9e79fe3 differ
diff --git a/.phpunit.cache/code-coverage/d939095132f3d7f8c8b552ea2d1906e2adfc1b965cf2a4d66b3f580c8e76547f b/.phpunit.cache/code-coverage/d939095132f3d7f8c8b552ea2d1906e2adfc1b965cf2a4d66b3f580c8e76547f
new file mode 100644
index 0000000..ce4bfbc
Binary files /dev/null and b/.phpunit.cache/code-coverage/d939095132f3d7f8c8b552ea2d1906e2adfc1b965cf2a4d66b3f580c8e76547f differ
diff --git a/.phpunit.cache/code-coverage/d95a9cbd8669ffcb6b820a6ff37267cbe26e40a1b95eb765ad4eec4f749e628e b/.phpunit.cache/code-coverage/d95a9cbd8669ffcb6b820a6ff37267cbe26e40a1b95eb765ad4eec4f749e628e
new file mode 100644
index 0000000..911b0e5
Binary files /dev/null and b/.phpunit.cache/code-coverage/d95a9cbd8669ffcb6b820a6ff37267cbe26e40a1b95eb765ad4eec4f749e628e differ
diff --git a/.phpunit.cache/code-coverage/daff891fb5a5eb6972728a99f26bac15836805aa39f77ebdb8b94f2b5adf21d1 b/.phpunit.cache/code-coverage/daff891fb5a5eb6972728a99f26bac15836805aa39f77ebdb8b94f2b5adf21d1
new file mode 100644
index 0000000..799ff30
Binary files /dev/null and b/.phpunit.cache/code-coverage/daff891fb5a5eb6972728a99f26bac15836805aa39f77ebdb8b94f2b5adf21d1 differ
diff --git a/.phpunit.cache/code-coverage/dbbf720d51c10b780cb2480e7e1277ae0d2e895c35a37b3ada60cd2ec817322a b/.phpunit.cache/code-coverage/dbbf720d51c10b780cb2480e7e1277ae0d2e895c35a37b3ada60cd2ec817322a
new file mode 100644
index 0000000..97562e4
Binary files /dev/null and b/.phpunit.cache/code-coverage/dbbf720d51c10b780cb2480e7e1277ae0d2e895c35a37b3ada60cd2ec817322a differ
diff --git a/.phpunit.cache/code-coverage/dbee7cc3d8fe9c2f3a948d2f25a6d40b23dcb101b90dbb6863cf4356ee6abc81 b/.phpunit.cache/code-coverage/dbee7cc3d8fe9c2f3a948d2f25a6d40b23dcb101b90dbb6863cf4356ee6abc81
new file mode 100644
index 0000000..2704edc
Binary files /dev/null and b/.phpunit.cache/code-coverage/dbee7cc3d8fe9c2f3a948d2f25a6d40b23dcb101b90dbb6863cf4356ee6abc81 differ
diff --git a/.phpunit.cache/code-coverage/e021dc2240df02ca60c73b23f8ffbd9a925cd77cba232310c8f466f2f7bc52fb b/.phpunit.cache/code-coverage/e021dc2240df02ca60c73b23f8ffbd9a925cd77cba232310c8f466f2f7bc52fb
new file mode 100644
index 0000000..628a275
Binary files /dev/null and b/.phpunit.cache/code-coverage/e021dc2240df02ca60c73b23f8ffbd9a925cd77cba232310c8f466f2f7bc52fb differ
diff --git a/.phpunit.cache/code-coverage/e3913778579707d128ac1872a7419c675a7732768ac430d5451119724922099a b/.phpunit.cache/code-coverage/e3913778579707d128ac1872a7419c675a7732768ac430d5451119724922099a
new file mode 100644
index 0000000..66ac8f1
Binary files /dev/null and b/.phpunit.cache/code-coverage/e3913778579707d128ac1872a7419c675a7732768ac430d5451119724922099a differ
diff --git a/.phpunit.cache/code-coverage/e65deeac127fba767ae5ae55049e86c07532d75be819d5053ee2d586b099f682 b/.phpunit.cache/code-coverage/e65deeac127fba767ae5ae55049e86c07532d75be819d5053ee2d586b099f682
new file mode 100644
index 0000000..412aec6
Binary files /dev/null and b/.phpunit.cache/code-coverage/e65deeac127fba767ae5ae55049e86c07532d75be819d5053ee2d586b099f682 differ
diff --git a/.phpunit.cache/code-coverage/e6f197e8760f3c394fc7745531dd56b2c602676ace60624498d2769afe91d22d b/.phpunit.cache/code-coverage/e6f197e8760f3c394fc7745531dd56b2c602676ace60624498d2769afe91d22d
new file mode 100644
index 0000000..6d86bb1
Binary files /dev/null and b/.phpunit.cache/code-coverage/e6f197e8760f3c394fc7745531dd56b2c602676ace60624498d2769afe91d22d differ
diff --git a/.phpunit.cache/code-coverage/e7780b16fef5245c9092760d31680f0f1bc6a210ec9ed15c7bf65b2aefc52164 b/.phpunit.cache/code-coverage/e7780b16fef5245c9092760d31680f0f1bc6a210ec9ed15c7bf65b2aefc52164
new file mode 100644
index 0000000..269826f
Binary files /dev/null and b/.phpunit.cache/code-coverage/e7780b16fef5245c9092760d31680f0f1bc6a210ec9ed15c7bf65b2aefc52164 differ
diff --git a/.phpunit.cache/code-coverage/f0c35c54364b5871f636e3e7ec863c5e82dbcde195da948ab3f7f7180ca04d2d b/.phpunit.cache/code-coverage/f0c35c54364b5871f636e3e7ec863c5e82dbcde195da948ab3f7f7180ca04d2d
new file mode 100644
index 0000000..fa6d07c
Binary files /dev/null and b/.phpunit.cache/code-coverage/f0c35c54364b5871f636e3e7ec863c5e82dbcde195da948ab3f7f7180ca04d2d differ
diff --git a/.phpunit.cache/code-coverage/f224d7207aa3ede9db73c2c28e2f5ee8cfc27e064a5e3b7edf830fa8f503b972 b/.phpunit.cache/code-coverage/f224d7207aa3ede9db73c2c28e2f5ee8cfc27e064a5e3b7edf830fa8f503b972
new file mode 100644
index 0000000..8524b71
Binary files /dev/null and b/.phpunit.cache/code-coverage/f224d7207aa3ede9db73c2c28e2f5ee8cfc27e064a5e3b7edf830fa8f503b972 differ
diff --git a/.phpunit.cache/code-coverage/f2d9c9dc06b9b8cbad22ffc537cea22fe5b9c5506d945213539fbcd1e40c4784 b/.phpunit.cache/code-coverage/f2d9c9dc06b9b8cbad22ffc537cea22fe5b9c5506d945213539fbcd1e40c4784
new file mode 100644
index 0000000..266b34e
Binary files /dev/null and b/.phpunit.cache/code-coverage/f2d9c9dc06b9b8cbad22ffc537cea22fe5b9c5506d945213539fbcd1e40c4784 differ
diff --git a/.phpunit.cache/code-coverage/f2dcb13613cdffe35135dd228dc4a4ffc10b83336f58aacfb52e31a52f78d668 b/.phpunit.cache/code-coverage/f2dcb13613cdffe35135dd228dc4a4ffc10b83336f58aacfb52e31a52f78d668
new file mode 100644
index 0000000..0f90b78
Binary files /dev/null and b/.phpunit.cache/code-coverage/f2dcb13613cdffe35135dd228dc4a4ffc10b83336f58aacfb52e31a52f78d668 differ
diff --git a/.phpunit.cache/code-coverage/f33a6d3ba7bc33ca815a732fe34bc5d7b177a7bd974c2ad4fa69f22571b40f96 b/.phpunit.cache/code-coverage/f33a6d3ba7bc33ca815a732fe34bc5d7b177a7bd974c2ad4fa69f22571b40f96
new file mode 100644
index 0000000..e22174a
Binary files /dev/null and b/.phpunit.cache/code-coverage/f33a6d3ba7bc33ca815a732fe34bc5d7b177a7bd974c2ad4fa69f22571b40f96 differ
diff --git a/.phpunit.cache/code-coverage/f3f6a96eaddd5903789e76e131ad6bfcbfc6507c696910604cf78ba971799f4b b/.phpunit.cache/code-coverage/f3f6a96eaddd5903789e76e131ad6bfcbfc6507c696910604cf78ba971799f4b
new file mode 100644
index 0000000..e2c93e5
Binary files /dev/null and b/.phpunit.cache/code-coverage/f3f6a96eaddd5903789e76e131ad6bfcbfc6507c696910604cf78ba971799f4b differ
diff --git a/.phpunit.cache/code-coverage/f4c9e78af495fc9a3493f8116f52e4730a273b188caf203ce93a67b5fe241228 b/.phpunit.cache/code-coverage/f4c9e78af495fc9a3493f8116f52e4730a273b188caf203ce93a67b5fe241228
new file mode 100644
index 0000000..aa82d46
Binary files /dev/null and b/.phpunit.cache/code-coverage/f4c9e78af495fc9a3493f8116f52e4730a273b188caf203ce93a67b5fe241228 differ
diff --git a/.phpunit.cache/code-coverage/f5be4ace0b7edcc86159fd80632118a5daf81b579dc0eba4914369bb3b3d904e b/.phpunit.cache/code-coverage/f5be4ace0b7edcc86159fd80632118a5daf81b579dc0eba4914369bb3b3d904e
new file mode 100644
index 0000000..841100b
Binary files /dev/null and b/.phpunit.cache/code-coverage/f5be4ace0b7edcc86159fd80632118a5daf81b579dc0eba4914369bb3b3d904e differ
diff --git a/.phpunit.cache/code-coverage/fc0a45e891524a6d4876fa5c588334c5dc21f981e15b190264cec347569df71e b/.phpunit.cache/code-coverage/fc0a45e891524a6d4876fa5c588334c5dc21f981e15b190264cec347569df71e
new file mode 100644
index 0000000..6563300
Binary files /dev/null and b/.phpunit.cache/code-coverage/fc0a45e891524a6d4876fa5c588334c5dc21f981e15b190264cec347569df71e differ
diff --git a/.phpunit.cache/code-coverage/fc0a782ea26827c08f22dbb4c05b4c237e21ece7a905a21accce486accfbfeaa b/.phpunit.cache/code-coverage/fc0a782ea26827c08f22dbb4c05b4c237e21ece7a905a21accce486accfbfeaa
new file mode 100644
index 0000000..c40d879
Binary files /dev/null and b/.phpunit.cache/code-coverage/fc0a782ea26827c08f22dbb4c05b4c237e21ece7a905a21accce486accfbfeaa differ
diff --git a/.phpunit.cache/test-results b/.phpunit.cache/test-results
new file mode 100644
index 0000000..9579b5b
--- /dev/null
+++ b/.phpunit.cache/test-results
@@ -0,0 +1 @@
+{"version":1,"defects":[],"times":{"SimpleTest::testGraph":0.027}}
\ No newline at end of file
diff --git a/.phpunit.result.cache b/.phpunit.result.cache
index 9e3fee5..fef1b4b 100644
--- a/.phpunit.result.cache
+++ b/.phpunit.result.cache
@@ -1 +1 @@
-{"version":1,"defects":[],"times":{"PSC\\Library\\Calc\\Tests\\Article\\CalendarXmlTest::testIfArticleCountInXmlCorrect":0.018,"PSC\\Library\\Calc\\Tests\\Article\\CalendarXmlTest::testGetArticleByName":0.017,"PSC\\Library\\Calc\\Tests\\Article\\CalendarXmlTest::testGetOptionById":0.02,"PSC\\Library\\Calc\\Tests\\Article\\CalendarXmlTest::testGetPrintableValuesFromSavedParamsWithCleaning":0.021,"PSC\\Library\\Calc\\Tests\\Article\\CalendarXmlTest::testGetOptionsForArticle":0.02,"PSC\\Library\\Calc\\Tests\\Customer\\AA\\CalcTest::testAuflageBelow100":0.006,"PSC\\Library\\Calc\\Tests\\Customer\\AA\\CalcTest::testAuflageBelow100AndMaterial160":0.006,"PSC\\Library\\Calc\\Tests\\Customer\\AA\\CalcTest::testAuflageBelow100AndMaterial250":0.006,"PSC\\Library\\Calc\\Tests\\Customer\\G\\CalcTest::testIfDefaultPriceIsOk":0.006,"PSC\\Library\\Calc\\Tests\\Customer\\G\\CalcTest::testIfDisplayValues":0.006,"PSC\\Library\\Calc\\Tests\\Customer\\G\\CalcTest::testIfAjaxValues":0.006,"PSC\\Library\\Calc\\Tests\\Customer\\KK\\CalcTest::testDefault":0.007,"PSC\\Library\\Calc\\Tests\\Customer\\KK\\CalcTest::testCalcValue":0.007,"PSC\\Library\\Calc\\Tests\\Customer\\Q\\CalcTest::testCalcPrice":0.01,"PSC\\Library\\Calc\\Tests\\Customer\\Q\\CalcTest::testCalcPriceDefaultChange":0.012,"PSC\\Library\\Calc\\Tests\\Customer\\Q\\CalcTest::testCalcPriceDefaultChangeSecound":0.022,"PSC\\Library\\Calc\\Tests\\Customer\\X\\CalcTest::testIfPaperDbGrenze":0.006,"PSC\\Library\\Calc\\Tests\\Customer\\X\\CalcTest::testIfPaperDbGrenzeVal":0.006,"PSC\\Library\\Calc\\Tests\\Customer\\X\\CalcTest::testIfPaperDbGrenzeVal3":0.006,"PSC\\Library\\Calc\\Tests\\Parse\\Edge\\ContainerTest::testIfLoadsCorrect":0.005,"PSC\\Library\\Calc\\Tests\\Option\\Type\\RadioboxTest::testIfCorrectType":0.004,"PSC\\Library\\Calc\\Tests\\Option\\Type\\TextareaTest::testIfCorrectType":0.005,"PSC\\Library\\Calc\\Tests\\Option\\Type\\TextareaTest::testIfCorrectAttributes":0.005,"PSC\\Library\\Calc\\Tests\\Recursiv\\FirstTest::testIfArticleCountIsCorrect":0.006,"PSC\\Library\\Calc\\Tests\\Article\\Complete1Test::testIfArticleCountIsCorrect":0.003,"PSC\\Library\\Calc\\Tests\\Article\\Complete1Test::testIfParserGetArticleCorrect":0.006,"PSC\\Library\\Calc\\Tests\\Article\\Complete1Test::testIfCalcArticleCorrect":0.006,"PSC\\Library\\Calc\\Tests\\Article\\Complete1Test::testIfCalcReturnsPrice":0.006,"PSC\\Library\\Calc\\Tests\\Article\\Complete1Test::testIfCalcReturnsPriceWithEdge":0.006,"PSC\\Library\\Calc\\Tests\\Article\\Complete1Test::testIfCalcCompletePrice":0.006,"PSC\\Library\\Calc\\Tests\\Customer\\CC\\CalcTest::testContainerSelectFalse":0.005,"PSC\\Library\\Calc\\Tests\\Customer\\CC\\CalcTest::testContainerSelectBinden":0.006,"PSC\\Library\\Calc\\Tests\\Customer\\CC\\CalcTest::testContainerSelectIgnoreDefaultBinden":0.007,"PSC\\Library\\Calc\\Tests\\Customer\\HH\\CalcTest::testPrice":0.006,"PSC\\Library\\Calc\\Tests\\Customer\\HH\\CalcTest::testDefaultSelectValues":0.007,"PSC\\Library\\Calc\\Tests\\Customer\\JJ\\CalcTest::testPrice":0.284,"PSC\\Library\\Calc\\Tests\\Customer\\T\\CalcTest::testIfDefaultPriceIsOk":0.019,"PSC\\Library\\Calc\\Tests\\Customer\\Y\\CalcTest::testPrice":1.527,"PSC\\Library\\Calc\\Tests\\Article\\SimpleXmlTest::testIfArticleCountInXmlCorrect":0.008,"PSC\\Library\\Calc\\Tests\\Article\\SimpleXmlTest::testIfArticleCountInXmlCorrectWith2Article":0.008,"PSC\\Library\\Calc\\Tests\\Article\\SimpleXmlTest::testGetArticleByName":0.007,"PSC\\Library\\Calc\\Tests\\Complex\\SecondTest::testIfArticleCountIsCorrect":0.004,"PSC\\Library\\Calc\\Tests\\Complex\\SecondTest::testIfDefaultPriceIsOk":0.042,"PSC\\Library\\Calc\\Tests\\Customer\\B\\CalcTest::testIfDefaultPriceIsOk":0.133,"PSC\\Library\\Calc\\Tests\\Customer\\EE\\CalcTest::testPrice":0.013,"PSC\\Library\\Calc\\Tests\\Customer\\EE\\CalcTest::testPriceAuflage2":0.014,"PSC\\Library\\Calc\\Tests\\Customer\\J\\CalcTest::testIfDefaultPriceIsOk":0.006,"PSC\\Library\\Calc\\Tests\\Customer\\K\\CalcTest::testCalcPlan":0.019,"PSC\\Library\\Calc\\Tests\\Customer\\N\\CalcTest::testPreCalcOption":0.004,"PSC\\Library\\Calc\\Tests\\Customer\\R\\CheckboxTest::testCalcDefault":0.021,"PSC\\Library\\Calc\\Tests\\Customer\\R\\CheckboxTest::testCalcOnly2":0.015,"PSC\\Library\\Calc\\Tests\\Customer\\V\\CalcTest::testIfDefaultPriceIsOk":1.034,"PSC\\Library\\Calc\\Tests\\CMS\\Type\\Container\\ColumnTest::testRowColumn":0.008,"PSC\\Library\\Calc\\Tests\\CMS\\Type\\Container\\ColumnTest::testTextOption":0.007,"PSC\\Library\\Calc\\Tests\\CMS\\Type\\Container\\ColumnTest::testInputOption":0.006,"PSC\\Library\\Calc\\Tests\\CMS\\Type\\Container\\ColumnTest::testSubRowsOption":0.006,"PSC\\Library\\Calc\\Tests\\Contact\\Account\\CalcTest::testPriceDefault":0.006,"PSC\\Library\\Calc\\Tests\\Contact\\Account\\CalcTest::testPrice1":0.007,"PSC\\Library\\Calc\\Tests\\Contact\\Account\\CalcTest::testPriceAccountNotExists":0.006,"PSC\\Library\\Calc\\Tests\\Contact\\Account\\CalcTest::testPrice123":0.006,"PSC\\Library\\Calc\\Tests\\Contact\\Account\\CalcTest::testPrice334":0.006,"PSC\\Library\\Calc\\Tests\\Customer\\H\\CalcTest::testIfDefaultPriceIsOk":0.016,"PSC\\Library\\Calc\\Tests\\Customer\\H\\CalcTest::testIfDisplayValues":0.016,"PSC\\Library\\Calc\\Tests\\Customer\\H\\CalcTest::testIfAjaxValues":0.016,"PSC\\Library\\Calc\\Tests\\Customer\\LL\\CalcTest::testChangeDefault":0.007,"PSC\\Library\\Calc\\Tests\\Customer\\R\\CalcComplexTest::testAuflage500":1.408,"PSC\\Library\\Calc\\Tests\\Customer\\R\\CalcComplexTest::testAndereProduktArt2":0.729,"PSC\\Library\\Calc\\Tests\\Customer\\R\\CalcComplexTest::testAndereProduktArt3":0.681,"PSC\\Library\\Calc\\Tests\\CMS\\Type\\Text\\HeadlineTest::testHeadLine1Option":0.006,"PSC\\Library\\Calc\\Tests\\CMS\\Type\\Text\\HeadlineTest::testHeadLine5Option":0.01,"PSC\\Library\\Calc\\Tests\\Complex\\FirstTest::testIfArticleCountIsCorrect":0.004,"PSC\\Library\\Calc\\Tests\\Complex\\FirstTest::testIfDefaultPriceIsOk":0.372,"PSC\\Library\\Calc\\Tests\\Customer\\F\\CalcTest::testIfDefaultPriceIsOk":0.042,"PSC\\Library\\Calc\\Tests\\Customer\\F\\CalcTest::testIfOtherPriceIsOk":0.052,"PSC\\Library\\Calc\\Tests\\Customer\\F\\CalcTest::testIfOtherPrice2IsOk":0.065,"PSC\\Library\\Calc\\Tests\\Customer\\M\\CalcTest::testDefaultOption":0.005,"PSC\\Library\\Calc\\Tests\\Customer\\M\\CalcTest::testCalcValues":0.006,"PSC\\Library\\Calc\\Tests\\Customer\\R\\RadioboxTest::testCalcDefault":0.013,"PSC\\Library\\Calc\\Tests\\Customer\\R\\RadioboxTest::testCalcOnly2":0.013,"PSC\\Library\\Calc\\Tests\\Customer\\W\\CalcTest::testIfDefaultPriceIsOk":0.016,"PSC\\Library\\Calc\\Tests\\Customer\\W\\CalcTest::testMvWestpomPriceIsOk":0.017,"PSC\\Library\\Calc\\Tests\\Json\\FromXmlToJsonAndBackTest::testConvertComplexCalcBackAndForth":0.013,"PSC\\Library\\Calc\\Tests\\Option\\Type\\CheckboxTest::testIfCorrectType":0.005,"PSC\\Library\\Calc\\Tests\\Option\\Type\\SelectTest::testIfCorrectType":0.012,"PSC\\Library\\Calc\\Tests\\Option\\Type\\SelectTest::testIfCorrectAttributes":0.012,"PSC\\Library\\Calc\\Tests\\Option\\Type\\SelectTest::testIfPaperContainerReturnsCorrectItems":0.004,"PSC\\Library\\Calc\\Tests\\Option\\Type\\SelectTest::testIfSelectWithPaperContainerModeReturnsCorrectOpt":0.013,"PSC\\Library\\Calc\\Tests\\Option\\Type\\SelectTest::testIfSelectWithColorModePantoneReturnsCorrectOpt":0.014,"PSC\\Library\\Calc\\Tests\\Option\\Type\\SelectTest::testIfSelectWithColorModeReturnsCorrectOpt":0.007,"PSC\\Library\\Calc\\Tests\\CMS\\Type\\Text\\TextTest::testTextOption":0.006,"PSC\\Library\\Calc\\Tests\\CMS\\Type\\Text\\TextTest::testText2Option":0.006,"PSC\\Library\\Calc\\Tests\\Complex\\FiveTest::testIfArticleCountIsCorrect":0.003,"PSC\\Library\\Calc\\Tests\\Complex\\FiveTest::testIfDefaultPriceIsOk":0.13,"PSC\\Library\\Calc\\Tests\\Customer\\BB\\CalcTest::testPattern":0.006,"PSC\\Library\\Calc\\Tests\\Customer\\BB\\CalcTest::testPlaceHolder":0.004,"PSC\\Library\\Calc\\Tests\\Customer\\BB\\CalcTest::testFormat1":0.006,"PSC\\Library\\Calc\\Tests\\Customer\\BB\\CalcTest::testFormat2":0.006,"PSC\\Library\\Calc\\Tests\\Customer\\BB\\CalcTest::testFormat3":0.007,"PSC\\Library\\Calc\\Tests\\Customer\\JJ\\CalcFasterTest::testPrice":0.275,"PSC\\Library\\Calc\\Tests\\Customer\\S\\CalcTest::testCalcPrice":0.006,"PSC\\Library\\Calc\\Tests\\Customer\\U\\CalcTest::testIfDefaultPriceIsOk":0.006,"PSC\\Library\\Calc\\Tests\\Customer\\Z\\CalcTest::testPrice":1.782,"PSC\\Library\\Calc\\Tests\\Customer\\Z\\CalcTest::testPriceProductArt":1.223,"PSC\\Library\\Calc\\Tests\\Calc\\ColorDBTest::testIfOptionsNotValid":0.008,"PSC\\Library\\Calc\\Tests\\CalcValue\\SimpleTest::testIfParseValue":0.006,"PSC\\Library\\Calc\\Tests\\Complex\\PaperSavedTest::testIfArticleCountIsCorrect":0.004,"PSC\\Library\\Calc\\Tests\\Complex\\PaperSavedTest::testIfDefaultPriceIsOk":0.371,"PSC\\Library\\Calc\\Tests\\Customer\\GG\\CalcTest::testPrice":0.064,"PSC\\Library\\Calc\\Tests\\Customer\\GG\\CalcTest::testColorSelect":0.062,"PSC\\Library\\Calc\\Tests\\Customer\\R\\CalcTest::testOptionAuswahl330":0.092,"PSC\\Library\\Calc\\Tests\\Customer\\R\\CalcTest::testOptionAuswahl331":0.134,"PSC\\Library\\Calc\\Tests\\Customer\\R\\CalcTest::testOptionCheckbox":0.089,"PSC\\Library\\Calc\\Tests\\Customer\\R\\CalcTest::testOptionDefaultCheckbox":0.194,"PSC\\Library\\Calc\\Tests\\Customer\\R\\CalcTest::testOptionCalcCheckbox":0.179,"PSC\\Library\\Calc\\Tests\\Calc\\OptionsRemoveTest::testIfArticleCountIsCorrect":0.003,"PSC\\Library\\Calc\\Tests\\Calc\\OptionsRemoveTest::testIfParserGetArticleCorrect":0.006,"PSC\\Library\\Calc\\Tests\\Calc\\OptionsRemoveTest::testIfOptionsNotValid":0.006,"PSC\\Library\\Calc\\Tests\\Complex\\SixTest::testIfArticleCountIsCorrect":0.003,"PSC\\Library\\Calc\\Tests\\Complex\\SixTest::testIfSelectedOptionsCorrect":0.008,"PSC\\Library\\Calc\\Tests\\Complex\\SixTest::testIfCalcCorrect":0.008,"PSC\\Library\\Calc\\Tests\\Customer\\DD\\CalcTest::testPrice":2.334,"PSC\\Library\\Calc\\Tests\\Customer\\DD\\CalcTest::testPricePaper":1.24,"PSC\\Library\\Calc\\Tests\\Customer\\DD\\CalcTest::testPricePaper1":1.12,"PSC\\Library\\Calc\\Tests\\Calc\\PreisPauschaleTest::testIfArticleCountIsCorrect":0.003,"PSC\\Library\\Calc\\Tests\\Calc\\PreisPauschaleTest::testPreisPauschaleCalc":0.006,"PSC\\Library\\Calc\\Tests\\Complex\\FourTest::testIfArticleCountIsCorrect":0.004,"PSC\\Library\\Calc\\Tests\\Complex\\FourTest::testIfDefaultPriceIsOk":0.038,"PSC\\Library\\Calc\\Tests\\Customer\\A\\CalcTest::testIfDefaultPriceIsOk":0.335,"PSC\\Library\\Calc\\Tests\\Customer\\A\\CalcTest::testVariant1":0.358,"PSC\\Library\\Calc\\Tests\\Customer\\A\\CalcTest::testVariant2":0.354,"PSC\\Library\\Calc\\Tests\\General\\LoadTest::testSimpleLoadXmlFromString":0.008,"PSC\\Library\\Calc\\Tests\\General\\LoadTest::testWrongEval":0.016,"PSC\\Library\\Calc\\Tests\\Article\\papierDbWithFormelTest::testSelectWithGrenzen":0.006,"PSC\\Library\\Calc\\Tests\\Option\\Type\\InputTest::testIfCorrectType":0.005,"PSC\\Library\\Calc\\Tests\\Option\\Type\\InputTest::testIfCorrectAttributes":0.005,"PSC\\Library\\Calc\\Tests\\PreCalc\\ParseGroupTest::testIfCorrectType":0.004,"PSC\\Library\\Calc\\Tests\\PreCalc\\ParseGroupTest::testIfCountCorrect":0.004,"PSC\\Library\\Calc\\Tests\\Type\\Text\\CalcTest::testTextGrenzen":0.004,"PSC\\Library\\Calc\\Tests\\Type\\Text\\CalcTest::testTextGrenzenChanges":0.003,"PSC\\Library\\Calc\\Tests\\Calc\\PriceMinTest::testIfArticleCountIsCorrect":0.003,"PSC\\Library\\Calc\\Tests\\Calc\\PriceMinTest::testIfParserGetMinPrice":0.007,"PSC\\Library\\Calc\\Tests\\Calc\\PriceMinTest::testIfCalcReturnsGrenzeWithFormular":0.007,"PSC\\Library\\Calc\\Tests\\Complex\\ThirdTest::testIfArticleCountIsCorrect":0.004,"PSC\\Library\\Calc\\Tests\\Complex\\ThirdTest::testIfDefaultPriceIsOk":0.023,"PSC\\Library\\Calc\\Tests\\Customer\\C\\CalcTest::testIfDefaultPriceIsOk":0.313,"PSC\\Library\\Calc\\Tests\\Customer\\II\\CalcTest::testPrice":0.126,"PSC\\Library\\Calc\\Tests\\Customer\\O\\CalcTest::testPreCalcOption":0.006,"PSC\\Library\\Calc\\Tests\\Customer\\R\\RadioboxCalcTest::testCalcDefault":0.012,"PSC\\Library\\Calc\\Tests\\Customer\\R\\RadioboxCalcTest::testCalcZweiseitig":0.012,"PSC\\Library\\Calc\\Tests\\Customer\\R\\RadioboxCalcTest::testCalcZweiseitig20":0.014,"PSC\\Library\\Calc\\Tests\\General\\DisplayGroupTest::testDisplayGroup":0.006,"PSC\\Library\\Calc\\Tests\\Json\\FromJsonTest::testFromJson":0.025,"PSC\\Library\\Calc\\Tests\\Parse\\Edge\\SimpleTest::testIfOneValue":0.005,"PSC\\Library\\Calc\\Tests\\Parse\\Edge\\SimpleTest::testIfRegionFrom":0.003,"PSC\\Library\\Calc\\Tests\\Parse\\Edge\\SimpleTest::testIfRegionFromTo":0.004,"PSC\\Library\\Calc\\Tests\\Parse\\Edge\\SimpleTest::testIfCommaSeperated":0.006,"PSC\\Library\\Calc\\Tests\\PreCalc\\ParseVariantTest::testIfCorrectType":0.004,"PSC\\Library\\Calc\\Tests\\PreCalc\\ParseVariantTest::testIfNameIsCorrect":0.003,"PSC\\Library\\Calc\\Tests\\testTest::testNotOk":0.003,"PSC\\Library\\Calc\\Tests\\testTest::testOk":0.002,"PSC\\Library\\Calc\\Tests\\CalcValue\\AddCalcValuesTest::testIfParseValue":0.007,"PSC\\Library\\Calc\\Tests\\Complex\\EightTest::testIfWeightIsCorrect":0.014,"PSC\\Library\\Calc\\Tests\\Complex\\EightTest::testIfSingleWeightIsCorrect":0.013,"PSC\\Library\\Calc\\Tests\\Complex\\EightTest::testIfDefaultPriceIsOk":0.012,"PSC\\Library\\Calc\\Tests\\Contact\\AccountType\\CalcTest::testPriceWithout":0.006,"PSC\\Library\\Calc\\Tests\\Contact\\AccountType\\CalcTest::testPrice":0.006,"PSC\\Library\\Calc\\Tests\\Contact\\AccountType\\CalcTest::testPriceCompany":0.006,"PSC\\Library\\Calc\\Tests\\Contact\\AccountType\\CalcTest::testPriceAsso":0.007,"PSC\\Library\\Calc\\Tests\\Customer\\FF\\CalcTest::testPrice":0.009,"PSC\\Library\\Calc\\Tests\\Customer\\FF\\CalcTest::testPriceExpress":0.009,"PSC\\Library\\Calc\\Tests\\Customer\\FF\\CalcTest::testPriceFlexo":0.007,"PSC\\Library\\Calc\\Tests\\Customer\\L\\CalcTest::testCalcPlan":0.006,"PSC\\Library\\Calc\\Tests\\Customer\\L\\CalcTest::testCalcVarPlan":0.006,"PSC\\Library\\Calc\\Tests\\Customer\\P\\CalcTest::testCalcPrice":0.054,"PSC\\Library\\Calc\\Tests\\Customer\\P\\CalcTest::testHelpTextAndLink":0.053,"PSC\\Library\\Calc\\Tests\\Customer\\P\\CalcTest::testMaxBreite":0.079,"PSC\\Library\\Calc\\Tests\\Customer\\P\\CalcTest::testMinBreite":0.095,"PSC\\Library\\Calc\\Tests\\Article\\selectWithGrenzenTest::testSelectWithGrenzen":0.006,"PSC\\Library\\Calc\\Tests\\Article\\selectWithGrenzenTest::testSelectWithGrenzenParams":0.005,"PSC\\Library\\Calc\\Tests\\Option\\Type\\TextTest::testIfCorrectType":0.005,"PSC\\Library\\Calc\\Tests\\Option\\Type\\TextTest::testIfCorrectAttributes":0.004,"PSC\\Library\\Calc\\Tests\\PreCalc\\ValueTest::testIfCorrectType":0.003,"PSC\\Library\\Calc\\Tests\\PreCalc\\ValueTest::testIfCorret":0.003,"PSC\\Library\\Calc\\Tests\\CalcValue\\ComplexTest::testIfParseValue":0.172,"PSC\\Library\\Calc\\Tests\\CalcValue\\ComplexTest::testIfPaperGrammaturValue":0.187,"PSC\\Library\\Calc\\Tests\\Customer\\D\\CalcTest::testIfDefaultPriceIsOk":0.035,"PSC\\Library\\Calc\\Tests\\Customer\\E\\CalcTest::testIfDefaultPriceIsOk":0.017,"PSC\\Library\\Calc\\Tests\\Customer\\E\\CalcTest::testIfAnwender2PriceIsOk":0.016,"PSC\\Library\\Calc\\Tests\\Customer\\I\\CalcTest::testIfDefaultPriceIsOk":0.348,"PSC\\Library\\Calc\\Tests\\Customer\\I\\CalcTest::testIf6000PriceIsOk":0.351,"PSC\\Library\\Calc\\Tests\\Customer\\I\\CalcTest::testIfDruckfarbenPriceIsOk":0.353,"PSC\\Library\\Calc\\Tests\\PreCalc\\ParseTest::testIfCorrectType":0.004,"PSC\\Library\\Calc\\Tests\\PreCalc\\ParseTest::testIfCountIsCorrect":0.004,"PSC\\Library\\Calc\\Tests\\PreCalc\\ParseTest::testText":0.004}}
\ No newline at end of file
+{"version":1,"defects":[],"times":{"PSC\\Library\\Calc\\Tests\\Article\\CalendarXmlTest::testIfArticleCountInXmlCorrect":0.008,"PSC\\Library\\Calc\\Tests\\Article\\CalendarXmlTest::testGetArticleByName":0.009,"PSC\\Library\\Calc\\Tests\\Article\\CalendarXmlTest::testGetOptionById":0.009,"PSC\\Library\\Calc\\Tests\\Article\\CalendarXmlTest::testGetPrintableValuesFromSavedParamsWithCleaning":0.009,"PSC\\Library\\Calc\\Tests\\Article\\CalendarXmlTest::testGetOptionsForArticle":0.009,"PSC\\Library\\Calc\\Tests\\Customer\\AA\\CalcTest::testAuflageBelow100":0.003,"PSC\\Library\\Calc\\Tests\\Customer\\AA\\CalcTest::testAuflageBelow100AndMaterial160":0.003,"PSC\\Library\\Calc\\Tests\\Customer\\AA\\CalcTest::testAuflageBelow100AndMaterial250":0.003,"PSC\\Library\\Calc\\Tests\\Customer\\F\\CalcTest::testIfDefaultPriceIsOk":0.027,"PSC\\Library\\Calc\\Tests\\Customer\\F\\CalcTest::testIfOtherPriceIsOk":0.028,"PSC\\Library\\Calc\\Tests\\Customer\\F\\CalcTest::testIfOtherPrice2IsOk":0.026,"PSC\\Library\\Calc\\Tests\\Customer\\O\\CalcTest::testPreCalcOption":0.003,"PSC\\Library\\Calc\\Tests\\Customer\\R\\RadioboxCalcTest::testCalcDefault":0.006,"PSC\\Library\\Calc\\Tests\\Customer\\R\\RadioboxCalcTest::testCalcZweiseitig":0.006,"PSC\\Library\\Calc\\Tests\\Customer\\R\\RadioboxCalcTest::testCalcZweiseitig20":0.006,"PSC\\Library\\Calc\\Tests\\General\\LoadTest::testSimpleLoadXmlFromString":0.004,"PSC\\Library\\Calc\\Tests\\General\\LoadTest::testWrongEval":0.005,"PSC\\Library\\Calc\\Tests\\Json\\FromXmlToJsonAndBackTest::testConvertComplexCalcBackAndForth":0.005,"PSC\\Library\\Calc\\Tests\\Option\\Type\\CheckboxTest::testIfCorrectType":0.003,"PSC\\Library\\Calc\\Tests\\Option\\Type\\TextTest::testIfCorrectType":0.002,"PSC\\Library\\Calc\\Tests\\Option\\Type\\TextTest::testIfCorrectAttributes":0.003,"PSC\\Library\\Calc\\Tests\\PreCalc\\ValueTest::testIfCorrectType":0.002,"PSC\\Library\\Calc\\Tests\\PreCalc\\ValueTest::testIfCorret":0.002,"PSC\\Library\\Calc\\Tests\\Article\\Complete1Test::testIfArticleCountIsCorrect":0.002,"PSC\\Library\\Calc\\Tests\\Article\\Complete1Test::testIfParserGetArticleCorrect":0.003,"PSC\\Library\\Calc\\Tests\\Article\\Complete1Test::testIfCalcArticleCorrect":0.003,"PSC\\Library\\Calc\\Tests\\Article\\Complete1Test::testIfCalcReturnsPrice":0.003,"PSC\\Library\\Calc\\Tests\\Article\\Complete1Test::testIfCalcReturnsPriceWithEdge":0.003,"PSC\\Library\\Calc\\Tests\\Article\\Complete1Test::testIfCalcCompletePrice":0.003,"PSC\\Library\\Calc\\Tests\\Customer\\CC\\CalcTest::testContainerSelectFalse":0.003,"PSC\\Library\\Calc\\Tests\\Customer\\CC\\CalcTest::testContainerSelectBinden":0.003,"PSC\\Library\\Calc\\Tests\\Customer\\CC\\CalcTest::testContainerSelectIgnoreDefaultBinden":0.003,"PSC\\Library\\Calc\\Tests\\Customer\\HH\\CalcTest::testPrice":0.003,"PSC\\Library\\Calc\\Tests\\Customer\\HH\\CalcTest::testDefaultSelectValues":0.003,"PSC\\Library\\Calc\\Tests\\Customer\\JJ\\CalcTest::testPrice":0.158,"PSC\\Library\\Calc\\Tests\\Customer\\T\\CalcTest::testIfDefaultPriceIsOk":0.006,"PSC\\Library\\Calc\\Tests\\Customer\\W\\CalcTest::testIfDefaultPriceIsOk":0.007,"PSC\\Library\\Calc\\Tests\\Customer\\W\\CalcTest::testMvWestpomPriceIsOk":0.007,"PSC\\Library\\Calc\\Tests\\Json\\FromJsonTest::testFromJson":0.012,"PSC\\Library\\Calc\\Tests\\Parse\\Edge\\SimpleTest::testIfOneValue":0.002,"PSC\\Library\\Calc\\Tests\\Parse\\Edge\\SimpleTest::testIfRegionFrom":0.003,"PSC\\Library\\Calc\\Tests\\Parse\\Edge\\SimpleTest::testIfRegionFromTo":0.002,"PSC\\Library\\Calc\\Tests\\Parse\\Edge\\SimpleTest::testIfCommaSeperated":0.003,"PSC\\Library\\Calc\\Tests\\PreCalc\\ParseVariantTest::testIfCorrectType":0.002,"PSC\\Library\\Calc\\Tests\\PreCalc\\ParseVariantTest::testIfNameIsCorrect":0.002,"PSC\\Library\\Calc\\Tests\\Article\\SimpleXmlTest::testIfArticleCountInXmlCorrect":0.004,"PSC\\Library\\Calc\\Tests\\Article\\SimpleXmlTest::testIfArticleCountInXmlCorrectWith2Article":0.003,"PSC\\Library\\Calc\\Tests\\Article\\SimpleXmlTest::testGetArticleByName":0.004,"PSC\\Library\\Calc\\Tests\\Complex\\SecondTest::testIfArticleCountIsCorrect":0.002,"PSC\\Library\\Calc\\Tests\\Complex\\SecondTest::testIfDefaultPriceIsOk":0.017,"PSC\\Library\\Calc\\Tests\\Customer\\B\\CalcTest::testIfDefaultPriceIsOk":0.058,"PSC\\Library\\Calc\\Tests\\Customer\\FF\\CalcTest::testPrice":0.004,"PSC\\Library\\Calc\\Tests\\Customer\\FF\\CalcTest::testPriceExpress":0.004,"PSC\\Library\\Calc\\Tests\\Customer\\FF\\CalcTest::testPriceFlexo":0.004,"PSC\\Library\\Calc\\Tests\\Customer\\KK\\CalcTest::testDefault":0.003,"PSC\\Library\\Calc\\Tests\\Customer\\KK\\CalcTest::testCalcValue":0.003,"PSC\\Library\\Calc\\Tests\\Customer\\R\\CalcTest::testOptionAuswahl330":0.04,"PSC\\Library\\Calc\\Tests\\Customer\\R\\CalcTest::testOptionAuswahl331":0.057,"PSC\\Library\\Calc\\Tests\\Customer\\R\\CalcTest::testOptionCheckbox":0.04,"PSC\\Library\\Calc\\Tests\\Customer\\R\\CalcTest::testOptionDefaultCheckbox":0.082,"PSC\\Library\\Calc\\Tests\\Customer\\R\\CalcTest::testOptionCalcCheckbox":0.082,"PSC\\Library\\Calc\\Tests\\CMS\\Type\\Container\\ColumnTest::testRowColumn":0.003,"PSC\\Library\\Calc\\Tests\\CMS\\Type\\Container\\ColumnTest::testTextOption":0.003,"PSC\\Library\\Calc\\Tests\\CMS\\Type\\Container\\ColumnTest::testInputOption":0.003,"PSC\\Library\\Calc\\Tests\\CMS\\Type\\Container\\ColumnTest::testSubRowsOption":0.003,"PSC\\Library\\Calc\\Tests\\Contact\\Account\\CalcTest::testPriceDefault":0.003,"PSC\\Library\\Calc\\Tests\\Contact\\Account\\CalcTest::testPrice1":0.003,"PSC\\Library\\Calc\\Tests\\Contact\\Account\\CalcTest::testPriceAccountNotExists":0.003,"PSC\\Library\\Calc\\Tests\\Contact\\Account\\CalcTest::testPrice123":0.003,"PSC\\Library\\Calc\\Tests\\Contact\\Account\\CalcTest::testPrice334":0.003,"PSC\\Library\\Calc\\Tests\\Customer\\GG\\CalcTest::testPrice":0.028,"PSC\\Library\\Calc\\Tests\\Customer\\GG\\CalcTest::testColorSelect":0.027,"PSC\\Library\\Calc\\Tests\\Customer\\P\\CalcTest::testCalcPrice":0.022,"PSC\\Library\\Calc\\Tests\\Customer\\P\\CalcTest::testHelpTextAndLink":0.023,"PSC\\Library\\Calc\\Tests\\Customer\\P\\CalcTest::testMaxBreite":0.041,"PSC\\Library\\Calc\\Tests\\Customer\\P\\CalcTest::testMinBreite":0.042,"PSC\\Library\\Calc\\Tests\\Article\\selectWithGrenzenTest::testSelectWithGrenzen":0.003,"PSC\\Library\\Calc\\Tests\\Article\\selectWithGrenzenTest::testSelectWithGrenzenParams":0.003,"PSC\\Library\\Calc\\Tests\\Option\\Type\\TextareaTest::testIfCorrectType":0.002,"PSC\\Library\\Calc\\Tests\\Option\\Type\\TextareaTest::testIfCorrectAttributes":0.002,"PSC\\Library\\Calc\\Tests\\Recursiv\\FirstTest::testIfArticleCountIsCorrect":0.003,"PSC\\Library\\Calc\\Tests\\testTest::testNotOk":0.002,"PSC\\Library\\Calc\\Tests\\testTest::testOk":0.002,"PSC\\Library\\Calc\\Tests\\CMS\\Type\\Text\\HeadlineTest::testHeadLine1Option":0.003,"PSC\\Library\\Calc\\Tests\\CMS\\Type\\Text\\HeadlineTest::testHeadLine5Option":0.003,"PSC\\Library\\Calc\\Tests\\Complex\\FirstTest::testIfArticleCountIsCorrect":0.002,"PSC\\Library\\Calc\\Tests\\Complex\\FirstTest::testIfDefaultPriceIsOk":0.157,"PSC\\Library\\Calc\\Tests\\Customer\\EE\\CalcTest::testPrice":0.006,"PSC\\Library\\Calc\\Tests\\Customer\\EE\\CalcTest::testPriceAuflage2":0.006,"PSC\\Library\\Calc\\Tests\\Customer\\J\\CalcTest::testIfDefaultPriceIsOk":0.003,"PSC\\Library\\Calc\\Tests\\Customer\\L\\CalcTest::testCalcPlan":0.003,"PSC\\Library\\Calc\\Tests\\Customer\\L\\CalcTest::testCalcVarPlan":0.003,"PSC\\Library\\Calc\\Tests\\Customer\\R\\CalcComplexTest::testAuflage500":0.659,"PSC\\Library\\Calc\\Tests\\Customer\\R\\CalcComplexTest::testAndereProduktArt2":0.736,"PSC\\Library\\Calc\\Tests\\Customer\\R\\CalcComplexTest::testAndereProduktArt3":0.715,"PSC\\Library\\Calc\\Tests\\CMS\\Type\\Text\\TextTest::testTextOption":0.003,"PSC\\Library\\Calc\\Tests\\CMS\\Type\\Text\\TextTest::testText2Option":0.003,"PSC\\Library\\Calc\\Tests\\Complex\\FiveTest::testIfArticleCountIsCorrect":0.002,"PSC\\Library\\Calc\\Tests\\Complex\\FiveTest::testIfDefaultPriceIsOk":0.052,"PSC\\Library\\Calc\\Tests\\Customer\\D\\CalcTest::testIfDefaultPriceIsOk":0.015,"PSC\\Library\\Calc\\Tests\\Customer\\E\\CalcTest::testIfDefaultPriceIsOk":0.008,"PSC\\Library\\Calc\\Tests\\Customer\\E\\CalcTest::testIfAnwender2PriceIsOk":0.006,"PSC\\Library\\Calc\\Tests\\Customer\\I\\CalcTest::testIfDefaultPriceIsOk":0.149,"PSC\\Library\\Calc\\Tests\\Customer\\I\\CalcTest::testIf6000PriceIsOk":0.149,"PSC\\Library\\Calc\\Tests\\Customer\\I\\CalcTest::testIfDruckfarbenPriceIsOk":0.148,"PSC\\Library\\Calc\\Tests\\Option\\Type\\SelectTest::testIfCorrectType":0.005,"PSC\\Library\\Calc\\Tests\\Option\\Type\\SelectTest::testIfCorrectAttributes":0.005,"PSC\\Library\\Calc\\Tests\\Option\\Type\\SelectTest::testIfPaperContainerReturnsCorrectItems":0.002,"PSC\\Library\\Calc\\Tests\\Option\\Type\\SelectTest::testIfSelectWithPaperContainerModeReturnsCorrectOpt":0.006,"PSC\\Library\\Calc\\Tests\\Option\\Type\\SelectTest::testIfSelectWithColorModePantoneReturnsCorrectOpt":0.008,"PSC\\Library\\Calc\\Tests\\Option\\Type\\SelectTest::testIfSelectWithColorModeReturnsCorrectOpt":0.005,"PSC\\Library\\Calc\\Tests\\Calc\\ColorDBTest::testIfOptionsNotValid":0.003,"PSC\\Library\\Calc\\Tests\\Complex\\EightTest::testIfWeightIsCorrect":0.005,"PSC\\Library\\Calc\\Tests\\Complex\\EightTest::testIfSingleWeightIsCorrect":0.005,"PSC\\Library\\Calc\\Tests\\Complex\\EightTest::testIfDefaultPriceIsOk":0.006,"PSC\\Library\\Calc\\Tests\\Contact\\AccountType\\CalcTest::testPriceWithout":0.003,"PSC\\Library\\Calc\\Tests\\Contact\\AccountType\\CalcTest::testPrice":0.003,"PSC\\Library\\Calc\\Tests\\Contact\\AccountType\\CalcTest::testPriceCompany":0.003,"PSC\\Library\\Calc\\Tests\\Contact\\AccountType\\CalcTest::testPriceAsso":0.003,"PSC\\Library\\Calc\\Tests\\Customer\\H\\CalcTest::testIfDefaultPriceIsOk":0.006,"PSC\\Library\\Calc\\Tests\\Customer\\H\\CalcTest::testIfDisplayValues":0.006,"PSC\\Library\\Calc\\Tests\\Customer\\H\\CalcTest::testIfAjaxValues":0.007,"PSC\\Library\\Calc\\Tests\\Customer\\LL\\CalcTest::testPrice":0.003,"PSC\\Library\\Calc\\Tests\\Customer\\Q\\CalcTest::testCalcPrice":0.005,"PSC\\Library\\Calc\\Tests\\Customer\\Q\\CalcTest::testCalcPriceDefaultChange":0.006,"PSC\\Library\\Calc\\Tests\\Customer\\Q\\CalcTest::testCalcPriceDefaultChangeSecound":0.01,"PSC\\Library\\Calc\\Tests\\Customer\\X\\CalcTest::testIfPaperDbGrenze":0.003,"PSC\\Library\\Calc\\Tests\\Customer\\X\\CalcTest::testIfPaperDbGrenzeVal":0.003,"PSC\\Library\\Calc\\Tests\\Customer\\X\\CalcTest::testIfPaperDbGrenzeVal3":0.003,"PSC\\Library\\Calc\\Tests\\Parse\\Edge\\ContainerTest::testIfLoadsCorrect":0.003,"PSC\\Library\\Calc\\Tests\\Option\\Type\\InputTest::testIfCorrectType":0.002,"PSC\\Library\\Calc\\Tests\\Option\\Type\\InputTest::testIfCorrectAttributes":0.002,"PSC\\Library\\Calc\\Tests\\PreCalc\\ParseTest::testIfCorrectType":0.002,"PSC\\Library\\Calc\\Tests\\PreCalc\\ParseTest::testIfCountIsCorrect":0.002,"PSC\\Library\\Calc\\Tests\\PreCalc\\ParseTest::testText":0.002,"PSC\\Library\\Calc\\Tests\\Calc\\OptionsRemoveTest::testIfArticleCountIsCorrect":0.002,"PSC\\Library\\Calc\\Tests\\Calc\\OptionsRemoveTest::testIfParserGetArticleCorrect":0.003,"PSC\\Library\\Calc\\Tests\\Calc\\OptionsRemoveTest::testIfOptionsNotValid":0.003,"PSC\\Library\\Calc\\Tests\\Complex\\SixTest::testIfArticleCountIsCorrect":0.002,"PSC\\Library\\Calc\\Tests\\Complex\\SixTest::testIfSelectedOptionsCorrect":0.004,"PSC\\Library\\Calc\\Tests\\Complex\\SixTest::testIfCalcCorrect":0.004,"PSC\\Library\\Calc\\Tests\\Customer\\DD\\CalcTest::testPrice":1.134,"PSC\\Library\\Calc\\Tests\\Customer\\DD\\CalcTest::testPricePaper":1.161,"PSC\\Library\\Calc\\Tests\\Customer\\DD\\CalcTest::testPricePaper1":1.187,"PSC\\Library\\Calc\\Tests\\Calc\\PreisPauschaleTest::testIfArticleCountIsCorrect":0.002,"PSC\\Library\\Calc\\Tests\\Calc\\PreisPauschaleTest::testPreisPauschaleCalc":0.003,"PSC\\Library\\Calc\\Tests\\Complex\\FourTest::testIfArticleCountIsCorrect":0.002,"PSC\\Library\\Calc\\Tests\\Complex\\FourTest::testIfDefaultPriceIsOk":0.015,"PSC\\Library\\Calc\\Tests\\Customer\\A\\CalcTest::testIfDefaultPriceIsOk":0.15,"PSC\\Library\\Calc\\Tests\\Customer\\A\\CalcTest::testVariant1":0.149,"PSC\\Library\\Calc\\Tests\\Customer\\A\\CalcTest::testVariant2":0.147,"PSC\\Library\\Calc\\Tests\\Customer\\Z\\CalcTest::testPrice":1.134,"PSC\\Library\\Calc\\Tests\\Customer\\Z\\CalcTest::testPriceProductArt":1.169,"PSC\\Library\\Calc\\Tests\\Calc\\PriceMinTest::testIfArticleCountIsCorrect":0.002,"PSC\\Library\\Calc\\Tests\\Calc\\PriceMinTest::testIfParserGetMinPrice":0.003,"PSC\\Library\\Calc\\Tests\\Calc\\PriceMinTest::testIfCalcReturnsGrenzeWithFormular":0.003,"PSC\\Library\\Calc\\Tests\\Complex\\ThirdTest::testIfArticleCountIsCorrect":0.002,"PSC\\Library\\Calc\\Tests\\Complex\\ThirdTest::testIfDefaultPriceIsOk":0.016,"PSC\\Library\\Calc\\Tests\\Customer\\C\\CalcTest::testIfDefaultPriceIsOk":0.142,"PSC\\Library\\Calc\\Tests\\Customer\\II\\CalcTest::testPrice":0.066,"PSC\\Library\\Calc\\Tests\\Customer\\M\\CalcTest::testDefaultOption":0.003,"PSC\\Library\\Calc\\Tests\\Customer\\M\\CalcTest::testCalcValues":0.003,"PSC\\Library\\Calc\\Tests\\Customer\\S\\CalcTest::testCalcPrice":0.003,"PSC\\Library\\Calc\\Tests\\Customer\\U\\CalcTest::testIfDefaultPriceIsOk":0.003,"PSC\\Library\\Calc\\Tests\\General\\DisplayGroupTest::testDisplayGroup":0.003,"SimpleTest::testGraph":0.002,"PSC\\Library\\Calc\\Tests\\Article\\papierDbWithFormelTest::testSelectWithGrenzen":0.003,"PSC\\Library\\Calc\\Tests\\Option\\Type\\RadioboxTest::testIfCorrectType":0.002,"PSC\\Library\\Calc\\Tests\\PreCalc\\ParseGroupTest::testIfCorrectType":0.002,"PSC\\Library\\Calc\\Tests\\PreCalc\\ParseGroupTest::testIfCountCorrect":0.002,"PSC\\Library\\Calc\\Tests\\Type\\Text\\CalcTest::testTextGrenzen":0.003,"PSC\\Library\\Calc\\Tests\\Type\\Text\\CalcTest::testTextGrenzenChanges":0.003,"PSC\\Library\\Calc\\Tests\\CalcValue\\AddCalcValuesTest::testIfParseValue":0.003,"PSC\\Library\\Calc\\Tests\\CalcValue\\SimpleTest::testIfParseValue":0.003,"PSC\\Library\\Calc\\Tests\\Complex\\PaperSavedTest::testIfArticleCountIsCorrect":0.002,"PSC\\Library\\Calc\\Tests\\Complex\\PaperSavedTest::testIfDefaultPriceIsOk":0.158,"PSC\\Library\\Calc\\Tests\\Customer\\G\\CalcTest::testIfDefaultPriceIsOk":0.003,"PSC\\Library\\Calc\\Tests\\Customer\\G\\CalcTest::testIfDisplayValues":0.003,"PSC\\Library\\Calc\\Tests\\Customer\\G\\CalcTest::testIfAjaxValues":0.003,"PSC\\Library\\Calc\\Tests\\Customer\\K\\CalcTest::testCalcPlan":0.008,"PSC\\Library\\Calc\\Tests\\Customer\\N\\CalcTest::testPreCalcOption":0.003,"PSC\\Library\\Calc\\Tests\\Customer\\R\\CheckboxTest::testCalcDefault":0.009,"PSC\\Library\\Calc\\Tests\\Customer\\R\\CheckboxTest::testCalcOnly2":0.008,"PSC\\Library\\Calc\\Tests\\Customer\\V\\CalcTest::testIfDefaultPriceIsOk":0.466,"PSC\\Library\\Calc\\Tests\\CalcValue\\ComplexTest::testIfParseValue":0.073,"PSC\\Library\\Calc\\Tests\\CalcValue\\ComplexTest::testIfPaperGrammaturValue":0.073,"PSC\\Library\\Calc\\Tests\\Customer\\BB\\CalcTest::testPattern":0.003,"PSC\\Library\\Calc\\Tests\\Customer\\BB\\CalcTest::testPlaceHolder":0.003,"PSC\\Library\\Calc\\Tests\\Customer\\BB\\CalcTest::testFormat1":0.003,"PSC\\Library\\Calc\\Tests\\Customer\\BB\\CalcTest::testFormat2":0.003,"PSC\\Library\\Calc\\Tests\\Customer\\BB\\CalcTest::testFormat3":0.003,"PSC\\Library\\Calc\\Tests\\Customer\\JJ\\CalcFasterTest::testPrice":0.16,"PSC\\Library\\Calc\\Tests\\Customer\\R\\RadioboxTest::testCalcDefault":0.006,"PSC\\Library\\Calc\\Tests\\Customer\\R\\RadioboxTest::testCalcOnly2":0.006,"PSC\\Library\\Calc\\Tests\\Customer\\Y\\CalcTest::testPrice":0.898}}
\ No newline at end of file
diff --git a/cobertura.xml b/cobertura.xml
new file mode 100644
index 0000000..0fc9a6a
--- /dev/null
+++ b/cobertura.xml
@@ -0,0 +1,8028 @@
+
+
+
+
+ /home/thomas/projekte/calc/src
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/composer.json b/composer.json
index b8ed728..bdee4b5 100644
--- a/composer.json
+++ b/composer.json
@@ -19,7 +19,8 @@
"bitandblack/colors": "2.13.0",
"symfony/cache": "^6.4",
"spatie/array-to-xml": "^3.4",
- "symfony/console": "^7.3"
+ "symfony/console": "^7.3",
+ "nikic/php-parser": "^5.5"
},
"require-dev": {
"phpunit/phpunit": "^12",
diff --git a/composer.lock b/composer.lock
index d9d528b..8ae75ca 100644
--- a/composer.lock
+++ b/composer.lock
@@ -4,7 +4,7 @@
"Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
"This file is @generated automatically"
],
- "content-hash": "f204aff2a1761fbeb059564b9c884256",
+ "content-hash": "1bcd8dfa133022a46117c71356f54200",
"packages": [
{
"name": "azuyalabs/yasumi",
@@ -1036,6 +1036,64 @@
],
"time": "2025-01-14T11:49:03+00:00"
},
+ {
+ "name": "nikic/php-parser",
+ "version": "v5.5.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/nikic/PHP-Parser.git",
+ "reference": "ae59794362fe85e051a58ad36b289443f57be7a9"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/ae59794362fe85e051a58ad36b289443f57be7a9",
+ "reference": "ae59794362fe85e051a58ad36b289443f57be7a9",
+ "shasum": ""
+ },
+ "require": {
+ "ext-ctype": "*",
+ "ext-json": "*",
+ "ext-tokenizer": "*",
+ "php": ">=7.4"
+ },
+ "require-dev": {
+ "ircmaxell/php-yacc": "^0.0.7",
+ "phpunit/phpunit": "^9.0"
+ },
+ "bin": [
+ "bin/php-parse"
+ ],
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "5.0-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "PhpParser\\": "lib/PhpParser"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Nikita Popov"
+ }
+ ],
+ "description": "A PHP parser written in PHP",
+ "keywords": [
+ "parser",
+ "php"
+ ],
+ "support": {
+ "issues": "https://github.com/nikic/PHP-Parser/issues",
+ "source": "https://github.com/nikic/PHP-Parser/tree/v5.5.0"
+ },
+ "time": "2025-05-31T08:24:38+00:00"
+ },
{
"name": "psr/cache",
"version": "3.0.0",
@@ -2508,64 +2566,6 @@
],
"time": "2025-04-29T12:36:36+00:00"
},
- {
- "name": "nikic/php-parser",
- "version": "v5.5.0",
- "source": {
- "type": "git",
- "url": "https://github.com/nikic/PHP-Parser.git",
- "reference": "ae59794362fe85e051a58ad36b289443f57be7a9"
- },
- "dist": {
- "type": "zip",
- "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/ae59794362fe85e051a58ad36b289443f57be7a9",
- "reference": "ae59794362fe85e051a58ad36b289443f57be7a9",
- "shasum": ""
- },
- "require": {
- "ext-ctype": "*",
- "ext-json": "*",
- "ext-tokenizer": "*",
- "php": ">=7.4"
- },
- "require-dev": {
- "ircmaxell/php-yacc": "^0.0.7",
- "phpunit/phpunit": "^9.0"
- },
- "bin": [
- "bin/php-parse"
- ],
- "type": "library",
- "extra": {
- "branch-alias": {
- "dev-master": "5.0-dev"
- }
- },
- "autoload": {
- "psr-4": {
- "PhpParser\\": "lib/PhpParser"
- }
- },
- "notification-url": "https://packagist.org/downloads/",
- "license": [
- "BSD-3-Clause"
- ],
- "authors": [
- {
- "name": "Nikita Popov"
- }
- ],
- "description": "A PHP parser written in PHP",
- "keywords": [
- "parser",
- "php"
- ],
- "support": {
- "issues": "https://github.com/nikic/PHP-Parser/issues",
- "source": "https://github.com/nikic/PHP-Parser/tree/v5.5.0"
- },
- "time": "2025-05-31T08:24:38+00:00"
- },
{
"name": "phar-io/manifest",
"version": "2.0.4",
diff --git a/phpunit.xml.dist b/phpunit.xml.dist
index a765c5a..fe3268d 100644
--- a/phpunit.xml.dist
+++ b/phpunit.xml.dist
@@ -1,19 +1,28 @@
+
+
+ src
+
+
tests/
-
+
+
+
+
+
diff --git a/src/Article.php b/src/Article.php
index f890dc6..755c803 100644
--- a/src/Article.php
+++ b/src/Article.php
@@ -1,10 +1,12 @@
options = new \ArrayIterator();
$this->displayGroups = new \ArrayIterator();
@@ -63,9 +65,8 @@ class Article
public function setParams($params)
{
/** @var Option\Type\Base $option */
- foreach($this->options as $option)
- {
- if(isset($params[$option->getId()])) {
+ foreach ($this->options as $option) {
+ if (isset($params[$option->getId()])) {
$option->setRawValue($params[$option->getId()]);
$option->processValue();
}
@@ -92,45 +93,43 @@ class Article
$this->name = $name;
}
- public function getUUID(): ?string
+ public function getUUID(): null|string
{
return $this->uuid;
}
- public function setUUID(?string $uuid): void
+ public function setUUID(null|string $uuid): void
{
$this->uuid = $uuid;
}
- public function getOptionById($id): ?Base
+ public function getOptionById($id): Base|Select|null
{
- if($id === false) {
+ if ($id === false) {
throw new \Exception('No id provided');
}
- return $this->getOptionByIdRec($this->options, $id);
-
+ return $this->getOptionByIdRec($this->options, $id);
}
-
- private function getOptionByIdRec($options, $id): ?Base
+
+ private function getOptionByIdRec($options, $id): null|Base
{
- foreach($options as $option)
- {
- if($option instanceOf Row) {
- foreach($option->getColumns() as $col) {
- if($opt = $this->getOptionByIdRec($col->getOptions(), $id)) {
+ foreach ($options as $option) {
+ if ($option instanceof Row) {
+ foreach ($option->getColumns() as $col) {
+ if ($opt = $this->getOptionByIdRec($col->getOptions(), $id)) {
return $opt;
}
}
}
- if($option instanceOf Column) {
+ if ($option instanceof Column) {
return $this->getOptionByIdRec($option->getOptions(), $id);
}
- if($option->getId() == $id) {
+ if ($option->getId() == $id) {
return $option;
}
}
-
+
return null;
}
@@ -151,10 +150,10 @@ class Article
public function getValidOptions()
{
- $temp = array();
+ $temp = [];
foreach ($this->options as $option) {
- if($option->isValid()) {
+ if ($option->isValid()) {
$temp[] = $option;
}
}
@@ -163,17 +162,17 @@ class Article
public function getOptionsAsArray()
{
- $temp = array();
+ $temp = [];
/** @var Option\Type\Base $option */
foreach ($this->options as $option) {
- if(($option->getValue() == '' && $option->getRawValue() == '') || !$option->isValid()) {
+ if ($option->getValue() == '' && $option->getRawValue() == '' || !$option->isValid()) {
continue;
}
- $temp[$option->getId()] = array(
+ $temp[$option->getId()] = [
'name' => $option->getName(),
'value' => $option->getValue(),
- 'rawVaue' => $option->getRawValue()
- );
+ 'rawVaue' => $option->getRawValue(),
+ ];
}
return $temp;
}
@@ -196,7 +195,7 @@ class Article
public function generateJson(): array
{
$tmp = [];
- foreach($this->options as $option) {
+ foreach ($this->options as $option) {
$tmp[] = $option->generateJson();
}
return $tmp;
diff --git a/src/Calc/Calc.php b/src/Calc/Calc.php
index ad3391b..ca6bdf6 100644
--- a/src/Calc/Calc.php
+++ b/src/Calc/Calc.php
@@ -1,4 +1,5 @@
getColumns() as $col) {
+ foreach ($option->getColumns() as $col) {
$price = $this->calcRec($gesamt, $col->getOptions());
}
}
if ($option instanceof Select || $option instanceof Checkbox || $option instanceof Radio) {
- foreach($option->getSelectedOptions() as $opt) {
+ foreach ($option->getSelectedOptions() as $opt) {
if ($opt->isValid()) {
- $gesamt = $this->parseEdgeCollection($gesamt, $option, $opt->getEdgesCollectionContainer(), [$option->getId()]);
+ $gesamt = $this->parseEdgeCollection(
+ $gesamt,
+ $option,
+ $opt->getEdgesCollectionContainer(),
+ [$option->getId()],
+ );
}
}
}
- $gesamt = $this->parseEdgeCollection($gesamt, $option, $option->getEdgesCollectionContainer(), [$option->getId()]);
+ $gesamt = $this->parseEdgeCollection(
+ $gesamt,
+ $option,
+ $option->getEdgesCollectionContainer(),
+ [$option->getId()],
+ );
}
return $gesamt;
}
- /**
- * @param $gesamt
- * @param Base $option
- * @param EdgeCollectionContainer $container
- * @return int
- */
private function parseEdgeCollection($gesamt, $option, EdgeCollectionContainer $container, $calcValueId = [])
{
-
$calcValue1 = 0;
$calcValue2 = 0;
$calcValueAccount1 = 0;
@@ -95,10 +99,10 @@ class Calc
$hasVar = true;
$hasValidEdge = false;
- if ($collection->getName() == "opt") {
+ if ($collection->getName() == 'opt') {
continue;
}
- if ($collection->getFormel() != "") {
+ if ($collection->getFormel() != '') {
$formel = $this->formelCalc->parse($collection->getFormel());
eval('$var = ' . $formel . ';');
} else {
@@ -106,7 +110,7 @@ class Calc
$var = $this->engine->getVariables()[$collection->getName()];
}
}
- if($collection->getDefault() != "" && $var === "XXXXXXXXXXXX") {
+ if ($collection->getDefault() != '' && $var === 'XXXXXXXXXXXX') {
$var = $collection->getDefault();
$hasVar = false;
}
@@ -117,15 +121,13 @@ class Calc
}
}
- if(!$hasValidEdge && $hasVar && $collection->getDefault()) {
+ if (!$hasValidEdge && $hasVar && $collection->getDefault()) {
$var = $collection->getDefault();
}
/** @var Edge $edge */
foreach ($collection as $edge) {
-
- if ($var !== "XXXXXXXXXXXX" && $edge->isValid($var)) {
-
+ if ($var !== 'XXXXXXXXXXXX' && $edge->isValid($var)) {
if ($edge->getPauschale() != 0) {
eval('$gesamt += ' . $edge->getPauschale() . ';');
$this->engine->addDebugFlatPrice($collection->getName(), $edge->getPauschale());
@@ -133,15 +135,24 @@ class Calc
if ($edge->getPreis() != 0) {
eval('$gesamt += ' . ($edge->getPreis() * $var) . ';');
- $this->engine->addDebugPrice($collection->getName(), $edge->getPreis(), $var, $edge->getPreis() * $var);
+ $this->engine->addDebugPrice(
+ $collection->getName(),
+ $edge->getPreis(),
+ $var,
+ $edge->getPreis() * $var,
+ );
}
- if ($edge->getCalcValue() != "") {
+ if ($edge->getCalcValue() != '') {
$cv = $this->formelCalc->parse($edge->getCalcValue());
$orgCv = $cv;
try {
eval('@$cv = ' . $cv . ';');
- $this->engine->addDebugCalcVariables($option->getId() . '_' . $collection->getName(), $edge->getCalcValue(), $orgCv . ' = ' . $cv);
+ $this->engine->addDebugCalcVariables(
+ $option->getId() . '_' . $collection->getName(),
+ $edge->getCalcValue(),
+ $orgCv . ' = ' . $cv,
+ );
} catch (\Throwable $e) {
$cv = 0;
}
@@ -149,15 +160,27 @@ class Calc
$this->engine->setCalcVaribleStack($orgCv, $calcValueId);
}
- if ($edge->getFormel() != "") {
+ if ($edge->getFormel() != '') {
$formel = $this->formelCalc->parse($edge->getFormel());
- if ($formel != "" && !in_array($option->getId(), ['weight', 'weight_single']) && !$option->isAjaxExport() && !$option->isDisplayOnly() && $option->isAmount()) {
+ if (
+ $formel != '' &&
+ !in_array($option->getId(), ['weight', 'weight_single']) &&
+ !$option->isAjaxExport() &&
+ !$option->isDisplayOnly() &&
+ $option->isAmount()
+ ) {
$p = 0;
- $formel = str_replace("tonumber", '$this->toNumber', $formel);
+ $formel = str_replace('tonumber', '$this->toNumber', $formel);
try {
eval('@$p = ' . $this->eval_func($gesamt, $formel) . ';');
- $this->engine->addDebugCalcFormel($edge->getFormel(), $formel . ' = ' . $p);
+ $this->engine->addDebugCalcFormel($edge->getFormel(), $formel . ' = ' . $p);
+ $this->engine->getCalcGraph()->addCalcFormel(new ModelFormel(
+ name: $collection->getName(),
+ formel: $edge->getFormel(),
+ parsed: $formel,
+ result: $p,
+ ));
} catch (\Throwable $e) {
$this->engine->addDebugCalcFormel($edge->getFormel(), $formel . ' = error');
$p = 0;
@@ -168,9 +191,15 @@ class Calc
$this->engine->setVariable('price', $gesamt);
}
- if ($formel != "" && !in_array($option->getId(), ['weight', 'weight_single']) && $option->isAjaxExport() && !$option->isDisplayOnly() && $option->isAmount()) {
+ if (
+ $formel != '' &&
+ !in_array($option->getId(), ['weight', 'weight_single']) &&
+ $option->isAjaxExport() &&
+ !$option->isDisplayOnly() &&
+ $option->isAmount()
+ ) {
$p = 0;
- $formel = str_replace("tonumber", '$this->toNumber', $formel);
+ $formel = str_replace('tonumber', '$this->toNumber', $formel);
try {
eval('@$p = ' . $this->eval_func($gesamt, $formel) . ';');
@@ -180,28 +209,34 @@ class Calc
$p = 0;
}
}
- if ($formel != "" && !in_array($option->getId(), ['weight', 'weight_single']) && !$option->isAjaxExport() && $option->isDisplayOnly() && $option->isAmount()) {
+ if (
+ $formel != '' &&
+ !in_array($option->getId(), ['weight', 'weight_single']) &&
+ !$option->isAjaxExport() &&
+ $option->isDisplayOnly() &&
+ $option->isAmount()
+ ) {
$p = 0;
- $formel = str_replace("tonumber", '$this->toNumber', $formel);
+ $formel = str_replace('tonumber', '$this->toNumber', $formel);
eval('@$p = ' . $this->eval_func($gesamt, $formel) . ';');
$this->engine->addDisplayVariable($option->getId(), $p);
}
- if ($formel != "" && $option->getId() == "weight_single") {
+ if ($formel != '' && $option->getId() == 'weight_single') {
$p = 0;
- $formel = str_replace("tonumber", '$this->toNumber', $formel);
+ $formel = str_replace('tonumber', '$this->toNumber', $formel);
eval('@$p = ' . $this->eval_func($gesamt, $formel) . ';');
$this->engine->setWeightSingle($p);
}
- if ($formel != "" && $option->getId() == "weight") {
+ if ($formel != '' && $option->getId() == 'weight') {
$p = 0;
- $formel = str_replace("tonumber", '$this->toNumber', $formel);
+ $formel = str_replace('tonumber', '$this->toNumber', $formel);
eval('@$p = ' . $this->eval_func($gesamt, $formel) . ';');
$this->engine->setWeight($p);
}
if (!$option->isAmount()) {
$p = 0;
- $formel = str_replace("tonumber", '$this->toNumber', $formel);
+ $formel = str_replace('tonumber', '$this->toNumber', $formel);
eval('@$p = ' . $this->eval_func($gesamt, $formel) . ';');
$this->engine->addCalcVariable($option->getId(), $p);
@@ -210,7 +245,12 @@ class Calc
if ($edge->getEdgesCollectionContainer()->count() > 0) {
$calcValueId[] = $collection->getName();
- $gesamt = $this->parseEdgeCollection($gesamt, $option, $edge->getEdgesCollectionContainer(), $calcValueId);
+ $gesamt = $this->parseEdgeCollection(
+ $gesamt,
+ $option,
+ $edge->getEdgesCollectionContainer(),
+ $calcValueId,
+ );
}
}
}
@@ -225,11 +265,10 @@ class Calc
try {
eval('@$p=' . $formel . ';');
} catch (\Throwable $e) {
-
if (str_contains($e->getMessage(), 'Undefined constant')) {
preg_match('/Undefined constant "(.*)"/', $e->getMessage(), $output_array);
if (isset($output_array[1])) {
- $formel = str_replace($output_array[1], "'" . $output_array[1] ."'", $formel);
+ $formel = str_replace($output_array[1], "'" . $output_array[1] . "'", $formel);
$p = $this->eval_func($gesamt, $formel);
return $p;
}
@@ -246,6 +285,5 @@ class Calc
}
return str_replace(',', '.', $value);
-
}
}
diff --git a/src/Calc/Formel.php b/src/Calc/Formel.php
index f42cd4f..4910b3f 100644
--- a/src/Calc/Formel.php
+++ b/src/Calc/Formel.php
@@ -1,4 +1,5 @@
engine = $engine;
$this->article = $article;
}
- public function parse($formel, $breakValid = false) {
-
+ public function parse($formel, $breakValid = false): string
+ {
$i = 0;
- while((strpos($formel,'$F') !== false || strpos($formel,'$P') !== false || strpos($formel,'$V') !== false || strpos($formel,'$CV') !== false) && $i < 12) {
+ while (
+ (
+ str_contains($formel, '$F') ||
+ str_contains($formel, '$P') ||
+ str_contains($formel, '$V') ||
+ str_contains($formel, '$CV')
+ ) &&
+ $i < 12
+ ) {
$formel = $this->parseCalcVariables($formel, $breakValid);
$formel = $this->parseFormulas($formel, $breakValid);
$formel = $this->parseParameters($formel, $breakValid);
@@ -42,7 +43,6 @@ class Formel
}
return $formel;
-
}
private function parseVariables($formel, $breakValid = false)
@@ -51,25 +51,25 @@ class Formel
$variables = $this->engine->getVariables();
- if (!empty($founds [0])) {
- foreach ($founds [0] as $key => $found) {
+ if (!empty($founds[0])) {
+ foreach ($founds[0] as $key => $found) {
$foundvalue = str_replace('$V', '', $found);
- if (isset($variables [$foundvalue])) {
- if ($variables [$foundvalue] == 'null') {
+ if (isset($variables[$foundvalue])) {
+ if ($variables[$foundvalue] == 'null') {
$formel = str_replace($found, 0, $formel);
} else {
if ($foundvalue == 'auflage') {
- $formel = str_replace($found, str_replace(',', '.', $variables [$foundvalue]), $formel);
+ $formel = str_replace($found, str_replace(',', '.', $variables[$foundvalue]), $formel);
} else {
- if ($variables [$foundvalue] == '') {
+ if ($variables[$foundvalue] == '') {
$formel = str_replace($found, 0, $formel);
} else {
- $formel = str_replace($found, $variables [$foundvalue], $formel);
+ $formel = str_replace($found, $variables[$foundvalue], $formel);
}
}
}
} else {
- if($breakValid) {
+ if ($breakValid) {
$this->engine->validDirty = true;
}
$formel = str_replace($found, 0, $formel);
@@ -84,19 +84,18 @@ class Formel
{
preg_match_all('/\$P\w*\$P/', $formel, $founds);
- if (!empty($founds [0])) {
- try{
- @eval($this->engine->getParameters());
- @eval($this->engine->getFormulas());
- }catch (\Throwable $e) {
-
+ if (!empty($founds[0])) {
+ try {
+ eval($this->engine->getParameters());
+ eval($this->engine->getFormulas());
+ } catch (\Throwable $e) {
}
- foreach ($founds [0] as $key => $found) {
+ foreach ($founds[0] as $key => $found) {
$foundvalue = str_replace('$P', '', $found);
if (isset($$foundvalue)) {
$formel = str_replace($found, $$foundvalue, $formel);
} else {
- if($breakValid) {
+ if ($breakValid) {
$this->engine->validDirty = true;
}
$formel = str_replace($found, 0, $formel);
@@ -111,20 +110,19 @@ class Formel
{
preg_match_all('/\$F\w*\$F/', $formel, $founds);
- if (!empty($founds [0])) {
- try{
- @eval($this->engine->getParameters());
- @eval($this->engine->getFormulas());
- }catch (\Throwable $e) {
-
+ if (!empty($founds[0])) {
+ try {
+ eval($this->engine->getParameters());
+ eval($this->engine->getFormulas());
+ } catch (\Throwable $e) {
}
- foreach ($founds [0] as $key => $found) {
+ foreach ($founds[0] as $key => $found) {
$foundvalue = str_replace('$F', '', $found);
- if(isset($$foundvalue)) {
+ if (isset($$foundvalue)) {
$formel = str_replace($found, $$foundvalue, $formel);
- }else{
- if($breakValid) {
+ } else {
+ if ($breakValid) {
$this->engine->validDirty = true;
}
$formel = str_replace($found, 0, $formel);
@@ -140,29 +138,29 @@ class Formel
preg_match_all('/\$CV[\w\.]*\$CV/', $formel, $founds);
$variables = $this->engine->getCalcVariables();
- if (!empty($founds [0])) {
- foreach ($founds [0] as $key => $found) {
+ if (!empty($founds[0])) {
+ foreach ($founds[0] as $key => $found) {
$foundvalue = str_replace('$CV', '', $found);
- if (isset($variables [$foundvalue])) {
- if ($variables [$foundvalue] == 'null') {
+ if (isset($variables[$foundvalue])) {
+ if ($variables[$foundvalue] == 'null') {
$formel = str_replace($found, 0, $formel);
} else {
if ($foundvalue == 'auflage') {
- $formel = str_replace($found, str_replace(',', '.', $variables [$foundvalue]), $formel);
+ $formel = str_replace($found, str_replace(',', '.', $variables[$foundvalue]), $formel);
} else {
- if ($variables [$foundvalue] == '') {
+ if ($variables[$foundvalue] == '') {
$formel = str_replace($found, 0, $formel);
} else {
- if(is_array($variables [$foundvalue])) {
+ if (is_array($variables[$foundvalue])) {
$formel = str_replace($found, 0, $formel);
- }else{
- $formel = str_replace($found, $variables [$foundvalue], $formel);
+ } else {
+ $formel = str_replace($found, $variables[$foundvalue], $formel);
}
}
}
}
} else {
- if($breakValid) {
+ if ($breakValid) {
$this->engine->validDirty = true;
}
$formel = str_replace($found, 0, $formel);
diff --git a/src/Engine.php b/src/Engine.php
index 7b57673..298097c 100644
--- a/src/Engine.php
+++ b/src/Engine.php
@@ -1,24 +1,25 @@
calcGraph = new Graph();
$parser = new Parser();
$parser->setPaperContainer($this->paperContainer);
$parser->setPaperRepository($this->paperRepository);
- if($this->templates) {
+ if ($this->templates) {
$parser->setTemplates($this->templates);
}
- if($this->xml) {
+ if ($this->xml) {
foreach ($this->xml as $article) {
$this->articles->append($parser->parseXML($article));
-
}
- }elseif($this->json){
+ } elseif ($this->json) {
foreach ($this->json as $article) {
$this->articles->append($parser->parseJson($article));
}
@@ -145,21 +148,18 @@ class Engine
*/
private function getArticleByName($name = false)
{
- if($name === false && $this->activeArticle === false) {
+ if ($name === false && $this->activeArticle === false) {
$this->activeArticle = $this->articles[0]->getName();
return $this->articles[0];
-
}
- if($name === false && $this->activeArticle !== false) {
+ if ($name === false && $this->activeArticle !== false) {
$name = $this->activeArticle;
-
}
/** @var Article $article */
- foreach($this->articles as $article)
- {
- if($article->getName() == $name) {
+ foreach ($this->articles as $article) {
+ if ($article->getName() == $name) {
return $article;
}
}
@@ -252,8 +252,9 @@ class Engine
$this->variables = $variables;
}
- public function calc() {
-
+ public function calc()
+ {
+ $this->calcGraph = new Graph();
$this->debugCalcFormel = [];
$this->debugCalcVariables = [];
$this->debugFlatPrice = [];
@@ -262,11 +263,11 @@ class Engine
$tmp = [];
foreach ($this->variables as $key => $variable) {
- if(!is_array($variable)) {
- if($variable !== null) {
- $tmp[$key] = str_replace(",", ".", $variable);
+ if (!is_array($variable)) {
+ if ($variable !== null) {
+ $tmp[$key] = str_replace(',', '.', $variable);
}
- }else{
+ } else {
$tmp[$key] = $variable;
}
}
@@ -275,7 +276,7 @@ class Engine
$this->article = $this->getArticleByName($this->activeArticle);
- if($this->article === null) {
+ if ($this->article === null) {
$this->dirty = false;
return true;
}
@@ -286,17 +287,17 @@ class Engine
$this->processCalc();
$switchedOptions = $this->checkDoubleOptions();
- if(count($switchedOptions) > 0) {
- foreach($switchedOptions as $option) {
- if($option->getDefault() !== null && !$option instanceof Text) {
- if($option instanceof Checkbox) {
- $this->variables[$option->getId()] = explode(",", $option->getDefault());
- }else{
+ if (count($switchedOptions) > 0) {
+ foreach ($switchedOptions as $option) {
+ if ($option->getDefault() !== null && !($option instanceof Text)) {
+ if ($option instanceof Checkbox) {
+ $this->variables[$option->getId()] = explode(',', $option->getDefault());
+ } else {
$this->variables[$option->getId()] = $option->getDefault();
}
}
- if(isset($this->variables[$option->getId()])) {
+ if (isset($this->variables[$option->getId()])) {
$option->setRawValue($this->variables[$option->getId()]);
$option->processValue();
}
@@ -311,37 +312,40 @@ class Engine
public function prefillVars(\ArrayIterator $options): void
{
- foreach($options as $option) {
- if($option instanceof Row) {
- foreach($option->getColumns() as $column) {
+ foreach ($options as $option) {
+ if ($option instanceof Row) {
+ foreach ($option->getColumns() as $column) {
$this->prefillVars($column->getOptions());
}
continue;
}
$option->setSavedCalcValues($this->savedCalcValues);
- if(!isset($this->variables[$option->getId()]) && $option->getDefault() !== null && !$option instanceof Text) {
- if($option instanceof Checkbox) {
- $this->variables[$option->getId()] = explode(",", $option->getDefault());
- }else{
+ if (
+ !isset($this->variables[$option->getId()]) &&
+ $option->getDefault() !== null &&
+ !($option instanceof Text)
+ ) {
+ if ($option instanceof Checkbox) {
+ $this->variables[$option->getId()] = explode(',', $option->getDefault());
+ } else {
$this->variables[$option->getId()] = $option->getDefault();
}
}
- if(isset($this->variables[$option->getId()])) {
+ if (isset($this->variables[$option->getId()])) {
$option->setRawValue($this->variables[$option->getId()]);
$option->processValue();
}
}
-
-
}
+
public function getPrice()
{
- if($this->dirty) {
+ if ($this->dirty) {
$this->calc();
}
- return round($this->price,2);
+ return round($this->price, 2);
}
/**
@@ -349,10 +353,10 @@ class Engine
*/
public function getTaxPrice()
{
- if($this->dirty) {
+ if ($this->dirty) {
$this->calc();
}
- return round(($this->price/100*$this->tax),2);
+ return round(($this->price / 100) * $this->tax, 2);
}
/**
@@ -360,10 +364,10 @@ class Engine
*/
public function getCompletePrice()
{
- if($this->dirty) {
+ if ($this->dirty) {
$this->calc();
}
- return round($this->price+($this->price/100*$this->tax),2);
+ return round($this->price + (($this->price / 100) * $this->tax), 2);
}
/**
@@ -373,7 +377,7 @@ class Engine
{
$this->price = $price;
}
-
+
public function addDebugCalcVariables($id, $orgVar, $var)
{
$this->debugCalcVariables[$id] = [$orgVar, $var];
@@ -383,12 +387,17 @@ class Engine
{
return $this->debugCalcVariables;
}
-
+
public function addDebugCalcFormel($orgFormel, $formel)
{
$this->debugCalcFormel[] = [$orgFormel, $formel];
}
+ public function getCalcGraph(): Graph
+ {
+ return $this->calcGraph;
+ }
+
public function getDebugCalcFormel()
{
return $this->debugCalcFormel;
@@ -396,8 +405,8 @@ class Engine
public function addDebugFlatPrice($key, $flatPrice)
{
- if(!isset($this->debugFlatPrice[$key])) {
- $this->debugFlatPrice[$key] = array();
+ if (!isset($this->debugFlatPrice[$key])) {
+ $this->debugFlatPrice[$key] = [];
}
$this->debugFlatPrice[$key][] = $flatPrice;
}
@@ -409,20 +418,21 @@ class Engine
public function addDebugPrice($key, $price, $multiplicator, $result)
{
- if(!isset($this->debugPrice[$key])) {
- $this->debugPrice[$key] = array();
+ if (!isset($this->debugPrice[$key])) {
+ $this->debugPrice[$key] = [];
}
$this->debugPrice[$key][] = [
'price' => $price,
'multiplicator' => $multiplicator,
- 'result' => $result
+ 'result' => $result,
];
}
- public function getDebugPrice()
+ public function getDebugPrice()
{
return $this->debugPrice;
}
+
/**
* @return array
*/
@@ -446,15 +456,16 @@ class Engine
public function setCalcVaribleStack($value, $stack = [])
{
$id = array_shift($stack);
- foreach($stack as $row) {
- $id = $id . '_' . $row;
- if(!isset($this->calcVariables[$id]) || $this->calcVariables[$id] == 0) {
+ foreach ($stack as $row) {
+ $id = $id . '_' . $row;
+ if (!isset($this->calcVariables[$id]) || $this->calcVariables[$id] == 0) {
$this->calcVariables[$id] = $value;
}
}
}
- public function addCalcVariable($id, $value) {
+ public function addCalcVariable($id, $value)
+ {
$this->calcVariables[$id] = $value;
}
@@ -490,7 +501,7 @@ class Engine
*/
public function getArticle($shouldCalc = true)
{
- if($this->dirty && $shouldCalc) {
+ if ($this->dirty && $shouldCalc) {
$this->calc();
}
return $this->article;
@@ -509,10 +520,10 @@ class Engine
{
$tmp = [];
- foreach($data as $key => $value) {
- if($value instanceof Opt) {
+ foreach ($data as $key => $value) {
+ if ($value instanceof Opt) {
$tmp[$key] = $value->getId();
- }else{
+ } else {
$tmp[$key] = $value;
}
}
@@ -587,7 +598,7 @@ class Engine
public function getWeight(): float
{
- if($this->dirty) {
+ if ($this->dirty) {
$this->calc();
}
return $this->weight;
@@ -595,12 +606,12 @@ class Engine
public function setWeightSingle(float $var): void
{
- $this->weightSingle = $var;
+ $this->weightSingle = $var;
}
-
+
public function getWeightSingle(): float
{
- if($this->dirty) {
+ if ($this->dirty) {
$this->calc();
}
return $this->weightSingle;
@@ -608,23 +619,24 @@ class Engine
private function checkDoubleOptions(): array
{
-
$options = [];
$switchedOptions = [];
/** @var Base $option */
- foreach($this->article->getOptions() as $option) {
- if($option->isValid()) {
+ foreach ($this->article->getOptions() as $option) {
+ if ($option->isValid()) {
$options[] = $option;
- }else{
- $foundValid = array_filter($this->article->getOptions()->getArrayCopy(), function(Base $elm) use ($option) {
- if($elm->getId() == $option->getId() && $elm->isValid()) {
- return $elm;
- }
+ } else {
+ $foundValid = array_filter($this->article->getOptions()->getArrayCopy(), function (Base $elm) use (
+ $option,
+ ) {
+ if ($elm->getId() == $option->getId() && $elm->isValid()) {
+ return $elm;
+ }
});
- if(count($foundValid) == 0) {
+ if (count($foundValid) == 0) {
$options[] = $option;
- }else{
+ } else {
$switchedOptions[] = array_shift($foundValid);
}
}
@@ -639,7 +651,7 @@ class Engine
$this->validDirty = true;
$count = 1;
// Check if Option is valid
- while($this->validDirty && $count < 4) {
+ while ($this->validDirty && $count < 4) {
$this->validDirty = false;
$this->validVars = $this->variables;
@@ -653,13 +665,13 @@ class Engine
$count++;
}
- $calcValid = new Valid($this, $this->article);
- $calcValid->perform();
+ $calcValid = new Valid($this, $this->article);
+ $calcValid->perform();
// CALC Values
- $calcValues = new CalcValues($this, $this->article);
- $calcValues->calc();
-
+ $calcValues = new CalcValues($this, $this->article);
+ $calcValues->calc();
+
// Check if Option is valid
// CALC Formel
$calcFormel = new Calc($this, $this->article);
@@ -668,11 +680,10 @@ class Engine
public function generateXML(): string
{
-
$tmp = ['artikel' => array_merge([
- 'name' => $this->getArticleByName()->getName(),
- 'uuid' => $this->getArticleByName()->getUUID(),
- 'kommentar' => ''
+ 'name' => $this->getArticleByName()->getName(),
+ 'uuid' => $this->getArticleByName()->getUUID(),
+ 'kommentar' => '',
], $this->getArticleByName()->generateXML())];
return ArrayToXml::convert($tmp, 'kalkulation');
@@ -680,7 +691,6 @@ class Engine
public function generateJson(): string
{
-
$obj = new \stdClass();
$obj->uuid = $this->getArticleByName(false)->getUUID();
$obj->name = $this->getArticleByName(false)->getName();
diff --git a/src/General/Type/EdgeCollectionContainer.php b/src/General/Type/EdgeCollectionContainer.php
index cee6cc9..7c8a31a 100644
--- a/src/General/Type/EdgeCollectionContainer.php
+++ b/src/General/Type/EdgeCollectionContainer.php
@@ -2,12 +2,14 @@
namespace PSC\Library\Calc\General\Type;
+use PSC\Library\Calc\General\Type\EdgeCollection;
+
class EdgeCollectionContainer extends \ArrayIterator
{
- public function getCollectionByName($string)
+ public function getCollectionByName($string): EdgeCollection|null
{
- while($this->valid()) {
- if($string == $this->current()->getName()) {
+ while ($this->valid()) {
+ if ($string == $this->current()->getName()) {
return $this->current();
}
@@ -16,4 +18,4 @@ class EdgeCollectionContainer extends \ArrayIterator
return null;
}
-}
\ No newline at end of file
+}
diff --git a/src/Graph/Calc.php b/src/Graph/Calc.php
new file mode 100644
index 0000000..2328a4e
--- /dev/null
+++ b/src/Graph/Calc.php
@@ -0,0 +1,48 @@
+math = new Math();
+ }
+
+ public function calc(Part $part): void
+ {
+ $visitor = new PostOrderVisitor();
+
+ $yield = $part->accept($visitor);
+
+ foreach ($yield as $y) {
+ $this->parseFormulas($y);
+ $y->setResult($this->math->evaluate($y->getUnparsed()));
+ var_dump($y);
+ }
+ }
+
+ private function parseFormulas(Part $p): void
+ {
+ preg_match_all('/\$F\w*\$F/', $formel->getUnparsed(), $founds);
+
+ if (!empty($founds[0])) {
+ foreach ($founds[0] as $key => $found) {
+ $foundValue = str_replace('$F', '', $found);
+ $foundPart = array_find($p->getChildren(), ($c) => $c->getName() == $foundValue));
+ if (count($foundPart) > 0) {
+ $formel->setParsed(str_replace($found, $foundPart[0]->getResult(), $formel->getParsed()))
+ } else {
+ $formel->setParsed(str_replace($found, 0, $formel->getParsed()))
+ }
+ }
+ }
+ }
+}
diff --git a/src/Graph/Eval/Math.php b/src/Graph/Eval/Math.php
new file mode 100644
index 0000000..13f67a9
--- /dev/null
+++ b/src/Graph/Eval/Math.php
@@ -0,0 +1,420 @@
+ 2.71, 'pi' => 3.14]; // variables (and constants)
+
+ /**
+ * @var array
+ */
+ public $f = []; // user-defined functions
+
+ /**
+ * @var array
+ */
+ public $vb = ['e', 'pi']; // constants
+
+ /**
+ * @var array
+ */
+ public $fb = [ // built-in functions
+ 'sin',
+ 'sinh',
+ 'arcsin',
+ 'asin',
+ 'arcsinh',
+ 'asinh',
+ 'cos',
+ 'cosh',
+ 'arccos',
+ 'acos',
+ 'arccosh',
+ 'acosh',
+ 'tan',
+ 'tanh',
+ 'arctan',
+ 'atan',
+ 'arctanh',
+ 'atanh',
+ 'sqrt',
+ 'abs',
+ 'ln',
+ 'log',
+ ];
+
+ public function __construct()
+ {
+ // make the variables a little more accurate
+ $this->v['pi'] = pi();
+ $this->v['e'] = exp(1);
+ }
+
+ /**
+ * @param string $expr
+ * @return mixed
+ */
+ public function e($expr)
+ {
+ return $this->evaluate($expr);
+ }
+
+ /**
+ * @param string $expr
+ * @return mixed
+ */
+ public function evaluate($expr)
+ {
+ $this->last_error = null;
+ $expr = trim($expr);
+ if (substr($expr, -1, 1) == ';')
+ $expr = substr($expr, 0, strlen($expr) - 1); // strip semicolons at the end
+ //===============
+ // is it a variable assignment?
+ if (preg_match('/^\s*([a-z]\w*)\s*=\s*(.+)$/', $expr, $matches)) {
+ if (in_array($matches[1], $this->vb)) { // make sure we're not assigning to a constant
+ return $this->trigger("cannot assign to constant '{$matches[1]}'");
+ }
+ if (($tmp = $this->pfx($this->nfx($matches[2]))) === false)
+ return false; // get the result and make sure it's good
+ $this->v[$matches[1]] = $tmp; // if so, stick it in the variable array
+ return $this->v[$matches[1]]; // and return the resulting value
+
+ //===============
+ // is it a function assignment?
+ } elseif (
+ preg_match('/^\s*([a-z]\w*)\s*\(\s*([a-z]\w*(?:\s*,\s*[a-z]\w*)*)\s*\)\s*=\s*(.+)$/', $expr, $matches)
+ ) {
+ $fnn = $matches[1]; // get the function name
+ if (in_array($matches[1], $this->fb)) { // make sure it isn't built in
+ return $this->trigger("cannot redefine built-in function '{$matches[1]}()'");
+ }
+ $args = explode(',', preg_replace("/\s+/", '', $matches[2])); // get the arguments
+ if (($stack = $this->nfx($matches[3])) === false)
+ return false; // see if it can be converted to postfix
+ for ($i = 0; $i < count($stack); $i++) { // freeze the state of the non-argument variables
+ $token = $stack[$i];
+ if (preg_match('/^[a-z]\w*$/', $token) and !in_array($token, $args)) {
+ if (array_key_exists($token, $this->v)) {
+ $stack[$i] = $this->v[$token];
+ } else {
+ return $this->trigger("undefined variable '{$token}' in function definition");
+ }
+ }
+ }
+ $this->f[$fnn] = ['args' => $args, 'func' => $stack];
+ return true;
+
+ //===============
+ } else {
+ return $this->pfx($this->nfx($expr)); // straight up evaluation, woo
+ }
+ }
+
+ /**
+ * @return array
+ */
+ public function vars()
+ {
+ $output = $this->v;
+ unset($output['pi']);
+ unset($output['e']);
+ return $output;
+ }
+
+ /**
+ * @return array
+ */
+ public function funcs()
+ {
+ $output = [];
+ foreach ($this->f as $fnn => $dat) {
+ $output[] = $fnn . '(' . implode(',', $dat['args']) . ')';
+ }
+
+ return $output;
+ }
+
+ //===================== HERE BE INTERNAL METHODS ====================\\
+
+ // Convert infix to postfix notation
+ public function nfx($expr)
+ {
+ $index = 0;
+ $stack = new Stack();
+ $output = []; // postfix form of expression, to be passed to pfx()
+ // $expr = trim(strtolower($expr));
+ $expr = trim($expr);
+
+ $ops = ['+', '-', '*', '/', '^', '_', '%'];
+ $ops_r = ['+' => 0, '-' => 0, '*' => 0, '/' => 0, '^' => 1, '%' => 0]; // right-associative operator?
+ $ops_p = ['+' => 0, '-' => 0, '*' => 1, '/' => 1, '_' => 1, '^' => 2, '%' => 1]; // operator precedence
+
+ $expecting_op = false; // we use this in syntax-checking the expression
+ // and determining when a - is a negation
+
+ if (preg_match('/[^\%\w\s+*^\/()\.,-]/', $expr, $matches)) { // make sure the characters are all good
+ return $this->trigger("illegal character '{$matches[0]}'");
+ }
+
+ while (1) { // 1 Infinite Loop ;)
+ $op = substr($expr, $index, 1); // get the first character at the current index
+ // find out if we're currently at the beginning of a number/variable/function/parenthesis/operand
+ $ex = preg_match('/^([A-Za-z]\w*\(?|\d+(?:\.\d*)?|\.\d+|\()/', substr($expr, $index), $match);
+ //===============
+ if ($op == '-' and !$expecting_op) { // is it a negation instead of a minus?
+ $stack->push('_'); // put a negation on the stack
+ $index++;
+ } elseif ($op == '_') { // we have to explicitly deny this, because it's legal on the stack
+ return $this->trigger("illegal character '_'"); // but not in the input expression
+
+ //===============
+ } elseif ((in_array($op, $ops) or $ex) and $expecting_op) { // are we putting an operator on the stack?
+ if ($ex) { // are we expecting an operator but have a number/variable/function/opening parethesis?
+ $op = '*';
+ $index--; // it's an implicit multiplication
+ }
+ // heart of the algorithm:
+ while (
+ $stack->count > 0 and
+ (
+ ($o2 = $stack->last()) and
+ (
+ in_array($o2, $ops) and
+ ($ops_r[$op] ? $ops_p[$op] < $ops_p[$o2] : $ops_p[$op] <= $ops_p[$o2])
+ )
+ )
+ ) {
+ $output[] = $stack->pop(); // pop stuff off the stack into the output
+ }
+ // many thanks: http://en.wikipedia.org/wiki/Reverse_Polish_notation#The_algorithm_in_detail
+ $stack->push($op); // finally put OUR operator onto the stack
+ $index++;
+ $expecting_op = false;
+
+ //===============
+ } elseif ($op == ')' and $expecting_op) { // ready to close a parenthesis?
+ while (($o2 = $stack->pop()) != '(') { // pop off the stack back to the last (
+ if (is_null($o2))
+ return $this->trigger("unexpected ')'");
+ else
+ $output[] = $o2;
+ }
+
+ $nextOp = $stack->last(2);
+
+ if ($nextOp !== null && preg_match("/^([A-Za-z]\w*)\($/", $nextOp, $matches)) { // did we just close a function?
+ $fnn = $matches[1]; // get the function name
+ $arg_count = $stack->pop(); // see how many arguments there were (cleverly stored on the stack, thank you)
+ $output[] = $stack->pop(); // pop the function and push onto the output
+ if (in_array($fnn, $this->fb)) { // check the argument count
+ if ($arg_count > 1)
+ return $this->trigger("too many arguments ({$arg_count} given, 1 expected)");
+ } elseif (array_key_exists($fnn, $this->f)) {
+ if ($arg_count != count($this->f[$fnn]['args']))
+ return $this->trigger(
+ "wrong number of arguments ({$arg_count} given, " .
+ count($this->f[$fnn]['args']) .
+ ' expected)',
+ );
+ } else { // did we somehow push a non-function on the stack? this should never happen
+ return $this->trigger('internal error');
+ }
+ }
+ $index++;
+
+ //===============
+ } elseif ($op == ',' and $expecting_op) { // did we just finish a function argument?
+ while (($o2 = $stack->pop()) != '(') {
+ if (is_null($o2))
+ return $this->trigger("unexpected ','"); // oops, never had a (
+ else
+ $output[] = $o2; // pop the argument expression stuff and push onto the output
+ }
+ // make sure there was a function
+ if (!preg_match("/^([A-Za-z]\w*)\($/", $stack->last(2), $matches))
+ return $this->trigger("unexpected ','");
+ $stack->push($stack->pop() + 1); // increment the argument count
+ $stack->push('('); // put the ( back on, we'll need to pop back to it again
+ $index++;
+ $expecting_op = false;
+
+ //===============
+ } elseif ($op == '(' and !$expecting_op) {
+ $stack->push('('); // that was easy
+ $index++;
+ $allow_neg = true;
+
+ //===============
+ } elseif ($ex and !$expecting_op) { // do we now have a function/variable/number?
+ $expecting_op = true;
+ $val = $match[1];
+ if (preg_match("/^([A-Za-z]\w*)\($/", $val, $matches)) { // may be func, or variable w/ implicit multiplication against parentheses...
+ if (in_array($matches[1], $this->fb) or array_key_exists($matches[1], $this->f)) { // it's a func
+ $stack->push($val);
+ $stack->push(1);
+ $stack->push('(');
+ $expecting_op = false;
+ } else { // it's a var w/ implicit multiplication
+ $val = $matches[1];
+ $output[] = $val;
+ }
+ } else { // it's a plain old var or num
+ $output[] = $val;
+ }
+ $index += strlen($val);
+
+ //===============
+ } elseif ($op == ')') { // miscellaneous error checking
+ return $this->trigger("unexpected ')'");
+ } elseif (in_array($op, $ops) and !$expecting_op) {
+ return $this->trigger("unexpected operator '{$op}'");
+ } else { // I don't even want to know what you did to get here
+ return $this->trigger('an unexpected error occured');
+ }
+ if ($index == strlen($expr)) {
+ if (in_array($op, $ops)) { // did we end with an operator? bad.
+ return $this->trigger("operator '{$op}' lacks operand");
+ } else {
+ break;
+ }
+ }
+ while (substr($expr, $index, 1) == ' ') { // step the index past whitespace (pretty much turns whitespace
+ $index++; // into implicit multiplication if no operator is there)
+ }
+ }
+ while (!is_null($op = $stack->pop())) { // pop everything off the stack and push onto output
+ if ($op == '(')
+ return $this->trigger("expecting ')'"); // if there are (s on the stack, ()s were unbalanced
+ $output[] = $op;
+ }
+ return $output;
+ }
+
+ // evaluate postfix notation
+ public function pfx($tokens, $vars = [])
+ {
+ if ($tokens == false)
+ return false;
+
+ $stack = new Stack();
+
+ foreach ($tokens as $token) { // nice and easy
+ // if the token is a binary operator, pop two values off the stack, do the operation, and push the result back on
+ if (in_array($token, ['+', '-', '*', '/', '^', '%'])) {
+ if (is_null($op2 = $stack->pop()))
+ return $this->trigger('internal error');
+ if (is_null($op1 = $stack->pop()))
+ return $this->trigger('internal error');
+ switch ($token) {
+ case '+':
+ $stack->push($op1 + $op2);
+ break;
+ case '-':
+ $stack->push($op1 - $op2);
+ break;
+ case '*':
+ $stack->push($op1 * $op2);
+ break;
+ case '/':
+ if ($op2 == 0)
+ return $this->trigger('division by zero');
+ $stack->push($op1 / $op2);
+ break;
+ case '^':
+ $stack->push(pow($op1, $op2));
+ break;
+ case '%':
+ $stack->push($op1 % $op2);
+ break;
+ }
+
+ // if the token is a unary operator, pop one value off the stack, do the operation, and push it back on
+ } elseif ($token == '_') {
+ $stack->push(-1 * $stack->pop());
+
+ // if the token is a function, pop arguments off the stack, hand them to the function, and push the result back on
+ } elseif (preg_match("/^([a-z]\w*)\($/", $token, $matches)) { // it's a function!
+ $fnn = $matches[1];
+ if (in_array($fnn, $this->fb)) { // built-in function:
+ if (is_null($op1 = $stack->pop()))
+ return $this->trigger('internal error');
+ $fnn = preg_replace('/^arc/', 'a', $fnn); // for the 'arc' trig synonyms
+ if ($fnn == 'ln')
+ $fnn = 'log';
+ eval('$stack->push(' . $fnn . '($op1));'); // perfectly safe eval()
+ } elseif (array_key_exists($fnn, $this->f)) { // user function
+ // get args
+ $args = [];
+ for ($i = count($this->f[$fnn]['args']) - 1; $i >= 0; $i--) {
+ if (is_null($args[$this->f[$fnn]['args'][$i]] = $stack->pop()))
+ return $this->trigger('internal error');
+ }
+ $stack->push($this->pfx($this->f[$fnn]['func'], $args)); // yay... recursion!!!!
+ }
+
+ // if the token is a number or variable, push it on the stack
+ } else {
+ if (is_numeric($token)) {
+ $stack->push($token);
+ } elseif (array_key_exists($token, $this->v)) {
+ $stack->push($this->v[$token]);
+ } elseif (array_key_exists($token, $vars)) {
+ $stack->push($vars[$token]);
+ } else {
+ return $this->trigger("undefined variable '{$token}'");
+ }
+ }
+ }
+ // when we're out of tokens, the stack should have a single element, the final result
+ if ($stack->count != 1)
+ return $this->trigger('internal error');
+ return $stack->pop();
+ }
+
+ // trigger an error, but nicely, if need be
+ public function trigger($msg)
+ {
+ $this->last_error = $msg;
+ if (!$this->suppress_errors) {
+ echo "\nError found in:";
+ $this->debugPrintCallingFunction();
+
+ trigger_error($msg, E_USER_WARNING);
+ }
+ return false;
+ }
+
+ // Prints the file name, function name, and
+ // line number which called your function
+ // (not this function, then one that called
+ // it to begin with)
+ public function debugPrintCallingFunction()
+ {
+ $file = 'n/a';
+ $func = 'n/a';
+ $line = 'n/a';
+ $debugTrace = debug_backtrace();
+ if (isset($debugTrace[1])) {
+ $file = $debugTrace[1]['file'] ? $debugTrace[1]['file'] : 'n/a';
+ $line = $debugTrace[1]['line'] ? $debugTrace[1]['line'] : 'n/a';
+ }
+ if (isset($debugTrace[2]))
+ $func = $debugTrace[2]['function'] ? $debugTrace[2]['function'] : 'n/a';
+ echo "\n{$file}, {$func}, {$line}\n";
+ }
+}
diff --git a/src/Graph/Eval/Stack.php b/src/Graph/Eval/Stack.php
new file mode 100644
index 0000000..59fc82d
--- /dev/null
+++ b/src/Graph/Eval/Stack.php
@@ -0,0 +1,42 @@
+stack[$this->count] = $val;
+ $this->count++;
+ }
+
+ public function pop()
+ {
+ if ($this->count > 0) {
+ $this->count--;
+ return $this->stack[$this->count];
+ }
+
+ return null;
+ }
+
+ public function last($n = 1)
+ {
+ $key = $this->count - $n;
+
+ return array_key_exists($key, $this->stack) ? $this->stack[$key] : null;
+ }
+}
diff --git a/src/Graph/Graph.php b/src/Graph/Graph.php
new file mode 100644
index 0000000..d9dcaf0
--- /dev/null
+++ b/src/Graph/Graph.php
@@ -0,0 +1,39 @@
+calcFormel = new PartCollection();
+ $this->parser = new Parser($formulas, $params);
+ $this->calc = new Calc();
+ }
+
+ public function addCalcFormel(Part $formel): void
+ {
+ $this->calcFormel->append($formel);
+ }
+
+ public function build(): bool
+ {
+ foreach ($this->calcFormel as $formel) {
+ $this->parser->parse($formel);
+ }
+
+ foreach ($this->calcFormel as $formel) {
+ $this->calc->calc($formel);
+ }
+
+ return true;
+ }
+}
diff --git a/src/Graph/Parser.php b/src/Graph/Parser.php
new file mode 100644
index 0000000..0b0debd
--- /dev/null
+++ b/src/Graph/Parser.php
@@ -0,0 +1,103 @@
+internalParts = new PartCollection();
+
+ $mode = 1;
+
+ $traverser = new NodeTraverser();
+ $traverser->addVisitor(new class($mode, $this->internalParts) extends NodeVisitorAbstract {
+ public function __construct(
+ private int $mode,
+ private PartCollection $internalParts,
+ ) {}
+
+ public function enterNode(Node $node): void
+ {
+ if ($node instanceof Assign && $this->mode === 1) {
+ $this->internalParts->append(new Part(
+ type: PartType::Formel,
+ name: $node->var->name,
+ unParsed: $node->expr->value,
+ ));
+ }
+ if ($node instanceof Assign && $this->mode === 2) {
+ $this->internalParts->append(new Part(
+ type: PartType::Parameter,
+ name: $node->var->name,
+ unParsed: $node->expr->value,
+ ));
+ }
+ }
+ });
+
+ $parser = new ParserFactory()->createForNewestSupportedVersion();
+ try {
+ $ast = $parser->parse('traverse($ast);
+ } catch (Error $error) {
+ echo "Parse error: {$error->getMessage()}\n";
+ return;
+ }
+
+ try {
+ $ast = $parser->parse('traverse($ast);
+ } catch (Error $error) {
+ echo "Parse error: {$error->getMessage()}\n";
+ return;
+ }
+ }
+
+ public function parse(Part $formel): void
+ {
+ // $formel = $this->parseCalcVariables($formel, $breakValid);
+ $this->parseFormulas($formel);
+
+ // $formel = $this->parseParameters($formel, $breakValid);
+ // $formel = $this->parseVariables($formel, $breakValid);
+ }
+
+ private function parseFormulas(Part $formel): void
+ {
+ preg_match_all('/\$F\w*\$F/', $formel->getUnparsed(), $founds);
+
+ if (!empty($founds[0])) {
+ foreach ($founds[0] as $key => $found) {
+ $foundValue = str_replace('$F', '', $found);
+ if ($this->internalParts->getPartByName($foundValue)) {
+ $formel->addChild($this->internalParts->getPartByName($foundValue));
+ } else {
+ $formel->addChild(new Part(
+ type: PartType::Formel,
+ name: $foundValue,
+ unParsed: $found,
+ parsed: 0,
+ result: 0,
+ ));
+ }
+ }
+ }
+ }
+}
diff --git a/src/Graph/Tree/Node.php b/src/Graph/Tree/Node.php
new file mode 100644
index 0000000..de850fb
--- /dev/null
+++ b/src/Graph/Tree/Node.php
@@ -0,0 +1,31 @@
+ $children
+ */
+ public function __construct(mixed $value = null, array $children = [])
+ {
+ $this->setValue($value);
+
+ if ([] === $children) {
+ return;
+ }
+
+ $this->setChildren($children);
+ }
+}
diff --git a/src/Graph/Tree/NodeInterface.php b/src/Graph/Tree/NodeInterface.php
new file mode 100644
index 0000000..6f18e04
--- /dev/null
+++ b/src/Graph/Tree/NodeInterface.php
@@ -0,0 +1,139 @@
+
+ */
+interface NodeInterface
+{
+ /**
+ * Set the value of the current node.
+ */
+ public function setValue(mixed $value): static;
+
+ /**
+ * Get the current node value.
+ */
+ public function getValue(): mixed;
+
+ /**
+ * Add a child.
+ *
+ * @return mixed
+ */
+ public function addChild(self $child): static;
+
+ /**
+ * Remove a node from children.
+ */
+ public function removeChild(self $child): static;
+
+ /**
+ * Remove all children.
+ */
+ public function removeAllChildren(): static;
+
+ /**
+ * Return the array of children.
+ *
+ * @return array
+ */
+ public function getChildren(): array;
+
+ /**
+ * Replace the children set with the given one.
+ *
+ * @param array $children
+ *
+ * @return mixed
+ */
+ public function setChildren(array $children): static;
+
+ /**
+ * Set the parent node.
+ */
+ public function setParent(null|self $parent = null): void;
+
+ /**
+ * Return the parent node.
+ */
+ public function getParent(): null|static;
+
+ /**
+ * Retrieves all ancestors of node excluding current node.
+ */
+ public function getAncestors(): array;
+
+ /**
+ * Retrieves all ancestors of node as well as the node itself.
+ *
+ * @return array
+ */
+ public function getAncestorsAndSelf(): array;
+
+ /**
+ * Retrieves all neighboring nodes, excluding the current node.
+ */
+ public function getNeighbors(): array;
+
+ /**
+ * Returns all neighboring nodes, including the current node.
+ *
+ * @return array
+ */
+ public function getNeighborsAndSelf(): array;
+
+ /**
+ * Return true if the node is the root, false otherwise.
+ */
+ public function isRoot(): bool;
+
+ /**
+ * Return true if the node is a child, false otherwise.
+ */
+ public function isChild(): bool;
+
+ /**
+ * Return true if the node has no children, false otherwise.
+ */
+ public function isLeaf(): bool;
+
+ /**
+ * Find the root of the node.
+ */
+ public function root(): static;
+
+ /**
+ * Return the distance from the current node to the root.
+ */
+ public function getDepth(): int;
+
+ /**
+ * Return the height of the tree whose root is this node.
+ */
+ public function getHeight(): int;
+
+ /**
+ * Return the number of nodes in a tree.
+ */
+ public function getSize(): int;
+
+ /**
+ * Accept method for the visitor pattern (see http://en.wikipedia.org/wiki/Visitor_pattern).
+ */
+ public function accept(Visitor $visitor): mixed;
+}
diff --git a/src/Graph/Tree/NodeTrait.php b/src/Graph/Tree/NodeTrait.php
new file mode 100644
index 0000000..f56f54e
--- /dev/null
+++ b/src/Graph/Tree/NodeTrait.php
@@ -0,0 +1,214 @@
+
+ */
+ private array $children = [];
+
+ public function setValue(mixed $value): static
+ {
+ $this->value = $value;
+
+ return $this;
+ }
+
+ public function getValue(): mixed
+ {
+ return $this->value;
+ }
+
+ public function addChild(NodeInterface $child): static
+ {
+ $child->setParent($this);
+ $this->children[] = $child;
+
+ return $this;
+ }
+
+ public function removeChild(NodeInterface $child): static
+ {
+ foreach ($this->children as $key => $myChild) {
+ if ($child === $myChild) {
+ unset($this->children[$key]);
+ }
+ }
+
+ $this->children = \array_values($this->children);
+
+ $child->setParent(null);
+
+ return $this;
+ }
+
+ public function removeAllChildren(): static
+ {
+ $this->setChildren([]);
+
+ return $this;
+ }
+
+ public function getChildren(): array
+ {
+ return $this->children;
+ }
+
+ public function setChildren(array $children): static
+ {
+ foreach ($this->getChildren() as $child) {
+ $child->setParent(null);
+ }
+
+ $this->children = [];
+
+ foreach ($children as $child) {
+ $this->addChild($child);
+ }
+
+ return $this;
+ }
+
+ public function setParent(null|NodeInterface $parent = null): void
+ {
+ $this->parent = $parent;
+ }
+
+ public function getParent(): null|static
+ {
+ return $this->parent;
+ }
+
+ public function getAncestors(): array
+ {
+ $parents = [];
+ $node = $this;
+
+ while (($parent = $node->getParent()) instanceof NodeInterface) {
+ \array_unshift($parents, $parent);
+ $node = $parent;
+ }
+
+ return $parents;
+ }
+
+ public function getAncestorsAndSelf(): array
+ {
+ return \array_merge($this->getAncestors(), [$this]);
+ }
+
+ public function getNeighbors(): array
+ {
+ if (null === $this->parent) {
+ return [];
+ }
+
+ $neighbors = $this->parent->getChildren();
+ $that = $this;
+
+ return \array_values(\array_filter($neighbors, static function (NodeInterface $node) use ($that): bool {
+ return $node !== $that;
+ }));
+ }
+
+ public function getNeighborsAndSelf(): array
+ {
+ if (null === $this->parent) {
+ return [
+ $this,
+ ];
+ }
+
+ return $this->parent->getChildren();
+ }
+
+ public function isRoot(): bool
+ {
+ return null === $this->parent;
+ }
+
+ public function isChild(): bool
+ {
+ return null !== $this->parent;
+ }
+
+ public function isLeaf(): bool
+ {
+ return [] === $this->children;
+ }
+
+ public function root(): static
+ {
+ $node = $this;
+
+ while (($parent = $node->getParent()) instanceof NodeInterface) {
+ $node = $parent;
+ }
+
+ return $node;
+ }
+
+ /**
+ * Return the distance from the current node to the root.
+ *
+ * Warning, can be expensive, since each descendant is visited
+ */
+ public function getDepth(): int
+ {
+ if ($this->isRoot()) {
+ return 0;
+ }
+
+ return $this->getParent()->getDepth() + 1;
+ }
+
+ /**
+ * Return the height of the tree whose root is this node.
+ */
+ public function getHeight(): int
+ {
+ if ($this->isLeaf()) {
+ return 0;
+ }
+
+ $heights = [];
+
+ foreach ($this->getChildren() as $child) {
+ $heights[] = $child->getHeight();
+ }
+
+ return \max($heights) + 1;
+ }
+
+ public function getSize(): int
+ {
+ $size = 1;
+
+ foreach ($this->getChildren() as $child) {
+ $size += $child->getSize();
+ }
+
+ return $size;
+ }
+
+ public function accept(Visitor $visitor): mixed
+ {
+ return $visitor->visit($this);
+ }
+}
diff --git a/src/Graph/Visitor/PostOrderVisitor.php b/src/Graph/Visitor/PostOrderVisitor.php
new file mode 100644
index 0000000..1239eb1
--- /dev/null
+++ b/src/Graph/Visitor/PostOrderVisitor.php
@@ -0,0 +1,30 @@
+getChildren() as $child) {
+ $nodes = \array_merge($nodes, $child->accept($this));
+ }
+
+ $nodes[] = $node;
+
+ return $nodes;
+ }
+}
diff --git a/src/Graph/Visitor/Visitor.php b/src/Graph/Visitor/Visitor.php
new file mode 100644
index 0000000..d88e8fc
--- /dev/null
+++ b/src/Graph/Visitor/Visitor.php
@@ -0,0 +1,19 @@
+name;
+ }
+
+ public function getUnparsed(): string
+ {
+ return $this->unParsed;
+ }
+
+ public function setResult(int $result): void
+ {
+ $this->result = $result;
+ }
+}
diff --git a/src/Model/PartCollection.php b/src/Model/PartCollection.php
new file mode 100644
index 0000000..10f32ae
--- /dev/null
+++ b/src/Model/PartCollection.php
@@ -0,0 +1,21 @@
+valid()) {
+ if ($string == $this->current()->getName()) {
+ return $this->current();
+ }
+
+ $this->next();
+ }
+
+ return null;
+ }
+}
diff --git a/src/Model/PartType.php b/src/Model/PartType.php
new file mode 100644
index 0000000..51d404b
--- /dev/null
+++ b/src/Model/PartType.php
@@ -0,0 +1,11 @@
+assertSame("31", $this->engine->getArticle()->getOptionById('set3')->getSelectedOption()->getId());
}
- public function testChangeDefault(): void
+ public function tesChangeDefault(): void
{
$this->engine->calc();
$this->assertSame("11", $this->engine->getArticle()->getOptionById('set1')->getSelectedOption()->getId());
@@ -60,6 +60,12 @@ class CalcTest extends TestCase
$this->assertSame("32", $this->engine->getArticle()->getOptionById('set3')->getSelectedOption()->getId());
$this->assertSame("42", $this->engine->getArticle()->getOptionById('set4')->getSelectedOption()->getId());
}
-
+
+ public function testPrice(): void
+ {
+ $this->engine->calc();
+ $this->assertSame(101900.0, $this->engine->getPrice());
+ var_dump($this->engine->getCalcGraph());
+ }
}
diff --git a/tests/Customer/LL/calc.xml b/tests/Customer/LL/calc.xml
index b935123..d5e7b7a 100644
--- a/tests/Customer/LL/calc.xml
+++ b/tests/Customer/LL/calc.xml
@@ -59,6 +59,18 @@
+
+
+
+
diff --git a/tests/Customer/LL/formels.txt b/tests/Customer/LL/formels.txt
index 8b13789..12ecb99 100644
--- a/tests/Customer/LL/formels.txt
+++ b/tests/Customer/LL/formels.txt
@@ -1 +1,3 @@
-
+$formel1 = '$Fformel2$F+$Fformel3$F+$Vauflage$V';
+$formel2 = '200+$Vauflage$V';
+$formel3 = '100*$Vauflage$V';
diff --git a/tests/Graph/SimpleTest.php b/tests/Graph/SimpleTest.php
new file mode 100644
index 0000000..92d5a18
--- /dev/null
+++ b/tests/Graph/SimpleTest.php
@@ -0,0 +1,32 @@
+graph = new Graph(
+ file_get_contents(__DIR__ . '/formel.txt'),
+ file_get_contents(__DIR__ . '/parameter.txt'),
+ );
+ }
+
+ public function testGraph(): void
+ {
+ $this->graph->addCalcFormel(new Part(
+ type: PartType::CalcFormel,
+ name: 'test1',
+ unParsed: '$Ftest2$F+$Ftest3$F+10',
+ ));
+
+ assertTrue($this->graph->build());
+ }
+}
diff --git a/tests/Graph/formel.txt b/tests/Graph/formel.txt
new file mode 100644
index 0000000..a5815b8
--- /dev/null
+++ b/tests/Graph/formel.txt
@@ -0,0 +1,2 @@
+$test1 = '100*50';
+$test2 = '50*50';
diff --git a/tests/Graph/parameter.txt b/tests/Graph/parameter.txt
new file mode 100644
index 0000000..8b234a4
--- /dev/null
+++ b/tests/Graph/parameter.txt
@@ -0,0 +1,2 @@
+$test3 = 12;
+$test4 = 13;
diff --git a/tests/Parse/Edge/ContainerTest.php b/tests/Parse/Edge/ContainerTest.php
index d82ab59..5b1c6a8 100644
--- a/tests/Parse/Edge/ContainerTest.php
+++ b/tests/Parse/Edge/ContainerTest.php
@@ -1,4 +1,5 @@
fromXML($node);
- /** @var \PSC\Library\Calc\General\Type\EdgeCollectionContainer $container */
$container = $containerParser->parseXML();
$this->assertCount(2, $container);
$this->assertCount(4, $container->getCollectionByName('gebyn'));
$this->assertCount(2, $container->getCollectionByName('seiten'));
-
}
}