text:
2517" layer="200"/>
<rectangle x1="5.8801" y1="7.2263" x2="5.9055" y2="7.2517" layer="201"/>
<rectangle x1="6.5151" y1="7.2263" x2="6.5405" y2="7.2517" layer="201"/>
<rectangle x1="-0.0127" y1="7.2517" x2="5.8801" y2="7.2771" layer="200"/>
<rectangle x1="5.9309" y1="7.2517" x2="6.5405" y2="7.2771" layer="200"/>
<rectangle x1="6.5659" y1="7.2517" x2="7.0993" y2="7.2771" layer="200"/>
<rectangle x1="5.8801" y1="7.2517" x2="5.9309" y2="7.2771" layer="201"/>
<rectangle x1="6.5405" y1="7.2517" x2="6.5659" y2="7.2771" layer="201"/>
<rectangle x1="-0.0127" y1="7.2771" x2="5.9055" y2="7.3025" layer="200"/>
<rectangle x1="5.9309" y1="7.2771" x2="6.5659" y2="7.3025" layer="200"/>
<rectangle x1="6.5913" y1="7.2771" x2="7.0993" y2="7.3025" layer="200"/>
<rectangle x1="5.9055" y1="7.2771" x2="5.9309" y2="7.3025" layer="201"/>
<rectangle x1="6.5659" y1="7.2771" x2="6.5913" y2="7.3025" layer="201"/>
<rectangle x1="-0.0127" y1="7.3025" x2="5.9309" y2="7.3279" layer="200"/>
<rectangle x1="5.9563" y1="7.3025" x2="6.5405" y2="7.3279" layer="200"/>
<rectangle x1="6.5913" y1="7.3025" x2="7.0993" y2="7.3279" layer="200"/>
<rectangle x1="5.9309" y1="7.3025" x2="5.9563" y2="7.3279" layer="201"/>
<rectangle x1="6.5405" y1="7.3025" x2="6.5913" y2="7.3279" layer="201"/>
<rectangle x1="-0.0127" y1="7.3279" x2="5.9563" y2="7.3533" layer="200"/>
<rectangle x1="5.9817" y1="7.3279" x2="6.5659" y2="7.3533" layer="200"/>
<rectangle x1="6.5913" y1="7.3279" x2="7.0993" y2="7.3533" layer="200"/>
<rectangle x1="5.9563" y1="7.3279" x2="5.9817" y2="7.3533" layer="201"/>
<rectangle x1="6.5659" y1="7.3279" x2="6.5913" y2="7.3533" layer="201"/>
<rectangle x1="-0.0127" y1="7.3533" x2="5.9563" y2="7.3787" layer="200"/>
<rectangle x1="6.0071" y1="7.3533" x2="6.5913" y2="7.3787" layer="200"/>
<rectangle x1="6.6167" y1="7.3533" x2="7.0993" y2="7.3787" layer="200"/>
<rectangle x1="5.9563" y1="7.3533" x2="6.0071" y2="7.3787" layer="201"/>
<rectangle x1="6.5913" y1="7.3533" x2="6.6167" y2="7.3787" layer="201"/>
<rectangle x1="-0.0127" y1="7.3787" x2="5.9817" y2="7.4041" layer="200"/>
<rectangle x1="6.0071" y1="7.3787" x2="6.5913" y2="7.4041" layer="200"/>
<rectangle x1="6.6167" y1="7.3787" x2="7.0993" y2="7.4041" layer="200"/>
<rectangle x1="5.9817" y1="7.3787" x2="6.0071" y2="7.4041" layer="201"/>
<rectangle x1="6.5913" y1="7.3787" x2="6.6167" y2="7.4041" layer="201"/>
<rectangle x1="-0.0127" y1="7.4041" x2="5.9817" y2="7.4295" layer="200"/>
<rectangle x1="6.0325" y1="7.4041" x2="6.5913" y2="7.4295" layer="200"/>
<rectangle x1="6.6421" y1="7.4041" x2="7.0993" y2="7.4295" layer="200"/>
<rectangle x1="5.9817" y1="7.4041" x2="6.0325" y2="7.4295" layer="201"/>
<rectangle x1="6.5913" y1="7.4041" x2="6.6421" y2="7.4295" layer="201"/>
<rectangle x1="-0.0127" y1="7.4295" x2="6.0071" y2="7.4549" layer="200"/>
<rectangle x1="6.0325" y1="7.4295" x2="6.6167" y2="7.4549" layer="200"/>
<rectangle x1="6.6421" y1="7.4295" x2="7.0993" y2="7.4549" layer="200"/>
<rectangle x1="6.0071" y1="7.4295" x2="6.0325" y2="7.4549" layer="201"/>
<rectangle x1="6.6167" y1="7.4295" x2="6.6421" y2="7.4549" layer="201"/>
<rectangle x1="-0.0127" y1="7.4549" x2="6.0325" y2="7.4803" layer="200"/>
<rectangle x1="6.0579" y1="7.4549" x2="6.6167" y2="7.4803" layer="200"/>
<rectangle x1="6.6675" y1="7.4549" x2="7.0993" y2="7.4803" layer="200"/>
<rectangle x1="6.0325" y1="7.4549" x2="6.0579" y2="7.4803" layer="201"/>
<rectangle x1="6.6167" y1="7.4549" x2="6.6675" y2="7.4803" layer="201"/>
<rectangle x1="-0.0127" y1="7.4803" x2="6.0579" y2="7.5057" layer="200"/>
<rectangle x1="6.0833" y1="7.4803" x2="6.6421" y2="7.5057" layer="200"/>
<rectangle x1="6.6675" y1="7.4803" x2="7.0993" y2="7.5057" layer="200"/>
<rectangle x1="6.0579" y1="7.4803" x2="6.0833" y2="7.5057" layer="201"/>
<rectangle x1="6.6421" y1="7.4803" x2="6.6675" y2="7.5057" layer="201"/>
<rectangle x1="-0.0127" y1="7.5057" x2="6.0579" y2="7.5311" layer="200"/>
<rectangle x1="6.1087" y1="7.5057" x2="6.6421" y2="7.5311" layer="200"/>
<rectangle x1="6.6675" y1="7.5057" x2="7.0993" y2="7.5311" layer="200"/>
<rectangle x1="6.0579" y1="7.5057" x2="6.1087" y2="7.5311" layer="201"/>
<rectangle x1="6.6421" y1="7.5057" x2="6.6675" y2="7.5311" layer="201"/>
<rectangle x1="-0.0127" y1="7.5311" x2="6.0579" y2="7.5565" layer="200"/>
<rectangle x1="6.0833" y1="7.5311" x2="6.6675" y2="7.5565" layer="200"/>
<rectangle x1="6.6929" y1="7.5311" x2="7.0993" y2="7.5565" layer="200"/>
<rectangle x1="6.0579" y1="7.5311" x2="6.0833" y2="7.5565" layer="201"/>
<rectangle x1="6.6675" y1="7.5311" x2="6.6929" y2="7.5565" layer="201"/>
<rectangle x1="-0.0127" y1="7.5565" x2="6.0833" y2="7.5819" layer="200"/>
<rectangle x1="6.1087" y1="7.5565" x2="6.6675" y2="7.5819" layer="200"/>
<rectangle x1="6.7183" y1="7.5565" x2="7.0993" y2="7.5819" layer="200"/>
<rectangle x1="6.0833" y1="7.5565" x2="6.1087" y2="7.5819" layer="201"/>
<rectangle x1="6.6675" y1="7.5565" x2="6.7183" y2="7.5819" layer="201"/>
<rectangle x1="-0.0127" y1="7.5819" x2="6.1087" y2="7.6073" layer="200"/>
<rectangle x1="6.1341" y1="7.5819" x2="6.6675" y2="7.6073" layer="200"/>
<rectangle x1="6.6929" y1="7.5819" x2="7.0993" y2="7.6073" layer="200"/>
<rectangle x1="6.1087" y1="7.5819" x2="6.1341" y2="7.6073" layer="201"/>
<rectangle x1="6.6675" y1="7.5819" x2="6.6929" y2="7.6073" layer="201"/>
<rectangle x1="-0.0127" y1="7.6073" x2="6.1341" y2="7.6327" layer="200"/>
<rectangle x1="6.1595" y1="7.6073" x2="6.6929" y2="7.6327" layer="200"/>
<rectangle x1="6.7183" y1="7.6073" x2="7.0993" y2="7.6327" layer="200"/>
<rectangle x1="6.1341" y1="7.6073" x2="6.1595" y2="7.6327" layer="201"/>
<rectangle x1="6.6929" y1="7.6073" x2="6.7183" y2="7.6327" layer="201"/>
<rectangle x1="-0.0127" y1="7.6327" x2="6.1595" y2="7.6581" layer="200"/>
<rectangle x1="6.1849" y1="7.6327" x2="6.7183" y2="7.6581" layer="200"/>
<rectangle x1="6.7437" y1="7.6327" x2="7.0993" y2="7.6581" layer="200"/>
<rectangle x1="6.1595" y1="7.6327" x2="6.1849" y2="7.6581" layer="201"/>
<rectangle x1="6.7183" y1="7.6327" x2="6.7437" y2="7.6581" layer="201"/>
<rectangle x1="-0.0127" y1="7.6581" x2="6.1341" y2="7.6835" layer="200"/>
<rectangle x1="6.2103" y1="7.6581" x2="6.6929" y2="7.6835" layer="200"/>
<rectangle x1="6.7437" y1="7.6581" x2="7.0993" y2="7.6835" layer="200"/>
<rectangle x1="6.1341" y1="7.6581" x2="6.2103" y2="7.6835" layer="201"/>
<rectangle x1="6.6929" y1="7.6581" x2="6.7437" y2="7.6835" layer="201"/>
<rectangle x1="-0.0127" y1="7.6835" x2="6.1595" y2="7.7089" layer="200"/>
<rectangle x1="6.1849" y1="7.6835" x2="6.7183" y2="7.7089" layer="200"/>
<rectangle x1="6.7437" y1="7.6835" x2="7.0993" y2="7.7089" layer="200"/>
<rectangle x1="6.1595" y1="7.6835" x2="6.1849" y2="7.7089" layer="201"/>
<rectangle x1="6.7183" y1="7.6835" x2="6.7437" y2="7.7089" layer="201"/>
<rectangle x1="-0.0127" y1="7.7089" x2="6.1849" y2="7.7343" layer="200"/>
<rectangle x1="6.2103" y1="7.7089" x2="6.7437" y2="7.7343" layer="200"/>
<rectangle x1="6.7691" y1="7.7089" x2="7.0993" y2="7.7343" layer="200"/>
<rectangle x1="6.1849" y1="7.7089" x2="6.2103" y2="7.7343" layer="201"/>
<rectangle x1="6.7437" y1="7.7089" x2="6.7691" y2="7.7343" layer="201"/>
<rectangle x1="-0.0127" y1="7.7343" x2="6.2103" y2="7.7597" layer="200"/>
<rectangle x1="6.2357" y1="7.7343" x2="6.7437" y2="7.7597" layer="200"/>
<rectangle x1="6.7945" y1="7.7343" x2="7.0993" y2="7.7597" layer="200"/>
<rectangle x1="6.2103" y1="7.7343" x2="6.2357" y2="7.7597" layer="201"/>
<rectangle x1="6.7437" y1="7.7343" x2="6.7945" y2="7.7597" layer="201"/>
<rectangle x1="-0.0127" y1="7.7597" x2="6.2103" y2="7.7851" layer="200"/>
<rectangle x1="6.2611" y1="7.7597" x2="6.7437" y2="7.7851" layer="200"/>
<rectangle x1="6.7945" y1="7.7597" x2="7.0993" y2="7.7851" layer="200"/>
<rectangle x1="6.2103" y1="7.7597" x2="6.2611" y2="7.7851" layer="201"/>
<rectangle x1="6.7437" y1="7.7597" x2="6.7945" y2="7.7851" layer="201"/>
<rectangle x1="-0.0127" y1="7.7851" x2="6.7691" y2="7.8105" layer="200"/>
<rectangle x1="6.7945" y1="7.7851" x2="7.0993" y2="7.8105" layer="200"/>
<rectangle x1="6.7691" y1="7.7851" x2="6.7945" y2="7.8105" layer="201"/>
<rectangle x1="-0.0127" y1="7.8105" x2="6.2357" y2="7.8359" layer="200"/>
<rectangle x1="6.2865" y1="7.8105" x2="6.7945" y2="7.8359" layer="200"/>
<rectangle x1="6.8199" y1="7.8105" x2="7.0993" y2="7.8359" layer="200"/>
<rectangle x1="6.2357" y1="7.8105" x2="6.2865" y2="7.8359" layer="201"/>
<rectangle x1="6.7945" y1="7.8105" x2="6.8199" y2="7.8359" layer="201"/>
<rectangle x1="-0.0127" y1="7.8359" x2="6.2611" y2="7.8613" layer="200"/>
<rectangle x1="6.2865" y1="7.8359" x2="6.7945" y2="7.8613" layer="200"/>
<rectangle x1="6.8199" y1="7.8359" x2="7.0993" y2="7.8613" layer="200"/>
<rectangle x1="6.2611" y1="7.8359" x2="6.2865" y2="7.8613" layer="201"/>
<rectangle x1="6.7945" y1="7.8359" x2="6.8199" y2="7.8613" layer="201"/>
<rectangle x1="-0.0127" y1="7.8613" x2="6.2865" y2="7.8867" layer="200"/>
<rectangle x1="6.3119" y1="7.8613" x2="6.7945" y2="7.8867" layer="200"/>
<rectangle x1="6.8199" y1="7.8613" x2="7.0993" y2="7.8867" layer="200"/>
<rectangle x1="6.2865" y1="7.8613" x2="6.3119" y2="7.8867" layer="201"/>
<rectangle x1="6.7945" y1="7.8613" x2="6.8199" y2="7.8867" layer="201"/>
<rectangle x1="-0.0127" y1="7.8867" x2="6.3119" y2="7.9121" layer="200"/>
<rectangle x1="6.3373" y1="7.8867" x2="6.8199" y2="7.9121" layer="200"/>
<rectangle x1="6.8453" y1="7.8867" x2="7.0993" y2="7.9121" layer="200"/>
<rectangle x1="6.3119" y1="7.8867" x2="6.3373" y2="7.9121" layer="201"/>
<rectangle x1="6.8199" y1="7.8867" x2="6.8453" y2="7.9121" layer="201"/>
<rectangle x1="-0.0127" y1="7.9121" x2="6.3119" y2="7.9375" layer="200"/>
<rectangle x1="6.3627" y1="7.9121" x2="6.8199" y2="7.9375" layer="200"/>
<rectangle x1="6.8707" y1="7.9121" x2="7.0993" y2="7.9375" layer="200"/>
<rectangle x1="6.3119" y1="7.9121" x2="6.3627" y2="7.9375" layer="201"/>
<rectangle x1="6.8199" y1="7.9121" x2="6.8707" y2="7.9375" layer="201"/>
<rectangle x1="-0.0127" y1="7.9375" x2="6.3373" y2="7.9629" layer="200"/>
<rectangle x1="6.3627" y1="7.9375" x2="6.8453" y2="7.9629" layer="200"/>
<rectangle x1="6.8707" y1="7.9375" x2="7.0993" y2="7.9629" layer="200"/>
<rectangle x1="6.3373" y1="7.9375" x2="6.3627" y2="7.9629" layer="201"/>
<rectangle x1="6.8453" y1="7.9375" x2="6.8707" y2="7.9629" layer="201"/>
<rectangle x1="-0.0127" y1="7.9629" x2="6.3373" y2="7.9883" layer="200"/>
<rectangle x1="6.3881" y1="7.9629" x2="6.8453" y2="7.9883" layer="200"/>
<rectangle x1="6.8707" y1="7.9629" x2="7.0993" y2="7.9883" layer="200"/>
<rectangle x1="6.3373" y1="7.9629" x2="6.3881" y2="7.9883" layer="201"/>
<rectangle x1="6.8453" y1="7.9629" x2="6.8707" y2="7.9883" layer="201"/>
<rectangle x1="-0.0127" y1="7.9883" x2="6.3627" y2="8.0137" layer="200"/>
<rectangle x1="6.3881" y1="7.9883" x2="6.8707" y2="8.0137" layer="200"/>
<rectangle x1="6.8961" y1="7.9883" x2="7.0993" y2="8.0137" layer="200"/>
<rectangle x1="6.3627" y1="7.9883" x2="6.3881" y2="8.0137" layer="201"/>
<rectangle x1="6.8707" y1="7.9883" x2="6.8961" y2="8.0137" layer="201"/>
<rectangle x1="-0.0127" y1="8.0137" x2="6.3881" y2="8.0391" layer="200"/>
<rectangle x1="6.4135" y1="8.0137" x2="6.8453" y2="8.0391" layer="200"/>
<rectangle x1="6.8961" y1="8.0137" x2="7.0993" y2="8.0391" layer="200"/>
<rectangle x1="6.3881" y1="8.0137" x2="6.4135" y2="8.0391" layer="201"/>
<rectangle x1="6.8453" y1="8.0137" x2="6.8961" y2="8.0391" layer="201"/>
<rectangle x1="-0.0127" y1="8.0391" x2="6.4135" y2="8.0645" layer="200"/>
<rectangle x1="6.4389" y1="8.0391" x2="6.8707" y2="8.0645" layer="200"/>
<rectangle x1="6.8961" y1="8.0391" x2="7.0993" y2="8.0645" layer="200"/>
<rectangle x1="6.4135" y1="8.0391" x2="6.4389" y2="8.0645" layer="201"/>
<rectangle x1="6.8707" y1="8.0391" x2="6.8961" y2="8.0645" layer="201"/>
<rectangle x1="-0.0127" y1="8.0645" x2="6.4135" y2="8.0899" layer="200"/>
<rectangle x1="6.4643" y1="8.0645" x2="6.8961" y2="8.0899" layer="200"/>
<rectangle x1="6.9215" y1="8.0645" x2="7.0993" y2="8.0899" layer="200"/>
<rectangle x1="6.4135" y1="8.0645" x2="6.4643" y2="8.0899" layer="201"/>
<rectangle x1="6.8961" y1="8.0645" x2="6.9215" y2="8.0899" layer="201"/>
<rectangle x1="-0.0127" y1="8.0899" x2="6.4389" y2="8.1153" layer="200"/>
<rectangle x1="6.4643" y1="8.0899" x2="6.9215" y2="8.1153" layer="200"/>
<rectangle x1="6.9469" y1="8.0899" x2="7.0993" y2="8.1153" layer="200"/>
<rectangle x1="6.4389" y1="8.0899" x2="6.4643" y2="8.1153" layer="201"/>
<rectangle x1="6.9215" y1="8.0899" x2="6.9469" y2="8.1153" layer="201"/>
<rectangle x1="-0.0127" y1="8.1153" x2="6.4389" y2="8.1407" layer="200"/>
<rectangle x1="6.4897" y1="8.1153" x2="6.8961" y2="8.1407" layer="200"/>
<rectangle x1="6.9469" y1="8.1153" x2="7.0993" y2="8.1407" layer="200"/>
<rectangle x1="6.4389" y1="8.1153" x2="6.4897" y2="8.1407" layer="201"/>
<rectangle x1="6.8961" y1="8.1153" x2="6.9469" y2="8.1407" layer="201"/>
<rectangle x1="-0.0127" y1="8.1407" x2="6.4643" y2="8.1661" layer="200"/>
<rectangle x1="6.4897" y1="8.1407" x2="6.9215" y2="8.1661" layer="200"/>
<rectangle x1="6.9469" y1="8.1407" x2="7.0993" y2="8.1661" layer="200"/>
<rectangle x1="6.4643" y1="8.1407" x2="6.4897" y2="8.1661" layer="201"/>
<rectangle x1="6.9215" y1="8.1407" x2="6.9469" y2="8.1661" layer="201"/>
<rectangle x1="-0.0127" y1="8.1661" x2="6.4897" y2="8.1915" layer="200"/>
<rectangle x1="6.5151" y1="8.1661" x2="6.9469" y2="8.1915" layer="200"/>
<rectangle x1="6.9723" y1="8.1661" x2="7.0993" y2="8.1915" layer="200"/>
<rectangle x1="6.4897" y1="8.1661" x2="6.5151" y2="8.1915" layer="201"/>
<rectangle x1="6.9469" y1="8.1661" x2="6.9723" y2="8.1915" layer="201"/>
<rectangle x1="-0.0127" y1="8.1915" x2="6.5151" y2="8.2169" layer="200"/>
<rectangle x1="6.5405" y1="8.1915" x2="7.0993" y2="8.2169" layer="200"/>
<rectangle x1="6.5151" y1="8.1915" x2="6.5405" y2="8.2169" layer="201"/>
<rectangle x1="-0.0127" y1="8.2169" x2="6.5151" y2="8.2423" layer="200"/>
<rectangle x1="6.5659" y1="8.2169" x2="6.9469" y2="8.2423" layer="200"/>
<rectangle x1="6.9723" y1="8.2169" x2="7.0993" y2="8.2423" layer="200"/>
<rectangle x1="6.5151" y1="8.2169" x2="6.5659" y2="8.2423" layer="201"/>
<rectangle x1="6.9469" y1="8.2169" x2="6.9723" y2="8.2423" layer="201"/>
<rectangle x1="-0.0127" y1="8.2423" x2="6.5151" y2="8.2677" layer="200"/>
<rectangle x1="6.5405" y1="8.2423" x2="6.9723" y2="8.2677" layer="200"/>
<rectangle x1="6.9977" y1="8.2423" x2="7.0993" y2="8.2677" layer="200"/>
<rectangle x1="6.5151" y1="8.2423" x2="6.5405" y2="8.2677" layer="201"/>
<rectangle x1="6.9723" y1="8.2423" x2="6.9977" y2="8.2677" layer="201"/>
<rectangle x1="-0.0127" y1="8.2677" x2="6.5405" y2="8.2931" layer="200"/>
<rectangle x1="6.5659" y1="8.2677" x2="6.9723" y2="8.2931" layer="200"/>
<rectangle x1="7.0231" y1="8.2677" x2="7.0993" y2="8.2931" layer="200"/>
<rectangle x1="6.5405" y1="8.2677" x2="6.5659" y2="8.2931" layer="201"/>
<rectangle x1="6.9723" y1="8.2677" x2="7.0231" y2="8.2931" layer="201"/>
<rectangle x1="-0.0127" y1="8.2931" x2="6.5659" y2="8.3185" layer="200"/>
<rectangle x1="6.5913" y1="8.2931" x2="7.0993" y2="8.3185" layer="200"/>
<rectangle x1="6.5659" y1="8.2931" x2="6.5913" y2="8.3185" layer="201"/>
<rectangle x1="-0.0127" y1="8.3185" x2="6.5913" y2="8.3439" layer="200"/>
<rectangle x1="6.6167" y1="8.3185" x2="6.9977" y2="8.3439" layer="200"/>
<rectangle x1="7.0231" y1="8.3185" x2="7.0993" y2="8.3439" layer="200"/>
<rectangle x1="6.5913" y1="8.3185" x2="6.6167" y2="8.3439" layer="201"/>
<rectangle x1="6.9977" y1="8.3185" x2="7.0231" y2="8.3439" layer="201"/>
<rectangle x1="-0.0127" y1="8.3439" x2="6.6167" y2="8.3693" layer="200"/>
<rectangle x1="6.6421" y1="8.3439" x2="7.0231" y2="8.3693" layer="200"/>
<rectangle x1="7.0485" y1="8.3439" x2="7.0993" y2="8.3693" layer="200"/>
<rectangle x1="6.6167" y1="8.3439" x2="6.6421" y2="8.3693" layer="201"/>
<rectangle x1="7.0231" y1="8.3439" x2="7.0485" y2="8.3693" layer="201"/>
<rectangle x1="-0.0127" y1="8.3693" x2="6.6167" y2="8.3947" layer="200"/>
<rectangle x1="6.6675" y1="8.3693" x2="7.0231" y2="8.3947" layer="200"/>
<rectangle x1="7.0739" y1="8.3693" x2="7.0993" y2="8.3947" layer="200"/>
<rectangle x1="6.6167" y1="8.3693" x2="6.6675" y2="8.3947" layer="201"/>
<rectangle x1="7.0231" y1="8.3693" x2="7.0739" y2="8.3947" layer="201"/>
<rectangle x1="-0.0127" y1="8.3947" x2="6.6167" y2="8.4201" layer="200"/>
<rectangle x1="6.6421" y1="8.3947" x2="7.0231" y2="8.4201" layer="200"/>
<rectangle x1="7.0485" y1="8.3947" x2="7.0993" y2="8.4201" layer="200"/>
<rectangle x1="6.6167" y1="8.3947" x2="6.6421" y2="8.4201" layer="201"/>
<rectangle x1="7.0231" y1="8.3947" x2="7.0485" y2="8.4201" layer="201"/>
<rectangle x1="-0.0127" y1="8.4201" x2="6.6421" y2="8.4455" layer="200"/>
<rectangle x1="6.6675" y1="8.4201" x2="7.0485" y2="8.4455" layer="200"/>
<rectangle x1="7.0739" y1="8.4201" x2="7.0993" y2="8.4455" layer="200"/>
<rectangle x1="6.6421" y1="8.4201" x2="6.6675" y2="8.4455" layer="201"/>
<rectangle x1="7.0485" y1="8.4201" x2="7.0739" y2="8.4455" layer="201"/>
<rectangle x1="-0.0127" y1="8.4455" x2="6.6675" y2="8.4709" layer="200"/>
<rectangle x1="6.6929" y1="8.4455" x2="7.0739" y2="8.4709" layer="200"/>
<rectangle x1="6.6675" y1="8.4455" x2="6.6929" y2="8.4709" layer="201"/>
<rectangle x1="7.0739" y1="8.4455" x2="7.0993" y2="8.4709" layer="201"/>
<rectangle x1="-0.0127" y1="8.4709" x2="6.6675" y2="8.4963" layer="200"/>
<rectangle x1="6.7183" y1="8.4709" x2="7.0231" y2="8.4963" layer="200"/>
<rectangle x1="7.0739" y1="8.4709" x2="7.0993" y2="8.4963" layer="200"/>
<rectangle x1="6.6675" y1="8.4709" x2="6.7183" y2="8.4963" layer="201"/>
<rectangle x1="7.0231" y1="8.4709" x2="7.0739" y2="8.4963" layer="201"/>
<rectangle x1="-0.0127" y1="8.4963" x2="7.0231" y2="8.5217" layer="200"/>
<rectangle x1="7.0485" y1="8.4963" x2="7.0993" y2="8.5217" layer="200"/>
<rectangle x1="7.0231" y1="8.4963" x2="7.0485" y2="8.5217" layer="201"/>
<rectangle x1="-0.0127" y1="8.5217" x2="6.6929" y2="8.5471" layer="200"/>
<rectangle x1="6.7437" y1="8.5217" x2="6.9723" y2="8.5471" layer="200"/>
<rectangle x1="7.0231" y1="8.5217" x2="7.0993" y2="8.5471" layer="200"/>
<rectangle x1="6.6929" y1="8.5217" x2="6.7437" y2="8.5471" layer="201"/>
<rectangle x1="6.9723" y1="8.5217" x2="7.0231" y2="8.5471" layer="201"/>
<rectangle x1="-0.0127" y1="8.5471" x2="6.7183" y2="8.5725" layer="200"/>
<rectangle x1="6.7437" y1="8.5471" x2="6.9469" y2="8.5725" layer="200"/>
<rectangle x1="6.9977" y1="8.5471" x2="7.0993" y2="8.5725" layer="200"/>
<rectangle x1="6.7183" y1="8.5471" x2="6.7437" y2="8.5725" layer="201"/>
<rectangle x1="6.9469" y1="8.5471" x2="6.9977" y2="8.5725" layer="201"/>
<rectangle x1="-0.0127" y1="8.5725" x2="6.7437" y2="8.5979" layer="200"/>
<rectangle x1="6.7691" y1="8.5725" x2="6.9215" y2="8.5979" layer="200"/>
<rectangle x1="6.9723" y1="8.5725" x2="7.0993" y2="8.5979" layer="200"/>
<rectangle x1="6.7437" y1="8.5725" x2="6.7691" y2="8.5979" layer="201"/>
<rectangle x1="6.9215" y1="8.5725" x2="6.9723" y2="8.5979" layer="201"/>
<rectangle x1="-0.0127" y1="8.5979" x2="6.7691" y2="8.6233" layer="200"/>
<rectangle x1="6.7945" y1="8.5979" x2="6.9215" y2="8.6233" layer="200"/>
<rectangle x1="6.9469" y1="8.5979" x2="7.0993" y2="8.6233" layer="200"/>
<rectangle x1="6.7691" y1="8.5979" x2="6.7945" y2="8.6233" layer="201"/>
<rectangle x1="6.9215" y1="8.5979" x2="6.9469" y2="8.6233" layer="201"/>
<rectangle x1="-0.0127" y1="8.6233" x2="6.7691" y2="8.6487" layer="200"/>
<rectangle x1="6.8199" y1="8.6233" x2="6.8453" y2="8.6487" layer="200"/>
<rectangle x1="6.9215" y1="8.6233" x2="7.0993" y2="8.6487" layer="200"/>
<rectangle x1="6.7691" y1="8.6233" x2="6.8199" y2="8.6487" layer="201"/>
<rectangle x1="6.8453" y1="8.6233" x2="6.9215" y2="8.6487" layer="201"/>
<rectangle x1="-0.0127" y1="8.6487" x2="6.7945" y2="8.6741" layer="200"/>
<rectangle x1="6.8199" y1="8.6487" x2="6.8707" y2="8.6741" layer="200"/>
<rectangle x1="6.8961" y1="8.6487" x2="7.0993" y2="8.6741" layer="200"/>
<rectangle x1="6.7945" y1="8.6487" x2="6.8199" y2="8.6741" layer="201"/>
<rectangle x1="6.8707" y1="8.6487" x2="6.8961" y2="8.6741" layer="201"/>
<rectangle x1="-0.0127" y1="8.6741" x2="6.7945" y2="8.6995" layer="200"/>
<rectangle x1="6.8707" y1="8.6741" x2="7.0993" y2="8.6995" layer="200"/>
<rectangle x1="6.7945" y1="8.6741" x2="6.8707" y2="8.6995" layer="201"/>
<rectangle x1="-0.0127" y1="8.6995" x2="7.0993" y2="8.7249" layer="200"/>
<text x="0" y="-0.127" size="0.0508" layer="20" font="vector">/Users/adelleli/Dropbox (UX Team)/ADELLE-MATT-INTEL/UVicorns/class-materials/Unicorn.BMP</text>
</plain>
<libraries>
<library name="SparkFun-Capacitors">
<description><h3>SparkFun Electronics' preferred foot prints</h3>
In this library you'll find resistors, capacitors, inductors, test points, jumper pads, etc.<br><br>
We've spent an enormous amount of time creating and checking these footprints and parts, but it is the end user's responsibility to ensure correctness and suitablity for a given componet or application. If you enjoy using this library, please buy one of our products at www.sparkfun.com.
<br><br>
<b>Licensing:</b> Creative Commons ShareAlike 4.0 International - https://creativecommons.org/licenses/by-sa/4.0/
<br><br>
You are welcome to use this library for commercial purposes. For attribution, we ask that when you begin to sell your device using our footprint, you email us with a link to the product being sold. We want bragging rights that we helped (in a very small part) to create your 8th world wonder. We would like the opportunity to feature your device on our homepage.</description>
<packages>
<package name="AXIAL-5MM">
<wire x1="-1.14" y1="0.762" x2="1.14" y2="0.762" width="0.2032" layer="21"/>
<wire x1="1.14" y1="0.762" x2="1.14" y2="0" width="0.2032" layer="21"/>
<wire x1="1.14" y1="0" x2="1.14" y2="-0.762" width="0.2032" layer="21"/>
<wire x1="1.14" y1="-0.762" x2="-1.14" y2="-0.762" width="0.2032" layer="21"/>
<wire x1="-1.14" y1="-0.762" x2="-1.14" y2="0" width="0.2032" layer="21"/>
<wire x1="-1.14" y1="0" x2="-1.14" y2="0.762" width="0.2032" layer="21"/>
<wire x1="1.14" y1="0" x2="1.394" y2="0" width="0.2032" layer="21"/>
<wire x1="-1.14" y1="0" x2="-1.394" y2="0" width="0.2032" layer="21"/>
<pad name="P$1" x="-2.5" y="0" drill="0.9" diameter="1.8796"/>
<pad name="P$2" x="2.5" y="0" drill="0.9" diameter="1.8796"/>
<text x="-2.54" y="1.17" size="0.4" layer="25">>Name</text>
<text x="-1.032" y="-0.208" size="0.4" layer="21" ratio="15">>Value</text>
</package>
</packages>
</library>
<library name="SparkFun-LED">
<description><h3>SparkFun Electronics' preferred foot prints</h3>
In this library you'll find discrete LEDs for illumination or indication, but no displays.<br><br>
We've spent an enormous amount of time creating and checking these footprints and parts, but it is the end user's responsibility to ensure correctness and suitablity for a given componet or application. If you enjoy using this library, please buy one of our products at www.sparkfun.com.
<br><br>
<b>Licensing:</b> Creative Commons ShareAlike 4.0 International - https://creativecommons.org/licenses/by-sa/4.0/
<br><br>
You are welcome to use this library for commercial purposes. For attribution, we ask that when you begin to sell your device using our footprint, you email us with a link to the product being sold. We want bragging rights that we helped (in a very small part) to create your 8th world wonder. We would like the opportunity to feature your device on our homepage.</description>
<packages>
<package name="LED5MM">
<description><B>LED</B><p>
5 mm, round</description>
<wire x1="2.54" y1="-1.905" x2="2.54" y2="1.905" width="0.2032" layer="21"/>
<wire x1="2.54" y1="-1.905" x2="2.54" y2="1.905" width="0.254" layer="21" curve="-286.260205" cap="flat"/>
<wire x1="-1.143" y1="0" x2="0" y2="1.143" width="0.1524" layer="51" curve="-90" cap="flat"/>
<wire x1="0" y1="-1.143" x2="1.143" y2="0" width="0.1524" layer="51" curve="90" cap="flat"/>
<wire x1="-1.651" y1="0" x2="0" y2="1.651" width="0.1524" layer="51" curve="-90" cap="flat"/>
<wire x1="0" y1="-1.651" x2="1.651" y2="0" width="0.1524" layer="51" curve="90" cap="flat"/>
<wire x1="-2.159" y1="0" x2="0" y2="2.159" width="0.1524" layer="51" curve="-90" cap="flat"/>
<wire x1="0" y1="-2.159" x2="2.159" y2="0" width="0.1524" layer="51" curve="90" cap="flat"/>
<circle x="0" y="0" radius="2.54" width="0.1524" layer="21"/>
<pad name="A" x="-1.27" y="0" drill="0.8128" diameter="1.8796"/>
<pad name="K" x="1.27" y="0" drill="0.8128" diameter="1.8796"/>
<text x="3.175" y="0.5334" size="1.27" layer="25" ratio="10">>NAME</text>
<text x="3.2004" y="-1.8034" size="1.27" layer="27" ratio="10">>VALUE</text>
</package>
</packages>
</library>
<library name="st-microelectronics">
<description><b>ST Microelectronics Devices</b><p>
Microcontrollers,  I2C components, linear devices<p>
http://www.st.com<p>
<i>Include st-microelectronics-2.lbr, st-microelectronics-3.lbr.<p></i>

