WooCommerce Gutenberg Products Block - Version 3.1.1

Version Description

Download this release

Release Info

Developer aljullu
Plugin Icon 128x128 WooCommerce Gutenberg Products Block
Version 3.1.1
Comparing to
See all releases

Code changes from version 5.5.0 to 3.1.1

Files changed (301) hide show
  1. .prettierrc.js +0 -3
  2. LICENSE +0 -674
  3. assets/css/abstracts/_breakpoints.scss +0 -2
  4. assets/css/abstracts/_colors.scss +50 -17
  5. assets/css/abstracts/_mixins.scss +3 -47
  6. assets/css/abstracts/_variables.scss +18 -8
  7. assets/css/editor.scss +10 -10
  8. assets/css/style.scss +8 -38
  9. assets/img/avatar.jpg +0 -0
  10. {images/previews → assets/img}/beanie.jpg +0 -0
  11. assets/img/block-error.svg +2727 -0
  12. {images/previews → assets/img}/cap.jpg +0 -0
  13. assets/img/cart-preview.svg +20 -0
  14. assets/img/checkout-preview.svg +20 -0
  15. {images/previews → assets/img}/collection.jpg +0 -0
  16. assets/img/grid.svg +50 -0
  17. assets/img/no-matching-products.svg +1 -0
  18. assets/img/no-products.svg +1 -0
  19. {images → assets/img}/payment-methods/alipay.svg +0 -0
  20. {images → assets/img}/payment-methods/amex.svg +0 -0
  21. {images → assets/img}/payment-methods/bancontact.svg +0 -0
  22. {images → assets/img}/payment-methods/diners.svg +0 -0
  23. {images → assets/img}/payment-methods/discover.svg +0 -0
  24. {images → assets/img}/payment-methods/eps.svg +0 -0
  25. {images → assets/img}/payment-methods/giropay.svg +0 -0
  26. {images → assets/img}/payment-methods/ideal.svg +0 -0
  27. {images → assets/img}/payment-methods/jcb.svg +0 -0
  28. {images → assets/img}/payment-methods/laser.svg +0 -0
  29. {images → assets/img}/payment-methods/maestro.svg +0 -0
  30. {images → assets/img}/payment-methods/mastercard.svg +0 -0
  31. {images → assets/img}/payment-methods/multibanco.svg +0 -0
  32. {images → assets/img}/payment-methods/p24.svg +0 -0
  33. {images → assets/img}/payment-methods/sepa.svg +0 -0
  34. {images → assets/img}/payment-methods/sofort.svg +0 -0
  35. {images → assets/img}/payment-methods/unionpay.svg +0 -0
  36. {images → assets/img}/payment-methods/visa.svg +0 -0
  37. {images → assets/img}/payment-methods/wechat.svg +0 -0
  38. {images/previews → assets/img}/pennant.jpg +0 -0
  39. assets/img/single-product-preview.svg +5 -0
  40. assets/js/atomic/blocks/product-elements/add-to-cart/block.js +21 -27
  41. assets/js/atomic/blocks/product-elements/add-to-cart/edit.js +11 -28
  42. assets/js/atomic/blocks/product-elements/add-to-cart/frontend.js +2 -1
  43. assets/js/atomic/blocks/product-elements/add-to-cart/product-types/simple.js +4 -4
  44. assets/js/atomic/blocks/product-elements/add-to-cart/product-types/variable/index.js +5 -8
  45. assets/js/atomic/blocks/product-elements/add-to-cart/product-types/variable/variation-attributes/attribute-picker.js +67 -53
  46. assets/js/atomic/blocks/product-elements/add-to-cart/product-types/variable/variation-attributes/attribute-select-control.js +8 -63
  47. assets/js/atomic/blocks/product-elements/add-to-cart/product-types/variable/variation-attributes/index.js +9 -7
  48. assets/js/atomic/blocks/product-elements/add-to-cart/product-types/variable/variation-attributes/style.scss +0 -15
  49. assets/js/atomic/blocks/product-elements/add-to-cart/product-types/variable/variation-attributes/test/index.js +0 -395
  50. assets/js/atomic/blocks/product-elements/add-to-cart/product-types/variable/variation-attributes/utils.js +39 -140
  51. assets/js/atomic/blocks/product-elements/add-to-cart/shared/add-to-cart-button.js +44 -104
  52. assets/js/atomic/blocks/product-elements/add-to-cart/shared/quantity-input.js +0 -7
  53. assets/js/atomic/blocks/product-elements/add-to-cart/style.scss +1 -7
  54. assets/js/atomic/blocks/product-elements/button/block.js +16 -14
  55. assets/js/atomic/blocks/product-elements/button/edit.js +1 -1
  56. assets/js/atomic/blocks/product-elements/button/style.scss +0 -10
  57. assets/js/atomic/blocks/product-elements/category-list/edit.js +2 -2
  58. assets/js/atomic/blocks/product-elements/image/block.js +51 -48
  59. assets/js/atomic/blocks/product-elements/image/edit.js +4 -4
  60. assets/js/atomic/blocks/product-elements/image/frontend.js +2 -1
  61. assets/js/atomic/blocks/product-elements/image/style.scss +3 -3
  62. assets/js/atomic/blocks/product-elements/image/test/block.test.js +0 -139
  63. assets/js/atomic/blocks/product-elements/price/block.js +158 -39
  64. assets/js/atomic/blocks/product-elements/price/edit.js +1 -1
  65. assets/js/atomic/blocks/product-elements/price/style.scss +28 -0
  66. assets/js/atomic/blocks/product-elements/rating/block.js +1 -1
  67. assets/js/atomic/blocks/product-elements/rating/edit.js +1 -1
  68. assets/js/atomic/blocks/product-elements/sale-badge/block.js +1 -1
  69. assets/js/atomic/blocks/product-elements/sale-badge/edit.js +1 -1
  70. assets/js/atomic/blocks/product-elements/shared/editor.scss +1 -1
  71. assets/js/atomic/blocks/product-elements/shared/with-product-selector.js +6 -6
  72. assets/js/atomic/blocks/product-elements/sku/edit.js +2 -2
  73. assets/js/atomic/blocks/product-elements/stock-indicator/edit.js +2 -2
  74. assets/js/atomic/blocks/product-elements/stock-indicator/style.scss +3 -3
  75. assets/js/atomic/blocks/product-elements/summary/block.js +4 -2
  76. assets/js/atomic/blocks/product-elements/summary/edit.js +1 -1
  77. assets/js/atomic/blocks/product-elements/tag-list/edit.js +2 -2
  78. assets/js/atomic/blocks/product-elements/title/block.js +26 -25
  79. assets/js/atomic/blocks/product-elements/title/edit.js +2 -2
  80. assets/js/atomic/blocks/product-elements/title/frontend.js +2 -1
  81. assets/js/atomic/blocks/product/price/attributes.js +40 -0
  82. assets/js/atomic/blocks/product/price/index.js +32 -0
  83. assets/js/atomic/utils/index.js +5 -4
  84. assets/js/atomic/utils/render-inner-blocks.js +69 -0
  85. assets/js/atomic/utils/render-parent-block.js +41 -0
  86. assets/js/atomic/utils/render-parent-block.tsx +0 -126
  87. assets/js/base/components/block-error-boundary/block-error.js +2 -12
  88. assets/js/base/components/block-error-boundary/index.js +3 -13
  89. assets/js/base/components/block-error-boundary/style.scss +18 -16
  90. assets/js/base/components/button/{index.tsx → index.js} +15 -17
  91. assets/js/base/components/button/style.scss +41 -3
  92. assets/js/base/components/cart-checkout/address-form/country-address-fields.js +546 -0
  93. assets/js/{settings/shared/default-address-fields.ts → base/components/cart-checkout/address-form/default-address-fields.js} +23 -81
  94. assets/js/base/components/cart-checkout/address-form/{address-form.tsx → index.js} +27 -62
  95. assets/js/base/components/cart-checkout/address-form/index.ts +0 -1
  96. assets/js/base/components/cart-checkout/address-form/prepare-address-fields.ts +0 -131
  97. assets/js/base/components/cart-checkout/address-form/test/index.js +0 -178
  98. assets/js/base/components/cart-checkout/form-step/index.js +8 -24
  99. assets/js/base/components/cart-checkout/form-step/style.scss +33 -41
  100. assets/js/base/components/cart-checkout/form-step/test/__snapshots__/index.js.snap +0 -262
  101. assets/js/base/components/cart-checkout/form-step/test/index.js +0 -100
  102. assets/js/base/components/{form → cart-checkout/form}/index.js +12 -5
  103. assets/js/base/components/cart-checkout/form/style.scss +4 -0
  104. assets/js/base/components/cart-checkout/index.js +6 -4
  105. assets/js/base/components/cart-checkout/order-summary/index.js +1 -2
  106. assets/js/base/components/cart-checkout/order-summary/order-summary-item.js +21 -105
  107. assets/js/base/components/cart-checkout/order-summary/style.scss +12 -29
  108. assets/js/base/components/cart-checkout/order-summary/test/index.js +0 -43
  109. assets/js/base/components/cart-checkout/payment-method-icons/common-icons.js +20 -20
  110. assets/js/base/components/cart-checkout/payment-method-icons/index.js +2 -3
  111. assets/js/base/components/cart-checkout/payment-method-icons/payment-method-icon.js +0 -5
  112. assets/js/base/components/cart-checkout/place-order-button/index.js +2 -6
  113. assets/js/base/components/cart-checkout/policies/{index.tsx → index.js} +1 -1
  114. assets/js/base/components/cart-checkout/policies/style.scss +1 -1
  115. assets/js/base/components/cart-checkout/product-backorder-badge/{index.tsx → index.js} +1 -1
  116. assets/js/base/components/cart-checkout/product-badge/{index.tsx → index.js} +6 -9
  117. assets/js/base/components/cart-checkout/product-details/index.tsx +0 -60
  118. assets/js/base/components/cart-checkout/product-details/style.scss +0 -25
  119. assets/js/base/components/cart-checkout/product-details/test/__snapshots__/index.js.snap +0 -76
  120. assets/js/base/components/cart-checkout/product-details/test/index.js +0 -57
  121. assets/js/base/components/cart-checkout/product-image/{index.tsx → index.js} +10 -8
  122. assets/js/base/components/cart-checkout/product-low-stock-badge/{index.tsx → index.js} +6 -9
  123. assets/js/base/components/cart-checkout/product-metadata/index.js +39 -0
  124. assets/js/base/components/cart-checkout/product-metadata/index.tsx +0 -45
  125. assets/js/base/components/cart-checkout/product-metadata/style.scss +1 -1
  126. assets/js/base/components/cart-checkout/product-name/index.js +31 -0
  127. assets/js/base/components/{product-name → cart-checkout/product-name}/style.scss +2 -0
  128. assets/js/base/components/cart-checkout/product-price/index.js +81 -0
  129. assets/js/base/components/cart-checkout/product-price/style.scss +5 -0
  130. assets/js/base/components/cart-checkout/product-sale-badge/index.js +50 -0
  131. assets/js/base/components/cart-checkout/product-sale-badge/index.tsx +0 -62
  132. assets/js/base/components/cart-checkout/product-summary/index.js +38 -0
  133. assets/js/base/components/cart-checkout/product-summary/index.tsx +0 -41
  134. assets/js/base/components/cart-checkout/product-variation-data/index.js +49 -0
  135. assets/js/base/components/cart-checkout/shipping-calculator/{address.tsx → address.js} +30 -8
  136. assets/js/base/components/cart-checkout/shipping-calculator/{index.tsx → index.js} +8 -10
  137. assets/js/base/components/cart-checkout/shipping-calculator/style.scss +0 -1
  138. assets/js/base/components/cart-checkout/shipping-location/index.js +64 -0
  139. assets/js/base/components/cart-checkout/shipping-location/index.tsx +0 -70
  140. assets/js/base/components/cart-checkout/shipping-rates-control-package/index.tsx +0 -152
  141. assets/js/base/components/cart-checkout/shipping-rates-control-package/package-rates.tsx +0 -69
  142. assets/js/base/components/cart-checkout/shipping-rates-control-package/render-package-rate-option.tsx +0 -46
  143. assets/js/base/components/cart-checkout/shipping-rates-control-package/style.scss +0 -43
  144. assets/js/base/components/cart-checkout/shipping-rates-control/index.js +113 -0
  145. assets/js/base/components/cart-checkout/shipping-rates-control/index.tsx +0 -187
  146. assets/js/base/components/cart-checkout/shipping-rates-control/package-options.js +71 -0
  147. assets/js/base/components/cart-checkout/shipping-rates-control/package.js +126 -0
  148. assets/js/base/components/cart-checkout/shipping-rates-control/packages.js +71 -0
  149. assets/js/base/components/cart-checkout/shipping-rates-control/style.scss +35 -0
  150. assets/js/base/components/cart-checkout/totals/discount/stories/index.js +0 -37
  151. assets/js/base/components/cart-checkout/totals/discount/style.scss +0 -9
  152. assets/js/base/components/cart-checkout/totals/footer-item/stories/index.js +0 -32
  153. assets/js/base/components/cart-checkout/totals/footer-item/test/__snapshots__/index.js.snap +0 -79
  154. assets/js/base/components/cart-checkout/totals/footer-item/test/index.js +0 -81
  155. assets/js/base/components/cart-checkout/totals/index.js +8 -4
  156. assets/js/base/components/cart-checkout/totals/shipping/index.tsx +0 -215
  157. assets/js/base/components/cart-checkout/totals/shipping/shipping-rate-selector.js +0 -48
  158. assets/js/base/components/cart-checkout/totals/shipping/shipping-via.tsx +0 -17
  159. assets/js/base/components/cart-checkout/totals/shipping/stories/index.js +0 -35
  160. assets/js/base/components/cart-checkout/totals/subtotals-item/index.js +39 -0
  161. assets/js/base/components/cart-checkout/totals/{coupon → totals-coupon-code-input}/index.js +11 -11
  162. assets/js/base/components/cart-checkout/totals/{coupon → totals-coupon-code-input}/stories/index.js +4 -5
  163. assets/js/base/components/cart-checkout/totals/{coupon → totals-coupon-code-input}/style.scss +8 -18
  164. assets/js/base/components/cart-checkout/totals/{discount → totals-discount-item}/index.js +35 -51
  165. assets/js/base/components/cart-checkout/totals/totals-discount-item/style.scss +5 -0
  166. assets/js/base/components/cart-checkout/totals/totals-fees-item/index.js +50 -0
  167. assets/js/base/components/cart-checkout/totals/{footer-item → totals-footer-item}/index.js +8 -29
  168. assets/js/base/components/cart-checkout/totals/{footer-item → totals-footer-item}/style.scss +1 -1
  169. assets/js/base/components/cart-checkout/totals/totals-item/index.js +52 -0
  170. {packages/checkout/totals/item → assets/js/base/components/cart-checkout/totals/totals-item}/style.scss +2 -6
  171. assets/js/base/components/cart-checkout/totals/{shipping → totals-shipping-item}/has-shipping-rate.js +1 -3
  172. assets/js/base/components/cart-checkout/totals/totals-shipping-item/index.js +148 -0
  173. assets/js/base/components/cart-checkout/totals/totals-shipping-item/shipping-rate-selector.js +65 -0
  174. assets/js/base/components/cart-checkout/totals/{shipping → totals-shipping-item}/style.scss +11 -9
  175. assets/js/base/components/cart-checkout/totals/totals-taxes-item/index.js +57 -0
  176. assets/js/base/components/cart-checkout/totals/totals-taxes-item/style.scss +3 -0
  177. assets/js/base/components/checkbox-control/index.js +0 -17
  178. assets/js/base/components/checkbox-control/stories/index.js +0 -27
  179. assets/js/base/components/checkbox-control/style.scss +22 -74
  180. assets/js/base/components/checkbox-list/index.js +3 -14
  181. assets/js/base/components/chip/chip.js +0 -11
  182. assets/js/base/components/chip/removable-chip.js +1 -11
  183. assets/js/base/components/chip/stories/index.js +0 -42
  184. assets/js/base/components/chip/style.scss +4 -4
  185. assets/js/base/components/chip/test/__snapshots__/index.js.snap +12 -12
  186. assets/js/base/components/country-input/CountryInputProps.ts +0 -15
  187. assets/js/base/components/country-input/billing-country-input.js +23 -0
  188. assets/js/base/components/country-input/billing-country-input.tsx +0 -16
  189. assets/js/base/components/country-input/{country-input.tsx → country-input.js} +18 -12
  190. assets/js/base/components/country-input/{index.ts → index.js} +0 -0
  191. assets/js/base/components/country-input/shipping-country-input.js +23 -0
  192. assets/js/base/components/country-input/shipping-country-input.tsx +0 -16
  193. assets/js/base/components/country-input/stories/index.js +1 -1
  194. assets/js/base/components/country-input/style.scss +0 -3
  195. assets/js/base/components/dropdown-selector/index.js +1 -12
  196. assets/js/base/components/dropdown-selector/menu.js +0 -1
  197. assets/js/base/components/dropdown-selector/selected-chip.js +0 -1
  198. assets/js/base/components/dropdown-selector/style.scss +4 -4
  199. assets/js/base/components/filter-submit-button/index.js +1 -1
  200. assets/js/base/components/formatted-monetary-amount/{index.tsx → index.js} +15 -33
  201. assets/js/base/components/label/{index.tsx → index.js} +15 -12
  202. assets/js/base/components/loading-mask/index.js +17 -16
  203. assets/js/base/components/loading-mask/style.scss +3 -4
  204. packages/checkout/panel/index.tsx → assets/js/base/components/panel/index.js +15 -16
  205. assets/js/base/components/panel/style.scss +48 -0
  206. assets/js/base/components/payment-methods/express-checkout.js +66 -0
  207. assets/js/base/components/payment-methods/express-payment-methods.js +68 -0
  208. assets/js/base/components/payment-methods/index.js +3 -0
  209. assets/js/{blocks/cart-checkout → base/components}/payment-methods/no-payment-methods/index.js +1 -1
  210. assets/js/{blocks/cart-checkout → base/components}/payment-methods/no-payment-methods/style.scss +1 -1
  211. assets/js/{blocks/cart-checkout → base/components}/payment-methods/payment-method-error-boundary.js +7 -11
  212. assets/js/base/components/payment-methods/payment-methods.js +178 -0
  213. assets/js/{blocks/cart-checkout → base/components}/payment-methods/saved-payment-method-options.js +78 -86
  214. assets/js/{blocks/cart-checkout → base/components}/payment-methods/style.scss +116 -77
  215. assets/js/base/components/price-slider/constrain-range-slider-values.js +2 -2
  216. assets/js/base/components/price-slider/index.js +17 -28
  217. assets/js/base/components/price-slider/style.scss +181 -251
  218. assets/js/base/components/price-slider/test/constrain-range-slider-values.js +17 -17
  219. assets/js/base/components/{product-list/product-list-item → product-list-item}/index.js +0 -0
  220. assets/js/base/components/{product-list/product-list-item → product-list-item}/utils.js +0 -0
  221. assets/js/base/components/product-list/container.js +2 -7
  222. assets/js/base/components/product-list/index.js +236 -2
  223. assets/js/base/components/product-list/product-list.js +0 -262
  224. assets/js/base/components/product-list/style.scss +6 -21
  225. assets/js/base/components/product-name/index.tsx +0 -48
  226. assets/js/base/components/product-name/stories/index.js +0 -26
  227. assets/js/base/components/product-name/test/__snapshots__/index.js.snap +0 -49
  228. assets/js/base/components/product-name/test/index.js +0 -48
  229. assets/js/base/components/product-price/index.js +0 -214
  230. assets/js/base/components/product-price/stories/index.js +0 -57
  231. assets/js/base/components/product-price/style.scss +0 -29
  232. assets/js/base/components/product-price/test/__snapshots__/index.js.snap +0 -57
  233. assets/js/base/components/product-price/test/index.js +0 -63
  234. assets/js/base/components/{product-list/product-sort-select → product-sort-select}/index.js +0 -0
  235. assets/js/base/components/{product-list/product-sort-select → product-sort-select}/style.scss +0 -0
  236. assets/js/base/components/quantity-selector/{index.tsx → index.js} +17 -19
  237. assets/js/base/components/quantity-selector/style.scss +11 -56
  238. assets/js/base/components/radio-control-accordion/index.js +0 -73
  239. assets/js/base/components/radio-control/_mixin.scss +106 -0
  240. assets/js/base/components/radio-control/editor.scss +6 -0
  241. assets/js/base/components/radio-control/index.js +2 -1
  242. assets/js/base/components/radio-control/{option-layout.tsx → option-layout.js} +5 -11
  243. assets/js/base/components/radio-control/option.js +1 -6
  244. assets/js/base/components/radio-control/style.scss +3 -114
  245. assets/js/base/components/read-more/test/index.js +3 -3
  246. assets/js/base/components/reviews/review-list-item/index.js +9 -7
  247. assets/js/base/components/reviews/review-list/index.js +6 -5
  248. assets/js/base/components/select/index.js +60 -1
  249. assets/js/base/components/select/select.js +0 -60
  250. assets/js/base/components/select/style.scss +7 -79
  251. assets/js/base/components/select/validated.js +10 -15
  252. assets/js/base/components/sidebar-layout/style.scss +7 -14
  253. assets/js/base/components/sort-select/index.js +0 -11
  254. assets/js/base/components/spinner/index.tsx +0 -10
  255. assets/js/base/components/spinner/style.scss +0 -37
  256. assets/js/base/components/state-input/StateInputProps.ts +0 -15
  257. assets/js/base/components/state-input/billing-state-input.js +23 -0
  258. assets/js/base/components/state-input/billing-state-input.tsx +0 -16
  259. assets/js/base/components/state-input/{index.ts → index.js} +0 -0
  260. assets/js/base/components/state-input/shipping-state-input.js +23 -0
  261. assets/js/base/components/state-input/shipping-state-input.tsx +0 -16
  262. assets/js/base/components/state-input/{state-input.tsx → state-input.js} +26 -19
  263. assets/js/base/components/state-input/style.scss +0 -3
  264. assets/js/base/components/store-notices-container/index.js +2 -0
  265. assets/js/base/components/store-notices-container/snackbar-notices.js +27 -0
  266. assets/js/base/{context/providers/store-notices/components → components/store-notices-container}/store-notices-container.js +4 -3
  267. assets/js/base/components/store-notices-container/style.scss +47 -0
  268. assets/js/base/components/summary/{index.tsx → index.js} +1 -8
  269. assets/js/base/components/summary/utils.js +1 -1
  270. assets/js/base/components/tabs/index.js +1 -2
  271. assets/js/base/components/tabs/style.scss +0 -5
  272. assets/js/base/components/text-input/{text-input.tsx → index.js} +21 -28
  273. assets/js/base/components/text-input/index.ts +0 -2
  274. assets/js/base/components/text-input/style.scss +6 -40
  275. assets/js/base/components/text-input/validated-text-input.tsx +0 -166
  276. assets/js/base/components/text-input/validated.js +117 -0
  277. assets/js/base/components/textarea/index.js +0 -43
  278. assets/js/base/components/textarea/style.scss +0 -29
  279. assets/js/base/components/title/index.js +0 -8
  280. assets/js/base/components/title/style.scss +0 -2
  281. assets/js/base/{context/providers/validation/components → components/validation}/index.js +0 -0
  282. assets/js/base/{context/providers/validation/components/validation-input-error → components/validation}/style.scss +1 -1
  283. assets/js/base/{context/providers/validation/components/validation-input-error/index.js → components/validation/validation-input-error.js} +2 -5
  284. assets/js/base/context/add-to-cart-form-context.js +156 -0
  285. assets/js/base/context/cart-checkout/billing/constants.js +50 -0
  286. assets/js/base/context/cart-checkout/billing/index.js +51 -0
  287. assets/js/base/context/{providers/cart-checkout → cart-checkout}/cart/index.js +10 -4
  288. assets/js/base/context/{providers/add-to-cart-form/form-state → cart-checkout/checkout-state}/actions.js +27 -18
  289. assets/js/base/context/cart-checkout/checkout-state/constants.js +47 -0
  290. assets/js/base/context/cart-checkout/checkout-state/event-emit.js +53 -0
  291. assets/js/base/context/cart-checkout/checkout-state/index.js +339 -0
  292. assets/js/base/context/{providers/add-to-cart-form/form-state → cart-checkout/checkout-state}/reducer.js +76 -32
  293. assets/js/base/context/cart-checkout/checkout/index.js +34 -0
  294. assets/js/base/context/{providers/cart-checkout → cart-checkout}/checkout/processor/index.js +69 -75
  295. assets/js/base/context/cart-checkout/event-emit/emitter-callback.js +15 -0
  296. assets/js/base/context/cart-checkout/event-emit/emitters.js +86 -0
  297. assets/js/base/context/{event-emit/index.ts → cart-checkout/event-emit/index.js} +0 -1
  298. assets/js/base/context/cart-checkout/event-emit/reducer.js +56 -0
  299. assets/js/base/context/{event-emit → cart-checkout/event-emit}/test/emitters.js +8 -14
  300. assets/js/base/context/{providers/cart-checkout → cart-checkout}/index.js +2 -1
  301. assets/js/base/context/cart-checkout/payment-methods/actions.js +45 -0
.prettierrc.js DELETED
@@ -1,3 +0,0 @@
1
- // Import the default config file and expose it in the project root.
2
- // Useful for editor integrations.
3
- module.exports = require( '@wordpress/prettier-config' );
 
 
 
LICENSE DELETED
@@ -1,674 +0,0 @@
1
- GNU GENERAL PUBLIC LICENSE
2
- Version 3, 29 June 2007
3
-
4
- Copyright (C) 2007 Free Software Foundation, Inc. <https://fsf.org/>
5
- Everyone is permitted to copy and distribute verbatim copies
6
- of this license document, but changing it is not allowed.
7
-
8
- Preamble
9
-
10
- The GNU General Public License is a free, copyleft license for
11
- software and other kinds of works.
12
-
13
- The licenses for most software and other practical works are designed
14
- to take away your freedom to share and change the works. By contrast,
15
- the GNU General Public License is intended to guarantee your freedom to
16
- share and change all versions of a program--to make sure it remains free
17
- software for all its users. We, the Free Software Foundation, use the
18
- GNU General Public License for most of our software; it applies also to
19
- any other work released this way by its authors. You can apply it to
20
- your programs, too.
21
-
22
- When we speak of free software, we are referring to freedom, not
23
- price. Our General Public Licenses are designed to make sure that you
24
- have the freedom to distribute copies of free software (and charge for
25
- them if you wish), that you receive source code or can get it if you
26
- want it, that you can change the software or use pieces of it in new
27
- free programs, and that you know you can do these things.
28
-
29
- To protect your rights, we need to prevent others from denying you
30
- these rights or asking you to surrender the rights. Therefore, you have
31
- certain responsibilities if you distribute copies of the software, or if
32
- you modify it: responsibilities to respect the freedom of others.
33
-
34
- For example, if you distribute copies of such a program, whether
35
- gratis or for a fee, you must pass on to the recipients the same
36
- freedoms that you received. You must make sure that they, too, receive
37
- or can get the source code. And you must show them these terms so they
38
- know their rights.
39
-
40
- Developers that use the GNU GPL protect your rights with two steps:
41
- (1) assert copyright on the software, and (2) offer you this License
42
- giving you legal permission to copy, distribute and/or modify it.
43
-
44
- For the developers' and authors' protection, the GPL clearly explains
45
- that there is no warranty for this free software. For both users' and
46
- authors' sake, the GPL requires that modified versions be marked as
47
- changed, so that their problems will not be attributed erroneously to
48
- authors of previous versions.
49
-
50
- Some devices are designed to deny users access to install or run
51
- modified versions of the software inside them, although the manufacturer
52
- can do so. This is fundamentally incompatible with the aim of
53
- protecting users' freedom to change the software. The systematic
54
- pattern of such abuse occurs in the area of products for individuals to
55
- use, which is precisely where it is most unacceptable. Therefore, we
56
- have designed this version of the GPL to prohibit the practice for those
57
- products. If such problems arise substantially in other domains, we
58
- stand ready to extend this provision to those domains in future versions
59
- of the GPL, as needed to protect the freedom of users.
60
-
61
- Finally, every program is threatened constantly by software patents.
62
- States should not allow patents to restrict development and use of
63
- software on general-purpose computers, but in those that do, we wish to
64
- avoid the special danger that patents applied to a free program could
65
- make it effectively proprietary. To prevent this, the GPL assures that
66
- patents cannot be used to render the program non-free.
67
-
68
- The precise terms and conditions for copying, distribution and
69
- modification follow.
70
-
71
- TERMS AND CONDITIONS
72
-
73
- 0. Definitions.
74
-
75
- "This License" refers to version 3 of the GNU General Public License.
76
-
77
- "Copyright" also means copyright-like laws that apply to other kinds of
78
- works, such as semiconductor masks.
79
-
80
- "The Program" refers to any copyrightable work licensed under this
81
- License. Each licensee is addressed as "you". "Licensees" and
82
- "recipients" may be individuals or organizations.
83
-
84
- To "modify" a work means to copy from or adapt all or part of the work
85
- in a fashion requiring copyright permission, other than the making of an
86
- exact copy. The resulting work is called a "modified version" of the
87
- earlier work or a work "based on" the earlier work.
88
-
89
- A "covered work" means either the unmodified Program or a work based
90
- on the Program.
91
-
92
- To "propagate" a work means to do anything with it that, without
93
- permission, would make you directly or secondarily liable for
94
- infringement under applicable copyright law, except executing it on a
95
- computer or modifying a private copy. Propagation includes copying,
96
- distribution (with or without modification), making available to the
97
- public, and in some countries other activities as well.
98
-
99
- To "convey" a work means any kind of propagation that enables other
100
- parties to make or receive copies. Mere interaction with a user through
101
- a computer network, with no transfer of a copy, is not conveying.
102
-
103
- An interactive user interface displays "Appropriate Legal Notices"
104
- to the extent that it includes a convenient and prominently visible
105
- feature that (1) displays an appropriate copyright notice, and (2)
106
- tells the user that there is no warranty for the work (except to the
107
- extent that warranties are provided), that licensees may convey the
108
- work under this License, and how to view a copy of this License. If
109
- the interface presents a list of user commands or options, such as a
110
- menu, a prominent item in the list meets this criterion.
111
-
112
- 1. Source Code.
113
-
114
- The "source code" for a work means the preferred form of the work
115
- for making modifications to it. "Object code" means any non-source
116
- form of a work.
117
-
118
- A "Standard Interface" means an interface that either is an official
119
- standard defined by a recognized standards body, or, in the case of
120
- interfaces specified for a particular programming language, one that
121
- is widely used among developers working in that language.
122
-
123
- The "System Libraries" of an executable work include anything, other
124
- than the work as a whole, that (a) is included in the normal form of
125
- packaging a Major Component, but which is not part of that Major
126
- Component, and (b) serves only to enable use of the work with that
127
- Major Component, or to implement a Standard Interface for which an
128
- implementation is available to the public in source code form. A
129
- "Major Component", in this context, means a major essential component
130
- (kernel, window system, and so on) of the specific operating system
131
- (if any) on which the executable work runs, or a compiler used to
132
- produce the work, or an object code interpreter used to run it.
133
-
134
- The "Corresponding Source" for a work in object code form means all
135
- the source code needed to generate, install, and (for an executable
136
- work) run the object code and to modify the work, including scripts to
137
- control those activities. However, it does not include the work's
138
- System Libraries, or general-purpose tools or generally available free
139
- programs which are used unmodified in performing those activities but
140
- which are not part of the work. For example, Corresponding Source
141
- includes interface definition files associated with source files for
142
- the work, and the source code for shared libraries and dynamically
143
- linked subprograms that the work is specifically designed to require,
144
- such as by intimate data communication or control flow between those
145
- subprograms and other parts of the work.
146
-
147
- The Corresponding Source need not include anything that users
148
- can regenerate automatically from other parts of the Corresponding
149
- Source.
150
-
151
- The Corresponding Source for a work in source code form is that
152
- same work.
153
-
154
- 2. Basic Permissions.
155
-
156
- All rights granted under this License are granted for the term of
157
- copyright on the Program, and are irrevocable provided the stated
158
- conditions are met. This License explicitly affirms your unlimited
159
- permission to run the unmodified Program. The output from running a
160
- covered work is covered by this License only if the output, given its
161
- content, constitutes a covered work. This License acknowledges your
162
- rights of fair use or other equivalent, as provided by copyright law.
163
-
164
- You may make, run and propagate covered works that you do not
165
- convey, without conditions so long as your license otherwise remains
166
- in force. You may convey covered works to others for the sole purpose
167
- of having them make modifications exclusively for you, or provide you
168
- with facilities for running those works, provided that you comply with
169
- the terms of this License in conveying all material for which you do
170
- not control copyright. Those thus making or running the covered works
171
- for you must do so exclusively on your behalf, under your direction
172
- and control, on terms that prohibit them from making any copies of
173
- your copyrighted material outside their relationship with you.
174
-
175
- Conveying under any other circumstances is permitted solely under
176
- the conditions stated below. Sublicensing is not allowed; section 10
177
- makes it unnecessary.
178
-
179
- 3. Protecting Users' Legal Rights From Anti-Circumvention Law.
180
-
181
- No covered work shall be deemed part of an effective technological
182
- measure under any applicable law fulfilling obligations under article
183
- 11 of the WIPO copyright treaty adopted on 20 December 1996, or
184
- similar laws prohibiting or restricting circumvention of such
185
- measures.
186
-
187
- When you convey a covered work, you waive any legal power to forbid
188
- circumvention of technological measures to the extent such circumvention
189
- is effected by exercising rights under this License with respect to
190
- the covered work, and you disclaim any intention to limit operation or
191
- modification of the work as a means of enforcing, against the work's
192
- users, your or third parties' legal rights to forbid circumvention of
193
- technological measures.
194
-
195
- 4. Conveying Verbatim Copies.
196
-
197
- You may convey verbatim copies of the Program's source code as you
198
- receive it, in any medium, provided that you conspicuously and
199
- appropriately publish on each copy an appropriate copyright notice;
200
- keep intact all notices stating that this License and any
201
- non-permissive terms added in accord with section 7 apply to the code;
202
- keep intact all notices of the absence of any warranty; and give all
203
- recipients a copy of this License along with the Program.
204
-
205
- You may charge any price or no price for each copy that you convey,
206
- and you may offer support or warranty protection for a fee.
207
-
208
- 5. Conveying Modified Source Versions.
209
-
210
- You may convey a work based on the Program, or the modifications to
211
- produce it from the Program, in the form of source code under the
212
- terms of section 4, provided that you also meet all of these conditions:
213
-
214
- a) The work must carry prominent notices stating that you modified
215
- it, and giving a relevant date.
216
-
217
- b) The work must carry prominent notices stating that it is
218
- released under this License and any conditions added under section
219
- 7. This requirement modifies the requirement in section 4 to
220
- "keep intact all notices".
221
-
222
- c) You must license the entire work, as a whole, under this
223
- License to anyone who comes into possession of a copy. This
224
- License will therefore apply, along with any applicable section 7
225
- additional terms, to the whole of the work, and all its parts,
226
- regardless of how they are packaged. This License gives no
227
- permission to license the work in any other way, but it does not
228
- invalidate such permission if you have separately received it.
229
-
230
- d) If the work has interactive user interfaces, each must display
231
- Appropriate Legal Notices; however, if the Program has interactive
232
- interfaces that do not display Appropriate Legal Notices, your
233
- work need not make them do so.
234
-
235
- A compilation of a covered work with other separate and independent
236
- works, which are not by their nature extensions of the covered work,
237
- and which are not combined with it such as to form a larger program,
238
- in or on a volume of a storage or distribution medium, is called an
239
- "aggregate" if the compilation and its resulting copyright are not
240
- used to limit the access or legal rights of the compilation's users
241
- beyond what the individual works permit. Inclusion of a covered work
242
- in an aggregate does not cause this License to apply to the other
243
- parts of the aggregate.
244
-
245
- 6. Conveying Non-Source Forms.
246
-
247
- You may convey a covered work in object code form under the terms
248
- of sections 4 and 5, provided that you also convey the
249
- machine-readable Corresponding Source under the terms of this License,
250
- in one of these ways:
251
-
252
- a) Convey the object code in, or embodied in, a physical product
253
- (including a physical distribution medium), accompanied by the
254
- Corresponding Source fixed on a durable physical medium
255
- customarily used for software interchange.
256
-
257
- b) Convey the object code in, or embodied in, a physical product
258
- (including a physical distribution medium), accompanied by a
259
- written offer, valid for at least three years and valid for as
260
- long as you offer spare parts or customer support for that product
261
- model, to give anyone who possesses the object code either (1) a
262
- copy of the Corresponding Source for all the software in the
263
- product that is covered by this License, on a durable physical
264
- medium customarily used for software interchange, for a price no
265
- more than your reasonable cost of physically performing this
266
- conveying of source, or (2) access to copy the
267
- Corresponding Source from a network server at no charge.
268
-
269
- c) Convey individual copies of the object code with a copy of the
270
- written offer to provide the Corresponding Source. This
271
- alternative is allowed only occasionally and noncommercially, and
272
- only if you received the object code with such an offer, in accord
273
- with subsection 6b.
274
-
275
- d) Convey the object code by offering access from a designated
276
- place (gratis or for a charge), and offer equivalent access to the
277
- Corresponding Source in the same way through the same place at no
278
- further charge. You need not require recipients to copy the
279
- Corresponding Source along with the object code. If the place to
280
- copy the object code is a network server, the Corresponding Source
281
- may be on a different server (operated by you or a third party)
282
- that supports equivalent copying facilities, provided you maintain
283
- clear directions next to the object code saying where to find the
284
- Corresponding Source. Regardless of what server hosts the
285
- Corresponding Source, you remain obligated to ensure that it is
286
- available for as long as needed to satisfy these requirements.
287
-
288
- e) Convey the object code using peer-to-peer transmission, provided
289
- you inform other peers where the object code and Corresponding
290
- Source of the work are being offered to the general public at no
291
- charge under subsection 6d.
292
-
293
- A separable portion of the object code, whose source code is excluded
294
- from the Corresponding Source as a System Library, need not be
295
- included in conveying the object code work.
296
-
297
- A "User Product" is either (1) a "consumer product", which means any
298
- tangible personal property which is normally used for personal, family,
299
- or household purposes, or (2) anything designed or sold for incorporation
300
- into a dwelling. In determining whether a product is a consumer product,
301
- doubtful cases shall be resolved in favor of coverage. For a particular
302
- product received by a particular user, "normally used" refers to a
303
- typical or common use of that class of product, regardless of the status
304
- of the particular user or of the way in which the particular user
305
- actually uses, or expects or is expected to use, the product. A product
306
- is a consumer product regardless of whether the product has substantial
307
- commercial, industrial or non-consumer uses, unless such uses represent
308
- the only significant mode of use of the product.
309
-
310
- "Installation Information" for a User Product means any methods,
311
- procedures, authorization keys, or other information required to install
312
- and execute modified versions of a covered work in that User Product from
313
- a modified version of its Corresponding Source. The information must
314
- suffice to ensure that the continued functioning of the modified object
315
- code is in no case prevented or interfered with solely because
316
- modification has been made.
317
-
318
- If you convey an object code work under this section in, or with, or
319
- specifically for use in, a User Product, and the conveying occurs as
320
- part of a transaction in which the right of possession and use of the
321
- User Product is transferred to the recipient in perpetuity or for a
322
- fixed term (regardless of how the transaction is characterized), the
323
- Corresponding Source conveyed under this section must be accompanied
324
- by the Installation Information. But this requirement does not apply
325
- if neither you nor any third party retains the ability to install
326
- modified object code on the User Product (for example, the work has
327
- been installed in ROM).
328
-
329
- The requirement to provide Installation Information does not include a
330
- requirement to continue to provide support service, warranty, or updates
331
- for a work that has been modified or installed by the recipient, or for
332
- the User Product in which it has been modified or installed. Access to a
333
- network may be denied when the modification itself materially and
334
- adversely affects the operation of the network or violates the rules and
335
- protocols for communication across the network.
336
-
337
- Corresponding Source conveyed, and Installation Information provided,
338
- in accord with this section must be in a format that is publicly
339
- documented (and with an implementation available to the public in
340
- source code form), and must require no special password or key for
341
- unpacking, reading or copying.
342
-
343
- 7. Additional Terms.
344
-
345
- "Additional permissions" are terms that supplement the terms of this
346
- License by making exceptions from one or more of its conditions.
347
- Additional permissions that are applicable to the entire Program shall
348
- be treated as though they were included in this License, to the extent
349
- that they are valid under applicable law. If additional permissions
350
- apply only to part of the Program, that part may be used separately
351
- under those permissions, but the entire Program remains governed by
352
- this License without regard to the additional permissions.
353
-
354
- When you convey a copy of a covered work, you may at your option
355
- remove any additional permissions from that copy, or from any part of
356
- it. (Additional permissions may be written to require their own
357
- removal in certain cases when you modify the work.) You may place
358
- additional permissions on material, added by you to a covered work,
359
- for which you have or can give appropriate copyright permission.
360
-
361
- Notwithstanding any other provision of this License, for material you
362
- add to a covered work, you may (if authorized by the copyright holders of
363
- that material) supplement the terms of this License with terms:
364
-
365
- a) Disclaiming warranty or limiting liability differently from the
366
- terms of sections 15 and 16 of this License; or
367
-
368
- b) Requiring preservation of specified reasonable legal notices or
369
- author attributions in that material or in the Appropriate Legal
370
- Notices displayed by works containing it; or
371
-
372
- c) Prohibiting misrepresentation of the origin of that material, or
373
- requiring that modified versions of such material be marked in
374
- reasonable ways as different from the original version; or
375
-
376
- d) Limiting the use for publicity purposes of names of licensors or
377
- authors of the material; or
378
-
379
- e) Declining to grant rights under trademark law for use of some
380
- trade names, trademarks, or service marks; or
381
-
382
- f) Requiring indemnification of licensors and authors of that
383
- material by anyone who conveys the material (or modified versions of
384
- it) with contractual assumptions of liability to the recipient, for
385
- any liability that these contractual assumptions directly impose on
386
- those licensors and authors.
387
-
388
- All other non-permissive additional terms are considered "further
389
- restrictions" within the meaning of section 10. If the Program as you
390
- received it, or any part of it, contains a notice stating that it is
391
- governed by this License along with a term that is a further
392
- restriction, you may remove that term. If a license document contains
393
- a further restriction but permits relicensing or conveying under this
394
- License, you may add to a covered work material governed by the terms
395
- of that license document, provided that the further restriction does
396
- not survive such relicensing or conveying.
397
-
398
- If you add terms to a covered work in accord with this section, you
399
- must place, in the relevant source files, a statement of the
400
- additional terms that apply to those files, or a notice indicating
401
- where to find the applicable terms.
402
-
403
- Additional terms, permissive or non-permissive, may be stated in the
404
- form of a separately written license, or stated as exceptions;
405
- the above requirements apply either way.
406
-
407
- 8. Termination.
408
-
409
- You may not propagate or modify a covered work except as expressly
410
- provided under this License. Any attempt otherwise to propagate or
411
- modify it is void, and will automatically terminate your rights under
412
- this License (including any patent licenses granted under the third
413
- paragraph of section 11).
414
-
415
- However, if you cease all violation of this License, then your
416
- license from a particular copyright holder is reinstated (a)
417
- provisionally, unless and until the copyright holder explicitly and
418
- finally terminates your license, and (b) permanently, if the copyright
419
- holder fails to notify you of the violation by some reasonable means
420
- prior to 60 days after the cessation.
421
-
422
- Moreover, your license from a particular copyright holder is
423
- reinstated permanently if the copyright holder notifies you of the
424
- violation by some reasonable means, this is the first time you have
425
- received notice of violation of this License (for any work) from that
426
- copyright holder, and you cure the violation prior to 30 days after
427
- your receipt of the notice.
428
-
429
- Termination of your rights under this section does not terminate the
430
- licenses of parties who have received copies or rights from you under
431
- this License. If your rights have been terminated and not permanently
432
- reinstated, you do not qualify to receive new licenses for the same
433
- material under section 10.
434
-
435
- 9. Acceptance Not Required for Having Copies.
436
-
437
- You are not required to accept this License in order to receive or
438
- run a copy of the Program. Ancillary propagation of a covered work
439
- occurring solely as a consequence of using peer-to-peer transmission
440
- to receive a copy likewise does not require acceptance. However,
441
- nothing other than this License grants you permission to propagate or
442
- modify any covered work. These actions infringe copyright if you do
443
- not accept this License. Therefore, by modifying or propagating a
444
- covered work, you indicate your acceptance of this License to do so.
445
-
446
- 10. Automatic Licensing of Downstream Recipients.
447
-
448
- Each time you convey a covered work, the recipient automatically
449
- receives a license from the original licensors, to run, modify and
450
- propagate that work, subject to this License. You are not responsible
451
- for enforcing compliance by third parties with this License.
452
-
453
- An "entity transaction" is a transaction transferring control of an
454
- organization, or substantially all assets of one, or subdividing an
455
- organization, or merging organizations. If propagation of a covered
456
- work results from an entity transaction, each party to that
457
- transaction who receives a copy of the work also receives whatever
458
- licenses to the work the party's predecessor in interest had or could
459
- give under the previous paragraph, plus a right to possession of the
460
- Corresponding Source of the work from the predecessor in interest, if
461
- the predecessor has it or can get it with reasonable efforts.
462
-
463
- You may not impose any further restrictions on the exercise of the
464
- rights granted or affirmed under this License. For example, you may
465
- not impose a license fee, royalty, or other charge for exercise of
466
- rights granted under this License, and you may not initiate litigation
467
- (including a cross-claim or counterclaim in a lawsuit) alleging that
468
- any patent claim is infringed by making, using, selling, offering for
469
- sale, or importing the Program or any portion of it.
470
-
471
- 11. Patents.
472
-
473
- A "contributor" is a copyright holder who authorizes use under this
474
- License of the Program or a work on which the Program is based. The
475
- work thus licensed is called the contributor's "contributor version".
476
-
477
- A contributor's "essential patent claims" are all patent claims
478
- owned or controlled by the contributor, whether already acquired or
479
- hereafter acquired, that would be infringed by some manner, permitted
480
- by this License, of making, using, or selling its contributor version,
481
- but do not include claims that would be infringed only as a
482
- consequence of further modification of the contributor version. For
483
- purposes of this definition, "control" includes the right to grant
484
- patent sublicenses in a manner consistent with the requirements of
485
- this License.
486
-
487
- Each contributor grants you a non-exclusive, worldwide, royalty-free
488
- patent license under the contributor's essential patent claims, to
489
- make, use, sell, offer for sale, import and otherwise run, modify and
490
- propagate the contents of its contributor version.
491
-
492
- In the following three paragraphs, a "patent license" is any express
493
- agreement or commitment, however denominated, not to enforce a patent
494
- (such as an express permission to practice a patent or covenant not to
495
- sue for patent infringement). To "grant" such a patent license to a
496
- party means to make such an agreement or commitment not to enforce a
497
- patent against the party.
498
-
499
- If you convey a covered work, knowingly relying on a patent license,
500
- and the Corresponding Source of the work is not available for anyone
501
- to copy, free of charge and under the terms of this License, through a
502
- publicly available network server or other readily accessible means,
503
- then you must either (1) cause the Corresponding Source to be so
504
- available, or (2) arrange to deprive yourself of the benefit of the
505
- patent license for this particular work, or (3) arrange, in a manner
506
- consistent with the requirements of this License, to extend the patent
507
- license to downstream recipients. "Knowingly relying" means you have
508
- actual knowledge that, but for the patent license, your conveying the
509
- covered work in a country, or your recipient's use of the covered work
510
- in a country, would infringe one or more identifiable patents in that
511
- country that you have reason to believe are valid.
512
-
513
- If, pursuant to or in connection with a single transaction or
514
- arrangement, you convey, or propagate by procuring conveyance of, a
515
- covered work, and grant a patent license to some of the parties
516
- receiving the covered work authorizing them to use, propagate, modify
517
- or convey a specific copy of the covered work, then the patent license
518
- you grant is automatically extended to all recipients of the covered
519
- work and works based on it.
520
-
521
- A patent license is "discriminatory" if it does not include within
522
- the scope of its coverage, prohibits the exercise of, or is
523
- conditioned on the non-exercise of one or more of the rights that are
524
- specifically granted under this License. You may not convey a covered
525
- work if you are a party to an arrangement with a third party that is
526
- in the business of distributing software, under which you make payment
527
- to the third party based on the extent of your activity of conveying
528
- the work, and under which the third party grants, to any of the
529
- parties who would receive the covered work from you, a discriminatory
530
- patent license (a) in connection with copies of the covered work
531
- conveyed by you (or copies made from those copies), or (b) primarily
532
- for and in connection with specific products or compilations that
533
- contain the covered work, unless you entered into that arrangement,
534
- or that patent license was granted, prior to 28 March 2007.
535
-
536
- Nothing in this License shall be construed as excluding or limiting
537
- any implied license or other defenses to infringement that may
538
- otherwise be available to you under applicable patent law.
539
-
540
- 12. No Surrender of Others' Freedom.
541
-
542
- If conditions are imposed on you (whether by court order, agreement or
543
- otherwise) that contradict the conditions of this License, they do not
544
- excuse you from the conditions of this License. If you cannot convey a
545
- covered work so as to satisfy simultaneously your obligations under this
546
- License and any other pertinent obligations, then as a consequence you may
547
- not convey it at all. For example, if you agree to terms that obligate you
548
- to collect a royalty for further conveying from those to whom you convey
549
- the Program, the only way you could satisfy both those terms and this
550
- License would be to refrain entirely from conveying the Program.
551
-
552
- 13. Use with the GNU Affero General Public License.
553
-
554
- Notwithstanding any other provision of this License, you have
555
- permission to link or combine any covered work with a work licensed
556
- under version 3 of the GNU Affero General Public License into a single
557
- combined work, and to convey the resulting work. The terms of this
558
- License will continue to apply to the part which is the covered work,
559
- but the special requirements of the GNU Affero General Public License,
560
- section 13, concerning interaction through a network will apply to the
561
- combination as such.
562
-
563
- 14. Revised Versions of this License.
564
-
565
- The Free Software Foundation may publish revised and/or new versions of
566
- the GNU General Public License from time to time. Such new versions will
567
- be similar in spirit to the present version, but may differ in detail to
568
- address new problems or concerns.
569
-
570
- Each version is given a distinguishing version number. If the
571
- Program specifies that a certain numbered version of the GNU General
572
- Public License "or any later version" applies to it, you have the
573
- option of following the terms and conditions either of that numbered
574
- version or of any later version published by the Free Software
575
- Foundation. If the Program does not specify a version number of the
576
- GNU General Public License, you may choose any version ever published
577
- by the Free Software Foundation.
578
-
579
- If the Program specifies that a proxy can decide which future
580
- versions of the GNU General Public License can be used, that proxy's
581
- public statement of acceptance of a version permanently authorizes you
582
- to choose that version for the Program.
583
-
584
- Later license versions may give you additional or different
585
- permissions. However, no additional obligations are imposed on any
586
- author or copyright holder as a result of your choosing to follow a
587
- later version.
588
-
589
- 15. Disclaimer of Warranty.
590
-
591
- THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
592
- APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
593
- HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
594
- OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
595
- THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
596
- PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
597
- IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
598
- ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
599
-
600
- 16. Limitation of Liability.
601
-
602
- IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
603
- WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
604
- THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
605
- GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
606
- USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
607
- DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
608
- PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
609
- EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
610
- SUCH DAMAGES.
611
-
612
- 17. Interpretation of Sections 15 and 16.
613
-
614
- If the disclaimer of warranty and limitation of liability provided
615
- above cannot be given local legal effect according to their terms,
616
- reviewing courts shall apply local law that most closely approximates
617
- an absolute waiver of all civil liability in connection with the
618
- Program, unless a warranty or assumption of liability accompanies a
619
- copy of the Program in return for a fee.
620
-
621
- END OF TERMS AND CONDITIONS
622
-
623
- How to Apply These Terms to Your New Programs
624
-
625
- If you develop a new program, and you want it to be of the greatest
626
- possible use to the public, the best way to achieve this is to make it
627
- free software which everyone can redistribute and change under these terms.
628
-
629
- To do so, attach the following notices to the program. It is safest
630
- to attach them to the start of each source file to most effectively
631
- state the exclusion of warranty; and each file should have at least
632
- the "copyright" line and a pointer to where the full notice is found.
633
-
634
- <one line to give the program's name and a brief idea of what it does.>
635
- Copyright (C) <year> <name of author>
636
-
637
- This program is free software: you can redistribute it and/or modify
638
- it under the terms of the GNU General Public License as published by
639
- the Free Software Foundation, either version 3 of the License, or
640
- (at your option) any later version.
641
-
642
- This program is distributed in the hope that it will be useful,
643
- but WITHOUT ANY WARRANTY; without even the implied warranty of
644
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
645
- GNU General Public License for more details.
646
-
647
- You should have received a copy of the GNU General Public License
648
- along with this program. If not, see <https://www.gnu.org/licenses/>.
649
-
650
- Also add information on how to contact you by electronic and paper mail.
651
-
652
- If the program does terminal interaction, make it output a short
653
- notice like this when it starts in an interactive mode:
654
-
655
- <program> Copyright (C) <year> <name of author>
656
- This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
657
- This is free software, and you are welcome to redistribute it
658
- under certain conditions; type `show c' for details.
659
-
660
- The hypothetical commands `show w' and `show c' should show the appropriate
661
- parts of the General Public License. Of course, your program's commands
662
- might be different; for a GUI interface, you would use an "about box".
663
-
664
- You should also get your employer (if you work as a programmer) or school,
665
- if any, to sign a "copyright disclaimer" for the program, if necessary.
666
- For more information on this, and how to apply and follow the GNU GPL, see
667
- <https://www.gnu.org/licenses/>.
668
-
669
- The GNU General Public License does not permit incorporating your program
670
- into proprietary programs. If your program is a subroutine library, you
671
- may consider it more useful to permit linking proprietary applications with
672
- the library. If this is what you want to do, use the GNU Lesser General
673
- Public License instead of this License. But first, please read
674
- <https://www.gnu.org/licenses/why-not-lgpl.html>.
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
assets/css/abstracts/_breakpoints.scss CHANGED
@@ -8,8 +8,6 @@
8
  // See https://github.com/WordPress/gutenberg/tree/master/packages/viewport#usage
9
  $breakpoints: 480px, 600px, 782px, 960px, 1280px, 1440px;
10
 
11
- // @todo refactor breakpoints so they use the mixins from Gutenberg
12
- // https://github.com/WordPress/gutenberg/blob/master/packages/base-styles/_mixins.scss
13
  @mixin breakpoint( $sizes... ) {
14
  @each $size in $sizes {
15
  @if type-of( $size ) == string {
8
  // See https://github.com/WordPress/gutenberg/tree/master/packages/viewport#usage
9
  $breakpoints: 480px, 600px, 782px, 960px, 1280px, 1440px;
10
 
 
 
11
  @mixin breakpoint( $sizes... ) {
12
  @each $size in $sizes {
13
  @if type-of( $size ) == string {
assets/css/abstracts/_colors.scss CHANGED
@@ -1,21 +1,54 @@
1
- @import "node_modules/@wordpress/base-styles/colors";
2
- @import "node_modules/@automattic/color-studio/dist/color-variables";
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
3
 
4
  // Bright colors
5
- $no-stock-color: $alert-red;
6
- $low-stock-color: $alert-yellow;
7
- $in-stock-color: $alert-green;
8
- $discount-color: $alert-green;
 
 
 
 
 
 
 
9
 
10
- $placeholder-color: var(--global--color-primary, $gray-200);
11
- $input-border-gray: #50575e;
12
- $input-border-dark: rgba(255, 255, 255, 0.4);
13
- $input-disabled-dark: rgba(255, 255, 255, 0.3);
14
- $controls-border-dark: rgba(255, 255, 255, 0.6);
15
  $input-text-active: #2b2d2f;
16
- $input-placeholder-dark: rgba(255, 255, 255, 0.6);
17
- $input-text-dark: #fff;
18
- $input-background-dark: rgba(0, 0, 0, 0.1);
19
- $select-dropdown-dark: #1e1e1e;
20
- $select-dropdown-light: #fff;
21
- $select-item-dark: rgba(0, 0, 0, 0.4);
1
+ // Greys
2
+ $core-grey-light-100: #f8f9f9;
3
+ $core-grey-light-200: #f3f4f5;
4
+ $core-grey-light-300: #edeff0;
5
+ $core-grey-light-400: #e8eaeb;
6
+ $core-grey-light-500: #e2e4e7;
7
+ $core-grey-light-600: #d7dade;
8
+ $core-grey-light-700: #ccd0d4;
9
+ $core-grey-light-800: #b5bcc2;
10
+ $core-grey-light-900: #a2aab2;
11
+ $core-grey-dark-100: #86909b;
12
+ $core-grey-dark-200: #78848f;
13
+ $core-grey-dark-300: #6c7781; // This & below have 4.5+ contrast against white
14
+ $core-grey-dark-400: #606a73;
15
+ $core-grey-dark-500: #555d66;
16
+ $core-grey-dark-600: #40464d;
17
+ $core-grey-dark-700: #32373c;
18
+ $core-grey-dark-800: #23282d;
19
+ $core-grey-dark-900: #191e23;
20
+
21
+ $gray-text: $core-grey-dark-500;
22
+
23
+ // WooCommerce Purples
24
+ $woocommerce-100: #ffd7ff;
25
+ $woocommerce-200: #e2a5d7;
26
+ $woocommerce-300: #c88bbd;
27
+ $woocommerce-400: #af72a4;
28
+ $woocommerce-500: #95588a;
29
+ $woocommerce-600: #7c3f71;
30
+ $woocommerce-700: #622557;
31
+ $woocommerce-800: #490c3e;
32
+ $woocommerce-900: #2f0024;
33
+ $woocommerce: $woocommerce-500;
34
+
35
+ $wp-admin-background: #f1f1f1;
36
+ $black: #24292d; // same as wp-admin sidebar
37
+
38
+ $white: #fff;
39
 
40
  // Bright colors
41
+ $valid-green: #4ab866;
42
+ $notice-yellow: #ffb900;
43
+ $error-red: #d94f4f;
44
+ $box-shadow-blue: #5b9dd9;
45
+ $core-orange: #ca4a1f;
46
+
47
+ $gray-10: #c3c4c7;
48
+ $gray-20: #a7aaad;
49
+ $gray-50: #646970;
50
+ $gray-60: #50575e;
51
+ $gray-80: #2c3338;
52
 
53
+ $input-border-gray: #8d96a0;
 
 
 
 
54
  $input-text-active: #2b2d2f;
 
 
 
 
 
 
assets/css/abstracts/_mixins.scss CHANGED
@@ -26,13 +26,11 @@ $fontSizes: (
26
  // Adds animation to placeholder section
27
  @mixin placeholder() {
28
  animation: loading-fade 1.2s ease-in-out infinite;
29
- background-color: $placeholder-color !important;
30
- color: $placeholder-color !important;
31
- outline: 0 !important;
32
- border: 0 !important;
33
  box-shadow: none;
34
  pointer-events: none;
35
- max-width: 100%;
36
 
37
  // Forces direct descendants to keep layout but lose visibility.
38
  > * {
@@ -52,7 +50,6 @@ $fontSizes: (
52
 
53
  // Hide an element from sighted users, but available to screen reader users.
54
  @mixin visually-hidden() {
55
- border: 0;
56
  clip: rect(1px, 1px, 1px, 1px);
57
  clip-path: inset(50%);
58
  height: 1px;
@@ -62,29 +59,6 @@ $fontSizes: (
62
  /* Many screen reader and browser combinations announce broken words as they would appear visually. */
63
  overflow-wrap: normal !important;
64
  word-wrap: normal !important;
65
- padding: 0;
66
- position: absolute !important;
67
- width: 1px;
68
- }
69
-
70
- @mixin visually-hidden-focus-reveal() {
71
- background-color: #fff;
72
- border-radius: 3px;
73
- box-shadow: 0 0 2px 2px rgba(0, 0, 0, 0.6);
74
- clip: auto !important;
75
- clip-path: none;
76
- color: $input-text-active;
77
- display: block;
78
- font-size: 0.875rem;
79
- font-weight: 700;
80
- height: auto;
81
- left: 5px;
82
- line-height: normal;
83
- padding: 15px 23px 14px;
84
- text-decoration: none;
85
- top: 5px;
86
- width: auto;
87
- z-index: 100000;
88
  }
89
 
90
  @mixin reset-box() {
@@ -124,7 +98,6 @@ $fontSizes: (
124
  background: transparent;
125
  box-shadow: none;
126
  display: inline;
127
- text-shadow: none;
128
 
129
  &:hover,
130
  &:focus,
@@ -170,24 +143,7 @@ $fontSizes: (
170
  }
171
  }
172
 
173
- // Wraps the content with a media query specially targeting IE11.
174
- @mixin ie11() {
175
- @media screen and (-ms-high-contrast: active), (-ms-high-contrast: none) {
176
- @content;
177
- }
178
- }
179
-
180
  // Converts a px unit to em.
181
  @function em($size, $base: 16px) {
182
  @return $size / $base * 1em;
183
  }
184
-
185
- // Encodes hex colors so they can be used in URL content.
186
- @function encode-color($color) {
187
- @if type-of($color) != "color" or str-index(#{$color}, "#") != 1 {
188
- @return $color;
189
- }
190
-
191
- $hex: str-slice(ie-hex-str($color), 4);
192
- @return "%23" + unquote("#{$hex}");
193
- }
26
  // Adds animation to placeholder section
27
  @mixin placeholder() {
28
  animation: loading-fade 1.2s ease-in-out infinite;
29
+ background-color: $core-grey-light-500 !important;
30
+ border-color: $core-grey-light-500 !important;
31
+ color: $core-grey-light-500 !important;
 
32
  box-shadow: none;
33
  pointer-events: none;
 
34
 
35
  // Forces direct descendants to keep layout but lose visibility.
36
  > * {
50
 
51
  // Hide an element from sighted users, but available to screen reader users.
52
  @mixin visually-hidden() {
 
53
  clip: rect(1px, 1px, 1px, 1px);
54
  clip-path: inset(50%);
55
  height: 1px;
59
  /* Many screen reader and browser combinations announce broken words as they would appear visually. */
60
  overflow-wrap: normal !important;
61
  word-wrap: normal !important;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
62
  }
63
 
64
  @mixin reset-box() {
98
  background: transparent;
99
  box-shadow: none;
100
  display: inline;
 
101
 
102
  &:hover,
103
  &:focus,
143
  }
144
  }
145
 
 
 
 
 
 
 
 
146
  // Converts a px unit to em.
147
  @function em($size, $base: 16px) {
148
  @return $size / $base * 1em;
149
  }
 
 
 
 
 
 
 
 
 
 
assets/css/abstracts/_variables.scss CHANGED
@@ -1,12 +1,22 @@
1
- @import "node_modules/@wordpress/base-styles/variables";
 
 
 
 
 
 
2
 
3
- $gap-largest: $grid-unit-50;
4
- $gap-larger: 4.5 * $grid-unit;
5
- $gap-large: $grid-unit-30;
6
- $gap: $grid-unit-20;
7
- $gap-small: $grid-unit-15;
8
- $gap-smaller: $grid-unit-10;
9
- $gap-smallest: $grid-unit-05;
 
 
 
 
10
 
11
  // Cart block
12
  $cart-image-width: 5rem;
1
+ $gap-largest: 40px;
2
+ $gap-larger: 36px;
3
+ $gap-large: 24px;
4
+ $gap: 16px;
5
+ $gap-small: 12px;
6
+ $gap-smaller: 8px;
7
+ $gap-smallest: 4px;
8
 
9
+ // Variables pulled from Gutenberg.
10
+ // Editor Widths
11
+ $sidebar-width: 280px;
12
+ $content-width: 610px; // For the visual width, subtract 30px (2 * $block-padding + 2px borders). This comes to 580px, which is optimized for 70 characters.
13
+
14
+ // Blocks
15
+ $block-padding: 14px; // Space between block footprint and focus boundaries. These are drawn outside the block footprint, and do not affect the size.
16
+ $block-spacing: 4px; // Vertical space between blocks.
17
+ $block-side-ui-width: 28px; // Width of the movers/drag handle UI.
18
+ $block-side-ui-clearance: 2px; // Space between movers/drag handle UI, and block.
19
+ $block-container-side-padding: $block-side-ui-width + $block-padding + 2 * $block-side-ui-clearance; // Total space left and right of the block footprint.
20
 
21
  // Cart block
22
  $cart-image-width: 5rem;
assets/css/editor.scss CHANGED
@@ -19,7 +19,6 @@
19
  .wc-block-grid__products {
20
  list-style: none;
21
  margin: 0 (-$gap/2) $gap;
22
- padding: 0;
23
 
24
  .wc-block-grid__product {
25
  margin: 0 0 $gap-large 0;
@@ -48,15 +47,16 @@
48
  }
49
  }
50
 
51
- // Selectors with extra specificity to override some editor styles.
52
- .woocommerce-search-list__list.woocommerce-search-list__list {
53
- box-sizing: border-box;
54
- margin: 0;
55
- padding: 0;
56
  }
57
 
58
- .woocommerce-search-list__selected.woocommerce-search-list__selected > ul {
59
- list-style: none;
60
- margin: 0;
61
- padding: 0;
 
 
 
62
  }
19
  .wc-block-grid__products {
20
  list-style: none;
21
  margin: 0 (-$gap/2) $gap;
 
22
 
23
  .wc-block-grid__product {
24
  margin: 0 0 $gap-large 0;
47
  }
48
  }
49
 
50
+ // Adds border to placeholder lists, so they can be distinguished from the white background.
51
+ .components-placeholder .woocommerce-search-list__list {
52
+ border: 1px solid $core-grey-light-500;
 
 
53
  }
54
 
55
+ // Work-around to make the SearchList component work fine with the last versions of @wordpress/components.
56
+ // Ideally it should be possible to remove this once this issue is fixed in WC Admin:
57
+ // https://github.com/woocommerce/woocommerce-admin/issues/4349
58
+ .components-placeholder .woocommerce-search-list__list .woocommerce-search-list__item {
59
+ border-radius: 0;
60
+ height: auto;
61
+ text-align: left;
62
  }
assets/css/style.scss CHANGED
@@ -21,7 +21,6 @@
21
  }
22
 
23
  img {
24
- height: auto;
25
  width: 100%;
26
 
27
  &[hidden] {
@@ -47,56 +46,38 @@
47
  margin-right: 0.5em;
48
  }
49
  }
50
- .wc-block-grid__product-add-to-cart.wp-block-button {
51
  word-break: break-word;
52
  white-space: normal;
53
- .wp-block-button__link {
 
54
  word-break: break-word;
55
  white-space: normal;
56
  margin: 0 auto !important;
57
  display: inline-flex;
58
  justify-content: center;
59
- text-align: center;
60
- // Set button font size and padding so it inherits from parent.
61
- padding: 0.5em 1em;
62
- font-size: 1em;
63
 
64
  &.loading {
65
  opacity: 0.25;
66
  }
67
 
 
 
 
 
 
68
  &.added::after {
69
  font-family: WooCommerce; /* stylelint-disable-line */
70
  content: "\e017";
71
- margin-left: 0.5em;
72
- display: inline-block;
73
- width: auto;
74
- height: auto;
75
  }
76
 
77
  &.loading::after {
78
  font-family: WooCommerce; /* stylelint-disable-line */
79
  content: "\e031";
80
  animation: spin 2s linear infinite;
81
- margin-left: 0.5em;
82
- display: inline-block;
83
- width: auto;
84
- height: auto;
85
  }
86
  }
87
  }
88
- // Remove button sugar if unlikely to fit.
89
- .has-5-columns:not(.alignfull),
90
- .has-6-columns,
91
- .has-7-columns,
92
- .has-8-columns,
93
- .has-9-columns {
94
- .wc-block-grid__product-add-to-cart.wp-block-button .wp-block-button__link::after {
95
- content: "";
96
- margin: 0;
97
- }
98
- }
99
-
100
  .wc-block-grid__product-rating {
101
  display: block;
102
 
@@ -201,9 +182,6 @@
201
  .wc-block-components-product-sale-badge {
202
  line-height: 1;
203
  }
204
- .editor-styles-wrapper .wp-block-button .wp-block-button__link:not(.has-text-color) {
205
- color: #fff;
206
- }
207
  }
208
 
209
  .theme-twentytwenty {
@@ -307,11 +285,3 @@
307
  }
308
  }
309
  }
310
-
311
- // Default screen-reader styles. Included as a fallback for themes that don't have support.
312
- .screen-reader-text {
313
- @include visually-hidden();
314
- }
315
- .screen-reader-text:focus {
316
- @include visually-hidden-focus-reveal();
317
- }
21
  }
22
 
23
  img {
 
24
  width: 100%;
25
 
26
  &[hidden] {
46
  margin-right: 0.5em;
47
  }
48
  }
49
+ .wc-block-grid__product-add-to-cart {
50
  word-break: break-word;
51
  white-space: normal;
52
+ a,
53
+ button {
54
  word-break: break-word;
55
  white-space: normal;
56
  margin: 0 auto !important;
57
  display: inline-flex;
58
  justify-content: center;
 
 
 
 
59
 
60
  &.loading {
61
  opacity: 0.25;
62
  }
63
 
64
+ &::after {
65
+ margin-left: 0.5em;
66
+ display: inline-block;
67
+ }
68
+
69
  &.added::after {
70
  font-family: WooCommerce; /* stylelint-disable-line */
71
  content: "\e017";
 
 
 
 
72
  }
73
 
74
  &.loading::after {
75
  font-family: WooCommerce; /* stylelint-disable-line */
76
  content: "\e031";
77
  animation: spin 2s linear infinite;
 
 
 
 
78
  }
79
  }
80
  }
 
 
 
 
 
 
 
 
 
 
 
 
81
  .wc-block-grid__product-rating {
82
  display: block;
83
 
182
  .wc-block-components-product-sale-badge {
183
  line-height: 1;
184
  }
 
 
 
185
  }
186
 
187
  .theme-twentytwenty {
285
  }
286
  }
287
  }
 
 
 
 
 
 
 
 
assets/img/avatar.jpg ADDED
Binary file
{images/previews → assets/img}/beanie.jpg RENAMED
File without changes
assets/img/block-error.svg ADDED
@@ -0,0 +1,2727 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <svg
2
+ width="208.5"
3
+ height="92"
4
+ viewBox="0 0 834 368"
5
+ xmlns="http://www.w3.org/2000/svg"
6
+ >
7
+ <g>
8
+ <g>
9
+ <path
10
+ fill="#DCDDDE"
11
+ d="M77.3,290.2h0.3l0.3,0.1l0.2,0.1l0.4,0.1h0.1l0.4,0.2h0.1l0.2,0.2l0.3,0.2l0,0l0.3,0.3l0.2,0.3l0,0h0.4l2,0.1
12
+ l2,0.1l2.1,0.2l1.1,0.1l1.1,0.1l1,0.1l1.1,0.1l1.1,0.1l1.1,0.1l1.1,0.1l1.1,0.1l1.1,0.1l1,0.1l1.1,0.2l1,0.2l1,0.2l1,0.2l0.9,0.2
13
+ l0.9,0.2l0.9,0.2l0.9,0.2l0.9,0.2l0.8,0.2l0.4,0.1l0.4,0.1l0.4,0.1l0.4,0.1l0.4,0.1l0.4,0.1l0.4,0.1l0.4,0.1l0.4,0.2l0.4,0.2
14
+ l0.4,0.2l0.4,0.2l0.3,0.2l0.4,0.2l0.3,0.2l0.4,0.2l0.3,0.2l0.3,0.2l0.3,0.2l0.3,0.2l0.3,0.2l0.2,0.3l0.2,0.2h0.2h1.4h0.6l0,0
15
+ l-0.2-0.3v-0.1l-0.2-0.3v-0.1l-0.1-0.3v-0.1l-0.1-0.3v-0.1l-0.1-0.4v-0.1l0.1-0.3v-0.1l0.1-0.3v-0.1l0.1-0.3l0.1-0.1l0.1-0.2
16
+ l0.1-0.2l0.2-0.3l0.2-0.3l0.2-0.3l0.2-0.2l0.2-0.2l0.2-0.2l0.2-0.2l0.2-0.2l0.2-0.2l0.2-0.2l0.2-0.1l0.2-0.1l0.2-0.1l0.2-0.1
17
+ l0.2-0.1l0.2-0.1l0.2-0.1l0.2-0.1l0.2-0.1l0.2-0.1l0.4-0.1l0.5-0.1h0.4h0.5h0.4h0.4h0.4h0.4h0.4h0.4h0.4l0.7,0.1l0.7,0.1l0.7,0.1
18
+ h0.3h0.3h0.3h0.2h0.2h0.2h0.3h0.4h0.8h0.8l0.9-0.1l0.9-0.1l1-0.1l2.2-0.2l2.3-0.2l1.2-0.1l1.2-0.1l1.2-0.1l1.2-0.1l1.3-0.1
19
+ l1.2-0.1l1.3-0.1h1.2h0.7h0.7h0.7h0.6h0.7h0.6h0.7h0.6h0.7h0.6h0.6l0.6,0.1l0.6,0.1l0.5,0.1l0.6,0.1l0.5,0.1l0.6,0.1l0.5,0.1
20
+ l0.5,0.1l0.5,0.1l0.5,0.2l0.5,0.2l0.5,0.2l0.5,0.2l0.5,0.2l0.5,0.2l0.2,0.1l0.2,0.1l0.2,0.1l0.2,0.2l0.2,0.1l0.2,0.2l0.2,0.2
21
+ l0.1,0.1l0.2,0.2v0.1l0.2,0.3l0,0l0.2,0.5l0,0l0.1,0.5l0,0l0.1,0.6l0,0l-0.1,0.6l0,0l-0.2,0.5h-0.1l-0.2,0.4h-0.1l-0.1,0.1
22
+ l1.9,0.3l2.3,0.4l2.2,0.4h1.1l2.5,0.1l2.2,0.1l0.7-0.1l0.6-0.1l0.5-0.1h0.5h0.5h0.6h0.6h0.6h0.6h0.6h0.6h1.1h1.1h1.1h1.1h1.1h5.2
23
+ h0.4l4-0.2l2-0.1l2-0.1l1.2-0.1l0.1-0.2l0.4-0.4l0.5-0.3l0,0l0.3-0.1l0.4-0.1l0,0l0.4-0.1h0.2h0.4h0.4h2.4h2.4h2.4h2.4h4.8
24
+ l4.8,0.1l9.5,0.1l4.8,0.1l4.7,0.1h4.8h2.4h2.4h2.4h2.4h2.4h2.4h2.4h2.4h2.4h2.4l2.4-0.1l2.4-0.1l2.4-0.1l2.4-0.1h1.2h1.2h1.2h1.2
25
+ h1.2h1.2h1.2h1.2h2.5h2.4h2.4h1.2h1.2h0.2h0.2h0.5h0.5l0.5-0.1l0.7-0.1l0.7-0.1l1.4-0.2l1.4-0.2l0.8-0.1l0.7-0.1l0.8-0.1l0.7-0.1
26
+ l0.8-0.1h0.7h0.7h0.4h0.4h0.4h0.4h0.4h0.4h0.3h0.4h0.4l0.4,0.1l0.4,0.1l0.4,0.1l0.4,0.1l0.4,0.1l0.4,0.2l0.4,0.2l0.2,0.2l0.2,0.1
27
+ l0.2,0.1l0.2,0.2l0.2,0.2l0.2,0.2l0.2,0.2l0.1,0.2l0.2,0.2l0.1,0.2l0.1,0.2l0.1,0.2l0.1,0.2l0.1,0.2l0.1,0.2l0.1,0.3l0.1,0.2v0.2
28
+ v0.2v0.2l-0.1,0.3l-0.1,0.4l-0.1,0.4l-0.1,0.4l-0.2,0.4l-0.2,0.3l-0.2,0.3l-0.2,0.3l-0.2,0.3l-0.2,0.3l-0.2,0.2l-0.2,0.2l-0.2,0.2
29
+ l-0.2,0.2l-0.2,0.2l-0.3,0.2l-0.2,0.1l-0.2,0.1l-0.3,0.1l-0.2,0.1l-0.1,0.1h0.1l0.5,0.1l0.2,0.1l0.3,0.1l0.2,0.1h0.1h0.2l0.7-0.1
30
+ l0.7-0.1l0.7-0.1l1.5-0.2l1.6-0.2l0.8-0.1l0.8-0.1l0.8-0.1l0.8-0.1h0.1h0.1l0,0l0.2-0.4l0.4-0.4l0,0l0.3-0.2l0.3-0.2l0,0l0.4-0.2
31
+ h0.1l0.4-0.1h0.1l0.3-0.1h0.2h0.4h0.4h0.4h0.4h0.4h0.4h0.7l0.8,0.1l0.8,0.1l1.6,0.1l0.8,0.1h0.7h0.6h0.2h0.2h1.4h1.5h2.9h1.4h1.4
32
+ h0.7h0.7h0.7h0.7l1.9-0.1l1.9-0.1l1.8-0.1l1.9-0.1l1.9-0.1l1.9-0.1l3.8-0.3l3.7-0.3l2-0.1l1.9-0.1l1.9-0.1l1.9-0.1l2-0.1l1.9-0.1
33
+ h0.7h0.7h1.4h1.4h1.4h2.7h1.3h1.3h0.5h0.5h0.6h0.7l1.5-0.1l1.4-0.1h0.7h0.7h0.5h0.2h0.3h0.2h0.3h0.1l0.5,0.1h0.1l0.3,0.1l0.3,0.2
34
+ l0,0l0.5,0.4l0.4,0.5l0,0l0.2,0.5l0.2,0.5v0.5v0.5l0,0l-0.2,0.5L404,306l-0.2,0.4h-0.1l-0.2,0.3l-0.3,0.2l0,0l-0.5,0.3h-0.1
35
+ l-0.3,0.1l-0.2,0.1l-0.3,0.1l-1.3,0.4l-1.2,0.3l-1.3,0.3l-1.4,0.3l-1.3,0.3l-1.4,0.3l-1.3,0.3l-1.4,0.3l-1.3,0.3l-1.4,0.3
36
+ l-2.6,0.5l-5,1l-3.5,0.7h-0.2l2-0.1l2.1-0.1l2.1-0.1l2-0.1h1.8h1.6h0.8h0.6h0.2h0.6l0.9-0.1l1.1-0.1h0.7h0.7h0.7h0.7h0.8h0.8h0.8
37
+ h0.8h0.8l0.8,0.1l0.8,0.1h0.4h0.4l0.4,0.1l0.4,0.1l0.4,0.1l0.4,0.1l0.4,0.1l0.4,0.1l0.4,0.1l0.4,0.1l0.4,0.1l0.4,0.1l0.4,0.1
38
+ l0.4,0.2l0.4,0.2l0.3,0.2l0.4,0.2l0.4,0.3l0.2,0.2l0.2,0.2l0.2,0.2l0.1,0.2l0.2,0.2l0.1,0.2l0.1,0.2l0.1,0.3l0.1,0.3l0.1,0.3
39
+ l0.1,0.3v0.3l0.1,0.3v0.3l-0.1,0.3v0.3l-0.1,0.4l-0.1,0.4l-0.1,0.4l-0.2,0.4l-0.2,0.4l-0.2,0.3l-0.2,0.3l-0.2,0.3l-0.3,0.3
40
+ l-0.2,0.3l-0.3,0.2l-0.3,0.2l-0.3,0.2L407,323l-0.4,0.2l-0.3,0.2l-0.3,0.2l-0.4,0.2l-0.4,0.1l-0.4,0.1l-0.4,0.1l-0.4,0.1l-0.4,0.1
41
+ l-0.4,0.1l-0.4,0.1l-0.4,0.1l-0.4,0.1l-0.4,0.1l-0.4,0.1l-0.4,0.1l-0.4,0.1l-0.4,0.1l-0.4,0.1l-0.5,0.1l-0.8,0.1l-0.9,0.1
42
+ l-0.9,0.1l-0.9,0.1l-1,0.1h-0.9h-0.9h-1h-1h-1h-1h-1.1h-1h-1.1h-1h-1.1h-1l-1.1-0.1l-1-0.1l-1-0.1l-1.1-0.1l-1.2-0.1v0.1v0.3v0.1
43
+ l-0.1,0.3v0.1l-0.1,0.3l-0.1,0.2l-0.1,0.3l-0.1,0.3l-0.2,0.3l-0.2,0.3l-0.2,0.3l-0.2,0.3l-0.2,0.3l-0.3,0.2l-0.2,0.2l-0.3,0.2
44
+ l-0.2,0.2l-0.3,0.2l-0.3,0.2l-0.3,0.2l-0.3,0.2l-0.3,0.2l-0.3,0.1l-0.3,0.1l-0.3,0.1l-0.3,0.1l-0.3,0.1l-0.4,0.1l-0.7,0.2
45
+ l-0.7,0.2l-0.7,0.2l-0.7,0.2l-0.7,0.2l-0.7,0.2l-0.7,0.1l-0.7,0.1l-0.7,0.1l-0.7,0.1l-0.6,0.1l-0.7,0.1l-0.5,0.1l-1.1,0.1
46
+ l-0.9,0.1l-0.8,0.1l-0.7,0.1h-0.5h-0.6h-0.7h-0.7h-0.8h-0.7h-0.8h-0.8h-0.8h-0.8h-0.9h-0.9H349h-0.9h-0.9h-0.9h-1l-0.9-0.1l-1-0.1
47
+ l-1.1-0.1l-1-0.1l-1-0.1l-1.1-0.1l-1.1-0.1l-1-0.1l-1.1-0.1l-1.1-0.1l-1.1-0.2l-1.1-0.2l-1.1-0.2l-1.1-0.2l-1.1-0.2l-1.1-0.2
48
+ l-1.1-0.2l-1.1-0.2l-1-0.2l-1.1-0.3l-1-0.3l-1.1-0.3l-1-0.3l-1-0.3l-0.5-0.2l-0.5-0.2l-0.5-0.2l-0.5-0.2l-0.5-0.2l-0.5-0.2
49
+ l-0.5-0.2l-0.5-0.2l-0.4-0.2l-0.5-0.2l-0.5-0.2l-0.5-0.2l-0.4-0.2l-0.4-0.2l-0.5-0.2l-0.4-0.2l-0.4-0.2l-0.4-0.2l-0.4-0.2
50
+ l-0.4-0.2l-0.4-0.3l-0.4-0.3l-0.4-0.3l-0.4-0.3l-0.4-0.3l-0.4-0.3l-0.4-0.3l-0.4-0.3l-0.4-0.3l-0.3-0.3l-0.4-0.3l-0.4-0.3
51
+ l-0.3-0.3l-0.3-0.3l-0.1-0.1l-0.6,0.1l-0.9,0.1l-1,0.1l-1,0.1l-1,0.1l-1,0.1l-1,0.1l-1,0.1l-1,0.1l-1,0.1l-1,0.1l-1.1,0.1l-1,0.1
52
+ h-0.9h-1h-1.2l-0.1,0.3l0,0l-0.3,0.4l-0.3,0.4l-0.4,0.3l0,0l-0.4,0.2l-0.3,0.2h-0.1l-0.5,0.1h-0.1h-0.4h-0.2h-0.3h-1.5h-1.5h-2.9
53
+ h-3l-2.9-0.1l-2.9-0.1l-2.9-0.1l-5.8-0.2l-5.7-0.2l-2.9-0.1l-2.9-0.1l-2.9-0.1h-2.8h-2.9h-1.4h-1.4h-2.1h-2.1h-2.1h-2.1h-2.1h-1.1
54
+ h-1.1h-1.1H225h-1.1h-1.1h-0.3h-0.3h-0.8h-1.8h-1h-1h-0.5h-0.5h-0.5h-0.5h-0.5h-0.5l-0.5-0.1l-0.5-0.1l-0.5-0.1l-0.2-0.1l-0.2-0.1
55
+ l-0.2-0.1l-0.2-0.1l-0.2-0.1l-0.3-0.1l-0.3-0.1l-0.2-0.1l-0.2-0.2l-0.1-0.1l-0.2-0.2l-0.1-0.1l-0.2-0.3l-0.1-0.1l-0.2-0.4
56
+ l-0.1-0.1l-0.2-0.4v-0.1l-0.2-0.5v-0.1l-0.1-0.5v-0.1l0.1-0.5v-0.1l0.1-0.4l0.1-0.1l0.1-0.4l0.1-0.1l0.1-0.3l0.1-0.1l0.2-0.2
57
+ l0.1-0.2l0.2-0.3l0.2-0.2l0.4-0.4l0.4-0.3l0.3-0.3h-0.2h-0.1l-0.7,0.3l-0.7,0.3l-0.7,0.3l-0.8,0.3l-0.8,0.3l-0.7,0.3l-0.8,0.3
58
+ l-0.8,0.3l-0.8,0.3l-0.8,0.3l-0.8,0.3l-0.8,0.3l-1.6,0.5l-1.7,0.5l-1.6,0.5l-1.7,0.5l-1.7,0.5l-1.7,0.5l-1.7,0.5l-1.7,0.4
59
+ l-1.6,0.4l-1.6,0.4l-1.6,0.4l-2.2,0.6l0.2,0.6l0.1,0.1l0.1,0.4l0.1,0.4v0.1v0.4v0.1l0.1,0.1l0.2,0.3l0.1,0.3l0.1,0.3l0.1,0.3
60
+ l0.1,0.3v0.3l0.1,0.3l-0.1,0.3v0.2v0.2l-0.1,0.2v0.2l-0.1,0.2l-0.1,0.2l-0.1,0.2l-0.1,0.2l-0.1,0.2l-0.1,0.2l-0.1,0.2l-0.1,0.2
61
+ l-0.1,0.2l-0.1,0.2l-0.2,0.2l-0.1,0.2l-0.1,0.2l-0.3,0.3l-0.3,0.3l-0.3,0.3l-0.4,0.3l-0.4,0.2l-0.4,0.2l-0.4,0.2l-0.4,0.2
62
+ l-0.4,0.2l-0.4,0.1l-0.4,0.1l-0.4,0.1l-0.4,0.1l-0.4,0.1l-0.4,0.1l-0.4,0.1l-0.4,0.1H175h-0.4h-0.4h-0.4h-0.4H173h-0.8h-0.8h-0.8
63
+ h-0.8H169h-0.8l-1.5-0.1l-1.5-0.1h-0.7h-0.7h-0.6h-0.6H162h-0.2h-0.2l-6.1,0.5l-3.1,0.2l-3.1,0.2l-3.1,0.2l-3.1,0.2l-3.1,0.2
64
+ l-3.1,0.2l-3.1,0.2l-1.5,0.1l-1.5,0.1l-1.5,0.1l-1.5,0.1l-1.5,0.1l-1.5,0.1l-1.5,0.1h-1.6h-1.5h-1.5h-1.5h-1.5h-1.5h-1.5h-0.4
65
+ h-0.4h-0.2l-0.4-0.1h-0.1l-0.5-0.2l0,0l-0.5-0.3l-0.4-0.4l-0.3-0.4l0,0l-0.3-0.6l-0.2-0.6v-0.6l0.1-0.6l0.2-0.6l0,0l0.2-0.4
66
+ l0.3-0.3l0.4-0.3l0,0l0.5-0.3l0,0l0.3-0.1l0.2-0.1l0.4-0.1l0.3-0.1l0.4-0.1l0.7-0.1l0.9-0.1l1-0.1l2.1-0.3l2.2-0.3l2-0.3l0.9-0.1
67
+ l0.7-0.1l1-0.1l0.9-0.1l0.9-0.1l1-0.1l1.9-0.2l1.9-0.2l1.9-0.2l1.9-0.2l1.9-0.2l0.9-0.1l0.9-0.1l0.5-0.1l0.5-0.1l0.5-0.1l0.4-0.1
68
+ l0.6-0.2l1.2-0.3l1.2-0.3l1.2-0.3l1.2-0.3l1.1-0.3l-1.2-0.1l-2.2-0.2l-1.1-0.1l-1.1-0.1l-1.1-0.1l-0.9-0.1l-1-0.1l-0.9-0.1
69
+ l-0.9-0.1l-0.8-0.1l-0.8-0.1l-0.8-0.1l-0.7-0.1l-0.7-0.1l-0.5-0.1l-0.3-0.1l-0.3-0.1l-0.3-0.1l-0.3-0.1l-0.2-0.1l-0.3-0.1
70
+ l-0.3-0.2l-0.2-0.1l-0.2-0.2l-0.1-0.1l-0.4-0.4l-0.1-0.1l-0.3-0.4l0,0l-0.2-0.3l0,0l-0.2-0.5l0,0l-0.1-0.5l0,0v-0.5l0,0l0.1-0.5
71
+ l0,0l0.2-0.4l0,0l0.2-0.4l0,0l0.3-0.4l0.1-0.1l0.3-0.3h-0.4h-0.7h-0.7h-0.7h-0.3h-0.3h-0.2h-0.3l-0.5-0.1l-0.5-0.1l-0.5-0.1
72
+ l-0.6-0.2l-0.5-0.2l-0.5-0.2l-0.5-0.2l-0.2-0.1l-0.2-0.1l-0.2-0.1l-0.2-0.1l-0.3-0.2l-0.2-0.1l-0.2-0.2l-0.1-0.1l-0.4-0.4
73
+ l-0.1-0.1l-0.3-0.5h-0.1l-0.2-0.5l0,0l-0.1-0.4v-0.4l0,0V314l0.1-0.4l0,0l0,0h-0.4l-0.8,0.1l-0.7,0.1h-0.7h-0.7h-0.7h-0.7h-0.8
74
+ h-0.7h-1.4h-1.4h-1.4h-1.4h-1.4h-1.4l-2.7-0.1l-2.5-0.1h-1.2h-1.2h-1.1h-1.1H76.9h-0.2h-0.4h-0.8h-0.9h-0.9h-0.4h-0.4h-0.4h-0.4
75
+ h-0.3h-0.2l-0.4-0.1l-0.4-0.1l0,0l-0.5-0.3l-0.4-0.4l-0.4-0.5l0,0l-0.2-0.5l-0.2-0.6v-0.6l0.1-0.6l0,0l0.2-0.6l0.4-0.5l0.4-0.4
76
+ l0,0l0.4-0.2L71,308h0.1l0.3-0.1h0.1l0.2-0.1l0.7-0.2l0.7-0.2l0.7-0.1l0.2-0.1l-0.1-0.1l-0.3-0.5l0,0l-0.2-0.5l-0.1-0.5l-0.1-0.6
77
+ l0.1-0.6l0.2-0.5h0.1l0.3-0.5l0.5-0.5l0,0l0.5-0.3H75l0.4-0.2l0.2-0.1l0.4-0.1l0.4-0.1l0.4-0.1l0.4-0.1l0.4-0.1l0.4-0.1l-0.3-0.1
78
+ l-0.5-0.4l-0.5-0.4h-0.1h-0.9h-0.9h-0.9H73h-0.9l-0.9-0.1l-0.9-0.1l-0.9-0.1l-0.9-0.1l-0.7-0.1l-0.5,0.1l-0.6,0.1h-0.5h-0.6h-0.5
79
+ h-0.6H64h-0.5h-0.6h-0.5h-0.6h-0.5h-1.1h-1.1h-1l-1.1-0.1l-1.9-0.1l-1.8-0.1h-0.8h-0.7h-0.7h-0.5h-0.4h-0.9l-2.8,0.1l-3.9,0.2
80
+ l-4.3,0.2l-2.2,0.1l-2.1,0.1l-2,0.1l-1.8,0.1h-0.8h-0.7H28h-0.6h-0.5h-0.5h-0.3h-0.2l-0.4-0.1l0,0l-0.4-0.1l-0.4-0.2l0,0l-0.4-0.3
81
+ L24,300l-0.3-0.4l0,0l-0.2-0.5l-0.1-0.5v-0.1v-0.3l-0.1-0.1v-0.3l0.1-0.1v-0.3l0.1-0.1l0.1-0.3v-0.1l0.1-0.3l0.1-0.1l0.1-0.3
82
+ l0.1-0.1l0.1-0.2l0.1-0.2l0.2-0.3l0.3-0.3l0.2-0.3l0.3-0.2l0.2-0.2l0.3-0.2L26,294l0.3-0.2l0.3-0.1l0.3-0.1l0.3-0.1l0,0h-0.5h-0.6
83
+ h-0.3h-0.3h-0.3h-0.3l-0.3-0.1l-0.3-0.1l-0.3-0.1l-0.3-0.1l-0.3-0.1l-0.3-0.1l-0.4-0.1l-0.3-0.2l-0.3-0.2l-0.3-0.2l-0.3-0.2
84
+ l-0.3-0.3l-0.2-0.3l-0.3-0.3l-0.2-0.3l-0.2-0.4l-0.2-0.4l-0.1-0.4l-0.1-0.4l-0.1-0.4v-0.4l-0.1-0.4l0.1-0.4v-0.4l0.1-0.4l0.1-0.3
85
+ l0.1-0.3l0.1-0.2l0.1-0.3l0.1-0.2l0.1-0.3l0.1-0.1l0.2-0.3l0.1-0.1l0.2-0.2l0.1-0.1l0.2-0.2l0.1-0.1l0.3-0.2l0.1-0.1l0.2-0.2
86
+ l0.2-0.1l0.4-0.2l0.4-0.1l0.4-0.1l0.4-0.1l0.4-0.1h0.4h0.4h0.4h0.3h0.4h0.3h0.4h0.3h0.4l0.3,0.1l0.4,0.1l0.7,0.1l0.7,0.2l0.7,0.2
87
+ l0.7,0.2l0.7,0.2l0.7,0.2l1.2,0.4l1.2,0.4l0.6,0.2l0.6,0.2l0.5,0.2l0.5,0.1l0.5,0.1l0.4,0.1h0.2h0.2h0.2h0.2l1.7,0.2l1.7,0.2
88
+ l1.8,0.2l1.8,0.2l3.8,0.5l4,0.5l3.9,0.5l2,0.2l1.8,0.2l1.8,0.2l1.8,0.2l1.7,0.2l1.5,0.1h0.4h0.7h0.5l0.5-0.1l1-0.2l1-0.2l1-0.2
89
+ l0.5-0.1l0.5-0.1l0.5-0.1l0.5-0.1l0.4-0.1h0.5h0.4h0.4h0.4L77.3,290.2z M330.2,321.8l-0.7,0.1l-0.8,0.1l-0.8,0.1l-0.8,0.1
90
+ l-0.8,0.1l-0.8,0.1l-0.8,0.1l-0.8,0.1l-0.8,0.1l-0.8,0.1l-0.8,0.1l-0.8,0.1h-0.8h-0.8h-0.8h-0.8h-0.8H316h-0.7h-0.7h-0.7h-0.1
91
+ l0.2,0.1l0.4,0.2l0.4,0.2l0.4,0.2l0.4,0.2l0.4,0.2l0.4,0.2l0.4,0.2l0.4,0.2l0.4,0.2l0.4,0.2l0.4,0.2l0.4,0.2l0.4,0.2l0.4,0.2
92
+ l0.5,0.1l0.4,0.1l0.9,0.3l0.9,0.3l0.9,0.3l0.9,0.2l0.9,0.2l0.9,0.2l1,0.2l0.9,0.2l1,0.2l1,0.2l1,0.2l1,0.2l1,0.2l1,0.1l1,0.1
93
+ l1,0.1l1,0.1l1,0.1l1,0.1l1,0.1l0.9,0.1l0.9,0.1l1,0.1l0.9,0.1h0.9h0.9h0.9h0.9h0.9h0.8h0.8h0.8h0.8h0.8h0.8h0.7h0.7h0.6h0.7h0.5
94
+ h0.4l0.5-0.1l0.8-0.1l0.9-0.1l1-0.1l0.5-0.1l0.6-0.1l0.5-0.1l0.6-0.1l0.5-0.1l0.6-0.1l0.6-0.1l0.5-0.1l0.6-0.1l0.5-0.1l0.5-0.2
95
+ l0.5-0.2l0.5-0.2l0.2-0.1h-0.1l-0.3-0.1l-0.7-0.2l-0.7-0.2l-0.6-0.2l-0.7-0.2l-0.5-0.1h-0.1H363l-0.4-0.1l-0.5-0.1l-0.7-0.1
96
+ l-0.8-0.1l-0.9-0.1l-1-0.1h-0.2l-0.7-0.1h-0.2h-0.1h-0.8h-0.8h-0.8h0.2h-1.6H352h-1.7h-0.8h-0.9h-0.8h-0.9H346h-0.8h-0.3h-0.3
97
+ h-0.4h-0.4h-0.4H343l-0.9,0.1l-0.9,0.1l-1,0.1h-0.5h-0.5h-0.5h-0.5h-0.5h-0.5h-0.5h-0.3h-0.2h-0.3h-0.2l-0.3-0.1l-0.3-0.1
98
+ l-0.2-0.1l-0.3-0.1l-0.3-0.1L334,326l-0.2-0.1l-0.3-0.2l-0.3-0.2l-0.3-0.2l-0.3-0.2l-0.2-0.3l-0.2-0.3l-0.2-0.2l-0.1-0.2l-0.2-0.2
99
+ l-0.1-0.2l-0.1-0.2l-0.1-0.2l-0.2-0.4l-0.1-0.4l-0.1-0.4V322L330.2,321.8z M172.4,323.5l-0.9,0.1l-1,0.1l-1,0.1h-0.9h-1h-0.9h-0.9
100
+ h-0.9H164h-1.7h-1.6h-1.4h-0.7h-0.5h-0.5h-0.4l-3.4,0.2h-0.1l2.2,0.2l4.7,0.4l3.6,0.3h0.2l0.7-0.1l0.7-0.1l0.7-0.1l0.7-0.1
101
+ l0.7-0.1l0.7-0.1l0.7-0.1l0.6-0.1l0.8-0.2l1.2-0.3L172.4,323.5L172.4,323.5z M394.4,320.2h-0.7H393h-0.7h-0.6l-1.1,0.1h-0.8h-0.6
102
+ h-0.4h-0.5h-0.7h-1.5h-1.8l-2,0.1l-2,0.1l-2.2,0.1l-4.5,0.2l-3,0.1l0.6,0.1l1.9,0.2l1.9,0.2l2,0.1l1,0.1l1,0.1l1,0.1l1,0.1h1h1
103
+ h0.9h1h1h1h0.9h0.9h0.9h0.9h0.9h0.9l0.9-0.1l0.8-0.1l0.8-0.1l0.8-0.1l0.8-0.1l0.3-0.1l0.4-0.1l0.4-0.1l0.4-0.1l0.3-0.1l0.4-0.1
104
+ l0.3-0.1l0.3-0.1l0.3-0.1l0.2-0.1l0.2-0.1l0.2-0.1l0.2-0.1h0.1h-0.2h-0.3h-0.4h-0.3l-0.7-0.1h-0.7h-0.7h-0.7h-0.7H395h-0.6V320.2z
105
+ M185.1,311.1v0.5l-0.1,0.5l0,0l-0.2,0.5l-0.3,0.5l0,0l-0.2,0.3l-0.3,0.2l0,0l-0.2,0.2l0,0l0.4,0.4l0.1,0.1l0.2,0.3h0.1l0.2,0.3
106
+ l0,0l0.1,0.3h0.1l0.1,0.4l0,0l0.1,0.3l0,0l0.1,0.3l0,0l-0.1,0.4v0.1l-0.1,0.5v0.1l-0.2,0.4l-0.1,0.1l-0.2,0.3l-0.1,0.2l-0.2,0.3
107
+ l-0.2,0.3l-0.2,0.3l-0.3,0.3l-0.4,0.3l-0.4,0.3l-0.4,0.3l-0.4,0.2l-0.4,0.2l1.4-0.4l1.5-0.4l1.6-0.4l1.6-0.4l1.7-0.4l1.6-0.4
108
+ l1.6-0.5l1.7-0.5l1.6-0.5l1.6-0.5l1.6-0.5l0,0h-0.2l-1.1-0.2l-1.1-0.3l-1-0.3l-1.1-0.3l-1-0.3l-1.1-0.3l-1-0.3l-0.5-0.2l-0.5-0.2
109
+ l-0.5-0.2l-0.5-0.2l-0.5-0.2l-0.5-0.2l-0.4-0.2l-0.2-0.1l-0.2-0.2h-0.1l-0.3-0.2l0,0l-0.4-0.3l0,0l-0.2-0.3l-0.2-0.3h-0.1
110
+ l-0.1-0.3l-0.5-0.1l-0.8-0.2L185.1,311.1z M222.2,319.9h0.4h1.1h1h1.1h1h1.1l-0.4-0.2l-0.5-0.2l-0.5-0.2l-0.5-0.2l-0.5-0.2
111
+ l-0.4-0.2l0,0h-0.6h-0.2H224h-0.1l-0.4-0.1l-0.2-0.1h-0.1l-0.4,0.1l-0.4,0.1l-0.4,0.1l-0.4,0.1l-0.4,0.1l-0.4,0.1l-0.4,0.1
112
+ l-0.3,0.1l-0.4,0.1l-0.4,0.1l-0.3,0.2h-0.1h1.6h0.8L222.2,319.9z M297.2,316.3l-2.4,0.3l-2.4,0.3l-2.4,0.3l-4.8,0.6l-4.8,0.6
113
+ l-2.4,0.3l-2.4,0.3h1h2.9h1.6h1.7h1.7h1.8l1.8-0.1l2-0.1h0.9h0.9l1-0.1l0.9-0.1l1-0.1l0.9-0.1l0.9-0.1l1-0.1l0.9-0.1l0.9-0.1
114
+ l1-0.1l0.9-0.1l0,0v-0.1l-0.1-0.3v-0.1l-0.1-0.3v-0.1v-0.3v-0.1v-0.3l0,0h-0.8h-1.2L297.2,316.3z M345.5,317.8L343,318l-0.9,0.1
115
+ l1.2,0.1l1.4,0.1l1.4,0.1h0.1l-0.1-0.2l0,0v-0.4L345.5,317.8z M159.4,308.6l-1.8,0.1l-1.8,0.1l-1.8,0.1h-0.5h-0.9h-1.3h-0.8h-0.8
116
+ h-0.9h-1h-1h-1.1h-1.1l-1.1,0.1l-1.1,0.1h-0.2l-0.1,0.2l-0.4,0.5l-0.4,0.3h0.1h0.7h0.6h0.6h0.6h0.6h1.1h1.1l1.2-0.1l1.1-0.1
117
+ l1.2-0.1l1.2-0.1l1.2-0.1l1.2-0.1l1.2-0.1l2.4-0.2l2.4-0.2l2-0.2l-0.8-0.2L159.4,308.6z M219.2,306.9l-2,0.1l-1.6,0.1l0.2,0.1
118
+ l0.3,0.2l0.3,0.2l0.4,0.2l0.3,0.2l0.3,0.2l0.3,0.2l0.3,0.2h0.1h0.8l3,0.1l3,0.1l6,0.2l6,0.2l3.5,0.1l3.5,0.1l3.5,0.1h0.1h-0.2
119
+ l-0.3-0.1l-0.4-0.1l-0.4-0.1l-0.4-0.1l-0.1-0.1h-0.6l-2-0.1l-2-0.1l-2-0.1l-2-0.1l-2-0.1l-2-0.2l-2-0.2l-0.9-0.1l-0.9-0.1
120
+ l-0.9-0.1l-0.9-0.1l-1.8-0.2l-1.8-0.2l-1.8-0.2l-1.4-0.2H219.2z M288.8,304.3h-1.2h-0.8l1.2,0.1h0.2l2.5-0.1l2.4-0.1l0,0h-0.8
121
+ h-1.2h-1.2L288.8,304.3z"
122
+ />
123
+ <path
124
+ fill="#DCDDDE"
125
+ d="M582.2,247.8h2.8h1.4h1.4h1.4h1.4h1.4h0.7h0.7h0.7h0.7h0.7h0.7l0.7-0.1l0.7-0.1l0.7-0.1l0.7-0.1l0.7-0.1
126
+ l0.7-0.1l0.7-0.1l0.7-0.1l0.5-0.1l0.6-0.1l1.1-0.2l1.2-0.1l1.1-0.1l2-0.2l0.8-0.1h0.6l0.5,0.1l0.5,0.2l0.5,0.3l0.4,0.4l0.3,0.5
127
+ l0.2,0.5l0.1,0.6v0.6l-0.1,0.6l-0.2,0.5l-0.3,0.5l-0.4,0.4l-0.5,0.3l-0.5,0.2l-0.4,0.1h1.2h1.9l0.7-0.1l1.7-0.2l0.9-0.1l0.9-0.1
128
+ l0.8-0.1l0.9-0.1h0.5h0.5h0.5h0.5h0.5h0.5h0.5h0.5h0.5h0.5h0.5h0.5h0.4l0.4,0.1l0.9,0.1l0.9,0.2l0.9,0.2l0.5,0.1l0.4,0.1l0.4,0.1
129
+ l0.4,0.1l0.2,0.1l0.2,0.1h0.1l0.3,0.2l0.3,0.2h0.1l0,0h0.2h0.5h0.5h0.5l0.5,0.1l0.5,0.1l0.5,0.1l1.1,0.1l1.1,0.2l1,0.2l1,0.1
130
+ l0.9,0.1h0.4h0.4h0.3h0.4l0.9,0.1l0.9,0.1l0.9,0.1l0.9,0.1l0.9,0.1l0.9,0.1l0.9,0.1l0.9,0.1l0.9,0.1l0.9,0.1l1.8,0.3h0.1l1-0.1
131
+ l1.4-0.1l1.4-0.1l0.9-0.1l-0.4-0.2l-0.8-0.4l-0.2-0.1l-0.2-0.1l-0.2-0.2l-0.1-0.1l-0.2-0.2h-0.1l-0.2-0.3h-0.1l-0.3-0.5l0,0
132
+ l-0.1-0.3l-0.1-0.3l0,0l-0.1-0.4l-0.1-0.4l0,0l0.1-0.4l0.1-0.4l0,0l0.2-0.3l0.2-0.3l0,0l0.4-0.5l0,0l0.4-0.3h0.1l0.2-0.2l0.2-0.1
133
+ l0.2-0.1l0.3-0.1l0.4-0.1l0.4-0.1l0.4-0.1l0.4-0.1h0.4h0.4h0.4h0.4h0.4h0.4h0.8h0.8h0.8h0.8h0.7h0.7l0.6,0.1l0.7,0.1l0.7,0.1
134
+ l0.7,0.1l0.7,0.1l0.7,0.1l0.7,0.1l0.8,0.2h1.1h0.8h0.7h0.7h0.6l1.6,0.1l1.6,0.1l1.6,0.1l1.5,0.1l1.6,0.1l1.5,0.1l1.6,0.1l1.5,0.1
135
+ l3,0.3l2.6,0.2h0.3h1.8h2.2h1.1h1.1h1.1h1.1h1.1h1.1h1.1h1.1l1.1,0.1l1.1,0.1l1.1,0.1l1.2,0.1l0.4,0.1l0.5,0.1l0.5,0.1h0.1
136
+ l0.1-0.1l0.2-0.2h0.1l0.4-0.2h0.1l0.2-0.1l0.2-0.1l0.3-0.1l0.3-0.1h0.2h0.2h0.3h0.2h0.3h0.6h0.6l0.6,0.1l0.5,0.2l0.5,0.3l0.5,0.4
137
+ l0.4,0.4l0.2,0.5l0.2,0.6l0,0h0.2l0.6,0.2l0.6,0.1l1.2,0.1l1.8,0.1l3.6,0.2l1.8,0.1l1.7,0.1l1.8,0.1h0.9h0.8h0.1h0.1h0.1h0.1h0.3
138
+ h0.3l0.4-0.1l0.4-0.1l0.4-0.1l0.4-0.1l0.9-0.2l0.9-0.2l1-0.2l0.5-0.1l0.5-0.1l0.5-0.1l0.5-0.1l0.5-0.1l0.5-0.1h0.3h0.2h0.3h0.3
139
+ h0.2h0.3h0.3l0.4,0.1l0.3,0.1l0.3,0.1l0.4,0.1l0.4,0.2l0.2,0.1l0.2,0.1l0.1,0.1l0.2,0.2l0.1,0.1l0.2,0.2l0.1,0.1l0.2,0.2l0.1,0.1
140
+ l0.2,0.3l0.1,0.1l0.1,0.3l0.1,0.1l0.1,0.2l0.1,0.1l0.1,0.3l0.1,0.3l0.1,0.4l0.1,0.4v0.3v0.3v0.1l-0.1,0.4v0.1l-0.1,0.4v0.1
141
+ l-0.1,0.1h0.2h0.9h0.8h0.9h0.9h0.9h0.5h0.6h0.6l0.7,0.1l0.7,0.1l0.7,0.1l0.7,0.1l0.4,0.1l0.4,0.1l0.3,0.1l0.4,0.1l0.3,0.1l0.4,0.1
142
+ l0.4,0.1l0.4,0.1l0.2,0.1l0.2,0.1l0.2,0.1l0.3,0.2l0.2,0.2l0.1,0.1l0.2,0.2l0,0l0.2,0.3h0.1l0.2,0.3l0.5-0.2l0.9-0.3l0.9-0.3
143
+ l0.9-0.3l1.6-0.5l2-0.6l1.1-0.3l1.1-0.3l1.1-0.3l1.1-0.3l0.9-0.3l0.9-0.2l0.4-0.1l0.4-0.1l0.4-0.1l0.4-0.1h0.4h0.3h0.1h0.4h0.1
144
+ l0.3,0.1l0.3,0.1h0.1l0.4,0.2l0.4,0.2l0.3,0.3h0.1l0.4,0.4l0.2,0.5l0.2,0.5l0.1,0.5l0,0l-0.1,0.6l-0.1,0.5l-0.2,0.5h-0.1l-0.2,0.3
145
+ l-0.2,0.2h-0.1l-0.3,0.3l-0.1,0.1l-0.2,0.2l-0.4,0.2l-0.4,0.2l-0.6,0.3l-0.5,0.3l-0.5,0.3l-0.5,0.2l-0.6,0.2l-0.5,0.2l-0.6,0.2
146
+ l-0.5,0.2l-0.6,0.2l-0.6,0.2l-0.5,0.2l-0.6,0.2l-0.6,0.2l-0.6,0.2l-1.2,0.4l-1.2,0.4l-1.2,0.4l-1.2,0.3l-1.2,0.3l0.8,0.1h0.4h7.9
147
+ h4h3.9h1.9h1.2h1.5h1.5h0.8h0.8h0.8h0.9l0.9,0.1l0.9,0.1l0.8,0.1l0.9,0.1l0.9,0.1l0.8,0.1l0.9,0.1l0.8,0.1l0.8,0.1l0.4,0.1
148
+ l0.4,0.1l0.4,0.1l0.4,0.1l0.4,0.1l0.4,0.1l0.4,0.1l0.4,0.1l0.4,0.1l0.3,0.1l0.4,0.1l0.4,0.1l0.3,0.2l0.4,0.2l0.3,0.2l0.4,0.2
149
+ l0.3,0.2l0.3,0.3l0.2,0.2l0.2,0.2l0.2,0.3l0.1,0.2l0.2,0.3v0.1l0.1,0.3l0.1,0.1l0.1,0.5v0.1v0.6v0.1v0.3l-0.1,0.3v0.1l-0.1,0.3
150
+ l-0.2,0.3l0,0l-0.2,0.3l-0.2,0.3l0,0l-0.4,0.3l0,0l-0.4,0.3h-0.1l-0.3,0.1H804l-0.2,0.1l-0.2,0.1l-0.2,0.1h-0.2h-0.3h-0.4h-0.4
151
+ h-0.4h-0.4h-0.4h-0.4H800l-0.8-0.1l-0.9-0.1l-1.7-0.3l-0.8-0.1h-0.4H795h-0.3h-0.3h-0.2H794h-2.6h-2.5h-1.2h-1.2h-1.2h-1.2h-1.2
152
+ l-1.2-0.1H781h-0.6h-0.7h-0.6l-0.7-0.1l-0.7-0.1l-0.7-0.1l-0.7-0.1l-0.7-0.1l-0.7-0.1l-0.7-0.1l-0.7-0.1l-0.7-0.1l-0.7-0.1
153
+ l-1.4-0.2l-1.4-0.3l-1.5-0.3l-3.3-0.6h-0.2h-3h-4h-3.9h-4h-4h-2h-2h-0.8l-0.4,0.1l-0.7,0.2l-1.4,0.5l-1.4,0.5l-0.8,0.2l-0.7,0.3
154
+ l-0.8,0.2l-0.7,0.2l-0.8,0.2l-0.8,0.2l-0.8,0.2l-0.8,0.2l-0.8,0.2l-0.4,0.1l-0.4,0.1l-0.3,0.1l-0.3,0.1l-0.7,0.1l-0.7,0.1
155
+ l-0.7,0.1h-0.8H725h-0.4h-0.4h-0.4h-0.1l-0.7,0.2l-0.7,0.2l-0.7,0.2l-0.7,0.2l-0.7,0.2l-0.7,0.2l-0.7,0.1l-0.7,0.1l-0.7,0.1
156
+ l-0.7,0.1l-0.7,0.1l-0.7,0.1l-0.7,0.1l-0.7,0.1l-0.7,0.1l-0.7,0.1l-0.7,0.1l-0.7,0.1l-0.7,0.1l-1.3,0.2l-1.4,0.1l-1.4,0.1
157
+ l-1.4,0.1l-1.4,0.1l-1.4,0.1l-1.4,0.1h-1.4h-1.4h-1.3h-1.4h-1.4h-1.4H691h-1.3h-1.4H687h-1.4h-1.3l-1.2-0.1l-1.1-0.1l-1.2-0.1
158
+ h-0.6l-0.5-0.1l-0.6-0.1l-0.6-0.1l-0.6-0.1l-0.6-0.1l-0.6-0.1l-0.6-0.1l-0.6-0.1l-0.5-0.1l-0.5-0.1l-0.5-0.1l-1.4-0.2l-0.7-0.1
159
+ l-0.8-0.1l-0.8-0.2l-0.4-0.1l-0.4-0.1l-0.4-0.1l-0.4-0.1l-0.4-0.1l-0.4-0.1l-0.4-0.1l-0.4-0.2l-0.4-0.2l-0.2-0.2l-0.2-0.1
160
+ l-0.2-0.2l-0.2-0.1l-0.2-0.2l-0.1-0.1l-0.2-0.2l-0.1-0.1l-0.2-0.3l-0.1-0.1l-0.1-0.4l-0.1-0.1l-0.1-0.5v-0.1l-0.1-0.5v-0.1
161
+ l0.1-0.5v-0.1l0.1-0.5v-0.1l0.2-0.4l0.1-0.1l0.2-0.3l0.1-0.1l0.2-0.3l0.1-0.1l0.2-0.2l0.2-0.1l0.2-0.2l0.2-0.2l0.3-0.2l0.3-0.2
162
+ l0.3-0.2l0.3-0.2l0.3-0.2l0.3-0.2l0.3-0.2l0.3-0.1l0.3-0.1l0.4-0.1l0.7-0.3l0.7-0.3l0.7-0.2l0.7-0.2l0.7-0.2l0.7-0.2l0.7-0.2
163
+ l0.7-0.2l0.7-0.2l0.8-0.2l0.7-0.1l0.8-0.1l0.8-0.1l0.8-0.1l0.8-0.1l0.8-0.1l0.8-0.1h0.1v-0.1v-0.1l0.1-0.4V266l0.1-0.3v-0.1
164
+ l0.2-0.3v-0.1l0.1-0.1l-0.5-0.1l-0.8-0.1l-0.9-0.1l-0.8-0.2l-0.9-0.2l-0.8-0.2l-0.8-0.2l-0.8-0.2l-0.8-0.2l-0.6-0.2h-0.2h-0.5
165
+ h-0.5h-0.5l-0.9-0.1l-0.9-0.1l-0.8-0.1L670,263h-0.7l-0.9-0.1l-0.9-0.1l-0.9-0.1l-0.9-0.1l-0.9-0.1l-0.9-0.1h-0.1l-1.2,0.2
166
+ l-1.2,0.2l-1.2,0.2l-1.2,0.2l-1.3,0.2l-1.2,0.2l-1.2,0.2l-1.2,0.2l-0.6,0.1l-0.7,0.1l-0.6,0.1l-0.7,0.1l-0.6,0.1l-0.6,0.1h-0.7
167
+ H649h-0.6h-0.7h-0.6h-0.6h-0.6h-0.6h-0.6h-0.6h-0.6h-0.6h-0.6l-0.6-0.1l-0.5-0.1l-0.6-0.1l-0.6-0.1l-0.5-0.1l-0.6-0.1l-0.5-0.1
168
+ l-0.6-0.1l-0.5-0.1l-0.5-0.2l-0.5-0.2l-0.5-0.2l-0.6-0.2l-0.4-0.2l-3.7,0.5l-2.8,0.3l-2.7,0.3l-0.9,0.1l-0.9,0.1l-0.9,0.1
169
+ l-0.9,0.1l-0.8,0.1l-0.9,0.1l-0.9,0.1l-0.8,0.1h-0.8h-0.9h-0.8h-0.8l-1.6,0.1H612h-1.6h-1.6h-1.7h-1l-0.5,0.2l-0.7,0.3l-0.7,0.3
170
+ l-0.7,0.3l-0.7,0.3l-0.7,0.3l-0.7,0.3l-0.7,0.3l-0.7,0.3l-0.8,0.2l-0.7,0.2l-0.7,0.2l-0.8,0.2l-0.7,0.2l-0.8,0.2l-0.7,0.2
171
+ l-0.8,0.2l-0.8,0.2l-0.7,0.2l-0.8,0.2l-0.8,0.2l-0.8,0.2l-0.8,0.2l-0.8,0.2l-1.5,0.3l-1.5,0.3l-1.5,0.3l-0.7,0.1l-1.1,0.4
172
+ l-1.3,0.5l-1.3,0.5l-1.3,0.5l-1.3,0.5l-1.3,0.5l-1.3,0.5l-1.4,0.5l-1.4,0.5l-1.3,0.5l-0.7,0.2l-0.7,0.2l-0.7,0.2l-0.7,0.2
173
+ l-0.7,0.2l-0.7,0.2l-0.7,0.2l-0.7,0.2L564,278l-0.7,0.2l-0.7,0.2l-0.7,0.2l-0.7,0.2l-0.7,0.1l-0.4,0.1l-0.4,0.1l-0.9,0.2l-2.3,0.6
174
+ l-1.4,0.3l-0.7,0.2l-0.7,0.2l-0.7,0.2l-0.8,0.2l-0.8,0.2l-0.8,0.1l-0.8,0.1l-0.8,0.1l-0.8,0.1l-0.8,0.1l-0.8,0.1h-0.4h-0.4h-0.4
175
+ H545h-0.4h-0.4h-0.4h-0.4H543h-0.4h-0.4l-0.4-0.1l-0.4-0.1l-0.4-0.1l-0.4-0.1l-0.4-0.1l-0.4-0.1l-0.4-0.1l-0.4-0.2l-0.4-0.2
176
+ l-0.4-0.2l-0.4-0.2l-0.2-0.2l-0.2-0.2l-0.2-0.2l-0.2-0.2l-0.1-0.1l-0.2-0.3l-0.1-0.1l-0.2-0.3l-0.1-0.1l-0.2-0.4v-0.1l-0.1-0.5
177
+ l-0.1-0.1V277v-0.1v-0.5l0.1-0.1l0.1-0.5v-0.1l0.2-0.4l0.1-0.1l0.2-0.3l0.1-0.1l0.2-0.2l0.1-0.1l0.2-0.2l0.1-0.1l0.2-0.2l0.2-0.2
178
+ l0.2-0.1l0.2-0.1l0.2-0.1l0.4-0.2l0.4-0.2l0.4-0.1l0.5-0.1l0.4-0.1l0.5-0.1l0.4-0.1l0.5-0.1l0.9-0.2l0.9-0.2l0.9-0.2l0.9-0.2
179
+ l0.8-0.2l0.7-0.2l0.2-0.1l0.3-0.1l1.3-0.4l0.7-0.2l0.6-0.1l0.5-0.1l0.5-0.1l0.5-0.1l0.5-0.1l0.4-0.1l0.4-0.1l0.8-0.1l0.8-0.1
180
+ l0.7-0.1l1.4-0.2l0.7-0.1l0.7-0.1l0.8-0.1l0.9-0.2l1.1-0.2l1.2-0.2l1.3-0.2l1.3-0.2l1.4-0.2l1.4-0.2l1.4-0.2l1.4-0.2l2.9-0.4
181
+ l3-0.5l1.5-0.2l1.5-0.2l1.5-0.2h0.2l0.8-0.4l2.5-1.1l2.5-1.1l-0.1-0.1h-9.7h-0.2h-0.2h-0.4h-0.5h-0.6l-1.2,0.1l-0.7,0.1l-0.6,0.1
182
+ h-0.7h-0.5h-0.3h-0.3h-0.3h-0.3h-0.2l-0.5-0.1h-0.1l-0.3-0.1l-0.3-0.2l0,0l-0.3-0.2l-0.2-0.2h-0.1l-0.1-0.1l-0.5,0.1l-0.7,0.1
183
+ l-0.7,0.1l-0.7,0.1l-0.7,0.1l-0.7,0.1h-0.7h-0.7h-0.7H561h-0.7h-0.7h-0.7h-0.7h-0.7h-0.7l-0.7-0.1l-0.7-0.1l-0.7-0.1l-0.7-0.1
184
+ l-0.7-0.1l-0.7-0.1l-0.7-0.1l-0.7-0.1l-0.7-0.1l-0.7-0.1l-0.7-0.1l-0.7-0.1l-0.7-0.1l-0.7-0.1l-1-0.2l-2.4,0.6l-1.7,0.4l-1.8,0.4
185
+ l-2,0.4l-2,0.4L534,264l-1.1,0.2l-1.1,0.2l-1.1,0.2l-1.1,0.2l-1.1,0.2l-1.1,0.2l-1.1,0.2l-1.1,0.2l-1.1,0.2L523,266l-1.1,0.2
186
+ l-1.1,0.2l-1.1,0.1l-1.1,0.1l-1.1,0.1l-1.1,0.1l-1.1,0.1l-1.1,0.1l-1.1,0.1H512h-1.1h-0.5h-0.5h-0.5h-0.5h-0.5h-0.5h-0.5h-0.5
187
+ h-0.5h-0.5l-0.5-0.1l-0.5-0.1l-0.4-0.1l-0.5-0.1l-0.5-0.1l-0.5-0.1l-0.5-0.1l-0.4-0.1l-0.5-0.1l-0.4-0.1l-0.4-0.1l-0.5-0.1
188
+ l-0.4-0.1l-0.4-0.2l-0.4-0.2l-0.4-0.2l-0.4-0.2l-0.4-0.2l-0.4-0.2l-0.4-0.2l-0.4-0.2l-0.4-0.3l-0.4-0.3l-0.4-0.3l-0.3-0.3
189
+ l-0.3-0.3l-0.3-0.3l-0.3-0.3l-0.2-0.4l-0.3-0.4l-0.2-0.4l-0.2-0.4l-0.2-0.4l-0.2-0.4l-0.1-0.3l-0.1-0.3l-0.1-0.2v-0.3v-0.2
190
+ l-0.1-0.3l0.1-0.2v-0.3v-0.2l0.1-0.3v-0.2l0.1-0.3l0.1-0.1l0.1-0.3l0.1-0.1l0.2-0.3l0.1-0.1l0.2-0.2l0.2-0.2l0.3-0.3l0.3-0.3
191
+ l0.3-0.2l0.3-0.2l0.3-0.2l0.3-0.2l0.3-0.1l0.3-0.1l0.3-0.1l0.3-0.1l0.3-0.1l0.3-0.1l0.3-0.1l0.3-0.1l0.3-0.1l0.3-0.1l0.6-0.1
192
+ l0.6-0.1l0.7-0.1l0.6-0.1h0.6h0.6h0.5h0.3v-0.1l-0.1-0.1l-0.1-0.2l-0.1-0.3l-0.1-0.3v-0.3v-0.3v-0.3l0.1-0.3l0.1-0.3l0.1-0.3
193
+ l0.1-0.3l0.1-0.2l0.2-0.2l0.1-0.2l0.2-0.2l0.1-0.2l0.2-0.2l0.2-0.2l0.4-0.3l0.4-0.3l0.4-0.2l0.4-0.2l0.4-0.2l0.4-0.2l0.4-0.1
194
+ l0.4-0.1l0.4-0.1l0.5-0.1l0.5-0.1l0.5-0.1l0.5-0.1l0.5-0.1l0.5-0.1l0.6-0.1l0.6-0.1l0.7-0.1l0.7-0.1l0.7-0.1h0.7h0.6h0.6h0.6h0.6
195
+ h0.6h0.6h1.1h2.2h1.1h1.1h8.9h0.3h0.2h0.2h0.2h0.2h0.2h0.3h0.3l0.5-0.1l0.6-0.1l0.7-0.1l0.6-0.1l0.7-0.1l0.7-0.2l1.4-0.3l0.7-0.2
196
+ l0.7-0.2l0.7-0.1l0.7-0.1l0.7-0.1l0.4-0.1h0.4h0.4h0.4h0.4h0.4h0.4h0.4h0.4h0.4h0.4h0.4h0.4l0.4,0.1l0.4,0.1l0.4,0.1l0.4,0.1
197
+ l0.4,0.1l0.4,0.1l0.4,0.2l0.4,0.2l0.4,0.2l0.4,0.2l0.3,0.2l0.4,0.3l0.3,0.3l0.4,0.3l0.3,0.3l0.2,0.3l0.3,0.3l0.1,0.2l0.1,0.2
198
+ l0.1,0.2l0.1,0.2l0.1,0.2l0.1,0.2l0.1,0.2l0.1,0.2l0.1,0.2l0.1,0.2v0.2l0.5,0.1l1.5,0.2l1.4,0.2l0.7,0.1l0.6,0.1l0.6,0.1l0.5,0.1
199
+ l1,0.1l0.9,0.1l1,0.1l1,0.1l0.9,0.1h0.5l0,0l0.2-0.2l0.2-0.2l0.2-0.1l0.2-0.1l0.3-0.1l0.2-0.1l0.2-0.1l0.5-0.2l0.5-0.2l0.5-0.2
200
+ l0.5-0.2l0.6-0.1l0.5-0.1l0.6-0.1l0.5-0.1l0.6-0.1l0.6-0.1l0.6-0.1l0.6-0.1l0.6-0.1l0.5-0.1l0.6-0.1l0.5-0.1l0.5-0.1h0.5h0.5h0.5
201
+ h0.4h1.5L582.2,247.8z M689.3,272.3h-0.8h-0.8h-0.8h-0.8h-0.8l-0.8,0.1l-0.7,0.1l-0.8,0.1l-0.8,0.1l-0.7,0.1l-0.7,0.1l-0.7,0.1
202
+ l-0.7,0.1l-0.7,0.1l-0.7,0.1l-0.7,0.1l-0.7,0.1l-0.7,0.1l-0.5,0.1l0.4,0.1l0.5,0.1l0.5,0.1l0.5,0.1l0.5,0.1l0.5,0.1l0.5,0.1
203
+ l0.5,0.1h0.5l1.1,0.1l1.1,0.1l1.1,0.1h1.3h1.3h1.3h1.3h1.3h1.3h1.3h1.3h1.3h1.3h1.3h1.3l1.3-0.1l1.3-0.1l1.3-0.1l1.2-0.1l1.3-0.1
204
+ l1.3-0.1l1.3-0.1l0.6-0.1l0.7-0.1l0.7-0.1l0.6-0.1h0.2h-1.4h-1.5H706h-1.5H703h-1.5H700l-1.2-0.1l-1.2-0.1l-1.3-0.1h-0.7H695
205
+ l-0.7-0.1l-0.7-0.1l-0.7-0.1l-0.7-0.1l-0.7-0.1l-0.7-0.1l-0.7-0.1l-0.6-0.1l-0.5-0.1L689.3,272.3z M504.5,259h-0.4h-0.5h-0.5h-0.5
206
+ h-0.5h-0.5l-0.4,0.1l-0.5,0.1l-0.4,0.1h-0.2H500l0.2,0.1l0.1,0.1l0.2,0.1l0.2,0.1l0.2,0.1l0.2,0.1l0.2,0.1l0.2,0.1l0.2,0.1
207
+ l0.2,0.1l0.3,0.1l0.3,0.1l0.3,0.1l0.3,0.1l0.3,0.1l0.3,0.1l0.4,0.1l0.4,0.1l0.4,0.1l0.4,0.1l0.4,0.1l0.4,0.1h0.4h0.4h0.4h0.4h0.4
208
+ h0.4h0.5h0.4h0.5h0.4h0.5h0.5h0.9h1l1-0.1l1-0.1l1-0.1l1.1-0.1l1.1-0.1l1.1-0.1l1.1-0.1l1.1-0.1l1-0.1l-1-0.1l-1.1-0.1l-1.1-0.1
209
+ l-2.1-0.2l-2.1-0.3l-2.1-0.2l-1-0.1l-1-0.1l-1-0.1l-1-0.1l-1-0.1l-0.9-0.1h-0.2h-0.5h-0.7h-0.8L504.5,259L504.5,259z M624.9,258.1
210
+ l-0.1,0.2l1.5-0.2h0.1l0,0H624.9L624.9,258.1L624.9,258.1z M707.9,257.6l0.5,0.1l0.5,0.1l0.6,0.1l0.7,0.1l1.2,0.2l1.4,0.2h0.2
211
+ l0.3-0.1l0,0l-0.4-0.2l-0.4-0.2l0,0l-0.9-0.1l-2.3-0.1l-2-0.1h-0.2H707.9z"
212
+ />
213
+ </g>
214
+ <g transform="matrix(0.998358,0.0572833,-0.0572833,0.998358,15.545,-79.3702)">
215
+ <g>
216
+ <g>
217
+ <g transform="matrix(1,0,0,1,398.965,43.2222)">
218
+ <path
219
+ fill="#0096FF"
220
+ d="M73.8,141.4c0.7,0.2-1.1-1-1.5-1.6c-0.9-1.5,2.2-4.9,2.2-4.9c3.4-5.2,7.1-9.9,11-14.8
221
+ c1.8-2.2,2.9-7.9,5.5-6.6c2.4,1.2-12.2,20.2-13.7,21.9c-1.4,1.6-4.4,6.5-4.4,4.4c0-8.8,14.7-31.8,23-34.6
222
+ c1.9-0.6-1.5,3.8-2.7,5.5c-0.4,0.5-9.3,12.1-11.5,9.9c-1.4-1.4,1.7-7,2.2-7.7c4.6-7.2,10.6-13.6,17-19.2
223
+ c2.6-2.3,5.1-4.9,7.7-7.1c1.3-1.1,3.8-5,3.8-3.3c0,5-10.9,14.5-14.3,18.1c-1.6,1.7-3.8,6-5.5,4.4c-2.2-2.2,3.5-5.2,5.5-7.7
224
+ c5.4-6.7,11-13,17.6-18.7c2-1.7,5.3-4.6,7.7-6c2-1.2,6.5-6.5,5.5-4.4c-4.5,9-22.9,15.6-11,5.5c17.2-14.6,33.4-19.6,53.8-26.3
225
+ c11.7-3.9,17.5-13.2,31.3-10.4c6.4,1.3,14.9,1.8,20.9,3.8c7.3,2.4,14.8,8.8,22.5,8.8c1.3,0-2.6,0.2-3.8,0
226
+ c-2.5-0.4-4.9-1.3-7.1-2.2c-8.1-3.2-16.5-5-24.7-7.7c-0.7-0.2-1.5-7.1-1.1-7.1c1.3,0,3.6,3.6,5.5,3.8
227
+ c12.3,1.8,20.7,8.4,32.4,13.7c22.6,10.3,41.6,23.5,58.7,40.6c13.3,13.3,10.8,40,15.9,55.4c2.8,8.5,3.1,19,5.5,28.5
228
+ c1.2,4.7,4.1,11.7,2.2,17.6c-0.7,2-0.2,4.6-1.6,6c-1,1-11-1.2-12.6-1.6c-12.4-3.1-27.3-1.1-40.1-1.1
229
+ c-13.3,0-31.3,5.8-42.8,11.5c-5.8,2.9-15.5,0.6-21.9,2.7c-6.1,2-17.2-0.7-23-2.2s-12.2-0.5-18.1-1.6c-9.3-1.9-18.1-5.5-28-7.1
230
+ c-17.9-3-41,1-58.2,4.4c-4.6,0.9-10.8,3.8-15.4,3.8c-5.9,0-11.9-0.5-17.6-0.5c-0.9,0-8.8,1.5-8.8,0.5c0-6.2,10.5-16.6,12.6-23
231
+ c6.8-20.3,4-39.2,24.7-51.6c5.3-3.2,16.3-10.1,23-7.1c10.2,4.5-3.5,26.8-5.5,30.7c-1.7,3.4-3.8,6.5-5.5,9.9
232
+ c-0.3,0.7-5.8,12.5-6.6,14.3c-0.7,1.6-2.4,6-1.1,4.9c24.9-21.4,45.1-47,72.4-65.8c7-4.9,19.9-13.4,28-18.1
233
+ c2.2-1.3,8.3-5,7.1-2.7c-2.1,4.3-14.3,15-15.4,15.9c-16.6,15-33.5,29.5-51,43.3c-2.1,1.7-10.6,10.4-14.3,8.8
234
+ c-2.9-1.3,1.7-6.1,3.3-8.8c4-6.8,4-6.4,7.7-13.2c8.7-16.1,18.3-32.5,30.7-46.1c5.2-5.8,9.5-10.4,15.4-15.4
235
+ c1.4-1.2,5.4-4.6,4.9-2.7c-1.1,4.3-7.7,8.4-11,11.5c-13.9,13.2-21.5,20.4-36.2,32.9c-3.8,3.2-7.6,6.3-11.5,9.3
236
+ c-0.2,0.2-5.1,4.2-5.1,2c0-2.4,15-17.5,17.4-20c19.7-20.9,43.7-41.6,70.3-53.3c3.7-1.6,36.7-14.9,30.5,1.6
237
+ c-0.9,2.5-2.2,4.8-3.6,7.1c-1.4,2.5-3,4.9-4.7,7.2c-4.6,6.6-11.3,15.3-16.5,21.4c-0.3,0.3-14.5,16.8-19.2,21.9
238
+ c-12.9,14.2-25.4,29.2-39,42.8c-2.3,2.3,4.9-4.3,7.1-6.6c4.2-4.4,8.3-8.9,12.6-13.2c17-16.7,34.9-32.5,53.2-47.7
239
+ c2.5-2.1,10.2-9.4,15.4-10.4c2.3-0.5-1.7,4.5-3.1,6.3c-1.5,2-3,3.9-4.5,5.7c-4.9,5.7-14,15.5-19.2,20.9
240
+ c-15,15.4-30,30.7-45,46.1c-6.9,7.1-6.8,6.8-13.2,14.3c-0.4,0.5-1.7,1.8-1.1,1.6c8.5-1.7,13-11.5,19.2-17.6
241
+ c20.5-20.2,41.2-40.1,63.6-58.2c4.9-3.9,14.5-11.4,21.2-15.7c1.4-0.9,14.5-8.4,9.5,0.8c-1.4,2.6-3.1,4.9-4.8,7.3
242
+ c-2,2.7-4.1,5.4-6.1,8c-5.8,7.5-11.3,14.2-17.6,21.4c-10.5,11.9-24.6,23.5-31.8,37.9c-1,2,3.9-2.3,5.5-3.8
243
+ c3.3-3.1,6.2-6.6,9.3-9.9c14-14.7,28.3-28.8,44.4-41.2c3.5-2.7,7.2-5.3,11-7.7c2.6-1.7,9.6-6.3,8.8-3.3
244
+ c-2.5,9.5-15.1,18.9-21.4,25.2c-21.4,21.7-43.1,45.9-67.5,64.2c-2.2,1.6,3.5-4.2,5.5-6c4-3.7,7.9-7.5,12.1-11
245
+ c16-13.6,32.5-27.1,49.9-39c4.5-3,10.5-7.2,16-9.6c2-0.9,6.8-3,6.5-0.8c-1.6,12-23.9,29.7-30.7,36.8c-5.2,5.4-15.4,9-15.4,16.5
246
+ c0,1.3,2.5-0.6,3.7-1.1c4.1-1.7,4.3-2,8.3-5.2c9.8-7.6,19-16.1,29.2-23.3c2.8-2,5.8-3.7,8.8-5.5c1-0.6,3-2.8,3.3-1.6
247
+ c1.5,5.8-14,19.7-16.5,22.5c-2.3,2.7-4.5,5.4-6.6,8.2c-0.8,1.1-2.8,4.6-1.6,3.8c5.1-3.1,8.5-6.5,13.2-10.4c2.4-2,4.7-4.1,7.1-6
248
+ c1.8-1.5,3.5-3.1,5.5-4.4c14.7-9.8-6,15.4-6,18.7c0,2.5,4.7-1.8,6.6-3.3c2.9-2.3,7.3-7.4,11.9-5.9c3.6,1.2-2.4,11.3-0.9,13.6
249
+ c2.1,3.1,8.1-3.9,9.3-2.7c0.6,0.6,0.8,5.3,0,6c-2.1,2.1-5.8-4.9-7.1-4.9"
250
+ />
251
+ <path
252
+ fill="#0096FF"
253
+ d="M210.4,9.7h1l1,0.1l1.2,0.2l1.2,0.2h0.1l1.3,0.3l1.3,0.4h0.1l1,0.4l1,0.4l0.9,0.4l1.5,0.8l1.2,0.8l1,0.7
254
+ l0.5,0.4l0.3,0.1l0.8,0.2l0.8,0.2l0.8,0.2l0.8,0.2l0.8,0.2l0.8,0.2l0.8,0.3l0.8,0.3l0.7,0.3l0.7,0.3l0.7,0.3l0.7,0.3l0.7,0.3
255
+ l0.7,0.3l1.3,0.5l1.3,0.6l1.3,0.6l1.2,0.6l1.2,0.6L243,22l1.1,0.6l1.1,0.6l1,0.6l2,1.1l1.9,1l0.9,0.5l0.9,0.5l0.9,0.5l0.9,0.4
256
+ l0.7,0.3l1.3,0.5l1.4,0.7l1.4,0.7l0.1,0.1l0.9,0.4l1.2,0.5l1.2,0.5l1.1,0.6l1.1,0.6l1.1,0.6l1.1,0.6l1.1,0.6l1.1,0.6l1.1,0.6
257
+ l1.1,0.6l1.1,0.6l1.1,0.6l1.1,0.6l1.1,0.6l1.1,0.6l1.1,0.6l1.1,0.6l1.1,0.6l1.1,0.6l1.1,0.7l1.1,0.7l1.1,0.7l1.1,0.7l1.1,0.7
258
+ l1.1,0.7l1,0.7l1,0.7l1,0.7l1,0.7l1,0.7l1,0.7l1,0.7l1,0.7l1,0.7l1,0.7l1,0.7l1,0.8l1,0.8l1,0.8l1,0.8l1,0.8l1,0.8l1,0.8l1,0.8
259
+ l1,0.8l1,0.8l1,0.8l0.9,0.8L311,64l0.9,0.8l0.9,0.8l0.9,0.8l0.9,0.8l0.9,0.8l0.9,0.9l0.9,0.9l0.9,0.9l0.9,0.9l0.9,0.9l0.9,0.9
260
+ l0.9,0.9l0.9,0.9l0.5,0.6l0.6,0.6l0.6,0.6l0.5,0.6l0.5,0.6l0.5,0.6l0.5,0.6l0.5,0.6l0.5,0.7l0.5,0.6l0.5,0.6l0.4,0.7l0.4,0.7
261
+ l0.4,0.7l0.4,0.7l0.4,0.7l0.4,0.7l0.4,0.6l0.4,0.7l0.4,0.7l0.3,0.7l0.3,0.7l0.3,0.7l0.3,0.6l0.3,0.7l0.3,0.7l0.3,0.7l0.3,0.6
262
+ l0.3,0.7l0.3,0.6l0.2,0.6l0.3,0.7l0.4,1.2l0.4,1.3l0.4,1.3l0.4,1.3l0.4,1.2l0.3,1.2l0.3,1.2l0.3,1.2l0.3,1.2l0.3,1.2l0.2,1.2
263
+ l0.2,1.2l0.2,1.1l0.2,1.1l0.2,1.1l0.2,1.1l0.2,1.1l0.2,1.1l0.2,1.1l0.2,1.1l0.3,2.1l0.3,2l0.5,3.8l0.2,1.8l0.2,1.7l0.1,0.8
264
+ l0.1,0.8l0.1,0.8l0.1,0.7l0.1,0.7l0.1,0.7l0.1,0.6l0.1,0.6l0.1,0.6l0.1,0.5l0.1,0.5l0.1,0.5l0.1,0.4l0.1,0.4l0.1,0.3l0.2,0.5
265
+ l0.3,1l0.4,1.2l0.3,1.2l0.3,1.2l0.3,1.2l0.3,1.2l0.2,1.2l0.2,1.1l0.2,1.1l0.2,1.1l0.2,1.1l0.2,1l0.2,1l0.2,1l0.3,1.9l0.5,3.7
266
+ l0.3,1.7l0.1,0.8l0.1,0.8l0.1,0.8l0.1,0.7l0.1,0.7l0.1,0.7l0.1,0.7l0.1,0.6l0.1,0.6l0.1,0.6v0.1v0.2l0.2,0.7l0.6,2l0.4,1.2
267
+ l0.2,0.7l0.2,0.8l0.2,0.8l0.2,0.8l0.2,0.9l0.2,0.9l0.2,1l0.2,1l0.2,1.1l0.2,1.1l0.1,1.2l0.1,1.2l0.1,1.2v0.7v0.7v0.7v0.7v0.7
268
+ v0.7v0.7l-0.1,0.7l-0.1,0.8l-0.1,0.8l-0.1,0.8l-0.1,0.8l-0.2,0.8l-0.2,0.8l-0.2,0.8l-0.1,0.6l0,0l-0.1,0.9l-0.1,1l-0.1,0.8
269
+ l-0.2,0.8l-0.2,0.8l-0.2,0.9l-0.3,1l-0.4,1.1l-0.4,1.1l-0.5,1.2l-0.6,1.3l-0.7,1.3l-0.8,1.3l-0.9,1.3l-1.1,1.3l-0.7,0.7l-1,1
270
+ l-1,0.9h-0.1l-0.9,0.7l-0.9,0.7l-1,0.6h-0.1l-1.3,0.7l-1.3,0.7l-1,0.5l-1.9,0.7l-1.6,0.4l-1.4,0.3l-1.2,0.2l-1.2,0.1l-1.5,0.1
271
+ H326h-1.2l-1-0.1l-0.9-0.1l-0.9-0.1l-0.8-0.1l-0.8-0.1l-0.8-0.1l-0.8-0.1l-1.4-0.2l-1.4-0.2l-1.3-0.2l-1.2-0.2l-1.1-0.2l-1-0.2
272
+ l-0.9-0.2l-0.8-0.2l-0.5-0.1l-0.4-0.1l-0.3-0.1l-0.3-0.1l-0.3-0.1l-0.3-0.1l-0.3-0.1l-0.3-0.1l-0.4-0.1l-0.4-0.1h-0.4h-0.4H305
273
+ h-0.4h-0.4h-0.4h-0.4H303h-0.4h-0.5h-0.4h-1h-1h-1h-1.1h-1.1h-1.1h-1.1h-1.2h-1.2h-1.2l-2.5,0.1l-2.5,0.1l-2.6,0.1h-1.3h-1.4
274
+ H279h-1.4h-1.4h-1.3h0.1h-0.3h-0.3H274h-0.4h-0.4h-0.4h-0.4H272h-0.4l-0.5,0.1l-0.5,0.1l-0.5,0.1l-0.5,0.1l-0.5,0.1l-0.5,0.1
275
+ l-0.5,0.1l-0.5,0.1l-0.5,0.1l-0.5,0.1l-0.5,0.1l-0.5,0.1l-0.5,0.1l-0.6,0.1l-0.6,0.1l-0.6,0.1l-0.6,0.1l-0.6,0.1l-0.6,0.2
276
+ l-0.6,0.2l-0.6,0.2l-0.5,0.2l-1.2,0.3l-1.2,0.4l-1.2,0.4l-1.1,0.4l-1.1,0.4l-1.1,0.4l-1.1,0.4l-1.1,0.4l-1.1,0.4l-1,0.4l-1,0.4
277
+ l-1,0.4l-0.9,0.4l-0.9,0.4l-0.8,0.4l-1,0.5l-0.7,0.3l-0.9,0.4l-0.9,0.4l-0.9,0.3l-0.8,0.3l-0.9,0.3l-0.8,0.2l-0.8,0.2l-0.8,0.2
278
+ l-0.8,0.2l-0.7,0.2l-0.7,0.1l-0.7,0.1l-0.7,0.1l-0.7,0.1l-0.7,0.1l-1.2,0.1l-1.2,0.1l-1.1,0.1l-1.1,0.1h-1h-1H223h-0.8h-1.5
279
+ h-1.3h-0.5h-0.5H218h-0.3h-0.3l0,0h-0.1l-0.9,0.3l-0.9,0.2l-0.9,0.2l-0.9,0.2l-0.8,0.2l-0.8,0.1l-0.8,0.1l-0.8,0.1l-0.8,0.1
280
+ l-0.7,0.1l-0.7,0.1h-0.7h-0.7h-0.7h-0.7h-0.7h-0.7h-1.2l-1.3-0.1l-1.2-0.1l-1.2-0.1l-1.2-0.1l-1.1-0.1l-1.1-0.2l-1.1-0.2
281
+ l-1.1-0.2l-1-0.2l-1-0.2l-1-0.2l-1-0.2l-0.9-0.2l-0.9-0.2l-1.7-0.4l-1.6-0.4l-1.4-0.3l-1.1-0.3h-0.1l0,0h-0.1h-0.1h-0.1h-0.2
282
+ h-0.2H181h-0.3h-0.3h-0.3h-0.3h-0.9h-1h-1.2h-1.3l-1.4-0.1h-0.8h-0.8l-0.8-0.1l-0.9-0.1l-0.9-0.1l-1-0.1l-1-0.1l-1-0.1
283
+ l-1.1-0.2l-1-0.2l-1.2-0.2l-1.1-0.2l-1.1-0.2l-1.1-0.3l-1.1-0.3l-1-0.3l-1-0.3l-1-0.3l-1.9-0.5l-1.9-0.5l-3.5-1l-1.6-0.5
284
+ l-1.6-0.5l-0.7-0.2l-0.8-0.2l-0.7-0.2l-0.7-0.2l-0.7-0.2l-0.7-0.2l-0.7-0.2l-0.7-0.1l-0.7-0.1l-0.6-0.1l-0.6-0.1l-0.6-0.1
285
+ l-0.5-0.1l-0.5-0.1l-0.6-0.1l-0.6-0.1l-0.6-0.1l-0.6-0.1l-0.6-0.1h-0.6h-0.7h-0.7h-0.7H130h-0.7h-0.7h-0.7h-0.7h-0.7h-0.8h-0.8
286
+ h-0.8h-0.8h-0.8h-0.8h-0.8h-0.8l-0.8,0.1l-0.8,0.1l-0.8,0.1l-0.8,0.1l-0.8,0.1l-0.8,0.1l-0.8,0.1l-0.8,0.1l-0.8,0.1l-1.7,0.2
287
+ l-1.7,0.2l-1.7,0.2l-1.7,0.2l-1.7,0.3l-1.7,0.3l-1.7,0.3l-1.7,0.3l-1.7,0.3l-1.7,0.3l-1.6,0.3l-1.6,0.3l-1.6,0.3l-1.6,0.3
288
+ l-1.5,0.3h-0.1l0,0h-0.1h-0.2l-0.2,0.1l-0.2,0.1l-0.7,0.2l-0.8,0.2l-0.9,0.3l-1,0.3l-1.2,0.4l-1.2,0.4l-0.7,0.2l-0.7,0.2
289
+ l-0.8,0.2l-0.8,0.2l-0.8,0.2l-0.9,0.2l-0.9,0.2l-1,0.2l-1,0.2l-1.1,0.2l-1.1,0.1l-1.2,0.1l-1.2,0.1H68h-1.5h-1.3h-1.3h-1.3
290
+ h-1.2l-1.2-0.1l-2.3-0.1l-2.2-0.1h-1h-1h-0.9h-0.9h-0.3l-1.3,0.2l-0.9,0.1l-1,0.1l-1.1,0.1l-1.2,0.1l-0.7,0.1h-0.7h-0.8H43
291
+ h-1.1l-1.3-0.1l-1.7-0.2l-2-0.4l-1.8-0.5l-0.8-0.3l-1-0.4l-1-0.4h-0.1l-1.3-0.6l-1.2-0.7h-0.1l-1.1-0.7l-1.1-0.8l-1-0.8l0,0
292
+ l-1.2-1.1l-1.1-1.2l-1-1.2l0,0l-0.9-1.2l-0.8-1.3l-0.7-1.3l-0.6-1.4l0,0l-0.6-1.5l-0.5-1.6l-0.4-1.6l-0.3-1.6l0,0l-0.1-1.2
293
+ l-0.1-1.2v-1.2l0-0.9l0.1-1.4l0.2-1.3l0.2-1.3l0.2-1.2l0.3-1.1l0.3-1.1l0.3-1l0.3-0.9l0.3-0.9l0.3-0.9l0.3-0.8l0.3-0.8l0.3-0.7
294
+ l0.4-0.7l0.3-0.7l0.3-0.7l0.3-0.6l0.3-0.6l0.4-0.6l0.7-1.1l0.7-1.1l0.7-1l0.7-1l0.6-0.9l0.6-0.9l1.1-1.6l1.1-1.5l0.5-0.7
295
+ l0.4-0.6l0.4-0.6l0.3-0.5l0.3-0.4l0.2-0.4l0,0l0.2-0.5l0.2-0.7l0.2-0.7l0.2-0.7l0.2-0.7l0.2-0.7l0.2-0.8l0.2-0.8l0.2-0.8
296
+ l0.2-0.8l0.2-0.8l0.4-1.7l0.4-1.7l0.8-3.6l0.4-1.9l0.2-1l0.2-1l0.2-1l0.2-1l0.3-1l0.3-1.1l0.3-1.1L38,152l0.3-1.1l0.3-1.1
297
+ l0.4-1.1l0.4-1.1l0.4-1.2l0.4-1.2l0.5-1.2l0.5-1.2l0.5-1.2l0.5-1.2l0.3-0.7l0.3-0.6l0.3-0.6l0.3-0.6l0.3-0.6l0.3-0.6l0.3-0.6
298
+ l0.3-0.6l0.4-0.6l0.4-0.6l0.4-0.6l0.4-0.6l0.4-0.6l0.4-0.6l0.4-0.6l0.4-0.6l0.4-0.6l0.4-0.6l0.5-0.6l0.5-0.6l0.5-0.6l0.5-0.6
299
+ l0.5-0.6l0.5-0.6l0.5-0.6v-0.1v-0.1l0.4-1l0.4-0.9l0.4-0.9l0.4-0.9l0.4-0.9l0.4-0.9l0.4-0.9l0.5-0.9l0.5-0.9l0.5-0.9l0.5-0.9
300
+ l0.5-0.9l0.5-0.9l0.5-0.9l0,0l0.2-0.7l0.3-0.9l0.3-0.8l0.3-0.8l0.3-0.7l0.3-0.7l0.3-0.7l0.5-1.1l0.5-1l0.5-0.9l0.4-0.8l0.4-0.8
301
+ l0.4-0.8l0.5-0.8l0.7-1.1l0.6-0.9l0.6-0.9l0.6-0.9l0.6-0.9l0.6-0.9l0.6-0.8l0.6-0.8l0.6-0.8l0.6-0.8l0.7-0.8l0.7-0.8l0.7-0.8
302
+ l0.7-0.8l0.7-0.8l0.7-0.8l0.7-0.8l0.7-0.7l0.7-0.7l0.7-0.7l0.7-0.7l0.7-0.7l0.7-0.7l0.7-0.7l0.7-0.7l0.7-0.7l0.7-0.7l0.7-0.7
303
+ l0.7-0.6l0.7-0.6l0.7-0.6l0.6-0.6l0.4-0.3l0.3-0.3l0.3-0.3l0.4-0.3l0.9-0.8l0.9-0.9l1-1l0.2-0.1l0.2-0.3l0.6-0.7l0.6-0.7
304
+ l0.7-0.7l0.7-0.7l0.1-0.1l0.3-0.6l0.5-1l0.6-1l0.8-1.3l0.9-1.3l0.8-1.1L97,62l0.8-0.9l0.8-0.8l0.8-0.7l0.8-0.7l0.8-0.7l0.8-0.7
305
+ l0.8-0.7l1-0.8l1-0.8l1-0.8l1-0.8l1-0.8l1-0.7l1-0.7l1-0.7l1-0.7l1-0.7l1-0.7l1-0.7l1-0.7l1-0.6l1-0.6l1-0.6l1-0.6l1-0.6l1-0.6
306
+ l1-0.6l1-0.6l1-0.5l1-0.5l1-0.5l1-0.5l1-0.5l1-0.5l1-0.5l1-0.5l1-0.5l1-0.4l1-0.4l1-0.4l1-0.4l1-0.4l1-0.4l1-0.4l1-0.4l1-0.4
307
+ l1-0.4l1.9-0.7l1.9-0.7l1.9-0.7l1.9-0.7l1.9-0.7l1.9-0.7l1.9-0.6l1.9-0.6l3.7-1.2l3.7-1.2l0.2-0.1l0.2-0.1l0.2-0.1l0.2-0.1
308
+ l0.2-0.1l0.2-0.1l0.2-0.1l0.2-0.1l0.2-0.1l0.2-0.1l0.2-0.1l0.3-0.1l0.3-0.2l0.3-0.1l0.7-0.4l0.7-0.4l0.8-0.4l1.7-1l1-0.6
309
+ l1.1-0.6l1.1-0.6l0.7-0.4l0.6-0.3l0.7-0.3l0.7-0.3l0.7-0.4l0.7-0.3l0.8-0.4l0.8-0.3l0.8-0.3l0.9-0.3l0.9-0.3l0.9-0.3l0.9-0.3
310
+ l0.9-0.3l1-0.3l1-0.3l1-0.2l1-0.2l1.1-0.2l1.1-0.2l1.1-0.2l1.1-0.1l1.1-0.1l1.2-0.1h0.6h0.1l1.4-0.8l1.4-0.7l1.5-0.6l1.5-0.5
311
+ l1.5-0.4l0,0l1.6-0.3l1.6-0.2l1.6-0.1L210.4,9.7z M55.5,120.7l-0.1,0.1L55.5,120.7L55.5,120.7z"
312
+ />
313
+ </g>
314
+ <g transform="matrix(1,0,0,1,400.214,44.558)">
315
+ <path
316
+ fill="#E2F0FD"
317
+ d="M184.1,73.1l1.4,0.1l1.3,0.2l1,0.2l0.9,0.2l0.9,0.3l0.9,0.3l0.9,0.4l1,0.5l1,0.5l1,0.6l1,0.7l0.9,0.8
318
+ l0.9,0.9l0.9,0.9l0.8,1l0.7,1.1l0.7,1.1l0.6,1.1l0.5,1.1l0.4,1l0.3,0.9l0.2,0.7l0.2,0.7l0.2,0.7l0.1,0.7l0.1,0.7l0.1,0.7
319
+ l0.1,0.7l0.1,0.7l0.1,0.7V94v0.7v0.7v0.7v0.7v0.7l-0.1,0.7l-0.1,0.7l-0.1,0.7l-0.1,0.7l-0.1,0.7l-0.1,0.6l-0.1,0.6l-0.2,0.6
320
+ l-0.2,0.6L202,104l-0.2,0.6l-0.2,0.6l-0.2,0.6l-0.2,0.6l-0.2,0.5l-0.2,0.6l-0.2,0.5l-0.2,0.5l-0.2,0.5l-0.3,0.6l-0.5,0.9
321
+ l-0.5,1l-0.5,0.9l-0.5,0.9l-0.6,0.9l-0.6,0.9l-0.6,0.8l-0.6,0.8l-0.6,0.8l-0.6,0.8l-0.6,0.7l-0.6,0.7l-0.6,0.7l-0.6,0.7
322
+ l-0.6,0.7l-0.6,0.7l-0.6,0.6l-0.6,0.6l-0.6,0.6l-0.6,0.6l-0.6,0.6l-0.6,0.6l-0.6,0.6l-0.6,0.6l-1.1,1l-1.1,1l-1.1,1l-1.9,1.7
323
+ l-1.7,1.5l-0.7,0.6l-0.6,0.6l-0.5,0.5l-0.2,0.2l-0.2,0.2l-0.4,0.4l-0.5,0.4l-0.5,0.4l-0.5,0.4l-0.5,0.4l-0.5,0.3l-0.5,0.3
324
+ l-0.5,0.3l-0.5,0.3l-0.6,0.3l-0.6,0.2l-0.6,0.2l-0.6,0.2l-0.6,0.2l-0.6,0.2l-0.6,0.1l-0.6,0.1l-0.6,0.1l-0.6,0.1l-0.6,0.1h-0.6
325
+ h-0.6l0,0l-0.5,0.3l-0.9,0.4l-0.8,0.4l-0.9,0.3l-0.9,0.3l-0.9,0.3l-0.9,0.3l-1,0.2l-1,0.2l-1,0.2l-1,0.1l-1,0.1h-1h-1.1h-1.1
326
+ l-1.1-0.1l-1-0.1l-1-0.2l-1-0.2l-1-0.3l-1-0.3l-1-0.4l-0.9-0.4l-0.9-0.4l-0.9-0.5l-0.8-0.5l-0.8-0.5l-0.8-0.5l-0.7-0.5
327
+ l-0.7-0.6l-0.7-0.6l-0.6-0.6l-0.6-0.6l-0.6-0.6l-0.3-0.4l-1-0.2l-1.1-0.3l-1.1-0.4l-1.1-0.4l-1-0.5l-0.9-0.5l-0.9-0.5l-0.9-0.6
328
+ l-0.8-0.6l-0.7-0.6l-0.7-0.6l-0.6-0.6l-0.6-0.6l-0.5-0.6l-0.5-0.6l-0.5-0.6l-0.4-0.6l-0.4-0.6l-0.4-0.6l-0.4-0.6l-0.5-0.9
329
+ l-0.5-1l-0.4-1l-0.4-0.9l-0.3-0.9l-0.3-0.9l-0.3-0.9l-0.2-0.8l-0.2-0.8l-0.2-0.8l-0.2-0.8l-0.2-0.8l-0.1-0.8l-0.1-0.7l-0.1-0.7
330
+ l-0.1-0.7l-0.1-0.7l-0.1-0.7l-0.1-0.7l-0.1-0.7l-0.1-0.7v-0.7v-0.7v-0.7l-0.1-1.2v-1.2l0-1.2V101v-1.1l0.1-1.1v-0.6l0.1-0.6
331
+ l0.1-0.6l0.1-0.6l0.1-0.7l0.1-0.8l0.2-1l0.4-1.4l0.3-0.8l0.2-0.5l0.2-0.5l0.2-0.5l0.2-0.5l0.3-0.5v-0.1l0.3-0.5l0.3-0.5
332
+ l0.3-0.5l0.4-0.5l0.4-0.5l0.4-0.5l0.4-0.5l0.4-0.4l0.4-0.4l0.5-0.4l0.5-0.4l0.5-0.4l0.5-0.4l0.5-0.3l0.5-0.3l0.5-0.3l0.5-0.3
333
+ l0.5-0.3l0.6-0.2l0.6-0.2l0.6-0.2l0.6-0.2l0.6-0.2l0.6-0.2l0.6-0.1l0.6-0.1l0.6-0.1h0.4l0.3-0.2l0.5-0.4l0.5-0.4l0.5-0.3
334
+ l0.5-0.3l0.5-0.3l0,0l0.5-0.3l0.5-0.3l0.5-0.3l0.6-0.2l0.6-0.2l0.6-0.2l0.6-0.2l0.6-0.2l0.6-0.1l0.6-0.1l0.6-0.1l0.6-0.1
335
+ l0.6-0.1h0.6h0.6h0.6h0.6h0.6l0.6,0.1l0.6,0.1l0.6,0.1l0.6,0.1l0.6,0.1l0.6,0.2l0.6,0.2l0.6,0.2l0.6,0.2l0.6,0.2l0.3,0.2
336
+ l0.3-0.3l0.5-0.5l0.5-0.5l0.6-0.5l0.6-0.5l0.7-0.5l0.7-0.5l0.8-0.6l0.9-0.6l1-0.6l1.1-0.6l1.2-0.6l1.3-0.5l1.2-0.4l1.1-0.3
337
+ l1.2-0.2l1.2-0.2l1.3-0.1h1.3h1.4l1.4,0.1l1.4,0.2l1.4,0.3l1.5,0.5l1.4,0.6l1.3,0.7l1.3,0.8l0.1,0.1l0.6-0.1l1-0.1l1.1-0.1h1.2
338
+ L184.1,73.1z"
339
+ />
340
+ </g>
341
+ <g transform="matrix(1,0,0,1,400.214,44.558)">
342
+ <path
343
+ fill="#E2F0FD"
344
+ d="M104.3,122.6h0.2h0.2h0.2h0.2h0.1h0.2h0.2h0.2h0.2h0.2h0.1h0.2h0.2l0.2,0.1l0.2,0.1l0.2,0.1l0.2,0.1l0,0
345
+ l0.2,0.1l0.2,0.1l0.2,0.1l0.2,0.1l0.2,0.1l0.2,0.1l0.1,0.1l0,0l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1
346
+ l0.1,0.1l0,0l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.2l0.1,0.2l0.1,0.2l0.1,0.2l0,0l0.1,0.2l0.1,0.2l0.1,0.2l0.1,0.2l0.1,0.2
347
+ l0.1,0.2v0.2l0,0v0.2v0.2v0.2v0.2v0.2v0.2l0,0.3v0.5v0.4l-0.1,0.6l-0.1,0.6l-0.1,0.6l-0.1,0.6l-0.1,0.6l-0.1,0.6l-0.2,0.6
348
+ l-0.2,0.6l-0.2,0.6l-0.2,0.6l-0.2,0.6l-0.2,0.6l-0.2,0.6l-0.2,0.6l-0.2,0.6l-0.2,0.6l-0.2,0.6l-0.2,0.5l-0.3,0.5l-0.3,0.5
349
+ l-0.3,0.5l-0.3,0.5l-0.3,0.5l-0.3,0.5l-0.3,0.5l-0.3,0.5l-0.3,0.5l-0.3,0.5l-0.4,0.5l-0.4,0.4l-0.2,0.3l-0.2,0.2l-0.3,0.3
350
+ l-0.3,0.3l-0.3,0.3l-0.4,0.3l-0.4,0.3l-0.4,0.3l-0.5,0.2l-0.5,0.2l-0.3,0.1l-0.2,0.1H100h-0.2h-0.1h-0.2h-0.2h-0.2H99h-0.2
351
+ h-0.1h-0.1h-0.2h-0.1h-0.2H98l-0.2,0.1l-0.4,0.2l-0.5,0.2l-0.5,0.2l-0.6,0.2l-0.6,0.2l-0.4,0.1h-0.2h-0.2h-0.2H94h-0.2h-0.2
352
+ h-0.2h-0.2H93h-0.2h-0.2h-0.2l-0.4-0.1l-0.5-0.1l-0.4-0.1l-0.4-0.1l-0.4-0.1l-0.4-0.2l-0.3-0.2l-0.3-0.2l-0.3-0.2l-0.3-0.2
353
+ l-0.3-0.3l-0.5-0.4l-0.4-0.5l-0.4-0.5l-0.4-0.5l-0.3-0.5l-0.3-0.6l-0.3-0.6l-0.2-0.6l-0.2-0.6l-0.1-0.6l-0.1-0.6v-0.6v-0.6
354
+ v-0.6l0.1-0.5l0.1-0.5l0.1-0.5l0.1-0.5l0.2-0.5l0.2-0.4l0.2-0.4l0.2-0.4l0.2-0.4l0.2-0.4l0.2-0.3l0.2-0.3l0.2-0.3l0.2-0.3
355
+ l0.2-0.3l0.2-0.3l0.2-0.3l0.2-0.3l0.2-0.3l0.5-0.5l0.5-0.5l0.5-0.5l0.5-0.5l0.5-0.4l0.4-0.4l0.4-0.4l0.4-0.4l0.8-0.6l0.6-0.5
356
+ l0.5-0.4l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1l0.3-0.2l0.8-0.6l0.5-0.4l0.6-0.4l0.6-0.4l0.7-0.4l0.7-0.4l0.4-0.2
357
+ l0.4-0.2l0.4-0.2l0.4-0.2l0.4-0.2l0.4-0.2l0.5-0.2l0.6-0.2l0.4-0.1l0.4-0.1l0.5-0.1L104.3,122.6z"
358
+ />
359
+ </g>
360
+ <g transform="matrix(1,0,0,1,400.214,44.558)">
361
+ <path
362
+ fill="#E2F0FD"
363
+ d="M77.7,183.2h0.2h0.2h0.2h0.1h0.2h0.2H79l0.3,0.1l0.5,0.1l0.4,0.1l0.4,0.1l0.4,0.1l0.6,0.2l0.6,0.3l0.7,0.3
364
+ l0.7,0.3l0.7,0.4l0.7,0.4l0.8,0.4l0.8,0.4l0.8,0.4l0.8,0.4l0.8,0.5l1.7,0.9l1.6,0.9l1.6,0.9l1.4,0.9l1.3,0.8l1.1,0.7l0.5,0.3
365
+ l0.4,0.3l0.4,0.3l0.4,0.3l0.3,0.2l0.2,0.1l0.2,0.1l0.2,0.1l0.1,0.1l0,0l0.2,0.2l0.2,0.2l0.2,0.2l0.1,0.2l0.1,0.2l0.1,0.2
366
+ l0.1,0.2l0.1,0.2l0.1,0.2l0,0l0.1,0.2l0.1,0.2l0.1,0.2l0.1,0.3v0.3v0.3v0.3v0.3v0.3v0.3v0.3v0.3v0.3l-0.1,0.2l-0.1,0.3
367
+ l-0.1,0.2l-0.1,0.2l-0.1,0.2l-0.1,0.2l-0.1,0.2l-0.1,0.3l-0.2,0.3l-0.1,0.2l-0.1,0.1l-0.1,0.1v0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1
368
+ l0,0l-0.1,0.1l-0.1,0.1l-0.1,0.1H100l-0.2,0.1l-0.2,0.1l-0.2,0.1l-0.3,0.2l-0.5,0.3l-0.3,0.1l-0.2,0.1l-0.2,0.1l-0.2,0.1
369
+ l-0.3,0.1l-0.5,0.1l-0.5,0.1h-0.3h-0.2h-0.2h-0.2h-0.1h-0.2H95h-0.2h-0.4l-0.6-0.1l-0.5-0.1l-0.5-0.1l-0.4-0.1l-0.4-0.1
370
+ l-0.4-0.1l-0.6-0.2l-0.5-0.2l-0.4-0.2H90l-0.8,0.1l-0.8,0.1l-0.8,0.1l-0.9,0.1l-0.9,0.1h-0.9h-1h-1h-1h-1h-0.5h-0.5h-0.5h-0.5
371
+ h-0.5h-0.5l-0.5-0.1l-0.5-0.1l-0.5-0.1l-0.5-0.1l-0.5-0.1l-0.5-0.1l-0.5-0.1l-0.5-0.1l-0.5-0.1l-0.5-0.1l-0.5-0.1l-0.5-0.1
372
+ l-0.5-0.2l-0.5-0.2l-0.5-0.2l-0.5-0.2l-0.5-0.2l-0.5-0.2l-0.5-0.2l-0.5-0.2l-0.5-0.3l-0.5-0.3l-0.5-0.3l-0.5-0.3l-0.5-0.4
373
+ l-0.5-0.4l-0.5-0.4l-0.5-0.4l-0.4-0.4l-0.2-0.3l-0.2-0.2l-0.2-0.3l-0.2-0.3l-0.2-0.3l-0.2-0.3l-0.2-0.3l-0.2-0.3l-0.2-0.3
374
+ l-0.2-0.3l-0.2-0.4l-0.2-0.4l-0.1-0.5l-0.1-0.5l-0.1-0.5v-0.5v-0.5v-0.5l0.1-0.5l0.1-0.5l0.2-0.5l0.1-0.3l0.1-0.2l0.1-0.2
375
+ l0.1-0.2l0.1-0.1l0.1-0.2l0.1-0.2l0.1-0.2l0.1-0.1l0.1-0.2l0.1-0.2l0.1-0.2l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1l0.3-0.3l0.5-0.4
376
+ l0.4-0.3l0.4-0.3l0.4-0.2l0.4-0.2l0.4-0.2L66,185l0.4-0.1l0.4-0.1l0.4-0.1l0.3-0.1l0.4-0.1l0.7-0.2l0.7-0.1l0.7-0.1l0.7-0.1
377
+ l0.7-0.1l0.7-0.1l0.6-0.1h0.6h0.6h0.6h0.4l0.1-0.1l0.2-0.1l0.2-0.1l0.2-0.1h0.1l0.2-0.1l0.2-0.1l0.2-0.1h0.1l0.2-0.1h0.2H77
378
+ l0.3-0.1l0.6-0.1L77.7,183.2z M82.6,187.1L82.6,187.1h-0.1H82.6z M72.7,185.7L72.7,185.7L72.7,185.7L72.7,185.7z"
379
+ />
380
+ </g>
381
+ <g transform="matrix(1,0,0,1,400.214,44.558)">
382
+ <path
383
+ fill="#0065FF"
384
+ d="M154.3,188.6l1.6-0.1l1.5-0.1l1.5-0.1h0.7h0.7h0.6l0.6-0.1h0.6l0.6-0.1l0.5-0.1l0.6-0.1l3.9-0.6l2-0.3
385
+ l2-0.3l2.1-0.3l2.1-0.3l2.1-0.3l2.1-0.3l2.1-0.4l2.1-0.4l2.1-0.4l2.1-0.4l2.1-0.4l1-0.2l1.1-0.2l1.1-0.2l1-0.2l1-0.2l1-0.2
386
+ l1-0.2l1-0.2l1-0.2l1-0.3l1-0.3l1-0.3l1-0.3l1-0.3l1-0.3l1-0.3l1-0.3l1-0.3l0.9-0.3l0.9-0.3l0.9-0.3l0.9-0.3l0.9-0.3l0.9-0.3
387
+ l0.9-0.3l0.9-0.3l0.8-0.3l0.8-0.3l0.8-0.3l0.8-0.3l0.8-0.3l0.8-0.3l0.7-0.3l0.7-0.3l0.7-0.4l0.7-0.3l0.7-0.4l0.7-0.4l0.8-0.5
388
+ l0.8-0.5l0.8-0.5l0.8-0.5l0.8-0.5l0.8-0.5l0.8-0.5l0.8-0.6l0.8-0.6l0.8-0.6l0.8-0.6l0.8-0.6l0.8-0.6l0.8-0.6l0.8-0.7l0.8-0.7
389
+ l0.8-0.7l0.8-0.7l0.8-0.7l0.8-0.7l0.8-0.7l0.8-0.7l0.8-0.7l0.8-0.8l0.8-0.8l0.8-0.8l0.8-0.8l0.8-0.8l0.8-0.8l0.8-0.8l0.8-0.8
390
+ l0.8-0.8l0.8-0.8l0.8-0.8l1.7-1.7l1.6-1.7l1.6-1.7l1.6-1.7l1.6-1.8l3.3-3.5l3.3-3.5l1.7-1.8l1.7-1.8l1.7-1.8l1.7-1.8l1.7-1.7
391
+ l0.9-0.9l0,0v-0.2l0.1-0.2l0.1-0.2l0.1-0.2l0.1-0.3l0.1-0.3l0.1-0.3l0.1-0.3l0.1-0.3l0.1-0.7l0.1-0.8l0.1-0.8l0.1-0.9l0.1-0.9
392
+ l0.3-1.9l0.3-2l0.1-1.1l0.2-1.1l0.2-1.1l0.2-1.2l0.2-1.2l0.1-0.7l0.1-0.6l0.1-0.6l0.1-0.7l0.2-0.6l0.2-0.7l0.2-0.7l0.2-0.7
393
+ l0.2-0.7l0.2-0.7l0.2-0.6l0.2-0.6l0.2-0.6l0.2-0.6l0.2-0.5l0.2-0.5l0.3-0.5l0.3-0.5l0.3-0.5l0.3-0.5l0.3-0.5l0.3-0.5l0.3-0.5
394
+ l0.3-0.5l0.3-0.5l0.4-0.5l0.4-0.5l0.4-0.4l0.4-0.5l0.4-0.4l0.4-0.4l0.5-0.5l0.8-0.7l0.9-0.8l0.9-0.7l0.9-0.7l0.9-0.6l0.9-0.6
395
+ l0.9-0.5l0.9-0.5l0.9-0.5l0.9-0.4l0.9-0.4l0.9-0.3l0.9-0.3l0.9-0.3l0.9-0.2l0.9-0.2l0.9-0.2l0.9-0.2l0.9-0.1l0.8-0.1l0.8-0.1
396
+ l0.8-0.1l0.8-0.1l0.8-0.1h0.8h0.8h0.8h0.7h0.8h0.7h0.7l0.7,0.1l0.7,0.1l0.7,0.1l0.7,0.1l0.7,0.1l0.7,0.1l0.7,0.1l0.6,0.1
397
+ l0.6,0.1l0.6,0.1l0.6,0.1l0.6,0.1l0.6,0.1l0.6,0.1l1.1,0.3l1.1,0.3l1.1,0.3l1.1,0.4L328,85l0.8,0.3l0.7,0.3l0.7,0.3l0.7,0.4
398
+ l0.6,0.4l0.6,0.4l0.6,0.4l0.5,0.4l0.5,0.4l0.5,0.4l0.5,0.4l0.8,0.7l0.8,0.8l0.8,0.8l0.7,0.8l0.6,0.8l0.6,0.8l0.6,0.8l0.5,0.7
399
+ l0.5,0.7l0.5,0.7l0.4,0.7l0.4,0.7l0.4,0.7l0.4,0.7l0.3,0.7l0.3,0.7l0.3,0.7l0.3,0.7l0.3,0.7l0.3,0.7l0.3,0.7l0.3,0.7l0.3,0.7
400
+ l0.3,0.7l0.5,1.3l0.5,1.3l0.4,1.2l0.4,1.2l0.4,1.2l0.4,1.2l0.3,1.1l0.6,2l0.6,1.8l0.2,0.8l0.2,0.7l0.2,0.6l0.2,0.5l0.1,0.3
401
+ l0.1,0.2l0.4,1.1l0.5,1.2l0.5,1.2l0.5,1.2l0.5,1.2l0.4,1.2l0.4,1.2l0.4,1.2l0.4,1.2l0.4,1.2l0.4,1.2l0.4,1.2l0.4,1.2l0.4,1.2
402
+ l0.4,1.2l0.4,1.3l0.4,1.2l0.4,1.3l0.4,1.2l0.3,1.3l0.3,1.3l0.3,1.3l0.3,1.3l0.3,1.3l0.3,1.3l0.3,1.3l0.3,1.3l0.3,1.3l0.3,1.3
403
+ l0.3,1.3l0.3,1.3l0.2,1.1l0.1,0.2l0.1,0.3l0.1,0.5l0.2,0.7l0.2,0.8l0.2,0.9l0.2,1l0.2,1.1l0.1,0.6l0.1,0.6l0.1,0.7l0.1,0.7
404
+ l0.1,0.7l0.1,0.8l0.1,0.8l0.1,0.8v0.9v0.9v1l-0.1,1.1l-0.1,1.1l-0.1,0.8l-0.1,0.7l-0.1,0.7l-0.2,0.7l-0.2,0.8l-0.2,0.5
405
+ l-0.1,0.3v0.1v0.1v0.1l-0.1,0.5l-0.1,0.6l-0.2,0.7l-0.2,0.8l-0.2,0.9l-0.2,1l-0.3,1.1l-0.2,0.6l-0.2,0.6l-0.2,0.6l-0.2,0.7
406
+ l-0.2,0.7L361,192l-0.3,0.7l-0.3,0.7l-0.3,0.8l-0.3,0.8l-0.4,0.8l-0.4,0.8l-0.4,0.8l-0.5,0.8l-0.5,0.8l-0.5,0.7l-0.5,0.7
407
+ l-0.4,0.6l-0.4,0.6l-0.4,0.5l-0.4,0.5l-0.4,0.5l-0.7,0.8l-0.7,0.8l-0.6,0.7l-0.5,0.6l-0.4,0.5l-0.2,0.2l-0.1,0.1l-0.2,0.4
408
+ l-0.3,0.6l-0.3,0.5l-0.3,0.6l-0.5,0.9l-0.5,0.9l-0.5,0.8l-0.5,0.8l-0.5,0.8l-0.6,0.8l-0.6,0.7l-0.6,0.7l-0.6,0.7l-0.6,0.7
409
+ l-0.6,0.7l-0.6,0.7l-0.7,0.7l-0.7,0.7l-0.7,0.7l-0.7,0.7l-0.7,0.7l-0.8,0.7l-0.8,0.6l-0.8,0.6l-0.8,0.6l-0.8,0.6l-0.5,0.4
410
+ l-0.5,0.3l-0.5,0.3l-0.5,0.3l-0.5,0.3l-0.5,0.3l-0.6,0.3l-0.6,0.3l-0.6,0.3l-0.7,0.3l-0.7,0.3l-0.8,0.3l-0.8,0.3l-0.8,0.2
411
+ l-1.1,0.3l-1,0.2l-1,0.2l-1,0.2l-1,0.2l-1,0.2l-1,0.2l-1,0.1l-1,0.1l-1,0.1l-1,0.1l-1,0.1l-0.9,0.1l-0.9,0.1l-0.9,0.1l-0.9,0.1
412
+ h-0.9H310h-0.9h-0.9h-0.9h-0.9h-1.7H303h-1.7h-1.7H298h-3.2h-1.5h-1.5h-1.5h-1.4h-1.4h-0.7h-0.7h-0.7h-0.7h-0.6h-0.6h-0.6h-0.6
413
+ l-0.6,0.1l-0.6,0.1l-0.6,0.1l-0.6,0.1l-0.6,0.1l-0.6,0.1l-0.6,0.1l-0.5,0.1l-0.5,0.1l-0.6,0.1L273,233l-3.6,0.7l-3.6,0.7
414
+ l-3.6,0.7l-7.2,1.5l-7.2,1.5l-7.3,1.5l-7.3,1.5l-3.7,0.8l-3.7,0.8l-3.7,0.8l-3.8,0.8l-0.8,0.1l-0.8,0.1l-0.8,0.1l-0.8,0.1
415
+ l-0.8,0.1l-0.8,0.1l-0.8,0.1l-0.8,0.1h-0.8h-0.8h-0.8h-0.8h-0.8h-0.8h-0.8h-0.8h-0.8h-0.8h-0.7l-0.7-0.1l-0.7-0.1l-0.7-0.1
416
+ l-0.7-0.1l-0.7-0.1l-0.7-0.1l-0.7-0.1l-1.4-0.2l-1.4-0.2l-1.4-0.2l-1.3-0.2l-1.3-0.2l-1.3-0.3l-1.3-0.3l-1.3-0.3l-1.2-0.3
417
+ l-1.2-0.3l-1.2-0.3l-1.2-0.3l-1.1-0.3l-2.2-0.5l-2-0.5l-2.1-0.5l-0.7-0.2l-0.8-0.2l-0.8-0.3l-0.7-0.3l-0.7-0.3l-0.7-0.3
418
+ l-0.6-0.3l-0.6-0.3l-0.5-0.3l-0.6-0.3l-0.9-0.5h-0.1h-0.3h-0.6l-0.6-0.1l-0.6-0.1l-0.7-0.1l-0.7-0.1l-0.7-0.1l-0.7-0.2
419
+ l-0.7-0.2l-0.7-0.2l-0.8-0.3l-0.7-0.3l-0.3,0.3l-0.9,0.8l-1,0.7l-1,0.6l-1.1,0.6l-1.1,0.5l-1.1,0.4l-1.2,0.3l-1.2,0.2l-0.6,0.1
420
+ l-0.8,0.1l-0.9,0.1l-0.9,0.1l-1,0.1h-1.1h-1.1l-1.2-0.1l-1.2-0.2l-1.3-0.2l-1.2-0.3l-0.8-0.2l-0.7-0.2l-0.7-0.3l-0.7-0.3
421
+ l-0.7-0.3l-0.7-0.3l-0.7-0.4l-0.7-0.4l-0.7-0.4l-0.6-0.5l-0.6-0.5l-0.6-0.5l-0.5-0.5l-0.6-0.5l-0.5-0.6l-0.5-0.5l-0.5-0.6
422
+ l-0.4-0.6l-0.4-0.6l-0.5-0.7l-0.6-1l-0.6-1.1l-0.5-1.1l-0.4-1l-0.4-1l-0.3-0.9l-0.3-0.9l-0.2-0.9l-0.2-0.9l-0.2-0.8l-0.2-0.6
423
+ l-0.2-0.7l-0.2-0.8l-0.2-0.9l-0.2-0.9l-0.1-0.6l-0.1-0.6l-0.1-0.6l-0.1-0.6l-0.1-0.7l-0.1-0.8l-0.1-0.8l-0.1-1v-1.1V208
424
+ l0.1-1.4l0.2-1.2l0.3-1.2l0.4-1.3l0.3-0.7l0.3-0.8l0.4-0.8v-0.1l0.4-0.8l0.4-0.7v-0.1l0.7-1l0.7-0.9l0,0l0.5-0.6l0.6-0.6
425
+ l0.6-0.6l0,0l0.7-0.6l0.8-0.6l0.8-0.5h0.1l0.9-0.5l0.9-0.5l0.9-0.4l0.8-0.3l1.2-0.4l0.6-0.2l0.6-0.2l0.6-0.2l0.6-0.2l0.6-0.2
426
+ l0.6-0.1l0.6-0.1l0.6-0.1l0.6-0.1l1.1-0.2l1.1-0.2l1.1-0.2l1.1-0.1l1-0.1l1-0.1l1-0.1l1-0.1l1-0.1l0.9-0.1h0.9L154.3,188.6z
427
+ M353.1,204.9L353.1,204.9L353.1,204.9L353.1,204.9z"
428
+ />
429
+ </g>
430
+ <g transform="matrix(1,0,0,1,381.866,45.2348)">
431
+ <path
432
+ fill="#0096FF"
433
+ d="M100,290.7h0.6h0.6h0.6h0.6h0.6h0.5h0.5h0.5h0.5l0.5,0.1l0.5,0.1l0.5,0.1l0.5,0.1l0.5,0.1l0.5,0.1l1,0.2
434
+ l1,0.2l1,0.2l0.9,0.2l0.9,0.2l0.9,0.2l0.9,0.2l0.9,0.2l0.8,0.2l1.6,0.4l1.5,0.4l0.7,0.2l0.7,0.2l0.7,0.2l0.7,0.2l0.6,0.1
435
+ l0.6,0.1h0.1h0.1h0.3h0.3h0.3h0.4h0.4h0.4h0.4h0.5h0.5h0.5h0.5h1.1l1.2-0.1l1.2-0.1h0.7h0.7h0.7h0.7h0.7h0.7h0.8l0.8,0.1
436
+ l0.8,0.1l0.8,0.1l0.8,0.1l0.5,0.1l0.4,0.1l0.4,0.1l0.4,0.1l0.4,0.1l0.4,0.1l0.4,0.1l0,0l20.9,0h0.2h0.4h0.4l0.4,0.1l0,0
437
+ l0.5,0.1l0.5,0.1l0.5,0.2l0.5,0.2l0.5,0.2l0.5,0.3l0.5,0.3l0.4,0.3l0.4,0.3l0.4,0.4l0.4,0.4l0.4,0.4l0.3,0.4l0.3,0.4l0.3,0.5
438
+ l0.2,0.5l0.2,0.5l0.2,0.5l0.2,0.5l0.1,0.5l0.1,0.5l0.1,0.5v0.5v0.5l0,0v0.6l-0.1,0.6l-0.1,0.5l-0.1,0.5l-0.2,0.5l-0.2,0.5
439
+ l-0.2,0.5l-0.3,0.5l-0.3,0.5l-0.3,0.4l-0.4,0.4l-0.4,0.4l-0.4,0.4l-0.4,0.3l-0.5,0.3l-0.5,0.3l-0.5,0.3l-0.5,0.2l0,0l-0.5,0.2
440
+ l-0.5,0.2l-0.5,0.1l-0.4,0.1l-0.7,0.1l-0.5,0.1l-0.5,0.1l-0.4,0.1h-0.2l-0.4,0.1l-0.6,0.1l-0.6,0.1l-0.6,0.1l-0.5,0.1h-0.5
441
+ h-0.5h-0.5h-0.9h-0.9h-0.8h-0.7h-2h-1h-1h-1h-1.1h-1.1l-1.1-0.1h-0.6h-0.6l-0.6,0l-0.6-0.1l-0.6-0.1l-0.6-0.1l-0.6-0.1
442
+ l-0.6-0.1l-0.6-0.1l-0.6-0.1l-0.4-0.1H101h-0.6h-0.6l-0.5-0.1l-0.5-0.1l-0.5-0.2l-0.5-0.2l-0.5-0.2l-0.5-0.3l-0.5-0.3l-0.5-0.3
443
+ l-0.4-0.3l-0.4-0.4l-0.4-0.4l-0.4-0.4l-0.2-0.2l-0.1,0.1l-0.6,0.3l-1.3,0.6l-1.3,0.7l-1.4,0.7l-0.7,0.4l-0.8,0.4l-0.8,0.3
444
+ l-0.8,0.3l-0.8,0.3l-0.8,0.3l-0.8,0.3l-0.5,0.2l-0.4,0.1l-0.4,0.1L82,315l-0.5,0.1l-0.5,0.1l-0.5,0.1l-0.5,0.1l-0.5,0.1
445
+ l-0.5,0.1l-0.5,0.1l-0.5,0.1l-0.5,0.1L77,316h-0.5H76h-0.5h-0.6h-0.6h-0.4l-0.5-0.1l-0.5-0.1l-0.5-0.1l0,0l-0.5-0.2l-0.5-0.2
446
+ l-0.5-0.2l-0.5-0.2l-0.4-0.3l-0.4-0.3l0,0l-0.4-0.3l-0.4-0.3l-0.4-0.4l-0.3-0.4l-0.3-0.4l-0.3-0.4l-0.3-0.4l-0.3-0.4l-0.2-0.5
447
+ l-0.2-0.5l0,0l-0.2-0.5l-0.1-0.5l-0.1-0.5l-0.1-0.5v-0.5v-0.5v-0.5l0.1-0.6l0,0l0.1-0.5l0.1-0.5l0.1-0.5l0.2-0.5l0.2-0.5
448
+ l0.2-0.4l0.2-0.4l0.3-0.4l0,0l0.3-0.4l0.3-0.4l0.3-0.4l0.4-0.4l0.4-0.3l0,0l0.4-0.3L70,300h0.1l0.4-0.2l0.4-0.2l0.4-0.2
449
+ l0.2-0.1l0.1-0.4l0.2-0.4L72,298l0.3-0.5l0.4-0.6l0.5-0.7l0.3-0.4l0.3-0.3l0.3-0.3l0.4-0.4l0.6-0.5l0.5-0.4l0.5-0.4l0.6-0.3
450
+ l0.7-0.3l0.7-0.3l0.7-0.2l0.7-0.2l0.8-0.1h0.8h0.8l0.7,0.1l0.6,0.1l0.4,0.1l0.5,0.1l0.5,0.2l0.5,0.2l0.5,0.2l0.5,0.3l0.5,0.3
451
+ l0.2,0.2l0.5-0.2l0.7-0.3l0.8-0.3l0.8-0.3l0.8-0.3l0.8-0.3l0.8-0.3l0.5-0.2l0.4-0.1l0.4-0.1l0.5-0.1l0.6-0.2l0.6-0.1l0.6-0.1
452
+ l0.6-0.1l0.6-0.1l0.6-0.1l0.6-0.1l0.6-0.1l0.6-0.1h0.6L100,290.7z M79.4,310.3h0.2l-0.4-0.1L79.4,310.3z"
453
+ />
454
+ </g>
455
+ <g transform="matrix(1,0,0,1,396.607,49.2944)">
456
+ <path
457
+ d="M110.6,285.7h0.4h0.4h0.4h0.4h0.4h0.4h0.4h0.4h0.4l0.4,0.1l0.4,0.1l0.4,0.1l0.3,0.1l0.4,0.1l0.7,0.2
458
+ l0.7,0.2l0.7,0.2l0.6,0.2l0.6,0.2l0.6,0.2l0.6,0.2l0.6,0.2l0.6,0.2l1.1,0.5l1.1,0.5l1.1,0.4l0.5,0.2l0.5,0.2l0.5,0.2l0.5,0.2
459
+ l0.2,0.1l0.2,0.1l0.2,0.1l0.2,0.1l0.2,0.1h0.2h0.2h0.2h0.3h0.3h0.3h0.3h0.3h0.3h0.6h0.6h0.6h0.6l0.6,0h0.6h0.7l1.3-0.1l1.4-0.1
460
+ l1.4-0.1h0.7h0.7h0.7h0.7h0.7h0.7h0.7h0.7h0.4h0.4h0.4h0.4h0.4l0.4,0.1l0.4,0.1l0.3,0.1h0.2h0.2h0.2h0.3h0.3h0.3h0.3h0.3h0.7
461
+ h0.8h0.8h0.4h0.4h0.4h0.4h0.4h0.4h0.4l0.5,0.1l0.5,0.1l0.5,0.1l0.4,0.1l0.3,0.1l0.2,0.1l0.2,0.1l0.2,0.1l0.2,0.1l0.2,0.1
462
+ l0.2,0.1l0.2,0.1l0.2,0.1l0.2,0.2l0.2,0.2l0.2,0.2l0.2,0.2l0.2,0.2l0.3,0.3l0.3,0.3l0.2,0.3l0.2,0.4l0.2,0.4l0.1,0.4l0.1,0.4
463
+ l0.1,0.4l0.1,0.4v0.4v0.4v0.3v0.3v0.3v0.3l-0.1,0.3l-0.1,0.3l-0.1,0.3l-0.1,0.3l-0.1,0.3l-0.1,0.3l-0.1,0.3l-0.1,0.3l-0.1,0.3
464
+ l-0.1,0.3l-0.1,0.3l-0.1,0.3l-0.1,0.3l-0.3,0.5l-0.3,0.6l-0.3,0.5l-0.3,0.5l-0.3,0.5l-0.3,0.5l-0.4,0.5l-0.4,0.5l-0.4,0.4
465
+ l-0.4,0.4l-0.4,0.4l-0.4,0.4l-0.3,0.4l-0.4,0.3l-0.4,0.3l-0.4,0.3l-0.2,0.2l-0.2,0.1l-0.2,0.1l-0.2,0.1l-0.6,0.3l-0.6,0.3
466
+ l-0.6,0.3l-0.6,0.2l-0.6,0.2l-0.6,0.2l-0.6,0.2l-0.6,0.2l-0.6,0.2l-0.6,0.2l-0.6,0.1l-0.6,0.1l-0.6,0.1l-0.6,0.1l-0.6,0.1
467
+ l-0.6,0.1l-0.6,0.1l-0.6,0.1H142h-0.6h-0.6h-0.6h-0.6H139h-0.6h-0.6h-0.6h-0.6l-0.6-0.1l-0.6-0.1l-0.6-0.1l-0.6-0.1l-0.6-0.1
468
+ l-0.6-0.1l-0.6-0.1l-0.6-0.1l-0.6-0.1l-0.6-0.1l-1.1-0.2l-1.1-0.2l-1.1-0.3l-1.1-0.3l-1.1-0.3l-1.1-0.3l-1.1-0.3l-2.1-0.6
469
+ l-2.1-0.6l-1-0.3l-1-0.3h-0.2h-0.2h-0.2h-0.2h-0.2h-0.2h-0.2h-0.2h-0.2h-0.2h-0.4h-0.4h-0.4H113h-0.5l-0.5,0.1l-0.5,0.1
470
+ l-0.5,0.1l-0.5,0.1l-0.5,0.1l-0.5,0.1l-0.5,0.1l-0.5,0.1L108,309l-0.5,0.1l-0.5,0.1l-0.5,0.1l-1,0.3l-1,0.3l-1,0.3l-1.8,0.6
471
+ l-0.4,0.1l-0.4,0.1l-0.4,0.1l-0.4,0.1l-0.4,0.1l-0.4,0.1l-0.4,0.1l-0.4,0.1l-0.4,0.1h-0.4h-0.4h-0.4h-0.4h-0.4h-0.4h-0.4h-0.9
472
+ h-0.9h-0.9h-0.9h-0.9h-0.9l-0.9-0.1l-0.9-0.1l-1.8-0.1l-1.8-0.1l-0.9-0.1h-0.9h-0.8h-0.8h-0.8h-0.8h-0.8h-0.4h-0.4h-0.4h-0.4
473
+ h-0.3h-0.3h-0.3h-0.3h-0.3l-0.3,0.1l-0.4,0.1l-0.5,0.1l-0.6,0.1l-0.7,0.1l-0.7,0.1l-0.8,0.1l-0.8,0.1l-0.9,0.1l-0.9,0.1h-0.9
474
+ h-1h-1h-1h-1h-1h-1h-1h-1h-1h-1l-1-0.1l-0.9-0.1h-0.5h-0.5l-0.5-0.1l-0.4-0.1l-0.4-0.1l-0.4-0.1l-0.4-0.1l-0.4-0.1l-0.4-0.1
475
+ l-0.4-0.1l-0.4-0.1l-0.4-0.1l-0.4-0.1l-0.4-0.1l-0.4-0.1l-0.4-0.2l-0.4-0.2l-0.4-0.2l-0.3-0.2l-0.2-0.2l-0.2-0.2l-0.2-0.2
476
+ l-0.2-0.3l-0.2-0.3l-0.1-0.3l-0.1-0.3l-0.1-0.3l-0.1-0.3l-0.1-0.3v-0.3v-0.2v-0.2v-0.3v-0.4l0.1-0.4l0.1-0.4l0.1-0.4l0.1-0.3
477
+ l0.1-0.3l0.1-0.3l0.1-0.3l0.1-0.3l0.1-0.3l0.1-0.3l0.1-0.3l0.3-0.5l0.3-0.5l0.3-0.5l0.4-0.8l0.1-0.3l0.1-0.2l0.2-0.4l0.2-0.4
478
+ l0.3-0.4l0.3-0.4l0.3-0.4l0.3-0.4l0.3-0.4l0.3-0.4l0.3-0.3l0.3-0.3l0.3-0.3l0.3-0.3l0.3-0.3l0.3-0.3l0.3-0.3l0.3-0.3l0.3-0.3
479
+ l0.3-0.3L55,293l0.3-0.2l0.4-0.2l0.4-0.2l0.3-0.2l0.4-0.2l0.4-0.2l0.4-0.2l0.7-0.4l0.7-0.3l0.7-0.3l0.7-0.3l0.7-0.3l1.3-0.6
480
+ l0.6-0.3l0.6-0.3l0.6-0.3l0.6-0.3l0.6-0.3l0.3-0.1l0.2-0.1l0.2-0.1l0.2-0.1l0.2-0.1l0.2-0.1l0.2-0.1l0.2-0.1l0.2-0.1l0.2-0.1
481
+ l0.2-0.2l0.2-0.1l0.2-0.2l0.2-0.2l0.3-0.2l0.3-0.2l0.3-0.2l0.3-0.1l0.3-0.1h0.4h0.4H71l0.3,0.1l0.3,0.1l0.2,0.1h0.1l0.4-0.1
482
+ l0.4-0.1l0.4-0.1l0.4-0.2l0.9-0.3l0.9-0.4l0.9-0.3l0.5-0.2l0.5-0.2l0.5-0.2l0.5-0.2l0.5-0.1l0.5-0.1l0.5-0.1l0.5-0.1h0.3h0.3
483
+ h0.3h0.3h0.3H82h0.3h0.3h0.3h0.3l0.3,0.1l0.3,0.1l0.5,0.1l0.5,0.1l0.9,0.3l0.9,0.3l0.8,0.3l0.8,0.3l0.8,0.3l0.7,0.3l0.7,0.3
484
+ l1.2,0.5l1.1,0.4l0.5,0.2l0.5,0.2l0.5,0.2l0.5,0.1l0.5,0.1l0.2,0.1l0.2,0.1l0.2,0.1H96h0.2h0.2h0.2h0.2H97h0.3h0.3h0.3h0.3h0.3
485
+ h0.3h0.3h0.3h0.3h0.3h0.3h0.4l0.4-0.1l0.4-0.1l0.4-0.1l0.4-0.1l0.4-0.1l0.4-0.1l0.5-0.1l0.5-0.1l0.5-0.1l0.4-0.1l0.4-0.1
486
+ l0.4-0.1l0.4-0.1l0.4-0.1l0.4-0.1l0.4-0.1h0.4h0.4h0.4h0.4L110.6,285.7z M115.3,302.4h0.6h0.3h0.3h0.3h0.3h0.3h0.3l0.3,0.1
487
+ l0.3,0.1l0.3,0.1l0.3,0.1l1.1,0.3l1.1,0.3l2.1,0.6l2.1,0.6l1.1,0.3l1,0.3l1,0.3l1,0.3l1,0.2l1,0.2l1,0.2l0.5,0.1l0.5,0.1
488
+ l0.5,0.1l0.5,0.1l0.5,0.1l0.5,0.1l0.5,0.1l0.5,0.1l0.5,0.1h0.5h0.5h0.5h0.5h0.5h0.5h0.5h0.5h0.5h0.5h0.5h0.5l0.5-0.1l0.5-0.1
489
+ l0.5-0.1l0.5-0.1l0.5-0.1l0.5-0.1l0.5-0.1l0.5-0.1l0.5-0.1l0.5-0.1l0.5-0.1l0.5-0.2l0.5-0.2l0.5-0.2l0.5-0.2l0.5-0.2l0.4-0.2
490
+ l0,0l0.1-0.1l0.2-0.1l0.2-0.2l0.2-0.2l0.2-0.3l0.3-0.3l0.3-0.3l0.3-0.3l0.3-0.4l0.3-0.4l0.3-0.4l0.3-0.4l0.3-0.4l0.2-0.4
491
+ l0.2-0.4l0.2-0.4l0.1-0.2l0.1-0.2l0.1-0.2l0.1-0.2l0.1-0.2l0.1-0.2l0.1-0.2l0.1-0.2l0.1-0.2v-0.1V298v-0.1v-0.1v-0.1v-0.1v-0.1
492
+ l0,0H156h-0.1h-0.1h-0.1h-0.1h-0.1h-0.1l-0.2-0.1H155h-0.2h-0.3h-0.3h-0.3h-0.3h-0.3H153h-0.4h-0.4h-0.8h-0.8h-0.8h-0.4H149
493
+ h-0.4h-0.4h-0.4h-0.4l-0.4-0.1l-0.4-0.1l-0.3-0.1h-0.2h-0.3h-0.3h-0.3h-0.3h-0.3h-0.3h-0.6h-0.6h-0.6h-0.6h-0.6h-0.6H140h-0.7
494
+ l-1.4,0.1l-1.4,0.1l-1.4,0.1h-0.7h-0.7H133l-0.7,0h-0.7h-0.7h-0.7h-0.4h-0.4H129h-0.4h-0.4h-0.4l-0.4-0.1l-0.4-0.1l-0.4-0.1
495
+ l-0.4-0.1l-0.4-0.1l-0.4-0.1l-0.4-0.1l-0.4-0.1l-0.6-0.2l-0.6-0.2l-0.6-0.2l-0.6-0.2l-1.1-0.5l-1.1-0.5l-1.1-0.4l-0.5-0.2
496
+ l-0.5-0.2l-0.5-0.2l-0.5-0.2l-0.5-0.2l-0.5-0.2l-0.5-0.2l-0.5-0.1l-0.5-0.1l-0.3-0.1l-0.3-0.1l-0.3-0.1h-0.3h-0.3h-0.3h-0.3
497
+ H112h-0.3h-0.3h-0.3h-0.3h-0.3h-0.3h-0.3h-0.3h-0.3H109h-0.3h-0.3h-0.3h-0.3l-0.3,0.1l-0.3,0.1l-0.3,0.1l-0.3,0.1l-0.5,0.1
498
+ l-0.5,0.1l-0.5,0.1l-0.5,0.1l-0.5,0.1l-0.5,0.1l-0.5,0.1l-0.5,0.1l-0.5,0.1l-0.4,0.1h-0.4h-0.4h-0.4h-0.4h-0.4h-0.4H99h-0.4
499
+ h-0.4h-0.4h-0.4H97h-0.4h-0.4l-0.3-0.1l-0.3-0.1l-0.3-0.1l-0.3-0.1l-0.3-0.1l-0.3-0.1l-0.6-0.2l-0.6-0.2l-0.6-0.2l-0.6-0.2
500
+ l-0.6-0.2l-1.2-0.5l-1.2-0.5l-0.6-0.2l-0.7-0.2l-0.7-0.2l-0.7-0.2l-0.7-0.2l-0.8-0.2l-0.8-0.2l-0.4-0.1l-0.4-0.1h-0.1l0,0l0,0
501
+ H83h-0.1h-0.1h-0.1h-0.1h-0.1h-0.1h-0.1h-0.1l-0.3,0.1l-0.3,0.1l-0.3,0.1l-0.3,0.1l-0.4,0.1l-0.4,0.1l-0.4,0.1l-0.4,0.2
502
+ l-0.9,0.3l-0.9,0.3l-0.9,0.4l-0.5,0.2l-0.5,0.2l-0.5,0.2l-0.5,0.2l-0.5,0.2l-0.5,0.1l-0.5,0.1l-0.5,0.1l-0.5,0.1h-0.3h-0.3
503
+ h-0.1l-0.2,0.1l-0.3,0.2l-0.3,0.2l-0.3,0.2l-0.3,0.2l-0.3,0.2l-0.3,0.2l-0.3,0.2l-0.7,0.3l-0.7,0.3l-0.7,0.3l-0.7,0.3l-0.7,0.3
504
+ l-1.3,0.6l-0.6,0.3l-0.6,0.3l-0.6,0.3l-0.6,0.3l-0.6,0.3l-0.3,0.2l-0.3,0.2l-0.3,0.2l-0.3,0.2l-0.3,0.2l-0.3,0.2l-0.3,0.2
505
+ l-0.2,0.2l-0.2,0.2l-0.2,0.2l-0.2,0.2l-0.2,0.2l-0.2,0.2l-0.2,0.2l-0.2,0.2l-0.2,0.2l-0.2,0.2l-0.2,0.2l-0.2,0.2l-0.2,0.2
506
+ l-0.2,0.2l-0.2,0.3l-0.2,0.3l-0.2,0.3l-0.2,0.3l-0.2,0.3l-0.2,0.3l-0.2,0.3l-0.4,0.8l-0.2,0.4l-0.2,0.4l-0.2,0.4l-0.1,0.2
507
+ l-0.1,0.2l-0.1,0.2l0,0l0,0l0.3,0.1l0.3,0.1l0.3,0.1l0.3,0.1l0.3,0.1h0.3H56h0.4h0.4h0.4l0.9,0.1l0.9,0.1h0.9h0.9h1h1h1h1h1h1
508
+ h0.9h0.9h0.9h0.9l0.8-0.1l0.8-0.1l0.7-0.1l0.7-0.1l0.6-0.1l0.5-0.1l0.4-0.1l0.4-0.1l0.4-0.1l0.4-0.1l0.4-0.1h0.4h0.4h0.4h0.4
509
+ h0.4h0.4h0.4h0.9h0.9H82h0.9h0.9h0.9l0.9,0.1l1.8,0.1l1.8,0.1l0.9,0.1l0.9,0.1h0.9h0.8h0.8h0.8h0.8h0.8h0.4h0.4h0.4h0.4h0.3
510
+ h0.3h0.3h0.3H99l0.3-0.1l0.3-0.1l0.3-0.1l0.3-0.1l0.3-0.1l0.3-0.1l0.3-0.1l1.8-0.6l1-0.3l1-0.3l1.1-0.3l0.6-0.2l0.6-0.2
511
+ l0.6-0.2l0.6-0.1l0.6-0.1l0.6-0.1l0.6-0.1l0.6-0.1l0.6-0.1l0.6-0.1l0.6-0.1l0.6-0.1l0.6-0.1h0.6h0.6L115.3,302.4z"
512
+ />
513
+ </g>
514
+ <g transform="matrix(1,0,0,1,381.866,45.2348)">
515
+ <path
516
+ fill="#0096FF"
517
+ d="M258.4,272.4h0.5h0.5h0.6h0.4h0.3h0.3h0.2h0.2h0.2l0,0l0.2,0.1l0.2,0.1l0.2,0.1l0,0l0.2,0.1l0.2,0.1
518
+ l0.2,0.1l0.2,0.1l0,0l0.1,0.1l0.1,0.1l0.1,0.2l0.1,0.2l0.1,0.2l0.1,0.2l0,0l0.1,0.2l0.1,0.2v0.2v0.2v0.2v0.2v0.2l0,0v0.2v0.2
519
+ l-0.1,0.2l-0.1,0.2l-0.1,0.2l0,0l-0.1,0.2l-0.1,0.2l-0.1,0.1l-0.1,0.1l0,0l-0.1,0.2l-0.1,0.1l0,0l-0.1,0.1l-0.1,0.1h-0.1
520
+ l-0.1,0.1l-0.1,0.1l-0.2,0.1l-0.3,0.2l-0.3,0.1l-0.3,0.1l-0.3,0.1l-0.4,0.1l-0.4,0.1l-0.4,0.1l-0.4,0.1l-0.8,0.3l-0.9,0.2
521
+ l-0.8,0.2v0.1l0.1,0.2v0.2v0.2v0.2v0.2v0.2l0,0v0.2v0.2v0.2v0.2l-0.1,0.2l-0.1,0.2l0,0l-0.1,0.2l-0.1,0.2l-0.1,0.2l-0.1,0.2
522
+ l0,0l-0.1,0.1l-0.1,0.1l-0.1,0.1l0,0l-0.2,0.1l-0.2,0.1l-0.2,0.1l-0.3,0.1l-0.2,0.1l-0.3,0.1l-0.4,0.1l-0.4,0.1l-0.4,0.1
523
+ l-0.5,0.1l-0.5,0.1l-0.6,0.1l-0.6,0.1l-0.7,0.1l-0.7,0.1l-0.1,0.2l-0.1,0.2l-0.1,0.2l-0.1,0.2l-0.1,0.2l-0.1,0.2l-0.1,0.1
524
+ L249,286l-0.2,0.2l-0.2,0.2l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1H248l-0.1,0.1l-0.2,0.1h-0.1h-0.1h-0.1h-0.1h-0.2
525
+ h-0.2h-0.1h-0.1h-0.2h-0.1h-0.1h-0.1h-0.1H246h-0.1h-0.1h-0.1h-0.1l-0.2-0.1l-0.3-0.1l-0.3-0.1l-0.3-0.1l-0.3-0.2l-0.2-0.2
526
+ l-0.2-0.2l-0.2-0.2l-0.2-0.2l-0.2-0.2h-0.1l-0.8,0.1l-0.8,0.1h-0.8H240h-0.7h-0.7H238h-0.6h-0.5h-0.5h-0.3h-0.3l-0.3-0.1
527
+ l-0.2-0.1h-0.2l-0.2-0.1h-0.1l-0.2-0.1l-0.1-0.1l-0.1-0.1h-0.1l-0.2-0.1l0,0l-0.8,0.3l-0.9,0.3l-0.9,0.2l-0.5,0.1l-0.4,0.1
528
+ l-0.4,0.1l-0.4,0.1l-0.4,0.1l-0.4,0.1l-0.4,0.1l-0.4,0.1l-0.4,0.1h-0.4H227h-0.4h-0.4h-0.4h-0.4H225h-0.4h-0.4l-0.4-0.1
529
+ l-0.4-0.1l-0.4-0.1l-0.4-0.1l-0.4-0.2l-0.3-0.1l-0.2-0.1l-0.2-0.1l0,0l-0.2-0.1l-0.2-0.1l-0.1-0.1l0,0l-0.1-0.1l-0.1-0.2
530
+ l-0.1-0.2l0,0l-0.1-0.1l-0.1-0.2l-0.1-0.2l0,0l-0.1-0.2l-0.1-0.2v-0.2v-0.1v-0.2v-0.2v-0.1v-0.2v-0.2v-0.2v-0.3v-0.3l0.1-0.3
531
+ l0.1-0.4l0.1-0.4l0.2-0.4l0.2-0.3l0.2-0.3l0.2-0.3l0.2-0.3l0.2-0.3l0.2-0.3l0.2-0.3l0.2-0.3l0.4-0.6l0.4-0.6l0.4-0.6l0.4-0.5
532
+ l0.4-0.5l0.2-0.2l0.2-0.2l0.2-0.2l0.2-0.2l0.2-0.1l0.1-0.1l0.1-0.1h0.1l0.1-0.1l0.1-0.1l0.2-0.1l0.3-0.1l0.3-0.1l0.3-0.1
533
+ l0.3-0.1l0.3-0.1l0.3-0.1l0.3-0.1l0.3-0.1l0.3-0.1l0.3-0.1l0.3-0.1l0.4-0.1l0.1-0.1l0.5-0.3l0.5-0.3l0.5-0.3l0.5-0.3l0.5-0.2
534
+ l0.4-0.2l0.4-0.2l0.4-0.2l0.4-0.2l0.4-0.2l0.4-0.2l0.4-0.2l0.3-0.1l0.3-0.1l0.3-0.1l0.3-0.1l0.3-0.1l0.3-0.1l0.3-0.1l0.3-0.1
535
+ l0.3-0.1l0.3-0.1l0.3-0.1h0.3h0.3h0.3h0.6h0.6h0.6h0.6h0.6h0.5l0.5,0.1l0.5,0.1l0.5,0.1l0.5,0.1l0.5,0.1l0.5,0.1l0.5,0.1
536
+ l0.5,0.1l0.5,0.1l0.5,0.1l0.5,0.1l0.9,0.3l0.9,0.3l0.9,0.3l0.9,0.3l4.8,1.4l0.9-0.1l1.1-0.1h1L258.4,272.4z"
537
+ />
538
+ </g>
539
+ <g transform="matrix(1,0,0,1,381.866,45.2348)">
540
+ <path
541
+ d="M240.3,267.1h0.9h0.9h0.9h0.9h0.9h0.9h0.9h0.9h0.9h0.9h0.9h0.9l0.9,0h0.8l0.8,0.1l0.8,0.1l0.8,0.1l0.8,0.1
542
+ l0.8,0.1l0.7,0.1l0.7,0.1l0.7,0.1l0.7,0.1l0.7,0.1l0.6,0.1l0.6,0.1l0.6,0.1l0.6,0.1l0.5,0.2l0.5,0.2l0.3,0.1l0.3,0.1l0.3,0.1
543
+ l0.2,0.1l0.2,0.1l0.2,0.1l0.2,0.1l0.2,0.1l0.2,0.2l0.2,0.2l0.2,0.2l0.2,0.2l0.2,0.2l0.2,0.2l0.2,0.2l0.1,0.2l0.1,0.2l0.1,0.2
544
+ l0.1,0.2l0.1,0.2l0.1,0.2l0.1,0.2v0.2v0.3v0.2v0.3v0.3v0.1v0.1v0.3l-0.1,0.4l-0.1,0.4l-0.1,0.4l-0.2,0.3l-0.2,0.3l-0.2,0.3
545
+ l-0.2,0.3l-0.2,0.3l-0.2,0.3l-0.2,0.3l-0.2,0.3l-0.2,0.3l-0.2,0.3l-0.2,0.3l-0.3,0.3l-0.3,0.3l-0.3,0.3l-0.3,0.2l-0.3,0.3
546
+ l-0.6,0.5l-0.6,0.5l-0.6,0.5l-0.6,0.4l-0.6,0.4l-0.6,0.4l-0.6,0.4l-0.6,0.4l-0.6,0.4l-0.5,0.3l-0.5,0.3l-0.5,0.3l-0.5,0.3
547
+ l-0.4,0.2l-0.4,0.2l-0.4,0.2l-0.4,0.2l-0.3,0.1l-0.2,0.1l-1.2,0.2l-1.1,0.2l-1.1,0.3l-1.1,0.3l-1.1,0.3l-1.1,0.3l-2.2,0.6
548
+ l-2.2,0.6l-1.1,0.3l-1.1,0.3l-1.1,0.3l-1.1,0.2l-1.1,0.2l-0.6,0.1l-0.6,0.1l-0.6,0.1l-0.6,0.1l-0.6,0.1L234,291l-0.6,0.1
549
+ l-0.6,0.1l-0.6,0.1l-0.6,0.1l-0.6,0.1h-0.6h-0.6h-0.6h-0.6H228h-0.6h-0.6h-0.6h-0.6H225l-0.6-0.1l-0.6-0.1l-0.6-0.1l-0.6-0.1
550
+ L222,291l-0.7-0.1l-0.7-0.1l-0.7-0.1l-0.7-0.2l-0.7-0.2l-0.7-0.2l-0.7-0.2l-0.6-0.2h-0.1l0,0h-0.1h-0.1H216h-0.2h-0.2h-0.2
551
+ h-0.2h-0.3h-0.3H214h-0.6h-0.7h-0.4h-0.4h-0.4h-0.4h-0.4h-0.4l-0.4-0.1l-0.4-0.1l-0.4-0.1l-0.3-0.1l-0.2-0.1l-0.2-0.1l-0.2-0.1
552
+ l-0.2-0.1l-0.2-0.1l-0.2-0.1l-0.2-0.1l-0.2-0.1l-0.2-0.2l-0.2-0.2l-0.2-0.2l-0.2-0.2l-0.2-0.2l-0.2-0.2l-0.2-0.2l-0.2-0.3
553
+ l-0.2-0.3l-0.2-0.3l-0.1-0.2v-0.1v-0.1v-0.1v-0.1v-0.1v-0.1v-0.1v-0.1v-0.1V285v-0.1v-0.1v-0.1v-0.1v-0.2l0.1-0.3l0.1-0.3
554
+ l0.1-0.3l0.1-0.3l0.1-0.2l0.1-0.2l0.1-0.2l0.1-0.2l0.2-0.2l0.3-0.3l0.3-0.3l0.3-0.3l0.3-0.2l0.3-0.2l0.3-0.2l0.3-0.2l0.3-0.2
555
+ l0.3-0.2l0.3-0.2l0.3-0.1l0.3-0.1l0.5-0.2l0.4-0.2l0.4-0.1l0.3-0.1l0.2-0.1l0.7-0.2l0.7-0.2l0.7-0.2l0.7-0.2l0.8-0.2l0.8-0.2
556
+ l1.5-0.4l1.4-0.4l1.3-0.3l0.4-0.1l-0.2-0.1l-0.2-0.2l-0.1-0.2l-0.1-0.2l-0.1-0.2l-0.1-0.2l-0.1-0.2V275v-0.3v-0.3v-0.3v-0.3
557
+ l0.1-0.2l0.1-0.2l0.1-0.2l0.1-0.2l0.1-0.2l0.2-0.2l0.2-0.2l0.2-0.2l0.2-0.2l0.2-0.2l0.2-0.2l0.3-0.2l0.3-0.2l0.3-0.2l0.3-0.1
558
+ l0.3-0.1l0.3-0.1l0.3-0.1l0.3-0.1l0.3-0.1l0.3-0.1l0.3-0.1l0.3-0.1l0.6-0.2l0.6-0.2l0.7-0.2l0.7-0.2l0.7-0.2l0.7-0.2l0.8-0.1
559
+ l0.8-0.1l0.8-0.1l0.8-0.1l0.8-0.1l0.8-0.1l0.8-0.1l0.9-0.1l0.9-0.1l0.9-0.1l0.9-0.1l0.9-0.1l0.9-0.1L240.3,267.1z M238.9,273.1
560
+ l-0.8,0.1l-0.8,0.1l-0.8,0.1l-0.8,0.1l-0.8,0.1l-0.8,0.1l-0.8,0.1l-0.7,0.1l-0.7,0.1l-0.7,0.1l-0.7,0.1l-0.7,0.1l-0.6,0.1
561
+ l-0.6,0.1l-0.6,0.1l-0.5,0.1l-0.5,0.1l-0.5,0.2l-0.2,0.1l-0.2,0.1l-0.2,0.1l-0.2,0.1l-0.2,0.1l-0.2,0.1l-0.1,0.1l-0.1,0.1
562
+ l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1h-0.1h-0.1l0,0l-0.1,0.1l-0.2,0.1l0.1,0.1l0.2,0.2l0.2,0.2l0.2,0.2l0.1,0.2l0.1,0.2
563
+ l0.1,0.2l0.1,0.2l0.1,0.3v0.3v0.3v0.3v0.3v0.3l-0.1,0.2l-0.1,0.2l-0.1,0.2l-0.1,0.2l-0.1,0.2l-0.2,0.2l-0.2,0.2l-0.2,0.2
564
+ l-0.2,0.1l-0.2,0.1l-0.2,0.1l-0.2,0.1l-0.4,0.1l-0.5,0.1l-0.5,0.1l-0.6,0.2l-1.3,0.3l-1.4,0.4l-1.5,0.4l-0.7,0.2l-0.7,0.2
565
+ l-0.3,0.1h0.1h0.4h0.4h0.4l0.4,0.1l0.4,0.1l0.4,0.1l0.2,0.1l0.2,0.1l0.6,0.2l0.5,0.2l0.5,0.2l0.5,0.1l0.5,0.1l0.5,0.1l0.5,0.1
566
+ l0.5,0.1l0.5,0.1l0.5,0.1l0.5,0.1l0.5,0.1h0.5h0.5h0.5h0.5h0.5h0.5h0.5h0.5h0.5h0.5h0.5h0.5l0.5-0.1l0.5-0.1l0.5-0.1l0.5-0.1
567
+ l0.5-0.1l0.5-0.1l0.5-0.1l0.5-0.1l0.5-0.1l0.5-0.1l1.1-0.2l1.1-0.2l1.1-0.2l1.1-0.3l1.1-0.3l2.2-0.6l2.2-0.6l1.1-0.3l1.1-0.3
568
+ l1.1-0.3l1.1-0.3l1.2-0.3l1-0.2l0,0l0.2-0.1l0.3-0.1l0.3-0.2l0.4-0.2l0.4-0.2l0.4-0.3l0.5-0.3l0.5-0.3l0.5-0.3l0.5-0.3l0.5-0.4
569
+ l0.5-0.4l0.5-0.4l0.5-0.4l0.5-0.4l0.5-0.4l0.2-0.2l0.2-0.2l0.2-0.2l0.2-0.2l0.2-0.2l0.2-0.2l0.2-0.2l0.1-0.2v-0.1l-0.4-0.1
570
+ l-0.4-0.1l-0.5-0.1l-0.5-0.1l-0.5-0.1l-0.6-0.1l-0.6-0.1l-0.6-0.1l-0.7-0.1l-0.7-0.1l-0.7-0.1l-0.7-0.1L253,273l-0.8-0.1h-0.8
571
+ l-0.8,0h-0.8H249h-0.8h-0.8h-0.8h-0.9h-0.9h-0.9H243h-0.9h-0.9h-0.9h-0.9h-0.9L238.9,273.1z"
572
+ />
573
+ </g>
574
+ <path
575
+ d="M708.1,249.1h0.2h0.1h0.1h0.1h0.2h0.1h0.1h0.1l0.1,0.1l0.2,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1
576
+ l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1v0.1l0.1,0.1v0.1l0.1,0.1
577
+ v0.1v0.1v0.1v0.1v0.1v0.1l-0.1,0.1v0.1l-0.1,0.1l-0.1,0.1v0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1
578
+ l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.4,0.2l-0.4,0.2l-0.4,0.2l-0.4,0.2
579
+ l-0.4,0.2l-0.4,0.2l-0.4,0.2l-0.4,0.1l-0.4,0.1l-0.4,0.1l-0.4,0.1l-0.4,0.1l-0.4,0.1l-0.4,0.1l-0.4,0.1l-0.4,0.1l-0.4,0.1
580
+ l-0.4,0.1h-0.4h-0.4H701h-0.4h-0.4h-0.4H699h-0.8h-0.9h-1h-0.2h-0.3h-0.2h-0.2l-0.4-0.1l-0.4-0.1l-0.4-0.1l-0.4-0.1l-0.7-0.2
581
+ l-0.2-0.1l-0.2-0.1h-0.1h-0.1h-0.1h-0.1h-0.2H692h-0.1h-0.2h-0.1h-0.1h-0.2h-0.1h-0.1H691l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1
582
+ l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1
583
+ l-0.1-0.1v-0.1l-0.1-0.1v-0.1l-0.1-0.1v-0.1v-0.1v-0.1v-0.1v-0.1V253v-0.1l0.1-0.1v-0.1l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1
584
+ l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1h0.1l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1h0.1
585
+ l0.1-0.1h0.1h0.1h0.1h0.1h0.1h0.1h0.2h0.1h0.1h0.1h0.1h0.2h0.4h0.2h0.3h0.2h0.2l0.4,0.1l0.4,0.1l0.4,0.1l0.7,0.2l0.3,0.1
586
+ l0.3,0.1l0.2,0.1h0.2h0.7h0.9h0.7h0.8h0.3h0.3h0.4h0.3h0.3h0.2h0.3h0.3h0.2l0.2-0.1l0.3-0.1l0.2-0.1l0.3-0.1l0.3-0.1l0.2-0.1
587
+ l0.3-0.1l0.3-0.1l0.3-0.1l0.3-0.1l0.4-0.1l0.3-0.1l0.4-0.2l0.4-0.2l0.4-0.2l0.1-0.1l0.1-0.1h0.1h0.1h0.2h0.1h0.1h0.2h0.1h-0.1
588
+ V249.1z M693.9,255.9L693.9,255.9L693.9,255.9L693.9,255.9L693.9,255.9L693.9,255.9z"
589
+ />
590
+ <path
591
+ d="M698.7,232.2L698.7,232.2h0.2h0.1h0.1h0.1h0.1h0.1h0.1h0.1h0.1h0.1h0.1h0.1h0.1h0.1h0.1h0.1l0.1,0.1
592
+ l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1v0.1l0.1,0.1
593
+ l0.1,0.1l0.1,0.1v0.1l0.1,0.1l0.1,0.1v0.1v0.1l0.1,0.1v0.1v0.1l0.1,0.1v0.1v0.1v0.1v0.1v0.1v0.1l-0.1,0.1v0.1v0.1l-0.1,0.1v0.1
594
+ l-0.1,0.1v0.1l-0.1,0.1v0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1v0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1
595
+ l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1h-0.1h-0.1h-0.1H700h-0.1h-0.1h-0.1h-0.1h-0.1h-0.1l-0.1,0.1
596
+ l-0.2,0.1l-0.2,0.1l-0.3,0.2l-0.5,0.4l-0.7,0.4l-0.7,0.5l-0.8,0.5l-0.4,0.2l-0.4,0.2l-0.4,0.2l-0.4,0.2l-0.4,0.2l-0.4,0.2
597
+ l-0.5,0.2l-0.4,0.2l-0.2,0.1l-0.2,0.1l-0.3,0.1h-0.2h-0.3H691h-0.3h-0.2h-0.1h-0.1h-0.1h-0.1H690h-0.1h-0.1h-0.1h-0.1h-0.1h-0.1
598
+ h-0.1h-0.1h-0.1H689h-0.1h-0.1l-0.1-0.1h-0.1h-0.1h-0.1h-0.1h-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1
599
+ l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1V241l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1v-0.1l-0.1-0.1l-0.1-0.1
600
+ l-0.1-0.1v-0.1l-0.1-0.1v-0.1l-0.1-0.1v-0.1v-0.1l-0.1-0.1v-0.1v-0.1v-0.1v-0.1V239v-0.1v-0.1l0.1-0.1v-0.1v-0.1v-0.1l0.1-0.1
601
+ v-0.1l0.1-0.1l0.1-0.1v-0.1l0.1-0.1l0.1-0.1l0.1-0.1v-0.1l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1
602
+ l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1h0.1h0.1h0.1h0.1h0.1h0.1h0.1h0.1h0.1h0.1h0.1h0.1h0.1h0.1h0.1h0.1h0.1h0.1
603
+ h0.1h0.1h0.1h0.1h0.1h0.1h0.1h0.1h0.1h0.1l0.2-0.1l0.3-0.1l0.2-0.2l0.3-0.2l0.4-0.2l0.7-0.4l0.7-0.4l0.7-0.4l0.7-0.4l0.3-0.2
604
+ l0.4-0.2l0.3-0.2l0.3-0.2l0.4-0.2l0.4-0.2l0.3-0.1l0.3-0.1h0.2h0.1h0.1h0.1h0.1L698.7,232.2L698.7,232.2z M699.1,238.1
605
+ L699.1,238.1L699.1,238.1L699.1,238.1L699.1,238.1z M692.9,237.4L692.9,237.4L692.9,237.4L692.9,237.4L692.9,237.4z"
606
+ />
607
+ <path
608
+ d="M688.9,250.5h0.5h0.5h0.5h0.2h0.2h0.2h0.1l0.2,0.1l0.1,0.1l0.2,0.1l0.2,0.1l0.2,0.1l0.2,0.1l0.1,0.1
609
+ l0.1,0.1l0.2,0.1l0.1,0.1l0.1,0.1l0.1,0.2l0.1,0.2l0.1,0.2l0.1,0.2l0.1,0.2l0.1,0.2l0.1,0.2v0.2v0.2l0.1,0.2l-0.1,0.2v0.2v0.2
610
+ l-0.1,0.2l-0.1,0.2l-0.1,0.2l-0.1,0.2l-0.1,0.2l-0.1,0.2l-0.1,0.2l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.2,0.1l-0.1,0.1
611
+ l-0.2,0.1l-0.2,0.1l-0.2,0.1l-0.2,0.1l-0.2,0.1h-0.2h-0.2h-0.2h-0.2h-0.5h-0.4H689h-0.4h-0.4h-0.5h-0.4h-0.4l-0.4,0.1l-0.5,0.1
612
+ l-0.4,0.1l-0.4,0.1l-0.5,0.1l-0.4,0.1l-0.4,0.1l-0.5,0.1l-0.9,0.2l-0.8,0.2l-0.9,0.2l-0.9,0.2l-0.9,0.2l-0.9,0.3l-0.9,0.3
613
+ l-0.9,0.3l-0.9,0.3l-0.9,0.3l-1.8,0.6l-1.8,0.6l-0.9,0.3l-0.9,0.3l-0.9,0.3l-0.9,0.3l-0.9,0.3l-0.9,0.3l-0.9,0.3l-1,0.2
614
+ l-0.9,0.2l-0.9,0.2h-0.2h-0.2h-0.2H661h-0.2h-0.2h-0.2h-0.2l-0.2-0.1l-0.2-0.1l-0.2-0.1l-0.1-0.1l-0.2-0.1l-0.2-0.1l-0.1-0.1
615
+ l-0.1-0.1l-0.2-0.1l-0.1-0.1l-0.1-0.2l-0.1-0.2l-0.1-0.2l-0.1-0.2l-0.1-0.2l-0.1-0.2l-0.1-0.2v-0.2l-0.1-0.2v-0.2v-0.2l0.1-0.2
616
+ v-0.2l0.1-0.2v-0.2l0.1-0.2l0.1-0.2l0.1-0.2l0.1-0.2l0.1-0.2l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1l0.2-0.1l0.1-0.1l0.2-0.1l0.2-0.1
617
+ l0.2-0.1l0.2-0.1l0.2-0.1h0.2l0.9-0.2l0.9-0.2l0.9-0.2l0.9-0.2l0.9-0.2l0.9-0.3l0.9-0.3l0.9-0.3l0.9-0.3l0.9-0.3l1.9-0.6
618
+ l1.8-0.6l0.9-0.3l0.9-0.3l0.9-0.3l0.9-0.3l0.9-0.3l0.9-0.3l0.9-0.2l1-0.2l0.9-0.2l0.9-0.2l0.5-0.1l0.5-0.1l0.5-0.1l0.5-0.1
619
+ l0.5-0.1l0.5-0.1l0.5-0.1l0.5-0.1l0.5-0.1h0.5h0.5h0.5L688.9,250.5z"
620
+ />
621
+ <path
622
+ fill="#25B3FF"
623
+ d="M616.5,62.9h0.5h0.5h0.5h0.5L619,63l0.5,0.1l0.5,0.1l0.5,0.1l0.2,0.1l0.2,0.1l0.3,0.1l0.2,0.1l0.2,0.1
624
+ l0.2,0.1l0.4,0.2l0.4,0.2l0.2,0.2l0.2,0.2l0.2,0.1l0.2,0.2l0.1,0.1h0.1h0.2h0.5h0.5h0.5h0.4h0.5l0.5,0.1l0.5,0.1l0.4,0.1
625
+ l0.5,0.1l0.4,0.1l0.4,0.1l0.5,0.1l0.2,0.1l0.2,0.1l0.3,0.1l0.1,0.1l0.3,0.2h0.1l0.1,0.1l0.1,0.1h0.1l0.2,0.2l0.2,0.2l0,0
626
+ l0.2,0.2l0.1,0.3l0,0l0.1,0.3l0.1,0.3l0,0v0.4v0.4l0,0l-0.1,0.3l-0.1,0.3l0,0l-0.1,0.2l-0.1,0.2l0,0l-0.1,0.2l-0.1,0.2h-0.1
627
+ l-0.2,0.3h-0.1l-0.2,0.1l-0.1,0.1l-0.1,0.1l-0.2,0.2l-0.2,0.1l-0.3,0.2l-0.3,0.1l-0.3,0.1l-0.3,0.1l-0.3,0.1l-0.3,0.1l-0.3,0.1
628
+ l-0.6,0.2l-0.7,0.2l-0.6,0.2l-0.6,0.1l-1.1,0.2l-0.9,0.2l-0.5,0.1l-0.4,0.1l-0.5,0.1l-0.5,0.1l-1,0.1h-0.1l-0.4,0.3l-0.5,0.4
629
+ l-0.5,0.4l-0.2,0.1l0.3-0.1h0.2l0.3-0.1h0.3h0.3l0,0h0.4l0.4,0.1l0.3,0.1l0.4,0.2l0.3,0.2l0.3,0.2l0.2,0.3l0.2,0.3l0.2,0.3
630
+ l0.1,0.3l0.1,0.1h0.4l1.1-0.1l2.3-0.3l1.1-0.1l1.2-0.1l1.2-0.1l1.2-0.1l0.5-0.1h0.6h0.6h0.6h0.6h0.6h0.6h0.6h0.1h0.4h0.1
631
+ l0.3,0.1l0.3,0.1h0.1l0.3,0.1l0.2,0.2l0.3,0.2l0,0l0.2,0.2l0.2,0.3l0.2,0.3l0.1,0.3l0.1,0.3l0,0l0.1,0.3v0.3v0.4l-0.1,0.4l0,0
632
+ l-0.1,0.3l-0.1,0.3l-0.1,0.3h-0.1l-0.1,0.2l-0.2,0.2l0,0l-0.1,0.1l-0.2,0.1l-0.1,0.1l-0.2,0.2l-0.1,0.1l-0.2,0.1l-0.2,0.1
633
+ l-0.3,0.2l-0.4,0.2l-0.3,0.1l-0.2,0.1l-1.3,0.6l-0.9,0.5l-0.8,0.4l-0.4,0.2l-0.4,0.2l-0.4,0.2l-0.4,0.2l-0.5,0.2l-0.5,0.2
634
+ l-0.5,0.2l-0.6,0.2l-1.4,0.4l-0.4,0.1l-0.4,0.1l-0.9,0.2l-0.9,0.2l-1.1,0.2l-1.1,0.3l-1.1,0.3L622,87l0.1,0.1h0.1l0.1,0.3
635
+ l0.1,0.1l0.1,0.3v0.1l0.1,0.2l0.1,0.3l0.1,0.3l0,0V89l-0.1,0.3l-0.1,0.3l-0.1,0.3h-0.1l-0.1,0.3l-0.1,0.3l-0.2,0.2l-0.2,0.2
636
+ l-0.2,0.2l0,0l-0.2,0.2l-0.3,0.2l-0.3,0.1l-0.3,0.1l-0.3,0.1l0,0h-0.1l0,0l-0.3,0.4l-0.4,0.5l-0.4,0.5l-0.4,0.5l-0.9,1.2
637
+ l-0.9,1.3l-0.9,1.3l-0.5,0.7l-0.5,0.6l-0.5,0.6l-0.5,0.6l-0.5,0.6l-0.5,0.6l-0.2,0.3l-0.2,0.3l-0.2,0.3l-0.2,0.2l-0.2,0.2
638
+ l-0.2,0.2l-0.2,0.2l-0.3,0.2l-0.2,0.2l-0.3,0.2l-0.3,0.2l-0.4,0.2l-0.2,0.1l-0.3,0.1h-0.1l-0.2,0.1H609h-0.3h-0.2h-0.2H608h-0.1
639
+ h-0.3h-0.2l-0.3-0.1H607l-0.4-0.1h-0.1l-0.4-0.1l-0.1-0.1l-0.3-0.2l-0.1-0.1l-0.2-0.2l-0.1-0.1l-0.2-0.2l-0.1-0.1l-0.2-0.2
640
+ l-0.2-0.2l-0.2-0.3l-0.2-0.3l-0.1-0.3l-0.1-0.3l-0.1-0.3l-0.1-0.3l-0.1-0.3l-0.1-0.3l-0.1-0.3l-0.1-0.3v-0.2l-0.7,0.8l-0.7,0.8
641
+ l-0.4,0.4l-0.3,0.3l-0.3,0.3l-0.4,0.3l-0.3,0.3l-0.3,0.3l-0.2,0.2l-0.2,0.2l-0.2,0.1l-0.3,0.2H599l-0.2,0.1l-0.2,0.1h-0.1h-0.2
642
+ h-0.2H598h-0.2h-0.2h0.4h-0.3h-0.2h-0.1l-0.3-0.1l-0.3-0.1h-0.1l-0.3-0.1l-0.2-0.2h-0.1l-0.2-0.2l-0.2-0.2l-0.1-0.1l-0.2-0.2
643
+ l-0.1-0.2l-0.1-0.1l-0.1-0.2l-0.1-0.2v-0.1l-0.1-0.3l-0.1-0.1l-0.1-0.3v-0.2l-0.1-0.3v-0.3V100v-0.1l-0.4,0.4l-0.6,0.9l-0.3,0.4
644
+ L593,102l-0.3,0.4l-0.3,0.4l-0.4,0.4l-0.3,0.4l-0.4,0.4l-0.2,0.2l-0.2,0.2l-0.2,0.2l-0.2,0.2l-0.2,0.2l-0.2,0.2l-0.2,0.1
645
+ l-0.3,0.2h-0.1l-0.2,0.1l-0.3,0.1h-0.1l-0.4,0.1h-0.4H588h-0.3h-0.4l0,0l-0.3-0.1l-0.3-0.1l-0.3-0.1l0,0l-0.2-0.2l-0.2-0.2
646
+ l-0.2-0.2l0,0l-0.2-0.2l-0.2-0.2l-0.1-0.2l0,0l-0.2-0.3l-0.1-0.3l0,0l-0.1-0.3l-0.1-0.3V103v-0.2l-0.1,0.2l-0.2,0.4l-0.3,0.4
647
+ l-0.2,0.4l-0.2,0.2l-0.1,0.2l-0.2,0.2l-0.2,0.2l-0.2,0.2l-0.2,0.2l-0.2,0.2l-0.2,0.2l-0.3,0.2l-0.4,0.2l-0.2,0.1l-0.2,0.1
648
+ l-0.1,0.1l-0.3,0.1h-0.1l-0.3,0.1h-0.2h-0.3h-0.3h-0.3h-0.2h-0.2h-0.2l-0.3-0.1h-0.1l-0.3-0.1h-0.1l-0.2-0.1l-0.2-0.1l0,0
649
+ l-0.2-0.1l-0.2-0.2h-0.1l-0.2-0.2l-0.1-0.2h-0.1l-0.1-0.2l-0.1-0.2l0,0l-0.1-0.3h-0.1l-0.1-0.2l-0.1-0.2l-0.1-0.1l-0.1-0.2V104
650
+ l-0.1-0.1v-0.3v-0.3V103v-0.3l0.1-0.3l0.1-0.3l0.1-0.3l0.1-0.3l0.2-0.6l0.1-0.6l0.2-0.7l0.2-0.7l0.4-1.4l0.5-1.5l0.2-0.7
651
+ l0.2-0.6l-0.6,0.3l-0.9,0.4l-0.9,0.4l-0.9,0.4l-0.9,0.4l-0.2,0.1l-0.6,0.7l-0.4,0.5l-0.4,0.5l-0.4,0.5l-0.5,0.5l-0.4,0.5
652
+ l-0.5,0.5l-0.5,0.5l-0.5,0.4l-0.5,0.4l-0.5,0.4l-0.3,0.2l-0.2,0.2l-0.2,0.2l-0.2,0.2l-0.3,0.2l-0.2,0.2l-0.2,0.2l-0.3,0.2
653
+ l-0.3,0.2l-0.3,0.1l-0.3,0.1l-0.3,0.1l-0.4,0.1l-0.4,0.1l-0.4,0.1H564h-0.2h-0.3h-0.2H563h-0.2l-0.3-0.1h-0.2l-0.3-0.1h-0.1
654
+ l-0.2-0.1l-0.2-0.1l-0.1-0.1l-0.2-0.1l-0.2-0.1l-0.1-0.1l-0.2-0.2l-0.2-0.2l-0.1-0.1l-0.1-0.2l-0.1-0.2l-0.1-0.1l-0.1-0.2
655
+ l-0.1-0.2l-0.1-0.1l-0.1-0.2l-0.1-0.2v-0.1l-0.1-0.3l-0.1-0.1V101v-0.2v-0.3l0,0h-0.2h-0.4l-0.4-0.1l-0.5-0.1l-0.2-0.1l-0.2-0.1
656
+ l-0.2-0.1l-0.2-0.1l-0.2-0.1l-0.2-0.1l-0.2-0.1l-0.1,0.1l-0.4,0.1l-0.3,0.1l-0.4,0.1H555h-0.3h-0.2h-0.2h-0.2H554h-0.3h-0.1
657
+ l-0.3-0.1l0,0l-0.4-0.1l0,0l-0.2-0.1l-0.2-0.1h-0.1l-0.2-0.1l-0.2-0.1h-0.1l-0.2-0.2l-0.2-0.2l0,0l-0.2-0.2l-0.2-0.2l0,0
658
+ l-0.2-0.3l-0.1-0.3l0,0l-0.1-0.2l-0.1-0.1l-0.3,0.2l-0.4,0.2l-0.5,0.2l-0.4,0.2l-0.3,0.1l-0.2,0.1l-0.2,0.1l-0.3,0.1l-0.3,0.1
659
+ l-0.3,0.1H547h-0.4h-0.4h-0.3h-0.2h-0.2l-0.3-0.1h-0.1l-0.4-0.1h-0.1l-0.2-0.1l-0.2-0.1l-0.2-0.1l-0.2-0.1l-0.2-0.2l-0.2-0.2
660
+ l-0.2-0.2l-0.2-0.2l-0.1-0.2l-0.2-0.2l-0.1-0.2l-0.1-0.3h-0.1l-0.1-0.2l-0.1-0.2l0,0l-0.1-0.2V96l0,0v-0.2l0,0l-0.4,0.3
661
+ l-0.8,0.6l-0.8,0.6l-1.7,1.2l-1.7,1.2l-0.8,0.6l-0.9,0.6l-0.8,0.6l-0.9,0.6l-0.9,0.6l-0.9,0.6l-0.9,0.6l-0.4,0.3l-0.5,0.3
662
+ l-0.5,0.3l-0.5,0.3l-0.5,0.3l-0.4,0.3l-0.5,0.3l-0.5,0.2l-0.5,0.2l-0.5,0.2l-0.5,0.2l-0.5,0.2l-0.5,0.2l-0.5,0.2l-0.5,0.2
663
+ l-0.5,0.2l-0.5,0.2l-0.5,0.2l-0.2,0.1h-0.2h-0.2H521h-0.1h-0.3h-0.4l0,0H520l-0.2-0.1l-0.2-0.1h-0.1l-0.3-0.1l-0.2-0.2l-0.3-0.2
664
+ l-0.2-0.2l0,0l-0.2-0.2l-0.2-0.3l-0.1-0.2l-0.3-0.2l-0.2-0.3l0,0l-0.2-0.3l-0.1-0.3l-0.1-0.1l-0.1-0.3l-0.1-0.3l-0.1-0.1v-0.2
665
+ l-0.1-0.2v-0.2v-0.4l0.1-0.3v-0.3l0.1-0.3l0.1-0.3l0.1-0.3l0.1-0.3l0.1-0.3l0.1-0.2l0.1-0.2l0.1-0.2l0.1-0.2l0.2-0.2l0.1-0.2
666
+ l0.2-0.2l0.2-0.2l0.1-0.2l0.2-0.2l0.4-0.3l0.3-0.3l0.4-0.3l0.4-0.2l0.4-0.2l0.4-0.2l0.3-0.2l0.4-0.2l0.4-0.2l0.7-0.3l1.2-0.6
667
+ l0.6-0.3l0.2-0.1l0.2-0.1l0.2-0.1l0.2-0.1l0.2-0.1l0.2-0.1l0.5-0.3l0.5-0.3l0.5-0.3l0.5-0.3l0.5-0.3l0.5-0.3l1.1-0.6l1.1-0.6
668
+ l1.1-0.6l1.1-0.6l1.1-0.6l1.1-0.6l1.1-0.6l1.1-0.6l1.1-0.6l2.2-1.1l2.2-1.1l0.2-0.1l0.2-0.1l0.2-0.1l0.2-0.1h0.1l0.9-0.5
669
+ l0.9-0.5l0.9-0.5l0.9-0.5l0.9-0.5l0.9-0.4l0.9-0.4l0.9-0.4l0.9-0.4l0.9-0.4l0.9-0.4l0.9-0.4l0.2-0.1l0.2-0.1l0.2-0.1l0,0
670
+ l0.4-0.1h0.4h0.4l0.4,0.1l0.4,0.1l0.3,0.2l0.4,0.2l0.2,0.2l0.2,0.3l0.1,0.1l2.1-0.4l4.8-1l2.3-0.5l2.3-0.5l0.4-0.2l0.4-0.2
671
+ l0.4-0.2l0.4-0.2l0.4-0.2l0.2-0.1l0.2-0.1l0.2-0.1l0.2-0.1l0.4-0.1h0.2h0.4h0.1h0.3h0.2h0.1h0.2l0.3,0.1l0,0l0.2,0.1l0.1-0.1
672
+ l0.2-0.3l0.2-0.3l0.2-0.3l0.2-0.3l0.2-0.3l0.2-0.2l0.2-0.2l0.2-0.2l0.3-0.2l0.2-0.2l0.2-0.2l0.2-0.2l0.3-0.2l0.2-0.2l0.3-0.2
673
+ l0.2-0.2l0.5-0.3l0.6-0.3l0.4-0.2l0.1-0.3l0.1-0.3l0,0l0.2-0.2l0.1-0.2l0.2-0.2l0,0l0.2-0.2l0.2-0.2l0,0l0.3-0.2l0.1-0.1
674
+ l0.2-0.1l0.4-0.1l0.3-0.1l0.3-0.1l0.3-0.1l0.2-0.1l0.5-0.1l0.5-0.1l0.4-0.1l0.6-0.1l0.7-0.1l1.2-0.2l1.2-0.2l0.5-0.1l0.6-0.1
675
+ l0.5-0.1l0.2-0.2l0.6-0.4l0.6-0.4l0.5-0.4l0.6-0.3l0.5-0.3l0.9-0.6l0.8-0.5l0.3-0.2l0.3-0.2l0.3-0.2l0.4-0.3l0.5-0.3l0.5-0.4
676
+ l0.5-0.4l0.5-0.4l0.6-0.4l0.5-0.4l0.3-0.2l0.3-0.2l0.3-0.2l0.3-0.2l0.3-0.2l0.4-0.1l0.4-0.1l0.3-0.1l0.2-0.1h0.2h0.4h0.2h0.4
677
+ h0.1h0.2h0.2h0.1l0.2,0.1l0.2,0.1h0.1l0.2,0.1l0.2,0.1l0,0l0.2,0.2l0.2,0.2h0.1l0.2,0.2l0.2,0.2l0,0l0.1,0.2l0.1,0.2l0,0
678
+ l0.1,0.2l0.4-0.1l0.6-0.1l0.5-0.1l0.6-0.1l0.5-0.1l0.6-0.1l0.5-0.1l0.5-0.1l0.6-0.1l0.5-0.1l0.5-0.1l0.5-0.1h0.6h0.5h0.5
679
+ L616.5,62.9z M609.5,90.5L609.5,90.5l0.1,0.4l0.1,0.2l0.1,0.3v0.2l0.1,0.2v0.4l0,0.4V93v0.4l-0.1,0.4l-0.1,0.8l-0.1,0.9
680
+ l-0.1,0.9l-0.1,0.1l0.3-0.4l0.5-0.6l0.4-0.6l0.5-0.6L612,93l0.9-1.3l0.4-0.6l0,0l-0.3,0.1l-0.2,0.1l-0.3,0.1h-0.2H612h-0.1h-0.2
681
+ h-0.2h-0.1l-0.3-0.1l-0.3-0.1h-0.1l-0.3-0.1l-0.3-0.1l0,0l-0.2-0.2l-0.2-0.2L609.5,90.5L609.5,90.5z M586.1,91.5L586.1,91.5
682
+ l-0.5,0.3l0,0l-0.1,0.4v0.2l0.2-0.3L586.1,91.5l0.1-0.1L586.1,91.5z M599.9,89l-0.8,0.1l-0.1,0.1l-0.5,0.3l-0.4,0.3l-0.5,0.3
683
+ l-0.3,0.2h0.3h0.2h0.4h0.1h0.2h0.2h0.1l0.2,0.1l0.2,0.1h0.1l0.2,0.1l0.2,0.1v-0.2l0.1-0.3l0.2-0.3l0.1-0.3l0,0l0.2-0.2l0.1-0.2
684
+ l0,0L599.9,89z"
685
+ />
686
+ <path
687
+ fill="#25B3FF"
688
+ d="M474.6,336.5h0.3h0.4l0.4,0.1l0.4,0.1l0.4,0.1l0.4,0.1l0.3,0.1l0.3,0.1l0.3,0.1l0.3,0.1l0.3,0.2l0.5,0.3
689
+ l0.5,0.3l0.4,0.3l0.4,0.3l0.4,0.2l0.3,0.2l0.1,0.1l0.1,0.1l0.3,0.1l0.2,0.1l0.2,0.1h0.1l0.4,0.1l0.5,0.1l0.5,0.1l0.5,0.1
690
+ l0.5,0.1l0.9,0.2l0.9,0.2l0.9,0.2l1.8,0.4l0.8,0.2l0.8,0.2l0,0l0.2-0.1l0.2-0.1h0.2h0.2h0.2h0.2h0.2h0.2h0.3h0.2l0.5,0.1
691
+ l0.5,0.1l0.5,0.1l0.4,0.1l0.4,0.1l0.4,0.2l0.2,0.1l0.2,0.1l0.2,0.1l0.1,0.1l0.2,0.1l0,0l0.2,0.1l0.1,0.1l0.1,0.1l0,0l0.1,0.2
692
+ l0.1,0.2l0.1,0.2l0.1,0.2l0.1,0.2l0,0l0.1,0.2v0.2l0.1,0.2v0.2v0.2v0.2v0.2v0.2l0,0l-0.1,0.2l-0.1,0.2l-0.1,0.2l-0.1,0.2
693
+ l-0.1,0.2l-0.1,0.2l-0.1,0.2l-0.1,0.2h-0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.2,0.1l-0.1,0.1l-0.2,0.1h-0.1l-0.1,0.1l-0.2,0.1
694
+ l-0.2,0.1h-0.1h-0.2h-0.2h-0.2h-0.3h-0.2h-0.3h-0.2H493l-0.5-0.1l-0.5-0.1v0.1l-0.1,0.2l-0.1,0.2l-0.1,0.2l-0.1,0.2l-0.1,0.2
695
+ l-0.1,0.2l-0.2,0.1l-0.1,0.1l-0.2,0.1l-0.2,0.1l-0.2,0.1l-0.2,0.1h-0.1l-0.2,0.1l-0.2,0.1h-0.2h-0.2l0,0h-0.2h-0.1h-0.2h-0.6
696
+ h-0.6h-0.5h-0.6l-1.2,0.1h-1.2h-0.6h-0.7h-0.6h-0.7h-0.7h-0.7l-0.7-0.1h-0.1H479h-0.8h-0.8h-0.8h-0.8h-1.5h-1.5h-1.5h0.7
697
+ l-0.9,0.4l-1.1,0.5l-0.7,0.3l-0.2,0.2l-0.3,0.3l-0.4,0.3l-0.5,0.3l-0.2,0.2l-0.2,0.2l-0.2,0.1l-0.2,0.1l-0.2,0.1l-0.2,0.1
698
+ l-0.2,0.1l-0.3,0.1l-0.2,0.1h-0.1h-0.2h-0.1h-0.1h-0.2h-0.1h-0.1h-0.2h-0.2h-0.1h-0.1h-0.2h-0.2l-0.2-0.1l-0.2-0.1h-0.1
699
+ l-0.4,0.1l-0.6,0.2l-0.6,0.1l-0.4,0.1l-0.3,0.1l-0.3,0.1h-0.3h-0.4H460h-0.3h-0.3H459h-0.3h-0.4h-0.2h-0.2h-0.2h-0.1h-0.1h-0.2
700
+ l-0.2-0.1l-0.1-0.1l-0.2-0.1l0,0l-0.2-0.1l-0.2-0.1l-0.1-0.1l-0.2-0.1l0,0l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.2
701
+ l-0.1-0.2l-0.1-0.2l0,0l-0.1-0.2l-0.1-0.2l-0.1-0.2v-0.2L455,351v-0.2v-0.2l0,0v-0.2l0.1-0.2l0.1-0.2v-0.2l0.1-0.2l0.1-0.2l0,0
702
+ l0.1-0.2l0.1-0.1l0.1-0.1l0.1-0.1l0,0l0.1-0.2l0.2-0.1l0.1-0.1h0.1l0.1-0.1l0.1-0.1l0.1-0.1l0.2-0.1l0.2-0.1l0.2-0.1l0.4-0.2
703
+ l0.4-0.2l0.5-0.2l0.8-0.3l0,0l0.1-0.2l0,0l0.1-0.1l0.1-0.1l0.1-0.1l0,0l0.1-0.1l0.1-0.1l0,0l0.1-0.2l0.1-0.2l0.1-0.1l0.1-0.1
704
+ l0.1-0.1l0.2-0.2l0.3-0.2l0.2-0.2l0.2-0.2l0.2-0.1l0.3-0.1l0.5-0.3l0.5-0.2l0.5-0.2l0.5-0.2l0.5-0.2l0.8-0.4l0.7-0.3l0.2-0.1
705
+ l0,0l1.2-0.6l0.8-0.4l0.4-0.2l0.4-0.2l0.4-0.2l0.4-0.2l0.4-0.1l0.2-0.1h0.1l0,0v-0.1v-0.1v-0.2v-0.1l0.1-0.2v-0.2v-0.1l0.1-0.1
706
+ v-0.1l0.1-0.2l0.1-0.3l0.1-0.3l0.2-0.3l0.1-0.2l0.2-0.2l0.2-0.2l0.2-0.2l0.2-0.2l0.2-0.2l0.2-0.2l0.3-0.1l0.3-0.1l0.3-0.1
707
+ l0.3-0.1h0.2h0.3L474.6,336.5z"
708
+ />
709
+ <path
710
+ fill="#25B3FF"
711
+ d="M632.9,316.7h0.5h0.5h0.4h0.2h0.2l0.2,0h0.2h0.2l0.2,0.1l0.2,0.1l0.2,0.1l0.1,0.1l0.2,0.1l0.1,0.1l0.2,0.1
712
+ l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.2l0.1,0.2l0.1,0.2l0.1,0.2l0.1,0.2l0.1,0.2l0.1,0.2v0.2l0.1,0.2v0.2v0.2l-0.1,0.2v0.2
713
+ l-0.1,0.2l-0.1,0.2v0.2l-0.1,0.2l-0.1,0.2l-0.1,0.2l-0.1,0.2l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.2,0.1l-0.1,0.1
714
+ l-0.2,0.1l-0.1,0.1l-0.2,0.1l-0.2,0.1h-0.2h-0.2h-0.2h-0.2h-0.2l-0.4,0h-0.4h-0.4h-0.4h-0.4h-0.4h-0.4h-0.4h-0.4l-0.4,0.1
715
+ l-0.4,0.1l-0.4,0.1l-0.8,0.1l-0.8,0.1l-0.8,0.2l-0.8,0.2l-0.8,0.2l-0.8,0.2l-0.8,0.2l-0.3,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1
716
+ l-0.2,0.1l-0.1,0.1l-0.2,0.1l-0.2,0.1l-0.1,0.1l-0.2,0.1l-0.2,0.1l-0.5,0.2l-0.7,0.2l-0.8,0.2l-0.8,0.2l-0.4,0.1l-0.5,0.1
717
+ l-0.4,0.1l-0.5,0.1l-0.4,0.1l-0.4,0.1l-7,0.8h-0.5h-0.6h-0.5h-0.6h-0.8h-0.2h-0.2h-0.2h-0.2h-0.2l-0.1-0.1l-0.2-0.1l-0.2-0.1
718
+ l-0.2-0.1l-0.1-0.1l-0.1-0.1l-0.2-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.2l-0.1-0.2l-0.1-0.2l-0.1-0.2
719
+ l-0.1-0.2l-0.1-0.2v-0.2l-0.1-0.2v-0.2v-0.2l0.1-0.2v-0.2l0.1-0.2l0.1-0.2l0.1-0.2l0.1-0.2l0.1-0.2l0.1-0.2l0.1-0.1l0.1-0.1
720
+ l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1l0.2-0.1l0.1-0.1l0.2-0.1l0.1-0.1l0.2-0.1l0.2-0.1h0.2h0.2h0.2h0.2h0.2h0.2h0.4h0.4h0.4h0.4
721
+ l0,0l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1l0.2-0.1l0.2-0.1l0.3-0.1l0.3-0.1l0.2-0.1l0.3-0.1l0.2-0.1l0.2-0.1l0.5-0.1
722
+ l0.5-0.1l0.5-0.1l0.5-0.1l0.6-0.1h0.6h0.6h0.6h0.6l1.2-0.1h1.1h0.4l1.3-0.3l1.7-0.4l0.9-0.2l0.8-0.2l0.9-0.2l0.9-0.2l0.9-0.2
723
+ l0.9-0.2l0.9-0.2l0.9-0.1l0.5-0.1l0.5-0.1l0.5-0.1l0.4-0.1l0.5-0.1h0.5h0.5h0.5L632.9,316.7z"
724
+ />
725
+ <g transform="matrix(1,0,0,1,400.214,44.558)">
726
+ <path
727
+ d="M208.6,8l0.8,0h0.8l0.8,0h0.8l0.8,0h0.8l0.8,0.1l0.8,0.1l0.8,0.1l0.8,0.1l0.8,0.1l0.8,0.1l0.8,0.1l0.8,0.1
728
+ l0.8,0.1l0.8,0.1l0.8,0.1l0.8,0.2l0.8,0.2l0.8,0.2l0.8,0.2l0.8,0.2l0.8,0.2l0.8,0.2l0.8,0.2l0.8,0.2l0.8,0.2l0.8,0.2l0.8,0.2
729
+ l0.8,0.2l0.8,0.2l0.8,0.3l0.8,0.3l0.8,0.3l0.8,0.3l0.8,0.3l0.8,0.3L239,14l0.8,0.3l1.5,0.6l1.5,0.6l1.5,0.6l1.4,0.6l1.4,0.6
730
+ l1.4,0.6l1.3,0.6l1.3,0.6l1.3,0.6l1.2,0.6l1.2,0.6l0.4,0.2l0.4,0.2l0.4,0.2l0.4,0.2l0.4,0.2l0.4,0.2l0.4,0.2l0.4,0.2l0.9,0.4
731
+ l0.9,0.3l0.9,0.3l0.9,0.3l1,0.3l1,0.3l1,0.3l1,0.3l2,0.6l2.1,0.6l2.1,0.6l1.1,0.3l1.1,0.3l1.1,0.3l1.1,0.4l1.1,0.4l1.1,0.4
732
+ l1.1,0.4l1.1,0.4l0.6,0.2l0.6,0.2l0.5,0.2l0.6,0.2l0.6,0.2L284,31l0.6,0.3l0.6,0.3l0.6,0.3l0.6,0.3l0.5,0.3l0.5,0.3l0.9,0.5
733
+ l0.9,0.5l0.9,0.5l0.9,0.5l0.9,0.5l0.9,0.5l0.8,0.5l0.8,0.5l0.8,0.5l0.8,0.5l0.8,0.5l0.8,0.5l0.8,0.5l0.8,0.5l0.8,0.5l0.8,0.6
734
+ l0.8,0.6l0.8,0.6l0.8,0.6l0.8,0.6l0.8,0.6l0.8,0.6l0.7,0.6l0.7,0.6l0.7,0.6l0.7,0.6l0.7,0.6l0.7,0.6l0.7,0.6l0.7,0.6l0.7,0.6
735
+ l0.7,0.6l0.7,0.6l0.7,0.6l0.7,0.6l0.7,0.6l0.7,0.6l0.7,0.6l0.7,0.6l0.6,0.6l0.6,0.7l0.6,0.7l0.6,0.7l0.6,0.7l0.6,0.7l0.6,0.7
736
+ l0.6,0.7l0.6,0.7l0.6,0.7l0.6,0.7l0.6,0.7l0.6,0.7l0.6,0.7l0.6,0.7l0.6,0.7l0.6,0.7l0.5,0.7l0.5,0.7l0.5,0.7l0.5,0.7l0.5,0.7
737
+ l0.5,0.7l0.5,0.7l0.5,0.7l0.5,0.7l0.5,0.7l0.5,0.7l0.5,0.7l0.5,0.8l0.5,0.8l0.5,0.8l0.5,0.8l0.5,0.8l0.5,0.8l0.5,0.8l0.5,0.8
738
+ l0.5,0.8l0.5,0.8l0.4,0.8l0.4,0.8l0.4,0.8l0.4,0.8l0.4,0.8l0.4,0.8l0.4,0.8l0.4,0.8l0.4,0.8l0.4,0.8l0.4,0.8l0.4,0.8l0.4,0.8
739
+ l0.4,0.8l0.4,0.8l0.4,0.8l0.4,0.8l0.4,0.8l0.4,0.8l0.4,0.8l0.4,0.8l0.4,0.8l0.4,0.9l0.4,0.9l0.7,1.7l0.7,1.7l0.7,1.7l0.7,1.8
740
+ l0.6,1.8l0.6,1.8l0.6,1.8l0.6,1.8l0.6,1.8l0.6,1.8l0.6,1.8l0.5,1.9l0.5,1.8l0.1,0.4l0.1,0.4l0.1,0.4l0.1,0.4l0.1,0.4l0.1,0.4
741
+ l0.1,0.4l0.1,0.4l0.1,0.4l0.2,0.4l0.3,0.8l0.3,0.7l0.4,0.8l0.4,0.8l0.4,0.8l0.4,0.8l0.4,0.8l0.8,1.6l0.4,0.8l0.4,0.8l0.4,0.9
742
+ l0.4,0.9l0.4,0.9l0.4,0.9l0.2,0.5l0.2,0.5l0.2,0.5l0.2,0.5l0.2,0.5l0.2,0.5l0.2,0.5l0.2,0.5l0.2,0.5l0.2,0.5l0.1,0.5l0.1,0.5
743
+ l0.1,0.5l0.1,0.5l0.1,0.6l0.1,0.5l0.1,0.6l0.1,0.6l0.1,0.6l0.1,0.6v0.6v0.6v0.6v0.5l-0.1,0.9l-0.2,0.9l-0.3,0.8l-0.4,0.8
744
+ l-0.5,0.7l-0.6,0.6l-0.7,0.5l-0.8,0.4l-0.8,0.3l-0.9,0.1H360l-0.9-0.1l-0.9-0.3l-0.8-0.4l-0.7-0.5l-0.7-0.6l-0.6-0.7l-0.4-0.8
745
+ l-0.3-0.8l-0.2-0.9l-0.1-0.9v-0.4v-0.3v-0.3v-0.3V153v-0.3v-0.3l-0.1-0.3l-0.1-0.3l-0.1-0.3l-0.1-0.3l-0.1-0.3l-0.1-0.3
746
+ l-0.1-0.3l-0.1-0.3l-0.1-0.3l-0.1-0.3l-0.1-0.3l-0.1-0.3l-0.1-0.3l-0.1-0.3l-0.1-0.3l-0.1-0.3l-0.1-0.3l-0.3-0.7l-0.3-0.7
747
+ l-0.4-0.7l-0.4-0.7l-0.4-0.8l-0.4-0.8l-0.8-1.6l-0.4-0.8l-0.4-0.8l-0.4-0.9l-0.4-0.9l-0.4-0.9l-0.4-0.9l-0.4-0.9l-0.2-0.5
748
+ l-0.2-0.5l-0.2-0.5l-0.2-0.5l-0.2-0.5l-0.2-0.5l-0.2-0.5l-0.2-0.5l-0.2-0.5l-0.1-0.5l-0.5-1.8l-0.5-1.8l-0.5-1.8l-0.5-1.7
749
+ l-0.6-1.7l-0.6-1.7l-0.6-1.7l-0.6-1.7l-0.6-1.7l-0.6-1.7l-0.6-1.6l-0.6-1.6l-0.7-1.6l-0.3-0.8l-0.3-0.8l-0.3-0.8l-0.3-0.8
750
+ l-0.3-0.8l-0.3-0.8l-0.3-0.8l-0.4-0.8l-0.4-0.8l-0.4-0.8l-0.4-0.8l-0.4-0.8l-0.4-0.8l-0.4-0.8l-0.4-0.8l-0.4-0.7l-0.4-0.7
751
+ L331,94l-0.4-0.7l-0.4-0.7l-0.4-0.7l-0.4-0.7l-0.4-0.7l-0.4-0.7l-0.4-0.7l-0.4-0.7l-0.4-0.7L327,87l-0.4-0.7l-0.4-0.7l-0.4-0.7
752
+ l-0.4-0.7l-0.4-0.7l-0.5-0.7l-0.5-0.7l-0.5-0.7l-0.5-0.7l-0.5-0.7l-0.5-0.7l-0.5-0.7l-0.5-0.7l-0.5-0.7l-0.5-0.7l-0.5-0.7
753
+ l-0.5-0.6l-0.5-0.6L318,74l-0.5-0.6l-0.5-0.6l-0.5-0.6l-0.5-0.6l-0.5-0.6l-0.5-0.6l-0.5-0.6l-0.5-0.6l-0.5-0.6l-0.6-0.6
754
+ l-0.6-0.6l-0.6-0.6l-0.6-0.6l-0.6-0.6l-0.6-0.6l-0.6-0.6l-0.6-0.6l-0.6-0.6l-0.6-0.6l-0.6-0.6l-0.6-0.6l-0.6-0.6l-0.6-0.6
755
+ l-0.6-0.6l-0.6-0.6l-0.6-0.6l-0.6-0.5l-0.7-0.5l-0.7-0.5l-0.7-0.5l-0.7-0.5l-0.7-0.5l-0.7-0.5l-0.7-0.5l-0.7-0.5l-0.7-0.5
756
+ l-0.7-0.5l-0.7-0.5l-0.7-0.5l-0.7-0.5l-0.7-0.5l-0.7-0.5l-0.7-0.5l-0.7-0.5l-0.8-0.5l-0.8-0.5l-0.8-0.5l-0.8-0.5l-0.8-0.5
757
+ l-0.8-0.5l-0.8-0.5l-0.8-0.5l-0.8-0.5l-0.8-0.5l-0.8-0.5l-0.4-0.2l-0.4-0.2l-0.4-0.2l-0.4-0.2l-0.4-0.2l-0.4-0.2l-0.4-0.2
758
+ l-0.4-0.2l-0.4-0.2l-0.5-0.2l-0.5-0.2l-0.4-0.2l-0.9-0.4l-0.9-0.4l-0.9-0.3l-1-0.3l-1-0.3l-1-0.3l-1-0.3l-1-0.3l-2-0.6
759
+ l-2.1-0.6l-2.1-0.6l-1.1-0.3l-1.1-0.3l-1.1-0.3l-1.1-0.4l-1.1-0.4l-1.1-0.4l-1.1-0.4l-1.1-0.4l-0.6-0.2l-0.5-0.2l-0.5-0.2
760
+ l-0.5-0.2l-0.5-0.2l-0.5-0.3l-0.5-0.3l-0.5-0.3l-1.1-0.6l-1.2-0.6l-1.2-0.6l-1.2-0.6l-1.2-0.6l-1.3-0.6l-1.3-0.6l-1.3-0.6
761
+ l-1.3-0.5l-1.4-0.5l-1.4-0.5l-0.7-0.3l-0.7-0.2l-0.7-0.3l-0.7-0.2l-0.7-0.2l-0.7-0.2l-0.7-0.2l-0.7-0.2L230,24l-0.7-0.2
762
+ l-0.7-0.2l-0.7-0.2l-0.7-0.2l-0.7-0.2l-0.7-0.2l-0.7-0.2l-0.7-0.2l-0.7-0.2L223,22l-0.7-0.2l-0.7-0.1l-0.7-0.1l-0.7-0.1
763
+ l-0.7-0.1l-0.7-0.1l-0.7-0.1l-0.7-0.1l-0.7-0.1l-0.7-0.1l-0.7-0.1l-0.6-0.1h-0.6h-0.6h-0.6h-0.6l-0.6,0h-0.6h-0.6h-0.6h-0.6
764
+ h-0.6h-0.5l-0.9,0.1l-0.9,0.1l-0.9,0.1l-0.9,0.1l-0.9,0.1l-0.9,0.2l-0.9,0.2l-0.9,0.2l-0.9,0.2l-0.9,0.2l-0.9,0.2l-0.9,0.2
765
+ l-0.9,0.2l-0.9,0.2l-0.9,0.2l-0.9,0.3l-0.9,0.3l-0.9,0.3l-0.9,0.3l-0.9,0.3l-0.9,0.3l-0.9,0.3l-0.9,0.3l-0.9,0.3l-0.9,0.3
766
+ l-0.9,0.3l-0.9,0.3l-0.9,0.4l-0.9,0.4l-0.9,0.4l-0.9,0.4l-0.9,0.4l-0.9,0.4l-0.9,0.4l-0.9,0.4l-0.9,0.4l-0.9,0.4l-0.9,0.4
767
+ l-0.9,0.4l-0.9,0.4l-1.7,0.9l-1.7,0.9l-1.7,0.9l-1.7,0.9l-1.7,0.9l-1.7,0.9l-1.7,0.9l-1.7,0.9l-3.4,1.9l-3.4,1.9l-0.5,0.3
768
+ l-0.6,0.3l-0.6,0.3l-0.6,0.3l-0.6,0.3l-0.6,0.3l-0.6,0.3l-0.6,0.3l-0.6,0.2l-0.6,0.2l-1.2,0.5l-1.2,0.5l-1.2,0.5l-1.2,0.4
769
+ l-1.2,0.4l-2.3,0.9l-2.3,0.8l-1.1,0.4l-1.1,0.4L132,51l-1.1,0.4l-1.1,0.4l-0.5,0.2l-0.5,0.2l-0.5,0.2l-0.5,0.2l-0.5,0.2
770
+ l-0.5,0.2l-0.5,0.2l-0.5,0.2l-0.5,0.2l-0.5,0.2l-0.5,0.2l-0.4,0.3l-0.4,0.2l-0.4,0.3l-0.4,0.3l-0.4,0.3l-0.4,0.3l-0.4,0.3
771
+ l-0.4,0.3l-0.4,0.3l-0.3,0.3l-0.3,0.3l-0.3,0.3l-0.3,0.3l-0.3,0.3l-0.3,0.3l-1.1,1.1l-1.2,1.2l-2.3,2.3l-2.4,2.3l-2.4,2.3
772
+ l-4.7,4.6l-2.3,2.3l-2.3,2.3L99,77.9L97.8,79l-1.2,1.1l-1.1,1.2l-1.1,1.1l-1.1,1.2l-1.1,1.2L91.1,86L90,87.2l-1.1,1.2l-1.1,1.2
773
+ l-1.1,1.2L85.6,92l-1.1,1.2l-1.1,1.2l-1,1.2l-0.9,1.1l-0.9,1.1l-0.9,1.1l-0.9,1.1l-0.9,1.1l-0.9,1.1l-0.9,1.1l-0.9,1.2
774
+ l-0.9,1.2l-0.9,1.2l-0.8,1.2l-0.8,1.2l-0.8,1.2l-0.8,1.2l-0.8,1.2l-0.8,1.2l-0.8,1.2l-0.8,1.2l-0.8,1.3l-0.8,1.3l-0.8,1.3
775
+ l-0.8,1.3l-0.7,1.3l-0.7,1.3l-0.7,1.3l-0.7,1.3l-0.7,1.3l-0.7,1.3l-0.7,1.3l-0.7,1.3l-0.7,1.3l-0.7,1.3l-0.6,1.3l-0.6,1.3
776
+ l-0.6,1.4l-0.6,1.4l-0.6,1.4l-0.6,1.4l-0.6,1.4l-0.5,1.4l-0.5,1.4l-0.5,1.4l-0.5,1.4l-0.5,1.4l-0.5,1.4l-0.5,1.4l-0.4,1.4
777
+ l-0.4,1.4l-0.4,1.4l-0.4,1.4l-0.4,1.4l-0.4,1.4l-0.3,1.4l-0.3,1.4l-0.3,1.4l-0.3,1.4l-0.3,1.4l-0.3,1.4l-0.2,1.4l-0.1,0.7
778
+ l-0.1,0.7l-0.1,0.7l-0.1,0.7l-0.1,0.7l-0.1,0.7l-0.1,0.7l-0.1,0.7l-0.1,0.7l-0.1,0.7l-0.1,0.7l-0.1,0.7l-0.1,0.7l-0.1,0.7
779
+ l-0.1,0.7l-0.2,0.7l-0.2,0.7l-0.2,0.7l-0.2,0.7l-0.2,0.7L42,187l-0.2,0.7l-0.2,0.6l-0.2,0.6l-0.2,0.6l-0.2,0.6l-0.2,0.6
780
+ l-0.2,0.6l-0.5,1.2l-0.5,1.2l-0.5,1.2l-0.5,1.1l-0.5,1.1l-1,2.2l-0.1,0.3l-0.2,0.3l-0.3,0.7l-0.2,0.4l-0.2,0.4l-0.2,0.4
781
+ l-0.2,0.4l-0.2,0.4l0,0v0.1v0.9l-0.2,0.9l-0.3,0.8l-0.4,0.8l-0.5,0.7l-0.6,0.6l-0.7,0.5l-0.8,0.4l-0.8,0.3l-0.9,0.2h-0.9
782
+ l-0.9-0.1l-0.9-0.2l-0.8-0.4l-0.7-0.5l-0.7-0.6l0,0l-0.6-0.6l0,0l-0.4-0.7l0,0l-0.3-0.7v-0.1l-0.2-0.6l-0.1-0.3l-0.1-0.5
783
+ l-0.1-0.5v-0.5v-0.7l0.1-0.6l0.1-0.5l0.1-0.5l0.1-0.4l0.1-0.4l0.1-0.4l0.1-0.4l0.1-0.3l0.1-0.4l0.3-0.6l0.3-0.6l0.3-0.6
784
+ l0.3-0.5l0.2-0.5l0.4-0.7l0.1-0.1l0.9-2l0.5-1.1l0.5-1.1l0.4-1.1l0.4-1.1l0.4-1.1l0.2-0.5l0.2-0.5l0.2-0.5l0.2-0.5l0.2-0.5
785
+ l0.2-0.5l0.2-0.5l0.2-0.5l0.1-0.5l0.1-0.5l0.1-0.5l0.1-0.5l0.1-0.5l0.1-0.5l0.1-0.5l0.1-0.4l0.1-0.4l0.1-0.5l0.1-0.7l0.1-0.8
786
+ l0.1-0.8l0.1-0.8l0.1-0.8l0.1-0.8l0.1-0.8l0.1-0.8l0.1-0.8l0.1-0.8l0.3-1.5l0.3-1.5l0.3-1.5l0.3-1.5l0.3-1.5l0.4-1.5l0.4-1.5
787
+ l0.4-1.5l0.4-1.5l0.4-1.5l0.4-1.5l0.5-1.5l0.5-1.5l0.5-1.5l0.5-1.5l0.5-1.5l0.5-1.5l0.6-1.5l0.6-1.5l0.6-1.5l0.6-1.5l0.6-1.5
788
+ l0.6-1.5l0.6-1.5l0.7-1.4l0.7-1.4l0.7-1.4l0.7-1.4l0.7-1.4l0.7-1.4l0.7-1.4l0.7-1.4l0.8-1.4l0.8-1.4l0.8-1.4l0.8-1.4l0.8-1.4
789
+ l0.8-1.4l0.8-1.4l0.8-1.3l0.8-1.3l0.8-1.3l0.9-1.3l0.9-1.3l0.9-1.3l0.9-1.3l0.9-1.3l0.9-1.3l0.9-1.3l0.9-1.2l0.9-1.2l0.9-1.2
790
+ l0.9-1.2l0.9-1.2l0.9-1.2l1-1.2l1-1.2l1-1.2l1-1.1l1.1-1.3l1.1-1.3l1.1-1.3l1.1-1.2l1.1-1.2l1.1-1.2l1.1-1.2l1.2-1.2l1.2-1.2
791
+ l1.2-1.2l1.2-1.2l1.2-1.2l1.2-1.2l1.2-1.2l1.2-1.2l1.2-1.2l2.4-2.3l2.4-2.3l4.7-4.6l2.3-2.3l2.3-2.3l2.3-2.3l1.1-1.1l1.2-1.2
792
+ l0.5-0.5l0.5-0.5l0.5-0.5l0.5-0.4l0.5-0.4l0.5-0.4l0.5-0.4l0.5-0.4l0.6-0.4l0.6-0.4l0.6-0.4l0.6-0.4l0.6-0.3l0.6-0.3l0.6-0.3
793
+ l0.6-0.3l0.6-0.3l0.6-0.3l0.6-0.3l0.6-0.3l0.6-0.3l0.6-0.3l0.6-0.3l0.6-0.3l0.6-0.3l0.6-0.3l1.2-0.5l1.2-0.5l1.2-0.5l1.2-0.5
794
+ l1.2-0.4l2.3-0.9l2.3-0.8l1.1-0.4l1.1-0.4l1.1-0.4l1.1-0.4l1-0.4l0.5-0.2l0.5-0.2l0.5-0.2l0.5-0.2l0.5-0.2l0.5-0.2l0.4-0.2
795
+ l0.4-0.2l0.4-0.2l0.4-0.2l3.4-1.8l3.4-1.9l1.7-0.9l1.7-0.9l1.7-0.9l1.8-0.9l1.8-0.9l1.8-0.9l1.8-0.9L167,22l0.9-0.4l0.9-0.4
796
+ l0.9-0.4l0.9-0.4l0.9-0.4l0.9-0.4l0.9-0.4l0.9-0.4l0.9-0.4L176,18l0.9-0.4l0.9-0.4l0.9-0.4l0.9-0.4l1-0.4l1-0.4l1-0.4l1-0.4
797
+ l1-0.3l1-0.3l1-0.3l1-0.3l1-0.3l1-0.3l1-0.3l1-0.3l1-0.3l1-0.3l1-0.2l1-0.2l1-0.2l1-0.2l1-0.2l1-0.2l1-0.2l1-0.2l1-0.2l1-0.1
798
+ l1-0.1l1.1-0.1l0.8-0.1l0.8-0.1L208.6,8z M35.3,198.2l-0.1-0.2l-0.1-0.1L35.3,198.2z M34.9,197.7l-0.2-0.3l-0.3-0.3L34.9,197.7
799
+ z"
800
+ />
801
+ </g>
802
+ <g transform="matrix(1,0,0,1,381.866,45.2348)">
803
+ <path
804
+ d="M223.3,0.9l1.4-0.1l1.4-0.1l1.4-0.1l1.4,0l1.4,0l1.4,0l1.4,0l1.4,0l1.4,0l1.4,0l1.4,0l1.4,0l1.4,0l1.4,0.1
805
+ l1.4,0.1l1.4,0.1l1.4,0.1l1.4,0.1l1.4,0.1l1.4,0.1l1.4,0.1l1.4,0.1l1.4,0.1l1.4,0.2l1.4,0.2l1.4,0.2l1.4,0.2l1.4,0.2l1.4,0.2
806
+ l1.4,0.2l1.4,0.2l1.4,0.2l1.4,0.3l1.4,0.3l1.4,0.3l1.4,0.3l1.4,0.3l1.3,0.3l1.3,0.3l1.3,0.3l1.3,0.4l1.3,0.4l1.3,0.4l1.3,0.4
807
+ l1.3,0.4l1.3,0.4l1.3,0.4l1.3,0.4l1.3,0.5L292,10l1.3,0.5l1.3,0.5l1.3,0.5l1.3,0.5l1.3,0.6l1.3,0.6l1.2,0.6l1.2,0.6l1.2,0.6
808
+ l1.2,0.6l1.2,0.6l1.2,0.7l1.2,0.7l1.2,0.7l1.2,0.7l1.2,0.7l1.2,0.7l1.2,0.8l1.1,0.8l1.1,0.8l1.1,0.8l0.6,0.4l0.6,0.4l0.6,0.4
809
+ l0.5,0.4l0.5,0.4l0.5,0.4l0.5,0.4l0.5,0.4l0.5,0.4l0.5,0.4l0.5,0.5l0.5,0.4l0.5,0.5l0.5,0.5l0.5,0.5l0.5,0.5l0.5,0.5l0.5,0.5
810
+ l0.5,0.5l0.5,0.5l0.5,0.5l0.5,0.5l0.5,0.5l0.5,0.5l0.5,0.5l0.5,0.5l0.5,0.5l0.5,0.5l0.5,0.5l0.5,0.5l0.5,0.5l0.5,0.5l0.5,0.6
811
+ l0.5,0.5l0.5,0.6l0.5,0.6l0.4,0.6l0.4,0.6l0.4,0.6l0.4,0.6l0.4,0.6l0.4,0.6l0.4,0.6l0.4,0.6l0.4,0.6l0.4,0.6l0.4,0.6l0.4,0.6
812
+ l0.4,0.6l0.4,0.6l0.4,0.6l0.4,0.6l0.4,0.6l0.4,0.6l0.1,0.2l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.2l0.1,0.1l0.1,0.2
813
+ l0.1,0.1l0.3,0.4l0.3,0.4l0.4,0.4l0.4,0.4l0.4,0.4l0.5,0.4l0.5,0.4l1,0.9l1.1,1l0.6,0.5l0.6,0.5l0.6,0.6l0.6,0.6l0.6,0.6
814
+ l0.6,0.6l0.6,0.7l0.6,0.7l0.3,0.4l0.3,0.4l0.3,0.4l0.3,0.4l0.3,0.4l0.3,0.4l0.3,0.4l0.3,0.4l0.3,0.4l0.3,0.4l0.3,0.4l0.3,0.5
815
+ l0.3,0.5l0.3,0.5l0.3,0.5l0.2,0.4l0.2,0.4l0.2,0.4l0.2,0.4l0.2,0.4l0.2,0.4l0.2,0.4l0.2,0.4l0.2,0.4l0.2,0.4l0.2,0.4l0.5,0.8
816
+ l0.5,0.8l0.5,0.8l0.5,0.8l0.6,0.8l0.6,0.8l0.6,0.8l0.6,0.8l0.6,0.8l1.3,1.7l1.3,1.7l0.7,0.9l0.7,0.9l0.7,0.9l0.7,0.9l0.7,0.9
817
+ l0.7,0.9l0.7,1l0.7,1l0.6,1l0.3,0.5l0.3,0.5l0.3,0.5l0.3,0.5l0.3,0.5l0.3,0.5l0.3,0.5l0.3,0.5l0.3,0.6l0.3,0.6l0.3,0.6l0.3,0.7
818
+ l0.3,0.7l0.3,0.6l0.3,0.6l0.3,0.6l0.3,0.6l0.3,0.6l0.2,0.6l0.2,0.6l0.2,0.6l0.2,0.6l0.2,0.6l0.2,0.6l0.4,1.2l0.4,1.2l0.4,1.2
819
+ l0.4,1.2l0.3,1.2l0.3,1.2l0.3,1.2l0.6,2.3l0.6,2.3l0.3,1.1l0.3,1.1l0.3,1.1l0.3,1.1l0.3,1.1l0.3,1.1l0.4,1.1l0.2,0.5l0.2,0.5
820
+ l0.2,0.5l0.2,0.5l0.2,0.5l0.2,0.5l0.2,0.5l0.2,0.5l0.2,0.5l0.2,0.5l0.2,0.5l0.2,0.5l0.2,0.5l0.3,0.6l0.2,0.4l0.2,0.5l0.2,0.4
821
+ l0.2,0.5l0.3,0.9l0.3,1l0.4,1.1l0.4,1.1l0.4,1.2l0.4,1.3l0.8,2.7l0.9,2.8l0.9,2.9l0.9,2.9l0.4,1.4l0.4,1.4l0.4,1.3l0.4,1.3
822
+ l0.4,1.2l0.4,1.1l0.4,1l0.3,0.9l0.2,0.4l0.1,0.3l0.1,0.1l0.7,0.9l0.6,0.9l0.5,1l0.4,1.1l0.2,1.1l0.1,1.1l-0.1,1.1l-0.2,1.1
823
+ l-0.3,1.1l-0.5,1l-0.6,0.9l-0.7,0.9l-0.8,0.8l0,0l-0.8,0.6l-0.8,0.5l0,0l-0.9,0.4l-1,0.3l0,0l-1,0.2l-1,0.1l0,0h-1l-1-0.1h-0.1
824
+ l-0.7-0.2l-0.7-0.2h-0.1l-0.6-0.3l-0.6-0.3h-0.1l-0.9-0.6l-0.3-0.3l-0.6-0.5l-0.5-0.5l-0.4-0.4l-0.3-0.4l-0.4-0.6l-0.4-0.6
825
+ l-0.3-0.6l-0.3-0.5l-0.2-0.5l-0.2-0.5l-0.2-0.5l-0.2-0.5l-0.2-0.5l-0.2-0.6l-0.4-1.1l-0.4-1.2l-0.4-1.3l-0.4-1.3l-0.5-1.4
826
+ l-0.5-1.4l-0.5-1.4l-0.5-1.5l-0.9-3l-0.9-2.9l-0.9-2.8l-0.8-2.6l-0.4-1.2l-0.4-1.1l-0.3-1l-0.3-0.9l-0.3-0.7l-0.2-0.6l-0.1-0.2
827
+ l-0.1-0.1l0,0l0,0l-0.3-0.6l-0.3-0.7l-0.3-0.7l-0.3-0.7l-0.3-0.7l-0.3-0.7l-0.3-0.7l-0.3-0.7l-0.3-0.7l-0.2-0.7l-0.2-0.7
828
+ l-0.2-0.7l-0.2-0.7l-0.2-0.7l-0.4-1.3l-0.4-1.3l-0.4-1.3l-0.4-1.2l-0.3-1.2l-0.3-1.2l-0.3-1.2l-0.6-2.3l-0.6-2.3L366,118
829
+ l-0.3-1.1l-0.3-1.1l-0.3-1.1l-0.3-1l-0.3-1l-0.3-1l-0.2-0.5l-0.2-0.5l-0.2-0.5l-0.2-0.5l-0.2-0.5l-0.2-0.5l-0.2-0.5l-0.2-0.5
830
+ l-0.2-0.5l-0.2-0.5l-0.2-0.5l-0.2-0.5l-0.2-0.4l-0.2-0.5l-0.2-0.4L361,104l-0.2-0.4l-0.2-0.4l-0.2-0.4l-0.2-0.4L360,102
831
+ l-0.2-0.4l-0.2-0.4l-0.2-0.4l-0.5-0.8l-0.5-0.8l-0.5-0.8l-0.5-0.8l-0.6-0.8l-0.6-0.8l-0.6-0.8l-0.6-0.8l-0.6-0.8l-1.3-1.7
832
+ l-1.3-1.7l-0.7-0.9l-0.7-0.9l-0.7-0.9l-0.7-0.9l-0.7-0.9l-0.7-0.9l-0.7-1l-0.7-1l-0.6-1l-0.3-0.5l-0.3-0.5l-0.3-0.5l-0.3-0.5
833
+ l-0.3-0.5l-0.3-0.5l-0.3-0.5l-0.3-0.5l-0.3-0.6l-0.2-0.5l-0.1-0.2l-0.1-0.2l-0.1-0.2l-0.1-0.2l-0.1-0.2l-0.1-0.2l-0.1-0.2
834
+ l-0.1-0.2l-0.1-0.2l-0.1-0.2l-0.1-0.2l-0.1-0.2l-0.2-0.2l-0.2-0.2l-0.2-0.2l-0.2-0.2l-0.4-0.4l-0.4-0.4l-0.4-0.4l-0.4-0.4
835
+ l-0.5-0.4l-0.5-0.4l-0.5-0.5l-0.5-0.5l-1.1-1l-1.1-1l-0.6-0.5l-0.6-0.6l-0.6-0.6l-0.6-0.6l-0.6-0.6l-0.6-0.7l-0.6-0.7l-0.3-0.4
836
+ l-0.3-0.4l-0.3-0.4l-0.3-0.4l-0.3-0.4l-0.3-0.4l-0.3-0.4l-0.3-0.4l-0.3-0.4l-0.2-0.4l-0.4-0.6l-0.3-0.5l-0.3-0.5l-0.3-0.5
837
+ l-0.3-0.5l-0.3-0.5l-0.3-0.5l-0.3-0.5l-0.3-0.5l-0.3-0.5l-0.3-0.5l-0.3-0.5l-0.3-0.5l-0.4-0.5l-0.4-0.5l-0.4-0.5l-0.4-0.5
838
+ l-0.4-0.5l-0.4-0.4l-0.4-0.4l-0.4-0.4l-0.4-0.4l-0.4-0.4l-0.4-0.4l-0.4-0.4l-0.4-0.4l-0.4-0.4l-0.4-0.4l-0.4-0.4l-0.4-0.4
839
+ l-0.4-0.4l-0.4-0.4l-0.4-0.4l-0.4-0.4l-0.4-0.4l-0.4-0.4l-0.4-0.4l-0.4-0.4l-0.4-0.4l-0.4-0.4l-0.4-0.4l-0.4-0.4l-0.4-0.4
840
+ l-0.4-0.4l-0.4-0.4l-0.4-0.4l-0.4-0.4l-0.4-0.3l-0.4-0.4l-0.4-0.3l-0.5-0.3l-0.5-0.3l-0.5-0.3l-0.4-0.3l-0.9-0.7l-0.9-0.6
841
+ l-0.9-0.6l-1-0.6l-1-0.6l-1-0.6l-1-0.6l-1-0.6l-1-0.6l-1-0.5l-1-0.5l-1-0.5l-1-0.5l-1-0.5l-1.1-0.5l-1.1-0.5l-1.1-0.5l-1.1-0.5
842
+ l-1.1-0.4l-1.1-0.4l-1.1-0.4l-1.1-0.4l-1.1-0.4l-1.1-0.4l-1.1-0.4l-1.1-0.4l-1.1-0.4L278,23l-1.2-0.3l-1.2-0.3l-1.2-0.3
843
+ l-1.2-0.3l-1.2-0.3l-1.2-0.3l-1.2-0.3l-1.2-0.3l-1.2-0.2l-1.2-0.2l-1.2-0.2l-1.2-0.2l-1.2-0.2l-1.2-0.2l-1.2-0.2l-1.2-0.2
844
+ l-1.2-0.2l-1.2-0.2l-1.2-0.1l-1.2-0.1l-1.3-0.1l-1.3-0.1l-1.3-0.1l-1.3-0.1l-1.3-0.1l-1.3-0.1l-1.3-0.1l-1.3-0.1l-1.3-0.1H241
845
+ l-1.3,0h-1.3h-1.3h-1.3h-1.3l-1.3,0h-1.3h-1.3h-1.3H228l-1.3,0l-1.3,0.1l-1.3,0.1l-1.3,0.1l-1.3,0.1l-1.3,0.1l-1.3,0.1
846
+ l-1.3,0.1l-1.3,0.1l-1.3,0.1l-1.3,0.1l-1.3,0.1l-1.3,0.1l-1.3,0.1l-1.3,0.2l-1.3,0.2l-1.3,0.2l-1.2,0.2l-1.2,0.2l-1.2,0.2
847
+ l-1.2,0.2l-1.2,0.2l-1.2,0.2l-1.2,0.2l-1.2,0.2l-1.2,0.2l-1.2,0.2l-1.2,0.2l-1.2,0.2l-1.2,0.2l-1.2,0.2l-1.2,0.3l-1.2,0.3
848
+ l-1.3,0.3l-1.3,0.3l-1.3,0.3l-1.2,0.3l-1.2,0.3l-1.2,0.3l-1.2,0.3l-1.2,0.4l-1.2,0.4l-1.2,0.4l-1.2,0.4l-1.1,0.4l-1.1,0.4
849
+ l-1.1,0.4l-1.1,0.4l-1.1,0.4l-1.1,0.4l-1.1,0.4l-1.1,0.4l-1.1,0.4l-1,0.5l-1,0.5l-1,0.5l-1,0.5l-1,0.5l-1,0.5l-1,0.5l-1,0.5
850
+ l-1,0.5l-1,0.5l-1,0.5l-0.9,0.5l-0.9,0.5l-0.9,0.6l-0.9,0.6l-0.9,0.6l-0.9,0.6l-0.9,0.6l-0.9,0.6l-0.9,0.6l-0.9,0.6l-0.9,0.6
851
+ l-0.9,0.6l-0.9,0.6l-0.8,0.6l-0.8,0.6l-0.8,0.7l-0.8,0.7l-0.8,0.7l-0.8,0.7l-0.8,0.7l-0.8,0.7l-0.8,0.7l-0.8,0.7l-0.8,0.7
852
+ l-0.8,0.7l-0.8,0.7l-0.8,0.7l-0.8,0.7l-0.8,0.7L127,55l-0.8,0.8l-0.8,0.8l-0.8,0.8l-0.8,0.8l-0.7,0.8l-0.7,0.8l-0.7,0.8
853
+ l-0.7,0.8l-0.1,0.1l-0.1,0.2l-0.2,0.5l-0.2,0.5l-0.3,0.5l-0.5,0.9l-0.5,0.9l-0.6,0.9l-0.6,0.9l-0.6,0.9l-0.6,0.9l-0.6,0.9
854
+ l-0.6,0.9l-0.6,0.9l-0.7,0.9l-0.7,0.9l-0.7,0.9l-0.7,0.8l-0.7,0.8l-0.7,0.8l-0.7,0.8l-0.7,0.8l-0.7,0.8l-0.7,0.8l-0.7,0.8
855
+ l-0.7,0.8l-0.7,0.8l-0.7,0.8l-1.5,1.6l-1.5,1.6l-1.5,1.6l-1.1,1.2l-0.2,0.3l-1.4,2l-1.4,2l-1.4,2l-1.4,2l-2.8,4.1l-2.9,4.1
856
+ l-2.9,4.2l-1.5,2.1l-1.5,2.1l-1.5,2.1l-1.5,2.1l-1.2,1.7l-0.4,0.9l-0.5,1.2l-0.5,1.2l-0.5,1.2l-0.5,1.2l-0.5,1.2l-0.5,1.2
857
+ l-0.9,2.5l-0.9,2.5l-0.9,2.5l-0.9,2.6l-0.9,2.6l-1.8,5.2l-0.9,2.6l-0.9,2.6l-0.9,2.6l-1,2.6l-1,2.6l-0.5,1.3l-0.5,1.3l-0.5,1.3
858
+ l-0.5,1.3l-0.5,1.3l-0.5,1.4l-0.4,0.9l-0.4,0.9l-0.4,0.9l-0.4,0.9l-0.4,0.9l-0.4,0.9l-0.4,0.9l-0.4,0.9l-0.4,0.9l-0.4,0.9
859
+ l-0.4,0.8l-0.4,0.8l-0.4,0.8l-0.4,0.8l-0.4,0.8l-0.5,0.8l-0.9,1.6l-0.9,1.6l-0.9,1.5l-0.9,1.5l-1.8,3l-0.9,1.5l-0.8,1.5
860
+ l-0.2,0.3l-0.2,0.4l-0.2,0.5l-0.3,0.5l-0.3,0.6l-0.3,0.6l-0.6,1.4l-1.4,3l-0.7,1.5l-0.7,1.5l-0.4,0.7l-0.3,0.7l-0.3,0.7
861
+ l-0.4,0.7l-0.4,0.6l-0.4,0.6l-0.2,0.4l-0.2,0.4l-0.2,0.4l-0.3,0.4l-0.4,0.5l-0.5,0.5l-0.3,0.3l-0.7,0.6l-0.1,0.1l-0.5,0.4
862
+ l-0.6,0.4h-0.1l-0.7,0.3l-0.7,0.3l0,0l-0.6,0.2l-0.6,0.2l0,0l-0.7,0.1l-0.7,0.1l0,0h-0.9l-0.9-0.1l0,0l-0.9-0.2l-0.9-0.3l0,0
863
+ l-0.9-0.4l-0.8-0.5l0,0l-0.6-0.5l-0.6-0.5l0,0l-0.5-0.5l-0.5-0.6l0,0l-0.5-0.7l-0.4-0.7v-0.1l-0.3-0.7l-0.2-0.7v-0.1l-0.2-1
864
+ l-0.1-0.5l-0.1-0.8v-0.6v-0.6v-0.4l0.1-1.1l0.3-1.1l0.4-1l0.5-1l0.7-0.9l0.8-0.8l0.9-0.7l0.3-0.2l0.5-1.1l0.7-1.4l1.2-2.6v-0.1
865
+ v-0.5v-0.7V188v-0.7v-0.7v-0.7l0-0.7l0.1-0.7l0.1-0.7l0.1-0.7l0.1-0.7l0.1-0.7l0.1-0.7l0.1-0.7l0.1-0.7l0.1-0.7l0.1-0.7
866
+ l0.1-0.7l0.1-0.7l0.2-0.7l0.2-0.7l0.2-0.7l0.2-0.7l0.2-0.7l0.2-0.7l0.2-0.7l0.2-0.7l0.2-0.7l0.2-0.7l0.2-0.7l0.2-0.7l0.2-0.7
867
+ l0.2-0.7l0.5-1.4l0.5-1.4l0.5-1.4l0.5-1.4l0.5-1.4l0.6-1.4l0.6-1.4l0.6-1.4l0.6-1.4l0.6-1.4l0.6-1.4l0.6-1.4l0.7-1.4l0.7-1.4
868
+ l0.7-1.4l0.7-1.4l0.7-1.4l0.7-1.4l0.7-1.3l0.7-1.3l0.7-1.3l0.7-1.3l0.7-1.3l0.7-1.3l0.7-1.3l0.8-1.3l0.8-1.3l0.8-1.3l0.8-1.2
869
+ l0.8-1.2l0.8-1.2l0.8-1.2l0.3-0.4l0.6-1.1l1-1.9l1-1.9l1-1.9l1-1.9l1-1.9l1-1.9l1-1.9l0.5-0.9l0.5-0.9l0.5-0.9l0.5-0.9l0.5-0.9
870
+ l0.5-0.9l0.6-0.9l0.6-0.9l0.6-0.9l0.6-0.9l0.4-0.7l0.2-0.5l0.6-1.3l0.6-1.3l0.7-1.3l0.7-1.3l0.7-1.3l0.7-1.3l0.7-1.3l0.7-1.3
871
+ l0.7-1.3l0.7-1.3l0.8-1.3l0.8-1.3l0.8-1.3l0.8-1.3l0.8-1.3l0.8-1.3l0.9-1.3l0.5-0.7l0.5-0.7l0.5-0.7l0.5-0.7l0.5-0.7l0.5-0.7
872
+ l0.5-0.7l0.5-0.7l0.5-0.7l0.6-0.7l0.6-0.7l0.6-0.7l0.6-0.7l0.6-0.7l0.6-0.7l0.6-0.7l0.6-0.7l0.6-0.7l0.6-0.7l0.6-0.7l0.6-0.7
873
+ l0.6-0.7l0.6-0.7l0.6-0.7l0.6-0.7l0.6-0.6l0.6-0.6l0.6-0.6l0.6-0.6l0.6-0.6l0.6-0.6l0.6-0.6l1.5-1.5l0.9-0.9l1-1l1-1l1.1-1
874
+ l0.5-0.5l0.5-0.5l0.5-0.5l0.5-0.5l0.5-0.5l0.6-0.5l0.6-0.4l0.6-0.4l0.6-0.4l0.4-0.2l0.3-0.2l0.4-0.2l0.4-0.2l0.4-0.2l0.5-0.3
875
+ l0.6-0.3l0.8-0.3l0.5-0.1l1-0.2h0.1l0,0l0.2-0.2l0.8-0.8l0.9-0.8l0.9-0.8l0.9-0.8l0.9-0.8l0.9-0.8l0.9-0.8l0.9-0.8l0.9-0.8
876
+ l0.9-0.8l0.9-0.8l0.9-0.8l0.9-0.8l0.9-0.8l0.9-0.8l1-0.8l1-0.7l1-0.7l1-0.7l1-0.7l1-0.7l1-0.7l1-0.7l1-0.7l1-0.7l1-0.7l1.1-0.7
877
+ l1.1-0.7l1.1-0.7l1.1-0.6l1.1-0.6l1.1-0.6l1.1-0.6l1.1-0.6l1.1-0.6l1.1-0.6l1.1-0.6l1.2-0.6l1.2-0.6l1.2-0.5l1.2-0.5l1.2-0.5
878
+ l1.2-0.5l1.2-0.5l1.2-0.5l1.2-0.5l1.3-0.5l1.3-0.5l1.3-0.5l1.3-0.5l1.3-0.4L170,9l1.3-0.4l1.3-0.4l1.4-0.4l1.4-0.4l1.4-0.4
879
+ l1.4-0.4l1.4-0.4l1.4-0.3l1.4-0.3l1.4-0.3l1.3-0.3l1.3-0.3l1.3-0.3l1.3-0.3l1.3-0.3l1.3-0.3l1.3-0.2l1.3-0.2l1.3-0.2l1.3-0.2
880
+ l1.3-0.2l1.3-0.2l1.3-0.2l1.3-0.2l1.3-0.2l1.3-0.2l1.3-0.2l1.4-0.2l1.4-0.2l1.4-0.2l1.4-0.1l1.4-0.1l1.4-0.1l1.4-0.1l1.4-0.1
881
+ l1.4-0.1l1.4-0.1l1.4-0.1l1.4-0.1L223.3,0.9z M388.7,162.8l-0.7,0.6l0.9-0.7l0.8-0.4L388.7,162.8z M390.5,161.8l-0.5,0.3
882
+ l0.9-0.4L390.5,161.8z M392.2,161.4l0.4-0.1h-0.2L392.2,161.4z"
883
+ />
884
+ <path
885
+ d="M156.3,235.9l1.3-0.1l1.3-0.1h1.4h1.3h1.3h1.4h1.3h1.4h1.3h1.3h1.3h1.3h1.3h1.3l1.3,0.1l1.3,0.1l1.3,0.1
886
+ l1.3,0.1l1.3,0.1l1.3,0.1l2.6,0.2l2.7,0.2l2.6,0.2l2.6,0.2l5.3,0.4l2.6,0.2l2.6,0.2l2.6,0.2l2.6,0.2l2.6,0.2l1.3,0.1l1.3,0.1
887
+ l1.3,0.1l1.3,0.1h1.3h1.3h1.3h1.3h1.3h1.3h1.3h1.2h1.2l1.2,0h1.2h1.2l1.2-0.1l1.2-0.1l1.2-0.1l1.2-0.1l1.2-0.1l1.2-0.1l1.2-0.1
888
+ l1.2-0.1l1.2-0.2l1.2-0.2l1.2-0.2l1.1-0.2l1.1-0.2l1.1-0.2l0.9-0.2l0.9-0.2l1-0.2l1-0.2l1-0.2l1-0.2l1-0.3l1-0.3l1-0.3l1-0.3
889
+ l2.1-0.6l2.1-0.6l2.1-0.6l4.3-1.3l2.2-0.6l2.2-0.6l2.2-0.6l2.3-0.6l1.1-0.3l1.1-0.3l1.2-0.3l1.2-0.3l1.2-0.3l1.2-0.3l1.2-0.3
890
+ l1.2-0.3l1.2-0.3l1.2-0.2l1.2-0.2l1.2-0.2l1.2-0.2l1.2-0.2l1.2-0.2l1.2-0.2l1.2-0.2l1.2-0.1l1.2-0.1l1.2-0.1l1.2-0.1l1.2-0.1
891
+ l1.2-0.1h1.2h0.6h0.6h0.6h0.6h0.6h0.6h0.6h0.6h0.6h0.6h0.6h0.6l0.6,0.1l0.6,0.1l0.6,0.1l0.6,0.1l0.6,0.1l0.6,0.1l0.6,0.1
892
+ l0.6,0.1l0.6,0.1l0.6,0.1l0.6,0.1l0.6,0.1l2.6,0.5l2.6,0.5l5.4,1.1l2.8,0.6l2.8,0.6l2.9,0.6l2.9,0.6l2.9,0.6l3,0.6l1.5,0.3
893
+ l1.5,0.3l1.5,0.3l1.5,0.3l1.5,0.3l1.5,0.2l1.5,0.2l1.5,0.2l1.5,0.2l1.5,0.2l1.5,0.2l1.5,0.2l1.5,0.2l1.5,0.2l1.5,0.2l1.5,0.2
894
+ l1.5,0.2l1.5,0.2l1.5,0.1l1.5,0.1l1.5,0.1l1.5,0.1l1.5,0.1l1.4,0.1l1.4,0.1l1.4,0.1l1.4,0.1h1.4h1.4h1.4h1.4h1.4h1.3l1.3-0.1
895
+ h0.6h0.7h0.7h0.6h0.6h0.6l0.6-0.1l0.6-0.1l0.6-0.1l0.6-0.1l0.6-0.1l0.6-0.1l0.6-0.1l0.6-0.1l0.6-0.1l0.6-0.1l0.6-0.1l0.6-0.1
896
+ l0.6-0.1l0.6-0.1l0.5-0.1l0.6-0.1l0.6-0.1l0.5-0.1l0.5-0.1l0.5-0.1l0.5-0.1l0.6-0.1l1-0.1l1-0.1l1-0.1l1-0.1l2-0.1l1.9-0.1h0.9
897
+ l0.9-0.1l0.9-0.1l0.8-0.1l0.8-0.1h0.4h0.4l0.4-0.1l0.4-0.1l0.4-0.1l0.3-0.1l0.3-0.1l0.3-0.1l0.3-0.1l0.3-0.1l0.3-0.1l0.3-0.1
898
+ l0.3-0.1l0.3-0.1l0.2-0.1l0.2-0.1l0.2-0.1l0.2-0.1l0.2-0.1l0.2-0.1l0.2-0.1l0.2-0.1l0.2-0.1l0.2-0.1l0.1-0.1l0.1-0.1l0.1-0.1
899
+ l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.2l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1v-0.1v-0.1
900
+ v-0.1v-0.1v-0.1v-0.1V228l0,0l0,0l0,0l0,0l0,0l0,0l0,0l0,0l0,0l0,0l0,0l0,0l0,0l0,0l0,0l0,0l0,0l0,0v-0.1v-0.1v-0.1v-0.1v-0.1
901
+ v-0.1v-0.1v-0.1v-0.1V227v-0.1v-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1
902
+ l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.2l-0.1-0.1l-0.3-0.3l-0.3-0.3l-0.3-0.3l-0.3-0.3l-0.3-0.3l-0.4-0.3l-0.4-0.3l-0.4-0.3
903
+ l-0.4-0.3l-0.4-0.3l-0.4-0.3l-0.4-0.3l-0.4-0.3l-0.4-0.3l-0.4-0.3l-0.5-0.3l-0.5-0.3l-0.5-0.3l-0.5-0.3l-0.5-0.3l-0.5-0.3
904
+ l-0.5-0.2l-0.5-0.2l-0.4-0.2l-0.4-0.2l-0.4-0.2l-0.4-0.2l-0.4-0.2l-0.4-0.2l-0.4-0.2l-0.4-0.1l-0.4-0.1l-0.4-0.1l-0.8-0.3
905
+ l-0.9-0.3l-1.7-0.6l-1.8-0.6l-0.9-0.3l-0.9-0.3l-0.9-0.3l-0.9-0.3l-0.8-0.3l-0.8-0.2l-0.8-0.2l-0.3-0.1l-0.8,0.4l-0.5,0.2
906
+ l-0.6,0.3l-0.7,0.2l-0.4,0.1l-0.9,0.2l-0.9,0.1l0,0h-1l-0.9-0.1l-0.9-0.2l-0.9-0.3l0,0l-1.1-0.5l-1-0.6l-0.9-0.7l-0.8-0.9
907
+ l-0.7-1l0,0l-0.5-0.9l-0.4-1l-0.3-1l-0.1-1v-1l0,0l0.1-1.1l0.2-1.1l0.4-1l0,0l0.4-0.8l0.5-0.8v-0.1l0.7-0.8l0.2-0.3l0.3-0.3
908
+ l0.9-0.8l1-0.7l1.1-0.5l1.2-0.4h0.1l0.2-0.1l0.7-0.3l0.4-0.2l0.4-0.2l0.4-0.2l0.5-0.2l0.5-0.2l0.5-0.2l0.6-0.1l0.7-0.1l0.8-0.1
909
+ l0.8-0.1h0.6h0.5l0.6,0.1l0.5,0.1l0.7,0.1l0.5,0.1l0.5,0.1l0.5,0.1l0.5,0.1l0.5,0.1l1,0.3l1.1,0.3l1,0.3l1,0.3l1,0.3l1,0.3
910
+ l1,0.3l1.8,0.6l1.7,0.6l0.8,0.3l0.8,0.3l0.6,0.2l0.6,0.2l0.6,0.2l0.6,0.3l0.7,0.3l0.7,0.3l0.7,0.3l0.7,0.3l0.7,0.3l0.7,0.3
911
+ l0.7,0.3l0.7,0.4l0.7,0.4l0.7,0.4l0.7,0.4l0.7,0.4l0.7,0.4l0.7,0.4l0.7,0.5l0.7,0.5l0.7,0.5l0.7,0.5l0.7,0.5l0.7,0.5l0.7,0.5
912
+ l0.6,0.5l0.6,0.6l0.6,0.6l0.6,0.6l0.6,0.6l0.6,0.6l0.6,0.7l0.6,0.7l0.3,0.4l0.3,0.3l0.3,0.3l0.3,0.4l0.3,0.4l0.3,0.4l0.3,0.4
913
+ l0.2,0.4l0.2,0.4l0.2,0.4l0.2,0.4l0.2,0.4l0.2,0.4l0.2,0.4l0.2,0.4l0.2,0.4l0.2,0.4l0.2,0.5l0.2,0.5l0.2,0.4l0.2,0.5l0.1,0.5
914
+ l0.1,0.5l0.1,0.5l0.1,0.5l0.1,0.5l0.1,0.5l0.1,0.5l0.1,0.5v0.5v0.5v0.5v0.5v0.5v0.5v0.5l-0.1,0.5l-0.1,0.6l-0.1,0.5l-0.1,0.5
915
+ l-0.1,0.5l-0.1,0.5l-0.2,0.5l-0.2,0.5l-0.2,0.5l-0.2,0.5l-0.2,0.5l-0.2,0.5l-0.2,0.5l-0.3,0.5l-0.3,0.5l-0.3,0.5l-0.3,0.5
916
+ l-0.3,0.5l-0.3,0.5l-0.3,0.5l-0.4,0.4l-0.4,0.4l-0.4,0.4l-0.4,0.4l-0.4,0.4l-0.4,0.4l-0.5,0.5l-0.6,0.5l-0.6,0.5l-0.6,0.5
917
+ l-0.6,0.4l-0.6,0.4l-0.6,0.4l-0.6,0.4l-0.6,0.3l-0.6,0.3l-0.6,0.3l-0.6,0.3l-0.6,0.3l-0.6,0.2l-0.6,0.2l-0.6,0.2l-0.6,0.2
918
+ l-0.6,0.2l-0.6,0.2l-0.6,0.2l-0.6,0.1l-0.6,0.1l-0.6,0.1l-0.6,0.1l-0.6,0.1l-0.6,0.1l-0.6,0.1l-0.6,0.1l-0.6,0.1l-0.6,0.1
919
+ l-1.1,0.1l-1.1,0.1l-1.1,0.1l-1.1,0.1l-1,0.1l-2,0.1l-1.9,0.1h-0.9l-0.9,0.1l-0.8,0.1l-0.8,0.1h-0.3h-0.4h-0.3h-0.3h-0.3
920
+ l-0.3,0.1H414l-0.3,0.1l-0.7,0.1l-0.7,0.1l-0.7,0.1l-0.7,0.1l-0.7,0.1l-0.7,0.1l-0.7,0.1l-0.7,0.1l-0.7,0.1l-0.7,0.1l-0.7,0.1
921
+ l-0.8,0.1l-0.8,0.1l-0.8,0.1l-0.8,0.1l-0.8,0.1h-0.8h-0.8h-0.8h-0.8l-1.5,0.1h-1.5h-1.5h-1.6h-1.6h-1.6h-1.6l-1.6-0.1l-1.6-0.1
922
+ l-1.6-0.1l-1.6-0.1l-1.6-0.1l-1.6-0.1l-1.6-0.1l-1.6-0.1l-1.6-0.2l-1.6-0.2l-1.6-0.2l-1.6-0.2l-1.6-0.2l-1.6-0.2l-1.6-0.2
923
+ l-1.6-0.2l-1.6-0.2l-1.6-0.2l-1.6-0.2l-1.6-0.2l-1.6-0.3l-1.6-0.3l-1.6-0.3l-1.6-0.3l-1.5-0.3l-1.5-0.3l-1.5-0.3l-3-0.6l-3-0.6
924
+ l-3-0.6l-2.9-0.6l-2.9-0.6l-2.8-0.6l-5.4-1.1l-2.6-0.5l-2.5-0.5l-0.5-0.1l-0.5-0.1l-0.5-0.1l-0.5-0.1l-0.5-0.1l-0.5-0.1
925
+ l-0.5-0.1l-0.5-0.1h-0.5h-0.5h-0.5h-0.5h-0.5h-0.5h-0.5h-0.5h-0.5h-0.5h-0.5h-0.5h-0.5h-0.5h-0.5h-0.5h-1l-1,0.1l-1,0.1l-1,0.1
926
+ l-1,0.1l-1,0.1l-1,0.1l-1,0.1l-1,0.1l-1,0.2l-1,0.2l-1,0.2l-1,0.2l-1,0.2l-1,0.2l-1,0.2l-1.1,0.2l-1.1,0.2l-1.1,0.3l-1.1,0.3
927
+ l-1.1,0.3l-1.1,0.3l-1.1,0.3l-1.1,0.3l-2.2,0.6l-2.2,0.6l-2.2,0.6l-2.2,0.6l-4.3,1.3l-2.2,0.6l-2.2,0.6l-2.2,0.6l-1.1,0.3
928
+ l-1.1,0.3l-1.1,0.3l-1.1,0.3l-1.1,0.3l-1.1,0.3l-1.1,0.3l-1.1,0.2l-1.1,0.2l-1.1,0.2l-1.4,0.3l-1.4,0.2l-1.4,0.2l-1.4,0.2
929
+ l-1.4,0.2l-1.4,0.2l-1.4,0.2l-1.4,0.1l-1.4,0.1l-1.4,0.1l-1.4,0.1l-1.4,0.1l-1.4,0.1l-1.4,0.1l-1.4,0.1l-1.4,0h-1.4h-1.4h-1.4
930
+ h-1.4H220h-1.4h-1.4h-1.4h-1.4l-1.4-0.1l-1.4-0.1l-1.4-0.1l-1.4-0.1l-1.4-0.1l-2.7-0.2l-2.7-0.2l-2.7-0.2l-2.7-0.2l-2.7-0.2
931
+ l-5.3-0.4l-2.6-0.2l-2.6-0.2l-2.6-0.2l-2.6-0.2l-1.3-0.1l-1.3-0.1l-1.3-0.1l-1.3-0.1l-1.2-0.1l-1.2-0.1h-1.2h-1.2H167h-1.2
932
+ h-1.2h-1.2h-1.2H161h-1.2h-1.2h-1.3h-1.2h-1.3l-1.3,0.1l-1.3,0.1l-1.3,0.1l-1.3,0.1l-1.3,0.1l-2.6,0.2l-2.6,0.2l-2.6,0.2
933
+ l-2.6,0.2l-5.3,0.4l-2.7,0.2l-2.7,0.2l-2.7,0.2l-2.7,0.2l-2.7,0.2l-1.4,0.1l-1.4,0.1l-1.4,0.1l-1.4,0.1l-1.4,0.1l-1.4,0.1
934
+ l-1.4,0.1h-1.4h-1.4h-1.4h-1.4h-1.4h-1.4h-1.4h-1.4h-1.4h-1.4h-1.4l-1.4-0.1l-1.4-0.1l-1.4-0.1l-1.4-0.1l-1.4-0.1l-1.4-0.1
935
+ l-1.4-0.1l-1.4-0.2l-1.4-0.2l-1.4-0.2l-1.4-0.2l-1.3-0.2l-1-0.2l-0.9-0.1l-0.9-0.1l-0.9-0.1l-0.9-0.1l-0.9-0.1l-0.9-0.1
936
+ l-0.9-0.1L69,253l-0.9-0.1l-1-0.1l-1-0.1l-1-0.1l-1-0.1l-1-0.1h-1l-2-0.1l-2-0.1l-2-0.1l-2-0.1h-2h-2l-4.1-0.1l-2.1-0.1
937
+ l-2.1-0.1l-2.1-0.1l-2.1-0.1l-1.1-0.1l-1.1-0.1l-1.1-0.1l-1.1-0.1l-1.1-0.1l-1.1-0.1l-1.1-0.1l-1.1-0.1l-1.1-0.1l-1.1-0.1
938
+ l-1.1-0.1l-1.1-0.1l-1.1-0.1l-1.1-0.1l-1.1-0.1l-1.1-0.2l-1.1-0.2l-1.1-0.2l-1.1-0.2l-1.1-0.2l-1.1-0.2l-1.1-0.2l-1.1-0.2
939
+ l-1.1-0.3l-0.7-0.2l-0.7-0.2l-0.7-0.2l-0.7-0.2l-0.7-0.2L7,246.9l-0.7-0.2l-0.7-0.2L5,246.2l-0.6-0.3l-0.6-0.3l-0.6-0.3
940
+ L2.6,245L2,244.7l-0.6-0.3l-0.6-0.3l-0.6-0.3l-0.5-0.3l-0.5-0.4l-0.5-0.4l-0.5-0.4l-0.5-0.4l-0.5-0.4l-0.5-0.4l-0.5-0.4
941
+ l-0.4-0.5l-0.4-0.5l-0.4-0.5l-0.4-0.5l-0.4-0.5l-0.4-0.5l-0.3-0.5l-0.3-0.5l-0.3-0.6l-0.3-0.6l-0.3-0.6l-0.2-0.6l-0.2-0.6
942
+ l-0.2-0.6l-0.2-0.6l-0.2-0.6l-0.1-0.6l-0.1-0.6l-0.1-0.6l-0.1-0.6v-0.6v-0.6l0-0.6v-0.6v-0.6l0.1-0.6l0.1-0.6l0.1-0.6l0.1-0.5
943
+ l0.1-0.5l0.1-0.5l0.1-0.5l0.2-0.5l0.2-0.5l0.2-0.5l0.2-0.5l0.2-0.5l0.2-0.5l0.2-0.5l0.2-0.5l0.2-0.5l0.2-0.5l0.2-0.5l0.2-0.4
944
+ l0.3-0.4l0.3-0.4l0.3-0.4l0.3-0.4l0.3-0.4l0.3-0.4l0.3-0.4l0.3-0.4l0.3-0.4l0.3-0.4l0.3-0.4l0.3-0.4l0.3-0.4l0.3-0.4l0.3-0.4
945
+ l0.3-0.4l0.4-0.4l0.7-0.7l0.7-0.7l0.7-0.7l0.7-0.7l0.7-0.7l0.8-0.7l0.8-0.6l0.8-0.6l0.8-0.6l0.8-0.6l0.8-0.6l0.8-0.6l0.8-0.6
946
+ l0.8-0.5l0.8-0.5l0.8-0.5l0.8-0.5l0.8-0.5l0.8-0.5l0.8-0.4l0.7-0.4l0.1-0.1l0,0l0,0h0.1h0.1l0,0l0.2-0.1l0.2-0.2l0.2-0.2
947
+ l0.3-0.2l0.3-0.3l0.3-0.3l0.3-0.3l0.4-0.3l0.4-0.3l0.8-0.8l0.9-0.8l0.9-0.9l0.5-0.5l0.5-0.5l0.5-0.5l0.5-0.5l0.6-0.5l0.6-0.5
948
+ l0.6-0.5l0.6-0.5l0.7-0.5l0.7-0.5l0.4-0.3l0.4-0.2l0.4-0.2l0.4-0.2l0.4-0.2l0.4-0.2l0.4-0.2l0.3-0.2l1.1-0.5l1.2-0.3l1.2-0.2
949
+ h1.2l1.2,0.2l1.2,0.3l1.1,0.5l1,0.6l0.9,0.8l0.8,0.9l0.7,1l0.6,1.1l0.4,1.1l0.2,1.2l0.1,1.2l-0.1,1.2l-0.3,1.2l-0.4,1.1
950
+ l-0.6,1.1l-0.7,1l-0.8,0.9l-0.9,0.8l-1,0.6l-0.2,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.3,0.2
951
+ l-0.3,0.2l-0.3,0.2l-0.3,0.3l-0.4,0.3l-0.4,0.3l-0.4,0.3l-0.4,0.4l-0.4,0.4l-0.4,0.4l-0.8,0.8l-0.9,0.9l-0.9,0.9l-0.5,0.5
952
+ l-0.5,0.5l-0.5,0.5l-0.5,0.5l-0.5,0.5l-0.6,0.5l-0.6,0.5l-0.6,0.5l-0.6,0.4l-0.4,0.2l-0.3,0.2l-0.4,0.2l-0.4,0.2l-0.4,0.2
953
+ l-0.3,0.2l-0.6,0.3l-0.6,0.3l-0.6,0.3l-0.6,0.3l-0.6,0.3l-0.6,0.4l-0.6,0.4l-0.6,0.4l-0.6,0.4l-0.6,0.4l-0.6,0.4l-0.6,0.4
954
+ l-0.6,0.4l-0.5,0.4l-0.5,0.4l-0.5,0.5l-0.5,0.5l-0.5,0.5l-0.5,0.5l-0.5,0.5l-0.5,0.5l-0.2,0.2l-0.2,0.2l-0.2,0.2l-0.2,0.2
955
+ l-0.2,0.2l-0.2,0.2l-0.2,0.2l-0.2,0.2l-0.2,0.2l-0.2,0.2l-0.2,0.2L9.6,225l-0.1,0.2l-0.1,0.2l-0.1,0.2l-0.1,0.2L9.1,226
956
+ L9,226.2l-0.1,0.2l-0.1,0.2l-0.1,0.2L8.6,227l-0.1,0.1l-0.1,0.1l-0.1,0.1v0.1v0.1v0.1v0.1v0.1v0.1v0.1v0.1l0,0v0.1l0,0l0,0l0,0
957
+ l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.2,0.1l0.2,0.1l0.2,0.1l0.2,0.1l0.2,0.1l0.3,0.1l0.3,0.1l0.3,0.1
958
+ l0.3,0.1l0.3,0.1l0.3,0.1l0.4,0.1l0.4,0.1l0.4,0.1l0.4,0.1l0.4,0.1l0.5,0.1l0.5,0.1l0.5,0.1l0.9,0.2l0.9,0.2l0.9,0.2l0.9,0.2
959
+ l0.9,0.2l0.9,0.2l0.9,0.2l0.9,0.1l0.9,0.1l0.9,0.1l0.9,0.1l0.9,0.1l0.9,0.1l0.9,0.1l0.9,0.1l0.9,0.1l1,0.1l0.9,0.1l1,0.1l1,0.1
960
+ l1,0.1l1,0.1h1h1l2,0.1l2,0.1l2,0.1l2,0.1l4.1,0.1h2.1h2.1l2.1,0.1l2.1,0.1l2.1,0.1l2.1,0.1l1.1,0.1l1.1,0.1l1.1,0.1l1.1,0.1
961
+ l1.1,0.1l1.1,0.1l1.1,0.1l1.1,0.1l1.1,0.1l1.1,0.1l1.1,0.1l1.1,0.1l1.1,0.1l1.1,0.1l1.1,0.2l1,0.2l1.2,0.2l1.2,0.2l1.2,0.2
962
+ l1.2,0.1l1.2,0.1l1.2,0.1l1.2,0.1l1.2,0.1l1.2,0.1l1.2,0.1l1.2,0.1l1.2,0.1h1.2h1.2h1.2h1.3h1.3h1.3h1.3h1.3h1.3h1.3h1.3
963
+ l1.3-0.1l1.3-0.1l1.3-0.1l1.3-0.1l1.3-0.1l1.3-0.1l1.3-0.1l2.6-0.2l2.6-0.2l2.6-0.2l2.6-0.2l2.7-0.2l5.3-0.4l2.7-0.2l2.7-0.2
964
+ l2.7-0.2l2.7-0.2l1.4-0.1l1.3-0.1l1.3-0.1L156.3,235.9z M411.9,211.1L411.9,211.1l0.5-0.6l0.1-0.1L411.9,211.1z"
965
+ />
966
+ </g>
967
+ <g transform="matrix(1,0,0,1,400.214,44.558)">
968
+ <path
969
+ d="M6,210.5h0.6h0.6h0.6H9h1.2h1.1h1.1l1.1,0h1h1l1.9,0.1h0.8H19h0.7h0.6l1,0.1l0.9,0.2l0.9,0.4l0.8,0.5
970
+ l0.7,0.7l0.6,0.8l0.5,0.9l0.3,0.9l0.2,1v1l-0.2,1l-0.3,0.9l-0.5,0.9l-0.6,0.8l-0.7,0.7l-0.8,0.5l-0.9,0.4l-0.9,0.2l-1,0.1h-0.7
971
+ h-0.8H18h-0.9l-1.8-0.1h-1h-1h-1l-1,0h-1h-1h-1H7.8H7.3H6.8H6.3H5.8H5.3H4.8H4.3l-0.5,0.1l-0.4,0.1L3,222.8l-0.4,0.1L2.2,223
972
+ l-0.4,0.1l-0.4,0.1L1,223.3l-0.4,0.1l-0.3,0.1L0,223.6l-0.3,0.1l-0.3,0.1l-0.3,0.1l-0.2,0.1l-0.2,0.1l0,0l0.2,0.2l0.2,0.2
973
+ l0.2,0.2l0.2,0.1l0.3,0.1L0,225l0.2,0.1l0.2,0.1l0.2,0.1l0.2,0.1l0.2,0.1l0.2,0.1l1.6,0.7l1.6,0.7l1.6,0.7l1.7,0.7l1.7,0.7
974
+ l0.8,0.3l0.9,0.3L12,230l0.9,0.3l0.9,0.3l0.9,0.3l0.9,0.3l0.9,0.3l0.9,0.3l0.9,0.3l0.9,0.3l0.9,0.3l0.9,0.2l0.9,0.2l0.8,0.2
975
+ l0.8,0.2l0.8,0.2l0.8,0.2l0.8,0.2l0.8,0.2l0.8,0.2l0.8,0.2l0.3,0.1l0.4,0.1l0.4,0.1l0.4,0.1l0.4,0.1h0.4H31h0.4h0.5h0.5h0.5
976
+ h0.5h0.5h0.5h0.5h0.5h1.1h1.1h1.1l1.1-0.1L41,235l1.2-0.1l1.2-0.1l1.2-0.1l1.2-0.1l1.2-0.1l1.2-0.1l1.2-0.1l1.2-0.1l1.2-0.1
977
+ l1.2-0.2l1.2-0.2l2.3-0.3l2.2-0.3l4-0.6l0.5-0.1l0.5-0.1l0.9-0.1l0.9-0.1l0.9-0.1l0.9-0.1h0.9h0.9H70h0.9h0.9h0.9h0.9l1.7,0.1
978
+ l1.7,0.1l1.6,0.1h1.6H81h0.8h0.8h0.8h0.8h0.7h0.7h0.7H87l0.7-0.1l0.7-0.1h0.3h0.4l1.7-0.2l1.8-0.2l1.8-0.2l1.8-0.2L98,231
979
+ l1.8-0.2l1.8-0.2l1.8-0.2l1.8-0.2l1.8-0.2l1.8-0.2l1.8-0.2l1.8-0.2l1.8-0.2l1.8-0.2l1.8-0.1l1.8-0.1l1.8-0.1l1.8-0.1l1.8-0.1
980
+ l1.8-0.1l1.8-0.1l1.8-0.1l1.8-0.1l1.8-0.1l1.8-0.1l1.8-0.1h1.8h1.8h1.8h1.8h1.8h1.1h1.1h1.1h1.1h1.1l1.1,0.1l1,0.1l1,0.1l1,0.1
981
+ l1,0.1l1,0.1l1,0.1l1,0.1l1,0.1l1,0.1l1,0.1l1,0.2l1,0.2l1,0.2l0.9,0.2l0.9,0.2l0.9,0.2l0.9,0.2l0.9,0.2l0.9,0.2l0.9,0.2
982
+ l0.9,0.2l0.9,0.2l1.8,0.4l1.8,0.4l1.8,0.5l1.8,0.5l1.8,0.5l1.7,0.5l3.5,1l1.8,0.5l1.8,0.5l1.8,0.5l1.8,0.5l1.8,0.5l1.8,0.4
983
+ l1.8,0.4l0.9,0.2l0.9,0.2l0.9,0.2l0.9,0.2l0.9,0.2l0.9,0.2l0.4,0.1l0.4,0.1l0.4,0.1h0.4h0.4h0.4h0.4h0.4h0.4h0.4h0.4h0.4h0.4
984
+ h0.4h0.4h0.4l0.4,0h0.4l0.4-0.1l0.4-0.1l0.4-0.1l0.4-0.1l0.4-0.1l0.4-0.1l0.4-0.1l0.4-0.1l0.4-0.1l0.4-0.1l0.9-0.2l0.9-0.2
985
+ l0.9-0.3l0.9-0.3l0.9-0.3l0.9-0.3l0.9-0.3l0.9-0.3l1.9-0.6l1.9-0.7l1-0.3l1-0.3l1-0.3l1-0.3l1-0.3l1-0.3l1.4-0.4l1.4-0.4
986
+ l1.4-0.4l1.4-0.4l1.5-0.4l1.5-0.4l1.5-0.4l1.5-0.4l1.5-0.4l1.5-0.4l1.5-0.3l1.5-0.3l1.5-0.3l1.5-0.3l1.5-0.3l1.5-0.3l1.5-0.3
987
+ l1.5-0.3l1.5-0.3l1.5-0.3l1.5-0.3l1.5-0.3l1.5-0.3l1.5-0.3l1.5-0.3l1.5-0.3l1.5-0.2l1.5-0.2l1.5-0.2l1.5-0.2l1.5-0.2l1.5-0.2
988
+ l1.1-0.2l1.2-0.1l1.2-0.1l1.1-0.1l1.1-0.1l1.1-0.1l1.1-0.1h1.1h1.1h1.1h1.1h1.1h1.1h1.1h1.1h1.1l1.1,0.1l1.1,0.1l1.1,0.1
989
+ l1.1,0.1l1.1,0.1l1.1,0.1l1.1,0.1l1.1,0.1l1.1,0.1l1.1,0.1l1.1,0.1l1.1,0.1l2.1,0.3l2.1,0.3l2.1,0.3l2.1,0.3l4.1,0.6l2,0.3
990
+ l2,0.3l2,0.3l2,0.3l1,0.1l1,0.1l1,0.1l1,0.1l1,0.1l1,0.1l1,0.1l1,0.1l1,0.1l1,0.1l1,0.1h1h1h1h1h1h0.9h0.9h0.9h0.9h0.9h0.9h0.9
991
+ h0.9l0.9,0.1l0.9,0.1l1.7,0.1l1.7,0.1l1.7,0.1l1.7,0.2l1.7,0.2l3.3,0.3l3.3,0.3l1.6,0.2l1.6,0.2l1.6,0.2l1.6,0.1l1.6,0.1
992
+ l1.6,0.1l0.8,0.1h0.8h0.8h0.8h0.8h0.8h0.8h0.8h0.8h0.8h0.8h0.8h0.8h0.8h0.8h0.8h0.8h0.8l0.8-0.1l0.8-0.1l0.8-0.1l0.8-0.1
993
+ l0.8-0.1l0.8-0.1l0.7-0.1l0.9-0.1l0.4-0.1l0.5-0.1l0.5-0.1l0.5-0.1l0.5-0.1l0.5-0.1l0.5-0.1l0.5-0.1l0.5-0.1l0.5-0.1l0.5-0.2
994
+ l0.5-0.2l0.4-0.2l0.4-0.2l0.2-0.1l0.2-0.1l0.2-0.1l0.2-0.1l0.2-0.1l0.2-0.1l0.2-0.1l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1
995
+ l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1l0,0l0,0v-0.1l0.1-0.2l0.1-0.2l0.1-0.2l0.1-0.2l0.1-0.2V225v-0.2v-0.2v-0.2v-0.2V224
996
+ v-0.2v-0.2v-0.2v-0.2V223v-0.2v-0.2v-0.2v-0.2v-0.1V222v-0.1v-0.1v-0.1v-0.1v-0.1v-0.1v-0.1v-0.1v-0.1V221v-0.1l0-0.1v-0.1
997
+ v-0.1v-0.1v-0.1l-0.1-0.1v-0.1v-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1
998
+ l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1
999
+ l-0.2-0.2l-0.2-0.1l-0.2-0.1l-0.3-0.1l-0.3-0.1l-0.3-0.1l-0.3-0.1l-0.3-0.1l-0.3-0.1l-0.3-0.1l-0.3-0.1l-0.3-0.1l-0.3-0.1
1000
+ l-0.4-0.1l-0.4-0.1l-0.4-0.1h-0.4H406h-0.4h-0.4h-0.4h-0.4H404h-0.4h-0.4l-0.4,0.1l-0.4,0.1l-0.4,0.1l-0.4,0.1l-0.4,0.1
1001
+ l-0.4,0.1l-0.6,0.2l-0.4,0.1l-0.4,0.1l-0.7,0.1l-0.8,0.1l-0.9,0.1l-1,0.1l-1.1,0.1l-1.1,0.1l-1.2,0.1l-1.2,0.1h-0.6h-0.6h-0.6
1002
+ h-0.5h-0.5h-0.5h-0.5h-0.5l-0.6-0.1l-0.6-0.1l-0.4-0.1l-0.4-0.1l-0.3-0.1l-0.5-0.2h-0.1l-0.6-0.3h-0.1l-0.5-0.3l-0.4-0.4l0,0
1003
+ l-0.5-0.5l-0.4-0.6l0,0l-0.3-0.6l-0.3-0.6l-0.2-0.7l0,0l-0.1-1v-1l0.2-1l0.3-0.9l0.5-0.9l0.6-0.8l0.7-0.7l0.8-0.5l0.9-0.4
1004
+ l0.9-0.2l1-0.1l1,0.1l0.9,0.2l0.1,0.1h0.2h0.3h0.4h0.4h0.5h0.5h1l1-0.1l1-0.1l1-0.1l0.9-0.1l0.7-0.1l0.6-0.1h0.2l0.4-0.1
1005
+ l0.7-0.2l0.7-0.2l0.7-0.1l0.7-0.1l0.7-0.1l0.7-0.1l0.7-0.1l0.7-0.1h0.7h0.7h0.7h0.7h0.7l0.7,0.1l0.7,0.1l0.7,0.1l0.7,0.1
1006
+ l0.7,0.1l0.7,0.2l0.7,0.2l0.7,0.2l0.7,0.2l0.7,0.2l0.6,0.2l0.6,0.3l0.6,0.3l0.6,0.3l0.6,0.3l0.6,0.4l0.6,0.4l0.5,0.4l0.3,0.2
1007
+ l0.3,0.2l0.3,0.2l0.3,0.2l0.3,0.2l0.3,0.2l0.3,0.2l0.2,0.2l0.2,0.3l0.2,0.3l0.2,0.3l0.2,0.3l0.2,0.3l0.2,0.3l0.2,0.3l0.2,0.3
1008
+ l0.2,0.3l0.2,0.3l0.2,0.3l0.2,0.3l0.2,0.3l0.2,0.3l0.2,0.3l0.2,0.3l0.1,0.3l0.2,0.3l0.1,0.3l0.1,0.3l0.1,0.3l0.1,0.3l0.1,0.4
1009
+ l0.1,0.4l0.1,0.4l0.1,0.4l0.1,0.4l0.1,0.4l0.1,0.4l0.1,0.4v0.4v0.4v0.4v0.4l0,0.4v0.4v0.4v0.4v0.4v0.4v0.4v0.4v0.4v0.4
1010
+ l-0.1,0.4l-0.1,0.4l-0.1,0.4l-0.1,0.4l-0.1,0.4L425,228l-0.1,0.4l-0.1,0.4l-0.1,0.4l-0.1,0.4l-0.1,0.4l-0.1,0.5l-0.2,0.5
1011
+ l-0.2,0.5l-0.2,0.5l-0.3,0.5l-0.3,0.4l-0.3,0.4l-0.3,0.4l-0.3,0.4l-0.3,0.4l-0.3,0.3l-0.3,0.3l-0.3,0.3l-0.3,0.3l-0.3,0.3
1012
+ l-0.3,0.3l-0.3,0.3l-0.4,0.2l-0.4,0.2l-0.3,0.2l-0.4,0.2l-0.4,0.2l-0.4,0.2l-0.4,0.2l-0.4,0.2l-0.4,0.2l-0.4,0.2l-0.4,0.2
1013
+ l-0.4,0.2l-0.7,0.3l-0.7,0.3l-0.7,0.2l-0.7,0.2l-0.7,0.2l-0.7,0.2l-0.7,0.2l-0.7,0.2l-0.7,0.1l-0.6,0.1l-0.6,0.1l-0.6,0.1
1014
+ l-0.6,0.1l-0.6,0.1l-1,0.2l-0.9,0.1l-0.9,0.1l-0.9,0.1l-0.9,0.1l-0.9,0.1l-0.9,0.1l-0.9,0.1l-0.9,0.1h-0.9h-0.9H395h-0.9h-0.9
1015
+ h-0.9h-0.9h-0.9h-0.9h-0.9h-0.9h-0.9H386h-0.9l-0.9-0.1l-0.9-0.1l-0.9-0.1l-1.7-0.1l-1.7-0.1l-1.7-0.2l-1.7-0.2l-1.6-0.2
1016
+ l-1.6-0.2l-3.3-0.3l-3.2-0.3l-1.6-0.2l-1.6-0.2l-1.6-0.1l-1.6-0.1l-1.6-0.1l-0.8-0.1h-0.8h-0.8h-0.8h-0.8h-0.8h-0.8h-0.8h-0.8
1017
+ h-0.8h-1.1h-1.1h-1.1h-1.1l-1.1-0.1l-1.1-0.1l-1.1-0.1l-1.1-0.1l-1.1-0.1l-1.1-0.1l-1.1-0.1l-1.1-0.1l-1.1-0.1l-1.1-0.1
1018
+ l-1.1-0.1l-1.1-0.1l-2.1-0.3l-2.1-0.3l-2.1-0.3l-2.1-0.3l-4.1-0.6l-2-0.3l-2-0.3l-2-0.3l-2-0.3l-1-0.1l-1-0.1l-1-0.1l-1-0.1
1019
+ l-1-0.1l-1-0.1l-1-0.1l-1-0.1l-1-0.1l-1-0.1l-1-0.1l-1-0.1h-1h-1h-1h-1h-1h-1h-1h-1h-1l-1,0.1l-1,0.1l-1,0.1l-1,0.1l-1,0.1
1020
+ l-1,0.1l-1,0.1l-1.4,0.2l-1.4,0.2l-1.4,0.2l-1.4,0.2l-1.4,0.2l-1.4,0.2l-1.4,0.2l-1.4,0.3l-1.4,0.3l-1.4,0.3l-1.4,0.3l-1.4,0.3
1021
+ l-1.4,0.3l-1.4,0.3l-1.4,0.3l-1.4,0.3l-1.4,0.3l-1.4,0.3l-1.4,0.3l-1.4,0.3l-1.4,0.3l-1.4,0.3l-1.4,0.3l-1.4,0.3l-1.4,0.4
1022
+ l-1.4,0.4l-1.4,0.4l-1.4,0.4l-1.4,0.4l-1.4,0.4l-1.4,0.4l-1.4,0.4l-0.9,0.3l-0.9,0.3l-0.9,0.3l-0.9,0.3l-0.9,0.3l-0.9,0.3
1023
+ l-1.9,0.7l-1.9,0.7l-1,0.3l-1,0.3l-1,0.3l-1,0.3l-1,0.3l-1.1,0.3l-1.1,0.3l-1.1,0.3l-0.6,0.1l-0.5,0.1l-0.5,0.1l-0.6,0.1
1024
+ l-0.6,0.1l-0.6,0.1l-0.6,0.1l-0.6,0.1l-0.6,0.1l-0.6,0.1l-0.6,0.1l-0.6,0.1l-0.6,0.1h-0.6h-0.6l-0.6,0h-0.6h-0.6h-0.6h-0.6
1025
+ h-0.6h-0.6l-0.6-0.1l-0.6-0.1l-0.6-0.1l-0.6-0.1l-0.6-0.1l-0.6-0.1l-1-0.2l-1-0.2l-1-0.2l-1-0.2l-1-0.2l-1-0.2l-1.9-0.5
1026
+ l-1.9-0.5l-1.9-0.5l-1.8-0.5l-1.8-0.5l-1.8-0.5l-1.8-0.5l-3.5-1l-1.7-0.5l-1.7-0.5l-1.7-0.4l-1.7-0.4l-1.7-0.4l-1.7-0.4
1027
+ l-0.8-0.2l-0.8-0.2l-0.9-0.2l-0.8-0.2l-0.9-0.2l-0.9-0.2l-0.9-0.2l-0.9-0.2l-0.9-0.2l-0.9-0.2l-0.9-0.1l-0.9-0.1l-0.9-0.1
1028
+ l-0.9-0.1l-0.9-0.1l-0.9-0.1l-0.9-0.1l-0.9-0.1l-0.9-0.1l-0.9-0.1l-0.9-0.1l-0.9-0.1l-0.9-0.1H151h-1h-1h-1h-1h-1.7h-1.7h-1.7
1029
+ h-1.7h-1.7l-1.8,0.1l-1.8,0.1l-1.8,0.1l-1.8,0.1l-1.8,0.1l-1.8,0.1l-1.8,0.1l-1.8,0.1l-1.8,0.1l-1.8,0.1l-1.8,0.1l-1.8,0.1
1030
+ l-1.8,0.2l-1.8,0.2l-1.8,0.2l-1.8,0.2l-1.8,0.2l-1.8,0.2l-1.8,0.2l-1.8,0.2l-1.8,0.2l-1.8,0.2l-1.7,0.2l-1.7,0.2l-1.7,0.2
1031
+ l-1.7,0.2l-1.7,0.2l-0.4,0.1l-0.5,0.1l-0.9,0.1l-0.9,0.1l-0.9,0.1h-0.9H85h-0.9h-0.9H82h-0.9h-0.9h-0.9l-1.7-0.1l-1.7-0.1
1032
+ l-1.6-0.1l-1.6-0.1h-0.8h-0.8h-0.8h-0.8h-0.8H68h-0.7h-0.7h-0.7l-0.7,0.1l-0.7,0.1h-0.3h-0.4l-3.9,0.6l-2.2,0.3l-2.3,0.3
1033
+ l-1.2,0.2l-1.2,0.2l-1.2,0.2l-1.3,0.1l-1.3,0.1l-1.3,0.1l-1.3,0.1l-1.3,0.1l-1.3,0.1l-1.3,0.1l-1.3,0.1l-1.3,0.1l-1.3,0.1h-1.3
1034
+ h-1.3H35h-0.6h-0.6h-0.6h-0.6H32h-0.6h-0.6h-0.6h-0.6l-0.6-0.1l-0.6-0.1l-0.6-0.1l-0.6-0.1l-0.6-0.1l-0.6-0.1l-0.5-0.1
1035
+ l-0.9-0.2l-0.9-0.2l-0.9-0.2l-0.9-0.2L21,245l-0.9-0.2l-0.9-0.2l-0.9-0.3l-0.9-0.3l-0.9-0.3l-0.9-0.3l-0.9-0.3l-0.9-0.3
1036
+ l-0.9-0.3l-0.9-0.3l-0.9-0.3l-0.9-0.3l-0.9-0.3L8.4,241l-0.9-0.3l-0.9-0.3l-0.9-0.3l-1.8-0.7l-1.8-0.7L0.4,238l-1.7-0.7
1037
+ l-1.7-0.7l-0.3-0.1l-0.3-0.2l-0.4-0.2l-0.4-0.2l-0.4-0.2l-0.4-0.2l-0.4-0.2l-0.4-0.2l-0.4-0.3l-0.4-0.3l-0.4-0.3l-0.4-0.3
1038
+ l-0.5-0.3l-0.5-0.3l-0.5-0.4l-0.5-0.4l-0.5-0.4l-0.5-0.4l-0.4-0.5l-0.2-0.3l-0.2-0.3l-0.2-0.3l-0.2-0.3l-0.2-0.3l-0.2-0.3
1039
+ l-0.2-0.3l-0.2-0.3l-0.2-0.4L-13,228l-0.2-0.4l-0.2-0.4l-0.1-0.4l-0.1-0.4l-0.1-0.4l-0.1-0.5l-0.1-0.5v-0.5V224v-0.5l0-0.5
1040
+ l0.1-0.5l0.1-0.5l0.1-0.5l0.2-0.5l0.2-0.4l0.2-0.4l0.2-0.4l0.2-0.4l0.2-0.3l0.2-0.3l0.2-0.3l0.2-0.3l0.2-0.3l0.2-0.3l0.2-0.3
1041
+ l0.2-0.3l0.2-0.3l0.2-0.3l0.3-0.3l0.3-0.2l0.3-0.2l0.3-0.2l0.3-0.2l0.3-0.2l0.3-0.2l0.3-0.2l0.3-0.2l0.3-0.2l0.3-0.2l0.6-0.3
1042
+ l0.6-0.3l0.6-0.3l0.6-0.3l0.6-0.2l0.6-0.2l0.6-0.2l0.6-0.2l0.6-0.2l0.6-0.2l0.6-0.1l0.6-0.1l0.6-0.1l0.6-0.1l0.6-0.1l0.6-0.1
1043
+ l0.6-0.1l0.6-0.1l0.6-0.1l0.6-0.1h0.6h0.6L6,210.5z M389.5,208l-0.3-0.4l-0.1-0.1L389.5,208z"
1044
+ />
1045
+ </g>
1046
+ <g transform="matrix(1,0,0,1,400.214,44.558)">
1047
+ <path
1048
+ d="M168.7,64h0.7h0.7h0.7h0.7h0.7l0.7,0.1l0.7,0.1l0.7,0.1l0.7,0.1l0.7,0.1l0.7,0.1l0.7,0.1l0.7,0.1l0.7,0.2
1049
+ l0.6,0.2l0.6,0.2l0.6,0.2l0.6,0.2l0.6,0.2l0.6,0.2l0.6,0.2l0.6,0.2l0.6,0.3l0.6,0.3l0.6,0.3l0.6,0.3l0.6,0.3l0.6,0.3l0.6,0.3
1050
+ l0.6,0.3l0.6,0.3l0.6,0.3l0.6,0.3l0.6,0.4l0.5,0.4l0.5,0.4l0.5,0.4l0.5,0.4l0.5,0.4l0.5,0.4l0.5,0.4l0.5,0.4l0.5,0.4l0.5,0.4
1051
+ l0.5,0.4l0.5,0.4l0.5,0.4l0.4,0.5l0.4,0.5l0.4,0.5l0.4,0.5L199,78l0.4,0.5l0.4,0.5l0.4,0.5l0.4,0.5l0.4,0.5l0.4,0.5l0.4,0.6
1052
+ l0.3,0.6l0.3,0.6l0.3,0.6L203,84l0.3,0.6l0.3,0.6l0.2,0.6l0.2,0.6l0.2,0.6l0.2,0.6l0.2,0.6l0.2,0.6l0.1,0.6L205,90l0.1,0.6
1053
+ l0.1,0.6l0.1,0.6l0.1,0.6V93v0.6v0.6v0.6v0.6V96v0.6l-0.1,0.6l-0.1,0.6l-0.1,0.6L205,99l-0.1,0.6l-0.1,0.6l-0.1,0.6l-0.1,0.6
1054
+ l-0.2,0.6l-0.2,0.6l-0.2,0.6l-0.2,0.6l-0.2,0.6l-0.2,0.6l-0.2,0.6l-0.2,0.6l-0.2,0.6l-0.2,0.6l-0.3,0.6l-0.3,0.6l-0.3,0.6
1055
+ l-0.3,0.6l-0.3,0.6l-0.3,0.6l-0.3,0.6l-0.3,0.6l-0.3,0.6l-0.3,0.6l-0.3,0.6l-0.3,0.6l-0.3,0.6l-0.4,0.6l-0.4,0.6l-0.4,0.6
1056
+ l-0.4,0.6l-0.4,0.6l-0.4,0.5l-0.4,0.5l-0.4,0.6l-0.4,0.5l-0.4,0.5l-0.4,0.5l-0.4,0.5l-0.4,0.5l-0.4,0.5l-0.4,0.5l-0.4,0.5
1057
+ l-0.4,0.5l-0.4,0.5l-0.4,0.5l-0.4,0.5l-0.5,0.5l-0.5,0.5l-0.5,0.5l-0.5,0.5l-0.5,0.5l-0.9,1l-0.9,0.9l-0.9,0.9l-1,0.9l-1,0.9
1058
+ l-1,0.9l-1,0.8l-1,0.8l-1,0.8l-1,0.8l-1,0.7l-0.9,0.7l-0.9,0.7l-0.9,0.7l-0.9,0.6L173,141l-0.9,0.6l-0.9,0.6l-0.9,0.5l-0.9,0.5
1059
+ l-0.8,0.5l-0.4,0.2l-0.4,0.2l-0.4,0.2l-0.4,0.2l-0.7,0.3l-0.7,0.3l-0.7,0.3l-0.7,0.3l-0.7,0.3l-0.7,0.3l-0.7,0.2l-0.7,0.2
1060
+ l-0.7,0.2l-0.7,0.2l-0.7,0.2l-0.7,0.2l-0.7,0.1l-0.7,0.1l-0.7,0.1l-0.7,0.1l-0.7,0.1l-0.7,0.1h-0.7H153h-0.7h-0.7h-0.7h-0.7
1061
+ l-0.6-0.1l-0.6-0.1l-0.6-0.1l-0.6-0.1l-0.6-0.1l-0.6-0.1l-0.6-0.1l-0.6-0.2l-0.6-0.2l-0.6-0.2l-0.6-0.2l-0.6-0.2l-0.6-0.2
1062
+ l-0.6-0.2l-0.6-0.2l-0.6-0.3l-0.6-0.3l-0.6-0.3l-0.6-0.3l-0.5-0.3l-0.5-0.3l-0.5-0.3l-0.5-0.3l-0.5-0.3l-0.5-0.4l-0.5-0.4
1063
+ l-0.5-0.4l-0.5-0.4l-0.5-0.4l-0.5-0.4l-0.5-0.4l-0.5-0.4l-0.5-0.4l-0.5-0.4l-0.4-0.4l-0.4-0.5l-0.4-0.5l-0.4-0.5l-0.4-0.5
1064
+ l-0.4-0.5l-0.4-0.5l-0.4-0.5l-0.4-0.5l-0.4-0.5l-0.4-0.5l-0.4-0.5l-0.4-0.5l-0.4-0.5l-0.4-0.5l-0.3-0.6l-0.3-0.6l-0.3-0.6
1065
+ l-0.3-0.6l-0.3-0.6l-0.3-0.6l-0.3-0.6l-0.3-0.6l-0.3-0.6l-0.3-0.6l-0.3-0.6l-0.3-0.6l-0.3-0.6l-0.3-0.6l-0.2-0.6l-0.2-0.6
1066
+ l-0.2-0.6l-0.2-0.6l-0.2-0.6l-0.2-0.6l-0.2-0.6l-0.2-0.6l-0.2-0.6l-0.2-0.6l-0.2-0.6l-0.2-0.6l-0.1-0.6l-0.1-0.7l-0.1-0.7
1067
+ l-0.1-0.6l-0.1-0.7l-0.1-0.7l-0.1-0.7l-0.1-0.7l-0.1-0.7l-0.1-0.7l-0.1-0.7l-0.1-0.7v-0.7v-0.7v-0.7v-0.7v-0.7v-0.7l0-0.7v-0.7
1068
+ v-0.7V101l0.1-0.7l0.1-0.6l0.1-0.6l0.1-0.6l0.1-0.6l0.1-0.6l0.1-0.6l0.3-1.5l0.3-1.7l0.3-1.8l0.2-0.9l0.2-0.9l0.2-1l0.2-1
1069
+ l0.2-1l0.2-1l0.2-1l0.3-1l0.3-1l0.3-1l0.2-0.5l0.2-0.5l0.2-0.5l0.2-0.5l0.2-0.5l0.2-0.5l0.2-0.5l0.2-0.5l0.2-0.5l0.2-0.5
1070
+ l0.2-0.4l0.2-0.4l0.2-0.4l0.2-0.4l0.2-0.4l0.2-0.4l0.2-0.4l0.3-0.4l0.3-0.4l0.3-0.4l0.3-0.4l0.3-0.4l0.3-0.4l0.3-0.3l0.3-0.3
1071
+ l0.3-0.3l0.4-0.3l0.4-0.3l0.4-0.3l0.4-0.3l0.4-0.2l0.2-0.1l0.2-0.1l0.3-0.1l0.3-0.1l0.3-0.1h0.3h0.3h0.3L132,69l0.3,0.1
1072
+ l0.3,0.1l0.3,0.2l0.2,0.2l0.2,0.2l0.2,0.2l0.2,0.3l0.1,0.3l0.1,0.3l0.1,0.3l0.1,0.3v0.3v0.3v0.3l-0.1,0.3l-0.1,0.3l-0.1,0.3
1073
+ l-0.2,0.3l-0.2,0.2l-0.2,0.2l-0.2,0.2l-0.3,0.2l-0.3,0.1l-0.1,0.1h-0.1l-0.2,0.1l-0.1,0.1l-0.2,0.1l-0.2,0.1l-0.2,0.1l-0.2,0.2
1074
+ l-0.2,0.2l-0.2,0.2l-0.2,0.2l-0.2,0.2l-0.2,0.2l-0.2,0.2l-0.2,0.3l-0.2,0.3l-0.2,0.3l-0.2,0.3l-0.2,0.3l-0.2,0.3l-0.2,0.3
1075
+ l-0.2,0.3l-0.2,0.4l-0.2,0.4l-0.2,0.4l-0.2,0.4l-0.2,0.4l-0.1,0.4l-0.1,0.4l-0.1,0.4l-0.1,0.4l-0.1,0.4l-0.1,0.4l-0.3,0.9
1076
+ l-0.3,0.9l-0.2,0.9l-0.2,0.9l-0.2,0.9l-0.2,0.9l-0.2,0.9l-0.2,0.9l-0.2,0.9l-0.2,0.9l-0.3,1.8l-0.3,1.7l-0.3,1.5l-0.1,0.6
1077
+ l-0.1,0.5l-0.1,0.5l-0.1,0.5l-0.1,0.6l-0.1,0.5l-0.1,0.6v0.6v0.6v0.6v0.6v0.6l0,0.6v0.6v0.6v0.6v0.6v0.6l0.1,0.6l0.1,0.6
1078
+ l0.1,0.6l0.1,0.6l0.1,0.6l0.1,0.6l0.1,0.6l0.1,0.6l0.1,0.6l0.1,0.6l0.1,0.6l0.1,0.6l0.1,0.6l0.2,0.6l0.2,0.6l0.2,0.6l0.2,0.6
1079
+ l0.2,0.6l0.2,0.6l0.2,0.6l0.2,0.5l0.2,0.5l0.2,0.5l0.2,0.5l0.2,0.5l0.2,0.5l0.2,0.5l0.3,0.5l0.3,0.5l0.3,0.5l0.3,0.5l0.3,0.5
1080
+ l0.3,0.5l0.3,0.5l0.3,0.5l0.3,0.5l0.3,0.5l0.3,0.5l0.3,0.5l0.3,0.5l0.3,0.5l0.3,0.4l0.3,0.4l0.3,0.4l0.3,0.4l0.4,0.4l0.4,0.4
1081
+ l0.4,0.4l0.4,0.4l0.4,0.4l0.4,0.4l0.4,0.4l0.4,0.4l0.4,0.4l0.4,0.4l0.4,0.3l0.4,0.3l0.4,0.3l0.4,0.3l0.4,0.3l0.4,0.3l0.4,0.3
1082
+ l0.4,0.3l0.4,0.3l0.4,0.3l0.4,0.3l0.4,0.2l0.4,0.2l0.4,0.2l0.5,0.2l0.5,0.2l0.5,0.2l0.5,0.2l0.5,0.2l0.5,0.2l0.5,0.2l0.5,0.1
1083
+ l0.5,0.1l0.5,0.1l0.5,0.1l0.5,0.1l0.5,0.1l0.5,0.1l0.5,0.1l0.5,0.1h0.5h0.5h0.5h0.5h0.5h0.5h0.5h0.5l0.5-0.1l0.5-0.1l0.5-0.1
1084
+ l0.5-0.1l0.5-0.1l0.5-0.1l0.6-0.1l0.6-0.1l0.6-0.2l0.6-0.2l0.6-0.2l0.6-0.2l0.6-0.2l0.6-0.2l0.6-0.3l0.6-0.3l0.6-0.3l0.3-0.2
1085
+ l0.3-0.2l0.4-0.2l0.4-0.2l0.8-0.4l0.8-0.5l0.8-0.5l0.8-0.5l0.8-0.5l0.8-0.6l0.9-0.6l0.9-0.6l0.9-0.7l0.9-0.7l0.9-0.7l0.9-0.7
1086
+ l0.9-0.7l0.9-0.8l0.9-0.8l0.9-0.8l0.9-0.8l0.9-0.8l0.9-0.9l0.9-0.9l0.9-0.9l0.4-0.4l0.4-0.5l0.4-0.5l0.4-0.5l0.4-0.5l0.4-0.5
1087
+ l0.4-0.5l0.4-0.5l0.4-0.5l0.4-0.5l0.4-0.5l0.4-0.5l0.4-0.5l0.4-0.5l0.4-0.5l0.4-0.5l0.4-0.5l0.4-0.5l0.4-0.5l0.4-0.5l0.4-0.5
1088
+ l0.3-0.5l0.3-0.5l0.3-0.5l0.3-0.5l0.3-0.5l0.3-0.5l0.3-0.5l0.3-0.5l0.3-0.5l0.3-0.5l0.3-0.5l0.3-0.5l0.3-0.5l0.3-0.5l0.2-0.5
1089
+ l0.2-0.5l0.2-0.5l0.2-0.5l0.2-0.5l0.2-0.5l0.2-0.5l0.2-0.5l0.2-0.5l0.2-0.5l0.1-0.5l0.1-0.5l0.1-0.5l0.1-0.5l0.1-0.5l0.1-0.5
1090
+ l0.1-0.5l0.1-0.5l0.1-0.5l0.1-0.5V96v-0.5V95v-0.5V94v-0.5V93v-0.5V92l-0.1-0.5l-0.1-0.5l-0.1-0.5l-0.1-0.5l-0.1-0.4l-0.1-0.5
1091
+ l-0.1-0.4l-0.1-0.4l-0.2-0.4l-0.2-0.4l-0.2-0.4l-0.2-0.4l-0.2-0.4l-0.2-0.4l-0.2-0.4l-0.2-0.4l-0.3-0.4l-0.3-0.4l-0.3-0.4
1092
+ l-0.3-0.4l-0.3-0.4l-0.3-0.4l-0.3-0.4l-0.3-0.4l-0.3-0.4l-0.3-0.4l-0.4-0.4l-0.4-0.4l-0.4-0.4l-0.4-0.4l-0.4-0.4l-0.4-0.4
1093
+ l-0.4-0.4l-0.4-0.4l-0.4-0.4l-0.4-0.3l-0.4-0.3l-0.4-0.3l-0.5-0.3l-0.5-0.3l-0.5-0.3l-0.5-0.3l-0.5-0.3l-0.5-0.3l-0.5-0.3
1094
+ l-0.5-0.3l-0.5-0.3l-0.5-0.3l-0.5-0.3l-0.5-0.2l-0.5-0.2l-0.5-0.2l-0.5-0.2l-0.5-0.2l-0.5-0.2l-0.5-0.2l-0.5-0.2l-0.5-0.2
1095
+ l-0.5-0.2l-0.5-0.2l-0.5-0.2l-0.5-0.1l-0.5-0.1l-0.5-0.1l-0.5-0.1l-0.5-0.1l-0.5-0.1l-0.5-0.1l-0.5-0.1l-0.5-0.1h-0.5h-0.5
1096
+ h-0.5h-0.5h-0.5h-0.5h-0.5h-0.5h-0.5l-0.5,0.1l-0.5,0.1l-0.5,0.1l-0.4,0.1l-0.4,0.1l-0.4,0.1l-0.4,0.1l-0.4,0.1l-0.4,0.1
1097
+ l-0.4,0.1l-0.4,0.1l-0.4,0.2l-0.4,0.2l-0.4,0.2l-0.4,0.2l-0.4,0.2l-0.4,0.2l-0.4,0.2l-0.4,0.2l-0.4,0.2l-0.4,0.2l-0.4,0.2
1098
+ l-0.4,0.2l-0.4,0.2l-0.4,0.2l-0.8,0.5l-0.8,0.5l-0.8,0.5l-0.8,0.5l-0.7,0.5l-0.4,0.3l-0.4,0.3l-0.4,0.3l-0.5,0.4l-0.5,0.4
1099
+ l-0.5,0.4l-0.5,0.4l-0.2,0.2h-0.1v0.2l-0.1,0.3l-0.1,0.3l-0.1,0.3l-0.1,0.3l-0.2,0.3l-0.2,0.2l-0.2,0.2l-0.2,0.2l-0.3,0.2
1100
+ l-0.3,0.1l-0.3,0.1l-0.3,0.1h-0.3h-0.3h-0.2h-0.2h-0.3h-0.1h-0.2h-0.2h-0.1l-0.2-0.1l-0.2-0.1h-0.1l-0.2-0.1l-0.2-0.2l0,0
1101
+ l-0.2-0.1l-0.2-0.2l-0.2-0.2l0,0l-0.1-0.2l-0.1-0.2l-0.1-0.2l0,0l-0.1-0.2l-0.1-0.2l-0.1-0.2l0,0v-0.3v-0.3V79v-0.2v-0.2v-0.1
1102
+ v-0.2l0.1-0.2V78l0.1-0.3l0.1-0.2l0.1-0.3l0.1-0.2l0.1-0.2l0.2-0.3l0.3-0.3l0.3-0.3l0.3-0.3l0.3-0.3l0.3-0.3l0.3-0.3l0.3-0.3
1103
+ l0.6-0.5l0.6-0.5l0.6-0.4l0.6-0.4l0.5-0.3l0.4-0.3l0.5-0.3l0.8-0.5l0.8-0.5l0.8-0.5l0.9-0.5l0.9-0.5l0.5-0.3l0.5-0.3l0.5-0.3
1104
+ L157,68l0.5-0.2l0.5-0.2l0.5-0.2l0.5-0.2l0.5-0.2l0.5-0.2l0.5-0.2l0.5-0.2l0.5-0.2L162,66l0.5-0.2l0.5-0.2l0.5-0.2l0.5-0.2
1105
+ l0.5-0.1L165,65l0.5-0.1l0.5-0.1l0.7-0.1l0.7-0.1l0.7-0.1l0.7-0.1h0.7L168.7,64z M146,75.9L146,75.9L146,75.9L146,75.9z"
1106
+ />
1107
+ </g>
1108
+ <g transform="matrix(1,0,0,1,400.214,44.558)">
1109
+ <path
1110
+ d="M102.5,119.3h0.5h0.5h0.5h0.5h0.5l0.5,0.1l0.5,0.1l0.5,0.1l0.5,0.1l0.5,0.1l0.5,0.2l0.5,0.2l0.5,0.2
1111
+ l0.5,0.2l0.5,0.2l0.5,0.2l0.3,0.1l0.2,0.1l0.2,0.1l0.2,0.2l0.2,0.2l0.2,0.2l0.2,0.2l0.2,0.2l0.2,0.2l0.2,0.2l0.2,0.2l0.2,0.2
1112
+ l0.2,0.2l0.2,0.2l0.2,0.2l0.2,0.2l0.2,0.2l0.2,0.2l0.2,0.2l0.2,0.2l0.2,0.2l0.2,0.2l0.2,0.3l0.2,0.3l0.2,0.3l0.1,0.3l0.1,0.3
1113
+ l0.1,0.3l0.1,0.3l0.1,0.3l0.1,0.3l0.1,0.3l0.1,0.3l0.1,0.3l0.1,0.3l0.1,0.3v0.3v0.3v0.3v0.3v0.3v0.3v0.3v0.3v0.3v0.3v0.3
1114
+ l-0.1,0.3l-0.1,0.3l-0.1,0.3l-0.1,0.3l-0.1,0.3l-0.1,0.3l-0.1,0.3l-0.1,0.3l-0.1,0.3l-0.1,0.3l-0.1,0.3l-0.1,0.3l-0.1,0.3
1115
+ l-0.3,0.6l-0.3,0.6l-0.3,0.6l-0.3,0.6l-0.3,0.6l-0.4,0.6l-0.4,0.6l-0.4,0.6l-0.4,0.6l-0.4,0.6l-0.4,0.5l-0.4,0.5l-0.5,0.5
1116
+ l-0.5,0.5l-0.5,0.5l-0.5,0.5l-0.5,0.5l-0.5,0.5l-0.5,0.5l-0.5,0.5l-0.5,0.5l-0.5,0.5l-0.5,0.5l-0.5,0.5l-0.5,0.5l-0.5,0.4
1117
+ l-0.5,0.4l-0.5,0.4l-0.5,0.4l-0.5,0.4l-0.5,0.4l-0.5,0.4l-0.5,0.4l-0.5,0.3l-0.5,0.3l-0.5,0.3l-0.5,0.3l-0.5,0.3l-0.5,0.3
1118
+ l-0.5,0.3l-0.5,0.2l-0.5,0.2l-0.5,0.2l-0.5,0.2l-0.5,0.2l-0.5,0.1l-0.5,0.1l-0.3,0.1h-0.2l-0.6,0.1l-0.6,0.1h-0.6h-0.5h-0.5
1119
+ h-0.5h-0.5l-0.5-0.1l-0.5-0.1l-0.3-0.1l-0.2-0.1l-0.2-0.1l-0.2-0.1l-0.2-0.1L87,156l-0.2-0.1l-0.2-0.1l-0.2-0.1l-0.2-0.1
1120
+ l-0.4-0.2l-0.4-0.2l-0.4-0.3l-0.4-0.3l-0.4-0.3l-0.3-0.3l-0.3-0.3l-0.3-0.3L83,153l-0.3-0.4l-0.2-0.4l-0.2-0.4l-0.2-0.4
1121
+ l-0.2-0.4l-0.2-0.4l-0.1-0.4l-0.1-0.4l-0.1-0.4l-0.1-0.4l-0.1-0.4l-0.1-0.4l-0.1-0.4l-0.1-0.4V147v-0.4v-0.4v-0.4v-0.4V145
1122
+ v-0.4v-0.4v-0.4v-0.4V143v-0.4l0.1-0.4l0.1-0.4l0.1-0.4l0.1-0.4l0.1-0.4l0.1-0.4l0.1-0.4l0.1-0.4l0.1-0.4l0.1-0.4l0.1-0.4
1123
+ l0.1-0.4l0.1-0.4l0.1-0.4l0.1-0.4l0.1-0.4l0.2-0.5L83,135l0.3-0.8l0.4-0.9l0.4-1l0.5-1l0.2-0.5l0.2-0.5l0.2-0.5l0.2-0.5
1124
+ l0.2-0.5l0.2-0.5v-0.1V128v-0.2v-0.2v-0.2l0.1-0.2L86,127l0.1-0.2l0.1-0.2l0.1-0.2l0.1-0.2l0.1-0.2l0.1-0.1l0.1-0.1l0.3-0.3
1125
+ l0.4-0.3l0.4-0.3l0.4-0.3l0.4-0.3L89,124l0.4-0.3l0.4-0.3l0.4-0.3l0.4-0.3l0.4-0.3l0.4-0.3l0.4-0.3l0.5-0.2l0.5-0.2l0.5-0.2
1126
+ l0.5-0.2l0.5-0.2l0.5-0.2l0.5-0.2l0.5-0.2l0.5-0.2l0.5-0.2l0.5-0.1l0.5-0.1l0.5-0.1l0.5-0.1l0.5-0.1l0.5-0.1l0.5-0.1l0.5-0.1
1127
+ l0.5-0.1h0.5L102.5,119.3z M102,125.2h-0.4h-0.4l-0.4,0.1l-0.4,0.1l-0.4,0.1l-0.4,0.1l-0.4,0.1l-0.4,0.1l-0.4,0.1L98,126
1128
+ l-0.4,0.1l-0.4,0.1l-0.4,0.1l-0.4,0.1l-0.4,0.2l-0.4,0.2l-0.4,0.2l-0.4,0.2l-0.4,0.2l-0.3,0.2l-0.3,0.2l-0.3,0.2l-0.3,0.2l0,0
1129
+ v0.1v0.2l-0.1,0.2l-0.1,0.2l-0.1,0.2l-0.1,0.2l-0.1,0.2l-0.1,0.2l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.2,0.1l-0.2,0.1
1130
+ l-0.2,0.1l-0.2,0.1l-0.2,0.1l0,0l-0.2,0.3l-0.2,0.4l-0.2,0.4l-0.2,0.4l-0.2,0.4L90,133l-0.2,0.5l-0.2,0.5l-0.4,0.9l-0.4,0.9
1131
+ l-0.4,0.8l-0.3,0.7l-0.2,0.6l-0.2,0.4l-0.1,0.2l-0.1,0.3l-0.1,0.3l-0.1,0.3l-0.1,0.3l-0.1,0.3l-0.1,0.3l-0.1,0.3l-0.1,0.3
1132
+ l-0.1,0.3l-0.1,0.3l-0.1,0.3l-0.1,0.3l-0.1,0.3v0.3v0.3v0.3v0.3v0.3v0.3v0.3v0.3v0.3v0.3v0.3v0.3v0.3v0.3v0.3v0.3v0.3l0.1,0.2
1133
+ l0.1,0.2l0.1,0.2l0.1,0.2l0.1,0.2l0.1,0.2l0.1,0.2l0.1,0.2l0.1,0.2l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1
1134
+ l0.1,0.1l0.1,0.1l0.1,0.1l0.2,0.1h0.1h0.1h0.1h0.1h0.1H89h0.1h0.1h0.1h0.1h0.2h0.2h0.3h0.3h0.3H91h0.3h0.4l0.4-0.1h0.1h0.1
1135
+ l0.2-0.1l0.2-0.1L93,150l0.3-0.1l0.3-0.1l0.3-0.2l0.4-0.2l0.4-0.2l0.4-0.2l0.4-0.2l0.4-0.2l0.4-0.3l0.4-0.3l0.4-0.3l0.4-0.3
1136
+ l0.5-0.3l0.5-0.3l0.5-0.3l0.5-0.4l0.5-0.4l0.5-0.4l0.5-0.4l0.5-0.4l0.5-0.4l0.5-0.4l0.5-0.4l0.5-0.4l0.5-0.4l0.4-0.4l0.4-0.5
1137
+ l0.4-0.5l0.4-0.5l0.4-0.5l0.4-0.5l0.4-0.5l0.4-0.5l0.4-0.5l0.4-0.5l0.3-0.5l0.3-0.5l0.3-0.5l0.3-0.5l0.3-0.5l0.3-0.5l0.2-0.4
1138
+ l0.2-0.4l0.2-0.4l0.1-0.2l0.1-0.2l0.1-0.2l0.1-0.2l0.1-0.2l0.1-0.2l0.1-0.2l0.1-0.2l0.1-0.2v-0.2v-0.2V131v-0.2v-0.2v-0.2v-0.2
1139
+ V130v-0.1v-0.1v-0.1v-0.1v-0.1v-0.1v-0.1v-0.1v-0.1V129v-0.1v-0.1v-0.1v-0.1l-0.1-0.1l-0.1-0.2l-0.1-0.2l-0.1-0.2l-0.1-0.2
1140
+ l-0.1-0.2l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1
1141
+ l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.3-0.1l-0.3-0.1
1142
+ l-0.3-0.1l-0.3-0.1l-0.3-0.1l-0.3-0.1l-0.3-0.1l-0.3-0.1l-0.3-0.1l-0.3-0.1h-0.3h-0.3h-0.3h-0.4h-0.4h-0.4h-0.4L102,125.2z"
1143
+ />
1144
+ </g>
1145
+ <g transform="matrix(1,0,0,1,400.214,44.558)">
1146
+ <path
1147
+ d="M80.8,178.7h0.4h0.4H82h0.4l0.4,0.1l0.4,0.1l0.4,0.1l0.4,0.1l0.6,0.2l0.5,0.2l0.5,0.2l0.5,0.2l0.5,0.2
1148
+ l0.5,0.2l0.5,0.2l0.5,0.2l0.5,0.2l0.5,0.2l0.5,0.2l0.4,0.2l0.4,0.2l0.4,0.2l0.4,0.2l0.4,0.2l0.4,0.2l0.4,0.2l0.4,0.2l0.4,0.2
1149
+ l0.4,0.2l0.4,0.2l0.4,0.2l0.4,0.2l0.7,0.5l0.7,0.5l0.6,0.5l0.6,0.5l0.6,0.5l0.6,0.5l0.6,0.5l0.6,0.5l1.2,1l1.2,1.1l0.6,0.5
1150
+ l0.7,0.6l0.7,0.6l0.7,0.6l0.7,0.6l0.8,0.6l0.8,0.6l0.8,0.6l0.2,0.1l0.2,0.1l0.2,0.1l0.2,0.1l0.2,0.1l0.2,0.1l0.4,0.2l0.4,0.2
1151
+ l0.4,0.2l0.4,0.2l0.4,0.2l0.5,0.2l0.5,0.2l0.5,0.2l0.5,0.2l0.5,0.2l0.5,0.2l1.1,0.3l1.1,0.3l1.1,0.3l1.1,0.3l0.6,0.2l0.6,0.2
1152
+ l0.6,0.2l0.6,0.2l0.6,0.2l0.6,0.2l0.5,0.2l0.6,0.2l0.5,0.2l0.5,0.3l0.3,0.2l0.3,0.2l0.3,0.2l0.3,0.2l0.4,0.2l0.4,0.2l0.4,0.3
1153
+ l0.4,0.3l0.4,0.3l0.4,0.3l0.4,0.3l0.4,0.3l0.4,0.3l0.4,0.4l0.4,0.4l0.4,0.4l0.4,0.4l0.4,0.4l0.3,0.4l0.2,0.2l0.2,0.2l0.2,0.2
1154
+ l0.2,0.2l0.2,0.2l0.1,0.2l0.1,0.2l0.1,0.3l0.1,0.3l0.1,0.3l0.1,0.3l0.1,0.3l0.1,0.3l0.1,0.3l0.1,0.3l0.1,0.3v0.3v0.3v0.3v0.3
1155
+ v0.4l-0.1,0.4l-0.1,0.3l-0.1,0.3l-0.1,0.3l-0.1,0.3l-0.1,0.3l-0.1,0.2l-0.1,0.2l-0.1,0.2l-0.1,0.2l-0.1,0.2l-0.2,0.2l-0.2,0.2
1156
+ l-0.2,0.2l-0.2,0.2l-0.2,0.2l-0.2,0.2l-0.2,0.2l-0.2,0.2l-0.2,0.2l-0.2,0.1l-0.2,0.1l-0.2,0.1l-0.2,0.1l-0.2,0.1l-0.2,0.1
1157
+ l-0.2,0.1l-0.2,0.1l-0.2,0.1l-0.4,0.1l-0.5,0.1l-0.4,0.1l-0.4,0.1h-0.4h-0.4h-0.4h-0.4h-0.4h-0.4l-0.4-0.1l-0.4-0.1l-0.4-0.1
1158
+ l-0.4-0.1l-0.4-0.1l-0.4-0.1l-0.4-0.1l-0.4-0.1l-0.4-0.1l-0.4-0.1l-0.4-0.1l-0.4-0.1l-0.8-0.3l-0.8-0.3l-0.8-0.3l-0.8-0.3
1159
+ l-0.7-0.3l-1.4-0.6l-0.7-0.3l-0.6-0.3l-0.6-0.2l-0.5-0.2l-0.5-0.2l-0.2-0.1l-0.2-0.1l-0.2-0.1h-0.2h-0.1h-0.2l-0.3-0.1
1160
+ l-0.3-0.1l-0.3-0.1l-0.3-0.1l-0.3-0.1l-0.3-0.1l-0.3-0.1l-0.3-0.1l-0.3-0.1l-0.3-0.1l-0.3-0.1l-0.3-0.1l-0.3-0.1l-0.3-0.1
1161
+ l-0.5-0.3l-0.5-0.3l-0.5-0.3l-0.5-0.3l-0.5-0.3l-0.4-0.3l-0.4-0.3l-0.8-0.6l-0.8-0.6l-0.8-0.6l-0.4-0.3l-0.4-0.3l-0.4-0.3
1162
+ l-0.4-0.3l-0.4-0.2l-0.4-0.2l-0.4-0.2l-0.4-0.2l-0.2-0.1l-0.2-0.1l-0.2-0.1l-0.2-0.1l-0.2-0.1l-0.2-0.1l-0.2-0.1l-0.2-0.1
1163
+ l-0.5-0.2l-0.5-0.1l-0.5-0.1l-0.5-0.1l-0.5-0.1l-0.5-0.1l-0.5-0.1l-0.5-0.1l-0.5-0.1l-0.5-0.1l-0.5-0.1h-0.5h-0.5h-0.5h-0.5
1164
+ h-0.5h-0.5h-0.5h-0.5h-0.5h-0.6h-0.5h-1.1l-1.1,0.1l-1.1,0.1l-2.3,0.2l-1.2,0.1l-1.2,0.1l-1.2,0.1l-1.2,0.1h-1.2h-0.6H72h-0.6
1165
+ H69h-0.6h-0.6h-0.6h-0.6H66h-0.6l-0.6-0.1l-0.6-0.1l-0.6-0.1l-0.6-0.1l-0.6-0.1l-0.6-0.1l-0.6-0.1l-0.6-0.1l-0.6-0.2l-0.6-0.2
1166
+ l-0.6-0.2l-0.6-0.2l-0.6-0.2l-0.6-0.2l-0.5-0.2l-0.5-0.2l-0.5-0.2L55,202l-0.5-0.3l-0.5-0.3l-0.4-0.3l-0.4-0.3l-0.4-0.3
1167
+ l-0.4-0.3l-0.4-0.3l-0.4-0.3l-0.3-0.4l-0.3-0.4l-0.3-0.4l-0.3-0.4l-0.3-0.4l-0.2-0.4l-0.2-0.4l-0.2-0.4l-0.2-0.4l-0.1-0.4
1168
+ l-0.1-0.4l-0.1-0.4l-0.1-0.4V194v-0.4v-0.4v-0.4l0.1-0.4l0.1-0.4l0.1-0.4l0.1-0.4l0.1-0.4l0.2-0.4l0.2-0.4l0.2-0.4l0.2-0.4
1169
+ l0.2-0.4l0.2-0.4l0.2-0.4l0.3-0.4l0.3-0.3l0.3-0.3l0.3-0.3l0.3-0.3l0.3-0.3l0.3-0.3l0.3-0.3l0.4-0.3l0.4-0.3l0.4-0.3l0.4-0.3
1170
+ l0.4-0.3l0.4-0.3l0.4-0.3l0.4-0.2l0.2-0.1l0,0v-0.3l0.1-0.3l0.1-0.3l0.1-0.3l0.1-0.3l0.2-0.2l0.2-0.2l0.2-0.2l0.2-0.2l0.3-0.2
1171
+ l0.3-0.1l0.3-0.1l0.3-0.1h0.3h0.3h0.3l0.3,0.1l0.3,0.1l0.3,0.1l0.3,0.1l0.2,0.2l0.2,0.2h0.1l0.5-0.1l0.3-0.1l0.3-0.1l0.3-0.1
1172
+ h0.3h0.4h0.4h0.4h0.4l0.4,0.1h0.3l0.2,0.1L66,181l0.2,0.1l0.2,0.1l0.2,0.1l0.3,0.1l0.2,0.1l0.2,0.1l0.2,0.1l0.2,0.1l0.2,0.1
1173
+ h0.2h0.2h0.2h0.2h0.2h0.2h0.2h0.2h0.2h0.2h0.2h0.2h0.2h0.2h0.2h0.2l0.2-0.1l0.2-0.1l0.5-0.1l0.5-0.2l0.5-0.2l0.5-0.2l1.1-0.4
1174
+ l0.5-0.2l0.6-0.2l0.6-0.2l0.6-0.2l0.6-0.2l0.3-0.1l0.3-0.1l0.3-0.1l0.3-0.1l0.3-0.1l0.3-0.1h0.3h0.3h0.4L80.8,178.7z
1175
+ M80.5,184.6h-0.2h-0.2h-0.2h-0.2h-0.2h-0.2l-0.2,0.1l-0.2,0.1l-0.4,0.1L78,185l-0.5,0.2l-0.5,0.2l-0.5,0.2l-1.1,0.4l-0.6,0.2
1176
+ l-0.6,0.2l-0.6,0.2l-0.6,0.2l-0.3,0.1l-0.3,0.1l-0.3,0.1l-0.3,0.1l-0.3,0.1l-0.3,0.1h-0.4h-0.4H70h-0.4h-0.4h-0.4h-0.4H68h-0.4
1177
+ l-0.4-0.1l-0.4-0.1l-0.4-0.1L66,187l-0.4-0.1l-0.4-0.1l-0.4-0.2l-0.4-0.2l-0.2-0.1l0,0h-0.1H64h-0.2h-0.2h-0.2h-0.2l-0.5,0.1
1178
+ l-0.5,0.1l-0.5,0.1h-0.2l-0.2,0.2L61,187l-0.3,0.1l-0.4,0.2l-0.3,0.2l-0.3,0.2l-0.3,0.2l-0.3,0.2l-0.3,0.2l-0.3,0.2l-0.3,0.2
1179
+ l-0.3,0.2l-0.3,0.2l-0.3,0.2l-0.2,0.2l-0.2,0.2l-0.2,0.2l-0.2,0.2l-0.2,0.2l-0.2,0.2l-0.2,0.2l-0.2,0.2l-0.2,0.2l-0.1,0.2
1180
+ l-0.1,0.2l-0.1,0.2l-0.1,0.2l-0.1,0.2l-0.1,0.2l-0.1,0.2l-0.1,0.2l-0.1,0.2v0.2l0,0.1v0.1v0.1v0.1v0.1v0.1v0.1v0.1v0.1v0.1v0.1
1181
+ v0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.2l0.1,0.2l0.2,0.2l0.2,0.2l0.2,0.2l0.2,0.2l0.2,0.2l0.3,0.2
1182
+ l0.3,0.2l0.3,0.2l0.3,0.2l0.4,0.2l0.4,0.2l0.4,0.2l0.4,0.2l0.4,0.2l0.5,0.2l0.5,0.1l0.5,0.1l0.5,0.1l0.5,0.1l0.5,0.1l0.5,0.1
1183
+ l0.5,0.1l0.5,0.1l0.5,0.1l0.5,0.1l0.5,0.1h0.5h0.5h0.5h0.5h0.5h0.5h0.6h0.6h0.6H71h1.1l1.1-0.1l1.1-0.1l1.2-0.1l1.2-0.1
1184
+ l2.3-0.2l1.2-0.1l1.2-0.1h1.2h0.6h0.6h0.6H85h0.6h0.6h0.6h0.6H88h0.6l0.6,0.1l0.6,0.1l0.6,0.1L91,199l0.6,0.1l0.6,0.1l0.6,0.1
1185
+ l0.6,0.1l0.6,0.2l0.6,0.2l0.6,0.2l0.6,0.2l0.3,0.1l0.3,0.1l0.3,0.1l0.3,0.1l0.3,0.1l0.3,0.1l0.3,0.1l0.3,0.1l0.5,0.3l0.5,0.3
1186
+ l0.5,0.3l0.5,0.3l0.5,0.3l0.5,0.3l0.4,0.3l0.4,0.3l0.8,0.7l0.8,0.6l0.8,0.6l0.4,0.3l0.4,0.3l0.4,0.3l0.4,0.2l0.4,0.2l0.4,0.2
1187
+ l0.4,0.2l0.2,0.1l0.2,0.1l0.2,0.1l0.2,0.1l0.2,0.1l0.2,0.1l0.2,0.1l0.2,0.1l0.2,0.1l0.2,0.1l0.2,0.1l0.2,0.1h0.2l0.2,0.1
1188
+ l0.3,0.1l0.3,0.1l0.3,0.1l0.3,0.1l0.3,0.1l0.3,0.1l0.6,0.2l0.6,0.3l0.7,0.3l0.7,0.3l0.7,0.3l1.4,0.6l0.7,0.3l0.7,0.3l0.7,0.3
1189
+ l0.7,0.3l0.7,0.3l0.3,0.1l0.3,0.1l0.3,0.1l0.3,0.1l0.3,0.1l0.3,0.1l0.3,0.1l0.3,0.1l0.3,0.1l0.3,0.1h0.3h0.3h0.2h0.2h0.2h0.2
1190
+ h0.2h0.2h0.2h0.1h0.1h0.1l0,0h0.1l0,0l0,0l0,0l0,0l0,0l0,0l0,0l0,0l0,0l0,0l0,0l0,0l0,0l0,0l0,0v-0.1v-0.1v-0.1V213v-0.1v-0.1
1191
+ l0,0l0,0l0,0l0,0v-0.1v-0.1v-0.1v-0.1v-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.2-0.3
1192
+ l-0.2-0.3l-0.3-0.3l-0.3-0.3l-0.3-0.3l-0.3-0.3l-0.3-0.3l-0.3-0.3l-0.3-0.2l-0.3-0.2l-0.3-0.2l-0.3-0.2l-0.3-0.2l-0.3-0.2
1193
+ l-0.3-0.2l-0.2-0.2l-0.2-0.1l-0.2-0.1l-0.2-0.1l-0.4-0.2l-0.4-0.2l-0.4-0.2l-0.4-0.2l-0.5-0.2l-0.5-0.2l-0.5-0.2l-0.5-0.2
1194
+ l-0.5-0.2l-0.5-0.2l-1.1-0.3l-1.1-0.3l-1.1-0.3l-1.1-0.4l-0.6-0.2l-0.6-0.2l-0.6-0.2l-0.6-0.2l-0.6-0.2l-0.6-0.2l-0.6-0.2
1195
+ l-0.6-0.3l-0.5-0.3l-0.5-0.3l-0.5-0.3l-0.3-0.2l-0.3-0.2l-0.3-0.2l-0.3-0.2l-0.3-0.2l-0.2-0.2l-0.9-0.7l-0.9-0.7l-0.8-0.6
1196
+ l-0.8-0.6l-0.7-0.6l-0.7-0.6l-0.7-0.6l-0.7-0.6l-1.2-1.1l-1.2-1l-0.6-0.5l-0.6-0.5l-0.5-0.5l-0.6-0.4l-0.5-0.4l-0.6-0.4
1197
+ l-0.6-0.4l-0.6-0.4l-0.3-0.2l-0.3-0.2l-0.3-0.2l-0.3-0.2l-0.3-0.2l-0.3-0.2l-0.3-0.2l-0.3-0.2l-0.3-0.2l-0.3-0.2l-0.4-0.2
1198
+ l-0.4-0.2l-0.4-0.2l-0.4-0.2l-0.4-0.2l-0.4-0.2l-0.4-0.2l-0.4-0.2l-0.4-0.2l-0.5-0.2l-0.5-0.2l-0.5-0.2l-0.5-0.2l-0.5-0.2H80
1199
+ h-0.1h-0.1h-0.1h-0.1h-0.1h-0.1h-0.1h-0.2L80.5,184.6z"
1200
+ />
1201
+ </g>
1202
+ <g transform="matrix(1,0,0,1,400.214,44.558)">
1203
+ <path
1204
+ d="M332.3,146.1h0.2h0.2h0.2h0.2h0.2l0.2,0.1l0.2,0.1l0.2,0.1l0.2,0.1l0.1,0.1l0.1,0.1l0,0l0,0l0.6,0.1
1205
+ l0.6,0.1l0.5,0.1l0.5,0.1l0.5,0.1l0.3,0.1l0.3,0.1l0.2,0.1l0.2,0.1l0.2,0.1l0.2,0.1l0.2,0.1l0.2,0.1l0.2,0.1l0.2,0.1l0.2,0.1
1206
+ l0.2,0.1l0.4,0.3l0.4,0.3l0.4,0.3l0.3,0.3l0.3,0.3l0.3,0.4l0.3,0.4l0.3,0.4l0.3,0.4l0.2,0.4l0.2,0.4l0.2,0.4l0.2,0.4l0.2,0.4
1207
+ l0.2,0.4l0.2,0.4l0.1,0.4l0.1,0.4l0.1,0.4l0.1,0.4l0.1,0.4l0.1,0.4l0.2,0.8l0.2,0.8l0.2,0.8l0.2,0.8l0.2,0.8l0.2,0.8l0.2,0.8
1208
+ l0.2,0.8l0.1,0.4l0.1,0.4l0.1,0.4l0.1,0.4l0.1,0.4l0.1,0.4l0.1,0.4l0.1,0.4l0.2,0.4l0.2,0.4l0.2,0.4l0.2,0.4l0.2,0.4l0.3,0.5
1209
+ l0.3,0.7l0.4,0.7l0.2,0.4l0.2,0.4l0.2,0.4l0.2,0.4l0.2,0.5l0.2,0.5l0.2,0.5l0.2,0.5l0.2,0.5l0.1,0.5l0.1,0.5l0.1,0.3v0.3v0.3
1210
+ v0.3v0.3v0.3v0.3v0.3v0.3v0.3v0.3l-0.1,0.3l-0.1,0.3l-0.1,0.3l-0.1,0.3l-0.1,0.3l-0.2,0.3l-0.2,0.3L350,181l-0.2,0.3l-0.2,0.3
1211
+ l-0.3,0.3l-0.3,0.2l-0.3,0.2l-0.3,0.2l-0.3,0.2l-0.3,0.1l-0.2,0.1l-0.2,0.1l-0.2,0.1l-0.2,0.1l-0.2,0.1l-0.2,0.1h-0.3h-0.2
1212
+ h-0.3h-0.3h-0.2H345h-0.2h-0.2h-0.2h-0.2H344h-0.2l-0.2-0.1l-0.4-0.1l-0.4-0.1l-0.4-0.2l-0.4-0.2l-0.4-0.2l-0.4-0.2l-0.4-0.2
1213
+ l-0.4-0.2l-0.4-0.2l-0.4-0.3l-0.4-0.3l-0.4-0.3l-0.3-0.3l-0.4-0.3l-0.3-0.3l-0.3-0.3l-0.3-0.3l-0.3-0.3l-0.3-0.3l-0.3-0.3
1214
+ l-0.3-0.3l-0.3-0.3l-0.3-0.4l-0.3-0.4l-0.3-0.4l-0.3-0.4l-0.3-0.4l-0.3-0.4l-0.3-0.4l-0.3-0.4l-0.3-0.4l-0.3-0.4l-0.5-0.7
1215
+ l-0.5-0.7l-0.4-0.7l-0.4-0.7l-0.4-0.7l-0.3-0.7l-0.3-0.6l-0.3-0.6l-0.1-0.3l-0.1-0.3l-0.1-0.3l-0.1-0.3l-0.1-0.3l-0.1-0.3
1216
+ l-0.1-0.4l-0.1-0.4l-0.1-0.4l-0.1-0.4l-0.1-0.4l-0.1-0.4l-0.1-0.4v-0.4V163v-0.4v-0.4v-0.4v-0.4V161v-0.9v-0.9v-0.8v-1.6v-1.6
1217
+ v-0.7v-0.8v-0.2v-0.1v-0.1v-0.2l0.1-0.3l0.1-0.3l0.1-0.3l0.1-0.3l0.1-0.2l0.1-0.2l0.2-0.4l0.2-0.4l0.1-0.2l0,0v-0.1v-0.1
1218
+ l-0.1-0.2v-0.2v-0.2v-0.2v-0.2v-0.2v-0.2v-0.2l0.1-0.2l0.1-0.2l0.1-0.2l0.1-0.2l0.1-0.2l0.1-0.2l0.1-0.2l0.1-0.1l0.1-0.1
1219
+ l0.1-0.1l0.2-0.1l0.2-0.1l0.2-0.1l0.2-0.1l0.2-0.1l0.2-0.1h0.2h0.2h0.2L332.3,146.1z M334.7,152.9l-0.1,0.3l-0.1,0.3v0.1v0.1
1220
+ l0,0v0.6v0.8l-0.1,1.6v1.6v0.8v0.8v0.8v0.4v0.4v0.4v0.4v0.4v0.3v0.3v0.3v0.3l0.1,0.3l0.1,0.3l0.1,0.3l0.1,0.3l0.1,0.3v0.1v0.1
1221
+ l0.1,0.2l0.1,0.2l0.1,0.2l0.1,0.2l0.2,0.5l0.2,0.5l0.3,0.5l0.3,0.6l0.3,0.6l0.4,0.6l0.4,0.6l0.4,0.6l0.2,0.3l0.2,0.3l0.2,0.3
1222
+ l0.2,0.3l0.2,0.3l0.2,0.3l0.2,0.3l0.2,0.3l0.2,0.3l0.3,0.3l0.2,0.3l0.2,0.3l0.3,0.3l0.3,0.3l0.3,0.3l0.3,0.2l0.2,0.2l0.2,0.2
1223
+ l0.2,0.2l0.2,0.2l0.2,0.2l0.2,0.2l0.2,0.2l0.2,0.2l0.2,0.1l0.2,0.1l0.2,0.1l0.2,0.1l0.2,0.1l0.2,0.1h0.2h0.2l0,0h0.1h0.1h0.1
1224
+ h0.1h0.1h0.1l0,0l0,0l0,0l0,0l0,0l0,0l0,0l0,0v-0.1v-0.1v-0.1v-0.1v-0.1v-0.1v-0.1V177l-0.1-0.3l-0.1-0.3l-0.1-0.3l-0.1-0.3
1225
+ l-0.1-0.4l-0.1-0.4l-0.1-0.4l-0.2-0.4l-0.2-0.4l-0.2-0.4l-0.2-0.3l-0.3-0.7l-0.3-0.6l-0.3-0.5l-0.2-0.5l-0.2-0.5l-0.2-0.5
1226
+ l-0.2-0.5l-0.2-0.5l-0.2-0.5l-0.2-0.5l-0.2-0.5l-0.2-0.5l-0.1-0.5l-0.1-0.5l-0.1-0.5l-0.1-0.5l-0.2-0.9l-0.2-0.9l-0.2-0.9
1227
+ l-0.2-0.9l-0.2-0.8l-0.2-0.8l-0.2-0.8l-0.2-0.7l-0.1-0.3l-0.1-0.3l-0.1-0.3l-0.1-0.3l-0.1-0.3l-0.1-0.3l-0.1-0.3l-0.1-0.3
1228
+ l-0.1-0.2l-0.1-0.2l-0.1-0.2l-0.1-0.2l-0.1-0.2l-0.1-0.2l-0.1-0.2l-0.1-0.2l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1
1229
+ l-0.2-0.1h-0.1h-0.1l-0.1-0.1h-0.1l-0.1-0.1h-0.1h-0.1H336h-0.1h-0.1h-0.1h-0.1l-0.3-0.1l-0.3-0.1h-0.1L334.7,152.9z"
1230
+ />
1231
+ </g>
1232
+ </g>
1233
+ </g>
1234
+ </g>
1235
+ <g>
1236
+ <g transform="matrix(0.380231,0.924892,-0.924892,0.380231,1549.4,-185.872)">
1237
+ <path
1238
+ fill="#B5A47D"
1239
+ d="M-204.2,1379.2L-204.2,1379.2l-0.4-0.9l-0.3-0.8l-0.3-0.9l-0.4-0.9l-0.4-0.9l-0.7-1.9l-0.6-1.7l-0.3-0.8
1240
+ l-0.2-0.7l-0.2-0.7l-0.2-0.8l-0.3-1.2l-0.2-1l-0.2-0.9l-0.2-0.9l-0.2-0.9l-0.1-0.9l-0.1-0.9l-0.1-0.9l-0.1-0.9l-0.1-0.9l-0.2-1.6
1241
+ l-0.2-1.6l-0.2-1.5l-0.2-1.5l-0.1-0.7l-0.1-0.7l-0.1-0.7l-0.1-0.7l-0.1-0.6l-0.1-0.6l-0.1-0.6l-0.1-0.6l-0.1-0.6l-0.1-0.6
1242
+ l-0.1-0.5l-0.1-0.5l-0.1-0.5l-0.2-0.6l-0.5-1.6l-0.5-1.7l-0.5-1.7l-0.5-1.7l-0.5-1.7l-0.5-1.8l-0.5-1.8l-0.4-1.8l-0.4-1.8
1243
+ l-0.4-1.8l-0.4-1.8l-0.4-1.8l-0.4-1.8l-0.4-1.8l-0.4-1.8l-0.4-1.8l-0.4-1.8l-0.4-1.8l-0.4-1.8l-0.3-1.8l-0.3-1.8l-0.3-1.8
1244
+ l-0.3-1.8l-0.3-1.8l-0.3-1.8l-0.3-1.8l-0.3-1.8l-0.3-1.8l-0.3-1.8l-0.2-1.8l-0.2-1.8l-0.2-1.8l-0.1-1.2l-0.2-1.2l-0.2-1.2
1245
+ l-0.2-1.2l-0.2-1.2l-0.2-1.2l-0.1-0.6l-0.1-0.6l-0.1-0.6l-0.1-0.5l-0.1-0.5l-0.1-0.5l-0.1-0.5l-0.1-0.5l-0.1-0.5l-0.1-0.5
1246
+ l-0.1-0.5l-0.1-0.5l-0.1-0.5l-0.1-0.4l-0.1-0.3l-0.5-0.3l-0.6-0.4l-0.4-0.3l-0.4-0.4l-0.6-0.5l-0.4-0.4l-0.8-0.8l-0.1-0.1l-0.8-1
1247
+ l0,0l-0.6-1l0,0l-0.4-0.7l-0.3-0.8l0,0l-0.4-1.2l-0.2-1.2l0,0l-0.1-1.4v-1.4l0,0l0.2-1.2l0.3-1.2l0.4-1.1l0,0l0.3-0.7l-0.1-0.2
1248
+ l-0.3-0.7l-0.3-0.7l-0.2-0.7l-0.2-0.7l-0.1-0.3h-0.2l-0.5-0.1l-0.5-0.2l-0.5-0.2l-0.5-0.2l-0.5-0.2l-0.5-0.2l-0.5-0.2l-0.5-0.2
1249
+ l-0.5-0.2l-0.5-0.3l-0.4-0.3l-0.4-0.3l-0.4-0.3l-0.4-0.3l-0.4-0.3l-0.4-0.3l-0.4-0.3l-0.4-0.3l-0.4-0.3l-0.3-0.3l-0.3-0.3
1250
+ l-0.3-0.3l-0.3-0.3l-0.3-0.4l-0.6-0.6l-0.6-0.7l-0.5-0.7l-0.5-0.7l-0.5-0.7l-0.5-0.7l-0.4-0.7l-0.4-0.7l-0.4-0.7l-0.4-0.7
1251
+ l-0.4-0.7l-0.3-0.7l-0.3-0.7l-0.3-0.7l-0.3-0.7l-0.3-0.7l-0.1-0.3l-0.1-0.1l-0.4-0.4l-0.4-0.4l-0.3-0.4l-0.3-0.4l-0.5-0.7
1252
+ l-0.5-0.7l-0.4-0.7l-0.4-0.6l-0.3-0.6l-0.3-0.6l-0.3-0.5l-0.2-0.5l-0.2-0.5l-0.4-0.9l-0.3-0.8l-0.3-0.6l-0.2-0.4l-0.1-0.2
1253
+ l-0.8-1.1l-0.5-0.7l-0.5-0.7l-0.5-0.8l-0.6-0.9l-0.6-0.9l-0.6-1l-0.6-1l-0.3-0.5l-0.3-0.5l-0.3-0.5l-0.3-0.5l-0.3-0.6l-0.3-0.6
1254
+ l-0.3-0.6l-0.3-0.6l-0.3-0.6l-0.3-0.6l-0.3-0.7l-0.3-0.7l-0.3-0.7l-0.2-0.7l-0.2-0.7l-0.2-0.8l-0.2-0.8l-0.2-0.8l-0.1-0.8
1255
+ l-0.1-0.9l-0.1-0.8v-0.5v-0.5v-0.5v-0.5v-0.5v-0.5v-0.5l0.1-0.5l0.1-0.5l0.1-0.5l0.1-0.5l0.1-0.5l0.1-0.5l0.2-0.6l0.2-0.5
1256
+ l0.2-0.6l0.2-0.6l0.3-0.6l0.3-0.5l0.3-0.5l0.3-0.5l0.4-0.5l0.4-0.5l0.4-0.5l0.4-0.5l0.4-0.5l0.4-0.4l0.4-0.4l0.5-0.4l0.5-0.4
1257
+ l0.5-0.4l0.5-0.3l0.5-0.3l0.5-0.3l0.5-0.3l0.5-0.3l0.5-0.3l0.5-0.2l0.5-0.2l0.5-0.2l0.5-0.2l0.6-0.2l0.7-0.2l0.8-0.2l0.8-0.2
1258
+ l0.8-0.1l0.9-0.1l0.8-0.1h0.8h0.9l0.9,0.1h0.4l0.1-0.2l0.4-0.6l0.4-0.6l0.5-0.6l0.5-0.5l0.5-0.5l0.5-0.5l0.5-0.4l0.5-0.4l0.5-0.4
1259
+ l0.5-0.3l0.5-0.3l0.5-0.3l0.5-0.3l0.5-0.2l0.4-0.2l0.4-0.2l0.4-0.2l0.5-0.2l0.8-0.3l0.8-0.3l0.8-0.2l0.7-0.2l0.7-0.2l0.7-0.1
1260
+ l0.7-0.1l0.6-0.1l0.6-0.1l0.6-0.1l0.7-0.1l0.5-0.5l0.5-0.5l0.5-0.4l0.5-0.4l0.5-0.3l0.5-0.3l0.5-0.3l0.4-0.3l0.5-0.3l0.8-0.4
1261
+ l0.8-0.4l0.8-0.3l0.8-0.3l0.7-0.2l0.7-0.2l0.7-0.2l0.7-0.1l0.7-0.1l0.7-0.1l0.7-0.1l0.7-0.1l0.6-0.1l0.7-0.1l0.6-0.1h0.6h0.6h0.6
1262
+ h0.6h0.7h1.2h1.2h1.2h1.2h1.1l1.1,0.1l1.1,0.1l1,0.1l1.9,0.1l1.7,0.1l1.3,0.1h0.5h0.3h0.1l3-0.1l3.2-0.1l3.2-0.1l3.2-0.1l3.2-0.1
1263
+ l3.2-0.1l3.6-0.2l0.6-0.5l1.2-0.8l1.3-0.6l1.3-0.4l0,0l1.1-0.2l1.2-0.1h1.2h0.1l0.8,0.1l0.8,0.1l0.5,0.1l0.8,0.2l0.6,0.2l0.7,0.2
1264
+ l0.5,0.2l0.4,0.2l0.4,0.2h0.1h0.3h0.7h0.8h0.9h1h0.6h0.5h0.6h0.6h0.6h0.6h0.6h0.6h0.6l0.6-0.1l0.6-0.1l0.6-0.1l0.6-0.1l0.6-0.1
1265
+ l0.6-0.1l0.6-0.1l1.2-0.2l1.2-0.2l1.3-0.2l2.7-0.5l1.4-0.2l1.5-0.2l1.5-0.2l0.8-0.1l0.8-0.1l2.5-0.3l2.5-0.3l2.5-0.3l2.5-0.3
1266
+ l2.4-0.2l1.2-0.1l1.2-0.1l1.2-0.1l1.2-0.1l1.2-0.1l1.2-0.1l1.2-0.1l1.2-0.1l1.2-0.1l1.2-0.1l1.2-0.1l1.2-0.1l1.2-0.1l1.2-0.1
1267
+ l1.2-0.1h1.2h1.2h1.2h1.2h1.2h1.2h1.2h1.2h1.2h1.2h1.2h1.2h1.2h1.2h1.2h1.2h1.2h1.2h1.2l1.2,0.1l1.2,0.1l1.2,0.1l1.2,0.1l1.2,0.1
1268
+ l1.2,0.1l1.2,0.1l1.2,0.1l1.2,0.1l1.2,0.1l1.2,0.1l1.2,0.1l1.2,0.1l1.2,0.1l1.2,0.1l1.2,0.1l1.2,0.1l1.2,0.2l1.2,0.2l1.3,0.2
1269
+ l0.7,0.1l0.7,0.1l0.7,0.1l0.7,0.1l0.7,0.1l0.7,0.1l0.7,0.1l0.7,0.1l1.3,0.3l1.3,0.3l1.3,0.3l1.3,0.3l1.2,0.3l1.2,0.3l2.4,0.6h0.1
1270
+ h0.7l1.2-0.1l1.2-0.1h1.2h1.2h0.3l0.7-0.6l1.1-0.7l1.2-0.6l1.2-0.5l1.3-0.3l1.3-0.2l0,0h1.2l1.2,0.1l1.2,0.2l0,0l1.1,0.3l1,0.4
1271
+ l0.4,0.2l0.9,0.4l0.6,0.3l0.6,0.3l0.6,0.3l0.6,0.3l0.7,0.3l0.7,0.3l0.7,0.3l0.7,0.3l0.7,0.3l0.7,0.3l0.7,0.3l0.7,0.3l0.7,0.3
1272
+ l0.8,0.3h0.6h0.4h0.4h0.4h0.3h0.2l0.3-0.2l0.8-0.5l0.5-0.3l0.5-0.3l0.6-0.3l0.6-0.3l0.6-0.4l0.7-0.4l0.8-0.4l0.8-0.3l0.5-0.2
1273
+ l0.5-0.2l0.5-0.2l0.5-0.2l0.6-0.2l0.6-0.1l0.7-0.1l0.7-0.1l0.8-0.1h0.9h0.9l0.9,0.1l1,0.1l1.1,0.2l1,0.3l0.5,0.2l1,0.5l0.1,0.1
1274
+ l0.9,0.5l0.5,0.4l0.5,0.4l0.8,0.7l0.4,0.4l0.8,0.8l0.7,0.9l0.6,0.9l0.5,0.9l0.4,0.8l0.3,0.9l0.3,0.9l0.2,1l0.1,0.5l0.1,1.1v0.6
1275
+ v0.6l-0.1,0.8l0.3,0.3l0.5,0.4l0.5,0.5l0.4,0.5l0.5,0.5l0.4,0.6l0.4,0.6l0.4,0.6l0.4,0.7l0.3,0.7l0.3,0.6l0.3,0.7l0.1,0.3
1276
+ l0.9,0.5l0.1,0.1l1,0.7l0.1,0.1l0.9,0.8l0.1,0.1l0.9,1l0.1,0.1l0.7,1l0.1,0.1l0.6,1l0.1,0.1l0.5,1l0.3,0.6l0.3,1.1l0.2,1l0.1,1
1277
+ l0.1,0.9v0.8v0.8l-0.1,0.7l-0.1,0.7l-0.1,0.6l-0.1,0.6l-0.1,0.6l-0.1,0.5l-0.1,0.5l-0.2,0.5l-0.2,0.5l-0.2,0.5l-0.2,0.5l-0.3,0.8
1278
+ l-0.3,0.8l-0.4,0.8l-0.3,0.7l-0.4,0.7l-0.3,0.7l-0.3,0.6l-0.3,0.6l-0.3,0.6l-0.6,1l-0.6,0.9l-0.5,0.7l-0.3,0.5l-0.1,0.1v0.1
1279
+ l-0.3,0.5l-0.3,0.6l-0.3,0.6l-0.3,0.5l-0.3,0.5l-0.3,0.5l-0.3,0.5l-0.4,0.5l-0.7,1l-0.7,1l-0.7,1l-0.7,1l-0.7,0.9l-0.2,0.4
1280
+ l-0.4,0.8l-0.4,0.8l-0.4,0.8l-0.4,0.8l-0.4,0.8l-0.4,0.8l-0.4,0.7l-0.4,0.7l-0.4,0.7l-0.4,0.7l-0.4,0.7l-0.5,0.7l-0.5,0.7
1281
+ l-0.5,0.7l-0.5,0.7l-0.5,0.7l-0.5,0.7l-0.5,0.7l-0.5,0.7l-0.5,0.7l-0.5,0.7l-0.5,0.7l-0.5,0.7l-0.5,0.7l-0.5,0.7l-0.5,0.7
1282
+ l-0.5,0.7l-0.4,0.5l0,0l0,0l-0.1,0.1l-0.1,0.1l-0.3,0.5l-0.4,0.6l-0.5,0.7l-0.5,0.8l-0.6,0.9l-0.3,0.5l-0.4,0.5l-0.4,0.5
1283
+ l-0.4,0.5l-0.5,0.6l-0.5,0.6l-0.6,0.6l-0.4,0.4l-0.4,0.4l-0.4,0.3v1.2l-0.1,1.4l-0.3,1.4l-0.4,1.3l-0.2,0.5l-0.5,1.1l-0.3,0.7
1284
+ l-0.3,0.8l-0.3,0.8l-0.2,0.5l-0.2,0.5l-0.4,0.7l-0.4,0.7l-0.4,0.7l-0.4,0.6l-0.4,0.6l-0.4,0.6l-0.4,0.6l-0.4,0.5l-0.4,0.5
1285
+ l-0.4,0.5l-0.5,0.5l-0.5,0.5l-0.5,0.5l-0.5,0.5l-0.5,0.5l-0.5,0.5l-0.5,0.5l-0.5,0.5l-0.5,0.5l-0.5,0.5l-0.5,0.4l-0.5,0.5
1286
+ l-0.9,0.8l-0.5,0.4l-0.5,0.4l-0.5,0.4l-0.5,0.4l-0.5,0.4l-0.5,0.4l-0.4,0.3v0.4l-0.1,0.8l-0.1,0.8l-0.1,0.9l-0.2,0.9l-0.2,0.9
1287
+ l-0.2,0.8l-0.2,0.5l-0.1,0.5l-0.2,0.5l-0.2,0.5l-0.2,0.5l-0.2,0.5l-0.2,0.5l-0.3,0.5l-0.3,0.5l-0.2,0.4l-0.1,0.2l0,0l-0.2,0.4
1288
+ l-0.3,0.5l-0.3,0.6l-0.7,1.4l-0.4,0.8l-0.4,0.8l-0.4,0.8l-0.3,0.5l-0.3,0.5l-0.3,0.5l-0.4,0.6l-0.5,0.7l-0.7,0.8l-0.6,0.6
1289
+ l-0.3,0.3l-0.8,0.7l0,0l-0.6,0.4l-0.2,0.5l-1,2.3l-1,2.3l-2,4.6l-3.2,7.4l-3.2,7.4l-3.2,7.4l-3.2,7.4l-3.2,7.5l-3.2,7.4l-3.2,7.5
1290
+ l-3.2,7.5l-3.1,7.5l-3.1,7.5l-3.1,7.5l-3.1,7.5l-6.3,15l-6.3,15l-2.4,5.7l-2.4,5.7l-2.4,5.7l-1.2,2.9l-1.2,2.9l-1.2,2.9l-1.2,2.9
1291
+ l-1.1,2.9l-1.1,2.9l-1.1,2.8l-1.1,2.9l-1.1,2.9l-1.1,2.9l-0.5,1.3l-0.5,1.2l-0.4,1.1l-0.4,1l-0.4,0.9l-0.3,0.8l-0.6,1.4l-0.6,1.4
1292
+ l-0.7,1.5l-0.4,0.9l-0.4,1l-0.5,1.1l-0.5,1.3l-0.2,0.6l-0.2,0.6l-0.3,0.7l-0.3,0.7l-0.4,0.8l-0.4,0.8l-0.3,0.5l-0.3,0.5l-0.3,0.5
1293
+ l-0.3,0.5l-0.3,0.5l-0.4,0.6l-0.4,0.6l-0.5,0.6l-0.6,0.7l-0.7,0.7l-0.5,0.5l-0.5,0.4l-0.6,0.4l-0.7,0.5l-0.8,0.5l-1,0.5l-0.6,0.2
1294
+ l-1.1,0.4h-0.1l-1.2,0.3h-0.1l-0.7,0.1h-0.4l-0.1,0.4l-0.3,0.9l-0.2,0.5l-0.2,0.5l-0.2,0.6l-0.2,0.6l-0.3,0.7l-0.4,0.8l-0.5,0.8
1295
+ l-0.4,0.6l-0.5,0.6l-0.6,0.7l-0.3,0.4l-0.8,0.8h-0.1l-1,0.8h-0.1l-0.7,0.4l-0.7,0.4h-0.1l-0.9,0.4l-0.4,0.1l-0.8,2l-0.8,2.1
1296
+ l-0.8,2.1l-0.8,2.1l-0.8,2.1l-0.8,2.1l-0.7,2.1l-0.7,2.1l-0.7,2.1l-0.7,2.1l-0.3,1l-0.3,0.8l0,0v0.2v0.2l-0.1,0.6l-0.2,1.6
1297
+ l-0.1,0.9l-0.1,0.5l-0.1,0.5l-0.1,0.6l-0.1,0.6l-0.1,0.6l-0.2,0.7l-0.2,0.8l-0.3,0.8l-0.2,0.6l-0.3,0.6l-0.3,0.6l-0.4,0.7
1298
+ l-0.5,0.8l-0.6,0.8l-0.4,0.4l-0.9,0.9l-0.1,0.1l-1.1,0.8h-0.1l-0.7,0.4l-0.7,0.4h-0.1l-0.8,0.3l-0.6,0.2v0.1l-0.1,0.9v0.1v0.3
1299
+ v0.8v1l-0.1,2.6v1.5l-0.1,1.5v0.8v0.8v0.8l-0.1,0.8l-0.1,0.8l-0.1,0.8l-0.1,0.8l-0.1,0.8l-0.1,0.8l-0.1,0.8l-0.1,0.5l-0.1,0.5
1300
+ l-0.1,0.5l-0.1,0.5l-0.2,0.5l-0.2,0.6l-0.3,0.6l-0.3,0.7l-0.4,0.8l-0.5,0.9l-0.4,0.5l-0.7,0.9l-0.1,0.1l-0.8,0.8l-0.9,0.7l0,0
1301
+ l-0.9,0.6l-1,0.5l-1,0.4l0,0l-1.1,0.4l-1.1,0.2l-1.1,0.1h-1.1l0,0l-1.3-0.1l-1.3-0.2l-1.2-0.4l0,0l-1.2-0.5l-1.1-0.6l-1.1-0.8
1302
+ l0,0l-0.8-0.7l-0.7-0.8l-0.6-0.8l0,0l-0.5-0.7l-0.4-0.7l-0.3-0.5l-0.3-0.8l-0.2-0.6l-0.2-0.5l-0.2-0.7l-0.2-0.7l-0.1-0.6
1303
+ l-0.1-0.6l-0.1-0.6l-0.1-0.7l-0.2-1.3l-0.2-1.4l-0.2-1.4l-0.2-1.4l-0.2-1.4l-0.4-2.5l-0.2-1.6l-0.1-0.3l-0.2-0.6l-0.2-0.6
1304
+ l-0.2-0.6l-0.1-0.6l-0.1-0.6l-0.1-0.6l-0.1-0.6l-0.1-0.6l-0.2-1.1l-0.2-1.1l-0.2-1.1l-0.2-1.1l-0.2-1.1l-0.1-1.1l-0.1-1.1
1305
+ l-0.1-1.1l-0.1-1.1l-0.1-1.1l-0.1-1.1l-0.1-1.1l-0.1-1.1l-0.1-2l-0.3-3.9l-0.1-1.9l-0.1-0.9l-0.1-0.9l-0.1-0.9l-0.1-0.8l-0.1-0.8
1306
+ l-0.1-0.8l-0.4-2.8l-0.4-2.8l-0.4-2.8l-0.4-2.8l-0.4-2.8l-0.4-2.8l-0.4-2.9l-0.4-2.8l-0.4-2.9l-0.4-2.8l-0.9-5.7l-0.9-5.7
1307
+ l-0.9-5.7l-1.8-11.5l-0.9-5.8l-0.9-5.8l-0.4-2.9l-0.4-2.9l-0.4-2.9l-0.4-2.9l-0.4-2.9l-0.4-2.9l-0.4-2.9l-0.4-2.9l-0.3-2.3
1308
+ l-0.3-2.2l-0.6-4.5l-0.3-2.2l-0.2-1.3l-0.2-0.4l-0.3-1.3l-0.2-1.3l-0.6-3.2l-0.7-3.9l-0.3-1.9l-0.3-1.6l-0.2-0.8l-0.2-0.8
1309
+ l-0.2-0.9l-0.2-0.9l-0.2-1l-0.2-1.1l-0.2-1.1l-0.1-0.6l-0.1-0.6l-0.2-1.1l-0.2-1.1l-0.1-1l-0.1-1l-0.1-0.9l-0.1-0.9l-0.1-0.8
1310
+ v-0.1l-0.3-1.1l-0.1-0.2l-0.1-0.3l-0.3-1l-0.8-2.2l-0.3-1.1l-0.2-0.6l-0.2-0.7l-0.2-0.7l-0.1-0.4l-0.1-1.2v-1.2l0,0l0.1-1.4
1311
+ l0.3-1.3l0.4-1.3l0.6-1.2L-204.2,1379.2z M-182.3,1308.4l0.3,1.6h0.1l0,0v-0.1l0.2-0.6l0.1-0.4l-0.1-0.2l-0.7-0.9L-182.3,1308.4z
1312
+ "
1313
+ />
1314
+ </g>
1315
+ <g transform="matrix(0.380231,0.924892,-0.924892,0.380231,1549.4,-185.872)">
1316
+ <path
1317
+ fill="#836F40"
1318
+ d="M-165.2,1548.9l0.5-0.9l0.3-0.5l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1
1319
+ l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1
1320
+ l0.1-0.1l0.1-0.1l0.1-0.1l0.4-0.3l0.8-0.6l0.5-0.3l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1h0.1l0.1-0.1l0.1-0.1
1321
+ l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1h0.1h0.1h0.1h0.1h0.1h0.1h0.1h0.1h0.1h0.1h0.1h0.1h0.1h0.1h0.1h0.1h0.1h0.1h0.1h0.1h0.2
1322
+ h0.2h0.2h0.2h0.2h0.2h0.2h0.2h0.2h0.1h0.2h0.2h0.2h0.2h0.2h0.2h0.2h0.1h0.1h0.1h0.1h0.1h0.1h0.1h0.2h0.2h0.1h0.2h0.1h0.1h0.1
1323
+ l0.2,0.1h0.1h0.1h0.1h0.1h0.1h0.1h0.1l0.5,0.2l0.9,0.4l0.4,0.2l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1
1324
+ l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1
1325
+ l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1
1326
+ l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1
1327
+ l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1v0.1v0.2v0.1v0.1v0.2v0.1v0.2v0.1v0.2v0.2v0.2v0.2v0.2v0.2v0.2v0.2v0.2v0.2v0.2v0.2v0.2v0.2v0.2
1328
+ v0.2v0.2v0.2v0.2v0.2v0.2v0.2v0.2v0.2v0.2v0.2v0.2v0.2v0.2v0.2v0.2v0.2v0.2v0.2v0.1v0.2v0.1v0.2v0.1v0.1v0.1l-0.1,0.1l-0.1,0.1
1329
+ l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1
1330
+ l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1v0.1v0.2v0.2v0.2v0.2v0.2v0.2v0.1v0.2v0.2v0.1v0.1v0.2v0.1v0.1l-0.1,0.1l-0.1,0.1
1331
+ l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1
1332
+ l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1
1333
+ l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1
1334
+ l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1
1335
+ l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1
1336
+ l-0.1,0.1l-0.1,0.1h-0.1h-0.1h-0.1h-0.1h-0.2h-0.1h-0.2h-0.2h-0.1h-0.2h-0.2h-0.2h-0.2h-0.2h-0.2h-0.2h-0.2h-0.2h-0.2h-0.2h-0.2
1337
+ h-0.2h-0.2h-0.2h-0.2h-0.2h-0.2h-0.2h-0.2h-0.2h-0.2h-0.2h-0.2h-0.2h-0.2h-0.2h-0.2h-0.2h-0.2h-0.2h-0.2h-0.2h-0.1h-0.2h-0.2
1338
+ h-0.1h-0.1h-0.2h-0.1l-0.1-0.1h-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1
1339
+ l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1
1340
+ l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1
1341
+ l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1
1342
+ l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1
1343
+ l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1v-0.1v-0.1v-0.1v-0.1v-0.2v-0.1v-0.2v-0.2v-0.1v-0.2v-0.2v-0.2v-0.2v-0.2
1344
+ v-0.2v-0.2v-0.2v-0.2v-0.2v-0.2v-0.2v-0.2v-0.2v-0.2v-0.2v-0.2v-0.5v-0.6v-0.7l0.1-0.7l0.1-0.8l0.1-0.8l0.1-0.5l0.1-0.5l0.1-0.5
1345
+ l0.1-0.5l0.1-0.5l0.2-0.6l0.2-0.6l0.3-0.7L-165.2,1548.9z M-158.6,1564.1L-158.6,1564.1L-158.6,1564.1L-158.6,1564.1l-0.2-0.1
1346
+ l-0.1-0.1L-158.6,1564.1z"
1347
+ />
1348
+ </g>
1349
+ <g transform="matrix(0.380231,0.924892,-0.924892,0.380231,1549.4,-185.872)">
1350
+ <path
1351
+ fill="#836F40"
1352
+ d="M-49.4,1288.3l0.6-1.3l0.6-1.3l0.6-1.2l0.3-0.6l0.3-0.6l0.3-0.6l0.3-0.6l0.3-0.6l0.3-0.6l0.3-0.6l0.3-0.6
1353
+ l0.3-0.6l0.4-0.6l0.4-0.6l0.4-0.6l0.4-0.6l0.5-0.6l0.2-0.2l0.4-0.6l0.5-0.8l0.5-1l0.6-1l0.3-0.6l0.3-0.6l0.4-0.6l0.4-0.6l0.4-0.6
1354
+ l0.4-0.6l0.5-0.6l0.5-0.7l0.5-0.6l0.3-0.4l0.3-0.4l0.4-0.4l0.4-0.4l0.4-0.4l0.5-0.4l0.5-0.4l0.6-0.4l0.7-0.5l0.8-0.5l1-0.4
1355
+ l0.6-0.2l1.1-0.3h0.1l0.6-0.1l0.6-0.1h0.1l0.7-0.1h0.7h0.1h0.8l0.8,0.1h0.1l0.8,0.1l0.8,0.2h0.1l0.8,0.2l0.8,0.3h0.1l0.7,0.3
1356
+ l0.7,0.4l0.1,0.1l0.6,0.4l0.6,0.4l0.1,0.1l0.6,0.5l0.5,0.5l0.1,0.1l0.5,0.5l0.5,0.6l0.1,0.1l0.4,0.5l0.4,0.6l0.1,0.1l0.3,0.5
1357
+ l0.3,0.6l0.1,0.1l0.4,1l0.2,0.6l0.3,1.1l0.2,1l0.1,0.9l0.1,0.8v0.8v0.7v0.7l-0.1,0.6l-0.1,0.6l-0.1,0.5l-0.1,0.5l-0.1,0.5
1358
+ l-0.1,0.5l-0.1,0.5l-0.1,0.5l-0.2,0.8l-0.3,0.8l-0.3,0.8l-0.3,0.7l-0.3,0.7l-0.3,0.7l-0.3,0.6l-0.3,0.6l-0.3,0.6l-0.3,0.6
1359
+ l-0.3,0.5l-0.5,0.9l-0.4,0.8l-0.3,0.6l-0.1,0.2l-0.3,0.5l-0.4,0.9l-0.9,1.6l-0.9,1.6l-0.8,1.6l-1.7,3.1l-0.8,1.5l-0.8,1.5
1360
+ l-0.7,1.4l-0.7,1.4l-1.4,2.8l-1.4,2.9l-1.5,2.9l-0.7,1.5l-0.8,1.5l-0.8,1.5l-0.8,1.5l-0.8,1.5l-0.8,1.5l-0.8,1.5l-0.8,1.5
1361
+ l-0.9,1.5l-0.4,0.8l-0.4,0.8l-0.4,0.8l-0.5,0.8l-0.5,0.8l-0.3,0.5l-0.1,0.2l-0.4,0.8l-0.3,0.7l-0.1,0.3l-0.1,0.6l-0.2,0.6
1362
+ l-0.2,0.6l-0.2,0.5l-0.2,0.5l-0.2,0.5l-0.2,0.4l-0.2,0.5l-0.4,0.7l-0.4,0.7l-0.4,0.7l-0.4,0.7l-0.4,0.6l0,0l-0.6,1.6l-0.8,2.1
1363
+ l-0.8,2.1l-0.8,2.1l-0.8,2.1l-0.8,2.1l-0.8,2.1l-0.8,2.1l-0.8,2.1l-0.9,2l-0.9,2l-0.9,2l-0.7,1.7v0.1l-0.1,0.3l-0.1,0.5l-0.2,0.6
1364
+ l-0.2,0.7l-0.1,0.5l-0.2,0.5l-0.2,0.5l-0.2,0.6l-0.3,0.6l-0.3,0.7l-0.4,0.7l-0.5,0.8l-0.6,0.8l-0.7,0.9l-0.7,0.8l-0.6,0.5
1365
+ l-0.5,0.4l-0.5,0.4l-0.6,0.4l-0.7,0.4l-0.7,0.3l-0.7,0.3l0,0l-0.2,0.8l-0.2,0.8l-0.2,0.8l-0.2,0.7l-0.2,0.7l-0.2,0.7l-0.3,0.7
1366
+ l-0.3,0.7l-0.3,0.6l-0.3,0.6l-0.3,0.6l-0.5,1.1l-0.4,1l-0.4,0.9l-0.3,0.7l-0.3,0.7l-0.6,1.3l-0.7,1.4l-0.7,1.4l-0.8,1.5l-0.7,1.4
1367
+ l0,0l-0.1,0.7l-0.1,0.7l-0.1,0.6l-0.1,0.6l-0.1,0.5l-0.2,0.5l-0.2,0.5l-0.3,0.8l-0.3,0.8l-0.3,0.7l-0.3,0.7l-0.3,0.7l-0.3,0.6
1368
+ l-0.3,0.6l-0.3,0.6l-0.3,0.6l-0.3,0.6l-0.6,1.1l-1.1,1.8l-0.4,0.7l-0.1,0.2l-0.1,0.3l-1.1,2.1l-1.2,2.1l-1.2,2.1l-1.2,2.1
1369
+ l-1.2,2.1l-1.2,2.1l-1.3,2.1l-1.3,2.1l-1.3,2.1l-1.3,2.1l-1.3,2.1l-1.3,2.1l-0.1,0.2l-0.5,1.1l-0.8,1.5l-0.7,1.5l-0.7,1.5
1370
+ l-0.7,1.5l-0.7,1.5l-0.7,1.5l-0.7,1.5l-0.7,1.5l-0.7,1.5l-0.7,1.5l-0.7,1.5l-0.7,1.5l-0.1,0.1v0.1v0.4l-0.1,0.7l-0.1,0.8
1371
+ l-0.2,1.2l-0.3,1.2l-0.4,1.1l-0.5,1l-0.6,2.4l-0.6,2.5l-0.6,2.5l-0.3,1.3l-0.3,1.3l-0.3,1.3l-0.4,1.3l-0.4,1.3l-0.4,1.3l-0.4,1.3
1372
+ l-0.4,1.3l-0.4,1.3l-0.2,0.7l-0.2,0.7l-0.2,0.7l-0.2,0.7l-0.2,0.7l-0.3,0.7l-0.3,0.7l-0.3,0.7l0,0v0.1v0.7v0.6v0.6l-0.1,0.6
1373
+ l-0.1,0.5l-0.1,0.5l-0.1,0.5l-0.1,0.5l-0.1,0.5l-0.2,0.8l-0.2,0.8l-0.3,0.8l-0.3,0.7l-0.3,0.7l-0.3,0.7l-0.3,0.6l-0.3,0.6
1374
+ l-0.3,0.6l-0.3,0.6l-0.3,0.6l-0.3,0.6l-0.3,0.5l-0.3,0.5l-0.6,1l-0.6,1l-0.5,0.9l-0.9,1.5l-0.4,0.6l-0.3,0.5l-0.7,1.2l-0.7,1.1
1375
+ l-0.6,1l-0.6,0.9l-0.5,0.7l-0.3,0.8l-0.5,1.1l-0.5,1.1l-0.5,1.1l-0.5,1.1l-0.5,1.1l-0.5,1.1l-0.5,1.1l-0.5,1l-0.5,1l-0.5,1
1376
+ l-0.5,1l-0.6,1l-0.5,1l-0.6,1l-0.6,1l-0.6,1l-0.6,1l-0.6,1l-0.6,1l-0.6,1l-1.2,1.9l-1.2,1.9l-2.3,3.7l-0.2,0.4l-0.3,0.5l-0.8,1.4
1377
+ l-0.5,0.8l-0.5,0.9l-0.4,1l-0.4,1l-0.4,1l-0.4,1l-0.4,1l-0.4,1l-0.3,1l-0.1,0.5l-0.1,0.5l-0.1,0.5l-0.1,0.5l-0.1,0.5l-0.1,0.4
1378
+ l-0.1,0.4l-0.1,0.4l-0.1,0.4l-0.1,0.4l-0.1,0.4l-0.1,0.4l-0.1,0.3l-0.1,0.3v0.3v0.3v0.3v0.2v0.2v0.2v0.2v0.1v0.1l0,0v0.1l0.2,1.2
1379
+ l0.1,1.2v1.2l-0.2,1.2l-0.3,1.2l-0.4,1.1l-0.5,1.1l-0.6,1l-0.7,1l-0.8,0.9l-0.9,0.8l-1,0.7l-1,0.6l-1.1,0.5l-1.1,0.4l-1.2,0.3
1380
+ l-1.2,0.1h-1.2l-1.2-0.1l-1.2-0.2l-1.1-0.3l-1.1-0.5l-1.1-0.6l-1-0.7l-0.9-0.8l-0.8-0.9l-0.7-0.9l-0.6-1l-0.5-1.1l-0.4-1.1
1381
+ l-0.3-1.2l-0.1-0.6l-0.1-0.9l-0.1-0.9l-0.1-0.8l-0.1-0.8v-0.8v-0.8v-0.8v-0.8l0.1-0.7l0.1-0.7l0.1-0.7l0.1-0.7l0.1-0.7l0.1-0.7
1382
+ l0.1-0.7l0.1-0.7l0.1-0.7l0.2-0.7l-0.1-0.2l-0.4-1l-0.3-1l-0.2-1l-0.1-1.1l0,0v-1l0.1-1l0.2-1l0.2-1l0,0l0.3-0.8l0.3-0.8l0,0
1383
+ l0.3-0.6l0.4-0.6l0.3-0.5l0.5-0.7l0.4-0.5l0.3-0.4l0.5-0.6l0.4-0.5l0.2-0.2l2.2-3l0.1-0.1l0.3-0.7l0.3-0.8l0.3-0.8l0.7-1.8
1384
+ l0.7-1.8l0.6-1.5l0.6-1.6l1.5-3.9l1.5-3.9l3-7.7l3-7.7l1.5-3.8l1.5-3.8l1-2.6l1-2.6l1.1-2.6l1.1-2.6l1.1-2.6l1.1-2.6l1.1-2.6
1385
+ l1.1-2.6l1.1-2.6l1.1-2.6l1.1-2.6l1.1-2.6l1.1-2.6l1.2-2.6l1.2-2.6l1.2-2.6l1.2-2.6l1.2-2.6l0.2-0.4v-0.2l0.1-0.5l0.1-0.5
1386
+ l0.1-0.5l0.1-0.5l0.2-0.6l0.3-0.8l0.4-0.8l0.4-0.8l0.4-0.7l0.4-0.7l0.4-0.6l0.4-0.6l0.3-0.4l0.1-0.3l0.3-0.8l0.3-0.8l0.3-0.8
1387
+ l0.3-0.8l0.4-1.3h-0.1l-1-0.1h-0.1l-0.8-0.2l-0.8-0.2l-0.8-0.3h-0.1l-0.9-0.4l-0.9-0.5l-0.8-0.5l0,0l-0.8-0.6l-0.7-0.7l-0.7-0.8
1388
+ l0,0l-0.5-0.7l-0.5-0.8l-0.4-0.8v-0.1l-0.4-1l-0.3-1.1v-0.1l-0.2-0.9l-0.1-0.9v-0.1l-0.1-0.7v-0.7v-0.1l0.1-1.1v-0.5l0.1-0.8
1389
+ l0.2-0.7l0.2-0.7l0.3-0.9l0.3-0.8l0.3-0.7l0.3-0.6l0.3-0.6l0.3-0.5l0.3-0.5l0.3-0.5l0.3-0.5l0.5-0.9l0.5-0.9l0.5-0.8l0.9-1.5
1390
+ l0.3-0.5l0.2-0.4l0.6-1.1l0.6-1.1l0.6-1l0.5-0.9l0.5-0.8l0.5-0.7l0.8-1.2l0.7-1.1l0.3-0.5l0.4-0.6l0.4-0.7l0.5-0.8l0.6-1l0.6-1.1
1391
+ l1-1.9l1-1.9l1-1.9l1-1.9l1-1.9l1-1.9l1-1.9l1-1.9l1-1.9l0.9-1.9l0.9-2l0.9-2l0.9-2l0.9-2l0.7-1.5l0.5-1.3l0.5-1.3l0.5-1.3
1392
+ l0.5-1.2l0.9-2.3l0.4-1.1l0.4-1l0.4-0.9l0.3-0.9l0.3-0.8l0.1-0.3l0.1-0.4v-0.1l0.5-1.1l0.6-1.1l0.7-1l0.8-0.9l0.9-0.9l0.9-0.8
1393
+ l1-0.7l1.1-0.6l1.1-0.4l1.2-0.3l1.2-0.2l1.2-0.1l1.2,0.1l1.2,0.2l1.2,0.3l1.1,0.4l0.6,0.3l0.7-1.4l1.4-2.7l1.4-2.7l1.3-2.7
1394
+ l1.3-2.7l1.3-2.7l0.6-1.3l0.7-1.4l0.3-0.7l0.4-0.7l0.4-0.6l0.5-0.8l0.4-0.5l0.7-0.8l0.8-0.7l0,0l0.7-0.6l0.2-0.1l0.5-1.1l0.6-1.2
1395
+ l0.3-0.6l0.3-0.6l0.3-0.6l0.3-0.6l0.6-1.1l0.6-1.1l1.2-1.9l0.5-0.9l0.4-0.8l0,0l0.1-0.1l0.1-0.3l0.2-0.4l0.2-0.5l0.3-0.6l0.3-0.7
1396
+ l0.4-0.7l0.3-0.5l0.3-0.4l0.3-0.5l0.4-0.5l0.5-0.6l0.6-0.7l0.4-0.4l0.8-0.8l0.1-0.1l0.9-0.7l0.4-0.3l0.8-0.5l0.5-0.2l0.6-0.3l0,0
1397
+ l0.8-2.2l1.1-2.8l0.5-1.4l0.5-1.4l0.5-1.4l0.6-1.4l0.6-1.4l0.6-1.4L-49.4,1288.3z"
1398
+ />
1399
+ </g>
1400
+ <g transform="matrix(0.380231,0.924892,-0.924892,0.380231,1549.4,-185.872)">
1401
+ <path
1402
+ fill="#836F40"
1403
+ d="M-235.9,1180.2l0.5-0.9l0.5-0.8l0.6-0.8l0.7-0.7l0.7-0.7l0.8-0.6l0.8-0.5l0.9-0.5l0.9-0.4l0.9-0.3l1-0.2
1404
+ l1-0.2l1-0.1h0.1h0.5h0.3h0.1l0,0l0.4-0.3l0.4-0.2l0.5-0.3l0.5-0.2l0.5-0.2l0.6-0.2l0.6-0.2l0.6-0.2l0.7-0.2l0.7-0.2l0.7-0.1
1405
+ l0.7-0.1l0.7-0.1h0.7h0.7l0.7,0.1l0.7,0.1l0.7,0.1l0.7,0.1l0.6,0.2l0.6,0.2l0.6,0.2l0.8,0.4l0.8,0.4l0.4,0.2l1.1-0.1l1.2-0.1
1406
+ l1.2-0.1l1.2-0.1l1.2-0.1l2.5-0.2l2.5-0.2l2.5-0.3l2.5-0.3l2.6-0.3l2.6-0.3l2.6-0.3l2.6-0.3l2.6-0.3l2.6-0.3l2.6-0.3l5.2-0.7
1407
+ l5.2-0.7l5.2-0.7l2.6-0.3l2.6-0.3l2.6-0.3l2.6-0.3l2.6-0.3l2.6-0.3l2-0.2l2-0.2l2-0.2l2-0.2l2-0.2l2-0.2l2-0.2l2-0.1l2-0.1l2-0.1
1408
+ l2-0.1l2-0.1l2-0.1l2-0.1l2-0.1l2-0.1l2-0.1l2-0.1l1.9-0.1l2-0.1l1.9-0.1l2-0.1h1.9h2h1.9h2l3.9-0.1h3.9h3.9h3.9h3.9h3.9h3.9h3.8
1409
+ h3.8l7.7,0.1l7.7,0.1l7.6,0.1h3.8h3.8h3.8h3.8h1l1,0.1l1,0.2l0.9,0.3l0.9,0.4l0.9,0.4l0.8,0.5l0.8,0.6l0.7,0.6l0.7,0.7l0.6,0.8
1410
+ l0.6,0.8l0.5,0.8l0.4,0.9l0.4-0.2l0.6-0.2l0.7-0.3l0.8-0.3l0.5-0.2l0.5-0.1l0.5-0.1l0.5-0.2l0.6-0.1l0.6-0.1l0.6-0.1l0.7-0.1
1411
+ l0.8-0.1l0.8-0.1h0.9h1l0.7,0.1l0.6,0.1l0.7,0.1l0.7,0.2l0.8,0.2l0.8,0.3l0.9,0.4l0.9,0.5l0.5,0.3l0.4,0.3l0.4,0.3l0.1,0.1
1412
+ l0.4,0.3l0.4,0.4l0.1,0.1l0.4,0.4l0.4,0.4l0.1,0.1l0.4,0.5l0.4,0.5l0.1,0.1l0.3,0.5l0.3,0.5v0.1l0.3,0.5l0.3,0.5v0.1l0.2,0.5
1413
+ l0.2,0.5l0.2,0.6l0.3,1.1l0.2,1.1l0.1,1v0.8v0.8v0.7l-0.1,0.7l-0.1,0.7l-0.1,0.8l-0.2,0.7l-0.2,0.7L14,1187l-0.3,0.7l-0.3,0.7
1414
+ l-0.3,0.7l-0.3,0.7l-0.4,0.7l-0.4,0.7l-0.4,0.6l-0.4,0.6l-0.5,0.6l-0.5,0.6l-0.5,0.5l-0.5,0.5l-0.5,0.5l-0.5,0.4l-0.5,0.4
1415
+ l-0.5,0.4l-0.5,0.4l-0.5,0.3l-0.5,0.3l-0.5,0.3l-0.5,0.3l-0.5,0.3l-0.5,0.2l-0.5,0.2l-0.5,0.2l-0.5,0.2l-0.5,0.2l-0.5,0.2
1416
+ l-0.5,0.1l-0.5,0.1l-0.5,0.1l-0.5,0.1l-0.5,0.1l-0.5,0.1l-0.5,0.1l-0.5,0.1l-0.5,0.1l-0.5,0.1l-0.9,0.1l-1,0.1l-1,0.1h-1h-0.9
1417
+ h-0.9h-0.9h-0.9h-0.9h-0.9l-0.9-0.1l-0.9-0.1l-0.9,0.3l-1,0.3l-1,0.3l-1,0.3l-1,0.3l-1,0.3l-1,0.3l-1,0.3l-1,0.2l-1,0.2l-0.9,0.2
1418
+ l-0.9,0.2l-1.7,0.4l-1.6,0.3l-1.4,0.3l-1.1,0.2l-1.1,0.2l-0.7,0.1l-0.8,0.1l-0.6,0.1h-0.6h-0.6h-0.6l-1.3,0.1l-1.5,0.1l-1.6,0.1
1419
+ h-1.6H-45h-1.6h-1.5h-2.7h-0.3l-1.1,0.2l-1.4,0.3l-1.4,0.2l-1.4,0.2l-1.4,0.2l-0.9,0.1l-0.1,0.1h-0.1l-0.7,0.3l-0.7,0.3l-0.4,0.2
1420
+ l-0.8,0.3l-0.7,0.2l-0.6,0.1l-0.5,0.1l-0.5,0.1l-0.8,0.1l-0.8,0.1l-0.8,0.1h-0.9h-0.6h-0.6h-0.6h-0.6h-1h-1h-0.9h-0.8h-0.7h-0.3
1421
+ h-0.3h-1l-1,0.1l-1,0.1l-1,0.1l-2.2,0.2l-2.2,0.2l-0.8,0.1l-0.8,0.1l-0.8,0.1l-0.9,0.1l-1.9,0.2l-1.9,0.2l-1,0.1l-1,0.1l-1,0.1
1422
+ l-1.1,0.1l-1.1,0.1h-1.1h-1.1h-1.2h-0.8h-0.5l-0.8-0.1l-0.8-0.2l-0.8-0.2l0,0l-0.6-0.2h-1.1h-1.4l-1.4-0.1l-1.4-0.1l-1.4-0.1
1423
+ l-1.4-0.1l-1.4-0.1l-1.4-0.1l-1.4-0.2l-0.7-0.1l-0.8-0.1l-0.9-0.1l-0.9-0.2l-0.9-0.2l-0.9-0.2l-0.9-0.2l-0.9-0.2l-0.9-0.2
1424
+ l-0.9-0.2l-0.9-0.2l-0.8-0.3l-0.8-0.3l-0.8-0.3l-0.8-0.3l-0.8-0.3l-0.8-0.3l-0.8-0.3l-0.8-0.3l-0.8-0.3l-0.7-0.3l-0.7-0.3
1425
+ l-0.7-0.3l-0.7-0.3l-0.6-0.3l-0.9,0.1l-1.4,0.2l-1.4,0.2l-1.4,0.2l-1.4,0.2l-1.4,0.2l-1.4,0.2l-1.4,0.1l-1.4,0.1l-1.4,0.1
1426
+ l-1.4,0.1l-1.4,0.1l-1.4,0.1l-1.4,0.1l-1.4,0.1l-1.4,0.1l-1.4,0.1h-1.4h-1.4h-1.4h-1.4h-1.4h-1.4h-1.4h-1.4h-1.4h-1.4h-1.3
1427
+ l-1.5-0.1l-0.7-0.1l-0.8-0.1l-0.7-0.1l-0.7-0.1l-0.6-0.2l-0.6-0.2l-0.6-0.2l-0.5-0.2l-0.5-0.2l-0.5-0.2l-0.5-0.2l-0.5-0.2
1428
+ l-0.4-0.2l-0.5-0.2l-0.2-0.1h-0.7l-1.4-0.1l-1.4-0.1l-1.4-0.1l-1.4-0.1l-1.4-0.2l-1.3-0.2l-1.4-0.2l-1.3-0.2l-1.3-0.2l-1.3-0.2
1429
+ l-1.3-0.3l-1.3-0.3l-1.3-0.3l-1.3-0.3l-1.3-0.3l-1.3-0.3l-1.3-0.3l-1.3-0.4l-1.2-0.4l-1.2-0.4l-1.2-0.4l-0.4-0.1h-0.1l-1.3,0.1
1430
+ l-1.3,0.1h-1.3h-1.3h-1.3h-1.3h-1.3h-1.3h-0.4h-1l-1-0.1l-1-0.2l-0.9-0.3l-0.9-0.4l-0.9-0.4l-0.9-0.5l-0.8-0.6l-0.8-0.7l-0.7-0.7
1431
+ l-0.6-0.8l-0.6-0.8l-0.5-0.9l-0.4-0.9l-0.3-0.9l-0.3-1l-0.2-1l-0.1-1v-1l0.1-1l0.1-1l0.2-1l0.3-0.9L-235.9,1180.2z"
1432
+ />
1433
+ </g>
1434
+ <g transform="matrix(0.380231,0.924892,-0.924892,0.380231,1549.4,-185.872)">
1435
+ <path
1436
+ d="M-214.1,1345.5L-214.1,1345.5l0.2-0.3l0.1-0.1l0.2-0.3l0.3-0.4l0.2-0.2l0.2-0.3l0.2-0.3l0.3-0.3l0.3-0.3
1437
+ l0.3-0.3l0.3-0.3l0.3-0.3l0.2-0.1l0.2-0.1l0.2-0.1l0.2-0.1l0.4-0.2l0.4-0.2l0.4-0.2l0.5-0.3l0.5-0.3l0.5-0.3l0.5-0.3l0.5-0.3
1438
+ l0.5-0.3l0.5-0.3l0.5-0.3l0.4-0.3l0.4-0.3l0.4-0.3l0.4-0.3l0.4-0.3l1.3-1.1l1.4-1.1l2.8-2.3l1.4-1.2l1.4-1.2l1.4-1.2l0.7-0.6
1439
+ l0.7-0.6l0.7-0.6l0.7-0.6l0.8-0.6l0.7-0.6l0.8-0.6l0.8-0.6l0.8-0.6l0.8-0.5l0.8-0.5l0.8-0.5l0.8-0.5l0.8-0.5l0.8-0.5l0.8-0.5
1440
+ l0.8-0.5l0.8-0.4l0.9-0.5l0.9-0.5l0.9-0.5l0.9-0.5l0.9-0.6l0.9-0.6l0.9-0.6l0.8-0.6l0.8-0.6l0.8-0.6l0.8-0.6l0.8-0.6l0.8-0.6
1441
+ l0.8-0.6l0.8-0.6l0.8-0.6l0.8-0.6l0.8-0.7l0.8-0.7l0.8-0.7l0.8-0.7l0.8-0.7l0.8-0.7l0.8-0.7l0.8-0.7l0.8-0.7l1.5-1.4l1.5-1.4
1442
+ l1.5-1.4l1.5-1.4l1.5-1.4l3-2.9l3-2.9l1.5-1.5l1.5-1.5l1.5-1.4l1.6-1.4l0.8-0.7l0.8-0.7l0.8-0.7l0.8-0.7l0.8-0.7l0.8-0.7l0.8-0.7
1443
+ l0.8-0.7l0.8-0.7l0.8-0.7l0.8-0.7l0.8-0.7l0.3-0.2l0.4-0.3l0.9-0.7l2.4-1.8l1.4-1.1l1.5-1.1l0.8-0.6l0.8-0.6l0.8-0.6l0.8-0.6
1444
+ l0.8-0.6l0.8-0.6l0.7-0.6l0.7-0.6l0.7-0.6l0.6-0.6l0.6-0.5l0.5-0.5l0.2-0.2l0.2-0.2l0.2-0.2l0.2-0.2l0.2-0.2l0.2-0.2l0.1-0.2
1445
+ l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.3l0.1-0.3l0.2-0.3l0.2-0.3l0.2-0.3l0.3-0.2l0.3-0.2l0.3-0.2l0.4-0.1l0.4-0.1h0.4h0.4l0.4,0.1
1446
+ l0.4,0.1l0.3,0.2l0.3,0.2l0.3,0.2l0.3,0.3l0.2,0.3l0.2,0.3l0.1,0.3l0.1,0.4l0.1,0.4v0.4v0.2v0.3v0.3l-0.1,0.3l-0.1,0.4l-0.2,0.4
1447
+ l-0.2,0.3l-0.2,0.3l-0.2,0.3l-0.2,0.3l-0.2,0.3l-0.2,0.3l-0.2,0.3l-0.3,0.3l-0.3,0.3l-0.3,0.3l-0.3,0.3l-0.3,0.3l-0.6,0.6
1448
+ l-0.7,0.6l-0.7,0.6l-0.7,0.6l-0.8,0.6l-0.8,0.6l-0.8,0.6l-0.8,0.6l-0.8,0.6l-0.8,0.6l-0.8,0.6l-0.8,0.6l-1.5,1.2l-1.4,1.1
1449
+ l-2.4,1.8l-0.9,0.7l-0.3,0.3l-0.3,0.2l-0.8,0.6l-0.8,0.7l-0.8,0.7l-0.8,0.7l-0.8,0.7l-0.8,0.7l-0.8,0.7l-0.8,0.7l-0.8,0.7
1450
+ l-0.8,0.7l-0.8,0.7l-0.8,0.7l-1.5,1.4l-1.5,1.4l-1.5,1.4l-1.5,1.4l-3,2.9l-3,2.9l-1.5,1.5l-1.5,1.5l-1.5,1.4l-1.5,1.4l-1.6,1.4
1451
+ l-0.8,0.7l-0.8,0.7l-0.8,0.7l-0.8,0.7l-0.8,0.7l-0.8,0.7l-0.8,0.7l-0.8,0.7l-0.8,0.7l-0.8,0.7l-0.8,0.7l-0.8,0.7l-0.8,0.7
1452
+ l-0.9,0.7l-0.9,0.6l-0.9,0.6l-0.9,0.6l-0.9,0.6l-0.9,0.6l-0.9,0.6l-0.9,0.6l-0.9,0.6l-0.9,0.6l-0.9,0.6l-0.9,0.6l-0.9,0.5
1453
+ l-0.7,0.4l-0.7,0.4l-0.7,0.4l-0.7,0.5l-0.7,0.5l-0.7,0.5l-0.7,0.5l-0.7,0.5l-0.7,0.5l-0.7,0.5l-0.7,0.5l-0.7,0.5l-0.7,0.5
1454
+ l-0.7,0.6l-0.7,0.6l-0.7,0.6l-0.7,0.6l-0.7,0.6l-1.4,1.2l-1.4,1.2l-1.4,1.2l-2.8,2.3l-1.4,1.1l-1.4,1.1l-0.4,0.4l-0.5,0.4
1455
+ l-0.5,0.4l-0.5,0.4l-0.5,0.4l-0.5,0.4l-0.5,0.4l-0.5,0.4l-0.5,0.3l-0.5,0.3l-0.5,0.3l-0.5,0.3l-0.5,0.3l-0.5,0.3l-0.5,0.3
1456
+ l-0.4,0.2l0,0l0,0l0,0l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.2,0.2l-0.2,0.2l-0.1,0.2l-0.1,0.2l-0.1,0.1l-0.2,0.3l-0.1,0.1l0,0l-0.2,0.3
1457
+ l-0.3,0.3l0,0l-0.3,0.2l-0.3,0.2l-0.3,0.1l-0.3,0.1l-0.3,0.1h-0.4h-0.4l-0.3-0.1l-0.3-0.1l-0.3-0.1l-0.3-0.2l-0.3-0.2l-0.3-0.3
1458
+ l-0.2-0.3l-0.2-0.3l-0.1-0.3l-0.1-0.3l-0.1-0.4v-0.4v-0.4l0.1-0.3l0.1-0.3L-214.1,1345.5z M-112,1262.3L-112,1262.3L-112,1262.3
1459
+ L-112,1262.3L-112,1262.3z M-209,1348.5L-209,1348.5L-209,1348.5L-209,1348.5L-209,1348.5z"
1460
+ />
1461
+ </g>
1462
+ <g transform="matrix(0.380231,0.924892,-0.924892,0.380231,1549.4,-185.872)">
1463
+ <path
1464
+ d="M-199.4,1433l0.2-0.3l0.2-0.3l0.2-0.3l0.3-0.3l0.3-0.3l0.3-0.3l0.3-0.4l0.3-0.4l0.7-0.8l0.7-0.8l0.8-0.8
1465
+ l0.8-0.8l0.8-0.8l1.5-1.5l2.3-2.3l1-1l1-1l1-1l1-1l1-1l1-1l2-1.9l2-1.9l2-1.9l2-1.9l2-1.9l2-1.9l2-1.9l2-1.9l2-1.9l2-1.9l1-1l1-1
1466
+ l1-1l1-1l1-1l1-1l1.7-1.7l1.7-1.7l1.7-1.7l1.7-1.7l1.7-1.7l1.7-1.7l1.7-1.6l1.7-1.6l1.7-1.6l1.7-1.6l1.8-1.6l1.8-1.6l1.8-1.6
1467
+ l1.8-1.6l1.8-1.6l1.8-1.6l1.8-1.6l1.8-1.6l3.6-3.2l3.6-3.2l3.6-3.2l3.6-3.2l3.6-3.2l7.2-6.3l7.2-6.3l3.6-3.2l3.6-3.2l3.6-3.2
1468
+ l3.6-3.2l3.5-3.2l1.8-1.6l1.8-1.6l1.8-1.6l1.8-1.6l1.7-1.6l1.8-1.6l1.7-1.6l1.7-1.6l1.7-1.6l1.7-1.6l1.7-1.6l1.7-1.6l1.7-1.6
1469
+ l1.7-1.6l1.7-1.7l1.7-1.7l1.7-1.7l1.7-1.7l0.9-0.9l0.9-0.9l0.9-0.9l0.9-0.9l1-0.9l1-0.9l1-0.8l1-0.8l1-0.8l1-0.8l1-0.8l1-0.8
1470
+ l2-1.6l2-1.6l1.9-1.6l1.9-1.6l1-0.8l1-0.8l0.9-0.8l0.9-0.8l0.9-0.8l0.9-0.8l0.9-0.8l0.9-0.8l0.9-0.8l0.9-0.8l0.9-0.8l0.8-0.8
1471
+ l0.4-0.4l0.5-0.5l1.3-1.4l0.7-0.8l0.8-0.8l0.8-0.9l0.4-0.4l0.4-0.4l0.4-0.4l0.4-0.4l0.4-0.4l0.4-0.4l0.4-0.4l0.4-0.4l0.4-0.4
1472
+ l0.4-0.3l0.4-0.3l0.4-0.3l0.2-0.2l0.2-0.1l0.2-0.1l0.2-0.1l0.2-0.1l0.3-0.1l0.3-0.1l0.3-0.1l0.3-0.1l0.3-0.1h0.2h0.3h0.1h0.5
1473
+ l0.5,0.1l0.5,0.2l0.4,0.3l0.4,0.3l0.3,0.4l0.2,0.5l0.2,0.5l0.1,0.5v0.5l-0.1,0.5l-0.2,0.5l-0.3,0.4l-0.3,0.4l-0.4,0.3l-0.5,0.2
1474
+ l-0.5,0.2h-0.3l0,0h-0.1h-0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.3,0.2l-0.3,0.2l-0.3,0.3l-0.3,0.3l-0.4,0.3l-0.4,0.3l-0.4,0.4
1475
+ l-0.4,0.4l-0.4,0.4l-0.4,0.4l-0.4,0.4l-0.4,0.4l-0.8,0.8l-0.8,0.8l-0.7,0.8l-1.3,1.4l-0.5,0.6l-0.5,0.5l-0.9,0.9l-0.9,0.9
1476
+ l-0.9,0.9l-0.9,0.9l-0.9,0.9l-0.9,0.8l-1,0.8l-1,0.8l-1,0.8l-1,0.8l-1,0.8l-1,0.8l-1.9,1.6l-2,1.6l-1.9,1.6l-1.9,1.6l-1,0.8
1477
+ l-1,0.8l-0.9,0.8l-0.9,0.8l-0.9,0.8l-0.9,0.8l-0.9,0.8l-0.9,0.8l-0.9,0.8l-0.9,0.8l-0.9,0.9l-0.9,0.9l-1.7,1.7l-1.7,1.7l-1.7,1.7
1478
+ l-1.7,1.7l-1.7,1.7l-1.7,1.7l-1.7,1.7l-1.7,1.6l-1.7,1.6l-1.7,1.6l-1.7,1.6l-1.8,1.6l-1.8,1.6l-1.8,1.6l-1.8,1.6l-1.8,1.6
1479
+ l-1.8,1.6l-1.8,1.6l-3.6,3.2l-3.6,3.2l-3.6,3.2l-3.6,3.2l-3.6,3.2l-7.2,6.3l-7.2,6.3l-3.6,3.2l-3.6,3.2l-3.6,3.2l-3.6,3.2
1480
+ l-3.5,3.2l-1.8,1.6l-1.8,1.6l-1.8,1.6l-1.8,1.6l-1.8,1.6l-1.7,1.6l-1.7,1.6l-1.7,1.6l-1.7,1.6l-1.7,1.6l-1.7,1.6l-1.7,1.6
1481
+ l-1.7,1.6l-1.7,1.6l-1.7,1.7l-1.7,1.7l-1.7,1.7l-1.7,1.7l-1,1l-1,1l-1,1l-1,1l-1,1l-1,1l-2,1.9l-2,1.9l-2,1.9l-2,1.9l-2,1.9
1482
+ l-2,1.9l-2,1.9l-2,1.9l-2,1.9l-2,1.9l-1,1l-1,1l-1,1l-1,1l-1,1l-1,1l-2.3,2.3l-1.5,1.5l-0.8,0.8l-0.8,0.8l-0.7,0.8l-0.7,0.7
1483
+ l-0.6,0.7l-0.3,0.3l-0.3,0.3l-0.2,0.3l-0.2,0.2l-0.2,0.2l-0.1,0.1l0,0l-0.2,0.4l-0.3,0.4l-0.4,0.4l-0.4,0.3l-0.5,0.2l-0.5,0.1
1484
+ l-0.5,0.1h-0.5l-0.5-0.1l-0.5-0.2l-0.4-0.3l-0.4-0.4l-0.3-0.4l-0.2-0.5l-0.1-0.5v-0.5v-0.5v-0.1l0.1-0.4v-0.1l0.1-0.3l0.1-0.2
1485
+ L-199.4,1433z M-1.4,1257.3L-1.4,1257.3L-1.4,1257.3L-1.4,1257.3L-1.4,1257.3z M-194.1,1435.5L-194.1,1435.5l0.1-0.3v-0.1
1486
+ L-194.1,1435.5z"
1487
+ />
1488
+ </g>
1489
+ <g transform="matrix(0.380231,0.924892,-0.924892,0.380231,1549.4,-185.872)">
1490
+ <path
1491
+ d="M-186.5,1518.6l0.2-0.4l0.2-0.5l0.3-0.5l0.3-0.6l0.4-0.6l0.4-0.6l0.4-0.7l0.4-0.6l0.4-0.6l0.2-0.3l0.2-0.3
1492
+ l0.2-0.3l0.2-0.3l0.2-0.3l0.2-0.2l0.3-0.3l0.2-0.3l0.2-0.3l0.2-0.3l0.2-0.3l0.2-0.3l0.2-0.3l0.2-0.3l0.2-0.3l0.2-0.3l0.2-0.4
1493
+ l0.2-0.4l0.4-0.8l0.4-0.8l0.4-0.8l0.4-0.8l0.4-0.8l0.2-0.4l0.2-0.4l0.2-0.4l0.3-0.4l0.3-0.4l0.3-0.4l0.3-0.4l0.3-0.4l0.3-0.4
1494
+ l0.3-0.4l0.9-1.1l0.9-1.1l0.9-1.1l0.9-1.1l0.9-1.1l0.9-1.1l0.9-1.1l0.9-1.1l0.9-1.1l0.9-1.1l1.7-2.2l1.7-2.3l1.7-2.3l1.7-2.3
1495
+ l1.7-2.3l1.7-2.3l1.7-2.3l3.3-4.6l3.3-4.6l0.9-1.3l1-1.3l1-1.3l1-1.3l1-1.3l1-1.3l1-1.3l1-1.3l1-1.3l1-1.3l1-1.3l1-1.3l1-1.3
1496
+ l1-1.3l2-2.5l2-2.5l2-2.5l2.1-2.5l2.1-2.5l2.1-2.5l2.1-2.5l2.1-2.4l2.1-2.4l2.1-2.4l2.1-2.4l2.1-2.4l2.2-2.4l2.2-2.4l2.2-2.4
1497
+ l2.2-2.4l2.2-2.3l2.2-2.3l2.2-2.3l2.2-2.3l2.2-2.3l2.2-2.3l2.2-2.3l2.2-2.3l2.2-2.3l0.3-0.3l0.3-0.3l0.6-0.7l0.7-0.7l0.7-0.8
1498
+ l0.7-0.8l0.7-0.8l0.7-0.9l0.7-0.9l1.5-1.8l1.6-1.9l1.6-1.9l0.8-1l0.8-1l0.8-1l0.8-1l0.8-0.9l0.8-0.9l0.8-0.9l0.4-0.4l0.4-0.4
1499
+ l0.4-0.4l0.4-0.4l0.4-0.4l0.4-0.4l0.4-0.4l0.4-0.4l0.4-0.4l0.4-0.4l0.4-0.4l0.4-0.4l0.4-0.4l0.4-0.3l0.4-0.3l0.4-0.3l0.4-0.3
1500
+ l0.4-0.3l0.4-0.3l0.4-0.3l0.4-0.3l0.4-0.2l0.4-0.2l0.4-0.1h0.5h0.5l0.4,0.1l0.4,0.2l0.4,0.2l0.4,0.3l0.3,0.3l0.2,0.4l0.2,0.4
1501
+ l0.1,0.4v0.5v0.5l-0.1,0.4l-0.2,0.4l-0.2,0.4l-0.3,0.4l-0.4,0.3l-0.4,0.2l-0.3,0.2l-0.3,0.2l-0.3,0.2l-0.3,0.2l-0.3,0.2l-0.3,0.2
1502
+ l-0.3,0.2l-0.3,0.3l-0.4,0.3l-0.4,0.3l-0.4,0.3l-0.4,0.3l-0.4,0.3l-0.4,0.3l-0.4,0.3l-0.4,0.4l-0.4,0.4l-0.4,0.4l-0.4,0.4
1503
+ l-0.4,0.4l-0.4,0.4l-0.4,0.4l-0.8,0.9l-0.8,0.9l-0.8,0.9l-0.8,0.9l-0.8,0.9l-0.8,0.9l-0.8,1l-1.6,1.9l-1.6,1.9l-1.5,1.9l-0.8,0.9
1504
+ l-0.7,0.9l-0.7,0.9l-0.7,0.8l-0.7,0.8l-0.7,0.8l-0.7,0.7l-0.3,0.4l-0.3,0.3l-2.2,2.2l-2.2,2.3l-2.2,2.3l-2.2,2.3l-2.2,2.3
1505
+ l-2.2,2.3l-2.2,2.3l-2.2,2.3l-2.2,2.3l-2.2,2.3l-2.2,2.4l-2.2,2.4l-2.1,2.4l-2.1,2.4l-2.1,2.4l-2.1,2.4l-2.1,2.4l-2.1,2.4
1506
+ l-2.1,2.4l-2.1,2.4l-2,2.5l-2,2.5l-2,2.5l-2,2.5l-2,2.5l-1,1.2l-1,1.3l-1,1.3l-1,1.3l-1,1.3l-1,1.3l-1,1.3l-1,1.3l-1,1.3l-1,1.3
1507
+ l-0.9,1.3l-0.9,1.3l-0.9,1.3l-0.9,1.3l-3.3,4.6l-3.3,4.6l-1.7,2.3l-1.7,2.3l-1.7,2.3l-1.7,2.3l-1.7,2.3l-1.7,2.3l-1.7,2.3
1508
+ l-0.9,1.1l-0.9,1.1l-0.9,1.1l-0.9,1.1l-0.9,1.1l-0.9,1.1l-0.9,1.1l-0.9,1.1l-0.9,1.1l-0.9,1.1l-0.2,0.3l-0.2,0.3l-0.2,0.3
1509
+ l-0.2,0.3l-0.2,0.3l-0.2,0.3l-0.2,0.3l-0.2,0.4l-0.2,0.4l-0.2,0.4l-0.4,0.8l-0.4,0.8l-0.4,0.8l-0.4,0.8l-0.4,0.8l-0.2,0.4
1510
+ l-0.2,0.4l-0.3,0.4l-0.3,0.4l-0.3,0.4l-0.3,0.4l-0.3,0.4l-0.3,0.4l-0.3,0.4l-0.3,0.4l-0.4,0.4l-0.3,0.4l-0.1,0.1l-0.1,0.1
1511
+ l-0.1,0.2l-0.1,0.2l-0.2,0.2l-0.2,0.2l-0.4,0.5l-0.4,0.5l-0.4,0.6l-0.3,0.6l-0.3,0.5l-0.3,0.5l-0.1,0.2l-0.1,0.2l-0.2,0.4
1512
+ l-0.2,0.4l-0.1,0.2l-0.2,0.2l-0.1,0.1l-0.2,0.2l-0.2,0.2l0,0l-0.3,0.2l-0.4,0.2l-0.4,0.1l-0.4,0.1h-0.4l0,0h-0.5l-0.5-0.1
1513
+ l-0.4-0.2l-0.4-0.3l-0.4-0.3l-0.3-0.4l-0.2-0.4l-0.2-0.4l0,0l-0.1-0.4v-0.4v-0.4l0.1-0.4l0,0l0.1-0.4l0.1-0.1L-186.5,1518.6z"
1514
+ />
1515
+ </g>
1516
+ <g transform="matrix(0.380231,0.924892,-0.924892,0.380231,1549.4,-185.872)">
1517
+ <path
1518
+ d="M-226.1,1292.2l0.1-0.2l0.1-0.2l0.1-0.2l0.2-0.2l0.2-0.2l0.2-0.1l0.2-0.1l0.9-0.6l0.9-0.6l1-0.7l1.1-0.7
1519
+ l1.1-0.8l1.2-0.8l1.2-0.9l1.3-0.9l2.7-1.9l2.8-2l2.9-2.1l1.5-1.1l1.5-1.1l1.5-1.1l1.5-1.1l1.6-1.1l1.6-1.1l1.6-1.1l1.6-1l1.6-1
1520
+ l1.6-1l1.5-1l1.5-1l0.8-0.5l0.8-0.5l0.8-0.4l0.8-0.4l0.7-0.4l0.7-0.4l0.7-0.4l0.7-0.4l0.7-0.4l0.7-0.4l0.7-0.4l0.7-0.3l0.2-0.1
1521
+ l0.2-0.1l0.2-0.1h0.2h0.2h0.2h0.2h0.2h0.2l0.2,0.1l0.2,0.1l0.2,0.1l0.2,0.1l0.2,0.1l0.2,0.1l0.2,0.1l0.2,0.2l0.1,0.2l0.1,0.2
1522
+ l0.1,0.2l0.1,0.2l0.1,0.2l0.1,0.2l0.1,0.2v0.2v0.2v0.2v0.2v0.2l-0.1,0.2l-0.1,0.2l-0.1,0.2l-0.1,0.2l-0.1,0.2l-0.1,0.2l-0.1,0.2
1523
+ l-0.2,0.2l-0.2,0.2l-0.2,0.1l-0.2,0.1l-0.2,0.1l-0.7,0.3l-0.7,0.3l-0.7,0.4l-0.7,0.4l-0.7,0.4l-0.7,0.4l-0.7,0.4l-0.7,0.4
1524
+ l-0.7,0.4l-0.7,0.4l-0.7,0.4l-0.7,0.4l-1.5,0.9l-1.5,1l-1.5,1l-1.5,1l-1.5,1l-1.5,1l-1.5,1.1l-1.5,1.1l-1.5,1.1l-1.5,1.1
1525
+ l-1.5,1.1l-1.5,1.1l-2.9,2.1l-2.8,2l-2.7,1.9l-1.3,0.9l-1.2,0.9l-1.2,0.8l-1.1,0.8l-1.1,0.7l-1,0.7l-1,0.6l-0.9,0.6l-0.2,0.1
1526
+ l-0.2,0.1l-0.2,0.1l-0.2,0.1h-0.2h-0.2h-0.2h-0.2h-0.2h-0.2l-0.2-0.1l-0.2-0.1l-0.2-0.1l-0.2-0.1l-0.2-0.1l-0.2-0.1l-0.2-0.1
1527
+ l-0.2-0.2l-0.1-0.2l-0.1-0.2l-0.1-0.2l-0.1-0.2l-0.1-0.2l-0.1-0.2l-0.1-0.2v-0.2v-0.2v-0.2v-0.2v-0.2v-0.2l0.1-0.2l0.1-0.2
1528
+ L-226.1,1292.2z"
1529
+ />
1530
+ </g>
1531
+ <g transform="matrix(0.380231,0.924892,-0.924892,0.380231,1549.4,-185.872)">
1532
+ <path
1533
+ d="M-223.1,1301.8l0.2-0.4l0.3-0.3l0.3-0.3l0.4-0.2l0.4-0.2l0.4-0.1h0.4h0.4l0.4,0.1l0.4,0.1l0.5,0.1l0.5,0.1
1534
+ l0.5,0.2l0.5,0.2l0.5,0.2l0.5,0.2l0.5,0.2l0.5,0.2l0.5,0.2l0.5,0.2l0.5,0.2l0.5,0.2l0.5,0.2l0.5,0.2l0.5,0.3l1,0.5l1,0.6l1,0.6
1535
+ l1,0.6l1,0.6l1,0.6l1,0.6l1,0.6l1,0.7l1,0.7l1,0.7l1,0.7l2,1.3l1.9,1.3l1.8,1.2l1.7,1.1l0.8,0.5l0.8,0.5l0.8,0.5l0.7,0.4l1.9,1.1
1536
+ l1.9,1.1l1.8,1.1l1.8,1.1l1.8,1.1l1.8,1.1l1.8,1.1l1.8,1.1l1.7,1.1l1.7,1.1l1.7,1.1l1.7,1.1l1.7,1.1l1.7,1.1l1.7,1.1l1.7,1.1
1537
+ l1.7,1.2l1.7,1.2l1.7,1.2l1.7,1.2l1.7,1.2l1.6,1.2l1.7,1.2l1.6,1.2l1.7,1.3l1.7,1.3l1.7,1.3l1.7,1.3l1.7,1.3l1.7,1.4l1.7,1.4
1538
+ l1.7,1.4l0.6,0.5l0.6,0.5l0.6,0.5l0.6,0.5l0.6,0.5l0.6,0.5l0.6,0.5l0.6,0.5l0.6,0.5l0.7,0.5l0.7,0.4l0.7,0.4l0.7,0.4l0.7,0.4
1539
+ l0.7,0.4l0.7,0.4l0.7,0.4l0.7,0.4l1.4,0.8l1.4,0.8l1.4,0.8l1.4,0.8l1.4,0.8l1.4,0.8l1.4,0.8l2.8,1.6l2.8,1.5l2.8,1.6l1.4,0.8
1540
+ l1.4,0.8l1.4,0.8l1.4,0.8l1.4,0.8l1.4,0.8l1.4,0.8l0.7,0.4l0.7,0.4l0.7,0.4l0.7,0.4l0.7,0.4l0.7,0.4l0.8,0.5l0.7,0.5l0.7,0.5
1541
+ l0.7,0.5l0.7,0.5l0.7,0.5l0.7,0.5l0.7,0.5l1.3,1l1.2,1l1.2,1l1.2,1l1.2,0.9l0.6,0.5l0.6,0.4l0.6,0.4l0.6,0.4l0.6,0.4l0.6,0.4
1542
+ l0.6,0.4l0.6,0.4l0.6,0.4l0.6,0.4l0.7,0.4l0.7,0.4l0.7,0.4l0.7,0.4l0.4,0.2l0.3,0.3l0.3,0.3l0.2,0.4l0.2,0.4l0.1,0.4l0.1,0.4v0.4
1543
+ l-0.1,0.4l-0.1,0.4l-0.2,0.4l-0.3,0.4l-0.3,0.3l-0.4,0.3l-0.4,0.2l-0.4,0.1l-0.4,0.1h-0.4h-0.4l-0.4-0.1l-0.4-0.2l-0.8-0.4
1544
+ l-0.8-0.4l-0.8-0.4l-0.7-0.4l-0.7-0.4l-0.7-0.4l-0.7-0.4l-0.7-0.5l-0.7-0.5l-0.7-0.5l-0.7-0.5l-0.6-0.5l-0.6-0.5l-0.6-0.5l-1.2-1
1545
+ l-1.2-1l-1.2-1l-1.2-1l-1.2-1l-0.6-0.5l-0.6-0.5l-0.6-0.5l-0.7-0.5l-0.7-0.5l-0.7-0.5l-0.7-0.5l-0.7-0.5l-0.6-0.4l-0.6-0.4
1546
+ l-0.6-0.4l-0.6-0.4l-0.6-0.4l-0.7-0.4l-1.3-0.8l-1.3-0.8l-1.3-0.8l-1.4-0.8l-1.4-0.8l-1.4-0.8l-1.4-0.8l-2.8-1.5l-2.8-1.6
1547
+ l-2.9-1.6l-1.4-0.8l-1.4-0.8l-1.4-0.8l-1.4-0.8l-1.4-0.8l-1.4-0.9l-1.4-0.9l-0.7-0.4l-0.7-0.4l-0.7-0.4l-0.7-0.4l-0.7-0.5
1548
+ l-0.7-0.5l-0.7-0.5l-0.7-0.5l-0.7-0.5l-0.7-0.5l-0.7-0.5l-0.7-0.5l-0.7-0.5l-0.7-0.5l-0.7-0.5l-0.7-0.5l-0.7-0.5l-0.6-0.5
1549
+ l-1.7-1.4l-1.7-1.4l-1.6-1.3l-1.6-1.3l-1.6-1.3l-1.6-1.3l-1.6-1.3l-1.6-1.2l-1.6-1.2l-1.6-1.2l-1.6-1.2l-1.6-1.2l-1.6-1.2
1550
+ l-1.6-1.2l-1.6-1.1l-1.6-1.1l-1.6-1.1l-1.6-1.1l-1.7-1.1l-1.7-1.1l-1.7-1.1l-1.7-1.1l-1.7-1.1l-1.7-1.1l-1.7-1.1l-1.7-1.1
1551
+ l-1.8-1.1l-1.8-1.1l-1.8-1.1l-1.8-1.1l-1.8-1.1l-1.9-1.1l-0.8-0.5l-0.8-0.5l-0.8-0.5l-0.9-0.6l-1.8-1.2l-1.8-1.2l-1.9-1.3l-2-1.3
1552
+ l-1-0.6l-1-0.6l-1-0.6l-1-0.6l-1-0.6l-1-0.6l-1-0.6l-1-0.6l-1-0.6l-1-0.5l-0.9-0.5l-0.9-0.5l-0.4-0.2l-0.4-0.2l-0.4-0.2l-0.4-0.2
1553
+ l-0.4-0.2l-0.4-0.2l-0.4-0.2l-0.4-0.2l-0.4-0.2l-0.4-0.2l-0.4-0.1l-0.4-0.1l-0.4-0.1l-0.3-0.1l-0.3-0.1l-0.4-0.1l-0.4-0.1
1554
+ l-0.4-0.2l-0.4-0.3l-0.3-0.3l-0.3-0.4l-0.2-0.4l-0.1-0.4l-0.1-0.4v-0.4v-0.4l0.1-0.4L-223.1,1301.8z"
1555
+ />
1556
+ </g>
1557
+ <g transform="matrix(0.380231,0.924892,-0.924892,0.380231,1549.4,-185.872)">
1558
+ <path
1559
+ d="M-183.5,1261.5l0.2-0.3l0.3-0.3l0.3-0.3l0.4-0.2l0.4-0.2l0.4-0.1h0.1l0.2-0.1l0.3-0.1l0.4-0.1l0.3-0.1h0.2
1560
+ h0.3h0.1h0.3h0.1l0.4,0.1h0.1l0.2,0.1l0.2,0.1h0.1l0.3,0.1l0.5,0.3l0.6,0.3l0.6,0.3l0.6,0.3l0.6,0.3l0.6,0.4l0.6,0.4l0.6,0.4
1561
+ l0.6,0.4l0.6,0.4l0.6,0.4l0.6,0.4l0.6,0.4l0.6,0.4l0.5,0.4l0.5,0.4l1.3,1.1l1.3,1.1l1.3,1.1l1.3,1.1l2.6,2.3l2.6,2.2l1.3,1.1
1562
+ l1.3,1.1l1.3,1.1l1.3,1.1l1.3,1.1l0.6,0.5l0.7,0.5l0.7,0.5l0.7,0.5l0.7,0.5l0.7,0.5l2.2,1.6l2.2,1.6l2.2,1.6l2.2,1.6l2.2,1.7
1563
+ l2.2,1.7l4.3,3.3l4.3,3.3l4.3,3.3l4.3,3.4l4.3,3.3l4.3,3.3l4.3,3.3l2.2,1.7l2.2,1.6l2.2,1.6l2.2,1.6l2.2,1.6l2.2,1.6l2.2,1.6
1564
+ l2.2,1.6l2.2,1.6l2.2,1.6l2.2,1.6l2.2,1.6l0.3,0.2l0.4,0.3l0.7,0.6l0.8,0.6l0.8,0.6l0.8,0.7l0.8,0.7l1.7,1.5l1.8,1.5l0.9,0.8
1565
+ l1,0.8l1,0.8l1,0.8l1,0.8l1,0.8l1,0.8l0.5,0.4l0.5,0.4l0.5,0.4l0.5,0.3l0.5,0.3l0.5,0.3l0.5,0.3l0.5,0.3l0.5,0.3l0.5,0.3l0.5,0.3
1566
+ l0.5,0.3l0.5,0.3l0.5,0.2l0.4,0.2l0.4,0.2l0.4,0.2l0.4,0.2l0.4,0.2l0.4,0.2l0.4,0.1l0.4,0.1l0.4,0.1l0.4,0.1l0.4,0.1l0.4,0.1h0.2
1567
+ h0.2h0.2h0.2h0.1h0.1h0.1h0.2h0.4l0.4,0.1l0.4,0.2l0.4,0.2l0.3,0.3l0.3,0.3l0.2,0.3l0.2,0.4l0.1,0.4l0.1,0.4v0.4v0.4l-0.1,0.4
1568
+ l-0.2,0.4l-0.2,0.4l-0.3,0.3l-0.3,0.3l-0.3,0.2l-0.4,0.2l-0.4,0.1l-0.4,0.1H-50h-0.2h-0.3h-0.3h-0.3h-0.3h-0.3H-52h-0.3l-0.5-0.1
1569
+ l-0.6-0.1l-0.6-0.1l-0.5-0.2l-0.6-0.2l-0.5-0.2l-0.5-0.2l-0.5-0.2l-0.5-0.2l-0.5-0.3l-0.5-0.3l-0.5-0.3l-0.5-0.3l-0.5-0.3
1570
+ l-0.5-0.3l-0.5-0.3l-0.5-0.3l-0.5-0.3l-0.5-0.4l-0.5-0.4l-0.5-0.4l-0.5-0.4l-0.5-0.4l-0.5-0.4l-0.5-0.4l-0.5-0.4l-1.1-0.8l-1-0.8
1571
+ l-1-0.8l-1-0.8l-1-0.8l-1-0.8l-1-0.8l-1.8-1.6l-1.7-1.5l-0.8-0.7l-0.8-0.6l-0.7-0.6l-0.7-0.6l-0.7-0.5l-0.3-0.2l-0.3-0.2
1572
+ l-2.2-1.6l-2.2-1.6l-2.2-1.6l-2.2-1.6l-2.2-1.6l-2.2-1.6l-2.2-1.6l-2.2-1.6l-2.2-1.6l-2.2-1.6l-2.2-1.7l-2.2-1.7l-4.3-3.3
1573
+ l-4.3-3.3l-4.3-3.3l-4.3-3.4l-4.3-3.3l-4.3-3.3l-4.3-3.3l-2.1-1.6l-2.2-1.6l-2.1-1.6l-2.1-1.6l-2.2-1.6l-2.2-1.6l-0.7-0.5
1574
+ l-0.7-0.5l-0.7-0.5l-0.7-0.5l-0.7-0.5l-0.7-0.5l-1.3-1.1l-1.3-1.1l-1.3-1.1l-1.3-1.1l-1.3-1.1l-2.6-2.2l-2.6-2.2l-1.3-1.1
1575
+ l-1.3-1.1l-1.3-1.1l-1.3-1.1l-0.4-0.3l-0.4-0.3l-0.5-0.3l-0.5-0.3l-0.5-0.3l-0.5-0.4l-0.6-0.4l-0.6-0.3l-0.6-0.3l-0.6-0.3
1576
+ l-0.6-0.3l-0.6-0.3l-0.5-0.3l-0.4-0.2l-0.2,0.1l-0.3,0.1l0,0h-0.2h-0.2l0,0h-0.3h-0.3l0,0l-0.4-0.1l-0.4-0.1l-0.3-0.2l0,0
1577
+ l-0.3-0.2l-0.3-0.2l-0.2-0.3l-0.2-0.3l0,0l-0.2-0.4l-0.1-0.4l-0.1-0.4l0,0v-0.4v-0.4l0,0v-0.2v-0.2l0,0l0.1-0.4L-183.5,1261.5z
1578
+ M-178.1,1263.7v-0.2v-0.2V1263.7z M-178,1263.2v-0.2v-0.1V1263.2z"
1579
+ />
1580
+ </g>
1581
+ <g transform="matrix(0.380231,0.924892,-0.924892,0.380231,1549.4,-185.872)">
1582
+ <path
1583
+ d="M-82.3,1264.1l0.1-0.2l0.1-0.2l0.2-0.2l0.2-0.2l0.2-0.2l0.2-0.2l0.2-0.1l0.2-0.1l0.3-0.1l0.2-0.1l0.3-0.1
1584
+ l0.3-0.1h0.3h0.3h0.3h0.3l0.3,0.1l0.3,0.1l0.3,0.1l0.3,0.1l0.2,0.1l0.2,0.1l0.2,0.1l0.2,0.1l0.2,0.2l0.3,0.3l0.3,0.3l0.3,0.3
1585
+ l0.2,0.3l0.2,0.3l0.2,0.3l0.2,0.3l0.2,0.3l0.3,0.5l0.3,0.5l0.3,0.5l0.1,0.2l0.1,0.2l0.1,0.2l0.1,0.2l0.1,0.1l0.1,0.1l0.1,0.1
1586
+ l0.1,0.1l0,0l0,0l0.7,0.5l0.7,0.5l0.7,0.5l0.7,0.5l0.7,0.5l0.7,0.5l0.7,0.6l0.7,0.6l0.7,0.6l0.6,0.6l0.6,0.6l0.6,0.6l0.6,0.6
1587
+ l0.6,0.6l1.2,1.2l1.2,1.2l1.2,1.2l1.2,1.2l1.2,1.2l1.2,1.2l1.2,1.2l2.4,2.4l0.5,0.5l0.5,0.5l0.5,0.5l0.5,0.5l0.5,0.4l0.5,0.4
1588
+ l0.5,0.4l0.5,0.4l0.5,0.4l0.5,0.4l0.5,0.4l0.5,0.4l0.6,0.4l0.6,0.4l0.6,0.4l0.6,0.4l1.2,0.8l1.2,0.8l1.2,0.8l1.2,0.8l1.2,0.8
1589
+ l1.2,0.8l2.3,1.5l0.3,0.2l0.4,0.2l0.9,0.6l0.5,0.3l0.6,0.3l0.6,0.4l0.6,0.4l0.6,0.4l0.3,0.2l0.3,0.2l0.3,0.2l0.3,0.2l0.3,0.2
1590
+ l0.3,0.2l0.3,0.2l0.3,0.3l0.3,0.3l0.3,0.3l0.2,0.3l0.1,0.3l0.1,0.3l0.1,0.2l0.1,0.3v0.1v0.1v0.1v0.1v0.2v0.2v0.1v0.3v0.3v0.3
1591
+ l-0.1,0.3l-0.1,0.3l-0.1,0.2l-0.1,0.2l-0.2,0.2l-0.2,0.2l-0.2,0.2l-0.2,0.2l-0.2,0.1l-0.2,0.1l-0.2,0.1l-0.3,0.1l-0.3,0.1h-0.3
1592
+ h-0.3H-30h-0.3l-0.3-0.1l-0.3-0.1l-0.2-0.1l-0.2-0.1l-0.2-0.1l-0.2-0.2l-0.2-0.2l-0.2-0.2l-0.2-0.2l-0.1-0.2l-0.1-0.2l-0.1-0.1
1593
+ l0,0l-0.1-0.1l-0.2-0.1l-0.2-0.1l-0.2-0.1l-0.2-0.1l-0.2-0.2l-0.5-0.3l-0.5-0.3l-0.5-0.3l-0.5-0.3l-0.5-0.3l-1-0.6l-0.4-0.3
1594
+ l-0.4-0.2l-2.3-1.5l-1.2-0.8l-1.2-0.8l-1.2-0.8l-1.2-0.8l-1.2-0.8l-1.2-0.9l-0.6-0.4l-0.6-0.4l-0.6-0.4l-0.6-0.5l-0.6-0.5
1595
+ l-0.6-0.5l-0.6-0.5l-0.6-0.5l-0.6-0.5l-0.6-0.5l-0.6-0.5l-0.6-0.5l-0.5-0.5l-0.5-0.5l-0.5-0.5l-0.5-0.5l-2.4-2.4l-1.2-1.2
1596
+ l-1.2-1.2l-1.2-1.2l-1.2-1.2l-1.2-1.1l-1.2-1.1l-1.2-1.1l-0.6-0.5l-0.6-0.6l-0.6-0.6l-0.6-0.5l-0.6-0.5l-0.6-0.5l-0.6-0.5
1597
+ l-0.6-0.5l-0.6-0.5l-0.6-0.5l-0.6-0.5l-0.6-0.5l-0.6-0.5l-0.7-0.5l-0.2-0.1l-0.2-0.2l-0.3-0.3l-0.3-0.3l-0.3-0.3l-0.2-0.3
1598
+ l-0.2-0.3l-0.2-0.3l-0.2-0.3l-0.2-0.3l-0.2-0.3l-0.3-0.5l-0.3-0.5l-0.3-0.4l-0.1-0.2l-0.1-0.2l0,0h-0.1H-80h-0.3l-0.3-0.1
1599
+ l-0.2-0.1l-0.2-0.1l-0.2-0.1l-0.2-0.2l-0.2-0.2l-0.2-0.2l-0.2-0.2l-0.1-0.2l-0.1-0.2l-0.1-0.2l-0.1-0.3l-0.1-0.3v-0.3v-0.3v-0.3
1600
+ v-0.3l0.1-0.3l0.1-0.2L-82.3,1264.1z M-33,1307.9L-33,1307.9L-33,1307.9L-33,1307.9z"
1601
+ />
1602
+ </g>
1603
+ <g transform="matrix(0.380231,0.924892,-0.924892,0.380231,1549.4,-185.872)">
1604
+ <path
1605
+ d="M-214.8,1340L-214.8,1340l0.2-0.3l0.1-0.2l0,0l0.2-0.2l0,0l0.3-0.3l0,0l0.3-0.2l0,0l0.3-0.2l0,0l0.3-0.1l0,0
1606
+ l0.2-0.1h0.2h0.1h0.3h0.3h0.1h0.2h0.2h0.1l0.3,0.1h0.1l0.2,0.1l0.2,0.1l0.3,0.2l0.3,0.2l0.2,0.2l0.2,0.2l0.2,0.2l0.2,0.2l0.2,0.2
1607
+ l0.4,0.4l0.4,0.4l0.4,0.4l0.4,0.4l0.4,0.4l0.4,0.5l0.9,0.9l0.9,1l0.5,0.5l0.5,0.5l0.5,0.5l0.5,0.4l0.4,0.4l0.4,0.4l0.4,0.4
1608
+ l0.2,0.2l0.2,0.2l0.2,0.2l0.2,0.1l0.2,0.1l0.2,0.1l0.2,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.5,0.3l0.5,0.3l0.5,0.3l0.5,0.3l1.1,0.6
1609
+ l1.1,0.6l1.1,0.6l1,0.6l1,0.6l1,0.7l1,0.7l1,0.7l1,0.7l1,0.7l1,0.7l1,0.7l1,0.7l1,0.7l1,0.7l1,0.7l1,0.7l1,0.7l1.9,1.5l1.9,1.5
1610
+ l1.9,1.5l1.9,1.5l1.9,1.5l1.8,1.4l3.7,2.9l3.7,2.9l3.7,2.9l3.7,2.9l3.7,3l3.7,3l3.7,3l3.7,3l3.7,3l3.7,3l3.7,3l3.6,3l3.6,3l3.6,3
1611
+ l3.6,3.1l3.6,3.1l0.2,0.2l0.2,0.2l0.2,0.2l0.3,0.2l0.6,0.4l0.6,0.4l0.6,0.4l0.7,0.4l0.7,0.5l0.7,0.5l1.5,1l1.5,1l1.6,1l0.8,0.5
1612
+ l0.8,0.5l0.8,0.5l0.8,0.5l0.8,0.5l0.8,0.6l0.8,0.6l0.4,0.3l0.4,0.3l0.4,0.3l0.4,0.3l0.4,0.3l0.3,0.3l0.3,0.3l0.3,0.3l0.3,0.3
1613
+ l0.3,0.3l0.3,0.3l0.3,0.3l0.3,0.3l0.3,0.3l0.3,0.3l0.3,0.3l0.3,0.4l0.3,0.4l0.2,0.4l0.2,0.4l0.2,0.4l0.2,0.3l0.2,0.4l0.1,0.4
1614
+ l0.1,0.4v0.4l-0.1,0.4l-0.1,0.4l-0.2,0.4l-0.2,0.3l-0.3,0.3l-0.3,0.3l-0.3,0.2l-0.4,0.2l-0.4,0.1l-0.4,0.1h-0.4H-91l-0.4-0.1
1615
+ l-0.4-0.1l-0.4-0.2l-0.3-0.2l-0.3-0.3l-0.3-0.3l-0.2-0.3l-0.1-0.2l-0.1-0.2l-0.1-0.2l-0.1-0.2l-0.2-0.2l-0.2-0.2l-0.2-0.2
1616
+ l-0.2-0.2l-0.2-0.2l-0.2-0.2l-0.2-0.2l-0.2-0.2l-0.3-0.2l-0.3-0.2l-0.3-0.2l-0.3-0.2l-0.3-0.3l-0.3-0.2l-0.3-0.3l-0.3-0.2
1617
+ l-0.3-0.3l-0.3-0.2l-0.7-0.5l-0.7-0.5l-0.7-0.5l-0.7-0.5l-0.8-0.5l-0.8-0.5l-0.8-0.5l-1.5-1l-1.5-1l-1.5-1l-0.7-0.5l-0.7-0.5
1618
+ l-0.7-0.5l-0.7-0.5l-0.7-0.5l-0.6-0.5l-0.3-0.2l-0.3-0.2l-0.3-0.2l-0.3-0.2l-3.6-3.1l-3.6-3l-3.6-3l-3.6-3l-3.6-3l-3.6-3l-3.6-3
1619
+ l-3.7-3l-3.7-3l-3.7-3l-3.7-3l-3.7-2.9l-3.7-2.9l-3.7-2.9l-3.7-2.9l-3.7-2.9l-1.8-1.4l-1.9-1.5l-1.9-1.5l-1.9-1.5l-1.9-1.5
1620
+ l-1.9-1.5l-1-0.7l-1-0.7l-1-0.7l-1-0.7l-1-0.7l-1-0.7l-1-0.7l-1-0.7l-1-0.7l-1-0.7l-1-0.7l-1-0.6l-1-0.6l-1-0.6l-1-0.6l-1-0.6
1621
+ l-1-0.6l-1-0.5l-0.5-0.3l-0.5-0.3l-0.5-0.3l-0.5-0.3l-0.3-0.1l-0.3-0.2l-0.3-0.2l-0.3-0.2l-0.3-0.2l-0.3-0.2l-0.3-0.2l-0.3-0.2
1622
+ l-0.3-0.2l-0.3-0.2l-0.5-0.4l-0.5-0.5l-0.5-0.5l-0.5-0.5l-0.5-0.5l-0.5-0.5l-0.5-0.5l-0.9-1l-0.9-0.9l-0.4-0.4l-0.4-0.4l-0.4-0.4
1623
+ l-0.3-0.3h-0.4h-0.4l-0.4-0.1l-0.4-0.1l-0.4-0.2l-0.3-0.2l-0.3-0.3l-0.3-0.3l-0.2-0.3l-0.2-0.4l-0.1-0.4l-0.1-0.4v-0.4v-0.3v-0.3
1624
+ l0.1-0.3v-0.1l0.1-0.4v-0.1l0.1-0.2L-214.8,1340z"
1625
+ />
1626
+ </g>
1627
+ <g transform="matrix(0.380231,0.924892,-0.924892,0.380231,1549.4,-185.872)">
1628
+ <path
1629
+ d="M-204.5,1408.5l0.2-0.3l0.2-0.3l0.3-0.2l0.3-0.2l0.3-0.2l0.3-0.1l0.3-0.1h0.4h0.4h0.4l0.3,0.1l0.3,0.1
1630
+ l0.3,0.2l0.3,0.2l0.3,0.2l0.2,0.3l0.2,0.3l0.2,0.3l0.1,0.2l0.1,0.2l0.1,0.2l0.1,0.2l0.2,0.2l0.2,0.3l0.2,0.3l0.2,0.3l0.2,0.3
1631
+ l0.3,0.3l0.3,0.3l0.3,0.3l0.3,0.3l0.3,0.3l0.3,0.3l0.3,0.3l0.4,0.4l0.4,0.4l0.4,0.4l0.4,0.4l0.8,0.8l0.9,0.8l0.9,0.8l0.9,0.8
1632
+ l1,0.8l1,0.8l1,0.8l1,0.8l1,0.8l1.1,0.8l2.1,1.6l2.1,1.6l2.1,1.6l1,0.8l1,0.8l1,0.8l0.9,0.8l0.9,0.8l0.9,0.7l3.8,3.3l3.9,3.3
1633
+ l1.9,1.7l2,1.7l2,1.7l2,1.7l2,1.7l2,1.7l2,1.7l2,1.6l2,1.6l2,1.6l2,1.6l1,0.8l1,0.8l1,0.8l1,0.8l1,0.8l1,0.8l1,0.8l1,0.8l1,0.8
1634
+ l1,0.8l1,0.8l1.1,0.7l1.1,0.7l1.1,0.7l1.1,0.7l1.1,0.7l1.1,0.7l1.1,0.7l1.1,0.7l1.1,0.7l1.1,0.7l1.1,0.7l1.1,0.7l1.1,0.7l1.1,0.6
1635
+ l1.1,0.6l1.1,0.6l1.1,0.6l1.1,0.6l1.1,0.6l1.1,0.6l1.1,0.6l1.1,0.6l1.1,0.6l0.3,0.2l0.3,0.2l0.3,0.2l0.2,0.3l0.2,0.3l0.1,0.3
1636
+ l0.1,0.3l0.1,0.4v0.4v0.4l-0.1,0.4l-0.1,0.3l-0.1,0.3l-0.2,0.3l-0.2,0.3l-0.2,0.3l-0.3,0.2l-0.3,0.2l-0.3,0.1l-0.3,0.1l-0.4,0.1
1637
+ h-0.4h-0.4l-0.4-0.1l-0.3-0.1l-0.3-0.1l-1.1-0.6l-1.1-0.6l-1.1-0.6l-1.1-0.6l-1.1-0.6l-1.1-0.6l-1.1-0.6l-1.1-0.7l-1.1-0.7
1638
+ l-1.1-0.7l-1.1-0.7l-1.1-0.7l-1.1-0.7l-1.1-0.7l-1.1-0.7l-1.1-0.7l-1.1-0.7l-1.1-0.7l-1.1-0.7l-1.1-0.7l-1.1-0.7l-1.1-0.8
1639
+ l-1.1-0.8l-1.1-0.8l-1.1-0.8l-1.1-0.8l-1.1-0.8l-1.1-0.8l-1.1-0.8l-1.1-0.8l-1.1-0.8l-1-0.8l-1-0.8l-1-0.8l-2.1-1.6l-2.1-1.6
1640
+ l-2-1.7l-2-1.7l-2-1.7l-2-1.7l-2-1.7l-2-1.7l-2-1.7l-2-1.7l-2-1.7l-3.9-3.3l-3.8-3.3l-0.8-0.7l-0.9-0.7l-0.9-0.7l-0.9-0.8l-1-0.8
1641
+ l-1-0.8l-2.1-1.6l-2.1-1.6l-2.1-1.6l-1.1-0.8l-1.1-0.8l-1.1-0.8l-1-0.8l-1-0.8l-1-0.8l-1-0.8l-1-0.8l-0.9-0.8l-0.9-0.8l-0.4-0.4
1642
+ l-0.4-0.4l-0.4-0.4l-0.4-0.4l-0.4-0.4l-0.4-0.4l-0.4-0.4l-0.4-0.4l-0.3-0.4l-0.3-0.4l-0.3-0.4l-0.3-0.4l-0.3-0.4l-0.3-0.4
1643
+ l-0.3-0.4l-0.3-0.4l-0.2-0.4l-0.2-0.4l-0.2-0.4l-0.2-0.4l-0.1-0.3l-0.1-0.3v-0.4v-0.4v-0.4l0.1-0.3l0.1-0.3L-204.5,1408.5z"
1644
+ />
1645
+ </g>
1646
+ <g transform="matrix(0.380231,0.924892,-0.924892,0.380231,1549.4,-185.872)">
1647
+ <path
1648
+ d="M-196.1,1467.1l0.1-0.3l0.2-0.2l0.2-0.2l0.2-0.2l0.2-0.2l0.2-0.2l0,0l0.2-0.1l0.3-0.1l0.3-0.1l0.3-0.1h0.3
1649
+ h0.3h0.3l0,0l0.3,0.1l0.3,0.1l0.3,0.1l0.3,0.1l0.3,0.2l0.2,0.2l0.2,0.2l0.2,0.2l0.2,0.3l0.1,0.1l0.2,0.2l0.3,0.4l0.4,0.4l0.4,0.5
1650
+ l0.5,0.5l1,1.1l0.9,1l0.7,0.7l0.2,0.2l0.1,0.1l0.4,0.4l0.5,0.4l0.5,0.4l0.5,0.4l0.5,0.4l0.5,0.4l0.5,0.4l0.5,0.4l0.9,0.7l0.9,0.7
1651
+ l1,0.7l1,0.7l1,0.7l1,0.7l1,0.7l1,0.7l2,1.4l2.1,1.4l0.9,0.6l0.9,0.6l0.9,0.6l0.9,0.6l0.9,0.5l0.9,0.5l0.9,0.5l0.9,0.5l0.9,0.5
1652
+ l0.9,0.5l0.9,0.5l0.9,0.5l1.8,1l1.8,1l1.9,1l1.9,1l1.9,1l1.9,1l1.9,1l1.9,1l0.9,0.5l0.9,0.5l0.9,0.5l1,0.5l0.5,0.3l0.6,0.3
1653
+ l0.6,0.4l0.6,0.4l0.6,0.4l0.6,0.4l1.2,0.8l1.2,0.9l1.2,0.9l0.6,0.4l0.6,0.4l0.6,0.4l0.6,0.4l0.6,0.4l0.6,0.4l0.6,0.4l0.6,0.4
1654
+ l0.6,0.3l0.6,0.3l0.3,0.1l0.3,0.1l0.3,0.1l0.3,0.1l0.3,0.1l0.3,0.1l0.3,0.1l0.3,0.1l0.2,0.1l0.2,0.1l0.2,0.1l0.2,0.1l0.2,0.1
1655
+ l0.2,0.1h0.2h0.2h0.2h0.2h0.2h0.2h0.3l0.3,0.1l0.3,0.1l0.3,0.1l0.3,0.1l0.3,0.2l0.2,0.2l0.2,0.2l0.2,0.2l0.2,0.3l0.1,0.3l0.1,0.3
1656
+ l0.1,0.3v0.3v0.3v0.3l-0.1,0.3l-0.1,0.3l-0.1,0.3l-0.1,0.3l-0.2,0.3l-0.2,0.2l-0.2,0.2l-0.2,0.2l-0.3,0.2l-0.3,0.1l-0.3,0.1
1657
+ l-0.3,0.1h-0.3h-0.3h-0.3h-0.4h-0.4h-0.4l-0.4-0.1l-0.4-0.1l-0.4-0.1l-0.4-0.1l-0.4-0.1l-0.4-0.1l-0.4-0.1l-0.4-0.1l-0.4-0.1
1658
+ l-0.4-0.1l-0.4-0.1l-0.4-0.2l-0.4-0.2l-0.4-0.2l-0.3-0.2l-0.4-0.2l-0.7-0.4l-0.7-0.4l-0.7-0.4l-0.7-0.4l-0.7-0.4l-0.7-0.4
1659
+ l-0.7-0.4l-0.7-0.4l-0.7-0.4l-0.6-0.4l-1.3-0.9l-1.2-0.9l-1.2-0.8l-0.5-0.4l-0.5-0.4l-0.5-0.3l-0.5-0.3l-0.5-0.3l-0.4-0.3
1660
+ l-0.9-0.5l-0.9-0.5l-0.9-0.5l-0.9-0.5l-1.9-1l-1.9-1l-1.9-1l-1.9-1l-1.9-1l-1.9-1l-1.9-1l-1.9-1l-0.9-0.5l-0.9-0.5l-0.9-0.5
1661
+ l-0.9-0.5l-0.9-0.5l-0.9-0.5l-0.9-0.6l-0.9-0.6l-0.9-0.6l-0.9-0.6l-0.9-0.6l-0.9-0.6l-2.1-1.4l-2-1.4l-1-0.7l-1-0.7l-1-0.7
1662
+ l-1-0.7l-1-0.7l-1-0.7l-1-0.7l-1-0.8l-0.5-0.4l-0.5-0.4l-0.5-0.4l-0.5-0.4l-0.5-0.4l-0.5-0.4l-0.5-0.4l-0.5-0.5l-0.2-0.2
1663
+ l-0.3-0.3l-0.8-0.8l-0.9-1l-1-1.1l-0.5-0.6l-0.5-0.5l-0.4-0.5l-0.4-0.5l-0.3-0.4l-0.2-0.2l-0.2-0.2l-0.1-0.2l-0.2-0.3v-0.1
1664
+ l-0.1-0.2l-0.1-0.2l-0.1-0.2l0,0l-0.1-0.3v-0.3v-0.3v-0.3l0,0l0.1-0.3l0.1-0.3L-196.1,1467.1z"
1665
+ />
1666
+ </g>
1667
+ <g transform="matrix(0.380231,0.924892,-0.924892,0.380231,1549.4,-185.872)">
1668
+ <path
1669
+ fill="#DACEB3"
1670
+ d="M-197.1,1289.5l0.2-0.4l0.2-0.4l0.2-0.4l0.2-0.4l0.1-0.2l0.1-0.2l0.2-0.2l0.2-0.2l0.2-0.2l0.2-0.2l0.2-0.2
1671
+ l0.2-0.2l0.2-0.2l0.2-0.2l0.2-0.1l0.3-0.2l0.2-0.1l0.3-0.1h0.1l0.1-0.1h0.1h0.1h0.2h0.2h0.1h0.3h0.1h0.2h0.2h0.1h0.3h0.1h0.3h0.1
1672
+ l0.3,0.1l0.2,0.1l0.3,0.1l0.2,0.1l0,0l0.2-0.3l0.2-0.3l0.3-0.3l0.3-0.3l0.2-0.2l0.2-0.1l0.2-0.2l0.2-0.1l0.2-0.1l0.2-0.1l0.2-0.1
1673
+ l0.2-0.1l0,0l0.2-0.1l0.2-0.1l0,0h0.2h0.2l0,0h0.2h0.2l0,0h0.2h0.2l0,0h0.2h0.2l0,0l0.2,0.1l0.2,0.1h0.1l0.2,0.1l0.2,0.1l0.1,0.1
1674
+ l0.2,0.2l0.2,0.1l0.2,0.2l0.2,0.2l0.2,0.2l0.2,0.2l0.2,0.2l0.2,0.2l0.2,0.2l0.2,0.3l0.3,0.5l0.3,0.6l0.3,0.6l0.4,0.6l0.4,0.7
1675
+ l0.4,0.7l0.4,0.7l0.4,0.7l0.4,0.7l0.4,0.7l0.4,0.7l0.3,0.7l0.2,0.3l0.2,0.1l0.3,0.3l0.2,0.3l0.2,0.3l0.2,0.3l0.2,0.3l0.1,0.3
1676
+ l0.1,0.3l0.1,0.3l0.1,0.3l0.1,0.3l0.1,0.3l0.1,0.3v0.3v0.3v0.2l0.2,0.4l0.2,0.5l0.2,0.5l0.1,0.5l0.1,0.4l0.1,0.3v0.2l0.1,0.8
1677
+ l0.1,0.8l0.1,0.8l0.1,0.8l0.1,0.8l0.1,0.8l0.1,1.5l0.1,1.5l0.1,1.5l0.1,1.5l0.1,1.6v1.6v1.6v1.6v1.6v1.6v1.6v0.7l0,0l0.2,0.2
1678
+ l0.2,0.2l0,0l0.2,0.2l0.2,0.2l0,0l0.1,0.2l0.1,0.2l0,0l0.1,0.2l0.1,0.2v0.1v0.2v0.2v0.2l0.1,0.6v0.5v0.5v0.5v0.5v0.5v0.5v0.5v0.5
1679
+ v0.5v0.5v0.1v0.2v0.5v0.5v0.5v0.5v0.5v0.5l-0.1,0.5l-0.1,0.5l-0.1,0.5l-0.1,0.4l-0.1,0.4l-0.1,0.4l-0.1,0.4l-0.1,0.4l-0.2,0.8
1680
+ l-0.2,0.8l-0.2,0.8l-0.2,0.8l-0.1,0.3l-0.2,0.7l-0.1,2l-0.1,3l-0.1,3v0.4v0.5v1.1v1.3v1.5v0.8v0.8v0.8v0.9v0.9v0.9l-0.1,0.9
1681
+ l-0.1,0.9l-0.1,0.9l-0.1,0.9l-0.1,0.5l-0.1,0.4l-0.1,0.4l-0.1,0.4l-0.1,0.4l-0.1,0.4l-0.1,0.4l-0.1,0.4l-0.1,0.4l-0.1,0.4
1682
+ l-0.1,0.4l-0.1,0.4l-0.1,0.4l-0.1,0.4l-0.2,0.4l-0.2,0.4l-0.2,0.4l-0.2,0.4l-0.2,0.4l-0.2,0.4l-0.2,0.4l-0.3,0.3l-0.3,0.3
1683
+ l-0.3,0.3l-0.3,0.3l-0.3,0.3l-0.2,0.2l-0.2,0.1l-0.2,0.1l-0.2,0.1l-0.2,0.1l-0.2,0.1l-0.2,0.1l-0.2,0.1l-0.3,0.1l-0.3,0.1h-0.3
1684
+ h-0.3h-0.3h-0.3h-0.3h-0.3l-0.3-0.1l-0.3-0.1h-0.1l-0.2,0.1l0,0l-0.3,0.1l-0.3,0.1l-0.3,0.1h-0.3h-0.3h-0.3h-0.3l-0.3-0.1l0,0
1685
+ l-0.3-0.1l-0.2-0.1l-0.2-0.1l-0.2-0.2l-0.2-0.2l-0.2-0.2l0,0l-0.1-0.2l-0.1-0.2l-0.1-0.2l-0.1-0.2l0,0l-0.1-0.2l-0.1-0.2v-0.2
1686
+ v-0.3v-0.2l-0.1-0.4v-0.5v-0.6v-0.7v-0.8l-0.1-1.7l0,0v-0.1l-0.3-0.6l-0.3-0.7l-0.3-0.7l-0.3-0.8l-0.3-0.8l-0.3-0.9l-0.3-0.9
1687
+ l-0.3-0.9l-0.3-0.9l-0.6-1.8l-0.6-1.8l-0.5-1.7l-0.5-1.6l-0.8-2.5v-0.1l-0.1-0.2l-0.1-0.2l-0.1-0.2l-0.1-0.2l-0.1-0.2l-0.1-0.2
1688
+ v-0.2l-0.1-0.3l-0.2-0.8l-0.2-0.8l-0.2-0.8l-0.2-0.8l-0.2-0.8l-0.2-0.8l-0.2-0.8l-0.2-0.8l-0.2-0.8l-0.2-0.8l-0.1-0.8l-0.1-0.8
1689
+ l-0.1-0.8l-0.1-0.8l-0.1-0.8l-0.1-0.8l-0.1-0.8l-0.1-0.6l-0.1-0.1l-0.2-0.2l-0.2-0.2l-0.2-0.2l-0.2-0.2l-0.1-0.2l-0.1-0.3
1690
+ l-0.1-0.3l-0.1-0.3l-0.1-0.3l-0.1-0.3l-0.1-0.3l-0.1-0.3l-0.2-0.5l-0.2-0.5l-0.2-0.6l-0.1-0.6l-0.1-0.6l-0.1-0.6l-0.1-0.6
1691
+ l-0.1-0.6l-0.1-0.6l-0.1-0.6v-0.6v-0.6v-0.6v-0.6v-0.6v-0.6v-0.6v-0.6v-0.6v-0.6v-0.5v-0.1v-0.6v-0.6v-0.6v-0.6v-0.6v-0.6v-0.6
1692
+ v-0.6v-0.6v-0.6l0.1-1.2l0.1-1.2l0.1-1.2l0.1-1.2l0.1-1.2l0.1-1.2l0.2-1.2l0.2-1.2l0.2-1.2l0.2-1.2l0.2-1.2l0.4-2.3l0.4-2.3
1693
+ l0.1-0.5l0.1-0.5l0.2-1.3l0.1-0.7l0.1-0.7l0.1-0.4l0.1-0.4l0.1-0.4l0.1-0.4l0.1-0.4l0.1-0.4L-197.1,1289.5l0-0.4l0.2-0.4
1694
+ L-197.1,1289.5z M-184.6,1294.6L-184.6,1294.6v-0.2l-0.1-0.3L-184.6,1294.6z"
1695
+ />
1696
+ </g>
1697
+ <g transform="matrix(0.380231,0.924892,-0.924892,0.380231,1549.4,-185.872)">
1698
+ <path
1699
+ fill="#DACEB3"
1700
+ d="M-182,1397.3L-182,1397.3L-182,1397.3l0.2-0.2l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1l0,0v-0.3
1701
+ v-0.1v-0.1v-0.1l0,0v-0.2v-0.2v-0.1v-0.1l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1l0,0l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1
1702
+ l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1h0.1h0.1h0.2h0.2h0.2h0.2h0.2h0.2h0.2h0.2h0.1h0.2h0.1l0.1,0.1l0.1,0.1
1703
+ l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1v0.1
1704
+ v0.1v0.1v0.2v0.4v0.4v0.5l0.1,1.3v0.7h0.1h0.1h0.1h0.1l0,0h0.1h0.1h0.1h0.1l0,0l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0,0l0.1,0.1
1705
+ l0.1,0.1l0.1,0.1l0.1,0.1l0,0l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0,0l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0,0l0.1,0.1v0.1v0.1v0.1v0.1
1706
+ v0.1v0.1v0.1v0.1v0.2v0.2v0.1v0.1v0.3v0.4l-0.1,0.3l-0.1,0.3l-0.1,0.3l-0.1,0.3l-0.2,0.6l-0.2,0.6l-0.1,0.3v0.1v0.5v0.5v0.6v0.6
1707
+ v0.6v0.6v0.6v0.6v0.6v0.6v0.6v0.6v0.6l-0.1,0.6l-0.1,0.6l-0.1,0.6l-0.1,0.6l-0.1,0.6l-0.1,0.6l-0.1,0.3l-0.1,0.3l-0.1,0.3
1708
+ l-0.1,0.3l-0.1,0.3l-0.1,0.3l-0.1,0.3l-0.1,0.3l-0.1,0.3l-0.1,0.3l-0.2,0.3l-0.2,0.3l-0.1,0.2l-0.2,0.2l-0.2,0.2l-0.1,0.1
1709
+ l-0.1,0.1l-0.1,0.1l-0.1,0.1h-0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l0,0l-0.1,0.1l-0.1,0.1l-0.1,0.1l0,0h-0.1h-0.1h-0.1l0,0h-0.1h-0.1
1710
+ h-0.1h-0.1l0,0h-0.1h-0.1h-0.1h-0.1l0,0h-0.2h-0.2h-0.1h-0.1h-0.1h-0.1h-0.1h-0.1h-0.1l0,0h-0.1h-0.1h-0.1h-0.1l-0.1-0.1
1711
+ l-0.1-0.1l-0.1-0.1l0,0l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l0,0l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l0,0
1712
+ l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.2l-0.1-0.3l-0.1-0.3l-0.1-0.4l-0.1-0.4v-0.2l0,0l-0.2-0.4l-0.2-0.4l-0.1-0.4l-0.1-0.4
1713
+ l-0.1-0.4l-0.1-0.4l-0.1-0.4l-0.1-0.4v-0.4v-0.4v-0.4v-0.4v-0.4v-0.4v-0.4v-0.4v-0.4v-0.4v-0.4l0.1-0.8l0.1-0.8l0.1-0.9l0.1-0.6
1714
+ v-0.1v-0.5v-0.6v-0.6v-0.4v-0.6v-0.8v-0.8v-0.8v-0.8v-0.4v-0.4v-0.4v-0.4l0.1-0.4l0.1-0.4l0.1-0.4l0.1-0.4l0.1-0.4l0.1-0.3v-0.1
1715
+ v-0.1v-0.1l0.1-0.1L-182,1397.3z"
1716
+ />
1717
+ </g>
1718
+ <g transform="matrix(0.380231,0.924892,-0.924892,0.380231,1549.4,-185.872)">
1719
+ <path
1720
+ fill="#DACEB3"
1721
+ d="M-240.6,1222l0.1-0.2l0.1-0.2l0.1-0.1l0.1-0.2l0.1-0.2l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1
1722
+ l0.1-0.1l0.1-0.1l0.1-0.1l0.2-0.1l0.4-0.2l0.4-0.2l0.3-0.1l0.5-0.2l0.5-0.1l0.5-0.1l0.5-0.1l0.5-0.1l0.2-0.1l0,0l0.1-0.1l0.1-0.1
1723
+ l0.1-0.1l0.1-0.1l0.1-0.1l0.2-0.2l0.1-0.1l0.1-0.1l0.1-0.1h0.1l0.1-0.1l0.1-0.1l0.1-0.1l0.3-0.1l0.3-0.1l0.3-0.1l0.4-0.1l0.4-0.1
1724
+ h0.4h0.3h0.3h0.3h0.3h0.3h0.3l0.6,0.1l0.6,0.1l0.6,0.1l0.6,0.1l0.5,0.1l0.5,0.1l0.8,0.2h0.2h0.1l0.4,0.1l0.5,0.1l0.5,0.1l0.5,0.1
1725
+ l0.5,0.1l0.5,0.1l0.5,0.1l0.5,0.2l0.5,0.2l0.5,0.2h0.1l0.8,0.2l0.8,0.2l0.8,0.2l0.8,0.3l0.8,0.3l0.8,0.3l0.8,0.3l0.8,0.3l0.8,0.3
1726
+ l0.8,0.3l0.8,0.3l0.8,0.3l0.8,0.3l1.5,0.7l1.5,0.7l1.5,0.7l1.5,0.7l1.4,0.7l0.7,0.3l0.7,0.3l0.7,0.3l0.7,0.3l0.7,0.3l0.7,0.3
1727
+ l0.7,0.3l0.7,0.2l0.7,0.2l0.7,0.2l0.7,0.2l0.7,0.2l0.7,0.2l0.3,0.1l0.4,0.1l0.3,0.1h0.2h0.2h0.4h0.5h0.5h0.5h0.5l0.5,0.1l1,0.1
1728
+ l0.5,0.1l0.4,0.1l0.4,0.1l0.3,0.1l0.2,0.1h0.1l0.2,0.1l0.2,0.1l0,0l0.2,0.1l0.2,0.1l0.2,0.1l0.2,0.2l0.2,0.2l0.2,0.2l0.1,0.2l0,0
1729
+ l0.1,0.2l0.1,0.2l0.1,0.2l0.1,0.2v0.2v0.2v0.2v0.2v0.2l-0.1,0.2l-0.1,0.2l-0.1,0.2l-0.1,0.2l0,0l-0.1,0.2l-0.1,0.2l-0.2,0.2
1730
+ l-0.2,0.2l-0.2,0.1l-0.2,0.1l-0.2,0.1l-0.2,0.1l-0.2,0.1l0,0l-0.2,0.1h-0.2h-0.2h-0.1h-0.1h-0.1h-0.2l0,0l0.1,0.2l0.1,0.2v0.2
1731
+ l0,0v0.2v0.2l0,0v0.2v0.2l0,0v0.2l-0.1,0.2l0,0l-0.1,0.2l-0.1,0.2l-0.1,0.2l0,0l-0.1,0.2l-0.1,0.2l-0.1,0.1l-0.1,0.1l0,0
1732
+ l-0.1,0.1l-0.1,0.1l-0.1,0.1h-0.1l-0.2,0.1l-0.2,0.1h-0.1l-0.1,0.1l-0.1,0.1l-0.2,0.1l-0.3,0.1l-0.3,0.1h-0.3h-0.3l-0.5,0.1h-0.5
1733
+ h-0.5h-0.5h-0.5h-0.5h-0.6h-0.6h-0.6h-0.6h-0.6l-1.1-0.1l-1.1-0.1l-1-0.1l-0.9-0.1l-0.8-0.1l-0.6-0.1l-0.3-0.1l-0.3-0.1l-0.7-0.2
1734
+ l-0.6-0.2l-0.6-0.2l-0.6-0.2l-0.6-0.2l-0.6-0.3l-0.6-0.3l-0.6-0.3l-0.6-0.3l-0.6-0.3l-0.6-0.3l-0.6-0.3l-0.6-0.3l-0.6-0.3
1735
+ l-0.6-0.3l-0.6-0.3l-0.6-0.3l-0.6-0.4l-0.6-0.3l-0.7-0.1l-1.2-0.2l-1.2-0.2l-1.2-0.2l-1.2-0.2l-1.2-0.2l-2.5-0.4l-2.5-0.4
1736
+ l-2.5-0.4l-2.5-0.5h-0.1h-0.1l-0.2-0.1l-0.3-0.1l-0.3-0.1l-0.3-0.1l-0.3-0.1l-0.3-0.2l-0.3-0.2l-0.4-0.2l-0.4-0.2l-0.4-0.2
1737
+ l-0.4-0.2l-0.4-0.3l-0.4-0.3l-0.4-0.3l-0.4-0.3l-0.4-0.3l-0.4-0.3l-0.4-0.3l-0.4-0.3l-0.2-0.2l-0.2-0.2l-0.2-0.2l-0.2-0.2
1738
+ l-0.2-0.2l-0.2-0.2l-0.2-0.2l-0.2-0.3l-0.2-0.3l-0.2-0.3l-0.1-0.3l-0.1-0.2v-0.1v-0.1v-0.1v-0.1v-0.1v-0.1v-0.2v-0.2v-0.1v-0.2
1739
+ v-0.2v-0.1v-0.2l0.1-0.2v-0.1l0.1-0.2l0.1-0.2L-240.6,1222z"
1740
+ />
1741
+ </g>
1742
+ <g transform="matrix(0.380231,0.924892,-0.924892,0.380231,1549.4,-185.872)">
1743
+ <path
1744
+ d="M-236.9,1244.6l0.5-0.8l0.6-0.7l0.7-0.6l0.8-0.4l0.9-0.3l0.9-0.2h0.9l0.9,0.1l0.9,0.3l0.8,0.4l0.8,0.5
1745
+ l0.7,0.6l0.1,0.1l0.5,0.6l0.1,0.1l0.4,0.6v0.1l0.3,0.7v0.1l0.2,0.8v0.1l0.1,0.6v0.1v0.7v0.1v0.5v0.3l-0.1,0.5l-0.1,0.5l-0.1,0.4
1746
+ l-0.1,0.4l-0.2,0.5l-0.2,0.5l-0.1,0.2v0.1v0.4v0.4v0.3l0.1,0.7l0.1,0.7l0.1,0.7l0.1,0.8l0.1,0.8l0.1,0.8l0.1,0.8l0.3,1.6l0.3,1.6
1747
+ l0.3,1.6l0.3,1.5l0.3,1.5l0.3,1.5l0.3,1.5l0.3,1.5l0.3,1.5l0.6,2.9l0.6,2.9l0.6,2.9l1.2,5.9l0.6,3l0.6,3l0.6,3l0.3,1.5l0.3,1.5
1748
+ l0.3,1.5l0.3,1.5l0.3,1.5l0.3,1.5l0.2,1.5l0.2,1.6l0.2,1.6l0.3,2.4l0.1,0.8l0.1,0.9l0.1,0.8l0.3,1.7l0.3,1.7l0.3,1.7l0.3,1.7
1749
+ l0.3,1.7l0.4,1.7l0.4,1.7l0.4,1.7l0.4,1.7l0.4,1.7l0.8,3.5l0.8,3.5l0.8,3.5l0.8,3.5l0.4,1.8l0.4,1.8l0.4,1.8l0.4,1.8l0.4,1.8
1750
+ l0.4,1.8l0.3,1.8l0.3,1.8l0.3,1.8l0.3,1.8l0.1,0.9l0.1,0.9l0.1,0.9l0.1,0.9l0.5,3.8l0.5,3.8l0.6,3.8l0.6,3.8l0.6,3.8l0.6,3.8
1751
+ l0.6,3.8l0.6,3.8l0.6,3.8l0.6,3.8l0.6,3.8l0.6,3.8l1.3,7.5l1.3,7.5l1.3,7.5l1.3,7.5l2.6,15l1.3,7.5l1.3,7.5l1.3,7.5l1.3,7.5
1752
+ l0.4,2.6l0.4,2.6l0.4,2.6l0.4,2.6l0.4,2.6l0.4,2.6l0.4,2.6l0.4,2.6l0.7,5.2l0.7,5.2l0.7,5.1l0.7,5.1l0.7,5.1l0.4,2.5l0.4,2.5
1753
+ l0.4,2.5l0.4,2.5l0.4,2.5l0.4,2.5l0.4,2.5l0.4,2.5l0.4,2.5l0.4,2.5l0.4,2.5l0.5,2.5l0.5,2.5l0.5,2.5v0.2v0.2l0.1,0.2v0.2l0.1,0.4
1754
+ l0.1,0.4l0.1,0.4l0.2,0.4l0.2,0.4l0.2,0.4l0.2,0.4l0.2,0.4l0.2,0.4l0.2,0.5l0.2,0.5l0.2,0.5l0.5,1l1.1,2.1l0.6,1.1l0.3,0.6
1755
+ l0.3,0.6l0.3,0.6l0,0l0.2-0.4l0.4-1l0.4-1.1l0.2-0.6l0.2-0.6l0.2-0.6l0.3-0.6l0.3-0.6l0.3-0.6l0.3-0.6l0.3-0.6l0.3-0.6l0.4-0.6
1756
+ l0.2-0.3l0.2-0.3l0.2-0.3l0.2-0.3l0.5-0.7l0.5-0.7l0.5-0.7l0.5-0.7l0.5-0.7l0.5-0.7l0.5-0.7l0.5-0.7l0.5-0.7l0.5-0.7l0.5-0.7
1757
+ l0.5-0.7l0.5-0.7l0.5-0.8l0.5-0.8l0.5-0.8l0.9-1.5l0.9-1.5l0.9-1.6l0.9-1.6l0.9-1.6l0.9-1.6l0.9-1.6l0.9-1.6l1.7-3.3l1.7-3.3
1758
+ l1.8-3.3l0.9-1.7l0.9-1.7l0.9-1.7l0.9-1.7l0.9-1.7l0.9-1.6l1-1.6l1-1.6l0.5-0.8l0.5-0.8l0.5-0.8l0.5-0.8l0.9-1.4l0.9-1.4l0.9-1.4
1759
+ l0.8-1.4l0.8-1.5l0.8-1.5l0.8-1.5l0.8-1.5l0.8-1.5l0.8-1.5l0.8-1.5l0.8-1.5l0.8-1.5l0.8-1.5l0.8-1.5l0.8-1.5l0.8-1.5l0.8-1.6
1760
+ l1.5-3.1l3-6.3l1.5-3.2l1.5-3.1l0.8-1.6l0.8-1.6l0.8-1.6l0.8-1.6l1.3-2.7l1.3-2.7l1.3-2.7l1.3-2.7l1.3-2.7l1.3-2.7l1.3-2.7
1761
+ l1.3-2.7l1.3-2.7l1.3-2.7l1.3-2.7l1.3-2.7l1.2-2.7l1.2-2.7l1.2-2.7l1.2-2.7l2.5-5.5l2.4-5.5l2.4-5.5l2.4-5.5l4.9-11l2.4-5.5
1762
+ l2.4-5.5l1.4-3.1l1.4-3.1l1.4-3.1l1.4-3.1l1.4-3.1l1.4-3.1l1.4-3.1l1.4-3.1l1.4-3.1l1.4-3.1l1.4-3.1l1.4-3.1l1.4-3.1l1.4-3.1
1763
+ l1.4-3.1l1.4-3.1l1.4-3.1l1.4-3l1.4-3l1.5-3l1.5-3l1.5-3l1.5-3l1.5-3l1.5-3l1.5-3l1.5-3l1.5-3l1.5-3l1.5-3l1.5-3l1.5-3l1.1-2.1
1764
+ l1.1-2.1l1-2.1l1-2.1l1-2.2l1-2.2l0.5-1.1l0.5-1.1l0.5-1.1l0.5-1.1l0.5-1.1l0.5-1.1l0.5-1.1l0.5-1.1l0.5-1.1l0.4-1.1l0.4-1.1
1765
+ l0.4-1.1l0.4-1.1l0.4-1.1l0.4-1.1l0.4-1.1l0.4-1.1l0.4-1.1l0.4-1.1l0.4-1.1l0.1-0.4l0.2-0.4l0.2-0.4l0.2-0.4l0.2-0.4l0.2-0.4
1766
+ l0.2-0.3l0.2-0.3l0.4-0.6l0.4-0.6l0.6-1l0.3-0.4l0.2-0.4l0.1-0.2l0.1-0.1l0.1-0.1v-0.1l0.1-0.4l0.3-0.9l0.4-0.8l0.5-0.8l0.6-0.7
1767
+ l0.7-0.6l0.8-0.4l0.9-0.3l0.9-0.2h0.9l0.9,0.1l0.9,0.3l0.8,0.4l0.8,0.5l0.7,0.6l0.6,0.7l0.4,0.8l0.3,0.9l0.2,0.9v0.9v0.4
1768
+ l-0.1,0.6l-0.1,0.6l-0.1,0.6l-0.2,0.5l-0.2,0.5l-0.2,0.4l-0.2,0.4l-0.2,0.4l-0.2,0.4l-0.2,0.3l-0.2,0.3l-0.4,0.6l-0.4,0.6l-0.7,1
1769
+ l-0.3,0.4l-0.3,0.4l-0.1,0.2l-0.1,0.2l-0.1,0.1l-0.1,0.1v0.1v0.1l0,0v0.1l-0.4,1.1l-0.4,1.1l-0.4,1.1l-0.4,1.1l-0.4,1.1l-0.4,1.1
1770
+ l-0.4,1.1l-0.4,1.1l-0.5,1.1l-0.5,1.1l-0.5,1.1l-0.5,1.1l-0.5,1.1l-0.5,1.1l-0.5,1.1l-0.5,1.1l-0.5,1.1l-0.5,1.1l-0.5,1.1
1771
+ l-0.5,1.1l-1,2.2l-1.1,2.2l-1.1,2.2l-1.1,2.2l-1.1,2.2l-1.1,2.1l-1.5,3l-1.5,3l-1.5,3l-1.5,3l-1.5,3l-1.5,3l-1.5,3l-1.5,3l-1.5,3
1772
+ l-1.5,3l-1.5,3l-1.5,3l-1.4,3l-1.4,3l-1.4,3l-1.4,3l-1.4,3l-1.4,3l-1.4,3l-1.4,3l-1.4,3l-1.4,3.1l-1.4,3.1l-1.4,3.1l-1.4,3.1
1773
+ l-1.4,3.1l-1.4,3.1l-1.4,3.1l-1.4,3.1l-1.4,3.1l-1.4,3.1l-1.4,3.1l-2.4,5.5l-2.4,5.5l-4.9,11l-2.4,5.5l-2.4,5.5l-2.5,5.5
1774
+ l-2.5,5.5l-1.2,2.8l-1.2,2.8l-1.3,2.8l-1.3,2.8l-1.3,2.8l-1.3,2.8l-1.3,2.8l-1.3,2.7l-1.3,2.7l-1.3,2.7l-1.3,2.7l-1.3,2.7
1775
+ l-1.3,2.7l-1.3,2.7l-1.3,2.7l-1.3,2.7l-0.8,1.5l-0.8,1.5l-0.8,1.5l-0.7,1.5l-1.5,3.1l-1.5,3.1l-3,6.3l-1.5,3.2l-0.8,1.6l-0.8,1.6
1776
+ l-0.8,1.6l-0.8,1.6l-0.8,1.6l-0.8,1.6l-0.8,1.6l-0.8,1.6l-0.8,1.6l-0.8,1.6l-0.8,1.6l-0.9,1.6l-0.9,1.5l-0.9,1.5l-0.9,1.5
1777
+ l-0.9,1.5l-0.9,1.5l-0.9,1.5l-0.5,0.8l-0.5,0.8l-0.5,0.8l-0.5,0.8l-0.9,1.6l-0.9,1.6l-0.9,1.6l-0.9,1.6l-0.9,1.6l-0.9,1.6
1778
+ l-0.9,1.6l-0.9,1.6l-1.7,3.3l-1.7,3.3l-1.7,3.3l-0.9,1.7l-0.9,1.6l-0.9,1.6l-0.9,1.6l-0.9,1.6l-0.9,1.6l-0.9,1.6l-1,1.6l-0.5,0.8
1779
+ l-0.5,0.8l-0.5,0.8l-0.5,0.8l-0.5,0.8l-0.5,0.8l-0.5,0.8l-0.5,0.8l-0.5,0.8l-0.5,0.8l-0.5,0.8l-0.5,0.8l-0.5,0.8l-0.6,0.8
1780
+ l-0.6,0.8l-0.5,0.7l-0.1,0.2l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.2,0.3l-0.2,0.3l-0.2,0.3l-0.2,0.4l-0.2,0.4l-0.2,0.4l-0.2,0.4
1781
+ l-0.2,0.4l-0.2,0.5l-0.2,0.5l-0.4,1l-0.4,1.1l-0.5,1.1l-0.3,0.6l-0.3,0.6l-0.3,0.6l-0.3,0.6l-0.3,0.6l-0.3,0.6l-0.3,0.6l-0.4,0.6
1782
+ l-0.4,0.6l-0.2,0.3l-0.2,0.3l-0.2,0.3l-0.2,0.3l-0.2,0.3l-0.2,0.3l-0.3,0.3l-0.3,0.3l-0.3,0.3l-0.3,0.3l-0.3,0.3l-0.4,0.3
1783
+ l-0.5,0.3l-0.4,0.2l-0.5,0.2l-0.5,0.2l-0.5,0.1l-0.5,0.1l-0.4,0.1h-0.4h-0.4h-0.5h-0.4l-0.5-0.1l-0.4-0.1l-0.6-0.2l-0.5-0.2
1784
+ l-0.5-0.2l-0.5-0.2l-0.4-0.2l-0.4-0.2l-0.4-0.2l-0.4-0.2l-0.3-0.2l-0.3-0.2l-0.3-0.3l-0.3-0.3l-0.3-0.3l-0.3-0.3l-0.3-0.3
1785
+ l-0.3-0.3l-0.3-0.3l-0.2-0.3l-0.2-0.3l-0.2-0.3l-0.2-0.4l-0.3-0.4l-0.3-0.5l-0.2-0.5l-0.2-0.7l-0.2-0.5l-0.2-0.5l-0.2-0.5
1786
+ l-0.2-0.5l-0.2-0.5l-0.2-0.5l-0.2-0.5l-0.2-0.5l-0.2-0.5l-0.5-1l-1.1-2.1l-0.6-1.1l-0.3-0.6l-0.3-0.6l-0.3-0.6l-0.3-0.6l-0.3-0.6
1787
+ l-0.3-0.6l-0.3-0.7l-0.3-0.7l-0.2-0.7l-0.2-0.7l-0.2-0.7l-0.2-0.7l-0.1-0.4l-0.1-0.4l-0.1-0.4l-0.1-0.4l-0.5-2.6l-0.5-2.5
1788
+ l-0.5-2.5l-0.5-2.6l-0.4-2.6l-0.4-2.6l-0.4-2.6l-0.4-2.6l-0.4-2.6l-0.4-2.6l-0.4-2.6l-0.4-2.6l-0.4-2.6l-0.4-2.6l-0.7-5.1
1789
+ l-0.7-5.1l-0.7-5.1l-0.7-5.1l-0.7-5.1l-0.4-2.6l-0.4-2.6l-0.4-2.6l-0.4-2.6l-0.4-2.6l-0.4-2.5l-0.4-2.5l-0.4-2.5l-1.2-7.4
1790
+ l-1.3-7.4l-1.3-7.5l-1.3-7.5l-2.6-15l-1.3-7.5l-1.3-7.5l-1.3-7.5l-1.3-7.5l-0.6-3.8l-0.6-3.8l-0.6-3.8l-0.6-3.8l-0.6-3.8
1791
+ l-0.6-3.8l-0.6-3.8l-0.6-3.8l-0.6-3.8l-0.6-3.8l-0.6-3.8l-0.5-3.8l-0.1-0.9l-0.1-0.9l-0.1-0.9l-0.1-0.8l-0.3-1.7l-0.3-1.7
1792
+ l-0.3-1.7l-0.3-1.7l-0.3-1.7l-0.4-1.7l-0.4-1.7l-0.4-1.7l-0.4-1.7l-0.4-1.7l-0.8-3.5l-0.8-3.5l-0.8-3.5l-0.8-3.5l-0.4-1.8
1793
+ l-0.4-1.8l-0.4-1.8l-0.4-1.8l-0.4-1.8l-0.4-1.8l-0.4-1.8l-0.3-1.8l-0.3-1.8l-0.3-1.8l-0.2-0.9l-0.1-0.9l-0.1-0.9l-0.1-0.9
1794
+ l-0.2-1.5l-0.2-1.5l-0.2-1.5l-0.2-1.5l-0.2-1.5l-0.3-1.5l-0.3-1.5l-0.3-1.5l-0.3-1.5l-0.3-1.5l-0.6-3l-0.6-2.9l-0.6-2.9l-1.2-5.9
1795
+ l-0.6-3l-0.6-3l-0.6-3l-0.3-1.5l-0.3-1.5l-0.3-1.5l-0.3-1.5l-0.3-1.5l-0.3-1.5l-0.3-1.6l-0.3-1.6l-0.3-1.7l-0.1-0.9l-0.1-0.9
1796
+ l-0.1-0.9l-0.1-0.9l-0.1-0.9l-0.1-0.9l-0.1-0.9v-0.5v-0.5v-0.5v-0.5v-0.5v-0.6v-0.5l0.1-0.5l0.1-0.5l0.1-0.4l0.1-0.4l0.1-0.4
1797
+ l0.2-0.5l0.1-0.2v-0.3l0.1-0.9l0.3-0.9L-236.9,1244.6z M-3,1245.6v0.2l0,0V1245.6L-3,1245.6z M-236.3,1251.3l0.2,0.2l-0.4-0.6
1798
+ L-236.3,1251.3z"
1799
+ />
1800
+ </g>
1801
+ <g transform="matrix(0.380231,0.924892,-0.924892,0.380231,1549.4,-185.872)">
1802
+ <path
1803
+ d="M-269.9,1186.4l0.1-0.3l0.2-0.3l0.2-0.3l0.2-0.3l0.2-0.3l0.2-0.2l0.2-0.2l0.3-0.2l0.3-0.2l0.3-0.2l0.3-0.2
1804
+ l0.3-0.2l0.3-0.1l0.3-0.1l0.3-0.1l0.3-0.1l0.3-0.1h0.3h0.3h0.3h0.3h0.3l0.3,0.1l0.3,0.1l0.3,0.1l0.3,0.1l0.3,0.1l0.3,0.1l0.3,0.2
1805
+ l0.3,0.2l0.3,0.2l0.3,0.2l0.3,0.2l0.2,0.2l0.2,0.3l0.2,0.3l0.2,0.3l0.2,0.3l0.2,0.3l0.1,0.3l0.1,0.3l0.1,0.3l0.1,0.3l0.1,0.3
1806
+ l0.1,0.3v0.3l0,0v0.3v0.3v0.3v0.3l0,0v0.2v0.2l-0.1,0.2l-0.1,0.3l-0.1,0.4l-0.2,0.4l-0.3,0.9l-0.4,0.9l-0.4,0.9l-0.3,0.8
1807
+ l-0.1,0.3l-0.1,0.2l-0.2,1.4l-0.1,0.9l-0.1,0.9l-0.1,1l-0.1,1l-0.1,0.5l-0.1,0.5v0.5v0.5v0.5v0.5v0.5v0.5v0.4v0.4v0.4v0.4v0.4
1808
+ v0.3v0.3v0.3v0.3l0.1,0.2v0.1v0.1v0.1v0.1l0.4,1.1l0.4,1.2l0.5,1.3l0.2,0.7l0.3,0.7l0.3,0.7l0.3,0.7l0.3,0.7l0.3,0.7l0.3,0.7
1809
+ l0.3,0.7l0.3,0.7l0.3,0.7l0.3,0.7l0.3,0.7l0.3,0.7l0.4,0.7l0.4,0.7l0.4,0.7l0.4,0.7l0.4,0.7l0.4,0.7l0.4,0.7l0.4,0.7l0.4,0.7
1810
+ l0.4,0.7l0.4,0.7l0.4,0.7l0.4,0.7l0.5,0.7l0.5,0.7l0.5,0.6l0.5,0.6l0.5,0.6l0.5,0.6l0.5,0.6l0.5,0.6l0.5,0.5l0.2,0.3l0.2,0.3
1811
+ l0.2,0.2l0.2,0.2l0.2,0.2l0.2,0.2l0.2,0.2l0.2,0.2l0.2,0.2l0.2,0.2l0.2,0.2l0.2,0.2l0.2,0.2l0.2,0.2l0.2,0.2l0.2,0.2l0.2,0.2
1812
+ l0.2,0.2l0.2,0.2l0.2,0.1l0.2,0.1l0.2,0.1l0.2,0.1l0.2,0.1l0.2,0.1l0.2,0.1l0.2,0.1l0.2,0.1l0.2,0.1l0.2,0.1l0.2,0.1l0.2,0.1
1813
+ l0.2,0.1l0.2,0.1l0.2,0.1l0.2,0.1l0.2,0.1h0.2h0.2h0.2h0.2h0.2h0.2h0.2h0.2h0.3h0.3h0.3h0.3l0.3,0.1l0.3,0.1l0.3,0.1l0.3,0.1
1814
+ l0.3,0.1l0.3,0.2l0.3,0.2l0.3,0.2l0.3,0.2l0.3,0.2l0.2,0.2l0.2,0.2l0.2,0.3l0.2,0.3l0.2,0.3l0.2,0.3l0.1,0.3l0.1,0.3l0.1,0.3
1815
+ l0.1,0.3l0.1,0.3l0.1,0.3v0.3v0.3v0.3v0.3v0.3l-0.1,0.3l-0.1,0.3l-0.1,0.3l-0.1,0.3l-0.1,0.3l-0.2,0.3l-0.2,0.3l-0.2,0.3
1816
+ l-0.2,0.3l-0.2,0.3l-0.2,0.2l-0.2,0.2l-0.3,0.2l-0.3,0.2l-0.3,0.2l-0.3,0.2l-0.3,0.2l-0.3,0.1l-0.3,0.1l-0.3,0.1l-0.3,0.1
1817
+ l-0.3,0.1h-0.3h-0.3h1.6h-0.4h-0.5h-0.5h-0.5l-0.5-0.1l-0.5-0.1l-0.5-0.1l-0.5-0.1l-0.5-0.1l-0.5-0.1l-0.5-0.1l-0.5-0.1l-0.5-0.1
1818
+ l-0.5-0.2l-0.5-0.2l-0.5-0.2l-0.5-0.2l-0.4-0.2l-0.4-0.2l-0.4-0.2l-0.4-0.2l-0.4-0.2l-0.4-0.2l-0.4-0.2l-0.4-0.2l-0.4-0.2
1819
+ l-0.4-0.3l-0.4-0.3l-0.4-0.3l-0.4-0.3l-0.4-0.3l-0.4-0.3l-0.4-0.3l-0.4-0.3l-0.4-0.3l-0.4-0.3l-0.4-0.3l-0.4-0.3l-0.4-0.3
1820
+ l-0.3-0.3l-0.3-0.3l-0.3-0.3l-0.3-0.3l-0.3-0.3l-0.3-0.3l-0.3-0.4l-0.6-0.7l-0.6-0.7l-0.6-0.7l-0.6-0.8l-0.6-0.8l-0.6-0.8
1821
+ l-0.6-0.8l-0.6-0.8l-0.5-0.8l-0.5-0.8l-0.5-0.8l-0.5-0.8l-0.5-0.8l-0.5-0.8l-0.5-0.8l-0.5-0.8l-0.5-0.8l-0.4-0.8l-0.4-0.8
1822
+ l-0.4-0.8l-0.4-0.8l-0.4-0.8l-0.4-0.8l-0.4-0.8l-0.4-0.8l-0.4-0.8l-0.4-0.8l-0.3-0.8l-0.3-0.8l-0.3-0.8l-0.3-0.8l-0.3-0.8
1823
+ l-0.3-0.8l-0.3-0.7l-0.3-0.7l-0.5-1.4l-0.5-1.4l-0.4-1.3l-0.1-0.3l-0.1-0.3l-0.1-0.3l-0.1-0.4l-0.1-0.6l-0.1-0.7l-0.1-0.7
1824
+ l-0.1-0.7l-0.1-0.7v-0.6v-0.6v-0.6v-0.6v-0.6v-0.6v-0.6v-0.6v-0.6l0.1-0.6l0.1-0.6l0.1-0.6l0.1-0.6l0.1-1.1l0.1-1.1l0.2-1l0.2-1
1825
+ l0.3-1.8l0.1-0.3l0.1-0.4l0.1-0.5l0.2-0.5l0.2-0.5l0.4-1l0.4-1l0.3-0.9l0.3-0.7v-0.1v-0.2l0.1-0.3l0.1-0.3L-269.9,1186.4z
1826
+ M-270.5,1188.7v0.6v-0.3V1188.7l0.1-0.3v-0.1L-270.5,1188.7z M-270.4,1187.7L-270.4,1187.7L-270.4,1187.7L-270.4,1187.7z"
1827
+ />
1828
+ </g>
1829
+ <g transform="matrix(0.380231,0.924892,-0.924892,0.380231,1549.4,-185.872)">
1830
+ <path
1831
+ d="M-5,1240.4l0.2-0.3l0.2-0.3l0.2-0.3l0.2-0.3l0.3-0.3l0.3-0.3l0.3-0.2l0.3-0.2l0.3-0.2l0.3-0.2l0.3-0.2
1832
+ l0.3-0.1l0.4-0.1l0.4-0.1l0.4-0.1l0.4-0.1l0.3-0.1l0.4-0.1l0.3-0.1l0.3-0.1l0.3-0.2l0.3-0.2l0.3-0.2l0.3-0.2l0.3-0.2l0.3-0.2
1833
+ l0.3-0.2l0.3-0.2l0.3-0.2l0.3-0.2l0.3-0.2l0.3-0.2l0.3-0.2l0.3-0.2l0.3-0.2l0.3-0.2l0.3-0.2l0.3-0.2l0.3-0.3l0.3-0.3l0.3-0.3
1834
+ l0.3-0.3l0.3-0.3l0.3-0.3l0.3-0.3l0.3-0.3l0.3-0.3l0.3-0.3l0.3-0.3l0.3-0.3l0.3-0.3l0.3-0.3l0.3-0.3l0.3-0.3l0.3-0.3l0.3-0.3
1835
+ l0.3-0.4l0.3-0.4l0.3-0.4l0.3-0.4l0.3-0.4l0.3-0.4l0.3-0.4l0.3-0.4l0.3-0.4l0.3-0.4l0.3-0.4l0.3-0.4l0.3-0.4l0.3-0.4l0.3-0.4
1836
+ l0.2-0.4l0.2-0.4l0.2-0.4l0.2-0.4l0.2-0.4l0.2-0.4l0.5-0.9l0.4-0.9l0.4-0.9l0.4-0.9l0.4-0.9l0.4-0.9l0.4-0.9l0.4-0.9l0.4-0.9
1837
+ l0.3-0.9l0.3-0.9l0.3-0.9l0.3-0.9l0.3-0.9l0.3-0.9l0.3-1l0.2-0.9l0.2-0.9l0.2-0.9l0.2-0.9l0.2-0.9l0.2-0.9l0.2-0.9l0.1-0.9
1838
+ l0.1-0.9l0.1-0.9l0.1-0.9l0.1-0.9l0.1-0.9v-0.9v-0.9v-0.9v-0.4v-0.4l0.1-0.4l0.1-0.4l0.1-0.4l0.1-0.4l0.2-0.3l0.2-0.3l0.2-0.3
1839
+ l0.2-0.3l0.2-0.3l0.3-0.3l0.3-0.3l0.3-0.2l0.3-0.2l0.3-0.2l0.3-0.2l0.3-0.2l0.4-0.1l0.4-0.1l0.4-0.1l0.4-0.1h0.4h0.4h0.4h0.4
1840
+ l0.4,0.1l0.4,0.1l0.4,0.1l0.4,0.1l0.3,0.1l0.3,0.2l0.3,0.2l0.3,0.2l0.3,0.2l0.3,0.2l0.3,0.3l0.3,0.3l0.2,0.3l0.2,0.3l0.2,0.3
1841
+ l0.2,0.3l0.2,0.3l0.1,0.4l0.1,0.4l0.1,0.4l0.1,0.4v0.4v0.4v1v1.1v1.1l-0.1,1.1l-0.1,1.1l-0.1,1.1l-0.1,1.1l-0.1,1.1l-0.2,1.1
1842
+ l-0.2,1.1l-0.2,1.1l-0.2,1.1l-0.2,1.1l-0.2,1.1l-0.3,1.1l-0.3,1.1l-0.3,1.1l-0.3,1.1l-0.3,1.1l-0.4,1.1l-0.4,1.1l-0.4,1.1
1843
+ l-0.4,1.1l-0.4,1.1l-0.4,1.1l-0.4,1.1l-0.5,1.1l-0.5,1.1l-0.5,1.1l-0.5,1l-0.5,1l-0.5,1l-0.3,0.5l-0.3,0.5l-0.3,0.5l-0.3,0.5
1844
+ l-0.3,0.5l-0.3,0.5l-0.3,0.5l-0.3,0.5l-0.3,0.5l-0.3,0.5l-0.3,0.5l-0.3,0.5l-0.3,0.5l-0.3,0.5l-0.3,0.5l-0.3,0.5l-0.3,0.5
1845
+ l-0.3,0.5l-0.4,0.5l-0.4,0.4l-0.4,0.4l-0.4,0.4l-0.4,0.4l-0.4,0.4l-0.4,0.4l-0.4,0.4l-0.4,0.4l-0.4,0.4l-0.4,0.4l-0.4,0.4
1846
+ l-0.4,0.4l-0.4,0.4l-0.4,0.4l-0.4,0.4l-0.4,0.4l-0.4,0.4l-0.4,0.4l-0.4,0.4l-0.4,0.4l-0.4,0.4l-0.4,0.3l-0.5,0.3l-0.5,0.3
1847
+ l-0.5,0.3l-0.5,0.3l-0.5,0.3l-0.5,0.3l-0.5,0.3l-0.5,0.3l-0.5,0.3l-0.5,0.3l-0.5,0.3l-0.5,0.3l-0.5,0.3l-0.5,0.2l-0.5,0.2
1848
+ l-0.5,0.2l-0.5,0.2l-0.5,0.2l-0.5,0.2l-0.5,0.2l-0.5,0.2l-0.5,0.2l-0.5,0.2l-0.4,0.1l-0.4,0.1l-0.4,0.1H0.8H0.4H0h-0.4l-0.4-0.1
1849
+ l-0.4-0.1l-0.4-0.1l-0.4-0.1l-0.3-0.2l-0.3-0.2l-0.3-0.2l-0.3-0.2l-0.3-0.2l-0.3-0.3l-0.3-0.3l-0.2-0.3l-0.2-0.3l-0.2-0.3
1850
+ l-0.2-0.3l-0.2-0.3l-0.1-0.3l-0.1-0.4l-0.1-0.4l-0.1-0.4v-0.4v-0.4v-0.4v-0.4l0.1-0.4l0.1-0.4l0.1-0.4l0.1-0.4L-5,1240.4z"
1851
+ />
1852
+ </g>
1853
+ <g transform="matrix(0.380231,0.924892,-0.924892,0.380231,1549.4,-185.872)">
1854
+ <path
1855
+ d="M-271.2,1188.2l0.2-0.4l0.2-0.4l0.1-0.2l0.3-0.4l0.3-0.4l0.4-0.5l0.4-0.5l0.4-0.5l0.4-0.5l0.3-0.3l0.3-0.3
1856
+ l0.3-0.3l0.3-0.3l0.3-0.3l0.3-0.2l0.3-0.2l0.3-0.2l0.3-0.2l0.3-0.2l0.3-0.2l0.3-0.2l0.6-0.3l0.6-0.3l0.7-0.3l0.6-0.3l0.6-0.3
1857
+ l0.6-0.2l0.6-0.2l0.6-0.2l0.6-0.2l0.6-0.2l0.4-0.1l0.4-0.1l0.5-0.1h0.5h0.5h0.4h0.4h0.4h0.4h0.4h0.4h0.4l0.4,0.1l0.4,0.1l0.4,0.1
1858
+ l0.4,0.1l0.8,0.2l0.8,0.2l0.8,0.2l0.8,0.2l0.8,0.2l0.8,0.2l0.8,0.3l0.8,0.3l0.8,0.3l0.8,0.3l0.8,0.3l0.8,0.3l0.8,0.3l0.8,0.3
1859
+ l0.8,0.3l1.5,0.6l1.4,0.5l1.3,0.5l1.1,0.5l1,0.4l1.1,0.4l1,0.4l1.1,0.4l1,0.4l1,0.4l1.1,0.4l1.1,0.4l1.1,0.4l1.1,0.4l1.1,0.4
1860
+ l1.1,0.4l1.1,0.4l1.1,0.4l1.1,0.4l1.1,0.4l1.1,0.3l1.1,0.3l1.1,0.3l1.1,0.3l1.1,0.3l1.1,0.3l1.1,0.3l1.1,0.3l1.1,0.3l1.1,0.3
1861
+ l1.1,0.3l1.1,0.3l1.1,0.3l1.1,0.3l1.1,0.3l1.1,0.2l1.1,0.2l1.1,0.2l1.1,0.2l1.1,0.2l1.1,0.2l1.1,0.2l1.1,0.2l1.1,0.2l1.1,0.2
1862
+ l1.1,0.2l1.1,0.2l1.1,0.2l1.1,0.2l1.1,0.2l1.1,0.1l1.1,0.1l1.1,0.1l1.1,0.1l1.1,0.1l1.1,0.1l1.1,0.1l1.1,0.1l1.1,0.1l1.1,0.1
1863
+ l1.1,0.1l1.1,0.1l1.1,0.1h1.1h1.1h1.1h1.1h1.1h1.1h1.6h1.6h1.6h1.6h1.6l1.6,0.1l1.6,0.1l1.6,0.1l1.6,0.1l1.6,0.1l1.6,0.1l1.6,0.1
1864
+ l1.6,0.1l1.6,0.1l1.6,0.1l1.6,0.1l1.6,0.1l1.6,0.1l3.2,0.3l3.2,0.3l3.2,0.3l6.5,0.6l3.2,0.3l3.2,0.3l3.2,0.3l3.2,0.3l3.2,0.3
1865
+ l1.6,0.1l1.6,0.1l1.6,0.1l1.6,0.1l1.6,0.1l1.6,0.1l1.6,0.1l1.6,0.1l1.6,0.1l1.6,0.1l1.6,0.1l1.6,0.1l1.6,0.1h1.6h1.6h1.6h1.6h1.6
1866
+ h1.6h1.6h1.6h1.6l1.6-0.1l1.6-0.1l1.6-0.1l1.6-0.1l0.9-0.1l0.9-0.1l0.9-0.1l0.9-0.1l0.9-0.1l0.9-0.1l0.9-0.1l0.9-0.1l0.9-0.1
1867
+ l0.9-0.1l0.9-0.2l0.9-0.2l0.9-0.2l0.9-0.2l0.9-0.2l0.9-0.2l0.9-0.2l0.9-0.2l0.9-0.2l0.9-0.2l0.9-0.2l0.9-0.2l0.9-0.2l0.9-0.3
1868
+ l0.9-0.3l0.9-0.3l0.9-0.3l0.9-0.3l0.9-0.3l0.9-0.3l0.9-0.3l0.9-0.3l0.9-0.3l0.9-0.3l0.9-0.3l0.9-0.3l1.8-0.7l1.8-0.7l1.8-0.7
1869
+ l1.8-0.7l1.8-0.7l1.8-0.7l1.8-0.7l1.8-0.7l1.8-0.7l1.8-0.7l3.5-1.5l3.5-1.5l0.5-0.2l0.5-0.2l0.5-0.3l0.5-0.3l0.5-0.3l0.5-0.3
1870
+ l0.5-0.3l0.5-0.3l0.5-0.3l0.5-0.3l1.1-0.7l1.1-0.7l1.2-0.7l1.2-0.7l0.6-0.4l0.6-0.4l0.6-0.4l0.7-0.4l0.7-0.4l0.7-0.4l0.7-0.4
1871
+ l0.7-0.4l0.7-0.3l0.7-0.3l0.7-0.3l0.8-0.3l0.8-0.3l0.4-0.1l0.4-0.1l0.5-0.1l0.5-0.1l0.5-0.1l0.5-0.1l0.5-0.1h0.5h0.5h0.5l0.5,0.1
1872
+ l0.5,0.1l0.5,0.1l0.5,0.1l0.5,0.2l0.5,0.2l0.4,0.2l0.4,0.2l0.4,0.2l0.4,0.2l0.3,0.3l0.3,0.3l0.3,0.3l0.3,0.3l0.3,0.3l0.2,0.3
1873
+ l0.2,0.2l0.2,0.3l0.4,0.4l0.3,0.4l0.3,0.4l0.5,0.7l0.2,0.3l0.2,0.2v0.1l0.5,0.1l0.7,0.3l0.7,0.4l0.6,0.4l0.6,0.5l0.5,0.6l0.4,0.7
1874
+ l0.3,0.7l0.2,0.7l0.1,0.8v0.8l-0.1,0.8l-0.2,0.8l-0.3,0.7l-0.4,0.7l-0.4,0.6l-0.5,0.6l-0.6,0.5l-0.7,0.4l-0.7,0.3l-0.7,0.2
1875
+ l-0.8,0.1h-0.8h-0.4h-0.5l-0.5-0.1l-0.5-0.1l-0.5-0.1l-0.5-0.2l-0.5-0.2l-0.5-0.2l-0.4-0.2l-0.4-0.2l-0.4-0.2l-0.4-0.3l-0.3-0.3
1876
+ l-0.3-0.3l-0.3-0.3l-0.3-0.3l-0.3-0.3l-0.2-0.3l-0.2-0.3l-0.2-0.3l-0.3-0.4l-0.3-0.4l-0.3-0.4l-0.2-0.4l-0.2-0.3l-0.3,0.1
1877
+ l-0.5,0.2l-0.5,0.2l-0.5,0.2l-0.5,0.3l-0.5,0.3l-0.5,0.3l-0.5,0.3l-0.5,0.3l-0.5,0.3l-0.5,0.3l-0.5,0.3l-1.1,0.7l-1.2,0.7
1878
+ l-1.2,0.8l-1.2,0.8l-0.6,0.4l-0.6,0.4l-0.7,0.4l-0.7,0.4l-0.7,0.4l-0.7,0.4l-0.7,0.4l-0.7,0.3l-0.7,0.3l-0.7,0.3l-3.6,1.5
1879
+ l-3.6,1.5l-1.8,0.8l-1.8,0.8l-1.8,0.8l-1.8,0.8l-1.8,0.7l-1.9,0.7l-1.9,0.7l-1.9,0.7l-1.9,0.7l-1.9,0.7l-1,0.3l-1,0.3l-1,0.3
1880
+ l-1,0.3l-1,0.3l-1,0.3l-1,0.3l-1,0.3l-1,0.3l-1,0.3l-1,0.3l-1,0.3l-1,0.3l-1,0.3l-1,0.3l-1,0.3l-1,0.2l-1,0.2l-1,0.2l-1,0.2
1881
+ l-1,0.2l-1,0.2l-1,0.2l-1,0.2l-1,0.2l-1,0.2l-1,0.2l-1,0.2l-1,0.1l-1,0.1l-1,0.1l-1,0.1l-1,0.1l-1,0.1l-1,0.1l-1,0.1l-1.7,0.1
1882
+ l-1.7,0.1l-1.7,0.1l-1.7,0.1h-1.7h-1.7h-1.7h-1.7h-1.7h-1.7H-80h-1.6h-1.6l-1.6-0.1l-1.6-0.1l-1.6-0.1l-1.6-0.1l-1.6-0.1
1883
+ l-1.6-0.1l-1.6-0.1l-1.6-0.1l-1.6-0.1l-1.6-0.1l-1.6-0.1l-1.6-0.1l-1.6-0.1l-3.3-0.3l-3.3-0.3l-3.3-0.3l-3.2-0.3l-3.2-0.3
1884
+ l-6.5-0.6l-3.2-0.3l-3.2-0.3l-3.2-0.3l-1.6-0.1l-1.6-0.1l-1.6-0.1l-1.6-0.1l-1.6-0.1l-1.6-0.1l-1.6-0.1l-1.6-0.1l-1.6-0.1
1885
+ l-1.6-0.1l-1.6-0.1l-1.6-0.1l-1.6-0.1h-1.6h-1.6h-1.6h-1.6h-1.6h-1.2h-1.2h-1.2h-1.2h-1.2h-1.2l-1.2-0.1l-1.2-0.1l-1.2-0.1
1886
+ l-1.2-0.1l-1.2-0.1l-1.2-0.1l-1.2-0.1l-1.2-0.1l-1.2-0.1l-1.2-0.1l-1.2-0.1l-1.2-0.1l-1.2-0.2l-1.2-0.2l-1.2-0.2l-1.2-0.2
1887
+ l-1.2-0.2l-1.2-0.2l-1.2-0.2l-1.2-0.2l-1.2-0.2l-1.2-0.2l-1.2-0.2l-1.2-0.2l-1.2-0.2l-1.2-0.3l-1.1-0.3l-1.1-0.3l-1.1-0.3
1888
+ l-1.1-0.3l-1.1-0.3l-1.1-0.3l-1.1-0.3l-1.1-0.3l-1.1-0.3l-1.1-0.3l-1.1-0.3l-1.1-0.3l-1.1-0.3l-1.1-0.3l-1.1-0.4l-1.1-0.4
1889
+ l-1.1-0.4l-1.1-0.4l-1.1-0.4l-1.1-0.4l-1.1-0.4l-1.1-0.4l-1.1-0.4l-1.1-0.4l-1.1-0.4l-1.1-0.4l-1.1-0.4l-1.1-0.4l-1.1-0.4
1890
+ l-1.1-0.4l-1.1-0.4l-1.1-0.4l-0.9-0.4l-1.1-0.4l-1.2-0.5l-1.3-0.5l-1.4-0.5l-0.7-0.3l-0.7-0.3l-0.7-0.3l-0.7-0.3l-0.7-0.3
1891
+ l-0.7-0.2l-0.7-0.2l-0.7-0.2l-0.7-0.2l-0.7-0.2l-0.7-0.2l-0.6-0.2l-0.6-0.1l-0.6-0.1l-0.6-0.1h-0.2h-0.2h-0.2h-0.2h-0.2h-0.2
1892
+ h-0.2h-0.1h-0.1h-0.1h-0.1h-0.1l0,0l0,0l0,0l-0.2,0.1l-0.3,0.1l-0.3,0.1l-0.4,0.1l-0.4,0.1l-0.4,0.2l-0.4,0.2l-0.4,0.2l-0.4,0.2
1893
+ l-0.4,0.2l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l0,0l-0.1,0.1l-0.3,0.4l-0.3,0.4l-0.3,0.4l-0.2,0.3v0.1l0.1-0.1l-0.4,0.6l-0.5,0.6
1894
+ l-0.6,0.5l-0.6,0.4l-0.7,0.3l-0.7,0.2l-0.8,0.1h-0.8l0,0l-0.8-0.1l-0.8-0.2l-0.7-0.3l-0.7-0.4l-0.6-0.4l-0.6-0.5l-0.5-0.6
1895
+ l-0.4-0.7l-0.3-0.7l-0.2-0.7l-0.1-0.8v-0.8l0.1-0.8l0.2-0.8L-271.2,1188.2L-271.2,1188.2z M-260.6,1193.4l0.2-0.4l0,0
1896
+ L-260.6,1193.4L-260.6,1193.4z"
1897
+ />
1898
+ </g>
1899
+ <g transform="matrix(0.380231,0.924892,-0.924892,0.380231,1549.4,-185.872)">
1900
+ <path
1901
+ d="M-265.5,1181.6l0.4-0.7l0.5-0.6l0.6-0.5l0.4-0.3l0.4-0.4l0.4-0.3l0.4-0.3l0.5-0.3l0.5-0.3l0.5-0.3l0.5-0.3
1902
+ l0.5-0.3l0.5-0.3l0.5-0.3l0.5-0.2l0.5-0.2l0.5-0.2l0.5-0.2l0.5-0.2l0.5-0.2l0.5-0.2l0.5-0.2l0.5-0.2l0.5-0.2l0.5-0.2l0.5-0.2
1903
+ l0.5-0.1l0.5-0.1l0.5-0.1l0.9-0.3l0.9-0.2l0.9-0.2l0.9-0.2l0.9-0.2l0.9-0.2l0.9-0.2l1.8-0.3l1.7-0.3l0.8-0.2l0.8-0.2l0.8-0.2
1904
+ l0.8-0.2l0.8-0.2l0.7-0.2l0.7-0.2l0.7-0.2l1.3-0.4l1.3-0.4l1.3-0.4l1.3-0.4l1.3-0.3l1.3-0.3l1.3-0.3l1.3-0.3l1.3-0.3l1.3-0.3
1905
+ l1.3-0.3l1.3-0.3l1.3-0.3l1.3-0.3l1.3-0.3l1.3-0.3l1.3-0.2l1.3-0.2l1.3-0.2l1.3-0.2l1.3-0.2l1.3-0.2l1.3-0.2l1.3-0.2l1.3-0.2
1906
+ l1.4-0.2l1.4-0.1l1.4-0.1l1.4-0.1l1.4-0.1l1.4-0.1l1.4-0.1l5.1-0.3l5.1-0.3l5.2-0.3l5.2-0.3l10.4-0.7l5.2-0.3l5.2-0.3l5.2-0.3
1907
+ l5.2-0.3l5.2-0.3l5.2-0.3l5.2-0.3l2.6-0.1l2.6-0.1l2.6-0.1l2.6-0.1l2.6-0.1l2.6-0.1l2.6-0.1l2.6-0.1l2.6-0.1l2.6-0.1l2.6-0.1
1908
+ l2.6-0.1l2.6-0.1l2.6-0.1h2.6h2.6h2.6h2.6h2.6h2.6h2.6h2.6h2.6h2.6l2.6,0.1l2.6,0.1l2.6,0.1l2.6,0.1l2.6,0.1l2.6,0.1l2.6,0.1
1909
+ l2.6,0.1l2.6,0.2l2.6,0.2l2.6,0.2l2.6,0.2l2.6,0.2l2.6,0.2l3.2,0.3l3.2,0.3l1.7,0.1l1.7,0.2l1.7,0.2l1.7,0.2l1.7,0.2l1.7,0.2
1910
+ l0.9,0.1l0.9,0.1l0.9,0.1l0.9,0.1l0.9,0.1l0.9,0.1l0.9,0.2l0.9,0.2l0.9,0.2l0.9,0.2l0.9,0.2l0.9,0.2l0.9,0.2l0.9,0.2l0.9,0.2
1911
+ l0.9,0.2l0.9,0.2l0.9,0.3l0.9,0.3l0.9,0.3l0.9,0.3l0.9,0.3l0.9,0.3l0.8,0.3l0.8,0.3l0.8,0.4l0.8,0.4l0.8,0.4l0.8,0.4l0.8,0.4
1912
+ l0.8,0.4l0.8,0.4l0.8,0.5l0.8,0.5l0.8,0.5l0.8,0.5l0.8,0.5l0.4,0.3l0.4,0.3l0.4,0.3l0.4,0.3l0.4,0.3l0.4,0.3l0.4,0.3l0.4,0.3
1913
+ l0.4,0.3l0.4,0.3l0.3,0.3l0.3,0.3l0.3,0.3l0.3,0.3l0.5,0.6l0.4,0.6l0.3,0.7l0.3,0.7l0.2,0.8l0.1,0.8v0.8l-0.1,0.8l-0.2,0.7
1914
+ l-0.3,0.7l-0.4,0.6l-0.5,0.6l-0.6,0.5l-0.6,0.4l-0.7,0.3l-0.7,0.3l-0.8,0.2l-0.8,0.1H22l-0.8-0.1l-0.7-0.2l-0.7-0.3l-0.6-0.4
1915
+ l-0.6-0.5l-0.3-0.3l-0.2-0.2l-0.2-0.2l-0.2-0.2l-0.2-0.2l-0.3-0.2l-0.3-0.2l-0.3-0.2l-0.3-0.2l-0.3-0.2l-0.3-0.2l-0.3-0.2
1916
+ l-0.3-0.2l-0.3-0.2l-0.6-0.4l-0.6-0.4l-0.6-0.4l-0.6-0.4l-0.6-0.3l-0.6-0.3l-0.6-0.3l-0.6-0.3l-0.6-0.3l-0.6-0.3l-0.7-0.3
1917
+ l-0.7-0.3l-0.7-0.3l-0.7-0.3l-0.7-0.2l-0.7-0.2l-0.7-0.2l-0.7-0.2l-0.7-0.2l-0.7-0.2l-0.7-0.2l-0.7-0.2l-0.7-0.2l-0.7-0.2
1918
+ l-0.8-0.2l-0.8-0.2l-0.8-0.2l-0.8-0.2l-0.8-0.1l-0.8-0.1l-0.8-0.1l-0.8-0.1l-0.8-0.1L-9,1173l-0.8-0.1l-0.8-0.1l-0.8-0.1
1919
+ l-1.6-0.2l-1.6-0.2l-1.6-0.2l-1.6-0.2l-1.6-0.2l-1.6-0.1l-3.2-0.3l-3.2-0.3l-2.6-0.2l-2.5-0.2l-2.5-0.2l-2.5-0.2l-2.6-0.2
1920
+ l-2.6-0.2l-2.6-0.1l-2.6-0.1l-2.6-0.1l-2.6-0.1l-2.6-0.1l-2.6-0.1l-2.6-0.1l-2.6-0.1h-2.6h-2.6h-2.6h-2.6h-2.6h-2.6h-2.6h-2.6
1921
+ h-2.6h-2.6l-2.6,0.1l-2.6,0.1l-2.6,0.1l-2.6,0.1l-2.6,0.1l-2.6,0.1l-2.6,0.1l-2.6,0.1l-2.6,0.1l-2.6,0.1l-2.6,0.1l-2.6,0.1
1922
+ l-2.6,0.1l-2.6,0.1l-5.2,0.3l-5.2,0.3l-5.2,0.3l-5.2,0.3l-5.2,0.3l-5.2,0.3l-5.2,0.3l-10.4,0.7l-5.2,0.3l-5.2,0.3l-5.2,0.3
1923
+ l-5.1,0.3l-1.3,0.1l-1.3,0.1l-1.3,0.1l-1.3,0.1l-1.3,0.1l-1.3,0.1l-1.3,0.1l-1.2,0.2l-1.2,0.2l-1.2,0.2l-1.2,0.2l-1.2,0.2
1924
+ l-1.2,0.2l-1.2,0.2l-1.2,0.2l-1.2,0.2l-1.2,0.2l-1.2,0.2l-1.2,0.3l-1.2,0.3l-1.2,0.3l-1.2,0.3l-1.2,0.3l-1.2,0.3l-1.2,0.3
1925
+ l-1.2,0.3l-1.2,0.3l-1.3,0.3l-1.3,0.3l-1.3,0.4l-1.3,0.4l-1.3,0.4l-0.9,0.2l-0.9,0.2l-0.9,0.2l-0.9,0.2l-0.9,0.2l-0.9,0.2
1926
+ l-0.9,0.2l-0.9,0.2l-1.7,0.3l-1.7,0.3l-0.8,0.2l-0.8,0.2l-0.8,0.2l-0.8,0.2l-0.8,0.2l-0.8,0.2l-0.8,0.2l-0.4,0.1l-0.4,0.1
1927
+ l-0.4,0.1l-0.3,0.1l-0.3,0.1l-0.3,0.1l-0.3,0.1l-0.3,0.1l-0.3,0.1l-0.3,0.1l-0.3,0.1l-0.3,0.1l-0.3,0.1l-0.3,0.1l-0.3,0.1
1928
+ l-0.3,0.1l-0.3,0.2l-0.3,0.2l-0.3,0.2l-0.3,0.2l-0.3,0.2l-0.2,0.2l-0.2,0.2l-0.2,0.2l-0.2,0.2l-0.3,0.2l-0.6,0.5l-0.7,0.4
1929
+ l-0.7,0.3l-0.8,0.2l-0.8,0.1h-0.8l-0.8-0.1l-0.7-0.2l-0.7-0.3l-0.7-0.4l-0.6-0.5l-0.5-0.6l-0.5-0.6l-0.4-0.7l-0.3-0.7l-0.2-0.8
1930
+ l-0.1-0.8v-0.8l0.1-0.8l0.2-0.7L-265.5,1181.6z"
1931
+ />
1932
+ </g>
1933
+ <g transform="matrix(0.380231,0.924892,-0.924892,0.380231,1549.4,-185.872)">
1934
+ <path
1935
+ d="M-231.8,1244l0.4-0.6l0.4-0.5l0.5-0.5l0.5-0.4l0.6-0.4l0,0l0.5-0.2l0.5-0.2l0.6-0.1l0.6-0.1l0,0h0.5h0.5h0.3
1936
+ l0.5,0.1l0.5,0.1l0.4,0.1l0.4,0.1l0.4,0.1l0.8,0.3l0.9,0.3l1,0.4l2.1,0.8l2.2,0.9l1.1,0.4l1,0.4l0.9,0.3l0.4,0.1l0.4,0.1l0.3,0.1
1937
+ l0.2,0.1h0.2h0.1l1.5,0.3l1.6,0.4l1.5,0.4l1.5,0.4l1.5,0.4l1.5,0.4l6.1,1.6l1.5,0.4l1.5,0.4l1.5,0.4l1.5,0.4l1.5,0.4l1.5,0.3
1938
+ l1.5,0.3l1.5,0.3l1.5,0.3l0.7,0.1l0.7,0.1l0.7,0.1l0.7,0.1l0.7,0.1l0.7,0.1l0.7,0.1l0.7,0.1l0.7,0.1l0.7,0.1l0.7,0.1l0.7,0.1
1939
+ l0.7,0.1l0.7,0.1l0.7,0.1h0.7h0.7h0.7h0.7h0.7h0.7h0.7h0.7h0.7h0.7h0.7l1.6-0.1l1.6-0.1h1.6h1.6h1.6h1.6h1.6h1.6h1.6h1.6h1.6h1.6
1940
+ l1.6,0.1l1.6,0.1l1.6,0.1l1.6,0.1l1.6,0.1l1.6,0.1l1.6,0.1l1.6,0.1l3.2,0.2l3.2,0.2l3.2,0.2l3.2,0.2l3.2,0.2l3.2,0.2l3.2,0.2
1941
+ l3.2,0.2l3.2,0.2l1.6,0.1l1.6,0.1l1.6,0.1l1.6,0.1l1.6,0.1l1.6,0.1h1.6h1.6h1.6h1.6h1.6h1.6h1.6h1.6h1.6h1.6l1.6-0.1l1.5-0.1
1942
+ l1.5-0.1l1.5-0.1l1.5-0.1l1.5-0.1l1.5-0.1l1.5-0.2l1.5-0.2l1.5-0.2l1.2-0.1l1.2-0.2l1.2-0.2l1.2-0.2l1.2-0.2l1.2-0.2l1.1-0.2
1943
+ l1.1-0.2l1.1-0.2l1.1-0.2l1.1-0.2l1.1-0.2l1.1-0.2l1.1-0.3l1.1-0.3l1.1-0.3l1.1-0.3l1.1-0.3l1.1-0.3l1.1-0.3l1.1-0.3l1.1-0.3
1944
+ l1.1-0.3l1.1-0.3l1.1-0.3l1.1-0.3l1.1-0.3l1.1-0.3l1.1-0.3l1.1-0.4l1.1-0.4l1.1-0.4l1.1-0.4l1.1-0.4l1-0.4l1-0.4l1-0.4l1-0.4
1945
+ l1-0.4l1-0.4l1-0.4l1-0.4l1-0.4l1-0.4l1-0.4l1-0.4l1-0.4l1-0.5l1-0.5l1-0.5l2.1-0.9l2.1-1l2.1-1l2.1-1l2.1-1l2.1-1L5,1233
1946
+ l0.6-0.3l0.7-0.2l0.7-0.1h0.7h0.7l0.7,0.1l0.7,0.2l0.6,0.3l0.6,0.3l0.5,0.4l0.5,0.5l0.4,0.5l0.4,0.6l0.3,0.6l0.2,0.6l0.2,0.7
1947
+ l0.1,0.7v0.7l-0.1,0.7l-0.2,0.7l-0.2,0.6l-0.3,0.6l-0.4,0.6l-0.4,0.5l-0.5,0.5l-0.6,0.4l-0.6,0.3l-2.2,1.1l-2.2,1.1l-2.2,1
1948
+ l-2.2,1l-2.2,1l-2.2,1l-2.2,1l-1.1,0.5l-1.1,0.5l-1.1,0.5l-1.1,0.5l-1.1,0.5l-1.1,0.5l-1.1,0.5l-1.1,0.4l-1.1,0.4l-1.1,0.4
1949
+ l-1.1,0.4l-1.1,0.4l-1.1,0.4l-1.1,0.4l-1.1,0.4l-1.1,0.4l-1.1,0.4l-1.1,0.4l-1.1,0.4l-1.1,0.4l-1.1,0.4l-1.1,0.4l-1.1,0.4
1950
+ l-1.1,0.4l-1.1,0.4l-1.1,0.3l-1.1,0.3l-1.1,0.3l-1.2,0.3l-1.2,0.3l-1.2,0.3l-1.2,0.3l-1.2,0.3l-1.2,0.3l-1.2,0.3l-1.2,0.3
1951
+ l-1.2,0.3l-1.2,0.3l-1.2,0.2l-1.2,0.2l-1.2,0.2l-1.2,0.2l-1.2,0.2l-1.2,0.2l-1.2,0.2l-1.2,0.2l-1.2,0.2l-1.3,0.2l-1.3,0.2
1952
+ l-1.3,0.2l-1.6,0.2l-1.7,0.2l-1.6,0.2l-1.7,0.1l-1.6,0.1l-1.7,0.1l-1.6,0.1l-1.6,0.1l-1.6,0.1l-1.6,0.1h-1.6h-1.6h-1.6h-1.6h-1.6
1953
+ h-1.6h-1.6h-1.6h-1.6h-1.6l-1.6-0.1l-1.6-0.1l-1.6-0.1l-1.6-0.1l-1.6-0.1l-1.6-0.1l-3.2-0.2l-3.2-0.2l-3.2-0.2l-3.2-0.2l-3.2-0.2
1954
+ l-3.2-0.2l-3.2-0.2l-3.2-0.2l-3.2-0.2l-1.6-0.1l-1.6-0.1l-1.6-0.1l-1.6-0.1l-1.6-0.1l-1.6-0.1l-1.6-0.1h-1.6h-1.6h-1.6h-1.6h-1.6
1955
+ h-1.6h-1.6h-1.6h-1.5h-1.5h-1.5l-1.5,0.1l-1.6,0.1h-0.8h-0.9h-0.9h-0.9h-0.9h-0.9h-0.8h-0.8h-0.9l-0.8-0.1l-0.8-0.1l-0.8-0.1
1956
+ l-0.8-0.1l-0.8-0.1l-0.8-0.1l-0.8-0.1l-0.8-0.1l-0.8-0.1l-0.8-0.1l-0.8-0.1l-0.8-0.1l-0.8-0.1l-0.8-0.1l-0.8-0.1l-0.8-0.1
1957
+ l-0.8-0.2l-1.6-0.3l-1.6-0.3l-1.6-0.4l-1.6-0.4l-1.6-0.4l-1.6-0.4l-1.6-0.4l-1.6-0.4l-1.5-0.4l-3.1-0.8l-3-0.8l-1.5-0.4l-1.5-0.4
1958
+ l-1.5-0.4l-1.5-0.4l-1.5-0.3l-1.5-0.3l-0.4-0.1l-0.5-0.1l-0.5-0.1l-0.5-0.2l-0.5-0.2l-0.5-0.2l-1-0.4l-1.1-0.4l-1.1-0.4l-2.3-0.9
1959
+ l-2.1-0.8l-0.9-0.4l-0.8-0.3l-0.6-0.2h-0.1h-0.1l-0.7-0.2l-0.6-0.3l-0.6-0.3l-0.6-0.4l-0.5-0.5l-0.5-0.5l-0.4-0.6l-0.3-0.6
1960
+ l-0.3-0.6l-0.2-0.7l-0.1-0.7v-0.7l0.1-0.7l0.1-0.7l0.2-0.7L-231.8,1244z M-226.5,1252.7l0.5-0.1l0,0L-226.5,1252.7h-0.3H-226.5z"
1961
+ />
1962
+ </g>
1963
+ <g transform="matrix(0.380231,0.924892,-0.924892,0.380231,1549.4,-185.872)">
1964
+ <path
1965
+ d="M-196.9,1287.6l0.2-0.3l0.2-0.2l0.2-0.2l0.2-0.2l0.2-0.2l0.2-0.2l0.2-0.1l0.2-0.1l0.2-0.1l0.2-0.1l0,0
1966
+ l0.2-0.1h0.3l0,0h0.3h0.3h0.3l0,0h0.3l0.3,0.1l0.2,0.1h0.1l0.1-0.2l0.2-0.2l0.2-0.2l0.2-0.2l0.2-0.1l0.3-0.2l0.3-0.1l0.3-0.1
1967
+ l0.3-0.1l0.3-0.1l0.3-0.1l0.3-0.1l0.3-0.1l0.3-0.1l0.3-0.1h0.3h0.3h0.3h0.3h0.3h0.3h0.3h0.3h0.3l0.3,0.1l0.3,0.1l0.3,0.1l0.3,0.1
1968
+ l0.2,0.1l0.2,0.1l0.2,0.1l0.2,0.1l0.2,0.1l0.2,0.1l0.2,0.1l0.2,0.1l0.4,0.3l0.4,0.3l0.4,0.3l0.4,0.3l0.4,0.3l0.4,0.4l0.4,0.4
1969
+ l0.4,0.4l0.3,0.4l0.3,0.4l0.3,0.4l0.3,0.4l0.3,0.4l0.3,0.4l0.3,0.4l0.3,0.4l0.3,0.5l0.3,0.5l0.3,0.5l0.3,0.5l0.3,0.5l0.3,0.5
1970
+ l0.3,0.5l0.3,0.5l0.2,0.5l0.2,0.5l0.2,0.5l0.2,0.5l0.2,0.5l0.2,0.5l0.4,0.9l0.4,0.9l0.4,0.9l0.3,0.8l0.3,0.8l0.3,0.8l0.2,0.7
1971
+ l0.2,0.7l0.2,0.6l0.2,0.8l0.2,0.8l0.2,0.8l0.2,0.8l0.1,0.8l0.1,0.8l0.1,0.8l0.1,0.8l0.1,0.8l0.1,0.8l0.1,0.8l0.1,0.8l0.1,0.8
1972
+ l0.1,0.8v0.8v0.8v0.8v0.8v0.8v0.8v0.8v0.8v0.8v0.8v0.8v0.8v0.8v0.8l-0.1,0.8l-0.1,0.8l-0.1,0.8l-0.1,0.8l-0.1,1.6l-0.2,1.6
1973
+ l-0.2,1.6l-0.2,1.6l-0.2,1.6l-0.2,1.6l-0.2,1.5l-0.2,1.5l-0.4,3.1l-0.4,3l-0.2,1.5l-0.2,1.5l-0.2,1.5l-0.2,1.5l-0.1,1.1l-0.1,1.2
1974
+ l-0.1,0.6l-0.1,0.6l-0.1,0.6l-0.1,0.6l-0.1,0.6l-0.1,0.6l-0.1,0.6l-0.1,0.6l-0.1,0.6l-0.2,0.6l-0.2,0.6l-0.2,0.6l-0.2,0.6
1975
+ l-0.2,0.6l-0.2,0.6l-0.2,0.6l-0.2,0.6l-0.3,0.6l-0.3,0.6l-0.2,0.3l-0.2,0.3l-0.2,0.3l-0.2,0.3l-0.2,0.3l-0.2,0.3l-0.2,0.3
1976
+ l-0.2,0.3l-0.2,0.3l-0.2,0.3l-0.2,0.3l-0.2,0.3l-0.2,0.3l-0.2,0.3l-0.2,0.3l-0.2,0.3l-0.2,0.3l-0.2,0.3l-0.2,0.2l-0.2,0.2
1977
+ l-0.2,0.2l-0.2,0.2l-0.2,0.2l-0.2,0.2l-0.2,0.1l-0.2,0.1l-0.3,0.1l-0.3,0.1l-0.3,0.1l-0.3,0.1l-0.3,0.1l-0.3,0.1l-0.3,0.1h-0.3
1978
+ h-0.3h-0.3h-0.3h-0.3h-0.3h-0.3h-0.3l-0.3-0.1l-0.3-0.1l-0.2-0.1l-0.2-0.1l-0.2-0.1l-0.2-0.1l-0.2-0.1l-0.2-0.1l-0.2-0.1
1979
+ l-0.2-0.1l-0.2-0.1l-0.4-0.2l-0.4-0.3l-0.4-0.3l-0.3-0.3l-0.3-0.3l-0.3-0.3l-0.3-0.3l-0.3-0.3l-0.3-0.4l-0.3-0.4l-0.3-0.4
1980
+ l-0.3-0.4l-0.3-0.4l-0.3-0.4l-0.3-0.4l-0.2-0.4l-0.2-0.4l-0.2-0.4l-0.2-0.4l-0.2-0.4l-0.2-0.4l-0.4-0.8l-0.4-0.8l-0.4-0.8
1981
+ l-0.4-0.8l-0.3-0.7l-0.3-0.7l-0.3-0.6l-0.5-1.1l-0.4-0.8l-0.1-0.3l-0.1-0.2l-0.3-0.7l-0.3-0.7l-0.3-0.7l-0.3-0.7l-0.3-0.7
1982
+ l-0.3-0.7l-0.3-0.7l-0.3-0.7l-0.2-0.8l-0.2-0.8l-0.2-0.8l-0.2-0.8l-0.2-0.8l-0.2-0.8l-0.2-0.8l-0.2-0.8l-0.2-0.8l-0.2-0.8
1983
+ l-0.1-0.8l-0.1-0.8l-0.1-0.8l-0.1-0.8l-0.1-0.8l-0.1-0.8l-0.1-0.8l-0.1-0.8l-0.1-0.8l-0.1-0.8l-0.1-0.8l-0.1-0.8l-0.1-0.8
1984
+ l-0.1-0.8v-0.8v-0.8v-0.8v-0.8l-0.1-1.6v-1.6v-1.6v-1.6v-1.6v-1.6v-1.6v-1.6v-3.1v-3.1v-1.5v-1.5v-0.5v-0.5v-0.5v-0.5l0.1-0.5
1985
+ l0.1-0.5l0.1-0.5l0.1-0.5l0.1-0.5l0.1-0.5l0.1-0.5l0.1-0.5l0.1-0.5l0.1-0.5l0.1-0.5l0.1-0.5l0.1-0.5l0.2-0.5l0.3-1l0.3-1l0.3-1
1986
+ l0.3-0.9l0.3-0.9l0.3-0.9l0.3-0.9l0.1-0.3l0.1-0.3l0.3-0.6l0.3-0.6l0.3-0.6l0.7-1.3l0.3-0.6l0.3-0.6v-0.1v-0.2v-0.3v-0.3v-0.3
1987
+ l0.1-0.3l0.1-0.3L-196.9,1287.6z M-194.5,1297.5l-0.3,0.9l-0.3,0.9l-0.3,0.9l-0.3,0.9l-0.3,0.9l-0.3,0.9l-0.1,0.4l-0.1,0.4
1988
+ l-0.1,0.5l-0.1,0.4l-0.1,0.4l-0.1,0.4l-0.1,0.4l-0.1,0.4l-0.1,0.4l-0.1,0.4l-0.1,0.4l-0.1,0.4l-0.1,0.4v0.4v0.4v0.4v0.4v0.4v1.5
1989
+ v1.5v3.1v3.1v1.6v1.6v1.6v1.6v1.6v1.6v1.6v1.6v0.8v0.8v0.8v0.8l0.1,0.8l0.1,0.8l0.1,0.8l0.1,0.8l0.1,0.8l0.1,0.8l0.1,0.8l0.1,0.8
1990
+ l0.1,0.7l0.1,0.7l0.1,0.7l0.1,0.7l0.1,0.7l0.1,0.7l0.1,0.7l0.1,0.7l0.2,0.7l0.2,0.7l0.2,0.7l0.2,0.7l0.2,0.7l0.2,0.7l0.2,0.7
1991
+ l0.2,0.7l0.2,0.7l0.2,0.6l0.2,0.6l0.3,0.6l0.3,0.6l0.3,0.6l0.3,0.6l0.3,0.7l0.1,0.3l0.2,0.4l0.4,0.9l0.5,1.1l0.3,0.6l0.3,0.6
1992
+ l0.3,0.7l0.3,0.7l0.3,0.7l0.4,0.7l0.4,0.7l0.2,0.3l0.2,0.3l0.2,0.3l0.2,0.3l0.2,0.3l0.2,0.3l0.2,0.3l0.2,0.3l0.2,0.3l0.2,0.3
1993
+ l0.2,0.3l0.2,0.3l0.2,0.2l0.2,0.2l0.2,0.2l0.2,0.2l0.2,0.2l0.2,0.2l0.2,0.1l0.2,0.1l0.2,0.1l0,0h0.1h0.1l0,0l0,0h0.1h0.1l0,0l0,0
1994
+ l0,0l0,0l0,0l0,0l0,0l0,0l0,0l0,0l0,0l0,0l0,0l0,0l0,0h0.1l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.2l0.1-0.2l0.1-0.2l0.1-0.2
1995
+ l0.1-0.2l0.1-0.2l0.1-0.2l0.1-0.2l0.1-0.2l0.1-0.2l0.1-0.2l0.1-0.2l0.1-0.2l0.1-0.2l0.1-0.2l0.1-0.2l0.1-0.2l0.1-0.2l0.2-0.5
1996
+ l0.2-0.5l0.2-0.5l0.2-0.5l0.2-0.5l0.2-0.5l0.2-0.5l0.1-0.5l0.1-0.5l0.1-0.5l0.1-0.6l0.1-0.6l0.1-0.6l0.1-0.6l0.1-0.6l0.1-0.6
1997
+ l0.1-0.6l0.1-0.6l0.1-0.5l0.1-1.1l0.1-1.1l0.2-1.5l0.2-1.5l0.2-1.5l0.2-1.5l0.4-3l0.4-3.1l0.2-1.5l0.2-1.5l0.2-1.5l0.2-1.5
1998
+ l0.2-1.5l0.2-1.5l0.1-1.5l0.1-1.5l0.1-0.8l0.1-0.8v-0.8v-0.8v-0.8v-0.8v-0.8v-0.8v-0.8v-0.8v-0.7v-0.8v-0.7v-0.7v-0.7v-0.7v-0.7
1999
+ v-0.7l-0.1-0.7l-0.1-0.7l-0.1-0.7l-0.1-0.7l-0.1-0.7l-0.1-0.7l-0.1-0.7l-0.1-0.7l-0.1-0.7l-0.1-0.7l-0.1-0.7l-0.1-0.7l-0.2-0.7
2000
+ l-0.2-0.7l-0.1-0.5l-0.2-0.5l-0.2-0.6l-0.2-0.7l-0.3-0.7l-0.3-0.8l-0.3-0.8l-0.3-0.8l-0.4-0.8l-0.2-0.4l-0.2-0.4l-0.2-0.4
2001
+ l-0.2-0.4l-0.2-0.4l-0.2-0.4l-0.2-0.4l-0.2-0.4l-0.2-0.4l-0.2-0.4l-0.2-0.4l-0.2-0.4l-0.2-0.4l-0.2-0.4l-0.2-0.4l-0.3-0.4
2002
+ l-0.2-0.4l-0.3-0.3l-0.3-0.3l-0.3-0.3l-0.3-0.3l-0.2-0.3l-0.2-0.3l-0.2-0.2l-0.2-0.2l-0.2-0.2l-0.2-0.2l-0.2-0.2l-0.2-0.2
2003
+ l-0.2-0.1h-0.1l-0.1-0.1h-0.1h-0.1h-0.1h-0.1h-0.1h-0.1h-0.1h-0.1h-0.1h-0.1h-0.1h-0.1h-0.1l0,0l0,0h-0.1l0,0l0,0l0,0l0,0h-0.1
2004
+ h-0.1h-0.1h-0.1h-0.1h-0.1h-0.1h-0.1h-0.1l-0.1,0.1l-0.3,0.1l-0.3,0.1l-0.3,0.1l-0.3,0.1h-0.3h-0.3h-0.3l-0.3-0.1l-0.2-0.1
2005
+ l-0.1,0.1l-0.1,0.3l-0.3,0.6l-0.3,0.6l-0.3,0.6l-0.3,0.6l-0.6,1.2l-0.3,0.6l-0.3,0.5l-0.2,0.5l-0.1,0.2l-0.1,0.2L-194.5,1297.5z"
2006
+ />
2007
+ </g>
2008
+ <g transform="matrix(0.380231,0.924892,-0.924892,0.380231,1549.4,-185.872)">
2009
+ <path
2010
+ d="M-181.5,1393.6L-181.5,1393.6l0.2-0.2l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1l0.2-0.2l0.2-0.2
2011
+ l0.2-0.2l0.2-0.1l0.2-0.1l0.2-0.1l0.2-0.1l0.2-0.1l0.2-0.1l0.2-0.1l0.2-0.1h0.2h0.2h0.2h0.3h0.4h0.5h0.4l0.4,0.1l0.4,0.1l0.4,0.1
2012
+ l0.4,0.1l0.4,0.1l0.4,0.1l0.4,0.2l0.4,0.2l0.4,0.2l0.4,0.2l0.4,0.2l0.4,0.2l0.3,0.2l0.3,0.3l0.3,0.3l0.3,0.3l0.3,0.3l0.3,0.3
2013
+ l0.2,0.2l0.1,0.2l0.1,0.2l0.1,0.2l0.1,0.2l0.1,0.2l0.1,0.4l0.1,0.3l0.1,0.3l0.1,0.4l0.1,0.4l0.1,0.4l0.1,0.4l0.1,0.4l0.1,0.4
2014
+ l0.1,0.4l0.1,0.4l0.1,0.4l0.1,0.4v0.4v0.4v0.4v0.4v0.4v0.4v0.4v0.4v0.4v0.4v0.4v0.4v0.4v0.4v0.4v0.4v0.4v0.4v0.4l-0.1,0.4
2015
+ l-0.1,0.4l-0.1,0.4l-0.1,0.4l-0.1,0.4l-0.1,0.4l-0.1,0.4l-0.1,0.4l-0.1,0.4l-0.1,0.4l-0.1,0.4l-0.1,0.4l-0.1,0.4l-0.1,0.4
2016
+ l-0.1,0.4l-0.1,0.4l-0.1,0.4l-0.1,0.4l-0.1,0.4l-0.2,0.4l-0.2,0.3l-0.2,0.3l-0.2,0.3l-0.2,0.3l-0.2,0.3l-0.2,0.3l-0.2,0.3
2017
+ l-0.2,0.3l-0.2,0.3l-0.2,0.3l-0.2,0.3l-0.3,0.3l-0.2,0.2l-0.2,0.2l-0.2,0.2l-0.3,0.2l-0.3,0.2l-0.3,0.2l-0.3,0.2l-0.3,0.1
2018
+ l-0.3,0.1l-0.3,0.1l-0.3,0.1l-0.3,0.1l-0.4,0.1h-0.4h-0.4h-0.4l-0.4-0.1l-0.4-0.1l-0.3-0.1l-0.3-0.1l-0.3-0.2l-0.3-0.2l-0.3-0.2
2019
+ l-0.2-0.2l-0.2-0.2l-0.2-0.2l-0.2-0.2l-0.2-0.2l-0.2-0.2l-0.2-0.2l-0.1-0.2l-0.1-0.2l-0.1-0.2l-0.1-0.2l-0.1-0.2l-0.1-0.3
2020
+ l-0.2-0.5l-0.2-0.5l-0.2-0.5l-0.2-0.5l-0.1-0.5l-0.1-0.6l-0.1-0.6l-0.1-0.6l-0.1-0.6l-0.1-0.6l-0.1-0.6l-0.1-0.6l-0.1-0.6
2021
+ l-0.1-0.6l-0.1-0.6v-0.6v-0.6v-0.6v-0.6v-0.6v-0.6v-0.6v-0.6v-0.6v-1.1v-1.1v-1l0.1-0.9v-0.4v-0.4v-0.4v-0.4l0.1-0.4l0.1-0.3
2022
+ l0.1-0.3l0.1-0.3l0.1-0.4l0.1-0.2l0.1-0.2l0.1-0.1l0,0l0.1-0.1l0.1-0.1l0,0l0.1-0.1l0.1-0.1l0,0l0,0l-0.1-0.2v-0.2v-0.2v-0.2
2023
+ v-0.2v-0.2v-0.2v-0.2v-0.2v-0.2v-0.2v-0.2l0.1-0.2L-181.5,1393.6z M-176.3,1397.1v0.2v0.2v0.2v0.2v0.2v0.2v0.2v0.2v0.2v0.2
2024
+ l-0.1,0.2l-0.1,0.2l-0.1,0.1l-0.1,0.1l-0.1,0.1l0,0v0.1v0.3v0.3v0.3v0.4l-0.1,0.8v0.9v0.9v1v0.5v0.5v0.5v0.5v0.5v0.6v0.5v0.5v0.5
2025
+ v0.5v0.5l0.1,0.5l0.1,0.5l0.1,0.5l0.1,0.5l0.1,0.5l0.1,0.5l0.1,0.4l0.1,0.4l0.1,0.4l0.1,0.4l0.1,0.3l0.1,0.2l0,0l0.1-0.1l0.1-0.2
2026
+ l0.1-0.2l0.1-0.2l0.1-0.2l0.1-0.2l0.1-0.2l0.1-0.2l0.1-0.2l0.1-0.2l0.1-0.3l0.1-0.3l0.1-0.3l0.1-0.3l0.1-0.3l0.1-0.3l0.1-0.3
2027
+ l0.1-0.3l0.1-0.3l0.1-0.3l0.1-0.3l0.1-0.3l0.1-0.3l0.1-0.3l0.1-0.3l0.1-0.3l0.1-0.3l0.1-0.3v-0.3v-0.3v-0.4v-0.3v-0.3v-0.3v-0.3
2028
+ v-0.3v-0.3v-0.3v-0.3v-0.3v-0.3v-0.3v-0.3v-0.3v-0.3v-0.3v-0.3v-0.3v-0.3v-0.3v-0.3l-0.1-0.3l-0.1-0.3l-0.1-0.3l-0.1-0.2
2029
+ l-0.1-0.2l-0.1-0.2l-0.1-0.2l-0.1-0.2l-0.1-0.2l-0.1-0.1v-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.2-0.1
2030
+ l-0.2-0.1l-0.2-0.1l-0.2-0.1l-0.2-0.1l-0.2-0.1l-0.2-0.1h-0.2h-0.2L-176.3,1397.1L-176.3,1397.1L-176.3,1397.1z M-180.9,1400.2
2031
+ l0.2,0.1l-0.1-0.1H-180.9L-180.9,1400.2l-0.2-0.2L-180.9,1400.2z"
2032
+ />
2033
+ </g>
2034
+ <g transform="matrix(0.380231,0.924892,-0.924892,0.380231,1549.4,-185.872)">
2035
+ <path
2036
+ d="M-240.4,1219l0.2-0.4l0.2-0.4l0.2-0.4l0.2-0.4l0.2-0.3l0.2-0.3l0.2-0.3l0.2-0.3l0.3-0.3l0.3-0.3l0.3-0.3
2037
+ l0.3-0.3l0.3-0.3l0.3-0.2l0.3-0.2l0.3-0.1l0.3-0.1l0.3-0.1l0.3-0.1l0.3-0.1l0.3-0.1l0.3-0.1l0.3-0.1l0.3-0.1l0.3-0.1l0.3-0.1
2038
+ l0.3-0.1l0.3-0.1h0.3h0.3h0.3h0.3h0.3h0.3h0.3h0.4h0.3h0.1h0.1h0.1l0.2,0.1l0.2,0.1h0.1l0.1,0.1l0.1,0.1l0.2,0.1l0.1,0.1l0.1,0.1
2039
+ l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.2l0.1,0.2l0,0l0.1,0.1l0.1,0.2l0,0l0.1,0.2l0.1,0.2l0,0l0.1,0.2l0.1,0.2l0,0v0.2v0.2l0,0v0.2v0.2
2040
+ v0.1v0.2v0.2v0.1v0.1v0.1v0.2l-0.1,0.3l-0.1,0.2l-0.1,0.2l-0.1,0.2l-0.1,0.2l-0.2,0.2l-0.2,0.2l-0.2,0.2l-0.2,0.2l-0.2,0.1
2041
+ l-0.2,0.1l-0.2,0.1l-0.2,0.1l-0.2,0.1h-0.2h-0.2h-0.3h-0.2h-0.2l-0.2-0.1l-0.2-0.1l-0.2-0.1l-0.2-0.1l-0.2-0.1l0,0l0,0h-0.2h-0.2
2042
+ h-0.2h-0.2l-0.1,0.1h-0.1h-0.1h-0.1h-0.1h-0.1l0,0l0,0h-0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.2l-0.1,0.2
2043
+ l-0.1,0.2l-0.1,0.2l-0.1,0.2l-0.1,0.2l-0.1,0.2l-0.1,0.2l-0.1,0.2l-0.1,0.2l-0.1,0.2v0.2v0.2v0.2v0.2l0,0v0.1l0,0v0.1v0.1l0,0
2044
+ l0.2,0.2l0.2,0.2l0.2,0.2l0.2,0.2l0.2,0.2l0.2,0.2l0.2,0.2l0.2,0.2l0.2,0.2l0.2,0.2l0.2,0.1l0.2,0.1l0.4,0.3l0.4,0.3l0.5,0.3
2045
+ l0.5,0.3l0.5,0.3l0.5,0.2l0.5,0.2l0.5,0.2l0.5,0.2l0.5,0.2l0.5,0.2l0.6,0.2l0.6,0.2l0.6,0.2l0.6,0.2l0.6,0.2l0.6,0.2l0.6,0.2
2046
+ l0.6,0.1l0.6,0.1l0.6,0.1l0.6,0.1l0.6,0.1l0.6,0.1l0.6,0.1l0.6,0.1l1.3,0.2l1.3,0.2l1.3,0.2l1.3,0.2l2.7,0.3l1.3,0.2l1.3,0.2
2047
+ l1.3,0.2l1.3,0.2l1.3,0.2l0.6,0.1l0.6,0.1l0.6,0.1l0.6,0.1l0.6,0.1l0.6,0.1l0.6,0.1l0.6,0.1l0.6,0.2l0.6,0.2l0.6,0.2l0.7,0.2
2048
+ l0.4,0.1l0.4,0.1l0.4,0.1l0.4,0.1l0.4,0.1l0.5,0.1l0.5,0.1l0.5,0.1l0.5,0.1h0.5h0.5h0.4h0.4h0.4h0.2h0.2h0.2h0.2h0.2h0.2h0.2h0.2
2049
+ h0.1h0.1h0.1h0.1h0.1h0.1h0.1h0.1h0.1h0.1h0.1l0,0l0,0l0,0l0,0l0,0l0,0l0,0l0,0l0,0v-0.1v-0.1v-0.1v-0.1l0,0v-0.1l0,0l0,0l0,0
2050
+ v-0.1l0,0v-0.1v-0.1v-0.1v-0.1v-0.1v-0.1v-0.1v-0.1v-0.1v-0.1v-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1
2051
+ l-0.1-0.1l-0.1-0.1l-0.2-0.2l-0.2-0.2l-0.2-0.2l-0.2-0.2l-0.3-0.2l-0.3-0.2l-0.3-0.2l-0.3-0.2l-0.3-0.2l-0.3-0.2l-0.3-0.2
2052
+ l-0.3-0.2l-0.3-0.1l-0.3-0.1l-0.2-0.1l-0.2-0.1l-0.2-0.1l-0.5-0.2l-0.5-0.2l-0.5-0.2l-0.5-0.2l-0.5-0.2l-0.5-0.2l-1-0.3l-1-0.3
2053
+ l-1-0.3l-1-0.3l-1-0.3l-1-0.3l-1-0.3l-2.1-0.5l-2.1-0.5l-1.1-0.3l-1.1-0.3l-1.1-0.3l-1.1-0.3l-1.1-0.3l-1.1-0.3l-1.1-0.3
2054
+ l-1.1-0.3l-0.5-0.2l-0.5-0.2l-0.5-0.2l-0.5-0.2l-0.5-0.2l-0.5-0.2l-0.5-0.2l-0.5-0.2l-0.5-0.2l-0.5-0.2l-0.5-0.2l-0.5-0.2
2055
+ l-0.5-0.3l-0.5-0.3l-0.5-0.3l-0.5-0.3l-0.5-0.3l-0.5-0.3l-0.5-0.3l-0.5-0.3l-0.2-0.1l-0.2-0.2l-0.2-0.2l-0.2-0.2l-0.1-0.2
2056
+ l-0.1-0.2l-0.1-0.2l-0.1-0.2l-0.1-0.2v-0.2v-0.2v-0.3v-0.2v-0.2l0.1-0.2l0.1-0.2l0.1-0.2l0.1-0.2l0.1-0.2l0.2-0.2l0.2-0.2
2057
+ l0.2-0.2l0.2-0.1l0.2-0.1l0.2-0.1l0.2-0.1l0.2-0.1l0.2-0.1h0.2h0.2h0.3h0.2l0.2,0.1l0.2,0.1l0.2,0.1l0.2,0.1l0.2,0.1l0.4,0.3
2058
+ l0.4,0.2l0.4,0.2l0.4,0.2l0.4,0.2l0.4,0.2l0.4,0.2l0.4,0.2l0.4,0.2l0.4,0.2l0.4,0.2l0.4,0.2l0.4,0.2l0.5,0.2l0.5,0.2l0.5,0.2
2059
+ l0.5,0.2l0.5,0.2l0.5,0.2l0.5,0.2l1,0.3l1,0.3l1,0.3l1,0.3l1,0.3l1,0.3l1,0.3l1,0.3l2.1,0.5l2.1,0.5l1.1,0.3l1.1,0.3l1.1,0.3
2060
+ l1.1,0.3l1.1,0.3l1.1,0.3l1.1,0.3l0.5,0.2l0.5,0.2l0.5,0.2l0.5,0.2l0.5,0.2l0.5,0.2l0.3,0.1l0.4,0.2l0.4,0.2l0.4,0.2l0.4,0.2
2061
+ l0.4,0.2l0.4,0.2l0.4,0.3l0.4,0.3l0.4,0.3l0.4,0.3l0.4,0.3l0.4,0.3l0.4,0.4l0.4,0.4l0.4,0.4l0.4,0.4l0.2,0.2l0.2,0.2l0.2,0.2
2062
+ l0.2,0.2l0.2,0.2l0.1,0.2l0.1,0.2l0.1,0.3l0.1,0.3l0.1,0.3l0.1,0.3l0.1,0.3l0.1,0.3l0.1,0.3l0.1,0.3l0.1,0.3l0.1,0.3v0.3v0.3v0.3
2063
+ v0.3v0.3v0.3l-0.1,0.3l-0.1,0.3l-0.1,0.3l-0.1,0.3l-0.1,0.3l-0.1,0.3l-0.2,0.3l-0.2,0.3l-0.2,0.3l-0.2,0.3l-0.2,0.3l-0.2,0.3
2064
+ l-0.3,0.3l-0.3,0.2l-0.3,0.2l-0.3,0.2l-0.3,0.2l-0.3,0.2l-0.3,0.2l-0.3,0.1l-0.3,0.1l-0.3,0.1l-0.3,0.1l-0.3,0.1l-0.3,0.1
2065
+ l-0.3,0.1l-0.3,0.1l-0.3,0.1h-0.3h-0.3h-0.3h-0.3h-0.3h-0.3h-0.3h-0.6h-0.6h-0.6h-0.6l-0.6-0.1l-0.6-0.1l-0.6-0.1l-0.6-0.1
2066
+ l-0.5-0.1l-0.5-0.1l-0.5-0.1l-0.5-0.1l-0.5-0.1l-0.4-0.1l-0.8-0.2l-0.7-0.2l-0.5-0.1l-0.5-0.1l-0.5-0.1l-0.5-0.1l-0.5-0.1
2067
+ l-0.6-0.1l-0.6-0.1l-0.6-0.1l-0.6-0.1l-0.6-0.1l-1.2-0.2l-1.2-0.2l-1.3-0.2l-1.3-0.2l-1.3-0.2l-2.7-0.3l-1.4-0.2l-1.4-0.2
2068
+ l-1.4-0.2l-1.4-0.2l-0.7-0.1l-0.7-0.1l-0.7-0.1l-0.7-0.1l-0.7-0.1l-0.7-0.1l-0.7-0.2l-0.7-0.2l-0.7-0.2l-0.7-0.2l-0.7-0.2
2069
+ l-0.7-0.2l-0.7-0.2l-0.7-0.2l-0.7-0.2l-0.7-0.2l-0.6-0.2l-0.6-0.3l-0.6-0.3l-0.6-0.3l-0.6-0.3l-0.6-0.3l-0.6-0.3l-0.6-0.3
2070
+ l-0.6-0.4l-0.6-0.4l-0.3-0.2l-0.3-0.2l-0.3-0.2l-0.3-0.2l-0.3-0.2l-0.3-0.2l-0.3-0.2l-0.3-0.2l-0.3-0.2l-0.3-0.2l-0.3-0.2
2071
+ l-0.3-0.3l-0.2-0.2l-0.2-0.2l-0.2-0.2l-0.2-0.2l-0.2-0.2l-0.1-0.3l-0.1-0.2l-0.1-0.3l-0.1-0.3l-0.1-0.3l-0.1-0.3l-0.1-0.3
2072
+ l-0.1-0.3v-0.2v-0.3v-0.2v-0.2v-0.2v-0.2v-0.3v-0.4l0.1-0.5l0.1-0.4l0.1-0.4l0.1-0.4l0.1-0.4l0.2-0.4L-240.4,1219z
2073
+ M-233.2,1215.7L-233.2,1215.7L-233.2,1215.7L-233.2,1215.7z"
2074
+ />
2075
+ </g>
2076
+ <path
2077
+ d="M402.7,260L402.7,260h0.2h0.1h0.1h0.1h0.1h0.1h0.1h0.1h0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1
2078
+ l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1v0.1l0.1,0.1l0.1,0.1l0.1,0.1v0.1
2079
+ l0.1,0.1v0.1v0.1l0.1,0.1v0.1v0.1v0.1v0.1v0.1l-0.1,0.1v0.1v0.1l-0.1,0.1v0.1l-0.1,0.1l-0.1,0.1v0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1
2080
+ l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1
2081
+ l-0.1,0.1l-0.2,0.1l-0.2,0.1l-0.2,0.1L403,266l-0.2,0.1l-0.2,0.1l-0.2,0.1l-0.2,0.2l-0.2,0.2l-0.2,0.2l-0.2,0.2l-0.2,0.2l-0.2,0.2
2082
+ l-0.2,0.2l-0.2,0.2l-0.2,0.2l-0.2,0.2l-0.2,0.2l-0.2,0.2l-0.2,0.2l-0.2,0.2l-0.2,0.2l-0.2,0.2l-0.1,0.2l-0.2,0.2l-0.1,0.2
2083
+ l-0.2,0.2l-0.1,0.2l-0.1,0.2l-0.1,0.2l-0.1,0.2l-0.1,0.2v0.1l-0.1,0.2l-0.1,0.3l-0.1,0.3l-0.2,0.7l-0.2,0.7l-0.2,0.7l-0.1,0.5
2084
+ l-0.1,0.3l0,0v0.1v0.1l-0.1,0.1v0.1l-0.1,0.1l-0.1,0.1v0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1
2085
+ l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1h-0.1h-0.1h-0.1h-0.1h-0.1
2086
+ h-0.1h-0.1h-0.1H394h-0.1h-0.1h-0.1h-0.1h-0.1h-0.1h-0.1h-0.1h-0.1H393h-0.1h-0.1h-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1
2087
+ l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1
2088
+ l-0.1-0.1l-0.1-0.1l0,0v-0.1l-0.1-0.1v-0.1l-0.1-0.1v-0.1l-0.1-0.1V275v-0.1v-0.1v-0.1v-0.1v-0.1v-0.1l0.1-0.3l0.1-0.5l0.1-0.6
2089
+ l0.2-0.7l0.2-0.8l0.2-0.8l0.1-0.4l0.1-0.4l0.1-0.4l0.1-0.3l0.2-0.4l0.2-0.4l0.2-0.4l0.2-0.3l0.2-0.3l0.2-0.3l0.2-0.3l0.2-0.3
2090
+ l0.2-0.3l0.2-0.3l0.2-0.3l0.2-0.3l0.3-0.3l0.2-0.3l0.3-0.3l0.2-0.3l0.3-0.3l0.3-0.3l0.3-0.3l0.2-0.3l0.3-0.3l0.3-0.2l0.3-0.2
2091
+ l0.3-0.2l0.3-0.2l0.4-0.2l0.3-0.2l0.3-0.2l0.3-0.2l0.3-0.2l0.3-0.2l0.3-0.1l0.1-0.1h0.1h0.1h0.1h0.1h0.1h0.1h0.1h0.1h0.1h0.1h0.1
2092
+ h1.5V260z"
2093
+ />
2094
+ <path
2095
+ d="M413.3,271L413.3,271h0.2h0.1h0.1h0.1h0.1h0.1h0.1h0.1h0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1
2096
+ l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1v0.1l0.1,0.1l0.1,0.1
2097
+ v0.1v0.1l0.1,0.1v0.1v0.1v0.1v0.1v0.1v0.1v0.1l-0.1,0.1v0.1v0.1l-0.1,0.1l-0.1,0.1v0.1l-0.1,0.1L416,275l-0.1,0.1l-0.1,0.1
2098
+ l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1L415,276l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1
2099
+ l-0.2,0.1l-0.2,0.1l-0.2,0.1l-0.2,0.1l-0.5,0.3l-0.5,0.3l-0.5,0.4l-0.5,0.4l-0.2,0.2l-0.3,0.2l-0.3,0.2l-0.2,0.2l-0.3,0.2
2100
+ l-0.2,0.2l-0.2,0.2l-0.2,0.2l-0.2,0.2l-0.2,0.2l-0.2,0.2l-0.2,0.2l-0.2,0.2l-0.2,0.2l-0.1,0.2l-0.1,0.1v0.1l0,0v0.1l0.1,0.2
2101
+ l0.1,0.4l0.1,0.4l0.1,0.4l0.2,0.5l0.1,0.5l0.1,0.3l0.1,0.3l0.1,0.3v0.2v0.1v0.1v0.1v0.1v0.1l-0.1,0.1v0.1v0.1v0.1l-0.1,0.1v0.1
2102
+ l0,0l-0.1,0.1v0.1l-0.1,0.1l0,0l-0.1,0.1l-0.1,0.1l-0.1,0.1v0.1h-0.1v0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l0,0l-0.1,0.1l-0.1,0.1
2103
+ l-0.1,0.1l-0.1,0.1l-0.1,0.1h-0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1H407l-0.1,0.1l-0.1,0.1h-0.1h-0.1h-0.1l0,0h-0.1
2104
+ h-0.1h-0.1h-0.1H406h-0.1h-0.1h-0.1h-0.1h-0.1h-0.1h-0.1h-0.1l0,0h-0.1H405h-0.1h-0.2l-0.3-0.1h-0.2h-0.1H404h-0.1h-0.1h-0.1
2105
+ l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1
2106
+ l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1v-0.1l-0.1-0.1l-0.1-0.1v-0.1l-0.1-0.1v-0.1l-0.1-0.1V286v-0.1v-0.1v-0.1v-0.1v-0.1v-0.1
2107
+ v-0.1l0.1-0.1v-0.1l0.1-0.1v-0.1l0.1-0.1l0.1-0.1l0,0l-0.1-0.1l-0.1-0.5l-0.2-0.5l-0.1-0.3l-0.1-0.3l-0.1-0.3l-0.1-0.3l-0.1-0.4
2108
+ v-0.4v-0.4l0.1-0.4v-0.3l0.1-0.2l0.1-0.3l0.1-0.3l0.2-0.4l0.2-0.4l0.2-0.4l0.2-0.3l0.2-0.3l0.3-0.3l0.2-0.3l0.3-0.3l0.2-0.3
2109
+ l0.3-0.3l0.3-0.3l0.4-0.3l0.3-0.3l0.3-0.3l0.4-0.3l0.3-0.3l0.4-0.3l0.3-0.3l0.4-0.3l0.3-0.3l0.7-0.5l0.7-0.4l0.7-0.4l0.6-0.4
2110
+ l0.3-0.2l0.3-0.2l0.2-0.2l0.2-0.1l0.1-0.1h0.1h0.1h0.1h0.1h0.1h0.1h0.1h0.1h0.1h0.1h0.1h1.2V271z M406.4,283.1L406.4,283.1
2111
+ L406.4,283.1L406.4,283.1z"
2112
+ />
2113
+ <path
2114
+ d="M393,250.3L393,250.3h0.2h0.1h0.1h0.1h0.1h0.1h0.1h0.1h0.1h0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1
2115
+ l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1v0.1l0.1,0.1l0.1,0.1l0.1,0.1v0.1l0.1,0.1
2116
+ l0.1,0.1v0.1v0.1l0.1,0.1v0.1v0.1v0.1v0.1v0.1v0.1v0.1l-0.1,0.1v0.1l-0.1,0.1v0.1l-0.1,0.1v0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1
2117
+ l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1L395,255l-0.1,0.1l-0.1,0.1l-0.2,0.2l-0.3,0.2l-0.2,0.2l-0.3,0.2l-0.2,0.2l-0.3,0.2
2118
+ l-0.3,0.2l-0.2,0.2l-0.3,0.2l-0.2,0.2l-0.5,0.3l-0.5,0.3l-0.5,0.2l-0.5,0.2l-0.4,0.2l-0.4,0.2l-0.2,0.1l-0.2,0.1l-0.2,0.1
2119
+ l-0.2,0.1l-0.1,0.1l-0.2,0.1l-0.1,0.1l-0.1,0.1l-0.2,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1
2120
+ l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.2l-0.1,0.2l-0.1,0.2l-0.1,0.4l-0.1,0.4l-0.2,0.9l-0.1,0.5l-0.1,0.3l-0.1,0.3l-0.1,0.3
2121
+ l-0.1,0.3l-0.1,0.3l-0.1,0.3l-0.2,0.3l-0.2,0.3L385,266l-0.2,0.2l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1
2122
+ L384,267l-0.1,0.1l-0.1,0.1l-0.1,0.1h-0.1h-0.1h-0.1h-0.1h-0.1h-0.1H383h-0.1h-0.1h-0.1h-0.1h-0.1h-0.1h-0.1h-0.1h-0.1H382h-0.1
2123
+ h-0.1h-0.1h-0.1h-0.1h-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1
2124
+ l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1v-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1v-0.1l-0.1-0.1v-0.1v-0.1l-0.1-0.1v-0.1
2125
+ v-0.1v-0.1v-0.1v-0.1v-0.1V264l0.1-0.1v-0.1l0.1-0.1v-0.1l0.1-0.1v-0.1l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1
2126
+ l0.1-0.1l0.1-0.1l0,0h0.1v-0.1l0.1-0.1v-0.1l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.4l0.2-0.9l0.1-0.5l0.2-0.5l0.1-0.3l0.1-0.3l0.1-0.3
2127
+ l0.2-0.3l0.1-0.3l0.2-0.3l0.2-0.3l0.2-0.3l0.2-0.3l0.2-0.3l0.3-0.3l0.2-0.3l0.3-0.3l0.3-0.2l0.2-0.2l0.3-0.2l0.3-0.2l0.2-0.2
2128
+ l0.3-0.2l0.2-0.2l0.3-0.2l0.2-0.2l0.5-0.3l0.5-0.3l0.5-0.2l0.5-0.2l0.4-0.2l0.4-0.2l0.2-0.1l0.2-0.1l0.2-0.1l0.2-0.1l0.1-0.1
2129
+ l0.2-0.1l0.1-0.1l0.2-0.1l0.1-0.1l0.1-0.2l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1h0.1l0.1-0.1h0.1h0.1h0.1h0.1
2130
+ h0.1h0.1h0.1h0.1h0.1h0.1h0.1L393,250.3z"
2131
+ />
2132
+ <path
2133
+ d="M400,91h0.2h0.1h0.2h0.1h0.2h0.1l0.2,0.1l0.1,0.1l0.1,0.1l0.2,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1
2134
+ l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1v0.1L403,93l0,0v0.1l0.1,0.1v0.1v0.1v0.1l0,0v0.1
2135
+ l-0.1,0.1v0.1v0.1l-0.1,0.1v0.1l-0.1,0.1v0.1l-0.1,0.2l-0.1,0.3l-0.1,0.3l-0.3,0.5l-0.2,0.5l-0.4,0.6l-0.7,1.2l-0.7,1.2l-0.4,0.6
2136
+ l-0.2,0.5l-0.2,0.4l-0.1,0.2l-0.1,0.1l-0.3,0.8l-0.4,0.8l-0.3,0.8l-0.2,0.4l-0.1,0.4l-0.2,0.4l-0.2,0.4l-0.1,0.4l-0.1,0.4
2137
+ l-0.2,0.4l-0.1,0.4l-0.1,0.4l-0.1,0.4l-0.1,0.4l-0.1,0.4l-0.1,0.4l-0.1,0.4l-0.1,0.4l-0.1,0.4l-0.1,0.4l-0.1,0.4l-0.1,0.4
2138
+ l-0.1,0.4v0.4l-0.1,0.4l-0.1,0.4v0.4v0.4v0.4v0.2l-0.1,0.2v0.2v0.2l-0.1,0.2l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1
2139
+ l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.2,0.1l-0.1,0.1l-0.2,0.1h-0.1
2140
+ h-0.2H393h-0.2h-0.2h-0.1h-0.2h-0.2H392h-0.2h-0.2h-0.1h-0.2l-0.1-0.1l-0.1-0.1l-0.2-0.1l-0.1-0.1l-0.1-0.1l-0.2-0.1l-0.1-0.1
2141
+ l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.2v-0.2l-0.1-0.2V114v-0.2
2142
+ v-0.2v-0.5v-0.5l0.1-0.5v-0.5l0.1-0.5l0.1-0.5l0.1-0.5l0.1-0.5l0.1-0.5l0.1-0.5l0.1-0.5l0.1-0.5l0.1-0.5l0.1-0.5l0.1-0.5l0.1-0.5
2143
+ l0.2-0.5l0.1-0.5l0.2-0.5l0.1-0.5l0.2-0.5l0.2-0.5l0.2-0.5l0.1-0.5l0.2-0.5l0.2-0.5l0.4-0.9l0.4-0.9l0.4-0.9l0.1-0.3l0.2-0.3
2144
+ l0.2-0.6l0.4-0.6l0.4-0.6l0.7-1.2l0.7-1.2l0.2-0.3l0,0v-0.2v-0.2l0.1-0.2V92l0.1-0.2l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1
2145
+ l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1l0.2-0.2l0.2-0.2l0.1-0.1l0.1-0.1l0.1-0.1h0.1l0.1-0.1l0.2-0.1l0.1-0.1l0.1-0.1h0.1h0.1
2146
+ h0.1h0.2h0.1h0.1h0.2l0,0h0.1h0.2V91z"
2147
+ />
2148
+ <path
2149
+ d="M408.1,107.3h0.2h0.1h0.1h0.1h0.1h0.1h0.1h0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1
2150
+ l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1v0.1l0.1,0.1
2151
+ v0.1v0.1l0,0v0.1v0.1v0.1v0.1v0.1v0.1v0.1l-0.1,0.1v0.3l-0.1,0.4l-0.1,0.4l-0.1,0.4l-0.2,0.4l-0.3,0.9l-0.4,1l-0.4,1.1l-0.5,1.2
2152
+ l-0.5,1.2l-0.5,1.2l-0.5,1.2l-0.5,1.2l-0.5,1.1l-0.4,1l-0.4,0.8l-0.3,0.7l-0.2,0.4l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1
2153
+ l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1h-0.1h-0.1h-0.1
2154
+ h-0.1h-0.2h-0.1h-0.1h-0.1h-0.3h-0.1H402h-0.1h-0.1h-0.1h-0.1h-0.1h-0.1h-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1
2155
+ l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1
2156
+ l-0.1-0.1l-0.1-0.1v-0.1l-0.1-0.1v-0.1v-0.1l-0.1-0.1v-0.1v-0.1v-0.1v-0.1l0.1-0.1v-0.1V124l0.1-0.1l0.1-0.1v-0.1l0.1-0.1l0.1-0.1
2157
+ l0.2-0.4l0.3-0.6l0.4-0.8l0.4-0.9l0.4-1.1l0.5-1.1l0.5-1.2l0.5-1.2l0.5-1.2l0.5-1.2l0.4-1.1l0.4-1l0.3-0.8l0.1-0.3l0.1-0.3
2158
+ l0.1-0.2V110v-0.1v-0.1l0.1-0.1l0.1-0.1v-0.1l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1
2159
+ l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1h0.1h0.1h0.1h0.1h0.1h0.2h0.1h0.1h0.1h-0.2V107.3z
2160
+ M405,110.4v0.2V110.4L405,110.4L405,110.4L405,110.4z"
2161
+ />
2162
+ <path
2163
+ fill="#25B3FF"
2164
+ d="M483.4,329.1L483.4,329.1h0.3h0.1h0.1h0.1h0.2h0.1l0.1,0.1l0.2,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1
2165
+ l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1v0.1h0.1l1.4-0.3l0.8-0.2l0.4-0.1l0.4-0.1l0.4-0.1l0.4-0.1l0.4-0.1l0.4-0.1l0.6-0.1h0.4
2166
+ h0.4h0.2h0.3h0.2h0.1h0.2h0.1h0.1h0.1h0.1h0.1h0.1h0.2l0.1,0.1l0.1,0.1l0,0l0.2,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0,0
2167
+ l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.2v0.1l0.1,0.1v0.1l0.1,0.2v0.2v0.1v0.2l-0.1,0.2
2168
+ v0.1v0.2l-0.1,0.1l0,0l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1h-0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1
2169
+ l-0.1,0.1l0,0L494,334l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.2,0.1l-0.2,0.1l-0.4,0.2l-0.4,0.1l-0.4,0.1l-0.4,0.1l-0.4,0.1l-0.4,0.1
2170
+ l-0.4,0.1l-0.9,0.2l-0.8,0.2l-0.9,0.2l-0.2,0.1h-0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l0,0l-0.2,0.1l-0.1,0.1h-0.1h-0.1h-0.1
2171
+ h-0.2h-0.1h-0.1H486l-1.4,0.1l-0.5,0.1l-0.5,0.1h-0.1l0,0l-0.2,0.1l-0.1,0.1l-0.1,0.1l-0.2,0.1h-0.2h-0.1h-0.2h-0.1h-0.2h-0.2
2172
+ h-0.1h-0.2h-0.2h-0.1h-0.1l-0.7,0.4l-0.8,0.4l-0.8,0.4l-0.5,0.2l-0.4,0.2l-0.4,0.2l-0.5,0.2l-0.4,0.2l-0.5,0.2l-0.5,0.2l-0.5,0.2
2173
+ l-0.5,0.2l-0.4,0.1l-0.5,0.1l-0.5,0.1l-0.5,0.1h-0.2h-0.2h-0.3h-0.2h0.4H472h-0.3h-0.3l-0.3-0.1l-0.2-0.1h-0.1l-0.1-0.1h-0.1
2174
+ l-0.1-0.1l-0.2-0.1h-0.1l-0.1-0.1l-0.2-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1
2175
+ l0,0l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1h-0.1v-0.1l-0.1-0.1l-0.1-0.1v-0.1l-0.1-0.2v-0.2l0,0v-0.1v-0.1v-0.1
2176
+ l0.1-0.1v-0.1l0.1-0.1V337v-0.1l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1l0,0l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1V336l0.1-0.1l0.1-0.1
2177
+ l0.1-0.1l0.1-0.1l0.2-0.2l0.2-0.2l0.2-0.2l0.4-0.2l0.4-0.2l0.4-0.2l0.4-0.2l0.4-0.2l0.4-0.2l0.2-0.1l0,0l0.2-0.1l0.2-0.1l0.2-0.1
2178
+ l0.4-0.2l0.4-0.2l0.4-0.2l0.4-0.2l0.4-0.2l0.4-0.2l0.4-0.1l0.5-0.1l0.4-0.1l0.5-0.1l0.4-0.1l0.4-0.1l0.5-0.1l0.9-0.2l0.4-0.1
2179
+ l0.1-0.1v-0.2l0.1-0.1l0.1-0.2l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1
2180
+ l0.2-0.1h0.1l0.1-0.1l0.1-0.1l0.1-0.1h0.1h0.1h0.1h0.1h0.1h0.1h0.1h0.2h0.1h0.1L483.4,329.1L483.4,329.1z"
2181
+ />
2182
+ <path
2183
+ fill="#25B3FF"
2184
+ d="M489.4,325L489.4,325h0.2h0.1h0.1h0.1h0.1h0.1h0.1h0.1h0.1h0.1h0.1h0.1h0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1
2185
+ l0.1,0.1l0.1,0.1l0.1,0.1h0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.2,0.2l0.2,0.2l0.1,0.1v0.1l0.1,0.1l0.1,0.3l0.1,0.3
2186
+ l0.1,0.1v0.1l0.1,0.1l0.1,0.3l0.1,0.4l0.1,0.4v0.4v0.4v0.4l-0.1,0.3l-0.1,0.3l-0.1,0.3l-0.1,0.3l-0.1,0.3l-0.1,0.3l-0.1,0.3
2187
+ l-0.1,0.3l-0.2,0.3l-0.1,0.3l-0.2,0.2l-0.2,0.2l-0.1,0.2l-0.2,0.2l-0.4,0.4l-0.4,0.4l-0.4,0.4l-0.4,0.4l-0.4,0.4l-0.4,0.4
2188
+ l-0.4,0.4l-0.4,0.4l-0.4,0.4l-0.4,0.3l-0.4,0.3l-0.4,0.3l-0.4,0.3L486,339l-0.4,0.3l-0.3,0.2l-0.3,0.2l-0.2,0.2l0,0l-0.3,0.4
2189
+ l-0.4,0.5l-0.4,0.5l-0.5,0.7l-0.7,0.8l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1
2190
+ l-0.1,0.1l-0.1,0.1l-0.1,0.1h-0.1h-0.1H481h-0.1h-0.1h-0.1h-0.1h-0.1h-0.1h-0.1h-0.1h-0.1h-0.2h-0.1h-0.1h-0.1h-0.1h-0.1h-0.1
2191
+ l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l0,0h-0.1L478,343l-0.3-0.1l-0.1-0.1h-0.1
2192
+ h-0.1h-0.1h-0.1h-0.1H477h-0.1h-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.2-0.2L476,342l-0.2-0.2l-0.1-0.2l-0.1-0.2v-0.1
2193
+ l-0.1-0.1l-0.1-0.1l0,0l-0.1-0.1v-0.1l-0.1-0.1v-0.1v-0.1l-0.1-0.1v-0.1l-0.1-0.1v-0.1v-0.1V340v-0.1v-0.1v-0.1v-0.1v-0.1v-0.2
2194
+ V339l0.1-0.3l0.1-0.3l0.1-0.4l0.2-0.4l0.2-0.3l0.2-0.3l0.2-0.3l0.2-0.3l0.2-0.3l0.2-0.3l0.2-0.3l0.2-0.3l0.2-0.3l0.3-0.3l0.2-0.3
2195
+ l0.3-0.3l0.5-0.6l0.3-0.3l-0.1-0.3l-0.1-0.2l-0.1-0.1l-0.1-0.1v-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1v-0.1l-0.1-0.1v-0.1l-0.1-0.1v-0.1
2196
+ v-0.1l-0.1-0.1v-0.1v-0.1V331v-0.1v-0.1v-0.1v-0.1v-0.1v-0.1v-0.1l0.1-0.1l0,0v-0.1V330l0.1-0.1v-0.1l0.1-0.1v-0.1l0.1-0.1v-0.1
2197
+ h0.1l0.1-0.1v-0.1l0.1-0.1l0.1-0.1h0.1l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.2l0.2-0.2l0.2-0.2l0.2-0.2l0.3-0.2l0.4-0.2l0.3-0.2l0.4-0.2
2198
+ l0.3-0.2l0.4-0.2l0.4-0.2l0.4-0.2l0.4-0.1l0.4-0.1l0.4-0.1l0.4-0.1l0.4-0.1l0.8-0.2l0.4-0.1l0.4-0.1l0.4-0.1l0.4-0.1l0.4-0.1
2199
+ l0.4-0.1l0.4-0.1l0.4-0.1h0.3h0.4h0.3L489.4,325L489.4,325z"
2200
+ />
2201
+ </g>
2202
+ <path
2203
+ fill="#0096FF"
2204
+ d="M447.3,221.9h0.8h0.8h0.7h0.7h0.7h0.7l0.7,0.1l0.7,0.1l0.7,0.1l0.6,0.1l0.6,0.1l0.6,0.1l0.5,0.1l0.5,0.1
2205
+ l0.5,0.1l0.3,0.1l0.2,0.1l0.2,0.1l0.2,0.1l0.2,0.1l0.2,0.1l0.3,0.1l0.2,0.1l0.2,0.2l0.2,0.2l0.2,0.2l0.3,0.3l0.1,0.2l0.1,0.1
2206
+ l0.1,0.1l0.1,0.1l0.1,0.2l0.1,0.2l0.1,0.1l0.1,0.2l0.1,0.2l0.1,0.1l0.1,0.2v0.2l0.1,0.1v0.2l0.1,0.2v0.1v0.1v0.1v0.2v0.3l-0.1,0.2
2207
+ v0.3l-0.1,0.3l-0.1,0.1l0.2,0.1l0.2,0.1l0.2,0.2l0.3,0.2l0.2,0.2l0.2,0.2l0.2,0.2l0.2,0.2l0.2,0.2l0.2,0.2l0.2,0.3l0.2,0.3l0.2,0.3
2208
+ l0.1,0.2l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1v0.1l0.1,0.1l0.3,0.3l0.3,0.3l0.1,0.2l0.1,0.2l0.5,0.8l0.2,0.4
2209
+ l0.1,0.1l0.1,0.1l0.4,0.6l0.4,0.6l0.4,0.6l0.4,0.6l0.3,0.6l0.4,0.6l0.3,0.6l0.3,0.6l0.3,0.6l0.3,0.6l0.2,0.6l0.3,0.6l0.2,0.6
2210
+ l0.2,0.6l0.2,0.6l0.2,0.6l0.2,0.6l0.2,0.6l0.2,0.6l0.2,0.6l0.2,0.6l0.2,0.6l0.4,1.2l0.4,1.2l0.4,1.2l0.4,1.2l0.3,1.2l0.7,2.5
2211
+ l0.4,1.2l0.3,1.2l0.4,1.1l0.2,0.4l0.4,0.5l0.4,0.6l0.3,0.6l0.4,0.6l0.3,0.6l0.3,0.6l0.3,0.6l0.2,0.6l0.3,0.6l0.2,0.6l0.1,0.3
2212
+ l0.1,0.3l0.1,0.3l0.1,0.3l0.1,0.3l0.1,0.3l0.1,0.3l0.1,0.3l0.1,0.3l0.1,0.3l0.1,0.3v0.3l0.1,0.3v0.3v0.3v0.3v0.3v0.3v0.3l-0.1,0.3
2213
+ l-0.1,0.3v0.2l0.1,0.6l0.2,1.1l0.1,0.5l0.1,0.5l0.1,0.5l0.1,0.5l0.1,0.5l0.1,0.5l0.1,0.5l0.1,0.5v0.5v0.4v0.3v0.2v0.2l-0.1,0.3
2214
+ l-0.1,0.3l-0.1,0.2v0.1l-0.1,0.1l-0.1,0.1l-0.1,0.2l-0.1,0.2v0.1l-0.1,0.2l-0.2,0.2l0,0l-0.2,0.2l-0.1,0.2l-0.2,0.1h-0.1l-0.1,0.1
2215
+ l-0.1,0.1h-0.1l-0.1,0.2l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.2,0.2l-0.2,0.2
2216
+ l-0.1,0.1l-0.1,0.1l-0.1,0.1h-0.1l-0.1,0.1l-0.2,0.1l0,0h-0.1h-0.2h-0.1h-0.1h-0.1h-0.1h-0.2h-0.1h-0.1H476h-0.1h-0.1h-0.2h-0.2
2217
+ h-0.1h-0.2l-0.2-0.1h-0.1l-0.2-0.1l-0.2-0.1h-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.2-0.1l-0.3-0.2l-0.2-0.2
2218
+ l-0.2-0.2l-0.2-0.2l-0.2-0.2l-0.2-0.2l-0.2-0.2l-0.2-0.2l-0.2-0.3l-0.3-0.5l-0.3-0.5l-0.2-0.4h-0.1h-0.4H470h-0.4h-0.4h-0.4h-0.4
2219
+ l-0.4-0.1l-0.4-0.1l-0.4-0.1l-0.4-0.1l-0.4-0.1L466,280l-0.4-0.1l-0.4-0.1l-0.4-0.1l-0.4-0.1l-0.4-0.1l-0.4-0.2l-0.4-0.2l-0.3-0.2
2220
+ l-0.4-0.2l-0.4-0.2l-0.4-0.2l-0.4-0.2l-0.4-0.2l-0.4-0.2l-0.3-0.2l-0.4-0.2l-0.4-0.2l-0.3-0.2l-0.4-0.2l-0.3-0.3l-0.4-0.3l-0.3-0.3
2221
+ l-0.4-0.3l-0.3-0.3l-0.3-0.3l-0.4-0.3l-0.3-0.3l-0.3-0.3l-0.6-0.6l-0.7-0.6l-0.5-0.6l-0.6-0.6l-0.6-0.7l-0.5-0.7l-0.5-0.7l-0.5-0.7
2222
+ l-0.5-0.7l-0.5-0.7l-0.5-0.7l-0.4-0.7l-0.5-0.7l-0.4-0.7l-0.4-0.7l-0.4-0.7l-0.4-0.7l-0.4-0.7l-0.4-0.7l-0.2-0.4l-0.1-0.4l-0.1-0.2
2223
+ l0,0h-0.1h-0.1l-0.5-0.1l-0.5-0.2l-0.5-0.2l-0.5-0.2l-0.4-0.2l-0.5-0.2l-0.4-0.2l-0.4-0.2l-0.2-0.1l-0.2-0.1l-0.2-0.1l-0.2-0.2
2224
+ l-0.2-0.2l-0.2-0.2l-0.5-0.4l-0.5-0.5l-0.7-0.6l-0.7-0.7l-0.4-0.4l-0.4-0.4l-0.4-0.4l-0.4-0.4l-0.4-0.4l-0.4-0.5l-0.4-0.5l-0.4-0.5
2225
+ l-0.4-0.5l-0.4-0.5l-0.4-0.5l-0.4-0.5l-0.4-0.5L433,249l-0.2-0.3l-0.1-0.3l-0.2-0.3l-0.1-0.3l-0.2-0.3l-0.1-0.3l-0.1-0.3l-0.1-0.3
2226
+ l-0.1-0.3l-0.1-0.3l-0.1-0.3l-0.1-0.3l-0.1-0.3v-0.3l0,0h-0.1l-0.4-0.4l-0.5-0.4l-0.4-0.4l-0.4-0.4l-0.4-0.4l-0.4-0.4l-0.4-0.4
2227
+ l-0.3-0.4l-0.4-0.4l-0.1-0.2l-0.2-0.2l-0.1-0.2l-0.1-0.2l-0.1-0.2l-0.2-0.2l-0.1-0.2h-0.1l-0.1-0.1l-0.3-0.2l-0.2-0.3l-0.3-0.3
2228
+ l-0.3-0.3l-0.2-0.3l-0.1-0.2l-0.2-0.2l-0.1-0.2l-0.1-0.3l-0.1-0.3l-0.1-0.3v-0.2l-0.1-0.1v-0.1v-0.2l-0.1-0.2v-0.1l0.1-0.1v-0.1
2229
+ v-0.1v-0.1v-0.1l0.1-0.1v-0.1l0.1-0.2l0.1-0.2l0.1-0.1l0,0l-0.1-0.1l0,0l-0.5-0.1l-0.4-0.1l-0.3-0.1l-0.3-0.1l-0.4-0.1l-0.3-0.1
2230
+ l-0.4-0.1l-0.4-0.2l-0.3-0.2l-0.2-0.2l-0.2-0.2l-0.2-0.1l-0.1-0.1l-0.1-0.1h-0.1l-0.1-0.1l-0.1-0.1h-0.1l-0.1-0.2l-0.1-0.2H420
2231
+ l-0.1-0.2l-0.1-0.2l0,0l-0.1-0.2l-0.1-0.3l0,0v-0.2v-0.2v-0.1v-0.1l0.1-0.1v-0.3l0.1-0.4l0.1-0.4l0.1-0.3l0.2-0.3l0.2-0.3l0.2-0.3
2232
+ l0.2-0.3l0.2-0.2l0.2-0.2l0.2-0.2l0.2-0.2l0.2-0.2l0.3-0.2l0.2-0.2l0.2-0.2l0.2-0.1l0.3-0.1l0.2-0.1l0.3-0.1l0.3-0.1l0.2-0.1
2233
+ l0.3-0.1l0.6-0.2l0.6-0.2l0.7-0.2l0.7-0.2l0.7-0.2l0.7-0.2l0.7-0.2l0.8-0.1l0.7-0.1l0.7-0.1l0.8-0.1l0.8-0.1l0.8-0.1l0.8-0.1
2234
+ l0.8-0.1l0.8-0.1l0.8-0.1l0.8-0.1l0.8-0.1l0.8-0.1l0.8-0.1h0.8h0.8h0.8h0.8h0.8h0.8h2.5V221.9z M463.1,271.3l-0.2,0.1l0,0l-0.2,0.1
2235
+ l-0.2,0.1h-0.1h-0.2H462h-0.2l0,0l0,0l0.3,0.2l0.2,0.2l0.3,0.2l0.2,0.2l0.3,0.2l0.2,0.2l0.3,0.2l0.2,0.2l0.3,0.2l0.2,0.2l0.2,0.2
2236
+ l0.2,0.1l0.3,0.1l0.2,0.1l0.1,0.1l-0.7-0.9l-0.7-1L463.1,271.3l-0.1-0.1l-0.2-0.1L463.1,271.3z"
2237
+ />
2238
+ <path
2239
+ d="M438.7,215.5h0.6h0.6h0.5h0.6h0.5h0.6h0.5l0.5,0.1l0.5,0.1l0.5,0.1l0.5,0.1l0.5,0.1l1,0.1l0.9,0.2l0.9,0.2
2240
+ l0.8,0.2l0.8,0.2l0.7,0.2l0,0h0.1h0.2h0.2h0.2h0.3l0.6-0.1l0.7-0.1l0.7-0.1l0.7-0.1l0.8-0.1h0.4h0.4h0.4h0.4h0.4h0.4h0.4h0.4
2241
+ l0.4,0.1l0.4,0.1l0.2,0.1l0.2,0.1l0.2,0.1l0.3,0.1l0.2,0.1l0.3,0.2l0.2,0.2l0.2,0.2l0.5,0.5l0.5,0.5l0.4,0.5l0.5,0.5l0.4,0.5
2242
+ l0.5,0.5l0.4,0.5l0.5,0.5l0.4,0.5l0.4,0.5l0.4,0.5l0.5,0.6l0.4,0.6l0.4,0.6l0.4,0.6l0.4,0.6l0.4,0.6l0.4,0.6l0.4,0.6l0.4,0.6
2243
+ l0.4,0.6l0.4,0.6l0.4,0.6l0.4,0.6l0.4,0.7l0.4,0.7l0.4,0.7l0.4,0.7l0.3,0.7l0.4,0.7l0.3,0.7l0.3,0.7l0.3,0.7l0.3,0.7l0.3,0.7
2244
+ l0.3,0.7l0.2,0.7l0.2,0.7l0.2,0.7l0.2,0.7l0.2,0.7l0.2,0.7l0.2,0.7l0.2,0.7l0.1,0.8l0.2,0.8l0.1,0.8l0.1,0.8l0.1,0.8l0.1,0.8
2245
+ l0.1,0.8l0.1,0.8l0.1,0.8l0.1,0.8v0.8v0.8v0.8l-0.1,0.8v0.8l-0.1,0.8l-0.1,0.8l-0.1,0.8l-0.1,0.8l-0.1,0.4l-0.1,0.4l-0.1,0.5
2246
+ l-0.1,0.5l-0.1,0.5l-0.1,0.5l-0.1,0.5l-0.1,0.5l-0.2,0.5l-0.1,0.5l-0.1,0.5l-0.2,0.5l-0.1,0.4l-0.2,0.4l-0.1,0.4l-0.2,0.4l-0.1,0.4
2247
+ l-0.2,0.4l-0.2,0.4l-0.2,0.4l-0.2,0.4l-0.2,0.4l-0.2,0.4l-0.2,0.4l-0.2,0.4l-0.2,0.4l-0.2,0.4l-0.2,0.4l-0.2,0.3l-0.2,0.3l-0.2,0.3
2248
+ l-0.2,0.3l-0.2,0.3l-0.2,0.3l-0.2,0.3l-0.2,0.3l-0.2,0.3l-0.2,0.3l-0.3,0.3l-0.2,0.3l-0.2,0.3l-0.3,0.3l-0.2,0.3l-0.3,0.2l-0.2,0.2
2249
+ l-0.3,0.2l-0.3,0.2l-0.3,0.2l-0.3,0.2l-0.3,0.2l-0.3,0.2l-0.3,0.2l-0.3,0.2l-0.3,0.2l-0.4,0.2l-0.3,0.2l-0.3,0.1l-0.4,0.1l-0.3,0.1
2250
+ l-0.4,0.1l-0.4,0.1l-0.3,0.1l-0.4,0.1l-0.4,0.1l-0.3,0.1l-0.4,0.1l-0.4,0.1h-0.4h-0.4h-0.4h-0.3h-0.4h-0.4h-0.4h-0.4h-0.4h-0.4
2251
+ h-0.4l-0.4-0.1l-0.4-0.1l-0.4-0.1l-0.4-0.1l-0.4-0.1l-0.4-0.1l-0.4-0.1l-0.4-0.1l-0.4-0.1l-0.4-0.1l-0.3-0.1l-0.4-0.1l-0.4-0.1
2252
+ l-0.4-0.2l-0.4-0.2l-0.4-0.2l-0.4-0.2l-0.4-0.2l-0.3-0.2l-0.4-0.2l-0.4-0.2l-0.4-0.2l-0.3-0.2l-0.4-0.2l-0.4-0.2l-0.4-0.2l-0.3-0.2
2253
+ l-0.4-0.3l-0.4-0.3l-0.4-0.3l-0.3-0.3l-0.4-0.3l-0.4-0.3l-0.3-0.3l-0.4-0.3l-0.4-0.3l-0.3-0.3l-0.4-0.3l-0.3-0.3l-0.4-0.3l-0.3-0.3
2254
+ l-0.4-0.4l-0.4-0.4l-0.3-0.4l-0.4-0.4l-0.3-0.4l-0.4-0.4l-0.3-0.4l-0.4-0.4l-0.3-0.4l-0.3-0.4l-0.4-0.4l-1-1.4l-1-1.3l-0.9-1.3
2255
+ l-0.9-1.3l-0.9-1.3l-0.9-1.3l-0.9-1.3l-0.4-0.6l-0.4-0.6l-0.4-0.6l-0.4-0.6l-0.4-0.6l-0.4-0.6l-0.4-0.6l-0.4-0.6l-0.4-0.6l-0.4-0.6
2256
+ l-0.4-0.6l-0.4-0.6l-0.3-0.6l-0.4-0.6l-0.3-0.6l-0.4-0.6l-0.3-0.6l-0.3-0.6l-0.3-0.6l-0.2-0.6l-0.3-0.6l-0.2-0.6l-0.2-0.7l-0.2-0.7
2257
+ l-0.2-0.7l-0.2-0.7l-0.2-0.7l-0.2-0.7l-0.2-0.7l-0.2-0.7l-0.1-0.7l-0.2-0.7l-0.1-0.7l-0.1-0.7l-0.1-0.7l-0.1-0.7l-0.1-0.7l-0.1-0.7
2258
+ l-0.1-0.7l-0.1-0.7v-0.7v-0.7V231l-0.2-0.1l-0.2-0.1l-0.2-0.1l-0.2-0.1l-0.2-0.2l-0.2-0.2l-0.2-0.2l-0.1-0.2l-0.1-0.2l-0.1-0.2
2259
+ l-0.1-0.2L419,229l-0.1-0.3l-0.1-0.3v-0.3v-0.3v-0.3l0.1-0.3v-0.3l0.1-0.3l0.1-0.3l0.1-0.3l0.1-0.3l0.1-0.3l0.1-0.3l0.1-0.3
2260
+ l0.1-0.3l0.1-0.3l0.1-0.3l0.1-0.3l0.2-0.3l0.1-0.3l0.2-0.3l0.1-0.3l0.2-0.2l0.2-0.2l0.2-0.2l0.2-0.2l0.2-0.2l0.2-0.2l0.2-0.2
2261
+ l0.2-0.2l0.2-0.2l0.2-0.2l0.2-0.2l0.2-0.2l0.2-0.2l0.2-0.2l0.2-0.2l0.2-0.2l0.2-0.1l0.2-0.1l0.3-0.1l0.2-0.1l0.3-0.1l0.5-0.2
2262
+ l0.5-0.2l0.5-0.2l0.5-0.2l0.5-0.2l0.6-0.2l0.5-0.1l0.5-0.1l0.6-0.1l0.6-0.1l0.5-0.1l0.6-0.1l0.6-0.1h0.6h0.5h0.6h0.6h0.6h0.6h3.2
2263
+ V215.5z M437.6,221.4h-0.5h-0.5h-0.5h-0.5h-0.5h-0.5l-0.4,0.1l-0.5,0.1l-0.4,0.1l-0.5,0.1l-0.4,0.1L432,222l-0.4,0.1l-0.4,0.1
2264
+ l-0.4,0.1l-0.4,0.1l-0.3,0.1l-0.4,0.1l-0.1,0.1l-0.2,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.2,0.1l0,0l0.1,0.2l0.1,0.2
2265
+ l0.1,0.2l0.1,0.2l0.1,0.2l0.1,0.3l0.1,0.3v0.3l-0.1,0.3l-0.1,0.7l-0.1,0.6l-0.1,0.6v0.6l-0.1,0.6v0.6v0.6v0.6v0.6v0.6l0.1,0.6v0.6
2266
+ l0.1,0.6l0.1,0.6l0.1,0.6l0.1,0.6l0.1,0.6l0.1,0.6l0.1,0.6l0.1,0.6l0.2,0.6l0.1,0.6l0.2,0.6l0.2,0.6l0.2,0.6l0.2,0.6l0.2,0.6
2267
+ l0.2,0.6l0.2,0.6l0.2,0.6l0.2,0.6l0.2,0.6l0.3,0.6l0.2,0.6l0.3,0.6l0.3,0.6l0.3,0.6l0.3,0.6l0.4,0.6l0.3,0.6l0.4,0.6l0.3,0.6
2268
+ l0.4,0.6l0.4,0.6l0.4,0.6l0.4,0.6l0.4,0.6l0.4,0.6l0.4,0.6l0.4,0.6l0.8,1.2l0.9,1.2l0.9,1.3l0.9,1.3l0.9,1.3l0.9,1.3l1,1.3l0.3,0.4
2269
+ l0.3,0.4l0.3,0.4l0.3,0.4l0.2,0.3l0.3,0.3l0.3,0.3l0.3,0.3l0.3,0.3l0.3,0.3l0.2,0.3l0.3,0.3l0.3,0.3l0.3,0.3l0.3,0.3l0.2,0.3
2270
+ l0.3,0.3l0.3,0.3l0.2,0.2l0.3,0.2l0.3,0.2l0.3,0.2l0.2,0.2l0.3,0.2l0.2,0.2l0.3,0.2l0.3,0.2l0.2,0.2l0.2,0.2l0.3,0.2l0.3,0.2
2271
+ l0.2,0.2l0.2,0.2l0.3,0.1l0.2,0.1l0.2,0.1l0.2,0.1l0.3,0.1l0.2,0.1l0.2,0.1l0.2,0.1l0.2,0.1l0.2,0.1l0.2,0.1l0.2,0.1l0.2,0.1
2272
+ l0.2,0.1l0.2,0.1h0.2h0.2h0.2h0.2h0.2h0.2h0.2h0.2h0.2h0.2h0.2h0.2h0.2h0.2h0.2h0.2h0.2h0.2h0.2h0.2l0.2-0.1l0.2-0.1l0.2-0.1
2273
+ l0.2-0.1l0.2-0.1l0.2-0.1l0.2-0.1l0.2-0.1l0.2-0.1l0.2-0.1l0.2-0.1l0.2-0.1l0.2-0.1l0.2-0.1l0.2-0.1l0.2-0.1l0.2-0.1l0.2-0.2
2274
+ l0.2-0.2l0.2-0.2l0.2-0.2l0.2-0.2l0.1-0.2l0.2-0.2l0.2-0.2l0.2-0.2l0.2-0.2l0.2-0.2l0.1-0.2l0.2-0.2l0.2-0.2l0.2-0.3l0.1-0.3
2275
+ l0.2-0.3l0.2-0.3l0.1-0.3l0.2-0.3l0.1-0.3l0.2-0.3l0.1-0.3l0.2-0.3l0.1-0.3l0.2-0.3l0.1-0.3l0.1-0.3l0.1-0.4l0.2-0.4l0.1-0.4
2276
+ l0.1-0.4l0.1-0.4l0.1-0.4l0.1-0.4l0.1-0.4l0.1-0.4l0.1-0.4l0.1-0.4l0.1-0.4l0.1-0.4l0.1-0.4l0.1-0.5l0.1-0.3l0.1-0.3l0.1-0.7
2277
+ l0.1-0.6l0.1-0.6l0.1-0.7l0.1-0.7v-0.6v-0.7v-0.7v-0.7l-0.1-0.7V252l-0.1-0.7l-0.1-0.7l-0.1-0.7l-0.1-0.7l-0.1-0.7l-0.1-0.7
2278
+ l-0.2-0.7l-0.1-0.7l-0.2-0.7l-0.1-0.6l-0.2-0.6l-0.2-0.6l-0.2-0.6l-0.2-0.6l-0.2-0.6l-0.2-0.6l-0.2-0.6l-0.2-0.6l-0.3-0.6l-0.2-0.6
2279
+ l-0.3-0.6l-0.3-0.6l-0.3-0.6l-0.3-0.6l-0.3-0.6l-0.3-0.6l-0.4-0.6l-0.3-0.6l-0.4-0.6l-0.4-0.6l-0.4-0.6l-0.4-0.6l-0.4-0.6l-0.4-0.5
2280
+ l-0.4-0.5l-0.4-0.5l-0.4-0.5l-0.4-0.5l-0.4-0.5l-0.4-0.5l-0.4-0.5l-0.4-0.5l-0.4-0.5l-0.4-0.5l-0.4-0.5l-0.4-0.5l-0.4-0.4l-0.4-0.4
2281
+ l-0.4-0.4l-0.4-0.4l-0.4-0.4h-0.1h-0.2h-0.2h-0.3h-0.2h-0.3h-0.3l-0.7,0.1l-0.7,0.1l-0.7,0.1l-0.7,0.1l-0.7,0.1h-0.4h-0.4H450h-0.4
2282
+ h-0.4h-0.4h-0.4l-0.3-0.1l-0.8-0.2l-0.7-0.2l-0.8-0.2l-0.8-0.1l-0.8-0.1l-0.9-0.1l-0.4-0.1l-0.5-0.1l-0.5-0.1h-0.5h-0.5h-0.5h-0.5
2283
+ h-0.5h-0.5h-0.5h-0.5h-0.5h-0.5h0.7V221.4z"
2284
+ />
2285
+ <path
2286
+ fill="#0096FF"
2287
+ d="M481.7,317.6L481.7,317.6h0.3h0.2h0.1l0.2,0.1l0.2,0.1l0.3,0.1l0.2,0.1l0.2,0.1l0.2,0.1l0.4,0.2l0.4,0.2
2288
+ l0.4,0.2l0.7,0.4l0.2,0.2l0.2,0.1l0.2,0.1h0.1l0,0l0.2,0.1l0.7,0.2l0.9,0.3l1,0.3l0.6,0.2l0.6,0.2l0.7,0.2l0.7,0.2l0.7,0.3l0.7,0.3
2289
+ l0.7,0.3l0.3,0.2l0.4,0.2l0.3,0.2l0.4,0.2l0.3,0.2l0.4,0.2l0.3,0.2l0.3,0.2l0.3,0.2l0.3,0.2l0.3,0.2l0.3,0.2l0.3,0.2l0.2,0.3
2290
+ l0.3,0.3l0.2,0.3l0.2,0.3l0,0l0.2-0.1l0.2-0.1l0.2-0.1l0.2-0.1l0.4-0.1l0.5-0.1l0.5-0.1h0.5h0.5h0.4h0.5h0.5h0.5l0.5,0.1l0.4,0.1
2291
+ l0.5,0.1l0.5,0.1l0.5,0.1l0.5,0.1l0.4,0.1l0.5,0.1l0.5,0.1l0.9,0.2l0.9,0.2l0.4,0.1l0.2-0.1l0.7-0.2l0.7-0.2l0.7-0.2l0.7-0.1
2292
+ l0.7-0.1l0.7-0.1l0.6-0.1l0.6-0.1l0.5-0.1l0.5-0.1l0.5-0.1l0.5-0.1l0.8-0.1l0.7-0.1h0.5h0.3h0.2h0.3l0.3,0.1l0.2,0.1l0.2,0.1
2293
+ l0.2,0.1l0.2,0.2l0.2,0.2l0.2,0.2l0.1,0.1l0.2,0.1l0.2,0.2l0.2,0.2h0.1l0.1,0.2l0.1,0.2l0.1,0.2l0.1,0.2h0.1l0.1,0.2l0.1,0.2h0.1
2294
+ l0.1,0.1l0.2,0.1l0.1,0.1l0.1,0.1l0.2,0.1l0,0l0.2,0.1l0.1,0.1l0,0l0.2,0.1l0.1,0.1l0,0l0.2,0.2l0.2,0.2l0,0l0.1,0.2l0.1,0.2
2295
+ l0.1,0.2l0,0l0.1,0.2v0.2l0.1,0.2l0,0v0.2l-0.1,0.2v0.2l0,0l-0.1,0.2l-0.1,0.2l-0.1,0.2l0,0l-0.1,0.2l-0.2,0.2l0,0l-0.1,0.2
2296
+ l-0.2,0.2l0,0l-0.1,0.1l-0.2,0.1l-0.1,0.1l-0.2,0.2l-0.2,0.1l-0.2,0.1l-0.2,0.1l-0.2,0.1l-0.2,0.1l-0.2,0.1l-0.2,0.1H523l-0.1,0.3
2297
+ l-0.1,0.3l-0.1,0.3l-0.1,0.3l-0.2,0.3l-0.1,0.3l-0.2,0.3l-0.1,0.3l-0.2,0.2l-0.2,0.3l-0.3,0.5l-0.4,0.5l-0.4,0.4l-0.4,0.4l-0.4,0.4
2298
+ l-0.4,0.4l-0.7,0.8l-0.2,0.2v0.1l-0.1,0.3l-0.1,0.3l-0.2,0.3l-0.1,0.3l-0.2,0.3l-0.1,0.3l-0.2,0.3l-0.1,0.3l-0.2,0.3l-0.2,0.3
2299
+ l-0.2,0.3l-0.2,0.3l-0.2,0.2l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.2,0.1l0,0l-0.1,0.1l-0.2,0.1h-0.1l-0.2,0.1l-0.2,0.1h-0.1
2300
+ l-0.2,0.1h-0.2h-0.2l0,0h-0.3h-0.2h-0.3h-0.1h-0.2l-0.2-0.1l-0.2-0.1l-0.2-0.1h-0.1l-0.2-0.1l-0.2-0.1l-0.2-0.1l-0.2-0.2l0,0
2301
+ l-0.2-0.2l-0.1-0.2l-0.2-0.2l0,0l-0.1-0.2l-0.1-0.2l0,0l-0.1-0.2l-0.1-0.2l0,0v-0.1v-0.1l-0.1-0.2v-0.3v-0.2l0.1-0.3v-0.2l0.1-0.3
2302
+ l0.1-0.3l0.1-0.1l-0.4,0.5l-0.4,0.5l-0.3,0.4l-0.2,0.4l-0.2,0.3l-0.2,0.3l-0.1,0.2l0,0l-0.1,0.1v0.1v0.1l-0.1,0.1l0,0l0.1,0.1
2303
+ l0.2,0.2l0.2,0.2l0.2,0.3l0.2,0.3l0.2,0.3l0.2,0.3l0.2,0.3l0.2,0.3l0.1,0.4l0.2,0.4l0.1,0.4l0.1,0.4l0.1,0.4v0.4l-0.1,0.4l0.5,0.2
2304
+ l0.8,0.3l0.8,0.3l0.8,0.3l0.2,0.1h0.2l1.3,0.2l0.7,0.1l0.7,0.1l0.7,0.1l0.6,0.1l0.7,0.1l0.6,0.2l0.5,0.2l0.4,0.1l0.5-0.1l0.4-0.1
2305
+ l0.4-0.1h0.4h0.4h0.4h0.4h0.4h0.4h0.4h0.4h0.4h0.5l0.5,0.1l0.5,0.1l0.5,0.1l0.5,0.1l0.5,0.1l0.5,0.1l0.5,0.1l0.5,0.1l0.5,0.1
2306
+ l0.5,0.1l0.5,0.1l0.5,0.1l0.4,0.1l0.4,0.1l0.4,0.1l0.4,0.1l0.4,0.1l0.4,0.1l0.3,0.1l0.4,0.2l0.2,0.1l0.2,0.1h0.1l0.2,0.2l0,0
2307
+ l0.2,0.1l0.1,0.1h0.1l0.1,0.2l0.2,0.2l0.1,0.2l0,0l0.1,0.2l0.1,0.3l0.1,0.3l0.1,0.3l0,0v0.2v0.2v0.2l-0.1,0.2l-0.1,0.2l-0.1,0.2
2308
+ l0,0l-0.1,0.2l-0.1,0.2l-0.1,0.2l-0.2,0.2l-0.2,0.2l0,0l-0.2,0.2l-0.2,0.2l-0.2,0.1l0,0l-0.2,0.1l-0.2,0.1H535h-0.2h-0.1h-0.2h-0.1
2309
+ h-0.1l-0.2,0.1l-0.2,0.1l-0.2,0.1l-0.4,0.1l-0.2,0.1h-0.3h-0.3l-0.5,0.1h-0.6h-0.5h-0.6l-1.2,0.1h-0.5h-0.5h-0.4h-0.3h-0.2h-0.4
2310
+ l-0.7,0.1l-0.8,0.1l-0.8,0.1l-0.9,0.1l-0.5,0.1l-0.5,0.1l-0.5,0.1h-0.5h-0.5h-0.5h-0.5h-0.5h-0.5h-0.5h-0.5l-0.5-0.1h-0.3h-0.1
2311
+ l-0.9,0.4l-1,0.4l-1.1,0.4l-1.1,0.4l-1.1,0.4l-0.7,0.2l-0.6,0.2l-0.6,0.2l-0.7,0.2l-0.7,0.2l-0.6,0.2l-0.7,0.2l-0.7,0.2l-0.7,0.2
2312
+ l-0.7,0.2l-0.6,0.2l-0.7,0.1l-0.7,0.1l-0.7,0.1l-0.7,0.1l-0.7,0.1l-0.7,0.1l-0.6,0.1h-0.7h-0.7h-0.6h-0.3h-0.3h-0.4h-0.3h-0.3H496
2313
+ h-0.3h-0.3l-0.3-0.1l-0.4-0.1l-0.3-0.1l-0.3-0.1l-0.3-0.1l-0.3-0.1l-0.3-0.1l-0.2-0.1l-0.3-0.1l-0.3-0.1l-0.3-0.2l-0.2-0.2
2314
+ l-0.3-0.2l-0.2-0.2l-0.3-0.2l-0.2-0.2l-0.2-0.2l-0.2-0.3l-0.2-0.3l-0.2-0.3l-0.2-0.3l-0.2-0.3l0,0h-0.2l-0.4,0.1l-0.4,0.1l-0.4,0.1
2315
+ l-0.5,0.1h-0.4H487h-0.4h-0.4h-0.4h-0.5h-0.8h-0.9h-0.8H482h-0.8h-0.9h-0.8l-0.8-0.1l-1.5-0.1l-1.5-0.1l-1.4-0.1h-0.7H473h-0.6
2316
+ h-0.5h-0.2h-0.2h-0.6h-0.7l-0.8,0.1l-0.8,0.1l-0.8,0.1H467h-0.4h-0.4h-0.4h-0.4H465h-0.4h-0.4l-0.4-0.1l-0.4-0.1l-0.3-0.1l-0.2-0.1
2317
+ l-0.3-0.1l-0.3-0.1l-0.1-0.1l-0.2-0.1l-0.1-0.1h-0.1l-0.2-0.1l-0.1-0.1h-0.1l-0.1-0.2l-0.2-0.2H461l-0.1-0.2l-0.1-0.2v-0.1
2318
+ l-0.1-0.2l-0.1-0.2l-0.1-0.2v-0.1l-0.1-0.2v-0.2v-0.2v-0.1v-0.3v-0.3v-0.1l0.1-0.2l0.1-0.2V356l0.1-0.2l0.1-0.2v-0.1l0.1-0.1
2319
+ l0.1-0.1v-0.1l0.2-0.2l0.1-0.2l0.2-0.2l0.2-0.2l0.2-0.1l0.2-0.2l0.2-0.1l0.2-0.2l0.2-0.1l0.2-0.1l0.2-0.1l0.4-0.1l0.4-0.1l0.4-0.1
2320
+ l0.5-0.1l0.4-0.1l0.5-0.1l0.5-0.1l0.5-0.1l0.6-0.1l1.1-0.2l0.6-0.1l0,0l0.1-0.2l0.1-0.2l0.2-0.4l0.2-0.4l0.2-0.4l0.2-0.4l0.2-0.4
2321
+ l0.3-0.4l0.2-0.4l0.3-0.4l0.3-0.4l0.4-0.4l0.3-0.3l0.3-0.4l0.3-0.3l0.4-0.3l0.3-0.3l0.3-0.3l0.4-0.3l0.3-0.3l0.3-0.3l0.3-0.3
2322
+ l0.3-0.2l0.3-0.2l0.4-0.3l0.4-0.3l0.4-0.3l0.5-0.3l0.6-0.3l0.5-0.4l0.7-0.4l0.7-0.4l0.7-0.4l0.4-0.2l0,0l-0.3-0.1l-0.3-0.1
2323
+ l-0.3-0.1l-0.3-0.1l-0.3-0.1l-0.3-0.1l-0.3-0.1l-0.3-0.1l-0.3-0.1l-0.3-0.1l-0.3-0.1l-0.3-0.1l-0.3-0.1l-0.2-0.2l-0.3-0.2l-0.3-0.2
2324
+ l-0.2-0.2l-0.3-0.2l-0.2-0.2l-0.3-0.2l-0.2-0.2l-0.3-0.2l-0.2-0.2l-0.2-0.2l-0.2-0.2l-0.2-0.2l-0.2-0.2l-0.2-0.2l-0.1-0.1h-3.7
2325
+ h-0.3h-0.2l-0.3-0.1l-0.3-0.1l-0.2-0.1l-0.2-0.1l-0.2-0.2l-0.2-0.2l-0.2-0.2l-0.2-0.2l-0.1-0.2l-0.2-0.2l-0.1-0.3l-0.1-0.3
2326
+ l-0.1-0.3v-0.3v-0.3v-0.3l0.1-0.3l0.1-0.3l0.1-0.3l0.1-0.3l0.2-0.2l0.2-0.2l0.2-0.2l0.2-0.2l0.2-0.2l0.2-0.1l0.3-0.1l0.2-0.1
2327
+ l0.3-0.1h0.2h0.3h0.2h0.2h0.2h0.2h0.2h0.2h0.2h0.2l0.2-0.1l0.3-0.1l0.2-0.1l0.2-0.1l0.3-0.1l0.2-0.1l0.6-0.2l0.5-0.2l0.6-0.2
2328
+ l0.6-0.2l0.3-0.1l-0.1-0.2v-0.3l0.1-0.3l0.1-0.3l0.1-0.3l0.1-0.3l0.2-0.3l0.1-0.2l0.2-0.2l0.2-0.2l0.2-0.2l0.2-0.2l0.2-0.1l0.2-0.1
2329
+ l0.2-0.1l0.3-0.1h0.3h0.3h0.2h0.1h0.4h0.4l0.5-0.1l0.5-0.1l0.5-0.1h0.2l0.1-0.1l0.3-0.3l0.2-0.3l0.3-0.3l0.3-0.3l0.3-0.2l0.3-0.2
2330
+ l0.3-0.2l0.3-0.2l0.2-0.2l-0.4-0.1l-0.5-0.1l-0.3-0.1l-0.2-0.1l-0.3-0.1l-0.3-0.1l-0.2-0.1l-0.3-0.1l-0.3-0.1l-0.3-0.2l-0.3-0.2
2331
+ l-0.3-0.2l-0.2-0.2l-0.2-0.2l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.2l-0.1-0.2l-0.1-0.1l-0.1-0.2
2332
+ l-0.1-0.2l-0.1-0.1l-0.1-0.2v-0.2l-0.1-0.1v-0.2v-0.2l-0.1-0.1v-0.2v-0.2l0.1-0.1v-0.2v-0.2l0.1-0.2l0.1-0.2v-0.1l0.1-0.1l0,0
2333
+ l0.1-0.2l0.1-0.2l0,0l0.1-0.2l0.1-0.2l0,0l0.1-0.1l0.2-0.1l0,0l0.2-0.2l0.2-0.1l0,0l0.2-0.1l0.2-0.1h0.1l0.2-0.1l0.2-0.1l0,0
2334
+ l0.2-0.1l0.2-0.1l0,0h0.2h0.2h0.1h0.3L481.7,317.6z M492.7,346.7l-1.1,0.8l-1.1,0.8l-1.1,0.8l-1.2,0.8l-1.1,0.8l-0.8,0.6l0.4-0.1
2335
+ l0.6-0.2l0.7-0.2l0.5-0.2l0.2-0.1l0.2-0.2l0.7-0.4l0.6-0.4l0.6-0.4l0.6-0.4l0.6-0.4l0.9-0.7l0,0v-0.1v-0.1v-0.1v-0.1v-0.1V347v-0.1
2336
+ v-0.1l-0.1-0.1v-0.1L492.7,346.7L492.7,346.7L492.7,346.7L492.7,346.7z M491.1,334.8v0.3l0.1,0.3v0.3l0,0h0.2l0.3,0.1l0.2,0.1
2337
+ l0.2,0.1l0.1-0.2l0.1-0.2l0.2-0.2l0.2-0.2l0.2-0.2l0.1-0.1h-0.2h-0.4h-0.5h-0.4h-0.4H491L491.1,334.8z"
2338
+ />
2339
+ <path
2340
+ d="M521.4,320.1h0.5h0.5l0.4,0.1l0.5,0.1l0.5,0.1l0.5,0.1l0.5,0.1l0.4,0.1l0.4,0.2l0.2,0.1l0.2,0.1l0.2,0.1
2341
+ l0.2,0.1l0.2,0.1l0.2,0.1l0.2,0.1l0.2,0.2l0.2,0.2l0.2,0.2l0.2,0.2l0.2,0.2l0.2,0.2l0.2,0.2l0.2,0.2l0.1,0.2l0.2,0.4l0.2,0.4
2342
+ l0.1,0.4l0.2,0.4l0.1,0.4l0.1,0.4l0.1,0.4l0.1,0.4l0.1,0.4l0.1,0.4l0.1,0.4l0.1,0.4v0.4v0.4v0.4v0.3l-0.1,0.4l-0.1,0.3l-0.1,0.3
2343
+ l-0.1,0.3l-0.1,0.3l-0.1,0.3l-0.1,0.3l-0.1,0.3l-0.1,0.3l-0.1,0.3l-0.2,0.3l-0.2,0.3l-0.1,0.3l-0.2,0.3l-0.2,0.3l-0.2,0.3l-0.2,0.3
2344
+ l-0.2,0.2l-0.2,0.2l-0.2,0.2l-0.2,0.2l-0.2,0.2l-0.2,0.2l-0.2,0.2l-0.4,0.4l-0.5,0.4l-0.5,0.4l-0.5,0.4l-0.5,0.3l-0.5,0.3l-0.5,0.3
2345
+ l-0.5,0.3l-0.5,0.3l-0.5,0.3l-0.9,0.6l-0.9,0.6l-0.8,0.5l-0.4,0.3l-0.4,0.3l-0.4,0.2l-0.4,0.2l-0.3,0.2l-0.4,0.2l-0.2,0.2l-0.2,0.2
2346
+ l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1v0.1l-0.1,0.1l-0.1,0.1l0,0l0,0h-0.1l0,0l0,0l0,0l0,0l0,0l0,0l0,0
2347
+ l0,0v0.1v0.1l0,0l0.1,0.1v0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1h0.2h0.3h0.3h0.4l0.8,0.1
2348
+ l0.9,0.1l1.1,0.1l2.4,0.1l1.2,0.1l1.4,0.1l1.3,0.1l1.4,0.1l0.7,0.1l0.7,0.1l0.7,0.1l0.7,0.1l0.7,0.1l0.7,0.1l0.7,0.1l0.7,0.1
2349
+ l0.7,0.1l0.7,0.1l0.6,0.1l0.7,0.1l0.6,0.2l0.7,0.2l0.6,0.2l0.5,0.2l0.3,0.1l0.3,0.1l0.3,0.1l0.2,0.1l0.3,0.1l0.2,0.1l0.3,0.1
2350
+ l0.2,0.1l0.3,0.2l0.2,0.2l0.2,0.2l0.2,0.2l0.2,0.2l0.3,0.2l0.2,0.2l0.2,0.2l0.2,0.2l0.2,0.3l0.2,0.3l0.2,0.3l0.2,0.3l0.2,0.3
2351
+ l0.1,0.3l0.1,0.3l0.1,0.4l0.1,0.4l0.1,0.4v0.4v0.4l-0.1,0.4l-0.1,0.4l-0.1,0.3l-0.1,0.3l-0.1,0.3l-0.1,0.3l-0.1,0.3l-0.2,0.3
2352
+ l-0.2,0.3l-0.2,0.3l-0.2,0.3l-0.3,0.4l-0.3,0.4l-0.3,0.4l-0.4,0.4l-0.3,0.4l-0.4,0.3l-0.4,0.3l-0.4,0.3l-0.4,0.3l-0.4,0.3l-0.4,0.3
2353
+ l-0.4,0.3l-0.4,0.2l-0.4,0.2l-0.4,0.2l-0.4,0.2l-0.4,0.2l-0.4,0.2l-0.4,0.2l-0.4,0.1l-0.4,0.1l-0.4,0.1l-0.4,0.1l-0.4,0.1l-0.4,0.1
2354
+ l-0.4,0.1l-0.4,0.1l-0.4,0.1l-0.4,0.1l-0.4,0.1h-0.4h-0.4H530h-0.4h-0.8H528h-0.8h-0.8h-0.8h-1.5h-1.5h-0.7h-0.7h-0.7h-0.7h-0.7
2355
+ h-0.3h-0.4l-2.6,0.2l-2.7,0.2l-2.7,0.2l-2.7,0.2l-2.7,0.2l-2.7,0.2l-2.7,0.2l-2.7,0.2l-2.7,0.2l-2.7,0.1l-1.4,0.1l-1.4,0.1
2356
+ l-1.3,0.1H486h-1.4h-1.3h-1.4h-1.4h-1.4h-1.3h-1.4H475h-0.3h-0.4h-0.4h-0.4l-1.1,0.1l-1.2,0.1l-1.3,0.1l-1.4,0.1l-0.7,0.1h-0.7
2357
+ h-0.8h-0.7h-0.8H464h-0.7h-0.8h-0.7h-0.7h-0.4h-0.4h-0.4h-0.4h-0.4l-0.4-0.1l-0.4-0.1l-0.4-0.1l-0.3-0.1l-0.4-0.1l-0.4-0.1
2358
+ l-0.3-0.1l-0.4-0.1l-0.3-0.1l-0.4-0.2l-0.3-0.2l-0.4-0.2l-0.3-0.2l-0.3-0.2l-0.3-0.3l-0.2-0.2l-0.2-0.2l-0.2-0.2l-0.2-0.3l-0.2-0.3
2359
+ l-0.1-0.3l-0.2-0.3l-0.1-0.3l-0.1-0.3l-0.1-0.3l-0.1-0.3l-0.1-0.3l-0.1-0.3v-0.3l-0.1-0.3v-0.3l0.1-0.3v-0.3l0.1-0.3l0.1-0.3
2360
+ l0.1-0.3l0.1-0.3l0.1-0.3l0.1-0.3l0.1-0.3l0.1-0.3l0.2-0.2l0.1-0.2l0.1-0.2l0.2-0.2l0.1-0.2l0.2-0.2l0.2-0.2l0.2-0.2l0.3-0.4
2361
+ l0.4-0.4l0.4-0.4l0.4-0.4l0.4-0.4l0.4-0.4l0.5-0.4l0.4-0.4l0.5-0.4l0.5-0.3l0.5-0.3l0.4-0.3l0.5-0.3l0.5-0.3l0.5-0.3l0.5-0.3
2362
+ l0.5-0.3l1-0.6l1-0.6l0.9-0.6l1-0.6l0.9-0.5l1.8-1l0.8-0.5l0.7-0.4l0.3-0.2l0.3-0.2l0.3-0.2l0.2-0.2l0.2-0.1l0.2-0.1l0.1-0.1l0,0
2363
+ h0.1l0,0l0,0l0,0l0,0l0,0l0,0l0,0l0,0l0,0l0,0l0,0l0,0l0,0l0,0l0,0l0,0h-0.1l0,0l0,0h-0.1l0,0h-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1
2364
+ l-0.1-0.1l-0.1-0.1l-0.2-0.1l-0.2-0.1l-0.2-0.1l-0.2-0.1l-0.3-0.2l-0.2-0.2l-0.3-0.2l-0.3-0.2l-0.4-0.2l-0.3-0.1l-0.4-0.1l-0.4-0.1
2365
+ l-0.4-0.1l-0.4-0.1l-0.4-0.1l-0.4-0.1l-0.8-0.3l-0.8-0.3l-1.6-0.5l-0.8-0.2l-0.7-0.2l-0.7-0.2l-0.4-0.1l-0.4-0.1l-0.3-0.1l-0.4-0.1
2366
+ l-0.3-0.1l-0.3-0.2l-0.4-0.2l-0.3-0.2L457,339l-0.3-0.3l-0.2-0.2l-0.2-0.2l-0.2-0.2l-0.1-0.2l-0.1-0.2l-0.1-0.1l-0.1-0.2v-0.1
2367
+ l-0.1-0.2l-0.1-0.2v-0.1l-0.1-0.2l-0.1-0.2v-0.1v-0.2v-0.2v-0.1v-0.2v-0.2v-0.1l0.1-0.2v-0.2l0.1-0.1v-0.2l0.1-0.2l0.1-0.1l0.1-0.1
2368
+ l0.1-0.1l0.1-0.1l0.1-0.2l0.1-0.1l0.2-0.2l0.1-0.1l0.2-0.2l0.4-0.4l0.4-0.3l0.4-0.3l0.4-0.3l0.4-0.3l0.4-0.3l0.4-0.3l0.4-0.3
2369
+ l0.4-0.3l0.4-0.3l0.4-0.3l0.4-0.3l0.4-0.3l0.4-0.3l0.4-0.3l0.4-0.3l0.4-0.2l0.4-0.2l0.4-0.2l0.5-0.2l0.4-0.2l0.4-0.2l0.4-0.2
2370
+ l0.5-0.2l0.4-0.2l0.5-0.2l0.4-0.2l0.5-0.2l0.4-0.2l0.5-0.2l0.4-0.2l0.5-0.2h0.1L470,325l-0.3-0.3l-0.2-0.3l-0.3-0.3l-0.1-0.2
2371
+ l-0.1-0.2l-0.1-0.2l-0.1-0.2l-0.1-0.2l-0.1-0.2l-0.1-0.2l-0.1-0.2v-0.2l-0.1-0.3v-0.3v-0.3v-0.2V321l0.1-0.2l0.1-0.2l0.1-0.2
2372
+ l0.1-0.3l0.1-0.3l0.1-0.2l0.1-0.3l0.2-0.4l0.2-0.3l0.3-0.3l0.2-0.3l0.2-0.2l0.3-0.2l0.3-0.2l0.3-0.2l0.3-0.2l0.3-0.2l0.3-0.2
2373
+ l0.3-0.2l0.3-0.2l0.3-0.1l0.4-0.1l0.3-0.1l0.4-0.1l0.6-0.3l0.7-0.2l0.7-0.2l0.7-0.2l0.7-0.2l0.7-0.2l0.7-0.2l0.7-0.2l1.2-0.3
2374
+ l1.1-0.3l0.4-0.1l0.4-0.1h0.5h0.4h0.4h0.4h0.4l0.4,0.1l0.4,0.1l0.4,0.1l0.4,0.1l0.4,0.1l0.4,0.1l0.4,0.1l0.3,0.1l0.4,0.2l0.4,0.2
2375
+ l0.3,0.2l0.4,0.2l0.3,0.2l0.3,0.2l0.4,0.2l0.6,0.4l0.6,0.4l0.7,0.4l0.6,0.4l0.6,0.4l0.5,0.4l0.6,0.4l1.1,0.8l0.5,0.4l0.5,0.4
2376
+ l0.5,0.4l0.5,0.3l0.5,0.3l0.5,0.3l0.2,0.1l0.2,0.1l0.2,0.1l0.2,0.1l0.2,0.1l0.2,0.1l0.2,0.1l0.1,0.1l0.2,0.1h0.1h0.1h0.1l0,0h0.1
2377
+ h0.1h0.2h0.2h0.2h0.3h0.2h0.3l0.7-0.1l0.8-0.1l0.8-0.1l0.8-0.1l0.9-0.1l2-0.3l1-0.2l1-0.1l1.1-0.1l1.1-0.1l1.1-0.1l1.1-0.1l1-0.1
2378
+ h0.5h0.5h0.5h0.5h0.5h0.5h0.5h0.5L521.4,320.1z M485.3,319L485.3,319L485.3,319h-0.2l-1.1,0.3l-1.2,0.3l-0.6,0.2l-0.6,0.2l-0.6,0.2
2379
+ l-0.6,0.2l-0.6,0.2l-0.5,0.2l-0.5,0.2l-0.5,0.2l-0.2,0.1l-0.2,0.1l-0.2,0.1l-0.2,0.1l-0.2,0.1h-0.1h0.1l0.2,0.2l0.3,0.2l0.4,0.2
2380
+ l0.4,0.2l0.3,0.2l0.2,0.2l0.2,0.2l0.2,0.2l0.2,0.3l0.1,0.3l0.1,0.3l0.1,0.3h0.1l0.3,0.1l0.3,0.1l0.2,0.2l0.2,0.2l0.2,0.2l0.2,0.2
2381
+ l0.2,0.3l0.1,0.3l0.1,0.3l0.1,0.3l0.1,0.3l0.1,0.3v0.3l-0.1,0.3l-0.1,0.3l-0.1,0.3l-0.1,0.3l-0.1,0.3l-0.2,0.2l-0.2,0.2l-0.2,0.2
2382
+ l-0.2,0.2l-0.3,0.2l-0.2,0.1l-0.3,0.1H480h-0.1l-0.3,0.1l-0.7,0.1l-1.9,0.3l-1.1,0.2l-0.9,0.2l-0.4,0.1l-0.4,0.1H474h-0.1l-0.4,0.1
2383
+ l-0.4,0.1l-0.4,0.1l-0.4,0.1l-0.4,0.1l-0.4,0.2l-0.4,0.2l-0.4,0.2l-0.4,0.2l-0.4,0.2l-0.4,0.2l-0.4,0.2l-0.4,0.2l-0.4,0.2l-0.4,0.2
2384
+ l-0.4,0.2l-0.3,0.2l-0.4,0.2l-0.4,0.2l-0.4,0.2l-0.3,0.2l-0.4,0.2l-0.2,0.1l0.5,0.1l1.6,0.5l0.8,0.3l0.9,0.3l0.4,0.2l0.5,0.2
2385
+ l0.4,0.2l0.4,0.2l0.5,0.2l0.4,0.2l0.5,0.2l0.4,0.2l0.4,0.2l0.4,0.2l0.4,0.2l0.4,0.2l0.4,0.3l0.4,0.3l0.4,0.3l0.4,0.3l0.2,0.2
2386
+ l0.2,0.2l0.2,0.2l0.2,0.2l0.2,0.2l0.2,0.2l0.1,0.2l0.2,0.2l0.1,0.2l0.2,0.2l0.1,0.2l0.1,0.2l0.1,0.3l0.1,0.3l0.1,0.3l0.1,0.3
2387
+ l0.1,0.3l0.1,0.3v0.3l0.1,0.3v0.3v0.3v0.3l-0.1,0.3v0.3l-0.1,0.3l-0.1,0.3l-0.1,0.3l-0.1,0.3l-0.1,0.3l-0.1,0.3l-0.1,0.3l-0.1,0.2
2388
+ l-0.2,0.2l-0.1,0.2l-0.2,0.2l-0.2,0.3l-0.3,0.3l-0.3,0.3l-0.3,0.2l-0.3,0.2l-0.4,0.2l-0.4,0.2l-0.3,0.2l-0.4,0.2l-0.4,0.2l-0.8,0.5
2389
+ l-0.8,0.5l-1.8,1l-0.9,0.5l-0.9,0.5l-0.9,0.6l-0.9,0.6l-0.9,0.6l-0.4,0.3l-0.5,0.3l-0.5,0.3l-0.4,0.3l-0.4,0.3l-0.4,0.3l-0.4,0.3
2390
+ l-0.4,0.3l-0.4,0.3l-0.4,0.3l-0.3,0.3l-0.3,0.3l-0.3,0.3l-0.3,0.3l-0.2,0.3l-0.2,0.2l-0.2,0.2l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1
2391
+ l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1v0.1l-0.1,0.1v0.1l0,0l0,0h-0.1l0,0l0,0l0,0h0.1v0.1h0.1l0.1,0.1v0.1h0.1h0.1h0.1h0.1h0.1h0.1
2392
+ h0.2h0.1h0.2h0.2h0.2h0.2h0.2h0.2h0.2h0.2h0.3h0.2h0.6h0.7h0.6h0.7h0.7h0.7h0.7h0.7h0.7h0.7l1.4-0.1l1.3-0.1l1.2-0.1l1.1-0.1h0.5
2393
+ h0.5h0.5h0.5h1.3h1.4h1.3h1.3h1.3h1.4h1.3h1.4h1.3l1.3-0.1l1.4-0.1l1.3-0.1l2.6-0.1l2.7-0.2l2.7-0.2l2.7-0.2l2.6-0.2l2.7-0.2
2394
+ l2.7-0.2l2.6-0.2l2.7-0.2l2.7-0.2h0.4h0.4h0.8h0.8h0.8h0.8h0.8h1.5h1.5h0.7h0.7h0.7h0.7h0.7h0.4h0.3h0.3h0.4h0.3h0.3l0.3-0.1
2395
+ l0.3-0.1l0.3-0.1l0.2-0.1l0.3-0.1l0.3-0.1l0.2-0.1l0.2-0.1l0.3-0.1l0.2-0.1l0.2-0.1l0.2-0.1l0.2-0.1l0.2-0.1l0.2-0.1l0.2-0.1
2396
+ l0.2-0.1l0.2-0.2l0.2-0.2l0.2-0.2l0.2-0.2l0.2-0.2l0.2-0.2l0.2-0.2l0.2-0.2l0.2-0.2l0.2-0.3l0.2-0.3l0.1-0.1l0.1-0.1l0.1-0.1
2397
+ l0.1-0.1l0.1-0.1v-0.1l0,0h-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.2-0.1l-0.1-0.1l-0.1-0.1l-0.2-0.1l-0.2-0.1
2398
+ l-0.2-0.1l-0.2-0.1l-0.4-0.1l-0.4-0.1l-0.5-0.1l-0.5-0.1l-0.5-0.1l-0.5-0.1l-0.5-0.1l-0.6-0.1l-0.6-0.1l-0.6-0.1l-0.6-0.1l-0.7-0.1
2399
+ l-0.6-0.1l-0.7-0.1l-0.7-0.1l-0.7-0.1l-1.3-0.1l-1.3-0.1l-1.2-0.1l-1.3-0.1l-2.4-0.1l-1.1-0.1l-1.1-0.1l-0.9-0.1h-0.5l-0.4-0.1
2400
+ l-0.4-0.1l-0.4-0.1l-0.4-0.1l-0.4-0.1l-0.4-0.1l-0.2-0.1l-0.2-0.1l-0.2-0.1l-0.1-0.1l-0.2-0.1h-0.1l-0.2-0.1l-0.1-0.1l-0.1-0.1
2401
+ l-0.4-0.3l-0.2-0.3l-0.2-0.3l-0.2-0.3l-0.2-0.3l-0.2-0.3l-0.2-0.3l-0.2-0.3l-0.2-0.3l-0.1-0.3l-0.2-0.3l-0.1-0.3l-0.1-0.3l-0.1-0.3
2402
+ L510,346l-0.1-0.3l-0.1-0.3l-0.1-0.3v-0.3v-0.3v-0.3l0.1-0.3l0.1-0.3l0.1-0.3l0.1-0.3l0.1-0.3l0.1-0.3l0.1-0.3l0.2-0.3l0.1-0.3
2403
+ l0.2-0.2l0.1-0.2l0.2-0.2l0.2-0.2l0.2-0.2l0.2-0.2l0.2-0.2l0.2-0.2l0.2-0.2l0.2-0.2l0.4-0.3l0.4-0.3l0.4-0.3l0.4-0.3l0.5-0.3
2404
+ l0.4-0.3l0.5-0.3l0.4-0.3l0.9-0.6l0.9-0.6l0.9-0.6l0.4-0.3l0.4-0.3l0.4-0.3l0.4-0.3l0.4-0.3l0.4-0.3l0.4-0.3l0.3-0.3l0.4-0.3
2405
+ l0.3-0.3l0.1-0.1l0.1-0.1l0.2-0.1l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1v-0.1
2406
+ l0.1-0.1l0.1-0.1l0.1-0.1v-0.1l0.1-0.1v-0.1l0.1-0.1V330v-0.1v-0.1v-0.1v-0.1v-0.1v-0.1v-0.2l-0.1-0.2v-0.2l-0.1-0.2l-0.1-0.2
2407
+ l-0.1-0.2L524,328l-0.1-0.2l-0.1-0.2l-0.1-0.2v-0.1h-0.1l0,0h-0.1l-0.2-0.1l-0.1-0.1L523,327h-0.2h-0.2h-0.3H522h-0.4h-0.3h-0.4
2408
+ h-0.4h-0.4h-0.4h-0.4h-0.4h-0.5H518h-0.5l-0.9,0.1l-1,0.1l-1,0.1l-1,0.1l-1,0.1l-1,0.1l-0.9,0.1l-2,0.3l-0.9,0.1l-0.9,0.1l-0.8,0.1
2409
+ l-0.8,0.1l-0.8,0.1h-0.4h-0.4h-0.4h-0.4h-0.4h-0.4h-0.4h-0.4l-0.4-0.1l-0.4-0.1l-0.4-0.1l-0.4-0.1l-0.3-0.1l-0.4-0.1l-0.3-0.1
2410
+ l-0.3-0.1l-0.4-0.2l-0.3-0.2l-0.3-0.2l-0.3-0.2l-0.3-0.2l-0.3-0.2l-0.6-0.4l-0.5-0.4l-0.6-0.4l-0.6-0.4l-0.5-0.4l-0.6-0.4l-1.1-0.8
2411
+ l-0.5-0.4l-0.5-0.4l-0.6-0.4l-0.5-0.4l-0.5-0.4l-0.5-0.3l-0.5-0.3l-0.2-0.1l-0.2-0.1l-0.2-0.1l-0.2-0.1l-0.2-0.1l-0.2-0.1L487,320
2412
+ l-0.2-0.1l-0.2-0.1l-0.2-0.1l-0.1-0.1h-0.2h-0.2h-0.1h-0.1h-0.1h-0.1h-0.2V319z"
2413
+ />
2414
+ <path
2415
+ fill="#25B3FF"
2416
+ d="M486.3,321.2h0.2h0.1h0.2h0.1h0.2h0.1l0.1,0.1l0.2,0.1l0.1,0.1h0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.3,0.2l0.2,0.2
2417
+ l0.1,0.1l0,0h0.1h0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.3,0.1l0.3,0.1l0.3,0.1l0.3,0.1l0.3,0.1l0.3,0.1l0.3,0.1l0.2,0.1l0.4,0.1h0.1
2418
+ l0.2,0.1l0.2,0.1l0.2,0.1l0.2,0.1l0.2,0.1l0.1,0.1l0.2,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.2l0.1,0.2l0.1,0.2l0.1,0.2l0.1,0.2
2419
+ l0.1,0.2l0.1,0.2v0.2l0.1,0.1h0.2l0.6,0.1l0.6,0.1l0.6,0.1l0.6,0.1l0.6,0.1l0.5,0.1l0.3,0.1l0.3,0.1l0.3,0.1l0.2,0.1l0.3,0.1
2420
+ l0.2,0.1l0.3,0.1l0.3,0.1l0.2,0.2l0.3,0.2l0.1,0.1h0.2h0.3h0.3h0.3h0.3h0.3h0.3h0.3l0.3,0.1l0.4,0.1l0.3,0.1l0.3,0.1l0.4,0.1
2421
+ l0.3,0.2l0.4,0.2l0.3,0.2l0.4,0.2l0.3,0.3l0.3,0.3l0.2,0.3l0.2,0.4l0.2,0.4l0.2,0.4l0.1,0.4l0.1,0.4l0.1,0.3v0.2v0.2v0.2v0.3v0.3
2422
+ l-0.1,0.2l-0.1,0.2v0.1l-0.1,0.1l-0.1,0.1l-0.1,0.2l-0.1,0.2l-0.1,0.1l-0.1,0.2l-0.1,0.2l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1
2423
+ l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.2,0.2l-0.3,0.2l-0.3,0.2l-0.2,0.1l-0.3,0.1l-0.3,0.1l-0.2,0.1l-0.2,0.1l-0.2,0.1
2424
+ l-0.5,0.1l-0.4,0.1l-0.4,0.1l-0.4,0.1l-0.5,0.1l-0.4,0.1h-0.4h-0.4H500l-0.9,0.1h-0.3l0.1,0.1l0.1,0.2l0.1,0.2l0,0l0.1,0.2l0.1,0.2
2425
+ v0.2l0.1,0.2v0.2v0.1v0.2l-0.1,0.2v0.2v0.2l-0.1,0.1v0.1l-0.1,0.1L499,341v0.1l-0.1,0.2l-0.1,0.2l-0.1,0.2l-0.2,0.3l-0.1,0.2
2426
+ l-0.2,0.2l-0.2,0.2l-0.3,0.3l-0.4,0.3l-0.4,0.3l-0.4,0.3l-0.4,0.3l-0.4,0.3l-0.4,0.3l-0.4,0.3l-0.8,0.6l-0.9,0.6l-0.9,0.6l-0.8,0.5
2427
+ l-0.8,0.5l-0.2,0.1h0.1l0.1,0.1l0.1,0.1l0.1,0.1l0,0l0.1,0.2l0.1,0.1l0.1,0.2l0,0l0.1,0.1v0.1l0.1,0.1l0,0v0.1l0.1,0.1v0.2l0,0
2428
+ l-0.1,0.2v0.2l0,0v0.2l-0.1,0.2l0,0l-0.1,0.1v0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1
2429
+ l-0.1,0.2l-0.2,0.3l-0.2,0.3l-0.2,0.2l-0.2,0.2l-0.5,0.5l-0.5,0.5l-1.1,0.9l-0.5,0.4l-0.5,0.4l-0.5,0.4l-0.2,0.2l-0.2,0.2l-0.1,0.1
2430
+ l-0.2,0.1l-0.2,0.1l-0.1,0.1l-0.2,0.1l-0.2,0.1l-0.2,0.1l-0.2,0.1h-0.2h-0.2h-0.2h-0.2h-0.2h-0.2h-0.2h-0.2l-0.2-0.1l-0.2-0.1
2431
+ l-0.2-0.1l-0.1-0.1l-0.2-0.1l-0.2-0.1l-0.1-0.1l-0.2-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.2l-0.1-0.2l-0.1-0.2l-0.1-0.2l-0.1-0.2
2432
+ l-0.1-0.2l-0.1-0.2V354v-0.2v-0.2v-0.2v-0.2l0.1-0.2l0.1-0.2l0.1-0.2l0.1-0.2l0.1-0.2l0.1-0.2l0.1-0.2l0.1-0.2l0.1-0.1l0.2-0.1
2433
+ l0.2-0.3l0.3-0.3l0.5-0.5l0.1-0.1l-0.1-0.1L482,350l-0.1-0.1l0,0l-0.2-0.1l-0.1-0.1l0,0l-0.1-0.1l-0.1-0.1l-0.1-0.1l0,0l-0.1-0.1
2434
+ l-0.1-0.1l-0.1-0.1l0,0l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l0,0v-0.2l-0.1-0.2v-0.2l0,0V348v-0.2v-0.1l0,0v-0.2v-0.2l0.1-0.2l0,0
2435
+ l0.1-0.2l0.1-0.2l0.1-0.2v-0.1l0.1-0.2l0.1-0.2l0.1-0.2l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.2l0.2-0.2l0.2-0.2l0.2-0.2l0.2-0.1l0.2-0.1
2436
+ l0.4-0.2l0.4-0.2l0.4-0.2l0.7-0.4l0.7-0.3l0.2-0.1l0.2-0.1l0.5-0.3l0.5-0.3l0.6-0.4l0.3-0.2h-0.1H487h-0.4l-0.4-0.1l-0.4-0.1
2437
+ l-0.4-0.1l-0.2-0.1l-0.2-0.1l-0.2-0.1l-0.1-0.1l-0.1-0.1h-0.1l-0.2-0.1l-0.1-0.1h-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1h-0.1l-0.1-0.1
2438
+ l-0.1-0.1l-0.1-0.1l-0.1-0.2h-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.2l0,0v-0.1h-0.1h-0.1l-0.5,0.2l-0.5,0.2l-0.5,0.2
2439
+ l-0.5,0.1l-0.5,0.1l-0.5,0.1l-0.5,0.1l-0.5,0.1l-0.5,0.1h-0.2h-0.2h-0.3h-0.2h-0.3h-0.3l-0.3-0.1l-0.4-0.1l-0.2-0.1l-0.2-0.1
2440
+ l-0.1-0.1h-0.1l-0.2-0.1l-0.1-0.1h-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1L474,339l-0.1-0.1l-0.1-0.1
2441
+ l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1v-0.1l-0.1-0.2l-0.1-0.1l-0.8-0.2l-0.4-0.1l-0.4-0.1l-0.4-0.1l-0.4-0.1
2442
+ l-0.1-0.1l-0.2-0.1l-0.1-0.1h-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.2-0.1l-0.1-0.1l0,0l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.2l-0.1-0.2
2443
+ l-0.1-0.2l-0.1-0.2l-0.1-0.2l-0.1-0.2l0,0l-0.1-0.2l-0.1-0.2v-0.2v-0.2v-0.2v-0.2l0.1-0.2v-0.2l0.1-0.2l0.1-0.2l0.1-0.2l0,0
2444
+ l0.1-0.2l0.1-0.2l0.1-0.2l0.1-0.1l0.1-0.1l0.2-0.1l0.1-0.1l0.1-0.1l0.2-0.1l0.1-0.1l0.2-0.1h0.1l0.1-0.1l0.2-0.1l0.2-0.1h0.1h0.2
2445
+ h0.1h0.2h0.1h0.2h0.2h0.6h0.3h0.1l0.2-0.1l0.4-0.1l0.4-0.1l0.4-0.1l0.5-0.1l0.4-0.1h-0.1v-0.2L475,330l0,0v-0.2l-0.1-0.2v-0.2v-0.2
2446
+ V329l0.1-0.1v-0.1v-0.2l0.1-0.1v-0.1l0.1-0.2v-0.1l0.1-0.1l0.1-0.2l0.1-0.1l0.1-0.1l0.1-0.2l0.1-0.1l0.1-0.1l0.1-0.3l0.2-0.4
2447
+ l0.3-0.3l0.2-0.3l0.3-0.3l0.2-0.2l0.3-0.2l0.3-0.2l0.3-0.2l0.3-0.2l0.3-0.2l0.3-0.1l0.4-0.1l0.3-0.1l0.3-0.1l0.3-0.1l0.3-0.1
2448
+ l0.4-0.1l0.3-0.1l0.3-0.1l0.3-0.1h0.2l0,0l0.1-0.2v-0.1l0.1-0.2v-0.2h0.1v-0.1l0.1-0.1l0.1-0.1l0,0l0.1-0.1l0.1-0.1l0.1-0.1
2449
+ l0.1-0.1h0.1l0.1-0.2l0.1-0.1l0.1-0.1l0.2-0.1l0,0l0.1-0.1l0.2-0.1l0.1-0.1l0.2-0.1l0.1-0.1h0.1l0.2-0.1l0.1-0.1h0.2h0.2h0.2l0,0
2450
+ h0.2h0.2L486.3,321.2z"
2451
+ />
2452
+ <path
2453
+ fill="#25B3FF"
2454
+ d="M455.7,235.5L455.7,235.5h0.2h0.1h0.1h0.2l0,0h0.1h0.2l0.1,0.1l0,0l0.2,0.1l0.1,0.1l0.2,0.1l0,0l0.1,0.1
2455
+ l0.1,0.1l0.1,0.1l0.1,0.1l0,0l0.1,0.1l0.1,0.1l0.1,0.1l0,0l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0,0l0.1,0.1l0.1,0.1v0.1h0.1v0.1
2456
+ l0.1,0.1v0.1l0,0l0.1,0.2v0.2v0.2v0.2v0.2v0.1h0.1h0.1h0.1h0.1h0.1h0.1h0.1h0.1h0.2h0.1h0.1h0.2h0.1h0.1h0.1h0.1h0.1h0.1l0.1,0.1
2457
+ l0.1,0.1l0.1,0.1h0.1l0.1,0.1l0.1,0.1l0.1,0.1l0,0l0.1,0.1l0.1,0.1l0.1,0.1h0.1l0.1,0.1l0.1,0.1l0.1,0.1l0,0l0.1,0.1l0.1,0.1
2458
+ l0.1,0.1l0,0l0.1,0.2l0.1,0.2l0,0l0.1,0.1l0.1,0.1v0.1l0.1,0.1v0.1l0.1,0.2v0.3v0.2v0.1v0.1v0.1v0.1l-0.1,0.2v0.2l-0.1,0.2
2459
+ l-0.1,0.4l-0.2,0.5l-0.2,0.5l-0.2,0.6l-0.2,0.6l-0.2,0.6l-0.2,0.6l-0.1,0.3l-0.1,0.3l-0.1,0.3l-0.1,0.2l0,0l0.1,0.1l0.1,0.2
2460
+ l0.1,0.2l0.1,0.2l0.1,0.2l0.1,0.2v0.2v0.2l0.1,0.2v0.2l-0.1,0.2v0.2l-0.1,0.2v0.2l-0.1,0.2l-0.1,0.2l-0.1,0.2l-0.1,0.2l-0.1,0.1
2461
+ l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.2,0.1l-0.1,0.1l-0.2,0.1l-0.2,0.1l-0.1,0.1l-0.2,0.1h-0.2h-0.2H459
2462
+ h-0.2h-0.2h-0.2h-0.1h-0.1H458h-0.1h-0.1h-0.2h-0.1l-0.2-0.1h-0.1l-0.1-0.1l-0.2-0.1l-0.1-0.1h-0.1l-0.2-0.1l-0.1-0.1l-0.1-0.1
2463
+ h-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.2v-0.1l-0.1-0.1l-0.1-0.1
2464
+ l-0.1-0.1v-0.1l-0.1-0.1l-0.1-0.2l-0.1-0.3l-0.1-0.3V249v-0.3v-0.4l0.1-0.4v-0.4l0.1-0.1h-0.1l-0.6,0.3l-0.7,0.3l-0.7,0.3l-0.4,0.2
2465
+ l-0.4,0.2l-0.4,0.2l-0.4,0.2l-0.4,0.1l-0.4,0.1l-0.4,0.1l-0.4,0.1l-0.5,0.1l-0.5,0.1l-0.4,0.1l-0.5,0.1L447,250h-0.5H446h-0.5h-0.3
2466
+ H445h-0.2h-0.2h-0.3l-0.2-0.1l-0.3-0.1l-0.2-0.1l-0.2-0.1l-0.3-0.1l-0.2-0.1l-0.3-0.1l-0.2-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1
2467
+ l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1h-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1h-0.1l-0.1-0.1L441,248l-0.1-0.1l0,0l-0.1-0.1l-0.1-0.1
2468
+ l-0.1-0.1l-0.1-0.1l0,0v-0.1h-0.1h-0.1h-0.2H440h-0.2h-0.1h-0.1h-0.1l-0.2-0.1l-0.2-0.1l-0.1-0.1h-0.1l-0.1-0.1l-0.2-0.1l-0.1-0.1
2469
+ l-0.1-0.1h-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1v-0.1
2470
+ l-0.1-0.1v-0.1l-0.1-0.1v-0.1l-0.1-0.1v-0.1v-0.1v-0.2v-0.1v-0.1l0,0l0.1-0.2V244l0.1-0.2l0,0l0.1-0.1v-0.1l0.1-0.1l0.1-0.1
2471
+ l0.1-0.1l0.1-0.1l0.1-0.2l0.1-0.2l0.2-0.2l0.2-0.3l0.3-0.3l0.3-0.2l0.2-0.2l0.3-0.2l0.3-0.2l0.3-0.2l0.6-0.4l0.7-0.4l0.7-0.4
2472
+ l0.5-0.3H442l-0.8,0.1h-0.4h-0.5h-0.4h-0.4h-0.4h-0.5h-0.4h-0.4h-0.4h-0.5l-0.4-0.1l-0.4-0.1l-0.5-0.1l-0.4-0.1l-0.2-0.1l-0.2-0.1
2473
+ l-0.2-0.1l-0.2-0.1l-0.2-0.1l-0.2-0.1l-0.2-0.2l-0.1-0.1l-0.1-0.1l-0.1-0.1h-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l0,0l-0.1-0.1l-0.1-0.1
2474
+ l-0.1-0.1h-0.1l-0.1-0.2l-0.1-0.2l-0.1-0.2l0,0l-0.1-0.1v-0.1l-0.1-0.1l0,0l0,0l-0.4-0.1l-0.3-0.1l-0.2-0.1l-0.3-0.1l-0.2-0.1
2475
+ l-0.2-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1
2476
+ v-0.1l-0.1-0.2l-0.1-0.2L429,234l-0.1-0.2v-0.1v-0.2l-0.1-0.2v-0.2v-0.2v-0.1v-0.2v-0.2l0.1-0.2V232l0.1-0.1v-0.1l0.1-0.1l0.1-0.1
2477
+ v-0.1l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.2l0.3-0.3l0.2-0.2l0.2-0.2l0.3-0.2l0.2-0.2l0.2-0.2l0.3-0.1
2478
+ l0.2-0.1l0.3-0.1l0.2-0.1l0.3-0.1l0.2-0.1l0.3-0.1l0.3-0.1l0.2-0.1l0.5-0.1l0.6-0.1l0.5-0.1l0.5-0.1l0.6-0.1l0.6-0.1l0.5-0.1h0.6
2479
+ h0.5h0.6l1.1-0.1l2.1-0.1l0.9-0.1h0.4h0.4h0.3h0.3h0.2h0.2l0.8-0.2l0.8-0.2l0.8-0.2l0.8-0.2l0.1-0.1l0.2-0.1l0.2-0.1l0.5-0.2
2480
+ l0.4-0.2l0.4-0.2l0.4-0.2l0.4-0.2l0.5-0.1l0.2-0.1h0.2h0.2h0.2h0.2h0.2h0.2h0.2h0.2h0.2h0.2l0.2,0.1l0.1,0.1l0.2,0.1l0.2,0.1
2481
+ l0.1,0.1l0.1,0.1l0.2,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.2l0.1,0.2l0.1,0.2l0.1,0.2l0.1,0.2v0.2l0.1,0.2
2482
+ v0.2v0.2v0.2v0.2l-0.1,0.2v0.2l-0.1,0.2l-0.1,0.2l-0.1,0.2l-0.1,0.2l-0.1,0.1l-0.1,0.1l0,0l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1
2483
+ l-0.1,0.1l-0.1,0.1l-0.2,0.1l-0.1,0.1l0,0l-0.2,0.1L454,231l-0.2,0.1l-0.4,0.2l-0.6,0.2l-0.7,0.3l-0.5,0.2l0,0l0.1,0.2v0.2v0.2v0.2
2484
+ v0.2l-0.1,0.2v0.2l-0.1,0.2l-0.1,0.2l-0.1,0.2l0,0l-0.1,0.1l0.2,0.1l0.2,0.1l0.1,0.1l0.1,0.1l0,0l0.1,0.1l0.1,0.1h0.1l0.1,0.1
2485
+ l0.1,0.1h0.1l0.1,0.1l0.1,0.1l0.1,0.1v0.1l0.1,0.1l0.1,0.1l0.1,0.1v0.1l0.1,0.2l0.1,0.2v0.1l0.1,0.1v0.1l0.1,0.1v0.1v0.1v0.1
2486
+ l0.2-0.1h0.1h0.2h0.1h0.1h0.1h0.1h0.1h0.1h0.2h0.1L455.7,235.5z M458.8,246.9L458.8,246.9h-0.2H458.8z"
2487
+ />
2488
+ <g>
2489
+ <g transform="matrix(1,0,0,1,454.698,46.683)">
2490
+ <path
2491
+ d="M343.4,257.1h0.9h0.9h0.9h0.9h0.5h0.2l0.3-0.1l0.4-0.1h0.4h0.4h0.4h0.4h0.4h0.4h0.3h0.3h0.3h0.3h0.3h0.3h0.3
2492
+ l0.3,0.1l0.7,0.1l0.7,0.1l0.6,0.2l0.6,0.2l0.6,0.2l0.6,0.2l0.6,0.2l0.6,0.2l0.4,0.1l0.6,0.1l0.6,0.1h0.2h0.2h0.3h0.3l0.8,0.1
2493
+ l0.9,0.1l1,0.1l1.1,0.1l1.1,0.2l0.6,0.1l0.6,0.1l0.6,0.1l0.6,0.1l0.6,0.1l0.6,0.1l0.6,0.1l0.6,0.1l0.5,0.1l0.5,0.2l0.5,0.2
2494
+ l0.3,0.1l0.3,0.1l0.3,0.1l0.3,0.1l0.3,0.1l0.3,0.1l0.3,0.2l0.3,0.2l0.3,0.2l0.2,0.2l0.3,0.2l0.2,0.2l0.2,0.2l0.1,0.1l0.2,0.3
2495
+ l0.1,0.2l0.1,0.2l0.1,0.2l0.1,0.3v0.2v0.2v0.2v0.1v0.2v0.2l0,0v0.3v0.3l0,0v0.2l-0.1,0.2l-0.1,0.2l0,0l-0.1,0.2l-0.1,0.2
2496
+ l-0.1,0.2l0,0l-0.2,0.2l-0.2,0.2l-0.2,0.2l0,0l-0.2,0.1l-0.2,0.1l-0.2,0.1l0,0l-0.2,0.1l-0.2,0.1l0,0H374h-0.2l0,0h-0.3h-0.1
2497
+ h-0.2H373h-0.1l-0.3-0.1l-0.2-0.1l-0.3-0.1l-0.3-0.1l-0.3-0.1l-0.5-0.2l-0.5-0.2l-1.1-0.5l-0.5-0.2l-0.2-0.1l-0.2-0.1l-0.2-0.1
2498
+ l-0.2-0.1l-0.2-0.1h-0.1h-0.1h-0.1l0,0h-0.3h-0.4h-0.4h-0.3h-0.3h-0.3h-0.3H365l-0.3-0.1l-0.3-0.1l-0.7-0.1l-0.7-0.1l-0.6-0.2
2499
+ l-0.6-0.2l-0.6-0.2l-0.6-0.2l-0.6-0.2l-1.2-0.4l-0.5-0.2l-0.4-0.1l-0.6-0.1l-0.6-0.1l-0.6-0.1l-0.7-0.1l-0.7-0.1l-0.7-0.1
2500
+ l-0.7-0.1l-0.7-0.1l-0.8-0.1l-0.8-0.1l-0.8-0.1l-0.8-0.1H349l-0.4,0.1l-0.7,0.1l-0.7,0.1l-0.7,0.1l-0.7,0.1l-0.7,0.1l-0.7,0.1
2501
+ l-0.7,0.1l-0.7,0.1l-0.7,0.1l-0.7,0.1l-1.4,0.1l-1.5,0.1l-1.5,0.1l-1.5,0.1l-1.5,0.1l-1.5,0.1h-1.5h-1.5h-1.5h-1.5h-2.4h-0.9l0,0
2502
+ l-0.8,0.2l-0.8,0.2l-0.8,0.2l-0.7,0.2l-0.7,0.2l-0.7,0.2l-0.7,0.3l-0.7,0.3l-0.3,0.1l-0.3,0.1l-0.3,0.1l-0.3,0.1l-0.3,0.1
2503
+ l-0.3,0.1l-0.3,0.1l-0.3,0.1l-0.3,0.2l-0.3,0.2l-0.3,0.1l-0.3,0.2l-0.3,0.2l-0.2,0.2l-0.2,0.2l-0.2,0.2l-0.2,0.2l-0.2,0.2
2504
+ l-0.2,0.2l-0.2,0.2l-0.2,0.2l-0.2,0.1h0.1l0.3,0.1l0.3,0.1l0.4,0.1l0.4,0.1l0.4,0.1l0.4,0.1l0.4,0.1l0.4,0.1l0.9,0.1l1,0.1l1,0.1
2505
+ l1,0.1l2,0.2l1,0.1l1,0.1l0.9,0.1l0.5,0.1l0.5,0.1l0.5,0.1l0.4,0.1l0.4,0.1l0.4,0.1l0.4,0.1l0.4,0.1l0.4,0.1l0.4,0.1l0.4,0.1
2506
+ l0.4,0.2l0.4,0.2l0.2,0.1l0.3,0.2h0.1l0.1,0.1l0.1,0.1l0.4,0.2l0.4,0.2l0.5,0.2l0.5,0.3l0.3,0.2l0.3,0.2l0.3,0.2l0.3,0.2l0.3,0.2
2507
+ l0.3,0.2l0.3,0.2l0.3,0.3l0.3,0.3l0.3,0.3l0.2,0.2l0.1,0.2l0.1,0.2l0.1,0.2l0.1,0.2l0.1,0.2l0.1,0.2l0.1,0.2l0.1,0.3l0.1,0.3
2508
+ l0.1,0.3v0.3v0.3v0.3v0.3v0.3v0.3l-0.1,0.3l-0.1,0.3l-0.1,0.3l-0.1,0.3l-0.1,0.3l-0.2,0.3l-0.2,0.3l-0.2,0.3l-0.2,0.2l-0.2,0.2
2509
+ l-0.2,0.2l-0.2,0.2l-0.2,0.2l-0.2,0.2l-0.2,0.2l-0.2,0.2l-0.2,0.2l-0.2,0.2l-0.2,0.1l-0.2,0.1l-0.2,0.1l-0.3,0.1l-0.3,0.1
2510
+ l-0.5,0.2l-0.5,0.2l-0.6,0.2l-0.6,0.2l-0.6,0.2l-0.6,0.2l-0.6,0.2l-0.6,0.2l-0.6,0.2l-0.7,0.1l-0.7,0.1l-0.7,0.1l-0.7,0.1
2511
+ l-0.7,0.1l-0.7,0.1l-0.7,0.1l-0.7,0.1l-0.7,0.1l-0.7,0.1l-0.7,0.1l-1.4,0.2l-1.4,0.1l-1.4,0.1l-1.3,0.1L312,289l-1.2,0.1
2512
+ l-1.2,0.1l-1.1,0.1h-1l-1.8,0.1h-1.3h-0.5h-0.2h-0.1h-0.3H303h-0.3l-0.3-0.1l-0.3-0.1l-0.3-0.1l0,0l-0.3-0.2l-0.2-0.2l-0.2-0.2
2513
+ l-0.2-0.2l-0.2-0.2l-0.1-0.3l-0.1-0.3l-0.1-0.3l-0.1-0.3v-0.3v-0.3V286l0.1-0.3l0.1-0.3l0.1-0.3l0.1-0.3l0,0l0.2-0.2l0.2-0.2
2514
+ l0.2-0.2l0.2-0.2l0.2-0.2l0.3-0.1l0.3-0.1l0.3-0.1l0,0h0.2h0.2h0.2h0.4h0.5h1.3l1.7-0.1h1l1.1-0.1l1.1-0.1l1.2-0.1l1.2-0.1
2515
+ l1.3-0.1l1.3-0.1l1.3-0.1l1.3-0.1l0.7-0.1l0.7-0.1l0.7-0.1l0.6-0.1l0.6-0.1l0.6-0.1l0.6-0.1l0.6-0.1l0.6-0.1l0.6-0.1l0.6-0.1
2516
+ l0.5-0.1l0.5-0.1l0.5-0.1l0.5-0.1l0.5-0.1l0.4-0.1l0.4-0.1l0.4-0.2l0.3-0.2l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1l0,0
2517
+ h-0.1l-0.2-0.1l-0.2-0.1l-0.2-0.1l-0.4-0.2l-0.4-0.2l-0.5-0.2l-0.5-0.2l-0.3-0.1l-0.3-0.1l-0.3-0.2l-0.2-0.1l0,0h-0.1h-0.1
2518
+ l-0.1-0.1l-0.2-0.1l-0.2-0.1l-0.2-0.1l-0.3-0.1l-0.3-0.1l-0.3-0.1l-0.4-0.1l-0.4-0.1l-0.4-0.1h-0.4l-0.9-0.1l-0.9-0.1l-1-0.1
2519
+ l-2-0.2l-1-0.1l-1-0.1l-1-0.1l-1-0.1l-0.5-0.1l-0.5-0.1l-0.5-0.1l-0.5-0.1l-0.5-0.1l-0.5-0.1l-0.5-0.1l-0.4-0.1l-0.4-0.1
2520
+ l-0.4-0.1l-0.4-0.1l-0.4-0.2l-0.4-0.2l-0.4-0.2l-0.2-0.1l-0.2-0.1l-0.2-0.1l-0.2-0.1l-0.2-0.1l-0.2-0.2l-0.2-0.2l-0.2-0.2
2521
+ l-0.2-0.2l-0.2-0.2l-0.2-0.2l-0.2-0.3l-0.1-0.3l-0.1-0.3l-0.1-0.3l-0.1-0.3l-0.1-0.3v-0.3v-0.3v-0.3v-0.3l0.1-0.3l0.1-0.3
2522
+ l0.1-0.3l0.1-0.3l0.1-0.3l0.1-0.2l0.1-0.2l0.1-0.2l0.2-0.2l0.2-0.2l0.2-0.2l0.2-0.2l0.2-0.2l0.2-0.2l0.2-0.2l0.3-0.3l0.3-0.3
2523
+ l0.3-0.3l0.3-0.2l0.3-0.2l0.3-0.2l0.3-0.2l0.3-0.2l0,0l-1.4-0.1l-1.4-0.1l-1.3-0.1l-1.3-0.1l-1.2-0.2l-0.4-0.1h-0.5l-1.1-0.1
2524
+ l-1.2-0.1l-0.6-0.1l-0.7-0.1l-0.7-0.1l-0.7-0.1l-0.7-0.1l-0.7-0.1l-0.7-0.1l-0.4-0.1l-0.3-0.1l-0.3-0.1l-0.3-0.1l-0.3-0.1
2525
+ l-0.3-0.1l-0.3-0.1l-0.3-0.1l-0.3-0.1l-0.3-0.1l-0.3-0.2l-0.3-0.2l-0.3-0.2l-0.3-0.2l-0.3-0.2l-0.3-0.2l-0.3-0.2l-0.3-0.3
2526
+ l-0.3-0.3l-0.3-0.3l-0.3-0.3l-0.3-0.3l-0.2-0.3l-0.2-0.4l-0.2-0.4l-0.2-0.4l-0.2-0.4l-0.1-0.4l-0.1-0.4l-0.1-0.4l-0.1-0.4V255
2527
+ v-0.5V254v-0.5l0.1-0.5l0.1-0.5l0.1-0.5l0.1-0.3l0.1-0.3l0.1-0.3l0.1-0.3l0.1-0.3l0.1-0.3l0.1-0.2l0.2-0.2l0.2-0.2l0.2-0.2
2528
+ l0.2-0.2l0.2-0.2l0.2-0.2l0.2-0.2l0.2-0.2l0.2-0.2l0.4-0.3l0.4-0.3l0.4-0.3l0.4-0.3l0.4-0.3l0.4-0.3l0.4-0.3l0.4-0.3l0.4-0.2
2529
+ l0.4-0.2l0.4-0.2l0.4-0.2l0.8-0.4l0.8-0.4l1.4-0.7l0.6-0.3l0.5-0.3l0.3-0.1l0.3-0.1l0.3-0.1l0.3-0.1l0.3-0.1l0.3-0.1l0.3-0.1
2530
+ l0.3-0.1l0.3-0.1l0.3-0.1l0.3-0.1l0.3-0.1l0.3-0.1h0.3h0.3h0.3h0.3h0.3h0.6h0.6h0.6h0.5h0.5l0.5,0.1l0.5,0.1l0.5,0.1l0.5,0.1
2531
+ l0.5,0.1l0.5,0.1l1,0.2l0.9,0.2l0.9,0.2l0.9,0.2l0.4,0.1l0.4,0.1l0.4,0.1l0.4,0.1l0.7,0.1l0.7,0.1l0.7,0.1l0.7,0.1l0.7,0.1
2532
+ l0.7,0.1l0.7,0.1l0.7,0.1l0.7,0.1h0.7h0.7h0.8h0.8h0.8l1.5,0.1h1.5h1.5h1.5h1.5h3h2.9h1.1h1.1h1.1l1.1-0.1l1.1-0.1l1.1-0.1
2533
+ l1.1-0.1l1.1-0.1l1.1-0.1l1.1-0.2l1.1-0.2l1.1-0.2l0.5-0.1l0.5-0.1l0.5-0.1l0.5-0.1l0.5-0.1l0.5-0.1l0.5-0.1l0.5-0.1h0.1h0.1
2534
+ l0.2-0.1l0.2-0.1l0.2-0.1l0.3-0.1l0.6-0.3l0.6-0.3l0.6-0.3l0.7-0.3l0.6-0.3l0.6-0.3l0.3-0.1l0.3-0.1l0.3-0.1l0.3-0.1l0.3-0.1
2535
+ l0.4-0.1l0.3-0.1h0.3h0.2h0.2h0.2h0.1h0.2h0.2l0,0l0.3,0.1l0.3,0.1l0,0l0.2,0.1l0.2,0.1l0.2,0.2l0,0l0.2,0.2l0.2,0.2l0.2,0.2l0,0
2536
+ l0.1,0.2l0.1,0.2l0.1,0.3l0,0l0.1,0.2v0.2v0.2l0,0v0.3v0.3v0.1v0.2v0.2v0.1l-0.1,0.3l-0.1,0.2l-0.1,0.3l-0.1,0.2l-0.1,0.2
2537
+ l-0.2,0.3l-0.2,0.2l-0.2,0.2l-0.2,0.2l-0.3,0.2l-0.3,0.1l-0.3,0.1l-0.3,0.1l-0.3,0.1h-0.3h-0.3h-0.3h-0.2l0,0l-0.6,0.3l-0.6,0.3
2538
+ l-0.7,0.3l-0.7,0.3l-0.7,0.3l-0.4,0.2l-0.4,0.2l-0.4,0.1L357,248l-0.4,0.1l-0.3,0.1l-0.6,0.1l-0.6,0.1l-0.6,0.1l-0.6,0.1
2539
+ l-0.6,0.1l-0.6,0.1l-0.6,0.1l-0.6,0.1l-1.2,0.2l-1.2,0.2l-1.2,0.2l-1.2,0.2l-1.2,0.1l-1.2,0.1l-1.2,0.1l-1.2,0.1l-1.2,0.1h-1.2
2540
+ h-1.2h-1.2h-2.9h-3h-1.5h-1.6h-1.6h-1.6l-1.6-0.1h-0.8h-0.8h-0.8h-0.8l-0.8-0.1l-0.8-0.1l-0.8-0.1l-0.8-0.1l-0.8-0.1l-0.8-0.1
2541
+ l-0.8-0.1l-0.8-0.1l-0.8-0.1l-0.8-0.1l-0.5-0.1l-0.5-0.1l-0.5-0.1l-0.5-0.1l-1-0.2l-0.9-0.2l-0.9-0.2l-0.9-0.2l-0.4-0.1l-0.4-0.1
2542
+ l-0.4-0.1l-0.4-0.1l-0.4-0.1H304h-0.4h-0.4h-0.4h-0.4H302h-0.2h-0.2h-0.2h-0.2H301h-0.2h-0.2h-0.2h-0.2H300l-0.2,0.1l-0.2,0.1
2543
+ l-0.2,0.1l-0.2,0.1L299,248l-0.2,0.1l-0.2,0.1l-0.2,0.1l-0.6,0.3l-0.7,0.3l-1.4,0.6l-0.7,0.3l-0.7,0.4l-0.4,0.2l-0.3,0.2
2544
+ l-0.3,0.2L293,251l-0.3,0.2l-0.3,0.2l-0.3,0.2l-0.3,0.2l-0.3,0.2l-0.2,0.2l-0.2,0.2l-0.2,0.2l-0.1,0.1l-0.1,0.1l-0.1,0.1
2545
+ l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1v0.1v0.1v0.1l0,0l0,0l0,0l0,0l0,0l0,0v0.2v0.2v0.2v0.2v0.1v0.1v0.1v0.1v0.1v0.1v0.1v0.1v0.1
2546
+ v0.1v0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.2,0.1l0.2,0.1l0.2,0.1l0.2,0.1l0.2,0.1
2547
+ l0.2,0.1l0.2,0.1l0.2,0.1l0.2,0.1l0.2,0.1l0.2,0.1l0.3,0.1l0.3,0.1l0.3,0.1l0.6,0.1l0.6,0.1l0.6,0.1l0.6,0.1l0.6,0.1l0.6,0.1
2548
+ l0.6,0.1l1.1,0.1l1.1,0.1l0.5,0.1l0.5,0.1l1.2,0.1l1.2,0.1l1.3,0.1l1.3,0.1l1.3,0.1l1.4,0.1l1.4,0.1l1.4,0.1l1.4,0.1l1.4,0.1
2549
+ l1.4,0.1l1.5,0.1h1.5h1.4h0.1l0.9-0.2l0.9-0.2l0.9-0.2l0.9-0.2l0.9-0.1l0.9-0.1l0.9-0.1l0.9-0.1l0.9-0.1l0.9-0.1l1-0.1l0.9-0.1
2550
+ l1-0.1l1-0.1h0.9h0.9h0.9h0.9h0.9h0.9h0.9L343.4,257.1z M303.7,289.4L303.7,289.4L303.7,289.4L303.7,289.4z"
2551
+ />
2552
+ </g>
2553
+ <g transform="matrix(1,0,0,1,381.866,45.2348)">
2554
+ <path
2555
+ d="M-30.6-41.7h1l1,0.1l1,0.1l1,0.1l1,0.1l1,0.1l1,0.1l1,0.2l1,0.2l1,0.2l1,0.2l1,0.2l1,0.3l1,0.3l0.5,0.2
2556
+ l0.5,0.2l0.5,0.2l0.5,0.2l0.5,0.2l0.5,0.2l0.5,0.2l0.5,0.2l0.5,0.2l0.5,0.2l0.5,0.2l0.5,0.2l0.5,0.2l0.5,0.2l0.5,0.2l0.5,0.2
2557
+ l0.4,0.2l0.4,0.2l0.4,0.2l0.4,0.3l0.4,0.3l0.4,0.3l0.4,0.3l0.4,0.2l0.9,0.7l0.8,0.8l0.7,0.9l0.6,1l0.5,1l0.3,1.1l0.2,1.1l0.1,1.1
2558
+ l-0.1,1.1l-0.2,1.1L-2-23.3l-0.5,1l-0.6,0.9l-0.7,0.8l-0.8,0.8l-0.9,0.6l-1,0.5l-1,0.4L-8.6-18l-1.1,0.1h-1.1l-1.1-0.2l-1.1-0.3
2559
+ l-1-0.4l-1-0.6l-0.3-0.2l-0.2-0.1l-0.2-0.1l-0.2-0.1l-0.2-0.1l-0.2-0.1l-0.3-0.1l-0.3-0.1l-0.3-0.1l-0.3-0.1l-0.3-0.1l-0.3-0.1
2560
+ l-0.3-0.1l-0.3-0.1L-19-21l-0.3-0.1l-0.3-0.1l-0.3-0.1l-0.3-0.1l-0.3-0.1l-0.3-0.1l-0.3-0.1l-0.3-0.1l-0.3-0.1l-0.6-0.2l-0.6-0.2
2561
+ l-0.6-0.2l-0.6-0.1l-0.7-0.1l-0.7-0.1l-0.7-0.1l-0.7-0.1l-0.7-0.1l-0.7-0.1l-0.7-0.1h-0.7h-0.7h-0.7h-0.7h-0.7h-0.7h-0.7h-0.7
2562
+ h-0.7l-0.7,0.1l-0.7,0.1l-0.7,0.1l-0.7,0.1l-0.7,0.1l-0.7,0.1l-0.7,0.1l-0.7,0.2l-0.7,0.2l-0.7,0.2l-0.7,0.2l-0.6,0.2l-0.6,0.2
2563
+ l-0.6,0.2l-0.6,0.2l-0.6,0.2l-0.3,0.1l-0.3,0.1l-0.3,0.1l-0.3,0.1l-0.3,0.1l-0.3,0.1l-0.3,0.1l-0.3,0.1l-0.3,0.1l-0.3,0.1
2564
+ l-0.3,0.1l-0.3,0.2l-0.3,0.1l-0.3,0.2l-0.2,0.2l-0.2,0.2l-0.3,0.2l-0.2,0.2l-0.2,0.2l-0.2,0.2l-0.2,0.2l-0.2,0.2l-0.2,0.2
2565
+ l-0.2,0.2l-0.2,0.2l-0.2,0.2l-0.2,0.2l-0.2,0.2l-0.2,0.2l-0.2,0.2l-0.2,0.2l-0.2,0.2l-0.7,0.7l-0.7,0.7l-1.4,1.4l-1.5,1.4
2566
+ l-1.5,1.4l-0.7,0.7l-0.7,0.7l-0.7,0.7l-0.7,0.7l-0.7,0.7l-0.7,0.7l-0.7,0.7l-0.7,0.7l-0.6,0.7l-0.3,0.3L-66.5-3l-0.3,0.4
2567
+ l-0.3,0.3L-67.4-2l-0.3,0.3L-68-1.4l-0.3,0.3l-0.3,0.3l-0.2,0.3L-69-0.2l-0.2,0.3l-0.2,0.3l-0.2,0.3L-69.8,1L-70,1.3l-0.2,0.3
2568
+ l-0.2,0.3l-0.2,0.3l-0.2,0.3L-71,2.8l-0.1,0.3l-0.1,0.3l-0.1,0.3L-71.4,4l-0.1,0.3l-0.1,0.3l-0.1,0.3l0,0.1v0.2v0.1v0.2v0.4v0.4
2569
+ l-0.1,0.5l-0.1,1.3l-0.2,3l-0.1,1.7l-0.1,0.9l-0.1,0.9l-0.1,0.9l-0.1,0.9l-0.1,0.9l-0.1,0.9l-0.1,0.9l-0.2,0.9l-0.2,0.9l-0.1,0.5
2570
+ l-0.1,0.4l-0.1,0.5l-0.1,0.5l-0.1,0.5l-0.2,0.5l-0.2,0.5l-0.2,0.5l-0.2,0.5l-0.3,0.5l-0.3,0.6l-0.4,0.6l-0.4,0.6l-0.7,0.4
2571
+ l-0.3,0.4l-0.6,0.6l-0.4,0.3l-0.5,0.4L-79,30l-0.5,0.3l-0.4,0.2l-1.9,0.9l-1.7,0.9l-1.7,0.9l-1.7,0.9l-1.7,0.9l-1.7,1l-1.7,1
2572
+ l-1.7,1l-1.7,1l-1.7,1l-1.7,1l-1.7,1l-1.7,1l-1.7,1.1l-1.7,1.1l-1.7,1.1l-1.7,1.1l-1.7,1.1l-1.7,1.1l-1.7,1.1l-1.7,1.1l-1.7,1.1
2573
+ l-1.7,1.1l-1.7,1.1l-1.7,1.2l-1.7,1.2l-3.4,2.3l-3.4,2.4l-3.4,2.4l-6.9,4.8l-3.5,2.4l-3.5,2.4l-3.5,2.4l-3.5,2.4l-1.8,1.2
2574
+ l-1.8,1.2l-1.8,1.2l-1.8,1.2l-1.8,1.2l-1.8,1.2l-1.8,1.2l-1.8,1.2l-1.8,1.1l-1.8,1.1l-1.8,1.1L-177,93l-1.8,1.1l-1.8,1.1
2575
+ l-1.8,1.1l-1.8,1.1l-1.8,1.1l-1.8,1.1l-1.9,1l-1.8,1l-4.2,2.4l-4.2,2.4l-4.2,2.4l-4.2,2.4l-4.2,2.4l-4.2,2.4l-2.1,1.2l-2.1,1.2
2576
+ l-2.1,1.2l-2.1,1.2l-2.1,1.2l-2.1,1.2l-2.1,1.2l-2.1,1.2l-2.1,1.2l-2.1,1.3l-2.1,1.3l-2.1,1.3l-2.1,1.3l-2.1,1.3l-2.1,1.3
2577
+ l-2.1,1.3l-2,1.3l-2,1.3l-2,1.3l-2,1.3l-2,1.3l-2,1.3l-2,1.3l-2,1.3l-2,1.3l-2,1.3l-2,1.3l-2,1.3l-2,1.3l-2,1.3l-2,1.4l-2,1.4
2578
+ l-2,1.4l-2,1.4l-2,1.4l-2,1.4l-2,1.4l-1.9,1.4l-1.9,1.4l-1.9,1.4l-1.9,1.4l-1.9,1.4l-1.9,1.4l-1.9,1.4l-1.9,1.4l-1.9,1.4
2579
+ l-1.9,1.4l-1.9,1.5l-1.9,1.5l-1.9,1.5l-1.9,1.5l-1.9,1.5l-1,0.8l-1,0.8l-1,0.8l-1,0.8l-1,0.7l-1,0.7l-1,0.7l-1,0.7l-1,0.7l-1,0.7
2580
+ l-1,0.7l-1,0.7l-2,1.3l-2,1.3l-4,2.6l-2,1.3l-1,0.6l-1,0.6l-0.9,0.6l-0.9,0.6l-0.9,0.6l-0.9,0.6l-0.9,0.6l-0.9,0.6l-0.9,0.7
2581
+ l-0.9,0.7l-0.5,0.4l-0.5,0.4l-0.5,0.4l-0.2,0.2l-0.2,0.2l-0.2,0.2l-0.2,0.2v0.4l-0.1,1.1l-0.2,1.1l-0.3,1.1l-0.5,1l-0.6,0.9
2582
+ l-0.7,0.9l-0.8,0.8l-0.9,0.7l-1,0.5l-1,0.4l-1.1,0.3l-1.1,0.1h-1.1l-1.1-0.1l-1.1-0.3l-1-0.4l-1-0.5l-0.9-0.7l-0.8-0.8l-0.7-0.9
2583
+ l-0.3-0.4l-0.4-0.6l-0.3-0.6l-0.3-0.6l-0.3-0.7l-0.2-0.7l-0.2-0.7l-0.1-0.7l-0.1-0.7l-0.1-0.7v-0.7v-0.6l0.1-0.6l0.1-0.6l0.1-0.6
2584
+ l0.1-0.6l0.1-0.5l0.2-0.5l0.2-0.5l0.2-0.5l0.2-0.4l0.2-0.4l0.2-0.4l0.2-0.4l0.2-0.4l0.2-0.4l0.4-0.6l0.4-0.6l0.4-0.6l0.5-0.5
2585
+ l0.4-0.5l0.4-0.5l0.4-0.4l0.4-0.4l0.4-0.4l0.4-0.4l0.4-0.4l0.4-0.3l0.4-0.3l0.7-0.6l0.7-0.5l0.6-0.5l1-0.8l1-0.7l1-0.7l1-0.7
2586
+ l1-0.7l1-0.7l1-0.7l1-0.7l1-0.7l1-0.7l2-1.3l4-2.6l2-1.3l2-1.3l1-0.6l1-0.6l0.9-0.6l0.9-0.6l0.9-0.6l0.9-0.6l0.9-0.7l0.9-0.7
2587
+ l0.9-0.7l0.9-0.7l0.9-0.7l0.9-0.7l1.9-1.5l1.9-1.5l1.9-1.5l1.9-1.5l1.9-1.5l1.9-1.5l2-1.5l2-1.5l2-1.5l2-1.5l2-1.5l2-1.4l2-1.4
2588
+ l2-1.4l2-1.4l2-1.4l2-1.4l2-1.4l2-1.4l2-1.4l2-1.4l2-1.4l2-1.4l2-1.4l2-1.4l2-1.4l2-1.4l2.1-1.4l2.1-1.3l2.1-1.3l2.1-1.3l2.1-1.3
2589
+ l2.1-1.3l2.1-1.3l2.1-1.3l2.1-1.3l2.1-1.3l2.1-1.3l2.1-1.3l2.1-1.3l2.1-1.3l2.1-1.3l2.1-1.3l2.1-1.3l2.1-1.3l2.1-1.3l2.1-1.3
2590
+ l2.1-1.3l2.1-1.2l2.1-1.2l2.1-1.2l2.1-1.2l4.2-2.4l4.2-2.4l4.2-2.4l4.2-2.4l4.2-2.4l4.2-2.4l1.8-1l1.7-1l1.7-1l1.7-1l1.8-1l1.7-1
2591
+ l1.7-1.1l1.7-1.1l1.7-1.1l1.7-1.1l1.7-1.1l1.7-1.1l1.7-1.1l1.7-1.1l1.7-1.1l1.7-1.1l1.7-1.1l1.7-1.2l1.7-1.2l1.7-1.2l3.5-2.4
2592
+ l3.5-2.4l3.5-2.4l3.5-2.4l6.9-4.8l3.5-2.4l3.5-2.4l3.5-2.4l1.7-1.2l1.8-1.2l1.8-1.2l1.8-1.2l1.8-1.2l1.8-1.2l1.8-1.2l1.8-1.1
2593
+ l1.8-1.1l1.8-1.1l1.8-1.1l1.8-1.1l1.8-1.1l1.8-1.1l1.8-1.1l1.8-1.1l1.8-1.1l1.8-1.1l1.8-1l1.8-1l1.8-1l1.8-1l1.8-1l1.8-1l1-0.5
2594
+ v-0.2l0.1-0.6l0.1-0.6l0.1-0.7l0.1-0.7l0.1-0.7l0.1-0.8l0.1-0.8l0.1-1.5l0.2-3l0.1-1.4l0.1-0.7l0.1-0.7l0.1-0.7l0.1-0.7l0.1-0.7
2595
+ l0.1-0.4l0.1-0.4l0.2-0.7l0.2-0.7l0.2-0.7l0.2-0.7l0.2-0.7l0.2-0.6l0.3-0.6l0.3-0.6l0.3-0.6l0.3-0.6l0.3-0.6l0.3-0.6l0.3-0.6
2596
+ l0.3-0.6l0.3-0.6l0.3-0.6l0.3-0.5l0.4-0.5l0.4-0.5l0.4-0.5l0.4-0.5l0.4-0.5l0.4-0.5l0.4-0.5l0.4-0.5l0.4-0.5l0.4-0.5l0.4-0.5
2597
+ l0.4-0.5l0.4-0.5l0.8-0.9l0.8-0.9l0.8-0.9l0.8-0.9l0.8-0.8l0.8-0.8l0.8-0.8l0.8-0.8l0.8-0.8l1.5-1.5l1.5-1.4l1.4-1.3l0.6-0.6
2598
+ l0.6-0.6l0.3-0.3l0.4-0.4l0.4-0.4l0.4-0.3l0.4-0.3l0.4-0.3l0.4-0.3l0.4-0.3l0.4-0.3l0.4-0.3l0.4-0.3l0.4-0.3l0.4-0.3l0.4-0.3
2599
+ l0.4-0.3l0.4-0.3l0.4-0.3l0.4-0.3l0.4-0.3l0.4-0.3l0.4-0.3l0.4-0.2l0.5-0.2l0.5-0.2l0.4-0.2l0.5-0.2l0.5-0.2l0.5-0.2l0.5-0.2
2600
+ l0.5-0.2l0.5-0.2l0.5-0.2l0.9-0.4l1-0.4l1-0.3l1-0.3l1-0.3l1-0.3l1-0.3l1-0.2l1-0.2l1-0.2l1-0.2l1-0.2l1-0.1l1-0.1l1-0.1l1-0.1
2601
+ l1-0.1l1-0.1h1h1h1L-30.6-41.7z M-356,204.7l-0.1-0.1l-0.2-0.3v-0.1L-356,204.7z"
2602
+ />
2603
+ <path
2604
+ d="M-5.6-32.2l0.8,0.1l0.7,0.2l0,0l0.7,0.2l0.7,0.3l0.6,0.3l0,0l0.8,0.5l0.7,0.6l0,0l0.4,0.4l0.4,0.5l0.3,0.3
2605
+ l0.4,0.5l0.3,0.4l0.3,0.6l0.3,0.5l0.3,0.5l0.4,0.9l0.4,0.9l0.2,0.3l0.1,0.3l0.1,0.1l0,0l0.1,0.1l0.2,0.2l0.6,0.6l0.4,0.4L5-22
2606
+ l0.4,0.6L5.7-21l0.2,0.4l0.3,0.4l0.3,0.4l0.3,0.5L7-18.8l0.2,0.5l0.2,0.5l0.2,0.5l0.2,0.6L8-16.1l0.1,0.4l0.1,0.5l0.1,0.4
2607
+ l0.1,0.5l0.2,0.5l0.2,0.6L9-12.6l0.2,0.7l0.2,0.7l0.3,0.7L10-9.7l0.3,0.8l0.3,0.8l0.3,0.8l0.3,0.8l0.4,0.8L12-4.9l0.4,0.8
2608
+ l0.4,0.8l0.4,0.8l0.2,0.3l0.2,0.3l0.2,0.3L14-1.3L14.2-1l0.2,0.3l0.2,0.3l0.2,0.3L15,0.2l0.2,0.2l0.2,0.2l0.2,0.2L15.8,1l0.1,0.2
2609
+ L16,1.4l0.1,0.1l0.1,0.1l0.1,0.1l0,0l0.2,0.1L17,2.1l0.5,0.3L18,2.7L18.5,3L19,3.3l0.4,0.4l0.4,0.4l0.4,0.4l0.4,0.4L21,5.3
2610
+ l0.4,0.4l0.4,0.4l0.3,0.4l0.3,0.4l0.3,0.4L23,7.7l0.3,0.4l0.3,0.4l0.2,0.4L24,9.3l0.2,0.4l0.2,0.4l0.2,0.4l0.4,0.7l0.3,0.7
2611
+ l0.3,0.7l0.3,0.7l0.3,0.6l0.3,0.6l0.5,1.1l0.2,0.5l0.2,0.5l0.2,0.4l0.2,0.4l0.2,0.3l0.2,0.3l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1
2612
+ l0.1,0.1l0.1,0.1v0.1l0.1,0.1l0,0l0.1,0.1l0.4,0.4l0.4,0.4l0.4,0.4l0.4,0.4l0.4,0.4l0.4,0.5l0.4,0.5l0.4,0.5l0.4,0.5l0.4,0.5
2613
+ l0.4,0.5l0.4,0.5l0.4,0.5l0.3,0.5l0.3,0.5l0.3,0.5l0.3,0.5l0.3,0.5l0.3,0.5l0.3,0.5l0.6,1l0.6,1l0.6,1l0.6,1l0.5,1l0.5,1l0.5,1
2614
+ l0.5,1l0.5,1l0.5,1l0.5,1l0.5,1l0.4,1l0.4,1l0.4,1l0.4,1l0.4,1l0.4,1l0.8,2l0.8,2l1.5,4l0.8,2l0.8,2l0.4,1l0.4,1l0.4,0.9l0.4,0.9
2615
+ l0.4,0.9l0.4,0.9l0.4,0.9l0.4,0.9l0.4,0.9l0.4,0.9l0.4,0.9l0.4,0.8l0.4,0.8l0.4,0.8l0.4,0.8l0.4,0.8l0.4,0.8l0.5,0.8l0.2,0.3
2616
+ l0.2,0.4l0.2,0.4l0.2,0.3l0.2,0.4l0.2,0.3l0.2,0.3l0.2,0.3l0.2,0.3l0.2,0.3l0.3,0.3l0.3,0.4l0.5,0.6l0.5,0.6l0.5,0.6l0.4,0.7
2617
+ l0.4,0.7l0.4,0.7l0.4,0.7l0.4,0.7l0.4,0.7l0.4,0.7l0.4,0.7l0.3,0.7l0.3,0.7l0.3,0.7l0.3,0.7l0.3,0.7l0.3,0.7l0.3,0.7l0.3,0.7
2618
+ l0.3,0.7l0.3,0.7l0.2,0.7l0.2,0.6l0.2,0.6l0.2,0.6l0.2,0.6l0.4,1.3l0.4,1.3l0.4,1.2l0.4,1.2l0.4,1.2l0.7,2.4l0.3,1.1l0.3,1.1
2619
+ l0.3,1.1l0.3,1.1l0.3,1.1l0.4,1.1l0.2,0.5l0.2,0.5l0.2,0.5l0.2,0.5l0.2,0.5l0.2,0.5l0.2,0.5l0.2,0.5l0.2,0.5l0.2,0.4l0.2,0.4
2620
+ l0.2,0.5l0.9,1.7l0.9,1.8l0.9,1.8l0.9,1.8l0.9,1.9l0.9,1.9l0.9,1.9l0.9,2l0.9,2l0.9,2l0.9,2l0.8,2l0.8,2.1l0.8,2.1l0.8,2.1
2621
+ l0.8,2.1l0.8,2.1l0.8,2.2l0.4,1.1l0.4,1.1l0.4,1.1l0.4,1.1l0.4,1.1l0.4,1.1l0.4,1.1l0.4,1.1l0.4,1.1l0.4,1.1l0.3,1.1l0.3,1.1
2622
+ l0.3,1.1l0.3,1.1l0.3,1.1l0.3,1.1l0.3,1.1l0.3,1.1l0.3,1.1l0.3,1.1l0.3,1.1l0.3,1.1l0.3,1.1l0.3,1.1l0.3,1.2l0.3,1.1l0.3,1.2
2623
+ l0.3,1.2l0.2,1.2l0.2,1.2l0.2,1.2l0.2,1.2l0.2,1.2l0.2,1.2l0.2,1.2l0.2,1.2l0.2,1.2l0.2,1.2l0.2,1.2l0.2,1.2l0.2,1.2l0.1,1.2
2624
+ l0.1,1.2l0.1,1.2l0.1,1.2l0.1,1.2l0.1,1.2l0.1,1.2l0.1,1.2l0.1,1.2l0.1,1.2l0.1,1.1v1.1v1.1v1.1v1.1v1.1v1.1v1.1v1.1v1.1
2625
+ l-0.1,1.1l-0.1,1.1l-0.1,1.1l-0.1,1.1l-0.1,1.1l-0.1,1.1l-0.1,1.1l-0.1,1.1l-0.2,1.1l-0.2,1.1l-0.2,1.1l-0.2,1.1l-0.2,1.1
2626
+ l-0.2,1.1l-0.2,1.1l-0.2,1.1l-0.3,1.1l-0.3,1.1l-0.3,1.1l-0.3,1.1l-0.3,1.1l-0.3,1.1l-0.4,1.1l-0.4,1l-0.4,1l-0.4,1l-0.4,1
2627
+ l-0.4,1l-0.5,1l-0.5,1l-0.5,1.1l-0.3,0.6l-0.4,0.6l-0.4,0.5l-0.4,0.5l-0.4,0.4l-0.4,0.4l-0.4,0.3l-0.4,0.3l-0.4,0.3l-0.3,0.2
2628
+ l-0.3,0.2l-0.4,0.2l-0.6,0.4l-0.6,0.3l-0.6,0.3L89,261l-0.6,0.3l-0.6,0.2l-0.6,0.2l-0.5,0.2l-0.5,0.2l-0.5,0.2l-1,0.4l-1,0.3
2629
+ l-0.9,0.3l-0.8,0.3l-0.3,0.1l-0.3,0.1l-0.2,0.1L81,264l-0.1,0.1l-0.4,0.3l-0.4,0.3l-0.4,0.3l-0.4,0.2l-0.4,0.3l-0.8,0.5l-0.8,0.4
2630
+ l-0.9,0.4l-0.9,0.4l-0.9,0.4l-0.9,0.4l-0.9,0.3l-0.9,0.3l-0.9,0.3l-0.9,0.3l-0.9,0.3l-0.9,0.2l-0.9,0.2l-0.9,0.2l-0.9,0.2
2631
+ l-0.9,0.2l-0.9,0.2l-0.9,0.1l-0.9,0.1l-0.9,0.1l-0.9,0.1l-0.9,0.1l-0.9,0.1h-0.9h-0.9h-0.9h-0.9h-0.9H53h-0.9h-0.9h-0.9l-0.9-0.1
2632
+ l-0.8-0.1l-0.8-0.1l-0.8-0.1l-0.8-0.1l-0.8-0.1l-0.8-0.1l-0.8-0.1l-0.8-0.1l-0.8-0.1l-0.8-0.1l-0.8-0.1l-0.8-0.1l-0.8-0.1
2633
+ l-0.8-0.2l-0.8-0.2l-0.8-0.2L35,269l-1.6-0.3l-1.6-0.4l-1.5-0.4l-1.5-0.4l-1.6-0.4l-0.7-0.2l-0.7-0.2l-0.7-0.2l-0.7-0.2l-0.6-0.3
2634
+ l-0.6-0.3l-0.6-0.3l-0.6-0.3l-0.6-0.3l-0.6-0.3l-1.1-0.5l-2.1-1.1l-1-0.5l-0.9-0.4l-0.4-0.2l-0.4-0.2l-0.3-0.2l-0.3-0.1l-0.2-0.1
2635
+ l-0.2-0.1h-0.1h-0.3l-1-0.2l-0.9-0.3l-0.9-0.4l-0.9-0.5L9,259.1l-0.7-0.7l-0.6-0.8l-0.6-0.8l-0.5-0.9L6.2,255L6,254l-0.1-1v-1
2636
+ l0.1-1l0.2-1l0.3-0.9l0.4-0.9l0.5-0.9l0.6-0.8l0.7-0.7l0.8-0.6l0.8-0.6l0.9-0.5l0.9-0.4l1-0.3l1-0.1h1h0.3h0.5l0.5,0.1l0.5,0.1
2637
+ l0.4,0.1l0.4,0.1l0.4,0.1l0.4,0.1l0.7,0.2l0.7,0.2l0.7,0.2l0.6,0.3l0.6,0.3l0.6,0.3l0.6,0.3l0.6,0.3l1.1,0.5l1.1,0.5l2.1,1l1,0.5
2638
+ l0.4,0.2l0.4,0.2l0.4,0.2l0.4,0.2l0.3,0.1l0.3,0.1l0.2,0.1l0.2,0.1h0.1h0.2l1.3,0.3l1.4,0.3l1.4,0.3l1.4,0.3l1.4,0.3l1.4,0.3
2639
+ l0.7,0.1l0.7,0.1l0.7,0.1l0.7,0.1l0.7,0.1l0.7,0.1l0.7,0.1l0.7,0.1l0.7,0.1l0.7,0.1l0.7,0.1l0.7,0.1l0.7,0.1l0.7,0.1l0.7,0.1
2640
+ l0.7,0.1H52h0.6h0.6h0.6h0.6H55h0.6h0.6h0.6h0.6H58h0.6l0.6-0.1l0.6-0.1l0.6-0.1l0.6-0.1l0.6-0.1l0.6-0.1l0.5-0.1l0.5-0.1
2641
+ l0.5-0.1l0.5-0.1l0.5-0.2l0.5-0.2l0.5-0.2l0.5-0.2l0.5-0.2l0.5-0.2l0.5-0.2l0.5-0.2l0.5-0.2l0.5-0.3l0.5-0.3l0.2-0.1l0.2-0.1
2642
+ l0.2-0.1l0.2-0.1l0.2-0.1l0.4-0.3l0.5-0.3l0.6-0.3l0.6-0.3l0.5-0.2l0.5-0.2l0.5-0.2l0.5-0.2l0.5-0.2l0.9-0.3l0.9-0.3l0.9-0.3
2643
+ l0.9-0.3l0.4-0.1l0.4-0.1l0.4-0.1l0.3-0.1l0.2-0.4l0.3-0.8l0.3-0.8l0.3-0.8l0.3-0.8l0.3-0.8l0.3-0.8l0.3-0.8l0.3-0.8l0.2-0.8
2644
+ l0.2-0.8l0.2-0.8l0.2-0.8l0.2-0.9l0.2-0.9l0.2-0.9l0.2-0.9l0.2-0.9l0.1-0.9l0.1-0.9l0.1-0.9l0.1-0.9l0.1-0.9l0.1-0.9l0.1-0.9
2645
+ l0.1-0.9l0.1-0.9l0.1-0.9V221v-1v-1v-1v-1v-1v-1v-1v-1v-1v-1l-0.1-1l-0.1-1l-0.1-1l-0.1-1l-0.1-1l-0.1-1l-0.1-1l-0.1-1l-0.1-1
2646
+ l-0.1-1l-0.1-1l-0.1-1l-0.2-1l-0.2-1l-0.2-1l-0.2-1l-0.2-1l-0.2-1l-0.2-1l-0.2-1l-0.2-1l-0.2-1.1l-0.2-1.1l-0.2-1.1l-0.2-1.1
2647
+ l-0.2-1.1l-0.2-1.1l-0.3-1.1l-0.3-1.1l-0.3-1.1l-0.3-1.1l-0.3-1.1l-0.3-1.1l-0.3-1.1l-0.3-1.1l-0.3-1l-0.3-1l-0.3-1.1l-0.3-1
2648
+ l-0.3-1l-0.3-1l-0.3-1l-0.3-1l-0.3-1l-0.3-1l-0.3-1l-0.4-1l-0.4-1l-0.4-1l-0.4-1l-0.4-1l-0.7-2l-0.8-2l-0.8-2l-0.8-2l-0.8-2
2649
+ l-0.8-2l-0.8-1.9l-0.8-1.9l-0.8-1.9l-0.8-1.9l-0.8-1.9l-0.8-1.8l-0.8-1.8l-0.8-1.8l-0.8-1.8l-0.8-1.7l-0.8-1.7l-0.8-1.7l-0.3-0.6
2650
+ l-0.3-0.7l-0.3-0.7l-0.3-0.7l-0.3-0.7l-0.3-0.7l-0.3-0.7l-0.3-0.6l-0.2-0.7l-0.2-0.7l-0.2-0.6l-0.2-0.7l-0.4-1.3l-0.4-1.3
2651
+ l-0.4-1.2l-0.4-1.2l-0.4-1.2l-0.3-1.2l-0.7-2.3l-0.3-1.1l-0.3-1.1l-0.3-1.1l-0.3-1.1l-0.4-1.1l-0.2-0.5l-0.2-0.5l-0.2-0.5
2652
+ L51,99.4l-0.2-0.5l-0.2-0.5l-0.2-0.5l-0.2-0.5L50,96.9l-0.2-0.5l-0.2-0.5l-0.2-0.4l-0.2-0.4L49,94.7l-0.2-0.4l-0.2-0.4l-0.2-0.4
2653
+ l-0.2-0.4L48,92.7l-0.2-0.4l-0.3-0.4l-0.3-0.4l-0.3-0.4l-0.3-0.4l-0.3-0.4L46,89.9l-0.3-0.4L45.3,89l-0.4-0.5L44.5,88l-0.4-0.5
2654
+ L43.8,87l-0.3-0.5L43.2,86l-0.3-0.5L42.6,85l-0.3-0.5L42,84l-0.6-1l-0.6-1l-0.6-1l-0.6-1l-0.5-1l-0.5-1l-0.5-1l-0.5-1l-0.5-1
2655
+ l-0.5-1l-0.5-1l-0.5-1l-0.4-1l-0.4-1l-0.4-1L34,68l-0.4-1l-0.4-1l-0.8-2l-0.8-2l-1.5-4l-0.8-2l-0.8-2l-0.4-1l-0.4-0.9l-0.4-0.9
2656
+ l-0.4-0.9l-0.4-0.9l-0.4-0.9l-0.4-0.9l-0.4-0.9l-0.4-0.9l-0.4-0.9l-0.4-0.8l-0.4-0.8l-0.4-0.8l-0.4-0.8l-0.4-0.8l-0.4-0.8
2657
+ l-0.5-0.8l-0.5-0.7l-0.2-0.3l-0.2-0.4l-0.2-0.3l-0.2-0.3L20.1,37l-0.2-0.3l-0.2-0.3l-0.2-0.3l-0.2-0.3L19,35.5l-0.2-0.3l-0.3-0.3
2658
+ l-0.3-0.3l-0.3-0.3L17.6,34l-0.3-0.3L17,33.4l-0.3-0.3l-0.3-0.3l-0.3-0.3l-0.3-0.3l-0.4-0.4l-0.3-0.4L14.8,31l-0.3-0.4l-0.3-0.4
2659
+ l-0.3-0.4l-0.3-0.4L13.4,29l-0.2-0.4L13,28.2l-0.2-0.4l-0.4-0.7L12,26.4l-0.3-0.7L11.4,25l-0.3-0.6l-0.3-0.6l-0.5-1.1l-0.2-0.5
2660
+ l-0.2-0.5l-0.2-0.4l-0.2-0.4l-0.2-0.4l-0.2-0.4L9,20l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1v-0.1
2661
+ l-0.1-0.1L8.1,19l0,0l0,0l0,0l0,0l0,0l0,0l0,0l0,0l0,0l0,0l0,0l0,0l-0.2-0.1l-0.5-0.3l-0.6-0.4l-0.6-0.4l-0.6-0.4L5.1,17
2662
+ l-0.5-0.4l-0.5-0.4l-0.4-0.4l-0.4-0.4L2.9,15l-0.4-0.4l-0.4-0.5l-0.4-0.4l-0.3-0.5l-0.3-0.5l-0.3-0.5l-0.3-0.5l-0.3-0.5l-0.3-0.5
2663
+ l-0.3-0.5l-0.3-0.5L-1,9.2l-0.3-0.5l-0.3-0.5l-0.3-0.5l-0.3-0.5l-0.5-1l-0.5-1l-0.5-1l-0.5-1l-0.4-1l-0.4-1l-0.4-1l-0.4-1l-0.4-1
2664
+ l-0.4-1l-0.3-1l-0.3-0.9l-0.3-0.9l-0.3-0.9l-0.3-0.9l-0.2-0.8L-8.5-9l-0.2-0.7l-0.2-0.2l-0.3-0.3l-0.4-0.4l-0.4-0.5l-0.4-0.5
2665
+ l-0.3-0.4l-0.2-0.4l-0.2-0.4l-0.3-0.4l-0.3-0.6l-0.3-0.5l-0.2-0.5l-0.2-0.5l-0.3-0.7l-0.5-0.5l-0.5-0.8l-0.5-0.9l-0.4-0.9l-0.2-1
2666
+ l-0.1-1v-0.5v-0.5v-0.7l0.1-0.7v-0.1l0.1-0.7l0.2-0.7l0.2-0.6l0,0l0.3-0.7l0.4-0.7l0.4-0.7l0,0l0.6-0.7L-12-29l0.7-0.5l0.7-0.5
2667
+ l0,0l0.7-0.4l0.8-0.3l0.8-0.2l0.8-0.2l0.8-0.1l0,0h0.8L-5.6-32.2z M14.2,260.9h0.2l0,0H14H14.2z M2.1-22.5L2.1-22.5v-0.2V-22.5z
2668
+ M2.1-23.1v-0.5v-0.2V-23.1z"
2669
+ />
2670
+ <path
2671
+ d="M-358.4,223.5l1.1,0.2l0,0l0.6,0.2l0.6,0.2l0.2,0.1l1.3,0.5l1.7,0.7l0.7,0.3l0.5,0.2l0.2,0.1l0.2,0.1
2672
+ l0.2,0.1l0.2,0.1l0.2,0.1l0.2,0.1l0.4,0.1l0.4,0.1l0.5,0.1l0.5,0.1l0.5,0.1l1.2,0.2l1.3,0.3l0.7,0.2l0.8,0.2l0.8,0.2l0.7,0.2
2673
+ l0.4,0.1l0.3,0.1l0.3,0.1l0.3,0.1l0.7,0.1l0.7,0.1l0.7,0.1l0.7,0.1l0.7,0.1l0.7,0.1l0.7,0.1l0.7,0.1l0.7,0.1l0.7,0.1l0.8,0.1
2674
+ l0.8,0.1l1.6,0.1l1.6,0.1l1.7,0.1l1.7,0.1l0.9,0.1l0.9,0.1l0.9,0.1l0.9,0.1l0.9,0.1l1,0.1l1,0.1l1,0.2l1,0.2l0.9,0.2l1.2,0.2
2675
+ l1.2,0.2l1.2,0.2l1.2,0.2l1.2,0.2l1.2,0.2l1.2,0.2l1.2,0.2l1.2,0.2l1.2,0.2l1.2,0.2l1.2,0.2l1.2,0.2l1.2,0.2l1.2,0.1l1.2,0.1
2676
+ l1.3,0.1l1.3,0.1l1.3,0.1l1.3,0.1l1.3,0.1l1.3,0.1l1.3,0.1l1.3,0.1l1.3,0.1l1.3,0.1l1.3,0.1l1.3,0.1l2.6,0.2l2.6,0.1l2.6,0.1
2677
+ l2.6,0.1l2.6,0.1l2.6,0.1l2.6,0.1l2.6,0.1l2.6,0.1l2.6,0.1h2.6h2.6h2.6h2.6h2.5h2.5h5h5.3h5.3h5.3l5.3,0.1l5.3,0.1l5.3,0.1
2678
+ l5.3,0.1l5.3,0.1l5.3,0.1l5.3,0.2l5.3,0.2l5.3,0.2l5.3,0.2l5.3,0.2l5.3,0.2l5.3,0.2l5.3,0.2l5.3,0.2l5.3,0.3l5.3,0.3l5.3,0.3
2679
+ l5.3,0.3l5.3,0.3l5.3,0.3l5.3,0.3l5.3,0.3l5.3,0.3l5.3,0.3l5.3,0.3l5.3,0.4l5.3,0.4l5.2,0.4l1.7,0.1l1.7,0.1l3.4,0.2l3.4,0.2
2680
+ l3.4,0.2l3.5,0.2l3.5,0.2l3.5,0.1l3.5,0.1l3.5,0.1l3.5,0.1l3.5,0.1l3.4,0.1h3.4h3.4h3.4h3.3h0.6h0.6h0.7h0.7h0.7l0.8-0.1l1.7-0.1
2681
+ l1.8-0.1l1.9-0.1l1-0.1l1-0.1l1-0.1l1-0.1h1h1.1h1.1h1.1h1.1h0.6h0.5h0.5h0.5h0.5h0.5l0.5,0.1L12,245l0.6,0.1l0.5,0.1l0.6,0.1
2682
+ l0.6,0.1l0.6,0.1l0.6,0.1l0.6,0.1l0.6,0.2l0.6,0.2l0.6,0.2l0.6,0.2l0.6,0.2l0.6,0.3l0.4,0.2l1,0.5l0.9,0.7l0.8,0.8l0.7,0.9
2683
+ l0.6,0.9l0.5,1l0.3,1.1l0.2,1.1l0.1,1.1l-0.1,1.1l-0.2,1.1l-0.4,1.1l-0.5,1l-0.6,0.9l-0.7,0.9l-0.8,0.8l-0.9,0.7l-1,0.5l-1,0.4
2684
+ l-1.1,0.3l-1.1,0.1h-1.1l-1.1-0.1l-1.1-0.3l-1-0.4l-0.2-0.1l0,0h-0.1h-0.1H12h-0.1h-0.2h-0.2h-0.2h-0.2h-0.2h-0.2h-0.3h-0.3H9.8
2685
+ H9.5H9.2H8.9H8.6H8.3H7.9H7.6H6.8H6H5.2H4.4H3.5H2.6l-0.9,0.1l-0.9,0.1l-0.9,0.1l-1.8,0.1l-1.8,0.1l-1.8,0.1l-0.9,0.1l-0.9,0.1
2686
+ h-0.9h-0.9H-10h-0.8h-3.5h-3.5h-3.5h-3.5l-3.5-0.1l-3.5-0.1l-3.5-0.1l-3.5-0.1l-3.5-0.1l-3.5-0.1l-3.5-0.2l-3.5-0.2l-3.5-0.2
2687
+ l-3.5-0.2l-3.5-0.2l-1.7-0.1l-1.7-0.1l-5.2-0.4l-5.2-0.4l-5.2-0.4l-5.2-0.4l-5.2-0.3l-5.2-0.3l-5.2-0.3l-5.3-0.3l-5.2-0.3
2688
+ l-5.3-0.3l-5.3-0.3l-5.3-0.3l-5.3-0.3l-5.3-0.3l-5.3-0.2l-5.3-0.2l-5.3-0.2l-5.3-0.2l-5.3-0.2l-5.3-0.2l-5.3-0.2l-5.3-0.2
2689
+ l-5.3-0.1l-5.3-0.1l-5.3-0.1l-5.3-0.1l-5.2-0.1l-5.2-0.1l-5.2-0.1h-5.2h-5.2h-5.2h-5.1h-2.6h-2.6h-2.6h-2.6h-2.6h-2.6h-2.6
2690
+ l-2.6-0.1l-2.7-0.1l-2.7-0.1l-2.7-0.1l-2.7-0.1l-2.7-0.1l-2.7-0.1l-2.7-0.2l-2.7-0.2l-1.3-0.1l-1.3-0.1l-1.3-0.1l-1.3-0.1
2691
+ l-1.3-0.1l-1.3-0.1l-1.3-0.1l-1.3-0.1l-1.3-0.1l-1.3-0.1l-1.3-0.1l-1.3-0.1l-1.3-0.2l-1.3-0.2l-1.3-0.2l-1.3-0.2l-1.3-0.2
2692
+ l-1.3-0.2l-1.3-0.2l-1.3-0.2l-1.3-0.2l-1.3-0.2l-1.3-0.2l-1.3-0.2l-1.3-0.2l-1.3-0.2l-1.3-0.2l-1.2-0.2l-0.7-0.1l-0.7-0.1
2693
+ l-0.7-0.1l-0.7-0.1l-0.7-0.1l-0.7-0.1l-0.7-0.1l-0.7-0.1l-0.8-0.1l-0.8-0.1l-1.6-0.1l-1.6-0.1l-1.7-0.1l-1.7-0.1l-0.9-0.1
2694
+ l-0.9-0.1l-0.9-0.1l-0.9-0.1l-0.9-0.1l-0.9-0.1l-0.9-0.1l-1-0.1l-1-0.2l-1-0.2l-1-0.2l-1-0.2l-0.5-0.1l-0.5-0.1l-0.5-0.1
2695
+ l-0.4-0.1l-0.5-0.1l-0.5-0.1l-0.5-0.1l-0.5-0.1l-1.2-0.2l-1.3-0.3l-0.7-0.2l-0.7-0.2l-0.8-0.2l-0.8-0.2l-0.8-0.2l-0.4-0.1
2696
+ l-0.4-0.1l-0.4-0.1l-0.4-0.2l-0.5-0.2l-0.5-0.2l-0.8-0.3l-0.9-0.4l-1.7-0.8l-0.8-0.3l-0.7-0.3l-0.3-0.1l-1-0.6l-0.9-0.7l-0.8-0.8
2697
+ l-0.7-0.9l-0.6-1l-0.4-1l-0.3-1.1l-0.2-1.1v-1.1l0.1-1.1l0.3-1.1l0.4-1.1l0.5-1l0.7-0.9l0.8-0.8l0.9-0.7l1-0.6l1-0.5l1.1-0.4
2698
+ l1.1-0.2l1.1-0.1L-358.4,223.5z"
2699
+ />
2700
+ <path
2701
+ d="M-365,199.4h0.3h0.3h0.3l0.4,0.1l0.7,0.2l0.4,0.1l0.3,0.1l0.3,0.1l0.3,0.1h0.1l0.2,0.1l0.2,0.1l0.2,0.1
2702
+ l0.2,0.1h0.1l0.2,0.1l0.2,0.1l0.2,0.1l0.2,0.1l0.2,0.2h0.1l0.2,0.2l0.2,0.2l0.2,0.2l0.2,0.2l0.2,0.2l0.1,0.1l0.2,0.2l0.2,0.2
2703
+ l0.2,0.2l0.2,0.2l0.2,0.3l0.2,0.3v0.1l0.2,0.3l0.1,0.3l0.1,0.3l0.1,0.3l0.1,0.3l0.1,0.3v0.1l0.1,0.3l0.1,0.3l0.1,0.3l0.1,0.3
2704
+ l0.1,0.3v0.3v0.1v0.3v0.3v0.3v0.3v0.3v0.1v0.3v0.3v0.3v0.3l-0.1,0.3v0.1l-0.1,0.3l-0.1,0.3l-0.1,0.3l-0.1,0.3v0.1l-0.1,0.3
2705
+ l-0.1,0.3l-0.1,0.3l-0.2,0.4l-0.4,0.7l-0.3,0.5l-0.3,0.4l-0.3,0.4l-0.5,0.6l-0.5,0.5l-0.4,0.4l-0.4,0.4l-0.4,0.4l-0.7,0.6
2706
+ l-0.7,0.6l-0.3,0.3l-0.3,0.3l-0.3,0.2l-0.1,0.1l-0.1,0.5v0.3v0.3v0.3v0.3v0.3v0.3v0.3v0.3v0.3v0.3v0.3v0.3v0.3v0.3v0.2v0.2v0.2
2707
+ v0.2v0.2v0.2v0.2v0.2v0.2v0.1v0.1v0.1v0.1v0.1v0.1v0.1v0.1v0.1v0.1v0.1v0.1v0.1v0.1v0.1v0.1l0,0v0.1h0.1l0.1,0.1h0.1l0.1,0.1
2708
+ l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.2,0.1l0.2,0.1l0.2,0.1l0.2,0.1l0.2,0.1l0.4,0.1l0.3,0.1l0.3,0.1
2709
+ l0.3,0.1l0.3,0.1l0.3,0.1l0.3,0.1l0.3,0.2l0.3,0.2l0.3,0.2l0.3,0.2l0.3,0.2l0.2,0.2l0.2,0.2l0.2,0.2l0.2,0.2l0.2,0.2l0.2,0.2
2710
+ l0.2,0.2l0.2,0.3l0.2,0.3l0.2,0.3l0.2,0.3l0.2,0.3l0.1,0.3l0.1,0.3l0.1,0.3l0.1,0.3l0.1,0.3l0.1,0.3l0.1,0.3l0.1,0.3l0.1,0.3v0.3
2711
+ v0.3v0.3v0.3v0.3v0.3v0.3v0.3v0.3l-0.1,0.3l-0.1,0.3l-0.1,0.3l-0.1,0.3l-0.1,0.3l-0.1,0.3l-0.1,0.3l-0.1,0.3l-0.1,0.3l-0.2,0.3
2712
+ l-0.2,0.3l-0.2,0.3l-0.2,0.3l-0.2,0.3l-0.2,0.2l-0.2,0.2l-0.2,0.2l-0.2,0.2l-0.2,0.2l-0.2,0.2l-0.3,0.2l-0.3,0.2l-0.3,0.2
2713
+ l-0.3,0.2l-0.3,0.2l-0.3,0.1l-0.3,0.1l-0.3,0.1l-0.3,0.1l-0.3,0.1l-0.3,0.1l-0.3,0.1l-0.3,0.1l-0.3,0.1l-0.3,0.1h-0.3h-0.3h-0.3
2714
+ h-0.3h-0.3h-0.3h-0.3h-0.3l-0.3-0.1l-0.3-0.1l-0.3-0.1l-0.6-0.2l-0.7-0.2l-0.7-0.2l-0.7-0.2l-0.7-0.3l-0.7-0.3l-0.6-0.3l-0.6-0.3
2715
+ l-0.6-0.3l-0.6-0.3l-0.6-0.4l-0.6-0.4l-0.6-0.4l-0.5-0.4l-0.5-0.4l-0.5-0.4l-0.5-0.5l-0.5-0.5l-0.5-0.5l-0.4-0.5l-0.4-0.5
2716
+ l-0.4-0.5l-0.4-0.5l-0.4-0.5l-0.3-0.5l-0.3-0.5l-0.3-0.6l-0.3-0.6l-0.3-0.6l-0.2-0.6l-0.2-0.6l-0.2-0.6l-0.2-0.6l-0.2-0.6
2717
+ l-0.2-0.6l-0.1-0.6l-0.1-0.6l-0.1-0.6l-0.1-0.6l-0.1-0.6l-0.1-0.6l-0.1-0.5l-0.1-0.6v-0.6v-0.5v-0.5v-0.5v-0.5v-0.5v-0.6v-0.5
2718
+ v-0.5v-0.5v-0.5v-0.5v-0.5l0.1-0.5l0.1-0.5l0.1-1l0.1-1l0.2-1.1l0.1-0.7l0.2-0.7l0.2-0.7l0.2-0.6l0.3-0.6l0.3-0.5l0.3-0.5
2719
+ l0.3-0.4l0.3-0.4l0.3-0.4l0.3-0.4l0.3-0.3l0.3-0.3l0.3-0.3l0.5-0.5l0.5-0.5l0.5-0.5l0.5-0.4l0.5-0.4l0.4-0.4l0,0l0.1-0.2l0.1-0.3
2720
+ l0.1-0.3l0.1-0.3l0.1-0.3l0.2-0.3l0.2-0.3l0.2-0.3l0.2-0.3l0.2-0.3l0.2-0.2l0.2-0.2l0.2-0.2l0.2-0.2l0.2-0.2l0.2-0.2l0.3-0.2
2721
+ l0.3-0.2l0.3-0.2l0.3-0.2l0.3-0.2l0.3-0.1l0.3-0.1l0.3-0.1l0.3-0.1l0.3-0.1l0.3-0.1l0.3-0.1l0.3-0.1l0.3-0.1h0.3h0.3h0.3h0.3h0.3
2722
+ L-365,199.4z M-366.9,217h0.1H-366.9L-366.9,217z"
2723
+ />
2724
+ </g>
2725
+ </g>
2726
+ </g>
2727
+ </svg>
{images/previews → assets/img}/cap.jpg RENAMED
File without changes
assets/img/cart-preview.svg ADDED
@@ -0,0 +1,20 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 230 250">
2
+ <g fill="#E1E3E6" fill-rule="evenodd">
3
+ <g transform="translate(0 43)">
4
+ <path d="M0 0h33v33H0zM38 0h24v8H38zM120 0h28v8h-28z"/>
5
+ <rect width="28" height="14" x="87" rx="2"/>
6
+ <path d="M38 10h44v8H38zM0 38h148v1H0z"/>
7
+ </g>
8
+ <g transform="translate(0 87)">
9
+ <path d="M0 0h33v33H0zM38 0h24v8H38zM120 0h28v8h-28z"/>
10
+ <rect width="28" height="14" x="87" rx="2"/>
11
+ <path d="M38 10h44v8H38zM0 38h148v1H0z"/>
12
+ </g>
13
+ <g transform="translate(0 131)">
14
+ <path d="M0 0h33v33H0zM38 0h24v8H38zM120 0h28v8h-28z"/>
15
+ <rect width="28" height="14" x="87" rx="2"/>
16
+ <path d="M38 10h44v8H38zM0 38h148v1H0z"/>
17
+ </g>
18
+ <path d="M164 0h66v170h-66zM0 24h33v8H0zM120 24h28v8h-28zM87 24h28v8H87zM0 37h148v1H0zM0 0h66v14H0z"/>
19
+ </g>
20
+ </svg>
assets/img/checkout-preview.svg ADDED
@@ -0,0 +1,20 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 230 250">
2
+ <g fill="none" fill-rule="evenodd">
3
+ <g transform="translate(0 72)">
4
+ <path fill="#E1E3E6" d="M15 33h125V0H15z"/>
5
+ <circle cx="5.5" cy="5.5" r="5.5" fill="#D8D8D8"/>
6
+ <path fill="#D8D8D8" d="M5 16h1v23H5z"/>
7
+ </g>
8
+ <g transform="translate(0 113)">
9
+ <path fill="#E1E3E6" d="M15 33h125V0H15z"/>
10
+ <circle cx="5.5" cy="5.5" r="5.5" fill="#D8D8D8"/>
11
+ <path fill="#D8D8D8" d="M5 16h1v23H5z"/>
12
+ </g>
13
+ <g transform="translate(0 154)">
14
+ <path fill="#E1E3E6" d="M15 33h125V0H15z"/>
15
+ <circle cx="5.5" cy="5.5" r="5.5" fill="#D8D8D8"/>
16
+ </g>
17
+ <path fill="#E1E3E6" d="M164 0h66v148h-66zM61 57h33v8H61zM107 194h33v11h-33zM15 61h43v1H15zM97 60h43v1H97z"/>
18
+ <rect width="154" height="50" fill="#E1E3E6" rx="3"/>
19
+ </g>
20
+ </svg>
{images/previews → assets/img}/collection.jpg RENAMED
File without changes
assets/img/grid.svg ADDED
@@ -0,0 +1,50 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <svg xmlns="http://www.w3.org/2000/svg" width="231" height="252" fill="none">
2
+ <rect width="65.374" height="65.374" x=".162" y=".779" fill="#E1E3E6" rx="3"/>
3
+ <rect width="47.266" height="5.148" x="9.216" y="76.153" fill="#E1E3E6" rx="2.574"/>
4
+ <rect width="62.8" height="15" x="1.565" y="101.448" fill="#E1E3E6" rx="5"/>
5
+ <rect width="65.374" height="65.374" x=".162" y="136.277" fill="#E1E3E6" rx="3"/>
6
+ <rect width="47.266" height="5.148" x="9.216" y="211.651" fill="#E1E3E6" rx="2.574"/>
7
+ <rect width="62.8" height="15" x="1.565" y="236.946" fill="#E1E3E6" rx="5"/>
8
+ <rect width="65.374" height="65.374" x="82.478" y=".779" fill="#E1E3E6" rx="3"/>
9
+ <rect width="47.266" height="5.148" x="91.532" y="76.153" fill="#E1E3E6" rx="2.574"/>
10
+ <rect width="62.8" height="15" x="83.882" y="101.448" fill="#E1E3E6" rx="5"/>
11
+ <rect width="65.374" height="65.374" x="82.478" y="136.277" fill="#E1E3E6" rx="3"/>
12
+ <rect width="47.266" height="5.148" x="91.532" y="211.651" fill="#E1E3E6" rx="2.574"/>
13
+ <rect width="62.8" height="15" x="83.882" y="236.946" fill="#E1E3E6" rx="5"/>
14
+ <rect width="65.374" height="65.374" x="164.788" y=".779" fill="#E1E3E6" rx="3"/>
15
+ <rect width="47.266" height="5.148" x="173.843" y="76.153" fill="#E1E3E6" rx="2.574"/>
16
+ <rect width="62.8" height="15" x="166.192" y="101.448" fill="#E1E3E6" rx="5"/>
17
+ <rect width="65.374" height="65.374" x="164.788" y="136.277" fill="#E1E3E6" rx="3"/>
18
+ <rect width="47.266" height="5.148" x="173.843" y="211.651" fill="#E1E3E6" rx="2.574"/>
19
+ <rect width="62.8" height="15" x="166.192" y="236.946" fill="#E1E3E6" rx="5"/>
20
+ <rect width="6.177" height="6.177" x="13.283" y="86.301" fill="#E1E3E6" rx="3"/>
21
+ <rect width="6.177" height="6.177" x="21.498" y="86.301" fill="#E1E3E6" rx="3"/>
22
+ <rect width="6.177" height="6.177" x="29.713" y="86.301" fill="#E1E3E6" rx="3"/>
23
+ <rect width="6.177" height="6.177" x="37.927" y="86.301" fill="#E1E3E6" rx="3"/>
24
+ <rect width="6.177" height="6.177" x="46.238" y="86.301" fill="#E1E3E6" rx="3"/>
25
+ <rect width="6.177" height="6.177" x="95.599" y="86.301" fill="#E1E3E6" rx="3"/>
26
+ <rect width="6.177" height="6.177" x="103.814" y="86.301" fill="#E1E3E6" rx="3"/>
27
+ <rect width="6.177" height="6.177" x="112.029" y="86.301" fill="#E1E3E6" rx="3"/>
28
+ <rect width="6.177" height="6.177" x="120.243" y="86.301" fill="#E1E3E6" rx="3"/>
29
+ <rect width="6.177" height="6.177" x="128.554" y="86.301" fill="#E1E3E6" rx="3"/>
30
+ <rect width="6.177" height="6.177" x="177.909" y="86.301" fill="#E1E3E6" rx="3"/>
31
+ <rect width="6.177" height="6.177" x="186.124" y="86.301" fill="#E1E3E6" rx="3"/>
32
+ <rect width="6.177" height="6.177" x="194.339" y="86.301" fill="#E1E3E6" rx="3"/>
33
+ <rect width="6.177" height="6.177" x="202.553" y="86.301" fill="#E1E3E6" rx="3"/>
34
+ <rect width="6.177" height="6.177" x="210.864" y="86.301" fill="#E1E3E6" rx="3"/>
35
+ <rect width="6.177" height="6.177" x="13.283" y="221.798" fill="#E1E3E6" rx="3"/>
36
+ <rect width="6.177" height="6.177" x="21.498" y="221.798" fill="#E1E3E6" rx="3"/>
37
+ <rect width="6.177" height="6.177" x="29.713" y="221.798" fill="#E1E3E6" rx="3"/>
38
+ <rect width="6.177" height="6.177" x="37.927" y="221.798" fill="#E1E3E6" rx="3"/>
39
+ <rect width="6.177" height="6.177" x="46.238" y="221.798" fill="#E1E3E6" rx="3"/>
40
+ <rect width="6.177" height="6.177" x="95.599" y="221.798" fill="#E1E3E6" rx="3"/>
41
+ <rect width="6.177" height="6.177" x="103.814" y="221.798" fill="#E1E3E6" rx="3"/>
42
+ <rect width="6.177" height="6.177" x="112.029" y="221.798" fill="#E1E3E6" rx="3"/>
43
+ <rect width="6.177" height="6.177" x="120.243" y="221.798" fill="#E1E3E6" rx="3"/>
44
+ <rect width="6.177" height="6.177" x="128.554" y="221.798" fill="#E1E3E6" rx="3"/>
45
+ <rect width="6.177" height="6.177" x="177.909" y="221.798" fill="#E1E3E6" rx="3"/>
46
+ <rect width="6.177" height="6.177" x="186.124" y="221.798" fill="#E1E3E6" rx="3"/>
47
+ <rect width="6.177" height="6.177" x="194.339" y="221.798" fill="#E1E3E6" rx="3"/>
48
+ <rect width="6.177" height="6.177" x="202.553" y="221.798" fill="#E1E3E6" rx="3"/>
49
+ <rect width="6.177" height="6.177" x="210.864" y="221.798" fill="#E1E3E6" rx="3"/>
50
+ </svg>
assets/img/no-matching-products.svg ADDED
@@ -0,0 +1 @@
 
1
+ <svg viewBox="0 0 797.12 564.08" xmlns="http://www.w3.org/2000/svg"><g fill-rule="evenodd"><path d="m216.92 118.87 1 .15 1 .25.61.2.7.28.25.12.67.35.25.13.63.4.54.37.78.63.7.7.63.72.55.73.52.8.42.77.36.81.29.8.23.8.17.77.11.77.07.71v2.14l-.13 1.16-.22 1.2-.26 1.17-.34 1.13-.45 1.07-.42 1.1-.45 1.1-.5 1.09-.28.61.41.57.37.6.08.13.27.52.22.53.06.17.3 1v.18l.07.28.72-.48.75-.48.76-.47.79-.45.83-.43.9-.4 1-.39.73-.23.79-.18.4-.09.76-.11.49-.07h1.35l.78.08h.17l.86.17h.15l.95.3.14.05.5.2.46.23.14.08.5.29.46.33.14.08.43.35.42.39.11.1.39.4.36.43.1.12.32.41.28.45.09.14.45.86.08.17.3.8.07.18.21.74.12.53.13.85.07.82v1.21l-.07 1.2-.13 1.19-.2 1.15-.27 1.11-.31 1.09-.35 1.06-.09.24.62-.34 1-.55 1.1-.53 1.12-.48.72-.29.71-.23.8-.22.87-.18.62-.08.76-.07h1.52l.57.07.57.1.25.05.63.17.63.21.24.09.68.3.67.38.2.12.66.45.62.51.18.17.55.57.5.61.15.2.4.6.35.64.14.25.25.56.21.6.1.3.22.84.17.8.15 1.11.06 1.1v1.67h.17l1.45-.08h2.88l1.44.07 1.43.11 1.42.15 1.41.2 1.42.24 1.4.26.58.12 1.14-.27 1.35-.25 1.35-.18 1.38-.15 1.4-.1h5.85l1.52.08 1.55.12 1.58.15 1.6.17 1.63.2 1.65.21 1.67.25 1.7.27 1.7.3 1.73.32 1.74.35 1.75.35 1.76.38 1.79.4 1.78.42 1.8.43 1.78.47 1.8.46 1.8.49 1.8.5 1.79.51 1.78.54 1.78.53 1.77.57 1.77.55 1.75.58 1.71.58 1.72.6 1.7.6 1.67.62 1.65.62 1.61.63 1.6.63 1.57.64 1.53.65 1.52.65 1.47.66 1.43.65 1.4.67 1.37.67 1.31.68 1.29.68 1.23.69 1.2.68 1.17.7 1.1.72 1.08.71 1 .74 1 .76.95.8.91.84.85.86.74.82.66.8.64.83.6.85.56.87.52.87.48.88.47.9.42.9.4.9.36.92.35.91.32.94.28.91.27.94.25.93.22.93.2.94.18.93.17.93.16.94.14 1 .23 1.84.17 1.86.13 1.87.1 1.85.07 1.83v1.15l.09.14.83 1.38.82 1.43.78 1.47.73 1.48.7 1.52.65 1.52.29.68.56.05h.15l.87.17h.15l.88.27h.14l.8.35.15.07.73.4.13.1.65.45.14.1.56.46.37.35.55.59.3.38.48.67.22.31.45.79.35.7.42 1 .31 1 .25 1 .2.93.17.92.12.92.08.91.08.92.05.93v4.82l-.08 2-.12 2-.17 2.05-.18 2.07v.62l.15.35.32.8.25.8.23.8.18.8.14.78.1.78.08.77v.53l.18-.21 1.23-1.6.65-.8.55-1.15.42-.8.38-.69.37-.6.52-.83.7-1.07.85-1.26 1-1.4.58-.77.58-.77.64-.8.66-.78.69-.82.73-.8.77-.8.81-.78.87-.78.92-.77 1-.75 1-.67.62-.36.6-.34.61-.31.65-.3.7-.27.74-.25.78-.22.82-.16.86-.14.92-.06h.93l1 .08 1 .15 1 .25 1 .33.94.42.9.5.83.55.78.62.65.6.59.6.5.53.48.57.47.56.45.57.41.6.42.58.38.62.39.6.38.67.63 1.21.6 1.29.55 1.3.49 1.33.43 1.33.38 1.35.34 1.37.3 1.38.25 1.39.21 1.4.19 1.41.13 1.42.12 1.43.08 1.44.05 1.45v3.91l.66.27.72.4.13.07.65.43.6.48.14.12.48.47.45.51.12.14.33.46.32.47.1.17.45.85.08.2.3.71.18.54.22.83.15.77.1.73.07.7.05.68v3.29l-.06 1.61-.12 1.62-.17 1.62-.2 1.6-.25 1.58-.3 1.58-.33 1.57-.38 1.55-.4 1.55-.45 1.53-.49 1.54-.51 1.51-.55 1.5-.59 1.49-.6 1.48-.63 1.47-.67 1.46-.68 1.45-.7 1.44-.73 1.43-.75 1.42-.77 1.41-.78 1.4-.82 1.39-.82 1.38-.85 1.37-.85 1.36-.86 1.35-.87 1.34-.9 1.35-.43.61-.77 3.07-.43 1.63-.42 1.54-.42 1.43-.43 1.4-.59 1.56-.5 1.4-.55 1.4-.6 1.49-.68 1.56-.75 1.7-1.82 4.05-.36.75-.44.82-.46.83-.52.84-.55.83-.58.85-.62.85-.68.87-.77.86-.83.84-.6.51-.64.5-.46.3-.67.4-.18.1-.49.24-.5.21-.16.07-.67.22-.68.16h-.17l-.93.13h-1.09l-.76-.05-.75-.14-.75-.2-.14-.05-.78-.28-.43-.22-1.45 2-1.33 1.88-.24.35-.23.37-.23.38-.22.4-.52 1-.51 1.05-.54 1.16-.58 1.25-.62 1.32-.66 1.38-.74 1.4-.41.77-.45.75-.47.75-.5.77-.55.76-.58.77-.64.75-.7.75-.73.73-.8.72-.4.32-.45 1.06-.8 1.84-.8 1.8-.83 1.76-.84 1.75-.85 1.74-.88 1.7-.88 1.66-.92 1.65-.93 1.62-.95 1.57-1 1.55-1 1.5-1 1.48-1 1.43-1.08 1.39-1.1 1.35-1.15 1.3-1.15 1.23-.62.63-.61.6-.62.59-.63.56-.64.55-.65.55-.66.52-.67.52-.7.5-.75.51-.57.35-.7.37-.43.2-.73.27-.15.05-.85.23h-.14l-1 .15h-1.98l-.59-.09h-.11l-.62-.13-.6-.19h-.1l-.57-.21-.55-.27-.1-.05-.51-.3-.5-.32-.09-.08-.43-.32-.38-.35-.1-.08-.65-.7-.09-.1-.51-.65-.07-.12-.53-.88-.13-.31-.23-.46-.18-.49-.12-.31-.25-.77-.08-.32v.05l-.2 1.15-.24 1.1-.26 1.07-.3 1.05-.34 1-.36 1-.44 1-.5 1-.4.65-.4.6-.75.94-.73.85-.77.8-.8.76-.81.72-.85.68-.89.64-.88.58-.92.55-.91.5-.95.47-.95.41-1 .39-1 .35-1 .3-1 .26-1 .24-1 .18-1 .17-1 .13-1 .1-1 .07-1 .05h-2l-1-.05-1-.05-1-.1-1-.12-1-.13-1-.15-.95-.19-.95-.21-.95-.22-.94-.25-.15-.05-.06.07-.84.55-.83.55-.87.51-.88.49-.9.46-.92.45-.93.4-.95.39-1 .35-1 .31-.8.22-.81.18-.79.15-.8.14-.76.08-.77.07h-2.98l-1.34-.08-1.33-.15-1-.14-.2.1-1.17.59-1.2.55-1.23.51-1.25.45-1.28.4-1.27.34-.72.16-.68.14-.7.1-.7.08-.72.07h-2.26l-.79-.06-.81-.1-.84-.17-.85-.22-.88-.28-.87-.37-.88-.43-.8-.5-.82-.57-.71-.55-.22-.18-.92.2-1.48.3-1.48.25-1.42.18-.8.09-.73.05h-2.35l-.82-.07-.88-.13-.89-.18-.88-.25-.83-.29-.8-.33-.77-.38-.75-.4-.7-.45-.67-.49-.63-.5-.6-.51-.55-.54-.19-.55-.49-.57-.46-.58-.44-.59-.4-.58-.38-.62-.35-.6-.32-.6-.31-.61-.3-.67-.5-1.18-.44-1.24-.38-1.25-.33-1.25-.27-1.25-.22-1.25-.18-1.25-.13-1.25-.09-1.25-.01-1.21v-2.42l.07-1.2.11-1.2.15-1.18.2-1.17.24-1.17.3-1.15.36-1.15.42-1.15.48-1.06.34-.65.25-.42.5-.78.16-.24.59-.7.41-.46.65-.64.64-.56.65-.55.7-.57.71-.55-.06-.22-.19-.81-.13-.69-.1-.68-.07-.68v-.25l-.82.05h-.18l-.69-.05-.66-.09h-.17l-.85-.2-.82-.28h-.15l-.91-.44-.85-.55-.14-.1-.56-.45-.54-.5-.48-.55-.08-.11-.6-.84-.49-.9-.06-.15-.32-.8-.25-.81v-.19l-.14-.66-.06-.67v-1.78l.06-1 .14-1 .16-.95.22-.92.25-.92.28-.88.32-.85.35-.83.37-.84.38-.8.2-.4-.9-.53-1.92-1.17-1.91-1.2-1.94-1.25-1.97-1.29-2-1.3-2-1.34-2-1.35-2-1.4-2-1.4-2-1.43-2-1.45-1.95-1.48-2-1.49-1.93-1.5-1.95-1.53-1.92-1.53-1.92-1.54-1.88-1.55-1.88-1.56-1.85-1.57-1.57-1.58-1.8-1.58-1.79-1.59-1.75-1.56-1.71-1.57-1.7-1.57-.49-.45-.56.32-1.2.55-1.25.53-1.26.54-1.3.51-1.34.49-1.33.46-1.37.44-1.36.41-1.4.4-1.39.35-1.41.34-1.4.28-1.42.25-1.4.2-1.42.17-1.43.1-1.32-.02h-1.5l-.71-.05-.74-.06-.73-.09-.75-.11-.75-.15-.77-.19-.76-.21-.77-.27-.78-.3-.85-.4-.64-.35-.73-.47-.3-.2-.77-.61-.25-.24-.4-.36-.36-.4-.2-.25-.37-.45-.32-.49-.16-.25-.32-.51-.27-.54-.11-.28-.24-.53-.18-.57-.08-.3-.14-.55-.11-.55v-.3l-.06-.53v-2.09l.12-.83.11-.68.12-.4h-.4l-.85-.05-.48-.05-.79-.13-.78-.2-.78-.27-.74-.31-.73-.37-.68-.42-.64-.46-.58-.49-.37-.33-.51-.55-.49-.58v-.07l-.46-.72-.4-.76-.32-.8v-.09l-.21-.71-.14-.74-.08-.73v-.92l.07-.81v-.1l.12-.6.15-.62v-.12l.29-.8.06-.13.4-.85.17-.28.4-.65.37-.54.53-.7.5-.61.52-.59 1-1.1 1.06-1.13 1.05-1.13 1-1.17.47-.55.45-.55.43-.52.39-.51.33-.47.28-.42.09-.15-.09-.3-.15-.73v-.17l-.1-.88v-1.38l.07-.62.12-.62v-.11l.15-.64.22-.61v-.1l.26-.62.32-.58.05-.1.33-.52.35-.48.09-.09.33-.4.37-.38.08-.08.43-.39.45-.35.2-.15.74-.46.33-.75.42-.95.4-1 .4-1 .36-1 .37-1 .37-1.05.35-1.07.23-.73h-.67l-1-.06-1-.19-1-.31-.92-.42-.86-.53-.79-.64-.71-.73-.62-.8-.27-.47-1 .17-1 .05-1-.05-1-.19-.92-.28-.88-.37-.74-.46-.7-.51-.65-.59-.58-.63-.5-.7v-.08l-.44-.75-.36-.8-.27-.84v-.11l-.15-.69-.09-.68v-2.18l.13-1 .13-.82-.33-.5-.16.25-.54.71-.53.72-.55.68-.58.67-.64.67-.66.65-.77.66-.57.44-.63.41-.33.2-.84.45-.3.15-.85.34-.46.15-.47.11-.75.17h-.13l-.85.08h-1.48l-1-.11-.52-.1-.48-.14-.79-.26-.11-.05-.82-.35-.12-.07-.78-.47-.12-.06-.76-.59-.1-.08-.69-.65-.08-.08-.63-.75-.07-.1-.5-.74-.07-.11-.4-.77v-.12l-.21-.51-.19-.55-.08-.25-.15-.62-.12-.63v-.29l-.08-1v-1.83l.15-.93.19-.85.21-.77.24-.73.23-.69.28-.7.5-1.2.57-1.2.57-1.13.56-1.07 1-1.83.82-1.5.58-1.08.65-1.14.65-1.11.67-1.1.67-1.09.66-1.08 1.35-2.05 1.35-2 1.32-2 1.3-1.94 1.27-1.9 3.05-4.7.15-.26 1-1.94 1.39-2.6.45-.86-.17-1-.25-1.65-.22-1.67-.18-1.7h-.2l-1-.07h-.1l-.95-.16-.93-.29h-.1l-.8-.35-.75-.4-.1-.07-.59-.4-.55-.43-.1-.1-.4-.38-.38-.4-.1-.12-.55-.72-.3-.41-.42-.72-.31-.67-.25-.56-.3-.79-.27-.73-.25-.75-.25-.78-.42-1.47-.36-1.52-.3-1.53-.25-1.53-.2-1.54-.15-1.56-.1-1.55v-4.7l.08-1.59.12-1.56.16-1.59.22-1.58.23-1.58.27-1.59.32-1.56.05-.25-.27-.42-.42-.7-.36-.68-.32-.7-.3-.7-.25-.7-.22-.69-.18-.7-.15-.66-.13-.69-.12-.73-.15-1.23-.08-1.3v-2.54l.07-1.23.12-1.22.15-1.2.18-1.2.22-1.16.23-1.15.25-1.14.27-1.11.26-1.09.3-1.06.3-1.07.6-1.95.6-1.83.57-1.67 1-2.68.36-.95.4-1 .42-1 .47-1 .48-1 .5-1.05.55-1 .57-1.07.58-1.08.62-1.09.63-1.1.67-1.1.68-1.11.72-1.12.73-1.12.75-1.13.78-1.13.8-1.14.82-1.13.83-1.13.87-1.14.88-1.13.9-1.13.92-1.14.93-1.11 1-1.1 1-1.12 1-1.08 1-1.09 1-1.06 1-1.07 1-1 1.06-1 1.09-1 1.1-1 1.11-1 1.14-1 1.15-.94 1.15-.9 1.18-.86 1.18-.85 1.2-.84 1.24-.78 1.23-.77 1.25-.71 1.27-.7 1.28-.65 1.3-.62 1.32-.57 1.33-.53 1.35-.48 1.37-.42 1.4-.38 1.4-.32 1.43-.27 1.38-.2.79-.06.73-.07h3.7l.75.07.73.08.75.1.75.12.75.15.75.16.74.19.75.21.88.27.47.2.81.37.2.1.84.5.16.11.79.62.15.13.71.7.14.15.63.79.12.16.48.77.08.18.39.8.08.19.27.73.18.55.18.88.12.84.05.76v1.52l-.11 1.13-.14.65.24-.15 1-.56.62-.3.6-.27.63-.25.65-.23.7-.22.72-.18.78-.15.82-.12h1.75zm129.63 298.13.09.2.06.2v-.6zm-128.31-72.17.33.25-.1-.31zm-4.72-18.38v2.33h.5l.16-.05-.48-2-.12-.5zm84.25-11.62.4 1.1.33 1.12.3 1.12.25 1.11.24 1.14.2 1.16.06.49.17-.55.2-.79.15-.73.13-.73v-3.09l-.09-.07-.31-.25-.35-.28-.35-.25-.34-.23-.33-.22-.32-.2-.25-.15zm-143.22-.53v.05zm83.1-12.25-.36 1-.34 1-.31 1-.3 1-.29.95-.28.95-.23.95-.24.94-.21.93-.2.92-.07.35.48-.55.89-1.07.1-.53.4-2 .45-2 .45-2 .45-1.85-.27-.17zm-55.83 6.58-.22.7.5.1-.11-1.2v-.2zm235.7-17.1-1.75 1.94-1.2 1.33.05.18.18.77.15.75.12.77.1.73.07.75.05.73v1.4l.05-.06.75-1.45.75-1.4.75-1.35.25-.45v-.07l.18-1.32.19-1.31.16-1.32.14-1.3.06-.55zm.3-19-.38 1.13-.42 1.1-.47 1.1-.35.84.49.21.88.54.8.65.65.66-.07-1.1-.08-1.05-.1-1-.12-1-.15-.95-.16-.91-.19-.87-.06-.22zm-60-41.38.47-.07.71-.08h.42l-.1-.06-.42-.25-.42-.24-.4-.2-.4-.18-.23-.12zm-7.7-26.54.23 1.3.24 1.09.08.36.1.37.42 1.53.73 2.67.15.55h2.73l1 .06 1 .12 1 .13 1 .19.86.2-.06-.2-.19-.5-.18-.47-.2-.47-.2-.43-.22-.42-.21-.38-.24-.38-.23-.35-.23-.34-.25-.33-.25-.3-.24-.27-.23-.25-.33-.28-.42-.35-.52-.4-.6-.43-.7-.47-.76-.48-.84-.52-.91-.52-1-.55-.56-.3zm-105.47 1.85.19.64.31 1 .12.49.43.06 1.1.22-.45-.7-.78-1.23-.38-.65zm25.4-4.35h-2.76l-1.4.08-1.44.1-1.43.13h-.1l.1.12.48.51.49.52.48.5.52.5.5.48.53.47.53.47.54.46.55.45.55.44.4.3.43-.65.45-.64.43-.6.47-.58.48-.57.5-.58.54-.55.56-.57.62-.53.37-.32h-2.04zm48.82-10.11 1.37 1 .28.2.3.2.43.27.55.3.64.33.7.35 1.66.82 1.84.86 2 1 2.05 1 .9.46v-2.85l-1.25-.43-1.61-.55-1.62-.53-1.63-.52-1.65-.52-1.65-.5-1.67-.5-1.57-.45zm-121.77-39-1.35 1.3-1.35 1.34-1.35 1.36-1.35 1.37-1.35 1.36-1.33 1.4-1.32 1.4-1.31 1.42-1.3 1.43-1.3 1.44-1.29 1.45-1.25 1.46-.26.3-.49.92-1.58 3.05-3.22 6.16-.4.75.39-.51.56-.75.74-1 1.85-2.27 5.13-6.25 2-2.5 1.2-1.67 1.4-1.93 1.42-1.92 1.45-1.91 1.5-1.92 1.53-1.92 1.57-1.88.83-1 .82-.95.33-.36.35-.49zm480.9-96.23.8.13.52.13.76.25h.17l.9.4.15.07.55.3.52.35.11.08.57.44.53.5.1.1.39.41.36.45.4.55.55.87.47.9.38 1 .3.93.22 1 .15.94v.25l1.18-.84 1.73-1.23 1.8-1.27 1-.65 1-.63 1-.65 1-.62 1-.6 1.08-.58 1.12-.57 1.16-.51 1.17-.45.68-.25.65-.2.67-.19.67-.16.7-.15.71-.14.78-.13.76-.08h2.37l.8.09.83.13.84.17.81.23.82.27.82.33.8.37.76.43.75.47.72.5.73.56.64.57.63.65.55.67.5.7.45.71.38.72.34.72.28.71.25.7.2.72.17.68.11.69.1.66.09.74.08 1.23v1.28l-.05 1.27-.12 1.25-.16 1.25-.2 1.27-.25 1.26-.29 1.27-.33 1.28-.35 1.3-.38 1.3-.45 1.33-.43 1.33-.25.72h.55l.78-.05h1.57l.8.07.88.11.68.14.77.2.35.1.8.3.33.13.8.38.3.17.8.5.27.2.62.48h.05l.56-.23h.09l.75-.25.75-.18h.1l.91-.1h1l1 .1 1 .23h.09l.93.34.88.43h.09l.73.47.67.55.08.06.52.52.46.55.09.08.31.45.3.47.07.12.42.81.2.44.16.48.24.77.18.68.27 1.53.18 1.44.13 1.45.07 1.46v2.92l-.07 1.48-.1 1.49-.15 1.5-.18 1.5-.23 1.51-.25 1.52-.29 1.53-.31 1.54-.35 1.55-.37 1.56-.4 1.57-.4 1.48-.45 1.58-.46 1.58-.49 1.6-.5 1.6-.53 1.62-.53 1.6-.55 1.62-.59 1.63-1.18 3.23-1.22 3.24-1.3 3.25-1.29 3.23-1.3 3.2-1.31 3.17-1.32 3.13-2.57 6.12-2.46 5.87-1.15 2.8-1.1 2.71-1 2.62-1 2.48-.88 2.39-.38 1.1-.39 1.1-.33 1.05-.32 1-.28.95-.12.4-.16 1.25-.29 2.1-.36 2.7-.47 3.21-.52 3.57-.63 3.8-.34 2-.35 2-.38 2-.38 2-.42 2-.42 1.91-.45 1.87-.43 1.72-.48 1.75-.5 1.65-.27.85-.28.78-.28.78-.32.79-.32.75-.36.76-.39.77-.45.78-.53.8-.42.55-.48.59-.25.25-.53.53-.07.77-.13 1.2-.17 1.2-.2 1.2-.22 1.18-.26 1.2-.29 1.18-.3 1.2-.35 1.19-.35 1.18-.38 1.18-.42 1.19-.43 1.18-.45 1.18-.47 1.19-.5 1.18-.5 1.17-.53 1.18-.55 1.17-.55 1.16-.58 1.17-.59 1.17-.61 1.16-.64 1.17-1.26 2.28-1.32 2.29-1.37 2.26-.61.95-.4 2.07-.24 1.17-.3 1.35-.7 3-1.78 7.28-1 4.14-.52 2.15-.5 2.2-.5 2.23-.5 2.27-.46 2.26-.19.94.6.06.84.12.68.15.77.2.38.12.8.3.35.15.83.41.32.19.82.51.28.22.75.62.25.23.68.72.22.25.57.76.2.29.45.76.16.32.35.75.14.33.25.72.2.68.21 1 .14 1 .06.95v1.75l-.09.83-.11.82-.14.78-.16.78-.19.75-.2.75-.21.72-.25.73-.25.7-.29.75-.56 1.35-.64 1.35-.66 1.32-.7 1.3-.75 1.25-.77 1.23-.8 1.17-.82 1.13-.85 1.09-.86 1-.89 1-.51.51-.5.47-.52.47-.57.45-.61.45-.67.45-.77.43-.55.27-.7.3-.23.08-.9.28-.22.05-.58.12-.57.08h-.21l-.72.05h-.9l-.82-.1-.78-.17h-.18l-.85-.28-.82-.37-.17-.08-.78-.47-.73-.53-.15-.14-.6-.55-.55-.61-.14-.17-.31-.43-.3-.45-.47-.77-.55-1.07-.47-1.06-.38-1.07-.33-1.05-.27-1.07-.23-1.06-.19-1.07-.15-1.07-.11-1.08-.07-.82-1.13.55-1.33.76-1.33.8-1.34.84-1.36.86-1.35.89-1 .66-.07.62-.11.77-.14.75-.16.75-.2.73-.22.72-.23.71-.25.7-.29.69-.3.66-.31.65-.34.65-.35.64-.36.61-.39.62-.41.65-.79 1.12-.88 1.13-.92 1.08-1 1.05-1 1-1.05 1-.67.58-.13.53-.2.69-.25.66-.25.65-.29.62-.3.62-.31.56-.37.64-.67 1-.73 1-.77.92-.8.86-.81.8-.84.77-.83.7-.85.68-.85.64-.85.6-.85.56-.85.54-.83.51-.85.5-1.57.87-1.53.8-1.4.7-1.27.6-1 .47-.37.18-.47.25-1.36.75-1.59.88-.91.5-1 .47-1 .47-1.05.43-.72.23-.75.22-.51.1-.77.13h-.23l-.52.05h-1.47l-.73-.12h-.17l-1-.25-1-.4-.13-.07-.79-.42-.71-.48-.67-.58-.12-.1-.63-.67-.57-.75-.43-.75-.25.23-.8.62-.88.5-.94.4-1 .28-1 .17h-1l-1-.08-1-.2-1-.33-.92-.44-.85-.55-.67-.55-.78 2.35-1 2.9-.51 1.47-.33 1.38-.53 1.43-.55 1.45-.57 1.42-.6 1.4-.63 1.38-.67 1.39-.7 1.33-.75 1.28-.42.69-.41.65-.45.63-.47.63-.48.62-.5.62-.54.6-.63.65-.8.73-.65.52-.4.26-.68.44-.15.06-.47.25-.48.2-.14.05-.7.24-.71.18h-.12l-1 .13h-1.09l-.85-.08-.81-.17-.82-.25h-.07l-.83-.35-.77-.45-.73-.52-.07-.07-.58-.51-.53-.57-.49-.62-.05-.06-.46-.77-.4-.82v-.1l-.23-.61-.18-.64v-.11l-.16-.9v-.15l-.07-1v-1.19l.06-.7.15-1 .19-.88.2-.87.23-.85.25-.88.55-1.75v-.12l-.38-.48-.62-.95-.52-.95-.4-.9-.35-.88-.33-.87-.3-.9-.28-.92-.29-1-.28-1-.53-2.09-.57-2.25-.2-.86-.47-.09.14 1.07.1 1v1.89l-.11.85-.2.83-.29.8-.36.78-.55.87-.65.81-.75.72-.82.62-.9.51-1 .39-1 .28-.8.12-.1.81-.17 1-.2 1-.22 1-.26 1-.32 1-.37 1-.41 1-.5 1-.57 1-.65 1-.77 1-.81.87-.55.52-.52.41-.53.42-.57.38-.6.37-.65.33-1 .47-1 .38-1.05.34-1 .25-1 .18-1.05.12-1 .05h-1l-1-.06-1-.1-1-.14-.95-.18-.92-.23-.9-.25-.88-.29-.87-.31-.85-.34-.83-.35-.82-.38-.8-.4-.78-.43-.77-.44-.77-.45-.75-.48-.75-.48-.73-.49-.72-.51-.73-.54-1.35-1.05-1.49-1.04-1.32-1.14-1.26-1.16-1.22-1.19-.92-.91-.6.28-.66.28-.69.24-.71.2-.74.16-.76.12-.79.07h-1.6l-.8-.08-.8-.15-.76-.19-.77-.25-.73-.28-.67-.32-.75-.38-.68-.4-.67-.43-.65-.47-.63-.47-.6-.5-.57-.51-.55-.55-.53-.55-.5-.57-.49-.58-.45-.59-.43-.61-.42-.62-.38-.62-.37-.63-.35-.65-.33-.65-.1-.22-.37.32-.78.62-.87.51-.91.4-1 .3-1 .19h-1l-1-.07-1-.18-1-.3-.82-.47-.85-.51-.8-.62-.7-.72-.61-.8-.52-.86-.42-.92-.28-1-.18-1-.05-1 .06-1 .19-1 .3-1 .41-.91.54-.85.61-.79.59-.58.1-.13.11-.22.14-.28.16-.33.17-.39.18-.43.19-.45.4-1.1.41-1.22.42-1.33.43-1.4.9-3.12.94-3.3.48-1.71.5-1.74.53-1.73.55-1.73.59-1.74.61-1.71.65-1.67.37-.87.37-.83.38-.83.4-.82.42-.82.43-.8.48-.8.5-.78.54-.78.58-.77.62-.75.68-.75.75-.73.8-.7.9-.67.67-.43.08-.15.82-1.27.86-1.23.9-1.2.94-1.15 1-1.14 1-1 .57-.55.55-.51.56-.5.57-.5.58-.47.6-.47.62-.45.63-.43.64-.4.66-.4.67-.38.68-.37v-.01l.15-1.37.18-1.38.2-1.42.24-1.43.25-1.45.26-1.47.3-1.48.32-1.5.35-1.5.35-1.52.4-1.52.4-1.51.42-1.54.45-1.51.46-1.5.5-1.52.5-1.5.54-1.47.55-1.48.56-1.45.59-1.42.6-1.41.63-1.39.65-1.36.67-1.32.7-1.32.73-1.26.22-.35.45-1 .48-1.05.52-1 .53-1 .55-1 .58-1 .6-1 .65-1 .67-.93.7-.92.73-.9.79-.86.9-.95.51-.47.65-.52.42-.31.42-.27.8-.42.11-.06.52-.22.53-.2h.12l.67-.19.68-.11h.1l.82-.08h.91l.92.1.88.2h.1l.87.3.82.38.08.05.75.45.68.52.07.06.53.5.5.55.07.07.35.47.32.46.4.17.8.37.78.41.75.45.72.49.36.28.29-.25.73-.63.75-.62.77-.58.78-.59.8-.55.82-.55.83-.51.83-.49.87-.46.87-.45.9-.44.9-.4.91-.36.94-.35 1-.32 1-.28 1-.27 1-.23 1-.19 1-.16 1-.15 1-.1 1.05-.07h2.31l-.41-.61-.1-.17-.37-.67-.23-.5-.3-.78-.22-.67-.23-.85-.19-.78-.18-.78-.17-.8-.15-.79-.15-.81-.21-1.55-.15-1.57-.1-1.58v-3.15l.06-1.57.1-1.55.15-1.57.2-1.55.24-1.53.16-1.64.32-1.54.35-1.51.38-1.52.42-1.52.45-1.5.47-1.5.5-1.48.51-1.48.55-1.49.57-1.46.58-1.47.62-1.47.47-1.11v-.09l-.72-3.18-.68-3.2-.63-3.25-.25-1.35-.42.42-.7.75-.73.76-.75.75-.75.74-.79.71-.78.7-.8.69-.8.66-.83.65-.85.62-.87.6-.88.57-.92.55-.93.53-1 .48-1 .45-1 .42-1 .38-.82.24-.87.21-.6.09-.82.15h-1.97l-.55-.08h-.2l-.63-.14-.62-.18-.18-.07-.69-.26-.65-.34-.16-.08-.67-.42-.62-.46-.15-.12-.56-.52-.52-.56-.12-.14-.43-.58-.4-.63-.1-.17-.28-.55-.25-.58-.07-.19-.18-.53-.15-.53v-.22l-.15-.88v-.22l-.06-.77v-1.25l-.16-.56-.27-1.19-.2-1.23-.13-1.23-.07-1.22v-2.4l.1-1.18.14-1.19.18-1.16.22-1.17.25-1.15.28-1.15.32-1.15.33-1.15.37-1.15.4-1.15.41-1.13.12-.32-.18-.22-.42-.53-.4-.53-.38-.57-.37-.57-.35-.58-.33-.58-.3-.6-.27-.6-.27-.6-.23-.62-.23-.68-.35-1.19-.29-1.25-.2-1.25-.13-1.23-.07-1.23v-1.22l.07-1.22.11-1.18.17-1.17.23-1.16.27-1.14.3-1.13.33-1.1.39-1.1.41-1.08.44-1.07.46-1.05.5-1 .52-1 .55-1 .55-1 .6-1 .6-1 .62-1 .65-1 .65-.95.66-.93.69-.92.7-.92.71-.9.72-.88.72-.87.73-.86.75-.84.75-.83.75-.82.77-.81 1.5-1.52 1.53-1.47 1.52-1.4 1.51-1.31 1.5-1.24 1.45-1.13.75-.57.74-.51.71-.5.55-.37.12-1.4.27-3.25.33-3.22.35-3.18.38-3.1.39-3.18.28-2.12.33-2.4.42-2.6.25-1.38.25-1.42.28-1.45.32-1.47.33-1.5.37-1.5.4-1.51.43-1.52.47-1.52.52-1.51.55-1.5.6-1.5.63-1.44.37-.75.36-.73.4-.72.4-.71.42-.7.45-.7.47-.7.5-.67.51-.68.55-.65.59-.65.61-.64.67-.61.68-.59.74-.56.78-.55.82-.5.8-.44 1-.48.94-.42 1-.38.95-.37 1-.31 1-.29 1-.23 1-.22 1-.16 1-.12 1-.08h1l.42-.25.6-.33.61-.33.64-.32.65-.28.66-.29.69-.25.7-.23.71-.22.74-.18.75-.15.76-.13.77-.1.78-.05h1.62l.82.05.81.09.82.11.83.17.82.22.8.23.82.28.78.34.78.35.77.4.75.43.45.3.7-.47 1.52-.95.93-.57 1-.58 1.05-.6 1.13-.62 1.18-.65.97-.79 1.3-.65 1.35-.65 1.39-.63 1.41-.64 1.47-.6 1.48-.56 1.52-.54 1.53-.5 1.54-.43.81-.22.8-.18.82-.17.8-.15.83-.13.82-.1.85-.08.85-.07h2.65l.92.09 1 .15 1 .2 1 .25 1 .35 1 .41 1 .5.95.6.93.69.88.78.55.6.49.55.5.65.66 1 .55 1 .44 1 .31.85.27.76.15.54.3-.09 1-.31 1-.29 1-.26 1-.25 1-.22 1-.2 1-.17 1-.13 1.08-.08h1.08l.75.05zm-149 296.91-.48.89-.5.86-.5.84-.52.81-.15.22-.1.3-.38 1.12-.39 1v1.15l-.07 2.09v1.86l-.12 1-.1.42.33.33 1 .92 1 .88 1 .85 1 .8 1 .77.47.33.47.33.46.34.47.3.47.28.45.27.43.25.42.23.41.2.4.18.37.17.37.13.33.14.32.1.28.08.27.05.23.05h.15l.1-.33.08-.43.1-.49.09-.51.08-.59.07-.61.05-.67v-4.63l-.07-1.77-.1-1.82-.15-1.85-.18-1.9-.2-1.91-.13-1.1-3-.95-3.9-1.2-1.15-.34zm136.2-52.88-.48.6-1.13 1.42-1.22 1.53-1.3 1.65-.78 1 .76-.38 1.45-.68 1.44-.65.56-.25.14-.82.43-2.45.18-1zm-34.2 3.82-1.77 2.2.89-.09h1.23l1.12.05-.12-.65-.15-1.27-.08-1.26v-.34zm-29.5-12.25v.83l-.06.52-.1.5.75.41.45.29.68.5.57.5.55.51.66.74.65.8.55.81.49.8.43.82.38.82.32.8.3.8.25.81.23.8.2.8.1.42 1-1.3 2.62-3.28.75-.95-.45-.1-.72-.19-.71-.21-.72-.24-.7-.28-.7-.3-.7-.33-.67-.37-.66-.4-.64-.43-.63-.45-.62-.49-.6-.5-.56-.53-.84-.83-.78-.85-.75-.9-.27-.35zm-22-24.77-.78.58-.77.59-.75.58-.7.55-1.28 1.1-1.15 1-.93.85-.67.64-.32.31-.31.37-.34.4-.35.43-.35.49-.36.53-.37.57-.38.6-.39.63-.36.67-.39.7-.36.73-.39.77-.36.78-.35.8-.37.85-.35.85-.33.87 1.33-1.62 1.87-2.35 1.86-2.35 1.85-2.37 3.67-4.73 1.82-2.35 1.26-1.6zm17.12 13-.43 1.28-.45 1.3-.15.4.51.22.14.05.51.26.5.3.12.09.17.13-.24-.88-.23-1.07-.17-1.07-.13-1.06v-.37zm40.38-12.53-.45.7-1.48 2.23-1 1.5-1.07 1.68-1.26 1.82-.82 1.16.72-.55.55-.41.3-.39 2.91-3.85 1.59-2.11.26-2v-.18zm-17-4.55-.47.61-.45.64-.45.63-.43.63-.43.62-.4.63-.39.62-.1.17.12-.07 1.14-1.6 1.08-1.59 1-1.51v-.09zm-9.85-14.9h-1.32v.68l.1 1v.31l.37-.45 1.35-1.55zm-18.68-5.7-.5.86-.5.85-.54.84-.13.2h.5l.83.05.82.1v-3.72zm36.23-12.7-.32.95-.31.91-.34.9-.35.9-.35.85.67-.48 1-.73v-.62l.18-2.45.12-1.4zm52.73-36.69-1.6 3.79-.43 1 .43.14.82.31.77.4.55.38v-7.39zm-60.2-23.4-.46.72-.49.7-.45.72-.93 1.5-.88 1.51-.87 1.57-.83 1.58-.82 1.62-.78 1.65-.79 1.68-.73 1.7-.73 1.72-.52 1.27 1.9-2.92.13-.2.49-1.1.7-1.55.4-.85.41-.83.45-.85.49-.85.51-.87.57-.87.62-.86.7-.89.76-.86.57-.57.23-1 .39-1.95.18-1.05v-.2zm-30.83 5.94-.1.13.2 1.65.08.58.2-.38v-2.45zm49.12-40.7-2.52 1.56-2.55 1.59-2.6 1.58-5.18 3.13-2.14 1.29h.09l.86-.26.37-.09.5-.1.53-.08h1.84l.63.05.65.1.28.05.67.15.65.22.27.1.61.25.6.32.25.13.55.33.52.39.23.18.44.37.41.4.2.21.55.64 1-2.72 1.25-3.32 1.27-3.3 1.32-3.26.45-1.07zm76.9-28.07-.8.65-.84.72-.86.75-.89.81-.88.85-.92.92-.91.93-.94 1-.95 1-1 1-.33.37-.27.53-1.35 2.5-1.3 2.4-1.18 2.34-1.18 2.11v1.22l-.05.57-.1.86-.13.95-.32 2.22-.37 2.55-.35 2.6-.15 1.18-.11 1.09-.09.88v.68l-.05 1.12v2.92l.15-.35 1.11-2.69 1.15-2.68 2.29-5.28 2.31-5.25 2.32-5.2 2.32-5.29.36-.75.52-1 .63-1.33.75-1.6.82-1.82.4-.93.42-1 .4-1 .38-1 .23-.61zm-107.42-8.3-1 1.5-1 1.5-1 1.53-1 1.55-1 1.55-.95 1.57-1 1.58-.35.62.08.06.33.35.62-.91 1.45-2.19 1.42-2.21 1.4-2.27.66-1.12.67-1.13.65-1.13.22-.39v-.8zm49.22 6h.06l.42-.47zm48.15-30.5-.62.33-.66.39-.7.43-.74.47-.75.5-.76.51-1.65 1.17-.34.23v.27l.06.92v2.7l-.06.88-.09.88-.11.87-.12.88-.17.87-.16.87-.19.88-.2.87-.23.9-.47 1.7-.53 1.75-.58 1.75-.62 1.75-.61 1.73-.68 1.75-.72 1.75-.72 1.7.14.2.26.45.44-.81 1.3-2.59 1.28-2.61 1.25-2.62 1.22-2.6 1.16-2.55 1.1-2.57.5-1.22.5-1.23.46-1.2.44-1.18.41-1.17.4-1.12.35-1.08.34-1 .3-1 .26-1 .22-.92.2-.85.15-.8.07-.35zm-55.18-10.15-.35.05-.39.07-.4.06-.43.09-.45.11-.43.1-1 .3-1 .34-1.08.38-1.1.43-1.12.45-1.13.5-1.12.5-1.08.54-1.11.53-1 .53-1 .54-.94.51-.86.5-.8.47-.7.42-1.2.75-.15.11.08.37.17.73.15.75.11.75.1.74.07.75v.73l.05.75v.53l.82-.78.91-.87.94-.86.93-.84 1-.83 1-.82 1-.81 1-.79 1-.78 1-.77 1-.75 1-.73 1-.72 1.05-.71 1.06-.69 1.09-.66 1.1-.67 1.02-.65.31-.17v-.23l-.05-.27zm-150.99 344.98 1.34.1 1.33.15 1.37.2.7.14.71.16.7.19.69.21.66.24.67.28.67.28.63.34.62.35.6.38.58.4.57.43.53.45.52.47.48.48.47.5.43.54.42.51.36.54.42.61.58 1 .07.13.43-.33 1.34-.95 1.3-.87.71-.45.69-.4.7-.4.7-.37.73-.35.75-.35.78-.3.82-.3.87-.25.93-.21 1-.15.71-.07h2.09l.33.05.52.1.53.11.3.09.38.11.39.14.38.15.27.13.4.18.38.2.37.24.25.15.36.26.37.27.33.3.24.2.31.3.3.32.29.33.2.23.25.34.23.33.22.35.16.28.19.34.18.35.22.5.3.71.25.72.21.77.17.78.12.78.08.8v1.64l-.08.8-.12.8-.18.76-.23.75-.27.74-.28.68-.34.65-.35.62-.38.6-.38.56-.42.54-.42.5-.48.53-.83.82-.92.8-.95.71-1 .67-1 .6-1 .57-1 .53-1 .5-1.05.47-1.08.45-1.1.41-1.12.39-1.13.38-1.15.35-1.17.35-1.18.32-1.18.3-1.22.3-1.22.26-1.21.27-1.22.23-.33.37-.54.72-1.51 2-.62.8-.3.35-.38.42-.44.42-.43.36-.48.34-.5.3-.52.28-.53.23-.55.19-.55.16-.57.12-.58.07-.59.05h-1.16l-.57-.1-.57-.12-.56-.17-.55-.2-.52-.25-.52-.26-.5-.32-.46-.35-.44-.38-.41-.4-.39-.44-.36-.46-.32-.49-.28-.51-.25-.52-.1-.25h-5.38l-1-.05-1-.07-1-.08-1-.1-1-.12-.95-.15-.94-.16-.93-.2-.93-.25-.95-.3-1-.39-.68-.31-.35-.19-.33-.18-.64-.37-1-.7-.77-.6-.37.33-.4.3-.42.27-.43.27-.43.21-.55.27-.7.3-.72.27-.72.23-.72.39-.72.16-.72.15-.71.14-.7.1-.7.06-.7.05h-2.1l-1.27-.08-1.28-.17-1.25-.21-1.22-.27h-.18l-.45.07-1.07.37-1.08.35-1.12.32-1.11.28-1.14.27-1.16.21-1.19.2-1.2.15-1.21.1-1.24.07h-1.65l-.55-.05-.55-.07-.53-.13-.53-.15-.54-.19-.5-.21-.5-.27-.47-.28-.43-.32-.32.1-.56.14-.59.08-.58.05h-1.15l-.58-.08-.57-.12-.57-.15-.55-.18-.53-.23-.52-.27h-.05l-.58-.07-1.17-.18-1.2-.22-.71-.18-.72-.19-.75-.25-.8-.3-.87-.38-.6-.32-.33-.18-.32-.22-.28-.18-.38-.28-.39-.3-.23-.2-.3-.25-.28-.29-.27-.28-.18-.22-.34-.4-.3-.41-.08-.12-.2-.32-.2-.31-.07-.12-.21-.42-.2-.43-.09-.2-.2-.52-.16-.53-.05-.2-.1-.4-.07-.4-.07-.42v-2.45l.07-.41v-.19l.09-.38.1-.38.11-.39.07-.16.18-.5.22-.49.08-.18.22-.42.25-.4.1-.16.23-.35.25-.34.35-.43.6-.63.57-.54.63-.51.2-.14v-.27l.05-.43.08-.43.1-.44.07-.3.13-.45.17-.43.25-.65.45-.93.48-.82.48-.75.52-.68.42-.49v-.26l.06-1.14.14-1.11.18-1.1.23-1.07.27-1.05.32-1 .36-1 .39-1 .43-1 .47-1 .5-.91.51-.92.55-.9.59-.87.6-.86.61-.84.65-.81.69-.8.68-.79.72-.76.73-.74.75-.73.77-.7.78-.68.82-.67.81-.63.85-.62.85-.6.87-.57.88-.55.92-.51.92-.5.93-.47.95-.43 1-.4 1-.39 1-.33 1-.3 1-.27 1.05-.23 1.07-.18 1.07-.14 1.1-.08h2.4l.41.07.44.08.25.07.5.11.48.17.48.18.22.1.52.24.5.28.46.32.19.11.36.27.34.28.33.3.32.32.15.17.35.41.33.44.3.45.12.2.23.41.22.44.2.45.08.21.13.39.14.36.1.39.05.25.1.5.06.48v1.67l-.05.9v.11h.19l.88.07.92.11.95.17 1 .27.68.23.4.15.39.17.35.16.46.24.45.26.3.2.47.32.43.33.27.22.3.27.28.28.27.28.22.25.25.29.23.31.23.32.19.27.3.5.26.51.15.3.22.49.18.5.1.31.15.47.12.48.07.35.08.44.05.45v1.86l-.08 1.05-.1.69.2-.09 1.07-.41 1.06-.4 1.1-.37 1.14-.35 1.13-.33 1.15-.29 1.18-.26 1.2-.24 1.22-.18 1.25-.17 1.25-.11 1.27-.07h2.6zm-.2 17.3-.45.6-.48.59-.5.53-.35.33 1.75-.11 1.83-.17v-1.57l-.05-.23-.05-.2-.05-.15h-.08l-.79-.11-.33-.05z" fill="#808080"/><path d="m105.75 43.78.9.19 1 .31.92.42.85.53.8.64.7.71v.07l.55.7.46.75.39.8v.13l.2.54.16.55.12.46.1.55.13 1.09v1.08l-.03 1.08-.3 1-.43 1v.1l-.13 1.27-.19 1.92-.3 3.3-.25 2.03-.17 1.9-.16 1.91-.14 1.94-.13 1.91-.12 1.94-.1 2-.08 1.93-.15 3.9-.1 3.88-.07 3.9v9.36l-.05 2.78-.09 2.77-.1 2.76-.11 2.77-.14 2.75-.15 2.77-.33 5.46-.37 5.47-.4 5.43-.44 5.47-.4 5.42-.4 5.38-.35 5.37-.33 5.35-.13 2.65-.14 2.66-.11 2.67-.1 2.65-.07 2.65-.07 2.63v82.92l-.06 15.6v7.8l-.07 7.8-.08 7.82-.1 7.8-.12 7.81-.15 7.8-.17 7.82-.18 7.8-.22 7.8-.25 7.82-.28 7.8-.3 7.8-.35 7.78-.37 7.8-.41 7.78-.45 7.79-.5 7.76-.54 7.77-.58 7.77-.62 7.73-.15 1.07-.3 1.05-.43 1-.57.93-.66.87-.79.75-.88.65-1 .53-1 .4-1.07.27-1.08.13h-1.08l-1.09-.23-1-.29-1-.43-.93-.57-.85-.66-.77-.79-.65-.88-.53-1-.4-1-.27-1.05-.13-1.08v-1.08l.61-7.69.59-7.66.51-7.69.49-7.68.45-7.7.41-7.7.37-7.72.35-7.71.3-7.74.27-7.73.25-7.73.21-7.75.19-7.75.16-7.77.15-7.75.12-7.77.1-7.76.08-7.77.07-7.77.05-7.78.07-15.55v-83.12l.06-2.78.09-2.77.1-2.77.11-2.75.14-2.76.15-2.75.33-5.47.37-5.47.38-5.45.42-5.41.4-5.4.38-5.39.37-5.36.33-5.37.13-2.65.14-2.67.11-2.65.09-2.65.08-2.65.07-2.65v-13.35l.1-4.08.17-4.07.08-2.07.12-2.05.12-2 .13-2 .15-2 .17-2 .18-2 .18-2 .3-3.28.2-2.05.22-2 .12-1 .13-1 .18-1 .15-.69.22-.73v-.15l.37-1 .06-.1.39-.73.45-.69.53-.63.05-.07.8-.76.9-.67 1-.53 1-.39.88-.22.9-.12h.92zm-9.12 10.47.1.35-.1-.37z"/><path d="m619.78 0 1.3.1 1.29.14 1.25.16 1.21.22 1.17.26 1.16.25 1.14.29 1.11.3 1.07.3 1.08.31 2 .64 2 .65 1.88.6 1.83.58.87.25.87.23.85.24.83.2.82.18.81.17.8.13.82.12 2.63.3 2.7.3 2.7.25 2.72.23 2.73.2 2.75.2 2.75.15 2.79.15 2.78.12 2.8.11 2.8.1 2.82.09 5.68.13 5.7.12 11.48.2 5.79.13 5.78.17 2.9.1 2.92.11 2.9.14 2.91.15 2.9.16 2.92.2 2.92.22 2.91.25 1.37.15 1.37.15 1.33.17 1.32.16 1.3.2 1.26.22 1.27.23 1.23.25 1.2.25 1.2.29 1.17.3 1.15.3 1.13.33 1.1.33 1.1.37 1.07.38 1 .39 1 .41 1 .44 1 .43 1 .47 1 .48.94.5.91.52.9.53.87.55.87.57.83.58.82.6.8.62.78.63.75.65.73.67.72.66.7.7.67.72.65.72.63.73.6.75.58.77.57.76.55.79.52.8.5.8.48.81.45.84.43.83.42.83.4.85.38.85.37.87.33.87.34.86.3.89.3.88.26.88.27.89.23.9.24.9.21 1 .39 1.78.31 1.85.29 1.85.23 1.87.2 1.88.15 1.9.12 1.92.08 1.91.05 1.94v6l-.05 2-.07 2-.08 2-.08 2-.24 4.05-.26 4.12-.23 4.06-.3 4.12-.25 4.2-.24 4.23-.1 2.1-.08 2.12-.07 2.11v26.73l.05 6.84.06 6.81.1 6.85.1 6.85.12 6.85.13 6.85.15 6.87.19 6.87.18 6.86.2 6.89.22 6.86.23 6.89.27 6.86.26 6.87.3 6.88.3 6.87.34 6.87.33 6.85.37 6.85.38 6.85.4 6.85.42 6.83.43 6.83.47 6.82.46 6.8.5 6.8.52 6.78.53 6.77.55 6.77.82 9.8.78 9.73.39 4.87.35 4.85.35 4.85.31 4.86.3 4.89.25 4.88.24 4.92.2 4.93.16 5 .12 5 .07 5.05v6.35l.1 1.65.13 1.88.15 2.08.17 2.24.16 2.36.12 2.44.05 1.28v3.87l-.05 1.31-.08 1.32-.12 1.33-.15 1.34-.2 1.33-.27 1.35-.3 1.28-.21.74-.2.66-.24.69-.25.68-.26.67-.3.68-.34.68-.36.67-.4.67-.42.66-.47.65-.5.65-.53.62-.58.6-.54.53-.56.49-.59.45-.6.43-.63.38-.65.37-.65.32-.67.3-.66.25-.67.21-.68.17-.65.15-.67.12-.73.08-1.17.08h-1.2l-1.15-.09-1.08-.15-1.05-.18-1-.23-.95-.25-.9-.29-.86-.28-.84-.32-.81-.3-1.49-.6-1.38-.58-1.27-.52-1.15-.45-.46-.16-.45-.15-.39-.12-.26-.07-.27-.05-.25-.05-1.28-.17-1.42-.17-1.45-.16-1.48-.14-1.54-.11-1.55-.12-1.58-.08-1.62-.09-1.63-.05h-8.4l-1.7.05-1.7.06-1.7.1-1.68.1-1.69.12-1.66.15-1.65.17-1.64.18-1.6.2-1.58.22-1.55.23-1.52.27-1.46.26-1.45.29-1.39.31-1.35.32-1.28.35-1.25.35-2 .62-2 .66-2 .69-2 .73-2 .77-2 .78-2 .82-2 .83-2.05.85-2 .87-4.13 1.78-4.17 1.82-4.2 1.81-2.11.92-2.15.9-2.15.88-2.17.89-2.18.85-2.2.85-2.24.81-2.23.79-2.27.75-2.28.71-2.3.69-2.33.65-2.34.58-1.2.3-1.2.27-1.2.25-1.2.23-1.21.23-1.22.2-1.93.32-2 .28-1.92.25-1.93.22-1.92.2-1.9.17-1.9.13-1.9.13-1.88.09-1.89.08-1.86.05h-9.25l-1.84-.07-1.81-.08-1.82-.08-1.83-.12-3.59-.25-3.58-.3-3.55-.33-3.55-.35-3.52-.4-3.5-.4-7-.84-6.9-.83-3.43-.4-3.42-.37-3.41-.35-3.4-.31-3.42-.27-1.68-.12-1.7-.11-1.7-.1-1.7-.09-1.7-.06-1.69-.05h-10.2l-1.73.04-1.73.08-25.8 1.55-25.8 1.52-12.9.75-12.9.71-12.92.69-12.9.65-6.46.3-6.47.3-6.47.28-6.46.25-6.47.25-6.47.23-6.48.22-6.48.2-6.49.18-6.48.15-6.5.14-6.5.11-6.5.09-6.52.06h-21.2l-2.73-.05-5.43-.14-5.42-.18-5.42-.22-5.38-.25-5.4-.28-5.37-.3-10.71-.62-10.69-.67-5.32-.3-5.31-.28-5.29-.25-5.28-.24-5.27-.2-5.26-.15-2.62-.06h-15.67l-2.6.05-2.6.07-2.58.08-2.6.08-2.58.14-2.57.06-2.58.15-2.58.18-2.57.2-2.58.24-2.57.25-2.57.28-2.55.3-2.56.32-2.55.36-2.57.37-2.55.42-2.55.43-2.53.47-2.55.5-2.6.53-1.9.4-2.84.55-3.63.68-4.27.77-4.78.83-2.57.42-2.63.43-2.7.42-2.75.42-2.78.4-2.8.38-2.8.37-2.8.33-2.75.32-2.74.26-2.66.24-2.59.2-2.51.15-2.4.08h-5.67l-1.07-.07-1-.08-1-.13-1-.15-1-.2-1-.25-1.07-.32-1.23-.45-1.07-.52-.7-.42-.61-.43-.64-.5-.38-.33-.6-.62-.22-.25-.6-.77-.18-.26-.45-.72-.17-.3-.33-.68-.28-.64-.32-.95-.25-.9-.18-.86-.14-.85-.08-.8-.07-.82v-2.33l.05-.82.11-1.52.17-1.56.22-1.57.26-1.6.3-1.62.34-1.63.35-1.65.36-1.65.39-1.65.8-3.27.81-3.21.77-3.07.7-2.88.32-1.32.26-1.25.25-1.13.19-1 .15-.88.1-.73.06-.59v-.45l.15-1.44.42-1.4.63-1.3.85-1.18 1-1 1.22-.82 1.32-.58 1.41-.35 1.45-.1 1.44.17 1.4.4 1.3.63 1.18.85 1 1.05.82 1.22.58 1.31.35 1.42.1 1.45v1.25l-.12 1.27-.18 1.31-.22 1.34-.26 1.36-.29 1.4-.31 1.44-.35 1.48-.74 3-.8 3.11-.78 3.15-.77 3.14-.35 1.51-.35 1.5-.3 1.45-.28 1.4-.25 1.34-.2 1.23-.17 1.17-.08.76h4.03l2.09-.08 2.2-.14 2.35-.16 2.43-.22 2.53-.27 2.6-.28 2.65-.33 2.69-.34 2.68-.38 2.68-.38 2.65-.4 2.62-.4 2.55-.42 2.47-.4 4.67-.74 4.15-.73 3.48-.67 2.7-.53 1.82-.37 2.67-.55 2.73-.53 2.73-.5 2.74-.48 2.73-.44 2.73-.4 2.74-.38 2.73-.35 2.73-.32 2.72-.3 2.73-.26 2.72-.24 2.73-.21 2.72-.19 2.72-.18 2.71-.13 2.72-.14 2.72-.1 2.71-.08 2.72-.07h16.23l2.7.05 2.72.05 5.38.16 5.39.2 5.38.24 5.37.25 5.36.3 5.37.3 10.7.61 10.67.64 5.31.28 5.32.28 5.32.25 5.3.22 5.3.17 5.3.13 2.63.05h20.8l6.45-.07 6.45-.08 6.43-.12 6.44-.13 6.45-.15 6.43-.19 6.42-.18 6.43-.22 6.43-.23 6.44-.25 6.41-.27 6.44-.26 6.43-.3 6.42-.3 12.86-.65 12.85-.69 12.87-.71 12.87-.74 25.8-1.53 25.85-1.53 1.88-.1 1.9-.09 1.88-.05h7.49l1.86.05h1.84l1.85.06 1.81.1 1.84.1 1.81.12 1.82.13 3.6.29 3.57.33 3.56.35 3.54.4 3.5.4 7 .83 6.9.84 3.44.4 3.4.36 3.41.35 3.39.32 3.38.28 3.4.24 1.67.1 1.68.08 1.68.08 1.69.05h10.08l1.68-.06 1.69-.09 1.68-.1 1.68-.13 1.7-.15 1.69-.17 1.7-.2 1.7-.21 1.7-.25 1.7-.27 1-.17 1-.2 1-.2 1-.2 1-.23 1-.23 2-.52 2-.55 2-.6 2-.63 2-.67 2-.72 2-.73 2-.77 2-.8 2-.81 2-.85 2.05-.87 2-.87 4.15-1.8 4.17-1.81 4.2-1.82 2.13-.9 2.15-.9 2.15-.88 2.17-.87 2.18-.85 2.22-.83 2.21-.8 2.25-.79 2.25-.73 2.3-.72 1.59-.45 1.63-.43 1.67-.4 1.7-.38 1.71-.35 1.75-.32 1.77-.3 1.8-.28 1.8-.25 1.83-.22 1.85-.22 1.85-.18 1.87-.15 1.87-.15 1.88-.12 1.88-.1 1.89-.06 1.86-.07h9.3l1.82.06 1.8.09 1.77.1 1.76.11 1.74.15 1.7.15 1.66.19 1.65.2 1.69.21 1 .17 1 .22.93.25.89.26.86.29.85.31 1.5.59 1.44.58 1.33.55 1.25.52.53.2.52.18.48.17.44.13.38.1h.1v-.11l.07-.2.08-.24.07-.23.06-.23.15-.64.14-.66.11-.75.09-.79.08-.86v-5.84l-.1-2.15-.15-2.17.12-2.08-.16-2.12-.14-2.06-.11-2v-6.9l-.07-4.89-.11-4.85-.15-4.83-.2-4.82-.22-4.78-.27-4.78-.28-4.79-.32-4.78-.33-4.78-.35-4.8-.38-4.8-.79-9.69-.81-9.8-.55-6.8-.54-6.81-.51-6.84-.5-6.85-.49-6.85-.45-6.86-.45-6.87-.41-6.88-.4-6.9-.39-6.89-.36-6.9-.35-6.91-.34-6.9-.3-6.92-.3-6.92-.26-6.91-.27-6.92-.23-6.92-.24-6.9-.2-6.91-.18-6.92-.17-6.9-.16-6.92-.14-6.9-.11-6.88-.1-6.88-.09-6.89-.08-6.86v-29.69l.05-2.26v-2.27l.07-2.23.08-2.24.1-2.21.25-4.37.25-4.3.29-4.2.26-4.13.27-4 .22-3.93.08-1.9.08-1.89.07-1.85v-8.78l-.08-1.64-.09-1.6-.13-1.55-.15-1.51-.36-1.47-.22-1.43-.25-1.39-.28-1.35-.15-.61-.17-.64-.17-.61-.16-.62-.19-.6-.2-.58-.2-.59-.2-.55-.21-.55-.24-.55-.23-.51-.25-.52-.25-.5-.25-.5-.27-.48-.28-.47-.28-.47-.3-.45-.3-.45-.32-.43-.33-.42-.3-.43-.35-.4-.36-.4-.39-.4-.38-.38-.4-.39-.42-.38-.43-.37-.45-.36-.45-.35-.48-.37-.5-.35-.52-.33-.55-.34-.55-.33-.57-.32-.6-.31-.6-.32-.63-.3-.67-.3-.68-.3-.72-.28-.73-.27-.77-.27-.78-.26-.82-.25-.83-.25-.87-.24-.9-.21-.92-.22-1-.2-1-.2-1-.18-1-.17-1-.17-1.1-.15-1.1-.13-1.15-.13-1.18-.12-2.78-.2-2.77-.2-2.77-.2-2.78-.17-2.8-.13-2.8-.14-2.82-.16-2.81-.1-5.67-.15-5.7-.14-11.45-.18-5.75-.11-5.76-.15-2.89-.09-2.9-.1-2.88-.1-2.88-.13-2.94-.15-2.89-.17-2.88-.2-2.86-.23-2.89-.25-2.88-.27-2.88-.32-2.9-.35-1.25-.16-1.24-.22-1.21-.23-1.19-.2-1.16-.28-1.14-.3-1.1-.3-1.08-.34-2.05-.63-2-.63-1.89-.62-1.81-.57-.85-.25-.85-.25-.84-.21-.8-.2-.78-.17-.78-.17-.75-.11-.74-.1-.71-.09-.72-.05h-2.07l-.7.05-.68.1-.73.12-1 .23-1.05.25-1 .3-1.07.33-1.06.37-1.09.4-1.08.43-1.08.45-1.1.5-1.12.52-1.12.53-1.11.57-1.14.58-1.11.6-2.32 1.29-2.33 1.31-2.4 1.34-2.39 1.4-2.41 1.4-2.45 1.38-1.25.7-1.25.69-1.29.66-1.28.65-1.28.64-1.3.61-2 .89-1.95.86-2 .85-2 .84-2 .83-2.05.82-2.09.8-2.08.78-2.12.78-2.13.75-2.15.75-2.17.74-2.18.71-2.22.72-2.21.68-2.24.69-2.25.66-2.26.65-2.29.64-2.28.61-2.3.62-2.32.58-2.31.59-2.34.55-2.33.55-2.35.53-2.37.5-2.35.5-2.38.48-2.37.47-2.33.45-2.37.43-2.38.42-2.4.4-2.38.38-2.39.35-2.38.35-2.38.34-2.39.31-2.38.29-2.38.28-2.37.25-2.36.23-2.37.24-2.35.2-2.35.18-2.35.15-2.33.15-2.34.12-2.31.11-2.3.09h-13.59l-2.21-.06-2.2-.09-2.19-.11-2.18-.01-2.15-.17-2.12-.16-2.1-.2-3.68-.47-3.65-.4-3.64-.4-3.61-.43-7.17-.88-7.12-.89-7.06-.86-3.52-.42-3.5-.42-3.5-.38-3.48-.38-3.47-.35-3.47-.32-3.45-.3-3.45-.27-3.43-.2-3.45-.18-3.43-.17-3.45-.1-3.45-.07h-8.57l-1.73.05-1.72.07-1.71.1-1.74.08-1.71.12-1.74.13-1.71.15-1.74.17-1.73.16-1.73.2-1.74.22-1.73.23-1.75.25-1.7.27-1.7.28-3.45.59-3.45.63-3.47.72-3.48.71-3.47.74-3.5.76-3.5.79-7.07 1.63-7.08 1.63-3.57.84-3.58.8-3.6.8-3.6.78-3.63.75-3.64.73-3.65.69-3.66.65-3.67.6-1.85.28-1.85.28-1.87.25-1.85.25-1.86.22-1.87.22-1.87.18-1.88.18-1.87.15-1.88.15-1.9.12-1.88.08-1.9.09h-9.54l-1.91-.05-1.94-.1-1.91-.12-1.94-.08-1.63-.15-1.63-.18-1.64-.2-1.6-.23-1.63-.24-1.6-.29-1.6-.3-1.59-.31-1.58-.34-1.57-.36-1.54-.4-1.52-.4-1.55-.4-1.55-.42-1.53-.43-1.55-.45-3-.92-3-1-3-1-3-1-2.95-1-2.92-1-5.8-2-2.85-1-2.83-1-2.82-.92-2.78-.87-2.87-.69-1.37-.38-1.37-.39-1.35-.36-1.33-.37-1.35-.32-1.35-.32-1.33-.3-1.32-.26-1.31-.25-1.32-.24-1.32-.21-1.28-.2-1.3-.17-1.28-.13-1.29-.12-1.26-.1-1.27-.07h-5l-1.32.07h-1.46l-1.42-.38-1.35-.55-1.22-.77-1.08-1-.9-1.14-.67-1.28-.45-1.38-.2-1.45v-1.45l.3-1.42.55-1.35.82-1.21 1-1.07 1.14-.9 1.28-.68 1.38-.44 1.45-.2 1.52-.08h4.82l1.6.06 1.6.09 1.58.11 1.58.15 1.57.19 1.57.2 1.56.23 1.55.25 1.57.27 1.53.3 1.55.31 1.54.35 1.53.35 1.52.37 1.51.4 1.52.4 1.52.42 1.51.43 3 .88 3 .94 3 1 2.95 1 2.93 1 5.82 2 2.9 1 2.88 1 2.87 1 2.85.94 2.83.9 2.85.85 1.38.4 1.4.4 1.4.38 1.4.37 1.4.33 1.39.33 1.38.32 1.38.3 1.29.15 1.37.25 1.36.24 1.37.21 1.37.2 1.35.17 1.35.15 1.35.12 1.7.13 1.68.1 1.7.08 1.7.07h6.8l1.7-.05 1.7-.07 1.7-.1 1.72-.1 1.7-.13 1.71-.14 1.72-.16 1.72-.19 1.71-.18 1.72-.22 1.72-.21 1.73-.24 1.72-.25 1.71-.26 3.49-.59 3.46-.61 3.47-.65 3.5-.7 3.48-.72 3.5-.77 3.52-.76 3.52-.8 3.53-.82 7.1-1.65 7.1-1.63 3.58-.8 3.6-.79 3.59-.76 3.61-.74 3.62-.71 3.63-.67 3.64-.62 1.83-.3 1.83-.28 1.92-.27 1.9-.26 1.9-.24 1.9-.21 1.88-.19 1.9-.18 1.89-.17 1.86-.13 1.89-.13 1.86-.1 1.87-.1 1.87-.07h11.07l3.65.06 3.66.12 3.64.17 3.63.2 3.62.23 3.61.28 3.6.32 3.59.33 3.61.29 3.58.39 3.57.41 3.57.42 3.55.42 7.11.88 7.1.88 7.12.87 3.55.42 3.57.41 3.56.39 3.55.36 1.94.19 1.93.15 1.95.15 2 .11 2 .1 2 .07 2.05.07h10.55l2.15-.07 2.17-.08 2.17-.09 2.2-.11 2.2-.15 2.21-.15 2.22-.17 2.23-.18 2.24-.22 2.25-.22 2.25-.25 2.25-.26 2.26-.27 2.27-.3 2.27-.32 2.26-.33 2.27-.33 2.27-.37 2.26-.38 2.27-.4 2.27-.4 2.26-.44 2.27-.45 2.25-.45 2.25-.46 2.23-.5 2.24-.5 2.23-.52 2.22-.53 2.2-.55 2.2-.55 2.18-.59 2.17-.58 2.16-.6 2.15-.62 2.12-.63 2.12-.63 2.1-.67 2.08-.67 2-.66 2.05-.7 2-.7 2-.72 2-.72 1.95-.73 1.93-.75 1.9-.77 1.89-.76 1.85-.77 1.83-.78 1.8-.8 1.75-.8 1.07-.52 1.06-.52 1.09-.55 1.1-.58 1.1-.6 1.11-.6 2.29-1.3 2.36-1.37 2.37-1.4 2.43-1.4 2.45-1.42 2.54-1.4 1.3-.7 1.34-.68 1.34-.67 1.33-.65 1.37-.63 1.38-.62 1.4-.58 1.41-.57 1.45-.53 1.47-.5 1.5-.47 1.52-.43 1.57-.35 1.58-.38 1.4-.25 1.42-.19 1.4-.11 1.38-.07h1.35z"/><path d="m201.17 342.78h1.11l.35.07.27.06.28.07.27.08.28.09.35.13.22.1.22.1.21.1.22.12.22.1.28.18.2.12.2.15.2.13.2.15.18.15.25.22.2.18.2.18.19.19.16.2.24.28.15.17.13.2.15.18.12.18.18.3.13.22.12.22.12.23.16.33.1.22.09.22.08.21.07.24.08.21.07.27.06.23.07.24v.23l.05.25v3.48l-.05.29-.07.28-.07.27-.08.28-.08.27-.1.26-.12.27-.1.27-.13.25-.14.25-.15.25-.15.23-.15.23-.16.24-.17.23-.18.22-.2.21-.2.2-.2.2-.2.19-.22.2-.23.16-.22.17-.23.17-.25.15-.24.15-.25.13-.26.13-.25.12-.27.12-.27.1-.26.08-.27.08-.28.09-.27.06-.28.05h-.29l-.2.27-.78 1.08-.8 1.17-.82 1.23-.83 1.3-.83 1.32-.82 1.35-.78 1.32-.74 1.3-.7 1.25-.63 1.18-.37.7v2.43l-.07.29-.06.26-.07.29-.08.26-.1.27-.1.27-.12.26-.12.25-.13.27-.13.23-.15.25-.15.24-.17.23-.17.23-.18.22-.18.22-.2.21-.2.2-.2.2-.47.42-.45.35-.18.17-.22.15-.2.13-.22.15-.2.12-.2.13-.21.12-.22.11-.22.1-.16.09-.25.11-.25.1-.25.1-.27.1-.27.07-.26.08-.18.24-.27.05h-.13l-.28.05h-2.55l-.27-.05-.25-.05-.25-.07-.27-.06-.25-.07-.23-.08-.25-.1-.25-.1-.23-.1-.24-.12-.25-.14-.25-.13-.23-.15-.23-.17-.24-.15-.23-.18-.22-.18-.21-.19-.2-.2-.18-.18-.18-.2-.19-.2-.16-.22-.15-.2-.17-.22-.13-.23-.15-.22-.14-.23v-.05l-.14-.25-.13-.25-.1-.25-.12-.25-.1-.27-.08-.26-.08-.25-.07-.29-.07-.26v-.14l-.05-.26v-2.66l.05-.27.08-.58.2-.84.24-.75.43-1.16.5-1.2.58-1.24.64-1.28.7-1.33.75-1.4.8-1.45.85-1.49.9-1.5.91-1.51.94-1.5 1-1.5 1-1.45 1-1.4 1-1.37 1-1.28 1-1.24.95-1.11.55-.59.53-.55.57-.55.63-.55.73-.56.54-.35.23-.15.23-.14.25-.13.25-.13.2-.12.22-.1.22-.08.21-.1.22-.09.23-.08.25-.08.27-.09.25-.06.27-.07-.2-.05.27-.05h1.87zm16.38 18.75h1.25l.25.05.23.05.25.07.24.06.25.07.23.08.23.1.24.1.23.1.22.1.23.14.22.11.21.14.2.13.22.15.2.15.2.15.18.17.2.16.19.17.16.18.17.19.17.18.16.2.15.2.15.2.15.22.14.2.13.21.12.24.11.21.12.24.1.21.08.24.1.25.09.23.06.23.07.25.05.25.07.24v3.35l-.07.25v.25l-.06.23-.09.25-.08.23-.08.24-.1.23-.1.23-.12.22-.12.23-.13.22-.12.22-.15.2-.13.21-.15.2-.17.2-.15.19-.18.18-.17.18-1.05 1.07-1 1.08-1.12 1.19-1 1.16-2.2 2.52-2.25 2.57-2.26 2.58-1.17 1.3-1.17 1.28-1.2 1.24-1.2 1.21-1.26 1.14-1.15 1-.19.17-.2.15-.18.16-.22.15-.2.14-.21.13-.22.13-.22.12-.21.12-.24.11-.23.1-.23.1-.24.09-.23.08-.25.07-.23.06-.25.07-.25.05-.24.05h-2.51l-.25-.05-.25-.05h-.24l-.25-.05-.25-.08-.23-.07-.23-.08-.24-.1-.23-.08-.23-.12-.24-.1-.21-.12-.22-.13-.22-.13-.21-.14-.2-.15-.2-.15-.2-.15-.2-.16-.19-.17-.18-.17-.17-.18-.18-.18-.17-.19-.15-.2-.16-.2-.15-.2-.14-.2-.13-.21-.13-.22-.12-.22-.12-.23-.11-.22-.1-.23-.1-.23-.09-.24-.08-.23-.07-.25-.06-.23-.07-.25-.05-.25v-3l.05-.25v-.25l.06-.24.07-.25.07-.23.15-.22.1-.23.08-.24.12-.21.1-.24.12-.21.13-.22.13-.22.14-.21.15-.2.15-.2.15-.2.16-.2.17-.19.17-.18.18-.18.18-.17.95-.87.9-.86.95-1 1-1 1-1.1 1-1.16 2.18-2.47 2.23-2.57 2.29-2.6 1.18-1.31 1.18-1.29 1.19-1.28 1.15-1.17.18-.18.18-.17.2-.16.19-.17.2-.15.2-.15.21-.13.22-.14.22-.13.21-.13.22-.12.23-.1.24-.1.23-.1.23-.08.24-.09.23-.08.25-.07h.25l.23-.05.25-.05h1.52zm58.37-103.15h.4l.4.05.38.05.4.08.38.1.39.12.36.13.37.15.37.17.35.18.33.2.33.22.32.23.32.25.3.27.28.27.27.3.25.3.25.31.23.32.2.33.2.35.18.35.15.37.15.37.1.33.32.12 2.73 1 1.5.57.8.33.82.33.82.37.83.42.85.45.88.51.89.6.76.59 1.07.86.92.75 2 1.54 2 1.53 2.09 1.53 2.11 1.55 2.17 1.57 4.4 3.18 2.22 1.62 2.21 1.67 2.22 1.68 2.17 1.72 1.1.88 1.08.9 1.07.9 1.05.92 1.05.93 1 .95 1 1 .95.91.28.29.25.3.25.31.24.32.21.33.2.34.19.35.16.36.17.37.12.37.11.38.1.38.09.4.06.39v1.98l-.07.38-.06.4-.09.39-.11.38-.12.37-.15.38-.17.35-.16.37-.2.33-.22.33-.22.34-.25.31-.25.3-.28.29-.28.28-.3.27-.3.23-.32.23-.33.22-.35.22-.35.18-.35.17-.37.15-.38.13-.41.07-.38.08-.38.08-.4.07h-2.37l-.38-.09-.39-.08-.38-.12-.38-.11-.37-.15-.37-.15-.35-.19-.35-.2-.33-.21-.32-.22-.31-.25-.3-.25-.3-.27-.84-.83-.81-.78-.85-.77-.87-.78-.9-.77-.9-.78-.95-.77-.93-.77-2-1.56-2-1.55-2.07-1.58-2.14-1.55-4.35-3.15-2.2-1.6-2.2-1.6-2.2-1.64-2.18-1.66-2.15-1.69-1.08-.88-.92-.75-.1-.07h-.05l-.15-.1-.27-.13-.35-.17-.4-.18-.48-.22-.52-.2-1.23-.47-1.32-.48-1.43-.52-1.43-.53-.79-.32-.78-.33-.78-.37-.82-.4-.85-.46-.88-.57-.64-.45-.28-.23-.3-.25-.58-.52-.59-.6-.5-.6-.5-.68-.26-.45-.2-.35-.19-.35-.06-.17-.12-.25-.1-.23-.1-.27-.07-.15-.1-.3-.08-.3-.08-.3v-.17l-.06-.3-.07-.3v-3.04l.05-.3.06-.3v-.18l.06-.28.09-.3.08-.29.07-.18.13-.37.15-.35.08-.2.15-.33.19-.33.25-.47.46-.72.34-.43.25-.3.26-.3.29-.28.28-.29.3-.25.32-.25.33-.21.33-.22.34-.2.36-.17.35-.16.39-.15.36-.12.39-.12.38-.08.4-.07.38-.05h.8z"/><path d="m315.58 245.38h.82l.4.07.4.08.4.1.38.12.39.13.38.17.37.18.35.18.35.22.35.23.31.25.32.25.3.29.28.28.29.32.25.31.25.32.21.35.22.35.18.37.19.36.15.39.05.15.1.28.1.28.08.29v.16l.07.27.05.28v.45l.05.37v2.27l-.05.38-.07.38-.08.42v.28l-.09.29-.08.28-.23.77-.42 1-.45.93-.48.89-.5.83-.54.82-.55.8-.58.78-.6.8-.65.82-1.25 1.68-1.43 1.65-1.57 1.7-1.6 1.74-1.65 1.78-3.46 3.63-3.57 3.77-1.72 1.88-1.75 1.9-1.74 1.9-1.68 1.88-1.6 1.85-1.55 1.84-.7.88-.7.88-.68.87-.64.83-.6.84-.56.8-.54.78-.48.75-.45.72-.4.68-.35.65-.32.6-.26.55-.21.5-.15.43-.12.37-.07.27-.05.26v.97l-.07.42-.07.4-.1.4-.11.38-.15.38-.15.39-.17.36-.2.37-.2.35-.23.35-.24.32-.26.31-.27.32-.3.28-.3.29-.32.25-.31.25-.35.23-.35.2-.35.2-.37.17-.38.16-.39.14-.4.13-.38.1-.4.07-.42.06-.4.05h-1.63l-.4-.07-.4-.08-.4-.08-.4-.12-.38-.15-.39-.15-.36-.17-.35-.2-.37-.2-.33-.23-.34-.25-.31-.25-.3-.27-.3-.3-.27-.3-.27-.31-.23-.32-.23-.35-.22-.35-.18-.35-.19-.37-.16-.38-.14-.38-.11-.4-.1-.39-.09-.4-.06-.41v-2.42l.06-.67.1-.71.24-1.2.3-1.22.38-1.18.42-1.15.48-1.12.52-1.1.55-1.08.58-1.09.62-1.05.65-1.05.68-1.05.72-1.05.73-1 .75-1 .78-1.05.8-1 .82-1 .85-1 1.72-2.05 1.76-2 1.82-2 1.83-2 1.85-2 1.85-2 3.6-3.8 3.4-3.6 1.59-1.69 1.48-1.61 1.37-1.5 1.21-1.42 1.07-1.3.45-.55.42-.53.35-.49.3-.43.13-.2v-.72l.07-.4.08-.4.1-.4.12-.38.15-.38.15-.39.18-.36.2-.37.2-.35.23-.33.25-.34.27-.3.27-.3.3-.3.3-.26.31-.27.34-.23.33-.24.35-.2.37-.18.36-.18.39-.15.38-.14.4-.11.4-.1.4-.09h1.22zm-8.16 11 .1.29-.12-.37zm-20.55-118.71h1l.31.05.34.07.31.08.32.08.32.1.31.12.3.13.3.14.3.16.29.15.28.19.27.18.26.2.27.2.25.22.23.23.24.23.23.25.2.25.2.27.2.27.18.28.17.28.15.29.15.3.13.3.14.31.1.32.1.32.08.31.07.32.06.33.05.34v2.43l-.1.52-.22 1.11-.27 1.42-.26 1.52-.22 1.28v3.25l-.05.15-.05.17-.05.15-.05.16-.07.15-.05.15-.06.15-.07.15-.07.15-.39.15-.07.15-.08.15-.08.14-.09.15-.1.13-.08.15-.1.13-.08.14-.1.13-.1.13-.12.14-.1.11-.12.14-.1.11-.11.12-.12.12-.07.06-.11.12-.12.12-.12.1-.13.11-.12.1-.13.1-.13.1-.12.1-.13.09-.14.1-.15.08-.13.08-.13.09-.15.08-.14.08-.15.07-.15.08-.15.07-.15.07-.15.06-.15.07-.15.05-.15.07-.15.05h-.32l-.15.05h-4.33l-.17-.05h-.17l-.15-.06-.15-.05h-.16l-.15-.07-.15-.07-.15-.06-.15-.07-.15-.07-.15-.08-.15-.08-.14-.09-.15-.08-.13-.08-.15-.09-.13-.1-.14-.1-.13-.08-.13-.12-.12-.1-.13-.1-.14-.11-.11-.1-.12-.12-.12-.12-.11-.11-.12-.12-.12-.13-.1-.12-.11-.13-.1-.13-.1-.13-.1-.12-.08-.13-.1-.14-.08-.13-.09-.15-.08-.13-.08-.14-.09-.15-.06-.13-.09-.15-.06-.15-.07-.15-.07-.15-.05-.15-.06-.15-.05-.15-.05-.15v-.15l-.05-.15-.05-.17v-2.88l.06-.92.1-.88.14-.88.26-1.7.32-1.72.28-1.48.2-1-.06.31v.22-1.85l.05-.17v-.15l.07-.17v-.15l.05-.15.07-.16.06-.15.07-.15.08-.15.07-.15.08-.14.09-.15.08-.15.08-.13.09-.15.1-.13.08-.14.1-.13.1-.13.1-.14.12-.11.1-.14.11-.11.1-.14.12-.11.12-.12.11-.12.14-.11.11-.1.14-.12.11-.1.14-.1.13-.1.13-.1.14-.1.15-.08.13-.09.15-.1.13-.08.15-.07.15-.08.14-.08.15-.07.15-.07.16-.06.15-.07.15-.05.15-.07h.17l.15-.05.17-.05h2.45zm17.26-13h1.22l.3.06h.3l.28.09.3.08.29.1.28.1.28.12.29.13.26.13.27.15.27.17.25.17.25.16.23.19.25.2.22.2.23.2.2.23.22.22.18.23.2.23.17.25.16.25.17.27.15.27.15.26.12.27.13.28v.12l.19.2.2.23.18.25.17.25.16.25.17.27.13.27.15.26.12.27.12.28.11.29.09.3.08.28.08.3.07.3.05.3v4.2l-.05.08v.29l-.21.5-.25.46-.05.09v.08l-.05.08-.05.07-.05.08-.05.09v.08l-.05.07-.05.08-.05.08-.05.07-.08.12-.05.08-.07.07-.66.23-.06.08-.07.09v.06l-.07.09-.06.06-.07.09-.07.06-.06.09-.07.06-.07.07-.06.08-.09.07-.06.07-.07.06-.07.07-.06.07-.09.06-.06.07-.09.07-.06.06-.09.07-.06.05-.09.07-.08.06h-.07l-.08.07h-.08l-.09.07-.05.18-.07.05h-.08l-.08.05-.09.06h-.08l-.08.05h-.09l-.08.05h-.1l-.08.05-.09.05h-.18l-.1.05h-6.95l-.09-.05h-.1l-.08-.05h-.25l-.08-.05-.1-.05h-.17l-.08-.05-.1-.05h-.09l-.08-.05-.08-.06h-.09l-.08-.05-.08-.07-.09-.05-.06-.07-.09-.05-.08-.06h-.08l-.07-.07-.08-.07h-.07l-.08-.06-.07-.07-.08-.07-.07-.06-.07-.07-.08-.07-.07-.06-.06-.07-.07-.07-.07-.06-.06-.09-.07-.06-.07-.07-.06-.08-.07-.09-.07-.06-.06-.07-.05-.08-.07-.07-.05-.08-.07-.07-.05-.08-.06-.07-.05-.08-.05-.09v-.06l-.07-.09v-.08l-.05-.08-.12-.2-.05-.09-.05-.08-.05-.08v-.09l-.05-.08-.05-.08v-.09l-.05-.08v-.27l-.26-.56-.3-.82-.2-.68-.19-.65-.23-1-.15-.87-.07-.43v-4.24l.05-.1v-.18l.05-.1v-.18l.05-.09v-.08l.05-.1.05-.08v-.1l.05-.09.05-.08.05-.08.06-.09v-.1l.05-.08.05-.08.07-.09.05-.08.07-.08.06-.09.05-.06.07-.09.07-.08.06-.08.07-.07.07-.08.06-.07.07-.08.07-.07.06-.08.07-.07.08-.08.07-.07.07-.07.08-.06.07-.07.08-.07.08-.06.07-.07.08-.07.09-.06.08-.07.07-.05.08-.07h.08l.09-.06h.08l.08-.07h.17l.1-.07h.35l.08-.05h4zm8.2 7.63v.3-.32zm-14.33-.18-.07.15.05-.1v-.07zm36.07-22.42h1.23l.3.05.3.06.3.07.3.08.3.1.28.12h.12l.37.07.3.06.3.09.3.1.28.1.3.11.28.12.27.15.28.13.27.17.25.17.27.16.25.19.23.2.23.2.24.21.21.22.2.23.22.24.18.23.19.25.18.27.15.26.17.27.13.27.13.28.14.28.1.29.11.3.09.3.08.3.07.3v.3l.05.3v5.03l-.05.08v.27l-.05.07v.06l-.05.07v.13l-.05.07-.05.07-.05.06v.07l-.05.07-.05.06v.07l-.05.07-.05.06-.05.07-.05.05-.05.07-.05.06h-.05l-.05.07h-.05v.07l-.07.05-.05.06h-.16l-.07.05h-.05l-.07.07h-.05l-.06.05h-.3l-.05.05h-.92l-.08.05h-11.31l-.07-.05h-.25l-.06-.05h-.32l-.05-.05h-.18l-.07-.05h-.13l-.05-.05-.05-.07h-.12l-.1-.1-.05-.06h-.1l-.05-.07-.05-.07h-.05l-.05-.06-.05-.05v-.07h-.05l-.05-.07-.05-.06-.05-.07v-.07l-.05-.06v-.07l-.31-.47-.05-.06v-.2l-.05-.07v-.07l-.05-.06v-.14l-.05-.06v-7.98l.05-.07v-.13l.05-.07v-.13l.05-.07v-.06l.05-.07v-.07l.05-.06h.05v-.14l.05-.06h.05l.05-.07v-.07h.05l.05-.06.05-.07.05-.07h.05l.05-.06h.05l.07-.07h.05l.05-.07.06-.05h.1l.07-.06h.05l.07-.05h.18l.07-.05h.55l.06-.05h.4l.07-.05h4.13zm6.73 3.53.1.12-.1-.13zm54.28-11.66h.94l.46.06.45.1.47.12.43.15.44.17.43.2.42.21.4.25.38.25.37.29.36.31.34.32.31.35.3.35.29.38.25.4.23.4.22.42.18.43.17.44.13.45.12.45.08.46.07.47v2.75h-12.44v-1.11.36-3.03h.3-1.18 3.64l.5-.05h.85zm-5.66 15.1.2.15h-.1zm10.4-13 .2.18-.22-.23-.3-.22zm36.78 11.73h1.32l.31.06.32.07.33.08.3.1.32.12.3.13.3.14.3.15.28.16.29.17.28.18.27.19.26.21.25.22.24.22.23.23.23.23.22.27.2.25.18.27.19.28.18.28.2.34.15.3.15.28.12.3.1.23.11.32.1.32.1.31.07.32.07.33.06.32v5.4l-.05.07v.13l-.05.08v.07l-.05.07v.06l-.05.07-.05.07v.06l-.06.1v.14l-.05.06-.05.07-.05.05v.07l-.05.06-.05.07-.05.07-.05.06v.05l-.05.07-.05.07-.06.05-.05.06v.07l-.05.05-.07.07-.05.05h-.07l-.05.06-.06.05v.06l-.05.07v.07l-.05.06-.05.07-.05.07-.05.06v.07l-.05.05-.05.07-.07.06-.05.07-.05.05-.05.07-.07.06h-.05v.07l-.06.07h-.05l-.07.06-.05.05-.07.05-.06.07h-.05l-1.61.41h-.07l-.05.05h-.06l-.07.05-.07.06-.06.05h-.07l-.07.05h-.06l-.07.05h-.07l-.06.05h-.07l-.07.05-.06.05h-.14l-.08.05h-.42l-.08.05h-.37l-.08.05h-7l-.07-.05h-.37l-.06-.05h-.09l-.06-.05h-.14l-.08-.05h-.07l-.06-.05h-.07l-.07-.05h-.13l-.07-.05-.06-.05h-.07l-.07-.05h-.06l-.07-.07-.07-.05h-.06l-.07-.05v-.07l-.07-.05-.06-.06h-.05l-.07-.05-.05-.07-.07-.07-.05-.05-.06-.06-.05-.05-.05-.07-.07-.07-.05-.05v-.06l-.05-.07-.23-.14-.05-.07-.07-.05-.05-.07v-.06l-.05-.07-.05-.07v-.08l-.05-.07-.05-.06v-.07l-.05-.07-.05-.06v-.09l-.05-.06v-.07l-.05-.07v-.15l-.05-.06v-6.33l.07-.22v-1.55l.09-.18.05-.07v-.22l.05-.06v-.07l.05-.08v-.2l.05-.07v-.07l.05-.06.05-.07.05-.07v-.06l.05-.07.05-.07.05-.06.05-.06v-.24l.05-.06v-.22l.05-.07v-.06l.05-.09v-.13l.05-.07.05-.06.05-.07v-.13l.05-.07.05-.07.05-.06.05-.07v-.07l.06-.06.05-.07h.05l.05-.07v-.06h.07v-.07l.07-.07.05-.06.06-.05.05-.07h.07l.07-.07h.11l.07-.06h.12l.06-.05h.07l.07-.07h.06l.05-.05h.35l.07-.05h.2l.07-.05h.36l.07-.05h4.61zm-7.53 12.12.23.41v-.51zm14.7-1v.63l.05-.13v-.52zm18.36 20.83h1.42l.28.07.29.07.26.06.29.09.26.1.27.1.27.11.25.12.25.13.25.14.25.15.25.16.23.15.22.19.23.18.22.18.2.2.2.2.2.2.18.22.18.22.19.23.16.23.15.24.15.25.14.25.13.25.13.26.12.25.1.27.1.28.08.27.07.27.08.28.05.28v3.82l-.05.15v.13l-.05.14-.05.13-.05.13-.05.14v.13l-.05.13-.06.14v.21l.05.72.07.73v3.09l-.05.13v.28l-.05.14-.05.13-.05.13v.14l-.05.13-.05.13-.05.14-.06.13-.07.12-.05.13-.07.13-.06.12-.09.13-.06.12-.07.13-.08.12-.09.12-.06.11-.09.12-.1.12-.08.11-.08.12-.09.1-.1.12-.1.1-.08.11-.1.1-.1.1-.1.1-.1.1-.12.1-.1.1-.11.09-.1.1-.12.08-.12.1-.1.08-.11.09-.12.08-.12.08-.13.07-.12.08-.11.07-.14.08-.11.07-.14.07-.11.06-.14.07h-.13l-.13.07h-.14l-.11.05-.14.06h-.41l-.14.05h-4.93l-.13-.05h-.14l-.13-.05h-.13l-.14-.07-.13-.05-.13-.05-.14-.06-.11-.07-.14-.07-.13-.06-.12-.07-.13-.07-.12-.06-.11-.09-.14-.08-.11-.07-.12-.08-.12-.08-.11-.09-.1-.1-.12-.08-.12-.08-.1-.1-.11-.1-.1-.1-.1-.09-.1-.1-.1-.11-.1-.1-.1-.1-.1-.12-.09-.1-.1-.12-.08-.1-.08-.11-.09-.12-.08-.12-.08-.11-.09-.12-.08-.13-.07-.12-.08-.12-.07-.13-.06-.12-.07-.13-.07-.12-.06-.13-.05-.13-.07-.14-.05-.13-.05-.13-.05-.14v-.13l-.05-.13-.05-.14v-.28l-.05-.13v-1.89l-.05-.68-.09-1.05v-3.05l.09-1 .18-1.08.18-.75v-.72l.15-.45.33-.78.27-.49.07-.11.06-.12.07-.13.08-.12.07-.12.08-.11.1-.15.07-.1.08-.1.07-.1.08-.1.07-.1.08-.1.09-.1.08-.1.1-.12.1-.1.08-.1.09-.1.1-.08.08-.1.1-.09.1-.1.1-.08.1-.08.12-.1.1-.1.11-.09.1-.08.12-.1.12-.08.11-.09.12-.06.13-.09.12-.08.12-.07.11-.08.14-.07.13-.06.12-.07.13-.07.13-.05.12-.06h.13l.14-.07h.13l.13-.05h.27l.15-.05h.13l.14-.05h.98-.57 1.15zm5.77 14.27-.1.1-.1.08-.12.1-.1.1.34-.28.1-.12zm6.32 23.13h.96l.32.05.32.06.31.07.3.08.32.1.3.12.3.12.3.13.28.13.29.17.26.15.29.18.25.19.26.2.25.2.24.21.23.22.22.23.21.25.2.25.2.25.12.19.17.21.15.19.2.2.78.73.87.83.21.24.24.23.2.23.2.27.2.25.16.27.19.28.15.27.15.3.13.28.13.3.12.3.1.3.08.32.09.3.06.31.05.32.05.33v3.9l-.05.1v.29l-.05.1v.1l-.05.1-.05.1v.08l-.05.1-.05.1-.05.08-.06.1v.09l-.05.1-.07.08-.05.1-.07.08-.05.09-.06.1-.07.08-.07.08-.06.09-.07.08-.07.08-.06.09-.07.08-.07.08-.08.09-.07.06-.06.09-.09.08-.06.07-.09.08-.08.07-.07.08-.08.07-.08.06-.09.07-.08.07-.08.08-.09.07h-.08l-.08.06-.09.07-.08.07-.1.06h-.08l-.09.07h-.1l-.08.07-.1.05-.08.05h-.1l-.1.05h-.09l-.1.05-.1.05h-.1l-.08.05h-.2l-.1.05h-.2l-.1.05h-5.98l-.1-.05h-.1l-.1-.05h-.19l-.1-.05-.1-.05h-.1l-.08-.05h-.1l-.1-.05-.08-.05-.1-.06h-.09l-.1-.05-.08-.07-.08-.05-.1-.07-.09-.06-.08-.07-.08-.05-.09-.07-.08-.06-.08-.07-.09-.08-.08-.07-.08-.07-.09-.06-.08-.09-.07-.06-.85-.82-1-.92-.64-.65-.68-.75-.72-.88-.5-.73-.06-.09-.05-.1-.07-.08-.05-.1-.05-.08-.07-.1-.05-.09-.05-.1v-.1l-.05-.08-.05-.1-.05-.1v-.1l-.05-.1-.05-.08v-.1l-.05-.1v-.2l-.05-.1v-1.79.05-3.82l.05-.1v-.2l.05-.1v-.2l.05-.08v-.1l.05-.1.05-.1.05-.08.05-.1v-.09l.07-.1v-.1l.05-.08.06-.08.05-.1.07-.09.07-.08.06-.1.05-.08.07-.09.07-.08.06-.08.07-.09.08-.08.07-.08.07-.07.06-.08.09-.09.06-.06.09-.09.06-.08.09-.07.08-.06.08-.09.07-.06.08-.07.09-.07.08-.06.08-.07.09-.07.08-.06.1-.07.08-.07.09-.06.08-.05.1-.07h.08l.1-.07h.09l.1-.05h.08l.1-.06.1-.05.08-.05h.2l.1-.05.1-.05h.29l.1-.05h3.15zm14.66 34.8h1.22l.25.05.23.05h.24l.23.06.23.07.24.08.23.09.23.1.22.1.22.1.21.11.22.12.22.12.2.13.2.13.2.15.2.15.18.15.2.17.17.17.18.16.17.17.16.18.17.19.15.2.15.18.13.2.55.23.77.37.22.12.21.11.2.12.22.13.2.14.2.13.2.15.2.15.18.15.19.17.16.16.19.19.16.16.17.19.15.2.15.18.15.2.13.2.14.2.13.22.12.2.11.21.12.24.1.21.1.22.08.23.09.24.08.23.07.23.05.24.06.23.05.25v3.87l-.05.11v.24l-.05.11v.24l-.05.11v.22l-.05.12-.05.1-.07.11-.05.12-.05.1-.06.12-.07.1-.05.1-.07.11-.06.1-.07.1-.07.1-.06.1-.07.1-.08.1-.07.1-.08.1-.07.09-.08.1-.09.1-.08.08-.07.1-.08.08-.1.09-.08.08-.09.1-.08.08-.1.09-.08.08-.1.07-.09.08-.1.08-.1.07-.08.08-.1.07-.1.08-.1.07-.1.07-.1.06-.1.07-.12.07-.1.06-.1.05-.11.07-.1.07-.12.05h-.1l-.12.06-.1.05-.11.05h-.24l-.1.05-.11.05h-6.32l-.12-.05-.11-.05h-.22l-.12-.06-.11-.05-.52-.25-.32-.14-.25-.1-.21-.08-.62-.22-.55-.2-.43-.18-.12-.05-.1-.05h-.12l-.11-.07-.1-.05-.12-.06-.1-.05-.18-.1-.1-.07-.1-.05-.1-.07-.1-.06-.1-.07-.1-.07-.1-.06-.1-.07-.1-.07-.09-.06-.16-.14-.1-.06-.09-.09-.1-.06-.08-.09-.08-.06-.1-.09-.09-.08-.08-.08-.08-.09-.09-.08-.08-.08-.15-.17-.08-.08-.07-.09-.08-.08-.07-.08-.08-.09-.07-.08-.07-.1-.06-.08-.09-.09-.06-.1-.14-.2-.06-.1-.07-.1-.07-.1-.06-.1-.07-.1-.07-.1-.06-.1-.29-.5-.36-.75-.45-1.06-.05-.1v-.12l-.05-.12v-.11l-.05-.12v-4.98l.05-.11v-.24l.05-.11v-.12l.05-.12.05-.11.05-.1v-.12l.05-.12.05-.1.07-.11.05-.1.05-.12.06-.1.07-.1.07-.12.05-.1.06-.1.07-.1.08-.1.07-.1.07-.1.08-.1.07-.1.08-.1.07-.08.08-.1.08-.08.09-.1.08-.09.08-.1.09-.08.08-.08.08-.09.1-.08.09-.08.1-.09.08-.08.1-.07.1-.08.08-.07.1-.08.1-.07.1-.06.1-.09.1-.06.12-.07.1-.07.1-.05.1-.06.12-.07h.1l.11-.07h.1l.12-.05h.1l.12-.05.11-.05h.12l.1-.05h.23l.12-.35h2.88zm22 25.07h1.35l.49.08h.23l.23.05h.22l.23.07.22.06.22.09.23.08.22.08.2.1.21.1.2.1.22.12.25.15.5.15h.38l.24.05h.23l.22.05.23.07.22.08.21.07.22.08.22.1.21.1.22.1.2.1.2.12.22.12.18.13.2.13.18.14.2.13.17.15.18.15.19.15.16.17.17.16.15.17.17.18.15.19.13.18.15.18.13.19.12.2.13.2.12.2.12.2.1.21.1.2.1.22.08.22.08.21.09.24.06.21.07.22v.47l.05.23v4.38l-.05.12v.22l-.05.1v.21l-.05.12v.1l-.05.12v.2l-.05.1v.11l-.06.1v.1l-.07.1v.1l-.07.1-.06.1-.07.1-.07.09-.06.1-.07.1-.07.08-.06.1-.09.1-.06.08-.07.09-.08.1-.09.08-.75.08-.09.09-.08.08-.08.08-.09.09-.08.08-.08.08-.1.07-.09.08-.08.09-.1.06-.08.07-.1.08-.09.07-.1.07-.1.06-.08.07-.1.07-.1.06-.1.07-.1.05-.1.07-.1.05-.1.06-.1.05-.1.05-.12.07-.1.05h-.21l-.1.05h-.12l-.1.05h-.22l-.11.05h-4.55l-.5-.1-1.1-.29-1.1-.35-1.05-.35-1.05-.38-.69-.3-.1-.05h-.11l-.1-.05-.1-.05-.1-.05-.1-.05-.12-.07-.1-.05-.1-.06-.1-.05-.1-.07-.1-.07-.1-.06-.08-.05-.1-.07-.1-.07-.09-.06-.1-.07-.08-.08-.1-.07-.08-.07-.09-.08-.1-.07-.08-.08-.08-.07-.09-.08-.06.35-.08-.09-.09-.06-.06-.09-.09-.08-.08-.08-.07-.1-.08-.09-.07-.08-.06-.08-.09-.1-.06-.09-.07-.1-.07-.08-.06-.1-.07-.1-.07-.08-.06-.1v-.1l-.07-.1-.05-.1-.06-.12v-.1l-.05-.1-.07-.1-.05-.1-.05-.11-.05-.1-.05-.1v-.12l-.05-.1-.22-.15v-.21l-.05-.12v-5.25l.05-.1v-.34l.05-.11v-.1l.05-.12.05-.1v-.1l.05-.12.05-.1.05-.1.06-.1v-.1l.05-.11.07-.1.07-.1v-.09l.06-.1.07-.1.07-.1.06-.1.07-.08.08-.1.07-.08.07-.1.08-.09.07-.1.08-.08.08-.08.07-.09.08-.08.09-.08.35-.17.09-.08.08-.09.1-.08.1-.08.08-.07.09-.08.1-.07.08-.07.1-.06.08-.07.1-.07.1-.06.09-.07.1-.07.1-.06.1-.05.1-.07.1-.05h.1l.1-.07.1-.05.1-.05h.1l.1-.05h.21l.1-.05.12-.05h3.19zm-.68 16.66h-.35zm5.57-15.28h.23-.2zm27 17.12h.95l.25.05h.23l.23.05.22.05.23.06.24.07.21.08.24.07.21.1.22.08.22.1.21.12.22.1.2.13.2.12.2.13.2.14.22.15.31.05h.24l.23.05.23.05.24.07.21.06.24.09.21.06.24.1.21.09.22.1.22.1.2.11.21.12.2.13.2.12.2.13.19.15.18.14.18.15.19.16.18.17.17.15.16.18.17.17.15.18.15.19.15.18.13.2.14.2.13.2.12.2.11.2.12.22.1.21.1.22.1.22.08.21.09.24.06.21.07.24.07.23.05.23v4.35l-.05.1v.24l-.05.11v.22l-.05.1v.22l-.05.11v.1l-.07.1v.12l-.06.1v.1l-.07.1-.07.1-.05.1-.06.1-.07.1-.07.1-.08.1-.07.1-.06.08-.07.1-.08.1-.09.09-.06.08-.09.1-.08.08-.08.09-.09.08-.08.1-.08.08-.09.09-.08.06-.08.09-.1.08-.09.08-.1.07-.08.08-.1.07-.08.07-.1.06-.1.09-.1.06-.1.07-.1.07-.1.05-.1.06-.1.07-.1.05-.12.07-.1.05h-.1l-.12.06-.1.05-.1.05-.11.05h-.12l-.1.05-.12.05h-.1l-.11.05h-.24l-.1.05h-3.2l-.75-.07-1.8.52-.72-.12-.66-.15-.7-.16-.74-.2-.81-.29-.57-.23h-.2l-.1-.05-.1-.05-.1-.05-.1-.05h-.12l-.25-.14-.1-.05-.1-.06-.1-.05-.1-.05-.08-.07-.1-.07-.1-.05-.1-.06-.08-.07-.1-.07-.09-.06-.2-.15-.08-.07-.08-.07-.1-.06-.09-.07-.08-.07-.08-.08-.09-.07-.08-.08-.08-.07-.09-.08-.08-.08-.08-.09-.07-.06-.07-.09-.08-.08-.08-.08-.09-.1-.06-.09-.09-.08-.06-.1-.09-.08-.06-.1-.07-.1-.07-.09-.06-.1-.07-.1v-.08l-.07-.08-.06-.1v-.1l-.07-.1-.07-.1v-.2l-.06-.1v-.12l-.05-.1v-.42l-.05-.11v-6.59l.05-.1v-.2l.05-.11v-.1l.05-.1v-.19l.05-.1v-.1l.05-.1.07-.1.05-.1.06-.08v-.1l.07-.1.07-.1.06-.08.07-.1.07-.09.06-.1.07-.08.07-.08.08-.1.07-.07.06-.1.09-.08.06-.09.09-.08.08-.08.08-.09.09-.08.08-.08.08-.09.09-.08.08-.07.08-.08.1-.08.1-.07.09-.08.1-.07.08-.08.1-.07.1-.07.1-.06.1-.07.1-.07.1-.06.1-.07.1-.07h.1l.1-.06.1-.05.12-.07.1-.05.1-.05.11-.05h.1l.12-.05.1-.05h.12l.11-.05.1-.05h.24l.11-.05h2.62zm5.78 14.16-.08.09-.09.08-.08.08-.1.09-.08.08-.09.08.44-.38.15-.18zm.83-1 .06-.07v-.05zm36.42-31.73h1.23l.3.07.3.06.3.09.3.08.3.1.29.12.28.11.28.14.27.15.27.15.26.16.27.17.25.18.23.19.24.2.23.21.22.22.21.22.2.23.2.25.19.25.18.25.17.27.15.26.15.27.13.28.13.29.12.28.1.28.1.3.08.3.07.3.07.3v4.22l-.05.15v.15l-.05.13-.07.15-.07.13v.15l-.06.14-.09.15-.06.13-.07.13-.08.14-.09.13-.08.13-.08.14-.09.11-.08.14-.1.13-.08.12-.1.11-.1.12-.1.13-.1.12-.1.1-.12.12-.1.11-.12.1-.11.12-.1.1-.12.1-.13.1-.12.1-.12.1-.13.08-.12.1-.13.09-.12.08-.13.08-.5.09-.14.08h-.08l-.11.1-.15.13-.47.45-.53.54-.55.6-.57.63-.53.62-1 1.21-.81 1-.32.35-.1.1-.1.1-.1.12-.12.1-.1.1-.11.1-.12.1-.12.1-.11.1-.12.08-.12.1-.13.09-.12.08-.13.08-.12.09-.13.08-.13.08-.14.07-.13.07-.13.06-.14.07-.13.07-.15.06-.13.07h-.14l-.15.05-.13.05-.15.05-.15.05h-.15l-.15.05h-4.28l-.15-.05h-.3l-.15-.05-.15-.05-.14-.05-.15-.07-.13-.05-.15-.06-.13-.07-.15-.07-.14-.06-.13-.07-.13-.08-.15-.07-.12-.08-.13-.09-.14-.08-.13-.08-.12-.1-.13-.09-.12-.1-.13-.1-.12-.1-.11-.1-.12-.1-.12-.1-.1-.11-.11-.1-.1-.12-.12-.12-.1-.1-.1-.11-.1-.14-.1-.11-.08-.12-.1-.13-.09-.12-.1-.13-.08-.14-.08-.11-.09-.14-.06-.13-.09-.13-.06-.15-.07-.14-.07-.13-.06-.15-.05-.15-.07-.13-.05-.15-.06-.15v-.15l-.05-.14v-4.67l.05-.15v-.3l.05-.15v-.14l.07-.15v-.15l.07-.13.06-.15.07-.13.07-.17.06-.12.07-.13.07-.12.06-.11.07-.14.07-.11.25-.39.08-.13.08-.13.09-.12.08-.13.1-.12.1-.13.08-.12.1-.12.1-.11.1-.12.12-.12.1-.11.12-.1.1-.12.11-.1.12-.1.12-.1.11-.1.64-.75.68-.8.75-.84.82-.86.85-.89.88-.83.53-.48.52-.44.57-.45.63-.45.72-.46.51-.29.14-.06.15-.09.13-.06.13-.07.15-.07h.14l.15-.06.15-.05h.13l.15-.05.15-.05h.3l.15-.05h2.03zm24.52-21.67h1.63l.23.05h.22l.23.06.22.07.22.08.23.09.22.08.2.1.21.1.22.12.2.11.2.12.2.12.2.13.18.13.2.15.19.14.16.16.19.15.16.17.17.17.17.16.15.17.15.18.15.19.13.18.13.2.14.2.13.2.12.2.11.2.1.22.1.2.1.21.09.22.08.23.08.22.07.22.07.23.05.22v5.25l-.05.12v.22l-.05.1v.21l-.05.1v.1l-.05.07v2.75l-.05.11v.54l-.05.11v.1l-.05.1v.22l-.06.1v.1l-.07.1v.1l-.07.1-.06.1-.07.1-.07.1-.06.1-.07.1-.07.08-.06.1-.09.09-.06.1-.07.08-.08.1-.09.08-.06.09-.09.08-.08.08-.08.09-.09.08-.08.08-.08.09-.1.08-.09.07-.08.08-.1.07-.08.08-.1.07-.09.08-.1.07-.1.06-.08.07-.1.07-.1.06-.1.05-.12.09-.1.06h-.1l-.1.07h-.11l-.1.07-.1.05-.1.05h-.1l-.12.05h-.1l-.1.05h-.12l-.1.05h-.2l-.11.05h-7.51l-.1-.05h-.22l-.1-.05-.12-.05h-.1l-.1-.05h-.1l-.1-.05-.11-.05-.1-.07h-.1l-.09-.05-.1-.07-.1-.06h-.05l-.1-.06-.1-.05-.08-.07-.1-.07-.1-.06-.08-.09-.09-.06-.1-.07-.08-.07-.08-.08-.09-.07-.1-.08-.08-.07-.08-.08-.09-.08-.06-.09-.09-.08-.08-.08-.08-.09-.07-.08-.08-.08-.07-.09-.07-.08-.08-.1-.07-.08-.06-.1-.07-.09-.07-.1-.06-.08-.07-.1-.07-.1-.07-.1v-.1l-.06-.1-.05-.1-.07-.1-.05-.1v-.1l-.05-.1v-.22l-.05-.1v-.1l-.05-.11v-5.17l.12-.62.23-.85.24-.73.23-.67.28-.7.47-1.08.32-.63.35-.64.25-.4.05-.1.06-.08v-.08l.07-.1v-.09l.07-.08.06-.08.07-.09.07-.08.1-.15.08-.08.07-.09.08-.1.07-.08.08-.08.08-.1.09-.09.06-.08.09-.08.08-.09.1-.06.08-.09.09-.08.08-.08.1-.07.08-.08.1-.07.09-.07.1-.06.1-.09.08-.06.1-.07.1-.07h.1l.1-.06.1-.07.1-.05.1-.07.1-.05h.12l.1-.06.1-.05.11-.05h.1l.1-.05h.12l.1-.05h.22l.11-.05h1.49-.6 1.29zm6.58 13.3-.07.09-.06.1.18-.24zm-11.73-8.25-.37.24.1-.07h.1l.1-.07h.1l.1-.06zm1.26-.56h-.06.09zm26.22-33.62h.88l.44.05.43.08.42.12.38.1.82.26.41.17.4.17.4.2.39.21.36.24.37.26.33.27.34.3.31.3.3.33.29.34.25.36.25.37.21.38.2.39.19.4.16.41.14.42.11.43.09.44.06.43v4.77h-9.72l-1.86 4.05h-.7v-13.1h.85-.15 2.38z"/><path d="m677.68 113.33 1.27.17 1.25.25 1.22.35 1.21.42 1.19.51 1.15.57 1.13.67 1.08.71 1.07.79 1 .85.51.45.49.48.45.5.43.5.4.52.43.6.62 1 .58 1.1.5 1.12.4 1.12.34 1.11.26 1.14.2 1.11.17 1.12.1 1.12.05 1.1v2.21l-.07 1.12-.1 1.1-.11 1.12-.17 1.1-.18 1.11-.22 1.1-.23 1.1-.27 1.1-.28 1.1-.32 1.1-.35 1.1-.35 1.09-.38 1.08-.42 1.08-.42 1.07-.45 1.07-.46 1.06-.49 1-.5 1.05-.53 1-.55 1-.57 1-.56 1-.6 1-.64 1-.63.93-.65.92-.68.88-.7.89-.72.85-.75.83-.77.8-.8.78-.81.75-.85.72-.9.7-.92.65-1 .62-1 .56-1.06.54-1.1.46-1.15.4-1.22.34-1.17.23-.73.08-.65.07h-2.02l-.68-.05-.68-.1-.69-.12-.66-.15-.69-.18-.65-.22-.63-.25-.63-.26-.6-.32-.6-.33-.57-.37-.53-.38-.6-.49-.6-.55-.19-.18-.18-.18-.18-.2-.34-.37-.25-.28-.21-.3-.52-.69-.63-1-.54-1-.45-1-.36-1-.32-1-.23-1-.2-1-.14-1-.11-1-.05-1v-3l.07-1 .1-1 .08-.61v-.24l-.22-1-.16-1-.14-1-.1-1v-4l.07-1 .08-1 .12-1 .15-1 .18-1 .18-1 .24-1 .23-1 .27-1 .3-1 .31-1 .34-1 .36-1 .39-.95.4-1 .43-.94.47-.91.46-.92.5-.9.54-.88.55-.89.58-.85.62-.85.63-.81.67-.8.68-.79.73-.76.77-.74.8-.7.85-.68.88-.65.92-.6 1-.57 1-.51 1.06-.47 1.09-.42 1.15-.33 1.16-.27 1.22-.2 1.23-.1h1.25zm-3.53 35.54v-.65zm-.13-5-.2.19-.24.23-.25.25-.26.3-.27.33-.27.35-.28.4-.27.42-.28.43-.15.29.35-.44.48-.58 1-1.37.65-.83z" fill="#fff"/><path d="m684.42 115.93h2.15l.38-.05h2.5l.35.07.35.08h.1l.37.1.33.12.5-.18.69-.24.7-.2.71-.18.74-.13.75-.1.75-.07h2.3l.76.08.77.12.75.15.75.2.73.21.74.27.7.28.7.34.68.35.67.36.65.4.63.44.62.45.56.43.54.43.51.47.52.48.48.5.47.52.43.53.44.54.4.55.38.56.37.59.33.6.32.58.28.62.27.61.25.62.21.62.22.68.32 1.2.23 1.25.15 1.27.08 1.23v1.23l-.05 1.22-.06.6.15.37.28.93.18.87.14.81.1.79v3.41l-.11 1.22-.15 1.12-.17 1-.18 1-.32 1.48-.22 1-.36 1.52-.25.9-.25.92-.29.95-.31 1-.35 1-.37 1-.4 1-.43 1-.47 1.06-.5 1.07-.55 1.07-.58 1.06-.64 1.07-.68 1-.73 1.05-.8 1-.84 1-.5.55-.48.48-.5.49-.53.46-.55.47-.59.45-.64.7-.64.41-.66.4-.69.37-.73.33-.75.32-.77.27-.81.25-.82.18-.85.17-.87.1-.86.06h-1.77l-.88-.08-.87-.14-.88-.18-.85-.23-.85-.27-.84-.3-.7-.3-.7-.33-.66-.37-.65-.38-.64-.4-.61-.44-.59-.45-.55-.46-.51-.53-.52-.52-.5-.52-.46-.53-.44-.55-.41-.57-.4-.56-.14-.19-.65-.11-.71-.17-.64-.17-.65-.18-.65-.22-.63-.21-.63-.27-.64-.27-.65-.31-.83-.45-.85-.5-.8-.54-.77-.56-.75-.62-.7-.65-.66-.67-.62-.7-.58-.73-.54-.75-.5-.75-.45-.78-.41-.79-.37-.8-.33-.8-.3-.8-.25-.8-.24-.81-.2-.8-.15-.8-.15-.8-.1-.79-.08-.8-.07-.78v-3.91l.07-.78.15-1.45.2-1.47.26-1.45.32-1.42.35-1.4.38-1.36.42-1.34.45-1.31.47-1.27.5-1.25.51-1.2.54-1.15.53-1.13.57-1.07.56-1 .6-1 .6-1 .55-.8.64-.82.68-.8.78-.78.6-.5.2-.17.2-.15.22-.15.33-.23.24-.15.21-.15.24-.13.35-.2.25-.14.23-.11.25-.12.37-.15.23-.1.25-.1.25-.08.72-.24 1-.25 1-.15.9-.08.82-.05h2.01zm-570.8 299.49h.53l.42.07.41.06.42.1.42.12.4.13.4.15.38.19h.07l.4.22.38.21.37.25.36.29.34.28.33.3.32.33.05.05.28.34.27.35.25.35.23.36.2.39.18.38v.08l.19.44.15.45.13.45.12.45v.11l.07.4.07.4v2.15l-.08 1.1-.15 1.09-.2 1.06-.23 1-.3 1-.34 1-.35.95-.4.93-.43.9-.45.89-.48.85-.5.83-.52.82-.12.16.07.22.1.37.1.38v.07l.06.41.07.4v2.12l-.05.37v.25l-.1.45-.12.46-.16.6-.34.87-.33.77-.35.73-.38.73-.42.74-.47.8-1 1.63-1.24 1.9-1.06 1.57.08.13.1.13.23.4.24.4.18.4.08.15.15.4.15.4.12.4.07.22.38-.25.77-.42.86-.4.6-.21.4-.14.4-.11.29-.07.45-.12.48-.06h3.04l.42.08.42.09.4.1.26.08.4.13.4.15.39.17.25.13.36.19.37.2.35.21.25.17.3.22.3.23.28.23.24.22.28.25.27.27.25.28.23.28.1.12.23.33.24.34.2.33.2.37.16.35.07.15.17.4.15.4.13.41.1.44v.15l.09.38v2.71l.08.5-.08.45v.22l-.1.36-.1.35-.17.5v.09l.25.28.29.4.28.4.25.42.22.45.2.45.16.45.15.46.12.49.08.48.05.48v1.47l-.07.48-.08.49-.12.48-.13.47-.17.46-.2.45-.21.44-.25.43v.08l-.24.34-.23.33-.25.3-.27.32-.35.36-.56.54-.57.48-1.13 1-1.39 1.08-1.6 1.24-1.78 1.33-1.92 1.4-2 1.45-2.07 1.45-2.18 1.4-2 1.35-2 1.25-.95.6-.92.55-.9.52-.86.5-.89.45-.91.42-1 .43-.75.22-.42.11-.43.1h-.17l-.43.08h-2.17l-.4.22-2.63 1.43-2.48 1.29-2.28 1.13-1.1.52-1 .46-1 .42-1 .38-1 .37-1 .3-.51.12-.37.06-.38.05h-1.93l-.47-.05-.43-.08-.45-.1-.43-.14h-.09l-.45-.15-.43-.18-.42-.2-.4-.24-.4-.25-.38-.26-.37-.3-.33-.3-.33-.34v-.05l-.32-.36-.3-.37-.27-.4-.25-.4-.23-.43-.2-.44-.17-.43-.16-.45-.12-.47-.07-.33h-2.05l-.4-.07-.4-.06h-.16l-.44-.1-.43-.11-.43-.15-.42-.19-.12-.05-.38-.18-.38-.2-.39-.23-.35-.25-.35-.27-.33-.28-.07-.07-.33-.32-.32-.33-.3-.35-.28-.37-.25-.38-.23-.4-.22-.4v-.08l-.18-.4-.15-.42-.14-.42-.11-.41-.1-.44-.07-.43v-2.3l.06-.43v-.12l.06-.38.1-.39.12-.36.13-.37.05-.13.12-.32.15-.3.15-.3.25-.47.48-.76.69-.89.66-.73.64-.67 1.08-1 1-.93.39-.37.26-.27.1-.11.07-.09 1.35-1.75 1.39-1.94 1.49-1.82 1.51-1.78 1.54-1.84.85-1-.12-.15-.25-.4v-.1l-.47-.09-.48-.11-.47-.14-.45-.15-.44-.19-.43-.21-.42-.24-.4-.26-.46-.29-.37-.3-.35-.33-.31-.34-.32-.36-.3-.37-.27-.4-.23-.4-.23-.42-.19-.43-.18-.45-.13-.45-.14-.47-.08-.45-.07-.48v-1.93l.08-.49.08-.46.12-.45.13-.41.15-.4.18-.4.2-.4.22-.39.23-.36.25-.35.29-.35v-.05l.26-.3.3-.3.32-.29.38-.33.64-.5 1.15-.8 1.46-1 1.75-1.17 2-1.3 1.3-.83.85-.79.93-.81.92-.79 1.73-1.48.72-.63.6-.57.2-.18.15-.17.08-.08v-.07l1.49-1.92 1.13-1.51.87-1.2.76-1.12.82-1.2 1-1.43 1.27-1.8 1.65-2.27 1.25-1.68 1.28-1.72 1.35-1.7.72-.9.68-.8 1.18-1.42.8-.93.49-.55.51-.53.59-.59.7-.63.83-.63.43-.29.34-.2.31-.18.14-.05.31-.17.32-.13.33-.13h.1l.37-.11.35-.12.37-.08.38-.07h.08l.45-.06h1.34z" fill="#fff"/><path d="m161.32 358.78.75.05.75.09.75.1.71.13.74.15.7.17.7.18.7.22.66.23.72.25 1.27.52 1.3.6 1.25.63 1.25.7 1.21.73 1.2.79 1.17.8 1.17.86 1.15.87 1.13.92 1.13 1 1.1 1 1.1 1 1.09 1 1.06 1 1.07 1 1 1.09 1 1.08 1 1.1 1 1.12 1 1.11 1 1.12 1 1.13.91 1.14.92 1.11.88 1.14.87 1.11.83 1.12.82 1.12.82 1.11 1.5 2.14 1.4 2.08 1.26 2 .62 1 .57.95.53.94.52.9.46.88.45.85.42.83.38.84.35.81.32.85.3.87.27 1 .13.69.08.46.05.47v1.92l-.06.58-.12.55-.07.33-.11.44-.12.43-.23.68-.42 1-.45.85-.45.78-.48.74-.5.7-.52.68-.53.67-.55.66-.6.69-1.19 1.3-1.3 1.33-1.38 1.35-1.45 1.38-1.52 1.4-1.56 1.4-1.64 1.44-1.65 1.43-1.71 1.34-1.72 1.43-3.4 2.8-3.33 2.77-3.18 2.55-2.94 2.33-2.56 2.07-2.14 1.71-.83.69-.67.56-.43.39-.27.23-2.73 2.69-2.8 2.78-2.83 2.78-2.85 2.75-2.85 2.75-2.85 2.72-5.72 5.44-5.75 5.41-5.75 5.39-11.5 10.76-11.48 10.69-5.72 5.31-5.68 5.37-5.65 5.38-2.82 2.7-2.8 2.7-2.8 2.72-2.78 2.71-2.77 2.74-2.73 2.73-.54.55-.5.52-1 1.13-1 1.17-1 1.2-1 1.23-1 1.25-2 2.62-2 2.61-1 1.34-1 1.31-1.08 1.32-1.12 1.3-1.15 1.25-.62.65-.63.62-.63.61-.65.6-.69.59-.7.58-.71.57-.75.55-.77.53-.8.5-.83.5-.85.45-.89.43-.91.4-.94.35-1 .34-1 .28-1 .23-1 .19-1 .13-1.06.1h-2.35l-1.08-.05-1.09-.12-1.1-.17-1.1-.21-1.1-.27-1.08-.3-1.1-.37-1.05-.36-1.1-.45-1.1-.48-1.1-.54-.72-.36-.7-.4-.68-.4-.69-.44-.65-.41-.66-.49-1.22-.88-1.18-1-1.15-1-1.12-1-1.07-1-1-1-1-1-.95-1-.94-1-1.7-1.89-1.55-1.78-1.31-1.52-1.25-1.5-1.2-1.46-1.16-1.38-1.07-1.42-1-1.38-1-1.37-.83-1.35-.82-1.3-.76-1.34-.7-1.31-.62-1.35-.59-1.3-.53-1.3-.47-1.3-.4-1.3-.36-1.3-.27-1.3-.2-1.32-.13-1.31v-1.32l-.05-1.25.11-1.28.19-1.32.25-1.25.32-1.22.38-1.18.45-1.13.5-1.1.53-1.07.59-1 .61-1 .65-.95.67-.92.7-.86.72-.85.75-.84.75-.81.76-.79.79-.76.8-.77.83-.77 1.65-1.46 1.7-1.47 1.71-1.48 1.75-1.49 1.77-1.51 1.78-1.57 1.82-1.63.88-.8.9-.85.9-.87.9-.88.9-.9.9-.92.89-.95.91-1 7.19-8 3.63-4 3.65-4 3.67-4 3.71-3.95 3.74-3.93 3.76-3.9 1.94-1.85 1.92-1.94 1.93-1.93 2-1.92 2-1.9 2-1.9 2-1.88 2-1.88 2-1.85 2-1.85 2-1.85 1.95-1.82 2.08-1.82 2.1-1.8 2.12-1.76 2.1-1.74 2.13-1.78 2.09-1.78 2-1.8 2-1.82 2-1.85 2-1.85 2-1.88 2-1.9 4-3.84 4.09-3.86 2.08-1.95 2.1-1.95 2.13-1.94 2.2-2 1.55-1.33 2.32-1.94 2.8-2.3 3-2.45 5.27-4.28 1.71-1.37.7-.53.34-.23.68-.42.72-.35.75-.28.51-.14-.06-.79v-.8l.08-.78.15-.78.22-.77.3-.73.35-.7.43-.67.49-.63.55-.57.48-.47.63-.55.67-.53.67-.5.71-.45.74-.43.73-.39.77-.35.76-.31.79-.27.78-.23.8-.2.8-.15.78-.12.8-.08h2.34zm-.95 16.65h-.22l-.06.05-.07.06-.2.2-.6.52-.65.47-.68.4-.72.31-.75.27-.35.08.08.7v.8l-.06.8-.14.79-.21.76-.29.74-.36.71-.42.69-.48.63-.55.58-.59.52-.53.38.07-.07-.19.15-1.56 1.25-5.2 4.22-2.94 2.4-2.73 2.27-2.22 1.83-1.31 1.13-2 1.8-2 1.85-2 1.89-2 1.88-4.05 3.83-4.39 4.01-2 1.94-2.08 1.93-2.1 1.95-2.13 1.93-2.17 1.92-2.2 1.91-2.25 1.92-2.25 1.87-2 1.7-2 1.68-2 1.7-2 1.73-2 1.74-2 1.75-1.95 1.76-1.87 1.81-1.92 1.8-1.9 1.8-1.88 1.83-1.88 1.83-1.89 1.85-1.85 1.87-1.86 1.87-1.82 1.88-3.68 3.8-3.65 3.83-3.67 3.89-3.62 3.9-3.6 3.91-3.58 3.95-7.2 8-1 1.11-1 1.12-1 1.1-1.17 1.09-1 1-1 1-1 1-1 .95-2 1.76-1.91 1.69-1.92 1.5-1.75 1.5-1.67 1.42-1.58 1.33-1.44 1.28-.56.57-.62.59-.58.56-.53.55-.5.54-.45.51-.42.49-.37.46-.33.45-.28.42-.25.4-.22.37-.17.35-.15.31-.11.3-.1.3-.07.29-.07.26v1.65l.06.42.1.48.14.52.18.58.23.64.27.68.33.73.4.8.45.85.52.9.58 1 .65 1 .74 1 .78 1.1.87 1.15.95 1.2 1 1.25 1.09 1.32 1.18 1.37 1.43 1.63 1.55 1.72.72.86.78.82.8.81.8.79.8.73.79.72.76.65.75.6.77.56.32.22.33.22.33.21.32.19.3.16.28.15.64.3.6.27.58.23.53.2.5.15.47.14.42.1.4.08.36.05h1.75l.24-.05h.25l.23-.07.25-.08.25-.1.25-.1.27-.13.28-.15.28-.17.32-.2.3-.22.33-.25.35-.25.34-.3.36-.31.37-.34.38-.36.39-.39.38-.4.83-.91.85-1 .89-1 .9-1.13.91-1.2 2-2.57 2.08-2.7 1.1-1.41 1.14-1.56 1.2-1.43 1.25-1.45 1.3-1.42.7-.73.7-.7 2.82-2.82 2.81-2.78 2.84-2.77 2.83-2.75 2.85-2.75 2.85-2.73 5.72-5.43 5.73-5.4 5.73-5.39 11.5-10.7 11.5-10.7 5.7-5.35 5.7-5.36 5.67-5.34 2.82-2.7 2.8-2.71 2.8-2.72 2.8-2.73 2.76-2.74 2.87-2.85.63-.6.79-.68.85-.73 1-.8 2.22-1.8 2.61-2.09 2.92-2.33 3.13-2.52 3.27-2.63 3.28-2.72 1.62-1.35 1.6-1.35 1.55-1.33 1.5-1.32 1.42-1.28 1.35-1.25 1.25-1.18 1.13-1.12 1-1 .88-1 .23-.27-.08-.15-.33-.61-.39-.69-.41-.71-.47-.77-.47-.78-1.1-1.72-1.21-1.8-1.34-1.9-.68-.95-.72-1-.75-1-.76-1-.77-1-.8-1-.82-1-.83-1-.83-1-.85-1-.87-1-.87-.95-.88-.92-.87-.9-.88-.88-.88-.87-.89-.82-.88-.8-.87-.76-.86-.72-.85-.68-.84-.65-.81-.6-.82-.55-.77-.5-.75-.47-.71-.4-.69-.33-.63-.3-.63-.25-.24-.09-.25-.1-.25-.06-.21-.07-.22-.05h-.98z"/><path d="m336.5 188.15 1.07.1 1 .13 1 .19 1 .2.95.21.94.24.9.25.9.26 1.65.54 1.58.55 1.52.53 1.38.48 1 .19 2.13.43 1 .17 1.27.21 2.93.47 1.34.23.66.14.82.18.53.17.69.25.63.3.62.36.6.42.56.48.52.52.47.56.41.6.1.19h.12l.2.05.68.19.67.23.2.08.53.25.52.27.2.12.42.26.4.29.2.13.3.25.3.27.43.38.58.62.5.6.42.56.4.59.27.43.25.17 4.2 2.81 1.63 1.12.77.57.45.36.58.52.52.57.1.13.43.57.38.6.34.63.28.67.22.66.15.71.07.4.52.29 1.25.71.68.42.68.42.7.46.7.5.74.55.75.64.75.73.51.58.49.6.46.62.42.67.37.68.18.42.18.43.15.43.05.12.15.52.1.53.09.53v.09l.05.76v.75l-.09.77-.15.73v.07l-.2.65-.24.63-.3.62-.35.58-.4.55-.43.54-.47.48h-.05l-.35.3.2.64.24.9.2.9.18.88.15.88.12.87.1.85.1.88.11 1.6v1.19l.27 1 .35 1.43.18 1.12.29 1.78.35 2.37.36 2.65.17 1.38.15 1.35.13 1.32.1 1.25.05 1.18v1.45l-.05.53-.07.47-.08.45-.05.18-.17.67-.23.65-.27.62-.07.11.05.07.3.5.24.41.4.84.3.73.26.75.24.75.2.75.18.73.13.74.12.73.08.73.07.72v2.87l-.08 1.33-.14 1.37-.2 1.35-.23 1.35-.27 1.31-.31 1.3-.35 1.3-.39 1.27-.4 1.27-.41 1.25-.45 1.21-.47 1.2-.23.55v2.94l-.05.76-.1.77-.19.75-.25.72-.31.7-.37.68-.43.63-.5.59-.55.53-.59.5-.65.43-.66.37-.57.25-.1.17-.83 1.36-.39.65-.65 1.14-.85 1.48-.5.85-.55.87-.58.9-.63.9-.7.93-.17.2-.85 1.6-1 1.68-.83 1.42-.8 1.25-.77 1.13-.82 1.19-1 1.41-.32.45-.28 1.1-.37 1.1-.4 1-.45 1-.47 1-.51 1-.54 1-.36.68-.17.53v.12l-.22.6-.27.57-.08.15-.23.41-.25.4-.42.64-.65.83-.63.73v.05l-.35.55-.66 1-.67 1-.67.95-.65.91-.66.89-.67.83-.68.8-.72.78-.82.8-.9.77-.73.52-.45.26-.42.24-.41.2-.14.06-.61.25h-.05l-1.59 1.59-3.25 3.13-.13.13-.27.54-.41.63-.47.6-.52.55-.83.83-.95.9-1.18 1.12-1.32 1.23-1.4 1.27-1.4 1.2-.73.62-.65.51-2.55 2-1.5 1.15-1.5 1.39-1.73 1.28-1.84 1.35-1.9 1.3-1 .66-1 .65-1 .65-1 .64-1 .61-1.05.6-1.05.59-1.08.55-1.07.53-1.1.5-1.11.48-1.14.44-1.15.4-1.18.35-1.22.3-1.2.21-.71.1-.69.07h-1.95l-.76-.08-.74-.15-.73-.23-.37-.15-.26.11-1.97.87-2 .81-2 .79-1.07.38-1.05.37-1 .33-1.05.33-1.05.29-1.06.26-1.07.24-1.1.2-1.13.15-1.19.1h-1.33l-.78-.05-.74-.09-.76-.15-.84-.2-.51-.18-.72-.27-.2-.1-.35-.21-.23.07-.45.07-1 .11-1 .05-1.15.05h-1.94l-.78-.08-.93-.13-1-.24-1.31-.43-1.12-.4-1.08-.43-1-.44-.23-.11h-4.35l-.76-.1-.74-.18-.73-.23-.7-.32-.67-.37-.63-.43-.6-.48-.53-.54-.5-.6-.44-.61-.25-.45-.53-.17-2.53-.85-1.55-.5-.92-.28-.12.06-1 .54-1 .43-1 .33-1 .27-1 .17-1 .1h-1.88l-.88-.09-.87-.13-.83-.17-.8-.2-.77-.23-.75-.25-.73-.27-.7-.3-.69-.31-.68-.34-.65-.33-.65-.37-.67-.38-1.18-.75-1.18-.82-1.17-.83-1.12-.87-1.08-.9-1.07-.9-1-.91-1-.92-.8-.78-.14-.07-.43-.28-.27-.19-.36-.25-.35-.28-.52-.45-.68-.67-.6-.65-.55-.63-.54-.65-.53-.7-1-1.35-1-1.45-.89-1.28-1.88-2.59-1.25-1.73-1.23-1.72-1.07-1.55-.5-.75-.29-.59-.37-.66-.13-.27-.3-.68-.24-.72-.16-.73v-.07l-.1-.7v-1.4l.07-.68.13-.7.2-.67.25-.65.1-.21-.36-.7-1-1.9-.93-1.9-.45-1-.45-1-.42-1-.42-1-.4-1-.38-1-.37-1.05-.35-1.06-.36-1.22-.34-1.22-.3-1.2-.28-1.2-.27-1.16-.23-1.19-.43-2.26-.75-4.32-.39-2.05-.18-1-.2-.91-.3-1.37-.42-1.83-.18-1-.1-.63-.05-.44v-1.21l.05-.74.11-.73.19-.7.13-.38-.27-.4-.4-.75-.33-.74-.27-.73-.21-.7-.15-.68-.14-.67-.1-.72-.08-1.1v-1.15l.05-1.08.1-1.05.15-1 .18-1 .2-1 .24-.95.25-.92.26-.91.29-.9.3-.89.3-.88.61-1.63.62-1.57.62-1.43.56-1.32.54-1.15.8-1.65.36-.7.3-.55v-.07l.07-.51v-.15l.17-.77v-.17l.12-.4.15-.38.27-.7.45-1 .41-.75.39-.65.36-.58.54-.82.13-.48.22-.74.23-.73.27-.73.51-1.32.57-1.3.57-1.23.58-1.19.58-1.13.57-1.08.43-.82.57-1.27.78-1.66.25-.55.15-.47.44-1.27.48-1.25.53-1.21.55-1.19.59-1.16.6-1.15.63-1.14.63-1.11.65-1.09.67-1.06.67-1.05.68-1 .27-.4v-.08l.2-.38.12-.72.13-.7.17-.68.18-.67.2-.65.23-.63.25-.67.5-1.13.57-1.15.6-1.1.65-1 .67-1 .68-1 .73-1 .74-1 .75-.92.76-.9.77-.88.78-.85.79-.87 1.53-1.56 1.52-1.52 1.46-1.4 2.57-2.45 1.07-1 1.1-1.08 1.63-1.42 3-2.58 3.11-2.64 1.24-1 .91-.73.72-.48.63-.4 1.22-.72 1.3-.7.75-.38.73-.34.79-.33.58-.23.35-.25.72-.54.71-.48.72-.48.75-.47.75-.45.77-.43.78-.42.8-.38.83-.39.87-.33.88-.32.94-.28 1-.22 1-.18 1.08-.12h1.12l1.16.07.82.1.38.06.39.09.45.1.4.11.38.12.43.15.4.15.39.17.41.18.34.17 1-.17 1.07-.52v-.15l.1-.7.15-.68.2-.67.24-.58.28-.58.33-.54.37-.53.43-.5.45-.49.5-.43.52-.38.56-.35h.07l.58-.32.62-.25.62-.22.63-.16h.13l.69-.12.7-.06h1.6l.75.1 1 .18 1 .22.92.25 1.68.48 1.62.47.68.2.55.13.34.09h.16l.77.1.95.09 1.07.06 1.15.09 2.51.13 1.35.08 1.4.12 1.45.13 1.49.17 1.48.22.8.15.77.15.8.16.78.2.8.22.8.25.82.27.81.31.82.35.67.3.68.37.17.1.5.32.46.35.45.38v.05l.53.53.48.59.1.15h.6l.3-.27.62-.46.65-.4.7-.35.72-.29.75-.2.75-.15.78-.06h1.7zm-35.93 17-2.14.33-2.13.3-2 .29-1.89.25-1.68.2-1.43.15-1.19.11-.81.05-1.54.78-3.11 1.6-1.65.79h-.08l-.07.05-.73.41-.75.44-1.4.73-1.42.7-1.35.63-1.26.55-1.15.49-1 .4-1 .35-.62.18-.38.1-.38.08-.54.1-.73.12-1.32.17h-.25l-.6.12-.91.15h-.27l-1.38 1-1.49 1-1.4 1-1 .65-.65.58-1 .87-1 .83-.64.48-.4.69-.76 1.16-.77 1.15-.78 1.12-.79 1.08-.8 1.07-.8 1-.8 1-1.55 1.92-1.43 1.73-.28.35-.34.43-.76 1.07-.17.4-.32.77-.35.76-.66 1.44-.7 1.38-.7 1.35-.7 1.28-1.29 2.34-.55 1-.48.93-.38.79-.3.65-.2.51-.29.79-.73 2.11-.82 2.42-.45 1.27-.46 1.26-.49 1.25-.51 1.19-.35.7-.37.68-.45.75-.37.5-.28.37-.3.36-.17.19-.53.53-.58.5-.17.12-.48.35-.5.3-.54.26h-.06l-.4.16v.17l.12.57.16 1.33.1 1.18v3.4l.12.33.2.73.13.77.05.77v1.26l-.07.55-.1.55-.13.55v.09l-.2.63-.26.62-.3.58-.37.57-.2.26-.2 1-.45 1.88-.9 3.54-.42 1.68-.38 1.6-.33 1.57-.1.53.53.47.53.56.47.6.42.65.36.67.3.72.22.73.15.75.1.77v1.45l-.08.9-.14 1-.15.63-.08.38-.12.39-.1.26-.16.45-.19.45-.1.22-.28.55-.32.52-.11.18-.45.6-.49.57-.13.13-.43.42-.45.38-.49.35-.13.1-.58.35h-.07l.43 1.45.3.92.3.88.3.84.35.91.27.74.33.9.62 1.9.62 2 .28 1 .28 1 .24 1 .21 1 .2 1 .09.71v1.55l-.05.54v.13l-.1.62-.14.6-.05.16.77 1.44.9 1.63.93 1.63 1 1.67 2 3.38 1 1.7 1 1.74 1 1.76.87 1.59.05.08.13.2.25.32.7.86.44.59.5.7.16.23.57-.08h2.35l1.1.09 1.06.13 1 .15 1 .2 1 .23 1 .27 1 .28 1 .3 1 .32.95.33.95.35.94.39.93.38 1.78.77 1.75.8 1.69.81 1.63.8 1.55.79 2.83 1.43 1.25.63 2.07 1 .93.47 1.59.82.78.2.92.21.93.22.72.15h.18l1.82-.35 1.91-.37 1.94-.35 1.71-.28 1.19-.19 1.23-.15.8-.06h2l.5.07.27.05.68.13.67.2h.08l.72.29.66.33h.07l.52.3.23.17 2.5-.34 1.5-.2 1.53-.16 1.57-.17 1.62-.12 1.65-.06h1.46l2.6-1.2 1.9-.86.12-.05.39-.22.5-.31.65-.4 1.53-1 .87-.55.93-.57.95-.55.62-.3.6-.3.68-.28.78-.27.55-.15.39-.1.38-.08.25-.05.48.17.51-.05h.92l.7.05h.2l.6.08.6.15.57.17.18.06.52.2.65-.46 1.55-1.2 1.5-1.13 1.42-1.09 2.45-1.88.43-.35.45-.37 1.12-1 1.18-1.07.87-.82.25-.45.38-.6.45-.55.27-.31 1.88-1.87 1.64-1.6 3.21-3.12 1.55-1.51 1.14-1.15.35-.69.35-.65.38-.6.4-.61.73-1.05.8-1 .84-1 .85-1 .85-.94.86-.88.85-.83.35-.34v-.26l.1-.69.13-.75.17-.83.23-.9.27-1 .38-1.09.45-1.06.37-.7.38-.67.48-.72.37-.45.5-.56.17-.19.31-.31.35-.3.17-.15.42-.34.45-.3.18-.11.53-.3.1-.05.69-.81.76-1.12.34-.46-.07-.32-.07-.48v-1.57l.05-.5v-.32l.06-.48.1-.47.17-.71.32-1 .35-.85.35-.78.36-.72.39-.68.4-.7.75-1.22.8-1.18.8-1.12.73-1 .7-.9 1.05-1.32.42-.52.5-.56.55-.52.61-.47.64-.4.68-.35.7-.28.22-.07.41-.86.17-.35v-8.3l.05-.9.09-.92.05-.5.05-4.3v-13.1l-.05-.17-.24-.7-.35-1.28-.33-1.35-.28-1.38-.25-1.4-.24-1.42-.2-1.45-.18-1.47-.17-1.46-.15-1.47-.11-1.45-.12-1.45-.2-2.75-.13-2.57v-.11l-.37-.79-1-1.93-1-1.92-1.07-2-1.1-2-2.25-4-1.13-2-.37-.67-.51-.32-1.64-.91-1.65-.89-1.68-.86-1.73-.89-1.77-.86-3.63-1.8-1.87-.94-1.88-1-1.9-1-1.93-.94-1-.57-1-.56-1-.6-1-.62-.94-.63-.88-.64-.8-.61-.68-.59-.44-.38h-4.6l-2.48.05h-11.6l-1.57-.07-1.58-.08-1.6-.12-1.62-.15-1.61-.17-1.62-.21-1.63-.25-1.64-.3-1.61-.34-1.59-.38z" fill="#fff"/><path d="m318.07 198.68h2.53l1.27.05 1.26.07 1.27.08 1.25.1 1.27.12 1.25.15 1.25.15 1.23.17 1.25.18 1.23.22 1.24.21 1.21.25 1.22.25 1.2.32 1.2.3 1.2.33 1.2.33 1.18.37 1.18.37 1.17.4 1.17.43 1.15.43 1.13.47 1.13.48 1.12.52 1.17.57 1.1.55 1.08.59 1.08.6 1.07.61 1.05.65 1 .67 1 .7 1 .72 1 .75 1 .76 1 .8.94.82.91.83.9.87.89.9.86.92.84.95.81 1 .8 1 .77 1 .75 1 .72 1.07.7 1.08.68 1.12.63 1.15.64 1.16.58 1.19.57 1.21.53 1.24.52 1.25.46 1.28.45 1.3.44 1.32.38 1.35.37 1.36.31 1.39.3 1.41.32 1.65.27 1.69.25 1.68.2 1.7.16 1.7.12 1.7.1 1.72.07 1.71v5.2l-.07 1.74-.1 1.73-.13 1.75-.17 1.73-.25 1.73-.22 1.75-.25 1.74-.28 1.75-.3 1.73-.32 1.75-.36 1.73-.37 1.74-.42 1.73-.41 1.73-.47 1.74-.47 1.71-.51 1.72-.52 1.7-.55 1.7-.57 1.7-.6 1.68-.6 1.69-.63 1.66-.67 1.65-.66 1.65-.7 1.64-.7 1.63-.74 1.62-.75 1.6-.78 1.6-.78 1.56-.8 1.57-.84 1.55-.83 1.53-.8 1.55-.88 1.5-.89 1.47-.9 1.46-.91 1.45-.94 1.44-.95 1.4-1 1.4-1 1.36-1 1.34-1 1.33-1 1.3-1 1.28-1 1.25-1.07 1.24-1.06 1.2-1.09 1.18-1.1 1.15-1.21 1.15-1.08 1-1.17 1-1.2 1-1.25 1-1.3 1-1.32.9-1.35.87-1.38.83-1.4.8-1.44.77-1.46.75-1.49.71-1.5.7-1.5.65-1.53.65-1.53.6-1.55.57-1.57.55-1.55.52-1.57.48-1.56.45-1.55.42-1.55.38-1.55.35-1.55.32-1.52.28-1.52.23-1.51.2-1.49.17-1.48.12-1.45.06h-3.78l-2.4-.06-2.45-.12-2.49-.18-2.53-.22-2.57-.28-2.56-.34-1.35-.23-1.3-.2-1.31-.23-1.32-.24-1.33-.25-1.32-.25-1.33-.28-1.34-.3-1.31-.32-1.34-.33-1.33-.33-1.33-.37-1.32-.38-1.32-.4-1.33-.42-1.32-.43-1.3-.47-1.31-.47-1.3-.5-1.29-.51-1.28-.54-1.28-.55-1.27-.58-1.27-.6-1.25-.62-1.23-.65-1.23-.66-1.22-.69-1.2-.71-1.18-.74-1.17-.76-1.17-.79-1.13-.81-1.12-.84-1.1-.86-1.08-.9-1.07-.92-1-.95-1-1-1-1-1-1-.95-1.06-.9-1.1-.9-1.12-.85-1.15-.82-1.2-.78-1.2-.75-1.25-.72-1.27-.7-1.35-.57-1.18-.5-1.25-.46-1.28-.4-1.29-.35-1.3-.3-1.31-.27-1.34-.23-1.33-.19-1.37-.15-1.36-.11-1.39-.09-1.4-.06-1.41v-5.77l.08-1.47.09-1.48.11-1.48.14-1.49.15-1.5.18-1.5.18-1.51.22-1.52.22-1.52.25-1.5.25-1.51.26-1.52.29-1.53.6-3 .65-3 .68-2.95.73-2.91.75-2.87.77-2.8.78-2.72.82-2.65.8-2.55.82-2.43.8-2.33.8-2.22.8-2.08.76-1.95.77-1.82.75-1.65.65-1.38.28-.6.25-.57.25-.68.29-.77.28-.83.3-.9.62-2 .63-2.15.68-2.22.35-1.15.39-1.15.38-1.15.42-1.15.45-1.17.46-1.15.52-1.15.58-1.15.62-1.08.38-.63.4-.57.42-.58.45-.59.5-.58.55-.57.62-.56.66-.55.74-.54.83-.5.88-.45.62-.25.4-.14.35-.12.3-.08.38-.12.39-.08h.28l.4-.08.4-.05h2.88l.37.07.68.11.27.07.27-.17 1-.63 1-.62 1-.6 1-.58 1-.58 1-.57 1-.57 1-.53 1.07-.55 1.07-.52 1.08-.51 1.1-.5 1.1-.5 1.12-.49 1.13-.46 1.13-.45 1.14-.45 1.15-.44 1.16-.43 1.17-.42 1.18-.4 1.19-.38 1.24-.37 1.22-.37 2.4-.68 2.41-.65 1.25-.3 1.24-.3 1.23-.29 1.25-.26 1.23-.25 1.25-.24 1.27-.23 1.25-.22 1.27-.2 1.26-.18 1.25-.17 1.29-.16 1.26-.15 1.27-.12 1.27-.12 1.28-.1 1.27-.1 1.28-.06 1.27-.07h5.1zm-2.3 16.67h-2.15l-1.07.05-1.08.05-1.09.08-1.08.08-1.08.1-1.09.12-1.08.12-1.1.13-1.08.15-1.09.17-1.08.16-1.07.19-1.08.2-1.08.2-1.07.21-1.07.24-1.06.23-1.07.27-1 .25-2.12.56-2.08.6-1 .3-1 .34-1 .33-1 .33-1 .35-1 .37-1 .37-1 .38-1 .38-.95.4-.93.4-.93.42-.9.42-.92.43-.88.43-.89.45-.85.45-.85.45-.85.47-.81.47-.8.46-.8.49-.79.5-.75.48-.75.5-.71.5-.64.62-.7.5-.67.51-.66.52-.64.52-.61.53-.6.52-.59.53-.56.53-.6.59-.5.46-.55.42-.59.37-.61.31-.64.29-.65.21-.48.12-.58 1.93-.65 2.19-.69 2.18-.36 1.13-.37 1.1-.4 1.1-.43 1.1-.47 1.1-.45 1-.58 1.22-.57 1.28-.63 1.5-.67 1.67-.7 1.83-.72 2-.73 2.12-.75 2.23-.73 2.35-.75 2.44-.74 2.53-.71 2.58-.69 2.65-.66 2.69-.64 2.71-.6 2.74-.55 2.76-.25 1.35-.28 1.29-.21 1.37-.22 1.35-.2 1.35-.18 1.33-.17 1.33-.17 1.3-.13 1.3-.1 1.29-.1 1.25-.08 1.23v1.22l-.05 1.18v4.47l.06 1 .09 1 .11.95.12.9.15.87.15.82.18.75.19.7.21.65.2.6.22.51.25.52.4.8.47.8.48.8.5.78.53.77.55.75.59.73.6.74.63.7.65.7.68.7.7.66.72.67.75.65.78.63.79.62.81.62.84.6.86.58.89.57.88.56.92.54 1 .53 1 .52 1 .5 1 .5 1 .46 1 .47 1 .45 1 .43 1.05.42 1.06.4 1.09.4 1.08.38 1.1.37 1.1.35 1.12.33 1.11.32 1.14.32 1.13.28 1.13.28 1.14.27 1.13.27 1.15.23 1.15.23 1.13.22 1.15.2 1.14.18 1.13.19 1.12.15 2.28.3 2.23.25 2.2.18 2.17.15 2.12.12 2.06.05h3.85l1-.08 1.05-.12 1.09-.15 1.13-.16 1.17-.22 1.18-.25 1.22-.27 1.23-.3 1.25-.35 1.25-.35 1.27-.4 1.26-.41 1.27-.44 1.27-.46 1.25-.5 1.23-.52 1.22-.52 1.18-.56 1.17-.57 1.15-.58 1.1-.6 1.06-.6 1-.62 1-.63.93-.64.87-.61.82-.64.76-.63.69-.6.66-.63.87-.89.9-.95.9-1 .88-1 .89-1 .88-1.05.87-1.09.86-1.11.87-1.12.85-1.17.83-1.16.84-1.2.83-1.22.8-1.25.8-1.25.8-1.28.77-1.3.76-1.32.75-1.32.74-1.35.73-1.36.7-1.37.7-1.4.68-1.4.65-1.42.65-1.41.64-1.44.61-1.45.59-1.45.58-1.46.57-1.47.53-1.48.52-1.49.5-1.48.48-1.5.47-1.5.43-1.5.42-1.5.4-1.5.36-1.5.35-1.5.34-1.5.3-1.5.28-1.5.27-1.5.23-1.48.2-1.49.18-1.48.17-1.48.13-1.45.12-1.47.08-1.45.05-1.43v-5.66l-.08-1.37-.1-1.37-.14-1.35-.15-1.33-.18-1.32-.22-1.3-.23-1.28-.22-1-.25-1-.25-1-.26-1-.3-.92-.32-.9-.32-.88-.35-.87-.36-.83-.39-.82-.38-.78-.42-.79-.43-.75-.45-.73-.45-.73-.48-.7-.49-.69-.51-.66-.52-.65-.53-.64-.55-.63-.57-.6-.58-.6-.6-.57-.62-.56-.63-.55-.64-.54-.66-.51-.67-.52-.68-.48-.72-.49-.72-.46-.73-.45-.75-.44-.75-.43-.78-.4-.79-.4-.81-.38-.82-.39-.83-.35-.84-.35-.86-.33-.87-.32-.88-.3-.9-.28-.9-.28-.94-.25-.91-.25-.95-.24-.95-.23-.95-.2-1-.2-1-.17-1-.16-1-.15-1-.15-1-.12-1-.12-1-.08-1-.08-1-.09h-1.05l-1.05-.05h-4.4z"/><path d="m296.1 170.57 2 .05 2 .08 2 .13 2 .15 2 .19 1.95.2 1.95.23 1.92.25 1.91.27 1.92.26 3.75.59 7.4 1.21 3.67.59 1.78.26 1.9.29 1.53.25 1.22.21 1.38.27 1.55.32 1.69.36 1.78.42 1.82.45 1.81.48.94.29.9.28.9.28.9.32.88.35.88.37.9.4.9.46 1 .59.92.65.61.51h.17l1.25.12 1.25.13 1.23.15 1.22.19 1.22.21 1.18.24 1.18.25 1.17.26 1.15.3 1.13.34 1.14.33 1.1.38 1.1.39 1.08.41 1.07.44 1.05.45 1 .46 1 .5 1 .52 1 .53 1 .55 1 .59.93.58.94.62.9.63.9.63.86.67.87.68.85.7.82.7.81.74.8.73.79.77.75.76.75.79.73.8.72.8.7.83.68.83.67.85.65.85.63.87.62.88.6.89.6.9.56.91.57.92.55.93.52.94.51.93.5 1 .5.95.47 1 .47 1 .43 1 .43 1 .42 1 .42 1 .38 1 .38 1 .37 1 .35 1.05.67 2 .61 2.09.57 2.11.52 2.12.48 2.13.42 2.15.38 2.15.33 2.17.3 2.18.24 2.17.21 2.18.17 2.19.12 2.2.06 2.18.05 2.18v2.17l-.05 2.18-.08 2.17-.12 2.15-.15 2.15-.2 2.13-.23 2.12-.27 2.1-.3 2.08-.35 2.07-.36 2.05-.42 2-.45 2-.48 2-.52 2-.55 1.9-.53 1.68-.54 1.68-.55 1.67-.58 1.65-.6 1.67-.62 1.65-.65 1.63-.65 1.65-.68 1.63-.7 1.62-.73 1.62-.74 1.61-.88 1.62-.79 1.58-.8 1.6-.81 1.59-.84 1.56-.85 1.57-.86 1.57-.9 1.55-.92 1.53-.92 1.53-.95 1.52-1 1.5-1 1.5-1 1.5-1 1.48-1 1.47-1 1.45-1.05 1.45-1.08 1.43-1.1 1.42-1.13 1.4-1.12 1.4-1.15 1.38-1.15 1.37-1.16 1.35-1.2 1.33-1.2 1.33-1.22 1.34-1.23 1.3-1.24 1.28-1.26 1.27-1.27 1.27-1.3 1.23-1.3 1.23-1.3 1.2-1.33 1.2-1.35 1.17-1.35 1.15-1.37 1.15-1.37 1.12-1.4 1.11-1.4 1.09-1.41 1.06-1.44 1.05-1.43 1-1.45 1-1.47 1-1.48 1-1.48.95-1.5.94-1.5.91-1.52.89-1.53.86-1.54.85-1.55.82-1.56.8-1.57.78-1.58.75-1.59.74-1.6.71-1.61.69-1.62.66-1.63.64-1.64.6-1.63.58-1.65.57-1.67.53-1.66.5-1.69.48-1.68.45-1.65.42-1.7.38-1.7.38-1.72.34-1.72.31-1.71.29-1.74.25-1.73.21-1.75.2-1.75.15-1.75.14-1.75.1-1.77.06h-5.3l-1.78-.07-1.77-.1-1.78-.13-1.78-.17-1.79-.2-1.81-.14-1.8-.27-1.78-.3-1.79-.33-1.8-.38-1.78-.4-1.8-.45-1.78-.49-1.79-.51-1.78-.55-1.8-.6-1.78-.64-1.77-.66-1.78-.7-1.79-.75-1.76-.79-1.77-.81-1.77-.87-1.76-.88-1.75-.95-1.77-1-1.75-1-1.73-1.05-1.74-1.1-1.75-1.13-1.7-1.17-1.66-1.2-1.62-1.23-1.58-1.25-1.54-1.3-1.5-1.32-1.45-1.35-1.41-1.38-1.39-1.4-1.31-1.43-1.3-1.45-1.25-1.49-1.2-1.51-1.17-1.52-1.13-1.57-1.09-1.56-1-1.6-1-1.62-.95-1.63-.93-1.65-.88-1.69-.85-1.68-.8-1.72-.77-1.71-.73-1.74-.69-1.75-.65-1.78-.61-1.77-.59-1.8-.53-1.8-.5-1.81-.47-1.84-.43-1.83-.4-1.85-.37-1.85-.33-1.87-.28-1.88-.27-1.88-.23-1.89-.19-1.88-.16-1.9-.14-1.92-.08-1.9-.07-1.91v-5.77l.06-1.93.09-1.92.11-1.93.14-1.94.18-1.93.2-1.93.23-1.94.27-1.93.28-1.93.32-1.92.33-1.93.39-1.94.38-1.91.43-1.92.45-1.92.47-1.9.5-1.9.52-1.9.55-1.9.58-1.88.6-1.88.62-1.89.65-1.86.66-1.85.7-1.85.72-1.85.73-1.82.77-1.83.78-1.8.82-1.82.82-1.78.86-1.79.87-1.76.9-1.75.92-1.74.93-1.73 1-1.72 1-1.7 1-1.68 1-1.67 1-1.65 1.07-1.63 1.07-1.62 1.1-1.6 1.11-1.58 1.14-1.58 1.16-1.54 1.09-1.57 1.18-1.52 1.22-1.48 1.22-1.47 1.25-1.45 1.26-1.41 1.29-1.4 1.3-1.39 1.31-1.36 1.34-1.34 1.35-1.3 1.35-1.28 1.38-1.27 1.4-1.23 1.42-1.2 1.43-1.18 1.45-1.15 1.47-1.12 1.48-1.1 1.48-1.07 1.52-1 1.53-1 1.54-1 1.56-.94 1.57-.91 1.58-.89 1.6-.83 1.62-.82 1.63-.76 1.64-.74 1.65-.7 1.68-.66 1.68-.64 1.67-.58 1.08-.35 1.07-.32 1.07-.31 1.05-.29 1.06-.26 1.07-.25 1.05-.24 1.05-.21 1.07-.2 1.05-.19 1.05-.16 1-.14 1-.15 1.05-.11 1-.1 1.07-.09 2-.15 2-.08h2.05zm-3.55 16.7-1.65.06-1.67.12-.8.07-.81.08-.82.08-.8.1-.82.12-.8.13-.81.14-.8.16-.8.15-.82.19-.8.18-.8.22-.8.21-.8.22-.8.25-.8.27-1.35.46-1.32.49-1.33.53-1.32.55-1.31.6-1.32.62-1.3.65-1.3.68-1.3.72-1.28.75-1.29.78-1.26.8-1.27.83-1.27.87-1.25.88-1.23.92-1.23.95-1.24 1-1.2 1-1.21 1-1.19 1.05-1.18 1.08-1.18 1.1-1.17 1.14-1.15 1.15-1.13 1.16-1.14 1.2-1.1 1.22-1.11 1.25-1.09 1.27-1.06 1.28-1.07 1.3-1 1.33-1 1.35-1 1.37-1 1.38-1 1.4-1 1.42-.95 1.43-.93 1.47-.93 1.47-.9 1.48-.9 1.5-.87 1.52-.85 1.51-.83 1.55-.82 1.55-.8 1.57-.78 1.58-.77 1.59-.73 1.6-.74 1.61-.7 1.62-.68 1.63-.67 1.64-.63 1.65-.62 1.65-.6 1.66-.58 1.67-.55 1.67-.53 1.68-.52 1.68-.48 1.69-.47 1.68-.45 1.7-.42 1.7-.5 1.7-.38 1.7-.35 1.7-.32 1.7-.3 1.7-.28 1.7-.25 1.7-.23 1.68-.2 1.7-.19 1.69-.15 1.7-.13 1.68-.1 1.67-.07 1.68-.05 1.67v4.96l.07 1.64.08 1.63.1 1.62.15 1.61.15 1.62.2 1.58.22 1.59.25 1.56.27 1.57.3 1.55.33 1.53.37 1.52.38 1.52.42 1.48.43 1.48.48 1.47.5 1.45.54 1.43.55 1.44.58 1.4.62 1.38.65 1.37.68 1.35.7 1.35.73 1.31.77 1.3.8 1.29.82 1.26.86 1.24.89 1.23.93 1.2 1 1.2 1 1.17 1 1.15 1 1.13 1.08 1.1 1.14 1.1 1.15 1.07 1.18 1.05 1.22 1 1.26 1 1.3 1 1.34 1 1.38.93 1.48 1 1.49.95 1.48.88 1.5.87 1.48.83 1.49.8 1.48.75 1.5.74 1.48.68 1.49.65 1.48.63 1.5.59 1.48.56 1.49.52 1.48.5 1.48.45 1.49.43 1.48.4 1.47.37 1.48.35 1.48.3 1.47.28 1.48.25 1.47.22 1.48.2 1.47.15 1.47.15 1.46.1 1.47.08 1.47.05h4.38l1.47-.05 1.45-.09 1.45-.1 1.45-.13 1.45-.17 1.45-.18 1.45-.22 1.43-.23 1.43-.25 1.45-.3 1.44-.3 1.41-.33 1.44-.37 1.41-.38 1.42-.4 1.42-.44 1.41-.45 1.4-.46 1.4-.5 1.4-.54 1.39-.53 1.38-.57 1.38-.58 1.39-.62 1.36-.63 1.37-.65 1.43-.76 1.35-.7 1.35-.71 1.33-.74 1.34-.75 1.33-.78 1.32-.8 1.3-.8 1.3-.83 1.3-.87 1.28-.87 1.28-.88 1.27-.92 1.25-.91 1.25-1 1.25-.95 1.23-1 1.22-1 1.22-1 1.2-1 1.18-1.05 1.18-1.05 1.17-1.08 1.17-1.09 1.15-1.1 1.13-1.13 1.12-1.13 1.11-1.15 1.1-1.15 1.09-1.19 1.08-1.18 1.07-1.2 1.05-1.22 1-1.23 1-1.23 1-1.25 1-1.27 1-1.27 1-1.28 1-1.3.94-1.32.91-1.3.92-1.33.88-1.33.89-1.35.86-1.35.85-1.37.82-1.37.82-1.36.8-1.4.78-1.39.77-1.4.75-1.4.73-1.41.7-1.42.7-1.43.68-1.44.65-1.43.65-1.43.62-1.45.62-1.45.58-1.45.57-1.47.55-1.47.53-1.45.5-1.46.5-1.49.47-1.46.45-1.45.46-1.62.44-1.62.4-1.66.38-1.69.35-1.71.32-1.74.3-1.76.25-1.79.23-1.8.2-1.81.17-1.84.13-1.85.1-1.85.08-1.86v-5.62l-.06-1.88-.1-1.87-.15-1.87-.17-1.86-.22-1.85-.25-1.84-.32-1.72-.32-1.82-.35-1.8-.4-1.77-.41-1.75-.52-1.76-.5-1.7-.55-1.7-.28-.8-.29-.82-.31-.8-.3-.81-.32-.79-.33-.78-.35-.78-.34-.77-.36-.75-.37-.75-.37-.75-.38-.72-.4-.71-.4-.72-.4-.7-.42-.68-.43-.69-.43-.66-.45-.65-.45-.64-.47-.63-.47-.63-.48-.6-.48-.6-.5-.59-.52-.56-.52-.57-.51-.55-.54-.53-.53-.54-.55-.51-.57-.5-.56-.49-.59-.48-.58-.45-.6-.45-.6-.45-.62-.42-.61-.41-.65-.4-.64-.39-.66-.38-.67-.35-.68-.35-.69-.33-.7-.34-.71-.3-.72-.3-.75-.28-.75-.27-.75-.25-.78-.23-.79-.23-.81-.2-.82-.2-.83-.19-.85-.15-.85-.15-.89-.13-.9-.12-.9-.1-.93-.08-.93-.07h-3.83l-.8-.12-.8-.21-.77-.29-.73-.35-.7-.43-.65-.48-.6-.55-.55-.62-.48-.67-.35-.61-.58-.2-.65-.19-.65-.2-1.49-.4-1.51-.38-1.48-.48-1.48-.32-1.37-.28-1.22-.23-1-.17-1.25-.22-1.8-.26-1.9-.29-3.73-.6-7.37-1.2-3.61-.56-1.79-.25-1.76-.25-1.77-.24-1.75-.2-1.75-.18-1.72-.17-1.71-.13-1.72-.1-1.68-.07-1.69-.05h-1.66zm393.75-86.22 1.53.08 1.54.14 1.55.16 1.55.24.75.15.75.15.73.18.75.2.72.22.71.23.72.25.7.27.68.28.69.3.68.32.7.35 1.28.68 1.27.77 1.23.81 1.22.85 1.18.92 1.14 1 1.11 1 1.09 1 1 1.05 1 1.1 1 1.13 1 1.17.94 1.18.9 1.23.86 1.24.85 1.28.82 1.28.78 1.32.75 1.35.72 1.35.68 1.38.67 1.39.62 1.41.6 1.44.56 1.43.52 1.45.5 1.47.45 1.46.42 1.49.38 1.5.35 1.5.3 1.5.27 1.5.23 1.51.18 1.52.14 1.52.1 1.51.05 1.52v1.52l-.05 1.5-.1 1.51-.15 1.5-.22 1.5-.27 1.49-.31 1.43-.2.78-.22.74-.22.73-.23.72-.25.71-.28.72-.29.72-.31.7-.32.7-.35.7-.37.68-.38.68-.4.67-.42.67-.45.65-.45.63-.48.63-.5.62-.52.6-.53.6-.57.58-.56.57-.6.55-.62.53-.63.52-.65.52-.92.65-.92.63-.93.58-.95.57-1 .53-1 .5-1 .45-1 .45-1 .4-1 .37-1 .35-1 .33-1 .29-1 .28-1 .23-1 .24-1 .2-1 .16-1 .17-1 .13-1 .12-1 .1-1 .08-1 .09-1.93.08-2 .05h-1.66l-1.92-.05-1.91-.08-1.89-.1-1.88-.14-1.85-.15-3.62-.33-3.51-.35-3.4-.32-1.64-.15-1.6-.13-1.55-.1-1.5-.08h-3.45l-.48-.05-.5-.08-.48-.1-.47-.13-.47-.17-.45-.18-.45-.22-.43-.25-.42-.27-.4-.3-.36-.31-.37-.34-.33-.36-.22-.24-.17.07-.46.15-.49.13-.48.1-.48.07h-1.97l-.48-.08-.49-.1-.48-.13-.47-.17-.45-.18-.45-.22-.43-.25-.42-.27-.43-.28-.62-.5-.56-.52-.54-.53-.46-.53-.49-.6-.66-1-.59-1.05-.5-1-.4-1-.35-1-.28-1-.23-1-.22-1-.17-1-.15-1-.13-.95-.1-.93-.08-1-.14-1.8-.08-1.8v-10.7l.06-1.3.12-1.3.15-1.3.17-1.28.2-1.28.23-1.29.27-1.28.28-1.28.32-1.27.35-1.27.38-1.25.4-1.25.43-1.25.47-1.23.48-1.22.52-1.21.53-1.22.59-1.18.6-1.19.61-1.16.65-1.15.69-1.15.7-1.12.73-1.12.75-1.1.78-1.06.82-1.07.83-1 .87-1 .88-1 .92-1 1-1 1-.94 1-.9 1-.88 1-.87 1.07-.81 1.1-.8 1.12-.77 1.15-.73 1.18-.7 1.2-.69 1.22-.63 1.25-.6 1.26-.57 1.3-.51 1.32-.49 1.33-.45 1.37-.4 1.38-.35 1.4-.31 1.42-.27 1.43-.22 1.45-.18 1.49-.12 1.48-.08h1.5zm-2.43 16.67h-.94l-.9.06-.9.12-.86.13-.87.17-.87.18-.83.22-.83.25-.82.27-.82.3-.8.31-.78.35-.78.39-.77.4-.75.41-.75.45-.73.47-.72.5-.72.52-.7.53-.68.57-.68.58-.67.6-.65.63-.63.64-.62.66-.62.69-.6.71-.58.72-.57.73-.53.75-.53.79-.52.78-.5.8-.48.8-.47.83-.45.84-.43.85-.4.85-.4.86-.37.89-.35.88-.33.88-.32.9-.28.9-.29.9-.25.92-.21.9-.22.92-.18.91-.17.9-.13.92-.14.9-.1.9-.06.9-.07.9v9.35l.06 1.4.09 1.4.06.62.07.63.08.59.09.55.08.51.1.45.1.4.1.32v.07l.23.21.33.35.24.29.2-.09.46-.15.49-.13.48-.1.5-.07h2.65l1.78.05 1.79.1 1.78.11 1.77.14 1.78.16 3.5.34 3.48.35 3.46.3 1.69.14 1.66.11 1.65.1 1.64.07h4.68l1.53-.07h.7l.72-.06.72-.09.7-.08.7-.08.66-.12.67-.12.65-.13.65-.15.63-.15.62-.17.6-.18.6-.18.58-.22.59-.22.55-.23.55-.23.55-.27.51-.27.54-.28.5-.32.51-.31.49-.34.5-.36.26-.2.25-.2.25-.22.24-.22.21-.23.24-.22.2-.23.21-.25.2-.25.2-.25.19-.27.21-.25.18-.27.17-.28.17-.3.16-.3.15-.32.15-.31.15-.34.14-.33.13-.35.12-.35.11-.37.12-.38.12-.37.08-.35.18-.85.15-.85.14-.86.08-.9.07-.92v-3l-.07-1-.08-1-.14-1.05-.16-1.07-.19-1.07-.21-1.08-.25-1.08-.29-1.1-.31-1.09-.34-1.1-.36-1.08-.39-1.08-.43-1.09-.43-1.06-.52-1.05-.5-1.05-.52-1-.53-1-.55-1-.58-1-.6-.94-.6-.93-.64-.88-.63-.87-.65-.83-.67-.82-.68-.77-.67-.73-.7-.68-.68-.67-.68-.62-.7-.56-.69-.54-.7-.48-.68-.45-.67-.4-.7-.38-.28-.14-.33-.16-.32-.14-.32-.13-.31-.12-.3-.11-.32-.1-.3-.09-.3-.08-.3-.07-.28-.06h-.29l-1-.15-1-.12-1-.08h-2zm-30.65 50.76h-.05z"/></g></svg>
assets/img/no-products.svg ADDED
@@ -0,0 +1 @@
 
1
+ <svg viewBox="0 0 923.65 1082.82" xmlns="http://www.w3.org/2000/svg"><g fill-rule="evenodd"><path d="m296.42 899.72h6.81l3.44.07 3.45.1h.2l.18-.1 1.48-.68 1.49-.63 1.53-.48 1.5-.5 1.5-.5 1.5-.43 1.52-.37 1.51-.35 1.52-.31 1.53-.27 1.54-.25 1.55-.23 1.53-.19 1.57-.18 1.55-.15 1.56-.12 1.57-.11 1.55-.04 1.59-.08h7.93l3.18.05 3.19.09 3.11-.06 3.15.17 3.12.18 3.07.2 3.05.22 5.83.47 5.57.46 5.15.42 2.38.18 2.23.15 2.09.14 1.88.1h11.98l8.87-.07 8.87-.12 8.86-.15 8.9-.18 8.89-.2 17.85-.45 16.88-.42 1-.08 2-.13 2.58-.15 3.05-.15 3.39-.14h11.56l2 .08h3.55l.15-.15 1.22-1 1.06-.73.95-.57 1-.53 1.24-.55 1.23-.45 1.12-.35 1.05-.27 1-.22 1-.18.93-.15 1-.15 1.75-.2 1.86-.15 1.9-.12 2-.08h12.53l4.3.13 4.27.17 4.11.2 3.85.2 3.52.21 5.53.34 1.77.1h1l3 .08 3.15.13 3.13.14 3.12.16 6.15.35 6.08.39 6 .38 6 .37 3 .15h.18l1.45-.05 6.08-.2 6.09-.2 6.1-.16 6.11-.15 6.14-.14 6.13-.1 6.15-.05h6.62l3-.2 2-.12 2.25-.08 2.41-.07h5.4l1.4.05 1.44.08 1.45.1 1.46.13 1.49.19 1.5.21 1.53.27 1.57.33 1.5.39.9.26.83.29.87.3.86.33.89.4.91.43.94.5 1 .57 1 .65 1.2.9.57.52.93-.2 1.92-.39 1.91-.35 2-.35 2-.31 2.05-.27 2-.23 1.1-.1 1.08-.07 1.08-.07h4.47l1.15.05 1.17.08 1.16.12 1.19.13 1.2.19 1.2.21 1.21.27 1.22.3 1.23.35 1.24.4 1.23.45 1.23.52 1.24.55 1.21.61 1.2.67 1.19.73 1.16.79 1.14.83 1.11.9 1.07.95 1.1 1.05.8.83.85 1.05.87 1.24.85 1.5.76 1.75.6 2 .35 2.28v2.43l-.37 2.45-.7 2.29-1 2-1.1 1.72-1.15 1.4-1.13 1.13-1.08.9-1.19.85-1.6.94-1.58.73-1.38.53-1.27.4-1.17.34-1.1.25-1.06.21-1 .19-1 .16-1 .15-1.85.24-1.82.18-1.72.17-3 .25-1.14.11-.91.1-3.54.45-3.53.42-3.42.38-3.33.35-3.27.32-3.2.3-3.18.25-3.17.23-3.16.2-3.19.19-3.23.16-3.3.14-3.37.13-3.48.1-3.6.1-3.68.08h-2.15l-2.44.14-2.6.15-2.81.2-3 .25-3.15.26-6.75.6-7.19.64-3.75.31-3.81.32-3.89.28-3.91.29-4 .25-4 .2-4 .16-2 .09-2 .05h-12l-2-.07-2-.08-1.95-.1-1.93-.14-1.93-.15-1.92-.18-1.92-.22-1.88-.23-1.88-.27-1.87-.3-1.85-.33-1.4-.28h-4.05l-2.72.12-2.71.1-5.29.17-10.11.3-4.79.16-2.28.1-2.27.12-8.5.43-8.56.42-8.59.4-3.13.13.4.05 1.27.24 1.41.33 1.5.48 1.17.49 1.2.58 1.4.87 1.62 1.26 1.8 1.9.81 1.29.82 1.5.63 1.6v.1l.48 1.83.23 1.88v1.95l-.25 1.84-.35 1.66-1.21 2.74-1.34 2-1.26 1.4-1.12 1-1 .77-.88.61-.77.45-.88.5-.87.45-1.56.79-1.64.71-1.63.67-1.64.83-1.64.52-1.6.47-1.61.41-1.59.37-1.58.32-1.55.26-1.55.24-1.52.21-1.5.17-1.48.15-1.47.13-1.43.1-1.45.09-2.75.15-2.68.1-2.59.1-2.48.1-2.42.11-1.1.07-1.11.08-1.07.09-1.13.11-4.15.44-4.24.41-4.23.4-4.22.37-4.23.37-4.22.31-4.23.32-4.22.28-4.21.29-4.22.23-4.22.23-4.21.2-4.24.19-4.21.16-4.22.15-4.22.12-4.21.18-4.22.08-4.22.07h-21.11l-4.22-.05-4.23-.1-4.24-.1-4-.1-.76.16-4.19 1-4.2.9-4.18.85-4.2.84-4.2.78-4.2.75-4.22.72-4.2.68-4.21.65-4.22.6-4.22.58-4.21.55-4.22.54-4.22.48-4.21.47-4.22.45-4.22.4-4.23.38-4.22.37-4.21.33-4.22.32-4.22.3-4.21.26-4.22.25-4.22.24-4.2.2-4.21.2-4.2.18-2.3.08-2.54.44-2.56.41-2.57.4-2.58.4-2.59.37-2.58.37-2.58.33-2.59.33-2.54.32-2.67.32-3 .4-3.25.43-3.45.45-3.61.44-1.9.21-1.9.19-2 .18-2 .17h-.47l-.63.19-1.07.26-1.08.24-1.08.2-1.09.16-1.08.14-1.08.1-1.1.06h-3.3l-1.12-.06-1.13-.1-1.14-.15-1.13-.2-1.17-.24-1.16-.3-1.17-.35-.52-.16-1-.13-1-.15h-.07l-2.38.18-2.4.15-2.42.1h-6.1l-1.21-.05h-1.24l-1.23-.08-1.23-.1-1.24-.12-1.23-.13-1.23-.17-1.24-.18-1.23-.22-1.23-.23-1.24-.27-1.23-.28-1.23-.34-1.24-.35-1.23-.4-1.22-.43-1.23-.47-1.22-.5-1.2-.56-1.21-.59-1.19-.65-1.18-.7-1.37-.86-1.48-1.12-2-2-.94-1.47-.78-1.43-.6-1.5-.45-1.3-.45-2.91.17-2.9.7-2.71 1.1-2.3 1.48-2.14 2-2 2-1.33 1.55-.77 1.25-.5 1-.33 1-.27 1.45-.32 1.43-.23 1.33-.18 1.27-.14 1.22-.11 1.16-.09 2-.13 1.5-.1 3.81-.25 3.84-.28 2.86-.22.92-.92 1.95-1.36 2.15-1 2.3-.63 2.37-.24h2.68l.63-.47.94-.67 1-.63 1-.6 1-.58 1-.55 1-.54 1-.5 1-.5 1-.46 1.05-.45 1.07-.44 1.07-.41 1.08-.4 1.1-.37 1.12-.37 1.11-.33 1.12-.32 1.13-.3 1.15-.28 1.15-.25 1.17-.23 1.18-.2 1.17-.2 1.2-.15 1.2-.14.55-.05-.37-.08-1.16-.28-1.15-.32-1.17-.32-1.15-.35-1.15-.36-1.15-.4-1.15-.42-1.23-.47-.95-.41-1.54-.79-.91-.66-1.87-1.55-1.57-1.85-1.11-1.9-.87-2-.55-2.1-.21-2.17-9.42 3.27-3.75 1.3-2.12.7-4.6 1.38-4.61 1.37-4.79 1.37-2.5.7-2.5.68-2.55.68-2.58.67-2.63.65-2.64.63-2.68.62-2.7.6-2.72.57-2.73.55-2.77.51-2.76.49-2.79.43-2.8.4-2.81.37-2.8.31-2.79.25h-.16l-1.29.08-1.41.07-1.42.07-1.42.05h-7.06l-1.4-.07-1.42-.06-1.4-.1-1.4-.17-1.4-.13-1.4-.15-1.4-.19-1.4-.2-2.08-.33-1.83-.5-1.49-.6-1-.46-1-.47-1.69-.88-1.73-1-1.73-1-1.34-.84-1.41-.16-1.2-.12h-4.95l-1.77-.08-1.77-.09-1.76-.13-1.75-.13-1.75-.17-1.74-.2-1.76-.27-1.73-.25-1.72-.29-1.72-.31-1.7-.37-1.68-.38-1.68-.44-1.67-.46-1.67-.5-1.63-.57-1.63-.6-1.64-.65-1.6-.7-1.58-.8-1.57-.81-1.75-1-1.45-1-2.06-1.87-1-1.4-1.17-2.08-.85-2.27v-.08l-.42-2-.13-2 .17-2v-.17l.4-1.86.65-1.79.89-1.68.05-.08 1.18-1.65 1.38-1.47 1.07-1 2-1.25 1.48-.68 1.32-.48 1.51-.42 1.34-.27 1.15-.16 1-.12 1-.1h.94l1-.05h3.35l3.08.22 2.69.2 2.38.22 2.15.23 1.95.23 1.78.24 1.65.23 1.52.23 2.88.45 1.45.22 1.57.23 1.72.22 2 .23 2.25.25h.6l.13-.56.58-1.32.85-1.65 1.05-1.52.1-.11 1.14-1.38 1.47-1.23 1.2-.89 2.18-1.06 1.7-.59 1.35-.33 1.12-.18 1.06-.15 1.49-.1h3.96l2.12.1 1.75.1h30.46l1.85.05 1.89.09 1.93.11 2 .15 2 .19 2.1.23 2.15.28 2 .3.86.14 1 .11 3 .29 4.48-.09 6-.15 6-.16 6-.22 6-.23h.95l-.28-.63-.6-2-.3-2.08v-2.58l.48-2.53.9-2.42 1.32-2.22 1.66-2 2-1.65 1.85-1.08 2-.82 2.07-.52 2.13-.21 1.47-.05 2 .3 1.05.23 1.21.32 1.24.36 2.56.79 2.87.86 1.42.42 1.35.4 1.21.33 1 .25.77.17h.16l1.69.22 1.76.18 1.8.17 1.82.15 1.85.12 1.87.1 1.9.08 1.68.07h51.2l.83-.08 1.09-.05h4.66l1.54.05 1.23.07 1.07.06 2.51.4 2.42.8 2.23 1.2 2 1.59 1.7 1.88 1.37 2.15.13.33h10.04zm-87.32 57.86h.17-.34z" fill="#808080"/><path d="m419.77 413.53 1.43.19 1.37.26 1.3.35 1.4.44 1.45.58 1.53.77 1.45.93 1.35 1 1.22 1.14 1.08 1.21.93 1.24.79 1.25.65 1.23.53 1.22.43 1.18.34 1.13.25 1.1.2 1.07.13 1 .08 1v1.98l-.09 1.6-.2 1.67-.26 1.58-.37 1.52-.42 1.48-.48 1.44-.55 1.41-.5 1.17-.1.22-.68 1.36-.75 1.34-.82 1.31-.9 1.32-1 1.28-1 1.19-.67.71-.63.64-.69.61-.71.62-.79.6-.81.6-.89.57-.95.55-1 .51-1.09.47-1.15.43-1.23.37-1.3.28-1.35.2-1.42.1h-1.43l-1.45-.13-1.38-.23-1.22-.3-1.15-.37-1.13-.45-1.12-.47-1.07-.6-1-.69-.93-.71-.9-.8-.82-.83-.75-.87-.67-.88-.6-.9-.51-.92-.55-1.07-.64-1.61-.51-1.74-.32-1.7-.17-1.61v-1.57l.09-1.52.16-1.46.09-.39.21-1 .4-1.38.5-1.35.25-.59v-1.81l.05-1 .12-1 .15-1 .2-1 .26-1 .32-1.07.27-.77.11-.31.49-1.1.56-1.1.67-1.12.75-1.1.87-1.12 1-1.06 1.08-1 1.22-1 1.32-.9 1.41-.8 1.49-.68 1.53-.55 1.57-.42 1.58-.28 1.57-.14h1.51zm3.38 29.8-.28.15 1.18-.61v-.22.22l.05-.64v-.48l.05.52-.09-1.07.09.5-.19-1.15.12.47-.27-1-6.35 4.41h1.14-.35l1.18-.08-.35.05 1.23-.17-.31.07 1.25-.29-.32.1 1.27-.4-.3.12zm.65-.3.25-.15zm.05-3.08.1.3zm-6.33-15.72h-.75l.48.15.9.3.58.26 1.52 2.19 5.55.13-.37-.33.19.16-1.05-.8.2.17-1.2-.75.21.13-1.31-.65.21.1-1.45-.55.24.1-1.54-.41.25.06-1.58-.26.25.05-1.6-.1z" fill="#fff"/><path d="m463.47 357.9 1.9.33 1.83.57 1.73.83h.09l1.45.93 1.33 1.1 1.2 1.34 1 1.23 1.22 2.27.55 1.45.37 1.2.28 1 .25 1 .25 1.06.45 2.12.43 2.35.44 2.55.43 2.75.42 2.93.25 1.94.43.71.73 1.45.64 1.5.48 1.4.4 1.34.33 1.31.3 1.3.25 1.3.22 1.3.2 1.34.17 1.36.15 1.39.15 1.41.11 1.44.1 1.46.1 1.5.07 1.54.07 1.55.05 1.58v6.53l-.05 3.39-.1 3.41-.15 3.44-.2 3.41-.13 1.75-.13 1.72-.14 1.72-.16 1.7-.17 1.68-.2 1.67-.2 1.66-.22 1.64-.21 1.61-.07.35-.08 1.12-.17 1.6-.18 1.58-.22 1.55-.12.79.42.8.45 1.05.42 1.1.35 1.16.26 1.2.2 1.24.14 1.25v2.51l-.12 1.24-.18 1.21-.07.3-.23.85-.39 1.12-.51 1.23-.87 1.72-.98 1.67-1.13 1.49-1.15 1.26-1.15 1.12-1.16 1-1.14.87-1.13.78-1.12.69-1.11.63-1.1.57-1.1.53-1.09.48-1.1.45-1.08.42-1.1.38-1.1.37-1.1.33-1.12.32-1.11.3-1.12.28-1.12.27-1.13.23-1.12.24-1.15.2-1.13.18-1.13.18-1.15.17-1.14.13-1.15.14-1.13.11-1.15.09-1.15.08-1.13.07-1.14.05h-5.65l-1.13-.07-1.12-.08-1.13-.12-1.12-.14-1.13-.17-1.13-.18-1.15-.24-1.15-.26-1.19-.32-1.2-.37-1.25-.46-1.27-.52-1.53-.71-1.58-.94-1.7-1.31-1.52-1.52-4.93 1.55-2.69.83-2.71.85-2.77.82-2.8.82-2.82.8-2.83.75-2.83.7-1.45.35-1.44.33-1.43.3-1.43.3-1.44.27-1.45.26-1.43.24-1.43.21-1.45.2-1.44.17-1.45.15-1.45.12-1.45.08h-4.38l-1.48-.06-1.49-.12-1.5-.17h-.28l-1.23-.17-1.52-.28-1.55-.35-1.53-.43-1.57-.5-1.45-.59-.88-.38-1.3-.62-2.1-1.31-1.19-1.12-1.11-1.25-1-1.35-.93-1.45-1.07-3-.4-2.71v-2.27l.28-1.82.43-1.7.72-1.85.8-1.55.15-.21-.32-.32-1.41-2.07-1.05-2.2-.64-2.18-.28-2-.05-1.8.13-1.58.24-1.37.3-1.18.33-1.05.35-.93.37-.84.4-.86.48-.89v-.06l-.72-1-.66-1.08-.59-1.17-.5-1.2-.4-1.23-.3-1.25-.21-1.24-.12-1.21v-1.19l.06-1.35.24-1.86.46-1.89.59-1.65.65-1.46.7-1.3.71-1.19.74-1.06.73-1 .77-.91.75-.87.76-.83.79-.79.8-.76.78-.75.82-.72.81-.7.84-.7.88-.7 1.67-1.3 1.73-1.28 1.78-1.27 1.79-1.23 1.8-1.2 1.8-1.15 1.78-1.14 1.77-1.08 1.71-1.05 1.7-1 3.12-1.81 2.8-1.6 2.32-1.3 1.68-.94.92-.53 1.65-1 .23-.14 2.55-1.48 1.45-.82 1.5-.81 1.55-.8 1.58-.79 1.59-.73.95-.38.56-.22 2.44-2 2.66-2.07 2.42-1.85 2.1-1.36 2.32-1 1.8-.42 1.36-.83 1.39-.82 1.4-.78 1.4-.77 1.4-.73 1.41-.7 1.42-.7 1.42-.67 1.41-.63 1.42-.63 1.42-.6 1.4-.59 1.41-.58 2.72-1.05 2.7-1 2.62-.92 2.51-.85 2.4-.76 2.29-.7 2.11-.64.43-1.07.65-1.33 1.18-1.85.94-1 1.6-1.48 1.8-1.24h.08l2.12-1 2.26-.65 2.35-.25h.07z" fill="#808080"/><path d="m69 892.63 12.82.17 6.5.07h19.62l3.25-.06 3.25-.09 3.23-.11 3.22-.14 3.2-.16 3.16-.19 3.15-.23 3.14-.27 3.1-.28 3.05-.33 3-.39 3-.41 1.47-.22 1.46-.23 1.47-.24 1.45-.26 1.46-.26 1.42-.28 1.4-.29 1.4-.3 1.95-.45 2-.45 2-.48 1.95-.5 4-1 4-1.06 4-1.07 4.08-1 2.07-.52 2.07-.5 2.1-.5 2.1-.48 2.11-.45 2.12-.43 2.15-.42 2.15-.38 2.17-.35 2.18-.32 2.2-.28 2.22-.24 2.23-.2 2.25-.15 2.23-.1h5.77l1.15.05 1.17.06 1.15.07 1.18.1 1.13.1 4 .4 4 .37 4 .35 4 .35 4 .31 4 .3 4 .3 4 .27 4 .27 4 .23 3.95.23 4 .2 4 .2 3.95.19 4 .16 3.95.15 3.95.14 3.95.13 3.95.12 4 .08 3.95.08 3.93.09h3.95l3.95.05h23.7l7.9-.1 7.92-.14 7.92-.18 7.93-.22 7.93-.26 7.95-.3 7.95-.34 8-.38 8-.4 8-.43 8-.47 8.05-.5 8.05-.53 8.08-.55 8.1-.57 8.13-.6 8.19-.62 1.63-.11 1.68-.09h8.35l1.67.08 1.65.08 1.67.12 1.65.13 1.63.15 1.65.17 1.63.18 1.64.2 1.65.2 3.23.47 3.23.5 3.22.53 3.2.55 3.17.57 3.16.58 5.81 1.13 3.1.55 3.08.53 3 .52 3 .47 3 .43 1.47.18 1.5.19 1.46.16 1.49.15 1.46.14 1.45.11 1.45.1 1.45.09 1.44.06h7.05l1.38-.06 1.37-.09 1.36-.11 1.37-.15 1.35-.17 1.35-.2 1.33-.22 1.4-.26 2.14-.42 2.23-.4 2.23-.4 2.25-.37 2.27-.35 2.27-.35 2.3-.31 2.28-.3 2.32-.27 2.3-.27 2.33-.25 2.33-.23 2.34-.22 2.35-.2 2.36-.18 2.37-.17 2.37-.16 2.36-.14 2.39-.13 2.4-.12 2.38-.1 2.42-.08 4.78-.13 4.83-.09 4.82-.05h9.67l4.83.08 4.83.1 4.82.15 4.82.17 4.78.2 4.77.21 4.75.25 4.71.27 4.7.28 4.65.3 4.62.32 4.57.32 9 .66 8.76.67 2.92.2 2.88.2 2.89.17 2.88.13 2.88.13 2.89.1 2.9.09 2.88.08 2.9.05h14.47l2.9-.05 2.9-.07 2.9-.06 2.9-.09 5.81-.2 5.82-.25 5.83-.3 5.82-.31 5.83-.35 5.85-.37 5.84-.4 11.71-.83 11.74-.85 11.75-.82 5.9-.4 5.9-.38 5.9-.34 5.9-.33 5.91-.28 5.94-.24 5.91-.2 3-.08 3-.07 3-.05h8.95l1.62.17 1.56.46 1.45.77 1.27 1 1 1.27.79 1.43.46 1.57.17 1.62-.15 1.63-.48 1.54-.76 1.43-1 1.27-1.26 1-1.44.78-1.54.52-1.62.15h-5.8l-2.9.05h-2.88l-2.9.07-2.89.06-5.8.2-5.8.24-5.81.28-5.82.32-5.82.35-5.83.36-5.83.39-11.72.83-11.72.85-11.76.82-5.89.4-5.91.38-5.9.35-5.92.33-5.93.3-5.94.25-5.93.22-3 .08-3 .07-3 .07h-18l-3-.07-3-.07-3-.08-3-.12-3-.13-3-.15-3-.17-3-.2-3-.21-8.77-.67-8.95-.67-4.53-.31-4.57-.3-4.58-.3-4.63-.29-4.65-.25-4.67-.25-4.68-.21-4.7-.2-4.7-.17-4.72-.13-4.72-.12-4.7-.07h-14.08l-4.65.1-4.65.14-2.3.08-2.3.08-2.28.12-2.29.12-2.28.13-2.27.15-2.25.17-2.25.18-2.23.18-2.23.2-2.22.24-2.2.23-2.18.25-2.17.27-2.17.26-2.15.3-2.13.32-2.12.33-2.1.35-2.08.37-2.07.38-2.11.4-1.62.32-1.68.28-1.7.24-1.67.21-1.68.17-1.69.15-1.68.12-1.67.06-1.68.07h-5l-1.65-.05-1.67-.06-1.65-.1-1.65-.1-1.65-.14-1.63-.16-1.65-.17-1.63-.18-1.64-.2-1.46-.09-3.23-.47-3.22-.5-3.22-.53-3.2-.55-3.16-.59-6.3-1.15-3.14-.58-3.1-.55-3.08-.55-3-.5-3-.47-3-.43-1.48-.18-1.48-.19-1.49-.16-1.48-.15-1.47-.14-1.45-.11-1.45-.1-1.45-.09-1.43-.05h-7.08l-1.39.07-1.41.1-8.15.62-8.17.6-8.15.58-8.12.55-8.11.53-8.1.5-8.07.47-8.07.45-8.06.4-8 .38-8 .34-8 .3-8 .26-8 .24-8 .18-8 .13-8 .1h-24l-4-.05-4-.06-4-.07-4-.08-4-.1-4-.1-4-.14-4-.13-4-.17-4-.16-4-.19-4-.2-4-.21-4-.24-4-.23-4-.27-4-.28-4-.3-4-.3-4-.33-4.05-.35-4-.35-4-.39-4-.4-1-.08-.94-.07-.93-.06h-7.22l-1.9.09-1.89.13-1.88.17-1.9.2-1.9.25-1.9.26-1.92.32-1.91.33-1.92.39-1.93.38-1.95.43-1.94.44-2 .46-2 .49-2 .48-4 1-4 1.05-4.05 1.07-4.07 1.05-2.06.53-2.07.5-2.08.49-2.1.48-1.55.33-1.59.34-1.58.3-1.58.3-1.59.28-1.6.27-1.61.25-1.64.25-3.21.45-3.27.4-3.3.36-3.3.32-3.32.27-3.33.23-3.35.22-3.35.16-3.37.15-3.36.12-3.37.08-3.37.07h-13.31l-6.61-.05-6.57-.06-12.82-.17-6.2-.07h-40.4l-.28.06-.28.07-.89.25-1 .32-1.1.35-1.2.4-1.25.36-.72.2-.73.19-.77.16-.82.15-.86.14-1 .06h-1.07l-.75-.07-.9-.11-.35-.07-1.06-.27-.32-.11-.88-.32-.48-.21-.45-.27-.63-.4-.14-.08-.6-.47-.13-.1-.57-.47-.1-.1-.54-.58-.1-.14-.46-.63-.09-.13-.4-.64-.25-.46-.36-.82-.27-.78-.2-.77-.1-.5-.13-1.68.17-1.64.48-1.55.78-1.43 1.05-1.27 1.27-1 1.45-.77 1.57-.47 1.61-.15 1.64.17 1.55.48 1.11.6.82-.26 1.17-.37 1.25-.4 1.33-.38.77-.2.76-.17.82-.17.87-.11 1-.1h41.28zm-52.51 7.62v-.08l-.1-.39-.13-.4z"/><path d="m365.47 647.05.85.15.85.23.8.32.76.42.74.48.66.55.62.63.53.69.47.73.38.78.3.82.22.85.12.87v1.73l-.05 1-.07 1-.08 1-.1 1-.13 1-.15.94-.19 1-.18.93-.2.93-.23.92-.24.93-.26.92-.27.93-.57 1.79-.63 1.81-.68 1.79-.72 1.76-.75 1.75-.78 1.75-.82 1.72-.83 1.72-.84 1.41-.87 1.68-.88 1.65-.88 1.64-.9 1.61-1.77 3.12-1.7 3.1-1.73 2.9-1.59 2.82-.73 1.33-.7 1.3-.67 1.27-.58 1.28-1.45 2.95-1.44 3-1.4 3-1.39 3.05-1.32 3.05-1.34 3.12-1.3 3.13-1.3 3.15-1.26 3.18-1.27 3.19-1.28 3.18-1.25 3.27-2.47 6.51-2.43 6.55-2.45 6.59-2.45 6.6-2.5 6.6-1.27 3.31-1.27 3.3-1.3 3.29-1.31 3.3-1.34 3.26-1.36 3.29-1.39 3.25-1.41 3.25-1.45 3.23-1.45 3.15-.79 1.73-.73 1.67-.72 1.7-.7 1.72-.66 1.71-.65 1.72-.63 1.75-.62 1.76-.6 1.77-.6 1.78-.57 1.8-.56 1.79-1.1 3.65-1.09 3.7-1.05 3.7-1 3.75-2.15 7.55-1.08 3.82-1.13 3.82-.59 1.91-.6 1.92-.61 1.93-.6 1.84-.07.18v.08l-.1.44-.08.45-.07.56-.06.65-.05.72v10.78l-.07 1.12-.12 1.17-.15 1.18-.21 1.22-.34 1.21-.2.72-.22.63-.25.68-.28.67-.32.68-.38.69-.43.7-.49.7-.53.68-.62.65-.68.63-.73.6-.79.54-.83.48-.87.43-.9.35-.91.27-.92.22-.9.15-.67.05h-1.73l-.87-.15-.83-.23-.82-.32-.76-.42-.74-.48-.66-.55-.6-.63-.55-.69-.47-.73-.38-.78-.3-.82-.22-.85-.15-.87v-.88l.07-.87.13-.85.24-.85.33-.8.4-.78.48-.72.57-.68.62-.6.68-.55.73-.47.79-.38.05-.57.05-.7v-9.7l.05-1.13.07-1.17.12-1.18.16-1.22.22-1.23.27-1.22.2-.7.18-.56.62-1.89.56-1.8.57-1.8.55-1.81 1.08-3.67 1.07-3.7 2.14-7.52 1.07-3.79 1.07-3.8 1.11-3.81 1.15-3.8.62-1.94.62-1.91.63-1.92.65-1.93.68-1.92.7-1.92.72-1.91.75-1.92.78-1.92.8-1.91.84-1.9.85-1.87 1.43-3.1 1.37-3.07 1.36-3.11 1.32-3.12 1.32-3.15 1.3-3.18 1.26-3.19 1.27-3.21 1.25-3.24 1.25-3.23 2.45-6.53 2.45-6.55 2.43-6.6 2.47-6.6 2.48-6.59 1.27-3.3 1.28-3.28 1.3-3.28 1.3-3.29 1.35-3.25 1.35-3.26 1.39-3.24 1.41-3.21 1.44-3.22 1.48-3.18 1.52-3.17 1.55-3.15.71-1.42.75-1.43.79-1.45.8-1.47 1.65-2.91 1.71-3 1.72-3 1.72-3.05.83-1.52.83-1.52.8-1.51.8-1.52.75-1.52.74-1.5.71-1.48.65-1.48.64-1.45.58-1.44.53-1.41.49-1.39.45-1.4.18-.63.18-.65.17-.65.17-.63.13-.64.12-.61.11-.6.1-.6.1-.65v-.56l.05-.55.05-.55v-1.14l.07-.87.15-.85.23-.85.32-.8.42-.78.48-.72.57-.66.61-.62.69-.53.73-.47.78-.38.84-.3.83-.22.87-.13h.86zm27.53 6.95.83.1.82.18.8.27.77.35.73.42.68.5.64.55.56.63.52.67.43.73.35.77.29.8.2.81.1.84v1.93l-.06 1.23-.1 1.22-.15 1.22-.19 1.2-.21 1.2-.25 1.18-.29 1.17-.31 1.16-.34 1.15-.36 1.15-.4 1.14-.42 1.13-.43 1.12-.45 1.1-.49 1.1-.48 1.1-.52 1.08-.51 1.08-.55 1.09-.55 1.06-.59 1.07-1.15 2.08-1.2 2.09-1.23 2.06-1.27 2-1.26 2-1.29 2-1.28 2-2.53 3.88-1.24 1.9-1.2 1.89-1.16 1.85-1.14 1.81-1.06 1.79-1 1.75-.95 1.71-.43.82-.42.83-.42.82-.38.8-.35.78-.35.77-.32.75-.28.75-.27.72-.26.76-1.22 3.64-1.25 3.68-2.53 7.32-2.55 7.3-2.57 7.25-5.15 14.48-2.56 7.22-2.52 7.21-2.48 7.22-1.23 3.6-1.2 3.62-1.2 3.61-1.17 3.64-1.16 3.62-1.14 3.63-1.13 3.65-1.1 3.63-1.07 3.65-1.05 3.67-1 3.67-1 3.68-1 3.68-1 3.84-.32 1.13-.41 1.3-.49 1.37-.53 1.43-.58 1.52-.65 1.61-1.37 3.42-1.55 3.68-1.67 3.92-1.66 3.95-1.65 4-1.59 3.88-.73 1.88-.72 1.82-.65 1.75-.6 1.67-.53 1.56-.48 1.45-.39 1.3-.31 1.17-.12.47-.08.43-.09.37v.11l.13.49.12.83v.85l-.05.85-.13.83-.23.8-.3.8-.39.75-.45.7-.53.67-.58.6-.65.55-.7.47-.75.4-.79.31-.8.25-.83.15-.83.09h-.85l-.84-.1-.83-.18-.8-.27-.77-.33-.73-.44-.68-.48-.64-.57-.58-.61-.5-.67-.43-.73-.14-.24-.28-.6-.25-.63-.1-.35-.15-.5-.13-.54-.07-.31-.12-.8-.06-.69v-1.91l.06-.85.12-.84.13-.81.15-.82.19-.82.2-.83.43-1.63.52-1.7.56-1.77.64-1.83.68-1.87.72-1.93.75-1.95.8-2 1.63-4 1.7-4.07 1.68-4 1.64-3.83 1.51-3.62 1.34-3.27.58-1.45.52-1.35.45-1.18.35-1 .25-.78.18-.65.95-3.72 1-3.82 1-3.8 1.07-3.78 1.08-3.78 1.1-3.75 1.14-3.74 1.15-3.73 1.16-3.72 1.19-3.7 1.21-3.7 1.22-3.68 1.23-3.67 1.24-3.68 2.51-7.28 2.55-7.29 2.57-7.25 5.15-14.48 2.55-7.22 2.53-7.23 2.5-7.25 1.22-3.62 1.23-3.68.35-1 .4-1.05.42-1 .43-1 .47-1.05.47-1 .5-1 .5-1 .53-1 .55-1 1.1-2 1.15-2 1.2-2 1.23-2 1.24-2 1.26-2 1.27-2 2.53-3.88 1.25-1.92 1.22-1.92 1.2-1.88 1.15-1.88 1.12-1.85 1.06-1.85 1-1.84.47-.86.46-.9.44-.87.43-.88.4-.87.38-.85.37-.85.35-.83.32-.82.3-.82.26-.8.27-.78.22-.78.2-.75.18-.75.17-.74.11-.71.12-.7.08-.69v-2.11l.07-.85.13-.84.24-.81.3-.79.38-.75.47-.7.53-.66.58-.6.65-.54.7-.46.75-.4.79-.32.81-.25.82-.15.85-.07zm-78.3 232.38-.05-.18-.2-.35z"/><path d="m395.53 658.87h.22l.63.09.64.13.23.07.53.15.52.2.25.08.4.18.4.2.25.14.65.38.55.35.73.58.5.42.6.6.55.63.49.7.4.74.33.78.25.8.17.83.08.84v.85l-.08.83-.18.83-.25.8-.34.79-.41.73-.49.68-.55.64-.61.58-.69.52-.13.08v.67l.05 1.11.06 1.17.17 2.52.22 2.58.23 2.63.22 2.59.18 2.48.08 1.23.07 1.17v5.5l-.05 1.62-.07 1.61-.08 1.6-.1 1.6-.22 3.15-.28 3.14-.3 3.11-.32 3.09-.33 3.05-.32 3-.31 3-.29 3-.25 3-.21 3-.1 1.45-.07 1.47-.07 1.45v13.27l-.08 4.45-.09 4.45-.11 4.43-.15 4.45-.17 4.43-.17 4.44-.2 4.43-.2 4.43-.45 8.85-.46 8.84-.5 8.85-.49 8.81-.46 8.84-.45 8.81-.2 4.4-.19 4.42-.18 4.4-.15 4.4-.15 4.42-.12 4.4-.08 4.4-.08 4.4v9.68l-.14.83-.2.82-.3.78-.38.77-.45.72-.52.66-.58.6-.63.55-.7.49-.74.4-.78.33-.8.25-.83.17-.84.08h-1.06l-.83-.08-.83-.19-.8-.25-.79-.33-.73-.42-.68-.48-.65-.55-.59-.62-.5-.66-.45-.72-.36-.77-.3-.78-.2-.82-.14-.83v-5.33l.05-4.52.06-4.5.1-4.48.12-4.49.13-4.48.17-4.48.17-4.47.2-4.45.2-4.47.45-8.88.48-8.87.48-8.85.49-8.81.48-8.8.43-8.79.2-4.38.2-4.38.17-4.37.17-4.37.13-4.36.12-4.37.1-4.35.06-4.35v-12l.05-1.65.07-1.63.08-1.62.1-1.63.24-3.17.26-3.17.3-3.13.32-3.1.33-3 .32-3 .32-3 .28-3 .27-2.93.21-2.93.09-1.44.06-1.43.07-1.43.05-1.44v-4.45l-.05-1-.07-1-.18-2.3-.22-2.52-.21-2.65-.24-2.73-.18-2.72-.08-1.37-.05-1.35v-5.2l.1-1.28.16-1.23.12-.72.15-.68.18-.74.24-.75.31-.81.42-.87.32-.53.25-.4.26-.39.14-.18.35-.43.38-.42.15-.17.47-.43.5-.4.16-.12.64-.43.65-.35.18-.1.72-.3.73-.25.2-.05.77-.18.8-.1h.93zm28.79-8.37.83.08.83.17.8.27.77.33.75.42.68.48.64.55.58.62.52.66.45.72.36.77.29.78.21.82.12.83v6.07l-.05 5.26-.1 5.25-.14 5.25-.15 5.25-.2 5.25-.2 5.25-.25 5.25-.25 5.24-.26 5.25-.3 5.25-.3 5.25-.64 10.46-.65 10.49-.66 10.48-.63 10.47-.3 5.23-.28 5.23-.27 5.25-.27 5.22-.23 5.23-.2 5.24-.18 5.23-.17 5.23-.12 5.24-.1 5.21-.06 5.24v6.78l-.07 2.35-.28 6.88-.35 9-.37 9.94-.15 5-.13 4.77-.1 4.42-.07 3.93v6.14l.17.83.1.83v.86l-.08.84-.15.83-.25.8-.34.78-.4.74-.48.7-.53.65-.62.58-.67.52-.7.45-.76.38-.79.3-.81.22-.84.13-.85.05h-.83l-.83-.12-.82-.22-.8-.28-.77-.37-.71-.43-.53-.4-.52-.45-.46-.49-.44-.51-.4-.55-.34-.6-.3-.62-.05-.13-.23-.6-.18-.64-.12-.5-.15-.86-.13-1.2-.07-1.27-.05-1.38v-5.09l.07-4.08.1-4.53.13-4.85.17-5 .37-10 .35-9 .26-6.85.09-2.2v-6.45l.05-5.33.1-5.33.13-5.34.15-5.33.18-5.32.22-5.3.23-5.3.27-5.3.27-5.28.3-5.28.3-5.27.63-10.52.65-10.5.65-10.46.63-10.44.3-5.21.29-5.2.26-5.19.27-5.18.23-5.18.2-5.17.19-5.17.16-5.16.12-5.15.1-5.14.05-5.13v-5.17l.05-.83.13-.85.22-.82.3-.78.36-.75.53-.92.52-.66.58-.62.65-.55.7-.47.74-.41.81-.29.8-.25.83-.16.84-.07zm-1.55 227.65.35.62-.19-.4-.45-.62z"/><path d="m436 653.85.83.12.82.21.78.3.77.37.71.45.67.52.6.58.55.63.48.7.42.74.33.78.25.8.17.83.08.84v.85l-.08.83-.18.83-.17.55.12.47.15.57.18.58.42 1.33.46 1.39.5 1.38.5 1.35.5 1.27.87 2.16.55 1.35.8 2 .82 1.9.83 1.9.88 1.92.9 1.9.92 1.9.95 1.92 1 1.91 2 3.87 2 3.9 2.05 3.93 2 4 1 2 1 2 1 2.05 1 2.09.95 2.1.93 2.11.92 2.14.86 2.18.85 2.18.82 2.24.77 2.25.71 2.26.35 1.19.34 1.15.33 1.16.3 1.19.3 1.18.28 1.2.27 1.2.23 1.18.59 2.82.6 2.92.63 3 .67 3.13.71 3.22.75 3.32.79 3.38.81 3.47.85 3.51.89 3.55.91 3.6.95 3.64 1 3.66 1 3.65 1.05 3.67 1.16 3.73 1.1 3.63 1.13 3.62 1.15 3.56 1.2 3.54 1.2 3.48 1.25 3.42.62 1.65.65 1.66.63 1.64.65 1.6.65 1.58.65 1.57.67 1.53.67 1.5.66 1.48.67 1.45.68 1.4.69 1.39.68 1.35.68 1.3.7 1.28.69 1.22.7 1.2.68 1.15.7 1.1.75 1.15.3.46.35.6.57 1 .53 1.1.48 1.1.47 1.12.43 1.13.42 1.14.4 1.16.8 2.32.78 2.32.79 2.3.38 1.08.4 1.07.4 1 .4 1 .38.9.4.85.39.75.38.7.15.26.17.27.15.23.15.2.11.17.55.1.8.25.79.32.73.4.7.48.65.53.58.62.54.65.45.72.38.75.3.8.22.81.13.84.07.83v.85l-.13.83-.2.82-.28.8-.37.75-.43.73-.52.67-.57.62-.63.56-.68.49-.74.41-.78.34-.8.26-.82.19-.85.1h-1.56l-1-.11-1-.22-1-.28-1-.34-.89-.41-.83-.45-.78-.49-.72-.51-.68-.55-.64-.55-.58-.57-.53-.6-.52-.58-.48-.6-.45-.6-.42-.6-.42-.62-.38-.62-.38-.65-.67-1.2-.62-1.26-.6-1.27-.55-1.27-.51-1.28-.5-1.27-.56-1.3-.45-1.29-.85-2.43-.78-2.35-.75-2.2-.35-1-.35-.94-.32-.85-.32-.75-.26-.63-.25-.5-.22-.4v-.07l-.12-.16-.78-1.22-.85-1.35-.84-1.38-.83-1.42-.82-1.45-.8-1.47-.78-1.5-.78-1.53-.77-1.57-.75-1.56-.75-1.62-.75-1.63-.73-1.65-.72-1.67-.72-1.7-.7-1.72-.7-1.73-.68-1.75-.67-1.77-.68-1.8-1.32-3.6-1.26-3.65-1.28-3.69-1.22-3.74-1.18-3.76-1.12-3.77-1.1-3.8-1.09-3.78-1-3.78-1-3.77-1-3.75-.95-3.7-.9-3.67-.88-3.6-.84-3.53-.8-3.48-.76-3.39-.74-3.3-.74-3.18-.65-3.1-.62-3-.56-2.83-.22-1-.22-1-.23-1-.25-1-.25-1-.27-1-.28-1-.28-.95-.64-2-.65-1.93-.7-1.94-.75-1.91-.76-1.92-.82-1.92-.85-1.9-.87-1.91-.9-1.92-.91-1.92-.95-1.91-1-1.92-2-3.87-2-3.9-2.05-3.93-2-4-1-2-1-2-1-2.05-1-2.07-1-2.08-.94-2.1-.91-2.13-.85-2.09-.59-1.41-.91-2.3-.55-1.44-.59-1.55-.58-1.61-.57-1.69-.53-1.66-.25-.89-.25-.85-.22-.86-.2-.89-.16-.86-.15-.92-.12-1-.07-1v-1.63l.05-.38.07-.45.1-.45v-.17l.2-.73.05-.15.15-.42.18-.42.07-.13.23-.48.29-.49.06-.11.37-.54.42-.5.08-.1.5-.53.55-.48.1-.09.63-.45.67-.4.12-.06.7-.34.73-.26h.12l.81-.21.85-.14h.84zm2.41 15.95-.8.28.64-.2.35-.18zm17.67-36.8.49.07.86.13.35.09.52.13.52.15.35.13.45.17.41.2.37.18.7.39.68.41.89.65.8.69.7.7.66.7.6.71.55.72.54.75.51.75.49.77.46.78.45.8.45.8.45.87.82 1.66.82 1.77.78 1.82.77 1.86.75 1.92.73 1.93.7 1.95.68 2 .67 2 .65 2 .62 1.95 1.16 3.73 1.07 3.52 1.75 5.93.65 2.2.48 1.53.7 2.07.74 2.13.75 2.14.76 2.13.79 2.13.81 2.15.82 2.15.82 2.14 1.71 4.33 1.75 4.33 1.8 4.35 1.84 4.37 1.88 4.37 1.9 4.4 1.93 4.41 2 4.42 3.93 8.92 4 9 2 4.5 2 4.51 1.95 4.54 1.92 4.53 1.77 4.47 1.87 4.58 1.81 4.58 1.79 4.6.86 2.34.87 2.3.85 2.31.83 2.34.82 2.31.8 2.34.78 2.33.77 2.35.75 2.33.73 2.35.7 2.35.7 2.37.67 2.35.65 2.37.63 2.38.59 2.32.3 1.1.28 1.05.33 1.08.35 1.1.37 1.12.4 1.11.42 1.15.43 1.14.47 1.16.48 1.15.5 1.19.53 1.16.54 1.17.55 1.17.58 1.18.58 1.17.6 1.16.62 1.17.63 1.15.64 1.15.65 1.13.66 1.14.67 1.11.67 1.1.68 1.09.68 1.08.7 1.05.7 1 .7 1 .7 1 .7 1 .79 1 .35.5.38.61.35.62.35.65.5 1.1.43 1.13.37 1.12.3 1.08.25 1.07.22 1 .2 1 .16 1 .29 1.86.23 1.77.25 1.76.6.3.73.48.67.55.62.62.55.66.48.74.38.78.32.82.22.83.15.87v1.75l-.13.85-.22.85-.32.81-.4.77-.46.73-.55.69-.64.61-.66.55-.74.47-.78.4-.55.25-.87.3-.56.17-.74.16h-.25l-.81.11h-2.5l-.54-.12-.48-.12-.2-.05-.47-.15-.46-.17-.19-.06-.45-.2-.41-.22-.19-.08-.76-.47-.19-.13-.66-.5-.17-.15-.58-.54-.39-.4-.56-.66-.47-.67-.4-.63-.35-.64-.32-.66-.43-1.05-.35-1.07-.28-1-.24-1-.2-1-.16-1-.15-.94-.27-1.78-.22-1.66-.25-1.63-.12-.73-.13-.69-.14-.61-.13-.55-.12-.49-.13-.36-.08-.25-.07-.15-.72-.95-.81-1.14-.82-1.15-.8-1.16-.8-1.19-.78-1.2-.79-1.23-.78-1.23-.77-1.25-.75-1.27-.75-1.27-.73-1.3-.73-1.3-.7-1.31-.7-1.32-.69-1.32-.68-1.35-.65-1.33-.63-1.35-.62-1.35-.62-1.37-.58-1.35-.57-1.35-.53-1.36-.53-1.37-.5-1.37-.49-1.35-.45-1.36-.43-1.35-.4-1.37-.38-1.35-.34-1.28-.58-2.29-.58-2.21-.62-2.22-.63-2.22-.65-2.23-.67-2.22-.7-2.23-.72-2.22-.71-2.21-.75-2.24-.77-2.21-.78-2.24-.8-2.23-.82-2.22-.82-2.23-.83-2.22-1.73-4.46-1.77-4.45-1.82-4.45-1.85-4.47-1.88-4.45-1.92-4.47-1.91-4.47-1.95-4.48-3.95-8.93-4-8.9-2-4.47-1.95-4.45-1.93-4.46-1.92-4.45-1.88-4.47-1.83-4.45-1.74-4.42-1.75-4.45-.87-2.25-.85-2.21-.83-2.24-.83-2.23-.8-2.25-.79-2.23-.76-2.24-.79-2.28-.56-1.83-.7-2.34-1.75-5.9-1-3.4-1.12-3.6-.58-1.81-.6-1.82-.62-1.83-.63-1.8-.65-1.79-.65-1.71-.65-1.69-.65-1.58-.65-1.5-.63-1.4-.65-1.28-.29-.57-.3-.53-.28-.5-.27-.45-.25-.4-.23-.34-.22-.3-.2-.06-.8-.34-.76-.43-.72-.5-.65-.57-.6-.65-.52-.68-.45-.75-.36-.8-.29-.82-.2-.85-.1-.86v-.94l.08-.86.17-.85.25-.84.35-.8.41-.76.52-.72.57-.65.63-.6.7-.52.75-.45.8-.36.82-.29.85-.2.86-.1h1.35zm-1.21 16.64h.13-.43zm-77.97-37.57h1l.33.05.34.07.31.08.32.1.33.1.3.12.32.13.3.15.3.15.28.17.29.18.28.2.27.2.25.22.25.21.25.24.23.25.22.25.21.26.2.27.19.27.18.28.17.3.15.3.15.3.11.3.14.32.1.31.08.34.08.31.07.34.05.33.05.33v2.25l-.07.7-.1.74-.23 1.23-.32 1.27-.37 1.26-.4 1.24-.51 1.31-.48 1.25-.52 1.25-.55 1.25-.58 1.27-.6 1.26-.62 1.27-.66 1.3-1.32 2.52-1.37 2.53-1.4 2.5-1.36 2.42-1.34 2.31-2.43 4.25-1 1.84-.92 1.66-.17.3-.16.29-.2.26-.2.29-.2.25-.24.25-.21.25-.25.23-.25.22-.27.21-.27.2-.26.2-.29.19-.28.16-.3.15-.3.15-.32.14-.31.11-.32.1-.32.1-.33.09-.32.06h-3l-.32-.07-.33-.08-.32-.08-.32-.12-.31-.12-.32-.13-.3-.13-.3-.15-.28-.17-.29-.18-.28-.19-.27-.21-.26-.2-.25-.24-.25-.21-.24-.25-.21-.25-.22-.25-.2-.27-.18-.28-.19-.29-.16-.28-.17-.3-.15-.3-.13-.32-.12-.31-.1-.32-.1-.32-.08-.33-.07-.32-.05-.33-.05-.33v-2.01l.05-.33.07-.32.08-.33.1-.32.1-.32.12-.31.13-.32.14-.3.16-.3 1-1.77 1.12-2 2.46-4.3 1.3-2.28 1.34-2.34 1.3-2.35 1.27-2.35 1.22-2.31.57-1.1.53-1.1.5-1 .47-1 .43-1 .4-.93.33-.87.29-.8.23-.72.18-.63.14-.5.08-.45v-1.37l.05-.33.08-.32.07-.33.1-.32.12-.31.11-.32.14-.3.13-.32.17-.28.16-.3.19-.28.18-.27.22-.27.2-.26.23-.25.23-.24.24-.23.25-.23.26-.2.27-.2.28-.2.29-.17.28-.17.3-.16.3-.14.32-.13.31-.12.32-.1.32-.1.33-.08.33-.07h1.34z"/><path d="m444.32 609.3 1.1.07 1.11.11 1.12.15 1.12.22 1.15.27 1.13.35 1.13.41 1.14.5 1.11.57 1 .63.6.4.52.39.51.41.5.42.49.45.46.47.45.46.44.5.41.52.4.53.39.54.36.55.35.56.37.64.58 1.13.54 1.22.48 1.26.42 1.3.36 1.32.32 1.38.27 1.4.23 1.45.17 1.5.13 1.54.1 1.6.07 1.63v2.6l-.06.48-.1.49-.14.48-.15.47-.18.46-.2.45-.23.44-.27.41-.28.4-.3.4-.34.37-.35.35-.36.32-.39.3-.41.28-.42.27-.43.21-.45.22-.47.17-.47.15-.48.11-.48.1-.49.07h-2l-.48-.09-.49-.11-.46-.14-.47-.16-.45-.2-.45-.22-.42-.25-.41-.27-.4-.3-.39-.31-.35-.34-.33-.36-.32-.39-.3-.4-.26-.41-.25-.42-.22-.45-.18-.45-.17-.47-.13-.48-.1-.48-.09-.49v-2.38l-.05-1.23-.07-1.15-.1-1-.1-1-.15-.88-.15-.8-.15-.7-.18-.63-.17-.54-.18-.45-.17-.38-.18-.37-.05-.08-.07-.12-.06-.1-.07-.08-.05-.07-.05-.06-.07-.07h-.1l-.17-.1-.11-.06-.15-.07-.19-.07-.23-.06-.28-.07-.34-.07-.38-.05h-3.56l-.72.05-.75.08-.78.1-.8.1-1.78.28-1.87.32-2 .37-4.25.81-2.25.44-2.35.4-2.4.4-1.25.18-1.25.17-1.28.16-1.28.14-1.32.13-1.32.12-1.33.08-1.37.07h-3.65l-.68.09-.82.13-.9.15-1 .22-1.05.21-1.1.27-2.35.58-2.41.62-2.45.65-2.4.62-2.32.56-1.15.25-1.12.24-1.11.18-1.14.17-1.11.1h-1.4l-.77-.05-.88-.11-.55-.12-.47-.12-.45-.13-.18-.07-.39-.15-.38-.15-.38-.18-.15-.08-.35-.2-.34-.2-.33-.24-.33-.23-.12-.1-.37-.32-.36-.33-.34-.37-.31-.38-.09-.1-.26-.37-.24-.35-.21-.38-.22-.38-.17-.4-.06-.14-.15-.4-.14-.4-.11-.4-.09-.41-.08-.42v-.13l-.05-.47v-1.57l.05-.48.07-.48.12-.47.05-.18.1-.37.11-.37.13-.56.08-.2.17-.38.18-.38.28-.54.49-.75.48-.65.37-.45.31-.38.35-.35.37-.33.38-.32.4-.28.42-.27.43-.23.44-.22.46-.18.47-.17.47-.13.48-.1.5-.07h1.97l.48.07.48.1.49.13.46.15.45.18.45.22.44.23.41.27.1.08.74-.18 2.25-.58 2.43-.64 2.53-.65 2.55-.65 1.32-.3 1.3-.28 1.28-.27 1.27-.23 1.28-.18 1.29-.17 1.23-.1h4.48l1.07-.09 1.07-.08 1.05-.1 1.06-.12 1.09-.13 1.06-.15 1.05-.15 2.17-.35 2.13-.38 2.15-.4 4.25-.82 2.12-.4 2.12-.37 2.08-.31 1.07-.15 1.06-.14 1.07-.1 1.05-.1 1.07-.06h2.16z"/><path d="m417.2 620.8h1.13l.39.08.36.08.35.12.37.12.35.15.35.15.33.18.34.18.31.2.32.22.3.23.28.25.29.25.26.27.25.28.25.3.22.3.22.32.2.32.18.33.17.33.15.35.15.35.11.37.1.37.09.36.08.37v1.92l.15 1.71.22 2.4.3 2.94.37 3.35.41 3.65.47 3.81.47 3.87.5 3.82.5 3.63.5 3.33.46 2.94.2 1.21.2 1.09.19.86.05.24.11.2.15.35.15.35.14.35.11.36.1.37.07.37.07.38.05.37v1.51l-.05.39-.05.36-.06.39-.1.36-.1.37-.14.35-.13.35-.17.35-.16.33-.19.34-.2.31-.21.32-.24.3-.25.3-.25.27-.26.26-.29.27-.28.23-.32.24-.3.21-.33.2-.33.19-.34.16-.35.15-.35.15-.36.12-.35.1-.39.1-.35.07-.37.05h-2.18l-.37-.07-.36-.07-.33-.09-.33-.1-.34-.11-.31-.12-.32-.15-.32-.15-.3-.17-.3-.18-.3-.18-.28-.2-.27-.22-.06-.07-.29-.23-.26-.25-.25-.25-.25-.27-.22-.28-.23-.3-.2-.3-.07-.1-.17-.25-.13-.25-.13-.25-.14-.25-.23-.48-.27-.72-.21-.67-.29-1.05-.25-1.11-.25-1.22-.25-1.32-.25-1.43-.5-3.15-.51-3.5-.52-3.77-.5-3.91-.5-4-.47-3.9-.43-3.73-.37-3.44-.31-3.06-.25-2.59-.15-2-.05-.88v-1.73l.05-.37.07-.38.08-.37.1-.37.12-.36.13-.35.15-.35.17-.34.18-.33.2-.33.2-.32.24-.3.23-.3.25-.28.27-.27.26-.27.3-.25.3-.23.3-.22.32-.2.33-.2.34-.16.35-.17.35-.15.35-.13.36-.1.37-.1.37-.09.38-.06h1.13z"/><path d="m401.65 620.8h.4l.42.07.4.07.4.1.38.11.4.12.37.17.38.16.37.19.35.2.33.23.33.23.32.25.32.29.28.28.28.3.27.3.25.33.23.34.22.35.2.35.17.36.16.39.15.38.12.38.1.4.1.4v.4l.05.42v2.97l-.07 2.33-.12 2.4-.16 2.47-.2 2.53-.25 2.55-.29 2.58-.33 2.6-.37 2.59-.41 2.58-.47 2.53-.48 2.49-.29 1.26-.28 1.22-.28 1.2-.3 1.18-.32 1.17-.33 1.15-.34 1.13-.31.95v.25l-.05.25-.05.29-.13.93-.12 1.07-.1 1.2-.08 1.26-.15 2.59-.15 2.33-.09 1.13-.13 1.12-.1.52-.07.28-.06.27-.07.26-.05.17-.12.33-.11.32-.14.33-.15.32-.16.3-.17.3-.05.1-.22.32-.21.31-.24.3-.25.3-.26.29-.27.26-.3.25-.3.25-.3.24-.33.2-.32.2-.35.18-.36.16-.37.17-.37.13-.36.12-.39.1-.38.08-.38.07-.4.05h-1.57l-.4-.05-.38-.07-.36-.08-.39-.1-.36-.12-.37-.13-.35-.15-.35-.17-.33-.18-.34-.2-.33-.2-.3-.23-.3-.25-.29-.25-.26-.25-.25-.27-.25-.28-.24-.28-.21-.3-.21-.35-.22-.35-.18-.37-.17-.37-.08-.16-.12-.29-.1-.28-.1-.3-.15-.5-.15-.6-.08-.4-.07-.4-.05-.42v-2.03l.08-.4.08-.4.12-.4.13-.38.15-.39.12-.26v-.37l.16-2.68.1-1.49.14-1.51.15-1.54.21-1.48.15-.82.15-.78.22-.82.2-.71.32-1 .26-.87.27-.9.25-.93.25-1 .23-1 .24-1 .23-1 .43-2.19.4-2.23.37-2.3.33-2.32.3-2.31.27-2.34.22-2.3.18-2.26.13-2.2.1-2.12.07-2v-2.81l.05-.4.08-.4.08-.4.12-.4.13-.39.15-.38.17-.37.2-.36.2-.35.22-.35.25-.34.25-.31.26-.3.29-.3.3-.29.31-.25.34-.25.33-.23.35-.22.35-.2.37-.18.38-.17.38-.13.39-.13.4-.1.4-.09.4-.06h1.23z"/><path d="m489.6 554.8h2l1 .07 1 .08 1 .1 1 .14 1 .15 1 .18 1 .22 1 .25 1 .26 1 .32 1 .37.95.4.95.45.95.5.94.56.9.64.9.68.86.77.82.81.77.9.71 1 .67 1 .53 1 .5 1 .42.95.4.93.37.95.35 1 .31 1 .3 1 .27 1 .23 1 .22.95.18 1 .17 1 .13 1 .1 1 .09 1 .06.95v4.81l-.1.94-.1.91-.13.92-.17.92-.17.9-.2.9-.21.9-.24.88-.26.87-.27.86-.3.87-.32.85-.33.85-.35.83-.37.84-.38.81-.4.8-.42.8-.43.8-.43.79-.47.76-.48.77-.49.75-.5.75-.51.73-.54.74-.55.71-.55.7-.56.7-.59.69-.58.68-.62.67-.6.65-.63.65-.65.66-1.75.76-1.35 1.2-1.37 1.15-1.42 1.12-1.45 1.08-1.48 1-1.52 1-1.53.93-1.58.89-1.59.85-1.63.78-1.63.73-1.67.7-1.68.64-1.67.56-.9.29-.85.25-.88.23-.87.23-.87.2-.88.2-.88.19-.89.16-.88.15-.88.14-.9.11-.89.1-.9.09-.9.06h-5.4l-.9-.05-.91-.08-.9-.1-.9-.14-.9-.13-.9-.17-.89-.16-.9-.22-.88-.22-.9-.25-.88-.26-.87-.29-.88-.31-.87-.34-.87-.36-.85-.39-.85-.4-.85-.43-.83-.45-.82-.47-.81-.5-.72-.46-.65-.47-.6-.52-.53-.58-.5-.62-.42-.66-.37-.72-.28-.73-.23-.77-.14-.77-.08-.8v-.78l.08-.8.15-.77.24-.76.3-.74.36-.7.44-.66.48-.62.55-.58.6-.52.65-.45.68-.4.74-.33.75-.25.76-.19.79-.11h1.58l.78.12.77.18.75.27.73.33.69.4.51.34.45.28.45.25.45.25.47.23.45.22.47.22.48.18.48.2.49.17.48.16.5.15.5.14.52.13.51.12.52.1.52.1.53.08.53.07.55.06h.54l.55.05h3.4l.58-.05h.58l.59-.07.58-.08.6-.08.58-.1.6-.12.59-.12.6-.13.6-.13.6-.17.6-.17.58-.16.57-.19 1.23-.41 1.18-.45 1.19-.49 1.16-.53 1.17-.55 1.13-.62 1.14-.63 1.11-.67 1.09-.7 1.06-.75 1-.76 1-.79 1-.83.95-.85.95-.9.42-.42.43-.45.42-.45.41-.46.4-.45.4-.49.39-.46.38-.47.37-.48.35-.5.33-.49.33-.48.34-.5.3-.48.3-.5.28-.5.27-.5.26-.5.25-.52.24-.5.23-.52.2-.5.22-.51.18-.5.17-.52.16-.52.15-.5.21-.48.13-.52.12-.52.1-.5.08-.51.07-.5.06-.52.05-.52v-3.1l-.05-.51-.07-.52-.06-.53-.09-.52-.1-.52-.11-.53-.14-.53-.15-.54-.16-.55-.19-.53-.2-.55-.21-.55-.24-.55-.25-.55-.23-.47-.05-.11v-.05h-.05l-.09-.06-.11-.09-.17-.08-.18-.12-.24-.1-.28-.11-.32-.14-.36-.11-.4-.12-.44-.1-.48-.1-.5-.1-.55-.08-.57-.09-.6-.06h-.63l-.65-.05h-5.13l-1.59.08-1.61.13-1.65.15-1.67.17-1.67.2-1.66.22-1.64.21-3.25.45-3.06.44-1.49.21-1.45.17-1.38.17-1.35.11-1.33.09h-24.45l-4.59.06-4.75.12-4.86.15-5 .18-2.52.12-2.53.13-2.57.15-2.58.15-2.59.19-2.58.2-2.6.2-2.6.23-2.6.25-2.6.27-2.58.28-2.59.32-2.56.33-2.55.35-2.54.38-2.51.4-2.49.42-2.46.45-2.44.48-2.4.5-2.35.52-2.33.57-2.27.56-2.27.55-2.18.63-2.14.67-2.1.7-1 .35-1 .35-1 .38-1 .37-.95.38-.93.4-.93.39-.9.41-.89.4-.86.42-.84.42-.83.43-.82.43-.78.45-.77.44-.75.45-.73.46-.7.47-.68.47-.67.46-.63.49-.64.46-.6.5-.56.49-.55.48-.54.5-.51.5-.49.5-.46.52-.45.5-.42.51-.4.52-.22.28.05.09.15.26.19.32.21.33.27.37.3.38.33.4.37.44.4.45.43.45.47.46.48.47.54.48.53.49.57.48.58.48.62.5.61.49.62.46 1.35 1 1.35 1 1.4.91 1.4.9 1.42.85 1.38.82 1.38.75 1.32.72 1.28.65 1.2.56 1.14.52 1 .43.88.35.7.25.57.17h5.58l2.6-.07 2.84-.1 5.91-.2 3-.08h7.95l1.16.07 1.17.11 1.1.17.7.13.7.17.82.27.5.2.46.21.45.24.15.08.6.37.59.43.11.08.54.49.5.51.45.57.06.1.42.63.35.65.3.69.23.71v.1l.15.64.1.65.05.63v.65l-.05.65v.12l-.1.66-.16.67-.22.63-.27.64v.11l-.38.7-.43.65-.5.62-.55.57-.62.51-.65.45-.7.39-.72.31-.75.25-.78.19-.78.1h-.8l-.79-.05-.78-.11-.77-.2-.75-.29-.71-.33-.27-.17h-6.68l-2.78.07-5.85.2-2.88.1-2.74.08h-6.9l-1.07-.08-1.05-.17-.78-.17-.73-.2-1.24-.36-1.31-.49-1.37-.53-1.42-.6-1.46-.67-1.52-.73-1.57-.8-1.61-.85-1.65-.92-1.67-1-1.68-1-1.69-1.08-1.7-1.12-1.66-1.17-1.64-1.2-.83-.63-.82-.63-.8-.64-.78-.66-.78-.67-.75-.68-.75-.69-.74-.7-.71-.71-.7-.74-.69-.75-.66-.76-.64-.79-.61-.8-.6-.83-.57-.87-.53-.88-.52-.92-.47-1-.43-1-.38-1-.32-1.1-.27-1.13-.28-1.16-.08-1.23v-1.27l.11-1.18.12-.74.13-.65.17-.63.18-.63.24-.64.25-.61.28-.6.3-.6.33-.57.34-.53.66-1 .67-.92.7-.9.72-.87.73-.85.77-.83.78-.8.82-.8.81-.77.85-.75.87-.73.88-.72.9-.7.92-.68.95-.67.95-.65 1-.63 1-.62 1-.6 1-.58 1-.58 1-.55 1.06-.55 1.07-.54 1.07-.51 1.1-.52 1.1-.48 1.11-.49 1.14-.46 1.13-.47 1.15-.45 1.17-.43 1.18-.42 1.2-.43 2.37-.79 2.43-.76 2.48-.72 2.5-.68 2.54-.64 2.55-.58 2.59-.59 2.61-.55 2.64-.5 2.66-.5 2.67-.45 2.68-.43 2.7-.4 2.72-.37 2.72-.35 2.73-.33 2.72-.3 2.73-.28 2.72-.27 2.71-.23 2.72-.22 2.7-.2 2.68-.18 2.67-.17 2.67-.15 2.63-.15 2.62-.12 5.11-.2 5-.15 4.87-.11 4.68-.07h24.7l.95-.09 1.12-.13 1.25-.15 1.36-.18 3-.44 3.32-.46 1.75-.24 1.8-.23 1.83-.22 1.88-.18 1.9-.18 1.92-.15 1.93-.1 1.95-.07h1.92z"/><path d="m389.85 479.05h.5l.52.07.5.1.48.13.48.15.47.2.47.22.45.25.43.27.4.3.4.31.37.35.36.37.32.38.32.44.26.4.24.41.21.42.2.45.15.43.15.47.1.47.1.46v2.09l-.06.51-.1.52-.14.5-.15.5-.2.48-.21.49-.25.45-.15.4-.35 1-.4 1.18-.43 1.35-.47 1.45-.45 1.52-.37 1.56-.4 1.52-.35 1.45-.3 1.35-.1.55-.08.51-.07.47v3.45l-.07 2.77-.13 2.85-.18 2.86-.24 2.9-.26 2.92-.3 2.93-.35 2.94-.39 2.93-.41 2.92-.45 2.88-.47 2.87-.5 2.81-.53 2.77-.55 2.72-.54 2.48-.06.32v.3l-.27.43v5.28l.07 1.85.11 3.72.05 1.8v2.65l-.05.9-.11 1-.12.7-.1.42-.1.4-.1.35-.15.47-.18.46v.15l-.2.42-.22.42-.07.11-.21.37-.24.35-.25.35-.08.1-.27.32-.28.31-.3.3-.32.27-.06.08-.35.27-.35.27-.39.23-.38.22-.38.2h-.09l-.45.2-.46.17-.47.13-.47.12-.48.08h-.1l-.47.06h-2l-.48-.09-.48-.11-.47-.14-.55-.16-.11-.05-.45-.19-.44-.23-.43-.23-.12-.09-.31-.2-.3-.21-.29-.22-.13-.12-.3-.25-.3-.28-.35-.37-.58-.66-.5-.7-.3-.44-.27-.45-.23-.46-.22-.47-.17-.5-.15-.5-.11-.52-.09-.51-.05-.52v-1l.05-.52.09-.51.11-.52.14-.5.18-.5.2-.47.25-.46.27-.45.28-.44.17-.23-.12-3.45-.07-2v-6l.07-1 .1-1 .15-1 .18-.92.55-2.6.52-2.52.48-2.56.47-2.64.45-2.66.41-2.7.39-2.72.36-2.73.32-2.74.28-2.71.25-2.69.2-2.66.17-2.62.12-2.55.08-2.52v-3.35l.09-.93.1-.92.11-.9.15-.88.19-.93.38-1.77.43-1.83.49-1.82.51-1.8.52-1.75.53-1.65.5-1.55.49-1.4.43-1.23.42-1.09.4-1 .35-.71.25-.44.23-.36.25-.34.25-.33.28-.33.31-.35.35-.32.37-.3.38-.26.39-.27.41-.23.42-.2.43-.19.44-.16.5-.15.49-.12.51-.08.5-.05h.5zm24.42-1.7h.48l.47.07.48.08.45.13.47.14.45.18.43.2.42.22.41.25.4.26.39.3.35.32.35.33.35.39.28.35.27.38.26.38.22.4.22.42.18.42.15.43v.07l.13.45.12.45.08.45.08.56.07.92v2.32l-.06.48-.09.48-.13.49-.15.46-.17.47-.2.42-.06.71-.32 3.37-.27 3.43-.11 1.54-.07 1.35-.05 1v3.58l-.05 1.47-.06 1.43-.09 1.43-.1 1.44-.23 2.76-.28 2.72-.3 2.68-.32 2.65-.33 2.59-.32 2.55-.32 2.53-.28 2.48-.25 2.49-.22 2.46-.08 1.2-.07 1.22-.06 1.22-.05 1.21v4.04l-.06.78-.09.83-.18 1.57-.22 1.65-.26 1.65-.27 1.63-.5 3-.13.82.05.25.06.48.05.5v.98l-.05.49-.07.5-.1.48-.13.47-.15.46-.18.47-.25.58-.24.47-.2.37-.2.35-.11.18-.25.38-.29.37-.3.37-.05.05-.28.3-.3.3-.32.26-.33.27-.35.25-.42.26-.43.24-.44.21-.46.19-.47.15-.47.13-.48.1-.48.07h-1.99l-.49-.08-.48-.1-.47-.12-.46-.16-.47-.19-.43-.2-.44-.25-.41-.25-.4-.3-.39-.3-.35-.34-.33-.33-.32-.37-.3-.38-.28-.38-.24-.42-.23-.42-.2-.45-.18-.45-.14-.45v-.1l-.13-.48-.1-.48-.07-.49v-1.98l.13-1.15.17-1.23.43-2.65.52-3 .25-1.5.21-1.47.19-1.36.15-1.22.05-.48v-3.75l.05-1.43.06-1.42.09-1.42.1-1.4.23-2.73.28-2.7.3-2.67.32-2.61.33-2.59.32-2.56.32-2.54.28-2.5.25-2.5.22-2.5.08-1.23.08-1.23v-1.25l.05-1.24v-3.63l.07-1.37.1-1.53.12-1.7.28-3.62.33-3.58.17-1.67.17-1.48.18-1.32.2-1.18.1-.5.12-.43.15-.45.05-.15.16-.42.19-.42.2-.41.23-.39.23-.38.27-.39.3-.35.32-.35.33-.31.35-.3.37-.29.4-.26.38-.24.42-.21.41-.2.44-.17.45-.15.45-.12.47-.09.48-.08h.95zm26.58 3.52.5.05.48.08.49.12.46.15.47.16.45.2.43.22.44.25.41.28.39.3.38.32.35.35.33.35.32.38.28.4.27.42.25.43.2.45.2.45.15.47.13.48.1.49.09.48.05.5v6l.05 2.78.08 2.82.1 2.83.12 2.87.15 2.87.18 2.9.22 2.9.25 2.91.26 2.92.32 2.92.35 2.9.38 2.91.42 2.9.45 2.89.65 3.71.38 2.25.42 2.45.4 2.57.37 2.6.18 1.33.15 1.32.15 1.3.12 1.3.1 1.28.06 1.25v2.49l-.05 1.25-.1 1.18-.1.72-.12.68-.17.7-.2.77-.28.8-.23.53-.15.33-.19.35-.11.2-.22.4-.27.39-.11.18-.22.3-.23.28-.25.29-.14.15-.3.31-.31.29-.34.28-.15.12-.38.3-.42.26-.41.25-.17.09-.35.18-.37.17-.36.15-.39.13h-.16l-.39.12-.38.08-.38.07-.39.06h-2.31l-.42-.07-.43-.08h-.22l-.35-.1-.35-.1-.35-.12-.23-.08-.44-.17-.41-.18-.25-.14-.23-.14-.33-.19-.52-.33-.75-.53-.5-.4-.36-.32-.37-.35-.33-.37-.3-.38-.3-.4-.25-.42-.25-.43-.2-.45-.19-.45-.16-.48-.14-.47-.1-.48-.06-.5v-1.99l.08-.48.1-.49.13-.48.15-.47.19-.45.21-.45.25-.43.27-.42.28-.4.32-.38.33-.37.35-.33.37-.33.18-.14v-.28l-.08-1-.12-1.09-.13-1.11-.15-1.15-.35-2.39-.37-2.38-.4-2.32-.37-2.21-.66-3.82-.5-3.12-.45-3.11-.42-3.12-.37-3.12-.33-3.11-.28-3.1-.27-3.1-.22-3.07-.2-3.07-.16-3-.14-3-.1-3-.08-2.95v-9.12l.05-.48.06-.5.1-.49.14-.46.15-.47.18-.47.22-.45.15-.38.27-.42.28-.4.32-.38.33-.37.35-.35.37-.31.4-.3.4-.29.43-.25.43-.23.45-.2.47-.17.47-.15.48-.11.48-.09.49-.06h1zm20.5-5.27h.65l.48.07.48.08.47.12h.13l.4.12.42.15.4.15.12.07.35.16.33.17.32.18.13.09.4.26.38.29.14.1.3.26.3.27.38.37.53.6.52.65.63 1 .54 1 .45 1 .4 1 .35 1 .31 1 .32 1 .28 1 .29 1.1.28 1.14.27 1.18.26 1.25.5 2.53.5 2.7.49 2.85.46 3 .45 3 .45 3.14.44 3.18.41 3.23.42 3.24.38 3.25.75 6.35.69 6.06.61 5.6.55 4.94.49 4.11.2 1.64.18 1.35.15 1 .13.72.07.48.05.49v1.45l-.07.48-.1.48-.12.47-.15.45-.18.45-.2.45-.23.43-.25.4-.27.4-.3.39-.32.36-.35.35-.35.32-.38.3-.4.28-.42.27-.41.23-.44.2-.45.19-.46.15-.47.13-.47.1-.48.07h-1.96l-.5-.09-.48-.1-.47-.12-.45-.15-.45-.18-.45-.2-.43-.24-.4-.25-.4-.26-.38-.3-.37-.32-.35-.35-.32-.35-.3-.38-.28-.4-.27-.42-.23-.42-.2-.43-.18-.45-.15-.47-.14-.46-.1-.47-.18-1-.2-1.35-.2-1.55-.23-1.8-.49-4.2-.56-5-.62-5.6-.68-6-.74-6.29-.38-3.16-.4-3.17-.4-3.15-.42-3.1-.43-3-.43-2.91-.45-2.79-.45-2.65-.45-2.46-.45-2.29-.24-1-.21-1-.22-.91-.22-.84-.2-.73-.2-.67-.18-.53-.35-.33-.33-.35-.32-.39-.28-.38-.27-.4-.23-.43-.22-.44-.2-.43-.17-.47-.13-.46-.12-.47-.08-.48-.05-.47v-1.47l.07-.46.08-.49.1-.46.15-.47.17-.47.18-.43.22-.43.25-.42.26-.42.29-.38.31-.37.34-.35.35-.33.38-.32.38-.28.4-.27.44-.25.43-.21.43-.19.47-.16.45-.14.48-.11.47-.09.48-.05h.49zm-1.58 16.58.6.05-.49-.06-.38-.07z"/><path d="m459.68 356.52 1.74.05 1.71.08 1.72.13 1.68.15 1.67.2 1.65.25 1.63.29 1.6.33 1.6.38 1.54.44.81.25.77.26.77.27.75.28.76.3.75.32.74.35.63.3.35.18.35.2.15.09.52.35.5.38.13.12.38.33.35.37.14.13.28.32.25.31.33.44.45.7.39.66.3.64.28.65.38 1.05.34 1.1.26 1.06.25 1.1.2 1.1.19 1.12.16 1.13.17 1.17.13 1.17.14 1.21.2 2.37.23 2.4.13 2.31.12 2.19.08 2 .05 1.8v5.73l.06.87.17 2 .23 2.22.3 2.42.34 2.6.38 2.78.42 2.9.88 6.22.95 6.55.47 3.4.45 3.41.43 3.47.4 3.48.37 3.47.33 3.45.13 1.75.14 1.7.11 1.72.1 1.7.07 1.68.07 1.67.05 1.65v4.85l-.05 1.58-.07 1.57-.1 1.53-.13 1.52-.17 1.5-.2 1.48-.25 1.45-.26 1.43-.34 1.42-.36 1.38-.44 1.39-.46 1.28-.3.72-.29.66-.31.65-.32.65-.35.65-.38.64-.4.63-.44.62-.45.61-.48.6-.5.59-.53.55-.55.51-.55.5-.57.47-.57.45-.58.42-.58.4-.62.38-.6.37-.62.33-.66.37-1.22.58-1.28.55-1.32.52-1.33.46-1.37.42-1.38.38-1.42.35-1.43.32-1.47.3-1.48.27-1.5.23-1.54.22-1.55.18-1.56.17-1.59.15-1.6.13-1.61.12-1.65.1-1.65.08-1.65.07-1.69.05h-10.18l-3.42-.06-3.38-.12-3.37-.13-3.31-.15-3.27-.19-3.2-.18-6.08-.38-5.62-.37-5-.3-2.22-.13-2-.09-1.76-.05h-13.6l-1.62.07-1.62.08-1.6.1-1.56.13-1.59.15-1.55.2-1.56.22-1.55.25-1.62.3-9.68 1.9-.7.12-.7.05h-.72l-.7-.08-.68-.12-.6-.16-.66-.25-.64-.3-.61-.35-.59-.42-.53-.45-.27-.25-.21.35-.42.57-.47.53-.51.49-.55.45-.59.4-.61.33-.65.3-.67.23-.68.19-.69.11-.71.05h-1.34l-.6-.09-.37-.05-.36-.08-.59-.13-.91-.29-.87-.35-.8-.41-.75-.47-.68-.48-.62-.52-.55-.53-.5-.58-.45-.53-.42-.53-.43-.62-.58-1-.55-1.05-.47-1-.38-1-.34-1-.3-1-.25-1-.23-1-.18-1-.17-1-.15-1-.12-1-.1-1-.06-1-.07-.95v-5.3l.06-.81.09-.8.1-.8.11-.65.22-1.2.17-1.07.15-1.12.13-1.13.1-1.18.07-1.2.06-1.24v-6.52l-.07-1.37-.08-1.4-.1-1.43-.1-1.42-.27-2.95-.31-3-.35-3-.39-3.09-.81-6.3-.82-6.36-.4-3.22-.38-3.22-.34-3.21-.28-3.2-.12-1.64-.11-1.6-.09-1.6-.08-1.6v-6.33l.05-1.58.06-1.57.09-1.57.13-1.55.17-1.55.18-1.53.23-1.53.29-1.52.3-1.52.36-1.5.4-1.5.45-1.48.5-1.45.57-1.45.6-1.43.73-1.55.3-.52.22-.37.25-.35.17-.25.23-.3.25-.3.43-.5.7-.68.7-.6.7-.52.69-.45.7-.4.68-.36.67-.32.66-.28.67-.27.67-.25.71-.23 1.3-.39 1.37-.33 1.37-.3 1.4-.27 1.41-.23 1.44-.2 1.43-.17 1.45-.16 1.45-.14 1.45-.11 1.45-.1 1.42-.09 1.43-.06 2.72-.1 2.56-.07h8.59l1.11-.05 1.17-.05 1.22-.08 1.26-.1 1.3-.12 1.37-.15 1.4-.17 1.43-.18 1.45-.18 3.07-.45 3.18-.52 3.29-.55 3.38-.6 3.47-.62 7.16-1.31 3.65-.67 3.7-.67 3.74-.65 3.73-.63 3.77-.58 3.73-.55 1.88-.27 1.87-.25 1.87-.22 1.86-.21 1.85-.2 1.85-.17 1.84-.17 1.81-.13 1.82-.12 1.8-.08 1.8-.07h3.53zm-3.3 16.65h-1.51l-1.55.05-1.59.08-1.61.1-1.64.12-1.65.15-1.68.15-1.7.18-1.72.2-1.73.22-1.75.22-1.75.25-3.57.51-3.6.57-3.61.62-3.64.63-3.63.65-3.62.65-7.16 1.32-3.54.65-3.48.6-3.42.58-3.35.53-3.26.49-1.62.21-1.6.2-1.57.19-1.53.16-1.52.14-1.5.13-1.48.08-1.45.09h-10.05l-2.37.05-2.5.1-1.25.06-1.28.07-1.27.08-1.25.12-1.23.1-1.2.13-1.15.15-1.12.15-1 .17-1 .18-.89.2-.76.19-.72.21h-.17l-.08.22-.35.88-.3.92-.3.95-.27 1-.23 1-.22 1.05-.2 1.08-.16 1.12-.15 1.15-.12 1.17-.1 1.21-.08 1.24-.05 1.26v6.69l.07 1.41.08 1.42.1 1.43.12 1.45.26 3 .32 3 .35 3.06.38 3.09.82 6.31.82 6.35.4 3.2.36 3.2.34 3.2.28 3.19.13 1.6.1 1.58.1 1.58.07 1.59.05 1.58v4.68l-.05 1.55-.06 1.55-.1 1.54-.14 1.53-.16 1.52-.2 1.51-.24 1.5-.25 1.35v5.17l.05.65.07.65.08.65.09.62.1.6.11.58.12.53.12.49.1.33h.06l.62.35.58.4.55.45.37.33.3-.47.42-.55.48-.53.52-.48.56-.44.59-.38.63-.33.65-.29.67-.21.68-.17 9.7-1.71 1.88-.35 1.94-.31 1.91-.27 1.89-.23 1.88-.19 1.87-.15 1.85-.11 1.83-.1 1.83-.07 1.82-.05h12.68l2 .06 2.2.1 2.35.12 5.1.32 5.61.36 6 .39 3.1.18 3.18.17 3.2.15 3.25.13 3.23.1 3.24.07h9.56l1.53-.05 1.5-.05 1.48-.08 1.45-.09 1.44-.1 1.4-.11 1.36-.12 1.34-.15 1.28-.17 1.25-.16 1.22-.2 1.15-.2 1.1-.22 1.06-.23 1-.25.93-.27.88-.27.8-.28.73-.32.67-.28.61-.32.22-.1.23-.13.27-.17.18-.14.18-.11.15-.12.14-.1.11-.1.1-.08.07-.07.05-.05.05-.07.07-.06.06-.1.09-.12.08-.13.1-.15.1-.19.1-.2.1-.23.12-.25.08-.22.23-.66.22-.69.22-.76.18-.85.18-.9.17-1 .13-1.05.12-1.1.12-1.16.06-1.22.07-1.25v-6.92l-.07-1.48-.07-1.52-.08-1.53-.12-1.57-.11-1.58-.14-1.58-.3-3.27-.35-3.28-.38-3.32-.42-3.33-.43-3.34-.47-3.3-.91-6.5-.9-6.21-.44-3-.38-2.87-.37-2.75-.31-2.61-.25-2.49-.2-2.31-.09-1.14-.05-1.1v-5.07l-.05-1.67-.07-1.86-.1-2-.13-2.12-.15-2.11-.2-2.12-.1-1-.12-.95-.12-.92-.13-.85-.12-.78-.06-.3-.44-.12-.45-.15-1-.28-1.05-.25-1.1-.24-1.15-.2-1.18-.16-1.25-.15-1.3-.14-1.33-.08-1.39-.08h-4.35zm-108.21 111.18h-.24z"/><path d="m422.05 401.57 1.3.05 1.22.11.71.09.67.11.68.14.74.18.76.25.84.32.51.26.39.2.38.22.18.12.3.18.29.2.26.22.17.13.25.22.25.21.25.25.22.25.13.14.25.3.25.31.23.34.2.33.1.15.19.32.16.33.07.17.88.26 1.14.39 1.08.43 1.08.45 1 .48 1 .52 1 .55.95.6.91.62.89.65.85.7.81.71.79.75.73.79.68.8.67.85.6.85.57.88.53.9.47.92.43 1 .4.93.33 1 .3 1 .25 1 .22 1 .18 1 .14 1 .08 1 .07 1v1.93l-.05 1-.09 1-.11.95-.15 1-.17.95-.2.93-.23.93-.25.94-.29.9-.3.91-.33.9-.35.9-.38.89-.4.88-.42.87-.43.85-.47.85-.48.85-.5.83-.54.82-.53.81-.57.8-.58.8-.6.79-.62.76-.63.77-.65.73-.67.74-.7.73-.7.7-.71.7-.75.68-.75.67-.77.65-.78.65-.8.62-.82.6-.83.58-.85.58-.87.55-.88.54-.89.51-.91.49-.92.48-.95.45-.95.42-.95.41-1 .39-1 .35-1 .33-1 .3-1 .28-1 .25-1.05.22-1.06.18-1.07.17-1.08.13-1.1.09-1.09.06h-3.35l-1.11-.08-1.14-.12-1.13-.15-1.13-.2-1.14-.23-1.13-.27-1.13-.32-1.14-.36-1.11-.39-1.12-.45-1.12-.46-1.11-.54-1.1-.55-1.1-.6-1.09-.65-1.06-.68-1.07-.72-1.07-.76-1-.8-1-.85-1-.89-1-.93-1-1-.7-.73-.68-.83-.62-.85-.57-.89-.51-.9-.44-.91-.4-.92-.33-.93-.28-.94-.25-.91-.2-.94-.15-.93-.12-.92-.08-.91-.05-.9v-2.69l.05-.88.08-.87.12-.88.12-.87.15-.85.15-.86.18-.85.18-.84.22-.83.23-.88.47-1.62.53-1.62.57-1.6.62-1.56.65-1.55.66-1.5.7-1.47.7-1.42.74-1.38.75-1.33.75-1.27.75-1.22.76-1.16.77-1.12.78-1.05.79-1 .81-.93.85-.9.64-.62.66-.55.65-.5.67-.47.67-.41.66-.4.69-.37.68-.35.68-.32.72-.33 1.35-.53 1.42-.52 1.43-.45 1.45-.43 1.45-.37 1.47-.35 1.48-.3 1.47-.27 1.45-.21 1.45-.2 1.41-.15 1.4-.14 1.37-.08h1.33zm-10.18 17.91-1 .27-1 .28-.9.3-.85.3-.78.32-.29.13-.28.14-.27.13-.21.12-.19.11-.13.09-.1.06-.21.24-.34.38-.4.52-.46.63-.52.73-.52.8-.55.89-.56.95-.55 1-.57 1.05-.55 1.1-.53 1.11-.5 1.15-.49 1.17-.46 1.17-.42 1.16-.38 1.15-.34 1.19-.15.51-.13.55-.12.55-.11.54-.1.51-.09.5-.06.49-.05.48-.05.45v2.23l.05.29v.26l.05.22.05.18.05.17v.13l.05.12.07.15.08.12.08.08.62.6.67.6.65.58.65.54.66.5.64.46.65.44.63.41.63.37.62.35.63.32.6.28.62.27.62.23.6.2.58.2.6.17.6.13.58.13.59.1.58.09.58.05.59.05h2.31l.59-.05.58-.07.58-.1.57-.1.58-.11.59-.14.56-.16.59-.17.56-.18.59-.22.56-.22.57-.25.57-.25.56-.26.55-.29.55-.3.55-.31.55-.34.54-.35.53-.35.53-.36.52-.4.52-.39.5-.41.48-.42.5-.43.47-.44.46-.45.45-.45.45-.46.44-.47.41-.48.4-.5.4-.49.39-.5.36-.5.35-.5.34-.51.33-.5.3-.52.3-.52.28-.5.25-.51.25-.5.24-.52.21-.5.19-.5.18-.48.17-.49.15-.48.13-.47.1-.46.1-.45.08-.45.07-.42.05-.42v-2.25l-.05-.31-.05-.32-.07-.3-.06-.28-.1-.29-.09-.26-.11-.25-.1-.25-.14-.24-.13-.23-.15-.23-.17-.24-.09-.2-.18-.23-.22-.22-.25-.23-.25-.24-.28-.23-.32-.23-.35-.24-.37-.23-.41-.23-.45-.22-.47-.23-.53-.22-.55-.22-.6-.2-.64-.2-.68-.18-.73-.18-.77-.15-.8-.15-.85-.14-.9-.11-1-.09-1-.08-1-.05h-3.15l-.41-.07-.42-.08-.42-.1-.41-.12-.4-.15-.4-.16-.39-.19-.38-.21-.37-.22-.35-.25-.33-.25-.33-.28-.32-.3-.28-.3-.29-.34zm233.56-183.11 1 .18 1 .3.95.43.88.55.82.65.73.77.62.83.51.92.4 1 .29 1 .13 1v1.05l-.12 1-.25 1-.37 1-.48.94-.62.85-.7.76-.8.69-.86.56-1 .47-1 .33-1 .22-1 .07h-.56l-.7.07-.74.08-.78.14-.87.16-.91.22-1 .27-1 .3-1.06.35-1.12.38-1.15.43-1.18.49-1.24.51-1.25.55-1.28.59-1.32.61-1.33.67-1.35.7-1.38.72-1.4.75-1.42.78-1.43.82-1.45.83-1.47.85-1.47.88-1.46.9-3 1.87-3 1.92-3 2-3 2-3 2.07-3 2.08-2.95 2.09-2.91 2.1-2.85 2.08-2.8 2.05-2.72 2-5.2 3.9-4.81 3.7-4.3 3.27-3.78 2.88-2.62 1.95-2.62 2-2.63 1.92-2.65 1.91-2.65 1.92-2.67 1.9-2.68 1.88-2.68 1.89-2.7 1.86-2.7 1.85-2.72 1.85-2.73 1.85-2.74 1.84-2.75 1.81-5.51 3.57-5.55 3.58-5.57 3.55-5.62 3.5-5.63 3.49-5.67 3.43-5.7 3.42-5.7 3.38-5.73 3.33-5.7 3.32-5.77 3.28-5.78 3.27-5.8 3.22-5.8 3.2-5.85 3.11-5.81 3.14-5.84 3.11-5.83 3.09-5.83 3.05-5.84 3-5.83 3-5.82 3-5.83 3-5.8 2.93-5.77 2.89-.56.28-.59.32-1.45.8-1.68 1-1.92 1.15-2.11 1.28-2.29 1.4-5.05 3.17-11.4 7.18-6.06 3.8-3.1 1.92-3.09 1.92-3.08 1.88-3 1.83-3 1.8-2.95 1.72-2.9 1.65-2.8 1.57-2.7 1.46-1.33.7-1.3.65-1.27.64-1.23.6-1.22.56-1.18.54-1.15.5-1.13.46-1.12.44-1.1.38-1.08.35-1.12.3-1.13.25-1.19.2-1.18.1h-1.52l-.82-.09-.87-.15-.53-.13-.75-.23-.18-.07-1-.42-.9-.53-.83-.63-.74-.74-.65-.83-.53-.9-.42-1-.3-1-.16-1v-1l.1-1.05.22-1 .37-1 .46-.94.59-.86.7-.8.78-.69.85-.6.93-.46 1-.37 1-.23 1-.1h1.05l.5.08.43-.11.54-.19.65-.21.71-.29.82-.33.88-.38.94-.42 1-.47 1.05-.51 1.11-.55 1.15-.59 1.17-.61 2.52-1.37 2.63-1.47 2.73-1.56 2.85-1.65 2.9-1.74 3-1.78 3-1.85 3-1.87 3-1.88 6-3.78 11.41-7.19 5.12-3.2 2.37-1.46 2.21-1.35 2.07-1.24 1.9-1.1 1.72-.95.83-.45.75-.38 5.8-2.92 5.78-2.9 5.77-2.95 5.78-2.95 5.79-3 5.78-3 5.78-3 5.79-3.07 5.76-3.07 5.77-3.11 5.75-3.14 5.73-3.15 5.74-3.18 5.7-3.22 5.7-3.23 5.66-3.28 5.65-3.29 5.64-3.33 5.6-3.37 5.56-3.38 5.55-3.42 5.52-3.45 5.48-3.48 5.45-3.52 5.42-3.56 2.7-1.77 2.67-1.8 2.68-1.8 2.67-1.82 2.65-1.81 2.63-1.84 2.63-1.83 2.62-1.85 2.6-1.87 2.6-1.86 2.58-1.87 2.57-1.88 2.57-1.89 2.55-1.9 3.68-2.78 4.28-3.27 4.84-3.66 5.38-3.95 2.78-2.07 2.87-2.1 2.93-2.13 3-2.15 3-2.17 3.1-2.17 3.14-2.13 3.15-2.12 3.16-2.08 3.19-2 3.15-2 1.6-1 1.58-1 1.58-.94 1.59-.9 1.56-.88 1.57-.87 1.55-.83 1.55-.82 1.53-.78 1.54-.75 1.51-.73 1.52-.69 1.5-.66 1.48-.64 1.49-.58 1.48-.55 1.45-.52 1.45-.48 1.45-.43 1.45-.39 1.43-.33 1.44-.28 1.41-.24 1.44-.18 1.38-.1h1.38zm-339.21 199.33-.19-.07-.36-.08z"/><path d="m580.5 154 .88.14.82.18.77.23.7.25.66.29.62.3.58.31.6.35 1 .62.95.7.9.73.85.74.82.75.78.78.77.78.73.8.72.8.71.82.7.82 1.3 1.56 1.22 1.54 1.13 1.43 1 1.27.85 1.05.69.8.16.2.2.21 1 1 1.2 1.27 1.35 1.46 1.47 1.62 1.61 1.8 1.74 2 1.83 2.08 1.92 2.24 2 2.33 2.07 2.43 2.13 2.54 2.17 2.61 2.2 2.67 2.22 2.72 2.21 2.75 2.2 2.76 2.19 2.79 2.15 2.78 2.03 2.7 2 2.72 1.95 2.68 1.89 2.63 1.75 2.55.85 1.25.81 1.24.79 1.21.76 1.19.72 1.16.68 1.15.65 1.14.62 1.1.58 1.08.54 1.07.51 1.06.45 1.05.44 1.05.38 1.07.33 1.12.29 1.18.18 1.18.07.77v1.57l-.18 1.08-.32 1-.45 1-.56.92-.7.85-.8.73-.89.64-1 .51-1 .39-1.07.25-1.08.1h-1.08l-1.09-.18-1-.32-1-.45-.92-.58-.85-.68-.73-.8-.63-.89-.52-1-.38-1-.25-1.07-.09-.83v-.07l-.08-.23-.13-.37-.19-.48-.25-.57-.31-.66-.37-.72-.43-.8-.47-.85-.53-.9-.57-.95-.6-1-.67-1-.68-1.07-.73-1.1-.77-1.13-1.63-2.37-1.75-2.45-1.85-2.53-1.94-2.64-2-2.64-2.06-2.68-2.14-2.68-2.13-2.69-2.15-2.68-2.15-2.63-2.15-2.6-2.12-2.55-2.1-2.45-2-2.4-2-2.27-1.87-2.17-1.76-2-1.67-1.87-1.48-1.69-1.4-1.53-1.24-1.32-1.05-1.15-.93-1-.45-.49-.53-.6-1-1.13-1-1.25-1-1.32-1.1-1.38-1.12-1.38-1.15-1.39-.55-.65-.55-.63-.55-.62-.53-.56-.5-.54-.49-.46-.18-.17-3.85 1.93-6.8 3.49-6.78 3.51-6.77 3.64-6.7 3.6-6.75 3.65-6.73 3.68-6.72 3.72-6.8 3.77-6.7 3.78-6.65 3.8-6.7 3.85-6.68 3.89-6.67 3.91-6.67 3.95-6.66 4-6.67 4-6.65 4-6.67 4.05-6.65 4-6.63 4.12-6.65 4.1-13.35 8.21-13.31 8.29-13.32 8.31-26.72 16.7-1.45.9-1.5.9-1.5.9-1.53.89-1.55.88-1.57.88-3.15 1.72-3.21 1.72-3.19 1.68-3.3 1.67-3.34 1.66-3.36 1.67-3.39 1.65-6.8 3.28-6.8 3.3-3.38 1.67-3.37 1.67-3.35 1.66-3.3 1.7-3.28 1.72-3.22 1.72-3.21 1.78-1.55.88-1.55.88-1.52.9-1.51.9-1.49.9-1.48.9-1.45.92-1.43.93-1.4.94-1.39.93-1.36.93-1.34.95-1.31 1-1.29 1-1.25 1-1.23 1-1.2 1-1.17 1-1.13 1-1.1 1-1.08 1-.14.13v1.37l.06.7.12.78.13.87.19.93.2 1 .25 1 .28 1.1.3 1.15.35 1.18.37 1.24.4 1.26.41 1.3.45 1.34.49 1.35.48 1.38.52 1.4 1.08 2.87 1.15 2.93 1.22 3 1.23 3 1.27 3 1.3 3 1.32 2.76 2.57 5.74 2.45 5.4 2.23 4.95 1 2.28.93 2.12.85 2 .75 1.8.63 1.64.3.8.2.58.19.5.21.48.29.64.38.71.43.82.5.87.54.93.58.95 1.28 2 1.34 2.07 2.7 4.07 1.25 1.91 1.13 1.79.53.86.49.85.46.87.47 1 .28.71.25.72.05.18.19.75v.15l.1.64v1.7l-.13.95v.1l-.25.95-.35.91-.45.87v.07l-.53.78-.62.72-.7.63-.75.55-.06.05-1 .55-1.05.4-1.1.27h-.09l-1.13.12-1.13-.05h-.12l-.7-.1-.7-.16h-.15l-.88-.3-.47-.2-.72-.35-.65-.38-.78-.5-.87-.65-.78-.77-.67-.86-.56-.94-.42-1-.3-1-.15-1.08v-1.13l-.83-1.29-2.72-4.11-1.45-2.22-1.4-2.23-.71-1.17-.67-1.13-.63-1.14-.62-1.13-.58-1.13-.55-1.15-.5-1.17-.39-1-.2-.57-.16-.5-.52-1.3-.65-1.55-.78-1.81-.89-2-1-2.2-2.22-5.13-2.45-5.43-2.6-5.82-1.34-3-1.31-3.07-1.32-3.1-1.3-3.1-1.27-3.12-1.21-3.1-1.12-3.09-.57-1.54-.53-1.51-.53-1.5-.5-1.49-.49-1.46-.45-1.45-.43-1.44-.4-1.41-.38-1.4-.35-1.39-.32-1.36-.28-1.34-.25-1.33-.22-1.3-.17-1.3-.13-1.3-.08-1.28v-2.52l.05-.72.09-.66.08-.69.12-.66.16-.69.19-.7.21-.71.27-.72.32-.72.36-.73.44-.72.5-.71.55-.7.53-.59 1.37-1.33 1.3-1.22 1.31-1.21 1.35-1.19 1.39-1.16 1.4-1.15 1.41-1.14 1.45-1.11 1.47-1.12 1.48-1.08 1.5-1.07 1.54-1.05 1.53-1.05 1.57-1 1.56-1 1.59-1 1.6-1 1.61-1 1.64-1 1.65-.95 1.65-.95 1.66-.95 3.35-1.84 3.39-1.81 3.4-1.79 3.43-1.75 3.43-1.73 3.45-1.72 3.45-1.68 6.84-3.32 6.78-3.28 3.33-1.62 3.3-1.63 3.24-1.62 3.18-1.61 3.13-1.62 3-1.62 3-1.63 1.43-.82 1.43-.81 1.42-.82 1.38-.82 1.37-.81 1.35-.84 26.67-16.68 13.35-8.33 13.33-8.3 13.33-8.24 6.69-4.11 6.68-4.09 6.68-4.08 6.69-4.05 6.7-4 6.7-4 6.7-4 6.71-4 6.74-4 6.73-3.91 6.75-3.89 6.75-3.86 6.77-3.84 6.78-3.78 6.78-3.77 6.82-3.71 6.82-3.7 6.83-3.65 6.85-3.6 6.87-3.57 6.88-3.53 7.08-3.57.42-.18.83-.32.24-.07.81-.21.25-.05.82-.12h1.65z"/><path d="m596.1 112.83h1.17l1.15.06 1.16.1 1.15.12 1.14.15 1.13.18 1.13.2 1.12.22 1.12.25 1.11.28 1.1.29 1.1.31 1.09.35 1.06.37 1.09.38 1.05.4 1.03.51 1 .45 1 .46 1 .49 1 .5 1 .51 1 .55 1 .55 1 .59 1 .58 1 .6 1 .63 1 .64 1 .65.93.66.94.69.91.7.92.71.92.72.9.73.88.75.88.77.89.78.86.79.89.81 1.66 1.6 1.67 1.69 1.63 1.7 1.6 1.75 1.59 1.8 1.53 1.81 1.52 1.85 1.46 1.89 1.45 1.9 1.42 1.93 1.38 2 1.35 2 1.32 2 1.28 2 1.25 2 1.22 2.05 1.18 2.05 1.15 2 1.12 2.06 1.08 2.09 1.05 2.06 1 2.09 1 2.06.93 2.07.9 2.07.87 2.05.83 2 .8 2 .75 2 .72 2 .66 2 .64 2 .6 2 .55 1.93.51 1.92.47 1.88.43 1.87.35 1.68v.15l.17.57.27.78.36 1 .45 1.17.54 1.33 1.23 3.07 1.38 3.43 1.47 3.74.77 2 .75 2 .75 2 .71 2.05.7 2.06.67 2.07.62 2.07.56 2 .27 1 .25 1 .23 1 .22 1 .18 1 .19 1 .15 1 .11 1 .1 1 .07 1v2l-.05 1-.06 1.35-.17 1.08-.25 1.1-.33 1.14-.32.8-.13.35-.17.35-.36.73-.4.67-.39.56-.43.59-.47.55-.51.51-.54.52-.6.48-.61.44-.65.4-.62.33-.82.38-.78.34-.78.3-.8.26-.79.22-.78.18-.8.17-.78.12-.77.1-.77.06-.76.05h-2.22l-.73-.05-.75-.06-1.35-.17-1.35-.22-1.32-.28-1.28-.3-1.25-.33-1.22-.37-1.18-.38-1.17-.39-2.18-.78-2.09-.77-2-.73-.9-.32-.87-.3-.83-.26-.77-.22-.71-.2-.64-.15-.58-.12-.55-.06h-1.45l-.65-.1-.65-.13-.62-.18-.61-.25-.59-.29-.56-.31-.54-.39-.51-.41-.47-.45-.43-.49-.4-.51-.35-.55-.32-.59-.27-.6-.21-.61-.17-.64-.12-.63-.06-.65v-.67l.05-.65.08-.65.14-.63.18-.63.25-.6.28-.6.32-.57.38-.53.42-.5.45-.49.48-.43.52-.4.55-.35.58-.3.6-.27.62-.21.63-.17.64-.12.66-.06h1.9l.69.05.71.08 1.24.19 1.25.23 1.21.28 1.19.32 1.16.35 1.12.37 1.12.36 1.08.39 2.1.67 2 .75 2 .7.9.3.88.29.87.26.83.22.78.18.74.15.68.12.68.08h1.02v-.48l-.07-.57-.1-.61-.12-.67-.13-.68-.15-.74-.17-.76-.2-.77-.2-.8-.46-1.7-.54-1.75-.58-1.8-.62-1.83-.65-1.87-.68-1.87-.7-1.86-.72-1.84-1.43-3.61-1.37-3.4-1.25-3.12-.56-1.45-.54-1.35-.46-1.27-.42-1.21-.35-1.12-.17-.68-.13-.54-.35-1.65-.35-1.55-.4-1.6-.51-1.6-.49-1.67-.51-1.7-.55-1.73-.6-1.75-.64-1.78-.66-1.79-.72-1.81-.73-1.84-.79-1.85-.8-1.85-.85-1.85-.88-1.86-.9-1.87-.95-1.88-1-1.85-1-1.87-1-1.85-1.06-1.85-1.09-1.83-1.11-1.82-1.15-1.8-1.19-1.78-1.2-1.75-1.21-1.74-1.25-1.71-1.29-1.67-1.28-1.65-1.32-1.62-1.33-1.58-1.37-1.55-1.36-1.5-1.4-1.45-1.4-1.42-1.45-1.38-.7-.65-.72-.65-.72-.65-.73-.62-.73-.61-.74-.6-.73-.59-.73-.58-.75-.55-.74-.55-.75-.53-.75-.5-.75-.5-.75-.49-.75-.48-.75-.45-.75-.43-.75-.42-.76-.42-.75-.38-.77-.37-.75-.36-.75-.34-.77-.33-.75-.3-.76-.28-.75-.29-.77-.25-.75-.23-.77-.23-.75-.2-.76-.19-.75-.16-.77-.15-.77-.14-.75-.11-.76-.1-.77-.09-.75-.06h-4.62l-.76.06-.79.1-.78.1-.78.12-.8.15-.79.17-.78.2-.32.06-.26.09-.25.08-.25.1-.2.08-.2.09-.19.08-.16.08-.15.1-.14.09-.13.08-.12.08-.1.09-.1.08-.1.08-.08.09-.08.08-.09.1-.06.1-.09.08-.06.12-.09.12-.06.11-.09.14-.06.13-.07.15-.07.15-.05.12-.15.43-.13.42-.1.46-.1.5-.08.57-.07.6v3.55l.07.8.08.83.1.85.13.87.14.87.16.9.19.9.18.91.2.89.47 1.86.48 1.85.5 1.82.53 1.8.52 1.75 1 3.35.46 1.58.44 1.54.36 1.45.17.78.15.75.13.78.1.85v2.84l-.08.58-.13.6-.07.25-.18.58-.24.57v.12l-.22.43-.23.43v.1l-.32.5-.35.49-.06.06-.44.5-.45.47-.08.07-.5.41-.52.39-.56.35-.59.28-.6.25-.61.22-.65.15-.64.1-.66.05h-.65l-.65-.05-.65-.12-.64-.15-.69-.2-.6-.25-.59-.3-.56-.33-.54-.4-.48-.42-.47-.47-.43-.5-.38-.51-.34-.57-.3-.58-.31-.67-.2-.64-.15-.63-.1-.65-.05-.65v-.65l.05-.65.1-.65v-.1l-.27-1-.33-1.22-.42-1.41-1-3.3-.55-1.84-.57-1.95-.56-2-.57-2.12-.52-2.16-.26-1.14-.24-1.13-.21-1.13-.22-1.15-.18-1.17-.19-1.18-.15-1.19-.11-1.2-.1-1.2-.07-1.2v-3.68l.08-1.25.14-1.23.18-1.27.25-1.25.3-1.27.38-1.26.42-1.2.28-.67.29-.63.28-.62.32-.62.35-.6.36-.6.39-.6.41-.58.44-.58.46-.55.49-.55.5-.54.53-.51.55-.5.57-.49.58-.46.62-.45.63-.42.63-.4.67-.37.68-.36.69-.34.71-.31.72-.29.73-.26.74-.25.75-.22.76-.2 1.2-.28 1.19-.27 1.2-.22 1.18-.18 1.18-.17 1.19-.13 1.18-.1 1.18-.07h3.52zm-21.3 51.55-.22.29.17-.2.45-.45z"/><path d="m674.83 51.18.54.07.53.08.52.14.51.16.5.19.49.21.46.27.45.28.44.3.41.35.39.37.36.38.35.42.3.43.3.45.25.47.22.48.2.5.17.5.11.52.1.53.07.54v1.63l-.05.37-.06.53-.2.87-.25.8-.3.75-.2.43-.2.35-.2.37-.22.33-.23.38-.27.37-.27.35-.23.28-.25.29-.52.56-.78.72-.75.62-.75.56-.75.5-.73.45-.72.44-.73.4-.75.38-1.37.68-1.38.62-1.32.57-2.32 1-.93.4-.7.3-.38.2-1.69 1.05-1.83 1.18-3.63 2.33-3.69 2.3-3.7 2.25-3.68 2.25-3.7 2.22-7.37 4.42-3.63 2.21-3.62 2.22-3.55 2.25-1.77 1.12-1.76 1.13-1.74 1.14-1.73 1.15-1.72 1.15-1.7 1.16-1.68 1.15-1.65 1.18-1.65 1.19-1.6 1.2-1.37 1.05-2.33 1.83-1.38 1.1-1.52 1.22-1.5 1.25-1.5 1.28-1.41 1.25-1.32 1.22-.55.53-.52.5-.43.47-.14.5-.18.5-.22.5-.25.47-.28.47-.3.43-.33.42-.35.4-.39.36-.41.35-.42.32-.45.3-.47.25-.48.23-.5.2-.5.19-.52.13-.51.1-.54.07h-1.6l-.53-.07-.53-.1-.52-.13-.5-.17-.5-.2-.48-.23-.47-.25-.4-.31-.44-.32-.41-.35-.39-.37-.35-.4-.08-.08-.33-.42-.3-.43-.29-.45-.25-.47v-.11l-.2-.45-.18-.49-.15-.48-.12-.48v-.12l-.07-.42-.05-.4v-1.86l.05-.44v-.15l.1-.51.12-.5.05-.15.12-.39.13-.38.18-.47.39-.8.58-1 .67-.94.63-.81.67-.79.68-.73.72-.73.73-.74.78-.75 1.57-1.45 1.65-1.45 1.67-1.43 1.66-1.4 1.6-1.3 1.5-1.22 2.36-1.94 1.55-1.18 1.78-1.32 1.78-1.28 1.79-1.28 1.8-1.25 1.81-1.25 1.82-1.22 1.83-1.22 1.84-1.18 1.83-1.18 1.87-1.19 3.68-2.3 3.72-2.28 3.71-2.25 7.39-4.43 3.66-2.2 3.64-2.2 3.6-2.22 3.55-2.22 3.5-2.23 1.71-1.12 1.85-1.21.55-.35.67-.37 1.07-.5 1.1-.5 1.1-.46 2.25-.94 1.09-.46 1-.47 1-.48.38-.2.37-.2.26-.15v-.1l.23-.49.28-.45.29-.45.33-.41.35-.4.38-.39.4-.35.42-.33.45-.3.45-.27.48-.25.49-.2.51-.18.5-.13.54-.12.51-.08h1.6zm-81.3 67.14v-.17zm-1.15-2.14.3.44.2.33-.21-.47-.62-.71zm199.62 76.5.57.07.57.12.55.15.53.2.52.21.5.27.5.28.46.34.44.36.41.39.4.41.35.44.34.46.3.49.26.5.22.51.2.55.15.54.12.56.08.57v1.7l-.07.57-.11.55-.15.55-.14.53-.23.53-.25.5-.3.49-.33.46-.35.45-.39.42-.41.38-.45.37-.45.33-.5.3-.5.25-.52.24-.53.2-.55.15-.55.11-.57.09h-1.27l-.33.06-.43.12-.5.15-.59.2-.63.23-.7.29-.75.31-.78.35-.84.39-.86.43-.9.47-.94.48-1 .53-1 .55-1 .57-2.12 1.25-2.18 1.33-2.25 1.42-2.3 1.48-2.35 1.55-2.37 1.6-2.38 1.64-2.4 1.66-2.4 1.69-2.37 1.7-2.35 1.68-4.6 3.35-4.38 3.2-4.09 3-3.71 2.72-1.7 1.33-1.6 1.15-1.48 1-1.35.93-2.85 1.92-2.89 1.83-2.91 1.82-2.92 1.78-2.92 1.77-2.9 1.73-5.73 3.44-.57.31-.68.37-1.48.78-1.67.89-1.68.9-1.52.83-.52.3-.1.1-.41.4-.45.35-.47.33-.48.29-.52.26-.52.22-.53.2-.5.1-.55.12-.57.06h-1.71l-.55-.08-.62-.1-.55-.15-.53-.2-.52-.23-.5-.25-.48-.3-.47-.33-.45-.37-.4-.38-.4-.42-.35-.45-.3-.43-.26-.43-.25-.45-.22-.47-.18-.48-.15-.5-.14-.5-.1-.55-.06-.53v-1.1l.05-.54.08-.55.12-.53.15-.52v-.08l.2-.53.21-.5.27-.5.28-.47.32-.47.07-.08.26-.33.3-.38.3-.3.11-.11.35-.32.37-.28.58-.47.9-.6.85-.52.87-.5 1.78-1 1.84-1 1.68-.88 1.37-.72.41-.25.29-.15 5.61-3.35 2.87-1.71 2.85-1.72 2.82-1.73 2.78-1.74 2.72-1.73 2.65-1.73 1.15-.79 1.33-.93 1.5-1.07 1.63-1.16 3.65-2.67 4.09-3 4.41-3.22 4.65-3.4 2.42-1.71 2.45-1.75 2.45-1.74 2.48-1.73 2.5-1.7 2.49-1.68 2.48-1.64 2.45-1.58 2.43-1.53 2.4-1.47 2.34-1.37 1.16-.68 1.15-.63 1.15-.62 1.12-.58 1.12-.54 1.1-.55 1.08-.52 1.08-.48 1.07-.45 1.07-.42 1.06-.4 1.05-.35 1.07-.33 1.08-.27 1.09-.25 1.13-.18 1.17-.12h1.45z"/><path d="m714 0 1.83.07 1.82.12 1.8.16 1.8.2 1.78.25 1.77.29 1.76.31 1.74.37 1.73.4 1.72.45 1.71.47 1.69.51 1.68.55 1.67.59 1.65.63 1.63.65 1.63.68 1.6.72 1.6.75 1.59.78 1.56.82 1.55.85 1.54.87 1.53.9 1.5.93 1.5 1 1.48 1 1.47 1 1.45 1 1.45 1.06 1.43 1.07 1.4 1.12 1.42 1.11 1.38 1.15 1.39 1.17 1.37 1.2 1.38 1.2 1.33 1.23 1.33 1.25 1.3 1.29 1.3 1.28 1.3 1.3 1.27 1.33 1.27 1.34 1.25 1.35 1.23 1.38 1.22 1.38 1.21 1.4 1.2 1.42 1.2 1.43 1.17 1.44 1.17 1.46 1.16 1.47 1.09 1.47 1.13 1.5 1.13 1.5 1.1 1.51 1.1 1.52 1.09 1.53 1.08 1.54 1.07 1.55 1 1.55 1.05 1.58 2 3.13 2 3.17 2 3.2 1.92 3.2 1.88 3.22 1.83 3.23 1.8 3.22 1.87 3.23 1.7 3.23 1.68 3.22 1.64 3.22 1.58 3.2 1.55 3.13 1.5 3.15 1.47 3.14 1.43 3.1 1.38 3 1.35 3 1.3 3 1.27 2.93 1.22 2.88 1.2 2.84 1.13 2.76 1.1 2.72 1.07 2.63 2.6 6.45 1.41 3.6.74 1.9.73 1.94.73 2 .74 2 .73 2.06.7 2.09.7 2.13.68 2.15.65 2.18.62 2.2.58 2.22.54 2.25.5 2.25.45 2.23.2 1.15.2 1.14.16 1.15.17 1.13.15 1.13.12 1.15.11 1.14.09 1.15.06 1.13v5.72l.02 1.21-.1 1.13-.12 1.14-.15 1.13-.18 1.13-.2 1.12-.25 1.13-.28 1.1-.3 1.12-.37 1.15-.4 1.08-.47 1.09-.53 1.06-.6 1-.67 1-.73.93-.8.89-.85.8-.92.75-.95.67-1 .6-1 .52-1 .43-1 .37-1 .3-1 .21-1 .17-1 .12-1 .05h-2.95l-.92-.1-.91-.13-.9-.17-.89-.18-.88-.2-.87-.24-.85-.23-.85-.27-.81-.28-.84-.3-.8-.32-.83-.33-1.53-.67-1.54-.71-1.48-.77-1.43-.77-1.4-.8-1.32-.8-1.28-.8-1.2-.8-1.07-.73-.47.4-.66.47-.72.4-.75.31-.78.25-.8.19-.82.08h-.82l-.81-.07-.8-.15-.79-.23-.76-.3-.72-.37-.68-.45-.65-.5-.59-.58-.53-.62-.47-.67-.38-.71-.33-.75-.25-.79-.17-.8-.1-.81v-.82l.07-.82.15-.8.21-.78.3-.77.39-.71v-.19l-.07-.4-.08-.47-.1-.52-.13-.56-.17-.62-.18-.67-.22-.7-.23-.71-.25-.77-.29-.78-.3-.79-.66-1.71-.75-1.75-.8-1.82-.85-1.85-.9-1.87-1-1.86-1-1.89-1-1.85-1-1.81-1-1.79-1-1.73-1-1.65-.95-1.57-.93-1.46-.87-1.35-.83-1.24-.75-1.08-.67-.92-.55-.71-.43-.52-.08-.1-.14-.13-.66-.69-.75-.8-.72-.8-.7-.81-.68-.82-.67-.83-.65-.85-.63-.85-.64-.85-.6-.87-.58-.87-.58-.88-1.1-1.73-1.01-1.7-1-1.78-1-1.79-1-1.8-.92-1.78-.9-1.78-.86-1.79-1.7-3.5-1.67-3.45-.82-1.68-.83-1.65-.82-1.62-.83-1.56-.83-1.54-.85-1.5-.87-1.43-.88-1.42-.44-.65-.43-.66-.45-.65-.47-.64-.45-.61-.46-.6-.47-.59-.47-.56-.48-.55-.48-.54-.49-.51-.5-.52-1.71-1.68-1.75-1.69-1.8-1.65-1.85-1.65-1.87-1.61-1.92-1.62-2-1.6-2-1.58-2-1.57-2-1.55-2.06-1.53-2.1-1.52-2.12-1.48-2.13-1.49-2.17-1.46-2.18-1.44-2.2-1.43-2.22-1.4-2.22-1.38-2.25-1.39-2.25-1.33-2.25-1.33-2.26-1.32-2.27-1.28-2.27-1.29-2.28-1.25-2.2-1.28-2.26-1.2-2.27-1.2-2.27-1.17-2.25-1.15-2.35-1.18-1-.52-1-.65-1-.68-1-.72-.92-.78-.85-.8-.82-.85-.76-.87-.74-.9-.66-.91-.65-.95-.6-1-.55-1-.54-1-.48-1-.45-1-.42-1-.38-1-.35-1.07-.33-1.06-.29-1.09-.26-1.08-.24-1.1-.2-1.1-.16-1.1-.15-1.12-.12-1.1-.08-1.11-.07-1.14v-3.35l.05-1.11.08-1.12.1-1.12.13-1.11.15-1.1.19-1.12.21-1.1.25-1.08.27-1.09.3-1.06.33-1.09.37-1.05.4-1.05.43-1 .47-1 .52-1 .53-1 .58-1 .62-1 .65-.93.7-.9.75-.9.78-.85.84-.84.88-.78.89-.8 1-.72 1-.66 1.07-.6 1.1-.55 1.15-.5 1.1-.42 2-.65 1.95-.57 1.94-.53 1.93-.48 1.92-.44 1.91-.38 1.92-.33 1.9-.3 1.9-.24 1.88-.2 1.93-.15 1.88-.1 1.85-.08h1.85zm-3.35 16.65-1.45.05-1.49.09-1.46.11-1.5.15-1.5.2-1.52.24-1.52.26-1.55.3-1.55.35-1.56.4-1.57.42-1.6.48-1.53.49-.35.13-.27.12-.27.13-.26.15-.27.17-.25.2-.28.21-.27.24-.27.26-.26.3-.27.32-.27.35-.26.38-.27.4-.27.45-.25.45-.23.5-.25.5-.22.55-.21.55-.2.59-.19.6-.18.61-.15.64-.15.66-.13.67-.12.67-.1.68-.07.7-.06.7v4.35l.07.71.07.7.1.69.1.68.13.67.13.66.15.65.17.62.18.62.2.58.22.58.22.55.23.52.23.5.25.48.25.44.27.43.27.38.26.37.27.33.28.32.27.28.27.25.26.22.27.22.27.18.26.15.39.2 2.2 1.12 2.33 1.2 2.35 1.21 2.37 1.24 2.36 1.26 2.37 1.29 2.37 1.3 2.36 1.28 2.39 1.35 2.34 1.35 2.37 1.4 2.37 1.41 2.36 1.44 2.35 1.46 2.34 1.49 2.33 1.51 2.32 1.54 2.3 1.55 2.28 1.58 2.25 1.62 2.23 1.62 2.23 1.65 2.2 1.66 2.19 1.69 2.15 1.71 2.11 1.75 2.09 1.75 2.06 1.8 2 1.8 2 1.84 2 1.86 1.91 1.9.74.75.73.79.72.78.68.8.68.82.65.81.64.84.63.83.6.85.6.85.57.85.58.88 1.07 1.72 1 1.75 1 1.77 1 1.76.94 1.79.91 1.76.89 1.79.86 1.76 1.69 3.49 1.66 3.45.84 1.68.83 1.65.83 1.62.84 1.6.85 1.55.86 1.5.94 1.48.92 1.45.43.65.45.68.47.65.46.65.47.63.48.62.49.6.48.58.5.57.5.55.5.55.62.62.38.41.48.54.84 1 .88 1.15.9 1.23.93 1.35 1 1.45 1 1.57 1 1.65 1.07 1.73 1.06 1.82 1.1 1.9 1.1 1.93 1.09 2 1.08 2 1.08 2.07 1 2.08 1 2.09 1 2.1.93 2.08.87 2.08.8 2 .38 1 .37 1 .33 1 .34 1 .3 1v.1h.07l.77.25.75.33.71.4.67.49.62.53.36.33.37.34.5.41.62.49.71.53.79.58.86.59.94.61 1 .62 1 .62 1.05.6 1.08.58 1.05.57 1.06.52 1.12.48.5.2.52.2.5.19.5.16.48.15.48.15.45.12.44.1.41.08.39.07.36.05h1.62l.05-.08.07-.14.08-.2.12-.3.16-.53.17-.62.17-.63.13-.65.13-.65.1-.7.1-.7.07-.73.07-.74v-4.81l-.05-.85-.06-.87-.09-.87-.1-.9-.1-.88-.13-.92-.13-.91-.17-.92-.17-.92-.36-1.91-.44-1.9-.46-1.92-.5-1.93-.55-1.95-.59-2-.6-1.94-.63-1.93-.65-1.92-.68-1.91-.69-1.89-.6-1.75-.7-1.83-.68-1.8-1.39-3.5-2.58-6.4-1-2.6-1.15-2.65-1.11-2.7-1.15-2.75-1.19-2.8-1.23-2.85-1.27-2.9-1.3-2.92-1.35-3-1.36-3-1.42-3-1.45-3-1.5-3.06-1.53-3.07-1.57-3.08-1.57-3.09-1.63-3.08-1.69-3.1-1.68-3.1-1.75-3.07-1.79-3.05-1.83-3-1.85-3-1.9-3-1.93-3-1-1.46-1-1.45-1-1.45-1-1.44-1-1.43-1-1.42-1-1.4-1-1.4-1.05-1.36-1.07-1.37-1.05-1.35-1.18-1.37-1.08-1.32-1.09-1.31-1.1-1.29-1.1-1.28-1.11-1.25-1.12-1.25-1.13-1.22-1.14-1.21-1.15-1.19-1.15-1.16-1.15-1.15-1.16-1.14-1.19-1.1-1.18-1.1-1.18-1.06-1.2-1-1.2-1-1.2-1-1.22-1-1.23-1-1.22-.92-1.23-.92-1.25-.83-1.25-.87-1.25-.82-1.25-.81-1.27-.77-1.28-.73-1.27-.73-1.28-.7-1.3-.67-1.29-.63-1.3-.62-1.31-.65-1.32-.55-1.32-.54-1.31-.5-1.34-.41-1.33-.44-1.35-.41-1.35-.37-1.35-.35-1.37-.32-1.36-.28-1.37-.3-1.38-.21-1.38-.19-1.44-.13-1.4-.12-1.42-.1-1.43-.05h-1.43zm91.55 180.67-.13.16.21-.23zm-542.03 178.3.71.06.65.12.7.13 1.07.29 1.05.35 1 .4.9.4.85.43.82.43.8.45 1.4.84 1.28.81h.6l.55.05.53.07.53.12.54.13.51.18.5.2.49.25.48.27.45.32.43.33.4.35.39.4.36.4.32.43.3.47.28.47.24.48.21.52.17.51.13.52.1.4.09.43.06.44v2.35l-.06.46-.09.47-.11.45v.1l-.13.43-.17.42-.18.42-.2.4-.05.08-.22.38-.25.37-.25.35-.28.35-.3.32-.05.06-.32.32-.33.3-.35.27-.37.26-.38.24-.07.05-.45.25-.45.21-.46.19-.49.16h-.08l-.4.1-.42.1-.4.06-.41.05h-1.9l-.45-.06-.44-.09-.25-.05-.36-.1-.37-.1-.35-.11-.63-.24-.87-.4-.73-.38-.65-.37-.62-.38-1.12-.7-1.11-.72-1.07-.68-1-.62-.44-.25-.26-.13-.29.15-.75.43-1.58.92-1.58 1-1.6 1-1.64 1.08-1.63 1.15-1.63 1.18-1.67 1.22-1.67 1.27-1.68 1.31-1.7 1.34-1.7 1.36-1.7 1.39-3.47 2.86-3.48 2.9-3.5 3-3.55 2.95-3.55 2.92-1.8 1.45-1.8 1.43-1.82 1.42-1.93 1.39-1.84 1.37-1.83 1.33-1.85 1.3-1.88 1.29-.64.4-.68.41-1.37.8-1.5.84-1.6.88-1.65.92-1.68.95-1.67 1-1.65 1-.75.48-.75.47-.7.48-.65.45-.6.43-.53.42-.47.38-.38.35-.22.2-.13.49-.18.51-.22.5-.25.49-.28.46-.3.45-.35.44-.37.4-.38.38-.42.35-.43.32-.47.3-.47.26-.5.24-.5.2-.51.16-.54.14-.53.1-.55.06h-1.63l-.54-.09-.53-.11-.53-.15-.52-.19-.5-.21-.48-.25-.47-.29-.45-.3-.42-.33-.41-.37-.37-.4-.37-.41-.31-.44-.3-.45-.27-.48-.23-.5-.2-.5-.17-.52-.13-.53-.1-.53-.07-.55v-2.09l.08-.61.2-.9.27-.85.3-.79.33-.71.37-.67.36-.63.4-.57.44-.6.76-.93.84-.9.86-.82.87-.78.9-.74.9-.7.93-.68.94-.67 1-.63.95-.62 1-.61 1.9-1.14 1.9-1.1 1.82-1 1.71-.95 1.55-.87 1.34-.75 1.08-.63.37-.22.3-.18 1.6-1.1 1.65-1.15 1.65-1.2 1.66-1.24 1.67-1.28 1.68-1.32 1.7-1.35 1.7-1.36 3.45-2.84 3.47-2.88 3.5-2.93 3.53-3 3.55-2.92 1.79-1.46 1.8-1.44 1.8-1.43 1.81-1.4 1.82-1.38 1.83-1.35 1.85-1.34 1.85-1.28 1.87-1.25 1.87-1.22 1.9-1.16 1.88-1.1 1-.55.95-.52 1-.52 1.11-.56.42-.19.35-.15.37-.13.21-.07.31-.17.35-.1.55-.12.87-.15.85-.07h.78zm25.7 44.06h.86l.42.07.43.08.42.1.4.13h.1l.43.16.44.19.43.21.4.24.4.26.38.29.35.3.35.31.07.07.32.35.31.35.29.38.26.39.24.41.21.42.2.43.17.44v.1l.15.48.12.48.1.5.05.5v1.5l-.07.5-.08.5-.12.49-.15.48-.18.48-.2.45-.24.45-.26.44-.29.41-.3.4-.33.37-.35.37-.38.33-.4.3-.42.3-.42.25-.45.25-.46.2-.47.18-.48.15-.49.12h-.06l-.52.36-.72.54-.8.6-1.83 1.41-2 1.62-2.1 1.73-2.15 1.79-2.1 1.78-3.92 3.33-3.1 2.62-1.17 1-.56.45-.55.38-1.55 1.15-1.57 1-1.61 1-1.67 1-1.7 1-1.73 1-1.77 1-1.8 1-3.65 1.73-3.7 1.94-3.7 1.95-3.68 1.93-3.64 1.95-1.75 1-1.73 1-1.68 1-1.65 1-1.6.95-1.54 1-1.46.94-1.4.95-1.34.91-1.23.92-1.18.9-.52.43-.52.42-.48.43-.47.42-.43.4-.47.47-.36.33-.4.33-.4.29-.44.26-.43.25-.47.22-.46.18-.47.17-.5.12-.48.1-.5.08h-1.5l-.52-.05-.48-.09-.5-.1-.49-.15-.46-.16-.47-.2-.45-.22-.43-.25-.42-.28-.4-.3-.38-.34-.37-.35-.35-.36-.32-.4-.28-.4-.28-.44-.24-.43-.21-.45-.19-.47-.16-.48-.14-.48-.1-.5-.06-.5v-1.5l.05-.5.07-.5.11-.5.15-.49.17-.46.2-.47.22-.45.25-.43.28-.42.3-.4.33-.38.35-.37.59-.58.68-.64.7-.63.72-.62.73-.61.75-.62 1.5-1.17 1.58-1.15 1.62-1.13 1.67-1.12 1.71-1.1 1.75-1.08 1.8-1.25 1.8-1.06 1.83-1.05 1.85-1 1.88-1 3.75-2 3.77-2 3.73-2 3.65-1.92 3.55-1.86 1.7-.94 1.67-.9 1.62-.9 1.53-.88 1.48-.87 1.42-.85 1.33-.83 1.14-.75.16-.12.9-.75 3-2.51 3.91-3.34 2.17-1.83 2.16-1.84 2.21-1.82 2.17-1.75 2-1.58 1-.75.95-.7.91-.65.92-.6.92-.58.95-.52.68-.32.75-.3.5-.15.33-.1.34-.08.35-.07h.15l.4-.07h1.18z"/><path d="m148.25 408.62.6.08.6.12.6.16.17.07h1.71l.62.06.62.1.6.17.6.2.56.25.55.28.54.34.5.36.48.4.43.44.42.48.37.5.33.52.3.55.25.56.22.59v.1l1.75 1.25 3.44 2.5 3.16 2.3 2.54 1.83 1.63 1.18 1.67 1.25 1.7 1.32 1.69 1.42 1.7 1.42 1.68 1.45 1.67 1.5 1.63 1.53.82.82.82.8.8.81.78.84.78.83.77.85.75.87.73.88.74.88.71.9.7.92.67.93.67.94.65.95.61 1 .6 1 .67 1.11.65 1.15.65 1.19.65 1.21.65 1.27.65 1.3.65 1.33.63 1.37.64 1.4.63 1.42.62 1.46.61 1.49.6 1.5.59 1.53.58 1.57.57 1.58.55 1.6.51 1.62.52 1.65.5 1.65.47 1.66.45 1.7.43 1.7.4 1.7.37 1.74.35 1.71.33 1.74.28 1.75.25 1.75.24 1.75.18 1.76.15 1.75.1 1.77.08 1.75v3.52l-.06 1.75-.12 1.73-.2 1.65-.21 1.68-.15.9-.15.87-.15.85-.19.87-.2.83-.2.85-.23.85-.25.85-.27.82-.28.83-.3.83-.32.82-.33.82-.35.8-.38.8-.39.8-.41.8-.45.76-.45.77-.49.77-.5.75-.51.73-.55.73-.57.72-.58.7-.62.68-.62.67-.66.67-.67.63-.7.63-.72.62-.73.58-.75.59-.78.55-.8.53-.82.52-.83.5-.87.48-.87.45-.9.43-.9.42-.93.4-.95.38-1 .35-1 .34-1 .3-1 .3-1.09.28-.85.2-.91.15-.92.13-.92.1-.91.07-.94.05h-2.95l-1-.06-1-.1-1-.14-1-.16-1-.2-1-.22-1-.27-1-.3-1-.35-1-.38-1-.43-1-.49-1-.53-1-.6-.95-.67-.93-.73-.92-.8-.86-.9-.77-.92-.45-.58-.37-.55-.35-.57-.35-.6-.3-.6-.3-.63-.26-.63-.22-.64-.23-.73-.24-.75-.35-1.37-.3-1.38-.23-1.37-.2-1.35-.13-1.31-.12-1.3-.08-1.29v-13.23l-.07-.91-.1-.89-.1-.85-.13-.83-.15-.8-.18-.75-.22-.8-.1-.32-.12-.35-.13-.35-.13-.35-.15-.33-.15-.35-.17-.33-.17-.34-.18-.33-.2-.33-.67-1.1-.73-1.15-.8-1.2-.87-1.25-.9-1.29-.95-1.33-1-1.35-1-1.38-2.16-2.89-2.27-2.95-4.7-6.15-2.4-3.16-2.37-3.19-1.16-1.63-1.17-1.62-1.13-1.63-.89-1.72-1-1.64-1.07-1.63-1-1.63-1-1.65-1-1.65-.93-1.67-.87-1.65-.83-1.67-.75-1.63-.38-.87-.35-.83-.34-.85-.31-.84-.29-.85-.28-.85-.27-.85-.25-.86-.21-.89-.2-.86-.17-.87-.15-.9-.13-.9-.09-.9-.06-.9v-2.77l.08-.93.12-.93.16-.95.2-.94.25-.93.3-.93.35-.92.4-.92.45-.9.5-.86.55-.85.59-.82.63-.8.67-.77.71-.71.75-.7.79-.67.81-.63.85-.59.87-.56.9-.54.93-.5 1-.46 1-.44 1-.41 1-.39 1-.36 1.09-.34 1.1-.3 1.13-.3 1.17-.26 1.18-.24 1.22-.23 1.18-.18 1.28-.18 1.32-.17 1.33-.13 1.38-.14 1.42-.1h.5l.4-.15.57-.18.58-.15.58-.1.6-.07h.61zm-3.4 17.3-1.15.08-1.12.1-1.06.12-1 .11-1 .15-.91.15-.89.15-.83.17-.78.18-.74.2-.68.19-.65.2-.6.2-.55.21-.5.2-.47.22-.41.2-.39.22-.33.18-.3.2-.27.18-.23.19-.2.16-.17.15-.13.15-.13.14-.1.13-.09.13-.08.12-.07.12-.06.11-.05.14v.13l-.05.13v.17l-.05.17v2.18l.05.37.06.4.09.43.1.43.13.47.13.48.15.5.17.52.18.53.22.55.22.57.23.57.25.56.58 1.25.64 1.27.68 1.32.75 1.33.8 1.37.85 1.41.9 1.42.95 1.45 1 1.47 1 1.48 1.05 1.5 1.01 1.5 1.1 1.52 2.27 3.06 2.32 3.05 4.68 6.12 2.3 3 2.23 3 1.1 1.47 1.07 1.46 1 1.45 1 1.44 1 1.43.93 1.4.9 1.4.85 1.4.42.7.38.72.38.71.34.72.33.73.3.72.28.72.27.71.25.74.23.76.39 1.37.33 1.42.27 1.4.21 1.36.17 1.35.13 1.34.1 1.3.07 1.28v12.18l.05.92.08.88.1.85.1.8.15.78.15.75.2.75.1.3v.2l.13.12.12.1.18.12.22.13.25.15.3.13.35.15.37.15.4.14.41.13.45.12.47.1.47.1.5.08.48.07.48.05h3l.3-.05h.25l.25-.07.62-.15.63-.18.62-.2.58-.2.59-.22.55-.22.53-.21.5-.24.5-.25.48-.25.45-.25.45-.26.42-.27.42-.28.4-.29.38-.28.37-.3.35-.3.35-.32.33-.31.32-.34.31-.33.3-.33.3-.35.29-.37.26-.35.27-.38.25-.39.25-.4.25-.4.23-.41.22-.42.22-.43.2-.44.2-.45.2-.46.18-.49.17-.48.16-.48.17-.52.15-.52.13-.51.15-.54.12-.55.12-.55.1-.56.1-.59.1-.55.15-1.21.11-1.24.09-1.25.05-1.28v-2.73l-.05-1.35-.09-1.38-.13-1.4-.15-1.42-.17-1.42-.21-1.43-.25-1.45-.27-1.45-.28-1.47-.32-1.45-.35-1.46-.37-1.45-.38-1.45-.42-1.45-.41-1.44-.45-1.43-.47-1.42-.48-1.4-.3-1.38-.51-1.37-.5-1.35-.54-1.31-.53-1.3-.55-1.29-.53-1.23-.57-1.22-.55-1.18-.55-1.13-.55-1.12-.55-1.07-.55-1-.55-1-.53-.94-.52-.88-.42-.67-.43-.66-.45-.69-.47-.66-.5-.69-.51-.66-.54-.69-.56-.68-.57-.67-.58-.68-.6-.67-.64-.66-.63-.67-.63-.67-.67-.66-.65-.64-1.4-1.3-1.4-1.26-1.43-1.25-1.45-1.2-1.47-1.19-1.48-1.13-1.47-1.1-1.5-1.1-2.53-1.82-3.19-2.31-3.43-2.5-3.32-2.38-2.12-1.5z"/><path d="m381.28 343.38.6.1.6.15.59.19.56.23.55.28.52.32.52.35.46.38.45.44.42.45.37.48.35.52.3.53.26.55.22.58.18.59.14.6.08.6.05.61v.67l-.05.62-.08.6-.14.6-.18.6-.22.56-.26.55-.3.54-.35.51-.37.49-.42.45-.45.43-.75.65.1.33.05.3 1.42-.8 4.83-2.81 4.5-2.62 5.09-2.95 5-2.88 2.27-1.27.3-.22.88-.53.65-.33.47-.22h.1l1.61-.87 1.5-.78.77-.37.52-.22.4-.16.41-.14.22-.06.58-.17.59-.1.58-.08h1.27l.61.07.6.1.6.15.59.18.58.25.55.27.52.31 2.01-1.98 1-1 1-.91 1-.89 1-.86 1-.84 1-.78 1-.77 1-.68.65-.38.62-.34.67-.33.73-.32.83-.28.57-.17.37-.08.36-.07.25-.05.45-.06.45-.05h1.97l.43.07.42.06.2.05.47.12.45.15.45.17.2.06.46.22.45.23.44.27.16.1.44.3.4.3.38.35.15.15.33.33.34.35.28.39.13.18.25.33.24.35.2.37.11.22.24.48.21.5.09.25.15.43.13.44.07.3.1.36.06.37.1.62.09.93v1.82l-.1.85-.15.78-.2.74-.23.66-.29.7-.5 1-.58 1-.63.91-.64.85-.68.8-.7.79-.73.76-.75.74-.8.75-.82.73-.85.73-.88.75-.9.74-.95.73-1 .77-2 1.48-2.12 1.52-2.14 1.59-2.28 1.52-2.32 1.52-2.4 1.51-2.4 1.5-2.42 1.49-2.43 1.46-2.42 1.44-2.41 1.43-2.35 1.35-2.3 1.28-2.22 1.24-2.13 1.13-2.05 1.08-1.92 1-1.8.93-1.67.83-1.51.75-1.37.67-1.23.55-1 .42-1.36.56-1.4.64-1.54.7-1.61.78-1.69.82-1.66.85-3.32 1.68-3 1.57-2.41 1.3-2.24 1.21-.55.29-.56.23-.6.18-.6.15-.62.1h-.4l-.72.45-1 .6-1 .55-1 .53-1.09.58-1 .48-1 .47-1 .43-.43.17-1.18.78-1.37.9-1.38.87-1.4.83-1.4.82-1.42.8-.32.16h-.06l-1.4 1.05-1.42 1-1.47 1-1.48 1-1.79 1.24-.86.46-.9.44-1.84.83-1 .43-.34.37-2.21 2.42-1.1 1.18-.59.62-.6.58-.61.6-.69.6-.78.63-.62.4-.38.25-.4.24-.32.16-.46.22-.47.2h-.15l-.42.15-.43.13h-.13l-.55.11-.59.1h-.04l-.49.05h-1.06l-.55-.05-.57-.08-.55-.13h-.1l-.47-.13-.45-.17-.43-.18-.42-.22-.1-.05-.53-.3-.52-.35-.48-.38-.08-.07-.44-.4-.4-.42-.36-.45-.09-.1-.26-.38-.25-.4-.24-.4-.06-.12-.25-.51-.22-.54-.05-.15-.15-.45-.13-.46-.12-.52-.18-.76-.06-.76v-1.84l.06-.48v-.15l.08-.42.12-.41v-.15l.12-.39.15-.36.18-.49.37-.73.25-.43.2-.32.2-.3.23-.32.25-.33.27-.33.5-.55.73-.74.73-.63.49-.37-.24-.16-.33-.25-.1-.09-.38-.33-.35-.35-.09-.1-.38-.42-.35-.45-.07-.1-.33-.5-.3-.51-.05-.1-.2-.4-.17-.4-.15-.4v-.1l-.13-.42-.1-.43-.09-.42v-.12l-.07-.41v-1.54l.05-.56v-.12l.08-.53.12-.54v-.11l.13-.44.14-.41.05-.12.21-.52.24-.48.13-.25.28-.5.34-.47.18-.26.25-.32.27-.33.54-.54.68-.65.58-.5-.08-.81v-2.04l.12-.59.13-.58.2-.55v-.15l.15-.4.19-.4.2-.37.1-.16.23-.4.25-.39.32-.43.51-.62.55-.58.85-.8.92-.75.92-.7 1-.7 1-.68 1.06-.7 1.1-.72 1.17-.72 1.22-.73 2.46-1.45 2.57-1.48.2-.1.12-.3.18-.4.22-.4.13-.24.27-.41.26-.4.32-.39.17-.2.38-.43.43-.4.1-.08.3-.27.34-.25.23-.18 4.75-3.19 5.23-3.55 5.5-3.76 5.35-3.69 8.79-6.05 3.61-2.5.52-.33.55-.28.55-.25.58-.22.59-.17.61-.11.6-.09h1.24zm20.54 83.62.66-1.07.8-1 .89-.95 1.81-1.3 1.07-.48 3.35 1.08 1.28-1.72 1.64-1.55 1.88-1.23 2.07-.9 2.18-.52 2.25-.13 2.23.27 2.15.63 2 1 1.8 1.33 1.53 1.63 1.25 1.89.89 2.06.51 2.19.15.91.09 1.47.16 1.3-.56.55-.25 1.15-.42 1.7-.27 1.05-.05.19-.18.93-.27 1.18-.3 1.25-.36 1.3-.44 1.37-.5 1.42-.56 1.38-.39.82-.36.75-.42.78-.45.78-.48.79-.55.8-.6.81-.67.82-.75.82-.82.8h-.05l-.85.75-1 .75-1.1.72-1.17.66-1.26.59-1.35.48-1.4.38-1.45.27-1.47.13h-1.47l-1.43-.1-1.42-.2-1.36-.32-1.49-.45-1.38-.55-1.38-.78-1.19-.85-1.2-1.07-1.31-1.55-1-1.63-.7-1.48-.48-1.32-.33-1.23-.25-1.14-.15-1.08-.12-1.05-.05-1v-2l.05-.85v-.15l.15-1 .18-1 .24-1 .28-1.05.37-1.08.45-1.13.55-1.17.7-1.23.71-1.07.42-1.25.55-1.18zm7.33 19.7-.22-.07.34.12-.69-.3-.16-.05zm-3.42-2.49.47.42-.57-.57-.08-.08zm11.09-2.86-.22.16.8-.5-.37-.36zm13.11-4.95 2.37.5 1.6-4.4zm4-4 .14-.38v-.35z" fill="#fff"/><path d="m579.92 998.37h1.11l1.59.05 1.58.1 1.62.15 1.63.2 1.58.27.92.18.88.18.89.24.91.26.94.3 1 .37 1 .43 1 .52 1.1.62 1.13.73 1.18.88 1.19 1.07 1.16 1.28 1 1.34.75 1.21.62 1.19.57 1.3.46 1.43.37 1.52.22 1.61v1.67l-.12 1.67-.28 1.65-.44 1.55-.55 1.45-.66 1.31-.7 1.19-.77 1-.77.93-.76.8-.75.72-.87.73-1.28 1-1.37.85-1.28.68-1.24.59-1.18.5-1.15.43-1.12.38-1.1.34-1.06.31-1.07.29-1.07.26-2 .44-1.73.46-1.8.33-1.62.3-2.68.47-2.88.53-3.25.57-3.5.57-3.67.55-1.82.26v.14h.35l2.5.72 2.34 1.11 2.1 1.54 1.81 1.85 1.45 2.15 1.07 2.36.65 2.5.2 2.6-.23 2.59-.7 2.5-1.1 2.33-1.5 2.13-1.85 1.82-2.14 1.48-2.35 1.1-2.5.67h-.31l-.05.13-.62 1.54-1.5 2.16-1.13 1.25-.9.85-.82.7-.85.64-.83.58-.85.53-.95.52-1.37.65-1.32.5-1 .33-.9.27-.27.08.5-.18.5-.22.37-.2.43-.25.47-.31.48-.35.45-.4.44-.42.36-.42.34-.4.26-.36.2-.34.09-.15-6 1.84h1.09-.5l-1.14.16h-.21l-12.35 3.8-1-3.14-14.78.12-11.19.08h-8.71l-2.52-.23-2.47-.65-2.3-1.07-2.08-1.45-1.8-1.8-.85-1.22-.67-.21-.88-.34-.92-.4-.95-.48-1-.55-1.05-.68-1.06-.82-1.09-1-1.08-1.15-1-1.32-.95-1.51-.15-.3h-30.47l-2.21.15-1.34.09-1.46.08h-4.25l-1-.07-1-.1-1.13-.15-1.23-.25-1.39-.35-1.55-.51-1.73-.79-1.68-1-1.22-.91-1-.92-1-1.07-1-1.25-.88-1.38-.74-1.52-.58-1.6-.4-1.63-.22-1.6-.05-1.55.09-1.45.18-1.35.28-1.23.37-1.24.58-1.51.77-1.55.88-1.45 1-1.34 1.07-1.2 1.12-1.06 1.13-.92 1.12-.78 1.1-.69 1.06-.56 1-.49 1-.4.93-.33.89-.3.85-.23.88-.24 1.4-.31 1.35-.25 1.2-.19 1-.15.56-.1.35-1.73.42-1.62 1.35-2.6 1.42-1.86 1.51-1.54 1.84-1.36 1.53-.85 1-.5.82-.35.82-.34.88-.33 1.5-.5 1.57-.47 1.55-.38 1.55-.35 1.55-.3 1.55-.27 1.55-.23 1.56-.22 1.57-.2 1.57-.16 1.56-.15 1.59-.15 2.11-.17 1-.07 3.05-.2 2.95-.16 5.48-.3 2.42-.15 2.15-.17.88-.07.82-.08.68-.08.6-.09 3.94-.61 4-.65 4-.69 4.05-.71 4.06-.74 4.09-.75 8.21-1.51 4.15-.77 4.17-.75 4.18-.73 4.2-.72 4.24-.68 4.25-.67 4.26-.62 4.2-.56 1.84-.25 1.66-.22 2-.23 2.37-.27 2.62-.23 2.76-.22 1.49-.1 1.5-.07 1.51-.06h3.54z" fill="#808080"/></g></svg>
{images → assets/img}/payment-methods/alipay.svg RENAMED
File without changes
{images → assets/img}/payment-methods/amex.svg RENAMED
File without changes
{images → assets/img}/payment-methods/bancontact.svg RENAMED
File without changes
{images → assets/img}/payment-methods/diners.svg RENAMED
File without changes
{images → assets/img}/payment-methods/discover.svg RENAMED
File without changes
{images → assets/img}/payment-methods/eps.svg RENAMED
File without changes
{images → assets/img}/payment-methods/giropay.svg RENAMED
File without changes
{images → assets/img}/payment-methods/ideal.svg RENAMED
File without changes
{images → assets/img}/payment-methods/jcb.svg RENAMED
File without changes
{images → assets/img}/payment-methods/laser.svg RENAMED
File without changes
{images → assets/img}/payment-methods/maestro.svg RENAMED
File without changes
{images → assets/img}/payment-methods/mastercard.svg RENAMED
File without changes
{images → assets/img}/payment-methods/multibanco.svg RENAMED
File without changes
{images → assets/img}/payment-methods/p24.svg RENAMED
File without changes
{images → assets/img}/payment-methods/sepa.svg RENAMED
File without changes
{images → assets/img}/payment-methods/sofort.svg RENAMED
File without changes
{images → assets/img}/payment-methods/unionpay.svg RENAMED
File without changes
{images → assets/img}/payment-methods/visa.svg RENAMED
File without changes
{images → assets/img}/payment-methods/wechat.svg RENAMED
File without changes
{images/previews → assets/img}/pennant.jpg RENAMED
File without changes
assets/img/single-product-preview.svg ADDED
@@ -0,0 +1,5 @@
 
 
 
 
 
1
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 230 100">
2
+ <g fill="#E1E3E6" fill-rule="nonzero">
3
+ <path d="M76 0h11v6H76zM76 11h88v11H76zM76 27h28v6H76zM76 44h154v28H76zM76 83h22v17H76zM104 83h44v17h-44zM0 0h66v66H0z"/>
4
+ </g>
5
+ </svg>
assets/js/atomic/blocks/product-elements/add-to-cart/block.js CHANGED
@@ -3,10 +3,7 @@
3
  */
4
  import PropTypes from 'prop-types';
5
  import classnames from 'classnames';
6
- import {
7
- AddToCartFormContextProvider,
8
- useAddToCartFormContext,
9
- } from '@woocommerce/base-context';
10
  import { useProductDataContext } from '@woocommerce/shared-context';
11
  import { isEmpty } from 'lodash';
12
  import { withProductDataContext } from '@woocommerce/shared-hocs';
@@ -49,35 +46,32 @@ const Block = ( { className, showFormElements } ) => {
49
  showFormElements={ showFormElements }
50
  >
51
  <div className={ componentClass }>
52
- <AddToCartForm />
 
 
 
 
 
 
53
  </div>
54
  </AddToCartFormContextProvider>
55
  );
56
  };
57
 
58
- /**
59
- * Renders the add to cart form using useAddToCartFormContext.
60
- */
61
- const AddToCartForm = () => {
62
- const { showFormElements, productType } = useAddToCartFormContext();
63
-
64
- if ( showFormElements ) {
65
- if ( productType === 'variable' ) {
66
- return <VariableProductForm />;
67
- }
68
- if ( productType === 'grouped' ) {
69
- return <GroupedProductForm />;
70
- }
71
- if ( productType === 'external' ) {
72
- return <ExternalProductForm />;
73
- }
74
- if ( productType === 'simple' || productType === 'variation' ) {
75
- return <SimpleProductForm />;
76
- }
77
- return null;
78
  }
79
-
80
- return <AddToCartButton />;
 
 
 
 
 
 
 
 
81
  };
82
 
83
  Block.propTypes = {
3
  */
4
  import PropTypes from 'prop-types';
5
  import classnames from 'classnames';
6
+ import { AddToCartFormContextProvider } from '@woocommerce/base-context';
 
 
 
7
  import { useProductDataContext } from '@woocommerce/shared-context';
8
  import { isEmpty } from 'lodash';
9
  import { withProductDataContext } from '@woocommerce/shared-hocs';
46
  showFormElements={ showFormElements }
47
  >
48
  <div className={ componentClass }>
49
+ <>
50
+ { showFormElements ? (
51
+ <AddToCartForm productType={ product.type } />
52
+ ) : (
53
+ <AddToCartButton />
54
+ ) }
55
+ </>
56
  </div>
57
  </AddToCartFormContextProvider>
58
  );
59
  };
60
 
61
+ const AddToCartForm = ( { productType } ) => {
62
+ if ( productType === 'variable' ) {
63
+ return <VariableProductForm />;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
64
  }
65
+ if ( productType === 'grouped' ) {
66
+ return <GroupedProductForm />;
67
+ }
68
+ if ( productType === 'external' ) {
69
+ return <ExternalProductForm />;
70
+ }
71
+ if ( productType === 'simple' || productType === 'variation' ) {
72
+ return <SimpleProductForm />;
73
+ }
74
+ return null;
75
  };
76
 
77
  Block.propTypes = {
assets/js/atomic/blocks/product-elements/add-to-cart/edit.js CHANGED
@@ -2,17 +2,11 @@
2
  * External dependencies
3
  */
4
  import { __ } from '@wordpress/i18n';
5
- import EditProductLink from '@woocommerce/editor-components/edit-product-link';
6
  import { useProductDataContext } from '@woocommerce/shared-context';
7
  import classnames from 'classnames';
8
- import {
9
- Disabled,
10
- PanelBody,
11
- ToggleControl,
12
- Notice,
13
- } from '@wordpress/components';
14
  import { InspectorControls } from '@wordpress/block-editor';
15
- import { productSupportsAddToCartForm } from '@woocommerce/base-utils';
16
 
17
  /**
18
  * Internal dependencies
@@ -34,11 +28,11 @@ const Edit = ( { attributes, setAttributes } ) => {
34
  ) }
35
  >
36
  <EditProductLink productId={ product.id } />
37
- <InspectorControls>
38
- <PanelBody
39
- title={ __( 'Layout', 'woo-gutenberg-products-block' ) }
40
- >
41
- { productSupportsAddToCartForm( product ) ? (
42
  <ToggleControl
43
  label={ __(
44
  'Display form elements',
@@ -55,20 +49,9 @@ const Edit = ( { attributes, setAttributes } ) => {
55
  } )
56
  }
57
  />
58
- ) : (
59
- <Notice
60
- className="wc-block-components-product-add-to-cart-notice"
61
- isDismissible={ false }
62
- status="info"
63
- >
64
- { __(
65
- 'This product does not support the block based add to cart form. A link to the product page will be shown instead.',
66
- 'woo-gutenberg-products-block'
67
- ) }
68
- </Notice>
69
- ) }
70
- </PanelBody>
71
- </InspectorControls>
72
  <Disabled>
73
  <Block { ...attributes } />
74
  </Disabled>
@@ -80,7 +63,7 @@ export default withProductSelector( {
80
  icon: BLOCK_ICON,
81
  label: BLOCK_TITLE,
82
  description: __(
83
- 'Choose a product to display its add to cart form.',
84
  'woo-gutenberg-products-block'
85
  ),
86
  } )( Edit );
2
  * External dependencies
3
  */
4
  import { __ } from '@wordpress/i18n';
5
+ import EditProductLink from '@woocommerce/block-components/edit-product-link';
6
  import { useProductDataContext } from '@woocommerce/shared-context';
7
  import classnames from 'classnames';
8
+ import { Disabled, PanelBody, ToggleControl } from '@wordpress/components';
 
 
 
 
 
9
  import { InspectorControls } from '@wordpress/block-editor';
 
10
 
11
  /**
12
  * Internal dependencies
28
  ) }
29
  >
30
  <EditProductLink productId={ product.id } />
31
+ { product.type !== 'external' && (
32
+ <InspectorControls>
33
+ <PanelBody
34
+ title={ __( 'Layout', 'woo-gutenberg-products-block' ) }
35
+ >
36
  <ToggleControl
37
  label={ __(
38
  'Display form elements',
49
  } )
50
  }
51
  />
52
+ </PanelBody>
53
+ </InspectorControls>
54
+ ) }
 
 
 
 
 
 
 
 
 
 
 
55
  <Disabled>
56
  <Block { ...attributes } />
57
  </Disabled>
63
  icon: BLOCK_ICON,
64
  label: BLOCK_TITLE,
65
  description: __(
66
+ "Choose a product to display it's add to cart form.",
67
  'woo-gutenberg-products-block'
68
  ),
69
  } )( Edit );
assets/js/atomic/blocks/product-elements/add-to-cart/frontend.js CHANGED
@@ -1,6 +1,7 @@
1
  /**
2
  * External dependencies
3
  */
 
4
  import withFilteredAttributes from '@woocommerce/base-hocs/with-filtered-attributes';
5
 
6
  /**
@@ -9,4 +10,4 @@ import withFilteredAttributes from '@woocommerce/base-hocs/with-filtered-attribu
9
  import Block from './block';
10
  import attributes from './attributes';
11
 
12
- export default withFilteredAttributes( attributes )( Block );
1
  /**
2
  * External dependencies
3
  */
4
+ import { compose } from '@wordpress/compose';
5
  import withFilteredAttributes from '@woocommerce/base-hocs/with-filtered-attributes';
6
 
7
  /**
10
  import Block from './block';
11
  import attributes from './attributes';
12
 
13
+ export default compose( withFilteredAttributes( attributes ) )( Block );
assets/js/atomic/blocks/product-elements/add-to-cart/product-types/simple.js CHANGED
@@ -18,8 +18,8 @@ const Simple = () => {
18
  quantity,
19
  minQuantity,
20
  maxQuantity,
21
- dispatchActions,
22
- isDisabled,
23
  } = useAddToCartFormContext();
24
 
25
  if ( product.id && ! product.is_purchasable ) {
@@ -43,8 +43,8 @@ const Simple = () => {
43
  value={ quantity }
44
  min={ minQuantity }
45
  max={ maxQuantity }
46
- disabled={ isDisabled }
47
- onChange={ dispatchActions.setQuantity }
48
  />
49
  <AddToCartButton />
50
  </>
18
  quantity,
19
  minQuantity,
20
  maxQuantity,
21
+ setQuantity,
22
+ formDisabled,
23
  } = useAddToCartFormContext();
24
 
25
  if ( product.id && ! product.is_purchasable ) {
43
  value={ quantity }
44
  min={ minQuantity }
45
  max={ maxQuantity }
46
+ disabled={ formDisabled }
47
+ onChange={ setQuantity }
48
  />
49
  <AddToCartButton />
50
  </>
assets/js/atomic/blocks/product-elements/add-to-cart/product-types/variable/index.js CHANGED
@@ -23,8 +23,8 @@ const Variable = () => {
23
  quantity,
24
  minQuantity,
25
  maxQuantity,
26
- dispatchActions,
27
- isDisabled,
28
  } = useAddToCartFormContext();
29
 
30
  if ( product.id && ! product.is_purchasable ) {
@@ -44,16 +44,13 @@ const Variable = () => {
44
 
45
  return (
46
  <>
47
- <VariationAttributes
48
- product={ product }
49
- dispatchers={ dispatchActions }
50
- />
51
  <QuantityInput
52
  value={ quantity }
53
  min={ minQuantity }
54
  max={ maxQuantity }
55
- disabled={ isDisabled }
56
- onChange={ dispatchActions.setQuantity }
57
  />
58
  <AddToCartButton />
59
  </>
23
  quantity,
24
  minQuantity,
25
  maxQuantity,
26
+ setQuantity,
27
+ formDisabled,
28
  } = useAddToCartFormContext();
29
 
30
  if ( product.id && ! product.is_purchasable ) {
44
 
45
  return (
46
  <>
47
+ <VariationAttributes product={ product } />
 
 
 
48
  <QuantityInput
49
  value={ quantity }
50
  min={ minQuantity }
51
  max={ maxQuantity }
52
+ disabled={ formDisabled }
53
+ onChange={ setQuantity }
54
  />
55
  <AddToCartButton />
56
  </>
assets/js/atomic/blocks/product-elements/add-to-cart/product-types/variable/variation-attributes/attribute-picker.js CHANGED
@@ -2,15 +2,14 @@
2
  * External dependencies
3
  */
4
  import { useState, useEffect, useMemo } from '@wordpress/element';
5
- import { useShallowEqual } from '@woocommerce/base-hooks';
6
 
7
  /**
8
  * Internal dependencies
9
  */
10
  import AttributeSelectControl from './attribute-select-control';
11
  import {
12
- getVariationMatchingSelectedAttributes,
13
- getActiveSelectControlOptions,
14
  } from './utils';
15
 
16
  /**
@@ -18,74 +17,88 @@ import {
18
  *
19
  * @param {*} props Component props.
20
  */
21
- const AttributePicker = ( {
22
- attributes,
23
- variationAttributes,
24
- setRequestParams,
25
- } ) => {
26
- const currentAttributes = useShallowEqual( attributes );
27
- const currentVariationAttributes = useShallowEqual( variationAttributes );
28
  const [ variationId, setVariationId ] = useState( 0 );
29
- const [ selectedAttributes, setSelectedAttributes ] = useState( {} );
30
 
31
- // Get options for each attribute picker.
32
- const filteredAttributeOptions = useMemo( () => {
33
- return getActiveSelectControlOptions(
34
- currentAttributes,
35
- currentVariationAttributes,
36
- selectedAttributes
37
- );
38
- }, [ selectedAttributes, currentAttributes, currentVariationAttributes ] );
39
 
40
- // Select variations when selections are change.
41
- useEffect( () => {
42
- const hasSelectedAllAttributes =
43
- Object.values( selectedAttributes ).filter(
44
- ( selected ) => selected !== ''
45
- ).length === Object.keys( currentAttributes ).length;
 
 
 
 
 
46
 
47
- if ( hasSelectedAllAttributes ) {
48
- setVariationId(
49
- getVariationMatchingSelectedAttributes(
50
- currentAttributes,
51
- currentVariationAttributes,
52
- selectedAttributes
53
- )
54
  );
55
- } else if ( variationId > 0 ) {
56
- // Unset variation when form is incomplete.
57
- setVariationId( 0 );
58
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
59
  }, [
 
 
 
60
  selectedAttributes,
61
- variationId,
62
- currentAttributes,
63
- currentVariationAttributes,
64
  ] );
65
 
66
- // Set requests params as variation ID and data changes.
67
  useEffect( () => {
68
- setRequestParams( {
69
- id: variationId,
70
- variation: Object.keys( selectedAttributes ).map(
71
- ( attributeName ) => {
72
- return {
73
- attribute: attributeName,
74
- value: selectedAttributes[ attributeName ],
75
- };
76
- }
77
- ),
78
  } );
79
- }, [ setRequestParams, variationId, selectedAttributes ] );
80
 
 
 
 
 
 
 
 
 
 
81
  return (
82
  <div className="wc-block-components-product-add-to-cart-attribute-picker">
83
- { Object.keys( currentAttributes ).map( ( attributeName ) => (
84
  <AttributeSelectControl
85
  key={ attributeName }
86
  attributeName={ attributeName }
87
  options={ filteredAttributeOptions[ attributeName ] }
88
- value={ selectedAttributes[ attributeName ] }
89
  onChange={ ( selected ) => {
90
  setSelectedAttributes( {
91
  ...selectedAttributes,
@@ -94,6 +107,7 @@ const AttributePicker = ( {
94
  } }
95
  />
96
  ) ) }
 
97
  </div>
98
  );
99
  };
2
  * External dependencies
3
  */
4
  import { useState, useEffect, useMemo } from '@wordpress/element';
 
5
 
6
  /**
7
  * Internal dependencies
8
  */
9
  import AttributeSelectControl from './attribute-select-control';
10
  import {
11
+ getVariationsMatchingSelectedAttributes,
12
+ getSelectControlOptions,
13
  } from './utils';
14
 
15
  /**
17
  *
18
  * @param {*} props Component props.
19
  */
20
+ const AttributePicker = ( { attributes, variationAttributes } ) => {
 
 
 
 
 
 
21
  const [ variationId, setVariationId ] = useState( 0 );
 
22
 
23
+ // @todo Support default selected attributes in Variation Picker.
24
+ const [ selectedAttributes, setSelectedAttributes ] = useState( [] );
 
 
 
 
 
 
25
 
26
+ const attributeNames = Object.keys( attributes );
27
+ const hasSelectedAttributes =
28
+ Object.values( selectedAttributes ).filter( Boolean ).length > 0;
29
+ const hasSelectedAllAttributes =
30
+ Object.values( selectedAttributes ).filter(
31
+ ( selected ) => selected !== ''
32
+ ).length === attributeNames.length;
33
+
34
+ // Gets valid attribute options for the picker taking current selections into account.
35
+ const filteredAttributeOptions = useMemo( () => {
36
+ const options = [];
37
 
38
+ attributeNames.forEach( ( attributeName ) => {
39
+ const currentAttribute = attributes[ attributeName ];
40
+ const attributeNamesExcludingCurrentAttribute = attributeNames.filter(
41
+ ( name ) => name !== attributeName
 
 
 
42
  );
43
+ const matchingVariationIds = hasSelectedAttributes
44
+ ? getVariationsMatchingSelectedAttributes( {
45
+ selectedAttributes,
46
+ variationAttributes,
47
+ attributeNames: attributeNamesExcludingCurrentAttribute,
48
+ } )
49
+ : null;
50
+ const validAttributeTerms =
51
+ matchingVariationIds !== null
52
+ ? matchingVariationIds.map(
53
+ ( varId ) =>
54
+ variationAttributes[ varId ][ attributeName ]
55
+ )
56
+ : null;
57
+ options[ attributeName ] = getSelectControlOptions(
58
+ currentAttribute.terms,
59
+ validAttributeTerms
60
+ );
61
+ } );
62
+
63
+ return options;
64
  }, [
65
+ attributes,
66
+ variationAttributes,
67
+ attributeNames,
68
  selectedAttributes,
69
+ hasSelectedAttributes,
 
 
70
  ] );
71
 
72
+ // Select variation when selections change.
73
  useEffect( () => {
74
+ if ( ! hasSelectedAllAttributes ) {
75
+ setVariationId( 0 );
76
+ return;
77
+ }
78
+
79
+ const matchingVariationIds = getVariationsMatchingSelectedAttributes( {
80
+ selectedAttributes,
81
+ variationAttributes,
82
+ attributeNames,
 
83
  } );
 
84
 
85
+ setVariationId( matchingVariationIds[ 0 ] || 0 );
86
+ }, [
87
+ selectedAttributes,
88
+ variationAttributes,
89
+ attributeNames,
90
+ hasSelectedAllAttributes,
91
+ ] );
92
+
93
+ // @todo Hook up Variation Picker with Cart Form.
94
  return (
95
  <div className="wc-block-components-product-add-to-cart-attribute-picker">
96
+ { attributeNames.map( ( attributeName ) => (
97
  <AttributeSelectControl
98
  key={ attributeName }
99
  attributeName={ attributeName }
100
  options={ filteredAttributeOptions[ attributeName ] }
101
+ selected={ selectedAttributes[ attributeName ] }
102
  onChange={ ( selected ) => {
103
  setSelectedAttributes( {
104
  ...selectedAttributes,
107
  } }
108
  />
109
  ) ) }
110
+ <p>Matched variation ID: { variationId }</p>
111
  </div>
112
  );
113
  };
assets/js/atomic/blocks/product-elements/add-to-cart/product-types/variable/variation-attributes/attribute-select-control.js CHANGED
@@ -4,12 +4,6 @@
4
  import { __ } from '@wordpress/i18n';
5
  import { decodeEntities } from '@wordpress/html-entities';
6
  import { SelectControl } from '@wordpress/components';
7
- import { useEffect } from 'react';
8
- import classnames from 'classnames';
9
- import {
10
- ValidationInputError,
11
- useValidationContext,
12
- } from '@woocommerce/base-context';
13
 
14
  // Default option for select boxes.
15
  const selectAnOption = {
@@ -25,66 +19,17 @@ const selectAnOption = {
25
  const AttributeSelectControl = ( {
26
  attributeName,
27
  options = [],
28
- value = '',
29
  onChange = () => {},
30
- errorMessage = __(
31
- 'Please select a value.',
32
- 'woo-gutenberg-products-block'
33
- ),
34
  } ) => {
35
- const {
36
- getValidationError,
37
- setValidationErrors,
38
- clearValidationError,
39
- } = useValidationContext();
40
- const errorId = attributeName;
41
- const error = getValidationError( errorId ) || {};
42
-
43
- useEffect( () => {
44
- if ( value ) {
45
- clearValidationError( errorId );
46
- } else {
47
- setValidationErrors( {
48
- [ errorId ]: {
49
- message: errorMessage,
50
- hidden: true,
51
- },
52
- } );
53
- }
54
- }, [
55
- value,
56
- errorId,
57
- errorMessage,
58
- clearValidationError,
59
- setValidationErrors,
60
- ] );
61
-
62
- // Remove validation errors when unmounted.
63
- useEffect( () => () => void clearValidationError( errorId ), [
64
- errorId,
65
- clearValidationError,
66
- ] );
67
-
68
  return (
69
- <div className="wc-block-components-product-add-to-cart-attribute-picker__container">
70
- <SelectControl
71
- label={ decodeEntities( attributeName ) }
72
- value={ value || '' }
73
- options={ [ selectAnOption, ...options ] }
74
- onChange={ onChange }
75
- required={ true }
76
- className={ classnames(
77
- 'wc-block-components-product-add-to-cart-attribute-picker__select',
78
- {
79
- 'has-error': error.message && ! error.hidden,
80
- }
81
- ) }
82
- />
83
- <ValidationInputError
84
- propertyName={ errorId }
85
- elementId={ errorId }
86
- />
87
- </div>
88
  );
89
  };
90
 
4
  import { __ } from '@wordpress/i18n';
5
  import { decodeEntities } from '@wordpress/html-entities';
6
  import { SelectControl } from '@wordpress/components';
 
 
 
 
 
 
7
 
8
  // Default option for select boxes.
9
  const selectAnOption = {
19
  const AttributeSelectControl = ( {
20
  attributeName,
21
  options = [],
22
+ selected = '',
23
  onChange = () => {},
 
 
 
 
24
  } ) => {
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
25
  return (
26
+ <SelectControl
27
+ className="wc-block-components-product-add-to-cart-attribute-picker__select"
28
+ label={ decodeEntities( attributeName ) }
29
+ value={ selected || '' }
30
+ options={ [ selectAnOption, ...options ] }
31
+ onChange={ onChange }
32
+ />
 
 
 
 
 
 
 
 
 
 
 
 
33
  );
34
  };
35
 
assets/js/atomic/blocks/product-elements/add-to-cart/product-types/variable/variation-attributes/index.js CHANGED
@@ -8,13 +8,16 @@ import { getAttributes, getVariationAttributes } from './utils';
8
  /**
9
  * VariationAttributes component.
10
  *
11
- * @param {Object} props Incoming props
12
- * @param {Object} props.product Product
13
- * @param {Object} props.dispatchers An object where values are dispatching functions.
14
  */
15
- const VariationAttributes = ( { product, dispatchers } ) => {
16
- const attributes = getAttributes( product.attributes );
17
- const variationAttributes = getVariationAttributes( product.variations );
 
 
 
 
 
18
 
19
  if (
20
  Object.keys( attributes ).length === 0 ||
@@ -27,7 +30,6 @@ const VariationAttributes = ( { product, dispatchers } ) => {
27
  <AttributePicker
28
  attributes={ attributes }
29
  variationAttributes={ variationAttributes }
30
- setRequestParams={ dispatchers.setRequestParams }
31
  />
32
  );
33
  };
8
  /**
9
  * VariationAttributes component.
10
  *
11
+ * @param {*} props Component props.
 
 
12
  */
13
+ const VariationAttributes = ( { product } ) => {
14
+ const {
15
+ attributes: productAttributes = {},
16
+ variations: productVariations = [],
17
+ } = product;
18
+
19
+ const attributes = getAttributes( productAttributes );
20
+ const variationAttributes = getVariationAttributes( productVariations );
21
 
22
  if (
23
  Object.keys( attributes ).length === 0 ||
30
  <AttributePicker
31
  attributes={ attributes }
32
  variationAttributes={ variationAttributes }
 
33
  />
34
  );
35
  };
assets/js/atomic/blocks/product-elements/add-to-cart/product-types/variable/variation-attributes/style.scss CHANGED
@@ -7,10 +7,6 @@
7
  @include font-size(regular);
8
  }
9
 
10
- .wc-block-components-product-add-to-cart-attribute-picker__container {
11
- position: relative;
12
- }
13
-
14
  .wc-block-components-product-add-to-cart-attribute-picker__select {
15
  margin: 0 0 em($gap-small) 0;
16
 
@@ -18,16 +14,5 @@
18
  min-width: 60%;
19
  min-height: 1.75em;
20
  }
21
-
22
- &.has-error {
23
- margin-bottom: $gap-large;
24
-
25
- select {
26
- border-color: $alert-red;
27
- &:focus {
28
- outline-color: $alert-red;
29
- }
30
- }
31
- }
32
  }
33
  }
7
  @include font-size(regular);
8
  }
9
 
 
 
 
 
10
  .wc-block-components-product-add-to-cart-attribute-picker__select {
11
  margin: 0 0 em($gap-small) 0;
12
 
14
  min-width: 60%;
15
  min-height: 1.75em;
16
  }
 
 
 
 
 
 
 
 
 
 
 
17
  }
18
  }
assets/js/atomic/blocks/product-elements/add-to-cart/product-types/variable/variation-attributes/test/index.js DELETED
@@ -1,395 +0,0 @@
1
- /**
2
- * Internal dependencies
3
- */
4
- import {
5
- getAttributes,
6
- getVariationAttributes,
7
- getVariationsMatchingSelectedAttributes,
8
- getVariationMatchingSelectedAttributes,
9
- getActiveSelectControlOptions,
10
- } from '../utils';
11
-
12
- const rawAttributeData = [
13
- {
14
- id: 1,
15
- name: 'Color',
16
- taxonomy: 'pa_color',
17
- has_variations: true,
18
- terms: [
19
- {
20
- id: 22,
21
- name: 'Blue',
22
- slug: 'blue',
23
- },
24
- {
25
- id: 23,
26
- name: 'Green',
27
- slug: 'green',
28
- },
29
- {
30
- id: 24,
31
- name: 'Red',
32
- slug: 'red',
33
- },
34
- ],
35
- },
36
- {
37
- id: 0,
38
- name: 'Logo',
39
- taxonomy: null,
40
- has_variations: true,
41
- terms: [
42
- {
43
- id: 0,
44
- name: 'Yes',
45
- slug: 'Yes',
46
- },
47
- {
48
- id: 0,
49
- name: 'No',
50
- slug: 'No',
51
- },
52
- ],
53
- },
54
- {
55
- id: 0,
56
- name: 'Non-variable attribute',
57
- taxonomy: null,
58
- has_variations: false,
59
- terms: [
60
- {
61
- id: 0,
62
- name: 'Test',
63
- slug: 'Test',
64
- },
65
- {
66
- id: 0,
67
- name: 'Test 2',
68
- slug: 'Test 2',
69
- },
70
- ],
71
- },
72
- ];
73
-
74
- const rawVariations = [
75
- {
76
- id: 35,
77
- attributes: [
78
- {
79
- name: 'Color',
80
- value: 'blue',
81
- },
82
- {
83
- name: 'Logo',
84
- value: 'Yes',
85
- },
86
- ],
87
- },
88
- {
89
- id: 28,
90
- attributes: [
91
- {
92
- name: 'Color',
93
- value: 'red',
94
- },
95
- {
96
- name: 'Logo',
97
- value: 'No',
98
- },
99
- ],
100
- },
101
- {
102
- id: 29,
103
- attributes: [
104
- {
105
- name: 'Color',
106
- value: 'green',
107
- },
108
- {
109
- name: 'Logo',
110
- value: 'No',
111
- },
112
- ],
113
- },
114
- {
115
- id: 30,
116
- attributes: [
117
- {
118
- name: 'Color',
119
- value: 'blue',
120
- },
121
- {
122
- name: 'Logo',
123
- value: 'No',
124
- },
125
- ],
126
- },
127
- ];
128
-
129
- describe( 'Testing utils', () => {
130
- describe( 'Testing getAttributes()', () => {
131
- it( 'returns empty object if there are no attributes', () => {
132
- const attributes = getAttributes( null );
133
- expect( attributes ).toStrictEqual( {} );
134
- } );
135
- it( 'returns list of attributes when given valid data', () => {
136
- const attributes = getAttributes( rawAttributeData );
137
- expect( attributes ).toStrictEqual( {
138
- Color: {
139
- id: 1,
140
- name: 'Color',
141
- taxonomy: 'pa_color',
142
- has_variations: true,
143
- terms: [
144
- {
145
- id: 22,
146
- name: 'Blue',
147
- slug: 'blue',
148
- },
149
- {
150
- id: 23,
151
- name: 'Green',
152
- slug: 'green',
153
- },
154
- {
155
- id: 24,
156
- name: 'Red',
157
- slug: 'red',
158
- },
159
- ],
160
- },
161
- Logo: {
162
- id: 0,
163
- name: 'Logo',
164
- taxonomy: null,
165
- has_variations: true,
166
- terms: [
167
- {
168
- id: 0,
169
- name: 'Yes',
170
- slug: 'Yes',
171
- },
172
- {
173
- id: 0,
174
- name: 'No',
175
- slug: 'No',
176
- },
177
- ],
178
- },
179
- } );
180
- } );
181
- } );
182
- describe( 'Testing getVariationAttributes()', () => {
183
- it( 'returns empty object if there are no variations', () => {
184
- const variationAttributes = getVariationAttributes( null );
185
- expect( variationAttributes ).toStrictEqual( {} );
186
- } );
187
- it( 'returns list of attribute names and value pairs when given valid data', () => {
188
- const variationAttributes = getVariationAttributes( rawVariations );
189
- expect( variationAttributes ).toStrictEqual( {
190
- 'id:35': {
191
- id: 35,
192
- attributes: {
193
- Color: 'blue',
194
- Logo: 'Yes',
195
- },
196
- },
197
- 'id:28': {
198
- id: 28,
199
- attributes: {
200
- Color: 'red',
201
- Logo: 'No',
202
- },
203
- },
204
- 'id:29': {
205
- id: 29,
206
- attributes: {
207
- Color: 'green',
208
- Logo: 'No',
209
- },
210
- },
211
- 'id:30': {
212
- id: 30,
213
- attributes: {
214
- Color: 'blue',
215
- Logo: 'No',
216
- },
217
- },
218
- } );
219
- } );
220
- } );
221
- describe( 'Testing getVariationsMatchingSelectedAttributes()', () => {
222
- const attributes = getAttributes( rawAttributeData );
223
- const variationAttributes = getVariationAttributes( rawVariations );
224
-
225
- it( 'returns all variations, in the correct order, if no selections have been made yet', () => {
226
- const selectedAttributes = {};
227
- const matches = getVariationsMatchingSelectedAttributes(
228
- attributes,
229
- variationAttributes,
230
- selectedAttributes
231
- );
232
- expect( matches ).toStrictEqual( [ 35, 28, 29, 30 ] );
233
- } );
234
-
235
- it( 'returns correct subset of variations after a selection', () => {
236
- const selectedAttributes = {
237
- Color: 'blue',
238
- };
239
- const matches = getVariationsMatchingSelectedAttributes(
240
- attributes,
241
- variationAttributes,
242
- selectedAttributes
243
- );
244
- expect( matches ).toStrictEqual( [ 35, 30 ] );
245
- } );
246
-
247
- it( 'returns correct subset of variations after all selections', () => {
248
- const selectedAttributes = {
249
- Color: 'blue',
250
- Logo: 'No',
251
- };
252
- const matches = getVariationsMatchingSelectedAttributes(
253
- attributes,
254
- variationAttributes,
255
- selectedAttributes
256
- );
257
- expect( matches ).toStrictEqual( [ 30 ] );
258
- } );
259
-
260
- it( 'returns no results if selection does not match or is invalid', () => {
261
- const selectedAttributes = {
262
- Color: 'brown',
263
- };
264
- const matches = getVariationsMatchingSelectedAttributes(
265
- attributes,
266
- variationAttributes,
267
- selectedAttributes
268
- );
269
- expect( matches ).toStrictEqual( [] );
270
- } );
271
- } );
272
- describe( 'Testing getVariationMatchingSelectedAttributes()', () => {
273
- const attributes = getAttributes( rawAttributeData );
274
- const variationAttributes = getVariationAttributes( rawVariations );
275
-
276
- it( 'returns first match if no selections have been made yet', () => {
277
- const selectedAttributes = {};
278
- const matches = getVariationMatchingSelectedAttributes(
279
- attributes,
280
- variationAttributes,
281
- selectedAttributes
282
- );
283
- expect( matches ).toStrictEqual( 35 );
284
- } );
285
-
286
- it( 'returns first match after single selection', () => {
287
- const selectedAttributes = {
288
- Color: 'blue',
289
- };
290
- const matches = getVariationMatchingSelectedAttributes(
291
- attributes,
292
- variationAttributes,
293
- selectedAttributes
294
- );
295
- expect( matches ).toStrictEqual( 35 );
296
- } );
297
-
298
- it( 'returns correct match after all selections', () => {
299
- const selectedAttributes = {
300
- Color: 'blue',
301
- Logo: 'No',
302
- };
303
- const matches = getVariationMatchingSelectedAttributes(
304
- attributes,
305
- variationAttributes,
306
- selectedAttributes
307
- );
308
- expect( matches ).toStrictEqual( 30 );
309
- } );
310
-
311
- it( 'returns no match if invalid', () => {
312
- const selectedAttributes = {
313
- Color: 'brown',
314
- };
315
- const matches = getVariationMatchingSelectedAttributes(
316
- attributes,
317
- variationAttributes,
318
- selectedAttributes
319
- );
320
- expect( matches ).toStrictEqual( 0 );
321
- } );
322
- } );
323
- describe( 'Testing getActiveSelectControlOptions()', () => {
324
- const attributes = getAttributes( rawAttributeData );
325
- const variationAttributes = getVariationAttributes( rawVariations );
326
-
327
- it( 'returns all possible options if no selections have been made yet', () => {
328
- const selectedAttributes = {};
329
- const controlOptions = getActiveSelectControlOptions(
330
- attributes,
331
- variationAttributes,
332
- selectedAttributes
333
- );
334
- expect( controlOptions ).toStrictEqual( {
335
- Color: [
336
- {
337
- value: 'blue',
338
- label: 'Blue',
339
- },
340
- {
341
- value: 'green',
342
- label: 'Green',
343
- },
344
- {
345
- value: 'red',
346
- label: 'Red',
347
- },
348
- ],
349
- Logo: [
350
- {
351
- value: 'Yes',
352
- label: 'Yes',
353
- },
354
- {
355
- value: 'No',
356
- label: 'No',
357
- },
358
- ],
359
- } );
360
- } );
361
-
362
- it( 'returns only valid options if color is selected', () => {
363
- const selectedAttributes = {
364
- Color: 'green',
365
- };
366
- const controlOptions = getActiveSelectControlOptions(
367
- attributes,
368
- variationAttributes,
369
- selectedAttributes
370
- );
371
- expect( controlOptions ).toStrictEqual( {
372
- Color: [
373
- {
374
- value: 'blue',
375
- label: 'Blue',
376
- },
377
- {
378
- value: 'green',
379
- label: 'Green',
380
- },
381
- {
382
- value: 'red',
383
- label: 'Red',
384
- },
385
- ],
386
- Logo: [
387
- {
388
- value: 'No',
389
- label: 'No',
390
- },
391
- ],
392
- } );
393
- } );
394
- } );
395
- } );
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
assets/js/atomic/blocks/product-elements/add-to-cart/product-types/variable/variation-attributes/utils.js CHANGED
@@ -2,7 +2,6 @@
2
  * External dependencies
3
  */
4
  import { keyBy } from 'lodash';
5
- import { decodeEntities } from '@wordpress/html-entities';
6
 
7
  /**
8
  * Key an array of attributes by name,
@@ -17,16 +16,13 @@ export const getAttributes = ( attributes ) => {
17
  ),
18
  'name'
19
  )
20
- : {};
21
  };
22
 
23
  /**
24
  * Format variations from the API into a map of just the attribute names and values.
25
  *
26
- * Note, each item is keyed by the variation ID with an id: prefix. This is to prevent the object
27
- * being reordered when iterated.
28
- *
29
- * @param {Object} variations List of Variation objects and attributes keyed by variation ID.
30
  */
31
  export const getVariationAttributes = ( variations ) => {
32
  if ( ! variations ) {
@@ -36,101 +32,23 @@ export const getVariationAttributes = ( variations ) => {
36
  const attributesMap = {};
37
 
38
  variations.forEach( ( { id, attributes } ) => {
39
- attributesMap[ `id:${ id }` ] = {
40
- id,
41
- attributes: attributes.reduce( ( acc, { name, value } ) => {
42
- acc[ name ] = value;
43
- return acc;
44
- }, {} ),
45
- };
46
  } );
47
 
48
  return attributesMap;
49
  };
50
 
51
  /**
52
- * Given a list of variations and a list of attribute values, return variations which match.
53
- *
54
- * Allows an attribute to be excluded by name. This is used to filter displayed options for
55
- * individual attribute selects.
56
  *
57
- * @param {Object} attributes List of attribute names and terms.
58
- * @param {Object} variationAttributes Attributes for each variation keyed by variation ID.
59
- * @param {Object} selectedAttributes Attribute Name Value pairs of current selections by the user.
60
- * @return {Array} List of matching variation IDs.
61
- */
62
- export const getVariationsMatchingSelectedAttributes = (
63
- attributes,
64
- variationAttributes,
65
- selectedAttributes
66
- ) => {
67
- const variationIds = Object.values( variationAttributes ).map(
68
- ( { id: variationId } ) => {
69
- return variationId;
70
- }
71
- );
72
-
73
- // If nothing is selected yet, just return all variations.
74
- if (
75
- Object.values( selectedAttributes ).every( ( value ) => value === '' )
76
- ) {
77
- return variationIds;
78
- }
79
-
80
- const attributeNames = Object.keys( attributes );
81
-
82
- return variationIds.filter( ( variationId ) =>
83
- attributeNames.every( ( attributeName ) => {
84
- const selectedAttribute = selectedAttributes[ attributeName ] || '';
85
- const variationAttribute =
86
- variationAttributes[ 'id:' + variationId ].attributes[
87
- attributeName
88
- ];
89
-
90
- // If there is no selected attribute, consider this a match.
91
- if ( selectedAttribute === '' ) {
92
- return true;
93
- }
94
- // If the variation attributes for this attribute are set to null, it matches all values.
95
- if ( variationAttribute === null ) {
96
- return true;
97
- }
98
- // Otherwise, only match if the selected values are the same.
99
- return variationAttribute === selectedAttribute;
100
- } )
101
- );
102
- };
103
-
104
- /**
105
- * Given a list of variations and a list of attribute values, returns the first matched variation ID.
106
- *
107
- * @param {Object} attributes List of attribute names and terms.
108
- * @param {Object} variationAttributes Attributes for each variation keyed by variation ID.
109
- * @param {Object} selectedAttributes Attribute Name Value pairs of current selections by the user.
110
- * @return {number} Variation ID.
111
- */
112
- export const getVariationMatchingSelectedAttributes = (
113
- attributes,
114
- variationAttributes,
115
- selectedAttributes
116
- ) => {
117
- const matchingVariationIds = getVariationsMatchingSelectedAttributes(
118
- attributes,
119
- variationAttributes,
120
- selectedAttributes
121
- );
122
- return matchingVariationIds[ 0 ] || 0;
123
- };
124
-
125
- /**
126
- * Given a list of terms, filter them and return valid options for the select boxes.
127
- *
128
- * @see getActiveSelectControlOptions
129
  * @param {Object} attributeTerms List of attribute term objects.
130
  * @param {?Array} validAttributeTerms Valid values if selections have been made already.
131
  * @return {Array} Value/Label pairs of select box options.
132
  */
133
- const getValidSelectControlOptions = (
134
  attributeTerms,
135
  validAttributeTerms = null
136
  ) => {
@@ -143,7 +61,7 @@ const getValidSelectControlOptions = (
143
  ) {
144
  return {
145
  value: slug,
146
- label: decodeEntities( name ),
147
  };
148
  }
149
  return null;
@@ -152,57 +70,38 @@ const getValidSelectControlOptions = (
152
  };
153
 
154
  /**
155
- * Given a list of terms, filter them and return active options for the select boxes. This factors in
156
- * which options should be hidden due to current selections.
 
 
157
  *
158
- * @param {Object} attributes List of attribute names and terms.
159
- * @param {Object} variationAttributes Attributes for each variation keyed by variation ID.
160
- * @param {Object} selectedAttributes Attribute Name Value pairs of current selections by the user.
161
- * @return {Object} Select box options.
 
162
  */
163
- export const getActiveSelectControlOptions = (
164
- attributes,
165
  variationAttributes,
166
- selectedAttributes
167
- ) => {
168
- const options = {};
169
- const attributeNames = Object.keys( attributes );
170
- const hasSelectedAttributes =
171
- Object.values( selectedAttributes ).filter( Boolean ).length > 0;
172
-
173
- attributeNames.forEach( ( attributeName ) => {
174
- const currentAttribute = attributes[ attributeName ];
175
- const selectedAttributesExcludingCurrentAttribute = {
176
- ...selectedAttributes,
177
- [ attributeName ]: null,
178
- };
179
- // This finds matching variations for selected attributes apart from this one. This will be
180
- // used to get valid attribute terms of the current attribute narrowed down by those matching
181
- // variation IDs. For example, if I had Large Blue Shirts and Medium Red Shirts, I want to only
182
- // show Red shirts if Medium is selected.
183
- const matchingVariationIds = hasSelectedAttributes
184
- ? getVariationsMatchingSelectedAttributes(
185
- attributes,
186
- variationAttributes,
187
- selectedAttributesExcludingCurrentAttribute
188
- )
189
- : null;
190
- // Uses the above matching variation IDs to get the attributes from just those variations.
191
- const validAttributeTerms =
192
- matchingVariationIds !== null
193
- ? matchingVariationIds.map(
194
- ( varId ) =>
195
- variationAttributes[ 'id:' + varId ].attributes[
196
- attributeName
197
- ]
198
- )
199
- : null;
200
- // Intersects attributes with valid attributes.
201
- options[ attributeName ] = getValidSelectControlOptions(
202
- currentAttribute.terms,
203
- validAttributeTerms
204
- );
205
- } );
206
 
207
- return options;
 
 
 
 
 
 
 
 
 
 
 
208
  };
2
  * External dependencies
3
  */
4
  import { keyBy } from 'lodash';
 
5
 
6
  /**
7
  * Key an array of attributes by name,
16
  ),
17
  'name'
18
  )
19
+ : [];
20
  };
21
 
22
  /**
23
  * Format variations from the API into a map of just the attribute names and values.
24
  *
25
+ * @param {Array} variations Variations array.
 
 
 
26
  */
27
  export const getVariationAttributes = ( variations ) => {
28
  if ( ! variations ) {
32
  const attributesMap = {};
33
 
34
  variations.forEach( ( { id, attributes } ) => {
35
+ attributesMap[ id ] = attributes.reduce( ( acc, { name, value } ) => {
36
+ acc[ name ] = value;
37
+ return acc;
38
+ }, [] );
 
 
 
39
  } );
40
 
41
  return attributesMap;
42
  };
43
 
44
  /**
45
+ * Given a list of terms, filter them and return options for the select boxes.
 
 
 
46
  *
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
47
  * @param {Object} attributeTerms List of attribute term objects.
48
  * @param {?Array} validAttributeTerms Valid values if selections have been made already.
49
  * @return {Array} Value/Label pairs of select box options.
50
  */
51
+ export const getSelectControlOptions = (
52
  attributeTerms,
53
  validAttributeTerms = null
54
  ) => {
61
  ) {
62
  return {
63
  value: slug,
64
+ label: name,
65
  };
66
  }
67
  return null;
70
  };
71
 
72
  /**
73
+ * Given a list of variations and a list of attribute values, return variations which match.
74
+ *
75
+ * Allows an attribute to be excluded by name. This is used to filter displayed options for
76
+ * individual attribute selects.
77
  *
78
+ * @param {Object} props
79
+ * @param {Object} props.selectedAttributes List of selected attributes.
80
+ * @param {Object} props.variationAttributes List of variations and their attributes.
81
+ * @param {Object} props.attributeNames List of all possible attribute names.
82
+ * @return {Array} List of matching variation IDs.
83
  */
84
+ export const getVariationsMatchingSelectedAttributes = ( {
85
+ selectedAttributes,
86
  variationAttributes,
87
+ attributeNames,
88
+ } ) => {
89
+ return Object.keys( variationAttributes ).filter( ( variationId ) =>
90
+ attributeNames.every( ( attributeName ) => {
91
+ const selectedAttribute = selectedAttributes[ attributeName ] || '';
92
+ const variationAttribute =
93
+ variationAttributes[ variationId ][ attributeName ];
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
94
 
95
+ // If there is no selected attribute, consider this a match.
96
+ if ( selectedAttribute === '' ) {
97
+ return true;
98
+ }
99
+ // If the variation attributes for this attribute are set to null, it matches all values.
100
+ if ( variationAttribute === null ) {
101
+ return true;
102
+ }
103
+ // Otherwise, only match if the selected values are the same.
104
+ return variationAttribute === selectedAttribute;
105
+ } )
106
+ );
107
  };
assets/js/atomic/blocks/product-elements/add-to-cart/shared/add-to-cart-button.js CHANGED
@@ -4,13 +4,8 @@
4
  import { __, _n, sprintf } from '@wordpress/i18n';
5
  import Button from '@woocommerce/base-components/button';
6
  import { Icon, done as doneIcon } from '@woocommerce/icons';
7
- import { useState, useEffect } from '@wordpress/element';
8
  import { useAddToCartFormContext } from '@woocommerce/base-context';
9
- import {
10
- useStoreEvents,
11
- useStoreAddToCart,
12
- } from '@woocommerce/base-context/hooks';
13
- import { useInnerBlockLayoutContext } from '@woocommerce/shared-context';
14
 
15
  /**
16
  * Add to Cart Form Button Component.
@@ -18,72 +13,38 @@ import { useInnerBlockLayoutContext } from '@woocommerce/shared-context';
18
  const AddToCartButton = () => {
19
  const {
20
  showFormElements,
21
- productIsPurchasable,
22
- productHasOptions,
23
  product,
24
- productType,
25
- isDisabled,
26
- isProcessing,
27
- eventRegistration,
28
- hasError,
29
- dispatchActions,
30
  } = useAddToCartFormContext();
31
- const { parentName } = useInnerBlockLayoutContext();
32
- const { dispatchStoreEvent } = useStoreEvents();
33
- const { cartQuantity } = useStoreAddToCart( product.id || 0 );
34
- const [ addedToCart, setAddedToCart ] = useState( false );
35
- const addToCartButtonData = product.add_to_cart || {
36
- url: '',
37
- text: '',
38
- };
39
 
40
- // Subscribe to emitter for after processing.
41
- useEffect( () => {
42
- const onSuccess = () => {
43
- if ( ! hasError ) {
44
- setAddedToCart( true );
45
- }
46
- return true;
47
- };
48
- const unsubscribeProcessing = eventRegistration.onAddToCartAfterProcessingWithSuccess(
49
- onSuccess,
50
- 0
51
- );
52
- return () => {
53
- unsubscribeProcessing();
54
- };
55
- }, [ eventRegistration, hasError ] );
56
 
57
- /**
58
- * We can show a real button if we are:
59
- *
60
- * a) Showing a full add to cart form.
61
- * b) The product doesn't have options and can therefore be added directly to the cart.
62
- * c) The product is purchasable.
63
- *
64
- * Otherwise we show a link instead.
65
- */
66
- const showButton =
67
- ( showFormElements ||
68
- ( ! productHasOptions && productType === 'simple' ) ) &&
69
- productIsPurchasable;
 
70
 
71
- return showButton ? (
72
- <ButtonComponent
73
- className="wc-block-components-product-add-to-cart-button"
74
- quantityInCart={ cartQuantity }
75
- isDisabled={ isDisabled }
76
- isProcessing={ isProcessing }
77
- isDone={ addedToCart }
78
- onClick={ () => {
79
- dispatchActions.submitForm();
80
- dispatchStoreEvent( 'cart-add-item', {
81
- product,
82
- listName: parentName,
83
- } );
84
- } }
85
- />
86
- ) : (
87
  <LinkComponent
88
  className="wc-block-components-product-add-to-cart-button"
89
  href={ addToCartButtonData.url }
@@ -91,33 +52,16 @@ const AddToCartButton = () => {
91
  addToCartButtonData.text ||
92
  __( 'View Product', 'woo-gutenberg-products-block' )
93
  }
94
- onClick={ () => {
95
- dispatchStoreEvent( 'product-view-link', {
96
- product,
97
- listName: parentName,
98
- } );
99
- } }
100
  />
101
  );
102
  };
103
 
104
  /**
105
- * Button component for non-purchasable products.
106
- *
107
- * @param {Object} props Incoming props.
108
- * @param {string} props.className Css classnames.
109
- * @param {string} props.href Link for button.
110
- * @param {string} props.text Text content for button.
111
- * @param {function():any} props.onClick Callback to execute when button is clicked.
112
  */
113
- const LinkComponent = ( { className, href, text, onClick } ) => {
114
  return (
115
- <Button
116
- className={ className }
117
- href={ href }
118
- onClick={ onClick }
119
- rel="nofollow"
120
- >
121
  { text }
122
  </Button>
123
  );
@@ -125,33 +69,29 @@ const LinkComponent = ( { className, href, text, onClick } ) => {
125
 
126
  /**
127
  * Button for purchasable products.
128
- *
129
- * @param {Object} props Incoming props for component
130
- * @param {string} props.className Incoming css class name.
131
- * @param {number} props.quantityInCart Quantity of item in cart.
132
- * @param {boolean} props.isProcessing Whether processing action is occurring.
133
- * @param {boolean} props.isDisabled Whether the button is disabled or not.
134
- * @param {boolean} props.isDone Whether processing is done.
135
- * @param {function():any} props.onClick Callback to execute when button is clicked.
136
  */
137
  const ButtonComponent = ( {
138
  className,
139
  quantityInCart,
140
- isProcessing,
141
- isDisabled,
142
- isDone,
143
  onClick,
144
  } ) => {
 
 
145
  return (
146
  <Button
147
  className={ className }
148
- disabled={ isDisabled }
149
- showSpinner={ isProcessing }
150
- onClick={ onClick }
 
 
 
151
  >
152
- { isDone && quantityInCart > 0
153
  ? sprintf(
154
- /* translators: %s number of products in cart. */
155
  _n(
156
  '%d in cart',
157
  '%d in cart',
@@ -161,7 +101,7 @@ const ButtonComponent = ( {
161
  quantityInCart
162
  )
163
  : __( 'Add to cart', 'woo-gutenberg-products-block' ) }
164
- { !! isDone && (
165
  <Icon
166
  srcElement={ doneIcon }
167
  alt={ __( 'Done', 'woo-gutenberg-products-block' ) }
4
  import { __, _n, sprintf } from '@wordpress/i18n';
5
  import Button from '@woocommerce/base-components/button';
6
  import { Icon, done as doneIcon } from '@woocommerce/icons';
7
+ import { useState } from '@wordpress/element';
8
  import { useAddToCartFormContext } from '@woocommerce/base-context';
 
 
 
 
 
9
 
10
  /**
11
  * Add to Cart Form Button Component.
13
  const AddToCartButton = () => {
14
  const {
15
  showFormElements,
 
 
16
  product,
17
+ quantityInCart,
18
+ formDisabled,
19
+ formSubmitting,
20
+ onSubmit,
 
 
21
  } = useAddToCartFormContext();
 
 
 
 
 
 
 
 
22
 
23
+ const {
24
+ is_purchasable: isPurchasable = true,
25
+ has_options: hasOptions,
26
+ add_to_cart: addToCartButtonData = {
27
+ url: '',
28
+ text: '',
29
+ },
30
+ } = product;
 
 
 
 
 
 
 
 
31
 
32
+ // If we are showing form elements, OR if the product has no additional form options, we can show
33
+ // a functional direct add to cart button, provided that the product is purchasable.
34
+ // No link is required to the full form under these circumstances.
35
+ if ( ( showFormElements || ! hasOptions ) && isPurchasable ) {
36
+ return (
37
+ <ButtonComponent
38
+ className="wc-block-components-product-add-to-cart-button"
39
+ quantityInCart={ quantityInCart }
40
+ disabled={ formDisabled }
41
+ loading={ formSubmitting }
42
+ onClick={ onSubmit }
43
+ />
44
+ );
45
+ }
46
 
47
+ return (
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
48
  <LinkComponent
49
  className="wc-block-components-product-add-to-cart-button"
50
  href={ addToCartButtonData.url }
52
  addToCartButtonData.text ||
53
  __( 'View Product', 'woo-gutenberg-products-block' )
54
  }
 
 
 
 
 
 
55
  />
56
  );
57
  };
58
 
59
  /**
60
+ * Button for non-purchasable products.
 
 
 
 
 
 
61
  */
62
+ const LinkComponent = ( { className, href, text } ) => {
63
  return (
64
+ <Button className={ className } href={ href } rel="nofollow">
 
 
 
 
 
65
  { text }
66
  </Button>
67
  );
69
 
70
  /**
71
  * Button for purchasable products.
 
 
 
 
 
 
 
 
72
  */
73
  const ButtonComponent = ( {
74
  className,
75
  quantityInCart,
76
+ loading,
77
+ disabled,
 
78
  onClick,
79
  } ) => {
80
+ const [ wasClicked, setWasClicked ] = useState( false );
81
+
82
  return (
83
  <Button
84
  className={ className }
85
+ disabled={ disabled }
86
+ showSpinner={ loading }
87
+ onClick={ () => {
88
+ onClick();
89
+ setWasClicked( true );
90
+ } }
91
  >
92
+ { quantityInCart > 0
93
  ? sprintf(
94
+ // translators: %s number of products in cart.
95
  _n(
96
  '%d in cart',
97
  '%d in cart',
101
  quantityInCart
102
  )
103
  : __( 'Add to cart', 'woo-gutenberg-products-block' ) }
104
+ { wasClicked && (
105
  <Icon
106
  srcElement={ doneIcon }
107
  alt={ __( 'Done', 'woo-gutenberg-products-block' ) }
assets/js/atomic/blocks/product-elements/add-to-cart/shared/quantity-input.js CHANGED
@@ -1,12 +1,5 @@
1
  /**
2
  * Quantity Input Component.
3
- *
4
- * @param {Object} props Incoming props for component
5
- * @param {boolean} props.disabled Whether input is disabled or not.
6
- * @param {number} props.min Minimum value for input.
7
- * @param {number} props.max Maximum value for input.
8
- * @param {number} props.value Value for input.
9
- * @param {function():any} props.onChange Function to call on input change event.
10
  */
11
  const QuantityInput = ( { disabled, min, max, value, onChange } ) => {
12
  return (
1
  /**
2
  * Quantity Input Component.
 
 
 
 
 
 
 
3
  */
4
  const QuantityInput = ( { disabled, min, max, value, onChange } ) => {
5
  return (
assets/js/atomic/blocks/product-elements/add-to-cart/style.scss CHANGED
@@ -21,7 +21,7 @@
21
 
22
  .wc-block-components-product-add-to-cart-quantity {
23
  margin: 0 1em em($gap-small) 0;
24
- flex-basis: 5em;
25
  padding: 0.618em;
26
  background: $white;
27
  border: 1px solid #ccc;
@@ -31,8 +31,6 @@
31
  text-align: center;
32
  }
33
  }
34
-
35
- .is-loading .wc-block-components-product-add-to-cart,
36
  .wc-block-components-product-add-to-cart--placeholder {
37
  .wc-block-components-product-add-to-cart-quantity,
38
  .wc-block-components-product-add-to-cart-button {
@@ -43,7 +41,3 @@
43
  .wc-block-grid .wc-block-components-product-add-to-cart {
44
  justify-content: center;
45
  }
46
-
47
- .wc-block-components-product-add-to-cart-notice {
48
- margin: 0;
49
- }
21
 
22
  .wc-block-components-product-add-to-cart-quantity {
23
  margin: 0 1em em($gap-small) 0;
24
+ width: 5em;
25
  padding: 0.618em;
26
  background: $white;
27
  border: 1px solid #ccc;
31
  text-align: center;
32
  }
33
  }
 
 
34
  .wc-block-components-product-add-to-cart--placeholder {
35
  .wc-block-components-product-add-to-cart-quantity,
36
  .wc-block-components-product-add-to-cart-button {
41
  .wc-block-grid .wc-block-components-product-add-to-cart {
42
  justify-content: center;
43
  }
 
 
 
 
assets/js/atomic/blocks/product-elements/button/block.js CHANGED
@@ -4,11 +4,10 @@
4
  import PropTypes from 'prop-types';
5
  import classnames from 'classnames';
6
  import { __, _n, sprintf } from '@wordpress/i18n';
7
- import {
8
- useStoreEvents,
9
- useStoreAddToCart,
10
- } from '@woocommerce/base-context/hooks';
11
  import { decodeEntities } from '@wordpress/html-entities';
 
12
  import {
13
  useInnerBlockLayoutContext,
14
  useProductDataContext,
@@ -52,6 +51,8 @@ const Block = ( { className } ) => {
52
  };
53
 
54
  const AddToCartButton = ( { product } ) => {
 
 
55
  const {
56
  id,
57
  permalink,
@@ -60,9 +61,18 @@ const AddToCartButton = ( { product } ) => {
60
  is_purchasable: isPurchasable,
61
  is_in_stock: isInStock,
62
  } = product;
63
- const { dispatchStoreEvent } = useStoreEvents();
64
  const { cartQuantity, addingToCart, addToCart } = useStoreAddToCart( id );
65
 
 
 
 
 
 
 
 
 
 
66
  const addedToCart = Number.isFinite( cartQuantity ) && cartQuantity > 0;
67
  const allowAddToCart = ! hasOptions && isPurchasable && isInStock;
68
  const buttonAriaLabel = decodeEntities(
@@ -70,7 +80,7 @@ const AddToCartButton = ( { product } ) => {
70
  );
71
  const buttonText = addedToCart
72
  ? sprintf(
73
- /* translators: %s number of products in cart. */
74
  _n(
75
  '%d in cart',
76
  '%d in cart',
@@ -90,17 +100,9 @@ const AddToCartButton = ( { product } ) => {
90
  if ( ! allowAddToCart ) {
91
  buttonProps.href = permalink;
92
  buttonProps.rel = 'nofollow';
93
- buttonProps.onClick = () => {
94
- dispatchStoreEvent( 'product-view-link', {
95
- product,
96
- } );
97
- };
98
  } else {
99
  buttonProps.onClick = () => {
100
  addToCart();
101
- dispatchStoreEvent( 'cart-add-item', {
102
- product,
103
- } );
104
  };
105
  }
106
 
4
  import PropTypes from 'prop-types';
5
  import classnames from 'classnames';
6
  import { __, _n, sprintf } from '@wordpress/i18n';
7
+ import { useEffect, useRef } from '@wordpress/element';
8
+ import { useStoreAddToCart } from '@woocommerce/base-hooks';
 
 
9
  import { decodeEntities } from '@wordpress/html-entities';
10
+ import { triggerFragmentRefresh } from '@woocommerce/base-utils';
11
  import {
12
  useInnerBlockLayoutContext,
13
  useProductDataContext,
51
  };
52
 
53
  const AddToCartButton = ( { product } ) => {
54
+ const firstMount = useRef( true );
55
+
56
  const {
57
  id,
58
  permalink,
61
  is_purchasable: isPurchasable,
62
  is_in_stock: isInStock,
63
  } = product;
64
+
65
  const { cartQuantity, addingToCart, addToCart } = useStoreAddToCart( id );
66
 
67
+ useEffect( () => {
68
+ // Avoid running on first mount when cart quantity is first set.
69
+ if ( firstMount.current ) {
70
+ firstMount.current = false;
71
+ return;
72
+ }
73
+ triggerFragmentRefresh();
74
+ }, [ cartQuantity ] );
75
+
76
  const addedToCart = Number.isFinite( cartQuantity ) && cartQuantity > 0;
77
  const allowAddToCart = ! hasOptions && isPurchasable && isInStock;
78
  const buttonAriaLabel = decodeEntities(
80
  );
81
  const buttonText = addedToCart
82
  ? sprintf(
83
+ // translators: %s number of products in cart.
84
  _n(
85
  '%d in cart',
86
  '%d in cart',
100
  if ( ! allowAddToCart ) {
101
  buttonProps.href = permalink;
102
  buttonProps.rel = 'nofollow';
 
 
 
 
 
103
  } else {
104
  buttonProps.onClick = () => {
105
  addToCart();
 
 
 
106
  };
107
  }
108
 
assets/js/atomic/blocks/product-elements/button/edit.js CHANGED
@@ -23,7 +23,7 @@ export default withProductSelector( {
23
  icon: BLOCK_ICON,
24
  label: BLOCK_TITLE,
25
  description: __(
26
- 'Choose a product to display its add to cart button.',
27
  'woo-gutenberg-products-block'
28
  ),
29
  } )( Edit );
23
  icon: BLOCK_ICON,
24
  label: BLOCK_TITLE,
25
  description: __(
26
+ "Choose a product to display it's add to cart button.",
27
  'woo-gutenberg-products-block'
28
  ),
29
  } )( Edit );
assets/js/atomic/blocks/product-elements/button/style.scss CHANGED
@@ -24,13 +24,3 @@
24
  min-width: 8em;
25
  min-height: 3em;
26
  }
27
-
28
-
29
- .theme-twentytwentyone {
30
- // Prevent buttons appearing disabled in the editor.
31
- .editor-styles-wrapper .wc-block-components-product-button .wp-block-button__link {
32
- background-color: var(--button--color-background);
33
- color: var(--button--color-text);
34
- border-color: var(--button--color-background);
35
- }
36
- }
24
  min-width: 8em;
25
  min-height: 3em;
26
  }
 
 
 
 
 
 
 
 
 
 
assets/js/atomic/blocks/product-elements/category-list/edit.js CHANGED
@@ -3,7 +3,7 @@
3
  */
4
  import { __ } from '@wordpress/i18n';
5
  import { Disabled } from '@wordpress/components';
6
- import EditProductLink from '@woocommerce/editor-components/edit-product-link';
7
 
8
  /**
9
  * Internal dependencies
@@ -27,7 +27,7 @@ export default withProductSelector( {
27
  icon: BLOCK_ICON,
28
  label: BLOCK_TITLE,
29
  description: __(
30
- 'Choose a product to display its categories.',
31
  'woo-gutenberg-products-block'
32
  ),
33
  } )( Edit );
3
  */
4
  import { __ } from '@wordpress/i18n';
5
  import { Disabled } from '@wordpress/components';
6
+ import EditProductLink from '@woocommerce/block-components/edit-product-link';
7
 
8
  /**
9
  * Internal dependencies
27
  icon: BLOCK_ICON,
28
  label: BLOCK_TITLE,
29
  description: __(
30
+ "Choose a product to display it's categories.",
31
  'woo-gutenberg-products-block'
32
  ),
33
  } )( Edit );
assets/js/atomic/blocks/product-elements/image/block.js CHANGED
@@ -2,16 +2,15 @@
2
  * External dependencies
3
  */
4
  import PropTypes from 'prop-types';
5
- import { useState, Fragment } from '@wordpress/element';
6
- import { __, sprintf } from '@wordpress/i18n';
7
  import classnames from 'classnames';
8
- import { PLACEHOLDER_IMG_SRC } from '@woocommerce/settings';
9
  import {
10
  useInnerBlockLayoutContext,
11
  useProductDataContext,
12
  } from '@woocommerce/shared-context';
13
  import { withProductDataContext } from '@woocommerce/shared-hocs';
14
- import { useStoreEvents } from '@woocommerce/base-context/hooks';
15
 
16
  /**
17
  * Internal dependencies
@@ -30,17 +29,16 @@ import './style.scss';
30
  * @param {string} [props.saleBadgeAlign] How should the sale badge be aligned if displayed.
31
  * @return {*} The component.
32
  */
33
- export const Block = ( {
34
  className,
35
  imageSizing = 'full-size',
36
- productLink: showProductLink = true,
37
  showSaleBadge,
38
  saleBadgeAlign = 'right',
39
  } ) => {
40
  const { parentClassName } = useInnerBlockLayoutContext();
41
  const { product } = useProductDataContext();
42
  const [ imageLoaded, setImageLoaded ] = useState( false );
43
- const { dispatchStoreEvent } = useStoreEvents();
44
 
45
  if ( ! product.id ) {
46
  return (
@@ -58,24 +56,8 @@ export const Block = ( {
58
  </div>
59
  );
60
  }
61
- const hasProductImages = !! product.images.length;
62
- const image = hasProductImages ? product.images[ 0 ] : null;
63
- const ParentComponent = showProductLink ? 'a' : Fragment;
64
- const anchorLabel = sprintf(
65
- /* translators: %s is referring to the product name */
66
- __( 'Link to %s', 'woo-gutenberg-products-block' ),
67
- product.name
68
- );
69
- const anchorProps = {
70
- href: product.permalink,
71
- rel: 'nofollow',
72
- ...( ! hasProductImages && { 'aria-label': anchorLabel } ),
73
- onClick: () => {
74
- dispatchStoreEvent( 'product-view-link', {
75
- product,
76
- } );
77
- },
78
- };
79
 
80
  return (
81
  <div
@@ -87,21 +69,37 @@ export const Block = ( {
87
  }
88
  ) }
89
  >
90
- <ParentComponent { ...( showProductLink && anchorProps ) }>
91
- { !! showSaleBadge && (
92
- <ProductSaleBadge
93
- align={ saleBadgeAlign }
94
- product={ product }
 
 
 
 
 
 
 
 
95
  />
96
- ) }
97
- <Image
98
- fallbackAlt={ product.name }
99
- image={ image }
100
- onLoad={ () => setImageLoaded( true ) }
101
- loaded={ imageLoaded }
102
- showFullSize={ imageSizing !== 'cropped' }
103
- />
104
- </ParentComponent>
 
 
 
 
 
 
 
 
105
  </div>
106
  );
107
  };
@@ -112,22 +110,28 @@ const ImagePlaceholder = () => {
112
  );
113
  };
114
 
115
- const Image = ( { image, onLoad, loaded, showFullSize, fallbackAlt } ) => {
116
  const { thumbnail, src, srcset, sizes, alt } = image || {};
117
- const imageProps = {
118
- alt: alt || fallbackAlt,
 
119
  onLoad,
120
  hidden: ! loaded,
121
  src: thumbnail,
122
- ...( showFullSize && { src, srcSet: srcset, sizes } ),
123
  };
 
 
 
 
 
 
 
 
124
 
125
  return (
126
  <>
127
- { imageProps.src && (
128
- /* eslint-disable-next-line jsx-a11y/alt-text */
129
- <img data-testid="product-image" { ...imageProps } />
130
- ) }
131
  { ! loaded && <ImagePlaceholder /> }
132
  </>
133
  );
@@ -135,7 +139,6 @@ const Image = ( { image, onLoad, loaded, showFullSize, fallbackAlt } ) => {
135
 
136
  Block.propTypes = {
137
  className: PropTypes.string,
138
- fallbackAlt: PropTypes.string,
139
  productLink: PropTypes.bool,
140
  showSaleBadge: PropTypes.bool,
141
  saleBadgeAlign: PropTypes.string,
2
  * External dependencies
3
  */
4
  import PropTypes from 'prop-types';
5
+ import { useState } from '@wordpress/element';
 
6
  import classnames from 'classnames';
7
+ import { PLACEHOLDER_IMG_SRC } from '@woocommerce/block-settings';
8
  import {
9
  useInnerBlockLayoutContext,
10
  useProductDataContext,
11
  } from '@woocommerce/shared-context';
12
  import { withProductDataContext } from '@woocommerce/shared-hocs';
13
+ import { isEmpty } from 'lodash';
14
 
15
  /**
16
  * Internal dependencies
29
  * @param {string} [props.saleBadgeAlign] How should the sale badge be aligned if displayed.
30
  * @return {*} The component.
31
  */
32
+ const Block = ( {
33
  className,
34
  imageSizing = 'full-size',
35
+ productLink = true,
36
  showSaleBadge,
37
  saleBadgeAlign = 'right',
38
  } ) => {
39
  const { parentClassName } = useInnerBlockLayoutContext();
40
  const { product } = useProductDataContext();
41
  const [ imageLoaded, setImageLoaded ] = useState( false );
 
42
 
43
  if ( ! product.id ) {
44
  return (
56
  </div>
57
  );
58
  }
59
+
60
+ const image = ! isEmpty( product.images ) ? product.images[ 0 ] : null;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
61
 
62
  return (
63
  <div
69
  }
70
  ) }
71
  >
72
+ { productLink ? (
73
+ <a href={ product.permalink } rel="nofollow">
74
+ { !! showSaleBadge && (
75
+ <ProductSaleBadge
76
+ align={ saleBadgeAlign }
77
+ product={ product }
78
+ />
79
+ ) }
80
+ <Image
81
+ image={ image }
82
+ onLoad={ () => setImageLoaded( true ) }
83
+ loaded={ imageLoaded }
84
+ showFullSize={ imageSizing !== 'cropped' }
85
  />
86
+ </a>
87
+ ) : (
88
+ <>
89
+ { !! showSaleBadge && (
90
+ <ProductSaleBadge
91
+ align={ saleBadgeAlign }
92
+ product={ product }
93
+ />
94
+ ) }
95
+ <Image
96
+ image={ image }
97
+ onLoad={ () => setImageLoaded( true ) }
98
+ loaded={ imageLoaded }
99
+ showFullSize={ imageSizing !== 'cropped' }
100
+ />
101
+ </>
102
+ ) }
103
  </div>
104
  );
105
  };
110
  );
111
  };
112
 
113
+ const Image = ( { image, onLoad, loaded, showFullSize } ) => {
114
  const { thumbnail, src, srcset, sizes, alt } = image || {};
115
+
116
+ let imageProps = {
117
+ alt,
118
  onLoad,
119
  hidden: ! loaded,
120
  src: thumbnail,
 
121
  };
122
+ if ( showFullSize ) {
123
+ imageProps = {
124
+ ...imageProps,
125
+ src,
126
+ srcSet: srcset,
127
+ sizes,
128
+ };
129
+ }
130
 
131
  return (
132
  <>
133
+ { /* eslint-disable-next-line jsx-a11y/alt-text */ }
134
+ <img { ...imageProps } />
 
 
135
  { ! loaded && <ImagePlaceholder /> }
136
  </>
137
  );
139
 
140
  Block.propTypes = {
141
  className: PropTypes.string,
 
142
  productLink: PropTypes.bool,
143
  showSaleBadge: PropTypes.bool,
144
  saleBadgeAlign: PropTypes.string,
assets/js/atomic/blocks/product-elements/image/edit.js CHANGED
@@ -4,8 +4,8 @@
4
  import { __ } from '@wordpress/i18n';
5
  import { Disabled, PanelBody, ToggleControl } from '@wordpress/components';
6
  import { InspectorControls } from '@wordpress/block-editor';
7
- import { createInterpolateElement } from 'wordpress-element';
8
- import ToggleButtonControl from '@woocommerce/editor-components/toggle-button-control';
9
  import { getAdminLink } from '@woocommerce/settings';
10
 
11
  /**
@@ -101,7 +101,7 @@ const Edit = ( { attributes, setAttributes } ) => {
101
  'Image Sizing',
102
  'woo-gutenberg-products-block'
103
  ) }
104
- help={ createInterpolateElement(
105
  __(
106
  'Product image cropping can be modified in the <a>Customizer</a>.',
107
  'woo-gutenberg-products-block'
@@ -153,7 +153,7 @@ export default withProductSelector( {
153
  icon: BLOCK_ICON,
154
  label: BLOCK_TITLE,
155
  description: __(
156
- 'Choose a product to display its image.',
157
  'woo-gutenberg-products-block'
158
  ),
159
  } )( Edit );
4
  import { __ } from '@wordpress/i18n';
5
  import { Disabled, PanelBody, ToggleControl } from '@wordpress/components';
6
  import { InspectorControls } from '@wordpress/block-editor';
7
+ import { __experimentalCreateInterpolateElement } from 'wordpress-element';
8
+ import ToggleButtonControl from '@woocommerce/block-components/toggle-button-control';
9
  import { getAdminLink } from '@woocommerce/settings';
10
 
11
  /**
101
  'Image Sizing',
102
  'woo-gutenberg-products-block'
103
  ) }
104
+ help={ __experimentalCreateInterpolateElement(
105
  __(
106
  'Product image cropping can be modified in the <a>Customizer</a>.',
107
  'woo-gutenberg-products-block'
153
  icon: BLOCK_ICON,
154
  label: BLOCK_TITLE,
155
  description: __(
156
+ "Choose a product to display it's image.",
157
  'woo-gutenberg-products-block'
158
  ),
159
  } )( Edit );
assets/js/atomic/blocks/product-elements/image/frontend.js CHANGED
@@ -1,6 +1,7 @@
1
  /**
2
  * External dependencies
3
  */
 
4
  import withFilteredAttributes from '@woocommerce/base-hocs/with-filtered-attributes';
5
 
6
  /**
@@ -9,4 +10,4 @@ import withFilteredAttributes from '@woocommerce/base-hocs/with-filtered-attribu
9
  import Block from './block';
10
  import attributes from './attributes';
11
 
12
- export default withFilteredAttributes( attributes )( Block );
1
  /**
2
  * External dependencies
3
  */
4
+ import { compose } from '@wordpress/compose';
5
  import withFilteredAttributes from '@woocommerce/base-hocs/with-filtered-attributes';
6
 
7
  /**
10
  import Block from './block';
11
  import attributes from './attributes';
12
 
13
+ export default compose( withFilteredAttributes( attributes ) )( Block );
assets/js/atomic/blocks/product-elements/image/style.scss CHANGED
@@ -23,14 +23,14 @@
23
  }
24
 
25
  .wc-block-components-product-sale-badge {
26
- &--align-left {
27
  position: absolute;
28
  left: $gap-smaller/2;
29
  top: $gap-smaller/2;
30
  right: auto;
31
  margin: 0;
32
  }
33
- &--align-center {
34
  position: absolute;
35
  top: $gap-smaller/2;
36
  left: 50%;
@@ -38,7 +38,7 @@
38
  transform: translateX(-50%);
39
  margin: 0;
40
  }
41
- &--align-right {
42
  position: absolute;
43
  right: $gap-smaller/2;
44
  top: $gap-smaller/2;
23
  }
24
 
25
  .wc-block-components-product-sale-badge {
26
+ &--alignleft {
27
  position: absolute;
28
  left: $gap-smaller/2;
29
  top: $gap-smaller/2;
30
  right: auto;
31
  margin: 0;
32
  }
33
+ &--aligncenter {
34
  position: absolute;
35
  top: $gap-smaller/2;
36
  left: 50%;
38
  transform: translateX(-50%);
39
  margin: 0;
40
  }
41
+ &--alignright {
42
  position: absolute;
43
  right: $gap-smaller/2;
44
  top: $gap-smaller/2;
assets/js/atomic/blocks/product-elements/image/test/block.test.js DELETED
@@ -1,139 +0,0 @@
1
- /**
2
- * External dependencies
3
- */
4
- import { render, fireEvent } from '@testing-library/react';
5
- import { ProductDataContextProvider } from '@woocommerce/shared-context';
6
-
7
- /**
8
- * Internal dependencies
9
- */
10
- import { Block } from '../block';
11
-
12
- jest.mock( '@woocommerce/block-settings', () => ( {
13
- __esModule: true,
14
- PLACEHOLDER_IMG_SRC: 'placeholder.jpg',
15
- } ) );
16
-
17
- const productWithoutImages = {
18
- name: 'Test product',
19
- id: 1,
20
- fallbackAlt: 'Test product',
21
- permalink: 'http://test.com/product/test-product/',
22
- images: [],
23
- };
24
-
25
- const productWithImages = {
26
- name: 'Test product',
27
- id: 1,
28
- fallbackAlt: 'Test product',
29
- permalink: 'http://test.com/product/test-product/',
30
- images: [
31
- {
32
- id: 56,
33
- src: 'logo-1.jpg',
34
- thumbnail: 'logo-1-324x324.jpg',
35
- srcset:
36
- 'logo-1.jpg 800w, logo-1-300x300.jpg 300w, logo-1-150x150.jpg 150w, logo-1-768x767.jpg 768w, logo-1-324x324.jpg 324w, logo-1-416x415.jpg 416w, logo-1-100x100.jpg 100w',
37
- sizes: '(max-width: 800px) 100vw, 800px',
38
- name: 'logo-1.jpg',
39
- alt: '',
40
- },
41
- {
42
- id: 55,
43
- src: 'beanie-with-logo-1.jpg',
44
- thumbnail: 'beanie-with-logo-1-324x324.jpg',
45
- srcset:
46
- 'beanie-with-logo-1.jpg 800w, beanie-with-logo-1-300x300.jpg 300w, beanie-with-logo-1-150x150.jpg 150w, beanie-with-logo-1-768x768.jpg 768w, beanie-with-logo-1-324x324.jpg 324w, beanie-with-logo-1-416x416.jpg 416w, beanie-with-logo-1-100x100.jpg 100w',
47
- sizes: '(max-width: 800px) 100vw, 800px',
48
- name: 'beanie-with-logo-1.jpg',
49
- alt: '',
50
- },
51
- ],
52
- };
53
-
54
- describe( 'Product Image Block', () => {
55
- describe( 'with product link', () => {
56
- test( 'should render an anchor with the product image', () => {
57
- const component = render(
58
- <ProductDataContextProvider product={ productWithImages }>
59
- <Block productLink />
60
- </ProductDataContextProvider>
61
- );
62
-
63
- // use testId as alt is added after image is loaded
64
- const image = component.getByTestId( 'product-image' );
65
- fireEvent.load( image );
66
-
67
- const productImage = component.getByAltText(
68
- productWithImages.name
69
- );
70
- expect( productImage.getAttribute( 'src' ) ).toBe(
71
- productWithImages.images[ 0 ].src
72
- );
73
-
74
- const anchor = productImage.closest( 'a' );
75
- expect( anchor.getAttribute( 'href' ) ).toBe(
76
- productWithImages.permalink
77
- );
78
- } );
79
-
80
- test( 'should render an anchor with the placeholder image', () => {
81
- const component = render(
82
- <ProductDataContextProvider product={ productWithoutImages }>
83
- <Block productLink />
84
- </ProductDataContextProvider>
85
- );
86
-
87
- const placeholderImage = component.getByAltText( '' );
88
- expect( placeholderImage.getAttribute( 'src' ) ).toBe(
89
- 'placeholder.jpg'
90
- );
91
-
92
- const anchor = placeholderImage.closest( 'a' );
93
- expect( anchor.getAttribute( 'href' ) ).toBe(
94
- productWithoutImages.permalink
95
- );
96
- expect( anchor.getAttribute( 'aria-label' ) ).toBe(
97
- `Link to ${ productWithoutImages.name }`
98
- );
99
- } );
100
- } );
101
-
102
- describe( 'without product link', () => {
103
- test( 'should render the product image without an anchor wrapper', () => {
104
- const component = render(
105
- <ProductDataContextProvider product={ productWithImages }>
106
- <Block productLink={ false } />
107
- </ProductDataContextProvider>
108
- );
109
- const image = component.getByTestId( 'product-image' );
110
- fireEvent.load( image );
111
-
112
- const productImage = component.getByAltText(
113
- productWithImages.name
114
- );
115
- expect( productImage.getAttribute( 'src' ) ).toBe(
116
- productWithImages.images[ 0 ].src
117
- );
118
-
119
- const anchor = productImage.closest( 'a' );
120
- expect( anchor ).toBe( null );
121
- } );
122
-
123
- test( 'should render the placeholder image without an anchor wrapper', () => {
124
- const component = render(
125
- <ProductDataContextProvider product={ productWithoutImages }>
126
- <Block productLink={ false } />
127
- </ProductDataContextProvider>
128
- );
129
-
130
- const placeholderImage = component.getByAltText( '' );
131
- expect( placeholderImage.getAttribute( 'src' ) ).toBe(
132
- 'placeholder.jpg'
133
- );
134
-
135
- const anchor = placeholderImage.closest( 'a' );
136
- expect( anchor ).toBe( null );
137
- } );
138
- } );
139
- } );
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
assets/js/atomic/blocks/product-elements/price/block.js CHANGED
@@ -3,8 +3,8 @@
3
  */
4
  import PropTypes from 'prop-types';
5
  import classnames from 'classnames';
6
- import ProductPrice from '@woocommerce/base-components/product-price';
7
- import { getCurrencyFromPriceResponse } from '@woocommerce/price-format';
8
  import {
9
  useInnerBlockLayoutContext,
10
  useProductDataContext,
@@ -13,6 +13,11 @@ import { getColorClassName, getFontSizeClass } from '@wordpress/block-editor';
13
  import { isFeaturePluginBuild } from '@woocommerce/block-settings';
14
  import { withProductDataContext } from '@woocommerce/shared-hocs';
15
 
 
 
 
 
 
16
  /**
17
  * Product Price Block Component.
18
  *
@@ -27,6 +32,7 @@ import { withProductDataContext } from '@woocommerce/shared-hocs';
27
  * @param {string} [props.customColor] Normal Price custom text color.
28
  * @param {string} [props.saleColor] Original Price text color.
29
  * @param {string} [props.customSaleColor] Original Price custom text color.
 
30
  * context will be used if this is not provided.
31
  * @return {*} The component.
32
  */
@@ -45,14 +51,6 @@ const Block = ( {
45
  const { parentClassName } = useInnerBlockLayoutContext();
46
  const { product } = useProductDataContext();
47
 
48
- const wrapperClassName = classnames( className, {
49
- [ `${ parentClassName }__product-price` ]: parentClassName,
50
- } );
51
-
52
- if ( ! product.id ) {
53
- return <ProductPrice align={ align } className={ wrapperClassName } />;
54
- }
55
-
56
  const colorClass = getColorClassName( 'color', color );
57
  const fontSizeClass = getFontSizeClass( fontSize );
58
  const saleColorClass = getColorClassName( 'color', saleColor );
@@ -82,39 +80,160 @@ const Block = ( {
82
  fontSize: customSaleFontSize,
83
  };
84
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
85
  const prices = product.prices;
86
  const currency = getCurrencyFromPriceResponse( prices );
87
- const isOnSale = prices.price !== prices.regular_price;
88
- const priceClassName = isOnSale
89
- ? classnames( {
90
- [ `${ parentClassName }__product-price__value` ]: parentClassName,
91
- [ saleClasses ]: isFeaturePluginBuild(),
92
- } )
93
- : classnames( {
94
- [ `${ parentClassName }__product-price__value` ]: parentClassName,
95
- [ classes ]: isFeaturePluginBuild(),
96
- } );
97
- const priceStyle = isOnSale ? saleStyle : style;
98
 
99
  return (
100
- <ProductPrice
101
- align={ align }
102
- className={ wrapperClassName }
103
- currency={ currency }
104
- price={ prices.price }
105
- priceClassName={ priceClassName }
106
- priceStyle={ isFeaturePluginBuild() ? priceStyle : {} }
107
- // Range price props
108
- minPrice={ prices?.price_range?.min_amount }
109
- maxPrice={ prices?.price_range?.max_amount }
110
- // This is the regular or original price when the `price` value is a sale price.
111
- regularPrice={ prices.regular_price }
112
- regularPriceClassName={ classnames( {
113
- [ `${ parentClassName }__product-price__regular` ]: parentClassName,
114
- [ classes ]: isFeaturePluginBuild(),
115
- } ) }
116
- regularPriceStyle={ isFeaturePluginBuild() ? style : {} }
117
- />
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
118
  );
119
  };
120
 
3
  */
4
  import PropTypes from 'prop-types';
5
  import classnames from 'classnames';
6
+ import FormattedMonetaryAmount from '@woocommerce/base-components/formatted-monetary-amount';
7
+ import { getCurrencyFromPriceResponse } from '@woocommerce/base-utils';
8
  import {
9
  useInnerBlockLayoutContext,
10
  useProductDataContext,
13
  import { isFeaturePluginBuild } from '@woocommerce/block-settings';
14
  import { withProductDataContext } from '@woocommerce/shared-hocs';
15
 
16
+ /**
17
+ * Internal dependencies
18
+ */
19
+ import './style.scss';
20
+
21
  /**
22
  * Product Price Block Component.
23
  *
32
  * @param {string} [props.customColor] Normal Price custom text color.
33
  * @param {string} [props.saleColor] Original Price text color.
34
  * @param {string} [props.customSaleColor] Original Price custom text color.
35
+ * @param {Object} [props.product] Optional product object. Product from
36
  * context will be used if this is not provided.
37
  * @return {*} The component.
38
  */
51
  const { parentClassName } = useInnerBlockLayoutContext();
52
  const { product } = useProductDataContext();
53
 
 
 
 
 
 
 
 
 
54
  const colorClass = getColorClassName( 'color', color );
55
  const fontSizeClass = getFontSizeClass( fontSize );
56
  const saleColorClass = getColorClassName( 'color', saleColor );
80
  fontSize: customSaleFontSize,
81
  };
82
 
83
+ if ( ! product.id ) {
84
+ return (
85
+ <div
86
+ className={ classnames(
87
+ className,
88
+ 'price',
89
+ 'wc-block-components-product-price',
90
+ {
91
+ [ `${ parentClassName }__product-price` ]: parentClassName,
92
+ }
93
+ ) }
94
+ />
95
+ );
96
+ }
97
+
98
  const prices = product.prices;
99
  const currency = getCurrencyFromPriceResponse( prices );
 
 
 
 
 
 
 
 
 
 
 
100
 
101
  return (
102
+ <div
103
+ className={ classnames(
104
+ className,
105
+ 'price',
106
+ 'wc-block-components-product-price',
107
+ {
108
+ [ `${ parentClassName }__product-price` ]: parentClassName,
109
+ [ `wc-block-components-product-price__align-${ align }` ]:
110
+ align && isFeaturePluginBuild(),
111
+ }
112
+ ) }
113
+ >
114
+ { /* eslint-disable-next-line no-nested-ternary */ }
115
+ { hasPriceRange( prices ) ? (
116
+ <PriceRange
117
+ currency={ currency }
118
+ minAmount={ prices.price_range.min_amount }
119
+ maxAmount={ prices.price_range.max_amount }
120
+ classes={ classes }
121
+ style={ style }
122
+ />
123
+ ) : prices.price !== prices.regular_price ? (
124
+ <SalePrice
125
+ currency={ currency }
126
+ price={ prices.price }
127
+ regularPrice={ prices.regular_price }
128
+ saleClasses={ saleClasses }
129
+ saleStyle={ saleStyle }
130
+ classes={ classes }
131
+ style={ style }
132
+ />
133
+ ) : (
134
+ <Price
135
+ currency={ currency }
136
+ price={ prices.price }
137
+ classes={ classes }
138
+ style={ style }
139
+ />
140
+ ) }
141
+ </div>
142
+ );
143
+ };
144
+
145
+ const hasPriceRange = ( prices ) => {
146
+ return (
147
+ prices.price_range &&
148
+ prices.price_range.min_amount &&
149
+ prices.price_range.max_amount
150
+ );
151
+ };
152
+
153
+ const PriceRange = ( { currency, minAmount, maxAmount, classes, style } ) => {
154
+ const { parentClassName } = useInnerBlockLayoutContext();
155
+
156
+ return (
157
+ <span
158
+ className={ classnames(
159
+ 'wc-block-components-product-price__value',
160
+ {
161
+ [ `${ parentClassName }__product-price__value` ]: parentClassName,
162
+ [ classes ]: isFeaturePluginBuild()
163
+ }
164
+ ) }
165
+ style={ isFeaturePluginBuild() ? style : {} }
166
+ >
167
+ <FormattedMonetaryAmount
168
+ currency={ currency }
169
+ value={ minAmount }
170
+ />
171
+ &nbsp;&mdash;&nbsp;
172
+ <FormattedMonetaryAmount
173
+ currency={ currency }
174
+ value={ maxAmount }
175
+ />
176
+ </span>
177
+ );
178
+ };
179
+
180
+ const SalePrice = ( {
181
+ currency,
182
+ price,
183
+ regularPrice,
184
+ saleClasses = '',
185
+ saleStyle = {},
186
+ classes = '',
187
+ style = {},
188
+ } ) => {
189
+ const { parentClassName } = useInnerBlockLayoutContext();
190
+ return (
191
+ <>
192
+ <del
193
+ className={ classnames(
194
+ 'wc-block-components-product-price__regular',
195
+ {
196
+ [ `${ parentClassName }__product-price__regular` ]: parentClassName,
197
+ [ classes ]: isFeaturePluginBuild() }
198
+ ) }
199
+ style={ isFeaturePluginBuild() ? style : {} }
200
+ >
201
+ <FormattedMonetaryAmount
202
+ currency={ currency }
203
+ value={ regularPrice }
204
+ />
205
+ </del>
206
+ <span
207
+ className={ classnames(
208
+ 'wc-block-components-product-price__value',
209
+ {
210
+ [ `${ parentClassName }__product-price__value` ]: parentClassName,
211
+ [ saleClasses ]: isFeaturePluginBuild() }
212
+ ) }
213
+ style={ isFeaturePluginBuild() ? saleStyle : {} }
214
+ >
215
+ <FormattedMonetaryAmount
216
+ currency={ currency }
217
+ value={ price }
218
+ />
219
+ </span>
220
+ </>
221
+ );
222
+ };
223
+
224
+ const Price = ( { currency, price, classes = '', style = {} } ) => {
225
+ const { parentClassName } = useInnerBlockLayoutContext();
226
+ return (
227
+ <span
228
+ className={ classnames(
229
+ 'wc-block-components-product-price__value',
230
+ `${ parentClassName }__product-price__value`,
231
+ { [ classes ]: isFeaturePluginBuild() }
232
+ ) }
233
+ style={ isFeaturePluginBuild() ? style : {} }
234
+ >
235
+ <FormattedMonetaryAmount currency={ currency } value={ price } />
236
+ </span>
237
  );
238
  };
239
 
assets/js/atomic/blocks/product-elements/price/edit.js CHANGED
@@ -123,7 +123,7 @@ const Price = isFeaturePluginBuild()
123
  icon: BLOCK_ICON,
124
  label: BLOCK_TITLE,
125
  description: __(
126
- 'Choose a product to display its price.',
127
  'woo-gutenberg-products-block'
128
  ),
129
  } ),
123
  icon: BLOCK_ICON,
124
  label: BLOCK_TITLE,
125
  description: __(
126
+ "Choose a product to display it's price.",
127
  'woo-gutenberg-products-block'
128
  ),
129
  } ),
assets/js/atomic/blocks/product-elements/price/style.scss ADDED
@@ -0,0 +1,28 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ .wc-block-components-product-price {
2
+ margin-top: 0;
3
+ margin-bottom: $gap-small;
4
+ display: block;
5
+
6
+ &__regular {
7
+ margin-right: 0.5em;
8
+ }
9
+ }
10
+ .is-loading {
11
+ .wc-block-components-product-price::before {
12
+ @include placeholder();
13
+ content: ".";
14
+ display: inline-block;
15
+ width: 5em;
16
+ }
17
+ /*rtl:begin:ignore*/
18
+ .wc-block-components-product-price__align-left {
19
+ text-align: left;
20
+ }
21
+ .wc-block-components-product-price__align-center {
22
+ text-align: center;
23
+ }
24
+ .wc-block-components-product-price__align-right {
25
+ text-align: right;
26
+ }
27
+ /*rtl:end:ignore*/
28
+ }
assets/js/atomic/blocks/product-elements/rating/block.js CHANGED
@@ -36,7 +36,6 @@ const Block = ( { className } ) => {
36
  };
37
 
38
  const ratingText = sprintf(
39
- /* translators: %f is referring to the average rating value */
40
  __( 'Rated %f out of 5', 'woo-gutenberg-products-block' ),
41
  rating
42
  );
@@ -45,6 +44,7 @@ const Block = ( { className } ) => {
45
  <div
46
  className={ classnames(
47
  className,
 
48
  'wc-block-components-product-rating',
49
  {
50
  [ `${ parentClassName }__product-rating` ]: parentClassName,
36
  };
37
 
38
  const ratingText = sprintf(
 
39
  __( 'Rated %f out of 5', 'woo-gutenberg-products-block' ),
40
  rating
41
  );
44
  <div
45
  className={ classnames(
46
  className,
47
+ 'star-rating',
48
  'wc-block-components-product-rating',
49
  {
50
  [ `${ parentClassName }__product-rating` ]: parentClassName,
assets/js/atomic/blocks/product-elements/rating/edit.js CHANGED
@@ -17,7 +17,7 @@ export default withProductSelector( {
17
  icon: BLOCK_ICON,
18
  label: BLOCK_TITLE,
19
  description: __(
20
- 'Choose a product to display its rating.',
21
  'woo-gutenberg-products-block'
22
  ),
23
  } )( Edit );
17
  icon: BLOCK_ICON,
18
  label: BLOCK_TITLE,
19
  description: __(
20
+ "Choose a product to display it's rating.",
21
  'woo-gutenberg-products-block'
22
  ),
23
  } )( Edit );
assets/js/atomic/blocks/product-elements/sale-badge/block.js CHANGED
@@ -34,7 +34,7 @@ const Block = ( { className, align } ) => {
34
 
35
  const alignClass =
36
  typeof align === 'string'
37
- ? `wc-block-components-product-sale-badge--align-${ align }`
38
  : '';
39
 
40
  return (
34
 
35
  const alignClass =
36
  typeof align === 'string'
37
+ ? `wc-block-components-product-sale-badge--align${ align }`
38
  : '';
39
 
40
  return (
assets/js/atomic/blocks/product-elements/sale-badge/edit.js CHANGED
@@ -18,7 +18,7 @@ export default withProductSelector( {
18
  icon: BLOCK_ICON,
19
  label: BLOCK_TITLE,
20
  description: __(
21
- 'Choose a product to display its sale-badge.',
22
  'woo-gutenberg-products-block'
23
  ),
24
  } )( Edit );
18
  icon: BLOCK_ICON,
19
  label: BLOCK_TITLE,
20
  description: __(
21
+ "Choose a product to display it's sale-badge.",
22
  'woo-gutenberg-products-block'
23
  ),
24
  } )( Edit );
assets/js/atomic/blocks/product-elements/shared/editor.scss CHANGED
@@ -3,7 +3,7 @@
3
  }
4
  .wc-atomic-blocks-product__edit-card {
5
  padding: 16px;
6
- border-top: 1px solid $gray-200;
7
 
8
  .wc-atomic-blocks-product__edit-card-title {
9
  margin: 0 0 $gap;
3
  }
4
  .wc-atomic-blocks-product__edit-card {
5
  padding: 16px;
6
+ border-top: 1px solid #e2e4e7;
7
 
8
  .wc-atomic-blocks-product__edit-card-title {
9
  margin: 0 0 $gap;
assets/js/atomic/blocks/product-elements/shared/with-product-selector.js CHANGED
@@ -3,10 +3,10 @@
3
  */
4
  import { __ } from '@wordpress/i18n';
5
  import { useState } from '@wordpress/element';
6
- import ProductControl from '@woocommerce/editor-components/product-control';
7
- import { Placeholder, Button, ToolbarGroup } from '@wordpress/components';
8
  import { BlockControls } from '@wordpress/block-editor';
9
- import TextToolbarButton from '@woocommerce/editor-components/text-toolbar-button';
10
  import { useProductDataContext } from '@woocommerce/shared-context';
11
 
12
  /**
@@ -55,7 +55,7 @@ const withProductSelector = ( selectorArgs ) => ( OriginalComponent ) => {
55
  } }
56
  />
57
  <Button
58
- isSecondary
59
  disabled={ ! productId }
60
  onClick={ () => {
61
  setIsEditing( false );
@@ -68,7 +68,7 @@ const withProductSelector = ( selectorArgs ) => ( OriginalComponent ) => {
68
  ) : (
69
  <>
70
  <BlockControls>
71
- <ToolbarGroup>
72
  <TextToolbarButton
73
  onClick={ () => setIsEditing( true ) }
74
  >
@@ -77,7 +77,7 @@ const withProductSelector = ( selectorArgs ) => ( OriginalComponent ) => {
77
  'woo-gutenberg-products-block'
78
  ) }
79
  </TextToolbarButton>
80
- </ToolbarGroup>
81
  </BlockControls>
82
  <OriginalComponent { ...props } />
83
  </>
3
  */
4
  import { __ } from '@wordpress/i18n';
5
  import { useState } from '@wordpress/element';
6
+ import ProductControl from '@woocommerce/block-components/product-control';
7
+ import { Placeholder, Button, Toolbar } from '@wordpress/components';
8
  import { BlockControls } from '@wordpress/block-editor';
9
+ import TextToolbarButton from '@woocommerce/block-components/text-toolbar-button';
10
  import { useProductDataContext } from '@woocommerce/shared-context';
11
 
12
  /**
55
  } }
56
  />
57
  <Button
58
+ isDefault
59
  disabled={ ! productId }
60
  onClick={ () => {
61
  setIsEditing( false );
68
  ) : (
69
  <>
70
  <BlockControls>
71
+ <Toolbar>
72
  <TextToolbarButton
73
  onClick={ () => setIsEditing( true ) }
74
  >
77
  'woo-gutenberg-products-block'
78
  ) }
79
  </TextToolbarButton>
80
+ </Toolbar>
81
  </BlockControls>
82
  <OriginalComponent { ...props } />
83
  </>
assets/js/atomic/blocks/product-elements/sku/edit.js CHANGED
@@ -2,7 +2,7 @@
2
  * External dependencies
3
  */
4
  import { __ } from '@wordpress/i18n';
5
- import EditProductLink from '@woocommerce/editor-components/edit-product-link';
6
 
7
  /**
8
  * Internal dependencies
@@ -24,7 +24,7 @@ export default withProductSelector( {
24
  icon: BLOCK_ICON,
25
  label: BLOCK_TITLE,
26
  description: __(
27
- 'Choose a product to display its SKU.',
28
  'woo-gutenberg-products-block'
29
  ),
30
  } )( Edit );
2
  * External dependencies
3
  */
4
  import { __ } from '@wordpress/i18n';
5
+ import EditProductLink from '@woocommerce/block-components/edit-product-link';
6
 
7
  /**
8
  * Internal dependencies
24
  icon: BLOCK_ICON,
25
  label: BLOCK_TITLE,
26
  description: __(
27
+ "Choose a product to display it's SKU.",
28
  'woo-gutenberg-products-block'
29
  ),
30
  } )( Edit );
assets/js/atomic/blocks/product-elements/stock-indicator/edit.js CHANGED
@@ -2,7 +2,7 @@
2
  * External dependencies
3
  */
4
  import { __ } from '@wordpress/i18n';
5
- import EditProductLink from '@woocommerce/editor-components/edit-product-link';
6
 
7
  /**
8
  * Internal dependencies
@@ -24,7 +24,7 @@ export default withProductSelector( {
24
  icon: BLOCK_ICON,
25
  label: BLOCK_TITLE,
26
  description: __(
27
- 'Choose a product to display its stock.',
28
  'woo-gutenberg-products-block'
29
  ),
30
  } )( Edit );
2
  * External dependencies
3
  */
4
  import { __ } from '@wordpress/i18n';
5
+ import EditProductLink from '@woocommerce/block-components/edit-product-link';
6
 
7
  /**
8
  * Internal dependencies
24
  icon: BLOCK_ICON,
25
  label: BLOCK_TITLE,
26
  description: __(
27
+ "Choose a product to display it's stock.",
28
  'woo-gutenberg-products-block'
29
  ),
30
  } )( Edit );
assets/js/atomic/blocks/product-elements/stock-indicator/style.scss CHANGED
@@ -5,13 +5,13 @@
5
  @include font-size(small);
6
 
7
  &--in-stock {
8
- color: $in-stock-color;
9
  }
10
  &--out-of-stock {
11
- color: $no-stock-color;
12
  }
13
  &--low-stock,
14
  &--available-on-backorder {
15
- color: $low-stock-color;
16
  }
17
  }
5
  @include font-size(small);
6
 
7
  &--in-stock {
8
+ color: $valid-green;
9
  }
10
  &--out-of-stock {
11
+ color: $error-red;
12
  }
13
  &--low-stock,
14
  &--available-on-backorder {
15
+ color: $notice-yellow;
16
  }
17
  }
assets/js/atomic/blocks/product-elements/summary/block.js CHANGED
@@ -4,7 +4,7 @@
4
  import PropTypes from 'prop-types';
5
  import classnames from 'classnames';
6
  import Summary from '@woocommerce/base-components/summary';
7
- import { blocksConfig } from '@woocommerce/block-settings';
8
  import {
9
  useInnerBlockLayoutContext,
10
  useProductDataContext,
@@ -49,6 +49,8 @@ const Block = ( { className } ) => {
49
  return null;
50
  }
51
 
 
 
52
  return (
53
  <Summary
54
  className={ classnames(
@@ -60,7 +62,7 @@ const Block = ( { className } ) => {
60
  ) }
61
  source={ source }
62
  maxLength={ 150 }
63
- countType={ blocksConfig.wordCountType || 'words' }
64
  />
65
  );
66
  };
4
  import PropTypes from 'prop-types';
5
  import classnames from 'classnames';
6
  import Summary from '@woocommerce/base-components/summary';
7
+ import { getSetting } from '@woocommerce/settings';
8
  import {
9
  useInnerBlockLayoutContext,
10
  useProductDataContext,
49
  return null;
50
  }
51
 
52
+ const countType = getSetting( 'wordCountType', 'words' );
53
+
54
  return (
55
  <Summary
56
  className={ classnames(
62
  ) }
63
  source={ source }
64
  maxLength={ 150 }
65
+ countType={ countType }
66
  />
67
  );
68
  };
assets/js/atomic/blocks/product-elements/summary/edit.js CHANGED
@@ -18,7 +18,7 @@ export default withProductSelector( {
18
  icon: BLOCK_ICON,
19
  label: BLOCK_TITLE,
20
  description: __(
21
- 'Choose a product to display its short description.',
22
  'woo-gutenberg-products-block'
23
  ),
24
  } )( Edit );
18
  icon: BLOCK_ICON,
19
  label: BLOCK_TITLE,
20
  description: __(
21
+ "Choose a product to display it's short description.",
22
  'woo-gutenberg-products-block'
23
  ),
24
  } )( Edit );
assets/js/atomic/blocks/product-elements/tag-list/edit.js CHANGED
@@ -3,7 +3,7 @@
3
  */
4
  import { __ } from '@wordpress/i18n';
5
  import { Disabled } from '@wordpress/components';
6
- import EditProductLink from '@woocommerce/editor-components/edit-product-link';
7
 
8
  /**
9
  * Internal dependencies
@@ -27,7 +27,7 @@ export default withProductSelector( {
27
  icon: BLOCK_ICON,
28
  label: BLOCK_TITLE,
29
  description: __(
30
- 'Choose a product to display its tags.',
31
  'woo-gutenberg-products-block'
32
  ),
33
  } )( Edit );
3
  */
4
  import { __ } from '@wordpress/i18n';
5
  import { Disabled } from '@wordpress/components';
6
+ import EditProductLink from '@woocommerce/block-components/edit-product-link';
7
 
8
  /**
9
  * Internal dependencies
27
  icon: BLOCK_ICON,
28
  label: BLOCK_TITLE,
29
  description: __(
30
+ "Choose a product to display it's tags.",
31
  'woo-gutenberg-products-block'
32
  ),
33
  } )( Edit );
assets/js/atomic/blocks/product-elements/title/block.js CHANGED
@@ -3,6 +3,7 @@
3
  */
4
  import PropTypes from 'prop-types';
5
  import classnames from 'classnames';
 
6
  import {
7
  useInnerBlockLayoutContext,
8
  useProductDataContext,
@@ -11,8 +12,6 @@ import { getColorClassName, getFontSizeClass } from '@wordpress/block-editor';
11
  import { isFeaturePluginBuild } from '@woocommerce/block-settings';
12
  import { gatedStyledText } from '@woocommerce/atomic-utils';
13
  import { withProductDataContext } from '@woocommerce/shared-hocs';
14
- import ProductName from '@woocommerce/base-components/product-name';
15
- import { useStoreEvents } from '@woocommerce/base-context/hooks';
16
 
17
  /**
18
  * Internal dependencies
@@ -31,6 +30,7 @@ import './style.scss';
31
  * @param {string} [props.customColor] Custom title color value.
32
  * @param {string} [props.fontSize] Title font size name.
33
  * @param {number } [props.customFontSize] Custom font size value.
 
34
  * will be used if this is not provided.
35
  * @return {*} The component.
36
  */
@@ -46,7 +46,6 @@ export const Block = ( {
46
  } ) => {
47
  const { parentClassName } = useInnerBlockLayoutContext();
48
  const { product } = useProductDataContext();
49
- const { dispatchStoreEvent } = useStoreEvents();
50
  const TagName = `h${ headingLevel }`;
51
 
52
  const colorClass = getColorClassName( 'color', color );
@@ -70,8 +69,9 @@ export const Block = ( {
70
  [ `${ parentClassName }__product-title` ]: parentClassName,
71
  [ `wc-block-components-product-title--align-${ align }` ]:
72
  align && isFeaturePluginBuild(),
73
- [ titleClasses ]: isFeaturePluginBuild(),
74
- }
 
75
  ) }
76
  style={ gatedStyledText( {
77
  color: customColor,
@@ -81,6 +81,8 @@ export const Block = ( {
81
  );
82
  }
83
 
 
 
84
  return (
85
  // @ts-ignore
86
  <TagName
@@ -89,29 +91,28 @@ export const Block = ( {
89
  'wc-block-components-product-title',
90
  {
91
  [ `${ parentClassName }__product-title` ]: parentClassName,
92
- [ `wc-block-components-product-title--align-${ align }` ]:
93
  align && isFeaturePluginBuild(),
94
- }
95
  ) }
96
  >
97
- <ProductName
98
- className={ classnames( {
99
- [ titleClasses ]: isFeaturePluginBuild(),
100
- } ) }
101
- disabled={ ! productLink }
102
- name={ product.name }
103
- permalink={ product.permalink }
104
- rel={ productLink ? 'nofollow' : null }
105
- style={ gatedStyledText( {
106
- color: customColor,
107
- fontSize: customFontSize,
108
- } ) }
109
- onClick={ () => {
110
- dispatchStoreEvent( 'product-view-link', {
111
- product,
112
- } );
113
- } }
114
- />
115
  </TagName>
116
  );
117
  };
3
  */
4
  import PropTypes from 'prop-types';
5
  import classnames from 'classnames';
6
+ import { decodeEntities } from '@wordpress/html-entities';
7
  import {
8
  useInnerBlockLayoutContext,
9
  useProductDataContext,
12
  import { isFeaturePluginBuild } from '@woocommerce/block-settings';
13
  import { gatedStyledText } from '@woocommerce/atomic-utils';
14
  import { withProductDataContext } from '@woocommerce/shared-hocs';
 
 
15
 
16
  /**
17
  * Internal dependencies
30
  * @param {string} [props.customColor] Custom title color value.
31
  * @param {string} [props.fontSize] Title font size name.
32
  * @param {number } [props.customFontSize] Custom font size value.
33
+ * @param {Object} [props.product] Optional product object. Product from context
34
  * will be used if this is not provided.
35
  * @return {*} The component.
36
  */
46
  } ) => {
47
  const { parentClassName } = useInnerBlockLayoutContext();
48
  const { product } = useProductDataContext();
 
49
  const TagName = `h${ headingLevel }`;
50
 
51
  const colorClass = getColorClassName( 'color', color );
69
  [ `${ parentClassName }__product-title` ]: parentClassName,
70
  [ `wc-block-components-product-title--align-${ align }` ]:
71
  align && isFeaturePluginBuild(),
72
+ [ titleClasses ]: isFeaturePluginBuild()
73
+ },
74
+
75
  ) }
76
  style={ gatedStyledText( {
77
  color: customColor,
81
  );
82
  }
83
 
84
+ const productName = decodeEntities( product.name );
85
+
86
  return (
87
  // @ts-ignore
88
  <TagName
91
  'wc-block-components-product-title',
92
  {
93
  [ `${ parentClassName }__product-title` ]: parentClassName,
94
+ [ `wc-block-components-product-title__align-${ align }` ]:
95
  align && isFeaturePluginBuild(),
96
+ },
97
  ) }
98
  >
99
+ { productLink ? (
100
+ <a
101
+ href={ product.permalink }
102
+ rel="nofollow"
103
+ className={ classnames( {
104
+ [ titleClasses ]: isFeaturePluginBuild(),
105
+ } ) }
106
+ style={ gatedStyledText( {
107
+ color: customColor,
108
+ fontSize: customFontSize,
109
+ } ) }
110
+ >
111
+ { productName }
112
+ </a>
113
+ ) : (
114
+ productName
115
+ ) }
 
116
  </TagName>
117
  );
118
  };
assets/js/atomic/blocks/product-elements/title/edit.js CHANGED
@@ -14,7 +14,7 @@ import {
14
  withFontSizes,
15
  } from '@wordpress/block-editor';
16
  import { isFeaturePluginBuild } from '@woocommerce/block-settings';
17
- import HeadingToolbar from '@woocommerce/editor-components/heading-toolbar';
18
 
19
  /**
20
  * Internal dependencies
@@ -121,7 +121,7 @@ const Title = isFeaturePluginBuild()
121
  icon: BLOCK_ICON,
122
  label: BLOCK_TITLE,
123
  description: __(
124
- 'Choose a product to display its title.',
125
  'woo-gutenberg-products-block'
126
  ),
127
  } ),
14
  withFontSizes,
15
  } from '@wordpress/block-editor';
16
  import { isFeaturePluginBuild } from '@woocommerce/block-settings';
17
+ import HeadingToolbar from '@woocommerce/block-components/heading-toolbar';
18
 
19
  /**
20
  * Internal dependencies
121
  icon: BLOCK_ICON,
122
  label: BLOCK_TITLE,
123
  description: __(
124
+ "Choose a product to display it's title.",
125
  'woo-gutenberg-products-block'
126
  ),
127
  } ),
assets/js/atomic/blocks/product-elements/title/frontend.js CHANGED
@@ -1,6 +1,7 @@
1
  /**
2
  * External dependencies
3
  */
 
4
  import withFilteredAttributes from '@woocommerce/base-hocs/with-filtered-attributes';
5
 
6
  /**
@@ -9,4 +10,4 @@ import withFilteredAttributes from '@woocommerce/base-hocs/with-filtered-attribu
9
  import Block from './block';
10
  import attributes from './attributes';
11
 
12
- export default withFilteredAttributes( attributes )( Block );
1
  /**
2
  * External dependencies
3
  */
4
+ import { compose } from '@wordpress/compose';
5
  import withFilteredAttributes from '@woocommerce/base-hocs/with-filtered-attributes';
6
 
7
  /**
10
  import Block from './block';
11
  import attributes from './attributes';
12
 
13
+ export default compose( withFilteredAttributes( attributes ) )( Block );
assets/js/atomic/blocks/product/price/attributes.js ADDED
@@ -0,0 +1,40 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /**
2
+ * External dependencies
3
+ */
4
+ import { isFeaturePluginBuild } from '@woocommerce/block-settings';
5
+
6
+ let blockAttributes = {};
7
+
8
+ if ( isFeaturePluginBuild() ) {
9
+ blockAttributes = {
10
+ ...blockAttributes,
11
+ align: {
12
+ type: 'string',
13
+ },
14
+ fontSize: {
15
+ type: 'string',
16
+ },
17
+ customFontSize: {
18
+ type: 'number',
19
+ },
20
+ saleFontSize: {
21
+ type: 'string',
22
+ },
23
+ customSaleFontSize: {
24
+ type: 'number',
25
+ },
26
+ color: {
27
+ type: 'string',
28
+ },
29
+ saleColor: {
30
+ type: 'string',
31
+ },
32
+ customColor: {
33
+ type: 'string',
34
+ },
35
+ customSaleColor: {
36
+ type: 'string',
37
+ },
38
+ };
39
+ }
40
+ export default blockAttributes;
assets/js/atomic/blocks/product/price/index.js ADDED
@@ -0,0 +1,32 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /**
2
+ * External dependencies
3
+ */
4
+ import { __ } from '@wordpress/i18n';
5
+ import { registerBlockType } from '@wordpress/blocks';
6
+ import { CURRENCY } from '@woocommerce/settings';
7
+
8
+ /**
9
+ * Internal dependencies
10
+ */
11
+ import sharedConfig from '../shared-config';
12
+ import attributes from './attributes';
13
+ import edit from './edit';
14
+
15
+ const blockConfig = {
16
+ title: __( 'Product Price', 'woo-gutenberg-products-block' ),
17
+ description: __(
18
+ 'Display the price of a product.',
19
+ 'woo-gutenberg-products-block'
20
+ ),
21
+ icon: {
22
+ src: <b style={ { color: '$96588a' } }>{ CURRENCY.symbol }</b>,
23
+ foreground: '#96588a',
24
+ },
25
+ edit,
26
+ attributes,
27
+ };
28
+
29
+ registerBlockType( 'woocommerce/product-price', {
30
+ ...sharedConfig,
31
+ ...blockConfig,
32
+ } );
assets/js/atomic/utils/index.js CHANGED
@@ -1,5 +1,6 @@
1
- export * from './get-block-map';
2
- export * from './create-blocks-from-template';
3
- export * from './render-parent-block';
 
4
  export * from './block-styling.js';
5
- export * from './render-standalone-blocks';
1
+ export * from './get-block-map.js';
2
+ export * from './create-blocks-from-template.js';
3
+ export * from './render-parent-block.js';
4
+ export * from './render-inner-blocks.js';
5
  export * from './block-styling.js';
6
+ export * from './render-standalone-blocks.js';
assets/js/atomic/utils/render-inner-blocks.js ADDED
@@ -0,0 +1,69 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /**
2
+ * External dependencies
3
+ */
4
+ import { Suspense, cloneElement, isValidElement } from '@wordpress/element';
5
+ import parse from 'html-react-parser';
6
+
7
+ /**
8
+ * Internal dependencies
9
+ */
10
+ import { getBlockMap } from './get-block-map';
11
+
12
+ /**
13
+ * Replaces saved block HTML markup with Inner Block Components.
14
+ *
15
+ * @param {Object} props Render props.
16
+ * @param {Array} props.children Children/inner blocks to render.
17
+ * @param {string} props.blockName Parent Block Name used to get the block map and for keys.
18
+ * @param {number} [props.depth] Depth of inner blocks being rendered.
19
+ */
20
+ export const renderInnerBlocks = ( {
21
+ children,
22
+ blockName: parentBlockName,
23
+ depth = 1,
24
+ } ) => {
25
+ const blockMap = getBlockMap( parentBlockName );
26
+
27
+ return Array.from( children ).map( ( el, index ) => {
28
+ const componentProps = {
29
+ ...el.dataset,
30
+ key: `${ parentBlockName }_${ depth }_${ index }`,
31
+ };
32
+
33
+ const componentChildren =
34
+ el.children && el.children.length
35
+ ? renderInnerBlocks( {
36
+ children: el.children,
37
+ blockName: parentBlockName,
38
+ depth: depth + 1,
39
+ } )
40
+ : null;
41
+
42
+ const LayoutComponent =
43
+ componentProps.blockName && blockMap[ componentProps.blockName ]
44
+ ? blockMap[ componentProps.blockName ]
45
+ : null;
46
+
47
+ if ( ! LayoutComponent ) {
48
+ const element = parse( el.outerHTML );
49
+
50
+ if ( isValidElement( element ) ) {
51
+ return componentChildren
52
+ ? cloneElement( element, componentProps, componentChildren )
53
+ : cloneElement( element, componentProps );
54
+ }
55
+ return null;
56
+ }
57
+
58
+ return (
59
+ <Suspense
60
+ key={ `${ parentBlockName }_${ depth }_${ index }_suspense` }
61
+ fallback={ <div className="wc-block-placeholder" /> }
62
+ >
63
+ <LayoutComponent { ...componentProps }>
64
+ { componentChildren }
65
+ </LayoutComponent>
66
+ </Suspense>
67
+ );
68
+ } );
69
+ };
assets/js/atomic/utils/render-parent-block.js ADDED
@@ -0,0 +1,41 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /**
2
+ * External dependencies
3
+ */
4
+ import { renderFrontend } from '@woocommerce/base-utils';
5
+
6
+ /**
7
+ * Internal dependencies
8
+ */
9
+ import { renderInnerBlocks } from './render-inner-blocks';
10
+
11
+ /**
12
+ * Renders a block component in the place of a specified set of selectors.
13
+ *
14
+ * @param {Object} props Render props.
15
+ * @param {Function} props.Block React component to use as a replacement.
16
+ * @param {string} props.selector CSS selector to match the elements to replace.
17
+ * @param {string} [props.blockName] Optional Block Name. Used for inner block component mapping.
18
+ * @param {Function} [props.getProps] Function to generate the props object for the block.
19
+ */
20
+ export const renderParentBlock = ( {
21
+ Block,
22
+ selector,
23
+ blockName = '',
24
+ getProps = () => {},
25
+ } ) => {
26
+ const getPropsWithChildren = ( el, i ) => {
27
+ const children =
28
+ el.children && el.children.length
29
+ ? renderInnerBlocks( {
30
+ blockName,
31
+ children: el.children,
32
+ } )
33
+ : null;
34
+ return { ...getProps( el, i ), children };
35
+ };
36
+ renderFrontend( {
37
+ Block,
38
+ selector,
39
+ getProps: getPropsWithChildren,
40
+ } );
41
+ };
assets/js/atomic/utils/render-parent-block.tsx DELETED
@@ -1,126 +0,0 @@
1
- /**
2
- * External dependencies
3
- */
4
- import { renderFrontend } from '@woocommerce/base-utils';
5
- import {
6
- Fragment,
7
- Suspense,
8
- cloneElement,
9
- isValidElement,
10
- } from '@wordpress/element';
11
- import parse from 'html-react-parser';
12
-
13
- interface renderBlockProps {
14
- // Parent Block Name. Used for inner block component mapping.
15
- blockName: string;
16
- // Map of block names to block components for children.
17
- blockMap: Record< string, React.ReactNode >;
18
- // Wrapper for inner components.
19
- blockWrapper?: React.ReactNode;
20
- }
21
-
22
- interface renderParentBlockProps extends renderBlockProps {
23
- // React component to use as a replacement.
24
- Block: React.FunctionComponent;
25
- // CSS selector to match the elements to replace.
26
- selector: string;
27
- // Function to generate the props object for the block.
28
- getProps: ( el: Element, i: number ) => Record< string, unknown >;
29
- }
30
-
31
- interface renderInnerBlockProps extends renderBlockProps {
32
- children: HTMLCollection;
33
- depth?: number;
34
- }
35
-
36
- /**
37
- * Replaces saved block HTML markup with Inner Block Components.
38
- */
39
- const renderInnerBlocks = ( {
40
- blockName: parentBlockName,
41
- blockMap,
42
- blockWrapper,
43
- depth = 1,
44
- children,
45
- }: renderInnerBlockProps ): ( JSX.Element | null )[] | null => {
46
- return Array.from( children ).map( ( el: Element, index: number ) => {
47
- const { blockName = '', ...componentProps } = {
48
- key: `${ parentBlockName }_${ depth }_${ index }`,
49
- ...( el instanceof HTMLElement ? el.dataset : {} ),
50
- };
51
-
52
- const componentChildren =
53
- el.children && el.children.length
54
- ? renderInnerBlocks( {
55
- children: el.children,
56
- blockName: parentBlockName,
57
- blockMap,
58
- depth: depth + 1,
59
- blockWrapper,
60
- } )
61
- : null;
62
-
63
- const LayoutComponent =
64
- blockName && blockMap[ blockName ]
65
- ? ( blockMap[ blockName ] as React.ElementType )
66
- : null;
67
-
68
- if ( ! LayoutComponent ) {
69
- const element = parse( el.outerHTML );
70
-
71
- if ( isValidElement( element ) ) {
72
- return componentChildren
73
- ? cloneElement( element, componentProps, componentChildren )
74
- : cloneElement( element, componentProps );
75
- }
76
- return null;
77
- }
78
-
79
- const LayoutComponentWrapper = ( blockWrapper
80
- ? blockWrapper
81
- : Fragment ) as React.ElementType;
82
-
83
- return (
84
- <Suspense
85
- key={ `${ parentBlockName }_${ depth }_${ index }_suspense` }
86
- fallback={ <div className="wc-block-placeholder" /> }
87
- >
88
- <LayoutComponentWrapper>
89
- <LayoutComponent { ...componentProps }>
90
- { componentChildren }
91
- </LayoutComponent>
92
- </LayoutComponentWrapper>
93
- </Suspense>
94
- );
95
- } );
96
- };
97
-
98
- /**
99
- * Renders a block component in the place of a specified set of selectors.
100
- */
101
- export const renderParentBlock = ( {
102
- Block,
103
- selector,
104
- blockName,
105
- getProps = () => ( {} ),
106
- blockMap,
107
- blockWrapper,
108
- }: renderParentBlockProps ): void => {
109
- const getPropsWithChildren = ( el: Element, i: number ) => {
110
- const children =
111
- el.children && el.children.length
112
- ? renderInnerBlocks( {
113
- blockName,
114
- blockMap,
115
- children: el.children,
116
- blockWrapper,
117
- } )
118
- : null;
119
- return { ...getProps( el, i ), children };
120
- };
121
- renderFrontend( {
122
- Block,
123
- selector,
124
- getProps: getPropsWithChildren,
125
- } );
126
- };
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
assets/js/base/components/block-error-boundary/block-error.js CHANGED
@@ -2,11 +2,11 @@
2
  * External dependencies
3
  */
4
  import { __ } from '@wordpress/i18n';
 
5
  import PropTypes from 'prop-types';
6
- import { WC_BLOCKS_IMAGE_URL } from '@woocommerce/block-settings';
7
 
8
  const BlockError = ( {
9
- imageUrl = `${ WC_BLOCKS_IMAGE_URL }/block-error.svg`,
10
  header = __( 'Oops!', 'woo-gutenberg-products-block' ),
11
  text = __(
12
  'There was an error loading the content.',
@@ -14,7 +14,6 @@ const BlockError = ( {
14
  ),
15
  errorMessage,
16
  errorMessagePrefix = __( 'Error:', 'woo-gutenberg-products-block' ),
17
- button,
18
  } ) => {
19
  return (
20
  <div className="wc-block-error wc-block-components-error">
@@ -42,11 +41,6 @@ const BlockError = ( {
42
  { errorMessage }
43
  </p>
44
  ) }
45
- { button && (
46
- <p className="wc-block-error__button wc-block-components-error__button">
47
- { button }
48
- </p>
49
- ) }
50
  </div>
51
  </div>
52
  );
@@ -79,10 +73,6 @@ BlockError.propTypes = {
79
  * Text preceeding the error message.
80
  */
81
  errorMessagePrefix: PropTypes.string,
82
- /**
83
- * Button cta.
84
- */
85
- button: PropTypes.node,
86
  };
87
 
88
  export default BlockError;
2
  * External dependencies
3
  */
4
  import { __ } from '@wordpress/i18n';
5
+ import { WC_BLOCKS_ASSET_URL } from '@woocommerce/block-settings';
6
  import PropTypes from 'prop-types';
 
7
 
8
  const BlockError = ( {
9
+ imageUrl = `${ WC_BLOCKS_ASSET_URL }img/block-error.svg`,
10
  header = __( 'Oops!', 'woo-gutenberg-products-block' ),
11
  text = __(
12
  'There was an error loading the content.',
14
  ),
15
  errorMessage,
16
  errorMessagePrefix = __( 'Error:', 'woo-gutenberg-products-block' ),
 
17
  } ) => {
18
  return (
19
  <div className="wc-block-error wc-block-components-error">
41
  { errorMessage }
42
  </p>
43
  ) }
 
 
 
 
 
44
  </div>
45
  </div>
46
  );
73
  * Text preceeding the error message.
74
  */
75
  errorMessagePrefix: PropTypes.string,
 
 
 
 
76
  };
77
 
78
  export default BlockError;
assets/js/base/components/block-error-boundary/index.js CHANGED
@@ -2,7 +2,7 @@
2
  * External dependencies
3
  */
4
  import PropTypes from 'prop-types';
5
- import { Component } from 'react';
6
 
7
  /**
8
  * Internal dependencies
@@ -20,10 +20,10 @@ class BlockErrorBoundary extends Component {
20
  ) {
21
  return {
22
  errorMessage: (
23
- <>
24
  <strong>{ error.status }</strong>:&nbsp;
25
  { error.statusText }
26
- </>
27
  ),
28
  hasError: true,
29
  };
@@ -39,15 +39,10 @@ class BlockErrorBoundary extends Component {
39
  showErrorMessage,
40
  text,
41
  errorMessagePrefix,
42
- renderError,
43
- button,
44
  } = this.props;
45
  const { errorMessage, hasError } = this.state;
46
 
47
  if ( hasError ) {
48
- if ( typeof renderError === 'function' ) {
49
- return renderError( { errorMessage } );
50
- }
51
  return (
52
  <BlockError
53
  errorMessage={ showErrorMessage ? errorMessage : null }
@@ -55,7 +50,6 @@ class BlockErrorBoundary extends Component {
55
  imageUrl={ imageUrl }
56
  text={ text }
57
  errorMessagePrefix={ errorMessagePrefix }
58
- button={ button }
59
  />
60
  );
61
  }
@@ -91,10 +85,6 @@ BlockErrorBoundary.propTypes = {
91
  * Text preceeding the error message.
92
  */
93
  errorMessagePrefix: PropTypes.string,
94
- /**
95
- * Render function to show a custom error component.
96
- */
97
- renderError: PropTypes.func,
98
  };
99
 
100
  BlockErrorBoundary.defaultProps = {
2
  * External dependencies
3
  */
4
  import PropTypes from 'prop-types';
5
+ import { Component, Fragment } from 'react';
6
 
7
  /**
8
  * Internal dependencies
20
  ) {
21
  return {
22
  errorMessage: (
23
+ <Fragment>
24
  <strong>{ error.status }</strong>:&nbsp;
25
  { error.statusText }
26
+ </Fragment>
27
  ),
28
  hasError: true,
29
  };
39
  showErrorMessage,
40
  text,
41
  errorMessagePrefix,
 
 
42
  } = this.props;
43
  const { errorMessage, hasError } = this.state;
44
 
45
  if ( hasError ) {
 
 
 
46
  return (
47
  <BlockError
48
  errorMessage={ showErrorMessage ? errorMessage : null }
50
  imageUrl={ imageUrl }
51
  text={ text }
52
  errorMessagePrefix={ errorMessagePrefix }
 
53
  />
54
  );
55
  }
85
  * Text preceeding the error message.
86
  */
87
  errorMessagePrefix: PropTypes.string,
 
 
 
 
88
  };
89
 
90
  BlockErrorBoundary.defaultProps = {
assets/js/base/components/block-error-boundary/style.scss CHANGED
@@ -1,34 +1,36 @@
1
  .wc-block-components-error {
2
  display: flex;
3
- padding: $gap-largest 0;
4
- margin: $gap-largest 0;
 
5
  align-items: center;
6
  justify-content: center;
7
  flex-direction: column;
8
- color: $gray-700;
9
- text-align: center;
10
  }
 
11
  .wc-block-components-error__header {
12
  @include font-size(larger);
 
13
  margin: 0;
14
- color: $studio-gray-50;
15
  }
 
16
  .wc-block-components-error__image {
17
- width: 25%;
18
- margin: 0 0 $gap-large 0;
19
  }
20
  .wc-block-components-error__text {
21
- margin: 1em 0 0;
22
- color: $studio-gray-30;
23
- @include font-size(large);
24
- max-width: 60ch;
25
  }
26
  .wc-block-components-error__message {
27
- margin: 1em 0 0;
28
  font-style: italic;
29
- color: $studio-gray-30;
30
- max-width: 60ch;
31
  }
32
- .wc-block-error__button {
33
- margin: $gap-largest 0 0 0;
 
 
 
 
 
 
 
34
  }
1
  .wc-block-components-error {
2
  display: flex;
3
+ background-color: #f3f3f4;
4
+ border-left: 4px solid #6d6d6d;
5
+ padding: $gap-larger $gap;
6
  align-items: center;
7
  justify-content: center;
8
  flex-direction: column;
 
 
9
  }
10
+
11
  .wc-block-components-error__header {
12
  @include font-size(larger);
13
+ font-weight: bold;
14
  margin: 0;
 
15
  }
16
+
17
  .wc-block-components-error__image {
18
+ max-width: 25%;
 
19
  }
20
  .wc-block-components-error__text {
21
+ margin: 0;
 
 
 
22
  }
23
  .wc-block-components-error__message {
24
+ margin: 1em 0 0 0;
25
  font-style: italic;
 
 
26
  }
27
+
28
+ @include breakpoint( ">480px" ) {
29
+ .wc-block-components-error {
30
+ flex-direction: row;
31
+ }
32
+
33
+ .wc-block-components-error__image + .wc-block-components-error__content {
34
+ margin-left: $gap-large;
35
+ }
36
  }
assets/js/base/components/button/{index.tsx → index.js} RENAMED
@@ -2,31 +2,18 @@
2
  * External dependencies
3
  */
4
  import { Button as WPButton } from 'wordpress-components';
5
- import type { ReactNode } from 'react';
6
  import classNames from 'classnames';
7
- import Spinner from '@woocommerce/base-components/spinner';
8
 
9
  /**
10
  * Internal dependencies
11
  */
12
  import './style.scss';
13
 
14
- interface ButtonProps extends WPButton.ButtonProps {
15
- className?: string;
16
- showSpinner?: boolean;
17
- children?: ReactNode;
18
- }
19
-
20
  /**
21
- * Component that visually renders a button but semantically might be `<button>` or `<a>` depending
22
- * on the props.
23
  */
24
- const Button = ( {
25
- className,
26
- showSpinner = false,
27
- children,
28
- ...props
29
- }: ButtonProps ): JSX.Element => {
30
  const buttonClassName = classNames(
31
  'wc-block-components-button',
32
  className,
@@ -37,7 +24,12 @@ const Button = ( {
37
 
38
  return (
39
  <WPButton className={ buttonClassName } { ...props }>
40
- { showSpinner && <Spinner /> }
 
 
 
 
 
41
  <span className="wc-block-components-button__text">
42
  { children }
43
  </span>
@@ -45,4 +37,10 @@ const Button = ( {
45
  );
46
  };
47
 
 
 
 
 
 
 
48
  export default Button;
2
  * External dependencies
3
  */
4
  import { Button as WPButton } from 'wordpress-components';
5
+ import PropTypes from 'prop-types';
6
  import classNames from 'classnames';
 
7
 
8
  /**
9
  * Internal dependencies
10
  */
11
  import './style.scss';
12
 
 
 
 
 
 
 
13
  /**
14
+ * Component that visually renders a button but semantically might be `<button>` or `<a>` depending on the props.
 
15
  */
16
+ const Button = ( { className, showSpinner = false, children, ...props } ) => {
 
 
 
 
 
17
  const buttonClassName = classNames(
18
  'wc-block-components-button',
19
  className,
24
 
25
  return (
26
  <WPButton className={ buttonClassName } { ...props }>
27
+ { showSpinner && (
28
+ <span
29
+ className="wc-block-components-button__spinner"
30
+ aria-hidden="true"
31
+ />
32
+ ) }
33
  <span className="wc-block-components-button__text">
34
  { children }
35
  </span>
37
  );
38
  };
39
 
40
+ Button.propTypes = {
41
+ className: PropTypes.string,
42
+ showSpinner: PropTypes.bool,
43
+ children: PropTypes.node,
44
+ };
45
+
46
  export default Button;
assets/js/base/components/button/style.scss CHANGED
@@ -1,7 +1,7 @@
1
  .wc-block-components-button:not(.is-link) {
2
  @include reset-typography();
3
  align-items: center;
4
- background-color: $gray-900;
5
  color: $white;
6
  display: inline-flex;
7
  font-weight: bold;
@@ -18,7 +18,7 @@
18
  &:hover,
19
  &:focus,
20
  &:active {
21
- background-color: $gray-900;
22
  color: $white;
23
  }
24
 
@@ -29,7 +29,45 @@
29
  fill: currentColor;
30
  }
31
  }
32
- .wc-block-components-spinner + .wc-block-components-button__text {
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
33
  visibility: hidden;
34
  }
35
  }
 
 
 
 
 
 
 
 
 
 
1
  .wc-block-components-button:not(.is-link) {
2
  @include reset-typography();
3
  align-items: center;
4
+ background-color: $black;
5
  color: $white;
6
  display: inline-flex;
7
  font-weight: bold;
18
  &:hover,
19
  &:focus,
20
  &:active {
21
+ background-color: $black;
22
  color: $white;
23
  }
24
 
29
  fill: currentColor;
30
  }
31
  }
32
+ .wc-block-components-button__spinner {
33
+ width: 1em;
34
+ height: 1em;
35
+ position: absolute;
36
+ top: 50%;
37
+ left: 0;
38
+ width: 100%;
39
+ height: 100%;
40
+ margin-top: -0.5em;
41
+ color: inherit;
42
+ box-sizing: content-box;
43
+
44
+ &::after {
45
+ content: " ";
46
+ display: inline-block;
47
+ margin: 0 auto;
48
+ width: 1em;
49
+ height: 1em;
50
+ box-sizing: border-box;
51
+ transform-origin: 50% 50%;
52
+ transform: translateZ(0) scale(0.5);
53
+ backface-visibility: hidden;
54
+ border-radius: 50%;
55
+ border: 0.2em solid currentColor;
56
+ border-left-color: transparent;
57
+ animation: wc-block-components-button__spinner__animation 1s infinite linear;
58
+ }
59
+ }
60
+ .wc-block-components-button__spinner + .wc-block-components-button__text {
61
  visibility: hidden;
62
  }
63
  }
64
+
65
+ @keyframes wc-block-components-button__spinner__animation {
66
+ 0% {
67
+ animation-timing-function: cubic-bezier(0.5856, 0.0703, 0.4143, 0.9297);
68
+ transform: rotate(0deg);
69
+ }
70
+ 100% {
71
+ transform: rotate(360deg);
72
+ }
73
+ }
assets/js/base/components/cart-checkout/address-form/country-address-fields.js ADDED
@@ -0,0 +1,546 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /** @typedef { import('@woocommerce/type-defs/address-fields').CountryAddressFields } CountryAddressFields */
2
+ /** @typedef { import('@woocommerce/type-defs/address-fields').AddressFieldKey } AddressFieldKey */
3
+ /** @typedef { import('@woocommerce/type-defs/address-fields').AddressField } AddressField */
4
+
5
+ /**
6
+ * External dependencies
7
+ */
8
+ import { __ } from '@wordpress/i18n';
9
+
10
+ /**
11
+ * Used to render postcode before the city field.
12
+ *
13
+ * @type {Object <AddressFieldKey, AddressField>}
14
+ */
15
+ const postcodeBeforeCity = {
16
+ city: {
17
+ index: 9,
18
+ },
19
+ postcode: {
20
+ index: 7,
21
+ },
22
+ };
23
+
24
+ /**
25
+ * Used to make the state field optional.
26
+ *
27
+ * @type {Object <AddressFieldKey, AddressField>}
28
+ */
29
+ const optionalState = {
30
+ state: {
31
+ required: false,
32
+ },
33
+ };
34
+
35
+ /**
36
+ * Used to hide the state field.
37
+ *
38
+ * @type {Object <AddressFieldKey, AddressField>}
39
+ */
40
+ const hiddenState = {
41
+ state: {
42
+ required: false,
43
+ hidden: true,
44
+ },
45
+ };
46
+
47
+ /**
48
+ * Used to hide the postcode field.
49
+ *
50
+ * @type {Object <AddressFieldKey, AddressField>}
51
+ */
52
+ const hiddenPostcode = {
53
+ postcode: {
54
+ required: false,
55
+ hidden: true,
56
+ },
57
+ };
58
+
59
+ /**
60
+ * Country specific address field properties.
61
+ *
62
+ * @type {CountryAddressFields}
63
+ */
64
+ const countryAddressFields = {
65
+ AE: {
66
+ ...hiddenPostcode,
67
+ ...optionalState,
68
+ },
69
+ AF: hiddenState,
70
+ AO: {
71
+ ...hiddenPostcode,
72
+ state: {
73
+ label: __( 'Province', 'woo-gutenberg-products-block' ),
74
+ optionalLabel: __(
75
+ 'Province (optional)',
76
+ 'woo-gutenberg-products-block'
77
+ ),
78
+ },
79
+ },
80
+ AT: {
81
+ ...postcodeBeforeCity,
82
+ ...hiddenState,
83
+ },
84
+ AU: {
85
+ city: {
86
+ label: __( 'Suburb', 'woo-gutenberg-products-block' ),
87
+ optionalLabel: __(
88
+ 'Suburb (optional)',
89
+ 'woo-gutenberg-products-block'
90
+ ),
91
+ },
92
+ postcode: {
93
+ label: __( 'Postcode', 'woo-gutenberg-products-block' ),
94
+ optionalLabel: __(
95
+ 'Postcode (optional)',
96
+ 'woo-gutenberg-products-block'
97
+ ),
98
+ },
99
+ state: {
100
+ label: __( 'State', 'woo-gutenberg-products-block' ),
101
+ optionalLabel: __(
102
+ 'State (optional)',
103
+ 'woo-gutenberg-products-block'
104
+ ),
105
+ },
106
+ },
107
+ AX: {
108
+ ...postcodeBeforeCity,
109
+ ...hiddenState,
110
+ },
111
+ BD: {
112
+ postcode: {
113
+ required: false,
114
+ },
115
+ state: {
116
+ label: __( 'District', 'woo-gutenberg-products-block' ),
117
+ optionalLabel: __(
118
+ 'District (optional)',
119
+ 'woo-gutenberg-products-block'
120
+ ),
121
+ },
122
+ },
123
+ BE: {
124
+ ...postcodeBeforeCity,
125
+ ...hiddenState,
126
+ },
127
+ BH: {
128
+ postcode: {
129
+ required: false,
130
+ },
131
+ ...hiddenState,
132
+ },
133
+ BI: hiddenState,
134
+ BO: hiddenPostcode,
135
+ BS: hiddenPostcode,
136
+ CA: {
137
+ state: {
138
+ label: __( 'Province', 'woo-gutenberg-products-block' ),
139
+ optionalLabel: __(
140
+ 'Province (optional)',
141
+ 'woo-gutenberg-products-block'
142
+ ),
143
+ },
144
+ },
145
+ CH: {
146
+ ...postcodeBeforeCity,
147
+ state: {
148
+ label: __( 'Canton', 'woo-gutenberg-products-block' ),
149
+ optionalLabel: __(
150
+ 'Canton (optional)',
151
+ 'woo-gutenberg-products-block'
152
+ ),
153
+ required: false,
154
+ },
155
+ },
156
+ CL: {
157
+ city: {
158
+ require: true,
159
+ },
160
+ postcode: {
161
+ required: false,
162
+ },
163
+ state: {
164
+ label: __( 'Region', 'woo-gutenberg-products-block' ),
165
+ optionalLabel: __(
166
+ 'Region (optional)',
167
+ 'woo-gutenberg-products-block'
168
+ ),
169
+ },
170
+ },
171
+ CN: {
172
+ state: {
173
+ label: __( 'Province', 'woo-gutenberg-products-block' ),
174
+ optionalLabel: __(
175
+ 'Province (optional)',
176
+ 'woo-gutenberg-products-block'
177
+ ),
178
+ },
179
+ },
180
+ CO: {
181
+ postcode: {
182
+ required: false,
183
+ },
184
+ },
185
+ CZ: hiddenState,
186
+ DE: {
187
+ ...postcodeBeforeCity,
188
+ ...hiddenState,
189
+ },
190
+ DK: {
191
+ ...postcodeBeforeCity,
192
+ ...hiddenState,
193
+ },
194
+ EE: {
195
+ ...postcodeBeforeCity,
196
+ ...hiddenState,
197
+ },
198
+ ES: {
199
+ ...postcodeBeforeCity,
200
+ state: {
201
+ label: __( 'State', 'woo-gutenberg-products-block' ),
202
+ optionalLabel: __(
203
+ 'State (optional)',
204
+ 'woo-gutenberg-products-block'
205
+ ),
206
+ },
207
+ },
208
+ FI: {
209
+ ...postcodeBeforeCity,
210
+ ...hiddenState,
211
+ },
212
+ FR: {
213
+ ...postcodeBeforeCity,
214
+ ...hiddenState,
215
+ },
216
+ GB: {
217
+ postcode: {
218
+ label: __( 'Postcode', 'woo-gutenberg-products-block' ),
219
+ optionalLabel: __(
220
+ 'Postcode (optional)',
221
+ 'woo-gutenberg-products-block'
222
+ ),
223
+ },
224
+ state: {
225
+ label: __( 'County', 'woo-gutenberg-products-block' ),
226
+ optionalLabel: __(
227
+ 'County (optional)',
228
+ 'woo-gutenberg-products-block'
229
+ ),
230
+ },
231
+ },
232
+ GP: hiddenState,
233
+ GF: hiddenState,
234
+ GR: optionalState,
235
+ HK: {
236
+ postcode: {
237
+ required: false,
238
+ },
239
+ city: {
240
+ label: __( 'Town/District', 'woo-gutenberg-products-block' ),
241
+ optionalLabel: __(
242
+ 'Town/District (optional)',
243
+ 'woo-gutenberg-products-block'
244
+ ),
245
+ },
246
+ state: {
247
+ label: __( 'Region', 'woo-gutenberg-products-block' ),
248
+ optionalLabel: __(
249
+ 'Region (optional)',
250
+ 'woo-gutenberg-products-block'
251
+ ),
252
+ },
253
+ },
254
+ HU: {
255
+ state: {
256
+ label: __( 'County', 'woo-gutenberg-products-block' ),
257
+ optionalLabel: __(
258
+ 'County (optional)',
259
+ 'woo-gutenberg-products-block'
260
+ ),
261
+ },
262
+ },
263
+ ID: {
264
+ state: {
265
+ label: __( 'Province', 'woo-gutenberg-products-block' ),
266
+ optionalLabel: __(
267
+ 'Province (optional)',
268
+ 'woo-gutenberg-products-block'
269
+ ),
270
+ },
271
+ },
272
+ IE: {
273
+ postcode: {
274
+ label: __( 'Eircode', 'woo-gutenberg-products-block' ),
275
+ optionalLabel: __(
276
+ 'Eircode (optional)',
277
+ 'woo-gutenberg-products-block'
278
+ ),
279
+ required: false,
280
+ },
281
+ state: {
282
+ label: __( 'County', 'woo-gutenberg-products-block' ),
283
+ optionalLabel: __(
284
+ 'County (optional)',
285
+ 'woo-gutenberg-products-block'
286
+ ),
287
+ },
288
+ },
289
+ IS: {
290
+ ...postcodeBeforeCity,
291
+ ...hiddenState,
292
+ },
293
+ IL: {
294
+ ...postcodeBeforeCity,
295
+ ...hiddenState,
296
+ },
297
+ IM: hiddenState,
298
+ IT: {
299
+ ...postcodeBeforeCity,
300
+ state: {
301
+ label: __( 'Province', 'woo-gutenberg-products-block' ),
302
+ optionalLabel: __(
303
+ 'Province (optional)',
304
+ 'woo-gutenberg-products-block'
305
+ ),
306
+ },
307
+ },
308
+ JP: {
309
+ first_name: {
310
+ index: 2,
311
+ },
312
+ last_name: {
313
+ index: 1,
314
+ },
315
+ address_1: {
316
+ index: 7,
317
+ },
318
+ address_2: {
319
+ index: 8,
320
+ },
321
+ postcode: {
322
+ index: 4,
323
+ },
324
+ city: {
325
+ index: 6,
326
+ },
327
+ state: {
328
+ label: __( 'Prefecture', 'woo-gutenberg-products-block' ),
329
+ optionalLabel: __(
330
+ 'Prefecture (optional)',
331
+ 'woo-gutenberg-products-block'
332
+ ),
333
+ index: 5,
334
+ },
335
+ },
336
+ KR: hiddenState,
337
+ KW: hiddenState,
338
+ LB: hiddenState,
339
+ LI: {
340
+ ...postcodeBeforeCity,
341
+ state: {
342
+ label: __( 'Municipality', 'woo-gutenberg-products-block' ),
343
+ optionalLabel: __(
344
+ 'Municipality (optional)',
345
+ 'woo-gutenberg-products-block'
346
+ ),
347
+ required: false,
348
+ },
349
+ },
350
+ LK: hiddenState,
351
+ LU: hiddenState,
352
+ LV: {
353
+ state: {
354
+ label: __( 'Municipality', 'woo-gutenberg-products-block' ),
355
+ optionalLabel: __(
356
+ 'Municipality (optional)',
357
+ 'woo-gutenberg-products-block'
358
+ ),
359
+ required: false,
360
+ },
361
+ },
362
+ MQ: hiddenState,
363
+ MT: hiddenState,
364
+ MZ: {
365
+ ...hiddenPostcode,
366
+ state: {
367
+ label: __( 'Province', 'woo-gutenberg-products-block' ),
368
+ optionalLabel: __(
369
+ 'Province (optional)',
370
+ 'woo-gutenberg-products-block'
371
+ ),
372
+ },
373
+ },
374
+ NL: {
375
+ ...postcodeBeforeCity,
376
+ ...hiddenState,
377
+ },
378
+ NG: {
379
+ ...hiddenPostcode,
380
+ state: {
381
+ label: __( 'State', 'woo-gutenberg-products-block' ),
382
+ optionalLabel: __(
383
+ 'State (optional)',
384
+ 'woo-gutenberg-products-block'
385
+ ),
386
+ },
387
+ },
388
+ NO: {
389
+ ...postcodeBeforeCity,
390
+ ...hiddenState,
391
+ },
392
+ NP: {
393
+ postcode: {
394
+ required: false,
395
+ },
396
+ state: {
397
+ label: __( 'State', 'woo-gutenberg-products-block' ),
398
+ optionalLabel: __(
399
+ 'State (optional)',
400
+ 'woo-gutenberg-products-block'
401
+ ),
402
+ },
403
+ },
404
+ NZ: {
405
+ postcode: {
406
+ label: __( 'Postcode', 'woo-gutenberg-products-block' ),
407
+ optionalLabel: __(
408
+ 'Postcode (optional)',
409
+ 'woo-gutenberg-products-block'
410
+ ),
411
+ },
412
+ state: {
413
+ label: __( 'Region', 'woo-gutenberg-products-block' ),
414
+ optionalLabel: __(
415
+ 'Region (optional)',
416
+ 'woo-gutenberg-products-block'
417
+ ),
418
+ },
419
+ },
420
+ PL: {
421
+ ...postcodeBeforeCity,
422
+ ...hiddenState,
423
+ },
424
+ PT: hiddenState,
425
+ RE: hiddenState,
426
+ RO: {
427
+ state: {
428
+ label: __( 'County', 'woo-gutenberg-products-block' ),
429
+ optionalLabel: __(
430
+ 'County (optional)',
431
+ 'woo-gutenberg-products-block'
432
+ ),
433
+ },
434
+ },
435
+ RS: hiddenState,
436
+ SE: {
437
+ ...postcodeBeforeCity,
438
+ ...hiddenState,
439
+ },
440
+ SG: {
441
+ city: {
442
+ required: false,
443
+ },
444
+ ...hiddenState,
445
+ },
446
+ SK: {
447
+ ...postcodeBeforeCity,
448
+ ...hiddenState,
449
+ },
450
+ SI: {
451
+ ...postcodeBeforeCity,
452
+ ...hiddenState,
453
+ },
454
+ SR: {
455
+ ...hiddenPostcode,
456
+ },
457
+ ST: {
458
+ ...hiddenPostcode,
459
+ state: {
460
+ label: __( 'District', 'woo-gutenberg-products-block' ),
461
+ optionalLabel: __(
462
+ 'District (optional)',
463
+ 'woo-gutenberg-products-block'
464
+ ),
465
+ },
466
+ },
467
+ MD: {
468
+ state: {
469
+ label: __(
470
+ 'Municipality/District',
471
+ 'woo-gutenberg-products-block'
472
+ ),
473
+ optionalLabel: __(
474
+ 'Municipality/District (optional)',
475
+ 'woo-gutenberg-products-block'
476
+ ),
477
+ },
478
+ },
479
+ TR: {
480
+ ...postcodeBeforeCity,
481
+ state: {
482
+ label: __( 'Province', 'woo-gutenberg-products-block' ),
483
+ optionalLabel: __(
484
+ 'Province (optional)',
485
+ 'woo-gutenberg-products-block'
486
+ ),
487
+ },
488
+ },
489
+ UG: {
490
+ ...hiddenPostcode,
491
+ city: {
492
+ label: __( 'Town/Village', 'woo-gutenberg-products-block' ),
493
+ optionalLabel: __(
494
+ 'Town/Village (optional)',
495
+ 'woo-gutenberg-products-block'
496
+ ),
497
+ },
498
+ state: {
499
+ label: __( 'District', 'woo-gutenberg-products-block' ),
500
+ optionalLabel: __(
501
+ 'District (optional)',
502
+ 'woo-gutenberg-products-block'
503
+ ),
504
+ },
505
+ },
506
+ US: {
507
+ postcode: {
508
+ label: __( 'ZIP', 'woo-gutenberg-products-block' ),
509
+ optionalLabel: __(
510
+ 'ZIP (optional)',
511
+ 'woo-gutenberg-products-block'
512
+ ),
513
+ },
514
+ state: {
515
+ label: __( 'State', 'woo-gutenberg-products-block' ),
516
+ optionalLabel: __(
517
+ 'State (optional)',
518
+ 'woo-gutenberg-products-block'
519
+ ),
520
+ },
521
+ },
522
+ VN: {
523
+ city: {
524
+ index: 8,
525
+ },
526
+ postcode: {
527
+ index: 7,
528
+ required: false,
529
+ },
530
+ ...hiddenState,
531
+ },
532
+ WS: hiddenPostcode,
533
+ YT: hiddenState,
534
+ ZA: {
535
+ state: {
536
+ label: __( 'Province', 'woo-gutenberg-products-block' ),
537
+ optionalLabel: __(
538
+ 'Province (optional)',
539
+ 'woo-gutenberg-products-block'
540
+ ),
541
+ },
542
+ },
543
+ ZW: hiddenPostcode,
544
+ };
545
+
546
+ export default countryAddressFields;
assets/js/{settings/shared/default-address-fields.ts → base/components/cart-checkout/address-form/default-address-fields.js} RENAMED
@@ -1,74 +1,24 @@
 
 
1
  /**
2
  * External dependencies
3
  */
4
  import { __ } from '@wordpress/i18n';
5
 
6
- export interface AddressField {
7
- // The label for the field.
8
- label: string;
9
- // The label for the field if made optional.
10
- optionalLabel: string;
11
- // The HTML autocomplete attribute value. See https://developer.mozilla.org/en-US/docs/Web/HTML/Attributes/autocomplete
12
- autocomplete: string;
13
- // How this field value is capitalized.
14
- autocapitalize?: string;
15
- // Set to true if the field is required.
16
- required: boolean;
17
- // Set to true if the field should not be rendered.
18
- hidden: boolean;
19
- // Fields will be sorted and render in this order, lowest to highest.
20
- index: number;
21
- }
22
-
23
- export interface LocaleSpecificAddressField extends AddressField {
24
- priority: number;
25
- }
26
-
27
- export interface AddressFields {
28
- // eslint-disable-next-line camelcase
29
- first_name: AddressField;
30
- // eslint-disable-next-line camelcase
31
- last_name: AddressField;
32
- company: AddressField;
33
- // eslint-disable-next-line camelcase
34
- address_1: AddressField;
35
- // eslint-disable-next-line camelcase
36
- address_2: AddressField;
37
- country: AddressField;
38
- city: AddressField;
39
- state: AddressField;
40
- postcode: AddressField;
41
- }
42
-
43
- export type AddressType = 'billing' | 'shipping';
44
- export interface EnteredAddress {
45
- // eslint-disable-next-line camelcase
46
- first_name: string;
47
- // eslint-disable-next-line camelcase
48
- last_name: string;
49
- company: string;
50
- // eslint-disable-next-line camelcase
51
- address_1: string;
52
- // eslint-disable-next-line camelcase
53
- address_2: string;
54
- country: string;
55
- city: string;
56
- state: string;
57
- postcode: string;
58
- }
59
-
60
- export type KeyedAddressField = AddressField & {
61
- key: keyof AddressFields;
62
- errorMessage?: string;
63
- };
64
- export type ShippingAddress = EnteredAddress;
65
- export type BillingAddress = EnteredAddress;
66
- export type CountryAddressFields = Record< string, AddressFields >;
67
-
68
  /**
69
  * Default address field properties.
 
 
 
 
 
 
 
 
 
 
70
  */
71
- export const defaultAddressFields: AddressFields = {
72
  first_name: {
73
  label: __( 'First name', 'woo-gutenberg-products-block' ),
74
  optionalLabel: __(
@@ -76,10 +26,9 @@ export const defaultAddressFields: AddressFields = {
76
  'woo-gutenberg-products-block'
77
  ),
78
  autocomplete: 'given-name',
79
- autocapitalize: 'sentences',
80
  required: true,
81
  hidden: false,
82
- index: 10,
83
  },
84
  last_name: {
85
  label: __( 'Last name', 'woo-gutenberg-products-block' ),
@@ -88,10 +37,9 @@ export const defaultAddressFields: AddressFields = {
88
  'woo-gutenberg-products-block'
89
  ),
90
  autocomplete: 'family-name',
91
- autocapitalize: 'sentences',
92
  required: true,
93
  hidden: false,
94
- index: 20,
95
  },
96
  company: {
97
  label: __( 'Company', 'woo-gutenberg-products-block' ),
@@ -100,10 +48,9 @@ export const defaultAddressFields: AddressFields = {
100
  'woo-gutenberg-products-block'
101
  ),
102
  autocomplete: 'organization',
103
- autocapitalize: 'sentences',
104
  required: false,
105
  hidden: false,
106
- index: 30,
107
  },
108
  address_1: {
109
  label: __( 'Address', 'woo-gutenberg-products-block' ),
@@ -112,10 +59,9 @@ export const defaultAddressFields: AddressFields = {
112
  'woo-gutenberg-products-block'
113
  ),
114
  autocomplete: 'address-line1',
115
- autocapitalize: 'sentences',
116
  required: true,
117
  hidden: false,
118
- index: 40,
119
  },
120
  address_2: {
121
  label: __( 'Apartment, suite, etc.', 'woo-gutenberg-products-block' ),
@@ -124,10 +70,9 @@ export const defaultAddressFields: AddressFields = {
124
  'woo-gutenberg-products-block'
125
  ),
126
  autocomplete: 'address-line2',
127
- autocapitalize: 'sentences',
128
  required: false,
129
  hidden: false,
130
- index: 50,
131
  },
132
  country: {
133
  label: __( 'Country/Region', 'woo-gutenberg-products-block' ),
@@ -138,16 +83,15 @@ export const defaultAddressFields: AddressFields = {
138
  autocomplete: 'country',
139
  required: true,
140
  hidden: false,
141
- index: 60,
142
  },
143
  city: {
144
  label: __( 'City', 'woo-gutenberg-products-block' ),
145
  optionalLabel: __( 'City (optional)', 'woo-gutenberg-products-block' ),
146
  autocomplete: 'address-level2',
147
- autocapitalize: 'sentences',
148
  required: true,
149
  hidden: false,
150
- index: 70,
151
  },
152
  state: {
153
  label: __( 'State/County', 'woo-gutenberg-products-block' ),
@@ -156,10 +100,9 @@ export const defaultAddressFields: AddressFields = {
156
  'woo-gutenberg-products-block'
157
  ),
158
  autocomplete: 'address-level1',
159
- autocapitalize: 'sentences',
160
  required: true,
161
  hidden: false,
162
- index: 80,
163
  },
164
  postcode: {
165
  label: __( 'Postal code', 'woo-gutenberg-products-block' ),
@@ -168,11 +111,10 @@ export const defaultAddressFields: AddressFields = {
168
  'woo-gutenberg-products-block'
169
  ),
170
  autocomplete: 'postal-code',
171
- autocapitalize: 'characters',
172
  required: true,
173
  hidden: false,
174
- index: 90,
175
  },
176
  };
177
 
178
- export default defaultAddressFields;
1
+ /** @typedef { import('@woocommerce/type-defs/address-fields').AddressField } AddressField */
2
+
3
  /**
4
  * External dependencies
5
  */
6
  import { __ } from '@wordpress/i18n';
7
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
8
  /**
9
  * Default address field properties.
10
+ *
11
+ * @property {AddressField} first_name Customer first name.
12
+ * @property {AddressField} last_name Customer last name.
13
+ * @property {AddressField} company Company name.
14
+ * @property {AddressField} address_1 Street address.
15
+ * @property {AddressField} address_2 Second line of address.
16
+ * @property {AddressField} country Country code.
17
+ * @property {AddressField} city City name.
18
+ * @property {AddressField} state State name or code.
19
+ * @property {AddressField} postcode Postal code.
20
  */
21
+ const AddressFields = {
22
  first_name: {
23
  label: __( 'First name', 'woo-gutenberg-products-block' ),
24
  optionalLabel: __(
26
  'woo-gutenberg-products-block'
27
  ),
28
  autocomplete: 'given-name',
 
29
  required: true,
30
  hidden: false,
31
+ index: 1,
32
  },
33
  last_name: {
34
  label: __( 'Last name', 'woo-gutenberg-products-block' ),
37
  'woo-gutenberg-products-block'
38
  ),
39
  autocomplete: 'family-name',
 
40
  required: true,
41
  hidden: false,
42
+ index: 2,
43
  },
44
  company: {
45
  label: __( 'Company', 'woo-gutenberg-products-block' ),
48
  'woo-gutenberg-products-block'
49
  ),
50
  autocomplete: 'organization',
 
51
  required: false,
52
  hidden: false,
53
+ index: 3,
54
  },
55
  address_1: {
56
  label: __( 'Address', 'woo-gutenberg-products-block' ),
59
  'woo-gutenberg-products-block'
60
  ),
61
  autocomplete: 'address-line1',
 
62
  required: true,
63
  hidden: false,
64
+ index: 4,
65
  },
66
  address_2: {
67
  label: __( 'Apartment, suite, etc.', 'woo-gutenberg-products-block' ),
70
  'woo-gutenberg-products-block'
71
  ),
72
  autocomplete: 'address-line2',
 
73
  required: false,
74
  hidden: false,
75
+ index: 5,
76
  },
77
  country: {
78
  label: __( 'Country/Region', 'woo-gutenberg-products-block' ),
83
  autocomplete: 'country',
84
  required: true,
85
  hidden: false,
86
+ index: 6,
87
  },
88
  city: {
89
  label: __( 'City', 'woo-gutenberg-products-block' ),
90
  optionalLabel: __( 'City (optional)', 'woo-gutenberg-products-block' ),
91
  autocomplete: 'address-level2',
 
92
  required: true,
93
  hidden: false,
94
+ index: 7,
95
  },
96
  state: {
97
  label: __( 'State/County', 'woo-gutenberg-products-block' ),
100
  'woo-gutenberg-products-block'
101
  ),
102
  autocomplete: 'address-level1',
 
103
  required: true,
104
  hidden: false,
105
+ index: 8,
106
  },
107
  postcode: {
108
  label: __( 'Postal code', 'woo-gutenberg-products-block' ),
111
  'woo-gutenberg-products-block'
112
  ),
113
  autocomplete: 'postal-code',
 
114
  required: true,
115
  hidden: false,
116
+ index: 9,
117
  },
118
  };
119
 
120
+ export default AddressFields;
assets/js/base/components/cart-checkout/address-form/{address-form.tsx → index.js} RENAMED
@@ -12,31 +12,24 @@ import {
12
  ShippingStateInput,
13
  } from '@woocommerce/base-components/state-input';
14
  import { useValidationContext } from '@woocommerce/base-context';
15
- import { useEffect, useMemo } from '@wordpress/element';
16
  import { __ } from '@wordpress/i18n';
17
  import { withInstanceId } from '@woocommerce/base-hocs/with-instance-id';
18
- import { useShallowEqual } from '@woocommerce/base-hooks';
19
- import {
20
- AddressField,
21
- AddressFields,
22
- AddressType,
23
- defaultAddressFields,
24
- EnteredAddress,
25
- } from '@woocommerce/settings';
26
 
27
  /**
28
  * Internal dependencies
29
  */
30
- import prepareAddressFields from './prepare-address-fields';
 
31
 
32
  // If it's the shipping address form and the user starts entering address
33
  // values without having set the country first, show an error.
34
  const validateShippingCountry = (
35
- values: EnteredAddress,
36
- setValidationErrors: ( errors: Record< string, unknown > ) => void,
37
- clearValidationError: ( error: string ) => void,
38
- hasValidationError: boolean
39
- ): void => {
40
  if (
41
  ! hasValidationError &&
42
  ! values.country &&
@@ -57,75 +50,48 @@ const validateShippingCountry = (
57
  }
58
  };
59
 
60
- interface AddressFormProps {
61
- id: string;
62
- instanceId: string;
63
- fields: ( keyof AddressFields )[];
64
- fieldConfig: Record< keyof AddressFields, Partial< AddressField > >;
65
- onChange: ( newValue: EnteredAddress ) => void;
66
- type: AddressType;
67
- values: EnteredAddress;
68
- }
69
  /**
70
  * Checkout address form.
71
- *
72
- * @param {Object} props Incoming props for component.
73
- * @param {string} props.id Id for component.
74
- * @param {Array} props.fields Array of fields in form.
75
- * @param {Object} props.fieldConfig Field configuration for fields in form.
76
- * @param {string} props.instanceId Unique id for form.
77
- * @param {function(any):any} props.onChange Function to all for an form onChange event.
78
- * @param {string} props.type Type of form.
79
- * @param {Object} props.values Values for fields.
80
  */
81
  const AddressForm = ( {
82
  id,
83
- fields = ( Object.keys(
84
- defaultAddressFields
85
- ) as unknown ) as ( keyof AddressFields )[],
86
- fieldConfig = {} as Record< keyof AddressFields, Partial< AddressField > >,
87
  instanceId,
88
  onChange,
89
  type = 'shipping',
90
  values,
91
- }: AddressFormProps ): JSX.Element => {
92
  const {
93
  getValidationError,
94
  setValidationErrors,
95
  clearValidationError,
96
  } = useValidationContext();
97
-
98
- const currentFields = useShallowEqual( fields );
99
-
100
- const countryValidationError = ( getValidationError(
101
- 'shipping-missing-country'
102
- ) || {} ) as {
103
- message: string;
104
- hidden: boolean;
105
- };
106
-
107
- const addressFormFields = useMemo( () => {
108
- return prepareAddressFields(
109
- currentFields,
110
- fieldConfig,
111
- values.country
112
- );
113
- }, [ currentFields, fieldConfig, values.country ] );
114
-
115
  useEffect( () => {
116
  if ( type === 'shipping' ) {
117
  validateShippingCountry(
118
  values,
119
  setValidationErrors,
120
  clearValidationError,
121
- !! countryValidationError.message &&
122
  ! countryValidationError.hidden
123
  );
124
  }
125
  }, [
126
  values,
127
- countryValidationError.message,
128
- countryValidationError.hidden,
129
  setValidationErrors,
130
  clearValidationError,
131
  type,
@@ -135,7 +101,7 @@ const AddressForm = ( {
135
 
136
  return (
137
  <div id={ id } className="wc-block-components-address-form">
138
- { addressFormFields.map( ( field ) => {
139
  if ( field.hidden ) {
140
  return null;
141
  }
@@ -214,9 +180,8 @@ const AddressForm = ( {
214
  field.required ? field.label : field.optionalLabel
215
  }
216
  value={ values[ field.key ] }
217
- autoCapitalize={ field.autocapitalize }
218
  autoComplete={ field.autocomplete }
219
- onChange={ ( newValue: string ) =>
220
  onChange( {
221
  ...values,
222
  [ field.key ]: newValue,
12
  ShippingStateInput,
13
  } from '@woocommerce/base-components/state-input';
14
  import { useValidationContext } from '@woocommerce/base-context';
15
+ import { useEffect } from '@wordpress/element';
16
  import { __ } from '@wordpress/i18n';
17
  import { withInstanceId } from '@woocommerce/base-hocs/with-instance-id';
 
 
 
 
 
 
 
 
18
 
19
  /**
20
  * Internal dependencies
21
  */
22
+ import defaultAddressFields from './default-address-fields';
23
+ import countryAddressFields from './country-address-fields';
24
 
25
  // If it's the shipping address form and the user starts entering address
26
  // values without having set the country first, show an error.
27
  const validateShippingCountry = (
28
+ values,
29
+ setValidationErrors,
30
+ clearValidationError,
31
+ hasValidationError
32
+ ) => {
33
  if (
34
  ! hasValidationError &&
35
  ! values.country &&
50
  }
51
  };
52
 
 
 
 
 
 
 
 
 
 
53
  /**
54
  * Checkout address form.
 
 
 
 
 
 
 
 
 
55
  */
56
  const AddressForm = ( {
57
  id,
58
+ fields = Object.keys( defaultAddressFields ),
59
+ fieldConfig = {},
 
 
60
  instanceId,
61
  onChange,
62
  type = 'shipping',
63
  values,
64
+ } ) => {
65
  const {
66
  getValidationError,
67
  setValidationErrors,
68
  clearValidationError,
69
  } = useValidationContext();
70
+ const countryLocale = countryAddressFields[ values.country ] || {};
71
+ const addressFields = fields.map( ( field ) => ( {
72
+ key: field,
73
+ ...defaultAddressFields[ field ],
74
+ ...countryLocale[ field ],
75
+ ...fieldConfig[ field ],
76
+ } ) );
77
+ const sortedAddressFields = addressFields.sort(
78
+ ( a, b ) => a.index - b.index
79
+ );
80
+ const countryValidationError =
81
+ getValidationError( 'shipping-missing-country' ) || {};
 
 
 
 
 
 
82
  useEffect( () => {
83
  if ( type === 'shipping' ) {
84
  validateShippingCountry(
85
  values,
86
  setValidationErrors,
87
  clearValidationError,
88
+ countryValidationError.message &&
89
  ! countryValidationError.hidden
90
  );
91
  }
92
  }, [
93
  values,
94
+ countryValidationError,
 
95
  setValidationErrors,
96
  clearValidationError,
97
  type,
101
 
102
  return (
103
  <div id={ id } className="wc-block-components-address-form">
104
+ { sortedAddressFields.map( ( field ) => {
105
  if ( field.hidden ) {
106
  return null;
107
  }
180
  field.required ? field.label : field.optionalLabel
181
  }
182
  value={ values[ field.key ] }
 
183
  autoComplete={ field.autocomplete }
184
+ onChange={ ( newValue ) =>
185
  onChange( {
186
  ...values,
187
  [ field.key ]: newValue,
assets/js/base/components/cart-checkout/address-form/index.ts DELETED
@@ -1 +0,0 @@
1
- export { default as AddressForm } from './address-form';
 
assets/js/base/components/cart-checkout/address-form/prepare-address-fields.ts DELETED
@@ -1,131 +0,0 @@
1
- /** @typedef { import('@woocommerce/type-defs/address-fields').CountryAddressFields } CountryAddressFields */
2
-
3
- /**
4
- * External dependencies
5
- */
6
- import {
7
- AddressField,
8
- AddressFields,
9
- CountryAddressFields,
10
- defaultAddressFields,
11
- getSetting,
12
- KeyedAddressField,
13
- LocaleSpecificAddressField,
14
- } from '@woocommerce/settings';
15
- import { __, sprintf } from '@wordpress/i18n';
16
- import { isNumber, isString } from '@woocommerce/types';
17
-
18
- /**
19
- * This is locale data from WooCommerce countries class. This doesn't match the shape of the new field data blocks uses,
20
- * but we can import part of it to set which fields are required.
21
- *
22
- * This supports new properties such as optionalLabel which are not used by core (yet).
23
- */
24
- const coreLocale = getSetting< CountryAddressFields >( 'countryLocale', {} );
25
-
26
- /**
27
- * Gets props from the core locale, then maps them to the shape we require in the client.
28
- *
29
- * Ignores "class", "type", "placeholder", and "autocomplete" props from core.
30
- *
31
- * @param {Object} localeField Locale fields from WooCommerce.
32
- * @return {Object} Supported locale fields.
33
- */
34
- const getSupportedCoreLocaleProps = (
35
- localeField: LocaleSpecificAddressField
36
- ): Partial< AddressField > => {
37
- const fields: Partial< AddressField > = {};
38
-
39
- if ( localeField.label !== undefined ) {
40
- fields.label = localeField.label;
41
- }
42
-
43
- if ( localeField.required !== undefined ) {
44
- fields.required = localeField.required;
45
- }
46
-
47
- if ( localeField.hidden !== undefined ) {
48
- fields.hidden = localeField.hidden;
49
- }
50
-
51
- if ( localeField.label !== undefined && ! localeField.optionalLabel ) {
52
- fields.optionalLabel = sprintf(
53
- /* translators: %s Field label. */
54
- __( '%s (optional)', 'woo-gutenberg-products-block' ),
55
- localeField.label
56
- );
57
- }
58
-
59
- if ( localeField.priority ) {
60
- if ( isNumber( localeField.priority ) ) {
61
- fields.index = localeField.priority;
62
- }
63
- if ( isString( localeField.priority ) ) {
64
- fields.index = parseInt( localeField.priority, 10 );
65
- }
66
- }
67
-
68
- if ( localeField.hidden ) {
69
- fields.required = false;
70
- }
71
-
72
- return fields;
73
- };
74
-
75
- const countryAddressFields: CountryAddressFields = Object.entries( coreLocale )
76
- .map( ( [ country, countryLocale ] ) => [
77
- country,
78
- Object.entries( countryLocale )
79
- .map( ( [ localeFieldKey, localeField ] ) => [
80
- localeFieldKey,
81
- getSupportedCoreLocaleProps( localeField ),
82
- ] )
83
- .reduce( ( obj, [ key, val ] ) => {
84
- // eslint-disable-next-line @typescript-eslint/ban-ts-comment
85
- // @ts-ignore - Ignoring because it should be fine as long as the data from the server is correct. TS won't catch it anyway if it's not.
86
- obj[ key ] = val;
87
- return obj;
88
- }, {} ),
89
- ] )
90
- .reduce( ( obj, [ key, val ] ) => {
91
- // eslint-disable-next-line @typescript-eslint/ban-ts-comment
92
- // @ts-ignore - Ignoring because it should be fine as long as the data from the server is correct. TS won't catch it anyway if it's not.
93
- obj[ key ] = val;
94
- return obj;
95
- }, {} );
96
-
97
- /**
98
- * Combines address fields, including fields from the locale, and sorts them by index.
99
- *
100
- * @param {Array} fields List of field keys--only address fields matching these will be returned.
101
- * @param {Object} fieldConfigs Fields config contains field specific overrides at block level which may, for example, hide a field.
102
- * @param {string} addressCountry Address country code. If unknown, locale fields will not be merged.
103
- * @return {CountryAddressFields} Object containing address fields.
104
- */
105
- const prepareAddressFields = (
106
- fields: ( keyof AddressFields )[],
107
- fieldConfigs: Record< string, Partial< AddressField > >,
108
- addressCountry = ''
109
- ): KeyedAddressField[] => {
110
- const localeConfigs: AddressFields =
111
- addressCountry && countryAddressFields[ addressCountry ] !== undefined
112
- ? countryAddressFields[ addressCountry ]
113
- : ( {} as AddressFields );
114
-
115
- return fields
116
- .map( ( field ) => {
117
- const defaultConfig = defaultAddressFields[ field ] || {};
118
- const localeConfig = localeConfigs[ field ] || {};
119
- const fieldConfig = fieldConfigs[ field ] || {};
120
-
121
- return {
122
- key: field,
123
- ...defaultConfig,
124
- ...localeConfig,
125
- ...fieldConfig,
126
- };
127
- } )
128
- .sort( ( a, b ) => a.index - b.index );
129
- };
130
-
131
- export default prepareAddressFields;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
assets/js/base/components/cart-checkout/address-form/test/index.js DELETED
@@ -1,178 +0,0 @@
1
- /**
2
- * External dependencies
3
- */
4
- import { render, screen } from '@testing-library/react';
5
- import userEvent from '@testing-library/user-event';
6
- import { CheckoutProvider } from '@woocommerce/base-context';
7
- import { useCheckoutAddress } from '@woocommerce/base-context/hooks';
8
-
9
- /**
10
- * Internal dependencies
11
- */
12
- import AddressForm from '../address-form';
13
-
14
- const renderInCheckoutProvider = ( ui, options = {} ) => {
15
- const Wrapper = ( { children } ) => {
16
- return <CheckoutProvider>{ children }</CheckoutProvider>;
17
- };
18
- return render( ui, { wrapper: Wrapper, ...options } );
19
- };
20
-
21
- // Countries used in testing addresses must be in the wcSettings global.
22
- // See: tests/js/setup-globals.js
23
- const primaryAddress = {
24
- country: 'United Kingdom (UK)',
25
- countryKey: 'GB',
26
- city: 'London',
27
- state: 'Greater London',
28
- postcode: 'ABCD',
29
- };
30
- const secondaryAddress = {
31
- country: 'Austria', // We use Austria because it doesn't have states.
32
- countryKey: 'AU',
33
- city: 'Vienna',
34
- postcode: 'DCBA',
35
- };
36
- const tertiaryAddress = {
37
- country: 'Canada', // We use Canada because it has a select for the state.
38
- countryKey: 'CA',
39
- city: 'Toronto',
40
- state: 'Ontario',
41
- postcode: 'EFGH',
42
- };
43
-
44
- const countryRegExp = /country/i;
45
- const cityRegExp = /city/i;
46
- const stateRegExp = /county|province|state/i;
47
- const postalCodeRegExp = /postal code|postcode|zip/i;
48
-
49
- const inputAddress = ( {
50
- country = null,
51
- city = null,
52
- state = null,
53
- postcode = null,
54
- } ) => {
55
- if ( country ) {
56
- const countryButton = screen.getByRole( 'button', {
57
- name: countryRegExp,
58
- } );
59
- userEvent.click( countryButton );
60
- userEvent.click( screen.getByRole( 'option', { name: country } ) );
61
- }
62
- if ( city ) {
63
- const cityInput = screen.getByLabelText( cityRegExp );
64
- userEvent.type( cityInput, city );
65
- }
66
- if ( state ) {
67
- const stateButton = screen.queryByRole( 'button', {
68
- name: stateRegExp,
69
- } );
70
- // State input might be a select or a text input.
71
- if ( stateButton ) {
72
- userEvent.click( stateButton );
73
- userEvent.click( screen.getByRole( 'option', { name: state } ) );
74
- } else {
75
- const stateInput = screen.getByLabelText( stateRegExp );
76
- userEvent.type( stateInput, state );
77
- }
78
- }
79
- if ( postcode ) {
80
- const postcodeInput = screen.getByLabelText( postalCodeRegExp );
81
- userEvent.type( postcodeInput, postcode );
82
- }
83
- };
84
-
85
- describe( 'AddressForm Component', () => {
86
- const WrappedAddressForm = ( { type } ) => {
87
- const {
88
- defaultAddressFields,
89
- setShippingFields,
90
- shippingFields,
91
- } = useCheckoutAddress();
92
-
93
- return (
94
- <AddressForm
95
- type={ type }
96
- onChange={ setShippingFields }
97
- values={ shippingFields }
98
- fields={ Object.keys( defaultAddressFields ) }
99
- />
100
- );
101
- };
102
- const ShippingFields = () => {
103
- const { shippingFields } = useCheckoutAddress();
104
-
105
- return (
106
- <ul>
107
- { Object.keys( shippingFields ).map( ( key ) => (
108
- <li key={ key }>{ key + ': ' + shippingFields[ key ] }</li>
109
- ) ) }
110
- </ul>
111
- );
112
- };
113
-
114
- it( 'updates context value when interacting with form elements', () => {
115
- renderInCheckoutProvider(
116
- <>
117
- <WrappedAddressForm type="shipping" />
118
- <ShippingFields />
119
- </>
120
- );
121
-
122
- inputAddress( primaryAddress );
123
-
124
- expect( screen.getByText( /country/ ) ).toHaveTextContent(
125
- `country: ${ primaryAddress.countryKey }`
126
- );
127
- expect( screen.getByText( /city/ ) ).toHaveTextContent(
128
- `city: ${ primaryAddress.city }`
129
- );
130
- expect( screen.getByText( /state/ ) ).toHaveTextContent(
131
- `state: ${ primaryAddress.state }`
132
- );
133
- expect( screen.getByText( /postcode/ ) ).toHaveTextContent(
134
- `postcode: ${ primaryAddress.postcode }`
135
- );
136
- } );
137
-
138
- it( 'input fields update when changing the country', () => {
139
- renderInCheckoutProvider( <WrappedAddressForm type="shipping" /> );
140
-
141
- inputAddress( primaryAddress );
142
-
143
- // Verify correct labels are used.
144
- expect( screen.getByLabelText( /City/ ) ).toBeInTheDocument();
145
- expect( screen.getByLabelText( /County/ ) ).toBeInTheDocument();
146
- expect( screen.getByLabelText( /Postcode/ ) ).toBeInTheDocument();
147
-
148
- inputAddress( secondaryAddress );
149
-
150
- // Verify state input has been removed.
151
- expect( screen.queryByText( stateRegExp ) ).not.toBeInTheDocument();
152
-
153
- inputAddress( tertiaryAddress );
154
-
155
- // Verify postal code input label changed.
156
- expect( screen.getByLabelText( /Postal code/ ) ).toBeInTheDocument();
157
- } );
158
-
159
- it( 'input values are reset after changing the country', () => {
160
- renderInCheckoutProvider( <WrappedAddressForm type="shipping" /> );
161
-
162
- inputAddress( secondaryAddress );
163
- // Only update `country` to verify other values are reset.
164
- inputAddress( { country: primaryAddress.country } );
165
-
166
- expect( screen.getByLabelText( cityRegExp ).value ).toBe( '' );
167
- expect( screen.getByLabelText( stateRegExp ).value ).toBe( '' );
168
- expect( screen.getByLabelText( postalCodeRegExp ).value ).toBe( '' );
169
-
170
- // Repeat the test with an address which has a select for the state.
171
- inputAddress( tertiaryAddress );
172
- inputAddress( { country: primaryAddress.country } );
173
-
174
- expect( screen.getByLabelText( cityRegExp ).value ).toBe( '' );
175
- expect( screen.getByLabelText( stateRegExp ).value ).toBe( '' );
176
- expect( screen.getByLabelText( postalCodeRegExp ).value ).toBe( '' );
177
- } );
178
- } );
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
assets/js/base/components/cart-checkout/form-step/index.js CHANGED
@@ -35,37 +35,22 @@ const FormStep = ( {
35
  description,
36
  children,
37
  disabled = false,
38
- showStepNumber = true,
39
  stepHeadingContent = () => {},
40
  } ) => {
41
- // If the form step doesn't have a legend or title, render a <div> instead
42
- // of a <fieldset>.
43
- const Element = legend || title ? 'fieldset' : 'div';
44
-
45
  return (
46
- <Element
47
  className={ classnames(
48
  className,
49
- 'wc-block-components-checkout-step',
50
- {
51
- 'wc-block-components-checkout-step--with-step-number': showStepNumber,
52
- 'wc-block-components-checkout-step--disabled': disabled,
53
- }
54
  ) }
55
  id={ id }
56
  disabled={ disabled }
57
  >
58
- { !! ( legend || title ) && (
59
- <legend className="screen-reader-text">
60
- { legend || title }
61
- </legend>
62
- ) }
63
- { !! title && (
64
- <StepHeading
65
- title={ title }
66
- stepHeadingContent={ stepHeadingContent() }
67
- />
68
- ) }
69
  <div className="wc-block-components-checkout-step__container">
70
  { !! description && (
71
  <p className="wc-block-components-checkout-step__description">
@@ -76,7 +61,7 @@ const FormStep = ( {
76
  { children }
77
  </div>
78
  </div>
79
- </Element>
80
  );
81
  };
82
 
@@ -86,7 +71,6 @@ FormStep.propTypes = {
86
  title: PropTypes.string,
87
  description: PropTypes.string,
88
  children: PropTypes.node,
89
- showStepNumber: PropTypes.bool,
90
  stepHeadingContent: PropTypes.func,
91
  disabled: PropTypes.bool,
92
  legend: PropTypes.string,
35
  description,
36
  children,
37
  disabled = false,
 
38
  stepHeadingContent = () => {},
39
  } ) => {
 
 
 
 
40
  return (
41
+ <fieldset
42
  className={ classnames(
43
  className,
44
+ 'wc-block-components-checkout-step'
 
 
 
 
45
  ) }
46
  id={ id }
47
  disabled={ disabled }
48
  >
49
+ <legend className="screen-reader-text">{ legend || title }</legend>
50
+ <StepHeading
51
+ title={ title }
52
+ stepHeadingContent={ stepHeadingContent() }
53
+ />
 
 
 
 
 
 
54
  <div className="wc-block-components-checkout-step__container">
55
  { !! description && (
56
  <p className="wc-block-components-checkout-step__description">
61
  { children }
62
  </div>
63
  </div>
64
+ </fieldset>
65
  );
66
  };
67
 
71
  title: PropTypes.string,
72
  description: PropTypes.string,
73
  children: PropTypes.node,
 
74
  stepHeadingContent: PropTypes.func,
75
  disabled: PropTypes.bool,
76
  legend: PropTypes.string,
assets/js/base/components/cart-checkout/form-step/style.scss CHANGED
@@ -1,8 +1,8 @@
1
- .wc-block-components-form {
2
  counter-reset: checkout-step;
3
  }
4
 
5
- .wc-block-components-form .wc-block-components-checkout-step {
6
  position: relative;
7
  border: none;
8
  padding: 0 0 0 $gap-larger;
@@ -12,20 +12,6 @@
12
  .is-large & {
13
  padding-right: $gap-large;
14
  }
15
-
16
- .wc-block-components-checkout-step__heading::after {
17
- content: "";
18
- border-left: 1px solid;
19
- opacity: 0.3;
20
- position: absolute;
21
- left: -$gap-larger/2;
22
- top: 2.5em;
23
- bottom: em($gap) * -1;
24
- }
25
- }
26
-
27
- .wc-block-components-checkout-step--disabled {
28
- opacity: 0.6;
29
  }
30
 
31
  .wc-block-components-checkout-step__container {
@@ -36,6 +22,10 @@
36
  padding-bottom: em($gap-large);
37
  }
38
 
 
 
 
 
39
  .wc-block-components-checkout-step__heading {
40
  display: flex;
41
  justify-content: space-between;
@@ -43,8 +33,6 @@
43
  flex-wrap: wrap;
44
  margin: em($gap-small) 0 em($gap);
45
  position: relative;
46
- align-items: center;
47
- gap: em($gap);
48
  }
49
 
50
  .wc-block-components-checkout-step:first-child .wc-block-components-checkout-step__heading {
@@ -57,6 +45,8 @@
57
 
58
  .wc-block-components-checkout-step__heading-content {
59
  @include font-size(smaller);
 
 
60
 
61
  a {
62
  font-weight: bold;
@@ -70,28 +60,30 @@
70
  margin-bottom: $gap;
71
  }
72
 
73
- .wc-block-components-checkout-step--with-step-number {
74
- .wc-block-components-checkout-step__title::before {
75
- @include reset-box();
76
- background: transparent;
77
- counter-increment: checkout-step;
78
- content: "\00a0" counter(checkout-step) ".";
79
- content: "\00a0" counter(checkout-step) "." / "";
80
- position: absolute;
81
- width: $gap-larger;
82
- left: -$gap-larger/2;
83
- top: 0;
84
- text-align: center;
85
- transform: translateX(-50%);
86
- }
87
 
88
- .wc-block-components-checkout-step__container::after {
89
- content: "";
90
- height: 100%;
91
- border-left: 1px solid;
92
- opacity: 0.3;
93
- position: absolute;
94
- left: -$gap-larger/2;
95
- top: 0;
96
- }
 
 
 
97
  }
1
+ .wc-block-components-checkout-form {
2
  counter-reset: checkout-step;
3
  }
4
 
5
+ .wc-block-components-checkout-form fieldset.wc-block-components-checkout-step {
6
  position: relative;
7
  border: none;
8
  padding: 0 0 0 $gap-larger;
12
  .is-large & {
13
  padding-right: $gap-large;
14
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
15
  }
16
 
17
  .wc-block-components-checkout-step__container {
22
  padding-bottom: em($gap-large);
23
  }
24
 
25
+ .wc-block-components-checkout-form fieldset.wc-block-components-checkout-step:disabled {
26
+ opacity: 0.6;
27
+ }
28
+
29
  .wc-block-components-checkout-step__heading {
30
  display: flex;
31
  justify-content: space-between;
33
  flex-wrap: wrap;
34
  margin: em($gap-small) 0 em($gap);
35
  position: relative;
 
 
36
  }
37
 
38
  .wc-block-components-checkout-step:first-child .wc-block-components-checkout-step__heading {
45
 
46
  .wc-block-components-checkout-step__heading-content {
47
  @include font-size(smaller);
48
+ position: absolute;
49
+ right: 0;
50
 
51
  a {
52
  font-weight: bold;
60
  margin-bottom: $gap;
61
  }
62
 
63
+ .wc-block-components-checkout-step__title::before {
64
+ @include reset-box();
65
+ background: transparent;
66
+ counter-increment: checkout-step;
67
+ content: "\00a0" counter(checkout-step) ".";
68
+ content: "\00a0" counter(checkout-step) "." / "";
69
+ position: absolute;
70
+ width: $gap-larger;
71
+ left: -$gap-larger/2;
72
+ top: 0;
73
+ text-align: center;
74
+ transform: translateX(-50%);
75
+ }
 
76
 
77
+ .wc-block-components-checkout-step__container::after {
78
+ content: "";
79
+ height: 100%;
80
+ border-left: 1px solid;
81
+ opacity: 0.3;
82
+ position: absolute;
83
+ left: -$gap-larger/2;
84
+ top: 0;
85
+ }
86
+
87
+ .wc-block-components-checkout-step:last-child .wc-block-components-checkout-step__container::after {
88
+ content: none;
89
  }
assets/js/base/components/cart-checkout/form-step/test/__snapshots__/index.js.snap DELETED
@@ -1,262 +0,0 @@
1
- // Jest Snapshot v1, https://goo.gl/fbAQLP
2
-
3
- exports[`FormStep fieldset legend should default to legend prop when title and legend are defined 1`] = `
4
- <fieldset
5
- className="wc-block-components-checkout-step wc-block-components-checkout-step--with-step-number"
6
- disabled={false}
7
- >
8
- <legend
9
- className="screen-reader-text"
10
- >
11
- Lorem Ipsum 2
12
- </legend>
13
- <div
14
- className="wc-block-components-checkout-step__heading"
15
- >
16
- <h2
17
- aria-hidden="true"
18
- className="wc-block-components-title wc-block-components-checkout-step__title"
19
- >
20
- Lorem Ipsum
21
- </h2>
22
- </div>
23
- <div
24
- className="wc-block-components-checkout-step__container"
25
- >
26
- <div
27
- className="wc-block-components-checkout-step__content"
28
- >
29
- Dolor sit amet
30
- </div>
31
- </div>
32
- </fieldset>
33
- `;
34
-
35
- exports[`FormStep should apply id and className props 1`] = `
36
- <div
37
- className="my-classname wc-block-components-checkout-step wc-block-components-checkout-step--with-step-number"
38
- disabled={false}
39
- id="my-id"
40
- >
41
- <div
42
- className="wc-block-components-checkout-step__container"
43
- >
44
- <div
45
- className="wc-block-components-checkout-step__content"
46
- >
47
- Dolor sit amet
48
- </div>
49
- </div>
50
- </div>
51
- `;
52
-
53
- exports[`FormStep should remove step number CSS class if prop is false 1`] = `
54
- <fieldset
55
- className="wc-block-components-checkout-step"
56
- disabled={false}
57
- >
58
- <legend
59
- className="screen-reader-text"
60
- >
61
- Lorem Ipsum
62
- </legend>
63
- <div
64
- className="wc-block-components-checkout-step__heading"
65
- >
66
- <h2
67
- aria-hidden="true"
68
- className="wc-block-components-title wc-block-components-checkout-step__title"
69
- >
70
- Lorem Ipsum
71
- </h2>
72
- </div>
73
- <div
74
- className="wc-block-components-checkout-step__container"
75
- >
76
- <div
77
- className="wc-block-components-checkout-step__content"
78
- >
79
- Dolor sit amet
80
- </div>
81
- </div>
82
- </fieldset>
83
- `;
84
-
85
- exports[`FormStep should render a div if no title or legend is provided 1`] = `
86
- <div
87
- className="wc-block-components-checkout-step wc-block-components-checkout-step--with-step-number"
88
- disabled={false}
89
- >
90
- <div
91
- className="wc-block-components-checkout-step__container"
92
- >
93
- <div
94
- className="wc-block-components-checkout-step__content"
95
- >
96
- Dolor sit amet
97
- </div>
98
- </div>
99
- </div>
100
- `;
101
-
102
- exports[`FormStep should render a fieldset if a legend is provided 1`] = `
103
- <fieldset
104
- className="wc-block-components-checkout-step wc-block-components-checkout-step--with-step-number"
105
- disabled={false}
106
- >
107
- <legend
108
- className="screen-reader-text"
109
- >
110
- Lorem Ipsum 2
111
- </legend>
112
- <div
113
- className="wc-block-components-checkout-step__container"
114
- >
115
- <div
116
- className="wc-block-components-checkout-step__content"
117
- >
118
- Dolor sit amet
119
- </div>
120
- </div>
121
- </fieldset>
122
- `;
123
-
124
- exports[`FormStep should render a fieldset with heading if a title is provided 1`] = `
125
- <fieldset
126
- className="wc-block-components-checkout-step wc-block-components-checkout-step--with-step-number"
127
- disabled={false}
128
- >
129
- <legend
130
- className="screen-reader-text"
131
- >
132
- Lorem Ipsum
133
- </legend>
134
- <div
135
- className="wc-block-components-checkout-step__heading"
136
- >
137
- <h2
138
- aria-hidden="true"
139
- className="wc-block-components-title wc-block-components-checkout-step__title"
140
- >
141
- Lorem Ipsum
142
- </h2>
143
- </div>
144
- <div
145
- className="wc-block-components-checkout-step__container"
146
- >
147
- <div
148
- className="wc-block-components-checkout-step__content"
149
- >
150
- Dolor sit amet
151
- </div>
152
- </div>
153
- </fieldset>
154
- `;
155
-
156
- exports[`FormStep should render step description 1`] = `
157
- <fieldset
158
- className="wc-block-components-checkout-step wc-block-components-checkout-step--with-step-number"
159
- disabled={false}
160
- >
161
- <legend
162
- className="screen-reader-text"
163
- >
164
- Lorem Ipsum
165
- </legend>
166
- <div
167
- className="wc-block-components-checkout-step__heading"
168
- >
169
- <h2
170
- aria-hidden="true"
171
- className="wc-block-components-title wc-block-components-checkout-step__title"
172
- >
173
- Lorem Ipsum
174
- </h2>
175
- </div>
176
- <div
177
- className="wc-block-components-checkout-step__container"
178
- >
179
- <p
180
- className="wc-block-components-checkout-step__description"
181
- >
182
- This is the description
183
- </p>
184
- <div
185
- className="wc-block-components-checkout-step__content"
186
- >
187
- Dolor sit amet
188
- </div>
189
- </div>
190
- </fieldset>
191
- `;
192
-
193
- exports[`FormStep should render step heading content 1`] = `
194
- <fieldset
195
- className="wc-block-components-checkout-step wc-block-components-checkout-step--with-step-number"
196
- disabled={false}
197
- >
198
- <legend
199
- className="screen-reader-text"
200
- >
201
- Lorem Ipsum
202
- </legend>
203
- <div
204
- className="wc-block-components-checkout-step__heading"
205
- >
206
- <h2
207
- aria-hidden="true"
208
- className="wc-block-components-title wc-block-components-checkout-step__title"
209
- >
210
- Lorem Ipsum
211
- </h2>
212
- <span
213
- className="wc-block-components-checkout-step__heading-content"
214
- >
215
- <span>
216
- Some context to render next to the heading
217
- </span>
218
- </span>
219
- </div>
220
- <div
221
- className="wc-block-components-checkout-step__container"
222
- >
223
- <div
224
- className="wc-block-components-checkout-step__content"
225
- >
226
- Dolor sit amet
227
- </div>
228
- </div>
229
- </fieldset>
230
- `;
231
-
232
- exports[`FormStep should set disabled prop to the fieldset element when disabled is true 1`] = `
233
- <fieldset
234
- className="wc-block-components-checkout-step wc-block-components-checkout-step--with-step-number wc-block-components-checkout-step--disabled"
235
- disabled={true}
236
- >
237
- <legend
238
- className="screen-reader-text"
239
- >
240
- Lorem Ipsum
241
- </legend>
242
- <div
243
- className="wc-block-components-checkout-step__heading"
244
- >
245
- <h2
246
- aria-hidden="true"
247
- className="wc-block-components-title wc-block-components-checkout-step__title"
248
- >
249
- Lorem Ipsum
250
- </h2>
251
- </div>
252
- <div
253
- className="wc-block-components-checkout-step__container"
254
- >
255
- <div
256
- className="wc-block-components-checkout-step__content"
257
- >
258
- Dolor sit amet
259
- </div>
260
- </div>
261
- </fieldset>
262
- `;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
assets/js/base/components/cart-checkout/form-step/test/index.js DELETED
@@ -1,100 +0,0 @@
1
- /**
2
- * External dependencies
3
- */
4
- import TestRenderer from 'react-test-renderer';
5
-
6
- /**
7
- * Internal dependencies
8
- */
9
- import FormStep from '..';
10
-
11
- describe( 'FormStep', () => {
12
- test( 'should render a div if no title or legend is provided', () => {
13
- const component = TestRenderer.create(
14
- <FormStep>Dolor sit amet</FormStep>
15
- );
16
-
17
- expect( component.toJSON() ).toMatchSnapshot();
18
- } );
19
-
20
- test( 'should apply id and className props', () => {
21
- const component = TestRenderer.create(
22
- <FormStep id="my-id" className="my-classname">
23
- Dolor sit amet
24
- </FormStep>
25
- );
26
-
27
- expect( component.toJSON() ).toMatchSnapshot();
28
- } );
29
-
30
- test( 'should render a fieldset if a legend is provided', () => {
31
- const component = TestRenderer.create(
32
- <FormStep legend="Lorem Ipsum 2">Dolor sit amet</FormStep>
33
- );
34
-
35
- expect( component.toJSON() ).toMatchSnapshot();
36
- } );
37
-
38
- test( 'should render a fieldset with heading if a title is provided', () => {
39
- const component = TestRenderer.create(
40
- <FormStep title="Lorem Ipsum">Dolor sit amet</FormStep>
41
- );
42
-
43
- expect( component.toJSON() ).toMatchSnapshot();
44
- } );
45
-
46
- test( 'fieldset legend should default to legend prop when title and legend are defined', () => {
47
- const component = TestRenderer.create(
48
- <FormStep title="Lorem Ipsum" legend="Lorem Ipsum 2">
49
- Dolor sit amet
50
- </FormStep>
51
- );
52
-
53
- expect( component.toJSON() ).toMatchSnapshot();
54
- } );
55
-
56
- test( 'should remove step number CSS class if prop is false', () => {
57
- const component = TestRenderer.create(
58
- <FormStep title="Lorem Ipsum" showStepNumber={ false }>
59
- Dolor sit amet
60
- </FormStep>
61
- );
62
-
63
- expect( component.toJSON() ).toMatchSnapshot();
64
- } );
65
-
66
- test( 'should render step heading content', () => {
67
- const component = TestRenderer.create(
68
- <FormStep
69
- title="Lorem Ipsum"
70
- stepHeadingContent={ () => (
71
- <span>Some context to render next to the heading</span>
72
- ) }
73
- >
74
- Dolor sit amet
75
- </FormStep>
76
- );
77
-
78
- expect( component.toJSON() ).toMatchSnapshot();
79
- } );
80
-
81
- test( 'should render step description', () => {
82
- const component = TestRenderer.create(
83
- <FormStep title="Lorem Ipsum" description="This is the description">
84
- Dolor sit amet
85
- </FormStep>
86
- );
87
-
88
- expect( component.toJSON() ).toMatchSnapshot();
89
- } );
90
-
91
- test( 'should set disabled prop to the fieldset element when disabled is true', () => {
92
- const component = TestRenderer.create(
93
- <FormStep title="Lorem Ipsum" disabled={ true }>
94
- Dolor sit amet
95
- </FormStep>
96
- );
97
-
98
- expect( component.toJSON() ).toMatchSnapshot();
99
- } );
100
- } );
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
assets/js/base/components/{form → cart-checkout/form}/index.js RENAMED
@@ -4,7 +4,12 @@
4
  import classnames from 'classnames';
5
  import PropTypes from 'prop-types';
6
 
7
- const Form = ( {
 
 
 
 
 
8
  className,
9
  children,
10
  onSubmit = ( event ) => void event,
@@ -13,10 +18,12 @@ const Form = ( {
13
  event.preventDefault();
14
  onSubmit( event );
15
  };
16
-
17
  return (
18
  <form
19
- className={ classnames( 'wc-block-components-form', className ) }
 
 
 
20
  onSubmit={ formOnSubmit }
21
  >
22
  { children }
@@ -24,10 +31,10 @@ const Form = ( {
24
  );
25
  };
26
 
27
- Form.propTypes = {
28
  className: PropTypes.string,
29
  children: PropTypes.node,
30
  onSubmit: PropTypes.func,
31
  };
32
 
33
- export default Form;
4
  import classnames from 'classnames';
5
  import PropTypes from 'prop-types';
6
 
7
+ /**
8
+ * Internal dependencies
9
+ */
10
+ import './style.scss';
11
+
12
+ const CheckoutForm = ( {
13
  className,
14
  children,
15
  onSubmit = ( event ) => void event,
18
  event.preventDefault();
19
  onSubmit( event );
20
  };
 
21
  return (
22
  <form
23
+ className={ classnames(
24
+ 'wc-block-components-checkout-form',
25
+ className
26
+ ) }
27
  onSubmit={ formOnSubmit }
28
  >
29
  { children }
31
  );
32
  };
33
 
34
+ CheckoutForm.propTypes = {
35
  className: PropTypes.string,
36
  children: PropTypes.node,
37
  onSubmit: PropTypes.func,
38
  };
39
 
40
+ export default CheckoutForm;
assets/js/base/components/cart-checkout/form/style.scss ADDED
@@ -0,0 +1,4 @@
 
 
 
 
1
+ .wc-block-components-checkout-form {
2
+ margin: 0;
3
+ max-width: 100%;
4
+ }
assets/js/base/components/cart-checkout/index.js CHANGED
@@ -1,20 +1,22 @@
1
- export * from './address-form';
 
2
  export { default as FormStep } from './form-step';
3
  export { default as OrderSummary } from './order-summary';
4
  export { default as PlaceOrderButton } from './place-order-button';
5
  export { default as Policies } from './policies';
6
  export { default as ProductBackorderBadge } from './product-backorder-badge';
7
- export { default as ProductDetails } from './product-details';
8
  export { default as ProductImage } from './product-image';
9
  export { default as ProductLowStockBadge } from './product-low-stock-badge';
10
  export { default as ProductSummary } from './product-summary';
11
  export { default as ProductMetadata } from './product-metadata';
 
 
12
  export { default as ProductSaleBadge } from './product-sale-badge';
 
13
  export { default as ReturnToCartButton } from './return-to-cart-button';
14
  export { default as ShippingCalculator } from './shipping-calculator';
15
  export { default as ShippingLocation } from './shipping-location';
16
  export { default as ShippingRatesControl } from './shipping-rates-control';
17
- export { default as ShippingRatesControlPackage } from './shipping-rates-control-package';
18
  export { default as PaymentMethodIcons } from './payment-method-icons';
19
  export { default as PaymentMethodLabel } from './payment-method-label';
20
- export * from './totals';
1
+ export { default as AddressForm } from './address-form';
2
+ export { default as CheckoutForm } from './form';
3
  export { default as FormStep } from './form-step';
4
  export { default as OrderSummary } from './order-summary';
5
  export { default as PlaceOrderButton } from './place-order-button';
6
  export { default as Policies } from './policies';
7
  export { default as ProductBackorderBadge } from './product-backorder-badge';
 
8
  export { default as ProductImage } from './product-image';
9
  export { default as ProductLowStockBadge } from './product-low-stock-badge';
10
  export { default as ProductSummary } from './product-summary';
11
  export { default as ProductMetadata } from './product-metadata';
12
+ export { default as ProductName } from './product-name';
13
+ export { default as ProductPrice } from './product-price';
14
  export { default as ProductSaleBadge } from './product-sale-badge';
15
+ export { default as ProductVariationData } from './product-variation-data';
16
  export { default as ReturnToCartButton } from './return-to-cart-button';
17
  export { default as ShippingCalculator } from './shipping-calculator';
18
  export { default as ShippingLocation } from './shipping-location';
19
  export { default as ShippingRatesControl } from './shipping-rates-control';
 
20
  export { default as PaymentMethodIcons } from './payment-method-icons';
21
  export { default as PaymentMethodLabel } from './payment-method-label';
22
+ export * from './totals/index.js';
assets/js/base/components/cart-checkout/order-summary/index.js CHANGED
@@ -4,7 +4,7 @@
4
  import { __ } from '@wordpress/i18n';
5
  import PropTypes from 'prop-types';
6
  import { useContainerWidthContext } from '@woocommerce/base-context';
7
- import { Panel } from '@woocommerce/blocks-checkout';
8
 
9
  /**
10
  * Internal dependencies
@@ -23,7 +23,6 @@ const OrderSummary = ( { cartItems = [] } ) => {
23
  <Panel
24
  className="wc-block-components-order-summary"
25
  initialOpen={ isLarge }
26
- hasBorder={ false }
27
  title={
28
  <span className="wc-block-components-order-summary__button-text">
29
  { __( 'Order summary', 'woo-gutenberg-products-block' ) }
4
  import { __ } from '@wordpress/i18n';
5
  import PropTypes from 'prop-types';
6
  import { useContainerWidthContext } from '@woocommerce/base-context';
7
+ import Panel from '@woocommerce/base-components/panel';
8
 
9
  /**
10
  * Internal dependencies
23
  <Panel
24
  className="wc-block-components-order-summary"
25
  initialOpen={ isLarge }
 
26
  title={
27
  <span className="wc-block-components-order-summary__button-text">
28
  { __( 'Order summary', 'woo-gutenberg-products-block' ) }
assets/js/base/components/cart-checkout/order-summary/order-summary-item.js CHANGED
@@ -2,111 +2,41 @@
2
  * External dependencies
3
  */
4
  import { __, sprintf } from '@wordpress/i18n';
 
5
  import Label from '@woocommerce/base-components/label';
6
- import ProductPrice from '@woocommerce/base-components/product-price';
7
- import ProductName from '@woocommerce/base-components/product-name';
8
- import { getCurrencyFromPriceResponse } from '@woocommerce/price-format';
9
  import {
10
- __experimentalApplyCheckoutFilter,
11
- mustContain,
12
- } from '@woocommerce/blocks-checkout';
 
 
 
 
13
  import PropTypes from 'prop-types';
14
  import Dinero from 'dinero.js';
15
- import { getSetting } from '@woocommerce/settings';
16
- import { useCallback, useMemo } from '@wordpress/element';
17
- import { useStoreCart } from '@woocommerce/base-context/hooks';
18
-
19
- /**
20
- * Internal dependencies
21
- */
22
- import ProductBackorderBadge from '../product-backorder-badge';
23
- import ProductImage from '../product-image';
24
- import ProductLowStockBadge from '../product-low-stock-badge';
25
- import ProductMetadata from '../product-metadata';
26
 
27
  const OrderSummaryItem = ( { cartItem } ) => {
28
  const {
29
  images,
30
  low_stock_remaining: lowStockRemaining = null,
31
  show_backorder_badge: showBackorderBadge = false,
32
- name: initialName,
33
  permalink,
34
  prices,
35
  quantity,
36
  short_description: shortDescription,
37
  description: fullDescription,
38
- item_data: itemData = [],
39
  variation,
40
- totals,
41
- extensions = {},
42
  } = cartItem;
43
 
44
- // Prepare props to pass to the __experimentalApplyCheckoutFilter filter.
45
- // We need to pluck out receiveCart.
46
- // eslint-disable-next-line no-unused-vars
47
- const { receiveCart, ...cart } = useStoreCart();
48
-
49
- const productPriceValidation = useCallback(
50
- ( value ) => mustContain( value, '<price/>' ),
51
- []
52
- );
53
-
54
- const arg = useMemo(
55
- () => ( {
56
- context: 'summary',
57
- cartItem,
58
- cart,
59
- } ),
60
- [ cartItem, cart ]
61
- );
62
-
63
- const priceCurrency = getCurrencyFromPriceResponse( prices );
64
-
65
- const name = __experimentalApplyCheckoutFilter( {
66
- filterName: 'itemName',
67
- defaultValue: initialName,
68
- extensions,
69
- arg,
70
- } );
71
-
72
- const regularPriceSingle = Dinero( {
73
- amount: parseInt( prices.raw_prices.regular_price, 10 ),
74
- precision: parseInt( prices.raw_prices.precision, 10 ),
75
- } )
76
- .convertPrecision( priceCurrency.minorUnit )
77
- .getAmount();
78
- const priceSingle = Dinero( {
79
  amount: parseInt( prices.raw_prices.price, 10 ),
80
  precision: parseInt( prices.raw_prices.precision, 10 ),
81
  } )
82
- .convertPrecision( priceCurrency.minorUnit )
 
83
  .getAmount();
84
- const totalsCurrency = getCurrencyFromPriceResponse( totals );
85
-
86
- let lineSubtotal = parseInt( totals.line_subtotal, 10 );
87
- if ( getSetting( 'displayCartPricesIncludingTax', false ) ) {
88
- lineSubtotal += parseInt( totals.line_subtotal_tax, 10 );
89
- }
90
- const subtotalPrice = Dinero( {
91
- amount: lineSubtotal,
92
- precision: totalsCurrency.minorUnit,
93
- } ).getAmount();
94
- const subtotalPriceFormat = __experimentalApplyCheckoutFilter( {
95
- filterName: 'subtotalPriceFormat',
96
- defaultValue: '<price/>',
97
- extensions,
98
- arg,
99
- validation: productPriceValidation,
100
- } );
101
-
102
- // Allow extensions to filter how the price is displayed. Ie: prepending or appending some values.
103
- const productPriceFormat = __experimentalApplyCheckoutFilter( {
104
- filterName: 'cartItemPrice',
105
- defaultValue: '<price/>',
106
- extensions,
107
- arg,
108
- validation: productPriceValidation,
109
- } );
110
 
111
  return (
112
  <div className="wc-block-components-order-summary-item">
@@ -124,20 +54,14 @@ const OrderSummaryItem = ( { cartItem } ) => {
124
  <ProductImage image={ images.length ? images[ 0 ] : {} } />
125
  </div>
126
  <div className="wc-block-components-order-summary-item__description">
127
- <ProductName
128
- disabled={ true }
129
- name={ name }
130
- permalink={ permalink }
131
- />
132
- <ProductPrice
133
- currency={ priceCurrency }
134
- price={ priceSingle }
135
- regularPrice={ regularPriceSingle }
136
- className="wc-block-components-order-summary-item__individual-prices"
137
- priceClassName="wc-block-components-order-summary-item__individual-price"
138
- regularPriceClassName="wc-block-components-order-summary-item__regular-individual-price"
139
- format={ subtotalPriceFormat }
140
- />
141
  { showBackorderBadge ? (
142
  <ProductBackorderBadge />
143
  ) : (
@@ -150,17 +74,9 @@ const OrderSummaryItem = ( { cartItem } ) => {
150
  <ProductMetadata
151
  shortDescription={ shortDescription }
152
  fullDescription={ fullDescription }
153
- itemData={ itemData }
154
  variation={ variation }
155
  />
156
  </div>
157
- <div className="wc-block-components-order-summary-item__total-price">
158
- <ProductPrice
159
- currency={ totalsCurrency }
160
- format={ productPriceFormat }
161
- price={ subtotalPrice }
162
- />
163
- </div>
164
  </div>
165
  );
166
  };
2
  * External dependencies
3
  */
4
  import { __, sprintf } from '@wordpress/i18n';
5
+ import { getCurrency } from '@woocommerce/base-utils';
6
  import Label from '@woocommerce/base-components/label';
 
 
 
7
  import {
8
+ ProductBackorderBadge,
9
+ ProductImage,
10
+ ProductLowStockBadge,
11
+ ProductMetadata,
12
+ ProductName,
13
+ ProductPrice,
14
+ } from '@woocommerce/base-components/cart-checkout';
15
  import PropTypes from 'prop-types';
16
  import Dinero from 'dinero.js';
 
 
 
 
 
 
 
 
 
 
 
17
 
18
  const OrderSummaryItem = ( { cartItem } ) => {
19
  const {
20
  images,
21
  low_stock_remaining: lowStockRemaining = null,
22
  show_backorder_badge: showBackorderBadge = false,
23
+ name,
24
  permalink,
25
  prices,
26
  quantity,
27
  short_description: shortDescription,
28
  description: fullDescription,
 
29
  variation,
 
 
30
  } = cartItem;
31
 
32
+ const currency = getCurrency( prices );
33
+ const linePrice = Dinero( {
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
34
  amount: parseInt( prices.raw_prices.price, 10 ),
35
  precision: parseInt( prices.raw_prices.precision, 10 ),
36
  } )
37
+ .multiply( quantity )
38
+ .convertPrecision( currency.minorUnit )
39
  .getAmount();
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
40
 
41
  return (
42
  <div className="wc-block-components-order-summary-item">
54
  <ProductImage image={ images.length ? images[ 0 ] : {} } />
55
  </div>
56
  <div className="wc-block-components-order-summary-item__description">
57
+ <div className="wc-block-components-order-summary-item__header">
58
+ <ProductName permalink={ permalink } name={ name } />
59
+ <ProductPrice
60
+ className="wc-block-components-order-summary-item__total-price"
61
+ currency={ currency }
62
+ value={ linePrice }
63
+ />
64
+ </div>
 
 
 
 
 
 
65
  { showBackorderBadge ? (
66
  <ProductBackorderBadge />
67
  ) : (
74
  <ProductMetadata
75
  shortDescription={ shortDescription }
76
  fullDescription={ fullDescription }
 
77
  variation={ variation }
78
  />
79
  </div>
 
 
 
 
 
 
 
80
  </div>
81
  );
82
  };
assets/js/base/components/cart-checkout/order-summary/style.scss CHANGED
@@ -1,12 +1,7 @@
1
  .wc-block-components-order-summary {
2
-
3
- .wc-block-components-panel__button {
4
- padding-top: 0;
5
  margin-top: 0;
6
- }
7
-
8
- .wc-block-components-panel__content {
9
- margin-bottom: 0;
10
  }
11
  }
12
 
@@ -17,16 +12,10 @@
17
 
18
  .wc-block-components-order-summary-item {
19
  @include with-translucent-border(0 0 1px);
20
- @include font-size(small);
21
- display: flex;
22
  padding-bottom: 1px;
23
- padding-top: $gap;
24
  width: 100%;
25
 
26
- &:first-child {
27
- padding-top: 0;
28
- }
29
-
30
  &:last-child {
31
  > div {
32
  padding-bottom: 0;
@@ -36,10 +25,6 @@
36
  display: none;
37
  }
38
  }
39
-
40
- .wc-block-components-product-metadata {
41
- @include font-size(regular);
42
- }
43
  }
44
 
45
  .wc-block-components-order-summary-item__image,
@@ -50,6 +35,7 @@
50
 
51
  .wc-block-components-order-summary-item__image {
52
  width: #{$gap-large * 2};
 
53
  padding-bottom: $gap;
54
  position: relative;
55
 
@@ -60,6 +46,7 @@
60
  }
61
 
62
  .wc-block-components-order-summary-item__quantity {
 
63
  align-items: center;
64
  background: #fff;
65
  border: 2px solid;
@@ -74,7 +61,7 @@
74
  justify-content: center;
75
  min-width: 20px;
76
  right: 0;
77
- top: 0;
78
  transform: translate(50%, -50%);
79
  white-space: nowrap;
80
  z-index: 1;
@@ -82,8 +69,9 @@
82
 
83
  .wc-block-components-order-summary-item__description {
84
  padding-left: $gap-large;
85
- padding-right: $gap-small;
86
  padding-bottom: $gap;
 
87
 
88
  p,
89
  .wc-block-components-product-metadata {
@@ -92,13 +80,8 @@
92
  }
93
  }
94
 
95
- .wc-block-components-order-summary-item__total-price {
96
- font-weight: bold;
97
- margin-left: auto;
98
- text-align: right;
99
- }
100
-
101
-
102
- .wc-block-components-order-summary-item__individual-prices {
103
- display: block;
104
  }
1
  .wc-block-components-order-summary {
2
+ .wc-blocks-components-panel__button {
 
 
3
  margin-top: 0;
4
+ padding-top: 0;
 
 
 
5
  }
6
  }
7
 
12
 
13
  .wc-block-components-order-summary-item {
14
  @include with-translucent-border(0 0 1px);
15
+ display: table-row;
 
16
  padding-bottom: 1px;
 
17
  width: 100%;
18
 
 
 
 
 
19
  &:last-child {
20
  > div {
21
  padding-bottom: 0;
25
  display: none;
26
  }
27
  }
 
 
 
 
28
  }
29
 
30
  .wc-block-components-order-summary-item__image,
35
 
36
  .wc-block-components-order-summary-item__image {
37
  width: #{$gap-large * 2};
38
+ padding-top: $gap;
39
  padding-bottom: $gap;
40
  position: relative;
41
 
46
  }
47
 
48
  .wc-block-components-order-summary-item__quantity {
49
+ @include font-size(smaller);
50
  align-items: center;
51
  background: #fff;
52
  border: 2px solid;
61
  justify-content: center;
62
  min-width: 20px;
63
  right: 0;
64
+ top: $gap;
65
  transform: translate(50%, -50%);
66
  white-space: nowrap;
67
  z-index: 1;
69
 
70
  .wc-block-components-order-summary-item__description {
71
  padding-left: $gap-large;
72
+ padding-top: $gap;
73
  padding-bottom: $gap;
74
+ line-height: 1.375;
75
 
76
  p,
77
  .wc-block-components-product-metadata {
80
  }
81
  }
82
 
83
+ .wc-block-components-order-summary-item__header {
84
+ display: flex;
85
+ flex-wrap: wrap;
86
+ justify-content: space-between;
 
 
 
 
 
87
  }
assets/js/base/components/cart-checkout/order-summary/test/index.js DELETED
@@ -1,43 +0,0 @@
1
- /**
2
- * External dependencies
3
- */
4
- import { render, screen } from '@testing-library/react';
5
- import { previewCart } from '@woocommerce/resource-previews';
6
-
7
- /**
8
- * Internal dependencies
9
- */
10
- import OrderSummary from '../index';
11
-
12
- jest.mock( '@woocommerce/base-context', () => ( {
13
- ...jest.requireActual( '@woocommerce/base-context' ),
14
- useContainerWidthContext: () => ( {
15
- isLarge: false,
16
- hasContainerWidth: true,
17
- } ),
18
- } ) );
19
-
20
- describe( 'Order Summary', () => {
21
- it( 'renders correct cart line subtotal when currency has 0 decimals', async () => {
22
- render(
23
- <OrderSummary
24
- cartItems={ [
25
- {
26
- ...previewCart.items[ 0 ],
27
- totals: {
28
- ...previewCart.items[ 0 ].totals,
29
- // Change price format so there are no decimals.
30
- currency_minor_unit: 0,
31
- currency_prefix: '',
32
- currency_suffix: '€',
33
- line_subtotal: '16',
34
- line_total: '18',
35
- },
36
- },
37
- ] }
38
- />
39
- );
40
-
41
- expect( screen.getByText( '16€' ) ).toBeTruthy();
42
- } );
43
- } );
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
assets/js/base/components/cart-checkout/payment-method-icons/common-icons.js CHANGED
@@ -1,7 +1,7 @@
1
  /**
2
  * External dependencies
3
  */
4
- import { WC_BLOCKS_IMAGE_URL } from '@woocommerce/block-settings';
5
 
6
  /**
7
  * Array of common assets.
@@ -10,97 +10,97 @@ export const commonIcons = [
10
  {
11
  id: 'alipay',
12
  alt: 'Alipay',
13
- src: WC_BLOCKS_IMAGE_URL + 'payment-methods/alipay.svg',
14
  },
15
  {
16
  id: 'amex',
17
  alt: 'American Express',
18
- src: WC_BLOCKS_IMAGE_URL + 'payment-methods/amex.svg',
19
  },
20
  {
21
  id: 'bancontact',
22
  alt: 'Bancontact',
23
- src: WC_BLOCKS_IMAGE_URL + 'payment-methods/bancontact.svg',
24
  },
25
  {
26
  id: 'diners',
27
  alt: 'Diners Club',
28
- src: WC_BLOCKS_IMAGE_URL + 'payment-methods/diners.svg',
29
  },
30
  {
31
  id: 'discover',
32
  alt: 'Discover',
33
- src: WC_BLOCKS_IMAGE_URL + 'payment-methods/discover.svg',
34
  },
35
  {
36
  id: 'eps',
37
  alt: 'EPS',
38
- src: WC_BLOCKS_IMAGE_URL + 'payment-methods/eps.svg',
39
  },
40
  {
41
  id: 'giropay',
42
  alt: 'Giropay',
43
- src: WC_BLOCKS_IMAGE_URL + 'payment-methods/giropay.svg',
44
  },
45
  {
46
  id: 'ideal',
47
  alt: 'iDeal',
48
- src: WC_BLOCKS_IMAGE_URL + 'payment-methods/ideal.svg',
49
  },
50
  {
51
  id: 'jcb',
52
  alt: 'JCB',
53
- src: WC_BLOCKS_IMAGE_URL + 'payment-methods/jcb.svg',
54
  },
55
  {
56
  id: 'laser',
57
  alt: 'Laser',
58
- src: WC_BLOCKS_IMAGE_URL + 'payment-methods/laser.svg',
59
  },
60
  {
61
  id: 'maestro',
62
  alt: 'Maestro',
63
- src: WC_BLOCKS_IMAGE_URL + 'payment-methods/maestro.svg',
64
  },
65
  {
66
  id: 'mastercard',
67
  alt: 'Mastercard',
68
- src: WC_BLOCKS_IMAGE_URL + 'payment-methods/mastercard.svg',
69
  },
70
  {
71
  id: 'multibanco',
72
  alt: 'Multibanco',
73
- src: WC_BLOCKS_IMAGE_URL + 'payment-methods/multibanco.svg',
74
  },
75
  {
76
  id: 'p24',
77
  alt: 'Przelewy24',
78
- src: WC_BLOCKS_IMAGE_URL + 'payment-methods/p24.svg',
79
  },
80
  {
81
  id: 'sepa',
82
  alt: 'Sepa',
83
- src: WC_BLOCKS_IMAGE_URL + 'payment-methods/sepa.svg',
84
  },
85
  {
86
  id: 'sofort',
87
  alt: 'Sofort',
88
- src: WC_BLOCKS_IMAGE_URL + 'payment-methods/sofort.svg',
89
  },
90
  {
91
  id: 'unionpay',
92
  alt: 'Union Pay',
93
- src: WC_BLOCKS_IMAGE_URL + 'payment-methods/unionpay.svg',
94
  },
95
  {
96
  id: 'visa',
97
  alt: 'Visa',
98
- src: WC_BLOCKS_IMAGE_URL + 'payment-methods/visa.svg',
99
  },
100
  {
101
  id: 'wechat',
102
  alt: 'WeChat',
103
- src: WC_BLOCKS_IMAGE_URL + 'payment-methods/wechat.svg',
104
  },
105
  ];
106
 
1
  /**
2
  * External dependencies
3
  */
4
+ import { WC_BLOCKS_ASSET_URL } from '@woocommerce/block-settings';
5
 
6
  /**
7
  * Array of common assets.
10
  {
11
  id: 'alipay',
12
  alt: 'Alipay',
13
+ src: WC_BLOCKS_ASSET_URL + 'img/payment-methods/alipay.svg',
14
  },
15
  {
16
  id: 'amex',
17
  alt: 'American Express',
18
+ src: WC_BLOCKS_ASSET_URL + 'img/payment-methods/amex.svg',
19
  },
20
  {
21
  id: 'bancontact',
22
  alt: 'Bancontact',
23
+ src: WC_BLOCKS_ASSET_URL + 'img/payment-methods/bancontact.svg',
24
  },
25
  {
26
  id: 'diners',
27
  alt: 'Diners Club',
28
+ src: WC_BLOCKS_ASSET_URL + 'img/payment-methods/diners.svg',
29
  },
30
  {
31
  id: 'discover',
32
  alt: 'Discover',
33
+ src: WC_BLOCKS_ASSET_URL + 'img/payment-methods/discover.svg',
34
  },
35
  {
36
  id: 'eps',
37
  alt: 'EPS',
38
+ src: WC_BLOCKS_ASSET_URL + 'img/payment-methods/eps.svg',
39
  },
40
  {
41
  id: 'giropay',
42
  alt: 'Giropay',
43
+ src: WC_BLOCKS_ASSET_URL + 'img/payment-methods/giropay.svg',
44
  },
45
  {
46
  id: 'ideal',
47
  alt: 'iDeal',
48
+ src: WC_BLOCKS_ASSET_URL + 'img/payment-methods/ideal.svg',
49
  },
50
  {
51
  id: 'jcb',
52
  alt: 'JCB',
53
+ src: WC_BLOCKS_ASSET_URL + 'img/payment-methods/jcb.svg',
54
  },
55
  {
56
  id: 'laser',
57
  alt: 'Laser',
58
+ src: WC_BLOCKS_ASSET_URL + 'img/payment-methods/laser.svg',
59
  },
60
  {
61
  id: 'maestro',
62
  alt: 'Maestro',
63
+ src: WC_BLOCKS_ASSET_URL + 'img/payment-methods/maestro.svg',
64
  },
65
  {
66
  id: 'mastercard',
67
  alt: 'Mastercard',
68
+ src: WC_BLOCKS_ASSET_URL + 'img/payment-methods/mastercard.svg',
69
  },
70
  {
71
  id: 'multibanco',
72
  alt: 'Multibanco',
73
+ src: WC_BLOCKS_ASSET_URL + 'img/payment-methods/multibanco.svg',
74
  },
75
  {
76
  id: 'p24',
77
  alt: 'Przelewy24',
78
+ src: WC_BLOCKS_ASSET_URL + 'img/payment-methods/p24.svg',
79
  },
80
  {
81
  id: 'sepa',
82
  alt: 'Sepa',
83
+ src: WC_BLOCKS_ASSET_URL + 'img/payment-methods/sepa.svg',
84
  },
85
  {
86
  id: 'sofort',
87
  alt: 'Sofort',
88
+ src: WC_BLOCKS_ASSET_URL + 'img/payment-methods/sofort.svg',
89
  },
90
  {
91
  id: 'unionpay',
92
  alt: 'Union Pay',
93
+ src: WC_BLOCKS_ASSET_URL + 'img/payment-methods/unionpay.svg',
94
  },
95
  {
96
  id: 'visa',
97
  alt: 'Visa',
98
+ src: WC_BLOCKS_ASSET_URL + 'img/payment-methods/visa.svg',
99
  },
100
  {
101
  id: 'wechat',
102
  alt: 'WeChat',
103
+ src: WC_BLOCKS_ASSET_URL + 'img/payment-methods/wechat.svg',
104
  },
105
  ];
106
 
assets/js/base/components/cart-checkout/payment-method-icons/index.js CHANGED
@@ -15,9 +15,8 @@ import './style.scss';
15
  * For a given list of icons, render each as a list item, using common icons
16
  * where available.
17
  *
18
- * @param {Object} props Component props.
19
- * @param {Array} props.icons Array of icons object configs or ids as strings.
20
- * @param {string} props.align How to align the icon.
21
  */
22
  export const PaymentMethodIcons = ( { icons = [], align = 'center' } ) => {
23
  const iconConfigs = normalizeIconConfig( icons );
15
  * For a given list of icons, render each as a list item, using common icons
16
  * where available.
17
  *
18
+ * @param {Object} props Component props.
19
+ * @param {Array} props.icons Array of icons object configs or ids as strings.
 
20
  */
21
  export const PaymentMethodIcons = ( { icons = [], align = 'center' } ) => {
22
  const iconConfigs = normalizeIconConfig( icons );
assets/js/base/components/cart-checkout/payment-method-icons/payment-method-icon.js CHANGED
@@ -9,11 +9,6 @@ const getIconClassName = ( id ) => {
9
 
10
  /**
11
  * Return an element for an icon.
12
- *
13
- * @param {Object} props Incoming props for component.
14
- * @param {string} props.id Id for component.
15
- * @param {string|null} props.src Optional src value for icon.
16
- * @param {string} props.alt Optional alt value for icon.
17
  */
18
  const PaymentMethodIcon = ( { id, src = null, alt = '' } ) => {
19
  if ( ! src ) {
9
 
10
  /**
11
  * Return an element for an icon.
 
 
 
 
 
12
  */
13
  const PaymentMethodIcon = ( { id, src = null, alt = '' } ) => {
14
  if ( ! src ) {
assets/js/base/components/cart-checkout/place-order-button/index.js CHANGED
@@ -2,7 +2,7 @@
2
  * External dependencies
3
  */
4
  import { __ } from '@wordpress/i18n';
5
- import { useCheckoutSubmit } from '@woocommerce/base-context/hooks';
6
  import { Icon, done } from '@woocommerce/icons';
7
  import Button from '@woocommerce/base-components/button';
8
 
@@ -11,7 +11,6 @@ const PlaceOrderButton = () => {
11
  submitButtonText,
12
  onSubmit,
13
  isCalculating,
14
- isDisabled,
15
  waitingForProcessing,
16
  waitingForRedirect,
17
  } = useCheckoutSubmit();
@@ -21,10 +20,7 @@ const PlaceOrderButton = () => {
21
  className="wc-block-components-checkout-place-order-button"
22
  onClick={ onSubmit }
23
  disabled={
24
- isCalculating ||
25
- isDisabled ||
26
- waitingForProcessing ||
27
- waitingForRedirect
28
  }
29
  showSpinner={ waitingForProcessing }
30
  >
2
  * External dependencies
3
  */
4
  import { __ } from '@wordpress/i18n';
5
+ import { useCheckoutSubmit } from '@woocommerce/base-hooks';
6
  import { Icon, done } from '@woocommerce/icons';
7
  import Button from '@woocommerce/base-components/button';
8
 
11
  submitButtonText,
12
  onSubmit,
13
  isCalculating,
 
14
  waitingForProcessing,
15
  waitingForRedirect,
16
  } = useCheckoutSubmit();
20
  className="wc-block-components-checkout-place-order-button"
21
  onClick={ onSubmit }
22
  disabled={
23
+ isCalculating || waitingForProcessing || waitingForRedirect
 
 
 
24
  }
25
  showSpinner={ waitingForProcessing }
26
  >
assets/js/base/components/cart-checkout/policies/{index.tsx → index.js} RENAMED
@@ -15,7 +15,7 @@ import { decodeEntities } from '@wordpress/html-entities';
15
  */
16
  import './style.scss';
17
 
18
- const Policies = (): JSX.Element => {
19
  return (
20
  <ul className="wc-block-components-checkout-policies">
21
  { PRIVACY_URL && (
15
  */
16
  import './style.scss';
17
 
18
+ const Policies = () => {
19
  return (
20
  <ul className="wc-block-components-checkout-policies">
21
  { PRIVACY_URL && (
assets/js/base/components/cart-checkout/policies/style.scss CHANGED
@@ -14,7 +14,7 @@
14
  margin: 0;
15
 
16
  &:not(:first-child) {
17
- border-left: 1px solid $gray-400;
18
  }
19
 
20
  > a {
14
  margin: 0;
15
 
16
  &:not(:first-child) {
17
+ border-left: 1px solid $gray-10;
18
  }
19
 
20
  > a {
assets/js/base/components/cart-checkout/product-backorder-badge/{index.tsx → index.js} RENAMED
@@ -11,7 +11,7 @@ import ProductBadge from '../product-badge';
11
  /**
12
  * Returns a backorder badge.
13
  */
14
- const ProductBackorderBadge = (): JSX.Element => {
15
  return (
16
  <ProductBadge className="wc-block-components-product-backorder-badge">
17
  { __( 'Available on backorder', 'woo-gutenberg-products-block' ) }
11
  /**
12
  * Returns a backorder badge.
13
  */
14
+ const ProductBackorderBadge = () => {
15
  return (
16
  <ProductBadge className="wc-block-components-product-backorder-badge">
17
  { __( 'Available on backorder', 'woo-gutenberg-products-block' ) }
assets/js/base/components/cart-checkout/product-badge/{index.tsx → index.js} RENAMED
@@ -2,21 +2,14 @@
2
  * External dependencies
3
  */
4
  import classNames from 'classnames';
5
- import type { ReactNode } from 'react';
6
 
7
  /**
8
  * Internal dependencies
9
  */
10
  import './style.scss';
11
 
12
- interface ProductBadgeProps {
13
- children?: ReactNode;
14
- className?: string;
15
- }
16
- const ProductBadge = ( {
17
- children,
18
- className,
19
- }: ProductBadgeProps ): JSX.Element => {
20
  return (
21
  <div
22
  className={ classNames(
@@ -29,4 +22,8 @@ const ProductBadge = ( {
29
  );
30
  };
31
 
 
 
 
 
32
  export default ProductBadge;
2
  * External dependencies
3
  */
4
  import classNames from 'classnames';
5
+ import PropTypes from 'prop-types';
6
 
7
  /**
8
  * Internal dependencies
9
  */
10
  import './style.scss';
11
 
12
+ const ProductBadge = ( { children, className } ) => {
 
 
 
 
 
 
 
13
  return (
14
  <div
15
  className={ classNames(
22
  );
23
  };
24
 
25
+ ProductBadge.propTypes = {
26
+ className: PropTypes.string,
27
+ };
28
+
29
  export default ProductBadge;
assets/js/base/components/cart-checkout/product-details/index.tsx DELETED
@@ -1,60 +0,0 @@
1
- /**
2
- * External dependencies
3
- */
4
- import { kebabCase } from 'lodash';
5
- import { decodeEntities } from '@wordpress/html-entities';
6
- import type { ProductResponseItemData } from '@woocommerce/type-defs/product-response';
7
-
8
- /**
9
- * Internal dependencies
10
- */
11
- import './style.scss';
12
-
13
- interface ProductDetailsProps {
14
- details: ProductResponseItemData[];
15
- }
16
- // Component to display cart item data and variations.
17
- const ProductDetails = ( {
18
- details = [],
19
- }: ProductDetailsProps ): JSX.Element | null => {
20
- if ( ! Array.isArray( details ) ) {
21
- return null;
22
- }
23
-
24
- details = details.filter( ( detail ) => ! detail.hidden );
25
-
26
- if ( details.length === 0 ) {
27
- return null;
28
- }
29
-
30
- return (
31
- <ul className="wc-block-components-product-details">
32
- { details.map( ( detail ) => {
33
- const className = detail.name
34
- ? `wc-block-components-product-details__${ kebabCase(
35
- detail.name
36
- ) }`
37
- : '';
38
- return (
39
- <li
40
- key={ detail.name + ( detail.display || detail.value ) }
41
- className={ className }
42
- >
43
- { detail.name && (
44
- <>
45
- <span className="wc-block-components-product-details__name">
46
- { decodeEntities( detail.name ) }:
47
- </span>{ ' ' }
48
- </>
49
- ) }
50
- <span className="wc-block-components-product-details__value">
51
- { decodeEntities( detail.display || detail.value ) }
52
- </span>
53
- </li>
54
- );
55
- } ) }
56
- </ul>
57
- );
58
- };
59
-
60
- export default ProductDetails;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
assets/js/base/components/cart-checkout/product-details/style.scss DELETED
@@ -1,25 +0,0 @@
1
- // Extra class added for specificity so styles are applied in the editor.
2
- .wc-block-components-product-details.wc-block-components-product-details {
3
- list-style: none;
4
- margin: 0.5em 0;
5
- padding: 0;
6
-
7
- &:last-of-type {
8
- margin-bottom: 0;
9
- }
10
-
11
- li {
12
- margin-left: 0;
13
- }
14
- }
15
-
16
- .wc-block-components-product-details__name,
17
- .wc-block-components-product-details__value {
18
- display: inline-block;
19
- }
20
-
21
- .is-large:not(.wc-block-checkout) {
22
- .wc-block-components-product-details__name {
23
- font-weight: bold;
24
- }
25
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
assets/js/base/components/cart-checkout/product-details/test/__snapshots__/index.js.snap DELETED
@@ -1,76 +0,0 @@
1
- // Jest Snapshot v1, https://goo.gl/fbAQLP
2
-
3
- exports[`ProductDetails should not render hidden details 1`] = `
4
- <ul
5
- className="wc-block-components-product-details"
6
- >
7
- <li
8
- className="wc-block-components-product-details__lorem"
9
- >
10
- <span
11
- className="wc-block-components-product-details__name"
12
- >
13
- LOREM
14
- :
15
- </span>
16
-
17
- <span
18
- className="wc-block-components-product-details__value"
19
- >
20
- IPSUM
21
- </span>
22
- </li>
23
- </ul>
24
- `;
25
-
26
- exports[`ProductDetails should not rendering anything if all details are hidden 1`] = `null`;
27
-
28
- exports[`ProductDetails should not rendering anything if details is an empty array 1`] = `null`;
29
-
30
- exports[`ProductDetails should render details 1`] = `
31
- <ul
32
- className="wc-block-components-product-details"
33
- >
34
- <li
35
- className="wc-block-components-product-details__lorem"
36
- >
37
- <span
38
- className="wc-block-components-product-details__name"
39
- >
40
- Lorem
41
- :
42
- </span>
43
-
44
- <span
45
- className="wc-block-components-product-details__value"
46
- >
47
- Ipsum
48
- </span>
49
- </li>
50
- <li
51
- className="wc-block-components-product-details__lorem"
52
- >
53
- <span
54
- className="wc-block-components-product-details__name"
55
- >
56
- LOREM
57
- :
58
- </span>
59
-
60
- <span
61
- className="wc-block-components-product-details__value"
62
- >
63
- IPSUM
64
- </span>
65
- </li>
66
- <li
67
- className=""
68
- >
69
- <span
70
- className="wc-block-components-product-details__value"
71
- >
72
- Ipsum
73
- </span>
74
- </li>
75
- </ul>
76
- `;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
assets/js/base/components/cart-checkout/product-details/test/index.js DELETED
@@ -1,57 +0,0 @@
1
- /**
2
- * External dependencies
3
- */
4
- import TestRenderer from 'react-test-renderer';
5
-
6
- /**
7
- * Internal dependencies
8
- */
9
- import ProductDetails from '..';
10
-
11
- describe( 'ProductDetails', () => {
12
- test( 'should render details', () => {
13
- const details = [
14
- { name: 'Lorem', value: 'Ipsum' },
15
- { name: 'LOREM', value: 'Ipsum', display: 'IPSUM' },
16
- { value: 'Ipsum' },
17
- ];
18
- const component = TestRenderer.create(
19
- <ProductDetails details={ details } />
20
- );
21
-
22
- expect( component.toJSON() ).toMatchSnapshot();
23
- } );
24
-
25
- test( 'should not render hidden details', () => {
26
- const details = [
27
- { name: 'Lorem', value: 'Ipsum', hidden: true },
28
- { name: 'LOREM', value: 'Ipsum', display: 'IPSUM' },
29
- ];
30
- const component = TestRenderer.create(
31
- <ProductDetails details={ details } />
32
- );
33
-
34
- expect( component.toJSON() ).toMatchSnapshot();
35
- } );
36
-
37
- test( 'should not rendering anything if all details are hidden', () => {
38
- const details = [
39
- { name: 'Lorem', value: 'Ipsum', hidden: true },
40
- { name: 'LOREM', value: 'Ipsum', display: 'IPSUM', hidden: true },
41
- ];
42
- const component = TestRenderer.create(
43
- <ProductDetails details={ details } />
44
- );
45
-
46
- expect( component.toJSON() ).toMatchSnapshot();
47
- } );
48
-
49
- test( 'should not rendering anything if details is an empty array', () => {
50
- const details = [];
51
- const component = TestRenderer.create(
52
- <ProductDetails details={ details } />
53
- );
54
-
55
- expect( component.toJSON() ).toMatchSnapshot();
56
- } );
57
- } );
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
assets/js/base/components/cart-checkout/product-image/{index.tsx → index.js} RENAMED
@@ -2,18 +2,13 @@
2
  * External dependencies
3
  */
4
  import { decodeEntities } from '@wordpress/html-entities';
5
- import { PLACEHOLDER_IMG_SRC } from '@woocommerce/settings';
 
6
 
7
- interface ProductImageProps {
8
- image: { alt?: string; thumbnail?: string };
9
- }
10
  /**
11
  * Formats and returns an image element.
12
- *
13
- * @param {Object} props Incoming props for the component.
14
- * @param {Object} props.image Image properties.
15
  */
16
- const ProductImage = ( { image = {} }: ProductImageProps ): JSX.Element => {
17
  const imageProps = {
18
  src: image.thumbnail || PLACEHOLDER_IMG_SRC,
19
  alt: decodeEntities( image.alt ) || '',
@@ -22,4 +17,11 @@ const ProductImage = ( { image = {} }: ProductImageProps ): JSX.Element => {
22
  return <img { ...imageProps } alt={ imageProps.alt } />;
23
  };
24
 
 
 
 
 
 
 
 
25
  export default ProductImage;
2
  * External dependencies
3
  */
4
  import { decodeEntities } from '@wordpress/html-entities';
5
+ import { PLACEHOLDER_IMG_SRC } from '@woocommerce/block-settings';
6
+ import PropTypes from 'prop-types';
7
 
 
 
 
8
  /**
9
  * Formats and returns an image element.
 
 
 
10
  */
11
+ const ProductImage = ( { image = {} } ) => {
12
  const imageProps = {
13
  src: image.thumbnail || PLACEHOLDER_IMG_SRC,
14
  alt: decodeEntities( image.alt ) || '',
17
  return <img { ...imageProps } alt={ imageProps.alt } />;
18
  };
19
 
20
+ ProductImage.propTypes = {
21
+ image: PropTypes.shape( {
22
+ alt: PropTypes.string,
23
+ thumbnail: PropTypes.string,
24
+ } ),
25
+ };
26
+
27
  export default ProductImage;
assets/js/base/components/cart-checkout/product-low-stock-badge/{index.tsx → index.js} RENAMED
@@ -2,24 +2,17 @@
2
  * External dependencies
3
  */
4
  import { __, sprintf } from '@wordpress/i18n';
 
5
 
6
  /**
7
  * Internal dependencies
8
  */
9
  import ProductBadge from '../product-badge';
10
 
11
- interface ProductLowStockBadgeProps {
12
- lowStockRemaining: number | null;
13
- }
14
  /**
15
  * Returns a low stock badge.
16
- *
17
- * @param {Object} props Incoming props for the component.
18
- * @param {number} props.lowStockRemaining Whether or not there is low stock remaining.
19
  */
20
- const ProductLowStockBadge = ( {
21
- lowStockRemaining,
22
- }: ProductLowStockBadgeProps ): JSX.Element | null => {
23
  if ( ! lowStockRemaining ) {
24
  return null;
25
  }
@@ -35,4 +28,8 @@ const ProductLowStockBadge = ( {
35
  );
36
  };
37
 
 
 
 
 
38
  export default ProductLowStockBadge;
2
  * External dependencies
3
  */
4
  import { __, sprintf } from '@wordpress/i18n';
5
+ import PropTypes from 'prop-types';
6
 
7
  /**
8
  * Internal dependencies
9
  */
10
  import ProductBadge from '../product-badge';
11
 
 
 
 
12
  /**
13
  * Returns a low stock badge.
 
 
 
14
  */
15
+ const ProductLowStockBadge = ( { lowStockRemaining } ) => {
 
 
16
  if ( ! lowStockRemaining ) {
17
  return null;
18
  }
28
  );
29
  };
30
 
31
+ ProductLowStockBadge.propTypes = {
32
+ lowStockRemaining: PropTypes.number,
33
+ };
34
+
35
  export default ProductLowStockBadge;
assets/js/base/components/cart-checkout/product-metadata/index.js ADDED
@@ -0,0 +1,39 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /**
2
+ * External dependencies
3
+ */
4
+ import PropTypes from 'prop-types';
5
+
6
+ /**
7
+ * Internal dependencies
8
+ */
9
+ import ProductVariationData from '../product-variation-data';
10
+ import ProductSummary from '../product-summary';
11
+ import './style.scss';
12
+
13
+ const ProductMetadata = ( {
14
+ shortDescription = '',
15
+ fullDescription = '',
16
+ variation = [],
17
+ } ) => {
18
+ return (
19
+ <div className="wc-block-components-product-metadata">
20
+ <ProductSummary
21
+ className="wc-block-components-product-metadata__description"
22
+ shortDescription={ shortDescription }
23
+ fullDescription={ fullDescription }
24
+ />
25
+ <ProductVariationData
26
+ className="wc-block-components-product-metadata__variation-data"
27
+ variation={ variation }
28
+ />
29
+ </div>
30
+ );
31
+ };
32
+
33
+ ProductMetadata.propTypes = {
34
+ shortDescription: PropTypes.string,
35
+ fullDescription: PropTypes.string,
36
+ variation: PropTypes.array,
37
+ };
38
+
39
+ export default ProductMetadata;
assets/js/base/components/cart-checkout/product-metadata/index.tsx DELETED
@@ -1,45 +0,0 @@
1
- /**
2
- * External dependencies
3
- */
4
- import { ProductResponseItemData } from '@woocommerce/type-defs/product-response';
5
- import { CartVariationItem } from '@woocommerce/type-defs/cart';
6
-
7
- /**
8
- * Internal dependencies
9
- */
10
- import ProductDetails from '../product-details';
11
- import ProductSummary from '../product-summary';
12
- import './style.scss';
13
-
14
- interface ProductMetadataProps {
15
- shortDescription?: string;
16
- fullDescription?: string;
17
- itemData: ProductResponseItemData[];
18
- variation?: CartVariationItem[];
19
- }
20
-
21
- const ProductMetadata = ( {
22
- shortDescription = '',
23
- fullDescription = '',
24
- itemData = [],
25
- variation = [],
26
- }: ProductMetadataProps ): JSX.Element => {
27
- return (
28
- <div className="wc-block-components-product-metadata">
29
- <ProductSummary
30
- className="wc-block-components-product-metadata__description"
31
- shortDescription={ shortDescription }
32
- fullDescription={ fullDescription }
33
- />
34
- <ProductDetails details={ itemData } />
35
- <ProductDetails
36
- details={ variation.map( ( { attribute = '', value } ) => ( {
37
- name: attribute,
38
- value,
39
- } ) ) }
40
- />
41
- </div>
42
- );
43
- };
44
-
45
- export default ProductMetadata;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
assets/js/base/components/cart-checkout/product-metadata/style.scss CHANGED
@@ -3,6 +3,6 @@
3
 
4
  .wc-block-components-product-metadata__description > p,
5
  .wc-block-components-product-metadata__variation-data {
6
- margin: 0.25em 0;
7
  }
8
  }
3
 
4
  .wc-block-components-product-metadata__description > p,
5
  .wc-block-components-product-metadata__variation-data {
6
+ margin: 0.25em 0 0 0;
7
  }
8
  }
assets/js/base/components/cart-checkout/product-name/index.js ADDED
@@ -0,0 +1,31 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /**
2
+ * External dependencies
3
+ */
4
+ import PropTypes from 'prop-types';
5
+ import { decodeEntities } from '@wordpress/html-entities';
6
+
7
+ /**
8
+ * Internal dependencies
9
+ */
10
+ import './style.scss';
11
+
12
+ const ProductName = ( { name, permalink, disabled } ) => {
13
+ return (
14
+ // we use tabIndex -1 to prevent the link from being focused, pointer-events
15
+ // disabled click events, so we get an almost disabled link.
16
+ <a
17
+ className="wc-block-components-product-name"
18
+ href={ permalink }
19
+ tabIndex={ disabled ? -1 : 0 }
20
+ >
21
+ { decodeEntities( name ) }
22
+ </a>
23
+ );
24
+ };
25
+
26
+ ProductName.propTypes = {
27
+ name: PropTypes.string,
28
+ permalink: PropTypes.string,
29
+ };
30
+
31
+ export default ProductName;
assets/js/base/components/{product-name → cart-checkout/product-name}/style.scss RENAMED
@@ -1,4 +1,6 @@
1
  .wc-block-components-product-name {
2
  @include font-size(regular);
3
  @include wrap-break-word();
 
 
4
  }
1
  .wc-block-components-product-name {
2
  @include font-size(regular);
3
  @include wrap-break-word();
4
+ display: block;
5
+ max-width: max-content;
6
  }
assets/js/base/components/cart-checkout/product-price/index.js ADDED
@@ -0,0 +1,81 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /**
2
+ * External dependencies
3
+ */
4
+ import { __ } from '@wordpress/i18n';
5
+ import FormattedMonetaryAmount from '@woocommerce/base-components/formatted-monetary-amount';
6
+ import classNames from 'classnames';
7
+ import PropTypes from 'prop-types';
8
+
9
+ /**
10
+ * Internal dependencies
11
+ */
12
+ import './style.scss';
13
+
14
+ const ProductPrice = ( { className, currency, regularValue, value } ) => {
15
+ const isDiscounted =
16
+ Number.isFinite( regularValue ) && regularValue !== value;
17
+
18
+ if ( isDiscounted ) {
19
+ return (
20
+ <span className="price wc-block-components-product-price">
21
+ <span className="screen-reader-text">
22
+ { __( 'Previous price:', 'woo-gutenberg-products-block' ) }
23
+ </span>
24
+ <del>
25
+ <FormattedMonetaryAmount
26
+ className={ classNames(
27
+ 'wc-block-components-product-price__regular',
28
+ className
29
+ ) }
30
+ currency={ currency }
31
+ value={ regularValue }
32
+ />
33
+ </del>
34
+ <span className="screen-reader-text">
35
+ { __(
36
+ 'Discounted price:',
37
+ 'woo-gutenberg-products-block'
38
+ ) }
39
+ </span>
40
+ <ins>
41
+ <FormattedMonetaryAmount
42
+ className={ classNames(
43
+ 'wc-block-components-product-price__value',
44
+ className,
45
+ {
46
+ 'is-discounted': isDiscounted,
47
+ }
48
+ ) }
49
+ currency={ currency }
50
+ value={ value }
51
+ />
52
+ </ins>
53
+ </span>
54
+ );
55
+ }
56
+
57
+ return (
58
+ <span className="price wc-block-components-product-price">
59
+ <FormattedMonetaryAmount
60
+ className={ classNames(
61
+ 'wc-block-components-product-price__value',
62
+ className,
63
+ {
64
+ 'is-discounted': isDiscounted,
65
+ }
66
+ ) }
67
+ currency={ currency }
68
+ value={ value }
69
+ />
70
+ </span>
71
+ );
72
+ };
73
+
74
+ ProductPrice.propTypes = {
75
+ currency: PropTypes.object.isRequired,
76
+ value: PropTypes.number.isRequired,
77
+ className: PropTypes.string,
78
+ regularValue: PropTypes.number,
79
+ };
80
+
81
+ export default ProductPrice;
assets/js/base/components/cart-checkout/product-price/style.scss ADDED
@@ -0,0 +1,5 @@
 
 
 
 
 
1
+ .wc-block-components-product-price__value {
2
+ &.is-discounted {
3
+ margin-left: 0.5em;
4
+ }
5
+ }
assets/js/base/components/cart-checkout/product-sale-badge/index.js ADDED
@@ -0,0 +1,50 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /**
2
+ * External dependencies
3
+ */
4
+ import { __experimentalCreateInterpolateElement } from 'wordpress-element';
5
+ import { __ } from '@wordpress/i18n';
6
+ import FormattedMonetaryAmount from '@woocommerce/base-components/formatted-monetary-amount';
7
+ import PropTypes from 'prop-types';
8
+
9
+ /**
10
+ * Internal dependencies
11
+ */
12
+ import ProductBadge from '../product-badge';
13
+
14
+ /**
15
+ * ProductSaleBadge
16
+ *
17
+ * @param {Object} props Incoming props.
18
+ * @param {Object} props.currency Currency object.
19
+ * @param {number} props.saleAmount Discounted amount.
20
+ *
21
+ * @return {*} The component.
22
+ */
23
+ const ProductSaleBadge = ( { currency, saleAmount } ) => {
24
+ if ( ! saleAmount ) {
25
+ return null;
26
+ }
27
+ return (
28
+ <ProductBadge className="wc-block-components-sale-badge">
29
+ { __experimentalCreateInterpolateElement(
30
+ /* translators: <price/> will be replaced by the discount amount */
31
+ __( 'Save <price/>', 'woo-gutenberg-products-block' ),
32
+ {
33
+ price: (
34
+ <FormattedMonetaryAmount
35
+ currency={ currency }
36
+ value={ saleAmount }
37
+ />
38
+ ),
39
+ }
40
+ ) }
41
+ </ProductBadge>
42
+ );
43
+ };
44
+
45
+ ProductSaleBadge.propTypes = {
46
+ currency: PropTypes.object,
47
+ saleAmount: PropTypes.number,
48
+ };
49
+
50
+ export default ProductSaleBadge;
assets/js/base/components/cart-checkout/product-sale-badge/index.tsx DELETED
@@ -1,62 +0,0 @@
1
- /**
2
- * External dependencies
3
- */
4
- import { createInterpolateElement } from 'wordpress-element';
5
- import { __, sprintf } from '@wordpress/i18n';
6
- import FormattedMonetaryAmount from '@woocommerce/base-components/formatted-monetary-amount';
7
- import type { Currency } from '@woocommerce/price-format';
8
-
9
- /**
10
- * Internal dependencies
11
- */
12
- import ProductBadge from '../product-badge';
13
-
14
- interface ProductSaleBadgeProps {
15
- currency: Currency;
16
- saleAmount: number;
17
- format: string;
18
- }
19
- /**
20
- * ProductSaleBadge
21
- *
22
- * @param {Object} props Incoming props.
23
- * @param {Object} props.currency Currency object.
24
- * @param {number} props.saleAmount Discounted amount.
25
- * @param {string} [props.format] Format to change the price.
26
- * @return {*} The component.
27
- */
28
- const ProductSaleBadge = ( {
29
- currency,
30
- saleAmount,
31
- format = '<price/>',
32
- }: ProductSaleBadgeProps ): JSX.Element | null => {
33
- if ( ! saleAmount || saleAmount <= 0 ) {
34
- return null;
35
- }
36
- if ( ! format.includes( '<price/>' ) ) {
37
- format = '<price/>';
38
- // eslint-disable-next-line no-console
39
- console.error( 'Price formats need to include the `<price/>` tag.' );
40
- }
41
-
42
- const formattedMessage = sprintf(
43
- /* translators: %s will be replaced by the discount amount */
44
- __( `Save %s`, 'woo-gutenberg-products-block' ),
45
- format
46
- );
47
-
48
- return (
49
- <ProductBadge className="wc-block-components-sale-badge">
50
- { createInterpolateElement( formattedMessage, {
51
- price: (
52
- <FormattedMonetaryAmount
53
- currency={ currency }
54
- value={ saleAmount }
55
- />
56
- ),
57
- } ) }
58
- </ProductBadge>
59
- );
60
- };
61
-
62
- export default ProductSaleBadge;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
assets/js/base/components/cart-checkout/product-summary/index.js ADDED
@@ -0,0 +1,38 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /**
2
+ * External dependencies
3
+ */
4
+ import PropTypes from 'prop-types';
5
+ import Summary from '@woocommerce/base-components/summary';
6
+ import { getSetting } from '@woocommerce/settings';
7
+
8
+ /**
9
+ * Returns an element containing a summary of the product.
10
+ */
11
+ const ProductSummary = ( {
12
+ className,
13
+ shortDescription = '',
14
+ fullDescription = '',
15
+ } ) => {
16
+ const source = shortDescription ? shortDescription : fullDescription;
17
+
18
+ if ( ! source ) {
19
+ return null;
20
+ }
21
+
22
+ return (
23
+ <Summary
24
+ className={ className }
25
+ source={ source }
26
+ maxLength={ 15 }
27
+ countType={ getSetting( 'wordCountType', 'words' ) }
28
+ />
29
+ );
30
+ };
31
+
32
+ ProductSummary.propTypes = {
33
+ className: PropTypes.string,
34
+ shortDescription: PropTypes.string,
35
+ fullDescription: PropTypes.string,
36
+ };
37
+
38
+ export default ProductSummary;
assets/js/base/components/cart-checkout/product-summary/index.tsx DELETED
@@ -1,41 +0,0 @@
1
- /**
2
- * External dependencies
3
- */
4
- import Summary from '@woocommerce/base-components/summary';
5
- import { blocksConfig } from '@woocommerce/block-settings';
6
-
7
- interface ProductSummaryProps {
8
- className?: string;
9
- shortDescription?: string;
10
- fullDescription?: string;
11
- }
12
- /**
13
- * Returns an element containing a summary of the product.
14
- *
15
- * @param {Object} props Incoming props for the component.
16
- * @param {string} props.className CSS class name used.
17
- * @param {string} props.shortDescription Short description for the product.
18
- * @param {string} props.fullDescription Full description for the product.
19
- */
20
- const ProductSummary = ( {
21
- className,
22
- shortDescription = '',
23
- fullDescription = '',
24
- }: ProductSummaryProps ): JSX.Element | null => {
25
- const source = shortDescription ? shortDescription : fullDescription;
26
-
27
- if ( ! source ) {
28
- return null;
29
- }
30
-
31
- return (
32
- <Summary
33
- className={ className }
34
- source={ source }
35
- maxLength={ 15 }
36
- countType={ blocksConfig.wordCountType || 'words' }
37
- />
38
- );
39
- };
40
-
41
- export default ProductSummary;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
assets/js/base/components/cart-checkout/product-variation-data/index.js ADDED
@@ -0,0 +1,49 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /**
2
+ * External dependencies
3
+ */
4
+ import { decodeEntities } from '@wordpress/html-entities';
5
+ import PropTypes from 'prop-types';
6
+ import classNames from 'classnames';
7
+
8
+ /**
9
+ * Returns a formatted element containing variation details.
10
+ */
11
+ const ProductVariationData = ( { className, variation = [] } ) => {
12
+ if ( ! variation || variation.length === 0 ) {
13
+ return null;
14
+ }
15
+
16
+ const variationsText = variation
17
+ .map( ( v ) => {
18
+ if ( v.attribute ) {
19
+ return `${ decodeEntities( v.attribute ) }: ${ decodeEntities(
20
+ v.value
21
+ ) }`;
22
+ }
23
+ // Support for product attributes with no name/key
24
+ return `${ decodeEntities( v.value ) }`;
25
+ } )
26
+ .join( ' / ' );
27
+
28
+ return (
29
+ <div
30
+ className={ classNames(
31
+ 'wc-block-components-product-variation-data',
32
+ className
33
+ ) }
34
+ >
35
+ { variationsText }
36
+ </div>
37
+ );
38
+ };
39
+
40
+ ProductVariationData.propTypes = {
41
+ variation: PropTypes.arrayOf(
42
+ PropTypes.shape( {
43
+ attribute: PropTypes.string,
44
+ value: PropTypes.string.isRequired,
45
+ } )
46
+ ),
47
+ };
48
+
49
+ export default ProductVariationData;
assets/js/base/components/cart-checkout/shipping-calculator/{address.tsx → address.js} RENAMED
@@ -1,29 +1,24 @@
1
  /**
2
  * External dependencies
3
  */
 
4
  import { __ } from '@wordpress/i18n';
 
5
  import Button from '@woocommerce/base-components/button';
6
  import { useState } from '@wordpress/element';
7
  import isShallowEqual from '@wordpress/is-shallow-equal';
8
  import { useValidationContext } from '@woocommerce/base-context';
9
- import type { EnteredAddress, AddressFields } from '@woocommerce/settings';
10
 
11
  /**
12
  * Internal dependencies
13
  */
14
  import './style.scss';
15
- import { AddressForm } from '../address-form';
16
 
17
- interface ShippingCalculatorAddressProps {
18
- address: EnteredAddress;
19
- onUpdate: ( address: EnteredAddress ) => void;
20
- addressFields: Partial< keyof AddressFields >[];
21
- }
22
  const ShippingCalculatorAddress = ( {
23
  address: initialAddress,
24
  onUpdate,
25
  addressFields,
26
- }: ShippingCalculatorAddressProps ): JSX.Element => {
27
  const [ address, setAddress ] = useState( initialAddress );
28
  const {
29
  hasValidationErrors,
@@ -35,10 +30,31 @@ const ShippingCalculatorAddress = ( {
35
  return ! hasValidationErrors;
36
  };
37
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
38
  return (
39
  <form className="wc-block-components-shipping-calculator-address">
40
  <AddressForm
41
  fields={ addressFields }
 
42
  onChange={ setAddress }
43
  values={ address }
44
  />
@@ -60,4 +76,10 @@ const ShippingCalculatorAddress = ( {
60
  );
61
  };
62
 
 
 
 
 
 
 
63
  export default ShippingCalculatorAddress;
1
  /**
2
  * External dependencies
3
  */
4
+ import PropTypes from 'prop-types';
5
  import { __ } from '@wordpress/i18n';
6
+ import { AddressForm } from '@woocommerce/base-components/cart-checkout';
7
  import Button from '@woocommerce/base-components/button';
8
  import { useState } from '@wordpress/element';
9
  import isShallowEqual from '@wordpress/is-shallow-equal';
10
  import { useValidationContext } from '@woocommerce/base-context';
 
11
 
12
  /**
13
  * Internal dependencies
14
  */
15
  import './style.scss';
 
16
 
 
 
 
 
 
17
  const ShippingCalculatorAddress = ( {
18
  address: initialAddress,
19
  onUpdate,
20
  addressFields,
21
+ } ) => {
22
  const [ address, setAddress ] = useState( initialAddress );
23
  const {
24
  hasValidationErrors,
30
  return ! hasValidationErrors;
31
  };
32
 
33
+ // Make all fields optional except 'country'.
34
+ const fieldConfig = {};
35
+ addressFields.forEach( ( field ) => {
36
+ if ( field === 'country' ) {
37
+ fieldConfig[ field ] = {
38
+ ...fieldConfig[ field ],
39
+ errorMessage: __(
40
+ 'Please select a country to calculate rates.',
41
+ 'woo-gutenberg-products-block'
42
+ ),
43
+ required: true,
44
+ };
45
+ } else {
46
+ fieldConfig[ field ] = {
47
+ ...fieldConfig[ field ],
48
+ required: false,
49
+ };
50
+ }
51
+ } );
52
+
53
  return (
54
  <form className="wc-block-components-shipping-calculator-address">
55
  <AddressForm
56
  fields={ addressFields }
57
+ fieldConfig={ fieldConfig }
58
  onChange={ setAddress }
59
  values={ address }
60
  />
76
  );
77
  };
78
 
79
+ ShippingCalculatorAddress.propTypes = {
80
+ address: PropTypes.object.isRequired,
81
+ onUpdate: PropTypes.func.isRequired,
82
+ addressFields: PropTypes.array.isRequired,
83
+ };
84
+
85
  export default ShippingCalculatorAddress;
assets/js/base/components/cart-checkout/shipping-calculator/{index.tsx → index.js} RENAMED
@@ -1,8 +1,8 @@
1
  /**
2
  * External dependencies
3
  */
 
4
  import { useShippingDataContext } from '@woocommerce/base-context';
5
- import type { EnteredAddress } from '@woocommerce/settings';
6
 
7
  /**
8
  * Internal dependencies
@@ -10,17 +10,10 @@ import type { EnteredAddress } from '@woocommerce/settings';
10
  import ShippingCalculatorAddress from './address';
11
  import './style.scss';
12
 
13
- interface ShippingCalculatorProps {
14
- onUpdate?: ( newAddress: EnteredAddress ) => void;
15
- addressFields?: Partial< keyof EnteredAddress >[];
16
- }
17
-
18
  const ShippingCalculator = ( {
19
- onUpdate = () => {
20
- /* Do nothing */
21
- },
22
  addressFields = [ 'country', 'state', 'city', 'postcode' ],
23
- }: ShippingCalculatorProps ): JSX.Element => {
24
  const { shippingAddress, setShippingAddress } = useShippingDataContext();
25
  return (
26
  <div className="wc-block-components-shipping-calculator">
@@ -36,4 +29,9 @@ const ShippingCalculator = ( {
36
  );
37
  };
38
 
 
 
 
 
 
39
  export default ShippingCalculator;
1
  /**
2
  * External dependencies
3
  */
4
+ import PropTypes from 'prop-types';
5
  import { useShippingDataContext } from '@woocommerce/base-context';
 
6
 
7
  /**
8
  * Internal dependencies
10
  import ShippingCalculatorAddress from './address';
11
  import './style.scss';
12
 
 
 
 
 
 
13
  const ShippingCalculator = ( {
14
+ onUpdate = () => {},
 
 
15
  addressFields = [ 'country', 'state', 'city', 'postcode' ],
16
+ } ) => {
17
  const { shippingAddress, setShippingAddress } = useShippingDataContext();
18
  return (
19
  <div className="wc-block-components-shipping-calculator">
29
  );
30
  };
31
 
32
+ ShippingCalculator.propTypes = {
33
+ onUpdate: PropTypes.func,
34
+ addressFields: PropTypes.array,
35
+ };
36
+
37
  export default ShippingCalculator;
assets/js/base/components/cart-checkout/shipping-calculator/style.scss CHANGED
@@ -4,7 +4,6 @@
4
 
5
  .wc-block-components-shipping-calculator-address__button {
6
  width: 100%;
7
- margin-top: em($gap-large);
8
  }
9
 
10
  .wc-block-components-shipping-calculator {
4
 
5
  .wc-block-components-shipping-calculator-address__button {
6
  width: 100%;
 
7
  }
8
 
9
  .wc-block-components-shipping-calculator {
assets/js/base/components/cart-checkout/shipping-location/index.js ADDED
@@ -0,0 +1,64 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /**
2
+ * External dependencies
3
+ */
4
+ import PropTypes from 'prop-types';
5
+ import { __, sprintf } from '@wordpress/i18n';
6
+ import {
7
+ SHIPPING_COUNTRIES,
8
+ SHIPPING_STATES,
9
+ } from '@woocommerce/block-settings';
10
+ import { decodeEntities } from '@wordpress/html-entities';
11
+
12
+ /**
13
+ * Shows a formatted shipping location.
14
+ */
15
+ const ShippingLocation = ( { address } ) => {
16
+ // we bail early if we don't have an address.
17
+ if ( Object.values( address ).length === 0 ) {
18
+ return null;
19
+ }
20
+ const formattedCountry =
21
+ typeof SHIPPING_COUNTRIES[ address.country ] === 'string'
22
+ ? decodeEntities( SHIPPING_COUNTRIES[ address.country ] )
23
+ : '';
24
+
25
+ const formattedState =
26
+ typeof SHIPPING_STATES[ address.country ] === 'object' &&
27
+ typeof SHIPPING_STATES[ address.country ][ address.state ] === 'string'
28
+ ? decodeEntities(
29
+ SHIPPING_STATES[ address.country ][ address.state ]
30
+ )
31
+ : address.state;
32
+
33
+ const addressParts = [];
34
+
35
+ addressParts.push( address.postcode.toUpperCase() );
36
+ addressParts.push( address.city );
37
+ addressParts.push( formattedState );
38
+ addressParts.push( formattedCountry );
39
+
40
+ const formattedLocation = addressParts.filter( Boolean ).join( ', ' );
41
+
42
+ return (
43
+ formattedLocation && (
44
+ <span className="wc-block-components-shipping-address">
45
+ { sprintf(
46
+ /* Translators: %s location. */
47
+ __( 'Shipping to %s', 'woo-gutenberg-products-block' ),
48
+ formattedLocation
49
+ ) + ' ' }
50
+ </span>
51
+ )
52
+ );
53
+ };
54
+
55
+ ShippingLocation.propTypes = {
56
+ address: PropTypes.shape( {
57
+ city: PropTypes.string,
58
+ state: PropTypes.string,
59
+ postcode: PropTypes.string,
60
+ country: PropTypes.string,
61
+ } ),
62
+ };
63
+
64
+ export default ShippingLocation;
assets/js/base/components/cart-checkout/shipping-location/index.tsx DELETED
@@ -1,70 +0,0 @@
1
- /**
2
- * External dependencies
3
- */
4
- import { __, sprintf } from '@wordpress/i18n';
5
- import { EnteredAddress, getSetting } from '@woocommerce/settings';
6
- import { decodeEntities } from '@wordpress/html-entities';
7
-
8
- interface ShippingLocationProps {
9
- address: EnteredAddress;
10
- }
11
-
12
- /**
13
- * Shows a formatted shipping location.
14
- *
15
- * @param {Object} props Incoming props for the component.
16
- * @param {Object} props.address Incoming address information.
17
- */
18
- const ShippingLocation = ( {
19
- address,
20
- }: ShippingLocationProps ): JSX.Element | null => {
21
- // we bail early if we don't have an address.
22
- if ( Object.values( address ).length === 0 ) {
23
- return null;
24
- }
25
- const shippingCountries = getSetting( 'shippingCountries', {} ) as Record<
26
- string,
27
- string
28
- >;
29
- const shippingStates = getSetting( 'shippingStates', {} ) as Record<
30
- string,
31
- Record< string, string >
32
- >;
33
- const formattedCountry =
34
- typeof shippingCountries[ address.country ] === 'string'
35
- ? decodeEntities( shippingCountries[ address.country ] )
36
- : '';
37
-
38
- const formattedState =
39
- typeof shippingStates[ address.country ] === 'object' &&
40
- typeof shippingStates[ address.country ][ address.state ] === 'string'
41
- ? decodeEntities(
42
- shippingStates[ address.country ][ address.state ]
43
- )
44
- : address.state;
45
-
46
- const addressParts = [];
47
-
48
- addressParts.push( address.postcode.toUpperCase() );
49
- addressParts.push( address.city );
50
- addressParts.push( formattedState );
51
- addressParts.push( formattedCountry );
52
-
53
- const formattedLocation = addressParts.filter( Boolean ).join( ', ' );
54
-
55
- if ( ! formattedLocation ) {
56
- return null;
57
- }
58
-
59
- return (
60
- <span className="wc-block-components-shipping-address">
61
- { sprintf(
62
- /* translators: %s location. */
63
- __( 'Shipping to %s', 'woo-gutenberg-products-block' ),
64
- formattedLocation
65
- ) + ' ' }
66
- </span>
67
- );
68
- };
69
-
70
- export default ShippingLocation;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
assets/js/base/components/cart-checkout/shipping-rates-control-package/index.tsx DELETED
@@ -1,152 +0,0 @@
1
- /**
2
- * External dependencies
3
- */
4
- import classNames from 'classnames';
5
- import { _n, sprintf } from '@wordpress/i18n';
6
- import { decodeEntities } from '@wordpress/html-entities';
7
- import type { ReactElement } from 'react';
8
- import type { PackageRateOption } from '@woocommerce/type-defs/shipping';
9
- import { Panel } from '@woocommerce/blocks-checkout';
10
- import Label from '@woocommerce/base-components/label';
11
- import { useSelectShippingRate } from '@woocommerce/base-context/hooks';
12
- import type { CartShippingPackageShippingRate } from '@woocommerce/type-defs/cart';
13
-
14
- /**
15
- * Internal dependencies
16
- */
17
- import PackageRates from './package-rates';
18
- import './style.scss';
19
-
20
- interface PackageItem {
21
- name: string;
22
- key: string;
23
- quantity: number;
24
- }
25
-
26
- interface Destination {
27
- // eslint-disable-next-line camelcase
28
- address_1: string;
29
- // eslint-disable-next-line camelcase
30
- address_2: string;
31
- city: string;
32
- state: string;
33
- postcode: string;
34
- country: string;
35
- }
36
-
37
- export interface PackageData {
38
- destination: Destination;
39
- name: string;
40
- // eslint-disable-next-line camelcase
41
- shipping_rates: CartShippingPackageShippingRate[];
42
- items: PackageItem[];
43
- }
44
-
45
- export type PackageRateRenderOption = (
46
- option: CartShippingPackageShippingRate
47
- ) => PackageRateOption;
48
-
49
- interface PackageProps {
50
- /* PackageId can be a string, WooCommerce Subscriptions uses strings for example, but WooCommerce core uses numbers */
51
- packageId: string | number;
52
- renderOption: PackageRateRenderOption;
53
- collapse?: boolean;
54
- packageData: PackageData;
55
- className?: string;
56
- collapsible?: boolean;
57
- noResultsMessage: ReactElement;
58
- showItems?: boolean;
59
- }
60
-
61
- export const ShippingRatesControlPackage = ( {
62
- packageId,
63
- className,
64
- noResultsMessage,
65
- renderOption,
66
- packageData,
67
- collapsible = false,
68
- collapse = false,
69
- showItems = false,
70
- }: PackageProps ): ReactElement => {
71
- const { selectShippingRate, selectedShippingRate } = useSelectShippingRate(
72
- packageId,
73
- packageData.shipping_rates
74
- );
75
-
76
- const header = (
77
- <>
78
- { ( showItems || collapsible ) && (
79
- <div className="wc-block-components-shipping-rates-control__package-title">
80
- { packageData.name }
81
- </div>
82
- ) }
83
- { showItems && (
84
- <ul className="wc-block-components-shipping-rates-control__package-items">
85
- { Object.values( packageData.items ).map( ( v ) => {
86
- const name = decodeEntities( v.name );
87
- const quantity = v.quantity;
88
- return (
89
- <li
90
- key={ v.key }
91
- className="wc-block-components-shipping-rates-control__package-item"
92
- >
93
- <Label
94
- label={
95
- quantity > 1
96
- ? `${ name } × ${ quantity }`
97
- : `${ name }`
98
- }
99
- screenReaderLabel={ sprintf(
100
- /* translators: %1$s name of the product (ie: Sunglasses), %2$d number of units in the current cart package */
101
- _n(
102
- '%1$s (%2$d unit)',
103
- '%1$s (%2$d units)',
104
- quantity,
105
- 'woo-gutenberg-products-block'
106
- ),
107
- name,
108
- quantity
109
- ) }
110
- />
111
- </li>
112
- );
113
- } ) }
114
- </ul>
115
- ) }
116
- </>
117
- );
118
- const body = (
119
- <PackageRates
120
- className={ className }
121
- noResultsMessage={ noResultsMessage }
122
- rates={ packageData.shipping_rates }
123
- onSelectRate={ selectShippingRate }
124
- selected={ selectedShippingRate }
125
- renderOption={ renderOption }
126
- />
127
- );
128
- if ( collapsible ) {
129
- return (
130
- <Panel
131
- className="wc-block-components-shipping-rates-control__package"
132
- initialOpen={ ! collapse }
133
- title={ header }
134
- >
135
- { body }
136
- </Panel>
137
- );
138
- }
139
- return (
140
- <div
141
- className={ classNames(
142
- 'wc-block-components-shipping-rates-control__package',
143
- className
144
- ) }
145
- >
146
- { header }
147
- { body }
148
- </div>
149
- );
150
- };
151
-
152
- export default ShippingRatesControlPackage;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
assets/js/base/components/cart-checkout/shipping-rates-control-package/package-rates.tsx DELETED
@@ -1,69 +0,0 @@
1
- /**
2
- * External dependencies
3
- */
4
- import RadioControl, {
5
- RadioControlOptionLayout,
6
- } from '@woocommerce/base-components/radio-control';
7
- import type { PackageRateOption } from '@woocommerce/type-defs/shipping';
8
- import type { ReactElement } from 'react';
9
- import type { CartShippingPackageShippingRate } from '@woocommerce/type-defs/cart';
10
-
11
- /**
12
- * Internal dependencies
13
- */
14
- import { renderPackageRateOption } from './render-package-rate-option';
15
-
16
- interface PackageRates {
17
- onSelectRate: ( selectedRateId: string ) => void;
18
- rates: CartShippingPackageShippingRate[];
19
- renderOption?: (
20
- option: CartShippingPackageShippingRate
21
- ) => PackageRateOption;
22
- className?: string;
23
- noResultsMessage: ReactElement;
24
- selected?: string;
25
- }
26
-
27
- const PackageRates = ( {
28
- className,
29
- noResultsMessage,
30
- onSelectRate,
31
- rates,
32
- renderOption = renderPackageRateOption,
33
- selected,
34
- }: PackageRates ): ReactElement => {
35
- if ( rates.length === 0 ) {
36
- return noResultsMessage;
37
- }
38
-
39
- if ( rates.length > 1 ) {
40
- return (
41
- <RadioControl
42
- className={ className }
43
- onChange={ ( selectedRateId: string ) => {
44
- onSelectRate( selectedRateId );
45
- } }
46
- selected={ selected }
47
- options={ rates.map( renderOption ) }
48
- />
49
- );
50
- }
51
-
52
- const {
53
- label,
54
- secondaryLabel,
55
- description,
56
- secondaryDescription,
57
- } = renderOption( rates[ 0 ] );
58
-
59
- return (
60
- <RadioControlOptionLayout
61
- label={ label }
62
- secondaryLabel={ secondaryLabel }
63
- description={ description }
64
- secondaryDescription={ secondaryDescription }
65
- />
66
- );
67
- };
68
-
69
- export default PackageRates;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
assets/js/base/components/cart-checkout/shipping-rates-control-package/render-package-rate-option.tsx DELETED
@@ -1,46 +0,0 @@
1
- /**
2
- * External dependencies
3
- */
4
- import { decodeEntities } from '@wordpress/html-entities';
5
- import { getCurrencyFromPriceResponse } from '@woocommerce/price-format';
6
- import FormattedMonetaryAmount from '@woocommerce/base-components/formatted-monetary-amount';
7
- import type { PackageRateOption } from '@woocommerce/type-defs/shipping';
8
- import { getSetting } from '@woocommerce/settings';
9
- import { CartShippingPackageShippingRate } from '@woocommerce/type-defs/cart';
10
-
11
- /**
12
- * Default render function for package rate options.
13
- *
14
- * @param {Object} rate Rate data.
15
- */
16
- export const renderPackageRateOption = (
17
- rate: CartShippingPackageShippingRate
18
- ): PackageRateOption => {
19
- const priceWithTaxes: number = getSetting(
20
- 'displayCartPricesIncludingTax',
21
- false
22
- )
23
- ? parseInt( rate.price, 10 ) + parseInt( rate.taxes, 10 )
24
- : parseInt( rate.price, 10 );
25
-
26
- return {
27
- label: decodeEntities( rate.name ),
28
- value: rate.rate_id,
29
- description: (
30
- <>
31
- { Number.isFinite( priceWithTaxes ) && (
32
- <FormattedMonetaryAmount
33
- currency={ getCurrencyFromPriceResponse( rate ) }
34
- value={ priceWithTaxes }
35
- />
36
- ) }
37
- { Number.isFinite( priceWithTaxes ) && rate.delivery_time
38
- ? ' — '
39
- : null }
40
- { decodeEntities( rate.delivery_time ) }
41
- </>
42
- ),
43
- };
44
- };
45
-
46
- export default renderPackageRateOption;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
assets/js/base/components/cart-checkout/shipping-rates-control-package/style.scss DELETED
@@ -1,43 +0,0 @@
1
- .wc-block-components-shipping-rates-control__package {
2
- .wc-block-components-panel__button {
3
- margin-bottom: 0;
4
- margin-top: 0;
5
- padding-bottom: em($gap-small);
6
- padding-top: em($gap-small);
7
- }
8
-
9
- // Remove panel padding because we are adding bottom padding to `.wc-block-components-radio-control`
10
- // and `.wc-block-components-radio-control__option-layout` in the next ruleset.
11
- .wc-block-components-panel__content {
12
- padding-bottom: 0;
13
- }
14
-
15
- .wc-block-components-radio-control,
16
- .wc-block-components-radio-control__option-layout {
17
- padding-bottom: 0;
18
- }
19
-
20
- .wc-block-components-radio-control .wc-block-components-radio-control__option-layout {
21
- padding-bottom: 0;
22
- }
23
- }
24
-
25
- .wc-block-components-shipping-rates-control__package-items {
26
- @include font-size(small);
27
- display: block;
28
- list-style: none;
29
- margin: 0;
30
- padding: 0;
31
- }
32
-
33
- .wc-block-components-shipping-rates-control__package-item {
34
- @include wrap-break-word();
35
- display: inline-block;
36
- margin: 0;
37
- padding: 0;
38
- }
39
-
40
- .wc-block-components-shipping-rates-control__package-item:not(:last-child)::after {
41
- content: ", ";
42
- white-space: pre;
43
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
assets/js/base/components/cart-checkout/shipping-rates-control/index.js ADDED
@@ -0,0 +1,113 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /**
2
+ * External dependencies
3
+ */
4
+ import { __, _n, sprintf } from '@wordpress/i18n';
5
+ import { useEffect } from 'react';
6
+ import PropTypes from 'prop-types';
7
+ import { speak } from '@wordpress/a11y';
8
+ import LoadingMask from '@woocommerce/base-components/loading-mask';
9
+ import {
10
+ getShippingRatesPackageCount,
11
+ getShippingRatesRateCount,
12
+ } from '@woocommerce/base-utils';
13
+
14
+ /**
15
+ * Internal dependencies
16
+ */
17
+ import Packages from './packages';
18
+ import './style.scss';
19
+
20
+ const ShippingRatesControl = ( {
21
+ shippingRates,
22
+ shippingRatesLoading,
23
+ className,
24
+ collapsibleWhenMultiple = false,
25
+ noResultsMessage,
26
+ renderOption,
27
+ } ) => {
28
+ useEffect( () => {
29
+ if ( shippingRatesLoading ) {
30
+ return;
31
+ }
32
+ const packages = getShippingRatesPackageCount( shippingRates );
33
+ const shippingOptions = getShippingRatesRateCount( shippingRates );
34
+ if ( shippingOptions === 0 ) {
35
+ speak(
36
+ __(
37
+ 'No shipping options were found.',
38
+ 'woo-gutenberg-products-block'
39
+ )
40
+ );
41
+ } else if ( packages === 1 ) {
42
+ speak(
43
+ sprintf(
44
+ // translators: %d number of shipping options found.
45
+ _n(
46
+ '%d shipping option was found.',
47
+ '%d shipping options were found.',
48
+ shippingOptions,
49
+ 'woo-gutenberg-products-block'
50
+ ),
51
+ shippingOptions
52
+ )
53
+ );
54
+ } else {
55
+ speak(
56
+ sprintf(
57
+ // translators: %d number of shipping packages packages.
58
+ _n(
59
+ 'Shipping option searched for %d package.',
60
+ 'Shipping options searched for %d packages.',
61
+ packages,
62
+ 'woo-gutenberg-products-block'
63
+ ),
64
+ packages
65
+ ) +
66
+ ' ' +
67
+ sprintf(
68
+ // translators: %d number of shipping options available.
69
+ _n(
70
+ '%d shipping option was found',
71
+ '%d shipping options were found',
72
+ shippingOptions,
73
+ 'woo-gutenberg-products-block'
74
+ ),
75
+ shippingOptions
76
+ )
77
+ );
78
+ }
79
+ }, [ shippingRatesLoading, shippingRates ] );
80
+
81
+ return (
82
+ <LoadingMask
83
+ isLoading={ shippingRatesLoading }
84
+ screenReaderLabel={ __(
85
+ 'Loading shipping rates…',
86
+ 'woo-gutenberg-products-block'
87
+ ) }
88
+ showSpinner={ true }
89
+ >
90
+ <Packages
91
+ className={ className }
92
+ collapsible={
93
+ shippingRates.length > 1 && collapsibleWhenMultiple
94
+ }
95
+ noResultsMessage={ noResultsMessage }
96
+ renderOption={ renderOption }
97
+ shippingRates={ shippingRates }
98
+ />
99
+ </LoadingMask>
100
+ );
101
+ };
102
+
103
+ ShippingRatesControl.propTypes = {
104
+ noResultsMessage: PropTypes.string.isRequired,
105
+ renderOption: PropTypes.func.isRequired,
106
+ className: PropTypes.string,
107
+ collapsibleWhenMultiple: PropTypes.bool,
108
+ shippingRates: PropTypes.array,
109
+ shippingRatesLoading: PropTypes.bool,
110
+ };
111
+
112
+ export default ShippingRatesControl;
113
+ export { Packages };
assets/js/base/components/cart-checkout/shipping-rates-control/index.tsx DELETED
@@ -1,187 +0,0 @@
1
- /**
2
- * External dependencies
3
- */
4
- import { __, _n, sprintf } from '@wordpress/i18n';
5
- import { useEffect } from '@wordpress/element';
6
- import { speak } from '@wordpress/a11y';
7
- import LoadingMask from '@woocommerce/base-components/loading-mask';
8
- import { ExperimentalOrderShippingPackages } from '@woocommerce/blocks-checkout';
9
- import {
10
- getShippingRatesPackageCount,
11
- getShippingRatesRateCount,
12
- } from '@woocommerce/base-utils';
13
- import { useStoreCart } from '@woocommerce/base-context/hooks';
14
- import { CartResponseShippingRate } from '@woocommerce/type-defs/cart-response';
15
- import { ReactElement } from 'react';
16
-
17
- /**
18
- * Internal dependencies
19
- */
20
- import ShippingRatesControlPackage, {
21
- PackageRateRenderOption,
22
- } from '../shipping-rates-control-package';
23
-
24
- interface PackagesProps {
25
- packages: CartResponseShippingRate[];
26
- collapse?: boolean;
27
- collapsible?: boolean;
28
- showItems?: boolean;
29
- noResultsMessage: ReactElement;
30
- renderOption: PackageRateRenderOption;
31
- }
32
-
33
- /**
34
- * Renders multiple packages within the slotfill.
35
- *
36
- * @param {Object} props Incoming props.
37
- * @param {Array} props.packages Array of packages.
38
- * @param {boolean} props.collapsible If the package should be rendered as a
39
- * @param {ReactElement} props.noResultsMessage Rendered when there are no rates in a package.
40
- * collapsible panel.
41
- * @param {boolean} props.collapse If the panel should be collapsed by default,
42
- * only works if collapsible is true.
43
- * @param {boolean} props.showItems If we should items below the package name.
44
- * @param {PackageRateRenderOption} [props.renderOption] Function to render a shipping rate.
45
- * @return {JSX.Element|null} Rendered components.
46
- */
47
- const Packages = ( {
48
- packages,
49
- collapse,
50
- showItems,
51
- collapsible,
52
- noResultsMessage,
53
- renderOption,
54
- }: PackagesProps ): JSX.Element | null => {
55
- // If there are no packages, return nothing.
56
- if ( ! packages.length ) {
57
- return null;
58
- }
59
- return (
60
- <>
61
- { packages.map( ( { package_id: packageId, ...packageData } ) => (
62
- <ShippingRatesControlPackage
63
- key={ packageId }
64
- packageId={ packageId }
65
- packageData={ packageData }
66
- collapsible={ collapsible }
67
- collapse={ collapse }
68
- showItems={ showItems }
69
- noResultsMessage={ noResultsMessage }
70
- renderOption={ renderOption }
71
- />
72
- ) ) }
73
- </>
74
- );
75
- };
76
-
77
- interface ShippingRatesControlProps {
78
- collapsible?: boolean;
79
- shippingRates: CartResponseShippingRate[];
80
- className?: string;
81
- shippingRatesLoading: boolean;
82
- noResultsMessage: ReactElement;
83
- renderOption: PackageRateRenderOption;
84
- }
85
- /**
86
- * Renders the shipping rates control element.
87
- *
88
- * @param {Object} props Incoming props.
89
- * @param {Array} props.shippingRates Array of packages containing shipping rates.
90
- * @param {boolean} props.shippingRatesLoading True when rates are being loaded.
91
- * @param {string} props.className Class name for package rates.
92
- * @param {boolean} [props.collapsible] If true, when multiple packages are rendered they can be toggled open and closed.
93
- * @param {ReactElement} props.noResultsMessage Rendered when there are no packages.
94
- * @param {Function} [props.renderOption] Function to render a shipping rate.
95
- */
96
- const ShippingRatesControl = ( {
97
- shippingRates,
98
- shippingRatesLoading,
99
- className,
100
- collapsible = false,
101
- noResultsMessage,
102
- renderOption,
103
- }: ShippingRatesControlProps ): JSX.Element => {
104
- useEffect( () => {
105
- if ( shippingRatesLoading ) {
106
- return;
107
- }
108
- const packageCount = getShippingRatesPackageCount( shippingRates );
109
- const shippingOptions = getShippingRatesRateCount( shippingRates );
110
- if ( packageCount === 1 ) {
111
- speak(
112
- sprintf(
113
- /* translators: %d number of shipping options found. */
114
- _n(
115
- '%d shipping option was found.',
116
- '%d shipping options were found.',
117
- shippingOptions,
118
- 'woo-gutenberg-products-block'
119
- ),
120
- shippingOptions
121
- )
122
- );
123
- } else {
124
- speak(
125
- sprintf(
126
- /* translators: %d number of shipping packages packages. */
127
- _n(
128
- 'Shipping option searched for %d package.',
129
- 'Shipping options searched for %d packages.',
130
- packageCount,
131
- 'woo-gutenberg-products-block'
132
- ),
133
- packageCount
134
- ) +
135
- ' ' +
136
- sprintf(
137
- /* translators: %d number of shipping options available. */
138
- _n(
139
- '%d shipping option was found',
140
- '%d shipping options were found',
141
- shippingOptions,
142
- 'woo-gutenberg-products-block'
143
- ),
144
- shippingOptions
145
- )
146
- );
147
- }
148
- }, [ shippingRatesLoading, shippingRates ] );
149
-
150
- // Prepare props to pass to the ExperimentalOrderShippingPackages slot fill.
151
- // We need to pluck out receiveCart.
152
- // eslint-disable-next-line no-unused-vars
153
- const { extensions, ...cart } = useStoreCart();
154
- const slotFillProps = {
155
- className,
156
- collapsible,
157
- noResultsMessage,
158
- renderOption,
159
- extensions,
160
- cart,
161
- components: {
162
- ShippingRatesControlPackage,
163
- },
164
- };
165
-
166
- return (
167
- <LoadingMask
168
- isLoading={ shippingRatesLoading }
169
- screenReaderLabel={ __(
170
- 'Loading shipping rates…',
171
- 'woo-gutenberg-products-block'
172
- ) }
173
- showSpinner={ true }
174
- >
175
- <ExperimentalOrderShippingPackages.Slot { ...slotFillProps } />
176
- <ExperimentalOrderShippingPackages>
177
- <Packages
178
- packages={ shippingRates }
179
- noResultsMessage={ noResultsMessage }
180
- renderOption={ renderOption }
181
- />
182
- </ExperimentalOrderShippingPackages>
183
- </LoadingMask>
184
- );
185
- };
186
-
187
- export default ShippingRatesControl;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
assets/js/base/components/cart-checkout/shipping-rates-control/package-options.js ADDED
@@ -0,0 +1,71 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /**
2
+ * External dependencies
3
+ */
4
+ import PropTypes from 'prop-types';
5
+ import RadioControl, {
6
+ RadioControlOptionLayout,
7
+ } from '@woocommerce/base-components/radio-control';
8
+ import { Notice } from 'wordpress-components';
9
+ import classnames from 'classnames';
10
+
11
+ const PackageOptions = ( {
12
+ className,
13
+ noResultsMessage,
14
+ onChange,
15
+ options,
16
+ renderOption,
17
+ selected,
18
+ } ) => {
19
+ if ( options.length === 0 ) {
20
+ return (
21
+ <Notice
22
+ isDismissible={ false }
23
+ className={ classnames(
24
+ 'wc-block-components-shipping-rates-control__no-results-notice',
25
+ 'woocommerce-message',
26
+ 'woocommerce-info'
27
+ ) }
28
+ >
29
+ { noResultsMessage }
30
+ </Notice>
31
+ );
32
+ }
33
+
34
+ if ( options.length > 1 ) {
35
+ return (
36
+ <RadioControl
37
+ className={ className }
38
+ onChange={ onChange }
39
+ selected={ selected }
40
+ options={ options.map( renderOption ) }
41
+ />
42
+ );
43
+ }
44
+
45
+ const {
46
+ label,
47
+ secondaryLabel,
48
+ description,
49
+ secondaryDescription,
50
+ } = renderOption( options[ 0 ] );
51
+
52
+ return (
53
+ <RadioControlOptionLayout
54
+ label={ label }
55
+ secondaryLabel={ secondaryLabel }
56
+ description={ description }
57
+ secondaryDescription={ secondaryDescription }
58
+ />
59
+ );
60
+ };
61
+
62
+ PackageOptions.propTypes = {
63
+ onChange: PropTypes.func.isRequired,
64
+ options: PropTypes.arrayOf( PropTypes.object ).isRequired,
65
+ renderOption: PropTypes.func.isRequired,
66
+ className: PropTypes.string,
67
+ noResultsMessage: PropTypes.string,
68
+ selected: PropTypes.string,
69
+ };
70
+
71
+ export default PackageOptions;
assets/js/base/components/cart-checkout/shipping-rates-control/package.js ADDED
@@ -0,0 +1,126 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /**
2
+ * External dependencies
3
+ */
4
+ import PropTypes from 'prop-types';
5
+ import { _n, sprintf } from '@wordpress/i18n';
6
+ import { decodeEntities } from '@wordpress/html-entities';
7
+ import Label from '@woocommerce/base-components/label';
8
+ import Title from '@woocommerce/base-components/title';
9
+ import Panel from '@woocommerce/base-components/panel';
10
+ import classNames from 'classnames';
11
+
12
+ /**
13
+ * Internal dependencies
14
+ */
15
+ import PackageOptions from './package-options';
16
+ import './style.scss';
17
+
18
+ const Package = ( {
19
+ className,
20
+ collapsible = false,
21
+ noResultsMessage,
22
+ onChange,
23
+ renderOption,
24
+ selected,
25
+ shippingRate,
26
+ showItems,
27
+ title,
28
+ } ) => {
29
+ const header = (
30
+ <>
31
+ { title && (
32
+ <Title
33
+ className="wc-block-components-shipping-rates-control__package-title"
34
+ headingLevel="3"
35
+ >
36
+ { title }
37
+ </Title>
38
+ ) }
39
+ { showItems && (
40
+ <ul className="wc-block-components-shipping-rates-control__package-items">
41
+ { Object.values( shippingRate.items ).map( ( v ) => {
42
+ const name = decodeEntities( v.name );
43
+ const quantity = v.quantity;
44
+ return (
45
+ <li
46
+ key={ name }
47
+ className="wc-block-components-shipping-rates-control__package-item"
48
+ >
49
+ <Label
50
+ label={ `${ name } ×${ quantity }` }
51
+ screenReaderLabel={ sprintf(
52
+ // translators: %s name of the product (ie: Sunglasses), %d number of units in the current cart package
53
+ _n(
54
+ '%s (%d unit)',
55
+ '%s (%d units)',
56
+ quantity,
57
+ 'woo-gutenberg-products-block'
58
+ ),
59
+ name,
60
+ quantity
61
+ ) }
62
+ />
63
+ </li>
64
+ );
65
+ } ) }
66
+ </ul>
67
+ ) }
68
+ </>
69
+ );
70
+ const body = (
71
+ <PackageOptions
72
+ className={ className }
73
+ noResultsMessage={ noResultsMessage }
74
+ onChange={ onChange }
75
+ options={ shippingRate.shipping_rates }
76
+ renderOption={ renderOption }
77
+ selected={ selected }
78
+ />
79
+ );
80
+ if ( collapsible ) {
81
+ return (
82
+ <Panel
83
+ className="wc-block-components-shipping-rates-control__package"
84
+ hasBorder={ true }
85
+ initialOpen={ true }
86
+ title={ header }
87
+ >
88
+ { body }
89
+ </Panel>
90
+ );
91
+ }
92
+ return (
93
+ <div
94
+ className={ classNames(
95
+ 'wc-block-components-shipping-rates-control__package',
96
+ className
97
+ ) }
98
+ >
99
+ { header }
100
+ { body }
101
+ </div>
102
+ );
103
+ };
104
+
105
+ Package.propTypes = {
106
+ onChange: PropTypes.func.isRequired,
107
+ renderOption: PropTypes.func.isRequired,
108
+ shippingRate: PropTypes.shape( {
109
+ shipping_rates: PropTypes.arrayOf( PropTypes.object ).isRequired,
110
+ items: PropTypes.arrayOf(
111
+ PropTypes.shape( {
112
+ name: PropTypes.string.isRequired,
113
+ key: PropTypes.string.isRequired,
114
+ quantity: PropTypes.number.isRequired,
115
+ } ).isRequired
116
+ ).isRequired,
117
+ } ).isRequired,
118
+ className: PropTypes.string,
119
+ collapsible: PropTypes.bool,
120
+ noResultsMessage: PropTypes.string,
121
+ selected: PropTypes.string,
122
+ showItems: PropTypes.bool,
123
+ title: PropTypes.string,
124
+ };
125
+
126
+ export default Package;
assets/js/base/components/cart-checkout/shipping-rates-control/packages.js ADDED
@@ -0,0 +1,71 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /**
2
+ * External dependencies
3
+ */
4
+ import PropTypes from 'prop-types';
5
+ import { useSelectShippingRate } from '@woocommerce/base-hooks';
6
+
7
+ /**
8
+ * Internal dependencies
9
+ */
10
+ import Package from './package';
11
+ import './style.scss';
12
+
13
+ const Packages = ( {
14
+ className,
15
+ collapsible = false,
16
+ noResultsMessage,
17
+ renderOption,
18
+ shippingRates = [],
19
+ } ) => {
20
+ const { selectShippingRate, selectedShippingRates } = useSelectShippingRate(
21
+ shippingRates
22
+ );
23
+ /* eslint-disable camelcase */
24
+ return (
25
+ <div className="wc-block-components-shipping-rates-control">
26
+ { shippingRates.map( ( { package_id, ...shippingRate } ) => (
27
+ <Package
28
+ key={ package_id }
29
+ className={ className }
30
+ collapsible={ collapsible }
31
+ noResultsMessage={ noResultsMessage }
32
+ onChange={ ( newShippingRate ) => {
33
+ selectShippingRate( newShippingRate, package_id );
34
+ } }
35
+ renderOption={ renderOption }
36
+ selected={ selectedShippingRates[ package_id ] }
37
+ shippingRate={ shippingRate }
38
+ showItems={ shippingRates.length > 1 }
39
+ title={
40
+ shippingRates.length > 1 ? shippingRate.name : null
41
+ }
42
+ />
43
+ ) ) }
44
+ </div>
45
+ );
46
+ /* eslint-enable */
47
+ };
48
+
49
+ Packages.propTypes = {
50
+ renderOption: PropTypes.func.isRequired,
51
+ className: PropTypes.string,
52
+ collapsible: PropTypes.bool,
53
+ noResultsMessage: PropTypes.string,
54
+ shippingRates: PropTypes.arrayOf(
55
+ PropTypes.shape( {
56
+ items: PropTypes.arrayOf(
57
+ PropTypes.shape( {
58
+ key: PropTypes.string,
59
+ name: PropTypes.string,
60
+ quantity: PropTypes.number,
61
+ } )
62
+ ).isRequired,
63
+ package_id: PropTypes.number,
64
+ name: PropTypes.string,
65
+ destination: PropTypes.object,
66
+ shipping_rates: PropTypes.arrayOf( PropTypes.object ),
67
+ } ).isRequired
68
+ ).isRequired,
69
+ };
70
+
71
+ export default Packages;
assets/js/base/components/cart-checkout/shipping-rates-control/style.scss ADDED
@@ -0,0 +1,35 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ .wc-block-components-shipping-rates-control__package {
2
+ .wc-block-components-shipping-rates-control__package-title {
3
+ margin: 0;
4
+ }
5
+ }
6
+
7
+ .wc-block-components-shipping-rates-control__package-items {
8
+ @include font-size(small);
9
+ display: block;
10
+ list-style: none;
11
+ margin: 0;
12
+ padding: 0;
13
+ }
14
+
15
+ .wc-block-components-shipping-rates-control__package-item {
16
+ @include wrap-break-word();
17
+ display: inline-block;
18
+ margin: 0;
19
+ padding: 0;
20
+ }
21
+
22
+ .wc-block-components-shipping-rates-control__package-item:not(:last-child)::after {
23
+ content: ", ";
24
+ white-space: pre;
25
+ }
26
+
27
+ .components-notice.wc-block-components-shipping-rates-control__no-results-notice {
28
+ margin-bottom: 0;
29
+ }
30
+
31
+ .wc-block-components-shipping-rates-control {
32
+ .wc-blocks-components-panel__content {
33
+ padding-bottom: 0;
34
+ }
35
+ }
assets/js/base/components/cart-checkout/totals/discount/stories/index.js DELETED
@@ -1,37 +0,0 @@
1
- /**
2
- * External dependencies
3
- */
4
- import { text, boolean } from '@storybook/addon-knobs';
5
- import { currencyKnob } from '@woocommerce/knobs';
6
-
7
- /**
8
- * Internal dependencies
9
- */
10
- import TotalsDiscount from '../';
11
-
12
- export default {
13
- title:
14
- 'WooCommerce Blocks/@base-components/cart-checkout/totals/TotalsDiscount',
15
- component: TotalsDiscount,
16
- };
17
-
18
- export const Default = () => {
19
- const cartCoupons = [ { code: 'COUPON' } ];
20
- const currency = currencyKnob();
21
- const isRemovingCoupon = boolean( 'Toggle isRemovingCoupon state', false );
22
- const totalDiscount = text( 'Total discount', '1000' );
23
- const totalDiscountTax = text( 'Total discount tax', '200' );
24
-
25
- return (
26
- <TotalsDiscount
27
- cartCoupons={ cartCoupons }
28
- currency={ currency }
29
- isRemovingCoupon={ isRemovingCoupon }
30
- removeCoupon={ () => void null }
31
- values={ {
32
- total_discount: totalDiscount,
33
- total_discount_tax: totalDiscountTax,
34
- } }
35
- />
36
- );
37
- };
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
assets/js/base/components/cart-checkout/totals/discount/style.scss DELETED
@@ -1,9 +0,0 @@
1
- .wc-block-components-totals-discount__coupon-list {
2
- list-style: none;
3
- margin: 0;
4
- padding: 0;
5
- }
6
-
7
- .wc-block-components-totals-discount .wc-block-components-totals-item__value {
8
- color: $discount-color;
9
- }
 
 
 
 
 
 
 
 
 
assets/js/base/components/cart-checkout/totals/footer-item/stories/index.js DELETED
@@ -1,32 +0,0 @@
1
- /**
2
- * External dependencies
3
- */
4
- import { text } from '@storybook/addon-knobs';
5
- import { currencyKnob } from '@woocommerce/knobs';
6
-
7
- /**
8
- * Internal dependencies
9
- */
10
- import TotalsFooterItem from '../';
11
-
12
- export default {
13
- title:
14
- 'WooCommerce Blocks/@base-components/cart-checkout/totals/TotalsFooterItem',
15
- component: TotalsFooterItem,
16
- };
17
-
18
- export const Default = () => {
19
- const currency = currencyKnob();
20
- const totalPrice = text( 'Total price', '1200' );
21
- const totalTax = text( 'Total tax', '200' );
22
-
23
- return (
24
- <TotalsFooterItem
25
- currency={ currency }
26
- values={ {
27
- total_price: totalPrice,
28
- total_tax: totalTax,
29
- } }
30
- />
31
- );
32
- };
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
assets/js/base/components/cart-checkout/totals/footer-item/test/__snapshots__/index.js.snap DELETED
@@ -1,79 +0,0 @@
1
- // Jest Snapshot v1, https://goo.gl/fbAQLP
2
-
3
- exports[`TotalsFooterItem Does not show the "including %s of tax" line if tax is 0 1`] = `
4
- <div>
5
- <div
6
- class="wc-block-components-totals-item wc-block-components-totals-footer-item"
7
- >
8
- <span
9
- class="wc-block-components-totals-item__label"
10
- >
11
- Total
12
- </span>
13
- <span
14
- class="wc-block-formatted-money-amount wc-block-components-formatted-money-amount wc-block-components-totals-item__value"
15
- >
16
- £85.00
17
- </span>
18
- <div
19
- class="wc-block-components-totals-item__description"
20
- />
21
- </div>
22
- </div>
23
- `;
24
-
25
- exports[`TotalsFooterItem Does not show the "including %s of tax" line if tax is disabled 1`] = `
26
- <div>
27
- <div
28
- class="wc-block-components-totals-item wc-block-components-totals-footer-item"
29
- >
30
- <span
31
- class="wc-block-components-totals-item__label"
32
- >
33
- Total
34
- </span>
35
- <span
36
- class="wc-block-formatted-money-amount wc-block-components-formatted-money-amount wc-block-components-totals-item__value"
37
- >
38
- £85.00
39
- </span>
40
- <div
41
- class="wc-block-components-totals-item__description"
42
- />
43
- </div>
44
- </div>
45
- `;
46
-
47
- exports[`TotalsFooterItem Shows the "including %s of tax" line if tax is greater than 0 1`] = `
48
- <div>
49
- <div
50
- class="wc-block-components-totals-item wc-block-components-totals-footer-item"
51
- >
52
- <span
53
- class="wc-block-components-totals-item__label"
54
- >
55
- Total
56
- </span>
57
- <span
58
- class="wc-block-formatted-money-amount wc-block-components-formatted-money-amount wc-block-components-totals-item__value"
59
- >
60
- £85.00
61
- </span>
62
- <div
63
- class="wc-block-components-totals-item__description"
64
- >
65
- <p
66
- class="wc-block-components-totals-footer-item-tax"
67
- >
68
- Including
69
- <span
70
- class="wc-block-formatted-money-amount wc-block-components-formatted-money-amount wc-block-components-totals-footer-item-tax-value"
71
- >
72
- £1.00
73
- </span>
74
- in taxes
75
- </p>
76
- </div>
77
- </div>
78
- </div>
79
- `;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
assets/js/base/components/cart-checkout/totals/footer-item/test/index.js DELETED
@@ -1,81 +0,0 @@
1
- /**
2
- * External dependencies
3
- */
4
- import { render } from '@testing-library/react';
5
-
6
- /**
7
- * Internal dependencies
8
- */
9
- import TotalsFooterItem from '../index';
10
- import { allSettings } from '../../../../../../settings/shared/settings-init';
11
-
12
- describe( 'TotalsFooterItem', () => {
13
- beforeEach( () => {
14
- allSettings.taxesEnabled = true;
15
- allSettings.displayCartPricesIncludingTax = true;
16
- } );
17
- const currency = {
18
- code: 'GBP',
19
- decimalSeparator: '.',
20
- minorUnit: 2,
21
- prefix: '£',
22
- suffix: '',
23
- symbol: '£',
24
- thousandSeparator: ',',
25
- };
26
-
27
- const values = {
28
- currency_code: 'GBP',
29
- currency_decimal_separator: '.',
30
- currency_minor_unit: 2,
31
- currency_prefix: '£',
32
- currency_suffix: '',
33
- currency_symbol: '£',
34
- currency_thousand_separator: ',',
35
- tax_lines: [],
36
- length: 2,
37
- total_discount: '0',
38
- total_discount_tax: '0',
39
- total_fees: '0',
40
- total_fees_tax: '0',
41
- total_items: '7100',
42
- total_items_tax: '0',
43
- total_price: '8500',
44
- total_shipping: '0',
45
- total_shipping_tax: '0',
46
- total_tax: '0',
47
- };
48
-
49
- it( 'Does not show the "including %s of tax" line if tax is 0', () => {
50
- const { container } = render(
51
- <TotalsFooterItem currency={ currency } values={ values } />
52
- );
53
- expect( container ).toMatchSnapshot();
54
- } );
55
-
56
- it( 'Does not show the "including %s of tax" line if tax is disabled', () => {
57
- allSettings.taxesEnabled = false;
58
- /* This shouldn't ever happen if taxes are disabled, but this is to test whether the taxesEnabled setting works */
59
- const valuesWithTax = {
60
- ...values,
61
- total_tax: '100',
62
- total_items_tax: '100',
63
- };
64
- const { container } = render(
65
- <TotalsFooterItem currency={ currency } values={ valuesWithTax } />
66
- );
67
- expect( container ).toMatchSnapshot();
68
- } );
69
-
70
- it( 'Shows the "including %s of tax" line if tax is greater than 0', () => {
71
- const valuesWithTax = {
72
- ...values,
73
- total_tax: '100',
74
- total_items_tax: '100',
75
- };
76
- const { container } = render(
77
- <TotalsFooterItem currency={ currency } values={ valuesWithTax } />
78
- );
79
- expect( container ).toMatchSnapshot();
80
- } );
81
- } );
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
assets/js/base/components/cart-checkout/totals/index.js CHANGED
@@ -1,4 +1,8 @@
1
- export { default as TotalsCoupon } from './coupon';
2
- export { default as TotalsDiscount } from './discount';
3
- export { default as TotalsFooterItem } from './footer-item';
4
- export { default as TotalsShipping } from './shipping';
 
 
 
 
1
+ export { default as SubtotalsItem } from './subtotals-item';
2
+ export { default as TotalsCouponCodeInput } from './totals-coupon-code-input';
3
+ export { default as TotalsDiscountItem } from './totals-discount-item';
4
+ export { default as TotalsFeesItem } from './totals-fees-item';
5
+ export { default as TotalsFooterItem } from './totals-footer-item';
6
+ export { default as TotalsItem } from './totals-item';
7
+ export { default as TotalsShippingItem } from './totals-shipping-item';
8
+ export { default as TotalsTaxesItem } from './totals-taxes-item';
assets/js/base/components/cart-checkout/totals/shipping/index.tsx DELETED
@@ -1,215 +0,0 @@
1
- /**
2
- * External dependencies
3
- */
4
- import classnames from 'classnames';
5
- import { __ } from '@wordpress/i18n';
6
- import { useState } from '@wordpress/element';
7
- import { useStoreCart } from '@woocommerce/base-context/hooks';
8
- import { TotalsItem } from '@woocommerce/blocks-checkout';
9
- import type { Currency } from '@woocommerce/price-format';
10
- import type { ReactElement } from 'react';
11
- import { getSetting, EnteredAddress } from '@woocommerce/settings';
12
- import { ShippingVia } from '@woocommerce/base-components/cart-checkout/totals/shipping/shipping-via';
13
-
14
- /**
15
- * Internal dependencies
16
- */
17
- import ShippingRateSelector from './shipping-rate-selector';
18
- import hasShippingRate from './has-shipping-rate';
19
- import ShippingCalculator from '../../shipping-calculator';
20
- import ShippingLocation from '../../shipping-location';
21
- import './style.scss';
22
-
23
- interface CalculatorButtonProps {
24
- label?: string;
25
- isShippingCalculatorOpen: boolean;
26
- setIsShippingCalculatorOpen: ( isShippingCalculatorOpen: boolean ) => void;
27
- }
28
-
29
- const CalculatorButton = ( {
30
- label = __( 'Calculate', 'woo-gutenberg-products-block' ),
31
- isShippingCalculatorOpen,
32
- setIsShippingCalculatorOpen,
33
- }: CalculatorButtonProps ): ReactElement => {
34
- return (
35
- <button
36
- className="wc-block-components-totals-shipping__change-address-button"
37
- onClick={ () => {
38
- setIsShippingCalculatorOpen( ! isShippingCalculatorOpen );
39
- } }
40
- aria-expanded={ isShippingCalculatorOpen }
41
- >
42
- { label }
43
- </button>
44
- );
45
- };
46
-
47
- interface ShippingAddressProps {
48
- showCalculator: boolean;
49
- isShippingCalculatorOpen: boolean;
50
- setIsShippingCalculatorOpen: CalculatorButtonProps[ 'setIsShippingCalculatorOpen' ];
51
- shippingAddress: EnteredAddress;
52
- }
53
-
54
- const ShippingAddress = ( {
55
- showCalculator,
56
- isShippingCalculatorOpen,
57
- setIsShippingCalculatorOpen,
58
- shippingAddress,
59
- }: ShippingAddressProps ): ReactElement | null => {
60
- return (
61
- <>
62
- <ShippingLocation address={ shippingAddress } />
63
- { showCalculator && (
64
- <CalculatorButton
65
- label={ __(
66
- '(change address)',
67
- 'woo-gutenberg-products-block'
68
- ) }
69
- isShippingCalculatorOpen={ isShippingCalculatorOpen }
70
- setIsShippingCalculatorOpen={ setIsShippingCalculatorOpen }
71
- />
72
- ) }
73
- </>
74
- );
75
- };
76
-
77
- interface NoShippingPlaceholderProps {
78
- showCalculator: boolean;
79
- isShippingCalculatorOpen: boolean;
80
- setIsShippingCalculatorOpen: CalculatorButtonProps[ 'setIsShippingCalculatorOpen' ];
81
- }
82
-
83
- const NoShippingPlaceholder = ( {
84
- showCalculator,
85
- isShippingCalculatorOpen,
86
- setIsShippingCalculatorOpen,
87
- }: NoShippingPlaceholderProps ): ReactElement => {
88
- if ( ! showCalculator ) {
89
- return (
90
- <em>
91
- { __(
92
- 'Calculated during checkout',
93
- 'woo-gutenberg-products-block'
94
- ) }
95
- </em>
96
- );
97
- }
98
-
99
- return (
100
- <CalculatorButton
101
- isShippingCalculatorOpen={ isShippingCalculatorOpen }
102
- setIsShippingCalculatorOpen={ setIsShippingCalculatorOpen }
103
- />
104
- );
105
- };
106
-
107
- interface TotalShippingProps {
108
- currency: Currency;
109
- values: {
110
- // eslint-disable-next-line camelcase
111
- total_shipping: string;
112
- // eslint-disable-next-line camelcase
113
- total_shipping_tax: string;
114
- }; // Values in use
115
- showCalculator?: boolean; //Whether to display the rate selector below the shipping total.
116
- showRateSelector?: boolean; // Whether to show shipping calculator or not.
117
- className?: string;
118
- }
119
-
120
- const TotalsShipping = ( {
121
- currency,
122
- values,
123
- showCalculator = true,
124
- showRateSelector = true,
125
- className,
126
- }: TotalShippingProps ): ReactElement => {
127
- const [ isShippingCalculatorOpen, setIsShippingCalculatorOpen ] = useState(
128
- false
129
- );
130
- const {
131
- shippingAddress,
132
- cartHasCalculatedShipping,
133
- shippingRates,
134
- shippingRatesLoading,
135
- } = useStoreCart();
136
-
137
- const totalShippingValue = getSetting(
138
- 'displayCartPricesIncludingTax',
139
- false
140
- )
141
- ? parseInt( values.total_shipping, 10 ) +
142
- parseInt( values.total_shipping_tax, 10 )
143
- : parseInt( values.total_shipping, 10 );
144
- const hasRates = hasShippingRate( shippingRates ) || totalShippingValue;
145
- const calculatorButtonProps = {
146
- isShippingCalculatorOpen,
147
- setIsShippingCalculatorOpen,
148
- };
149
-
150
- const selectedShippingRates = shippingRates.flatMap(
151
- ( shippingPackage ) => {
152
- return shippingPackage.shipping_rates
153
- .filter( ( rate ) => rate.selected )
154
- .flatMap( ( rate ) => rate.name );
155
- }
156
- );
157
-
158
- return (
159
- <div
160
- className={ classnames(
161
- 'wc-block-components-totals-shipping',
162
- className
163
- ) }
164
- >
165
- <TotalsItem
166
- label={ __( 'Shipping', 'woo-gutenberg-products-block' ) }
167
- value={
168
- cartHasCalculatedShipping ? (
169
- totalShippingValue
170
- ) : (
171
- <NoShippingPlaceholder
172
- showCalculator={ showCalculator }
173
- { ...calculatorButtonProps }
174
- />
175
- )
176
- }
177
- description={
178
- <>
179
- { cartHasCalculatedShipping && (
180
- <>
181
- <ShippingVia
182
- selectedShippingRates={
183
- selectedShippingRates
184
- }
185
- />
186
- <ShippingAddress
187
- shippingAddress={ shippingAddress }
188
- showCalculator={ showCalculator }
189
- { ...calculatorButtonProps }
190
- />
191
- </>
192
- ) }
193
- </>
194
- }
195
- currency={ currency }
196
- />
197
- { showCalculator && isShippingCalculatorOpen && (
198
- <ShippingCalculator
199
- onUpdate={ () => {
200
- setIsShippingCalculatorOpen( false );
201
- } }
202
- />
203
- ) }
204
- { showRateSelector && cartHasCalculatedShipping && (
205
- <ShippingRateSelector
206
- hasRates={ hasRates }
207
- shippingRates={ shippingRates }
208
- shippingRatesLoading={ shippingRatesLoading }
209
- />
210
- ) }
211
- </div>
212
- );
213
- };
214
-
215
- export default TotalsShipping;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
assets/js/base/components/cart-checkout/totals/shipping/shipping-rate-selector.js DELETED
@@ -1,48 +0,0 @@
1
- /**
2
- * External dependencies
3
- */
4
- import { __ } from '@wordpress/i18n';
5
- import { Notice } from 'wordpress-components';
6
- import classnames from 'classnames';
7
-
8
- /**
9
- * Internal dependencies
10
- */
11
- import ShippingRatesControl from '../../shipping-rates-control';
12
-
13
- const ShippingRateSelector = ( {
14
- hasRates,
15
- shippingRates,
16
- shippingRatesLoading,
17
- } ) => {
18
- const legend = hasRates
19
- ? __( 'Shipping options', 'woo-gutenberg-products-block' )
20
- : __( 'Choose a shipping option', 'woo-gutenberg-products-block' );
21
- return (
22
- <fieldset className="wc-block-components-totals-shipping__fieldset">
23
- <legend className="screen-reader-text">{ legend }</legend>
24
- <ShippingRatesControl
25
- className="wc-block-components-totals-shipping__options"
26
- collapsible={ true }
27
- noResultsMessage={
28
- <Notice
29
- isDismissible={ false }
30
- className={ classnames(
31
- 'wc-block-components-shipping-rates-control__no-results-notice',
32
- 'woocommerce-error'
33
- ) }
34
- >
35
- { __(
36
- 'No shipping options were found.',
37
- 'woo-gutenberg-products-block'
38
- ) }
39
- </Notice>
40
- }
41
- shippingRates={ shippingRates }
42
- shippingRatesLoading={ shippingRatesLoading }
43
- />
44
- </fieldset>
45
- );
46
- };
47
-
48
- export default ShippingRateSelector;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
assets/js/base/components/cart-checkout/totals/shipping/shipping-via.tsx DELETED
@@ -1,17 +0,0 @@
1
- /**
2
- * External dependencies
3
- */
4
- import { __ } from '@wordpress/i18n';
5
-
6
- export const ShippingVia = ( {
7
- selectedShippingRates,
8
- }: {
9
- selectedShippingRates: string[];
10
- } ): JSX.Element => {
11
- return (
12
- <div className="wc-block-components-totals-item__description wc-block-components-totals-shipping__via">
13
- { __( 'via', 'woo-gutenberg-products-block' ) }{ ' ' }
14
- { selectedShippingRates.join( ', ' ) }
15
- </div>
16
- );
17
- };
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
assets/js/base/components/cart-checkout/totals/shipping/stories/index.js DELETED
@@ -1,35 +0,0 @@
1
- /**
2
- * External dependencies
3
- */
4
- import { boolean, text } from '@storybook/addon-knobs';
5
- import { currencyKnob } from '@woocommerce/knobs';
6
-
7
- /**
8
- * Internal dependencies
9
- */
10
- import TotalsShipping from '../';
11
-
12
- export default {
13
- title: 'WooCommerce Blocks/@blocks-checkout/TotalsShipping',
14
- component: TotalsShipping,
15
- };
16
-
17
- export const Default = () => {
18
- const currency = currencyKnob();
19
- const showCalculator = boolean( 'Show calculator', true );
20
- const showRateSelector = boolean( 'Show rate selector', true );
21
- const totalShipping = text( 'Total shipping', '1000' );
22
- const totalShippingTax = text( 'Total shipping tax', '200' );
23
-
24
- return (
25
- <TotalsShipping
26
- currency={ currency }
27
- showCalculator={ showCalculator }
28
- showRateSelector={ showRateSelector }
29
- values={ {
30
- total_shipping: totalShipping,
31
- total_shipping_tax: totalShippingTax,
32
- } }
33
- />
34
- );
35
- };
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
assets/js/base/components/cart-checkout/totals/subtotals-item/index.js ADDED
@@ -0,0 +1,39 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /**
2
+ * External dependencies
3
+ */
4
+ import { __ } from '@wordpress/i18n';
5
+ import { DISPLAY_CART_PRICES_INCLUDING_TAX } from '@woocommerce/block-settings';
6
+ import PropTypes from 'prop-types';
7
+
8
+ /**
9
+ * Internal dependencies
10
+ */
11
+ import TotalsItem from '../totals-item';
12
+
13
+ const SubtotalsItem = ( { currency, values } ) => {
14
+ const { total_items: totalItems, total_items_tax: totalItemsTax } = values;
15
+ const itemsValue = parseInt( totalItems, 10 );
16
+ const itemsTaxValue = parseInt( totalItemsTax, 10 );
17
+
18
+ return (
19
+ <TotalsItem
20
+ currency={ currency }
21
+ label={ __( 'Subtotal', 'woo-gutenberg-products-block' ) }
22
+ value={
23
+ DISPLAY_CART_PRICES_INCLUDING_TAX
24
+ ? itemsValue + itemsTaxValue
25
+ : itemsValue
26
+ }
27
+ />
28
+ );
29
+ };
30
+
31
+ SubtotalsItem.propTypes = {
32
+ currency: PropTypes.object.isRequired,
33
+ values: PropTypes.shape( {
34
+ total_items: PropTypes.string,
35
+ total_items_tax: PropTypes.string,
36
+ } ).isRequired,
37
+ };
38
+
39
+ export default SubtotalsItem;
assets/js/base/components/cart-checkout/totals/{coupon → totals-coupon-code-input}/index.js RENAMED
@@ -6,21 +6,19 @@ import { useState, useEffect, useRef } from '@wordpress/element';
6
  import Button from '@woocommerce/base-components/button';
7
  import { ValidatedTextInput } from '@woocommerce/base-components/text-input';
8
  import Label from '@woocommerce/base-components/label';
 
9
  import LoadingMask from '@woocommerce/base-components/loading-mask';
10
  import PropTypes from 'prop-types';
11
  import { withInstanceId } from '@woocommerce/base-hocs/with-instance-id';
12
- import {
13
- ValidationInputError,
14
- useValidationContext,
15
- } from '@woocommerce/base-context';
16
- import { Panel } from '@woocommerce/blocks-checkout';
17
 
18
  /**
19
  * Internal dependencies
20
  */
21
  import './style.scss';
22
 
23
- const TotalsCoupon = ( {
24
  instanceId,
25
  isLoading = false,
26
  initialOpen = false,
@@ -29,6 +27,7 @@ const TotalsCoupon = ( {
29
  const [ couponValue, setCouponValue ] = useState( '' );
30
  const currentIsLoading = useRef( false );
31
  const { getValidationError, getValidationErrorId } = useValidationContext();
 
32
  const validationError = getValidationError( 'coupon' );
33
 
34
  useEffect( () => {
@@ -45,21 +44,22 @@ const TotalsCoupon = ( {
45
  return (
46
  <Panel
47
  className="wc-block-components-totals-coupon"
48
- hasBorder={ false }
49
  initialOpen={ initialOpen }
50
  title={
51
  <Label
52
  label={ __(
53
- 'Coupon code',
54
  'woo-gutenberg-products-block'
55
  ) }
56
  screenReaderLabel={ __(
57
- 'Apply a coupon code',
58
  'woo-gutenberg-products-block'
59
  ) }
60
  htmlFor={ textInputId }
61
  />
62
  }
 
63
  >
64
  <LoadingMask
65
  screenReaderLabel={ __(
@@ -113,9 +113,9 @@ const TotalsCoupon = ( {
113
  );
114
  };
115
 
116
- TotalsCoupon.propTypes = {
117
  onSubmit: PropTypes.func,
118
  isLoading: PropTypes.bool,
119
  };
120
 
121
- export default withInstanceId( TotalsCoupon );
6
  import Button from '@woocommerce/base-components/button';
7
  import { ValidatedTextInput } from '@woocommerce/base-components/text-input';
8
  import Label from '@woocommerce/base-components/label';
9
+ import { ValidationInputError } from '@woocommerce/base-components/validation';
10
  import LoadingMask from '@woocommerce/base-components/loading-mask';
11
  import PropTypes from 'prop-types';
12
  import { withInstanceId } from '@woocommerce/base-hocs/with-instance-id';
13
+ import { useValidationContext } from '@woocommerce/base-context';
14
+ import Panel from '@woocommerce/base-components/panel';
 
 
 
15
 
16
  /**
17
  * Internal dependencies
18
  */
19
  import './style.scss';
20
 
21
+ const TotalsCouponCodeInput = ( {
22
  instanceId,
23
  isLoading = false,
24
  initialOpen = false,
27
  const [ couponValue, setCouponValue ] = useState( '' );
28
  const currentIsLoading = useRef( false );
29
  const { getValidationError, getValidationErrorId } = useValidationContext();
30
+
31
  const validationError = getValidationError( 'coupon' );
32
 
33
  useEffect( () => {
44
  return (
45
  <Panel
46
  className="wc-block-components-totals-coupon"
47
+ hasBorder={ true }
48
  initialOpen={ initialOpen }
49
  title={
50
  <Label
51
  label={ __(
52
+ 'Coupon Code?',
53
  'woo-gutenberg-products-block'
54
  ) }
55
  screenReaderLabel={ __(
56
+ 'Introduce Coupon Code',
57
  'woo-gutenberg-products-block'
58
  ) }
59
  htmlFor={ textInputId }
60
  />
61
  }
62
+ titleTag="h2"
63
  >
64
  <LoadingMask
65
  screenReaderLabel={ __(
113
  );
114
  };
115
 
116
+ TotalsCouponCodeInput.propTypes = {
117
  onSubmit: PropTypes.func,
118
  isLoading: PropTypes.bool,
119
  };
120
 
121
+ export default withInstanceId( TotalsCouponCodeInput );
assets/js/base/components/cart-checkout/totals/{coupon → totals-coupon-code-input}/stories/index.js RENAMED
@@ -10,12 +10,11 @@ import {
10
  /**
11
  * Internal dependencies
12
  */
13
- import TotalsCoupon from '../';
14
 
15
  export default {
16
- title:
17
- 'WooCommerce Blocks/@base-components/cart-checkout/totals/TotalsCoupon',
18
- component: TotalsCoupon,
19
  };
20
 
21
  const StoryComponent = ( { validCoupon, isLoading, invalidCouponText } ) => {
@@ -25,7 +24,7 @@ const StoryComponent = ( { validCoupon, isLoading, invalidCouponText } ) => {
25
  setValidationErrors( { coupon: invalidCouponText } );
26
  }
27
  };
28
- return <TotalsCoupon isLoading={ isLoading } onSubmit={ onSubmit } />;
29
  };
30
 
31
  export const Default = () => {
10
  /**
11
  * Internal dependencies
12
  */
13
+ import CouponInput from '../';
14
 
15
  export default {
16
+ title: 'WooCommerce Blocks/@base-components/CouponInput',
17
+ component: CouponInput,
 
18
  };
19
 
20
  const StoryComponent = ( { validCoupon, isLoading, invalidCouponText } ) => {
24
  setValidationErrors( { coupon: invalidCouponText } );
25
  }
26
  };
27
+ return <CouponInput isLoading={ isLoading } onSubmit={ onSubmit } />;
28
  };
29
 
30
  export const Default = () => {
assets/js/base/components/cart-checkout/totals/{coupon → totals-coupon-code-input}/style.scss RENAMED
@@ -1,19 +1,7 @@
1
- .wc-block-components-totals-coupon {
2
-
3
- .wc-block-components-panel__button {
4
- margin-top: 0;
5
- padding-top: 0;
6
- }
7
-
8
- .wc-block-components-panel__content {
9
- padding-bottom: 0;
10
- }
11
- }
12
-
13
  .wc-block-components-totals-coupon__form {
14
  display: flex;
15
- width: 100%;
16
  margin-bottom: 0;
 
17
 
18
  .wc-block-components-totals-coupon__input {
19
  margin-bottom: 0;
@@ -22,20 +10,22 @@
22
  }
23
 
24
  .wc-block-components-totals-coupon__button {
25
- height: em(48px);
26
  flex-shrink: 0;
27
  margin-left: $gap-smaller;
28
  padding-left: $gap-large;
29
  padding-right: $gap-large;
30
  white-space: nowrap;
31
  }
32
-
33
- .wc-block-components-totals-coupon__button.no-margin {
34
- margin: 0;
35
- }
36
  }
37
 
38
  .wc-block-components-totals-coupon__content {
39
  flex-direction: column;
40
  position: relative;
 
 
 
 
 
 
41
  }
 
 
 
 
 
 
 
 
 
 
 
 
1
  .wc-block-components-totals-coupon__form {
2
  display: flex;
 
3
  margin-bottom: 0;
4
+ width: 100%;
5
 
6
  .wc-block-components-totals-coupon__input {
7
  margin-bottom: 0;
10
  }
11
 
12
  .wc-block-components-totals-coupon__button {
13
+ height: 48px;
14
  flex-shrink: 0;
15
  margin-left: $gap-smaller;
16
  padding-left: $gap-large;
17
  padding-right: $gap-large;
18
  white-space: nowrap;
19
  }
 
 
 
 
20
  }
21
 
22
  .wc-block-components-totals-coupon__content {
23
  flex-direction: column;
24
  position: relative;
25
+
26
+ .wc-block-components-validation-error {
27
+ margin-top: $gap-smaller;
28
+ position: relative;
29
+ width: 100%;
30
+ }
31
  }
assets/js/base/components/cart-checkout/totals/{discount → totals-discount-item}/index.js RENAMED
@@ -2,21 +2,18 @@
2
  * External dependencies
3
  */
4
  import { __, sprintf } from '@wordpress/i18n';
 
5
  import LoadingMask from '@woocommerce/base-components/loading-mask';
6
  import { RemovableChip } from '@woocommerce/base-components/chip';
7
  import PropTypes from 'prop-types';
8
- import {
9
- __experimentalApplyCheckoutFilter,
10
- TotalsItem,
11
- } from '@woocommerce/blocks-checkout';
12
- import { getSetting } from '@woocommerce/settings';
13
 
14
  /**
15
  * Internal dependencies
16
  */
 
17
  import './style.scss';
18
 
19
- const TotalsDiscount = ( {
20
  cartCoupons = [],
21
  currency,
22
  isRemovingCoupon,
@@ -34,27 +31,16 @@ const TotalsDiscount = ( {
34
  }
35
 
36
  const discountTaxValue = parseInt( totalDiscountTax, 10 );
37
- const discountTotalValue = getSetting(
38
- 'displayCartPricesIncludingTax',
39
- false
40
- )
41
  ? discountValue + discountTaxValue
42
  : discountValue;
43
 
44
- const filteredCartCoupons = __experimentalApplyCheckoutFilter( {
45
- arg: {
46
- context: 'summary',
47
- },
48
- filterName: 'coupons',
49
- defaultValue: cartCoupons,
50
- } );
51
-
52
  return (
53
  <TotalsItem
54
  className="wc-block-components-totals-discount"
55
  currency={ currency }
56
  description={
57
- filteredCartCoupons.length !== 0 && (
58
  <LoadingMask
59
  screenReaderLabel={ __(
60
  'Removing coupon…',
@@ -64,36 +50,34 @@ const TotalsDiscount = ( {
64
  showSpinner={ false }
65
  >
66
  <ul className="wc-block-components-totals-discount__coupon-list">
67
- { filteredCartCoupons.map( ( cartCoupon ) => {
68
- return (
69
- <RemovableChip
70
- key={ 'coupon-' + cartCoupon.code }
71
- className="wc-block-components-totals-discount__coupon-list-item"
72
- text={ cartCoupon.label }
73
- screenReaderText={ sprintf(
74
- /* translators: %s Coupon code. */
75
- __(
76
- 'Coupon: %s',
77
- 'woo-gutenberg-products-block'
78
- ),
79
- cartCoupon.label
80
- ) }
81
- disabled={ isRemovingCoupon }
82
- onRemove={ () => {
83
- removeCoupon( cartCoupon.code );
84
- } }
85
- radius="large"
86
- ariaLabel={ sprintf(
87
- /* translators: %s is a coupon code. */
88
- __(
89
- 'Remove coupon "%s"',
90
- 'woo-gutenberg-products-block'
91
- ),
92
- cartCoupon.label
93
- ) }
94
- />
95
- );
96
- } ) }
97
  </ul>
98
  </LoadingMask>
99
  )
@@ -108,7 +92,7 @@ const TotalsDiscount = ( {
108
  );
109
  };
110
 
111
- TotalsDiscount.propTypes = {
112
  cartCoupons: PropTypes.arrayOf(
113
  PropTypes.shape( {
114
  code: PropTypes.string.isRequired,
@@ -123,4 +107,4 @@ TotalsDiscount.propTypes = {
123
  } ).isRequired,
124
  };
125
 
126
- export default TotalsDiscount;
2
  * External dependencies
3
  */
4
  import { __, sprintf } from '@wordpress/i18n';
5
+ import { DISPLAY_CART_PRICES_INCLUDING_TAX } from '@woocommerce/block-settings';
6
  import LoadingMask from '@woocommerce/base-components/loading-mask';
7
  import { RemovableChip } from '@woocommerce/base-components/chip';
8
  import PropTypes from 'prop-types';
 
 
 
 
 
9
 
10
  /**
11
  * Internal dependencies
12
  */
13
+ import TotalsItem from '../totals-item';
14
  import './style.scss';
15
 
16
+ const TotalsDiscountItem = ( {
17
  cartCoupons = [],
18
  currency,
19
  isRemovingCoupon,
31
  }
32
 
33
  const discountTaxValue = parseInt( totalDiscountTax, 10 );
34
+ const discountTotalValue = DISPLAY_CART_PRICES_INCLUDING_TAX
 
 
 
35
  ? discountValue + discountTaxValue
36
  : discountValue;
37
 
 
 
 
 
 
 
 
 
38
  return (
39
  <TotalsItem
40
  className="wc-block-components-totals-discount"
41
  currency={ currency }
42
  description={
43
+ cartCoupons.length !== 0 && (
44
  <LoadingMask
45
  screenReaderLabel={ __(
46
  'Removing coupon…',
50
  showSpinner={ false }
51
  >
52
  <ul className="wc-block-components-totals-discount__coupon-list">
53
+ { cartCoupons.map( ( cartCoupon ) => (
54
+ <RemovableChip
55
+ key={ 'coupon-' + cartCoupon.code }
56
+ className="wc-block-components-totals-discount__coupon-list-item"
57
+ text={ cartCoupon.code }
58
+ screenReaderText={ sprintf(
59
+ /* Translators: %s Coupon code. */
60
+ __(
61
+ 'Coupon: %s',
62
+ 'woo-gutenberg-products-block'
63
+ ),
64
+ cartCoupon.code
65
+ ) }
66
+ disabled={ isRemovingCoupon }
67
+ onRemove={ () => {
68
+ removeCoupon( cartCoupon.code );
69
+ } }
70
+ radius="large"
71
+ ariaLabel={ sprintf(
72
+ /* Translators: %s is a coupon code. */
73
+ __(
74
+ 'Remove coupon "%s"',
75
+ 'woo-gutenberg-products-block'
76
+ ),
77
+ cartCoupon.code
78
+ ) }
79
+ />
80
+ ) ) }
 
 
81
  </ul>
82
  </LoadingMask>
83
  )
92
  );
93
  };
94
 
95
+ TotalsDiscountItem.propTypes = {
96
  cartCoupons: PropTypes.arrayOf(
97
  PropTypes.shape( {
98
  code: PropTypes.string.isRequired,
107
  } ).isRequired,
108
  };
109
 
110
+ export default TotalsDiscountItem;
assets/js/base/components/cart-checkout/totals/totals-discount-item/style.scss ADDED
@@ -0,0 +1,5 @@
 
 
 
 
 
1
+ .wc-block-components-totals-discount__coupon-list {
2
+ list-style: none;
3
+ margin: 0;
4
+ padding: 0;
5
+ }
assets/js/base/components/cart-checkout/totals/totals-fees-item/index.js ADDED
@@ -0,0 +1,50 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /**
2
+ * External dependencies
3
+ */
4
+ import { __ } from '@wordpress/i18n';
5
+ import { DISPLAY_CART_PRICES_INCLUDING_TAX } from '@woocommerce/block-settings';
6
+ import { useShippingDataContext } from '@woocommerce/base-context';
7
+ import PropTypes from 'prop-types';
8
+
9
+ /**
10
+ * Internal dependencies
11
+ */
12
+ import TotalsItem from '../totals-item';
13
+
14
+ const TotalsFeesItem = ( { currency, values } ) => {
15
+ const { needsShipping } = useShippingDataContext();
16
+ if ( ! needsShipping ) {
17
+ return null;
18
+ }
19
+ const { total_fees: totalFees, total_fees_tax: totalFeesTax } = values;
20
+ const feesValue = parseInt( totalFees, 10 );
21
+
22
+ if ( ! feesValue ) {
23
+ return null;
24
+ }
25
+
26
+ const feesTaxValue = parseInt( totalFeesTax, 10 );
27
+
28
+ return (
29
+ <TotalsItem
30
+ className="wc-block-components-totals-fees"
31
+ currency={ currency }
32
+ label={ __( 'Fees', 'woo-gutenberg-products-block' ) }
33
+ value={
34
+ DISPLAY_CART_PRICES_INCLUDING_TAX
35
+ ? feesValue + feesTaxValue
36
+ : feesValue
37
+ }
38
+ />
39
+ );
40
+ };
41
+
42
+ TotalsFeesItem.propTypes = {
43
+ currency: PropTypes.object.isRequired,
44
+ values: PropTypes.shape( {
45
+ total_fees: PropTypes.string,
46
+ total_fees_tax: PropTypes.string,
47
+ } ).isRequired,
48
+ };
49
+
50
+ export default TotalsFeesItem;
assets/js/base/components/cart-checkout/totals/{footer-item → totals-footer-item}/index.js RENAMED
@@ -2,52 +2,30 @@
2
  * External dependencies
3
  */
4
  import { __ } from '@wordpress/i18n';
5
- import { createInterpolateElement } from 'wordpress-element';
 
6
  import FormattedMonetaryAmount from '@woocommerce/base-components/formatted-monetary-amount';
7
  import PropTypes from 'prop-types';
8
- import {
9
- __experimentalApplyCheckoutFilter,
10
- TotalsItem,
11
- } from '@woocommerce/blocks-checkout';
12
- import { useStoreCart } from '@woocommerce/base-context/hooks';
13
- import { getSetting } from '@woocommerce/settings';
14
 
15
  /**
16
  * Internal dependencies
17
  */
 
18
  import './style.scss';
19
 
20
  const TotalsFooterItem = ( { currency, values } ) => {
21
- const SHOW_TAXES =
22
- getSetting( 'taxesEnabled', true ) &&
23
- getSetting( 'displayCartPricesIncludingTax', false );
24
-
25
  const { total_price: totalPrice, total_tax: totalTax } = values;
26
 
27
- // Prepare props to pass to the __experimentalApplyCheckoutFilter filter.
28
- // We need to pluck out receiveCart.
29
- // eslint-disable-next-line no-unused-vars
30
- const { receiveCart, ...cart } = useStoreCart();
31
- const label = __experimentalApplyCheckoutFilter( {
32
- filterName: 'totalLabel',
33
- defaultValue: __( 'Total', 'woo-gutenberg-products-block' ),
34
- extensions: cart.extensions,
35
- arg: { cart },
36
- } );
37
-
38
- const parsedTaxValue = parseInt( totalTax, 10 );
39
-
40
  return (
41
  <TotalsItem
42
  className="wc-block-components-totals-footer-item"
43
  currency={ currency }
44
- label={ label }
45
  value={ parseInt( totalPrice, 10 ) }
46
  description={
47
- SHOW_TAXES &&
48
- parsedTaxValue !== 0 && (
49
  <p className="wc-block-components-totals-footer-item-tax">
50
- { createInterpolateElement(
51
  __(
52
  'Including <TaxAmount/> in taxes',
53
  'woo-gutenberg-products-block'
@@ -57,7 +35,8 @@ const TotalsFooterItem = ( { currency, values } ) => {
57
  <FormattedMonetaryAmount
58
  className="wc-block-components-totals-footer-item-tax-value"
59
  currency={ currency }
60
- value={ parsedTaxValue }
 
61
  />
62
  ),
63
  }
2
  * External dependencies
3
  */
4
  import { __ } from '@wordpress/i18n';
5
+ import { DISPLAY_CART_PRICES_INCLUDING_TAX } from '@woocommerce/block-settings';
6
+ import { __experimentalCreateInterpolateElement } from 'wordpress-element';
7
  import FormattedMonetaryAmount from '@woocommerce/base-components/formatted-monetary-amount';
8
  import PropTypes from 'prop-types';
 
 
 
 
 
 
9
 
10
  /**
11
  * Internal dependencies
12
  */
13
+ import TotalsItem from '../totals-item';
14
  import './style.scss';
15
 
16
  const TotalsFooterItem = ( { currency, values } ) => {
 
 
 
 
17
  const { total_price: totalPrice, total_tax: totalTax } = values;
18
 
 
 
 
 
 
 
 
 
 
 
 
 
 
19
  return (
20
  <TotalsItem
21
  className="wc-block-components-totals-footer-item"
22
  currency={ currency }
23
+ label={ __( 'Total', 'woo-gutenberg-products-block' ) }
24
  value={ parseInt( totalPrice, 10 ) }
25
  description={
26
+ DISPLAY_CART_PRICES_INCLUDING_TAX && (
 
27
  <p className="wc-block-components-totals-footer-item-tax">
28
+ { __experimentalCreateInterpolateElement(
29
  __(
30
  'Including <TaxAmount/> in taxes',
31
  'woo-gutenberg-products-block'
35
  <FormattedMonetaryAmount
36
  className="wc-block-components-totals-footer-item-tax-value"
37
  currency={ currency }
38
+ displayType="text"
39
+ value={ parseInt( totalTax, 10 ) }
40
  />
41
  ),
42
  }
assets/js/base/components/cart-checkout/totals/{footer-item → totals-footer-item}/style.scss RENAMED
@@ -5,7 +5,7 @@
5
  }
6
 
7
  .wc-block-components-totals-item__label {
8
- font-weight: 700;
9
  }
10
 
11
  .wc-block-components-totals-footer-item-tax {
5
  }
6
 
7
  .wc-block-components-totals-item__label {
8
+ font-weight: normal;
9
  }
10
 
11
  .wc-block-components-totals-footer-item-tax {
assets/js/base/components/cart-checkout/totals/totals-item/index.js ADDED
@@ -0,0 +1,52 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /**
2
+ * External dependencies
3
+ */
4
+ import PropTypes from 'prop-types';
5
+ import classnames from 'classnames';
6
+ import { isValidElement } from '@wordpress/element';
7
+ import FormattedMonetaryAmount from '@woocommerce/base-components/formatted-monetary-amount';
8
+
9
+ /**
10
+ * Internal dependencies
11
+ */
12
+ import './style.scss';
13
+
14
+ const TotalsItem = ( { className, currency, label, value, description } ) => {
15
+ return (
16
+ <div
17
+ className={ classnames(
18
+ 'wc-block-components-totals-item',
19
+ className
20
+ ) }
21
+ >
22
+ <span className="wc-block-components-totals-item__label">
23
+ { label }
24
+ </span>
25
+ { isValidElement( value ) ? (
26
+ <div className="wc-block-components-totals-item__value">
27
+ { value }
28
+ </div>
29
+ ) : (
30
+ <FormattedMonetaryAmount
31
+ className="wc-block-components-totals-item__value"
32
+ currency={ currency }
33
+ displayType="text"
34
+ value={ value }
35
+ />
36
+ ) }
37
+ <div className="wc-block-components-totals-item__description">
38
+ { description }
39
+ </div>
40
+ </div>
41
+ );
42
+ };
43
+
44
+ TotalsItem.propTypes = {
45
+ currency: PropTypes.object,
46
+ label: PropTypes.string.isRequired,
47
+ value: PropTypes.oneOfType( [ PropTypes.number, PropTypes.node ] ),
48
+ className: PropTypes.string,
49
+ description: PropTypes.node,
50
+ };
51
+
52
+ export default TotalsItem;
{packages/checkout/totals/item → assets/js/base/components/cart-checkout/totals/totals-item}/style.scss RENAMED
@@ -1,20 +1,16 @@
1
  .wc-block-components-totals-item {
2
  display: flex;
3
  flex-wrap: wrap;
4
- margin: em($gap-small) 0 0;
5
  width: 100%;
6
-
7
- &:first-child {
8
- margin-top: 0;
9
- }
10
  }
11
 
12
  .wc-block-components-totals-item__label {
13
  flex-grow: 1;
 
14
  }
15
 
16
  .wc-block-components-totals-item__value {
17
- font-weight: bold;
18
  white-space: nowrap;
19
  }
20
 
1
  .wc-block-components-totals-item {
2
  display: flex;
3
  flex-wrap: wrap;
4
+ padding: em($gap-small) 0;
5
  width: 100%;
 
 
 
 
6
  }
7
 
8
  .wc-block-components-totals-item__label {
9
  flex-grow: 1;
10
+ font-weight: bold;
11
  }
12
 
13
  .wc-block-components-totals-item__value {
 
14
  white-space: nowrap;
15
  }
16
 
assets/js/base/components/cart-checkout/totals/{shipping → totals-shipping-item}/has-shipping-rate.js RENAMED
@@ -6,9 +6,7 @@
6
  * @return {boolean} True if a rate exists.
7
  */
8
  const hasShippingRate = ( shippingRatePackages ) => {
9
- return shippingRatePackages.some(
10
- ( shippingRatePackage ) => shippingRatePackage.shipping_rates.length
11
- );
12
  };
13
 
14
  export default hasShippingRate;
6
  * @return {boolean} True if a rate exists.
7
  */
8
  const hasShippingRate = ( shippingRatePackages ) => {
9
+ return shippingRatePackages.some( shippingRatePackage => shippingRatePackage.shipping_rates.length );
 
 
10
  };
11
 
12
  export default hasShippingRate;
assets/js/base/components/cart-checkout/totals/totals-shipping-item/index.js ADDED
@@ -0,0 +1,148 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /**
2
+ * External dependencies
3
+ */
4
+ import { __ } from '@wordpress/i18n';
5
+ import { DISPLAY_CART_PRICES_INCLUDING_TAX } from '@woocommerce/block-settings';
6
+ import {
7
+ ShippingCalculator,
8
+ ShippingLocation,
9
+ } from '@woocommerce/base-components/cart-checkout';
10
+ import PropTypes from 'prop-types';
11
+ import { useState } from '@wordpress/element';
12
+ import { useStoreCart } from '@woocommerce/base-hooks';
13
+
14
+ /**
15
+ * Internal dependencies
16
+ */
17
+ import TotalsItem from '../totals-item';
18
+ import ShippingRateSelector from './shipping-rate-selector';
19
+ import hasShippingRate from './has-shipping-rate';
20
+ import './style.scss';
21
+
22
+ /**
23
+ * Renders the shipping totals row, rates, and calculator if enabled.
24
+ */
25
+ const TotalsShippingItem = ( {
26
+ currency,
27
+ values,
28
+ isCheckout = false,
29
+ showCalculator = true,
30
+ showRatesWithoutAddress = false,
31
+ } ) => {
32
+ const [ isShippingCalculatorOpen, setIsShippingCalculatorOpen ] = useState(
33
+ false
34
+ );
35
+ const {
36
+ shippingRates,
37
+ shippingRatesLoading,
38
+ hasShippingAddress,
39
+ shippingAddress,
40
+ } = useStoreCart();
41
+ const totalShippingValue = DISPLAY_CART_PRICES_INCLUDING_TAX
42
+ ? parseInt( values.total_shipping, 10 ) +
43
+ parseInt( values.total_shipping_tax, 10 )
44
+ : parseInt( values.total_shipping, 10 );
45
+ const hasRates = hasShippingRate( shippingRates ) || totalShippingValue;
46
+ const showingRates = showRatesWithoutAddress || hasShippingAddress;
47
+
48
+ // If we have no rates, and an address is needed.
49
+ if ( ! hasRates && ! hasShippingAddress && ! isCheckout ) {
50
+ return (
51
+ <>
52
+ <TotalsItem
53
+ className="wc-block-components-totals-shipping"
54
+ label={ __( 'Shipping', 'woo-gutenberg-products-block' ) }
55
+ value={
56
+ showCalculator ? (
57
+ <button
58
+ className="wc-block-components-totals-shipping__change-address-button"
59
+ onClick={ () => {
60
+ setIsShippingCalculatorOpen(
61
+ ! isShippingCalculatorOpen
62
+ );
63
+ } }
64
+ >
65
+ { __(
66
+ 'Calculate',
67
+ 'woo-gutenberg-products-block'
68
+ ) }
69
+ </button>
70
+ ) : (
71
+ <em>
72
+ { __(
73
+ 'Calculated during checkout',
74
+ 'woo-gutenberg-products-block'
75
+ ) }
76
+ </em>
77
+ )
78
+ }
79
+ />
80
+ { showCalculator && isShippingCalculatorOpen && (
81
+ <ShippingCalculator
82
+ onUpdate={ () => {
83
+ setIsShippingCalculatorOpen( false );
84
+ } }
85
+ />
86
+ ) }
87
+ </>
88
+ );
89
+ }
90
+
91
+ return (
92
+ <div className="wc-block-components-totals-shipping">
93
+ <TotalsItem
94
+ label={ __( 'Shipping', 'woo-gutenberg-products-block' ) }
95
+ value={ totalShippingValue ? totalShippingValue : '' }
96
+ description={
97
+ <>
98
+ <ShippingLocation address={ shippingAddress } />{ ' ' }
99
+ { showCalculator && (
100
+ <button
101
+ className="wc-block-components-totals-shipping__change-address-button"
102
+ onClick={ () => {
103
+ setIsShippingCalculatorOpen(
104
+ ! isShippingCalculatorOpen
105
+ );
106
+ } }
107
+ aria-expanded={ isShippingCalculatorOpen }
108
+ >
109
+ { __(
110
+ '(change address)',
111
+ 'woo-gutenberg-products-block'
112
+ ) }
113
+ </button>
114
+ ) }
115
+ </>
116
+ }
117
+ currency={ currency }
118
+ />
119
+ { showCalculator && isShippingCalculatorOpen && (
120
+ <ShippingCalculator
121
+ onUpdate={ () => {
122
+ setIsShippingCalculatorOpen( false );
123
+ } }
124
+ />
125
+ ) }
126
+ { ! isCheckout && showingRates && (
127
+ <ShippingRateSelector
128
+ hasRates={ hasRates }
129
+ shippingRates={ shippingRates }
130
+ shippingRatesLoading={ shippingRatesLoading }
131
+ />
132
+ ) }
133
+ </div>
134
+ );
135
+ };
136
+
137
+ TotalsShippingItem.propTypes = {
138
+ currency: PropTypes.object.isRequired,
139
+ values: PropTypes.shape( {
140
+ total_shipping: PropTypes.string,
141
+ total_shipping_tax: PropTypes.string,
142
+ } ).isRequired,
143
+ isCheckout: PropTypes.bool,
144
+ showCalculator: PropTypes.bool,
145
+ showRatesWithoutAddress: PropTypes.bool,
146
+ };
147
+
148
+ export default TotalsShippingItem;
assets/js/base/components/cart-checkout/totals/totals-shipping-item/shipping-rate-selector.js ADDED
@@ -0,0 +1,65 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /**
2
+ * External dependencies
3
+ */
4
+ import { __ } from '@wordpress/i18n';
5
+ import FormattedMonetaryAmount from '@woocommerce/base-components/formatted-monetary-amount';
6
+ import { decodeEntities } from '@wordpress/html-entities';
7
+ import { getCurrencyFromPriceResponse } from '@woocommerce/base-utils';
8
+ import { ShippingRatesControl } from '@woocommerce/base-components/cart-checkout';
9
+ import { DISPLAY_CART_PRICES_INCLUDING_TAX } from '@woocommerce/block-settings';
10
+
11
+ const renderShippingRatesControlOption = ( option ) => {
12
+ const priceWithTaxes = DISPLAY_CART_PRICES_INCLUDING_TAX
13
+ ? parseInt( option.price, 10 ) + parseInt( option.taxes, 10 )
14
+ : parseInt( option.price, 10 );
15
+ return {
16
+ label: decodeEntities( option.name ),
17
+ value: option.rate_id,
18
+ description: (
19
+ <>
20
+ { Number.isFinite( priceWithTaxes ) && (
21
+ <FormattedMonetaryAmount
22
+ currency={ getCurrencyFromPriceResponse( option ) }
23
+ value={ priceWithTaxes }
24
+ />
25
+ ) }
26
+ { Number.isFinite( priceWithTaxes ) && option.delivery_time
27
+ ? ' — '
28
+ : null }
29
+ { decodeEntities( option.delivery_time ) }
30
+ </>
31
+ ),
32
+ };
33
+ };
34
+
35
+ const ShippingRateSelector = ( {
36
+ hasRates,
37
+ shippingRates,
38
+ shippingRatesLoading,
39
+ } ) => {
40
+ return (
41
+ <fieldset className="wc-block-components-totals-shipping__fieldset">
42
+ <legend className="screen-reader-text">
43
+ { hasRates
44
+ ? __( 'Shipping options', 'woo-gutenberg-products-block' )
45
+ : __(
46
+ 'Choose a shipping option',
47
+ 'woo-gutenberg-products-block'
48
+ ) }
49
+ </legend>
50
+ <ShippingRatesControl
51
+ className="wc-block-components-totals-shipping__options"
52
+ collapsibleWhenMultiple={ true }
53
+ noResultsMessage={ __(
54
+ 'No shipping options were found.',
55
+ 'woo-gutenberg-products-block'
56
+ ) }
57
+ renderOption={ renderShippingRatesControlOption }
58
+ shippingRates={ shippingRates }
59
+ shippingRatesLoading={ shippingRatesLoading }
60
+ />
61
+ </fieldset>
62
+ );
63
+ };
64
+
65
+ export default ShippingRateSelector;
assets/js/base/components/cart-checkout/totals/{shipping → totals-shipping-item}/style.scss RENAMED
@@ -7,10 +7,6 @@
7
  border: 0;
8
  }
9
 
10
- .wc-block-components-totals-shipping__via {
11
- margin-bottom: $gap;
12
- }
13
-
14
  .wc-block-components-totals-shipping__options {
15
  .wc-block-components-radio-control__label,
16
  .wc-block-components-radio-control__description,
@@ -21,8 +17,15 @@
21
  }
22
  }
23
 
 
 
 
 
 
 
 
24
  .wc-block-components-shipping-rates-control__no-results-notice {
25
- margin: 0 0 em($gap-small);
26
  }
27
 
28
  .wc-block-components-totals-shipping__change-address-button {
@@ -34,9 +37,8 @@
34
  opacity: 0.8;
35
  }
36
  }
37
- }
38
 
39
- // Extra classes for specificity.
40
- .theme-twentytwentyone.theme-twentytwentyone.theme-twentytwentyone .wc-block-components-totals-shipping__change-address-button {
41
- @include link-button();
42
  }
7
  border: 0;
8
  }
9
 
 
 
 
 
10
  .wc-block-components-totals-shipping__options {
11
  .wc-block-components-radio-control__label,
12
  .wc-block-components-radio-control__description,
17
  }
18
  }
19
 
20
+ .wc-block-components-radio-control__option,
21
+ .wc-block-components-radio-control__option-layout {
22
+ &:last-child::after {
23
+ display: none;
24
+ }
25
+ }
26
+
27
  .wc-block-components-shipping-rates-control__no-results-notice {
28
+ margin-bottom: em($gap-small);
29
  }
30
 
31
  .wc-block-components-totals-shipping__change-address-button {
37
  opacity: 0.8;
38
  }
39
  }
 
40
 
41
+ .wc-blocks-components-panel:last-child::after {
42
+ border-bottom-width: 0;
43
+ }
44
  }
assets/js/base/components/cart-checkout/totals/totals-taxes-item/index.js ADDED
@@ -0,0 +1,57 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /**
2
+ * External dependencies
3
+ */
4
+ import { __ } from '@wordpress/i18n';
5
+ import PropTypes from 'prop-types';
6
+ import {
7
+ TAXES_ENABLED,
8
+ DISPLAY_ITEMIZED_TAXES,
9
+ } from '@woocommerce/block-settings';
10
+
11
+ /**
12
+ * Internal dependencies
13
+ */
14
+ import TotalsItem from '../totals-item';
15
+ import './style.scss';
16
+
17
+ const TotalsTaxesItem = ( { currency, values } ) => {
18
+ const { total_tax: totalTax, tax_lines: taxLines } = values;
19
+
20
+ if ( ! TAXES_ENABLED ) {
21
+ return null;
22
+ }
23
+
24
+ if ( ! DISPLAY_ITEMIZED_TAXES ) {
25
+ return (
26
+ <TotalsItem
27
+ className="wc-block-components-totals-taxes"
28
+ currency={ currency }
29
+ label={ __( 'Taxes', 'woo-gutenberg-products-block' ) }
30
+ value={ parseInt( totalTax, 10 ) }
31
+ />
32
+ );
33
+ }
34
+
35
+ return (
36
+ <>
37
+ { taxLines.map( ( { name, price }, i ) => (
38
+ <TotalsItem
39
+ key={ `tax-line-${ i }` }
40
+ className="wc-block-components-totals-taxes"
41
+ currency={ currency }
42
+ label={ name }
43
+ value={ parseInt( price, 10 ) }
44
+ />
45
+ ) ) }{ ' ' }
46
+ </>
47
+ );
48
+ };
49
+
50
+ TotalsTaxesItem.propTypes = {
51
+ currency: PropTypes.object.isRequired,
52
+ values: PropTypes.shape( {
53
+ total_tax: PropTypes.string,
54
+ } ).isRequired,
55
+ };
56
+
57
+ export default TotalsTaxesItem;
assets/js/base/components/cart-checkout/totals/totals-taxes-item/style.scss ADDED
@@ -0,0 +1,3 @@
 
 
 
1
+ .wc-block-components-totals-taxes {
2
+ @include with-translucent-border(1px 0 0);
3
+ }
assets/js/base/components/checkbox-control/index.js CHANGED
@@ -12,14 +12,6 @@ import './style.scss';
12
 
13
  /**
14
  * Component used to show a checkbox control with styles.
15
- *
16
- * @param {Object} props Incoming props for the component.
17
- * @param {string} props.className CSS class used.
18
- * @param {string} props.label Label for component.
19
- * @param {string} props.id Id for component.
20
- * @param {string} props.instanceId Unique id for instance of component.
21
- * @param {function():any} props.onChange Function called when input changes.
22
- * @param {Object} props.rest Rest of properties spread.
23
  */
24
  const CheckboxControl = ( {
25
  className,
@@ -46,15 +38,6 @@ const CheckboxControl = ( {
46
  onChange={ ( event ) => onChange( event.target.checked ) }
47
  { ...rest }
48
  />
49
- <svg
50
- className="wc-block-components-checkbox__mark"
51
- aria-hidden="true"
52
- xmlns="http://www.w3.org/2000/svg"
53
- viewBox="0 0 24 20"
54
- >
55
- <path d="M9 16.2L4.8 12l-1.4 1.4L9 19 21 7l-1.4-1.4L9 16.2z" />
56
- </svg>
57
-
58
  <span className="wc-block-components-checkbox__label">
59
  { label }
60
  </span>
12
 
13
  /**
14
  * Component used to show a checkbox control with styles.
 
 
 
 
 
 
 
 
15
  */
16
  const CheckboxControl = ( {
17
  className,
38
  onChange={ ( event ) => onChange( event.target.checked ) }
39
  { ...rest }
40
  />
 
 
 
 
 
 
 
 
 
41
  <span className="wc-block-components-checkbox__label">
42
  { label }
43
  </span>
assets/js/base/components/checkbox-control/stories/index.js DELETED
@@ -1,27 +0,0 @@
1
- /**
2
- * External dependencies
3
- */
4
- import { text } from '@storybook/addon-knobs';
5
- import { useState } from 'react';
6
-
7
- /**
8
- * Internal dependencies
9
- */
10
- import CheckboxControl from '../';
11
-
12
- export default {
13
- title: 'WooCommerce Blocks/@base-components/CheckboxControl',
14
- component: CheckboxControl,
15
- };
16
-
17
- export const Default = () => {
18
- const [ checked, setChecked ] = useState( false );
19
-
20
- return (
21
- <CheckboxControl
22
- label={ text( 'Label', 'Yes please' ) }
23
- checked={ checked }
24
- onChange={ ( value ) => setChecked( value ) }
25
- />
26
- );
27
- };
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
assets/js/base/components/checkbox-control/style.scss CHANGED
@@ -1,93 +1,41 @@
1
  .wc-block-components-checkbox {
2
  @include reset-typography();
3
- align-items: center;
4
- display: flex;
5
- height: 1em;
6
  position: relative;
7
 
8
  .wc-block-components-checkbox__input[type="checkbox"] {
9
- font-size: 1em;
10
  appearance: none;
11
- border: 2px solid $input-border-gray;
12
- border-radius: 2px;
13
- height: em(24px);
14
- width: em(24px);
15
  margin: 0;
16
- min-height: 24px;
17
- min-width: 24px;
18
  overflow: hidden;
19
  position: static;
20
  vertical-align: middle;
21
- background-color: #fff;
22
 
23
  &:checked {
24
- background: #fff;
25
- border-color: $input-border-gray;
26
- }
27
-
28
- &::before,
29
- &::after {
30
- content: "";
31
- }
32
-
33
- &:not(:checked) + .wc-block-components-checkbox__mark {
34
- display: none;
35
- }
36
-
37
- .has-dark-controls & {
38
- border-color: $controls-border-dark;
39
- background-color: $input-background-dark;
40
-
41
- &:checked {
42
- background: $input-background-dark;
43
- border-color: $controls-border-dark;
44
  }
45
  }
46
  }
47
 
48
- .wc-block-components-checkbox__mark {
49
- fill: #000;
50
- position: absolute;
51
- left: em(3px);
52
- top: em(-2px);
53
- width: em(18px);
54
- height: em(18px);
55
-
56
- .has-dark-controls & {
57
- fill: #fff;
58
- }
59
- }
60
-
61
- .wc-block-components-checkbox__label {
62
- padding-left: $gap;
63
  vertical-align: middle;
64
  }
65
  }
66
-
67
- // Hack to hide the check mark in IE11
68
- // See comment: https://github.com/woocommerce/woocommerce-gutenberg-products-block/pull/2320/#issuecomment-621936576
69
- @include ie11() {
70
- .wc-block-components-checkbox__mark {
71
- display: none;
72
- }
73
- }
74
-
75
- .theme-twentytwentyone {
76
- .wc-block-components-checkbox__input[type="checkbox"],
77
- .has-dark-controls .wc-block-components-checkbox__input[type="checkbox"] {
78
- background-color: #fff;
79
- border-color: var(--form--border-color);
80
- position: relative;
81
- }
82
-
83
- .wc-block-components-checkbox__input[type="checkbox"]:checked,
84
- .has-dark-controls
85
- .wc-block-components-checkbox__input[type="checkbox"]:checked {
86
- background-color: #fff;
87
- border-color: var(--form--border-color);
88
- }
89
-
90
- .wc-block-components-checkbox__mark {
91
- display: none;
92
- }
93
- }
1
  .wc-block-components-checkbox {
2
  @include reset-typography();
3
+ display: block;
 
 
4
  position: relative;
5
 
6
  .wc-block-components-checkbox__input[type="checkbox"] {
 
7
  appearance: none;
8
+ border: 1px solid currentColor;
9
+ height: 1rem;
 
 
10
  margin: 0;
11
+ min-height: 16px;
12
+ min-width: 16px;
13
  overflow: hidden;
14
  position: static;
15
  vertical-align: middle;
16
+ width: 1rem;
17
 
18
  &:checked {
19
+ background: currentColor;
20
+ border-color: currentColor;
21
+
22
+ &::before {
23
+ color: #fff;
24
+ content: "\2713";
25
+ display: block;
26
+ height: calc(1rem - 2px);
27
+ min-height: 14px;
28
+ min-width: 14px;
29
+ margin: 0;
30
+ line-height: 100%;
31
+ text-align: center;
32
+ width: calc(1rem - 2px);
 
 
 
 
 
 
33
  }
34
  }
35
  }
36
 
37
+ .wc-block-components-checkbox__input[type="checkbox"] + .wc-block-components-checkbox__label {
38
+ padding-left: $gap-smaller;
 
 
 
 
 
 
 
 
 
 
 
 
 
39
  vertical-align: middle;
40
  }
41
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
assets/js/base/components/checkbox-list/index.js CHANGED
@@ -13,15 +13,6 @@ import './style.scss';
13
 
14
  /**
15
  * Component used to show a list of checkboxes in a group.
16
- *
17
- * @param {Object} props Incoming props for the component.
18
- * @param {string} props.className CSS class used.
19
- * @param {function(string):any} props.onChange Function called when inputs change.
20
- * @param {Array} props.options Options for list.
21
- * @param {Array} props.checked Which items are checked.
22
- * @param {boolean} props.isLoading If loading or not.
23
- * @param {boolean} props.isDisabled If inputs are disabled or not.
24
- * @param {number} props.limit Whether to limit the number of inputs showing.
25
  */
26
  const CheckboxList = ( {
27
  className,
@@ -58,7 +49,6 @@ const CheckboxList = ( {
58
  } }
59
  aria-expanded={ false }
60
  aria-label={ sprintf(
61
- /* translators: %s is referring the remaining count of options */
62
  _n(
63
  'Show %s more option',
64
  'Show %s more options',
@@ -69,7 +59,7 @@ const CheckboxList = ( {
69
  ) }
70
  >
71
  { sprintf(
72
- /* translators: %s number of options to reveal. */
73
  _n(
74
  'Show %s more',
75
  'Show %s more',
@@ -110,7 +100,7 @@ const CheckboxList = ( {
110
  const optionCount = options.length;
111
  const shouldTruncateOptions = optionCount > limit + 5;
112
  return (
113
- <>
114
  { options.map( ( option, index ) => (
115
  <Fragment key={ option.value }>
116
  <li
@@ -138,11 +128,10 @@ const CheckboxList = ( {
138
  </Fragment>
139
  ) ) }
140
  { shouldTruncateOptions && renderedShowLess }
141
- </>
142
  );
143
  }, [
144
  options,
145
- onChange,
146
  checked,
147
  showExpanded,
148
  limit,
13
 
14
  /**
15
  * Component used to show a list of checkboxes in a group.
 
 
 
 
 
 
 
 
 
16
  */
17
  const CheckboxList = ( {
18
  className,
49
  } }
50
  aria-expanded={ false }
51
  aria-label={ sprintf(
 
52
  _n(
53
  'Show %s more option',
54
  'Show %s more options',
59
  ) }
60
  >
61
  { sprintf(
62
+ // translators: %s number of options to reveal.
63
  _n(
64
  'Show %s more',
65
  'Show %s more',
100
  const optionCount = options.length;
101
  const shouldTruncateOptions = optionCount > limit + 5;
102
  return (
103
+ <Fragment>
104
  { options.map( ( option, index ) => (
105
  <Fragment key={ option.value }>
106
  <li
128
  </Fragment>
129
  ) ) }
130
  { shouldTruncateOptions && renderedShowLess }
131
+ </Fragment>
132
  );
133
  }, [
134
  options,
 
135
  checked,
136
  showExpanded,
137
  limit,
assets/js/base/components/chip/chip.js CHANGED
@@ -9,22 +9,11 @@ import classNames from 'classnames';
9
  */
10
  import './style.scss';
11
 
12
- /** @typedef {import('react')} React */
13
-
14
  /**
15
  * Component used to render a "chip" -- a list item containing some text.
16
  *
17
  * Each chip defaults to a list element but this can be customized by providing
18
  * a wrapperElement.
19
- *
20
- * @param {Object} props Incoming props for the component.
21
- * @param {string} props.text Text for chip content.
22
- * @param {string} props.screenReaderText Screenreader text for the content.
23
- * @param {string} props.element The element type for the chip.
24
- * @param {string} props.className CSS class used.
25
- * @param {string} props.radius Radius size.
26
- * @param {React.ReactChildren|null} props.children React children.
27
- * @param {Object} props.props Rest of props passed through to component.
28
  */
29
  const Chip = ( {
30
  text,
9
  */
10
  import './style.scss';
11
 
 
 
12
  /**
13
  * Component used to render a "chip" -- a list item containing some text.
14
  *
15
  * Each chip defaults to a list element but this can be customized by providing
16
  * a wrapperElement.
 
 
 
 
 
 
 
 
 
17
  */
18
  const Chip = ( {
19
  text,
assets/js/base/components/chip/removable-chip.js CHANGED
@@ -9,21 +9,11 @@ import { Icon, noAlt } from '@woocommerce/icons';
9
  /**
10
  * Internal dependencies
11
  */
12
- import Chip from './chip.js';
13
 
14
  /**
15
  * Component used to render a "chip" -- an item containing some text with
16
  * an X button to remove/dismiss each chip.
17
- *
18
- * @param {Object} props Incoming props for the component.
19
- * @param {string} props.ariaLabel Aria label content.
20
- * @param {string} props.className CSS class used.
21
- * @param {boolean} props.disabled Whether action is disabled or not.
22
- * @param {function():any} props.onRemove Function to call when remove event is fired.
23
- * @param {boolean} props.removeOnAnyClick Whether to expand click area for remove event.
24
- * @param {string} props.text The text for the chip.
25
- * @param {string} props.screenReaderText The screen reader text for the chip.
26
- * @param {Object} props.props Rest of props passed into component.
27
  */
28
  const RemovableChip = ( {
29
  ariaLabel = '',
9
  /**
10
  * Internal dependencies
11
  */
12
+ import { Chip } from './index.js';
13
 
14
  /**
15
  * Component used to render a "chip" -- an item containing some text with
16
  * an X button to remove/dismiss each chip.
 
 
 
 
 
 
 
 
 
 
17
  */
18
  const RemovableChip = ( {
19
  ariaLabel = '',
assets/js/base/components/chip/stories/index.js DELETED
@@ -1,42 +0,0 @@
1
- /**
2
- * External dependencies
3
- */
4
- import { text, select, boolean } from '@storybook/addon-knobs';
5
-
6
- /**
7
- * Internal dependencies
8
- */
9
- import * as components from '../';
10
-
11
- export default {
12
- title: 'WooCommerce Blocks/@base-components/Chip',
13
- component: Chip,
14
- };
15
-
16
- const radii = [ 'none', 'small', 'medium', 'large' ];
17
-
18
- export const Chip = () => (
19
- <components.Chip
20
- text={ text( 'Text', 'example' ) }
21
- radius={ select( 'Radius', radii ) }
22
- screenReaderText={ text(
23
- 'Screen reader text',
24
- 'Example screen reader text'
25
- ) }
26
- element={ select( 'Element', [ 'li', 'div', 'span' ], 'li' ) }
27
- />
28
- );
29
-
30
- export const RemovableChip = () => (
31
- <components.RemovableChip
32
- text={ text( 'Text', 'example' ) }
33
- radius={ select( 'Radius', radii ) }
34
- screenReaderText={ text(
35
- 'Screen reader text',
36
- 'Example screen reader text'
37
- ) }
38
- disabled={ boolean( 'Disabled', false ) }
39
- removeOnAnyClick={ boolean( 'Remove on any click', false ) }
40
- element={ select( 'Element', [ 'li', 'div', 'span' ], 'li' ) }
41
- />
42
- );
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
assets/js/base/components/chip/style.scss CHANGED
@@ -14,8 +14,8 @@
14
  &:hover,
15
  &:focus,
16
  &:active {
17
- background: $gray-200;
18
- color: $gray-900;
19
  }
20
 
21
  &.wc-block-components-chip--radius-small {
@@ -55,11 +55,11 @@ button.wc-block-components-chip:hover > .wc-block-components-chip__remove,
55
  button.wc-block-components-chip:focus > .wc-block-components-chip__remove,
56
  .wc-block-components-chip__remove:hover,
57
  .wc-block-components-chip__remove:focus {
58
- fill: $alert-red;
59
  }
60
 
61
  button.wc-block-components-chip:disabled > .wc-block-components-chip__remove,
62
  .wc-block-components-chip__remove:disabled {
63
- fill: $gray-600;
64
  cursor: not-allowed;
65
  }
14
  &:hover,
15
  &:focus,
16
  &:active {
17
+ background: $core-grey-light-500;
18
+ color: $core-grey-dark-800;
19
  }
20
 
21
  &.wc-block-components-chip--radius-small {
55
  button.wc-block-components-chip:focus > .wc-block-components-chip__remove,
56
  .wc-block-components-chip__remove:hover,
57
  .wc-block-components-chip__remove:focus {
58
+ fill: #d94f4f;
59
  }
60
 
61
  button.wc-block-components-chip:disabled > .wc-block-components-chip__remove,
62
  .wc-block-components-chip__remove:disabled {
63
+ fill: $core-grey-dark-100;
64
  cursor: not-allowed;
65
  }
assets/js/base/components/chip/test/__snapshots__/index.js.snap CHANGED
@@ -106,9 +106,9 @@ exports[`RemovableChip should render custom aria label 1`] = `
106
  onKeyDown={[Function]}
107
  >
108
  <svg
109
- aria-hidden={true}
110
  className="wc-block-components-chip__remove-icon"
111
- focusable={false}
112
  height={16}
113
  role="img"
114
  viewBox="0 0 20 20"
@@ -148,9 +148,9 @@ exports[`RemovableChip should render default aria label if text is a node 1`] =
148
  onKeyDown={[Function]}
149
  >
150
  <svg
151
- aria-hidden={true}
152
  className="wc-block-components-chip__remove-icon"
153
- focusable={false}
154
  height={16}
155
  role="img"
156
  viewBox="0 0 20 20"
@@ -188,9 +188,9 @@ exports[`RemovableChip should render screen reader text aria label 1`] = `
188
  onKeyDown={[Function]}
189
  >
190
  <svg
191
- aria-hidden={true}
192
  className="wc-block-components-chip__remove-icon"
193
- focusable={false}
194
  height={16}
195
  role="img"
196
  viewBox="0 0 20 20"
@@ -223,9 +223,9 @@ exports[`RemovableChip should render text and the remove button 1`] = `
223
  onKeyDown={[Function]}
224
  >
225
  <svg
226
- aria-hidden={true}
227
  className="wc-block-components-chip__remove-icon"
228
- focusable={false}
229
  height={16}
230
  role="img"
231
  viewBox="0 0 20 20"
@@ -258,9 +258,9 @@ exports[`RemovableChip should render with disabled remove button 1`] = `
258
  onKeyDown={[Function]}
259
  >
260
  <svg
261
- aria-hidden={true}
262
  className="wc-block-components-chip__remove-icon"
263
- focusable={false}
264
  height={16}
265
  role="img"
266
  viewBox="0 0 20 20"
@@ -294,9 +294,9 @@ exports[`RemovableChip with removeOnAnyClick should be a button when removeOnAny
294
  className="wc-block-components-chip__remove"
295
  >
296
  <svg
297
- aria-hidden={true}
298
  className="wc-block-components-chip__remove-icon"
299
- focusable={false}
300
  height={16}
301
  role="img"
302
  viewBox="0 0 20 20"
106
  onKeyDown={[Function]}
107
  >
108
  <svg
109
+ aria-hidden="true"
110
  className="wc-block-components-chip__remove-icon"
111
+ focusable="false"
112
  height={16}
113
  role="img"
114
  viewBox="0 0 20 20"
148
  onKeyDown={[Function]}
149
  >
150
  <svg
151
+ aria-hidden="true"
152
  className="wc-block-components-chip__remove-icon"
153
+ focusable="false"
154
  height={16}
155
  role="img"
156
  viewBox="0 0 20 20"
188
  onKeyDown={[Function]}
189
  >
190
  <svg
191
+ aria-hidden="true"
192
  className="wc-block-components-chip__remove-icon"
193
+ focusable="false"
194
  height={16}
195
  role="img"
196
  viewBox="0 0 20 20"
223
  onKeyDown={[Function]}
224
  >
225
  <svg
226
+ aria-hidden="true"
227
  className="wc-block-components-chip__remove-icon"
228
+ focusable="false"
229
  height={16}
230
  role="img"
231
  viewBox="0 0 20 20"
258
  onKeyDown={[Function]}
259
  >
260
  <svg
261
+ aria-hidden="true"
262
  className="wc-block-components-chip__remove-icon"
263
+ focusable="false"
264
  height={16}
265
  role="img"
266
  viewBox="0 0 20 20"
294
  className="wc-block-components-chip__remove"
295
  >
296
  <svg
297
+ aria-hidden="true"
298
  className="wc-block-components-chip__remove-icon"
299
+ focusable="false"
300
  height={16}
301
  role="img"
302
  viewBox="0 0 20 20"
assets/js/base/components/country-input/CountryInputProps.ts DELETED
@@ -1,15 +0,0 @@
1
- export interface CountryInputProps {
2
- className?: string;
3
- label: string;
4
- id: string;
5
- autoComplete?: string;
6
- value: string;
7
- onChange: ( value: string ) => void;
8
- required?: boolean;
9
- errorMessage?: string;
10
- errorId: null | 'shipping-missing-country';
11
- }
12
-
13
- export type CountryInputWithCountriesProps = CountryInputProps & {
14
- countries: Record< string, string >;
15
- };
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
assets/js/base/components/country-input/billing-country-input.js ADDED
@@ -0,0 +1,23 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /**
2
+ * External dependencies
3
+ */
4
+ import PropTypes from 'prop-types';
5
+ import { ALLOWED_COUNTRIES } from '@woocommerce/block-settings';
6
+
7
+ /**
8
+ * Internal dependencies
9
+ */
10
+ import CountryInput from './country-input.js';
11
+
12
+ const BillingCountryInput = ( props ) => {
13
+ return <CountryInput countries={ ALLOWED_COUNTRIES } { ...props } />;
14
+ };
15
+
16
+ BillingCountryInput.propTypes = {
17
+ onChange: PropTypes.func.isRequired,
18
+ className: PropTypes.string,
19
+ label: PropTypes.string,
20
+ value: PropTypes.string,
21
+ };
22
+
23
+ export default BillingCountryInput;
assets/js/base/components/country-input/billing-country-input.tsx DELETED
@@ -1,16 +0,0 @@
1
- /**
2
- * External dependencies
3
- */
4
- import { ALLOWED_COUNTRIES } from '@woocommerce/block-settings';
5
-
6
- /**
7
- * Internal dependencies
8
- */
9
- import CountryInput from './country-input';
10
- import type { CountryInputProps } from './CountryInputProps';
11
-
12
- const BillingCountryInput = ( props: CountryInputProps ): JSX.Element => {
13
- return <CountryInput countries={ ALLOWED_COUNTRIES } { ...props } />;
14
- };
15
-
16
- export default BillingCountryInput;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
assets/js/base/components/country-input/{country-input.tsx → country-input.js} RENAMED
@@ -1,8 +1,8 @@
1
  /**
2
  * External dependencies
3
  */
4
- import { useMemo } from '@wordpress/element';
5
  import { __ } from '@wordpress/i18n';
 
6
  import { decodeEntities } from '@wordpress/html-entities';
7
  import classnames from 'classnames';
8
 
@@ -10,8 +10,6 @@ import classnames from 'classnames';
10
  * Internal dependencies
11
  */
12
  import { ValidatedSelect } from '../select';
13
- import './style.scss';
14
- import type { CountryInputWithCountriesProps } from './CountryInputProps';
15
 
16
  const CountryInput = ( {
17
  className,
@@ -27,15 +25,11 @@ const CountryInput = ( {
27
  'Please select a country.',
28
  'woo-gutenberg-products-block'
29
  ),
30
- }: CountryInputWithCountriesProps ): JSX.Element => {
31
- const options = useMemo(
32
- () =>
33
- Object.keys( countries ).map( ( key ) => ( {
34
- key,
35
- name: decodeEntities( countries[ key ] ),
36
- } ) ),
37
- [ countries ]
38
- );
39
 
40
  return (
41
  <div
@@ -81,4 +75,16 @@ const CountryInput = ( {
81
  );
82
  };
83
 
 
 
 
 
 
 
 
 
 
 
 
 
84
  export default CountryInput;
1
  /**
2
  * External dependencies
3
  */
 
4
  import { __ } from '@wordpress/i18n';
5
+ import PropTypes from 'prop-types';
6
  import { decodeEntities } from '@wordpress/html-entities';
7
  import classnames from 'classnames';
8
 
10
  * Internal dependencies
11
  */
12
  import { ValidatedSelect } from '../select';
 
 
13
 
14
  const CountryInput = ( {
15
  className,
25
  'Please select a country.',
26
  'woo-gutenberg-products-block'
27
  ),
28
+ } ) => {
29
+ const options = Object.keys( countries ).map( ( key ) => ( {
30
+ key,
31
+ name: decodeEntities( countries[ key ] ),
32
+ } ) );
 
 
 
 
33
 
34
  return (
35
  <div
75
  );
76
  };
77
 
78
+ CountryInput.propTypes = {
79
+ countries: PropTypes.objectOf( PropTypes.string ).isRequired,
80
+ onChange: PropTypes.func.isRequired,
81
+ className: PropTypes.string,
82
+ id: PropTypes.string,
83
+ label: PropTypes.string,
84
+ value: PropTypes.string,
85
+ autoComplete: PropTypes.string,
86
+ errorId: PropTypes.string,
87
+ errorMessage: PropTypes.string,
88
+ };
89
+
90
  export default CountryInput;
assets/js/base/components/country-input/{index.ts → index.js} RENAMED
File without changes
assets/js/base/components/country-input/shipping-country-input.js ADDED
@@ -0,0 +1,23 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /**
2
+ * External dependencies
3
+ */
4
+ import PropTypes from 'prop-types';
5
+ import { SHIPPING_COUNTRIES } from '@woocommerce/block-settings';
6
+
7
+ /**
8
+ * Internal dependencies
9
+ */
10
+ import CountryInput from './country-input.js';
11
+
12
+ const ShippingCountryInput = ( props ) => {
13
+ return <CountryInput countries={ SHIPPING_COUNTRIES } { ...props } />;
14
+ };
15
+
16
+ ShippingCountryInput.propTypes = {
17
+ onChange: PropTypes.func.isRequired,
18
+ className: PropTypes.string,
19
+ label: PropTypes.string,
20
+ value: PropTypes.string,
21
+ };
22
+
23
+ export default ShippingCountryInput;
assets/js/base/components/country-input/shipping-country-input.tsx DELETED
@@ -1,16 +0,0 @@
1
- /**
2
- * External dependencies
3
- */
4
- import { SHIPPING_COUNTRIES } from '@woocommerce/block-settings';
5
-
6
- /**
7
- * Internal dependencies
8
- */
9
- import CountryInput from './country-input';
10
- import { CountryInputProps } from './CountryInputProps';
11
-
12
- const ShippingCountryInput = ( props: CountryInputProps ): JSX.Element => {
13
- return <CountryInput countries={ SHIPPING_COUNTRIES } { ...props } />;
14
- };
15
-
16
- export default ShippingCountryInput;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
assets/js/base/components/country-input/stories/index.js CHANGED
@@ -27,7 +27,7 @@ const StoryComponent = ( { label, errorMessage } ) => {
27
  } = useValidationContext();
28
  useEffect( () => {
29
  setValidationErrors( { country: errorMessage } );
30
- }, [ errorMessage, setValidationErrors ] );
31
  const updateCountry = ( country ) => {
32
  clearValidationError( 'country' );
33
  selectCountry( country );
27
  } = useValidationContext();
28
  useEffect( () => {
29
  setValidationErrors( { country: errorMessage } );
30
+ }, [ errorMessage ] );
31
  const updateCountry = ( country ) => {
32
  clearValidationError( 'country' );
33
  selectCountry( country );
assets/js/base/components/country-input/style.scss DELETED
@@ -1,3 +0,0 @@
1
- .wc-block-components-country-input {
2
- margin-top: em($gap-large);
3
- }
 
 
 
assets/js/base/components/dropdown-selector/index.js CHANGED
@@ -19,17 +19,6 @@ import './style.scss';
19
 
20
  /**
21
  * Component used to show an input box with a dropdown with suggestions.
22
- *
23
- * @param {Object} props Incoming props for the component.
24
- * @param {string} props.attributeLabel Label for the attributes.
25
- * @param {string} props.className CSS class used.
26
- * @param {Array} props.checked Which items are checked.
27
- * @param {string} props.inputLabel Label used for the input.
28
- * @param {boolean} props.isDisabled Whether the input is disabled or not.
29
- * @param {boolean} props.isLoading Whether the input is loading.
30
- * @param {boolean} props.multiple Whether multi-select is allowed.
31
- * @param {function():any} props.onChange Function to be called when onChange event fires.
32
- * @param {Array} props.options The option values to show in the select.
33
  */
34
  const DropdownSelector = ( {
35
  attributeLabel = '',
@@ -155,7 +144,7 @@ const DropdownSelector = ( {
155
  checked.length > 0 && multiple
156
  ? null
157
  : sprintf(
158
- /* translators: %s attribute name. */
159
  __(
160
  'Any %s',
161
  'woo-gutenberg-products-block'
19
 
20
  /**
21
  * Component used to show an input box with a dropdown with suggestions.
 
 
 
 
 
 
 
 
 
 
 
22
  */
23
  const DropdownSelector = ( {
24
  attributeLabel = '',
144
  checked.length > 0 && multiple
145
  ? null
146
  : sprintf(
147
+ // Translators: %s attribute name.
148
  __(
149
  'Any %s',
150
  'woo-gutenberg-products-block'
assets/js/base/components/dropdown-selector/menu.js CHANGED
@@ -38,7 +38,6 @@ const DropdownSelectorMenu = ( {
38
  item: option.value,
39
  'aria-label': selected
40
  ? sprintf(
41
- /* translators: %s is referring to the filter option being removed. */
42
  __(
43
  'Remove %s filter',
44
  'woo-gutenberg-products-block'
38
  item: option.value,
39
  'aria-label': selected
40
  ? sprintf(
 
41
  __(
42
  'Remove %s filter',
43
  'woo-gutenberg-products-block'
assets/js/base/components/dropdown-selector/selected-chip.js CHANGED
@@ -13,7 +13,6 @@ const DropdownSelectorSelectedChip = ( { onRemoveItem, option } ) => {
13
  onRemoveItem( option.value );
14
  } }
15
  ariaLabel={ sprintf(
16
- /* translators: %s is referring to the filter option being removed. */
17
  __( 'Remove %s filter', 'woo-gutenberg-products-block' ),
18
  option.name
19
  ) }
13
  onRemoveItem( option.value );
14
  } }
15
  ariaLabel={ sprintf(
 
16
  __( 'Remove %s filter', 'woo-gutenberg-products-block' ),
17
  option.name
18
  ) }
assets/js/base/components/dropdown-selector/style.scss CHANGED
@@ -20,7 +20,7 @@ $dropdown-selector-line-height: 18/14;
20
  padding: 2px $gap-smaller;
21
 
22
  .is-disabled & {
23
- background-color: $gray-200;
24
  }
25
 
26
  .is-multiple.has-checked > & {
@@ -102,7 +102,7 @@ $dropdown-selector-line-height: 18/14;
102
  .wc-block-components-dropdown-selector__selected-value {
103
  @include font-size(small);
104
  align-items: center;
105
- color: $gray-700;
106
  display: inline-flex;
107
  margin: em($gap-small/4) 0;
108
  padding: em($gap-smallest * 0.75) 0 em($gap-smallest * 0.75);
@@ -155,14 +155,14 @@ $dropdown-selector-line-height: 18/14;
155
 
156
  .wc-block-components-dropdown-selector__list-item {
157
  @include font-size(small);
158
- color: $gray-700;
159
  cursor: default;
160
  list-style: none;
161
  margin: 0;
162
  padding: 0 $gap-smallest;
163
 
164
  &.is-selected {
165
- background-color: $gray-300;
166
  }
167
 
168
  &:hover,
20
  padding: 2px $gap-smaller;
21
 
22
  .is-disabled & {
23
+ background-color: $core-grey-light-500;
24
  }
25
 
26
  .is-multiple.has-checked > & {
102
  .wc-block-components-dropdown-selector__selected-value {
103
  @include font-size(small);
104
  align-items: center;
105
+ color: $core-grey-dark-600;
106
  display: inline-flex;
107
  margin: em($gap-small/4) 0;
108
  padding: em($gap-smallest * 0.75) 0 em($gap-smallest * 0.75);
155
 
156
  .wc-block-components-dropdown-selector__list-item {
157
  @include font-size(small);
158
+ color: $core-grey-dark-600;
159
  cursor: default;
160
  list-style: none;
161
  margin: 0;
162
  padding: 0 $gap-smallest;
163
 
164
  &.is-selected {
165
+ background-color: $core-grey-light-600;
166
  }
167
 
168
  &:hover,
assets/js/base/components/filter-submit-button/index.js CHANGED
@@ -14,7 +14,7 @@ import './style.scss';
14
  const FilterSubmitButton = ( {
15
  className,
16
  disabled,
17
- /* translators: Submit button text for filters. */
18
  label = __( 'Go', 'woo-gutenberg-products-block' ),
19
  onClick,
20
  screenReaderLabel = __( 'Apply filter', 'woo-gutenberg-products-block' ),
14
  const FilterSubmitButton = ( {
15
  className,
16
  disabled,
17
+ // translators: Submit button text for filters.
18
  label = __( 'Go', 'woo-gutenberg-products-block' ),
19
  onClick,
20
  screenReaderLabel = __( 'Apply filter', 'woo-gutenberg-products-block' ),
assets/js/base/components/formatted-monetary-amount/{index.tsx → index.js} RENAMED
@@ -1,33 +1,21 @@
1
  /**
2
  * External dependencies
3
  */
4
- import NumberFormat, {
5
- NumberFormatValues,
6
- NumberFormatProps,
7
- } from 'react-number-format';
8
  import classNames from 'classnames';
9
- import type { Currency } from '@woocommerce/price-format';
10
- import type { ReactElement } from 'react';
11
 
12
  /**
13
  * Internal dependencies
14
  */
15
  import './style.scss';
16
 
17
- interface FormattedMonetaryAmountProps {
18
- className?: string;
19
- displayType?: NumberFormatProps[ 'displayType' ];
20
- value: number | string; // Value of money amount.
21
- currency: Currency | Record< string, never >; // Currency configuration object.
22
- onValueChange?: ( unit: number ) => void; // Function to call when value changes.
23
- }
24
-
25
  /**
26
  * Formats currency data into the expected format for NumberFormat.
 
 
 
27
  */
28
- const currencyToNumberFormat = (
29
- currency: FormattedMonetaryAmountProps[ 'currency' ]
30
- ) => {
31
  return {
32
  thousandSeparator: currency.thousandSeparator,
33
  decimalSeparator: currency.decimalSeparator,
@@ -40,22 +28,20 @@ const currencyToNumberFormat = (
40
  };
41
 
42
  /**
43
- * FormattedMonetaryAmount component.
44
  *
45
  * Takes a price and returns a formatted price using the NumberFormat component.
 
 
46
  */
47
  const FormattedMonetaryAmount = ( {
48
  className,
49
- value: rawValue,
50
  currency,
51
  onValueChange,
52
- displayType = 'text',
53
  ...props
54
- }: FormattedMonetaryAmountProps ): ReactElement | null => {
55
- const value =
56
- typeof rawValue === 'string' ? parseInt( rawValue, 10 ) : rawValue;
57
-
58
- if ( ! Number.isFinite( value ) ) {
59
  return null;
60
  }
61
 
@@ -71,6 +57,7 @@ const FormattedMonetaryAmount = ( {
71
  className
72
  );
73
  const numberFormatProps = {
 
74
  ...props,
75
  ...currencyToNumberFormat( currency ),
76
  value: undefined,
@@ -80,20 +67,15 @@ const FormattedMonetaryAmount = ( {
80
 
81
  // Wrapper for NumberFormat onValueChange which handles subunit conversion.
82
  const onValueChangeWrapper = onValueChange
83
- ? ( values: NumberFormatValues ) => {
84
- const minorUnitValue =
85
- ( ( values.value as unknown ) as number ) *
86
- 10 ** currency.minorUnit;
87
  onValueChange( minorUnitValue );
88
  }
89
- : () => {
90
- /* not used */
91
- };
92
 
93
  return (
94
  <NumberFormat
95
  className={ classes }
96
- displayType={ displayType }
97
  { ...numberFormatProps }
98
  value={ priceValue }
99
  onValueChange={ onValueChangeWrapper }
1
  /**
2
  * External dependencies
3
  */
4
+ import NumberFormat from 'react-number-format';
 
 
 
5
  import classNames from 'classnames';
 
 
6
 
7
  /**
8
  * Internal dependencies
9
  */
10
  import './style.scss';
11
 
 
 
 
 
 
 
 
 
12
  /**
13
  * Formats currency data into the expected format for NumberFormat.
14
+ *
15
+ * @param {Object} currency Currency data.
16
+ * @return {Object} Formatted props for NumberFormat.
17
  */
18
+ const currencyToNumberFormat = ( currency ) => {
 
 
19
  return {
20
  thousandSeparator: currency.thousandSeparator,
21
  decimalSeparator: currency.decimalSeparator,
28
  };
29
 
30
  /**
31
+ * Formatted price component.
32
  *
33
  * Takes a price and returns a formatted price using the NumberFormat component.
34
+ *
35
+ * @param {Object} props Component props.
36
  */
37
  const FormattedMonetaryAmount = ( {
38
  className,
39
+ value,
40
  currency,
41
  onValueChange,
 
42
  ...props
43
+ } ) => {
44
+ if ( value === '-' ) {
 
 
 
45
  return null;
46
  }
47
 
57
  className
58
  );
59
  const numberFormatProps = {
60
+ displayType: 'text',
61
  ...props,
62
  ...currencyToNumberFormat( currency ),
63
  value: undefined,
67
 
68
  // Wrapper for NumberFormat onValueChange which handles subunit conversion.
69
  const onValueChangeWrapper = onValueChange
70
+ ? ( values ) => {
71
+ const minorUnitValue = values.value * 10 ** currency.minorUnit;
 
 
72
  onValueChange( minorUnitValue );
73
  }
74
+ : () => {};
 
 
75
 
76
  return (
77
  <NumberFormat
78
  className={ classes }
 
79
  { ...numberFormatProps }
80
  value={ priceValue }
81
  onValueChange={ onValueChangeWrapper }
assets/js/base/components/label/{index.tsx → index.js} RENAMED
@@ -1,29 +1,21 @@
1
  /**
2
  * External dependencies
3
  */
4
- import { Fragment } from '@wordpress/element';
 
5
  import classNames from 'classnames';
6
- import type { ReactElement, HTMLProps } from 'react';
7
-
8
- interface LabelProps extends HTMLProps< HTMLElement > {
9
- label?: string;
10
- screenReaderLabel?: string;
11
- wrapperElement?: string;
12
- wrapperProps?: HTMLProps< HTMLElement >;
13
- }
14
 
15
  /**
16
  * Component used to render an accessible text given a label and/or a
17
  * screenReaderLabel. The wrapper element and wrapper props can also be
18
  * specified via props.
19
- *
20
  */
21
  const Label = ( {
22
  label,
23
  screenReaderLabel,
24
  wrapperElement,
25
- wrapperProps = {},
26
- }: LabelProps ): ReactElement => {
27
  let Wrapper;
28
 
29
  const hasLabel = typeof label !== 'undefined' && label !== null;
@@ -59,4 +51,15 @@ const Label = ( {
59
  return <Wrapper { ...wrapperProps }>{ label }</Wrapper>;
60
  };
61
 
 
 
 
 
 
 
 
 
 
 
 
62
  export default Label;
1
  /**
2
  * External dependencies
3
  */
4
+ import PropTypes from 'prop-types';
5
+ import { Fragment } from 'react';
6
  import classNames from 'classnames';
 
 
 
 
 
 
 
 
7
 
8
  /**
9
  * Component used to render an accessible text given a label and/or a
10
  * screenReaderLabel. The wrapper element and wrapper props can also be
11
  * specified via props.
 
12
  */
13
  const Label = ( {
14
  label,
15
  screenReaderLabel,
16
  wrapperElement,
17
+ wrapperProps,
18
+ } ) => {
19
  let Wrapper;
20
 
21
  const hasLabel = typeof label !== 'undefined' && label !== null;
51
  return <Wrapper { ...wrapperProps }>{ label }</Wrapper>;
52
  };
53
 
54
+ Label.propTypes = {
55
+ label: PropTypes.node,
56
+ screenReaderLabel: PropTypes.node,
57
+ wrapperElement: PropTypes.elementType,
58
+ wrapperProps: PropTypes.object,
59
+ };
60
+
61
+ Label.defaultProps = {
62
+ wrapperProps: {},
63
+ };
64
+
65
  export default Label;
assets/js/base/components/loading-mask/index.js CHANGED
@@ -4,14 +4,13 @@
4
  import { __ } from '@wordpress/i18n';
5
  import PropTypes from 'prop-types';
6
  import classNames from 'classnames';
 
7
 
8
  /**
9
  * Internal dependencies
10
  */
11
  import './style.scss';
12
- import Spinner from '../spinner';
13
 
14
- // @todo Find a way to block buttons/form components when LoadingMask isLoading
15
  const LoadingMask = ( {
16
  children,
17
  className,
@@ -19,27 +18,29 @@ const LoadingMask = ( {
19
  showSpinner = false,
20
  isLoading = true,
21
  } ) => {
 
 
 
 
 
22
  return (
23
  <div
24
- className={ classNames( className, {
25
- 'wc-block-components-loading-mask': isLoading,
26
- } ) }
 
27
  >
28
- { isLoading && showSpinner && <Spinner /> }
29
  <div
30
- className={ classNames( {
31
- 'wc-block-components-loading-mask__children': isLoading,
32
- } ) }
33
- aria-hidden={ isLoading }
34
  >
35
  { children }
36
  </div>
37
- { isLoading && (
38
- <span className="screen-reader-text">
39
- { screenReaderLabel ||
40
- __( 'Loading…', 'woo-gutenberg-products-block' ) }
41
- </span>
42
- ) }
43
  </div>
44
  );
45
  };
4
  import { __ } from '@wordpress/i18n';
5
  import PropTypes from 'prop-types';
6
  import classNames from 'classnames';
7
+ import { Spinner } from 'wordpress-components';
8
 
9
  /**
10
  * Internal dependencies
11
  */
12
  import './style.scss';
 
13
 
 
14
  const LoadingMask = ( {
15
  children,
16
  className,
18
  showSpinner = false,
19
  isLoading = true,
20
  } ) => {
21
+ // If nothing is loading, just pass through the children.
22
+ if ( ! isLoading ) {
23
+ return children;
24
+ }
25
+
26
  return (
27
  <div
28
+ className={ classNames(
29
+ className,
30
+ 'wc-block-components-loading-mask'
31
+ ) }
32
  >
33
+ { showSpinner && <Spinner /> }
34
  <div
35
+ className="wc-block-components-loading-mask__children"
36
+ aria-hidden={ true }
 
 
37
  >
38
  { children }
39
  </div>
40
+ <span className="screen-reader-text">
41
+ { screenReaderLabel ||
42
+ __( 'Loading…', 'woo-gutenberg-products-block' ) }
43
+ </span>
 
 
44
  </div>
45
  );
46
  };
assets/js/base/components/loading-mask/style.scss CHANGED
@@ -1,7 +1,6 @@
1
  .wc-block-components-loading-mask {
2
  position: relative;
3
  min-height: 18px + $gap;
4
- pointer-events: none;
5
 
6
  .components-spinner {
7
  position: absolute;
@@ -10,8 +9,8 @@
10
  left: 50%;
11
  transform: translate(-50%, -50%);
12
  }
 
13
 
14
- .wc-block-components-loading-mask__children {
15
- opacity: 0.25;
16
- }
17
  }
1
  .wc-block-components-loading-mask {
2
  position: relative;
3
  min-height: 18px + $gap;
 
4
 
5
  .components-spinner {
6
  position: absolute;
9
  left: 50%;
10
  transform: translate(-50%, -50%);
11
  }
12
+ }
13
 
14
+ .wc-block-components-loading-mask__children {
15
+ opacity: 0.5;
 
16
  }
packages/checkout/panel/index.tsx → assets/js/base/components/panel/index.js RENAMED
@@ -2,8 +2,8 @@
2
  * External dependencies
3
  */
4
  import { useState } from '@wordpress/element';
5
- import type { ReactNode, ReactElement } from 'react';
6
  import classNames from 'classnames';
 
7
  import { Icon, chevronUp, chevronDown } from '@woocommerce/icons';
8
 
9
  /**
@@ -11,15 +11,6 @@ import { Icon, chevronUp, chevronDown } from '@woocommerce/icons';
11
  */
12
  import './style.scss';
13
 
14
- interface PanelProps {
15
- children?: ReactNode;
16
- className?: string;
17
- initialOpen?: boolean;
18
- hasBorder?: boolean;
19
- title?: ReactNode;
20
- titleTag?: keyof JSX.IntrinsicElements;
21
- }
22
-
23
  const Panel = ( {
24
  children,
25
  className,
@@ -27,31 +18,31 @@ const Panel = ( {
27
  hasBorder = false,
28
  title,
29
  titleTag: TitleTag = 'div',
30
- }: PanelProps ): ReactElement => {
31
- const [ isOpen, setIsOpen ] = useState< boolean >( initialOpen );
32
 
33
  return (
34
  <div
35
- className={ classNames( className, 'wc-block-components-panel', {
36
  'has-border': hasBorder,
37
  } ) }
38
  >
39
  <TitleTag>
40
  <button
41
  aria-expanded={ isOpen }
42
- className="wc-block-components-panel__button"
43
  onClick={ () => setIsOpen( ! isOpen ) }
44
  >
45
  <Icon
46
  aria-hidden="true"
47
- className="wc-block-components-panel__button-icon"
48
  srcElement={ isOpen ? chevronUp : chevronDown }
49
  />
50
  { title }
51
  </button>
52
  </TitleTag>
53
  <div
54
- className="wc-block-components-panel__content"
55
  hidden={ ! isOpen }
56
  >
57
  { children }
@@ -60,4 +51,12 @@ const Panel = ( {
60
  );
61
  };
62
 
 
 
 
 
 
 
 
 
63
  export default Panel;
2
  * External dependencies
3
  */
4
  import { useState } from '@wordpress/element';
 
5
  import classNames from 'classnames';
6
+ import PropTypes from 'prop-types';
7
  import { Icon, chevronUp, chevronDown } from '@woocommerce/icons';
8
 
9
  /**
11
  */
12
  import './style.scss';
13
 
 
 
 
 
 
 
 
 
 
14
  const Panel = ( {
15
  children,
16
  className,
18
  hasBorder = false,
19
  title,
20
  titleTag: TitleTag = 'div',
21
+ } ) => {
22
+ const [ isOpen, setIsOpen ] = useState( initialOpen );
23
 
24
  return (
25
  <div
26
+ className={ classNames( className, 'wc-blocks-components-panel', {
27
  'has-border': hasBorder,
28
  } ) }
29
  >
30
  <TitleTag>
31
  <button
32
  aria-expanded={ isOpen }
33
+ className="wc-blocks-components-panel__button"
34
  onClick={ () => setIsOpen( ! isOpen ) }
35
  >
36
  <Icon
37
  aria-hidden="true"
38
+ className="wc-blocks-components-panel__button-icon"
39
  srcElement={ isOpen ? chevronUp : chevronDown }
40
  />
41
  { title }
42
  </button>
43
  </TitleTag>
44
  <div
45
+ className="wc-blocks-components-panel__content"
46
  hidden={ ! isOpen }
47
  >
48
  { children }
51
  );
52
  };
53
 
54
+ Panel.propTypes = {
55
+ className: PropTypes.string,
56
+ hasBorder: PropTypes.bool,
57
+ initialOpen: PropTypes.bool,
58
+ title: PropTypes.element,
59
+ titleTag: PropTypes.string,
60
+ };
61
+
62
  export default Panel;
assets/js/base/components/panel/style.scss ADDED
@@ -0,0 +1,48 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ .wc-blocks-components-panel.has-border {
2
+ @include with-translucent-border( 1px 0 );
3
+
4
+ + .wc-blocks-components-panel.has-border::after {
5
+ border-top-width: 0;
6
+ }
7
+ }
8
+
9
+ .wc-blocks-components-panel__button {
10
+ @include reset-box();
11
+ height: auto;
12
+ line-height: 1;
13
+ margin-bottom: em(6px);
14
+ margin-top: em(6px);
15
+ padding-bottom: em($gap-small - 6px);
16
+ padding-right: #{24px + $gap-smaller};
17
+ padding-top: em($gap-small - 6px);
18
+ position: relative;
19
+ text-align: left;
20
+ width: 100%;
21
+
22
+ &,
23
+ &:hover,
24
+ &:focus,
25
+ &:active {
26
+ @include reset-typography();
27
+ background: transparent;
28
+ box-shadow: none;
29
+ }
30
+
31
+ > .wc-blocks-components-panel__button-icon {
32
+ fill: currentColor;
33
+ position: absolute;
34
+ right: 0;
35
+ top: 50%;
36
+ transform: translateY(-50%);
37
+ width: auto;
38
+ }
39
+ }
40
+
41
+ .wc-blocks-components-panel__content {
42
+ padding-bottom: em($gap);
43
+ overflow: auto;
44
+ }
45
+
46
+ .theme-twentytwenty .wc-blocks-components-panel__button {
47
+ background: transparent;
48
+ }
assets/js/base/components/payment-methods/express-checkout.js ADDED
@@ -0,0 +1,66 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /**
2
+ * External dependencies
3
+ */
4
+ import { __ } from '@wordpress/i18n';
5
+ import { useExpressPaymentMethods } from '@woocommerce/base-hooks';
6
+ import { StoreNoticesProvider } from '@woocommerce/base-context';
7
+ import Title from '@woocommerce/base-components/title';
8
+
9
+ /**
10
+ * Internal dependencies
11
+ */
12
+ import ExpressPaymentMethods from './express-payment-methods';
13
+ import './style.scss';
14
+
15
+ const ExpressCheckoutContainer = ( { children } ) => {
16
+ return (
17
+ <>
18
+ <div className="wc-block-components-express-checkout">
19
+ <div className="wc-block-components-express-checkout__title-container">
20
+ <Title
21
+ className="wc-block-components-express-checkout__title"
22
+ headingLevel="2"
23
+ >
24
+ { __(
25
+ 'Express checkout',
26
+ 'woo-gutenberg-products-block'
27
+ ) }
28
+ </Title>
29
+ </div>
30
+ <div className="wc-block-components-express-checkout__content">
31
+ <StoreNoticesProvider context="wc/express-payment-area">
32
+ { children }
33
+ </StoreNoticesProvider>
34
+ </div>
35
+ </div>
36
+ <div className="wc-block-components-express-checkout-continue-rule">
37
+ { __( 'Or continue below', 'woo-gutenberg-products-block' ) }
38
+ </div>
39
+ </>
40
+ );
41
+ };
42
+
43
+ const ExpressCheckoutFormControl = () => {
44
+ const { paymentMethods, isInitialized } = useExpressPaymentMethods();
45
+
46
+ if (
47
+ ! isInitialized ||
48
+ ( isInitialized && Object.keys( paymentMethods ).length === 0 )
49
+ ) {
50
+ return null;
51
+ }
52
+
53
+ return (
54
+ <ExpressCheckoutContainer>
55
+ <p>
56
+ { __(
57
+ 'In a hurry? Use one of our express checkout options below:',
58
+ 'woo-gutenberg-products-block'
59
+ ) }
60
+ </p>
61
+ <ExpressPaymentMethods />
62
+ </ExpressCheckoutContainer>
63
+ );
64
+ };
65
+
66
+ export default ExpressCheckoutFormControl;
assets/js/base/components/payment-methods/express-payment-methods.js ADDED
@@ -0,0 +1,68 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /**
2
+ * External dependencies
3
+ */
4
+ import {
5
+ useExpressPaymentMethods,
6
+ usePaymentMethodInterface,
7
+ } from '@woocommerce/base-hooks';
8
+ import {
9
+ cloneElement,
10
+ isValidElement,
11
+ useCallback,
12
+ useRef,
13
+ } from '@wordpress/element';
14
+ import {
15
+ useEditorContext,
16
+ usePaymentMethodDataContext,
17
+ } from '@woocommerce/base-context';
18
+
19
+ const ExpressPaymentMethods = () => {
20
+ const { isEditor } = useEditorContext();
21
+ const {
22
+ setActivePaymentMethod,
23
+ activePaymentMethod,
24
+ setPaymentStatus,
25
+ } = usePaymentMethodDataContext();
26
+ const paymentMethodInterface = usePaymentMethodInterface();
27
+ const { paymentMethods } = useExpressPaymentMethods();
28
+ const previousActivePaymentMethod = useRef( activePaymentMethod );
29
+
30
+ const onExpressPaymentClick = useCallback(
31
+ ( paymentMethodId ) => () => {
32
+ previousActivePaymentMethod.current = activePaymentMethod;
33
+ setPaymentStatus().started();
34
+ setActivePaymentMethod( paymentMethodId );
35
+ },
36
+ [ setActivePaymentMethod, setPaymentStatus, activePaymentMethod ]
37
+ );
38
+ const onExpressPaymentClose = useCallback( () => {
39
+ setActivePaymentMethod( previousActivePaymentMethod.current );
40
+ }, [ setActivePaymentMethod ] );
41
+ const paymentMethodIds = Object.keys( paymentMethods );
42
+ const content =
43
+ paymentMethodIds.length > 0 ? (
44
+ paymentMethodIds.map( ( id ) => {
45
+ const expressPaymentMethod = isEditor
46
+ ? paymentMethods[ id ].edit
47
+ : paymentMethods[ id ].content;
48
+ return isValidElement( expressPaymentMethod ) ? (
49
+ <li key={ id } id={ `express-payment-method-${ id }` }>
50
+ { cloneElement( expressPaymentMethod, {
51
+ ...paymentMethodInterface,
52
+ onClick: onExpressPaymentClick( id ),
53
+ onClose: onExpressPaymentClose,
54
+ } ) }
55
+ </li>
56
+ ) : null;
57
+ } )
58
+ ) : (
59
+ <li key="noneRegistered">No registered Payment Methods</li>
60
+ );
61
+ return (
62
+ <ul className="wc-block-components-express-checkout-payment-event-buttons">
63
+ { content }
64
+ </ul>
65
+ );
66
+ };
67
+
68
+ export default ExpressPaymentMethods;
assets/js/base/components/payment-methods/index.js ADDED
@@ -0,0 +1,3 @@
 
 
 
1
+ export { default as PaymentMethods } from './payment-methods';
2
+ export { default as ExpressPaymentMethods } from './express-payment-methods';
3
+ export { default as ExpressCheckoutFormControl } from './express-checkout';
assets/js/{blocks/cart-checkout → base/components}/payment-methods/no-payment-methods/index.js RENAMED
@@ -43,7 +43,7 @@ const NoPaymentMethodsPlaceholder = () => {
43
  ) }
44
  </span>
45
  <Button
46
- isSecondary
47
  href={ `${ ADMIN_URL }admin.php?page=wc-settings&tab=checkout` }
48
  target="_blank"
49
  rel="noopener noreferrer"
43
  ) }
44
  </span>
45
  <Button
46
+ isDefault
47
  href={ `${ ADMIN_URL }admin.php?page=wc-settings&tab=checkout` }
48
  target="_blank"
49
  rel="noopener noreferrer"
assets/js/{blocks/cart-checkout → base/components}/payment-methods/no-payment-methods/style.scss RENAMED
@@ -9,7 +9,7 @@
9
  display: block;
10
 
11
  .components-button {
12
- background-color: $gray-900;
13
  color: $white;
14
  }
15
 
9
  display: block;
10
 
11
  .components-button {
12
+ background-color: $black;
13
  color: $white;
14
  }
15
 
assets/js/{blocks/cart-checkout → base/components}/payment-methods/payment-method-error-boundary.js RENAMED
@@ -3,9 +3,9 @@
3
  */
4
  import { __ } from '@wordpress/i18n';
5
  import { Component } from 'react';
 
6
  import PropTypes from 'prop-types';
7
- import { CURRENT_USER_IS_ADMIN } from '@woocommerce/settings';
8
- import { StoreNoticesContainer } from '@woocommerce/base-context';
9
 
10
  class PaymentMethodErrorBoundary extends Component {
11
  state = { errorMessage: '', hasError: false };
@@ -36,15 +36,11 @@ class PaymentMethodErrorBoundary extends Component {
36
  );
37
  }
38
  }
39
- const notices = [
40
- {
41
- id: '0',
42
- content: errorText,
43
- isDismissible: false,
44
- status: 'error',
45
- },
46
- ];
47
- return <StoreNoticesContainer notices={ notices } />;
48
  }
49
 
50
  return this.props.children;
3
  */
4
  import { __ } from '@wordpress/i18n';
5
  import { Component } from 'react';
6
+ import { Notice } from 'wordpress-components';
7
  import PropTypes from 'prop-types';
8
+ import { CURRENT_USER_IS_ADMIN } from '@woocommerce/block-settings';
 
9
 
10
  class PaymentMethodErrorBoundary extends Component {
11
  state = { errorMessage: '', hasError: false };
36
  );
37
  }
38
  }
39
+ return (
40
+ <Notice isDismissible={ false } status="error">
41
+ { errorText }
42
+ </Notice>
43
+ );
 
 
 
 
44
  }
45
 
46
  return this.props.children;
assets/js/base/components/payment-methods/payment-methods.js ADDED
@@ -0,0 +1,178 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /**
2
+ * External dependencies
3
+ */
4
+ import {
5
+ usePaymentMethods,
6
+ usePaymentMethodInterface,
7
+ useStoreNotices,
8
+ useEmitResponse,
9
+ } from '@woocommerce/base-hooks';
10
+ import {
11
+ cloneElement,
12
+ useRef,
13
+ useEffect,
14
+ useState,
15
+ useCallback,
16
+ } from '@wordpress/element';
17
+ import { __ } from '@wordpress/i18n';
18
+ import {
19
+ useCheckoutContext,
20
+ useEditorContext,
21
+ usePaymentMethodDataContext,
22
+ } from '@woocommerce/base-context';
23
+ import CheckboxControl from '@woocommerce/base-components/checkbox-control';
24
+
25
+ /**
26
+ * Internal dependencies
27
+ */
28
+ import Tabs from '../tabs';
29
+ import NoPaymentMethods from './no-payment-methods';
30
+ import SavedPaymentMethodOptions from './saved-payment-method-options';
31
+ import PaymentMethodErrorBoundary from './payment-method-error-boundary';
32
+
33
+ /**
34
+ * Returns a payment method for the given context.
35
+ *
36
+ * @param {string} name The payment method slug to return.
37
+ * @param {Object} paymentMethods The current registered payment methods
38
+ * @param {boolean} isEditor Whether in the editor context (true) or not (false).
39
+ *
40
+ * @return {Object} The payment method matching the name for the given context.
41
+ */
42
+ const getPaymentMethod = ( name, paymentMethods, isEditor ) => {
43
+ let paymentMethod = paymentMethods[ name ] || null;
44
+ if ( paymentMethod ) {
45
+ paymentMethod = isEditor ? paymentMethod.edit : paymentMethod.content;
46
+ }
47
+ return paymentMethod;
48
+ };
49
+
50
+ /**
51
+ * PaymentMethods component.
52
+ *
53
+ * @return {*} The rendered component.
54
+ */
55
+ const PaymentMethods = () => {
56
+ const { isEditor } = useEditorContext();
57
+ const {
58
+ customerPaymentMethods = {},
59
+ setActivePaymentMethod,
60
+ shouldSavePayment,
61
+ setShouldSavePayment,
62
+ } = usePaymentMethodDataContext();
63
+ const { isInitialized, paymentMethods } = usePaymentMethods();
64
+ const currentPaymentMethods = useRef( paymentMethods );
65
+ const {
66
+ activePaymentMethod,
67
+ ...paymentMethodInterface
68
+ } = usePaymentMethodInterface();
69
+ const currentPaymentMethodInterface = useRef( paymentMethodInterface );
70
+ const [ selectedToken, setSelectedToken ] = useState( '0' );
71
+ const { noticeContexts } = useEmitResponse();
72
+ const { removeNotice } = useStoreNotices();
73
+ const { customerId } = useCheckoutContext();
74
+
75
+ // update ref on change.
76
+ useEffect( () => {
77
+ currentPaymentMethods.current = paymentMethods;
78
+ currentPaymentMethodInterface.current = paymentMethodInterface;
79
+ }, [ paymentMethods, paymentMethodInterface, activePaymentMethod ] );
80
+
81
+ const getRenderedTab = useCallback(
82
+ ( selectedTab ) => {
83
+ const paymentMethod = getPaymentMethod(
84
+ selectedTab,
85
+ currentPaymentMethods.current,
86
+ isEditor
87
+ );
88
+ const { supports = {} } =
89
+ paymentMethod &&
90
+ currentPaymentMethods.current[ activePaymentMethod ]
91
+ ? currentPaymentMethods.current[ activePaymentMethod ]
92
+ : {};
93
+ return paymentMethod && activePaymentMethod ? (
94
+ <PaymentMethodErrorBoundary isEditor={ isEditor }>
95
+ { cloneElement( paymentMethod, {
96
+ activePaymentMethod,
97
+ ...currentPaymentMethodInterface.current,
98
+ } ) }
99
+ { customerId > 0 && supports.savePaymentInfo && (
100
+ <CheckboxControl
101
+ className="wc-block-components-payment-methods__save-card-info"
102
+ label={ __(
103
+ 'Save payment information to my account for future purchases.',
104
+ 'woo-gutenberg-products-block'
105
+ ) }
106
+ checked={ shouldSavePayment }
107
+ onChange={ () =>
108
+ setShouldSavePayment( ! shouldSavePayment )
109
+ }
110
+ />
111
+ ) }
112
+ </PaymentMethodErrorBoundary>
113
+ ) : null;
114
+ },
115
+ [
116
+ isEditor,
117
+ activePaymentMethod,
118
+ shouldSavePayment,
119
+ setShouldSavePayment,
120
+ customerId,
121
+ ]
122
+ );
123
+ if (
124
+ isInitialized &&
125
+ Object.keys( currentPaymentMethods.current ).length === 0
126
+ ) {
127
+ return <NoPaymentMethods />;
128
+ }
129
+ const renderedTabs = (
130
+ <Tabs
131
+ className="wc-block-components-checkout-payment-methods"
132
+ onSelect={ ( tabName ) => {
133
+ setActivePaymentMethod( tabName );
134
+ removeNotice( 'wc-payment-error', noticeContexts.PAYMENTS );
135
+ } }
136
+ tabs={ Object.keys( paymentMethods ).map( ( name ) => {
137
+ const { label, ariaLabel } = paymentMethods[ name ];
138
+ return {
139
+ name,
140
+ title:
141
+ typeof label === 'string'
142
+ ? label
143
+ : cloneElement( label, {
144
+ components:
145
+ currentPaymentMethodInterface.current
146
+ .components,
147
+ } ),
148
+ ariaLabel,
149
+ content: getRenderedTab( name ),
150
+ };
151
+ } ) }
152
+ initialTabName={ activePaymentMethod }
153
+ ariaLabel={ __(
154
+ 'Payment Methods',
155
+ 'woo-gutenberg-products-block'
156
+ ) }
157
+ id="wc-block-payment-methods"
158
+ />
159
+ );
160
+
161
+ const renderedSavedPaymentOptions = (
162
+ <SavedPaymentMethodOptions onSelect={ setSelectedToken } />
163
+ );
164
+
165
+ const renderedTabsAndSavedPaymentOptions = (
166
+ <>
167
+ { renderedSavedPaymentOptions }
168
+ { renderedTabs }
169
+ </>
170
+ );
171
+
172
+ return Object.keys( customerPaymentMethods ).length > 0 &&
173
+ selectedToken !== '0'
174
+ ? renderedSavedPaymentOptions
175
+ : renderedTabsAndSavedPaymentOptions;
176
+ };
177
+
178
+ export default PaymentMethods;
assets/js/{blocks/cart-checkout → base/components}/payment-methods/saved-payment-method-options.js RENAMED
@@ -1,20 +1,13 @@
1
  /**
2
  * External dependencies
3
  */
4
- import {
5
- useEffect,
6
- useRef,
7
- useCallback,
8
- cloneElement,
9
- } from '@wordpress/element';
10
  import { __, sprintf } from '@wordpress/i18n';
11
- import { usePaymentMethodDataContext } from '@woocommerce/base-context';
12
- import RadioControl from '@woocommerce/base-components/radio-control';
13
  import {
14
- usePaymentMethodInterface,
15
- usePaymentMethods,
16
- } from '@woocommerce/base-context/hooks';
17
- import { getPaymentMethods } from '@woocommerce/blocks-registry';
18
 
19
  /**
20
  * @typedef {import('@woocommerce/type-defs/contexts').CustomerPaymentMethod} CustomerPaymentMethod
@@ -37,7 +30,6 @@ const getCcOrEcheckPaymentMethodOption = (
37
  return {
38
  value: tokenId + '',
39
  label: sprintf(
40
- /* translators: %1$s is referring to the payment method brand, %2$s is referring to the last 4 digits of the payment card, %3$s is referring to the expiry date. */
41
  __(
42
  '%1$s ending in %2$s (expires %3$s)',
43
  'woo-gutenberg-product-blocks'
@@ -50,9 +42,9 @@ const getCcOrEcheckPaymentMethodOption = (
50
  onChange: ( token ) => {
51
  const savedTokenKey = `wc-${ method.gateway }-payment-token`;
52
  setActivePaymentMethod( method.gateway );
53
- setPaymentStatus().started( {
54
  payment_method: method.gateway,
55
- [ savedTokenKey ]: token + '',
56
  isSavedToken: true,
57
  } );
58
  },
@@ -76,7 +68,6 @@ const getDefaultPaymentMethodOptions = (
76
  return {
77
  value: tokenId + '',
78
  label: sprintf(
79
- /* translators: %s is the name of the payment method gateway. */
80
  __( 'Saved token for %s', 'woo-gutenberg-products-block' ),
81
  method.gateway
82
  ),
@@ -84,102 +75,103 @@ const getDefaultPaymentMethodOptions = (
84
  onChange: ( token ) => {
85
  const savedTokenKey = `wc-${ method.gateway }-payment-token`;
86
  setActivePaymentMethod( method.gateway );
87
- setPaymentStatus().started( {
88
  payment_method: method.gateway,
89
- [ savedTokenKey ]: token + '',
90
  isSavedToken: true,
91
  } );
92
  },
93
  };
94
  };
95
 
96
- const SavedPaymentMethodOptions = () => {
 
97
  const {
98
  setPaymentStatus,
99
  customerPaymentMethods,
100
- activePaymentMethod,
101
  setActivePaymentMethod,
102
- activeSavedToken,
103
- setActiveSavedToken,
104
  } = usePaymentMethodDataContext();
105
- const standardMethods = getPaymentMethods();
106
- const { paymentMethods } = usePaymentMethods();
107
- const paymentMethodInterface = usePaymentMethodInterface();
108
 
109
  /**
110
  * @type {Object} Options
111
  * @property {Array} current The current options on the type.
112
  */
113
  const currentOptions = useRef( [] );
114
-
115
- const updateToken = useCallback(
116
- ( token ) => {
117
- setActiveSavedToken( token );
118
- },
119
- [ setActiveSavedToken ]
120
- );
121
-
122
  useEffect( () => {
123
- const types = Object.keys( customerPaymentMethods );
124
- const options = types
125
- .flatMap( ( type ) => {
126
- const typeMethods = customerPaymentMethods[ type ];
127
- return typeMethods.map( ( paymentMethod ) => {
128
- const option =
129
- type === 'cc' || type === 'echeck'
130
- ? getCcOrEcheckPaymentMethodOption(
131
- paymentMethod,
132
- setActivePaymentMethod,
133
- setPaymentStatus
134
- )
135
- : getDefaultPaymentMethodOptions(
136
- paymentMethod,
137
- setActivePaymentMethod,
138
- setPaymentStatus
139
- );
140
- if (
141
- ! activePaymentMethod &&
142
- paymentMethod.is_default &&
143
- activeSavedToken === ''
144
- ) {
145
- updateToken( paymentMethod.tokenId + '' );
146
- option.onChange( paymentMethod.tokenId );
147
- }
148
- return option;
149
- } );
150
- } )
151
- .filter( Boolean );
152
- currentOptions.current = options;
 
 
 
 
 
 
 
 
 
 
 
 
153
  }, [
154
  customerPaymentMethods,
155
- updateToken,
156
- activeSavedToken,
157
- activePaymentMethod,
158
  setActivePaymentMethod,
159
  setPaymentStatus,
160
- standardMethods,
161
  ] );
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
162
 
163
- const savedPaymentMethodHandler =
164
- !! activeSavedToken &&
165
- paymentMethods[ activePaymentMethod ] &&
166
- paymentMethods[ activePaymentMethod ]?.savedTokenComponent
167
- ? cloneElement(
168
- paymentMethods[ activePaymentMethod ]?.savedTokenComponent,
169
- { token: activeSavedToken, ...paymentMethodInterface }
170
- )
171
- : null;
172
-
173
  return currentOptions.current.length > 0 ? (
174
- <>
175
- <RadioControl
176
- id={ 'wc-payment-method-saved-tokens' }
177
- selected={ activeSavedToken }
178
- onChange={ updateToken }
179
- options={ currentOptions.current }
180
- />
181
- { savedPaymentMethodHandler }
182
- </>
183
  ) : null;
184
  };
185
 
1
  /**
2
  * External dependencies
3
  */
4
+ import { useEffect, useState, useRef, useCallback } from '@wordpress/element';
 
 
 
 
 
5
  import { __, sprintf } from '@wordpress/i18n';
 
 
6
  import {
7
+ useEditorContext,
8
+ usePaymentMethodDataContext,
9
+ } from '@woocommerce/base-context';
10
+ import RadioControl from '@woocommerce/base-components/radio-control';
11
 
12
  /**
13
  * @typedef {import('@woocommerce/type-defs/contexts').CustomerPaymentMethod} CustomerPaymentMethod
30
  return {
31
  value: tokenId + '',
32
  label: sprintf(
 
33
  __(
34
  '%1$s ending in %2$s (expires %3$s)',
35
  'woo-gutenberg-product-blocks'
42
  onChange: ( token ) => {
43
  const savedTokenKey = `wc-${ method.gateway }-payment-token`;
44
  setActivePaymentMethod( method.gateway );
45
+ setPaymentStatus().success( {
46
  payment_method: method.gateway,
47
+ [ savedTokenKey ]: token,
48
  isSavedToken: true,
49
  } );
50
  },
68
  return {
69
  value: tokenId + '',
70
  label: sprintf(
 
71
  __( 'Saved token for %s', 'woo-gutenberg-products-block' ),
72
  method.gateway
73
  ),
75
  onChange: ( token ) => {
76
  const savedTokenKey = `wc-${ method.gateway }-payment-token`;
77
  setActivePaymentMethod( method.gateway );
78
+ setPaymentStatus().success( {
79
  payment_method: method.gateway,
80
+ [ savedTokenKey ]: token,
81
  isSavedToken: true,
82
  } );
83
  },
84
  };
85
  };
86
 
87
+ const SavedPaymentMethodOptions = ( { onSelect } ) => {
88
+ const { isEditor } = useEditorContext();
89
  const {
90
  setPaymentStatus,
91
  customerPaymentMethods,
 
92
  setActivePaymentMethod,
 
 
93
  } = usePaymentMethodDataContext();
94
+ const [ selectedToken, setSelectedToken ] = useState( '' );
 
 
95
 
96
  /**
97
  * @type {Object} Options
98
  * @property {Array} current The current options on the type.
99
  */
100
  const currentOptions = useRef( [] );
 
 
 
 
 
 
 
 
101
  useEffect( () => {
102
+ let options = [];
103
+ const paymentMethodKeys = Object.keys( customerPaymentMethods );
104
+ if ( paymentMethodKeys.length > 0 ) {
105
+ paymentMethodKeys.forEach( ( type ) => {
106
+ const paymentMethods = customerPaymentMethods[ type ];
107
+ if ( paymentMethods.length > 0 ) {
108
+ options = options.concat(
109
+ paymentMethods.map( ( paymentMethod ) => {
110
+ const option =
111
+ type === 'cc' || type === 'echeck'
112
+ ? getCcOrEcheckPaymentMethodOption(
113
+ paymentMethod,
114
+ setActivePaymentMethod,
115
+ setPaymentStatus
116
+ )
117
+ : getDefaultPaymentMethodOptions(
118
+ paymentMethod,
119
+ setActivePaymentMethod,
120
+ setPaymentStatus
121
+ );
122
+ if (
123
+ paymentMethod.is_default &&
124
+ selectedToken === ''
125
+ ) {
126
+ setSelectedToken( paymentMethod.tokenId + '' );
127
+ option.onChange( paymentMethod.tokenId );
128
+ }
129
+ return option;
130
+ } )
131
+ );
132
+ }
133
+ } );
134
+ currentOptions.current = options;
135
+ currentOptions.current.push( {
136
+ value: '0',
137
+ label: __(
138
+ 'Use a new payment method',
139
+ 'woo-gutenberg-product-blocks'
140
+ ),
141
+ name: `wc-saved-payment-method-token-new`,
142
+ } );
143
+ }
144
  }, [
145
  customerPaymentMethods,
146
+ selectedToken,
 
 
147
  setActivePaymentMethod,
148
  setPaymentStatus,
 
149
  ] );
150
+ const updateToken = useCallback(
151
+ ( token ) => {
152
+ if ( token === '0' ) {
153
+ setPaymentStatus().started();
154
+ }
155
+ setSelectedToken( token );
156
+ onSelect( token );
157
+ },
158
+ [ setSelectedToken, setPaymentStatus, onSelect ]
159
+ );
160
+ useEffect( () => {
161
+ if ( selectedToken && currentOptions.current.length > 0 ) {
162
+ updateToken( selectedToken );
163
+ }
164
+ }, [ selectedToken, updateToken ] );
165
 
166
+ // In the editor, show `Use a new payment method` option as selected.
167
+ const selectedOption = isEditor ? '0' : selectedToken + '';
 
 
 
 
 
 
 
 
168
  return currentOptions.current.length > 0 ? (
169
+ <RadioControl
170
+ id={ 'wc-payment-method-saved-tokens' }
171
+ selected={ selectedOption }
172
+ onChange={ updateToken }
173
+ options={ currentOptions.current }
174
+ />
 
 
 
175
  ) : null;
176
  };
177
 
assets/js/{blocks/cart-checkout → base/components}/payment-methods/style.scss RENAMED
@@ -1,10 +1,96 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
  .wc-block-card-elements {
2
  display: flex;
3
  width: 100%;
4
-
5
- .wc-block-components-validation-error {
6
- position: static;
7
- }
8
  }
9
 
10
  .wc-block-gateway-container {
@@ -67,7 +153,7 @@
67
  left: 0;
68
  top: 0;
69
  transform-origin: top left;
70
- color: $gray-700;
71
  transition: transform 200ms ease;
72
  margin: 0 0 0 #{$gap + 1px};
73
  overflow: hidden;
@@ -109,14 +195,14 @@
109
  }
110
 
111
  .wc-block-gateway-input.has-error {
112
- border-color: $alert-red;
113
  &:focus {
114
- outline-color: $alert-red;
115
  }
116
  }
117
 
118
  .wc-block-gateway-input.has-error + label {
119
- color: $alert-red;
120
  }
121
  }
122
 
@@ -143,6 +229,21 @@
143
  }
144
  }
145
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
146
  .wc-block-components-checkout-payment-methods * {
147
  pointer-events: all; // Overrides parent disabled component in editor context
148
  }
@@ -169,78 +270,16 @@
169
  }
170
  }
171
 
172
- .wc-block-checkout__payment-method {
173
- .wc-block-components-radio-control__option {
174
- padding-left: 56px;
175
-
176
- &::after {
177
- content: none;
178
- }
179
-
180
- .wc-block-components-radio-control__input {
181
- left: 16px;
182
- }
183
- }
184
-
185
- // We need to add the first-child and last-child pseudoclasses for specificity.
186
- .wc-block-components-radio-control__option,
187
- .wc-block-components-radio-control__option:first-child,
188
- .wc-block-components-radio-control__option:last-child {
189
- margin: 0;
190
- padding-bottom: em($gap);
191
- padding-top: em($gap);
192
- }
193
-
194
- .wc-block-components-radio-control__option-checked {
195
- font-weight: bold;
196
- }
197
-
198
- .wc-block-components-radio-control-accordion-option,
199
- .wc-block-components-radio-control__option {
200
- @include with-translucent-border(1px 1px 0 1px);
201
- }
202
-
203
- .wc-block-components-radio-control__option:last-child::after,
204
- .wc-block-components-radio-control-accordion-option:last-child::after {
205
- border-width: 1px;
206
- }
207
-
208
- .wc-block-components-radio-control-accordion-option {
209
- .wc-block-components-radio-control__option::after {
210
- border-width: 0;
211
- }
212
- .wc-block-components-radio-control__label img {
213
- height: 24px;
214
- }
215
- }
216
-
217
- .wc-block-components-radio-control.disable-radio-control {
218
- .wc-block-components-radio-control__option {
219
- padding-left: 16px;
220
- }
221
-
222
- .wc-block-components-radio-control__input {
223
- display: none;
224
- }
225
- }
226
-
227
- .wc-block-components-checkout-step__description-payments-aligned {
228
- padding-top: 14px;
229
- height: 28px;
230
- }
231
-
232
- }
233
-
234
- .wc-block-components-radio-control-accordion-content {
235
- padding: 0 $gap em($gap) $gap;
236
-
237
- &:empty {
238
  display: none;
239
  }
240
  }
241
 
242
- .wc-block-checkout__order-notes {
243
- .wc-block-components-checkout-step__content {
244
- padding-bottom: 0;
 
 
245
  }
246
  }
1
+ $border-width: 1px;
2
+ $border-radius: 5px;
3
+
4
+ .wc-block-components-express-checkout {
5
+ margin: auto;
6
+ position: relative;
7
+
8
+ .wc-block-components-express-checkout__title-container {
9
+ display: flex;
10
+ flex-direction: row;
11
+ left: 0;
12
+ position: absolute;
13
+ right: 0;
14
+ top: -$border-radius;
15
+ vertical-align: middle;
16
+
17
+ // Pseudo-elements used to show the border before and after the title.
18
+ &::before {
19
+ border-left: $border-width solid currentColor;
20
+ border-top: $border-width solid currentColor;
21
+ border-radius: $border-radius 0 0 0;
22
+ content: "";
23
+ display: block;
24
+ height: $border-radius - $border-width;
25
+ margin-right: $gap-small;
26
+ opacity: 0.3;
27
+ pointer-events: none;
28
+ width: #{$gap-larger - $gap-small - $border-width * 2};
29
+ }
30
+
31
+ &::after {
32
+ border-right: $border-width solid currentColor;
33
+ border-top: $border-width solid currentColor;
34
+ border-radius: 0 $border-radius 0 0;
35
+ content: "";
36
+ display: block;
37
+ height: $border-radius - $border-width;
38
+ margin-left: $gap-small;
39
+ opacity: 0.3;
40
+ pointer-events: none;
41
+ flex-grow: 1;
42
+ }
43
+ }
44
+
45
+ .wc-block-components-express-checkout__title {
46
+ flex-grow: 0;
47
+ transform: translateY(-50%);
48
+ }
49
+
50
+ .wc-block-components-express-checkout__content {
51
+ @include with-translucent-border(0 $border-width $border-width);
52
+ margin-top: calc(0.75em + #{$border-radius});
53
+ padding: em($gap-large) #{$gap-larger - $border-width} em($gap) #{$gap-larger - $border-width};
54
+
55
+ &::after {
56
+ border-radius: 0 0 $border-radius $border-radius;
57
+ }
58
+
59
+ > p {
60
+ margin-bottom: em($gap);
61
+ }
62
+ }
63
+
64
+ .wc-block-components-express-checkout-payment-event-buttons {
65
+ list-style: none;
66
+ display: flex;
67
+ flex-direction: row;
68
+ flex-wrap: wrap;
69
+ width: 100%;
70
+ padding: 0;
71
+ margin: 0;
72
+ overflow: hidden;
73
+ > li {
74
+ display: inline-block;
75
+ margin: 0;
76
+ width: 50%;
77
+ > img {
78
+ width: 100%;
79
+ height: 48px;
80
+ }
81
+ }
82
+ > li:nth-child(even) {
83
+ padding-left: $gap-smaller;
84
+ }
85
+ > li:nth-child(odd) {
86
+ padding-right: $gap-smaller;
87
+ }
88
+ }
89
+ }
90
+
91
  .wc-block-card-elements {
92
  display: flex;
93
  width: 100%;
 
 
 
 
94
  }
95
 
96
  .wc-block-gateway-container {
153
  left: 0;
154
  top: 0;
155
  transform-origin: top left;
156
+ color: $gray-50;
157
  transition: transform 200ms ease;
158
  margin: 0 0 0 #{$gap + 1px};
159
  overflow: hidden;
195
  }
196
 
197
  .wc-block-gateway-input.has-error {
198
+ border-color: $error-red;
199
  &:focus {
200
+ outline-color: $error-red;
201
  }
202
  }
203
 
204
  .wc-block-gateway-input.has-error + label {
205
+ color: $error-red;
206
  }
207
  }
208
 
229
  }
230
  }
231
 
232
+ .wc-blocks-credit-card-images {
233
+ padding-top: $gap-small;
234
+ display: flex;
235
+
236
+ .wc-blocks-credit-cart-icon {
237
+ height: 18px;
238
+ width: auto;
239
+ margin-right: $gap-small;
240
+
241
+ &:last-child {
242
+ margin-right: 0;
243
+ }
244
+ }
245
+ }
246
+
247
  .wc-block-components-checkout-payment-methods * {
248
  pointer-events: all; // Overrides parent disabled component in editor context
249
  }
270
  }
271
  }
272
 
273
+ .theme-twentynineteen {
274
+ .wc-block-components-express-checkout__title::before {
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
275
  display: none;
276
  }
277
  }
278
 
279
+ // For Twenty Twenty we need to increase specificity of the title.
280
+ .theme-twentytwenty {
281
+ .wc-block-components-express-checkout .wc-block-components-express-checkout__title {
282
+ padding-left: $gap-small;
283
+ padding-right: $gap-small;
284
  }
285
  }
assets/js/base/components/price-slider/constrain-range-slider-values.js CHANGED
@@ -2,8 +2,8 @@
2
  * Validate a min and max value for a range slider against defined constraints (min, max, step).
3
  *
4
  * @param {Array} values Array containing min and max values.
5
- * @param {number|null} min Min allowed value for the sliders.
6
- * @param {number|null} max Max allowed value for the sliders.
7
  * @param {number} step Step value for the sliders.
8
  * @param {boolean} isMin Whether we're currently interacting with the min range slider or not, so we update the correct values.
9
  * @return {Array} Validated and updated min/max values that fit within the range slider constraints.
2
  * Validate a min and max value for a range slider against defined constraints (min, max, step).
3
  *
4
  * @param {Array} values Array containing min and max values.
5
+ * @param {number} min Min allowed value for the sliders.
6
+ * @param {number} max Max allowed value for the sliders.
7
  * @param {number} step Step value for the sliders.
8
  * @param {boolean} isMin Whether we're currently interacting with the min range slider or not, so we update the correct values.
9
  * @return {Array} Validated and updated min/max values that fit within the range slider constraints.
assets/js/base/components/price-slider/index.js CHANGED
@@ -3,6 +3,7 @@
3
  */
4
  import { __ } from '@wordpress/i18n';
5
  import {
 
6
  useState,
7
  useEffect,
8
  useCallback,
@@ -12,7 +13,6 @@ import {
12
  import PropTypes from 'prop-types';
13
  import classnames from 'classnames';
14
  import FormattedMonetaryAmount from '@woocommerce/base-components/formatted-monetary-amount';
15
- import { isObject } from '@woocommerce/types';
16
 
17
  /**
18
  * Internal dependencies
@@ -25,17 +25,6 @@ import FilterSubmitButton from '../filter-submit-button';
25
  * Price slider component.
26
  *
27
  * @param {Object} props Component props.
28
- * @param {number} props.minPrice Minimum price for slider.
29
- * @param {number} props.maxPrice Maximum price for slider.
30
- * @param {number} props.minConstraint Minimum constraint.
31
- * @param {number} props.maxConstraint Maximum constraint.
32
- * @param {function(any):any} props.onChange Function to call on the change event.
33
- * @param {number} props.step What step values the slider uses.
34
- * @param {Object} props.currency Currency configuration object.
35
- * @param {boolean} props.showInputFields Whether to show input fields for the values or not.
36
- * @param {boolean} props.showFilterButton Whether to show the filter button for the slider.
37
- * @param {boolean} props.isLoading Whether values are loading or not.
38
- * @param {function():any} props.onSubmit Function to call when submit event fires.
39
  */
40
  const PriceSlider = ( {
41
  minPrice,
@@ -112,6 +101,7 @@ const PriceSlider = ( {
112
  minConstraint,
113
  maxConstraint,
114
  hasValidConstraints,
 
115
  ] );
116
 
117
  /**
@@ -185,14 +175,7 @@ const PriceSlider = ( {
185
  parseInt( values[ 1 ], 10 ),
186
  ] );
187
  },
188
- [
189
- onChange,
190
- minPrice,
191
- maxPrice,
192
- minConstraint,
193
- maxConstraint,
194
- stepValue,
195
- ]
196
  );
197
 
198
  /**
@@ -227,7 +210,14 @@ const PriceSlider = ( {
227
  parseInt( values[ 1 ], 10 ),
228
  ] );
229
  },
230
- [ onChange, stepValue, minPriceInput, maxPriceInput ]
 
 
 
 
 
 
 
231
  );
232
 
233
  const classes = classnames(
@@ -242,13 +232,10 @@ const PriceSlider = ( {
242
  ! hasValidConstraints && 'is-disabled'
243
  );
244
 
245
- const activeElement = isObject( minRange.current )
246
- ? minRange.current.ownerDocument.activeElement
247
- : undefined;
248
  const minRangeStep =
249
- activeElement && activeElement === minRange.current ? stepValue : 1;
250
  const maxRangeStep =
251
- activeElement && activeElement === maxRange.current ? stepValue : 1;
252
 
253
  return (
254
  <div className={ classes }>
@@ -308,7 +295,7 @@ const PriceSlider = ( {
308
  </div>
309
  <div className="wc-block-price-filter__controls wc-block-components-price-slider__controls">
310
  { showInputFields && (
311
- <>
312
  <FormattedMonetaryAmount
313
  currency={ currency }
314
  displayType="input"
@@ -345,7 +332,7 @@ const PriceSlider = ( {
345
  disabled={ isLoading || ! hasValidConstraints }
346
  value={ maxPriceInput }
347
  />
348
- </>
349
  ) }
350
  { ! showInputFields &&
351
  ! isLoading &&
@@ -356,11 +343,13 @@ const PriceSlider = ( {
356
  : &nbsp;
357
  <FormattedMonetaryAmount
358
  currency={ currency }
 
359
  value={ minPrice }
360
  />
361
  &nbsp;&ndash;&nbsp;
362
  <FormattedMonetaryAmount
363
  currency={ currency }
 
364
  value={ maxPrice }
365
  />
366
  </div>
3
  */
4
  import { __ } from '@wordpress/i18n';
5
  import {
6
+ Fragment,
7
  useState,
8
  useEffect,
9
  useCallback,
13
  import PropTypes from 'prop-types';
14
  import classnames from 'classnames';
15
  import FormattedMonetaryAmount from '@woocommerce/base-components/formatted-monetary-amount';
 
16
 
17
  /**
18
  * Internal dependencies
25
  * Price slider component.
26
  *
27
  * @param {Object} props Component props.
 
 
 
 
 
 
 
 
 
 
 
28
  */
29
  const PriceSlider = ( {
30
  minPrice,
101
  minConstraint,
102
  maxConstraint,
103
  hasValidConstraints,
104
+ stepValue,
105
  ] );
106
 
107
  /**
175
  parseInt( values[ 1 ], 10 ),
176
  ] );
177
  },
178
+ [ minPrice, maxPrice, minConstraint, maxConstraint, stepValue ]
 
 
 
 
 
 
 
179
  );
180
 
181
  /**
210
  parseInt( values[ 1 ], 10 ),
211
  ] );
212
  },
213
+ [
214
+ minConstraint,
215
+ maxConstraint,
216
+ stepValue,
217
+ minPriceInput,
218
+ maxPriceInput,
219
+ currency,
220
+ ]
221
  );
222
 
223
  const classes = classnames(
232
  ! hasValidConstraints && 'is-disabled'
233
  );
234
 
 
 
 
235
  const minRangeStep =
236
+ minRange && document.activeElement === minRange.current ? stepValue : 1;
237
  const maxRangeStep =
238
+ maxRange && document.activeElement === maxRange.current ? stepValue : 1;
239
 
240
  return (
241
  <div className={ classes }>
295
  </div>
296
  <div className="wc-block-price-filter__controls wc-block-components-price-slider__controls">
297
  { showInputFields && (
298
+ <Fragment>
299
  <FormattedMonetaryAmount
300
  currency={ currency }
301
  displayType="input"
332
  disabled={ isLoading || ! hasValidConstraints }
333
  value={ maxPriceInput }
334
  />
335
+ </Fragment>
336
  ) }
337
  { ! showInputFields &&
338
  ! isLoading &&
343
  : &nbsp;
344
  <FormattedMonetaryAmount
345
  currency={ currency }
346
+ displayType="text"
347
  value={ minPrice }
348
  />
349
  &nbsp;&ndash;&nbsp;
350
  <FormattedMonetaryAmount
351
  currency={ currency }
352
+ displayType="text"
353
  value={ maxPrice }
354
  />
355
  </div>
assets/js/base/components/price-slider/style.scss CHANGED
@@ -2,8 +2,8 @@
2
  @mixin thumb {
3
  background-color: transparent;
4
  background-position: 0 0;
5
- width: 28px;
6
- height: 23px;
7
  border: 0;
8
  padding: 0;
9
  margin: 0;
@@ -11,8 +11,7 @@
11
  cursor: pointer;
12
  z-index: 20;
13
  pointer-events: auto;
14
- background-image: url("data:image/svg+xml,%3Csvg width='56' height='46' viewBox='0 0 56 46' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cg clip-path='url(%23clip0)'%3E%3Cpath d='M25.3176 9.9423L16.9013 3.7991C15.1953 2.5706 13.2618 1.9003 11.2146 2.0121H11.1009C6.21029 2.3471 2.11589 6.3681 2.00219 11.2827C1.88849 16.644 6.21019 21 11.6696 21H11.7833C13.603 21 15.4228 20.3298 16.9013 19.213L25.3176 12.958C26.2275 12.0645 26.2275 10.7242 25.3176 9.9423V9.9423Z' fill='white' stroke='%23757575'/%3E%3Cpath d='M13 7V16M10 7V16V7Z' stroke='%23B8B8B8'/%3E%3Cpath d='M25.3176 9.94227L16.9013 3.79907C15.1953 2.57057 13.2618 1.90027 11.2146 2.01207H11.1009C6.21029 2.34707 2.11589 6.36807 2.00219 11.2827C1.88849 16.644 6.21019 21 11.6696 21H11.7833C13.603 21 15.4228 20.3298 16.9013 19.213L25.3176 12.958C26.2275 12.0645 26.2275 10.7242 25.3176 9.94227V9.94227Z' fill='white' stroke='%23757575'/%3E%3Cpath d='M13 7V16M10 7V16V7Z' stroke='%23B8B8B8'/%3E%3Cpath d='M25.3176 32.9423L16.9013 26.7991C15.1953 25.5706 13.2618 24.9003 11.2146 25.0121H11.1009C6.21029 25.347 2.11589 29.368 2.00219 34.2827C1.88849 39.644 6.21019 44 11.6696 44H11.7833C13.603 44 15.4228 43.3298 16.9013 42.213L25.3176 35.958C26.2275 35.0645 26.2275 33.7242 25.3176 32.9423V32.9423Z' fill='%23F8F3F7' stroke='white' stroke-opacity='0.75' stroke-width='3'/%3E%3Cpath d='M25.3176 32.9423L16.9013 26.7991C15.1953 25.5706 13.2618 24.9003 11.2146 25.0121H11.1009C6.21029 25.347 2.11589 29.368 2.00219 34.2827C1.88849 39.644 6.21019 44 11.6696 44H11.7833C13.603 44 15.4228 43.3298 16.9013 42.213L25.3176 35.958C26.2275 35.0645 26.2275 33.7242 25.3176 32.9423V32.9423Z' stroke='%23757575'/%3E%3Cpath d='M13 30V39M10 30V39V30Z' stroke='%23757575'/%3E%3Cpath d='M30.6824 9.94227L39.0987 3.79907C40.8047 2.57057 42.7382 1.90027 44.7854 2.01207H44.8991C49.7897 2.34707 53.8841 6.36807 53.9978 11.2827C54.1115 16.644 49.7898 21 44.3304 21H44.2167C42.397 21 40.5772 20.3298 39.0987 19.213L30.6824 12.958C29.7725 12.0645 29.7725 10.7242 30.6824 9.94227V9.94227Z' fill='white' stroke='%23757575'/%3E%3Cpath d='M43 6.99997V16M46 6.99997V16V6.99997Z' stroke='%23B8B8B8'/%3E%3Cpath d='M30.6824 32.9423L39.0987 26.7991C40.8047 25.5706 42.7382 24.9003 44.7854 25.0121H44.8991C49.7897 25.347 53.8841 29.368 53.9978 34.2827C54.1115 39.644 49.7898 44 44.3304 44H44.2167C42.397 44 40.5772 43.3298 39.0987 42.213L30.6824 35.958C29.7725 35.0645 29.7725 33.7242 30.6824 32.9423V32.9423Z' fill='%23F8F3F7' stroke='white' stroke-opacity='0.75' stroke-width='3'/%3E%3Cpath d='M30.6824 32.9423L39.0987 26.7991C40.8047 25.5706 42.7382 24.9003 44.7854 25.0121H44.8991C49.7897 25.347 53.8841 29.368 53.9978 34.2827C54.1115 39.644 49.7898 44 44.3304 44H44.2167C42.397 44 40.5772 43.3298 39.0987 42.213L30.6824 35.958C29.7725 35.0645 29.7725 33.7242 30.6824 32.9423V32.9423Z' stroke='%23757575'/%3E%3Cpath d='M43 30V39M46 30V39V30Z' stroke='%23757575'/%3E%3C/g%3E%3Cdefs%3E%3CclipPath id='clip0'%3E%3Crect width='56' height='46' fill='white'/%3E%3C/clipPath%3E%3C/defs%3E%3C/svg%3E%0A");
15
-
16
  transition: transform .2s ease-in-out;
17
  -webkit-appearance: none;
18
  -moz-appearance: none;
@@ -20,11 +19,12 @@
20
 
21
  &:hover {
22
  @include thumbFocus;
 
23
  }
24
  }
25
  @mixin thumbFocus {
26
- background-position-y: -23px;
27
- transform: scale(1.1);
28
  }
29
  /* stylelint-enable */
30
  @mixin track {
@@ -49,6 +49,46 @@
49
  .wc-block-components-price-slider {
50
  margin-bottom: $gap-large;
51
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
52
  &.wc-block-components-price-slider--has-filter-button {
53
  .wc-block-components-price-slider__controls {
54
  justify-content: flex-end;
@@ -59,211 +99,172 @@
59
  }
60
  }
61
  }
62
-
63
- &.is-loading,
64
- &.is-disabled {
65
- .wc-block-components-price-slider__range-input-wrapper,
66
- .wc-block-components-price-slider__amount,
67
- .wc-block-components-price-slider__button {
68
- @include placeholder();
69
- box-shadow: none;
 
 
 
70
  }
71
- }
72
-
73
- &.is-disabled:not(.is-loading) {
74
- .wc-block-components-price-slider__range-input-wrapper,
75
- .wc-block-components-price-slider__amount,
76
- .wc-block-components-price-slider__button {
77
- animation: none;
78
  }
79
- }
80
- }
81
-
82
- .wc-block-components-price-slider__range-input-wrapper {
83
- @include reset;
84
- height: 9px;
85
- clear: both;
86
- position: relative;
87
- box-shadow: 0 0 0 1px inset rgba(0, 0, 0, 0.1);
88
- background: #e1e1e1;
89
- margin: 15px 0;
90
- }
91
-
92
- .wc-block-components-price-slider__range-input-progress {
93
- height: 9px;
94
- width: 100%;
95
- position: absolute;
96
- left: 0;
97
- top: 0;
98
- --track-background: linear-gradient(to right, transparent var(--low), var(--range-color) 0, var(--range-color) var(--high), transparent 0) no-repeat 0 100% / 100% 100%;
99
- --range-color: #{$studio-woocommerce-purple-30};
100
- /*rtl:ignore*/
101
- background: var(--track-background);
102
- }
103
-
104
- .wc-block-components-price-slider__controls {
105
- display: flex;
106
-
107
- .wc-block-components-price-slider__amount {
108
- margin: 0;
109
- border-radius: 4px;
110
- width: auto;
111
- max-width: 100px;
112
- min-width: 0;
113
 
114
- &.wc-block-components-price-slider__amount--min {
115
- margin-right: 10px;
116
  }
117
- &.wc-block-components-price-slider__amount--max {
118
- margin-left: auto;
119
  }
120
- }
121
- }
122
- .wc-block-components-price-slider__range-input {
123
- @include reset;
124
- width: 100%;
125
- height: 0;
126
- display: block;
127
- position: relative;
128
- pointer-events: none;
129
- outline: none !important;
130
- position: absolute;
131
- left: 0;
132
- top: 0;
133
-
134
- &::-webkit-slider-runnable-track {
135
- @include track;
136
- }
137
- &::-webkit-slider-thumb {
138
- @include thumb;
139
- margin: -6px 0 0 0;
140
- }
141
- &::-webkit-slider-progress {
142
- @include reset;
143
- }
144
-
145
- &::-moz-focus-outer {
146
- border: 0;
147
- }
148
- &::-moz-range-track {
149
- @include track;
150
- }
151
- &::-moz-range-progress {
152
- @include reset;
153
- }
154
- &::-moz-range-thumb {
155
- @include thumb;
156
- }
157
-
158
- &::-ms-thumb {
159
- @include thumb;
160
- }
161
-
162
- &:focus {
163
- &::-webkit-slider-thumb {
164
- @include thumbFocus;
165
  }
166
  &::-moz-range-thumb {
167
- @include thumbFocus;
168
  }
 
169
  &::-ms-thumb {
170
- @include thumbFocus;
171
  }
172
- }
173
-
174
- &.wc-block-components-price-slider__range-input--min {
175
- z-index: 21;
176
 
177
- &::-webkit-slider-thumb {
178
- margin-left: -2px;
179
- background-position-x: left;
180
- }
181
- &::-moz-range-thumb {
182
- background-position-x: left;
183
- transform: translate(-2px, 4px);
 
 
 
184
  }
185
- &::-ms-thumb {
186
- background-position-x: left;
 
 
 
 
 
 
 
 
 
 
 
 
 
187
  }
188
- }
189
 
190
- &.wc-block-components-price-slider__range-input--max {
191
- z-index: 20;
192
 
193
- &::-webkit-slider-thumb {
194
- background-position-x: right;
195
- margin-left: 2px;
 
 
 
 
 
 
 
 
196
  }
197
- &::-moz-range-thumb {
198
- background-position-x: right;
199
- transform: translate(2px, 4px);
 
 
 
 
 
 
200
  }
201
- &::-ms-thumb {
202
- background-position-x: right;
 
 
 
 
 
203
  }
204
  }
205
  }
206
 
207
  .rtl {
208
- .wc-block-components-price-slider__range-input-progress {
209
  --track-background: linear-gradient(to left, transparent var(--low), var(--range-color) 0, var(--range-color) var(--high), transparent 0) no-repeat 0 100% / 100% 100%;
210
- --range-color: #{$studio-woocommerce-purple-30};
211
  background: var(--track-background);
212
  }
213
  }
214
 
215
- @mixin ie-fixes() {
216
- .wc-block-components-price-slider__range-input-wrapper {
217
- background: transparent;
218
- box-shadow: none;
219
- height: 24px;
220
- }
221
- .wc-block-components-price-slider__range-input-progress {
222
- background: #{$studio-woocommerce-purple-30};
223
- width: 100%;
224
- top: 7px;
225
- }
226
- .wc-block-components-price-slider__range-input {
227
- height: 24px;
228
- pointer-events: auto;
229
-
230
- &::-ms-track {
231
- /*remove bg colour from the track, we'll use ms-fill-lower and ms-fill-upper instead */
232
  background: transparent;
 
 
233
 
234
- /*leave room for the larger thumb to overflow with a transparent border */
235
- border-color: transparent;
236
- border-width: 7px 0;
237
-
238
- /*remove default tick marks*/
239
- color: transparent;
240
- }
241
- &::-ms-fill-lower {
242
- background: #e1e1e1;
243
- box-shadow: 0 0 0 1px inset #b8b8b8;
244
- }
245
- &::-ms-fill-upper {
246
- background: transparent;
247
- }
248
- &::-ms-tooltip {
249
- display: none;
250
  }
251
- &::-ms-thumb {
252
- transform: translate(1px, 0);
253
  pointer-events: auto;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
254
  }
255
- }
256
- .wc-block-components-price-slider__range-input--max {
257
- &::-ms-fill-upper {
258
- background: #e1e1e1;
259
- box-shadow: 0 0 0 1px inset #b8b8b8;
260
- }
261
- &::-ms-fill-lower {
262
- background: transparent;
263
  }
264
- }
265
 
266
- .wc-block-components-price-slider {
267
  &.is-loading,
268
  &.is-disabled {
269
  .wc-block-components-price-slider__range-input-wrapper {
@@ -281,80 +282,9 @@
281
  }
282
 
283
  /* IE 11 will not support multi-range slider due to poor pointer-events support on the thumb. Reverts to 2 sliders. */
284
- @include ie11() {
285
- @include ie-fixes();
286
  }
287
-
288
- // Targets Edge <= 18.
289
  @supports (-ms-ime-align:auto) {
290
- @include ie-fixes();
291
- }
292
-
293
- .theme-twentytwentyone {
294
- $border-width: 3px;
295
-
296
- .wc-block-components-price-slider__range-input-wrapper {
297
- background: transparent;
298
- border: $border-width solid currentColor;
299
- box-sizing: border-box;
300
- }
301
-
302
- .wc-block-components-price-slider__range-input-progress {
303
- --range-color: currentColor;
304
- margin: -$border-width;
305
- }
306
-
307
- .wc-block-price-filter__range-input {
308
- background: transparent;
309
- margin: -$border-width;
310
- width: calc(100% + #{$border-width * 2});
311
-
312
- &:hover,
313
- &:focus {
314
- &::-webkit-slider-thumb {
315
- filter: none;
316
- }
317
- &::-moz-range-thumb {
318
- filter: none;
319
- }
320
- &::-ms-thumb {
321
- filter: none;
322
- }
323
- }
324
-
325
- &::-webkit-slider-thumb {
326
- margin-top: -9px;
327
- }
328
-
329
- &.wc-block-components-price-slider__range-input--max::-moz-range-thumb {
330
- transform: translate(2px, 1px);
331
- }
332
-
333
- &.wc-block-components-price-slider__range-input--min::-moz-range-thumb {
334
- transform: translate(-2px, 1px);
335
- }
336
-
337
- &::-ms-track {
338
- border-color: transparent !important;
339
- }
340
- }
341
-
342
- @include ie11() {
343
- .wc-block-components-price-slider__range-input-wrapper {
344
- border: 0;
345
- height: auto;
346
- position: relative;
347
- height: 50px;
348
- }
349
-
350
- .wc-block-components-price-slider__range-input-progress {
351
- display: none;
352
- }
353
-
354
- .wc-block-price-filter__range-input {
355
- height: 100%;
356
- margin: 0;
357
- width: 100%;
358
- }
359
- }
360
  }
2
  @mixin thumb {
3
  background-color: transparent;
4
  background-position: 0 0;
5
+ width: 26px;
6
+ height: 21px;
7
  border: 0;
8
  padding: 0;
9
  margin: 0;
11
  cursor: pointer;
12
  z-index: 20;
13
  pointer-events: auto;
14
+ background-image: url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink' width='52' height='42'%3E%3Cdefs%3E%3Cpath id='a' d='M23.3176 7.9423l-8.4163-6.1432C13.1953.5706 11.2618-.0997 9.2146.0121h-.1137C4.2103.347.1159 4.368.0022 9.2827-.1115 14.644 4.2102 19 9.6696 19h.1137c1.8197 0 3.6395-.6702 5.118-1.787l8.4163-6.255c.9099-.8935.9099-2.2338 0-3.0157z'/%3E%3Cpath id='b' d='M23.3176 7.9423l-8.4163-6.1432C13.1953.5706 11.2618-.0997 9.2146.0121h-.1137C4.2103.347.1159 4.368.0022 9.2827-.1115 14.644 4.2102 19 9.6696 19h.1137c1.8197 0 3.6395-.6702 5.118-1.787l8.4163-6.255c.9099-.8935.9099-2.2338 0-3.0157z'/%3E%3C/defs%3E%3Cg fill='none' fill-rule='evenodd'%3E%3Cpath fill='%23FFF' fill-rule='nonzero' stroke='%2395588A' d='M24.3176 8.9423l-8.4163-6.1432c-1.706-1.2285-3.6395-1.8988-5.6867-1.787h-.1137c-4.8906.335-8.985 4.356-9.0987 9.2706C.8885 15.644 5.2102 20 10.6696 20h.1137c1.8197 0 3.6395-.6702 5.118-1.787l8.4163-6.255c.9099-.8935.9099-2.2338 0-3.0157z'/%3E%3Cpath stroke='%23B8B8B8' d='M9 6v9m3-9v9'/%3E%3Cg fill-rule='nonzero' transform='translate(1 22)'%3E%3Cuse fill='%23F8F3F7' stroke='%23FFF' stroke-opacity='.75' stroke-width='3' xlink:href='%23a'/%3E%3Cuse stroke='%2395588A' xlink:href='%23a'/%3E%3C/g%3E%3Cpath stroke='%2395588A' d='M9 27v9m3-9v9'/%3E%3Cg%3E%3Cpath fill='%23FFF' fill-rule='nonzero' stroke='%2395588A' d='M27.6824 8.9423l8.4163-6.1432c1.706-1.2285 3.6395-1.8988 5.6867-1.787h.1137c4.8906.335 8.985 4.356 9.0987 9.2706C51.1115 15.644 46.7898 20 41.3304 20h-.1137c-1.8197 0-3.6395-.6702-5.118-1.787l-8.4163-6.255c-.9099-.8935-.9099-2.2338 0-3.0157z'/%3E%3Cpath stroke='%23B8B8B8' d='M43 6v9m-3-9v9'/%3E%3C/g%3E%3Cg%3E%3Cg fill-rule='nonzero' transform='matrix(-1 0 0 1 51 22)'%3E%3Cuse fill='%23F8F3F7' stroke='%23FFF' stroke-opacity='.75' stroke-width='3' xlink:href='%23b'/%3E%3Cuse stroke='%2395588A' xlink:href='%23b'/%3E%3C/g%3E%3Cpath stroke='%2395588A' d='M43 27v9m-3-9v9'/%3E%3C/g%3E%3C/g%3E%3C/svg%3E");
 
15
  transition: transform .2s ease-in-out;
16
  -webkit-appearance: none;
17
  -moz-appearance: none;
19
 
20
  &:hover {
21
  @include thumbFocus;
22
+ transform: scale(1.1);
23
  }
24
  }
25
  @mixin thumbFocus {
26
+ background-position-y: -21px;
27
+ filter: drop-shadow(3px 0 0 rgba(255, 255, 255, .75)) drop-shadow(-3px 0 0 rgba(255, 255, 255, .75));
28
  }
29
  /* stylelint-enable */
30
  @mixin track {
49
  .wc-block-components-price-slider {
50
  margin-bottom: $gap-large;
51
 
52
+ .wc-block-components-price-slider__range-input-wrapper {
53
+ @include reset;
54
+ height: 9px;
55
+ clear: both;
56
+ position: relative;
57
+ box-shadow: 0 0 0 1px inset rgba(0, 0, 0, 0.1);
58
+ background: #e1e1e1;
59
+ margin: 15px 0;
60
+
61
+ .wc-block-components-price-slider__range-input-progress {
62
+ height: 9px;
63
+ width: 100%;
64
+ position: absolute;
65
+ left: 0;
66
+ top: 0;
67
+ --track-background: linear-gradient(to right, transparent var(--low), var(--range-color) 0, var(--range-color) var(--high), transparent 0) no-repeat 0 100% / 100% 100%;
68
+ --range-color: #a8739d;
69
+ /*rtl:ignore*/
70
+ background: var(--track-background);
71
+ }
72
+ }
73
+
74
+ .wc-block-components-price-slider__controls {
75
+ display: flex;
76
+
77
+ .wc-block-components-price-slider__amount {
78
+ margin: 0;
79
+ border-radius: 4px;
80
+ width: auto;
81
+ max-width: 100px;
82
+ min-width: 0;
83
+
84
+ &.wc-block-components-price-slider__amount--min {
85
+ margin-right: 10px;
86
+ }
87
+ &.wc-block-components-price-slider__amount--max {
88
+ margin-left: auto;
89
+ }
90
+ }
91
+ }
92
  &.wc-block-components-price-slider--has-filter-button {
93
  .wc-block-components-price-slider__controls {
94
  justify-content: flex-end;
99
  }
100
  }
101
  }
102
+ .wc-block-components-price-slider__range-input {
103
+ @include reset;
104
+ width: 100%;
105
+ height: 0;
106
+ display: block;
107
+ position: relative;
108
+ pointer-events: none;
109
+ outline: none !important;
110
+
111
+ &::-webkit-slider-runnable-track {
112
+ @include track;
113
  }
114
+ &::-webkit-slider-thumb {
115
+ @include thumb;
116
+ margin: -6px 0 0 0;
117
+ }
118
+ &::-webkit-slider-progress {
119
+ @include reset;
 
120
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
121
 
122
+ &::-moz-focus-outer {
123
+ border: 0;
124
  }
125
+ &::-moz-range-track {
126
+ @include track;
127
  }
128
+ &::-moz-range-progress {
129
+ @include reset;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
130
  }
131
  &::-moz-range-thumb {
132
+ @include thumb;
133
  }
134
+
135
  &::-ms-thumb {
136
+ @include thumb;
137
  }
 
 
 
 
138
 
139
+ &:focus {
140
+ &::-webkit-slider-thumb {
141
+ @include thumbFocus;
142
+ }
143
+ &::-moz-range-thumb {
144
+ @include thumbFocus;
145
+ }
146
+ &::-ms-thumb {
147
+ @include thumbFocus;
148
+ }
149
  }
150
+
151
+ &.wc-block-components-price-slider__range-input--min {
152
+ z-index: 21;
153
+
154
+ &::-webkit-slider-thumb {
155
+ margin-left: -2px;
156
+ background-position-x: left;
157
+ }
158
+ &::-moz-range-thumb {
159
+ background-position-x: left;
160
+ transform: translate(-2px, 4px);
161
+ }
162
+ &::-ms-thumb {
163
+ background-position-x: left;
164
+ }
165
  }
 
166
 
167
+ &.wc-block-components-price-slider__range-input--max {
168
+ z-index: 20;
169
 
170
+ &::-webkit-slider-thumb {
171
+ background-position-x: right;
172
+ margin-left: 2px;
173
+ }
174
+ &::-moz-range-thumb {
175
+ background-position-x: right;
176
+ transform: translate(2px, 4px);
177
+ }
178
+ &::-ms-thumb {
179
+ background-position-x: right;
180
+ }
181
  }
182
+ }
183
+
184
+ &.is-loading,
185
+ &.is-disabled {
186
+ .wc-block-components-price-slider__range-input-wrapper,
187
+ .wc-block-components-price-slider__amount,
188
+ .wc-block-components-price-slider__button {
189
+ @include placeholder();
190
+ box-shadow: none;
191
  }
192
+ }
193
+
194
+ &.is-disabled:not(.is-loading) {
195
+ .wc-block-components-price-slider__range-input-wrapper,
196
+ .wc-block-components-price-slider__amount,
197
+ .wc-block-components-price-slider__button {
198
+ animation: none;
199
  }
200
  }
201
  }
202
 
203
  .rtl {
204
+ .wc-block-components-price-slider .wc-block-components-price-slider__range-input-wrapper .wc-block-components-price-slider__range-input-progress {
205
  --track-background: linear-gradient(to left, transparent var(--low), var(--range-color) 0, var(--range-color) var(--high), transparent 0) no-repeat 0 100% / 100% 100%;
206
+ --range-color: #a8739d;
207
  background: var(--track-background);
208
  }
209
  }
210
 
211
+ @mixin ie {
212
+ .wc-block-components-price-slider {
213
+ .wc-block-components-price-slider__range-input-wrapper {
 
 
 
 
 
 
 
 
 
 
 
 
 
 
214
  background: transparent;
215
+ box-shadow: none;
216
+ height: 24px;
217
 
218
+ .wc-block-components-price-slider__range-input-progress {
219
+ background: #a8739d;
220
+ box-shadow: 0 0 0 1px inset #95588a;
221
+ width: 100%;
222
+ top: 7px;
223
+ }
 
 
 
 
 
 
 
 
 
 
224
  }
225
+ .wc-block-components-price-slider__range-input {
226
+ height: 24px;
227
  pointer-events: auto;
228
+ position: absolute;
229
+ left: 0;
230
+ top: 0;
231
+
232
+ &::-ms-track {
233
+ /*remove bg colour from the track, we'll use ms-fill-lower and ms-fill-upper instead */
234
+ background: transparent;
235
+
236
+ /*leave room for the larger thumb to overflow with a transparent border */
237
+ border-color: transparent;
238
+ border-width: 7px 0;
239
+
240
+ /*remove default tick marks*/
241
+ color: transparent;
242
+ }
243
+ &::-ms-fill-lower {
244
+ background: #e1e1e1;
245
+ box-shadow: 0 0 0 1px inset #b8b8b8;
246
+ }
247
+ &::-ms-fill-upper {
248
+ background: transparent;
249
+ }
250
+ &::-ms-tooltip {
251
+ display: none;
252
+ }
253
+ &::-ms-thumb {
254
+ transform: translate(1px, 0);
255
+ pointer-events: auto;
256
+ }
257
  }
258
+ .wc-block-components-price-slider__range-input--max {
259
+ &::-ms-fill-upper {
260
+ background: #e1e1e1;
261
+ box-shadow: 0 0 0 1px inset #b8b8b8;
262
+ }
263
+ &::-ms-fill-lower {
264
+ background: transparent;
265
+ }
266
  }
 
267
 
 
268
  &.is-loading,
269
  &.is-disabled {
270
  .wc-block-components-price-slider__range-input-wrapper {
282
  }
283
 
284
  /* IE 11 will not support multi-range slider due to poor pointer-events support on the thumb. Reverts to 2 sliders. */
285
+ @media all and (-ms-high-contrast: none), (-ms-high-contrast: active) {
286
+ @include ie;
287
  }
 
 
288
  @supports (-ms-ime-align:auto) {
289
+ @include ie;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
290
  }
assets/js/base/components/price-slider/test/constrain-range-slider-values.js CHANGED
@@ -5,23 +5,23 @@ import { constrainRangeSliderValues } from '../constrain-range-slider-values';
5
 
6
  describe( 'constrainRangeSliderValues', () => {
7
  test.each`
8
- values | min | max | step | isMin | expected
9
- ${ [ 20, 60 ] } | ${ 0 } | ${ 70 } | ${ 10 } | ${ true } | ${ [ 20, 60 ] }
10
- ${ [ 20, 60 ] } | ${ 20 } | ${ 60 } | ${ 10 } | ${ true } | ${ [ 20, 60 ] }
11
- ${ [ 20, 60 ] } | ${ 30 } | ${ 50 } | ${ 10 } | ${ true } | ${ [ 30, 50 ] }
12
- ${ [ 50, 50 ] } | ${ 20 } | ${ 60 } | ${ 10 } | ${ true } | ${ [ 50, 60 ] }
13
- ${ [ 50, 50 ] } | ${ 20 } | ${ 60 } | ${ 10 } | ${ false } | ${ [ 40, 50 ] }
14
- ${ [ 20, 60 ] } | ${ null } | ${ null } | ${ 10 } | ${ true } | ${ [ 20, 60 ] }
15
- ${ [ null, null ] } | ${ 20 } | ${ 60 } | ${ 10 } | ${ true } | ${ [ 20, 60 ] }
16
- ${ [ '20', '60' ] } | ${ 30 } | ${ 50 } | ${ 10 } | ${ true } | ${ [ 30, 50 ] }
17
- ${ [ -60, -20 ] } | ${ -70 } | ${ 0 } | ${ 10 } | ${ true } | ${ [ -60, -20 ] }
18
- ${ [ -60, -20 ] } | ${ -60 } | ${ -20 } | ${ 10 } | ${ true } | ${ [ -60, -20 ] }
19
- ${ [ -60, -20 ] } | ${ -50 } | ${ -30 } | ${ 10 } | ${ true } | ${ [ -50, -30 ] }
20
- ${ [ -50, -50 ] } | ${ -60 } | ${ -20 } | ${ 10 } | ${ true } | ${ [ -50, -40 ] }
21
- ${ [ -50, -50 ] } | ${ -60 } | ${ -20 } | ${ 10 } | ${ false } | ${ [ -60, -50 ] }
22
- ${ [ -60, -20 ] } | ${ null } | ${ null } | ${ 10 } | ${ true } | ${ [ -60, -20 ] }
23
- ${ [ null, null ] } | ${ -60 } | ${ -20 } | ${ 10 } | ${ true } | ${ [ -60, -20 ] }
24
- ${ [ '-60', '-20' ] } | ${ -50 } | ${ -30 } | ${ 10 } | ${ true } | ${ [ -50, -30 ] }
25
  `(
26
  `correctly sets prices to its constraints with arguments values: $values, min: $min, max: $max, step: $step and isMin: $isMin`,
27
  ( { values, min, max, step, isMin, expected } ) => {
5
 
6
  describe( 'constrainRangeSliderValues', () => {
7
  test.each`
8
+ values | min | max | step | isMin | expected
9
+ ${[ 20, 60 ]} | ${0} | ${70} | ${10} | ${true} | ${[ 20, 60 ]}
10
+ ${[ 20, 60 ]} | ${20} | ${60} | ${10} | ${true} | ${[ 20, 60 ]}
11
+ ${[ 20, 60 ]} | ${30} | ${50} | ${10} | ${true} | ${[ 30, 50 ]}
12
+ ${[ 50, 50 ]} | ${20} | ${60} | ${10} | ${true} | ${[ 50, 60 ]}
13
+ ${[ 50, 50 ]} | ${20} | ${60} | ${10} | ${false} | ${[ 40, 50 ]}
14
+ ${[ 20, 60 ]} | ${null} | ${null} | ${10} | ${true} | ${[ 20, 60 ]}
15
+ ${[ null, null ]} | ${20} | ${60} | ${10} | ${true} | ${[ 20, 60 ]}
16
+ ${[ '20', '60' ]} | ${30} | ${50} | ${10} | ${true} | ${[ 30, 50 ]}
17
+ ${[ -60, -20 ]} | ${-70} | ${0} | ${10} | ${true} | ${[ -60, -20 ]}
18
+ ${[ -60, -20 ]} | ${-60} | ${-20} | ${10} | ${true} | ${[ -60, -20 ]}
19
+ ${[ -60, -20 ]} | ${-50} | ${-30} | ${10} | ${true} | ${[ -50, -30 ]}
20
+ ${[ -50, -50 ]} | ${-60} | ${-20} | ${10} | ${true} | ${[ -50, -40 ]}
21
+ ${[ -50, -50 ]} | ${-60} | ${-20} | ${10} | ${false} | ${[ -60, -50 ]}
22
+ ${[ -60, -20 ]} | ${null} | ${null} | ${10} | ${true} | ${[ -60, -20 ]}
23
+ ${[ null, null ]} | ${-60} | ${-20} | ${10} | ${true} | ${[ -60, -20 ]}
24
+ ${[ '-60', '-20' ]} | ${-50} | ${-30} | ${10} | ${true} | ${[ -50, -30 ]}
25
  `(
26
  `correctly sets prices to its constraints with arguments values: $values, min: $min, max: $max, step: $step and isMin: $isMin`,
27
  ( { values, min, max, step, isMin, expected } ) => {
assets/js/base/components/{product-list/product-list-item → product-list-item}/index.js RENAMED
File without changes
assets/js/base/components/{product-list/product-list-item → product-list-item}/utils.js RENAMED
File without changes
assets/js/base/components/product-list/container.js CHANGED
@@ -7,12 +7,9 @@ import PropTypes from 'prop-types';
7
  /**
8
  * Internal dependencies
9
  */
10
- import ProductList from './product-list';
11
 
12
- const ProductListContainer = ( {
13
- attributes,
14
- hideOutOfStockItems = false,
15
- } ) => {
16
  const [ currentPage, setPage ] = useState( 1 );
17
  const [ currentSort, setSort ] = useState( attributes.orderby );
18
  useEffect( () => {
@@ -31,7 +28,6 @@ const ProductListContainer = ( {
31
  return (
32
  <ProductList
33
  attributes={ attributes }
34
- hideOutOfStockItems={ hideOutOfStockItems }
35
  currentPage={ currentPage }
36
  onPageChange={ onPageChange }
37
  onSortChange={ onSortChange }
@@ -42,7 +38,6 @@ const ProductListContainer = ( {
42
 
43
  ProductListContainer.propTypes = {
44
  attributes: PropTypes.object.isRequired,
45
- hideOutOfStockItems: PropTypes.bool,
46
  };
47
 
48
  export default ProductListContainer;
7
  /**
8
  * Internal dependencies
9
  */
10
+ import ProductList from './index';
11
 
12
+ const ProductListContainer = ( { attributes } ) => {
 
 
 
13
  const [ currentPage, setPage ] = useState( 1 );
14
  const [ currentSort, setSort ] = useState( attributes.orderby );
15
  useEffect( () => {
28
  return (
29
  <ProductList
30
  attributes={ attributes }
 
31
  currentPage={ currentPage }
32
  onPageChange={ onPageChange }
33
  onSortChange={ onSortChange }
38
 
39
  ProductListContainer.propTypes = {
40
  attributes: PropTypes.object.isRequired,
 
41
  };
42
 
43
  export default ProductListContainer;
assets/js/base/components/product-list/index.js CHANGED
@@ -1,2 +1,236 @@
1
- export { default as ProductList } from './product-list';
2
- export { default as ProductListContainer } from './container';
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /**
2
+ * External dependencies
3
+ */
4
+ import { __, _n, sprintf } from '@wordpress/i18n';
5
+ import { isEqual } from 'lodash';
6
+ import PropTypes from 'prop-types';
7
+ import classnames from 'classnames';
8
+ import Pagination from '@woocommerce/base-components/pagination';
9
+ import ProductSortSelect from '@woocommerce/base-components/product-sort-select';
10
+ import ProductListItem from '@woocommerce/base-components/product-list-item';
11
+ import { useEffect } from '@wordpress/element';
12
+ import {
13
+ usePrevious,
14
+ useStoreProducts,
15
+ useSynchronizedQueryState,
16
+ useQueryStateByKey,
17
+ } from '@woocommerce/base-hooks';
18
+ import withScrollToTop from '@woocommerce/base-hocs/with-scroll-to-top';
19
+ import { useInnerBlockLayoutContext } from '@woocommerce/shared-context';
20
+ import { speak } from '@wordpress/a11y';
21
+
22
+ /**
23
+ * Internal dependencies
24
+ */
25
+ import './style.scss';
26
+ import NoProducts from './no-products';
27
+ import NoMatchingProducts from './no-matching-products';
28
+
29
+ const generateQuery = ( { sortValue, currentPage, attributes } ) => {
30
+ const { columns, rows } = attributes;
31
+ const getSortArgs = ( orderName ) => {
32
+ switch ( orderName ) {
33
+ case 'menu_order':
34
+ case 'popularity':
35
+ case 'rating':
36
+ case 'price':
37
+ return {
38
+ orderby: orderName,
39
+ order: 'asc',
40
+ };
41
+ case 'price-desc':
42
+ return {
43
+ orderby: 'price',
44
+ order: 'desc',
45
+ };
46
+ case 'date':
47
+ return {
48
+ orderby: 'date',
49
+ order: 'desc',
50
+ };
51
+ }
52
+ };
53
+ return {
54
+ ...getSortArgs( sortValue ),
55
+ catalog_visibility: 'catalog',
56
+ per_page: columns * rows,
57
+ page: currentPage,
58
+ };
59
+ };
60
+
61
+ /**
62
+ * Given a query state, returns the same query without the attributes related to
63
+ * pagination and sorting.
64
+ *
65
+ * @param {Object} query Query to extract the attributes from.
66
+ *
67
+ * @return {Object} Same query without pagination and sorting attributes.
68
+ */
69
+
70
+ const extractPaginationAndSortAttributes = ( query ) => {
71
+ /* eslint-disable-next-line no-unused-vars, camelcase */
72
+ const { order, orderby, page, per_page, ...totalQuery } = query;
73
+ return totalQuery;
74
+ };
75
+
76
+ const announceLoadingCompletion = ( totalProducts ) => {
77
+ if ( ! Number.isFinite( totalProducts ) ) {
78
+ return;
79
+ }
80
+
81
+ if ( totalProducts === 0 ) {
82
+ speak( __( 'No products found', 'woo-gutenberg-products-block' ) );
83
+ } else {
84
+ speak(
85
+ sprintf(
86
+ // translators: %s is an integer higher than 0 (1, 2, 3...)
87
+ _n(
88
+ '%d product found',
89
+ '%d products found',
90
+ totalProducts,
91
+ 'woo-gutenberg-products-block'
92
+ ),
93
+ totalProducts
94
+ )
95
+ );
96
+ }
97
+ };
98
+
99
+ const ProductList = ( {
100
+ attributes,
101
+ currentPage,
102
+ onPageChange,
103
+ onSortChange,
104
+ sortValue,
105
+ scrollToTop,
106
+ } ) => {
107
+ const [ queryState ] = useSynchronizedQueryState(
108
+ generateQuery( {
109
+ attributes,
110
+ sortValue,
111
+ currentPage,
112
+ } )
113
+ );
114
+ const { products, totalProducts, productsLoading } = useStoreProducts(
115
+ queryState
116
+ );
117
+ const { parentClassName } = useInnerBlockLayoutContext();
118
+ const totalQuery = extractPaginationAndSortAttributes( queryState );
119
+
120
+ // These are possible filters.
121
+ const [ productAttributes, setProductAttributes ] = useQueryStateByKey(
122
+ 'attributes',
123
+ []
124
+ );
125
+ const [ minPrice, setMinPrice ] = useQueryStateByKey( 'min_price' );
126
+ const [ maxPrice, setMaxPrice ] = useQueryStateByKey( 'max_price' );
127
+
128
+ // Only update previous query totals if the query is different and
129
+ // the total number of products is a finite number.
130
+ const previousQueryTotals = usePrevious(
131
+ { totalQuery, totalProducts },
132
+ (
133
+ { totalQuery: nextQuery, totalProducts: nextProducts },
134
+ { totalQuery: currentQuery } = {}
135
+ ) =>
136
+ ! isEqual( nextQuery, currentQuery ) &&
137
+ Number.isFinite( nextProducts )
138
+ );
139
+ const isPreviousTotalQueryEqual =
140
+ typeof previousQueryTotals === 'object' &&
141
+ isEqual( totalQuery, previousQueryTotals.totalQuery );
142
+ useEffect( () => {
143
+ // If query state (excluding pagination/sorting attributes) changed,
144
+ // reset pagination to the first page.
145
+ if ( ! isPreviousTotalQueryEqual ) {
146
+ onPageChange( 1 );
147
+
148
+ // Make sure there was a previous query, so we don't announce it on page load.
149
+ if ( previousQueryTotals ) {
150
+ announceLoadingCompletion( totalProducts );
151
+ }
152
+ }
153
+ }, [ queryState ] );
154
+
155
+ const onPaginationChange = ( newPage ) => {
156
+ scrollToTop( { focusableSelector: 'a, button' } );
157
+ onPageChange( newPage );
158
+ };
159
+
160
+ const getClassnames = () => {
161
+ const { columns, rows, alignButtons, align } = attributes;
162
+ const alignClass = typeof align !== 'undefined' ? 'align' + align : '';
163
+
164
+ return classnames(
165
+ parentClassName,
166
+ alignClass,
167
+ 'has-' + columns + '-columns',
168
+ {
169
+ 'has-multiple-rows': rows > 1,
170
+ 'has-aligned-buttons': alignButtons,
171
+ }
172
+ );
173
+ };
174
+
175
+ const { contentVisibility } = attributes;
176
+ const perPage = attributes.columns * attributes.rows;
177
+ const totalPages =
178
+ ! Number.isFinite( totalProducts ) && isPreviousTotalQueryEqual
179
+ ? Math.ceil( previousQueryTotals.totalProducts / perPage )
180
+ : Math.ceil( totalProducts / perPage );
181
+ const listProducts = products.length
182
+ ? products
183
+ : Array.from( { length: perPage } );
184
+ const hasProducts = products.length !== 0 || productsLoading;
185
+ const hasFilters =
186
+ productAttributes.length > 0 ||
187
+ Number.isFinite( minPrice ) ||
188
+ Number.isFinite( maxPrice );
189
+
190
+ return (
191
+ <div className={ getClassnames() }>
192
+ { contentVisibility.orderBy && hasProducts && (
193
+ <ProductSortSelect
194
+ onChange={ onSortChange }
195
+ value={ sortValue }
196
+ />
197
+ ) }
198
+ { ! hasProducts && hasFilters && (
199
+ <NoMatchingProducts
200
+ resetCallback={ () => {
201
+ setProductAttributes( [] );
202
+ setMinPrice( null );
203
+ setMaxPrice( null );
204
+ } }
205
+ />
206
+ ) }
207
+ { ! hasProducts && ! hasFilters && <NoProducts /> }
208
+ { hasProducts && (
209
+ <ul className={ `${ parentClassName }__products` }>
210
+ { listProducts.map( ( product = {}, i ) => (
211
+ <ProductListItem
212
+ key={ product.id || i }
213
+ attributes={ attributes }
214
+ product={ product }
215
+ />
216
+ ) ) }
217
+ </ul>
218
+ ) }
219
+ { totalPages > 1 && (
220
+ <Pagination
221
+ currentPage={ currentPage }
222
+ onPageChange={ onPaginationChange }
223
+ totalPages={ totalPages }
224
+ />
225
+ ) }
226
+ </div>
227
+ );
228
+ };
229
+
230
+ ProductList.propTypes = {
231
+ attributes: PropTypes.object.isRequired,
232
+ // From withScrollToTop.
233
+ scrollToTop: PropTypes.func,
234
+ };
235
+
236
+ export default withScrollToTop( ProductList );
assets/js/base/components/product-list/product-list.js DELETED
@@ -1,262 +0,0 @@
1
- /**
2
- * External dependencies
3
- */
4
- import { __, _n, sprintf } from '@wordpress/i18n';
5
- import { isEqual } from 'lodash';
6
- import PropTypes from 'prop-types';
7
- import classnames from 'classnames';
8
- import Pagination from '@woocommerce/base-components/pagination';
9
- import { useEffect } from '@wordpress/element';
10
- import { usePrevious } from '@woocommerce/base-hooks';
11
- import {
12
- useStoreEvents,
13
- useStoreProducts,
14
- useSynchronizedQueryState,
15
- useQueryStateByKey,
16
- } from '@woocommerce/base-context/hooks';
17
- import withScrollToTop from '@woocommerce/base-hocs/with-scroll-to-top';
18
- import { useInnerBlockLayoutContext } from '@woocommerce/shared-context';
19
- import { speak } from '@wordpress/a11y';
20
-
21
- /**
22
- * Internal dependencies
23
- */
24
- import NoProducts from './no-products';
25
- import NoMatchingProducts from './no-matching-products';
26
- import ProductSortSelect from './product-sort-select';
27
- import ProductListItem from './product-list-item';
28
- import './style.scss';
29
-
30
- const generateQuery = ( {
31
- sortValue,
32
- currentPage,
33
- attributes,
34
- hideOutOfStockItems,
35
- } ) => {
36
- const { columns, rows } = attributes;
37
- const getSortArgs = ( orderName ) => {
38
- switch ( orderName ) {
39
- case 'menu_order':
40
- case 'popularity':
41
- case 'rating':
42
- case 'price':
43
- return {
44
- orderby: orderName,
45
- order: 'asc',
46
- };
47
- case 'price-desc':
48
- return {
49
- orderby: 'price',
50
- order: 'desc',
51
- };
52
- case 'date':
53
- return {
54
- orderby: 'date',
55
- order: 'desc',
56
- };
57
- }
58
- };
59
-
60
- return {
61
- ...getSortArgs( sortValue ),
62
- catalog_visibility: 'catalog',
63
- per_page: columns * rows,
64
- page: currentPage,
65
- ...( hideOutOfStockItems && {
66
- stock_status: [ 'instock', 'onbackorder' ],
67
- } ),
68
- };
69
- };
70
-
71
- /**
72
- * Given a query state, returns the same query without the attributes related to
73
- * pagination and sorting.
74
- *
75
- * @param {Object} query Query to extract the attributes from.
76
- *
77
- * @return {Object} Same query without pagination and sorting attributes.
78
- */
79
-
80
- const extractPaginationAndSortAttributes = ( query ) => {
81
- /* eslint-disable-next-line no-unused-vars, camelcase */
82
- const { order, orderby, page, per_page, ...totalQuery } = query;
83
- return totalQuery || {};
84
- };
85
-
86
- const announceLoadingCompletion = ( totalProducts ) => {
87
- if ( ! Number.isFinite( totalProducts ) ) {
88
- return;
89
- }
90
-
91
- if ( totalProducts === 0 ) {
92
- speak( __( 'No products found', 'woo-gutenberg-products-block' ) );
93
- } else {
94
- speak(
95
- sprintf(
96
- /* translators: %s is an integer higher than 0 (1, 2, 3...) */
97
- _n(
98
- '%d product found',
99
- '%d products found',
100
- totalProducts,
101
- 'woo-gutenberg-products-block'
102
- ),
103
- totalProducts
104
- )
105
- );
106
- }
107
- };
108
-
109
- const areQueryTotalsDifferent = (
110
- { totalQuery: nextQuery, totalProducts: nextProducts },
111
- { totalQuery: currentQuery } = {}
112
- ) => ! isEqual( nextQuery, currentQuery ) && Number.isFinite( nextProducts );
113
-
114
- const ProductList = ( {
115
- attributes,
116
- currentPage,
117
- onPageChange,
118
- onSortChange,
119
- sortValue,
120
- scrollToTop,
121
- hideOutOfStockItems = false,
122
- } ) => {
123
- const [ queryState ] = useSynchronizedQueryState(
124
- generateQuery( {
125
- attributes,
126
- sortValue,
127
- currentPage,
128
- hideOutOfStockItems,
129
- } )
130
- );
131
- const { products, totalProducts, productsLoading } = useStoreProducts(
132
- queryState
133
- );
134
- const { parentClassName, parentName } = useInnerBlockLayoutContext();
135
- const totalQuery = extractPaginationAndSortAttributes( queryState );
136
- const { dispatchStoreEvent } = useStoreEvents();
137
-
138
- // These are possible filters.
139
- const [ productAttributes, setProductAttributes ] = useQueryStateByKey(
140
- 'attributes',
141
- []
142
- );
143
- const [ minPrice, setMinPrice ] = useQueryStateByKey( 'min_price' );
144
- const [ maxPrice, setMaxPrice ] = useQueryStateByKey( 'max_price' );
145
-
146
- // Only update previous query totals if the query is different and the total number of products is a finite number.
147
- const previousQueryTotals = usePrevious(
148
- { totalQuery, totalProducts },
149
- areQueryTotalsDifferent
150
- );
151
-
152
- // If the product list changes, trigger an event.
153
- useEffect( () => {
154
- dispatchStoreEvent( 'product-list-render', {
155
- products,
156
- listName: parentName,
157
- } );
158
- }, [ products, parentName, dispatchStoreEvent ] );
159
-
160
- // If query state (excluding pagination/sorting attributes) changed, reset pagination to the first page.
161
- useEffect( () => {
162
- if ( isEqual( totalQuery, previousQueryTotals?.totalQuery ) ) {
163
- return;
164
- }
165
- onPageChange( 1 );
166
-
167
- // Make sure there was a previous query, so we don't announce it on page load.
168
- if ( previousQueryTotals?.totalQuery ) {
169
- announceLoadingCompletion( totalProducts );
170
- }
171
- }, [
172
- previousQueryTotals?.totalQuery,
173
- totalProducts,
174
- onPageChange,
175
- totalQuery,
176
- ] );
177
-
178
- const onPaginationChange = ( newPage ) => {
179
- scrollToTop( { focusableSelector: 'a, button' } );
180
- onPageChange( newPage );
181
- };
182
-
183
- const getClassnames = () => {
184
- const { columns, rows, alignButtons, align } = attributes;
185
- const alignClass = typeof align !== 'undefined' ? 'align' + align : '';
186
-
187
- return classnames(
188
- parentClassName,
189
- alignClass,
190
- 'has-' + columns + '-columns',
191
- {
192
- 'has-multiple-rows': rows > 1,
193
- 'has-aligned-buttons': alignButtons,
194
- }
195
- );
196
- };
197
-
198
- const { contentVisibility } = attributes;
199
- const perPage = attributes.columns * attributes.rows;
200
- const totalPages =
201
- ! Number.isFinite( totalProducts ) &&
202
- Number.isFinite( previousQueryTotals?.totalProducts ) &&
203
- isEqual( totalQuery, previousQueryTotals?.totalQuery )
204
- ? Math.ceil( previousQueryTotals.totalProducts / perPage )
205
- : Math.ceil( totalProducts / perPage );
206
- const listProducts = products.length
207
- ? products
208
- : Array.from( { length: perPage } );
209
- const hasProducts = products.length !== 0 || productsLoading;
210
- const hasFilters =
211
- productAttributes.length > 0 ||
212
- Number.isFinite( minPrice ) ||
213
- Number.isFinite( maxPrice );
214
-
215
- return (
216
- <div className={ getClassnames() }>
217
- { contentVisibility.orderBy && hasProducts && (
218
- <ProductSortSelect
219
- onChange={ onSortChange }
220
- value={ sortValue }
221
- />
222
- ) }
223
- { ! hasProducts && hasFilters && (
224
- <NoMatchingProducts
225
- resetCallback={ () => {
226
- setProductAttributes( [] );
227
- setMinPrice( null );
228
- setMaxPrice( null );
229
- } }
230
- />
231
- ) }
232
- { ! hasProducts && ! hasFilters && <NoProducts /> }
233
- { hasProducts && (
234
- <ul className={ `${ parentClassName }__products` }>
235
- { listProducts.map( ( product = {}, i ) => (
236
- <ProductListItem
237
- key={ product.id || i }
238
- attributes={ attributes }
239
- product={ product }
240
- />
241
- ) ) }
242
- </ul>
243
- ) }
244
- { totalPages > 1 && (
245
- <Pagination
246
- currentPage={ currentPage }
247
- onPageChange={ onPaginationChange }
248
- totalPages={ totalPages }
249
- />
250
- ) }
251
- </div>
252
- );
253
- };
254
-
255
- ProductList.propTypes = {
256
- attributes: PropTypes.object.isRequired,
257
- hideOutOfStockItems: PropTypes.bool,
258
- // From withScrollToTop.
259
- scrollToTop: PropTypes.func,
260
- };
261
-
262
- export default withScrollToTop( ProductList );
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
assets/js/base/components/product-list/style.scss CHANGED
@@ -55,11 +55,6 @@
55
  list-style: none;
56
  }
57
 
58
- // Increased specificity necessary as Gutenberg's generic reset overrides box sizing
59
- .wc-block-grid__product.wc-block-grid__product {
60
- box-sizing: border-box;
61
- }
62
-
63
  .theme-twentytwenty .wc-block-grid,
64
  .wc-block-grid {
65
  &.has-aligned-buttons {
@@ -79,25 +74,15 @@
79
  max-width: 100% / $i;
80
  }
81
  }
82
- // Adjust font size as more cols are added.
83
- &.has-6-columns .wc-block-grid__product {
84
- font-size: 0.5em;
85
- }
86
- &.has-6-columns.alignfull,
87
- &.has-5-columns {
88
- .wc-block-grid__product {
89
- font-size: 0.58em;
90
- }
91
- }
92
- &.has-5-columns.alignfull,
93
- &.has-4-columns:not(.alignwide):not(.alignfull) {
94
  .wc-block-grid__product {
95
- font-size: 0.75em;
96
  }
97
  }
98
- &.has-3-columns:not(.alignwide):not(.alignfull) {
99
- font-size: 0.92em;
100
- }
101
  }
102
 
103
  @include breakpoint( "<480px" ) {
55
  list-style: none;
56
  }
57
 
 
 
 
 
 
58
  .theme-twentytwenty .wc-block-grid,
59
  .wc-block-grid {
60
  &.has-aligned-buttons {
74
  max-width: 100% / $i;
75
  }
76
  }
77
+ &.has-4-columns:not(.alignwide):not(.alignfull),
78
+ &.has-5-columns:not(.alignfull),
79
+ &.has-6-columns:not(.alignfull),
80
+ &.has-7-columns,
81
+ &.has-8-columns {
 
 
 
 
 
 
 
82
  .wc-block-grid__product {
83
+ font-size: 0.8em;
84
  }
85
  }
 
 
 
86
  }
87
 
88
  @include breakpoint( "<480px" ) {
assets/js/base/components/product-name/index.tsx DELETED
@@ -1,48 +0,0 @@
1
- /**
2
- * External dependencies
3
- */
4
- import { decodeEntities } from '@wordpress/html-entities';
5
- import classnames from 'classnames';
6
-
7
- /**
8
- * Internal dependencies
9
- */
10
- import './style.scss';
11
-
12
- /**
13
- * Render the Product name.
14
- *
15
- * The store API runs titles through `wp_kses_post()` which removes dangerous HTML tags, so using it inside `dangerouslySetInnerHTML` is considered safe.
16
- */
17
- export default ( {
18
- className = '',
19
- disabled = false,
20
- name,
21
- permalink = '',
22
- ...props
23
- }: {
24
- className: string;
25
- disabled: boolean;
26
- name: string;
27
- permalink: string;
28
- } ): JSX.Element => {
29
- const classes = classnames( 'wc-block-components-product-name', className );
30
- return disabled ? (
31
- <span
32
- className={ classes }
33
- { ...props }
34
- dangerouslySetInnerHTML={ {
35
- __html: decodeEntities( name ),
36
- } }
37
- />
38
- ) : (
39
- <a
40
- className={ classes }
41
- href={ permalink }
42
- { ...props }
43
- dangerouslySetInnerHTML={ {
44
- __html: decodeEntities( name ),
45
- } }
46
- />
47
- );
48
- };
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
assets/js/base/components/product-name/stories/index.js DELETED
@@ -1,26 +0,0 @@
1
- /**
2
- * External dependencies
3
- */
4
- import { boolean } from '@storybook/addon-knobs';
5
-
6
- /**
7
- * Internal dependencies
8
- */
9
- import ProductName from '../';
10
-
11
- export default {
12
- title: 'WooCommerce Blocks/@base-components/cart-checkout/ProductName',
13
- component: ProductName,
14
- };
15
-
16
- export const Default = () => {
17
- const disabled = boolean( 'disabled', false );
18
-
19
- return (
20
- <ProductName
21
- disabled={ disabled }
22
- name={ 'Test product' }
23
- permalink={ '/' }
24
- />
25
- );
26
- };
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
assets/js/base/components/product-name/test/__snapshots__/index.js.snap DELETED
@@ -1,49 +0,0 @@
1
- // Jest Snapshot v1, https://goo.gl/fbAQLP
2
-
3
- exports[`ProductName should merge classes and props 1`] = `
4
- <a
5
- className="wc-block-components-product-name lorem-ipsum"
6
- dangerouslySetInnerHTML={
7
- Object {
8
- "__html": "Test product",
9
- }
10
- }
11
- href="/"
12
- rel="nofollow"
13
- />
14
- `;
15
-
16
- exports[`ProductName should not render a link if disabled is true 1`] = `
17
- <span
18
- className="wc-block-components-product-name"
19
- dangerouslySetInnerHTML={
20
- Object {
21
- "__html": "Test product",
22
- }
23
- }
24
- />
25
- `;
26
-
27
- exports[`ProductName should render a link if disabled is false 1`] = `
28
- <a
29
- className="wc-block-components-product-name"
30
- dangerouslySetInnerHTML={
31
- Object {
32
- "__html": "Test product",
33
- }
34
- }
35
- href="/"
36
- />
37
- `;
38
-
39
- exports[`ProductName should render a link if disabled is not defined 1`] = `
40
- <a
41
- className="wc-block-components-product-name"
42
- dangerouslySetInnerHTML={
43
- Object {
44
- "__html": "Test product",
45
- }
46
- }
47
- href="/"
48
- />
49
- `;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
assets/js/base/components/product-name/test/index.js DELETED
@@ -1,48 +0,0 @@
1
- /**
2
- * External dependencies
3
- */
4
- import TestRenderer from 'react-test-renderer';
5
-
6
- /**
7
- * Internal dependencies
8
- */
9
- import ProductName from '..';
10
-
11
- describe( 'ProductName', () => {
12
- test( 'should not render a link if disabled is true', () => {
13
- const component = TestRenderer.create(
14
- <ProductName disabled={ true } name="Test product" permalink="/" />
15
- );
16
-
17
- expect( component.toJSON() ).toMatchSnapshot();
18
- } );
19
-
20
- test( 'should render a link if disabled is false', () => {
21
- const component = TestRenderer.create(
22
- <ProductName disabled={ false } name="Test product" permalink="/" />
23
- );
24
-
25
- expect( component.toJSON() ).toMatchSnapshot();
26
- } );
27
-
28
- test( 'should render a link if disabled is not defined', () => {
29
- const component = TestRenderer.create(
30
- <ProductName name="Test product" permalink="/" />
31
- );
32
-
33
- expect( component.toJSON() ).toMatchSnapshot();
34
- } );
35
-
36
- test( 'should merge classes and props', () => {
37
- const component = TestRenderer.create(
38
- <ProductName
39
- className="lorem-ipsum"
40
- name="Test product"
41
- permalink="/"
42
- rel="nofollow"
43
- />
44
- );
45
-
46
- expect( component.toJSON() ).toMatchSnapshot();
47
- } );
48
- } );
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
assets/js/base/components/product-price/index.js DELETED
@@ -1,214 +0,0 @@
1
- /**
2
- * External dependencies
3
- */
4
- import { __, sprintf } from '@wordpress/i18n';
5
- import FormattedMonetaryAmount from '@woocommerce/base-components/formatted-monetary-amount';
6
- import classNames from 'classnames';
7
- import PropTypes from 'prop-types';
8
- import { createInterpolateElement } from 'wordpress-element';
9
- import { formatPrice } from '@woocommerce/price-format';
10
-
11
- /**
12
- * Internal dependencies
13
- */
14
- import './style.scss';
15
-
16
- const PriceRange = ( {
17
- currency,
18
- maxPrice,
19
- minPrice,
20
- priceClassName,
21
- priceStyle,
22
- } ) => {
23
- return (
24
- <>
25
- <span className="screen-reader-text">
26
- { sprintf(
27
- /* translators: %1$s min price, %2$s max price */
28
- __(
29
- 'Price between %1$s and %2$s',
30
- 'woo-gutenberg-products-block'
31
- ),
32
- formatPrice( minPrice ),
33
- formatPrice( maxPrice )
34
- ) }
35
- </span>
36
- <span aria-hidden={ true }>
37
- <FormattedMonetaryAmount
38
- className={ classNames(
39
- 'wc-block-components-product-price__value',
40
- priceClassName
41
- ) }
42
- currency={ currency }
43
- value={ minPrice }
44
- style={ priceStyle }
45
- />
46
- &nbsp;&mdash;&nbsp;
47
- <FormattedMonetaryAmount
48
- className={ classNames(
49
- 'wc-block-components-product-price__value',
50
- priceClassName
51
- ) }
52
- currency={ currency }
53
- value={ maxPrice }
54
- style={ priceStyle }
55
- />
56
- </span>
57
- </>
58
- );
59
- };
60
-
61
- const SalePrice = ( {
62
- currency,
63
- regularPriceClassName,
64
- regularPriceStyle,
65
- regularPrice,
66
- priceClassName,
67
- priceStyle,
68
- price,
69
- } ) => {
70
- return (
71
- <>
72
- <span className="screen-reader-text">
73
- { __( 'Previous price:', 'woo-gutenberg-products-block' ) }
74
- </span>
75
- <FormattedMonetaryAmount
76
- currency={ currency }
77
- renderText={ ( value ) => (
78
- <del
79
- className={ classNames(
80
- 'wc-block-components-product-price__regular',
81
- regularPriceClassName
82
- ) }
83
- style={ regularPriceStyle }
84
- >
85
- { value }
86
- </del>
87
- ) }
88
- value={ regularPrice }
89
- />
90
- <span className="screen-reader-text">
91
- { __( 'Discounted price:', 'woo-gutenberg-products-block' ) }
92
- </span>
93
- <FormattedMonetaryAmount
94
- currency={ currency }
95
- renderText={ ( value ) => (
96
- <ins
97
- className={ classNames(
98
- 'wc-block-components-product-price__value',
99
- 'is-discounted',
100
- priceClassName
101
- ) }
102
- style={ priceStyle }
103
- >
104
- { value }
105
- </ins>
106
- ) }
107
- value={ price }
108
- />
109
- </>
110
- );
111
- };
112
-
113
- const ProductPrice = ( {
114
- align,
115
- className,
116
- currency,
117
- format = '<price/>',
118
- maxPrice = null,
119
- minPrice = null,
120
- price = null,
121
- priceClassName,
122
- priceStyle,
123
- regularPrice,
124
- regularPriceClassName,
125
- regularPriceStyle,
126
- } ) => {
127
- const wrapperClassName = classNames(
128
- className,
129
- 'price',
130
- 'wc-block-components-product-price',
131
- {
132
- [ `wc-block-components-product-price--align-${ align }` ]: align,
133
- }
134
- );
135
-
136
- if ( ! format.includes( '<price/>' ) ) {
137
- format = '<price/>';
138
- // eslint-disable-next-line no-console
139
- console.error( 'Price formats need to include the `<price/>` tag.' );
140
- }
141
-
142
- const isDiscounted = regularPrice && price !== regularPrice;
143
- let priceComponent = (
144
- <span
145
- className={ classNames(
146
- 'wc-block-components-product-price__value',
147
- priceClassName
148
- ) }
149
- />
150
- );
151
-
152
- if ( isDiscounted ) {
153
- priceComponent = (
154
- <SalePrice
155
- currency={ currency }
156
- price={ price }
157
- priceClassName={ priceClassName }
158
- priceStyle={ priceStyle }
159
- regularPrice={ regularPrice }
160
- regularPriceClassName={ regularPriceClassName }
161
- regularPriceStyle={ regularPriceStyle }
162
- />
163
- );
164
- } else if ( minPrice !== null && maxPrice !== null ) {
165
- priceComponent = (
166
- <PriceRange
167
- currency={ currency }
168
- maxPrice={ maxPrice }
169
- minPrice={ minPrice }
170
- priceClassName={ priceClassName }
171
- priceStyle={ priceStyle }
172
- />
173
- );
174
- } else if ( price !== null ) {
175
- priceComponent = (
176
- <FormattedMonetaryAmount
177
- className={ classNames(
178
- 'wc-block-components-product-price__value',
179
- priceClassName
180
- ) }
181
- currency={ currency }
182
- value={ price }
183
- style={ priceStyle }
184
- />
185
- );
186
- }
187
-
188
- return (
189
- <span className={ wrapperClassName }>
190
- { createInterpolateElement( format, {
191
- price: priceComponent,
192
- } ) }
193
- </span>
194
- );
195
- };
196
-
197
- ProductPrice.propTypes = {
198
- align: PropTypes.oneOf( [ 'left', 'center', 'right' ] ),
199
- className: PropTypes.string,
200
- currency: PropTypes.object,
201
- format: PropTypes.string,
202
- price: PropTypes.oneOfType( [ PropTypes.number, PropTypes.string ] ),
203
- priceClassName: PropTypes.string,
204
- priceStyle: PropTypes.object,
205
- // Range price props
206
- maxPrice: PropTypes.oneOfType( [ PropTypes.number, PropTypes.string ] ),
207
- minPrice: PropTypes.oneOfType( [ PropTypes.number, PropTypes.string ] ),
208
- // On sale price props
209
- regularPrice: PropTypes.oneOfType( [ PropTypes.number, PropTypes.string ] ),
210
- regularPriceClassName: PropTypes.string,
211
- regularPriceStyle: PropTypes.object,
212
- };
213
-
214
- export default ProductPrice;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
assets/js/base/components/product-price/stories/index.js DELETED
@@ -1,57 +0,0 @@
1
- /**
2
- * External dependencies
3
- */
4
- import { number, select } from '@storybook/addon-knobs';
5
- import { currencyKnob } from '@woocommerce/knobs';
6
-
7
- /**
8
- * Internal dependencies
9
- */
10
- import ProductPrice from '../';
11
-
12
- export default {
13
- title: 'WooCommerce Blocks/@base-components/ProductPrice',
14
- component: ProductPrice,
15
- };
16
-
17
- export const standard = () => {
18
- const align = select( 'Align', [ 'left', 'center', 'right' ], 'left' );
19
- const currency = currencyKnob();
20
- const price = number( 'Price', 4000 );
21
-
22
- return (
23
- <ProductPrice align={ align } currency={ currency } price={ price } />
24
- );
25
- };
26
-
27
- export const sale = () => {
28
- const align = select( 'Align', [ 'left', 'center', 'right' ], 'left' );
29
- const currency = currencyKnob();
30
- const price = number( 'Price', 3000 );
31
- const regularPrice = number( 'Regular price', 4000 );
32
-
33
- return (
34
- <ProductPrice
35
- align={ align }
36
- currency={ currency }
37
- price={ price }
38
- regularPrice={ regularPrice }
39
- />
40
- );
41
- };
42
-
43
- export const range = () => {
44
- const align = select( 'Align', [ 'left', 'center', 'right' ], 'left' );
45
- const currency = currencyKnob();
46
- const minPrice = number( 'Min price', 3000 );
47
- const maxPrice = number( 'Max price', 5000 );
48
-
49
- return (
50
- <ProductPrice
51
- align={ align }
52
- currency={ currency }
53
- minPrice={ minPrice }
54
- maxPrice={ maxPrice }
55
- />
56
- );
57
- };
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
assets/js/base/components/product-price/style.scss DELETED
@@ -1,29 +0,0 @@
1
- /*rtl:begin:ignore*/
2
- .wc-block-components-product-price--align-left {
3
- display: block;
4
- text-align: left;
5
- }
6
- .wc-block-components-product-price--align-center {
7
- display: block;
8
- text-align: center;
9
- }
10
- .wc-block-components-product-price--align-right {
11
- display: block;
12
- text-align: right;
13
- }
14
- /*rtl:end:ignore*/
15
-
16
- .wc-block-components-product-price__value {
17
- &.is-discounted {
18
- margin-left: 0.5em;
19
- }
20
- }
21
-
22
- .is-loading {
23
- .wc-block-components-product-price::before {
24
- @include placeholder();
25
- content: ".";
26
- display: inline-block;
27
- width: 5em;
28
- }
29
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
assets/js/base/components/product-price/test/__snapshots__/index.js.snap DELETED
@@ -1,57 +0,0 @@
1
- // Jest Snapshot v1, https://goo.gl/fbAQLP
2
-
3
- exports[`ProductPrice should apply the format if one is provided 1`] = `
4
- <span
5
- className="price wc-block-components-product-price"
6
- >
7
- pre price
8
- <span
9
- className="screen-reader-text"
10
- >
11
- Previous price:
12
- </span>
13
- <del
14
- className="wc-block-components-product-price__regular"
15
- >
16
- £1.00
17
- </del>
18
- <span
19
- className="screen-reader-text"
20
- >
21
- Discounted price:
22
- </span>
23
- <ins
24
- className="wc-block-components-product-price__value is-discounted"
25
- >
26
- £0.50
27
- </ins>
28
- Test format
29
- </span>
30
- `;
31
-
32
- exports[`ProductPrice should use default price if no format is provided 1`] = `
33
- <span
34
- className="price wc-block-components-product-price"
35
- >
36
- <span
37
- className="screen-reader-text"
38
- >
39
- Previous price:
40
- </span>
41
- <del
42
- className="wc-block-components-product-price__regular"
43
- >
44
- £1.00
45
- </del>
46
- <span
47
- className="screen-reader-text"
48
- >
49
- Discounted price:
50
- </span>
51
- <ins
52
- className="wc-block-components-product-price__value is-discounted"
53
- >
54
- £0.50
55
- </ins>
56
- </span>
57
- `;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
assets/js/base/components/product-price/test/index.js DELETED
@@ -1,63 +0,0 @@
1
- /**
2
- * External dependencies
3
- */
4
- import TestRenderer from 'react-test-renderer';
5
-
6
- /**
7
- * Internal dependencies
8
- */
9
- import ProductPrice from '../index';
10
-
11
- describe( 'ProductPrice', () => {
12
- const currency = {
13
- code: 'GBP',
14
- currency_code: 'GBP',
15
- currency_decimal_separator: '.',
16
- currency_minor_unit: 2,
17
- currency_prefix: '£',
18
- currency_suffix: '',
19
- currency_symbol: '£',
20
- currency_thousand_separator: ',',
21
- decimalSeparator: '.',
22
- minorUnit: 2,
23
- prefix: '£',
24
- price: '61400',
25
- price_range: null,
26
- raw_prices: {
27
- precision: 6,
28
- price: '614000000',
29
- regular_price: '614000000',
30
- sale_price: '614000000',
31
- },
32
- regular_price: '61400',
33
- sale_price: '61400',
34
- suffix: '',
35
- symbol: '£',
36
- thousandSeparator: ',',
37
- };
38
-
39
- test( 'should use default price if no format is provided', () => {
40
- const component = TestRenderer.create(
41
- <ProductPrice
42
- price={ 50 }
43
- regularPrice={ 100 }
44
- currency={ currency }
45
- />
46
- );
47
-
48
- expect( component.toJSON() ).toMatchSnapshot();
49
- } );
50
-
51
- test( 'should apply the format if one is provided', () => {
52
- const component = TestRenderer.create(
53
- <ProductPrice
54
- price={ 50 }
55
- regularPrice={ 100 }
56
- currency={ currency }
57
- format="pre price <price/> Test format"
58
- />
59
- );
60
-
61
- expect( component.toJSON() ).toMatchSnapshot();
62
- } );
63
- } );
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
assets/js/base/components/{product-list/product-sort-select → product-sort-select}/index.js RENAMED
File without changes
assets/js/base/components/{product-list/product-sort-select → product-sort-select}/style.scss RENAMED
File without changes
assets/js/base/components/quantity-selector/{index.tsx → index.js} RENAMED
@@ -3,37 +3,25 @@
3
  */
4
  import { __, sprintf } from '@wordpress/i18n';
5
  import { speak } from '@wordpress/a11y';
 
6
  import classNames from 'classnames';
7
  import { useCallback } from '@wordpress/element';
8
  import { DOWN, UP } from '@wordpress/keycodes';
9
- import { isNumber } from '@woocommerce/types';
10
 
11
  /**
12
  * Internal dependencies
13
  */
14
  import './style.scss';
15
 
16
- interface QuantitySelectorProps {
17
- className?: string;
18
- quantity?: number;
19
- minimum?: number;
20
- maximum: number;
21
- onChange: ( newQuantity: number ) => void;
22
- itemName?: string;
23
- disabled: boolean;
24
- }
25
-
26
  const QuantitySelector = ( {
27
  className,
28
  quantity = 1,
29
  minimum = 1,
30
  maximum,
31
- onChange = () => {
32
- /* Do nothing. */
33
- },
34
  itemName = '',
35
  disabled,
36
- }: QuantitySelectorProps ): JSX.Element => {
37
  const classes = classNames(
38
  'wc-block-components-quantity-selector',
39
  className
@@ -84,7 +72,7 @@ const QuantitySelector = ( {
84
  onKeyDown={ quantityInputOnKeyDown }
85
  onChange={ ( event ) => {
86
  let value =
87
- ! isNumber( event.target.value ) || ! event.target.value
88
  ? 0
89
  : parseInt( event.target.value, 10 );
90
  if ( hasMaximum ) {
@@ -96,8 +84,8 @@ const QuantitySelector = ( {
96
  }
97
  } }
98
  aria-label={ sprintf(
99
- /* translators: %s refers to the item name in the cart. */
100
  __(
 
101
  'Quantity of %s in your cart.',
102
  'woo-gutenberg-products-block'
103
  ),
@@ -116,8 +104,8 @@ const QuantitySelector = ( {
116
  onChange( newQuantity );
117
  speak(
118
  sprintf(
119
- /* translators: %s refers to the item name in the cart. */
120
  __(
 
121
  'Quantity reduced to %s.',
122
  'woo-gutenberg-products-block'
123
  ),
@@ -140,8 +128,8 @@ const QuantitySelector = ( {
140
  onChange( newQuantity );
141
  speak(
142
  sprintf(
143
- /* translators: %s refers to the item name in the cart. */
144
  __(
 
145
  'Quantity increased to %s.',
146
  'woo-gutenberg-products-block'
147
  ),
@@ -156,4 +144,14 @@ const QuantitySelector = ( {
156
  );
157
  };
158
 
 
 
 
 
 
 
 
 
 
 
159
  export default QuantitySelector;
3
  */
4
  import { __, sprintf } from '@wordpress/i18n';
5
  import { speak } from '@wordpress/a11y';
6
+ import PropTypes from 'prop-types';
7
  import classNames from 'classnames';
8
  import { useCallback } from '@wordpress/element';
9
  import { DOWN, UP } from '@wordpress/keycodes';
 
10
 
11
  /**
12
  * Internal dependencies
13
  */
14
  import './style.scss';
15
 
 
 
 
 
 
 
 
 
 
 
16
  const QuantitySelector = ( {
17
  className,
18
  quantity = 1,
19
  minimum = 1,
20
  maximum,
21
+ onChange = () => null,
 
 
22
  itemName = '',
23
  disabled,
24
+ } ) => {
25
  const classes = classNames(
26
  'wc-block-components-quantity-selector',
27
  className
72
  onKeyDown={ quantityInputOnKeyDown }
73
  onChange={ ( event ) => {
74
  let value =
75
+ isNaN( event.target.value ) || ! event.target.value
76
  ? 0
77
  : parseInt( event.target.value, 10 );
78
  if ( hasMaximum ) {
84
  }
85
  } }
86
  aria-label={ sprintf(
 
87
  __(
88
+ // translators: %s Item name.
89
  'Quantity of %s in your cart.',
90
  'woo-gutenberg-products-block'
91
  ),
104
  onChange( newQuantity );
105
  speak(
106
  sprintf(
 
107
  __(
108
+ // translators: %s Quantity amount.
109
  'Quantity reduced to %s.',
110
  'woo-gutenberg-products-block'
111
  ),
128
  onChange( newQuantity );
129
  speak(
130
  sprintf(
 
131
  __(
132
+ // translators: %s Quantity amount.
133
  'Quantity increased to %s.',
134
  'woo-gutenberg-products-block'
135
  ),
144
  );
145
  };
146
 
147
+ QuantitySelector.propTypes = {
148
+ className: PropTypes.string,
149
+ quantity: PropTypes.number,
150
+ minimum: PropTypes.number,
151
+ maximum: PropTypes.number,
152
+ onChange: PropTypes.func,
153
+ itemName: PropTypes.string,
154
+ disabled: PropTypes.bool,
155
+ };
156
+
157
  export default QuantitySelector;
assets/js/base/components/quantity-selector/style.scss CHANGED
@@ -6,24 +6,16 @@
6
  box-shadow: none;
7
 
8
  &:focus {
9
- outline: 2px solid $gray-300;
10
  }
11
  }
12
 
13
  .wc-block-components-quantity-selector {
14
  display: flex;
15
- width: 107px;
16
- border: 1px solid $gray-300;
17
  background: #fff;
18
  border-radius: 4px;
19
- // needed so that buttons fill the container.
20
- box-sizing: content-box;
21
- margin: 0 0 0.25em 0;
22
-
23
- .has-dark-controls & {
24
- background-color: transparent;
25
- border-color: $input-border-dark;
26
- }
27
 
28
  // Extra label for specificity needed in the editor.
29
  input.wc-block-components-quantity-selector__input {
@@ -43,23 +35,11 @@
43
  -moz-appearance: textfield;
44
 
45
  &:focus {
46
- background: $gray-100;
47
- outline: 1px solid $gray-300;
48
  }
49
  &:disabled {
50
- color: $gray-600;
51
- }
52
-
53
- .has-dark-controls & {
54
- color: $input-text-dark;
55
- background: transparent;
56
-
57
- &:focus {
58
- background: transparent;
59
- }
60
- &:disabled {
61
- color: $input-disabled-dark;
62
- }
63
  }
64
  }
65
  input::-webkit-outer-spin-button,
@@ -67,55 +47,30 @@
67
  -webkit-appearance: none;
68
  margin: 0;
69
  }
70
-
71
  .wc-block-components-quantity-selector__button {
72
  @include reset-button;
73
  @include font-size(regular);
74
  min-width: 30px;
75
  cursor: pointer;
76
- color: $gray-900;
77
  font-style: normal;
78
  text-align: center;
79
- text-decoration: none;
80
 
81
  &:hover,
82
  &:focus {
83
  @include reset-button;
84
- color: $gray-900;
85
  }
86
  &:disabled {
87
- color: $gray-600;
88
  cursor: default;
89
  @include reset-button;
90
  }
91
-
92
- .has-dark-controls & {
93
- color: $input-text-dark;
94
-
95
- &:hover,
96
- &:focus {
97
- color: $input-text-dark;
98
- }
99
- &:disabled {
100
- color: $input-disabled-dark;
101
- }
102
- }
103
  }
104
-
105
- > .wc-block-components-quantity-selector__button--minus {
106
  order: 1;
107
  }
108
-
109
- > .wc-block-components-quantity-selector__button--plus {
110
  order: 3;
111
  }
112
  }
113
-
114
- .theme-twentyseventeen {
115
- .wc-block-components-quantity-selector .wc-block-components-quantity-selector__button {
116
- &:hover,
117
- &:focus {
118
- background: none transparent;
119
- }
120
- }
121
- }
6
  box-shadow: none;
7
 
8
  &:focus {
9
+ outline: 2px solid $core-grey-light-600;
10
  }
11
  }
12
 
13
  .wc-block-components-quantity-selector {
14
  display: flex;
15
+ min-width: 100px;
16
+ border: 1px solid $core-grey-light-600;
17
  background: #fff;
18
  border-radius: 4px;
 
 
 
 
 
 
 
 
19
 
20
  // Extra label for specificity needed in the editor.
21
  input.wc-block-components-quantity-selector__input {
35
  -moz-appearance: textfield;
36
 
37
  &:focus {
38
+ background: $core-grey-light-200;
39
+ outline: 1px solid $core-grey-light-600;
40
  }
41
  &:disabled {
42
+ color: $core-grey-dark-100;
 
 
 
 
 
 
 
 
 
 
 
 
43
  }
44
  }
45
  input::-webkit-outer-spin-button,
47
  -webkit-appearance: none;
48
  margin: 0;
49
  }
 
50
  .wc-block-components-quantity-selector__button {
51
  @include reset-button;
52
  @include font-size(regular);
53
  min-width: 30px;
54
  cursor: pointer;
55
+ color: $core-grey-dark-700;
56
  font-style: normal;
57
  text-align: center;
 
58
 
59
  &:hover,
60
  &:focus {
61
  @include reset-button;
62
+ color: $core-grey-dark-900;
63
  }
64
  &:disabled {
65
+ color: $core-grey-dark-100;
66
  cursor: default;
67
  @include reset-button;
68
  }
 
 
 
 
 
 
 
 
 
 
 
 
69
  }
70
+ .wc-block-components-quantity-selector__button--minus {
 
71
  order: 1;
72
  }
73
+ .wc-block-components-quantity-selector__button--plus {
 
74
  order: 3;
75
  }
76
  }
 
 
 
 
 
 
 
 
 
assets/js/base/components/radio-control-accordion/index.js DELETED
@@ -1,73 +0,0 @@
1
- /**
2
- * External dependencies
3
- */
4
- import classnames from 'classnames';
5
- import { withInstanceId } from '@woocommerce/base-hocs/with-instance-id';
6
-
7
- /**
8
- * Internal dependencies
9
- */
10
- import RadioControlOption from '../radio-control/option';
11
-
12
- const RadioControlAccordion = ( {
13
- className,
14
- instanceId,
15
- id,
16
- selected,
17
- onChange,
18
- options = [],
19
- } ) => {
20
- const radioControlId = id || instanceId;
21
-
22
- return (
23
- options.length && (
24
- <div
25
- className={ classnames(
26
- 'wc-block-components-radio-control',
27
- className
28
- ) }
29
- >
30
- { options.map( ( option ) => {
31
- const hasOptionContent =
32
- typeof option === 'object' && 'content' in option;
33
- const checked = option.value === selected;
34
- return (
35
- <div
36
- className="wc-block-components-radio-control-accordion-option"
37
- key={ option.value }
38
- >
39
- <RadioControlOption
40
- name={ `radio-control-${ radioControlId }` }
41
- checked={ checked }
42
- option={ option }
43
- onChange={ ( value ) => {
44
- onChange( value );
45
- if (
46
- typeof option.onChange === 'function'
47
- ) {
48
- option.onChange( value );
49
- }
50
- } }
51
- />
52
- { hasOptionContent && checked && (
53
- <div
54
- className={ classnames(
55
- 'wc-block-components-radio-control-accordion-content',
56
- {
57
- 'wc-block-components-radio-control-accordion-content-hide': ! checked,
58
- }
59
- ) }
60
- >
61
- { option.content }
62
- </div>
63
- ) }
64
- </div>
65
- );
66
- } ) }
67
- </div>
68
- )
69
- );
70
- };
71
-
72
- export default withInstanceId( RadioControlAccordion );
73
- export { RadioControlAccordion };
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
assets/js/base/components/radio-control/_mixin.scss ADDED
@@ -0,0 +1,106 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ @mixin radio-control-styles {
2
+ .wc-block-components-radio-control__option {
3
+ @include reset-typography();
4
+ @include with-translucent-border(0 0 1px);
5
+ display: block;
6
+ padding: $gap-small $gap-small 0 #{$gap-larger * 2};
7
+ }
8
+
9
+ .wc-block-components-radio-control__option-layout {
10
+ @include with-translucent-border(0 0 1px);
11
+ display: table;
12
+ width: 100%;
13
+ padding-bottom: $gap-small;
14
+ }
15
+
16
+ .wc-block-components-radio-control__option .wc-block-components-radio-control__option-layout {
17
+ &::after {
18
+ display: none;
19
+ }
20
+ }
21
+
22
+ .wc-block-components-radio-control__input {
23
+ left: $gap-large;
24
+ position: absolute;
25
+ top: $gap-small;
26
+ }
27
+
28
+ .wc-block-components-radio-control__label-group,
29
+ .wc-block-components-radio-control__description-group {
30
+ display: table-row;
31
+
32
+ > span {
33
+ display: table-cell;
34
+ }
35
+
36
+ .wc-block-components-radio-control__secondary-label,
37
+ .wc-block-components-radio-control__secondary-description {
38
+ text-align: right;
39
+ min-width: 50%;
40
+ }
41
+ }
42
+
43
+ .wc-block-components-radio-control__label,
44
+ .wc-block-components-radio-control__secondary-label {
45
+ line-height: 20px;
46
+ // Currently, max() CSS function calls need to be wrapped with unquote.
47
+ // See: https://github.com/sass/sass/issues/2378#issuecomment-367490840
48
+ line-height: unquote("max(1rem, 20px)");
49
+ }
50
+
51
+ .wc-block-components-radio-control__description,
52
+ .wc-block-components-radio-control__secondary-description {
53
+ @include font-size(small);
54
+ line-height: 20px;
55
+ }
56
+ }
57
+
58
+ @mixin radio-control-input-styles {
59
+ // Extra class for specificity.
60
+ .wc-block-components-radio-control {
61
+ .wc-block-components-radio-control__input {
62
+ appearance: none;
63
+ background: #fff;
64
+ border: 2px solid currentColor;
65
+ border-radius: 50%;
66
+ display: inline-block;
67
+ height: 1.25rem;
68
+ min-height: 20px;
69
+ min-width: 20px;
70
+ width: 1.25rem;
71
+
72
+ &:checked::before {
73
+ background: currentColor;
74
+ border-radius: 50%;
75
+ content: "";
76
+ display: block;
77
+ height: 0.625em;
78
+ left: 50%;
79
+ margin: 0;
80
+ min-height: 10px;
81
+ min-width: 10px;
82
+ position: absolute;
83
+ top: 50%;
84
+ transform: translate(-50%, -50%);
85
+ width: 0.625em;
86
+ }
87
+ }
88
+
89
+ @include breakpoint( ">782px" ) {
90
+ .wc-block-components-radio-control__input {
91
+ height: 1rem;
92
+ margin-top: 2px;
93
+ min-height: 16px;
94
+ min-width: 16px;
95
+ width: 1rem;
96
+
97
+ &:checked::before {
98
+ height: 0.5em;
99
+ min-height: 8px;
100
+ min-width: 8px;
101
+ width: 0.5em;
102
+ }
103
+ }
104
+ }
105
+ }
106
+ }
assets/js/base/components/radio-control/editor.scss ADDED
@@ -0,0 +1,6 @@
 
 
 
 
 
 
1
+ @import "./mixin";
2
+
3
+ // We need to increase the styles specificity in the editor, to avoid wp-admin styles taking preference.
4
+ #wpbody .edit-post-visual-editor {
5
+ @include radio-control-input-styles;
6
+ }
assets/js/base/components/radio-control/index.js CHANGED
@@ -8,6 +8,7 @@ import { withInstanceId } from '@woocommerce/base-hocs/with-instance-id';
8
  * Internal dependencies
9
  */
10
  import RadioControlOption from './option';
 
11
  import './style.scss';
12
 
13
  const RadioControl = ( {
@@ -30,7 +31,7 @@ const RadioControl = ( {
30
  >
31
  { options.map( ( option ) => (
32
  <RadioControlOption
33
- key={ `${ radioControlId }-${ option.value }` }
34
  name={ `radio-control-${ radioControlId }` }
35
  checked={ option.value === selected }
36
  option={ option }
8
  * Internal dependencies
9
  */
10
  import RadioControlOption from './option';
11
+ import './editor.scss';
12
  import './style.scss';
13
 
14
  const RadioControl = ( {
31
  >
32
  { options.map( ( option ) => (
33
  <RadioControlOption
34
+ key={ option.value }
35
  name={ `radio-control-${ radioControlId }` }
36
  checked={ option.value === selected }
37
  option={ option }
assets/js/base/components/radio-control/{option-layout.tsx → option-layout.js} RENAMED
@@ -1,22 +1,16 @@
1
- /**
2
- * External dependencies
3
- */
4
- import type { ReactElement } from 'react';
5
- import type { PackageRateOption } from '@woocommerce/type-defs/shipping';
6
-
7
  const OptionLayout = ( {
8
  label,
9
  secondaryLabel,
10
  description,
11
  secondaryDescription,
12
  id,
13
- }: Partial< PackageRateOption > ): ReactElement => {
14
  return (
15
  <div className="wc-block-components-radio-control__option-layout">
16
  <div className="wc-block-components-radio-control__label-group">
17
  { label && (
18
  <span
19
- id={ id && `${ id }__label` }
20
  className="wc-block-components-radio-control__label"
21
  >
22
  { label }
@@ -24,7 +18,7 @@ const OptionLayout = ( {
24
  ) }
25
  { secondaryLabel && (
26
  <span
27
- id={ id && `${ id }__secondary-label` }
28
  className="wc-block-components-radio-control__secondary-label"
29
  >
30
  { secondaryLabel }
@@ -34,7 +28,7 @@ const OptionLayout = ( {
34
  <div className="wc-block-components-radio-control__description-group">
35
  { description && (
36
  <span
37
- id={ id && `${ id }__description` }
38
  className="wc-block-components-radio-control__description"
39
  >
40
  { description }
@@ -42,7 +36,7 @@ const OptionLayout = ( {
42
  ) }
43
  { secondaryDescription && (
44
  <span
45
- id={ id && `${ id }__secondary-description` }
46
  className="wc-block-components-radio-control__secondary-description"
47
  >
48
  { secondaryDescription }
 
 
 
 
 
 
1
  const OptionLayout = ( {
2
  label,
3
  secondaryLabel,
4
  description,
5
  secondaryDescription,
6
  id,
7
+ } ) => {
8
  return (
9
  <div className="wc-block-components-radio-control__option-layout">
10
  <div className="wc-block-components-radio-control__label-group">
11
  { label && (
12
  <span
13
+ id={ id ? `${ id }__label` : null }
14
  className="wc-block-components-radio-control__label"
15
  >
16
  { label }
18
  ) }
19
  { secondaryLabel && (
20
  <span
21
+ id={ id ? `${ id }__secondary-label` : null }
22
  className="wc-block-components-radio-control__secondary-label"
23
  >
24
  { secondaryLabel }
28
  <div className="wc-block-components-radio-control__description-group">
29
  { description && (
30
  <span
31
+ id={ id ? `${ id }__description` : null }
32
  className="wc-block-components-radio-control__description"
33
  >
34
  { description }
36
  ) }
37
  { secondaryDescription && (
38
  <span
39
+ id={ id ? `${ id }__secondary-description` : null }
40
  className="wc-block-components-radio-control__secondary-description"
41
  >
42
  { secondaryDescription }
assets/js/base/components/radio-control/option.js CHANGED
@@ -20,12 +20,7 @@ const Option = ( { checked, name, onChange, option } ) => {
20
 
21
  return (
22
  <label
23
- className={ classnames(
24
- 'wc-block-components-radio-control__option',
25
- {
26
- 'wc-block-components-radio-control__option-checked': checked,
27
- }
28
- ) }
29
  htmlFor={ `${ name }-${ value }` }
30
  >
31
  <input
20
 
21
  return (
22
  <label
23
+ className="wc-block-components-radio-control__option"
 
 
 
 
 
24
  htmlFor={ `${ name }-${ value }` }
25
  >
26
  <input
assets/js/base/components/radio-control/style.scss CHANGED
@@ -1,115 +1,4 @@
1
- .wc-block-components-radio-control__option {
2
- @include reset-typography();
3
- display: block;
4
- margin: em($gap) 0;
5
- padding: 0 0 0 em($gap-largest);
6
- position: relative;
7
 
8
- &:first-child {
9
- margin-top: 0;
10
- }
11
- &:last-child {
12
- margin-bottom: 0;
13
- }
14
- }
15
-
16
- .wc-block-components-radio-control__option-layout {
17
- display: table;
18
- width: 100%;
19
- }
20
-
21
- .wc-block-components-radio-control__option .wc-block-components-radio-control__option-layout {
22
- &::after {
23
- display: none;
24
- }
25
- }
26
-
27
- .wc-block-components-radio-control__label-group,
28
- .wc-block-components-radio-control__description-group {
29
- display: table-row;
30
-
31
- > span {
32
- display: table-cell;
33
- }
34
-
35
- .wc-block-components-radio-control__secondary-label,
36
- .wc-block-components-radio-control__secondary-description {
37
- text-align: right;
38
- min-width: 50%;
39
- }
40
- }
41
-
42
- .wc-block-components-radio-control__label,
43
- .wc-block-components-radio-control__secondary-label {
44
- // Currently, max() CSS function calls need to be wrapped with unquote.
45
- // See: https://github.com/sass/sass/issues/2378#issuecomment-367490840
46
- // These values should be the same as the control input height.
47
- line-height: unquote("max(1.5rem, 24px)");
48
- }
49
-
50
- .wc-block-components-radio-control__description,
51
- .wc-block-components-radio-control__secondary-description {
52
- @include font-size( small );
53
- line-height: 20px;
54
- }
55
-
56
- // Extra class for specificity.
57
- .wc-block-components-radio-control {
58
- .wc-block-components-radio-control__input {
59
- appearance: none;
60
- background: #fff;
61
- border: 2px solid $input-border-gray;
62
- border-radius: 50%;
63
- display: inline-block;
64
- height: em(24px); // =1.5rem
65
- min-height: 24px;
66
- min-width: 24px;
67
- width: em(24px);
68
- // The code belows centers the input vertically.
69
- position: absolute;
70
- left: 0;
71
- top: 50%;
72
- transform: translate(0, -50%);
73
-
74
- &:checked::before {
75
- background: #000;
76
- border-radius: 50%;
77
- content: "";
78
- display: block;
79
- height: em(12px);
80
- left: 50%;
81
- margin: 0;
82
- min-height: 12px;
83
- min-width: 12px;
84
- position: absolute;
85
- top: 50%;
86
- transform: translate(-50%, -50%);
87
- width: em(12px);
88
- }
89
-
90
- .has-dark-controls & {
91
- border-color: $controls-border-dark;
92
- background-color: $input-background-dark;
93
-
94
- &:checked::before {
95
- background: $input-text-dark;
96
- }
97
- }
98
- }
99
- }
100
-
101
- .theme-twentytwentyone {
102
- .wc-block-components-radio-control .wc-block-components-radio-control__input {
103
- &:checked {
104
- border-width: 2px;
105
-
106
- &::before {
107
- background-color: var(--form--color-text);
108
- }
109
- }
110
-
111
- &::after {
112
- display: none;
113
- }
114
- }
115
- }
1
+ @import "./mixin";
 
 
 
 
 
2
 
3
+ @include radio-control-styles;
4
+ @include radio-control-input-styles;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
assets/js/base/components/read-more/test/index.js CHANGED
@@ -11,19 +11,19 @@ const longContent =
11
 
12
  describe( 'ReadMore Component', () => {
13
  describe( 'Test the truncateHtml function', () => {
14
- it( 'Truncate long HTML content to length of 10', () => {
15
  const truncatedContent = truncateHtml( longContent, 10 );
16
 
17
  expect( truncatedContent ).toEqual( '<p>Lorem ipsum...</p>' );
18
  } );
19
- it( 'Truncate long HTML content, but avoid cutting off HTML tags.', () => {
20
  const truncatedContent = truncateHtml( longContent, 40 );
21
 
22
  expect( truncatedContent ).toEqual(
23
  '<p>Lorem ipsum dolor sit amet, <strong>consectetur...</strong></p>'
24
  );
25
  } );
26
- it( 'No need to truncate short HTML content.', () => {
27
  const truncatedContent = truncateHtml( shortContent, 100 );
28
 
29
  expect( truncatedContent ).toEqual(
11
 
12
  describe( 'ReadMore Component', () => {
13
  describe( 'Test the truncateHtml function', () => {
14
+ it( 'Truncate long HTML content to length of 10', async () => {
15
  const truncatedContent = truncateHtml( longContent, 10 );
16
 
17
  expect( truncatedContent ).toEqual( '<p>Lorem ipsum...</p>' );
18
  } );
19
+ it( 'Truncate long HTML content, but avoid cutting off HTML tags.', async () => {
20
  const truncatedContent = truncateHtml( longContent, 40 );
21
 
22
  expect( truncatedContent ).toEqual(
23
  '<p>Lorem ipsum dolor sit amet, <strong>consectetur...</strong></p>'
24
  );
25
  } );
26
+ it( 'No need to truncate short HTML content.', async () => {
27
  const truncatedContent = truncateHtml( shortContent, 100 );
28
 
29
  expect( truncatedContent ).toEqual(
assets/js/base/components/reviews/review-list-item/index.js CHANGED
@@ -124,19 +124,21 @@ function getReviewRating( review ) {
124
  const starStyle = {
125
  width: ( rating / 5 ) * 100 + '%' /* stylelint-disable-line */,
126
  };
127
- const ratingText = sprintf(
128
- /* translators: %f is referring to the average rating value */
129
- __( 'Rated %f out of 5', 'woo-gutenberg-products-block' ),
130
- rating
131
- );
132
  return (
133
  <div className="wc-block-review-list-item__rating wc-block-components-review-list-item__rating">
134
  <div
135
  className="wc-block-review-list-item__rating__stars wc-block-components-review-list-item__rating__stars"
136
  role="img"
137
- aria-label={ ratingText }
138
  >
139
- <span style={ starStyle }>{ ratingText }</span>
 
 
 
 
 
 
 
 
140
  </div>
141
  </div>
142
  );
124
  const starStyle = {
125
  width: ( rating / 5 ) * 100 + '%' /* stylelint-disable-line */,
126
  };
 
 
 
 
 
127
  return (
128
  <div className="wc-block-review-list-item__rating wc-block-components-review-list-item__rating">
129
  <div
130
  className="wc-block-review-list-item__rating__stars wc-block-components-review-list-item__rating__stars"
131
  role="img"
 
132
  >
133
+ <span style={ starStyle }>
134
+ { sprintf(
135
+ __(
136
+ 'Rated %f out of 5',
137
+ 'woo-gutenberg-products-block'
138
+ ),
139
+ rating
140
+ ) }
141
+ </span>
142
  </div>
143
  </div>
144
  );
assets/js/base/components/reviews/review-list/index.js CHANGED
@@ -2,7 +2,10 @@
2
  * External dependencies
3
  */
4
  import PropTypes from 'prop-types';
5
- import { getSetting } from '@woocommerce/settings';
 
 
 
6
 
7
  /**
8
  * Internal dependencies
@@ -11,13 +14,11 @@ import ReviewListItem from '../review-list-item';
11
  import './style.scss';
12
 
13
  const ReviewList = ( { attributes, reviews } ) => {
14
- const showAvatars = getSetting( 'showAvatars', true );
15
- const reviewRatingsEnabled = getSetting( 'reviewRatingsEnabled', true );
16
  const showReviewImage =
17
- ( showAvatars || attributes.imageType === 'product' ) &&
18
  attributes.showReviewImage;
19
  const showReviewRating =
20
- reviewRatingsEnabled && attributes.showReviewRating;
21
  const attrs = {
22
  ...attributes,
23
  showReviewImage,
2
  * External dependencies
3
  */
4
  import PropTypes from 'prop-types';
5
+ import {
6
+ REVIEW_RATINGS_ENABLED,
7
+ SHOW_AVATARS,
8
+ } from '@woocommerce/block-settings';
9
 
10
  /**
11
  * Internal dependencies
14
  import './style.scss';
15
 
16
  const ReviewList = ( { attributes, reviews } ) => {
 
 
17
  const showReviewImage =
18
+ ( SHOW_AVATARS || attributes.imageType === 'product' ) &&
19
  attributes.showReviewImage;
20
  const showReviewRating =
21
+ REVIEW_RATINGS_ENABLED && attributes.showReviewRating;
22
  const attrs = {
23
  ...attributes,
24
  showReviewImage,
assets/js/base/components/select/index.js CHANGED
@@ -1,2 +1,61 @@
1
- export { default as Select } from './select';
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2
  export { default as ValidatedSelect } from './validated';
1
+ /**
2
+ * External dependencies
3
+ */
4
+ import PropTypes from 'prop-types';
5
+ import classnames from 'classnames';
6
+ import { CustomSelectControl } from 'wordpress-components';
7
+
8
+ /**
9
+ * Internal dependencies
10
+ */
11
+ import './style.scss';
12
+
13
+ const Select = ( {
14
+ className,
15
+ feedback,
16
+ id,
17
+ label,
18
+ onChange,
19
+ options,
20
+ value,
21
+ } ) => {
22
+ return (
23
+ <div
24
+ id={ id }
25
+ className={ classnames( 'wc-block-components-select', className, {
26
+ 'is-active': value,
27
+ } ) }
28
+ >
29
+ <CustomSelectControl
30
+ label={ label }
31
+ onChange={ ( { selectedItem } ) => {
32
+ onChange( selectedItem.key );
33
+ } }
34
+ options={ options }
35
+ value={ value }
36
+ />
37
+ { feedback }
38
+ </div>
39
+ );
40
+ };
41
+
42
+ Select.propTypes = {
43
+ onChange: PropTypes.func.isRequired,
44
+ options: PropTypes.arrayOf(
45
+ PropTypes.shape( {
46
+ key: PropTypes.string.isRequired,
47
+ name: PropTypes.string.isRequired,
48
+ } ).isRequired
49
+ ).isRequired,
50
+ className: PropTypes.string,
51
+ feedback: PropTypes.node,
52
+ id: PropTypes.string,
53
+ label: PropTypes.string,
54
+ value: PropTypes.shape( {
55
+ key: PropTypes.string.isRequired,
56
+ name: PropTypes.string.isRequired,
57
+ } ),
58
+ };
59
+
60
+ export default Select;
61
  export { default as ValidatedSelect } from './validated';
assets/js/base/components/select/select.js DELETED
@@ -1,60 +0,0 @@
1
- /**
2
- * External dependencies
3
- */
4
- import PropTypes from 'prop-types';
5
- import classnames from 'classnames';
6
- import { CustomSelectControl } from 'wordpress-components';
7
-
8
- /**
9
- * Internal dependencies
10
- */
11
- import './style.scss';
12
-
13
- const Select = ( {
14
- className,
15
- feedback,
16
- id,
17
- label,
18
- onChange,
19
- options,
20
- value,
21
- } ) => {
22
- return (
23
- <div
24
- id={ id }
25
- className={ classnames( 'wc-block-components-select', className, {
26
- 'is-active': value,
27
- } ) }
28
- >
29
- <CustomSelectControl
30
- label={ label }
31
- onChange={ ( { selectedItem } ) => {
32
- onChange( selectedItem.key );
33
- } }
34
- options={ options }
35
- value={ value || null }
36
- />
37
- { feedback }
38
- </div>
39
- );
40
- };
41
-
42
- Select.propTypes = {
43
- onChange: PropTypes.func.isRequired,
44
- options: PropTypes.arrayOf(
45
- PropTypes.shape( {
46
- key: PropTypes.string.isRequired,
47
- name: PropTypes.string.isRequired,
48
- } ).isRequired
49
- ).isRequired,
50
- className: PropTypes.string,
51
- feedback: PropTypes.node,
52
- id: PropTypes.string,
53
- label: PropTypes.string,
54
- value: PropTypes.shape( {
55
- key: PropTypes.string.isRequired,
56
- name: PropTypes.string.isRequired,
57
- } ),
58
- };
59
-
60
- export default Select;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
assets/js/base/components/select/style.scss CHANGED
@@ -1,9 +1,9 @@
1
- .wc-block-components-form .wc-block-components-select,
2
  .wc-block-components-select {
3
  height: 3em;
4
  position: relative;
 
5
 
6
- label.components-custom-select-control__label {
7
  @include reset-typography();
8
  @include font-size(regular);
9
  line-height: 1.375; // =22px when font-size is 16px.
@@ -11,7 +11,7 @@
11
  transform: translateY(0.75em);
12
  transform-origin: top left;
13
  transition: all 200ms ease;
14
- color: $gray-700;
15
  z-index: 1;
16
  margin: 0 0 0 #{$gap + 1px};
17
  overflow: hidden;
@@ -19,9 +19,6 @@
19
  max-width: calc(100% - #{2 * $gap});
20
  white-space: nowrap;
21
 
22
- .has-dark-controls & {
23
- color: $input-placeholder-dark;
24
- }
25
  @media screen and (prefers-reduced-motion: reduce) {
26
  transition: none;
27
  }
@@ -33,21 +30,12 @@
33
 
34
  &.has-error {
35
  .components-custom-select-control__button {
36
- &,
37
- &:hover,
38
- &:focus,
39
- &:active {
40
- border-color: $alert-red;
41
- }
42
- &:focus {
43
- outline: 1px dotted $alert-red;
44
- outline-offset: 2px;
45
- }
46
  }
47
  }
48
 
49
  &.has-error label {
50
- color: $alert-red;
51
  }
52
 
53
  .components-custom-select-control__button {
@@ -56,7 +44,7 @@
56
  &:focus,
57
  &:active {
58
  @include font-size(regular);
59
- background: #fff;
60
  box-shadow: none;
61
  color: $input-text-active;
62
  font-family: inherit;
@@ -71,92 +59,32 @@
71
  text-transform: none;
72
  white-space: nowrap;
73
  width: 100%;
74
- opacity: initial;
75
- border-radius: 4px;
76
- .has-dark-controls & {
77
- background: $input-background-dark;
78
- border-color: $input-border-dark;
79
- color: $input-text-dark;
80
- }
81
  }
82
  }
83
 
84
  .components-custom-select-control__button-icon {
85
  right: #{$gap - 4px};
86
- .has-dark-controls & {
87
- fill: $input-text-dark;
88
- }
89
  }
90
 
91
  .components-custom-select-control__menu {
92
- background-color: $select-dropdown-light;
93
  margin: 0;
94
  max-height: 300px;
95
  overflow: auto;
96
- color: $input-text-active;
97
 
98
  // Required by IE11.
99
  &:empty {
100
  display: none;
101
  }
102
- .has-dark-controls & {
103
- background-color: $select-dropdown-dark;
104
- color: $input-text-dark;
105
- }
106
  }
107
 
108
  .components-custom-select-control__item {
109
  @include font-size(regular);
110
  margin-left: 0;
111
  padding-left: $gap;
112
- &:hover,
113
- &:focus,
114
- &.is-highlighted {
115
- .has-dark-controls & {
116
- background-color: $select-item-dark;
117
- }
118
- }
119
  }
120
 
121
  .components-custom-select-control__item-icon {
122
  display: none;
123
  }
124
  }
125
-
126
- .theme-twentytwentyone {
127
- // Extra classes for specificity.
128
- &.theme-twentytwentyone.theme-twentytwentyone .components-custom-select-control__button {
129
- background-color: #fff;
130
- color: $input-text-active;
131
- }
132
-
133
- &.is-dark-theme {
134
- // If the theme is in dark mode, as well as the block, then this selector will match.
135
- .has-dark-controls {
136
- .components-custom-select-control__item {
137
- color: $input-text-dark;
138
- }
139
- }
140
-
141
- // If the theme is in dark mode, but the block isn't, then this selector will match.
142
- .components-custom-select-control__item {
143
- color: $input-text-active;
144
- }
145
- }
146
- }
147
-
148
- .theme-twentyseventeen {
149
- // Extra classes for specificity.
150
- &.theme-twentyseventeen.theme-twentyseventeen {
151
- .components-custom-select-control__button {
152
- background-color: $select-dropdown-light;
153
- color: $input-text-active;
154
- }
155
- .has-dark-controls {
156
- .components-custom-select-control__button {
157
- background-color: $select-dropdown-dark;
158
- color: $input-text-dark;
159
- }
160
- }
161
- }
162
- }
 
1
  .wc-block-components-select {
2
  height: 3em;
3
  position: relative;
4
+ margin-bottom: em($gap-large);
5
 
6
+ label {
7
  @include reset-typography();
8
  @include font-size(regular);
9
  line-height: 1.375; // =22px when font-size is 16px.
11
  transform: translateY(0.75em);
12
  transform-origin: top left;
13
  transition: all 200ms ease;
14
+ color: $gray-50;
15
  z-index: 1;
16
  margin: 0 0 0 #{$gap + 1px};
17
  overflow: hidden;
19
  max-width: calc(100% - #{2 * $gap});
20
  white-space: nowrap;
21
 
 
 
 
22
  @media screen and (prefers-reduced-motion: reduce) {
23
  transition: none;
24
  }
30
 
31
  &.has-error {
32
  .components-custom-select-control__button {
33
+ border-color: $error-red;
 
 
 
 
 
 
 
 
 
34
  }
35
  }
36
 
37
  &.has-error label {
38
+ color: $error-red;
39
  }
40
 
41
  .components-custom-select-control__button {
44
  &:focus,
45
  &:active {
46
  @include font-size(regular);
47
+ background-color: #fff;
48
  box-shadow: none;
49
  color: $input-text-active;
50
  font-family: inherit;
59
  text-transform: none;
60
  white-space: nowrap;
61
  width: 100%;
 
 
 
 
 
 
 
62
  }
63
  }
64
 
65
  .components-custom-select-control__button-icon {
66
  right: #{$gap - 4px};
 
 
 
67
  }
68
 
69
  .components-custom-select-control__menu {
70
+ background-color: #fff;
71
  margin: 0;
72
  max-height: 300px;
73
  overflow: auto;
 
74
 
75
  // Required by IE11.
76
  &:empty {
77
  display: none;
78
  }
 
 
 
 
79
  }
80
 
81
  .components-custom-select-control__item {
82
  @include font-size(regular);
83
  margin-left: 0;
84
  padding-left: $gap;
 
 
 
 
 
 
 
85
  }
86
 
87
  .components-custom-select-control__item-icon {
88
  display: none;
89
  }
90
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
assets/js/base/components/select/validated.js CHANGED
@@ -3,19 +3,17 @@
3
  */
4
  import { __ } from '@wordpress/i18n';
5
  import { useEffect } from 'react';
 
6
  import { useShallowEqual } from '@woocommerce/base-hooks';
7
  import PropTypes from 'prop-types';
8
  import classnames from 'classnames';
9
  import { withInstanceId } from '@woocommerce/base-hocs/with-instance-id';
10
- import {
11
- ValidationInputError,
12
- useValidationContext,
13
- } from '@woocommerce/base-context';
14
 
15
  /**
16
  * Internal dependencies
17
  */
18
- import Select from './select';
 
19
  import './style.scss';
20
 
21
  const ValidatedSelect = ( {
@@ -43,7 +41,7 @@ const ValidatedSelect = ( {
43
  clearValidationError,
44
  } = useValidationContext();
45
 
46
- useEffect( () => {
47
  if ( ! required || currentValue ) {
48
  clearValidationError( errorId );
49
  } else {
@@ -54,21 +52,18 @@ const ValidatedSelect = ( {
54
  },
55
  } );
56
  }
57
- }, [
58
- clearValidationError,
59
- currentValue,
60
- errorId,
61
- errorMessage,
62
- required,
63
- setValidationErrors,
64
- ] );
65
 
66
  // Remove validation errors when unmounted.
67
  useEffect( () => {
68
  return () => {
69
  clearValidationError( errorId );
70
  };
71
- }, [ clearValidationError, errorId ] );
72
 
73
  const error = getValidationError( errorId ) || {};
74
 
3
  */
4
  import { __ } from '@wordpress/i18n';
5
  import { useEffect } from 'react';
6
+ import { useValidationContext } from '@woocommerce/base-context';
7
  import { useShallowEqual } from '@woocommerce/base-hooks';
8
  import PropTypes from 'prop-types';
9
  import classnames from 'classnames';
10
  import { withInstanceId } from '@woocommerce/base-hocs/with-instance-id';
 
 
 
 
11
 
12
  /**
13
  * Internal dependencies
14
  */
15
+ import { ValidationInputError } from '../validation';
16
+ import Select from './index';
17
  import './style.scss';
18
 
19
  const ValidatedSelect = ( {
41
  clearValidationError,
42
  } = useValidationContext();
43
 
44
+ const validateSelect = () => {
45
  if ( ! required || currentValue ) {
46
  clearValidationError( errorId );
47
  } else {
52
  },
53
  } );
54
  }
55
+ };
56
+
57
+ useEffect( () => {
58
+ validateSelect();
59
+ }, [ currentValue ] );
 
 
 
60
 
61
  // Remove validation errors when unmounted.
62
  useEffect( () => {
63
  return () => {
64
  clearValidationError( errorId );
65
  };
66
+ }, [ errorId ] );
67
 
68
  const error = getValidationError( errorId ) || {};
69
 
assets/js/base/components/sidebar-layout/style.scss CHANGED
@@ -5,7 +5,6 @@
5
  position: relative;
6
 
7
  .wc-block-components-main {
8
- box-sizing: border-box;
9
  margin: 0;
10
  padding-right: percentage($gap-largest / 1060px); // ~1060px is the default width of the content area in Storefront.
11
  width: 65%;
@@ -13,14 +12,15 @@
13
  }
14
 
15
  .wc-block-components-sidebar {
16
- box-sizing: border-box;
17
  margin: 0;
18
  padding-left: percentage($gap-large / 1060px);
19
  width: 35%;
20
 
21
- .wc-block-components-panel > h2 {
22
- @include font-size(regular);
23
- @include reset-box();
 
 
24
  }
25
  }
26
 
@@ -45,23 +45,16 @@
45
  .is-large {
46
  .wc-block-components-sidebar {
47
  .wc-block-components-totals-item,
48
- .wc-block-components-panel {
49
  padding-left: $gap;
50
  padding-right: $gap;
51
  }
52
  }
53
  }
54
 
55
- .wc-block-components-sidebar .wc-block-components-panel > h2 {
56
- @include reset-typography();
57
- .wc-block-components-panel__button {
58
- font-weight: 400;
59
- }
60
- }
61
-
62
  // For Twenty Twenty we need to increase specificity a bit more.
63
  .theme-twentytwenty {
64
- .wc-block-components-sidebar .wc-block-components-panel > h2 {
65
  @include font-size(large);
66
  @include reset-box();
67
  }
5
  position: relative;
6
 
7
  .wc-block-components-main {
 
8
  margin: 0;
9
  padding-right: percentage($gap-largest / 1060px); // ~1060px is the default width of the content area in Storefront.
10
  width: 65%;
12
  }
13
 
14
  .wc-block-components-sidebar {
 
15
  margin: 0;
16
  padding-left: percentage($gap-large / 1060px);
17
  width: 35%;
18
 
19
+ .wc-blocks-components-panel {
20
+ > h2 {
21
+ @include font-size(large);
22
+ @include reset-box();
23
+ }
24
  }
25
  }
26
 
45
  .is-large {
46
  .wc-block-components-sidebar {
47
  .wc-block-components-totals-item,
48
+ .wc-blocks-components-panel {
49
  padding-left: $gap;
50
  padding-right: $gap;
51
  }
52
  }
53
  }
54
 
 
 
 
 
 
 
 
55
  // For Twenty Twenty we need to increase specificity a bit more.
56
  .theme-twentytwenty {
57
+ .wc-block-components-sidebar .wc-blocks-components-panel > h2 {
58
  @include font-size(large);
59
  @include reset-box();
60
  }
assets/js/base/components/sort-select/index.js CHANGED
@@ -14,17 +14,6 @@ import './style.scss';
14
  /**
15
  * Component used for 'Order by' selectors, which renders a label
16
  * and a <select> with the options provided in the props.
17
- *
18
- * @param {Object} props Incoming props for the component.
19
- * @param {string} props.className CSS class used.
20
- * @param {string} props.instanceId Unique id for component instance.
21
- * @param {string} props.defaultValue Default value for the select.
22
- * @param {string} props.label Label for the select.
23
- * @param {function():any} props.onChange Function to call on the change event.
24
- * @param {Array} props.options Option values for the select.
25
- * @param {string} props.screenReaderLabel Screen reader label.
26
- * @param {boolean} props.readOnly Whether the select is read only or not.
27
- * @param {string} props.value The selected value.
28
  */
29
  const SortSelect = ( {
30
  className,
14
  /**
15
  * Component used for 'Order by' selectors, which renders a label
16
  * and a <select> with the options provided in the props.
 
 
 
 
 
 
 
 
 
 
 
17
  */
18
  const SortSelect = ( {
19
  className,
assets/js/base/components/spinner/index.tsx DELETED
@@ -1,10 +0,0 @@
1
- /**
2
- * Internal dependencies
3
- */
4
- import './style.scss';
5
-
6
- const Spinner = (): JSX.Element => {
7
- return <span className="wc-block-components-spinner" aria-hidden="true" />;
8
- };
9
-
10
- export default Spinner;
 
 
 
 
 
 
 
 
 
 
assets/js/base/components/spinner/style.scss DELETED
@@ -1,37 +0,0 @@
1
- .wc-block-components-spinner {
2
- position: absolute;
3
- width: 100%;
4
- height: 100%;
5
- color: inherit;
6
- box-sizing: content-box;
7
- text-align: center;
8
- font-size: 1.25em;
9
-
10
- &::after {
11
- content: " ";
12
- position: absolute;
13
- top: 50%;
14
- left: 50%;
15
- margin: -0.5em 0 0 -0.5em;
16
- width: 1em;
17
- height: 1em;
18
- box-sizing: border-box;
19
- transform-origin: 50% 50%;
20
- transform: translateZ(0) scale(0.5);
21
- backface-visibility: hidden;
22
- border-radius: 50%;
23
- border: 0.2em solid currentColor;
24
- border-left-color: transparent;
25
- animation: wc-block-components-spinner__animation 1s infinite linear;
26
- }
27
- }
28
-
29
- @keyframes wc-block-components-spinner__animation {
30
- 0% {
31
- animation-timing-function: cubic-bezier(0.5856, 0.0703, 0.4143, 0.9297);
32
- transform: rotate(0deg);
33
- }
34
- 100% {
35
- transform: rotate(360deg);
36
- }
37
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
assets/js/base/components/state-input/StateInputProps.ts DELETED
@@ -1,15 +0,0 @@
1
- export interface StateInputProps {
2
- className?: string;
3
- label: string;
4
- id: string;
5
- autoComplete?: string;
6
- value: string;
7
- country: string;
8
- onChange: ( value: string ) => void;
9
- required?: boolean;
10
- errorMessage?: string;
11
- }
12
-
13
- export type StateInputWithStatesProps = StateInputProps & {
14
- states: Record< string, Record< string, string > >;
15
- };
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
assets/js/base/components/state-input/billing-state-input.js ADDED
@@ -0,0 +1,23 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /**
2
+ * External dependencies
3
+ */
4
+ import PropTypes from 'prop-types';
5
+ import { ALLOWED_STATES } from '@woocommerce/block-settings';
6
+
7
+ /**
8
+ * Internal dependencies
9
+ */
10
+ import StateInput from './state-input.js';
11
+
12
+ const BillingStateInput = ( props ) => {
13
+ return <StateInput states={ ALLOWED_STATES } { ...props } />;
14
+ };
15
+
16
+ BillingStateInput.propTypes = {
17
+ onChange: PropTypes.func.isRequired,
18
+ className: PropTypes.string,
19
+ label: PropTypes.string,
20
+ value: PropTypes.string,
21
+ };
22
+
23
+ export default BillingStateInput;
assets/js/base/components/state-input/billing-state-input.tsx DELETED
@@ -1,16 +0,0 @@
1
- /**
2
- * External dependencies
3
- */
4
- import { ALLOWED_STATES } from '@woocommerce/block-settings';
5
-
6
- /**
7
- * Internal dependencies
8
- */
9
- import StateInput from './state-input';
10
- import type { StateInputProps } from './StateInputProps';
11
-
12
- const BillingStateInput = ( props: StateInputProps ): JSX.Element => {
13
- return <StateInput states={ ALLOWED_STATES } { ...props } />;
14
- };
15
-
16
- export default BillingStateInput;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
assets/js/base/components/state-input/{index.ts → index.js} RENAMED
File without changes
assets/js/base/components/state-input/shipping-state-input.js ADDED
@@ -0,0 +1,23 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /**
2
+ * External dependencies
3
+ */
4
+ import PropTypes from 'prop-types';
5
+ import { SHIPPING_STATES } from '@woocommerce/block-settings';
6
+
7
+ /**
8
+ * Internal dependencies
9
+ */
10
+ import StateInput from './state-input.js';
11
+
12
+ const ShippingStateInput = ( props ) => {
13
+ return <StateInput states={ SHIPPING_STATES } { ...props } />;
14
+ };
15
+
16
+ ShippingStateInput.propTypes = {
17
+ onChange: PropTypes.func.isRequired,
18
+ className: PropTypes.string,
19
+ label: PropTypes.string,
20
+ value: PropTypes.string,
21
+ };
22
+
23
+ export default ShippingStateInput;
assets/js/base/components/state-input/shipping-state-input.tsx DELETED
@@ -1,16 +0,0 @@
1
- /**
2
- * External dependencies
3
- */
4
- import { SHIPPING_STATES } from '@woocommerce/block-settings';
5
-
6
- /**
7
- * Internal dependencies
8
- */
9
- import StateInput from './state-input';
10
- import type { StateInputProps } from './StateInputProps';
11
-
12
- const ShippingStateInput = ( props: StateInputProps ): JSX.Element => {
13
- return <StateInput states={ SHIPPING_STATES } { ...props } />;
14
- };
15
-
16
- export default ShippingStateInput;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
assets/js/base/components/state-input/{state-input.tsx → state-input.js} RENAMED
@@ -2,17 +2,15 @@
2
  * External dependencies
3
  */
4
  import { __ } from '@wordpress/i18n';
 
5
  import { decodeEntities } from '@wordpress/html-entities';
6
- import { useCallback, useMemo } from '@wordpress/element';
7
- import classnames from 'classnames';
8
 
9
  /**
10
  * Internal dependencies
11
  */
12
  import { ValidatedTextInput } from '../text-input';
13
  import { ValidatedSelect } from '../select';
14
- import './style.scss';
15
- import type { StateInputWithStatesProps } from './StateInputProps';
16
 
17
  const StateInput = ( {
18
  className,
@@ -24,18 +22,14 @@ const StateInput = ( {
24
  autoComplete = 'off',
25
  value = '',
26
  required = false,
27
- }: StateInputWithStatesProps ): JSX.Element => {
28
  const countryStates = states[ country ];
29
- const options = useMemo(
30
- () =>
31
- countryStates
32
- ? Object.keys( countryStates ).map( ( key ) => ( {
33
- key,
34
- name: decodeEntities( countryStates[ key ] ),
35
- } ) )
36
- : [],
37
- [ countryStates ]
38
- );
39
 
40
  /**
41
  * Handles state selection onChange events. Finds a matching state by key or value.
@@ -62,10 +56,7 @@ const StateInput = ( {
62
  return (
63
  <>
64
  <ValidatedSelect
65
- className={ classnames(
66
- className,
67
- 'wc-block-components-state-input'
68
- ) }
69
  id={ id }
70
  label={ label }
71
  onChange={ onChangeState }
@@ -112,4 +103,20 @@ const StateInput = ( {
112
  );
113
  };
114
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
115
  export default StateInput;
2
  * External dependencies
3
  */
4
  import { __ } from '@wordpress/i18n';
5
+ import PropTypes from 'prop-types';
6
  import { decodeEntities } from '@wordpress/html-entities';
7
+ import { useCallback } from '@wordpress/element';
 
8
 
9
  /**
10
  * Internal dependencies
11
  */
12
  import { ValidatedTextInput } from '../text-input';
13
  import { ValidatedSelect } from '../select';
 
 
14
 
15
  const StateInput = ( {
16
  className,
22
  autoComplete = 'off',
23
  value = '',
24
  required = false,
25
+ } ) => {
26
  const countryStates = states[ country ];
27
+ const options = countryStates
28
+ ? Object.keys( countryStates ).map( ( key ) => ( {
29
+ key,
30
+ name: decodeEntities( countryStates[ key ] ),
31
+ } ) )
32
+ : [];
 
 
 
 
33
 
34
  /**
35
  * Handles state selection onChange events. Finds a matching state by key or value.
56
  return (
57
  <>
58
  <ValidatedSelect
59
+ className={ className }
 
 
 
60
  id={ id }
61
  label={ label }
62
  onChange={ onChangeState }
103
  );
104
  };
105
 
106
+ StateInput.propTypes = {
107
+ states: PropTypes.objectOf(
108
+ PropTypes.oneOfType( [
109
+ PropTypes.array,
110
+ PropTypes.objectOf( PropTypes.string ),
111
+ ] )
112
+ ).isRequired,
113
+ onChange: PropTypes.func.isRequired,
114
+ autoComplete: PropTypes.string,
115
+ id: PropTypes.string,
116
+ className: PropTypes.string,
117
+ country: PropTypes.string,
118
+ label: PropTypes.string,
119
+ value: PropTypes.string,
120
+ };
121
+
122
  export default StateInput;
assets/js/base/components/state-input/style.scss DELETED
@@ -1,3 +0,0 @@
1
- .wc-block-components-state-input {
2
- margin-top: em($gap-large);
3
- }
 
 
 
assets/js/base/components/store-notices-container/index.js ADDED
@@ -0,0 +1,2 @@
 
 
1
+ export { default as StoreNoticesContainer } from './store-notices-container';
2
+ export { default as SnackbarNoticesContainer } from './snackbar-notices';
assets/js/base/components/store-notices-container/snackbar-notices.js ADDED
@@ -0,0 +1,27 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /**
2
+ * External dependencies
3
+ */
4
+ import { SnackbarList } from 'wordpress-components';
5
+ import { useStoreNotices } from '@woocommerce/base-hooks';
6
+ import { useEditorContext } from '@woocommerce/base-context';
7
+
8
+ const NoticesContainer = () => {
9
+ const { isEditor } = useEditorContext();
10
+ const { notices, removeNotice } = useStoreNotices();
11
+ const snackbarNotices = notices.filter(
12
+ ( notice ) => notice.type === 'snackbar'
13
+ );
14
+
15
+ if ( isEditor ) {
16
+ return null;
17
+ }
18
+ return (
19
+ <SnackbarList
20
+ notices={ snackbarNotices }
21
+ className={ 'wc-block-components-notices__snackbar' }
22
+ onRemove={ removeNotice }
23
+ />
24
+ );
25
+ };
26
+
27
+ export default NoticesContainer;
assets/js/base/{context/providers/store-notices/components → components/store-notices-container}/store-notices-container.js RENAMED
@@ -4,6 +4,7 @@
4
  import PropTypes from 'prop-types';
5
  import classnames from 'classnames';
6
  import { Notice } from 'wordpress-components';
 
7
 
8
  /**
9
  * Internal dependencies
@@ -23,7 +24,9 @@ const getWooClassName = ( { status = 'default' } ) => {
23
  return '';
24
  };
25
 
26
- const StoreNoticesContainer = ( { className, notices, removeNotice } ) => {
 
 
27
  const regularNotices = notices.filter(
28
  ( notice ) => notice.type !== 'snackbar'
29
  );
@@ -32,8 +35,6 @@ const StoreNoticesContainer = ( { className, notices, removeNotice } ) => {
32
  return null;
33
  }
34
 
35
- const wrapperClass = classnames( className, 'wc-block-components-notices' );
36
-
37
  return (
38
  <div className={ wrapperClass }>
39
  { regularNotices.map( ( props ) => (
4
  import PropTypes from 'prop-types';
5
  import classnames from 'classnames';
6
  import { Notice } from 'wordpress-components';
7
+ import { useStoreNoticesContext } from '@woocommerce/base-context';
8
 
9
  /**
10
  * Internal dependencies
24
  return '';
25
  };
26
 
27
+ const StoreNoticesContainer = ( { className, notices } ) => {
28
+ const { removeNotice } = useStoreNoticesContext();
29
+ const wrapperClass = classnames( className, 'wc-block-components-notices' );
30
  const regularNotices = notices.filter(
31
  ( notice ) => notice.type !== 'snackbar'
32
  );
35
  return null;
36
  }
37
 
 
 
38
  return (
39
  <div className={ wrapperClass }>
40
  { regularNotices.map( ( props ) => (
assets/js/base/components/store-notices-container/style.scss ADDED
@@ -0,0 +1,47 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ .wc-block-components-notices {
2
+ display: block;
3
+ margin-bottom: 2em;
4
+ .wc-block-components-notices__notice {
5
+ margin: 0;
6
+ .components-notice__content {
7
+ display: inline-block;
8
+ }
9
+ .components-notice__dismiss {
10
+ background: transparent none;
11
+ padding: 0;
12
+ margin: 0;
13
+ border: 0;
14
+ outline: 0;
15
+ color: #fff;
16
+ float: right;
17
+ svg {
18
+ fill: #fff;
19
+ vertical-align: text-top;
20
+ }
21
+ }
22
+ }
23
+ .wc-block-components-notices__notice + .wc-block-components-notices__notice {
24
+ margin-top: 1em;
25
+ }
26
+ }
27
+
28
+ .wc-block-components-notices__snackbar {
29
+ position: fixed;
30
+ bottom: 20px;
31
+ left: 16px;
32
+ width: auto;
33
+
34
+ @include breakpoint( "<782px" ) {
35
+ position: fixed;
36
+ top: 10px;
37
+ left: 0;
38
+ bottom: auto;
39
+ }
40
+
41
+ .components-snackbar-list__notice-container {
42
+ @include breakpoint( "<782px" ) {
43
+ margin-left: 10px;
44
+ margin-right: 10px;
45
+ }
46
+ }
47
+ }
assets/js/base/components/summary/{index.tsx → index.js} RENAMED
@@ -2,19 +2,12 @@
2
  * External dependencies
3
  */
4
  import { RawHTML, useMemo } from '@wordpress/element';
5
- import { WordCountType } from '@woocommerce/block-settings';
6
 
7
  /**
8
  * Internal dependencies
9
  */
10
  import { generateSummary } from './utils';
11
 
12
- interface SummaryProps {
13
- className?: string;
14
- source: string;
15
- maxLength?: number;
16
- countType?: WordCountType;
17
- }
18
  /**
19
  * Summary component.
20
  *
@@ -29,7 +22,7 @@ export const Summary = ( {
29
  maxLength = 15,
30
  countType = 'words',
31
  className = '',
32
- }: SummaryProps ): JSX.Element => {
33
  const summaryText = useMemo( () => {
34
  return generateSummary( source, maxLength, countType );
35
  }, [ source, maxLength, countType ] );
2
  * External dependencies
3
  */
4
  import { RawHTML, useMemo } from '@wordpress/element';
 
5
 
6
  /**
7
  * Internal dependencies
8
  */
9
  import { generateSummary } from './utils';
10
 
 
 
 
 
 
 
11
  /**
12
  * Summary component.
13
  *
22
  maxLength = 15,
23
  countType = 'words',
24
  className = '',
25
+ } ) => {
26
  const summaryText = useMemo( () => {
27
  return generateSummary( source, maxLength, countType );
28
  }, [ source, maxLength, countType ] );
assets/js/base/components/summary/utils.js CHANGED
@@ -6,7 +6,7 @@ import { autop } from '@wordpress/autop';
6
 
7
  /**
8
  * Generates the summary text from a string of text.
9
- *
10
  * @param {string} source Source text.
11
  * @param {number} maxLength Limit number of countType returned if text has multiple paragraphs.
12
  * @param {string} countType What is being counted. One of words, characters_excluding_spaces, or characters_including_spaces.
6
 
7
  /**
8
  * Generates the summary text from a string of text.
9
+ *a
10
  * @param {string} source Source text.
11
  * @param {number} maxLength Limit number of countType returned if text has multiple paragraphs.
12
  * @param {string} countType What is being counted. One of words, characters_excluding_spaces, or characters_including_spaces.
assets/js/base/components/tabs/index.js CHANGED
@@ -69,8 +69,7 @@ const Tabs = ( {
69
  tabId={ `${ instanceId }-${ name }` }
70
  className="wc-block-components-tabs__content"
71
  >
72
- { tabState.selectedId === `${ instanceId }-${ name }` &&
73
- content }
74
  </TabPanel>
75
  ) ) }
76
  </div>
69
  tabId={ `${ instanceId }-${ name }` }
70
  className="wc-block-components-tabs__content"
71
  >
72
+ { content }
 
73
  </TabPanel>
74
  ) ) }
75
  </div>
assets/js/base/components/tabs/style.scss CHANGED
@@ -14,7 +14,6 @@
14
  text-align: center;
15
  transition: box-shadow 0.1s linear;
16
  box-shadow: inset 0 -1px currentColor;
17
- border-radius: 0;
18
  &.is-active {
19
  box-shadow: inset 0 -3px currentColor;
20
  font-weight: 600;
@@ -24,10 +23,6 @@
24
  outline-offset: -1px;
25
  outline: 1px dotted currentColor;
26
  }
27
- &:hover,
28
- &:active {
29
- background: transparent;
30
- }
31
  .wc-block-components-tabs__item-content {
32
  @include font-size(regular);
33
  line-height: 1;
14
  text-align: center;
15
  transition: box-shadow 0.1s linear;
16
  box-shadow: inset 0 -1px currentColor;
 
17
  &.is-active {
18
  box-shadow: inset 0 -3px currentColor;
19
  font-weight: 600;
23
  outline-offset: -1px;
24
  outline: 1px dotted currentColor;
25
  }
 
 
 
 
26
  .wc-block-components-tabs__item-content {
27
  @include font-size(regular);
28
  line-height: 1;
assets/js/base/components/text-input/{text-input.tsx → index.js} RENAMED
@@ -1,7 +1,8 @@
1
  /**
2
  * External dependencies
3
  */
4
- import { forwardRef, InputHTMLAttributes } from 'react';
 
5
  import classnames from 'classnames';
6
  import { useState } from '@wordpress/element';
7
 
@@ -11,24 +12,7 @@ import { useState } from '@wordpress/element';
11
  import Label from '../label';
12
  import './style.scss';
13
 
14
- interface TextInputProps
15
- extends Omit<
16
- InputHTMLAttributes< HTMLInputElement >,
17
- 'onChange' | 'onBlur'
18
- > {
19
- id: string;
20
- ariaLabel?: string;
21
- label?: string;
22
- ariaDescribedBy?: string;
23
- screenReaderLabel?: string;
24
- help?: string;
25
- feedback?: boolean | JSX.Element;
26
- autoComplete?: string;
27
- onChange: ( newValue: string ) => void;
28
- onBlur?: ( newValue: string ) => void;
29
- }
30
-
31
- const TextInput = forwardRef< HTMLInputElement, TextInputProps >(
32
  (
33
  {
34
  className,
@@ -40,16 +24,12 @@ const TextInput = forwardRef< HTMLInputElement, TextInputProps >(
40
  screenReaderLabel,
41
  disabled,
42
  help,
43
- autoCapitalize = 'off',
44
  autoComplete = 'off',
45
  value = '',
46
  onChange,
47
  required = false,
48
- onBlur = () => {
49
- /* Do nothing */
50
- },
51
  feedback,
52
- ...rest
53
  },
54
  ref
55
  ) => {
@@ -70,14 +50,13 @@ const TextInput = forwardRef< HTMLInputElement, TextInputProps >(
70
  id={ id }
71
  value={ value }
72
  ref={ ref }
73
- autoCapitalize={ autoCapitalize }
74
  autoComplete={ autoComplete }
75
  onChange={ ( event ) => {
76
  onChange( event.target.value );
77
  } }
78
  onFocus={ () => setIsActive( true ) }
79
- onBlur={ ( event ) => {
80
- onBlur( event.target.value );
81
  setIsActive( false );
82
  } }
83
  aria-label={ ariaLabel || label }
@@ -88,7 +67,6 @@ const TextInput = forwardRef< HTMLInputElement, TextInputProps >(
88
  : ariaDescribedBy
89
  }
90
  required={ required }
91
- { ...rest }
92
  />
93
  <Label
94
  label={ label }
@@ -113,4 +91,19 @@ const TextInput = forwardRef< HTMLInputElement, TextInputProps >(
113
  }
114
  );
115
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
116
  export default TextInput;
 
1
  /**
2
  * External dependencies
3
  */
4
+ import { forwardRef } from 'react';
5
+ import PropTypes from 'prop-types';
6
  import classnames from 'classnames';
7
  import { useState } from '@wordpress/element';
8
 
12
  import Label from '../label';
13
  import './style.scss';
14
 
15
+ const TextInput = forwardRef(
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
16
  (
17
  {
18
  className,
24
  screenReaderLabel,
25
  disabled,
26
  help,
 
27
  autoComplete = 'off',
28
  value = '',
29
  onChange,
30
  required = false,
31
+ onBlur = () => {},
 
 
32
  feedback,
 
33
  },
34
  ref
35
  ) => {
50
  id={ id }
51
  value={ value }
52
  ref={ ref }
 
53
  autoComplete={ autoComplete }
54
  onChange={ ( event ) => {
55
  onChange( event.target.value );
56
  } }
57
  onFocus={ () => setIsActive( true ) }
58
+ onBlur={ () => {
59
+ onBlur();
60
  setIsActive( false );
61
  } }
62
  aria-label={ ariaLabel || label }
67
  : ariaDescribedBy
68
  }
69
  required={ required }
 
70
  />
71
  <Label
72
  label={ label }
91
  }
92
  );
93
 
94
+ TextInput.propTypes = {
95
+ id: PropTypes.string.isRequired,
96
+ onChange: PropTypes.func.isRequired,
97
+ value: PropTypes.string,
98
+ ariaLabel: PropTypes.string,
99
+ ariaDescribedBy: PropTypes.string,
100
+ label: PropTypes.string,
101
+ screenReaderLabel: PropTypes.string,
102
+ disabled: PropTypes.bool,
103
+ help: PropTypes.string,
104
+ autoComplete: PropTypes.string,
105
+ required: PropTypes.bool,
106
+ };
107
+
108
  export default TextInput;
109
+ export { default as ValidatedTextInput } from './validated';
assets/js/base/components/text-input/index.ts DELETED
@@ -1,2 +0,0 @@
1
- export { default as TextInput } from './text-input';
2
- export { default as ValidatedTextInput } from './validated-text-input';
 
 
assets/js/base/components/text-input/style.scss CHANGED
@@ -1,7 +1,6 @@
1
- .wc-block-components-form .wc-block-components-text-input,
2
  .wc-block-components-text-input {
3
  position: relative;
4
- margin-top: em($gap-large);
5
  white-space: nowrap;
6
 
7
  label {
@@ -13,7 +12,7 @@
13
  top: 0;
14
  transform-origin: top left;
15
  line-height: 1.375; // =22px when font-size is 16px.
16
- color: $gray-700;
17
  transition: transform 200ms ease;
18
  margin: 0 0 0 #{$gap + 1px};
19
  overflow: hidden;
@@ -21,9 +20,6 @@
21
  max-width: calc(100% - #{2 * $gap});
22
  cursor: text;
23
 
24
- .has-dark-controls & {
25
- color: $input-placeholder-dark;
26
- }
27
  @media screen and (prefers-reduced-motion: reduce) {
28
  transition: none;
29
  }
@@ -40,7 +36,6 @@
40
  input[type="tel"],
41
  input[type="url"],
42
  input[type="text"],
43
- input[type="number"],
44
  input[type="email"] {
45
  @include font-size(regular);
46
  background-color: #fff;
@@ -58,57 +53,28 @@
58
 
59
  &:focus {
60
  background-color: #fff;
61
- color: $input-text-active;
62
- }
63
-
64
- .has-dark-controls & {
65
- background-color: $input-background-dark;
66
- border-color: $input-border-dark;
67
- color: $input-text-dark;
68
-
69
- &:focus {
70
- background-color: $input-background-dark;
71
- color: $input-text-dark;
72
- }
73
- }
74
- }
75
-
76
- input[type="number"] {
77
- -moz-appearance: textfield;
78
-
79
- &::-webkit-outer-spin-button,
80
- &::-webkit-inner-spin-button {
81
- appearance: none;
82
- margin: 0;
83
  }
84
  }
85
 
86
  &.is-active input[type="tel"],
87
  &.is-active input[type="url"],
88
  &.is-active input[type="text"],
89
- &.is-active input[type="number"],
90
  &.is-active input[type="email"] {
91
  padding: em($gap-large) 0 em($gap-smallest) $gap;
92
  }
93
 
94
  &.has-error input {
95
- &,
96
- &:hover,
97
- &:focus,
98
- &:active {
99
- border-color: $alert-red;
100
- }
101
  &:focus {
102
- outline: 1px dotted $alert-red;
103
- outline-offset: 2px;
104
  }
105
  }
106
 
107
  &.has-error label {
108
- color: $alert-red;
109
  }
110
 
111
  &:only-child {
112
- margin-top: 0;
113
  }
114
  }
 
1
  .wc-block-components-text-input {
2
  position: relative;
3
+ margin-bottom: em($gap-large);
4
  white-space: nowrap;
5
 
6
  label {
12
  top: 0;
13
  transform-origin: top left;
14
  line-height: 1.375; // =22px when font-size is 16px.
15
+ color: $gray-50;
16
  transition: transform 200ms ease;
17
  margin: 0 0 0 #{$gap + 1px};
18
  overflow: hidden;
20
  max-width: calc(100% - #{2 * $gap});
21
  cursor: text;
22
 
 
 
 
23
  @media screen and (prefers-reduced-motion: reduce) {
24
  transition: none;
25
  }
36
  input[type="tel"],
37
  input[type="url"],
38
  input[type="text"],
 
39
  input[type="email"] {
40
  @include font-size(regular);
41
  background-color: #fff;
53
 
54
  &:focus {
55
  background-color: #fff;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
56
  }
57
  }
58
 
59
  &.is-active input[type="tel"],
60
  &.is-active input[type="url"],
61
  &.is-active input[type="text"],
 
62
  &.is-active input[type="email"] {
63
  padding: em($gap-large) 0 em($gap-smallest) $gap;
64
  }
65
 
66
  &.has-error input {
67
+ border-color: $error-red;
 
 
 
 
 
68
  &:focus {
69
+ outline-color: $error-red;
 
70
  }
71
  }
72
 
73
  &.has-error label {
74
+ color: $error-red;
75
  }
76
 
77
  &:only-child {
78
+ margin-bottom: 0;
79
  }
80
  }
assets/js/base/components/text-input/validated-text-input.tsx DELETED
@@ -1,166 +0,0 @@
1
- /**
2
- * External dependencies
3
- */
4
- import { __ } from '@wordpress/i18n';
5
- import { useCallback, useRef, useEffect, useState } from 'react';
6
- import classnames from 'classnames';
7
- import {
8
- ValidationInputError,
9
- useValidationContext,
10
- } from '@woocommerce/base-context';
11
- import { withInstanceId } from '@woocommerce/base-hocs/with-instance-id';
12
- import { isString } from '@woocommerce/types';
13
-
14
- /**
15
- * Internal dependencies
16
- */
17
- import TextInput from './text-input';
18
- import './style.scss';
19
-
20
- interface ValidatedTextInputPropsWithId {
21
- instanceId?: string;
22
- id: string;
23
- }
24
-
25
- interface ValidatedTextInputPropsWithInstanceId {
26
- instanceId: string;
27
- id?: string;
28
- }
29
-
30
- type ValidatedTextInputProps = (
31
- | ValidatedTextInputPropsWithId
32
- | ValidatedTextInputPropsWithInstanceId
33
- ) & {
34
- className?: string;
35
- ariaDescribedBy?: string;
36
- errorId?: string;
37
- validateOnMount?: boolean;
38
- focusOnMount?: boolean;
39
- showError?: boolean;
40
- errorMessage?: string;
41
- onChange: ( newValue: string ) => void;
42
- };
43
-
44
- const ValidatedTextInput = ( {
45
- className,
46
- instanceId,
47
- id,
48
- ariaDescribedBy,
49
- errorId,
50
- validateOnMount = true,
51
- focusOnMount = false,
52
- onChange,
53
- showError = true,
54
- errorMessage: passedErrorMessage = '',
55
- ...rest
56
- }: ValidatedTextInputProps ) => {
57
- const [ isPristine, setIsPristine ] = useState( true );
58
- const inputRef = useRef< HTMLInputElement >( null );
59
- const {
60
- getValidationError,
61
- hideValidationError,
62
- setValidationErrors,
63
- clearValidationError,
64
- getValidationErrorId,
65
- } = useValidationContext();
66
-
67
- const textInputId =
68
- typeof id !== 'undefined' ? id : 'textinput-' + instanceId;
69
- const errorIdString = errorId !== undefined ? errorId : textInputId;
70
-
71
- const validateInput = useCallback(
72
- ( errorsHidden = true ) => {
73
- const inputObject = inputRef.current || null;
74
- if ( ! inputObject ) {
75
- return;
76
- }
77
- // Trim white space before validation.
78
- inputObject.value = inputObject.value.trim();
79
- const inputIsValid = inputObject.checkValidity();
80
- if ( inputIsValid ) {
81
- clearValidationError( errorIdString );
82
- } else {
83
- setValidationErrors( {
84
- [ errorIdString ]: {
85
- message:
86
- inputObject.validationMessage ||
87
- __(
88
- 'Invalid value.',
89
- 'woo-gutenberg-products-block'
90
- ),
91
- hidden: errorsHidden,
92
- },
93
- } );
94
- }
95
- },
96
- [ clearValidationError, errorIdString, setValidationErrors ]
97
- );
98
-
99
- useEffect( () => {
100
- if ( isPristine ) {
101
- if ( focusOnMount ) {
102
- inputRef.current?.focus();
103
- }
104
- setIsPristine( false );
105
- }
106
- }, [ focusOnMount, isPristine, setIsPristine ] );
107
-
108
- useEffect( () => {
109
- if ( isPristine ) {
110
- if ( validateOnMount ) {
111
- validateInput();
112
- }
113
- setIsPristine( false );
114
- }
115
- }, [ isPristine, setIsPristine, validateOnMount, validateInput ] );
116
-
117
- // Remove validation errors when unmounted.
118
- useEffect( () => {
119
- return () => {
120
- clearValidationError( errorIdString );
121
- };
122
- }, [ clearValidationError, errorIdString ] );
123
-
124
- // @todo - When useValidationContext is converted to TypeScript, remove this cast and use the correct type.
125
- const errorMessage = ( getValidationError( errorIdString ) || {} ) as {
126
- message?: string;
127
- hidden?: boolean;
128
- };
129
- if ( isString( passedErrorMessage ) && passedErrorMessage !== '' ) {
130
- errorMessage.message = passedErrorMessage;
131
- }
132
- const hasError = errorMessage.message && ! errorMessage.hidden;
133
- const describedBy =
134
- showError && hasError && getValidationErrorId( errorIdString )
135
- ? getValidationErrorId( errorIdString )
136
- : ariaDescribedBy;
137
-
138
- return (
139
- <TextInput
140
- className={ classnames( className, {
141
- 'has-error': hasError,
142
- } ) }
143
- id={ textInputId }
144
- onBlur={ () => {
145
- validateInput( false );
146
- } }
147
- feedback={
148
- showError && (
149
- <ValidationInputError
150
- errorMessage={ passedErrorMessage }
151
- propertyName={ errorIdString }
152
- />
153
- )
154
- }
155
- ref={ inputRef }
156
- onChange={ ( val ) => {
157
- hideValidationError( errorIdString );
158
- onChange( val );
159
- } }
160
- ariaDescribedBy={ describedBy }
161
- { ...rest }
162
- />
163
- );
164
- };
165
-
166
- export default withInstanceId( ValidatedTextInput );
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
assets/js/base/components/text-input/validated.js ADDED
@@ -0,0 +1,117 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /**
2
+ * External dependencies
3
+ */
4
+ import { __ } from '@wordpress/i18n';
5
+ import { useRef, useEffect } from 'react';
6
+ import PropTypes from 'prop-types';
7
+ import classnames from 'classnames';
8
+ import { useValidationContext } from '@woocommerce/base-context';
9
+ import { ValidationInputError } from '@woocommerce/base-components/validation';
10
+ import { withInstanceId } from '@woocommerce/base-hocs/with-instance-id';
11
+
12
+ /**
13
+ * Internal dependencies
14
+ */
15
+ import TextInput from './index';
16
+ import './style.scss';
17
+
18
+ const ValidatedTextInput = ( {
19
+ className,
20
+ instanceId,
21
+ id,
22
+ ariaDescribedBy,
23
+ errorId,
24
+ validateOnMount = true,
25
+ focusOnMount = false,
26
+ onChange,
27
+ showError = true,
28
+ ...rest
29
+ } ) => {
30
+ const inputRef = useRef();
31
+ const {
32
+ getValidationError,
33
+ hideValidationError,
34
+ setValidationErrors,
35
+ clearValidationError,
36
+ getValidationErrorId,
37
+ } = useValidationContext();
38
+
39
+ const textInputId = id || 'textinput-' + instanceId;
40
+ errorId = errorId || textInputId;
41
+
42
+ const validateInput = ( errorsHidden = true ) => {
43
+ if ( inputRef.current.checkValidity() ) {
44
+ clearValidationError( errorId );
45
+ } else {
46
+ setValidationErrors( {
47
+ [ errorId ]: {
48
+ message:
49
+ inputRef.current.validationMessage ||
50
+ __( 'Invalid value.', 'woo-gutenberg-products-block' ),
51
+ hidden: errorsHidden,
52
+ },
53
+ } );
54
+ }
55
+ };
56
+
57
+ useEffect( () => {
58
+ if ( focusOnMount ) {
59
+ inputRef.current.focus();
60
+ }
61
+ }, [ focusOnMount ] );
62
+
63
+ useEffect( () => {
64
+ if ( validateOnMount ) {
65
+ validateInput();
66
+ }
67
+ }, [ validateOnMount ] );
68
+
69
+ // Remove validation errors when unmounted.
70
+ useEffect( () => {
71
+ return () => {
72
+ clearValidationError( errorId );
73
+ };
74
+ }, [ errorId ] );
75
+
76
+ const errorMessage = getValidationError( errorId ) || {};
77
+ const hasError = errorMessage.message && ! errorMessage.hidden;
78
+ const describedBy =
79
+ showError && hasError && getValidationErrorId( errorId )
80
+ ? getValidationErrorId( errorId )
81
+ : ariaDescribedBy;
82
+
83
+ return (
84
+ <TextInput
85
+ className={ classnames( className, {
86
+ 'has-error': hasError,
87
+ } ) }
88
+ id={ textInputId }
89
+ onBlur={ () => {
90
+ validateInput( false );
91
+ } }
92
+ feedback={
93
+ showError && <ValidationInputError propertyName={ errorId } />
94
+ }
95
+ ref={ inputRef }
96
+ onChange={ ( val ) => {
97
+ hideValidationError( errorId );
98
+ onChange( val );
99
+ } }
100
+ ariaDescribedBy={ describedBy }
101
+ { ...rest }
102
+ />
103
+ );
104
+ };
105
+
106
+ ValidatedTextInput.propTypes = {
107
+ onChange: PropTypes.func.isRequired,
108
+ id: PropTypes.string,
109
+ value: PropTypes.string,
110
+ ariaDescribedBy: PropTypes.string,
111
+ errorId: PropTypes.string,
112
+ validateOnMount: PropTypes.bool,
113
+ focusOnMount: PropTypes.bool,
114
+ showError: PropTypes.bool,
115
+ };
116
+
117
+ export default withInstanceId( ValidatedTextInput );
assets/js/base/components/textarea/index.js DELETED
@@ -1,43 +0,0 @@
1
- /**
2
- * External dependencies
3
- */
4
- import classnames from 'classnames';
5
- import PropTypes from 'prop-types';
6
-
7
- /**
8
- * Internal dependencies
9
- */
10
- import './style.scss';
11
-
12
- const Textarea = ( {
13
- className = '',
14
- disabled = false,
15
- onTextChange,
16
- placeholder,
17
- value = '',
18
- } ) => {
19
- return (
20
- <textarea
21
- className={ classnames(
22
- 'wc-block-components-textarea',
23
- className
24
- ) }
25
- disabled={ disabled }
26
- onChange={ ( event ) => {
27
- onTextChange( event.target.value );
28
- } }
29
- placeholder={ placeholder }
30
- rows={ 2 }
31
- value={ value }
32
- />
33
- );
34
- };
35
-
36
- Textarea.propTypes = {
37
- onTextChange: PropTypes.func.isRequired,
38
- disabled: PropTypes.bool,
39
- placeholder: PropTypes.string,
40
- value: PropTypes.string,
41
- };
42
-
43
- export default Textarea;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
assets/js/base/components/textarea/style.scss DELETED
@@ -1,29 +0,0 @@
1
- .wc-block-components-textarea {
2
- @include font-size(regular);
3
- background-color: #fff;
4
- border: 1px solid $input-border-gray;
5
- border-radius: 4px;
6
- color: $input-text-active;
7
- font-family: inherit;
8
- line-height: 1.375; // =22px when font-size is 16px.
9
- margin: 0;
10
- padding: em($gap-small) $gap;
11
- width: 100%;
12
-
13
- .has-dark-controls & {
14
- background-color: $input-background-dark;
15
- border-color: $input-border-dark;
16
- color: $input-text-dark;
17
-
18
- &::placeholder {
19
- color: $input-placeholder-dark;
20
- }
21
- }
22
- }
23
-
24
- .theme-twentytwentyone {
25
- .has-dark-controls .wc-block-components-textarea {
26
- background-color: $input-background-dark;
27
- color: $input-text-dark;
28
- }
29
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
assets/js/base/components/title/index.js CHANGED
@@ -9,16 +9,8 @@ import PropTypes from 'prop-types';
9
  */
10
  import './style.scss';
11
 
12
- /** @typedef {import('react')} React */
13
-
14
  /**
15
  * Component that renders a block title.
16
- *
17
- * @param {Object} props Incoming props for the component.
18
- * @param {React.ReactNode} [props.children] Children elements this component wraps.
19
- * @param {string} [props.className] CSS class used.
20
- * @param {string} props.headingLevel Heading level for title.
21
- * @param {Object} [props.props] Rest of props passed through to component.
22
  */
23
  const Title = ( { children, className, headingLevel, ...props } ) => {
24
  const buttonClassName = classNames(
9
  */
10
  import './style.scss';
11
 
 
 
12
  /**
13
  * Component that renders a block title.
 
 
 
 
 
 
14
  */
15
  const Title = ( { children, className, headingLevel, ...props } ) => {
16
  const buttonClassName = classNames(
assets/js/base/components/title/style.scss CHANGED
@@ -2,7 +2,6 @@
2
  .wc-block-components-title.wc-block-components-title {
3
  @include reset-box();
4
  @include font-size(large);
5
- word-break: break-word;
6
  }
7
 
8
  // For Twenty Twenty we need to increase specificity a bit more.
@@ -10,6 +9,5 @@
10
  .wc-block-components-title.wc-block-components-title {
11
  @include reset-box();
12
  @include font-size(large);
13
- word-break: break-word;
14
  }
15
  }
2
  .wc-block-components-title.wc-block-components-title {
3
  @include reset-box();
4
  @include font-size(large);
 
5
  }
6
 
7
  // For Twenty Twenty we need to increase specificity a bit more.
9
  .wc-block-components-title.wc-block-components-title {
10
  @include reset-box();
11
  @include font-size(large);
 
12
  }
13
  }
assets/js/base/{context/providers/validation/components → components/validation}/index.js RENAMED
File without changes
assets/js/base/{context/providers/validation/components/validation-input-error → components/validation}/style.scss RENAMED
@@ -1,6 +1,6 @@
1
  .wc-block-components-validation-error {
2
  @include font-size(smaller);
3
- color: $alert-red;
4
  max-width: 100%;
5
  position: absolute;
6
  top: calc(100% - 1px);
1
  .wc-block-components-validation-error {
2
  @include font-size(smaller);
3
+ color: $error-red;
4
  max-width: 100%;
5
  position: absolute;
6
  top: calc(100% - 1px);
assets/js/base/{context/providers/validation/components/validation-input-error/index.js → components/validation/validation-input-error.js} RENAMED
@@ -1,12 +1,12 @@
1
  /**
2
  * External dependencies
3
  */
 
4
  import PropTypes from 'prop-types';
5
 
6
  /**
7
  * Internal dependencies
8
  */
9
- import { useValidationContext } from '../../context';
10
  import './style.scss';
11
 
12
  export const ValidationInputError = ( {
@@ -15,8 +15,7 @@ export const ValidationInputError = ( {
15
  elementId = '',
16
  } ) => {
17
  const { getValidationError, getValidationErrorId } = useValidationContext();
18
-
19
- if ( ! errorMessage || typeof errorMessage !== 'string' ) {
20
  const error = getValidationError( propertyName ) || {};
21
  if ( error.message && ! error.hidden ) {
22
  errorMessage = error.message;
@@ -37,5 +36,3 @@ ValidationInputError.propTypes = {
37
  propertyName: PropTypes.string,
38
  elementId: PropTypes.string,
39
  };
40
-
41
- export default ValidationInputError;
1
  /**
2
  * External dependencies
3
  */
4
+ import { useValidationContext } from '@woocommerce/base-context';
5
  import PropTypes from 'prop-types';
6
 
7
  /**
8
  * Internal dependencies
9
  */
 
10
  import './style.scss';
11
 
12
  export const ValidationInputError = ( {
15
  elementId = '',
16
  } ) => {
17
  const { getValidationError, getValidationErrorId } = useValidationContext();
18
+ if ( ! errorMessage ) {
 
19
  const error = getValidationError( propertyName ) || {};
20
  if ( error.message && ! error.hidden ) {
21
  errorMessage = error.message;
36
  propertyName: PropTypes.string,
37
  elementId: PropTypes.string,
38
  };
 
 
assets/js/base/context/add-to-cart-form-context.js ADDED
@@ -0,0 +1,156 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /**
2
+ * External dependencies
3
+ */
4
+ import {
5
+ createContext,
6
+ useContext,
7
+ useState,
8
+ useCallback,
9
+ } from '@wordpress/element';
10
+ import {
11
+ useStoreAddToCart,
12
+ useTriggerFragmentRefresh,
13
+ } from '@woocommerce/base-hooks';
14
+
15
+ /**
16
+ * @typedef {import('@woocommerce/type-defs/contexts').AddToCartFormContext} AddToCartFormContext
17
+ */
18
+
19
+ const AddToCartFormContext = createContext( {
20
+ product: {},
21
+ productId: 0,
22
+ variationId: 0,
23
+ variationData: {},
24
+ cartItemData: {},
25
+ quantity: 1,
26
+ minQuantity: 1,
27
+ maxQuantity: 99,
28
+ quantityInCart: 0,
29
+ setQuantity: ( quantity ) => void { quantity },
30
+ setVariationId: ( variationId ) => void { variationId },
31
+ setVariationData: ( variationData ) => void { variationData },
32
+ setCartItemData: ( cartItemData ) => void { cartItemData },
33
+ showFormElements: false,
34
+ formInitialized: false,
35
+ formDisabled: true,
36
+ formSubmitting: false,
37
+ onChange: () => void null,
38
+ onSubmit: () => void null,
39
+ onSuccess: () => void null,
40
+ onFail: () => void null,
41
+ } );
42
+
43
+ /**
44
+ * @return {AddToCartFormContext} Returns the add to cart form context value.
45
+ */
46
+ export const useAddToCartFormContext = () => {
47
+ return useContext( AddToCartFormContext );
48
+ };
49
+
50
+ /**
51
+ * Provides an interface for blocks to control the add to cart form for a product.
52
+ *
53
+ * @param {Object} props Incoming props for the provider.
54
+ * @param {*} props.children The children being wrapped.
55
+ * @param {Object} [props.product] The product for which the form belongs to.
56
+ * @param {boolean} [props.showFormElements] Should form elements be shown.
57
+ */
58
+ export const AddToCartFormContextProvider = ( {
59
+ children,
60
+ product: productProp,
61
+ showFormElements,
62
+ } ) => {
63
+ const product = productProp || {};
64
+ const productId = product.id || 0;
65
+ const [ variationId, setVariationId ] = useState( 0 );
66
+ const [ variationData, setVariationData ] = useState( {} );
67
+ const [ cartItemData, setCartItemData ] = useState( {} );
68
+ const [ quantity, setQuantity ] = useState( 1 );
69
+ const {
70
+ addToCart: storeAddToCart,
71
+ addingToCart: formSubmitting,
72
+ cartQuantity: quantityInCart,
73
+ cartIsLoading,
74
+ } = useStoreAddToCart( productId );
75
+
76
+ // This will ensure any add to cart events update legacy fragments using jQuery.
77
+ useTriggerFragmentRefresh( quantityInCart );
78
+
79
+ /**
80
+ * @todo Introduce Validation Emitter for the Add to Cart Form
81
+ *
82
+ * The add to cart form may have several inner form elements which need to run validation and
83
+ * change whether or not the form can be submitted. They may also need to show errors and
84
+ * validation notices.
85
+ */
86
+ const formInitialized = ! cartIsLoading && productId > 0;
87
+ const formDisabled =
88
+ formSubmitting ||
89
+ ! formInitialized ||
90
+ ! productIsPurchasable( product );
91
+
92
+ // Events.
93
+ const onSubmit = useCallback( () => {
94
+ /**
95
+ * @todo Surface add to cart errors in the single product block.
96
+ *
97
+ * If the addToCart function within useStoreAddToCart fails, a notice should be shown on the product page.
98
+ */
99
+ storeAddToCart( quantity );
100
+ }, [ storeAddToCart, quantity ] );
101
+
102
+ /**
103
+ * @todo Add Event Callbacks to the Add to Cart Form.
104
+ *
105
+ * - onChange should trigger when a form element changes, so for example, a variation picker could indicate that it's ready.
106
+ * - onSuccess should trigger after a successful add to cart. This could be used to reset form elements, do a redirect, or show something to the user.
107
+ * - onFail should trigger when adding to cart fails. Form elements might show extra notices or reset. A fallback might be to redirect to the core product page in case of incompatibilities.
108
+ */
109
+ const onChange = useCallback( () => {}, [] );
110
+ const onSuccess = useCallback( () => {}, [] );
111
+ const onFail = useCallback( () => {}, [] );
112
+
113
+ /**
114
+ * @type {AddToCartFormContext}
115
+ */
116
+ const contextValue = {
117
+ product,
118
+ productId,
119
+ variationId,
120
+ variationData,
121
+ cartItemData,
122
+ quantity,
123
+ minQuantity: 1,
124
+ maxQuantity: product.quantity_limit || 99,
125
+ quantityInCart,
126
+ setQuantity,
127
+ setVariationId,
128
+ setVariationData,
129
+ setCartItemData,
130
+ showFormElements,
131
+ formInitialized,
132
+ formDisabled,
133
+ formSubmitting,
134
+ onChange,
135
+ onSubmit,
136
+ onSuccess,
137
+ onFail,
138
+ };
139
+
140
+ return (
141
+ <AddToCartFormContext.Provider value={ contextValue }>
142
+ { children }
143
+ </AddToCartFormContext.Provider>
144
+ );
145
+ };
146
+
147
+ /**
148
+ * Check a product object to see if it can be purchased.
149
+ *
150
+ * @param {Object} product Product object.
151
+ */
152
+ const productIsPurchasable = ( product ) => {
153
+ const { is_purchasable: isPurchasable = false } = product;
154
+
155
+ return isPurchasable;
156
+ };
assets/js/base/context/cart-checkout/billing/constants.js ADDED
@@ -0,0 +1,50 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /**
2
+ * @typedef {import('@woocommerce/type-defs/billing').BillingData} BillingData
3
+ * @typedef {import('@woocommerce/type-defs/contexts').BillingDataContext} BillingDataContext
4
+ */
5
+
6
+ /**
7
+ * External dependencies
8
+ */
9
+ import { getSetting } from '@woocommerce/settings';
10
+ import { mapValues } from 'lodash';
11
+ import { decodeEntities } from '@wordpress/html-entities';
12
+
13
+ const checkoutData = getSetting( 'checkoutData', {} );
14
+
15
+ /**
16
+ * @type {BillingData}
17
+ */
18
+ export const DEFAULT_BILLING_DATA = {
19
+ first_name: '',
20
+ last_name: '',
21
+ company: '',
22
+ address_1: '',
23
+ address_2: '',
24
+ city: '',
25
+ state: '',
26
+ postcode: '',
27
+ country: '',
28
+ email: '',
29
+ phone: '',
30
+ };
31
+
32
+ const billingAddress = mapValues( checkoutData.billing_address, ( value ) =>
33
+ decodeEntities( value )
34
+ );
35
+
36
+ /**
37
+ * @type {BillingData}
38
+ */
39
+ export const DEFAULT_STATE = {
40
+ ...DEFAULT_BILLING_DATA,
41
+ ...billingAddress,
42
+ };
43
+
44
+ /**
45
+ * @type {BillingDataContext}
46
+ */
47
+ export const DEFAULT_BILLING_CONTEXT_DATA = {
48
+ billingData: DEFAULT_BILLING_DATA,
49
+ setBillingData: () => null,
50
+ };
assets/js/base/context/cart-checkout/billing/index.js ADDED
@@ -0,0 +1,51 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /**
2
+ * External dependencies
3
+ */
4
+ import {
5
+ createContext,
6
+ useContext,
7
+ useState,
8
+ useCallback,
9
+ } from '@wordpress/element';
10
+
11
+ /**
12
+ * Internal dependencies
13
+ */
14
+ import { DEFAULT_STATE, DEFAULT_BILLING_CONTEXT_DATA } from './constants';
15
+
16
+ /**
17
+ * @typedef {import('@woocommerce/type-defs/contexts').BillingDataContext} BillingDataContext
18
+ */
19
+
20
+ const BillingDataContext = createContext( DEFAULT_BILLING_CONTEXT_DATA );
21
+
22
+ /**
23
+ * @return {BillingDataContext} Returns data and functions related to billing.
24
+ */
25
+ export const useBillingDataContext = () => {
26
+ return useContext( BillingDataContext );
27
+ };
28
+
29
+ export const BillingDataProvider = ( { children } ) => {
30
+ const [ billingData, setBillingDataState ] = useState( DEFAULT_STATE );
31
+
32
+ const setBillingData = useCallback( ( newData ) => {
33
+ setBillingDataState( ( prevState ) => ( {
34
+ ...prevState,
35
+ ...newData,
36
+ } ) );
37
+ }, [] );
38
+
39
+ /**
40
+ * @type {BillingDataContext}
41
+ */
42
+ const billingDataValue = {
43
+ billingData,
44
+ setBillingData,
45
+ };
46
+ return (
47
+ <BillingDataContext.Provider value={ billingDataValue }>
48
+ { children }
49
+ </BillingDataContext.Provider>
50
+ );
51
+ };
assets/js/base/context/{providers/cart-checkout → cart-checkout}/cart/index.js RENAMED
@@ -1,7 +1,9 @@
1
  /**
2
  * Internal dependencies
3
  */
4
- import { CheckoutProvider } from '../checkout';
 
 
5
 
6
  /**
7
  * Cart provider
@@ -16,8 +18,12 @@ import { CheckoutProvider } from '../checkout';
16
  */
17
  export const CartProvider = ( { children, redirectUrl } ) => {
18
  return (
19
- <CheckoutProvider isCart={ true } redirectUrl={ redirectUrl }>
20
- { children }
21
- </CheckoutProvider>
 
 
 
 
22
  );
23
  };
1
  /**
2
  * Internal dependencies
3
  */
4
+ import { ShippingDataProvider } from '../shipping';
5
+ import { CheckoutStateProvider } from '../checkout-state';
6
+ import { PaymentMethodDataProvider } from '../payment-methods';
7
 
8
  /**
9
  * Cart provider
18
  */
19
  export const CartProvider = ( { children, redirectUrl } ) => {
20
  return (
21
+ <CheckoutStateProvider redirectUrl={ redirectUrl } isCart={ true }>
22
+ <ShippingDataProvider>
23
+ <PaymentMethodDataProvider>
24
+ { children }
25
+ </PaymentMethodDataProvider>
26
+ </ShippingDataProvider>
27
+ </CheckoutStateProvider>
28
  );
29
  };
assets/js/base/context/{providers/add-to-cart-form/form-state → cart-checkout/checkout-state}/actions.js RENAMED
@@ -1,21 +1,23 @@
1
  /**
2
  * Internal dependencies
3
  */
4
- import { ACTION_TYPES } from './constants';
5
 
6
  const {
7
  SET_PRISTINE,
8
  SET_IDLE,
9
- SET_DISABLED,
10
  SET_PROCESSING,
11
  SET_BEFORE_PROCESSING,
12
  SET_AFTER_PROCESSING,
13
  SET_PROCESSING_RESPONSE,
 
 
14
  SET_HAS_ERROR,
15
  SET_NO_ERROR,
16
- SET_QUANTITY,
17
- SET_REQUEST_PARAMS,
18
- } = ACTION_TYPES;
 
19
 
20
  /**
21
  * All the actions that can be dispatched for the checkout.
@@ -27,32 +29,39 @@ export const actions = {
27
  setIdle: () => ( {
28
  type: SET_IDLE,
29
  } ),
30
- setDisabled: () => ( {
31
- type: SET_DISABLED,
32
- } ),
33
  setProcessing: () => ( {
34
  type: SET_PROCESSING,
35
  } ),
 
 
 
 
 
 
 
 
 
 
 
 
36
  setBeforeProcessing: () => ( {
37
  type: SET_BEFORE_PROCESSING,
38
  } ),
39
  setAfterProcessing: () => ( {
40
  type: SET_AFTER_PROCESSING,
41
  } ),
42
- setProcessingResponse: ( data ) => ( {
43
- type: SET_PROCESSING_RESPONSE,
44
- data,
45
- } ),
46
  setHasError: ( hasError = true ) => {
47
  const type = hasError ? SET_HAS_ERROR : SET_NO_ERROR;
48
  return { type };
49
  },
50
- setQuantity: ( quantity ) => ( {
51
- type: SET_QUANTITY,
52
- quantity,
53
  } ),
54
- setRequestParams: ( data ) => ( {
55
- type: SET_REQUEST_PARAMS,
56
- data,
 
 
 
57
  } ),
58
  };
1
  /**
2
  * Internal dependencies
3
  */
4
+ import { TYPES } from './constants';
5
 
6
  const {
7
  SET_PRISTINE,
8
  SET_IDLE,
 
9
  SET_PROCESSING,
10
  SET_BEFORE_PROCESSING,
11
  SET_AFTER_PROCESSING,
12
  SET_PROCESSING_RESPONSE,
13
+ SET_REDIRECT_URL,
14
+ SET_COMPLETE,
15
  SET_HAS_ERROR,
16
  SET_NO_ERROR,
17
+ INCREMENT_CALCULATING,
18
+ DECREMENT_CALCULATING,
19
+ SET_ORDER_ID,
20
+ } = TYPES;
21
 
22
  /**
23
  * All the actions that can be dispatched for the checkout.
29
  setIdle: () => ( {
30
  type: SET_IDLE,
31
  } ),
 
 
 
32
  setProcessing: () => ( {
33
  type: SET_PROCESSING,
34
  } ),
35
+ setRedirectUrl: ( url ) => ( {
36
+ type: SET_REDIRECT_URL,
37
+ url,
38
+ } ),
39
+ setProcessingResponse: ( data ) => ( {
40
+ type: SET_PROCESSING_RESPONSE,
41
+ data,
42
+ } ),
43
+ setComplete: ( data ) => ( {
44
+ type: SET_COMPLETE,
45
+ data,
46
+ } ),
47
  setBeforeProcessing: () => ( {
48
  type: SET_BEFORE_PROCESSING,
49
  } ),
50
  setAfterProcessing: () => ( {
51
  type: SET_AFTER_PROCESSING,
52
  } ),
 
 
 
 
53
  setHasError: ( hasError = true ) => {
54
  const type = hasError ? SET_HAS_ERROR : SET_NO_ERROR;
55
  return { type };
56
  },
57
+ incrementCalculating: () => ( {
58
+ type: INCREMENT_CALCULATING,
 
59
  } ),
60
+ decrementCalculating: () => ( {
61
+ type: DECREMENT_CALCULATING,
62
+ } ),
63
+ setOrderId: ( orderId ) => ( {
64
+ type: SET_ORDER_ID,
65
+ orderId,
66
  } ),
67
  };
assets/js/base/context/cart-checkout/checkout-state/constants.js ADDED
@@ -0,0 +1,47 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /**
2
+ * External dependencies
3
+ */
4
+ import { getSetting } from '@woocommerce/settings';
5
+
6
+ /**
7
+ * @type {import("@woocommerce/type-defs/checkout").CheckoutStatusConstants}
8
+ */
9
+ export const STATUS = {
10
+ PRISTINE: 'pristine',
11
+ IDLE: 'idle',
12
+ PROCESSING: 'processing',
13
+ COMPLETE: 'complete',
14
+ BEFORE_PROCESSING: 'before_processing',
15
+ AFTER_PROCESSING: 'after_processing',
16
+ };
17
+
18
+ const checkoutData = getSetting( 'checkoutData', {
19
+ order_id: 0,
20
+ customer_id: 0,
21
+ } );
22
+
23
+ export const DEFAULT_STATE = {
24
+ redirectUrl: '',
25
+ status: STATUS.PRISTINE,
26
+ hasError: false,
27
+ calculatingCount: 0,
28
+ orderId: checkoutData.order_id,
29
+ customerId: checkoutData.customer_id,
30
+ processingResponse: null,
31
+ };
32
+
33
+ export const TYPES = {
34
+ SET_IDLE: 'set_idle',
35
+ SET_PRISTINE: 'set_pristine',
36
+ SET_REDIRECT_URL: 'set_redirect_url',
37
+ SET_COMPLETE: 'set_checkout_complete',
38
+ SET_BEFORE_PROCESSING: 'set_before_processing',
39
+ SET_AFTER_PROCESSING: 'set_after_processing',
40
+ SET_PROCESSING_RESPONSE: 'set_processing_response',
41
+ SET_PROCESSING: 'set_checkout_is_processing',
42
+ SET_HAS_ERROR: 'set_checkout_has_error',
43
+ SET_NO_ERROR: 'set_checkout_no_error',
44
+ SET_ORDER_ID: 'set_checkout_order_id',
45
+ INCREMENT_CALCULATING: 'increment_calculating',
46
+ DECREMENT_CALCULATING: 'decrement_calculating',
47
+ };
assets/js/base/context/cart-checkout/checkout-state/event-emit.js ADDED
@@ -0,0 +1,53 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /**
2
+ * Internal dependencies
3
+ */
4
+ import {
5
+ emitterCallback,
6
+ reducer,
7
+ emitEvent,
8
+ emitEventWithAbort,
9
+ } from '../event-emit';
10
+
11
+ const EMIT_TYPES = {
12
+ CHECKOUT_BEFORE_PROCESSING: 'checkout_before_processing',
13
+ CHECKOUT_AFTER_PROCESSING_WITH_SUCCESS:
14
+ 'checkout_after_processing_with_success',
15
+ CHECKOUT_AFTER_PROCESSING_WITH_ERROR:
16
+ 'checkout_after_processing_with_error',
17
+ };
18
+
19
+ /**
20
+ * Receives a reducer dispatcher and returns an object with the
21
+ * callback registration function for the checkout emit
22
+ * events.
23
+ *
24
+ * Calling the event registration function with the callback will register it
25
+ * for the event emitter and will return a dispatcher for removing the
26
+ * registered callback (useful for implementation in `useEffect`).
27
+ *
28
+ * @param {Function} dispatcher The emitter reducer dispatcher.
29
+ *
30
+ * @return {Object} An object with the checkout emmitter registration
31
+ */
32
+ const emitterSubscribers = ( dispatcher ) => ( {
33
+ onCheckoutAfterProcessingWithSuccess: emitterCallback(
34
+ EMIT_TYPES.CHECKOUT_AFTER_PROCESSING_WITH_SUCCESS,
35
+ dispatcher
36
+ ),
37
+ onCheckoutAfterProcessingWithError: emitterCallback(
38
+ EMIT_TYPES.CHECKOUT_AFTER_PROCESSING_WITH_ERROR,
39
+ dispatcher
40
+ ),
41
+ onCheckoutBeforeProcessing: emitterCallback(
42
+ EMIT_TYPES.CHECKOUT_BEFORE_PROCESSING,
43
+ dispatcher
44
+ ),
45
+ } );
46
+
47
+ export {
48
+ EMIT_TYPES,
49
+ emitterSubscribers,
50
+ reducer,
51
+ emitEvent,
52
+ emitEventWithAbort,
53
+ };
assets/js/base/context/cart-checkout/checkout-state/index.js ADDED
@@ -0,0 +1,339 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /**
2
+ * External dependencies
3
+ */
4
+ import {
5
+ createContext,
6
+ useContext,
7
+ useReducer,
8
+ useRef,
9
+ useMemo,
10
+ useEffect,
11
+ useCallback,
12
+ } from '@wordpress/element';
13
+ import { __ } from '@wordpress/i18n';
14
+ import { useStoreNotices, useEmitResponse } from '@woocommerce/base-hooks';
15
+
16
+ /**
17
+ * Internal dependencies
18
+ */
19
+ import { actions } from './actions';
20
+ import { reducer, prepareResponseData } from './reducer';
21
+ import { DEFAULT_STATE, STATUS } from './constants';
22
+ import {
23
+ EMIT_TYPES,
24
+ emitterSubscribers,
25
+ emitEvent,
26
+ emitEventWithAbort,
27
+ reducer as emitReducer,
28
+ } from './event-emit';
29
+ import { useValidationContext } from '../validation';
30
+
31
+ /**
32
+ * @typedef {import('@woocommerce/type-defs/checkout').CheckoutDispatchActions} CheckoutDispatchActions
33
+ * @typedef {import('@woocommerce/type-defs/contexts').CheckoutDataContext} CheckoutDataContext
34
+ */
35
+
36
+ const CheckoutContext = createContext( {
37
+ isComplete: false,
38
+ isIdle: false,
39
+ isCalculating: false,
40
+ isProcessing: false,
41
+ isBeforeProcessing: false,
42
+ isAfterProcessing: false,
43
+ hasError: false,
44
+ redirectUrl: '',
45
+ orderId: 0,
46
+ customerId: 0,
47
+ onSubmit: () => void null,
48
+ onCheckoutAfterProcessingWithSuccess: ( callback ) => void callback,
49
+ onCheckoutAfterProcessingWithError: ( callback ) => void callback,
50
+ onCheckoutBeforeProcessing: ( callback ) => void callback,
51
+ dispatchActions: {
52
+ resetCheckout: () => void null,
53
+ setRedirectUrl: ( url ) => void url,
54
+ setHasError: ( hasError ) => void hasError,
55
+ setAfterProcessing: ( response ) => void response,
56
+ incrementCalculating: () => void null,
57
+ decrementCalculating: () => void null,
58
+ setOrderId: ( id ) => void id,
59
+ },
60
+ hasOrder: false,
61
+ isCart: false,
62
+ } );
63
+
64
+ /**
65
+ * @return {CheckoutDataContext} Returns the checkout data context value
66
+ */
67
+ export const useCheckoutContext = () => {
68
+ return useContext( CheckoutContext );
69
+ };
70
+
71
+ /**
72
+ * Checkout state provider
73
+ * This provides provides an api interface exposing checkout state for use with
74
+ * cart or checkout blocks.
75
+ *
76
+ * @param {Object} props Incoming props for the provider.
77
+ * @param {Object} props.children The children being wrapped.
78
+ * @param {string} props.redirectUrl Initialize what the checkout will
79
+ * redirect to after successful
80
+ * submit.
81
+ * @param {boolean} props.isCart If context provider is being used
82
+ * in cart context.
83
+ */
84
+ export const CheckoutStateProvider = ( {
85
+ children,
86
+ redirectUrl,
87
+ isCart = false,
88
+ } ) => {
89
+ // note, this is done intentionally so that the default state now has
90
+ // the redirectUrl for when checkout is reset to PRISTINE state.
91
+ DEFAULT_STATE.redirectUrl = redirectUrl;
92
+ const [ checkoutState, dispatch ] = useReducer( reducer, DEFAULT_STATE );
93
+ const [ observers, subscriber ] = useReducer( emitReducer, {} );
94
+ const currentObservers = useRef( observers );
95
+ const { setValidationErrors } = useValidationContext();
96
+ const { addErrorNotice, removeNotices } = useStoreNotices();
97
+ const isCalculating = checkoutState.calculatingCount > 0;
98
+ const {
99
+ isSuccessResponse,
100
+ isErrorResponse,
101
+ isFailResponse,
102
+ } = useEmitResponse();
103
+
104
+ // set observers on ref so it's always current.
105
+ useEffect( () => {
106
+ currentObservers.current = observers;
107
+ }, [ observers ] );
108
+ const onCheckoutAfterProcessingWithSuccess = useMemo(
109
+ () =>
110
+ emitterSubscribers( subscriber )
111
+ .onCheckoutAfterProcessingWithSuccess,
112
+ [ subscriber ]
113
+ );
114
+ const onCheckoutAfterProcessingWithError = useMemo(
115
+ () =>
116
+ emitterSubscribers( subscriber ).onCheckoutAfterProcessingWithError,
117
+ [ subscriber ]
118
+ );
119
+ const onCheckoutBeforeProcessing = useMemo(
120
+ () => emitterSubscribers( subscriber ).onCheckoutBeforeProcessing,
121
+ [ subscriber ]
122
+ );
123
+
124
+ /**
125
+ * @type {CheckoutDispatchActions}
126
+ */
127
+ const dispatchActions = useMemo(
128
+ () => ( {
129
+ resetCheckout: () => void dispatch( actions.setPristine() ),
130
+ setRedirectUrl: ( url ) =>
131
+ void dispatch( actions.setRedirectUrl( url ) ),
132
+ setHasError: ( hasError ) =>
133
+ void dispatch( actions.setHasError( hasError ) ),
134
+ incrementCalculating: () =>
135
+ void dispatch( actions.incrementCalculating() ),
136
+ decrementCalculating: () =>
137
+ void dispatch( actions.decrementCalculating() ),
138
+ setOrderId: ( orderId ) =>
139
+ void dispatch( actions.setOrderId( orderId ) ),
140
+ setAfterProcessing: ( response ) => {
141
+ // capture general error message if this is an error response.
142
+ if (
143
+ ! response.payment_result &&
144
+ response.message &&
145
+ response?.data?.status !== 200
146
+ ) {
147
+ response.payment_result = {
148
+ ...response.payment_result,
149
+ message: response.message,
150
+ };
151
+ }
152
+ if ( response.payment_result ) {
153
+ if (
154
+ // eslint-disable-next-line camelcase
155
+ response.payment_result?.redirect_url
156
+ ) {
157
+ dispatch(
158
+ actions.setRedirectUrl(
159
+ response.payment_result.redirect_url
160
+ )
161
+ );
162
+ }
163
+ dispatch(
164
+ actions.setProcessingResponse(
165
+ prepareResponseData( response.payment_result )
166
+ )
167
+ );
168
+ }
169
+ void dispatch( actions.setAfterProcessing() );
170
+ },
171
+ } ),
172
+ []
173
+ );
174
+
175
+ // emit events.
176
+ useEffect( () => {
177
+ const status = checkoutState.status;
178
+ if ( status === STATUS.BEFORE_PROCESSING ) {
179
+ removeNotices( 'error' );
180
+ emitEvent(
181
+ currentObservers.current,
182
+ EMIT_TYPES.CHECKOUT_BEFORE_PROCESSING,
183
+ {}
184
+ ).then( ( response ) => {
185
+ if ( response !== true ) {
186
+ if ( Array.isArray( response ) ) {
187
+ response.forEach(
188
+ ( { errorMessage, validationErrors } ) => {
189
+ addErrorNotice( errorMessage );
190
+ setValidationErrors( validationErrors );
191
+ }
192
+ );
193
+ }
194
+ dispatch( actions.setIdle() );
195
+ } else {
196
+ dispatch( actions.setProcessing() );
197
+ }
198
+ } );
199
+ }
200
+ }, [
201
+ checkoutState.status,
202
+ setValidationErrors,
203
+ addErrorNotice,
204
+ removeNotices,
205
+ dispatch,
206
+ ] );
207
+
208
+ useEffect( () => {
209
+ if ( checkoutState.status === STATUS.AFTER_PROCESSING ) {
210
+ const data = {
211
+ redirectUrl: checkoutState.redirectUrl,
212
+ orderId: checkoutState.orderId,
213
+ customerId: checkoutState.customerId,
214
+ customerNote: checkoutState.customerNote,
215
+ processingResponse: checkoutState.processingResponse,
216
+ };
217
+ if ( checkoutState.hasError ) {
218
+ // allow payment methods or other things to customize the error
219
+ // with a fallback if nothing customizes it.
220
+ emitEventWithAbort(
221
+ currentObservers.current,
222
+ EMIT_TYPES.CHECKOUT_AFTER_PROCESSING_WITH_ERROR,
223
+ data
224
+ ).then( ( response ) => {
225
+ if (
226
+ isErrorResponse( response ) ||
227
+ isFailResponse( response )
228
+ ) {
229
+ if ( response.message ) {
230
+ const errorOptions = response.messageContext
231
+ ? { context: response.messageContext }
232
+ : undefined;
233
+ addErrorNotice( response.message, errorOptions );
234
+ }
235
+ // irrecoverable error so set complete
236
+ if (
237
+ typeof response.retry !== 'undefined' &&
238
+ response.retry !== true
239
+ ) {
240
+ dispatch( actions.setComplete( response ) );
241
+ } else {
242
+ dispatch( actions.setIdle() );
243
+ }
244
+ } else {
245
+ // no error handling in place by anything so let's fall
246
+ // back to default
247
+ const message =
248
+ data.processingResponse?.message ||
249
+ __(
250
+ 'Something went wrong. Please contact us to get assistance.',
251
+ 'woo-gutenberg-products-block'
252
+ );
253
+ addErrorNotice( message, {
254
+ id: 'checkout',
255
+ } );
256
+ dispatch( actions.setIdle() );
257
+ }
258
+ } );
259
+ } else {
260
+ emitEventWithAbort(
261
+ currentObservers.current,
262
+ EMIT_TYPES.CHECKOUT_AFTER_PROCESSING_WITH_SUCCESS,
263
+ data
264
+ ).then( ( response ) => {
265
+ if ( isSuccessResponse( response ) ) {
266
+ dispatch( actions.setComplete( response ) );
267
+ } else if (
268
+ isErrorResponse( response ) ||
269
+ isFailResponse( response )
270
+ ) {
271
+ if ( response.message ) {
272
+ const errorOptions = response.messageContext
273
+ ? { context: response.messageContext }
274
+ : undefined;
275
+ addErrorNotice( response.message, errorOptions );
276
+ }
277
+ if ( ! response.retry ) {
278
+ dispatch( actions.setComplete( response ) );
279
+ } else {
280
+ // this will set an error which will end up
281
+ // triggering the onCheckoutAfterProcessingWithErrors emitter.
282
+ // and then setting checkout to IDLE state.
283
+ dispatch( actions.setHasError( true ) );
284
+ }
285
+ } else {
286
+ // nothing hooked in had any response type so let's just
287
+ // consider successful
288
+ dispatch( actions.setComplete() );
289
+ }
290
+ } );
291
+ }
292
+ }
293
+ }, [
294
+ checkoutState.status,
295
+ checkoutState.hasError,
296
+ checkoutState.redirectUrl,
297
+ checkoutState.orderId,
298
+ checkoutState.customerId,
299
+ checkoutState.customerNote,
300
+ checkoutState.processingResponse,
301
+ dispatchActions,
302
+ addErrorNotice,
303
+ isErrorResponse,
304
+ isFailResponse,
305
+ isSuccessResponse,
306
+ ] );
307
+
308
+ const onSubmit = useCallback( () => {
309
+ dispatch( actions.setBeforeProcessing() );
310
+ }, [] );
311
+
312
+ /**
313
+ * @type {CheckoutDataContext}
314
+ */
315
+ const checkoutData = {
316
+ onSubmit,
317
+ isComplete: checkoutState.status === STATUS.COMPLETE,
318
+ isIdle: checkoutState.status === STATUS.IDLE,
319
+ isCalculating,
320
+ isProcessing: checkoutState.status === STATUS.PROCESSING,
321
+ isBeforeProcessing: checkoutState.status === STATUS.BEFORE_PROCESSING,
322
+ isAfterProcessing: checkoutState.status === STATUS.AFTER_PROCESSING,
323
+ hasError: checkoutState.hasError,
324
+ redirectUrl: checkoutState.redirectUrl,
325
+ onCheckoutAfterProcessingWithSuccess,
326
+ onCheckoutAfterProcessingWithError,
327
+ onCheckoutBeforeProcessing,
328
+ dispatchActions,
329
+ isCart,
330
+ orderId: checkoutState.orderId,
331
+ hasOrder: !! checkoutState.orderId,
332
+ customerId: checkoutState.customerId,
333
+ };
334
+ return (
335
+ <CheckoutContext.Provider value={ checkoutData }>
336
+ { children }
337
+ </CheckoutContext.Provider>
338
+ );
339
+ };
assets/js/base/context/{providers/add-to-cart-form/form-state → cart-checkout/checkout-state}/reducer.js RENAMED
@@ -1,41 +1,73 @@
1
  /**
2
  * Internal dependencies
3
  */
4
- import { ACTION_TYPES, DEFAULT_STATE, STATUS } from './constants';
5
 
6
  const {
7
  SET_PRISTINE,
8
  SET_IDLE,
9
- SET_DISABLED,
10
  SET_PROCESSING,
11
  SET_BEFORE_PROCESSING,
12
  SET_AFTER_PROCESSING,
13
  SET_PROCESSING_RESPONSE,
 
 
14
  SET_HAS_ERROR,
15
  SET_NO_ERROR,
16
- SET_QUANTITY,
17
- SET_REQUEST_PARAMS,
18
- } = ACTION_TYPES;
 
19
 
20
  const {
21
  PRISTINE,
22
  IDLE,
23
- DISABLED,
24
  PROCESSING,
25
  BEFORE_PROCESSING,
26
  AFTER_PROCESSING,
 
27
  } = STATUS;
28
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
29
  /**
30
  * Reducer for the checkout state
31
  *
32
  * @param {Object} state Current state.
33
  * @param {Object} action Incoming action object.
34
- * @param {number} action.quantity Incoming quantity.
35
- * @param {string} action.type Type of action.
36
- * @param {Object} action.data Incoming payload for action.
37
  */
38
- export const reducer = ( state = DEFAULT_STATE, { quantity, type, data } ) => {
 
 
 
39
  let newState;
40
  switch ( type ) {
41
  case SET_PRISTINE:
@@ -50,39 +82,32 @@ export const reducer = ( state = DEFAULT_STATE, { quantity, type, data } ) => {
50
  }
51
  : state;
52
  break;
53
- case SET_DISABLED:
54
- newState =
55
- state.status !== DISABLED
56
- ? {
57
- ...state,
58
- status: DISABLED,
59
- }
60
- : state;
61
- break;
62
- case SET_QUANTITY:
63
  newState =
64
- quantity !== state.quantity
65
  ? {
66
  ...state,
67
- quantity,
68
  }
69
  : state;
70
  break;
71
- case SET_REQUEST_PARAMS:
72
- newState = {
73
- ...state,
74
- requestParams: {
75
- ...state.requestParams,
76
- ...data,
77
- },
78
- };
79
- break;
80
  case SET_PROCESSING_RESPONSE:
81
  newState = {
82
  ...state,
83
  processingResponse: data,
84
  };
85
  break;
 
 
 
 
 
 
 
 
 
 
 
86
  case SET_PROCESSING:
87
  newState =
88
  state.status !== PROCESSING
@@ -141,8 +166,27 @@ export const reducer = ( state = DEFAULT_STATE, { quantity, type, data } ) => {
141
  }
142
  : state;
143
  break;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
144
  }
145
- // automatically update state to idle from pristine as soon as it initially changes.
 
146
  if (
147
  newState !== state &&
148
  type !== SET_PRISTINE &&
1
  /**
2
  * Internal dependencies
3
  */
4
+ import { TYPES, DEFAULT_STATE, STATUS } from './constants';
5
 
6
  const {
7
  SET_PRISTINE,
8
  SET_IDLE,
 
9
  SET_PROCESSING,
10
  SET_BEFORE_PROCESSING,
11
  SET_AFTER_PROCESSING,
12
  SET_PROCESSING_RESPONSE,
13
+ SET_REDIRECT_URL,
14
+ SET_COMPLETE,
15
  SET_HAS_ERROR,
16
  SET_NO_ERROR,
17
+ INCREMENT_CALCULATING,
18
+ DECREMENT_CALCULATING,
19
+ SET_ORDER_ID,
20
+ } = TYPES;
21
 
22
  const {
23
  PRISTINE,
24
  IDLE,
 
25
  PROCESSING,
26
  BEFORE_PROCESSING,
27
  AFTER_PROCESSING,
28
+ COMPLETE,
29
  } = STATUS;
30
 
31
+ /**
32
+ * Prepares the payment_result data from the server checkout endpoint response.
33
+ *
34
+ * @param {Object} data The value of `payment_result` from the checkout
35
+ * processing endpoint response.
36
+ * @param {string} data.message If there was a general error message it will appear
37
+ * on this property.
38
+ * @param {string} data.payment_status The payment status. One of 'success', 'failure',
39
+ * 'pending', 'error'.
40
+ * @param {Array<Object>} data.payment_details An array of Objects with a 'key' property that is a
41
+ * string and value property that is a string. These are
42
+ * converted to a flat object where the key becomes the
43
+ * object property and value the property value.
44
+ *
45
+ * @return {Object} A new object with 'paymentStatus', and 'paymentDetails' as the properties.
46
+ */
47
+ export const prepareResponseData = ( data ) => {
48
+ const responseData = {
49
+ message: data?.message || '',
50
+ paymentStatus: data.payment_status,
51
+ paymentDetails: {},
52
+ };
53
+ if ( Array.isArray( data.payment_details ) ) {
54
+ data.payment_details.forEach( ( { key, value } ) => {
55
+ responseData.paymentDetails[ key ] = value;
56
+ } );
57
+ }
58
+ return responseData;
59
+ };
60
+
61
  /**
62
  * Reducer for the checkout state
63
  *
64
  * @param {Object} state Current state.
65
  * @param {Object} action Incoming action object.
 
 
 
66
  */
67
+ export const reducer = (
68
+ state = DEFAULT_STATE,
69
+ { url, type, orderId, data }
70
+ ) => {
71
  let newState;
72
  switch ( type ) {
73
  case SET_PRISTINE:
82
  }
83
  : state;
84
  break;
85
+ case SET_REDIRECT_URL:
 
 
 
 
 
 
 
 
 
86
  newState =
87
+ url !== state.url
88
  ? {
89
  ...state,
90
+ redirectUrl: url,
91
  }
92
  : state;
93
  break;
 
 
 
 
 
 
 
 
 
94
  case SET_PROCESSING_RESPONSE:
95
  newState = {
96
  ...state,
97
  processingResponse: data,
98
  };
99
  break;
100
+
101
+ case SET_COMPLETE:
102
+ newState =
103
+ state.status !== COMPLETE
104
+ ? {
105
+ ...state,
106
+ status: COMPLETE,
107
+ redirectUrl: data?.redirectUrl || state.redirectUrl,
108
+ }
109
+ : state;
110
+ break;
111
  case SET_PROCESSING:
112
  newState =
113
  state.status !== PROCESSING
166
  }
167
  : state;
168
  break;
169
+ case INCREMENT_CALCULATING:
170
+ newState = {
171
+ ...state,
172
+ calculatingCount: state.calculatingCount + 1,
173
+ };
174
+ break;
175
+ case DECREMENT_CALCULATING:
176
+ newState = {
177
+ ...state,
178
+ calculatingCount: Math.max( 0, state.calculatingCount - 1 ),
179
+ };
180
+ break;
181
+ case SET_ORDER_ID:
182
+ newState = {
183
+ ...state,
184
+ orderId,
185
+ };
186
+ break;
187
  }
188
+ // automatically update state to idle from pristine as soon as it
189
+ // initially changes.
190
  if (
191
  newState !== state &&
192
  type !== SET_PRISTINE &&
assets/js/base/context/cart-checkout/checkout/index.js ADDED
@@ -0,0 +1,34 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /**
2
+ * Internal dependencies
3
+ */
4
+ import { PaymentMethodDataProvider } from '../payment-methods';
5
+ import { ShippingDataProvider } from '../shipping';
6
+ import { BillingDataProvider } from '../billing';
7
+ import { CheckoutStateProvider } from '../checkout-state';
8
+ import CheckoutProcessor from './processor';
9
+
10
+ /**
11
+ * Checkout provider
12
+ * This wraps the checkout and provides an api interface for the checkout to
13
+ * children via various hooks.
14
+ *
15
+ * @param {Object} props Incoming props for the provider.
16
+ * @param {Object} props.children The children being wrapped.
17
+ * @param {string} [props.redirectUrl] Initialize what the checkout will
18
+ * redirect to after successful
19
+ * submit.
20
+ */
21
+ export const CheckoutProvider = ( { children, redirectUrl } ) => {
22
+ return (
23
+ <CheckoutStateProvider redirectUrl={ redirectUrl } isCart={ false }>
24
+ <BillingDataProvider>
25
+ <ShippingDataProvider>
26
+ <PaymentMethodDataProvider>
27
+ { children }
28
+ <CheckoutProcessor />
29
+ </PaymentMethodDataProvider>
30
+ </ShippingDataProvider>
31
+ </BillingDataProvider>
32
+ </CheckoutStateProvider>
33
+ );
34
+ };
assets/js/base/context/{providers/cart-checkout → cart-checkout}/checkout/processor/index.js RENAMED
@@ -3,6 +3,13 @@
3
  */
4
  import { __ } from '@wordpress/i18n';
5
  import triggerFetch from '@wordpress/api-fetch';
 
 
 
 
 
 
 
6
  import {
7
  useEffect,
8
  useRef,
@@ -10,22 +17,34 @@ import {
10
  useState,
11
  useMemo,
12
  } from '@wordpress/element';
13
- import {
14
- emptyHiddenAddressFields,
15
- formatStoreApiErrorMessage,
16
- } from '@woocommerce/base-utils';
17
 
18
  /**
19
- * Internal dependencies
20
  */
21
- import { preparePaymentData } from './utils';
22
- import { useCheckoutContext } from '../../checkout-state';
23
- import { useShippingDataContext } from '../../shipping';
24
- import { useCustomerDataContext } from '../../customer';
25
- import { usePaymentMethodDataContext } from '../../payment-methods';
26
- import { useValidationContext } from '../../../validation';
27
- import { useStoreCart } from '../../../../hooks/cart/use-store-cart';
28
- import { useStoreNotices } from '../../../../hooks/use-store-notices';
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
29
 
30
  /**
31
  * CheckoutProcessor component.
@@ -37,22 +56,19 @@ import { useStoreNotices } from '../../../../hooks/use-store-notices';
37
  const CheckoutProcessor = () => {
38
  const {
39
  hasError: checkoutHasError,
40
- onCheckoutValidationBeforeProcessing,
41
  dispatchActions,
42
  redirectUrl,
43
  isProcessing: checkoutIsProcessing,
44
  isBeforeProcessing: checkoutIsBeforeProcessing,
45
  isComplete: checkoutIsComplete,
46
- orderNotes,
47
- shouldCreateAccount,
48
  } = useCheckoutContext();
49
  const { hasValidationErrors } = useValidationContext();
50
- const { shippingErrorStatus } = useShippingDataContext();
51
- const { billingData, shippingAddress } = useCustomerDataContext();
52
  const { cartNeedsPayment, receiveCart } = useStoreCart();
53
  const {
54
  activePaymentMethod,
55
- isExpressPaymentMethodActive,
56
  currentStatus: currentPaymentStatus,
57
  paymentMethodData,
58
  expressPaymentMethods,
@@ -64,6 +80,9 @@ const CheckoutProcessor = () => {
64
  const currentShippingAddress = useRef( shippingAddress );
65
  const currentRedirectUrl = useRef( redirectUrl );
66
  const [ isProcessingOrder, setIsProcessingOrder ] = useState( false );
 
 
 
67
 
68
  const paymentMethodId = useMemo( () => {
69
  const merged = { ...expressPaymentMethods, ...paymentMethods };
@@ -71,20 +90,20 @@ const CheckoutProcessor = () => {
71
  }, [ activePaymentMethod, expressPaymentMethods, paymentMethods ] );
72
 
73
  const checkoutWillHaveError =
74
- ( hasValidationErrors && ! isExpressPaymentMethodActive ) ||
75
  currentPaymentStatus.hasError ||
76
  shippingErrorStatus.hasError;
77
 
78
  // If express payment method is active, let's suppress notices
79
  useEffect( () => {
80
- setIsSuppressed( isExpressPaymentMethodActive );
81
- }, [ isExpressPaymentMethodActive, setIsSuppressed ] );
82
 
83
  useEffect( () => {
84
  if (
85
  checkoutWillHaveError !== checkoutHasError &&
86
  ( checkoutIsProcessing || checkoutIsBeforeProcessing ) &&
87
- ! isExpressPaymentMethodActive
88
  ) {
89
  dispatchActions.setHasError( checkoutWillHaveError );
90
  }
@@ -93,7 +112,7 @@ const CheckoutProcessor = () => {
93
  checkoutHasError,
94
  checkoutIsProcessing,
95
  checkoutIsBeforeProcessing,
96
- isExpressPaymentMethodActive,
97
  dispatchActions,
98
  ] );
99
 
@@ -144,35 +163,30 @@ const CheckoutProcessor = () => {
144
 
145
  useEffect( () => {
146
  let unsubscribeProcessing;
147
- if ( ! isExpressPaymentMethodActive ) {
148
- unsubscribeProcessing = onCheckoutValidationBeforeProcessing(
149
  checkValidation,
150
  0
151
  );
152
  }
153
  return () => {
154
- if ( ! isExpressPaymentMethodActive ) {
155
  unsubscribeProcessing();
156
  }
157
  };
158
  }, [
159
- onCheckoutValidationBeforeProcessing,
160
  checkValidation,
161
- isExpressPaymentMethodActive,
162
  ] );
163
 
164
  const processOrder = useCallback( () => {
165
  setIsProcessingOrder( true );
166
  removeNotice( 'checkout' );
167
  let data = {
168
- billing_address: emptyHiddenAddressFields(
169
- currentBillingData.current
170
- ),
171
- shipping_address: emptyHiddenAddressFields(
172
- currentShippingAddress.current
173
- ),
174
- customer_note: orderNotes,
175
- should_create_account: shouldCreateAccount,
176
  };
177
  if ( cartNeedsPayment ) {
178
  data = {
@@ -196,55 +210,37 @@ const CheckoutProcessor = () => {
196
  // Update nonce.
197
  triggerFetch.setNonce( fetchResponse.headers );
198
 
199
- // Update user using headers.
200
- dispatchActions.setCustomerId(
201
- fetchResponse.headers.get( 'X-WC-Store-API-User' )
202
- );
203
-
204
  // Handle response.
205
- fetchResponse.json().then( function ( response ) {
206
  if ( ! fetchResponse.ok ) {
207
  // We received an error response.
208
- addErrorNotice(
209
- formatStoreApiErrorMessage( response ),
210
- {
211
  id: 'checkout',
212
- }
213
- );
 
 
 
 
 
 
 
 
 
 
214
  dispatchActions.setHasError();
215
  }
216
  dispatchActions.setAfterProcessing( response );
217
  setIsProcessingOrder( false );
218
  } );
219
  } )
220
- .catch( ( errorResponse ) => {
221
- // Update nonce.
222
- triggerFetch.setNonce( errorResponse.headers );
223
-
224
- // If new customer ID returned, update the store.
225
- if ( errorResponse.headers?.get( 'X-WC-Store-API-User' ) ) {
226
- dispatchActions.setCustomerId(
227
- errorResponse.headers.get( 'X-WC-Store-API-User' )
228
- );
229
- }
230
-
231
- errorResponse.json().then( function ( response ) {
232
- // If updated cart state was returned, update the store.
233
  if ( response.data?.cart ) {
234
  receiveCart( response.data.cart );
235
  }
236
- addErrorNotice( formatStoreApiErrorMessage( response ), {
237
- id: 'checkout',
238
- } );
239
-
240
- response.additional_errors?.forEach?.(
241
- ( additionalError ) => {
242
- addErrorNotice( additionalError.message, {
243
- id: additionalError.error_code,
244
- } );
245
- }
246
- );
247
-
248
  dispatchActions.setHasError();
249
  dispatchActions.setAfterProcessing( response );
250
  setIsProcessingOrder( false );
@@ -260,8 +256,6 @@ const CheckoutProcessor = () => {
260
  cartNeedsPayment,
261
  receiveCart,
262
  dispatchActions,
263
- orderNotes,
264
- shouldCreateAccount,
265
  ] );
266
  // redirect when checkout is complete and there is a redirect url.
267
  useEffect( () => {
3
  */
4
  import { __ } from '@wordpress/i18n';
5
  import triggerFetch from '@wordpress/api-fetch';
6
+ import {
7
+ useCheckoutContext,
8
+ useShippingDataContext,
9
+ useBillingDataContext,
10
+ usePaymentMethodDataContext,
11
+ useValidationContext,
12
+ } from '@woocommerce/base-context';
13
  import {
14
  useEffect,
15
  useRef,
17
  useState,
18
  useMemo,
19
  } from '@wordpress/element';
20
+ import { useStoreCart, useStoreNotices } from '@woocommerce/base-hooks';
 
 
 
21
 
22
  /**
23
+ * @typedef {import('@woocommerce/type-defs/payments').PaymentDataItem} PaymentDataItem
24
  */
25
+
26
+ /**
27
+ * Utility function for preparing payment data for the request.
28
+ *
29
+ * @param {Object} paymentData Arbitrary payment data provided by the payment method.
30
+ * @param {boolean} shouldSave Whether to save the payment method info to user account.
31
+ * @param {Object} activePaymentMethod The current active payment method.
32
+ *
33
+ * @return {PaymentDataItem[]} Returns the payment data as an array of
34
+ * PaymentDataItem objects.
35
+ */
36
+ const preparePaymentData = ( paymentData, shouldSave, activePaymentMethod ) => {
37
+ const apiData = Object.keys( paymentData ).map( ( property ) => {
38
+ const value = paymentData[ property ];
39
+ return { key: property, value };
40
+ }, [] );
41
+ const savePaymentMethodKey = `wc-${ activePaymentMethod }-new-payment-method`;
42
+ apiData.push( {
43
+ key: savePaymentMethodKey,
44
+ value: shouldSave,
45
+ } );
46
+ return apiData;
47
+ };
48
 
49
  /**
50
  * CheckoutProcessor component.
56
  const CheckoutProcessor = () => {
57
  const {
58
  hasError: checkoutHasError,
59
+ onCheckoutBeforeProcessing,
60
  dispatchActions,
61
  redirectUrl,
62
  isProcessing: checkoutIsProcessing,
63
  isBeforeProcessing: checkoutIsBeforeProcessing,
64
  isComplete: checkoutIsComplete,
 
 
65
  } = useCheckoutContext();
66
  const { hasValidationErrors } = useValidationContext();
67
+ const { shippingAddress, shippingErrorStatus } = useShippingDataContext();
68
+ const { billingData } = useBillingDataContext();
69
  const { cartNeedsPayment, receiveCart } = useStoreCart();
70
  const {
71
  activePaymentMethod,
 
72
  currentStatus: currentPaymentStatus,
73
  paymentMethodData,
74
  expressPaymentMethods,
80
  const currentShippingAddress = useRef( shippingAddress );
81
  const currentRedirectUrl = useRef( redirectUrl );
82
  const [ isProcessingOrder, setIsProcessingOrder ] = useState( false );
83
+ const expressPaymentMethodActive = Object.keys(
84
+ expressPaymentMethods
85
+ ).includes( activePaymentMethod );
86
 
87
  const paymentMethodId = useMemo( () => {
88
  const merged = { ...expressPaymentMethods, ...paymentMethods };
90
  }, [ activePaymentMethod, expressPaymentMethods, paymentMethods ] );
91
 
92
  const checkoutWillHaveError =
93
+ ( hasValidationErrors && ! expressPaymentMethodActive ) ||
94
  currentPaymentStatus.hasError ||
95
  shippingErrorStatus.hasError;
96
 
97
  // If express payment method is active, let's suppress notices
98
  useEffect( () => {
99
+ setIsSuppressed( expressPaymentMethodActive );
100
+ }, [ expressPaymentMethodActive, setIsSuppressed ] );
101
 
102
  useEffect( () => {
103
  if (
104
  checkoutWillHaveError !== checkoutHasError &&
105
  ( checkoutIsProcessing || checkoutIsBeforeProcessing ) &&
106
+ ! expressPaymentMethodActive
107
  ) {
108
  dispatchActions.setHasError( checkoutWillHaveError );
109
  }
112
  checkoutHasError,
113
  checkoutIsProcessing,
114
  checkoutIsBeforeProcessing,
115
+ expressPaymentMethodActive,
116
  dispatchActions,
117
  ] );
118
 
163
 
164
  useEffect( () => {
165
  let unsubscribeProcessing;
166
+ if ( ! expressPaymentMethodActive ) {
167
+ unsubscribeProcessing = onCheckoutBeforeProcessing(
168
  checkValidation,
169
  0
170
  );
171
  }
172
  return () => {
173
+ if ( ! expressPaymentMethodActive ) {
174
  unsubscribeProcessing();
175
  }
176
  };
177
  }, [
178
+ onCheckoutBeforeProcessing,
179
  checkValidation,
180
+ expressPaymentMethodActive,
181
  ] );
182
 
183
  const processOrder = useCallback( () => {
184
  setIsProcessingOrder( true );
185
  removeNotice( 'checkout' );
186
  let data = {
187
+ billing_address: currentBillingData.current,
188
+ shipping_address: currentShippingAddress.current,
189
+ customer_note: '',
 
 
 
 
 
190
  };
191
  if ( cartNeedsPayment ) {
192
  data = {
210
  // Update nonce.
211
  triggerFetch.setNonce( fetchResponse.headers );
212
 
 
 
 
 
 
213
  // Handle response.
214
+ fetchResponse.json().then( function( response ) {
215
  if ( ! fetchResponse.ok ) {
216
  // We received an error response.
217
+ if ( response.body && response.body.message ) {
218
+ addErrorNotice( response.body.message, {
 
219
  id: 'checkout',
220
+ } );
221
+ } else {
222
+ addErrorNotice(
223
+ __(
224
+ 'Something went wrong. Please contact us to get assistance.',
225
+ 'woo-gutenberg-products-block'
226
+ ),
227
+ {
228
+ id: 'checkout',
229
+ }
230
+ );
231
+ }
232
  dispatchActions.setHasError();
233
  }
234
  dispatchActions.setAfterProcessing( response );
235
  setIsProcessingOrder( false );
236
  } );
237
  } )
238
+ .catch( ( error ) => {
239
+ error.json().then( function( response ) {
240
+ // If updated cart state was returned, also update that.
 
 
 
 
 
 
 
 
 
 
241
  if ( response.data?.cart ) {
242
  receiveCart( response.data.cart );
243
  }
 
 
 
 
 
 
 
 
 
 
 
 
244
  dispatchActions.setHasError();
245
  dispatchActions.setAfterProcessing( response );
246
  setIsProcessingOrder( false );
256
  cartNeedsPayment,
257
  receiveCart,
258
  dispatchActions,
 
 
259
  ] );
260
  // redirect when checkout is complete and there is a redirect url.
261
  useEffect( () => {
assets/js/base/context/cart-checkout/event-emit/emitter-callback.js ADDED
@@ -0,0 +1,15 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /**
2
+ * Internal dependencies
3
+ */
4
+ import { actions } from './reducer';
5
+
6
+ export const emitterCallback = ( type, dispatcher ) => (
7
+ callback,
8
+ priority = 10
9
+ ) => {
10
+ const action = actions.addEventCallback( type, callback, priority );
11
+ dispatcher( action );
12
+ return () => {
13
+ dispatcher( actions.removeEventCallback( type, action.id ) );
14
+ };
15
+ };
assets/js/base/context/cart-checkout/event-emit/emitters.js ADDED
@@ -0,0 +1,86 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ const getObserversByPriority = ( observers, eventType ) => {
2
+ return observers[ eventType ]
3
+ ? Array.from( observers[ eventType ].values() ).sort( ( a, b ) => {
4
+ return a.priority - b.priority;
5
+ } )
6
+ : [];
7
+ };
8
+
9
+ /**
10
+ * Emits events on registered observers for the provided type and passes along
11
+ * the provided data.
12
+ *
13
+ * This event emitter will silently catch promise errors, but doesn't care
14
+ * otherwise if any errors are caused by observers. So events that do care
15
+ * should use `emitEventWithAbort` instead.
16
+ *
17
+ * @param {Object} observers The registered observers to omit to.
18
+ * @param {string} eventType The event type being emitted.
19
+ * @param {*} data Data passed along to the observer when it is
20
+ * invoked.
21
+ *
22
+ * @return {Promise} A promise that resolves to true after all observers have
23
+ * executed.
24
+ */
25
+ export const emitEvent = async ( observers, eventType, data ) => {
26
+ const observersByType = getObserversByPriority( observers, eventType );
27
+ const observerResponses = [];
28
+ for ( const observer of observersByType ) {
29
+ try {
30
+ const observerResponse = await Promise.resolve(
31
+ observer.callback( data )
32
+ );
33
+ if ( typeof observerResponse === 'object' ) {
34
+ observerResponses.push( observerResponse );
35
+ }
36
+ } catch ( e ) {
37
+ // we don't care about errors blocking execution, but will
38
+ // console.error for troubleshooting.
39
+ // eslint-disable-next-line no-console
40
+ console.error( e );
41
+ }
42
+ }
43
+ return observerResponses.length ? observerResponses : true;
44
+ };
45
+
46
+ /**
47
+ * Emits events on registered observers for the provided type and passes along
48
+ * the provided data. This event emitter will abort and return any value from
49
+ * observers that do not return true.
50
+ *
51
+ * @param {Object} observers The registered observers to omit to.
52
+ * @param {string} eventType The event type being emitted.
53
+ * @param {*} data Data passed along to the observer when it is
54
+ * invoked.
55
+ *
56
+ * @return {Promise} Returns a promise that resolves to either boolean or the
57
+ * return value of the aborted observer.
58
+ */
59
+ export const emitEventWithAbort = async ( observers, eventType, data ) => {
60
+ const observersByType = getObserversByPriority( observers, eventType );
61
+ let emitterResponse = true;
62
+ for ( const observer of observersByType ) {
63
+ try {
64
+ const response = await Promise.resolve( observer.callback( data ) );
65
+ if (
66
+ typeof response === 'object' &&
67
+ typeof response.type === 'undefined'
68
+ ) {
69
+ throw new Error(
70
+ 'If you want to abort event emitter processing, your observer must return an object with a type property'
71
+ );
72
+ }
73
+ emitterResponse = typeof response === 'object' ? response : true;
74
+ if ( emitterResponse !== true ) {
75
+ return emitterResponse;
76
+ }
77
+ } catch ( e ) {
78
+ // we don't handle thrown errors but just console.log for
79
+ // troubleshooting
80
+ // eslint-disable-next-line no-console
81
+ console.error( e );
82
+ return { type: 'error' };
83
+ }
84
+ }
85
+ return emitterResponse;
86
+ };
assets/js/base/context/{event-emit/index.ts → cart-checkout/event-emit/index.js} RENAMED
@@ -1,4 +1,3 @@
1
  export * from './reducer';
2
  export * from './emitters';
3
  export * from './emitter-callback';
4
- export * from './types';
1
  export * from './reducer';
2
  export * from './emitters';
3
  export * from './emitter-callback';
 
assets/js/base/context/cart-checkout/event-emit/reducer.js ADDED
@@ -0,0 +1,56 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /**
2
+ * External dependencies
3
+ */
4
+ import { uniqueId } from 'lodash';
5
+
6
+ export const TYPES = {
7
+ ADD_EVENT_CALLBACK: 'add_event_callback',
8
+ REMOVE_EVENT_CALLBACK: 'remove_event_callback',
9
+ };
10
+
11
+ export const actions = {
12
+ addEventCallback: ( eventType, callback, priority = 10 ) => {
13
+ return {
14
+ id: uniqueId(),
15
+ type: TYPES.ADD_EVENT_CALLBACK,
16
+ eventType,
17
+ callback,
18
+ priority,
19
+ };
20
+ },
21
+ removeEventCallback: ( eventType, id ) => {
22
+ return {
23
+ id,
24
+ type: TYPES.REMOVE_EVENT_CALLBACK,
25
+ eventType,
26
+ };
27
+ },
28
+ };
29
+
30
+ /**
31
+ * Handles actions for emmitters
32
+ *
33
+ * @param {Object} state Current state.
34
+ * @param {Object} action Incoming action object
35
+ */
36
+ export const reducer = (
37
+ state = {},
38
+ { type, eventType, id, callback, priority }
39
+ ) => {
40
+ const newEvents = new Map( state[ eventType ] );
41
+ switch ( type ) {
42
+ case TYPES.ADD_EVENT_CALLBACK:
43
+ newEvents.set( id, { priority, callback } );
44
+ return {
45
+ ...state,
46
+ [ eventType ]: newEvents,
47
+ };
48
+ case TYPES.REMOVE_EVENT_CALLBACK:
49
+ newEvents.delete( id );
50
+ return {
51
+ ...state,
52
+ [ eventType ]: newEvents,
53
+ };
54
+ }
55
+ return state;
56
+ };
assets/js/base/context/{event-emit → cart-checkout/event-emit}/test/emitters.js RENAMED
@@ -30,13 +30,6 @@ describe( 'Testing emitters', () => {
30
  'observerPromiseWithResolvedValue',
31
  { priority: 10, callback: observerPromiseWithResolvedValue },
32
  ],
33
- [
34
- 'observerSuccessType',
35
- {
36
- priority: 10,
37
- callback: jest.fn().mockReturnValue( { type: 'success' } ),
38
- },
39
- ],
40
  ] );
41
  } );
42
  describe( 'Testing emitEvent()', () => {
@@ -46,11 +39,11 @@ describe( 'Testing emitters', () => {
46
  expect( console ).toHaveErroredWith( 'an error' );
47
  expect( observerA ).toHaveBeenCalledTimes( 1 );
48
  expect( observerB ).toHaveBeenCalledWith( 'foo' );
49
- expect( response ).toEqual( [ { type: 'success' } ] );
50
  } );
51
  } );
52
  describe( 'Testing emitEventWithAbort()', () => {
53
- it( 'does not abort on any return value other than an object with an error or fail type property', async () => {
54
  observerMocks.delete( 'observerPromiseWithReject' );
55
  const observers = { test: observerMocks };
56
  const response = await emitEventWithAbort(
@@ -61,16 +54,17 @@ describe( 'Testing emitters', () => {
61
  expect( console ).not.toHaveErrored();
62
  expect( observerB ).toHaveBeenCalledTimes( 1 );
63
  expect( observerPromiseWithResolvedValue ).toHaveBeenCalled();
64
- expect( response ).toEqual( [ { type: 'success' } ] );
65
  } );
66
- it( 'Aborts on a return value with an object that has a a fail type property', async () => {
67
  const validObjectResponse = jest
68
  .fn()
69
- .mockReturnValue( { type: 'failure' } );
70
  observerMocks.set( 'observerValidObject', {
71
  priority: 5,
72
  callback: validObjectResponse,
73
  } );
 
74
  const observers = { test: observerMocks };
75
  const response = await emitEventWithAbort(
76
  observers,
@@ -80,7 +74,7 @@ describe( 'Testing emitters', () => {
80
  expect( console ).not.toHaveErrored();
81
  expect( validObjectResponse ).toHaveBeenCalledTimes( 1 );
82
  expect( observerPromiseWithResolvedValue ).not.toHaveBeenCalled();
83
- expect( response ).toEqual( [ { type: 'failure' } ] );
84
  } );
85
  it( 'throws an error on an object returned from observer without a type property', async () => {
86
  const failingObjectResponse = jest.fn().mockReturnValue( {} );
@@ -97,7 +91,7 @@ describe( 'Testing emitters', () => {
97
  expect( console ).toHaveErrored();
98
  expect( failingObjectResponse ).toHaveBeenCalledTimes( 1 );
99
  expect( observerPromiseWithResolvedValue ).not.toHaveBeenCalled();
100
- expect( response ).toEqual( [ { type: 'error' } ] );
101
  } );
102
  } );
103
  describe( 'Test Priority', () => {
30
  'observerPromiseWithResolvedValue',
31
  { priority: 10, callback: observerPromiseWithResolvedValue },
32
  ],
 
 
 
 
 
 
 
33
  ] );
34
  } );
35
  describe( 'Testing emitEvent()', () => {
39
  expect( console ).toHaveErroredWith( 'an error' );
40
  expect( observerA ).toHaveBeenCalledTimes( 1 );
41
  expect( observerB ).toHaveBeenCalledWith( 'foo' );
42
+ expect( response ).toBe( true );
43
  } );
44
  } );
45
  describe( 'Testing emitEventWithAbort()', () => {
46
+ it( 'does not abort on any return value other than an object with a type property', async () => {
47
  observerMocks.delete( 'observerPromiseWithReject' );
48
  const observers = { test: observerMocks };
49
  const response = await emitEventWithAbort(
54
  expect( console ).not.toHaveErrored();
55
  expect( observerB ).toHaveBeenCalledTimes( 1 );
56
  expect( observerPromiseWithResolvedValue ).toHaveBeenCalled();
57
+ expect( response ).toBe( true );
58
  } );
59
+ it( 'Aborts on a return value with an object that has a type property', async () => {
60
  const validObjectResponse = jest
61
  .fn()
62
+ .mockReturnValue( { type: 'success' } );
63
  observerMocks.set( 'observerValidObject', {
64
  priority: 5,
65
  callback: validObjectResponse,
66
  } );
67
+ observerMocks.delete( 'observerPromiseWithReject' );
68
  const observers = { test: observerMocks };
69
  const response = await emitEventWithAbort(
70
  observers,
74
  expect( console ).not.toHaveErrored();
75
  expect( validObjectResponse ).toHaveBeenCalledTimes( 1 );
76
  expect( observerPromiseWithResolvedValue ).not.toHaveBeenCalled();
77
+ expect( response ).toEqual( { type: 'success' } );
78
  } );
79
  it( 'throws an error on an object returned from observer without a type property', async () => {
80
  const failingObjectResponse = jest.fn().mockReturnValue( {} );
91
  expect( console ).toHaveErrored();
92
  expect( failingObjectResponse ).toHaveBeenCalledTimes( 1 );
93
  expect( observerPromiseWithResolvedValue ).not.toHaveBeenCalled();
94
+ expect( response ).toEqual( { type: 'error' } );
95
  } );
96
  } );
97
  describe( 'Test Priority', () => {
assets/js/base/context/{providers/cart-checkout → cart-checkout}/index.js RENAMED
@@ -1,6 +1,7 @@
1
  export * from './payment-methods';
2
  export * from './shipping';
3
- export * from './customer';
4
  export * from './checkout';
5
  export * from './cart';
 
6
  export { useCheckoutContext } from './checkout-state';
1
  export * from './payment-methods';
2
  export * from './shipping';
3
+ export * from './billing';
4
  export * from './checkout';
5
  export * from './cart';
6
+ export * from './validation';
7
  export { useCheckoutContext } from './checkout-state';
assets/js/base/context/cart-checkout/payment-methods/actions.js ADDED
@@ -0,0 +1,115 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /**
2
+ * Internal dependencies
3
+ */
4
+ import { ACTION_TYPES } from './constants';
5
+
6
+ /**
7
+ * @typedef {import('@woocommerce/type-defs/cart').CartBillingData} CartBillingData
8
+ */
9
+
10
+ const {
11
+ ERROR,
12
+ FAILED,
13
+ SUCCESS,
14
+ SET_REGISTERED_PAYMENT_METHODS,
15
+ SET_REGISTERED_EXPRESS_PAYMENT_METHODS,
16
+ SET_SHOULD_SAVE_PAYMENT_METHOD,
17
+ } = ACTION_TYPES;
18
+
19
+ /**
20
+ * Used to dispatch a status update only for the given type.
21
+ *
22
+ * @param {string} type
23
+ *
24
+ * @return {Object} The action object.
25
+ */
26
+ export const statusOnly = ( type ) => ( { type } );
27
+
28
+ /**
29
+ * Used to dispatch an error message along with setting current payment status
30
+ * to ERROR.
31
+ *
32
+ * @param {string} errorMessage Whatever error message accompanying the error
33
+ * condition.
34
+ *
35
+ * @return {Object} The action object.
36
+ */
37
+ export const error = ( errorMessage ) => ( {
38
+ type: ERROR,
39
+ errorMessage,
40
+ } );
41
+
42
+ /**
43
+ * Used to dispatch a payment failed status update.
44
+ *
45
+ * @param {Object} action