<author>Created by librarian@cadsoft.de</author></description>
<packages>
<package name="DIL-08">
<description><b>Dual In Line Package</b></description>
<wire x1="5.08" y1="2.921" x2="-5.08" y2="2.921" width="0.1524" layer="21"/>
<wire x1="-5.08" y1="-2.921" x2="5.08" y2="-2.921" width="0.1524" layer="21"/>
<wire x1="5.08" y1="2.921" x2="5.08" y2="-2.921" width="0.1524" layer="21"/>
<wire x1="-5.08" y1="2.921" x2="-5.08" y2="1.016" width="0.1524" layer="21"/>
<wire x1="-5.08" y1="-2.921" x2="-5.08" y2="-1.016" width="0.1524" layer="21"/>
<wire x1="-5.08" y1="1.016" x2="-5.08" y2="-1.016" width="0.1524" layer="21" curve="-180"/>
<pad name="1" x="-3.81" y="-3.81" drill="0.8128" shape="long" rot="R90"/>
<pad name="2" x="-1.27" y="-3.81" drill="0.8128" shape="long" rot="R90"/>
<pad name="7" x="-1.27" y="3.81" drill="0.8128" shape="long" rot="R90"/>
<pad name="8" x="-3.81" y="3.81" drill="0.8128" shape="long" rot="R90"/>
<pad name="3" x="1.27" y="-3.81" drill="0.8128" shape="long" rot="R90"/>
<pad name="4" x="3.81" y="-3.81" drill="0.8128" shape="long" rot="R90"/>
<pad name="6" x="1.27" y="3.81" drill="0.8128" shape="long" rot="R90"/>
<pad name="5" x="3.81" y="3.81" drill="0.8128" shape="long" rot="R90"/>
<text x="-5.334" y="-2.921" size="1.27" layer="25" ratio="10" rot="R90">>NAME</text>
<text x="-3.556" y="-0.635" size="1.27" layer="27" ratio="10">>VALUE</text>
</package>
</packages>
</library>
<library name="SparkFun-Resistors">
<description><h3>SparkFun Electronics' preferred foot prints</h3>
In this library you'll find resistors, capacitors, inductors, test points, jumper pads, etc.<br><br>
We've spent an enormous amount of time creating and checking these footprints and parts, but it is the end user's responsibility to ensure correctness and suitablity for a given componet or application. If you enjoy using this library, please buy one of our products at www.sparkfun.com.
<br><br>
<b>Licensing:</b> Creative Commons ShareAlike 4.0 International - https://creativecommons.org/licenses/by-sa/4.0/
<br><br>
You are welcome to use this library for commercial purposes. For attribution, we ask that when you begin to sell your device using our footprint, you email us with a link to the product being sold. We want bragging rights that we helped (in a very small part) to create your 8th world wonder. We would like the opportunity to feature your device on our homepage.</description>
<packages>
<package name="AXIAL-0.3EZ">
<description>This is the "EZ" version of the standard .3" spaced resistor package.<br>
It has a reduced top mask to make it harder to install upside-down.</description>
<wire x1="-2.54" y1="0.762" x2="2.54" y2="0.762" width="0.2032" layer="21"/>
<wire x1="2.54" y1="0.762" x2="2.54" y2="0" width="0.2032" layer="21"/>
<wire x1="2.54" y1="0" x2="2.54" y2="-0.762" width="0.2032" layer="21"/>
<wire x1="2.54" y1="-0.762" x2="-2.54" y2="-0.762" width="0.2032" layer="21"/>
<wire x1="-2.54" y1="-0.762" x2="-2.54" y2="0" width="0.2032" layer="21"/>
<wire x1="-2.54" y1="0" x2="-2.54" y2="0.762" width="0.2032" layer="21"/>
<wire x1="2.54" y1="0" x2="2.794" y2="0" width="0.2032" layer="21"/>
<wire x1="-2.54" y1="0" x2="-2.794" y2="0" width="0.2032" layer="21"/>
<pad name="P$1" x="-3.81" y="0" drill="0.9" diameter="1.8796" stop="no"/>
<pad name="P$2" x="3.81" y="0" drill="0.9" diameter="1.8796" stop="no"/>
<text x="-2.54" y="1.27" size="0.4064" layer="25" font="vector">>Name</text>
<text x="-2.032" y="-0.381" size="1.016" layer="21" font="vector" ratio="15">>Value</text>
<circle x="-3.81" y="0" radius="0.508" width="0" layer="29"/>
<circle x="3.81" y="0" radius="0.523634375" width="0" layer="29"/>
<circle x="-3.81" y="0" radius="1.02390625" width="0" layer="30"/>
<circle x="3.81" y="0" radius="1.04726875" width="0" layer="30"/>
</package>
</packages>
</library>
<library name="adafruit">
<packages>
<package name="CR2032-THRU">
<wire x1="-11.176" y1="-2.54" x2="-10.16" y2="-2.54" width="0.127" layer="21"/>
<wire x1="-10.16" y1="-2.54" x2="-10.16" y2="-4.572" width="0.127" layer="21"/>
<wire x1="-10.16" y1="-4.572" x2="-4.826" y2="-10.16" width="0.127" layer="21"/>
<wire x1="-4.826" y1="-10.16" x2="5.08" y2="-10.16" width="0.127" layer="21"/>
<wire x1="5.08" y1="-10.16" x2="10.16" y2="-4.826" width="0.127" layer="21"/>
<wire x1="10.16" y1="-4.826" x2="10.16" y2="-2.54" width="0.127" layer="21"/>
<wire x1="10.16" y1="-2.54" x2="11.176" y2="-2.54" width="0.127" layer="21"/>
<wire x1="11.176" y1="-2.54" x2="11.176" y2="2.54" width="0.127" layer="21"/>
<wire x1="11.176" y1="2.54" x2="10.16" y2="2.54" width="0.127" layer="21"/>
<wire x1="10.16" y1="2.54" x2="10.16" y2="9.652" width="0.127" layer="21"/>
<wire x1="10.16" y1="9.652" x2="5.842" y2="9.652" width="0.127" layer="21"/>
<wire x1="5.842" y1="9.652" x2="3.302" y2="7.874" width="0.127" layer="21"/>
<wire x1="3.302" y1="7.874" x2="-3.048" y2="7.874" width="0.127" layer="21"/>
<wire x1="-3.048" y1="7.874" x2="-5.334" y2="9.652" width="0.127" layer="21"/>
<wire x1="-5.334" y1="9.652" x2="-10.16" y2="9.652" width="0.127" layer="21"/>
<wire x1="-10.16" y1="9.652" x2="-10.16" y2="2.54" width="0.127" layer="21"/>
<wire x1="-10.16" y1="2.54" x2="-11.176" y2="2.54" width="0.127" layer="21"/>
<wire x1="-11.176" y1="2.54" x2="-11.176" y2="-2.54" width="0.127" layer="21"/>
<pad name="+1" x="-10.668" y="0" drill="2" diameter="3.81" shape="octagon"/>
<pad name="+2" x="10.668" y="0" drill="2" diameter="3.81" shape="octagon"/>
<smd name="-" x="0" y="0" dx="10.16" dy="10.16" layer="1" roundness="100"/>
<text x="-3.556" y="3.302" size="1.6764" layer="25" font="vector">>NAME</text>
<text x="-4.318" y="-6.35" size="1.6764" layer="27" font="vector">>VALUE</text>
<polygon width="0.127" layer="29">
<vertex x="-7.62" y="0" curve="90"/>
<vertex x="0" y="-7.62" curve="90"/>
<vertex x="7.62" y="0" curve="90"/>
<vertex x="0" y="7.62" curve="90"/>
</polygon>
</package>
</packages>
</library>
</libraries>
<attributes>
</attributes>
<variantdefs>
</variantdefs>
<classes>
<class number="0" name="default" width="0" drill="0">
</class>
</classes>
<designrules name="oshpark-2layer">
<description language="de"><b>EAGLE Design Rules</b>
<p>
Die Standard-Design-Rules sind so gewählt, dass sie für
die meisten Anwendungen passen. Sollte ihre Platine
besondere Anforderungen haben, treffen Sie die erforderlichen
Einstellungen hier und speichern die Design Rules unter
einem neuen Namen ab.</description>
<description language="en"><b>Laen's PCB Order Design Rules</b>
<p>
Please make sure your boards conform to these design rules.</description>
<param name="layerSetup" value="(1*16)"/>
<param name="mtCopper" value="0.0356mm 0.0356mm 0.0356mm 0.0356mm 0.0356mm 0.0356mm 0.0356mm 0.0356mm 0.0356mm 0.0356mm 0.0356mm 0.0356mm 0.0356mm 0.0356mm 0.0356mm 0.0356mm"/>
<param name="mtIsolate" value="1.5011mm 0.1499mm 0.2007mm 0.1499mm 0.2007mm 0.1499mm 0.2007mm 0.1499mm 0.2007mm 0.1499mm 0.2007mm 0.1499mm 0.2007mm 0.1499mm 0.2007mm"/>
<param name="mdWireWire" value="6mil"/>
<param name="mdWirePad" value="6mil"/>
<param name="mdWireVia" value="6mil"/>
<param name="mdPadPad" value="6mil"/>
<param name="mdPadVia" value="6mil"/>
<param name="mdViaVia" value="6mil"/>
<param name="mdSmdPad" value="6mil"/>
<param name="mdSmdVia" value="6mil"/>
<param name="mdSmdSmd" value="6mil"/>
<param name="mdViaViaSameLayer" value="8mil"/>
<param name="mnLayersViaInSmd" value="2"/>
<param name="mdCopperDimension" value="15mil"/>
<param name="mdDrill" value="6mil"/>
<param name="mdSmdStop" value="0mil"/>
<param name="msWidth" value="6mil"/>
<param name="msDrill" value="13mil"/>
<param name="msMicroVia" value="13mil"/>
<param name="msBlindViaRatio" value="0.5"/>
<param name="rvPadTop" value="0.25"/>
<param name="rvPadInner" value="0.25"/>
<param name="rvPadBottom" value="0.25"/>
<param name="rvViaOuter" value="0.25"/>
<param name="rvViaInner" value="0.25"/>
<param name="rvMicroViaOuter" value="0.25"/>
<param name="rvMicroViaInner" value="0.25"/>
<param name="rlMinPadTop" value="7mil"/>
<param name="rlMaxPadTop" value="20mil"/>
<param name="rlMinPadInner" value="7mil"/>
<param name="rlMaxPadInner" value="20mil"/>
<param name="rlMinPadBottom" value="7mil"/>
<param name="rlMaxPadBottom" value="20mil"/>
<param name="rlMinViaOuter" value="7mil"/>
<param name="rlMaxViaOuter" value="20mil"/>
<param name="rlMinViaInner" value="7mil"/>
<param name="rlMaxViaInner" value="20mil"/>
<param name="rlMinMicroViaOuter" value="4mil"/>
<param name="rlMaxMicroViaOuter" value="20mil"/>
<param name="rlMinMicroViaInner" value="4mil"/>
<param name="rlMaxMicroViaInner" value="20mil"/>
<param name="psTop" value="-1"/>
<param name="psBottom" value="-1"/>
<param name="psFirst" value="-1"/>
<param name="psElongationLong" value="100"/>
<param name="psElongationOffset" value="100"/>
<param name="mvStopFrame" value="1"/>
<param name="mvCreamFrame" value="0"/>
<param name="mlMinStopFrame" value="2.5mil"/>
<param name="mlMaxStopFrame" value="2.5mil"/>
<param name="mlMinCreamFrame" value="0mil"/>
<param name="mlMaxCreamFrame" value="0mil"/>
<param name="mlViaStopLimit" value="0mil"/>
<param name="srRoundness" value="0"/>
<param name="srMinRoundness" value="0mil"/>
<param name="srMaxRoundness" value="0mil"/>
<param name="slThermalIsolate" value="10mil"/>
<param name="slThermalsForVias" value="0"/>
<param name="dpMaxLengthDifference" value="10mm"/>
<param name="dpGapFactor" value="2.5"/>
<param name="checkGrid" value="0"/>
<param name="checkAngle" value="0"/>
<param name="checkFont" value="1"/>
<param name="checkRestrict" value="1"/>
<param name="useDiameter" value="13"/>
<param name="maxErrors" value="50"/>
</designrules>
<autorouter>
<pass name="Default">
<param name="RoutingGrid" value="50mil"/>
<param name="AutoGrid" value="1"/>
<param name="Efforts" value="0"/>
<param name="TopRouterVariant" value="1"/>
<param name="tpViaShape" value="round"/>
<param name="PrefDir.1" value="a"/>
<param name="PrefDir.2" value="0"/>
<param name="PrefDir.3" value="0"/>
<param name="PrefDir.4" value="0"/>
<param name="PrefDir.5" value="0"/>
<param name="PrefDir.6" value="0"/>
<param name="PrefDir.7" value="0"/>
<param name="PrefDir.8" value="0"/>
<param name="PrefDir.9" value="0"/>
<param name="PrefDir.10" value="0"/>
<param name="PrefDir.11" value="0"/>
<param name="PrefDir.12" value="0"/>
<param name="PrefDir.13" value="0"/>
<param name="PrefDir.14" value="0"/>
<param name="PrefDir.15" value="0"/>
<param name="PrefDir.16" value="a"/>
<param name="cfVia" value="8"/>
<param name="cfNonPref" value="5"/>
<param name="cfChangeDir" value="2"/>
<param name="cfOrthStep" value="2"/>
<param name="cfDiagStep" value="3"/>
<param name="cfExtdStep" value="0"/>
<param name="cfBonusStep" value="1"/>
<param name="cfMalusStep" value="1"/>
<param name="cfPadImpact" value="4"/>
<param name="cfSmdImpact" value="4"/>
<param name="cfBusImpact" value="0"/>
<param name="cfHugging" value="3"/>
<param name="cfAvoid" value="4"/>
<param name="cfPolygon" value="10"/>
<param name="cfBase.1" value="0"/>
<param name="cfBase.2" value="1"/>
<param name="cfBase.3" value="1"/>
<param name="cfBase.4" value="1"/>
<param name="cfBase.5" value="1"/>
<param name="cfBase.6" value="1"/>
<param name="cfBase.7" value="1"/>
<param name="cfBase.8" value="1"/>
<param name="cfBase.9" value="1"/>
<param name="cfBase.10" value="1"/>
<param name="cfBase.11" value="1"/>
<param name="cfBase.12" value="1"/>
<param name="cfBase.13" value="1"/>
<param name="cfBase.14" value="1"/>
<param name="cfBase.15" value="1"/>
<param name="cfBase.16" value="0"/>
<param name="mnVias" value="20"/>
<param name="mnSegments" value="9999"/>
<param name="mnExtdSteps" value="9999"/>
<param name="mnRipupLevel" value="10"/>
<param name="mnRipupSteps" value="100"/>
<param name="mnRipupTotal" value="100"/>
</pass>
<pass name="Follow-me" refer="Default" active="yes">
</pass>
<pass name="Busses" refer="Default" active="yes">
<param name="cfNonPref" value="4"/>
<param name="cfBusImpact" value="4"/>
<param name="cfHugging" value="0"/>
<param name="mnVias" value="0"/>
</pass>
<pass name="Route" refer="Default" active="yes">
</pass>
<pass name="Optimize1" refer="Default" active="yes">
<param name="cfVia" value="99"/>
<param name="cfExtdStep" value="10"/>
<param name="cfHugging" value="1"/>
<param name="mnExtdSteps" value="1"/>
<param name="mnRipupLevel" value="0"/>
</pass>
<pass name="Optimize2" refer="Optimize1" active="yes">
<param name="cfNonPref" value="0"/>
<param name="cfChangeDir" value="6"/>
<param name="cfExtdStep" value="0"/>
<param name="cfBonusStep" value="2"/>
<param name="cfMalusStep" value="2"/>
<param name="cfPadImpact" value="2"/>
<param name="cfSmdImpact" value="2"/>
<param name="cfHugging" value="0"/>
</pass>
<pass name="Optimize3" refer="Optimize2" active="yes">
<param name="cfChangeDir" value="8"/>
<param name="cfPadImpact" value="0"/>
<param name="cfSmdImpact" value="0"/>
</pass>
<pass name="Optimize4" refer="Optimize3" active="yes">
<param name="cfChangeDir" value="25"/>
</pass>
</autorouter>
<elements>
<element name="C1" library="SparkFun-Capacitors" package="AXIAL-5MM" value="1UF" x="21.59" y="34.29" rot="R270">
<attribute name="PROD_ID" value="445-8517-ND" x="21.59" y="34.29" size="1.778" layer="27" rot="R270" display="off"/>
</element>
<element name="D4" library="SparkFun-LED" package="LED5MM" value="WHITE-30mA" x="39.37" y="10.16" rot="R180">
<attribute name="PROD_ID" value="67-2062-ND" x="39.37" y="10.16" size="1.778" layer="27" rot="R180" display="off"/>
</element>
<element name="IC1" library="st-microelectronics" package="DIL-08" value="NE555" x="31.75" y="36.83" rot="R180">
<attribute name="MF" value="Arrow Electronics" x="31.75" y="36.83" size="1.778" layer="27" rot="R180" display="off"/>
<attribute name="MPN" value="NE555N" x="31.75" y="36.83" size="1.778" layer="27" rot="R180" display="off"/>
<attribute name="OC_FARNELL" value="1467742" x="31.75" y="36.83" size="1.778" layer="27" rot="R180" display="off"/>
<attribute name="OC_NEWARK" value="89K1486" x="31.75" y="36.83" size="1.778" layer="27" rot="R180" display="off"/>
<attribute name="PROD_ID" value="296-1857-5-ND" x="31.75" y="36.83" size="1.778" layer="27" rot="R180" display="off"/>
</element>
<element name="R4" library="SparkFun-Resistors" package="AXIAL-0.3EZ" value="100" x="48.26" y="10.16" rot="R180">
<attribute name="PROD_ID" value="RES-08380" x="48.26" y="10.16" size="1.778" layer="27" rot="R180" display="off"/>
</element>
<element name="R5" library="SparkFun-Resistors" package="AXIAL-0.3EZ" value="1K" x="31.75" y="27.94">
<attribute name="PROD_ID" value="1.0KQBK-ND" x="31.75" y="27.94" size="1.778" layer="27" display="off"/>
</element>
<element name="R6" library="SparkFun-Resistors" package="AXIAL-0.3EZ" value="470K" x="21.59" y="27.94" rot="R180">
<attribute name="PROD_ID" value="RES-08380" x="21.59" y="27.94" size="1.778" layer="27" rot="R180" display="off"/>
</element>
<element name="U$1" library="adafruit" package="CR2032-THRU" value="" x="22.86" y="15.24" rot="R180"/>
<element name="U$2" library="adafruit" package="CR2032-THRU" value="" x="48.26" y="21.59"/>
</elements>
<signals>
<signal name="GND">
<contactref element="D4" pad="K"/>
<contactref element="IC1" pad="1"/>
<contactref element="C1" pad="P$1"/>
<contactref element="U$1" pad="-"/>
<polygon width="0.4064" layer="1">
<vertex x="2.54" y="2.54"/>
<vertex x="0" y="10.16" curve="-90"/>
<vertex x="33.02" y="45.72" curve="-90"/>
<vertex x="63.5" y="17.78"/>
<vertex x="63.5" y="2.54"/>
<vertex x="55.88" y="2.54" curve="-90"/>
<vertex x="53.34" y="5.08" curve="-90"/>
<vertex x="48.26" y="0"/>
<vertex x="40.64" y="0" curve="-90"/>
<vertex x="35.56" y="5.08" curve="-90"/>
<vertex x="30.48" y="0"/>
<vertex x="22.86" y="0" curve="-90"/>
<vertex x="17.78" y="5.08" curve="-45"/>
<vertex x="11.647896875" y="2.54"/>
</polygon>
</signal>
<signal name="N$2">
<contactref element="R4" pad="P$2"/>
<contactref element="D4" pad="A"/>
<wire x1="44.45" y1="10.16" x2="40.64" y2="10.16" width="0.254" layer="16"/>
</signal>
<signal name="THRESHOLD">
<contactref element="C1" pad="P$2"/>
<contactref element="IC1" pad="6"/>
<contactref element="R6" pad="P$2"/>
<wire x1="28.575" y1="31.115" x2="30.48" y2="33.02" width="0.254" layer="16"/>
<wire x1="22.225" y1="31.115" x2="28.575" y2="31.115" width="0.254" layer="16"/>
<wire x1="21.59" y1="31.75" x2="22.225" y2="31.115" width="0.254" layer="16"/>
<wire x1="21.59" y1="31.75" x2="17.78" y2="27.94" width="0.254" layer="16"/>
<wire x1="21.59" y1="31.75" x2="21.59" y2="31.79" width="0.254" layer="16"/>
</signal>
<signal name="VCC">
<contactref element="IC1" pad="8"/>
<contactref element="IC1" pad="4"/>
<contactref element="R5" pad="P$2"/>
<contactref element="U$2" pad="+1"/>
<wire x1="35.56" y1="27.94" x2="35.56" y2="33.02" width="0.254" layer="16"/>
<wire x1="35.56" y1="33.02" x2="27.94" y2="40.64" width="0.254" layer="16"/>
<wire x1="37.465" y1="27.94" x2="37.465" y2="21.59" width="0.254" layer="16"/>
<wire x1="35.56" y1="27.94" x2="37.465" y2="27.94" width="0.254" layer="16"/>
<wire x1="37.465" y1="21.59" x2="37.592" y2="21.59" width="0.254" layer="16"/>
</signal>
<signal name="OUT">
<contactref element="IC1" pad="3"/>
<contactref element="R4" pad="P$1"/>
<wire x1="52.07" y1="19.05" x2="30.48" y2="40.64" width="0.254" layer="16"/>
<wire x1="52.07" y1="10.16" x2="52.07" y2="19.05" width="0.254" layer="16"/>
</signal>
<signal name="DISCHARGE">
<contactref element="IC1" pad="7"/>
<contactref element="R6" pad="P$1"/>
<contactref element="R5" pad="P$1"/>
<wire x1="27.94" y1="27.94" x2="33.02" y2="33.02" width="0.254" layer="16"/>
<wire x1="27.94" y1="27.94" x2="25.4" y2="27.94" width="0.254" layer="16"/>
</signal>
<signal name="N$4">
<contactref element="U$1" pad="+2"/>
<contactref element="U$2" pad="-"/>
<contactref element="U$1" pad="+1"/>
<wire x1="33.528" y1="15.24" x2="12.192" y2="15.24" width="0.254" layer="16"/>
<wire x1="41.91" y1="15.24" x2="48.26" y2="21.59" width="0.254" layer="1"/>
<wire x1="33.528" y1="15.24" x2="41.91" y2="15.24" width="0.254" layer="1"/>
</signal>
<signal name="N$3">
<contactref element="IC1" pad="2"/>
</signal>
</signals>
<errors>
<approved hash="18,29,a0cead4d10f80ddf"/>
<approved hash="18,29,22562279fe11fe3e"/>
<approved hash="18,29,a8405efd36322e6c"/>
<approved hash="18,29,7008704ae032e070"/>
<approved hash="18,29,4127410321012125"/>
<approved hash="18,29,42e242ac00ac00e2"/>
<approved hash="18,29,d19511ced3fcdd1c"/>
<approved hash="18,29,4b024a661e081f6c"/>
<approved hash="18,29,5f12164227a437bc"/>
<approved hash="18,29,0d120d63e0bbe0ca"/>
</errors>
</board>
</drawing>
</eagle>


text:
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;

using ComputersFactory.Models.Components;
using ComputersFactory.Models;

namespace ComputersFactory.Data.Models
{
    public class Computer
    {
        private ICollection<HardDrive> hardDrives;

        public Computer()
        {
            this.hardDrives = new HashSet<HardDrive>();
        }

        public int Id
        {
            get; set;
        }

        [Required]
        [MaxLength(50)]
        public string Model
        {
            get; set;
        }

        [Required]
        public Decimal Price
        {
            get; set;
        }

        public int MemoryId
        {
            get; set;
        }

        public virtual Memory Memory
        {
            get; set;
        }

        public int MotherboardId
        {
            get; set;
        }

        public virtual Motherboard Motherboard
        {
            get; set;
        }

        public int ProcessorId
        {
            get; set;
        }

        public virtual Processor Processor
        {
            get; set;
        }

        public int VideocardId
        {
            get; set;
        }

        public virtual VideoCard Videocard
        {
            get; set;
        }

        public virtual ICollection<HardDrive> HardDrives
        {
            get
            {
                return this.hardDrives;
            }
            set
            {
                this.hardDrives = value;
            }
        }

        public int ComputerShopId
        {
            get; set;
        }

        public virtual ComputerShop ComputerShop
        {
            get; set;
        }
    }
}

license: MIT

repository: kgerilovski/databases-teamwork

license_type: permissive

repo_name: kgerilovski/databases-teamwork

branch_name: refs/heads/master

extension: cs


text:
include flex.inc
inherit native

PR = "r1"

do_stage () {
	install -m 0755 flex ${STAGING_BINDIR}
	oe_libinstall -a libfl ${STAGING_LIBDIR}
	ln -sf ./flex ${STAGING_BINDIR}/flex++
	ln -sf ./flex ${STAGING_BINDIR}/lex
}

repository: BackupTheBerlios/openslug-svn

repo_name: BackupTheBerlios/openslug-svn

extension: bb


text:
SUMMARY = "Internationalization utilities"
SECTION = "devel/python"

HOMEPAGE = "https://pypi.python.org/pypi/babel/"

LICENSE = "BSD"
LIC_FILES_CHKSUM = "file://LICENSE;md5=e6eeaabc92cfc2d03f53e789324d7292"

DEPENS = "python-pytz"

SRC_URI = "https://pypi.python.org/packages/source/B/Babel/Babel-${PV}.tar.gz"
SRC_URI[md5sum] = "62917719897a81e22dcaa3b17eeb11d8"
SRC_URI[sha256sum] = "44988df191123065af9857eca68e9151526a931c12659ca29904e4f11de7ec1b"

S = "${WORKDIR}/Babel-${PV}"

inherit setuptools

export BUILD_SYS
export HOST_SYS
export STAGING_INCDIR
export STAGING_LIBDIR

RDEPENDS_${PN} = "python-pytz"

BBCLASSEXTEND = "native"

repository: koenkooi/meta-maker

repo_name: koenkooi/meta-maker

gha_license_id: MIT

gha_language: BitBake


text:
#include "MemReadWriter.hh"
namespace Sirikata {
std::pair<Sirikata::uint32, Sirikata::JpegError> MemReadWriter::Write(const Sirikata::uint8*data, unsigned int size) {
    using namespace Sirikata;
    mBuffer.insert(mBuffer.begin() + mWriteCursor, data, data + size);
    mWriteCursor += size;
    return std::pair<Sirikata::uint32, JpegError>(size, JpegError());
}
std::pair<Sirikata::uint32, Sirikata::JpegError> MemReadWriter::Read(Sirikata::uint8*data, unsigned int size) {
    using namespace Sirikata;
    size_t bytesLeft = mBuffer.size() - mReadCursor;
    size_t actualBytesRead = size;
    if (bytesLeft < size) {
        actualBytesRead = bytesLeft;
    }
    if (actualBytesRead > 0) {
        memcpy(data, &mBuffer[mReadCursor], actualBytesRead);
    }
    mReadCursor += actualBytesRead;
    JpegError err = JpegError();
    if (actualBytesRead == 0) {
        err = JpegError::errEOF();
    }
    //fprintf(stderr, "%d READ %02x%02x%02x%02x - %02x%02x%02x%02x\n", (uint32)actualBytesRead, data[0], data[1],data[2], data[3],
    //        data[actualBytesRead-4],data[actualBytesRead-3],data[actualBytesRead-2],data[actualBytesRead-1]);

	//	The size_t -> Sirikata::uint32 cast is safe because sizeof(size) is <= sizeof(Sirikata::uint32)
	std::pair<Sirikata::uint32, JpegError> retval(static_cast<Sirikata::uint32>(actualBytesRead), err);
    return retval;
}
}

repository: dropbox/lepton

repo_name: dropbox/lepton

extension: cc


text:
// Code generated by generate_structs - DO NOT EDIT.

package xivapi

type EquipSlotCategory struct {
	Feet int `json:"Feet,omitempty"`
	ID int `json:"ID,omitempty"`
	MainHand int `json:"MainHand,omitempty"`
	SoulCrystal int `json:"SoulCrystal,omitempty"`
	Gloves int `json:"Gloves,omitempty"`
	Head int `json:"Head,omitempty"`
	OffHand int `json:"OffHand,omitempty"`
	Url string `json:"Url,omitempty"`
	Waist int `json:"Waist,omitempty"`
	Wrists int `json:"Wrists,omitempty"`
	Body int `json:"Body,omitempty"`
	Ears int `json:"Ears,omitempty"`
	FingerL int `json:"FingerL,omitempty"`
	FingerR int `json:"FingerR,omitempty"`
	GameContentLinks struct {
		Item struct {
			EquipSlotCategory []interface{} `json:"EquipSlotCategory,omitempty"`
		}
	}
	Legs int `json:"Legs,omitempty"`
	Neck int `json:"Neck,omitempty"`
}

repository: Zyian/xivapi-go

repo_name: Zyian/xivapi-go

gha_language: Go

extension: go


text:
// Copyright © 2018 Jeff Coffler <jeff@taltos.com>
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//   http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

package main

import (
	"errors"
	"flag"
	"fmt"
	"io"
	"log"
	"os"
	"path/filepath"
	"regexp"
	"strings"
	"time"

	"github.com/theckman/go-flock"
)

type backupRevision struct {
	storage          string
	chunkTotalCount  string // Like: 348444
	chunkTotalSize   string // Like: 1668G
	filesTotalCount  string // Like: 161318
	filesTotalSize   string // Like: 1666G
	filesNewCount    string // Like: 373
	filesNewSize     string // Like: 15,951M
	chunkNewCount    string // Like: 2415
	chunkNewSize     string // Like: 12,391M
	chunkNewUploaded string // Like: 12,255M
	duration         string
}

type copyRevision struct {
	storageFrom     string
	storageTo       string // Like: 348444
	chunkTotalCount string // Like: 109
	chunkCopyCount  string // Like: 3
	chunkSkipCount  string // Like: 106
	duration        string
}

var (
	// Configuration file for backup operations
	cmdConfig       string
	cmdGlobalConfig string

	// Binary options for what operations to perform
	cmdAll    bool
	cmdBackup bool
	cmdCheck  bool
	cmdPrune  bool

	sendMail bool
	testMail bool

	debugFlag   bool
	quietFlag   bool
	verboseFlag bool
	versionFlag bool

	// Version flags (passed by link stage)
	versionText string = "<dev>"
	gitHash     string = "<unknown>"

	// Mail message body to send upon completion
	backupTable []backupRevision
	copyTable   []copyRevision
	mailBody    []string

	// Create configuration object to load configuration file
	configFile *ConfigFile = NewConfigFile()
)

func init() {
	// Perform command line argument processing
	flag.StringVar(&cmdConfig, "f", "", "Configuration file for storage definitions (must be specified)")

	flag.BoolVar(&cmdAll, "a", false, "Perform all duplicacy operations (backup/copy, purge, check)")
	flag.BoolVar(&cmdBackup, "b", false, "Perform duplicacy backup/copy operation")
	flag.BoolVar(&cmdCheck, "c", false, "Perform duplicacy check operation")
	flag.StringVar(&cmdGlobalConfig, "g", "", "Global configuration file name")
	flag.BoolVar(&cmdPrune, "p", false, "Perform duplicacy prune operation")

	flag.BoolVar(&sendMail, "m", false, "Send E-Mail with results of operations (implies quiet)")
	flag.BoolVar(&testMail, "tm", false, "Send a test message via E-Mail")

	flag.BoolVar(&debugFlag, "d", false, "Enable debug output (implies verbose)")
	flag.BoolVar(&quietFlag, "q", false, "Quiet operations (generate output only in case of error)")
	flag.BoolVar(&verboseFlag, "v", false, "Enable verbose output")
	flag.BoolVar(&versionFlag, "version", false, "Display version number")
}

// Generic output routine to generate output to screen (and E-Mail) - Allow output writer
func logFMessage(w io.Writer, logger *log.Logger, message string) {
	if logger != nil {
		logger.Println(message)
	}

	text := fmt.Sprint(time.Now().Format("15:04:05"), " ", message)
	mailBody = append(mailBody, text)

	if !quietFlag {
		if w == os.Stdout {
			fmt.Fprintln(w, text)
		} else {
			// Fatal message shouldn't have time prefix
			fmt.Fprintln(w, message)
		}
	}
}

// Generic error output routine to generate output to screen (and E-Mail)
func logError(logger *log.Logger, message string) {
	logFMessage(os.Stderr, logger, message)
}

// Generic output routine to generate output to screen (and E-Mail)
func logMessage(logger *log.Logger, message string) {
	logFMessage(os.Stdout, logger, message)
}

func main() {
	// Parse the command line arguments and validate results
	flag.Parse()

	// We do minimal command line processing here. Just things we KNOW
	// won't be supported via automated launching. Otherwise, send off
	// to processor so we can capture as much as possible via E-Mail
	// if so configured.

	if flag.NArg() != 0 {
		logError(nil, fmt.Sprint("Error: Unrecognized arguments specified on command line: ", flag.Args()))
		os.Exit(2)
	}

	// Parse the global configuration file, if any
	if err := loadGlobalConfig(cmdGlobalConfig); err != nil {
		os.Exit(2)
	}

	// If version number was requested, show it and exit
	if versionFlag {
		fmt.Printf("Version: %s, Git Hash: %s\n", versionText, gitHash)
		os.Exit(0)
	}

	returnStatus, transmitMail := processArguments()

	// Send mail if we were requested to do so
	if transmitMail {
		var ind string = "(success)"
		if returnStatus != 0 {
			ind = "(FAILURE)"
		}
		subject := fmt.Sprintf("duplicacy-util: Backup results for configuration %s %s", cmdConfig, ind)

		// Send the mail message
		if err := sendMailMessage(subject, htmlGenerateBody(), mailBody); err != nil {
			// If an error occurred, we can't do much about it, so just log it (forcing output)
			quietFlag = false
			logError(nil, fmt.Sprint("Error: ", err))
		}
	}

	os.Exit(returnStatus)
}

func processArguments() (int, bool) {
	var transmitMail bool = false

	if cmdAll {
		cmdBackup, cmdPrune, cmdCheck = true, true, true
	}
	if debugFlag {
		verboseFlag = true
	}

	// Verbose overrides quiet
	if verboseFlag == true && quietFlag == true {
		quietFlag = false
	}

	// Handle request to send test E-Mail, if requested
	if testMail {
		cmdConfig = "test"

		backupTable = []backupRevision {
			backupRevision{
				storage:          "b2",
				chunkTotalCount:  "149",
				chunkTotalSize:   "870,624K",
				filesTotalCount:  "345",
				filesTotalSize:   "823,261K",
				filesNewCount:    "1",
				filesNewSize:     "7,984K",
				chunkNewCount:    "6",
				chunkNewSize:     "8,106K",
				chunkNewUploaded: "3,410K",
				duration:         "9 seconds",
			},
			backupRevision{
				storage:          "azure-direct",
				chunkTotalCount:  "149",
				chunkTotalSize:   "870,624K",
				filesTotalCount:  "345",
				filesTotalSize:   "823,261K",
				filesNewCount:    "1",
				filesNewSize:     "7,984K",
				chunkNewCount:    "6",
				chunkNewSize:     "8,106K",
				chunkNewUploaded: "3,410K",
				duration:         "2 seconds",
			},
		}

		copyTable = []copyRevision {
			copyRevision{
				storageFrom:  "b2",
				storageTo:    "azure-direct",
				chunkTotalCount: "109",
				chunkCopyCount:  "3",
				chunkSkipCount:  "106",
				duration:        "9 seconds",
			},
		}

		if err := sendMailMessage("duplicacy-util: Backup results for configuration test (success)",
			htmlGenerateBody(),
			[]string{"This is a test E-Mail message for a successful backup job"}); err != nil {
			fmt.Fprintln(os.Stderr, "Error sending succcess E-Mail message:", err)
		}

		if err := sendMailMessage("duplicacy-util: Backup results for configuration test (FAILURE)",
			htmlGenerateBody(),
			[]string{"This is a test E-Mail message for a failed backup job"}); err != nil {
			fmt.Fprintln(os.Stderr, "Error sending failed E-Mail message:", err)
		}

		return 1, transmitMail
	}

	// Basic handling for E-Mail; only honor it if it's configured
	// (If it's not, disallow quiet operations or we won't see errors)
	if sendMail {
		if emailFromAddress == "" || emailToAddress == "" || emailServerHostname == "" || emailServerPort == 0 ||
			emailAuthUsername == "" || emailAuthPassword == "" {
			quietFlag = false
			logError(nil, "Error: Unable to send E-Mail; required fields missing from global configuration")
			return 3, transmitMail
		}

		transmitMail = true
	} else {
		if quietFlag {
			quietFlag = false
			logError(nil, "Notice: Quiet mode refused; makes no sense without sending mail")
		}
	}

	if cmdConfig == "" {
		logError(nil, "Error: Mandatory parameter -f is not specified (must be specified)")
		return 2, transmitMail
	}

	// Parse the configuration file and check for errors
	// (Errors are printed to stderr as well as returned)
	configFile.SetConfig(cmdConfig)
	if err := configFile.LoadConfig(verboseFlag, debugFlag); err != nil {
		return 1, transmitMail
	}

	// Everything is loaded; make sure we hae something to do
	if !cmdBackup && !cmdPrune && !cmdCheck {
		logError(nil, "Error: No operations to perform (specify -b, -p, -c, or -a)")
		return 1, transmitMail
	}

	// Perform processing. Note that int is returned for two reasons:
	// 1. We need to know the proper exit code
	// 2. We want defer statements to execute, so we can't use os.Exit here

	logMessage(nil, fmt.Sprintf("duplicacy-util starting, version: %s, Git Hash: %s", versionText, gitHash))
	return obtainLock(), transmitMail
}

func obtainLock() int {
	// Obtain a lock to make sure we don't overlap operations against a configuration
	lockfile := filepath.Join(globalLockDir, cmdConfig+".lock")
	fileLock := flock.NewFlock(lockfile)

	locked, err := fileLock.TryLock()
	if err != nil {
		logError(nil, fmt.Sprint("Error: ", err))
		return 201
	}

	if !locked {
		// do not have exclusive lock
		err = errors.New("unable to obtain lock using lockfile: " + lockfile)
		logError(nil, fmt.Sprint("Error: ", err))
		return 200
	}

	// flock doesn't remove the lock file when done, so let's do it ourselves
	// (ignore any errors if we can't remove the lock file)
	defer os.Remove(lockfile)
	defer fileLock.Unlock()

	// Perform operations (backup or whatever)
	if err := performBackup(); err != nil {
		return 500
	}

	return 0
}

func performBackup() error {
	// Handle log file rotation (before any output to log file so old one doesn't get trashed)

	logMessage(nil, "Rotating log files")
	if err := rotateLogFiles(); err != nil {
		return err
	}

	// Create output log file
	file, err := os.Create(filepath.Join(globalLogDir, cmdConfig+".log"))
	if err != nil {
		logError(nil, fmt.Sprint("Error: ", err))
		return err
	}
	logger := log.New(file, "", log.Ltime)

	startTime := time.Now()

	logMessage(logger, fmt.Sprint("Beginning backup on ", time.Now().Format("01-02-2006 15:04:05")))

	// Handling when processing output from "duplicacy backup" command
	var backupEntry backupRevision
	var copyEntry copyRevision

	backupLogger := func(line string) {
		switch {
		// Files: 161318 total, 1666G bytes; 373 new, 15,951M bytes
		case strings.HasPrefix(line, "Files:"):
			logger.Println(line)
			logMessage(logger, fmt.Sprint("  ", line))

			// Save chunk data for inclusion into HTML portion of E-Mail message
			re := regexp.MustCompile(`.*: (\S+) total, (\S+) bytes; (\S+) new, (\S+) bytes`)
			elements := re.FindStringSubmatch(line)
			if len(elements) >= 4 {
				backupEntry.filesTotalCount = elements[1]
				backupEntry.filesTotalSize = elements[2]
				backupEntry.filesNewCount = elements[3]
				backupEntry.filesNewSize = elements[4]
			}

			// All chunks: 348444 total, 1668G bytes; 2415 new, 12,391M bytes, 12,255M bytes uploaded
		case strings.HasPrefix(line, "All chunks:"):
			logger.Println(line)
			logMessage(logger, fmt.Sprint("  ", line))

			// Save chunk data for inclusion into HTML portion of E-Mail message
			re := regexp.MustCompile(`.*: (\S+) total, (\S+) bytes; (\S+) new, (\S+) bytes, (\S+) bytes uploaded`)
			elements := re.FindStringSubmatch(line)
			if len(elements) >= 6 {
				backupEntry.chunkTotalCount = elements[1]
				backupEntry.chunkTotalSize = elements[2]
				backupEntry.chunkNewCount = elements[3]
				backupEntry.chunkNewSize = elements[4]
				backupEntry.chunkNewUploaded = elements[5]
			}
		default:
			logger.Println(line)
		}
	}

	copyLogger := func(line string) {
		switch {
		// Copy complete, 107 total chunks, 0 chunks copied, 107 skipped
		case strings.HasPrefix(line, "Copy complete, "):
			logger.Println(line)
			logMessage(logger, fmt.Sprint("  ", line))

			// Save chunk data for inclusion into HTML portion of E-Mail message
			re := regexp.MustCompile(`Copy complete, (\S+) total chunks, (\S+) chunks copied, (\S+) skipped`)
			elements := re.FindStringSubmatch(line)
			if len(elements) >= 4 {
				copyEntry.chunkTotalCount = elements[1]
				copyEntry.chunkCopyCount = elements[2]
				copyEntry.chunkSkipCount = elements[3]
			}
		default:
			logger.Println(line)
		}
	}

	// Handling when processing output from generic "duplicacy" command
	anon := func(s string) { logger.Println(s) }

	// Perform backup/copy operations if requested
	if cmdBackup {
		for i := range configFile.backupInfo {
			backupStartTime := time.Now()
			logger.Println("######################################################################")
			cmdArgs := []string{"backup", "-storage", configFile.backupInfo[i]["name"], "-threads", configFile.backupInfo[i]["threads"], "-stats"}
			logMessage(logger, fmt.Sprint("Backing up to storage ", configFile.backupInfo[i]["name"],
				" with ", configFile.backupInfo[i]["threads"], " threads"))
			if debugFlag {
				logMessage(logger, fmt.Sprint("Executing: ", duplicacyPath, cmdArgs))
			}
			err = Executor(duplicacyPath, cmdArgs, configFile.repoDir, backupLogger)
			if err != nil {
				logError(logger, fmt.Sprint("Error executing command: ", err))
				return err
			}
			backupDuration := getTimeDiffString(backupStartTime, time.Now())
			logMessage(logger, fmt.Sprint("  Duration: ", backupDuration))

			// Save data from backup for HTML table in E-Mail
			backupEntry.storage = configFile.backupInfo[i]["name"]
			backupEntry.duration = backupDuration
			backupTable = append(backupTable, backupEntry)
		}
		if len(configFile.copyInfo) != 0 {
			for i := range configFile.copyInfo {
				copyStartTime := time.Now()
				logger.Println("######################################################################")
				cmdArgs := []string{"copy", "-threads", configFile.copyInfo[i]["threads"],
					"-from", configFile.copyInfo[i]["from"], "-to", configFile.copyInfo[i]["to"]}
				logMessage(logger, fmt.Sprint("Copying from storage ", configFile.copyInfo[i]["from"],
					" to storage ", configFile.copyInfo[i]["to"], " with ", configFile.copyInfo[i]["threads"], " threads"))
				if debugFlag {
					logMessage(logger, fmt.Sprint("Executing: ", duplicacyPath, cmdArgs))
				}
				err = Executor(duplicacyPath, cmdArgs, configFile.repoDir, copyLogger)
				if err != nil {
					logError(logger, fmt.Sprint("Error executing command: ", err))
					return err
				}
				copyDuration := getTimeDiffString(copyStartTime, time.Now())
				logMessage(logger, fmt.Sprint("  Duration: ", getTimeDiffString(copyStartTime, time.Now())))

				// Save data from backup for HTML table in E-Mail
				copyEntry.storageFrom = configFile.copyInfo[i]["from"]
				copyEntry.storageTo = configFile.copyInfo[i]["to"]
				copyEntry.duration  = copyDuration
				copyTable = append(copyTable, copyEntry)
			}
		}
	}

	// Perform prune operations if requested
	if cmdPrune {
		for i := range configFile.pruneInfo {
			logger.Println("######################################################################")
			cmdArgs := []string{"prune", "-all", "-storage", configFile.pruneInfo[i]["storage"]}
			cmdArgs = append(cmdArgs, strings.Split(configFile.pruneInfo[i]["keep"], " ")...)
			logMessage(logger, fmt.Sprint("Pruning storage ", configFile.pruneInfo[i]["storage"]))
			if debugFlag {
				logMessage(logger, fmt.Sprint("Executing: ", duplicacyPath, cmdArgs))
			}
			err = Executor(duplicacyPath, cmdArgs, configFile.repoDir, anon)
			if err != nil {
				logError(logger, fmt.Sprint("Error executing command: ", err))
				return err
			}
		}
	}

	// Perform check operations if requested
	if cmdCheck {
		for i := range configFile.checkInfo {
			logger.Println("######################################################################")
			cmdArgs := []string{"check", "-storage", configFile.checkInfo[i]["storage"]}
			if configFile.checkInfo[i]["all"] == "true" {
				cmdArgs = append(cmdArgs, "-all")
			}
			logMessage(logger, fmt.Sprint("Checking storage ", configFile.pruneInfo[i]["storage"]))
			if debugFlag {
				logMessage(logger, fmt.Sprint("Executing: ", duplicacyPath, cmdArgs))
			}
			err = Executor(duplicacyPath, cmdArgs, configFile.repoDir, anon)
			if err != nil {
				logError(logger, fmt.Sprint("Error executing command: ", err))
				return err
			}
		}
	}

	endTime := time.Now()

	logger.Println("######################################################################")
	logMessage(logger, fmt.Sprint("Operations completed in ", getTimeDiffString(startTime, endTime)))

	return nil
}

repository: aboutte/duplicacy-util

repo_name: aboutte/duplicacy-util