Merge pull request #3145 from cmgustavo/feat/glidera-integration

Feat/glidera integration
This commit is contained in:
Matias Alejo Garcia 2015-09-09 14:44:48 -03:00
commit a9a49f5007
33 changed files with 1856 additions and 249 deletions

View file

@ -17,7 +17,7 @@
"ng-lodash": "~0.2.0",
"angular-moment": "0.10.1",
"moment": "2.10.3",
"angular-bitcore-wallet-client": "^0.1.2",
"angular-bitcore-wallet-client": "0.1.2",
"angular-ui-router": "~0.2.13",
"qrcode-decoder-js": "*",
"fastclick": "*",

Binary file not shown.

View file

@ -6,53 +6,56 @@
<font id="icomoon" horiz-adv-x="1024">
<font-face units-per-em="1024" ascent="960" descent="-64" />
<missing-glyph horiz-adv-x="1024" />
<glyph unicode="&#x20;" d="" horiz-adv-x="512" />
<glyph unicode="&#xe600;" d="M716.749 696.32l0.051-471.040-409.6 235.52z" />
<glyph unicode="&#xe601;" d="M747.52 665.549l-471.040 0.051 235.52-409.6z" />
<glyph unicode="&#xe602;" d="M276.48 256h471.040l-235.571 409.6z" />
<glyph unicode="&#xe603;" d="M307.251 696.32l-0.051-471.040 409.6 235.52z" />
<glyph unicode="&#xe604;" d="M585.574 741.581c-21.402-20.89-230.502-240.435-230.502-240.435-11.418-11.162-17.101-25.754-17.101-40.346s5.683-29.184 17.101-40.346c0 0 209.101-219.546 230.502-240.384 21.402-20.89 59.904-22.323 82.739 0 22.784 22.272 24.576 53.35-0.051 80.64l-191.846 200.090 191.846 200.090c24.627 27.341 22.835 58.419 0.051 80.691-22.886 22.272-61.389 20.89-82.739 0z" />
<glyph unicode="&#xe605;" d="M792.73 534.374c-20.838-21.402-240.384-230.554-240.384-230.554-11.162-11.418-25.754-17.101-40.346-17.101-14.643 0-29.235 5.683-40.346 17.101 0 0-219.546 209.152-240.435 230.554-20.838 21.402-22.272 59.853 0 82.739 22.323 22.835 53.402 24.627 80.691 0l200.090-191.898 200.038 191.846c27.341 24.627 58.47 22.835 80.691 0 22.323-22.835 20.941-61.338 0-82.688z" />
<glyph unicode="&#xe606;" d="M792.73 387.226c-20.838 21.402-240.384 230.502-240.384 230.502-11.162 11.418-25.754 17.152-40.346 17.152-14.643 0-29.235-5.734-40.346-17.152 0 0-219.546-209.101-240.435-230.502-20.838-21.402-22.272-59.904 0-82.739 22.323-22.784 53.402-24.627 80.691 0l200.090 191.846 200.038-191.846c27.341-24.627 58.47-22.784 80.691 0 22.323 22.886 20.941 61.389 0 82.739z" />
<glyph unicode="&#xe607;" d="M438.426 741.581c21.402-20.89 230.502-240.435 230.502-240.435 11.469-11.162 17.152-25.754 17.152-40.346s-5.683-29.184-17.152-40.346c0 0-209.101-219.546-230.502-240.384-21.402-20.89-59.853-22.323-82.739 0-22.835 22.272-24.627 53.35 0 80.64l191.898 200.090-191.846 200.090c-24.627 27.341-22.835 58.419 0 80.691s61.338 20.89 82.688 0z" />
<glyph unicode="&#xe608;" d="M634.829 285.798c13.722-13.875 13.722-36.301 0-50.125-13.722-13.875-35.891-13.875-49.613 0l-196.096 200.038c-13.722 13.875-13.722 36.301 0 50.125l196.096 200.090c13.722 13.875 35.891 13.875 49.613 0s13.722-36.25 0-50.125l-160.768-175.002 160.768-175.002z" />
<glyph unicode="&#xe609;" d="M687.002 583.629c13.875 13.722 36.301 13.722 50.125 0 13.875-13.722 13.875-35.891 0-49.613l-200.038-196.096c-13.875-13.722-36.301-13.722-50.125 0l-200.090 196.096c-13.824 13.722-13.824 35.891 0 49.613 13.875 13.722 36.25 13.722 50.125 0l175.002-160.768 175.002 160.768z" />
<glyph unicode="&#xe60a;" d="M336.947 337.971c-13.875-13.722-36.25-13.722-50.125 0-13.824 13.722-13.875 35.891 0 49.664l200.090 195.994c13.875 13.722 36.301 13.722 50.125 0l200.090-196.045c13.875-13.773 13.875-35.942 0-49.664s-36.25-13.722-50.125 0l-175.053 160.819-175.002-160.768z" />
<glyph unicode="&#xe60b;" d="M389.171 285.798c-13.722-13.875-13.722-36.301 0-50.125 13.67-13.875 35.891-13.875 49.613 0l196.096 200.038c13.722 13.875 13.722 36.301 0 50.125l-196.096 200.090c-13.722 13.875-35.891 13.875-49.613 0s-13.722-36.25-0.051-50.074l160.819-175.053-160.768-175.002z" />
<glyph unicode="&#xe60c;" d="M737.229 80.998c13.722-13.875 13.722-36.25 0-50.125s-35.891-13.875-49.613 0l-400.896 404.838c-13.722 13.875-13.722 36.301 0 50.125l400.896 404.89c13.722 13.875 35.891 13.875 49.613 0s13.722-36.25 0-50.125l-365.568-379.802 365.568-379.802z" />
<glyph unicode="&#xe60d;" d="M132.198 686.029c-13.875 13.722-36.301 13.722-50.125 0-13.824-13.67-13.824-35.891 0-49.613l404.89-400.896c13.875-13.722 36.25-13.722 50.125 0l404.89 400.896c13.824 13.722 13.875 35.891 0 49.613s-36.352 13.722-50.125 0.051l-379.853-365.619-379.802 365.568z" />
<glyph unicode="&#xe60e;" d="M891.802 235.571c13.875-13.722 36.301-13.722 50.125 0 13.875 13.722 13.875 35.891 0 49.613l-404.89 400.896c-13.824 13.722-36.25 13.722-50.074 0l-404.89-400.896c-13.824-13.722-13.875-35.891 0-49.613s36.25-13.722 50.125 0l379.802 365.619 379.802-365.619z" />
<glyph unicode="&#xe60f;" d="M416.562 841.898c-217.791 0-394.343-176.553-394.343-394.345s176.553-394.345 394.343-394.345c217.793 0 394.348 176.555 394.348 394.345s-176.555 394.345-394.348 394.345zM562.313 427.171c-4.394 10.103-11.158 18.977-24.686 26.444-7.206 3.952-14.146 6.852-22.316 8.785 4.744 2.196 8.785 4.744 14.321 9.663 6.589 5.8 11.51 13.795 13.705 20.469 2.286 6.589 3.603 15.814 3.076 24.776-0.968 14.76-3.867 29.078-11.598 39.358s-18.625 18.187-33.031 23.723c-11.070 4.216-22.403 6.852-39.974 7.817v56.14h-35.144v-56.227h-28.114v56.227h-36.022v-56.227h-76.522v-42.171h24.515c7.643 0 12.824-0.703 15.461-2.021 2.724-1.316 4.658-3.073 5.712-5.27 1.143-2.196 1.67-7.38 1.67-15.375v-152.166c0-7.906-0.528-13.004-1.67-15.287-1.143-2.286-1.76-4.307-4.48-5.534-2.722-1.231-2.812-1.143-10.368-1.143h-23.195l-7.643-42.171h76.436v-56.227h36.022v56.227h28.114v-56.227h35.142v56.577c22.843 1.143 39.096 4.13 52.185 9.050 16.957 6.325 29.959 15.551 39.272 27.676s13.089 30.661 13.881 44.981c0.616 12.739-0.791 29.168-4.744 38.13v0zM398.463 540.678h28.114v-65.012h-28.114v65.012zM398.463 433.496h28.114v-79.069h-28.114v79.069zM461.718 537.252c5.27-2.196 8.697-6.589 12.124-11.157 3.777-5.007 5.71-11.685 5.71-18.802 0-6.852-2.548-12.739-6.589-18.010-3.339-4.304-5.976-7.292-11.244-9.751v57.72zM487.021 373.227c-6.852-6.061-10.808-8.874-19.416-12.124-1.76-0.703-4.13-1.23-5.886-1.668v72.742c4.394-0.703 6.678-1.58 9.925-2.987 6.854-2.899 13.354-6.061 17.396-11.596s7.028-13.705 7.028-21.7c0-9.577-2.461-16.867-9.050-22.667v0z" horiz-adv-x="831" />
<glyph unicode="&#xe610;" d="M416 416.6v-64.6h64.399l360.2 360-64.8 64.6zM888.401 799.4l-25 25c-5.4 4.8-12.401 7.601-20 7.601s-14.6-3-19.8-7.601l-24.2-24.399 0.2-0.2 22.4-22.6 42.001-42.001 24.401 24.399c4.8 5.201 7.599 12.2 7.599 19.8 0.2 7.599-2.799 14.6-7.599 20zM511 320h-127v127.2l256 256h-0.6l0.8 0.8h-480.2v-576h608v444.399l0.2 5z" />
<glyph unicode="&#xe611;" d="M512 864c-229.8 0-416-186.2-416-416s186.2-416 416-416c229.8 0 416 186.2 416 416s-186.2 416-416 416zM512 66.6c-117.2 0-222.2 53.2-292.2 136.6 35.6 15.4 124.4 47.4 180.6 63.8 4.4 1.4 5.2 1.6 5.2 21.4 0 21.2-2.4 36.2-7.6 47.2-7 15-15.4 40.4-18.4 63.2-8.4 9.8-19.8 29-27.2 65.8-6.4 32.4-3.4 44.2 0.8 55.2 0.4 1.2 1 2.4 1.2 3.6 1.6 7.4-0.6 47-6.2 77.6-3.8 21 1 65.6 30 102.6 18.2 23.4 53.2 52 116 56h35c63.8-4 98.8-32.6 117-56 29-37 33.8-81.6 29.8-102.6-5.6-30.6-7.8-70-6.2-77.6 0.2-1.2 0.8-2.4 1.2-3.4 4.2-11 7.4-22.8 0.8-55.2-7.4-36.8-18.8-56-27.2-65.8-3-22.8-11.4-48-18.4-63.2-6.6-13.8-13.2-30.2-13.2-46.6 0-19.8 0.8-20 5.4-21.4 53.4-15.8 145.4-47.6 186-64.2-70-83.6-175-137-292.4-137z" />
<glyph unicode="&#xe612;" d="M896 192v484.4l-262.2-199.6 136.2-154.8-4-4-157.8 139.2-96.2-73.2-96.2 73.2-157.8-139.2-4 4 136 154.8-262 199.2v-484zM879.4 704h-735.4l368-279.8z" />
<glyph unicode="&#xe613;" d="M817 527h-30.4c-24.8 0-45.6 21.4-45.6 46.8 0 12.8 5.4 24.4 15 33l19.6 19.2c19.4 19.2 19.4 50.6 0 69.8l-44.6 44.2c-8.8 8.8-21.8 14-35 14s-26-5.2-35-14l-18.8-18.8c-9-10-21-15.4-34-15.4-25.6 0-47 20.8-47 45.4v30.6c0 27-21.8 50.2-49 50.2h-60.8c-27.2 0-48.8-23-48.8-50.2v-30.4c0-24.6-21.4-45.4-47-45.4-12.8 0-24.6 5.4-33.2 14.8l-19.4 19.2c-8.8 9-21.8 14-35 14s-26-5.2-35-14l-45-44c-19.2-19.2-19.2-50.6 0-69.6l18.8-18.8c10-9 15.6-21 15.6-33.8 0-25.6-20.8-46.8-45.6-46.8h-30.4c-27.4 0-50.4-21.4-50.4-48.6v-60.8c0-27 23-48.6 50.4-48.6h30.4c24.8 0 45.6-21.4 45.6-46.8 0-12.8-5.6-24.8-15.6-33.8l-18.8-18.6c-19.2-19.2-19.2-50.6 0-69.6l44.6-44.4c8.8-9 21.8-14 35-14s26 5.2 35 14l19.4 19.2c8.4 9.4 20.4 14.8 33.2 14.8 25.6 0 47-20.8 47-45.4v-30.4c0-27 21.6-50.2 49-50.2h60.8c27.2 0 48.8 23 48.8 50.2v30.4c0 24.6 21.4 45.4 47 45.4 12.8 0 24.8-5.6 34-15.4l18.8-18.8c9-8.8 21.8-14 35-14s26 5.2 35 14l44.6 44.4c19.2 19.2 19.2 50.6 0 69.8l-19.6 19.2c-9.6 8.6-15 20.4-15 33 0 25.6 20.8 46.8 45.6 46.8h30.4c27.2 0 46.6 21.4 46.6 48.6v61c0.4 27.2-19 48.6-46.2 48.6zM641.6 448v0c0-88.2-71.4-160-160-160s-160 71.8-160 160v0 0c0 88.2 71.4 160 160 160s160-71.8 160-160v0z" horiz-adv-x="960" />
<glyph unicode="&#xe614;" d="M480 736l-320-256v-416h224v256h192v-256h224v416l-320 256zM480 832l-192-153.6v89.6h-128v-191.998l-64-51.2v-40.982l384 307.2 384-307.2v40.982l-384 307.198z" horiz-adv-x="960" />
<glyph unicode="&#xe615;" d="M448 352c-17.6 0-32-14.4-32-32s14.4-32 32-32 32 14.4 32 32-14.4 32-32 32zM656 512v144c0 114.8-93.2 208-208 208-115 0-208-93.2-208-208v-144h-112v-480h640v480h-112zM464 258v-82c0-8.8-7.2-16-16-16s-16 7.2-16 16v82c-27.6 7.2-48 32.2-48 62 0 35.4 28.6 64 64 64s64-28.6 64-64c0-29.8-20.4-54.8-48-62zM624 512h-352v144c0 97 79 176 176 176s176-79 176-176v-144z" horiz-adv-x="896" />
<glyph unicode="&#xe616;" d="M359.545 559.525c-3.994-5.364-5.983-12.063-5.983-20.109 0-11.323 3.744-20.185 11.244-26.586 7.201-6.163 16.565-10.854 28.048-14.121v79.842c-6.603-1.363-12.7-3.438-18.239-6.294-6.062-3.129-11.086-7.372-15.073-12.733zM471.301 425.47c-7.255 2.494-15.236 4.901-23.913 7.239v-93.475c4.823 0.697 9.297 1.657 13.378 2.905 9.248 2.829 16.749 6.479 22.493 10.946s9.888 9.607 12.441 15.417c2.553 5.808 3.826 11.689 3.826 17.654 0 12.212-2.955 21.223-8.85 27.034-5.906 5.804-12.372 9.895-19.377 12.282zM416.101 842.128c-218.017 0-394.756-176.739-394.756-394.756s176.739-394.756 394.756-394.756c218.017 0 394.756 176.739 394.756 394.756s-176.739 394.756-394.756 394.756v0zM547.626 346.591c-7.822-12.669-18.109-23.029-30.869-31.072-12.763-8.043-27.276-13.956-43.547-17.676-8.517-1.952-17.127-3.39-25.822-4.34v-27.956h-54.53v28.569c-8.385 1.081-16.542 2.615-24.453 4.669-17.232 4.467-32.237 11.083-44.991 20.322-12.766 9.232-22.973 20.61-30.627 35.060-7.332 13.818-11.293 32.556-11.9 47.703h59.786c0.292-9.089 2.51-19.788 6.667-27.822 4.464-8.643 10.682-14.794 18.663-20.299 7.792-5.392 16.756-9.335 26.849-11.872v104.083c-7.379 1.821-15.196 3.771-23.502 5.872-14.681 3.577-26.88 8.266-36.61 14.074-9.738 5.81-17.469 12.29-23.209 19.44-5.745 7.147-9.81 14.743-12.202 22.788-2.395 8.048-3.591 16.233-3.591 24.578 0 16.086 3.591 30.007 10.773 41.779 7.173 11.764 16.665 21.521 28.47 29.271 11.799 7.744 25.202 13.475 40.198 17.203 6.527 1.618 13.085 2.863 19.673 3.782v28.563h54.53v-28.775c7.452-1.070 14.71-2.538 21.749-4.462 15.801-4.324 29.678-10.793 41.635-19.429 11.965-8.647 21.458-19.28 28.478-31.937 6.387-11.545 9.867-24.453 10.434-39.6h-60.182c-2.281 18.175-9.618 31.282-22.035 39.148-5.956 3.778-12.683 6.655-20.081 8.746v-91.995c7.841-1.935 15.6-3.842 23.186-5.69 10.364-2.535 17.782-4.402 22.254-5.585 11.167-3.282 20.893-7.75 29.194-13.404 8.291-5.663 15.233-12.142 20.821-19.44 5.577-7.305 9.724-15.124 12.442-23.46 2.706-8.339 4.069-16.693 4.069-25.029 0.005-17.87-3.911-33.146-11.723-45.804v0z" horiz-adv-x="831" />
<glyph unicode="&#xe617;" d="M107.021 461.639l225.898-99.523 456.058 426.862zM788.979 788.979l-422.174-459.681 110.604-222.275z" horiz-adv-x="896" />
<glyph unicode="&#xe618;" d="M704.413 285.316c23.329-8.052-23.123 8.052 0 0v0zM704.413 285.316c-27.871 9.703-58.013 10.323-85.884 20.026-8.465 2.89-25.187 6.4-28.697 16.103-3.303 9.497-3.303 20.645-3.923 30.555-0.413 7.845-0.619 15.69-0.619 23.535 0 5.161 13.213 16.103 16.103 20.852 11.148 18.581 12.181 43.561 14.245 64.619 17.961-4.955 20.232 28.284 23.329 38.4 2.271 7.019 16.103 55.329-5.368 48.723 5.161 9.084 7.226 20.232 8.671 30.348 4.129 26.426 5.781 55.329-2.271 81.135-16.723 53.677-68.129 83.819-122.426 85.471-55.123 1.858-110.452-24.568-131.097-78.039-9.91-26.013-9.084-54.297-5.781-81.548 1.445-12.387 3.51-26.219 9.703-37.368-20.026 5.987-9.29-36.542-7.019-43.974 3.303-10.529 6.194-48.31 24.981-43.148 1.652-16.723 3.51-33.858 8.052-50.168 3.097-10.942 9.497-20.232 16.929-28.697 3.716-4.129 5.574-4.542 5.368-9.91-0.206-16.103 0.206-33.445-3.923-49.135s-38.606-22.297-52.439-25.187c-37.161-7.639-71.432-11.148-102.4-34.271-36.129-26.632-54.916-68.129-54.916-112.929 171.974 0 343.948 0 515.923 0 19.406 0 38.606 0 58.013 0 0 60.903-36.748 114.581-94.555 134.606zM279.329 310.71c1.239 0.619 2.477 1.239 3.303 1.652-0.619-0.206-1.239-0.619-1.652-0.826-0.619-0.206-1.032-0.413-1.652-0.826zM279.329 310.71c-7.019-3.51-15.484-7.845 1.652 0.826 6.194 3.097 4.955 2.477 1.652 0.826 14.039 6.606 29.11 8.258 44.181 9.703 5.781 0.619 8.465 4.542 4.129 10.116-8.258 10.529-36.748 12.594-48.723 17.342-7.432 2.89-9.497 5.574-10.116 13.832-0.206 3.716-2.271 20.232 0.619 22.916 2.065 2.065 15.071 1.239 17.961 1.652 11.768 1.445 23.742 3.923 34.89 8.258 4.748 1.858 9.29 4.129 13.419 7.019 4.955 3.716-3.716 12.8-5.987 17.755-7.019 15.484-10.116 32.413-11.148 49.342-2.065 33.239 3.097 66.684-3.097 99.716-9.29 50.581-48.31 75.974-98.065 75.974-30.761 0-61.11-10.529-78.245-37.368-18.994-29.523-17.961-66.271-16.929-99.923 0.619-19.2 1.445-38.606-1.239-57.806-1.239-8.258-3.097-16.31-5.987-24.155-2.271-5.987-13.832-20.852-9.29-23.948 17.135-12.181 46.039-16.31 66.684-14.658 0.619-10.116 2.477-23.123-1.239-32.619-5.781-14.865-48.929-18.787-61.935-23.123-36.129-11.974-62.968-41.29-62.968-82.581 37.781 0 75.355 0 113.135 0 16.929 0 33.858 0 50.994 0 2.684 0 13.006 19.2 15.897 22.297 14.039 15.484 31.174 28.903 49.755 38.606zM911.071 332.594c-16.723 5.368-48.929 7.019-60.903 21.471-5.987 7.226-2.684 25.6-2.065 34.271 9.084-0.826 18.994 0.619 28.284 1.858 8.465 1.239 16.723 2.89 24.774 5.781 3.716 1.445 7.432 2.89 10.942 4.955 8.052 4.748 4.335 5.574 0.206 12.594-22.503 37.781-12.387 85.677-13.419 127.174-0.826 34.477-9.91 72.258-41.29 91.665-28.284 17.548-70.194 18.168-100.542 5.781-87.535-35.097-35.923-151.123-65.858-217.6-5.161-11.148-12.594-15.071 0.413-21.677 7.226-3.716 15.071-6.194 22.916-8.052 11.974-2.89 24.361-4.542 36.748-4.955 2.065 0 0.619-26.013 0-28.697-2.271-10.116-24.361-13.006-32.619-15.277-8.465-2.271-22.503-2.89-26.632-11.768-6.194-13.213 20.439-9.91 27.045-11.148 21.265-3.923 40.052-15.69 56.568-29.11 12.387-10.116 29.11-23.742 33.652-40.258 55.123 0 110.452 0 165.574 0-0.413 41.497-27.458 71.019-63.794 82.994z" />
<glyph unicode="&#xe619;" d="M676.669 218.053c-27.491 9.803-66.917 13.213-92.064 18.754-14.492 3.197-35.589 11.295-42.622 19.607-7.033 8.524-2.771 87.163-2.771 87.163s13 20.458 20.032 38.36 14.705 66.917 14.705 66.917 14.492 0 19.607 25.361c5.541 27.705 14.066 39.212 13 59.884-1.065 19.18-11.081 20.246-12.148 20.246v0c0 0 10.442 28.983 11.934 90.359 1.705 72.671-53.917 144.277-158.342 144.277s-159.834-71.392-158.342-144.063c1.279-61.163 11.934-90.359 11.934-90.359v0c-1.065 0-11.081-1.065-12.148-20.246-1.065-20.672 7.672-31.753 13-59.458 5.115-25.361 19.607-25.573 19.607-25.573s7.672-49.228 14.705-67.13c7.033-18.114 20.032-38.36 20.032-38.36s4.262-78.638-2.771-87.163c-7.033-8.524-28.131-16.41-42.622-19.607-25.361-5.541-64.573-9.163-92.064-18.967s-112.31-42.836-112.31-111.031h681.956c0 68.196-84.819 101.228-112.31 111.031z" horiz-adv-x="896" />
<glyph unicode="&#xe61a;" d="M384 640c0-35.346-28.654-64-64-64s-64 28.654-64 64c0 35.346 28.654 64 64 64s64-28.654 64-64zM877.6 381.2l-408 427.6c-15.2 15.2-35.2 23-55 23.2h-223c-35.2 0-63.6-28.4-63.6-63.6v-216.2c0-21.6 8.6-41 22.6-55.4l428-414.4c12.2-12.2 28.6-18.4 45-18.4 16.2 0 32.6 6 45 18.4l209 208.8c12.4 12.4 18.4 28.6 18.4 45s-6.2 32.8-18.4 45zM320 544c-53 0-96 43-96 96s43 96 96 96 96-43 96-96-43-96-96-96z" />
<glyph unicode="&#xe61b;" d="M928 832v-274.754l-473.694-532.206 25.694-25.040 480 544v288zM576 896l-512-576 320-320 46.942 47.808 22.696 22.75 442.362 505.442v320h-320zM704 640c-35.29 0-64 28.71-64 64s28.71 64 64 64 64-28.71 64-64-28.71-64-64-64zM736 704c0-17.673-14.327-32-32-32s-32 14.327-32 32c0 17.673 14.327 32 32 32s32-14.327 32-32z" />
<glyph unicode="&#xe61c;" d="M963.318 194.875c0 253.125-225 196.875-225 393.75 0 16.313-1.571 30.252-4.437 42.125-14.792 99.332-80.996 179.051-166.792 203.344 0.761 3.47 1.161 7.059 1.161 10.732 0 29.248-25.313 53.176-56.25 53.176s-56.25-23.927-56.25-53.174c0-3.674 0.401-7.264 1.16-10.732-96.214-27.245-167.796-124.188-169.852-240.33-0.036-1.688-0.058-3.397-0.058-5.138 0-196.877-225-140.627-225-393.752 0-66.996 149.933-123.043 350.657-137.18 18.918-35.512 56.3-59.695 99.343-59.695s80.427 24.184 99.343 59.695c200.724 14.137 350.657 70.184 350.657 137.18 0 0.201-0.023 0.401-0.024 0.599l1.343-0.599zM788.193 147.33c-47.663-12.718-103.85-21.863-164.152-26.936-5.013 57.496-53.246 102.607-112.042 102.607s-107.028-45.111-112.042-102.607c-60.3 5.073-116.488 14.219-164.152 26.936-65.593 17.502-96.952 37.081-108.428 47.545 11.477 10.464 42.836 30.043 108.428 47.545 76.265 20.348 174.351 31.556 276.193 31.556s199.928-11.208 276.193-31.556c65.593-17.502 96.952-37.081 108.428-47.545-11.477-10.464-42.836-30.043-108.428-47.545z" />
<glyph unicode="&#xe61d;" d="M916.517 195.965l-379.483 325.272c17.672 33.204 27.7 71.093 27.7 111.332 0 131.060-106.245 237.305-237.305 237.305-23.973 0-47.108-3.569-68.922-10.179l137.102-137.102c20.509-20.509 20.509-54.069 0-74.578l-83.625-83.625c-20.509-20.509-54.069-20.509-74.578 0l-137.102 137.102c-6.61-21.814-10.179-44.95-10.179-68.922 0-131.060 106.245-237.305 237.305-237.305 40.238 0 78.127 10.028 111.332 27.702l325.272-379.483c18.876-22.020 51.099-23.258 71.607-2.75l83.627 83.627c20.507 20.508 19.269 52.729-2.75 71.605z" />
<glyph unicode="&#xe61e;" d="M849.5 448h-140.625l-196.875-196.875-196.875 196.875h-140.625l-112.5-225v-56.25h900v56.25l-112.5 225zM62 110.5h900v-56.25h-900v56.25zM568.25 616.75v225h-112.5v-225h-196.875l253.125-253.125 253.125 253.125h-196.875z" />
<glyph unicode="&#xe61f;" d="M62 110.5h900v-56.25h-900zM962 223v-56.25h-900v56.25l112.5 225h225v-112.5h225v112.5h225zM258.875 616.75l253.125 253.125 253.125-253.125h-196.875v-225h-112.5v225z" />
<glyph unicode="&#xe620;" d="M905.75 448c0-217.463-176.287-393.75-393.75-393.75s-393.75 176.287-393.75 393.75c0 95.85 34.481 183.459 91.406 251.719 4.331 7.987 10.35 14.934 17.859 19.969 1.266 1.322 2.391 2.813 3.684 4.106 0.028-0.647 0.309-1.266 0.366-1.913 8.128 4.556 17.353 7.369 27.309 7.369 31.050 0 56.25-25.2 56.25-56.25 0-19.575-9.984-36.788-25.172-46.856 0.984-0.731 1.688-1.631 2.7-2.362-38.672-48.15-61.903-109.209-61.903-175.781 0-155.334 125.916-281.25 281.25-281.25s281.25 125.916 281.25 281.25c0 66.572-23.231 127.631-61.903 175.781 1.013 0.731 1.744 1.631 2.7 2.362-15.188 10.069-25.172 27.281-25.172 46.856 0 31.050 25.2 56.25 56.25 56.25 9.956 0 19.181-2.813 27.309-7.369 0.056 0.647 0.337 1.266 0.394 1.912 1.266-1.294 2.391-2.784 3.684-4.106 7.509-5.034 13.5-11.981 17.859-19.969 56.869-68.259 91.378-155.869 91.378-251.719zM540.125 391.75h-56.25c-15.553 0-28.125 12.572-28.125 28.125v393.75c0 15.525 12.572 28.125 28.125 28.125h56.25c15.553 0 28.125-12.6 28.125-28.125v-393.75c0-15.553-12.572-28.125-28.125-28.125z" />
<glyph unicode="&#xe621;" d="M732.507 772.487h-622.859c-43.309 0-78.415-24.928-78.415-55.681v-538.232c0-30.751 35.107-55.682 78.415-55.682h622.859c43.307 0 78.416 24.931 78.416 55.682v538.232c0 30.753-35.108 55.681-78.416 55.681v0zM204.714 370.927h296.789v-41.417h-296.789v41.417zM204.714 465.646h454.657v-41.417h-454.657v41.417zM204.714 560.367h454.657v-41.417h-454.657v41.417z" horiz-adv-x="842" />
<glyph unicode="&#xe622;" d="M974.43 671.263h-17.742v104.383c0 24.103-19.539 43.643-43.645 43.643h-701.727c-24.104 0-43.645-19.539-43.645-43.643v-558.921c0-0.852 0.079-1.68 0.129-2.52-0.065-0.804-0.129-1.606-0.129-2.427v-100.461c0-19.666 15.941-35.608 35.608-35.608h669.771c19.665 0 35.606 15.941 35.606 35.608v31.445h-656.747c-8.273 0-14.977 6.705-14.977 14.977s6.705 14.977 14.977 14.977l661.131 0.363c24.104 0 43.645 19.537 43.645 43.644v68.961h6.393c49.225 0 89.271 40.047 89.271 89.271v218.382c0 42.965-34.955 77.92-77.923 77.92v0zM302.319 268.944c0-5.916-4.796-10.711-10.711-10.711s-10.711 4.793-10.711 10.711v482.019c0 5.913 4.796 10.711 10.711 10.711s10.711-4.796 10.711-10.711v-482.019zM1011.653 374.959c0-26.781-21.789-48.572-48.572-48.572h-6.393v51.273c0 23.366-18.943 42.309-42.309 42.309h-149.381c-46.556 0-84.299 37.743-84.299 84.299v42.042c0 46.556 37.743 84.299 84.299 84.299l209.432-0.046c20.525 0 37.223-16.697 37.223-37.221v-218.382z" horiz-adv-x="1218" />
<glyph unicode="&#xe623;" d="M825.441 494.573l-32.207 121.065c-0.048 1.094-0.157 2.169-0.288 3.236v43.967c0 14.829-7.431 27.95-18.754 35.865v35.201c0 14.79-7.673 27.809-19.23 35.333v30.457c0 23.248-18.914 42.164-42.161 42.164h-489.073c-23.248 0-42.164-18.914-42.164-42.164v-30.253c-11.738-7.495-19.557-20.604-19.557-35.534v-33.671c-12.626-7.676-21.076-21.562-21.076-37.389v-34.732l-34.334-133.535c-0.205-1.21-0.336-2.446-0.336-3.713v-414.179c0-12.258 10.031-22.285 22.285-22.285h674.942c12.257 0 22.285 10.029 22.285 22.285v414.179c0 1.267-0.133 2.505-0.336 3.713v0zM221.319 799.687c0 1.282 1.127 2.414 2.411 2.414h489.073c1.282 0 2.411-1.127 2.411-2.414v-23.625h-493.893v23.625zM201.757 733.899c0 1.287 1.127 2.414 2.414 2.414h527.858c1.286 0 2.411-1.127 2.411-2.414v-27.339h-532.685v27.339zM690.197 391.773c0-17.721-14.497-32.221-32.221-32.221h-383.914c-17.721 0-32.221 14.501-32.221 32.221s14.501 32.218 32.221 32.218h383.914c17.723 0 32.221-14.497 32.221-32.218v0zM179.745 667.202h573.732v-159.040h-573.732v159.040z" horiz-adv-x="934" />
<glyph unicode="&#xe624;" d="M449.248 577.472v318.528l-449.248-448 449.248-448v321.344c228.32 0 453.664-39.744 574.752-228.352-12.608 343.712-269.76 425.536-574.752 484.48z" />
<glyph unicode="&#xe625;" d="M680.75 729.25h-337.5l-281.25-337.5v-225.001c0-31.066 25.184-56.25 56.25-56.25h787.5c31.068 0 56.25 25.184 56.25 56.25v225.001l-281.25 337.5zM737.001 391.75l-112.5-112.5h-225.001l-112.5 112.5h-151.778l234.374 281.25h284.807l234.374-281.25h-151.778z" />
<glyph unicode="&#xe626;" d="M362.451 188.385v380.769q0 7.572-4.868 12.44t-12.44 4.868h-34.614q-7.572 0-12.44-4.868t-4.868-12.44v-380.769q0-7.572 4.868-12.44t12.44-4.868h34.614q7.572 0 12.44 4.868t4.868 12.44zM500.913 188.385v380.769q0 7.572-4.868 12.44t-12.44 4.868h-34.615q-7.572 0-12.44-4.868t-4.868-12.44v-380.769q0-7.572 4.868-12.44t12.44-4.868h34.615q7.572 0 12.44 4.868t4.868 12.44zM639.374 188.385v380.769q0 7.572-4.868 12.44t-12.44 4.868h-34.615q-7.572 0-12.44-4.868t-4.868-12.44v-380.769q0-7.572 4.868-12.44t12.44-4.868h34.615q7.572 0 12.44 4.868t4.868 12.44zM345.143 724.923h242.307l-25.962 63.281q-3.787 4.868-9.194 5.95h-171.455q-5.408-1.082-9.194-5.95zM847.067 707.615v-34.615q0-7.572-4.868-12.44t-12.44-4.868h-51.923v-512.739q0-44.892-25.42-77.615t-61.117-32.722h-450q-35.697 0-61.117 31.641t-25.42 76.533v514.904h-51.923q-7.572 0-12.44 4.868t-4.868 12.44v34.615q0 7.572 4.868 12.44t12.44 4.868h167.126l37.861 90.325q8.112 20.012 29.207 34.074t42.728 14.063h173.077q21.635 0 42.728-14.063t29.207-34.074l37.861-90.325h167.126q7.572 0 12.44-4.868t4.868-12.44z" horiz-adv-x="933" />
<glyph unicode="&#xe627;" d="M1024 448c0-282.77-229.23-512-512-512s-512 229.23-512 512c0 282.77 229.23 512 512 512s512-229.23 512-512z" />
<glyph unicode="&#xe628;" d="M921.6 819.2h-489.165c-22.528 0-54.835-12.134-71.782-26.982l-347.955-304.435c-16.947-14.848-16.947-39.117 0-53.965l347.955-304.486c16.947-14.797 49.254-26.931 71.782-26.931h489.165c56.371 0 102.4 46.080 102.4 102.4v512c0 56.32-46.029 102.4-102.4 102.4zM777.779 256l-130.918 130.918-130.816-130.918-73.933 73.882 130.867 130.918-130.867 130.867 73.933 73.933 130.867-130.867 130.867 130.867 73.882-73.933-130.816-130.867 130.867-130.867-73.933-73.933z" />
<glyph unicode="&#xe629;" d="M536.381-88.381c-297.448 0-536.381 238.933-536.381 536.381s238.933 536.381 536.381 536.381 536.381-238.933 536.381-536.381c0-297.448-238.933-536.381-536.381-536.381zM536.381 935.619c-268.19 0-487.619-219.429-487.619-487.619s219.429-487.619 487.619-487.619c268.19 0 487.619 219.429 487.619 487.619s-219.429 487.619-487.619 487.619z" horiz-adv-x="1073" />
<glyph unicode="&#xe62a;" d="M102.030 745.532v-182.209h91.103v182.209h182.209v91.103h-182.209c-50.108 0-91.103-40.997-91.103-91.103v0zM193.135 290.010h-91.103v-182.209c0-50.108 40.997-91.104 91.103-91.104h182.209v91.104h-182.209v182.209zM830.865 107.802h-182.209v-91.103h182.209c50.108 0 91.103 40.997 91.103 91.103v182.209h-91.103v-182.209zM830.865 836.637h-182.209v-91.103h182.209v-182.209h91.103v182.209c0 50.108-40.997 91.103-91.103 91.103v0zM607.66 413.002h-81.995v-81.995h-27.331v81.995h-81.995v27.331h81.995v81.995h27.331v-81.995h81.995v-27.331z" horiz-adv-x="1013" />
<glyph unicode="&#xe62b;" d="M512 896c-247.4 0-448-200.6-448-448s200.6-448 448-448c247.4 0 448 200.6 448 448s-200.6 448-448 448zM741.8 597.8l-278.2-357c-2.2-2.2-5.8-7-10.2-7-4.6 0-7.6 3.2-10.2 5.8s-157.8 151.8-157.8 151.8l-3 3c-1.2 1.8-2.2 4-2.2 6.4s1 4.6 2.2 6.4c0.8 0.8 1.4 1.4 2.2 2.4 15.4 16.2 46.6 49 48.6 51 2.6 2.6 4.8 6 9.6 6 5 0 8.2-4.2 10.6-6.6s90-86.6 90-86.6l222.6 286c2 1.6 4.4 2.8 7 2.8s5-1 7-2.6l61.2-48.2c1.6-2 2.6-4.4 2.6-7 0.2-2.6-0.8-4.8-2-6.6z" />
<glyph unicode="&#xe62c;" d="M512 896c-247.4 0-448-200.6-448-448s200.6-448 448-448 448 200.6 448 448-200.6 448-448 448zM768 416h-512v64h512v-64z" />
<glyph unicode="&#xe62d;" d="M512 896c-247.4 0-448-200.6-448-448s200.6-448 448-448 448 200.6 448 448-200.6 448-448 448zM768 416h-224v-224h-64v224h-224v64h224v224h64v-224h224v-64z" />
<glyph unicode="&#xe62e;" d="M512 894c-247.4 0-448-200.6-448-448s200.6-448 448-448c247.4 0 448 200.6 448 448s-200.6 448-448 448zM728.6 295c3-3 4.6-7 4.6-11.2s-1.6-8.4-4.6-11.2l-43.2-43.4c-3.2-3.2-7.2-4.6-11.2-4.6s-8.2 1.6-11.2 4.6l-151 151.2-150.8-151.4c-3-3.2-7.2-4.6-11.2-4.6s-8.2 1.6-11.2 4.6l-43.2 43.4c-3 3-4.6 7-4.6 11.2s1.6 8.4 4.6 11.2l151.4 152-151.8 150c-6.2 6.2-6.2 16.4 0 22.6l43.2 43.4c3 3 7 4.6 11.2 4.6s8.2-1.6 11.2-4.6l151.4-149.4 151.4 149.4c3 3 7 4.6 11.2 4.6s8.2-1.6 11.2-4.6l43.2-43.4c6.2-6.2 6.2-16.4 0-22.6l-151.8-150 151.2-151.8z" />
<glyph unicode="&#xe62f;" d="M990.208 279.347l-163.021 109.67h-100.506l174.080-133.53h-181.504c-5.222 0-9.882-2.662-12.288-6.81l-41.779-114.432h-306.381l-41.83 114.432c-2.304 4.147-7.066 6.81-12.288 6.81h-181.453l174.131 133.53h-100.557l-162.97-109.67c-24.269-14.49-38.758-47.923-32.256-74.189l28.723-157.389c6.502-26.317 35.379-47.872 64.051-47.872h835.226c28.774 0 57.6 21.555 64.102 47.872l28.723 157.389c6.605 26.317-7.936 59.699-32.205 74.189zM778.291 608.154h-169.011v262.144h-194.56v-262.144h-168.96l266.24-249.856 266.291 249.856z" />
<glyph unicode="&#x20;" horiz-adv-x="512" d="" />
<glyph unicode="&#xe600;" glyph-name="arrow-left" d="M716.749 696.32l0.051-471.040-409.6 235.52z" />
<glyph unicode="&#xe601;" glyph-name="arrow-down" d="M747.52 665.549l-471.040 0.051 235.52-409.6z" />
<glyph unicode="&#xe602;" glyph-name="arrow-up" d="M276.48 256h471.040l-235.571 409.6z" />
<glyph unicode="&#xe603;" glyph-name="arrow-right" d="M307.251 696.32l-0.051-471.040 409.6 235.52z" />
<glyph unicode="&#xe604;" glyph-name="arrow-left2" d="M585.574 741.581c-21.402-20.89-230.502-240.435-230.502-240.435-11.418-11.162-17.101-25.754-17.101-40.346s5.683-29.184 17.101-40.346c0 0 209.101-219.546 230.502-240.384 21.402-20.89 59.904-22.323 82.739 0 22.784 22.272 24.576 53.35-0.051 80.64l-191.846 200.090 191.846 200.090c24.627 27.341 22.835 58.419 0.051 80.691-22.886 22.272-61.389 20.89-82.739 0z" />
<glyph unicode="&#xe605;" glyph-name="arrow-down2" d="M792.73 534.374c-20.838-21.402-240.384-230.554-240.384-230.554-11.162-11.418-25.754-17.101-40.346-17.101-14.643 0-29.235 5.683-40.346 17.101 0 0-219.546 209.152-240.435 230.554-20.838 21.402-22.272 59.853 0 82.739 22.323 22.835 53.402 24.627 80.691 0l200.090-191.898 200.038 191.846c27.341 24.627 58.47 22.835 80.691 0 22.323-22.835 20.941-61.338 0-82.688z" />
<glyph unicode="&#xe606;" glyph-name="arrow-up2" d="M792.73 387.226c-20.838 21.402-240.384 230.502-240.384 230.502-11.162 11.418-25.754 17.152-40.346 17.152-14.643 0-29.235-5.734-40.346-17.152 0 0-219.546-209.101-240.435-230.502-20.838-21.402-22.272-59.904 0-82.739 22.323-22.784 53.402-24.627 80.691 0l200.090 191.846 200.038-191.846c27.341-24.627 58.47-22.784 80.691 0 22.323 22.886 20.941 61.389 0 82.739z" />
<glyph unicode="&#xe607;" glyph-name="arrow-right2" d="M438.426 741.581c21.402-20.89 230.502-240.435 230.502-240.435 11.469-11.162 17.152-25.754 17.152-40.346s-5.683-29.184-17.152-40.346c0 0-209.101-219.546-230.502-240.384-21.402-20.89-59.853-22.323-82.739 0-22.835 22.272-24.627 53.35 0 80.64l191.898 200.090-191.846 200.090c-24.627 27.341-22.835 58.419 0 80.691s61.338 20.89 82.688 0z" />
<glyph unicode="&#xe608;" glyph-name="arrow-left3" d="M634.829 285.798c13.722-13.875 13.722-36.301 0-50.125-13.722-13.875-35.891-13.875-49.613 0l-196.096 200.038c-13.722 13.875-13.722 36.301 0 50.125l196.096 200.090c13.722 13.875 35.891 13.875 49.613 0s13.722-36.25 0-50.125l-160.768-175.002 160.768-175.002z" />
<glyph unicode="&#xe609;" glyph-name="arrow-down3" d="M687.002 583.629c13.875 13.722 36.301 13.722 50.125 0 13.875-13.722 13.875-35.891 0-49.613l-200.038-196.096c-13.875-13.722-36.301-13.722-50.125 0l-200.090 196.096c-13.824 13.722-13.824 35.891 0 49.613 13.875 13.722 36.25 13.722 50.125 0l175.002-160.768 175.002 160.768z" />
<glyph unicode="&#xe60a;" glyph-name="arrow-up3" d="M336.947 337.971c-13.875-13.722-36.25-13.722-50.125 0-13.824 13.722-13.875 35.891 0 49.664l200.090 195.994c13.875 13.722 36.301 13.722 50.125 0l200.090-196.045c13.875-13.773 13.875-35.942 0-49.664s-36.25-13.722-50.125 0l-175.053 160.819-175.002-160.768z" />
<glyph unicode="&#xe60b;" glyph-name="arrow-right3" d="M389.171 285.798c-13.722-13.875-13.722-36.301 0-50.125 13.67-13.875 35.891-13.875 49.613 0l196.096 200.038c13.722 13.875 13.722 36.301 0 50.125l-196.096 200.090c-13.722 13.875-35.891 13.875-49.613 0s-13.722-36.25-0.051-50.074l160.819-175.053-160.768-175.002z" />
<glyph unicode="&#xe60c;" glyph-name="arrow-left4" d="M737.229 80.998c13.722-13.875 13.722-36.25 0-50.125s-35.891-13.875-49.613 0l-400.896 404.838c-13.722 13.875-13.722 36.301 0 50.125l400.896 404.89c13.722 13.875 35.891 13.875 49.613 0s13.722-36.25 0-50.125l-365.568-379.802 365.568-379.802z" />
<glyph unicode="&#xe60d;" glyph-name="arrow-down4" d="M132.198 686.029c-13.875 13.722-36.301 13.722-50.125 0-13.824-13.67-13.824-35.891 0-49.613l404.89-400.896c13.875-13.722 36.25-13.722 50.125 0l404.89 400.896c13.824 13.722 13.875 35.891 0 49.613s-36.352 13.722-50.125 0.051l-379.853-365.619-379.802 365.568z" />
<glyph unicode="&#xe60e;" glyph-name="arrow-up4" d="M891.802 235.571c13.875-13.722 36.301-13.722 50.125 0 13.875 13.722 13.875 35.891 0 49.613l-404.89 400.896c-13.824 13.722-36.25 13.722-50.074 0l-404.89-400.896c-13.824-13.722-13.875-35.891 0-49.613s36.25-13.722 50.125 0l379.802 365.619 379.802-365.619z" />
<glyph unicode="&#xe60f;" glyph-name="bitcoin" horiz-adv-x="831" d="M416.562 841.898c-217.791 0-394.343-176.553-394.343-394.345s176.553-394.345 394.343-394.345c217.793 0 394.348 176.555 394.348 394.345s-176.555 394.345-394.348 394.345zM562.313 427.171c-4.394 10.103-11.158 18.977-24.686 26.444-7.206 3.952-14.146 6.852-22.316 8.785 4.744 2.196 8.785 4.744 14.321 9.663 6.589 5.8 11.51 13.795 13.705 20.469 2.286 6.589 3.603 15.814 3.076 24.776-0.968 14.76-3.867 29.078-11.598 39.358s-18.625 18.187-33.031 23.723c-11.070 4.216-22.403 6.852-39.974 7.817v56.14h-35.144v-56.227h-28.114v56.227h-36.022v-56.227h-76.522v-42.171h24.515c7.643 0 12.824-0.703 15.461-2.021 2.724-1.316 4.658-3.073 5.712-5.27 1.143-2.196 1.67-7.38 1.67-15.375v-152.166c0-7.906-0.528-13.004-1.67-15.287-1.143-2.286-1.76-4.307-4.48-5.534-2.722-1.231-2.812-1.143-10.368-1.143h-23.195l-7.643-42.171h76.436v-56.227h36.022v56.227h28.114v-56.227h35.142v56.577c22.843 1.143 39.096 4.13 52.185 9.050 16.957 6.325 29.959 15.551 39.272 27.676s13.089 30.661 13.881 44.981c0.616 12.739-0.791 29.168-4.744 38.13v0zM398.463 540.678h28.114v-65.012h-28.114v65.012zM398.463 433.496h28.114v-79.069h-28.114v79.069zM461.718 537.252c5.27-2.196 8.697-6.589 12.124-11.157 3.777-5.007 5.71-11.685 5.71-18.802 0-6.852-2.548-12.739-6.589-18.010-3.339-4.304-5.976-7.292-11.244-9.751v57.72zM487.021 373.227c-6.852-6.061-10.808-8.874-19.416-12.124-1.76-0.703-4.13-1.23-5.886-1.668v72.742c4.394-0.703 6.678-1.58 9.925-2.987 6.854-2.899 13.354-6.061 17.396-11.596s7.028-13.705 7.028-21.7c0-9.577-2.461-16.867-9.050-22.667v0z" />
<glyph unicode="&#xe610;" glyph-name="compose" d="M416 416.6v-64.6h64.399l360.2 360-64.8 64.6zM888.401 799.4l-25 25c-5.4 4.8-12.401 7.601-20 7.601s-14.6-3-19.8-7.601l-24.2-24.399 0.2-0.2 22.4-22.6 42.001-42.001 24.401 24.399c4.8 5.201 7.599 12.2 7.599 19.8 0.2 7.599-2.799 14.6-7.599 20zM511 320h-127v127.2l256 256h-0.6l0.8 0.8h-480.2v-576h608v444.399l0.2 5z" />
<glyph unicode="&#xe611;" glyph-name="contact" d="M512 864c-229.8 0-416-186.2-416-416s186.2-416 416-416c229.8 0 416 186.2 416 416s-186.2 416-416 416zM512 66.6c-117.2 0-222.2 53.2-292.2 136.6 35.6 15.4 124.4 47.4 180.6 63.8 4.4 1.4 5.2 1.6 5.2 21.4 0 21.2-2.4 36.2-7.6 47.2-7 15-15.4 40.4-18.4 63.2-8.4 9.8-19.8 29-27.2 65.8-6.4 32.4-3.4 44.2 0.8 55.2 0.4 1.2 1 2.4 1.2 3.6 1.6 7.4-0.6 47-6.2 77.6-3.8 21 1 65.6 30 102.6 18.2 23.4 53.2 52 116 56h35c63.8-4 98.8-32.6 117-56 29-37 33.8-81.6 29.8-102.6-5.6-30.6-7.8-70-6.2-77.6 0.2-1.2 0.8-2.4 1.2-3.4 4.2-11 7.4-22.8 0.8-55.2-7.4-36.8-18.8-56-27.2-65.8-3-22.8-11.4-48-18.4-63.2-6.6-13.8-13.2-30.2-13.2-46.6 0-19.8 0.8-20 5.4-21.4 53.4-15.8 145.4-47.6 186-64.2-70-83.6-175-137-292.4-137z" />
<glyph unicode="&#xe612;" glyph-name="email" d="M896 192v484.4l-262.2-199.6 136.2-154.8-4-4-157.8 139.2-96.2-73.2-96.2 73.2-157.8-139.2-4 4 136 154.8-262 199.2v-484zM879.4 704h-735.4l368-279.8z" />
<glyph unicode="&#xe613;" glyph-name="gear" horiz-adv-x="960" d="M817 527h-30.4c-24.8 0-45.6 21.4-45.6 46.8 0 12.8 5.4 24.4 15 33l19.6 19.2c19.4 19.2 19.4 50.6 0 69.8l-44.6 44.2c-8.8 8.8-21.8 14-35 14s-26-5.2-35-14l-18.8-18.8c-9-10-21-15.4-34-15.4-25.6 0-47 20.8-47 45.4v30.6c0 27-21.8 50.2-49 50.2h-60.8c-27.2 0-48.8-23-48.8-50.2v-30.4c0-24.6-21.4-45.4-47-45.4-12.8 0-24.6 5.4-33.2 14.8l-19.4 19.2c-8.8 9-21.8 14-35 14s-26-5.2-35-14l-45-44c-19.2-19.2-19.2-50.6 0-69.6l18.8-18.8c10-9 15.6-21 15.6-33.8 0-25.6-20.8-46.8-45.6-46.8h-30.4c-27.4 0-50.4-21.4-50.4-48.6v-60.8c0-27 23-48.6 50.4-48.6h30.4c24.8 0 45.6-21.4 45.6-46.8 0-12.8-5.6-24.8-15.6-33.8l-18.8-18.6c-19.2-19.2-19.2-50.6 0-69.6l44.6-44.4c8.8-9 21.8-14 35-14s26 5.2 35 14l19.4 19.2c8.4 9.4 20.4 14.8 33.2 14.8 25.6 0 47-20.8 47-45.4v-30.4c0-27 21.6-50.2 49-50.2h60.8c27.2 0 48.8 23 48.8 50.2v30.4c0 24.6 21.4 45.4 47 45.4 12.8 0 24.8-5.6 34-15.4l18.8-18.8c9-8.8 21.8-14 35-14s26 5.2 35 14l44.6 44.4c19.2 19.2 19.2 50.6 0 69.8l-19.6 19.2c-9.6 8.6-15 20.4-15 33 0 25.6 20.8 46.8 45.6 46.8h30.4c27.2 0 46.6 21.4 46.6 48.6v61c0.4 27.2-19 48.6-46.2 48.6zM641.6 448v0c0-88.2-71.4-160-160-160s-160 71.8-160 160v0 0c0 88.2 71.4 160 160 160s160-71.8 160-160v0z" />
<glyph unicode="&#xe614;" glyph-name="home" horiz-adv-x="960" d="M480 736l-320-256v-416h224v256h192v-256h224v416l-320 256zM480 832l-192-153.6v89.6h-128v-191.998l-64-51.2v-40.982l384 307.2 384-307.2v40.982l-384 307.198z" />
<glyph unicode="&#xe615;" glyph-name="locked" horiz-adv-x="896" d="M448 352c-17.6 0-32-14.4-32-32s14.4-32 32-32 32 14.4 32 32-14.4 32-32 32zM656 512v144c0 114.8-93.2 208-208 208-115 0-208-93.2-208-208v-144h-112v-480h640v480h-112zM464 258v-82c0-8.8-7.2-16-16-16s-16 7.2-16 16v82c-27.6 7.2-48 32.2-48 62 0 35.4 28.6 64 64 64s64-28.6 64-64c0-29.8-20.4-54.8-48-62zM624 512h-352v144c0 97 79 176 176 176s176-79 176-176v-144z" />
<glyph unicode="&#xe616;" glyph-name="usd" horiz-adv-x="831" d="M359.545 559.525c-3.994-5.364-5.983-12.063-5.983-20.109 0-11.323 3.744-20.185 11.244-26.586 7.201-6.163 16.565-10.854 28.048-14.121v79.842c-6.603-1.363-12.7-3.438-18.239-6.294-6.062-3.129-11.086-7.372-15.073-12.733zM471.301 425.47c-7.255 2.494-15.236 4.901-23.913 7.239v-93.475c4.823 0.697 9.297 1.657 13.378 2.905 9.248 2.829 16.749 6.479 22.493 10.946s9.888 9.607 12.441 15.417c2.553 5.808 3.826 11.689 3.826 17.654 0 12.212-2.955 21.223-8.85 27.034-5.906 5.804-12.372 9.895-19.377 12.282zM416.101 842.128c-218.017 0-394.756-176.739-394.756-394.756s176.739-394.756 394.756-394.756c218.017 0 394.756 176.739 394.756 394.756s-176.739 394.756-394.756 394.756v0zM547.626 346.591c-7.822-12.669-18.109-23.029-30.869-31.072-12.763-8.043-27.276-13.956-43.547-17.676-8.517-1.952-17.127-3.39-25.822-4.34v-27.956h-54.53v28.569c-8.385 1.081-16.542 2.615-24.453 4.669-17.232 4.467-32.237 11.083-44.991 20.322-12.766 9.232-22.973 20.61-30.627 35.060-7.332 13.818-11.293 32.556-11.9 47.703h59.786c0.292-9.089 2.51-19.788 6.667-27.822 4.464-8.643 10.682-14.794 18.663-20.299 7.792-5.392 16.756-9.335 26.849-11.872v104.083c-7.379 1.821-15.196 3.771-23.502 5.872-14.681 3.577-26.88 8.266-36.61 14.074-9.738 5.81-17.469 12.29-23.209 19.44-5.745 7.147-9.81 14.743-12.202 22.788-2.395 8.048-3.591 16.233-3.591 24.578 0 16.086 3.591 30.007 10.773 41.779 7.173 11.764 16.665 21.521 28.47 29.271 11.799 7.744 25.202 13.475 40.198 17.203 6.527 1.618 13.085 2.863 19.673 3.782v28.563h54.53v-28.775c7.452-1.070 14.71-2.538 21.749-4.462 15.801-4.324 29.678-10.793 41.635-19.429 11.965-8.647 21.458-19.28 28.478-31.937 6.387-11.545 9.867-24.453 10.434-39.6h-60.182c-2.281 18.175-9.618 31.282-22.035 39.148-5.956 3.778-12.683 6.655-20.081 8.746v-91.995c7.841-1.935 15.6-3.842 23.186-5.69 10.364-2.535 17.782-4.402 22.254-5.585 11.167-3.282 20.893-7.75 29.194-13.404 8.291-5.663 15.233-12.142 20.821-19.44 5.577-7.305 9.724-15.124 12.442-23.46 2.706-8.339 4.069-16.693 4.069-25.029 0.005-17.87-3.911-33.146-11.723-45.804v0z" />
<glyph unicode="&#xe617;" glyph-name="paperplane" horiz-adv-x="896" d="M107.021 461.639l225.898-99.523 456.058 426.862zM788.979 788.979l-422.174-459.681 110.604-222.275z" />
<glyph unicode="&#xe618;" glyph-name="people" d="M704.413 285.316c23.329-8.052-23.123 8.052 0 0v0zM704.413 285.316c-27.871 9.703-58.013 10.323-85.884 20.026-8.465 2.89-25.187 6.4-28.697 16.103-3.303 9.497-3.303 20.645-3.923 30.555-0.413 7.845-0.619 15.69-0.619 23.535 0 5.161 13.213 16.103 16.103 20.852 11.148 18.581 12.181 43.561 14.245 64.619 17.961-4.955 20.232 28.284 23.329 38.4 2.271 7.019 16.103 55.329-5.368 48.723 5.161 9.084 7.226 20.232 8.671 30.348 4.129 26.426 5.781 55.329-2.271 81.135-16.723 53.677-68.129 83.819-122.426 85.471-55.123 1.858-110.452-24.568-131.097-78.039-9.91-26.013-9.084-54.297-5.781-81.548 1.445-12.387 3.51-26.219 9.703-37.368-20.026 5.987-9.29-36.542-7.019-43.974 3.303-10.529 6.194-48.31 24.981-43.148 1.652-16.723 3.51-33.858 8.052-50.168 3.097-10.942 9.497-20.232 16.929-28.697 3.716-4.129 5.574-4.542 5.368-9.91-0.206-16.103 0.206-33.445-3.923-49.135s-38.606-22.297-52.439-25.187c-37.161-7.639-71.432-11.148-102.4-34.271-36.129-26.632-54.916-68.129-54.916-112.929 171.974 0 343.948 0 515.923 0 19.406 0 38.606 0 58.013 0 0 60.903-36.748 114.581-94.555 134.606zM279.329 310.71c1.239 0.619 2.477 1.239 3.303 1.652-0.619-0.206-1.239-0.619-1.652-0.826-0.619-0.206-1.032-0.413-1.652-0.826zM279.329 310.71c-7.019-3.51-15.484-7.845 1.652 0.826 6.194 3.097 4.955 2.477 1.652 0.826 14.039 6.606 29.11 8.258 44.181 9.703 5.781 0.619 8.465 4.542 4.129 10.116-8.258 10.529-36.748 12.594-48.723 17.342-7.432 2.89-9.497 5.574-10.116 13.832-0.206 3.716-2.271 20.232 0.619 22.916 2.065 2.065 15.071 1.239 17.961 1.652 11.768 1.445 23.742 3.923 34.89 8.258 4.748 1.858 9.29 4.129 13.419 7.019 4.955 3.716-3.716 12.8-5.987 17.755-7.019 15.484-10.116 32.413-11.148 49.342-2.065 33.239 3.097 66.684-3.097 99.716-9.29 50.581-48.31 75.974-98.065 75.974-30.761 0-61.11-10.529-78.245-37.368-18.994-29.523-17.961-66.271-16.929-99.923 0.619-19.2 1.445-38.606-1.239-57.806-1.239-8.258-3.097-16.31-5.987-24.155-2.271-5.987-13.832-20.852-9.29-23.948 17.135-12.181 46.039-16.31 66.684-14.658 0.619-10.116 2.477-23.123-1.239-32.619-5.781-14.865-48.929-18.787-61.935-23.123-36.129-11.974-62.968-41.29-62.968-82.581 37.781 0 75.355 0 113.135 0 16.929 0 33.858 0 50.994 0 2.684 0 13.006 19.2 15.897 22.297 14.039 15.484 31.174 28.903 49.755 38.606zM911.071 332.594c-16.723 5.368-48.929 7.019-60.903 21.471-5.987 7.226-2.684 25.6-2.065 34.271 9.084-0.826 18.994 0.619 28.284 1.858 8.465 1.239 16.723 2.89 24.774 5.781 3.716 1.445 7.432 2.89 10.942 4.955 8.052 4.748 4.335 5.574 0.206 12.594-22.503 37.781-12.387 85.677-13.419 127.174-0.826 34.477-9.91 72.258-41.29 91.665-28.284 17.548-70.194 18.168-100.542 5.781-87.535-35.097-35.923-151.123-65.858-217.6-5.161-11.148-12.594-15.071 0.413-21.677 7.226-3.716 15.071-6.194 22.916-8.052 11.974-2.89 24.361-4.542 36.748-4.955 2.065 0 0.619-26.013 0-28.697-2.271-10.116-24.361-13.006-32.619-15.277-8.465-2.271-22.503-2.89-26.632-11.768-6.194-13.213 20.439-9.91 27.045-11.148 21.265-3.923 40.052-15.69 56.568-29.11 12.387-10.116 29.11-23.742 33.652-40.258 55.123 0 110.452 0 165.574 0-0.413 41.497-27.458 71.019-63.794 82.994z" />
<glyph unicode="&#xe619;" glyph-name="person" horiz-adv-x="896" d="M676.669 218.053c-27.491 9.803-66.917 13.213-92.064 18.754-14.492 3.197-35.589 11.295-42.622 19.607-7.033 8.524-2.771 87.163-2.771 87.163s13 20.458 20.032 38.36 14.705 66.917 14.705 66.917 14.492 0 19.607 25.361c5.541 27.705 14.066 39.212 13 59.884-1.065 19.18-11.081 20.246-12.148 20.246v0c0 0 10.442 28.983 11.934 90.359 1.705 72.671-53.917 144.277-158.342 144.277s-159.834-71.392-158.342-144.063c1.279-61.163 11.934-90.359 11.934-90.359v0c-1.065 0-11.081-1.065-12.148-20.246-1.065-20.672 7.672-31.753 13-59.458 5.115-25.361 19.607-25.573 19.607-25.573s7.672-49.228 14.705-67.13c7.033-18.114 20.032-38.36 20.032-38.36s4.262-78.638-2.771-87.163c-7.033-8.524-28.131-16.41-42.622-19.607-25.361-5.541-64.573-9.163-92.064-18.967s-112.31-42.836-112.31-111.031h681.956c0 68.196-84.819 101.228-112.31 111.031z" />
<glyph unicode="&#xe61a;" glyph-name="pricetag" d="M384 640c0-35.346-28.654-64-64-64s-64 28.654-64 64c0 35.346 28.654 64 64 64s64-28.654 64-64zM877.6 381.2l-408 427.6c-15.2 15.2-35.2 23-55 23.2h-223c-35.2 0-63.6-28.4-63.6-63.6v-216.2c0-21.6 8.6-41 22.6-55.4l428-414.4c12.2-12.2 28.6-18.4 45-18.4 16.2 0 32.6 6 45 18.4l209 208.8c12.4 12.4 18.4 28.6 18.4 45s-6.2 32.8-18.4 45zM320 544c-53 0-96 43-96 96s43 96 96 96 96-43 96-96-43-96-96-96z" />
<glyph unicode="&#xe61b;" glyph-name="pricetags" d="M928 832v-274.754l-473.694-532.206 25.694-25.040 480 544v288zM576 896l-512-576 320-320 46.942 47.808 22.696 22.75 442.362 505.442v320h-320zM704 640c-35.29 0-64 28.71-64 64s28.71 64 64 64 64-28.71 64-64-28.71-64-64-64zM736 704c0-17.673-14.327-32-32-32s-32 14.327-32 32c0 17.673 14.327 32 32 32s32-14.327 32-32z" />
<glyph unicode="&#xe61c;" glyph-name="bell" d="M963.318 194.875c0 253.125-225 196.875-225 393.75 0 16.313-1.571 30.252-4.437 42.125-14.792 99.332-80.996 179.051-166.792 203.344 0.761 3.47 1.161 7.059 1.161 10.732 0 29.248-25.313 53.176-56.25 53.176s-56.25-23.927-56.25-53.174c0-3.674 0.401-7.264 1.16-10.732-96.214-27.245-167.796-124.188-169.852-240.33-0.036-1.688-0.058-3.397-0.058-5.138 0-196.877-225-140.627-225-393.752 0-66.996 149.933-123.043 350.657-137.18 18.918-35.512 56.3-59.695 99.343-59.695s80.427 24.184 99.343 59.695c200.724 14.137 350.657 70.184 350.657 137.18 0 0.201-0.023 0.401-0.024 0.599l1.343-0.599zM788.193 147.33c-47.663-12.718-103.85-21.863-164.152-26.936-5.013 57.496-53.246 102.607-112.042 102.607s-107.028-45.111-112.042-102.607c-60.3 5.073-116.488 14.219-164.152 26.936-65.593 17.502-96.952 37.081-108.428 47.545 11.477 10.464 42.836 30.043 108.428 47.545 76.265 20.348 174.351 31.556 276.193 31.556s199.928-11.208 276.193-31.556c65.593-17.502 96.952-37.081 108.428-47.545-11.477-10.464-42.836-30.043-108.428-47.545z" />
<glyph unicode="&#xe61d;" glyph-name="wrench" d="M916.517 195.965l-379.483 325.272c17.672 33.204 27.7 71.093 27.7 111.332 0 131.060-106.245 237.305-237.305 237.305-23.973 0-47.108-3.569-68.922-10.179l137.102-137.102c20.509-20.509 20.509-54.069 0-74.578l-83.625-83.625c-20.509-20.509-54.069-20.509-74.578 0l-137.102 137.102c-6.61-21.814-10.179-44.95-10.179-68.922 0-131.060 106.245-237.305 237.305-237.305 40.238 0 78.127 10.028 111.332 27.702l325.272-379.483c18.876-22.020 51.099-23.258 71.607-2.75l83.627 83.627c20.507 20.508 19.269 52.729-2.75 71.605z" />
<glyph unicode="&#xe61e;" glyph-name="download" d="M849.5 448h-140.625l-196.875-196.875-196.875 196.875h-140.625l-112.5-225v-56.25h900v56.25l-112.5 225zM62 110.5h900v-56.25h-900v56.25zM568.25 616.75v225h-112.5v-225h-196.875l253.125-253.125 253.125 253.125h-196.875z" />
<glyph unicode="&#xe61f;" glyph-name="upload" d="M62 110.5h900v-56.25h-900zM962 223v-56.25h-900v56.25l112.5 225h225v-112.5h225v112.5h225zM258.875 616.75l253.125 253.125 253.125-253.125h-196.875v-225h-112.5v225z" />
<glyph unicode="&#xe620;" glyph-name="power" d="M905.75 448c0-217.463-176.287-393.75-393.75-393.75s-393.75 176.287-393.75 393.75c0 95.85 34.481 183.459 91.406 251.719 4.331 7.987 10.35 14.934 17.859 19.969 1.266 1.322 2.391 2.813 3.684 4.106 0.028-0.647 0.309-1.266 0.366-1.913 8.128 4.556 17.353 7.369 27.309 7.369 31.050 0 56.25-25.2 56.25-56.25 0-19.575-9.984-36.788-25.172-46.856 0.984-0.731 1.688-1.631 2.7-2.362-38.672-48.15-61.903-109.209-61.903-175.781 0-155.334 125.916-281.25 281.25-281.25s281.25 125.916 281.25 281.25c0 66.572-23.231 127.631-61.903 175.781 1.013 0.731 1.744 1.631 2.7 2.362-15.188 10.069-25.172 27.281-25.172 46.856 0 31.050 25.2 56.25 56.25 56.25 9.956 0 19.181-2.813 27.309-7.369 0.056 0.647 0.337 1.266 0.394 1.912 1.266-1.294 2.391-2.784 3.684-4.106 7.509-5.034 13.5-11.981 17.859-19.969 56.869-68.259 91.378-155.869 91.378-251.719zM540.125 391.75h-56.25c-15.553 0-28.125 12.572-28.125 28.125v393.75c0 15.525 12.572 28.125 28.125 28.125h56.25c15.553 0 28.125-12.6 28.125-28.125v-393.75c0-15.553-12.572-28.125-28.125-28.125z" />
<glyph unicode="&#xe621;" glyph-name="reference" horiz-adv-x="842" d="M732.507 772.487h-622.859c-43.309 0-78.415-24.928-78.415-55.681v-538.232c0-30.751 35.107-55.682 78.415-55.682h622.859c43.307 0 78.416 24.931 78.416 55.682v538.232c0 30.753-35.108 55.681-78.416 55.681v0zM204.714 370.927h296.789v-41.417h-296.789v41.417zM204.714 465.646h454.657v-41.417h-454.657v41.417zM204.714 560.367h454.657v-41.417h-454.657v41.417z" />
<glyph unicode="&#xe622;" glyph-name="wallet" horiz-adv-x="1218" d="M974.43 671.263h-17.742v104.383c0 24.103-19.539 43.643-43.645 43.643h-701.727c-24.104 0-43.645-19.539-43.645-43.643v-558.921c0-0.852 0.079-1.68 0.129-2.52-0.065-0.804-0.129-1.606-0.129-2.427v-100.461c0-19.666 15.941-35.608 35.608-35.608h669.771c19.665 0 35.606 15.941 35.606 35.608v31.445h-656.747c-8.273 0-14.977 6.705-14.977 14.977s6.705 14.977 14.977 14.977l661.131 0.363c24.104 0 43.645 19.537 43.645 43.644v68.961h6.393c49.225 0 89.271 40.047 89.271 89.271v218.382c0 42.965-34.955 77.92-77.923 77.92v0zM302.319 268.944c0-5.916-4.796-10.711-10.711-10.711s-10.711 4.793-10.711 10.711v482.019c0 5.913 4.796 10.711 10.711 10.711s10.711-4.796 10.711-10.711v-482.019zM1011.653 374.959c0-26.781-21.789-48.572-48.572-48.572h-6.393v51.273c0 23.366-18.943 42.309-42.309 42.309h-149.381c-46.556 0-84.299 37.743-84.299 84.299v42.042c0 46.556 37.743 84.299 84.299 84.299l209.432-0.046c20.525 0 37.223-16.697 37.223-37.221v-218.382z" />
<glyph unicode="&#xe623;" glyph-name="history" horiz-adv-x="934" d="M825.441 494.573l-32.207 121.065c-0.048 1.094-0.157 2.169-0.288 3.236v43.967c0 14.829-7.431 27.95-18.754 35.865v35.201c0 14.79-7.673 27.809-19.23 35.333v30.457c0 23.248-18.914 42.164-42.161 42.164h-489.073c-23.248 0-42.164-18.914-42.164-42.164v-30.253c-11.738-7.495-19.557-20.604-19.557-35.534v-33.671c-12.626-7.676-21.076-21.562-21.076-37.389v-34.732l-34.334-133.535c-0.205-1.21-0.336-2.446-0.336-3.713v-414.179c0-12.258 10.031-22.285 22.285-22.285h674.942c12.257 0 22.285 10.029 22.285 22.285v414.179c0 1.267-0.133 2.505-0.336 3.713v0zM221.319 799.687c0 1.282 1.127 2.414 2.411 2.414h489.073c1.282 0 2.411-1.127 2.411-2.414v-23.625h-493.893v23.625zM201.757 733.899c0 1.287 1.127 2.414 2.414 2.414h527.858c1.286 0 2.411-1.127 2.411-2.414v-27.339h-532.685v27.339zM690.197 391.773c0-17.721-14.497-32.221-32.221-32.221h-383.914c-17.721 0-32.221 14.501-32.221 32.221s14.501 32.218 32.221 32.218h383.914c17.723 0 32.221-14.497 32.221-32.218v0zM179.745 667.202h573.732v-159.040h-573.732v159.040z" />
<glyph unicode="&#xe624;" glyph-name="forward" d="M449.248 577.472v318.528l-449.248-448 449.248-448v321.344c228.32 0 453.664-39.744 574.752-228.352-12.608 343.712-269.76 425.536-574.752 484.48z" />
<glyph unicode="&#xe625;" glyph-name="receive" d="M680.75 729.25h-337.5l-281.25-337.5v-225.001c0-31.066 25.184-56.25 56.25-56.25h787.5c31.068 0 56.25 25.184 56.25 56.25v225.001l-281.25 337.5zM737.001 391.75l-112.5-112.5h-225.001l-112.5 112.5h-151.778l234.374 281.25h284.807l234.374-281.25h-151.778z" />
<glyph unicode="&#xe626;" glyph-name="trash" horiz-adv-x="933" d="M362.451 188.385v380.769q0 7.572-4.868 12.44t-12.44 4.868h-34.614q-7.572 0-12.44-4.868t-4.868-12.44v-380.769q0-7.572 4.868-12.44t12.44-4.868h34.614q7.572 0 12.44 4.868t4.868 12.44zM500.913 188.385v380.769q0 7.572-4.868 12.44t-12.44 4.868h-34.615q-7.572 0-12.44-4.868t-4.868-12.44v-380.769q0-7.572 4.868-12.44t12.44-4.868h34.615q7.572 0 12.44 4.868t4.868 12.44zM639.374 188.385v380.769q0 7.572-4.868 12.44t-12.44 4.868h-34.615q-7.572 0-12.44-4.868t-4.868-12.44v-380.769q0-7.572 4.868-12.44t12.44-4.868h34.615q7.572 0 12.44 4.868t4.868 12.44zM345.143 724.923h242.307l-25.962 63.281q-3.787 4.868-9.194 5.95h-171.455q-5.408-1.082-9.194-5.95zM847.067 707.615v-34.615q0-7.572-4.868-12.44t-12.44-4.868h-51.923v-512.739q0-44.892-25.42-77.615t-61.117-32.722h-450q-35.697 0-61.117 31.641t-25.42 76.533v514.904h-51.923q-7.572 0-12.44 4.868t-4.868 12.44v34.615q0 7.572 4.868 12.44t12.44 4.868h167.126l37.861 90.325q8.112 20.012 29.207 34.074t42.728 14.063h173.077q21.635 0 42.728-14.063t29.207-34.074l37.861-90.325h167.126q7.572 0 12.44-4.868t4.868-12.44z" />
<glyph unicode="&#xe627;" glyph-name="circle-active" d="M1024 448c0-282.77-229.23-512-512-512s-512 229.23-512 512c0 282.77 229.23 512 512 512s512-229.23 512-512z" />
<glyph unicode="&#xe628;" glyph-name="erase" d="M921.6 819.2h-489.165c-22.528 0-54.835-12.134-71.782-26.982l-347.955-304.435c-16.947-14.848-16.947-39.117 0-53.965l347.955-304.486c16.947-14.797 49.254-26.931 71.782-26.931h489.165c56.371 0 102.4 46.080 102.4 102.4v512c0 56.32-46.029 102.4-102.4 102.4zM777.779 256l-130.918 130.918-130.816-130.918-73.933 73.882 130.867 130.918-130.867 130.867 73.933 73.933 130.867-130.867 130.867 130.867 73.882-73.933-130.816-130.867 130.867-130.867-73.933-73.933z" />
<glyph unicode="&#xe629;" glyph-name="circle" horiz-adv-x="1073" d="M536.381-88.381c-297.448 0-536.381 238.933-536.381 536.381s238.933 536.381 536.381 536.381 536.381-238.933 536.381-536.381c0-297.448-238.933-536.381-536.381-536.381zM536.381 935.619c-268.19 0-487.619-219.429-487.619-487.619s219.429-487.619 487.619-487.619c268.19 0 487.619 219.429 487.619 487.619s-219.429 487.619-487.619 487.619z" />
<glyph unicode="&#xe62a;" glyph-name="scan" horiz-adv-x="1013" d="M102.030 745.532v-182.209h91.103v182.209h182.209v91.103h-182.209c-50.108 0-91.103-40.997-91.103-91.103v0zM193.135 290.010h-91.103v-182.209c0-50.108 40.997-91.104 91.103-91.104h182.209v91.104h-182.209v182.209zM830.865 107.802h-182.209v-91.103h182.209c50.108 0 91.103 40.997 91.103 91.103v182.209h-91.103v-182.209zM830.865 836.637h-182.209v-91.103h182.209v-182.209h91.103v182.209c0 50.108-40.997 91.103-91.103 91.103v0zM607.66 413.002h-81.995v-81.995h-27.331v81.995h-81.995v27.331h81.995v81.995h27.331v-81.995h81.995v-27.331z" />
<glyph unicode="&#xe62b;" glyph-name="checkmark-circle" d="M512 896c-247.4 0-448-200.6-448-448s200.6-448 448-448c247.4 0 448 200.6 448 448s-200.6 448-448 448zM741.8 597.8l-278.2-357c-2.2-2.2-5.8-7-10.2-7-4.6 0-7.6 3.2-10.2 5.8s-157.8 151.8-157.8 151.8l-3 3c-1.2 1.8-2.2 4-2.2 6.4s1 4.6 2.2 6.4c0.8 0.8 1.4 1.4 2.2 2.4 15.4 16.2 46.6 49 48.6 51 2.6 2.6 4.8 6 9.6 6 5 0 8.2-4.2 10.6-6.6s90-86.6 90-86.6l222.6 286c2 1.6 4.4 2.8 7 2.8s5-1 7-2.6l61.2-48.2c1.6-2 2.6-4.4 2.6-7 0.2-2.6-0.8-4.8-2-6.6z" />
<glyph unicode="&#xe62c;" glyph-name="minus-circle" d="M512 896c-247.4 0-448-200.6-448-448s200.6-448 448-448 448 200.6 448 448-200.6 448-448 448zM768 416h-512v64h512v-64z" />
<glyph unicode="&#xe62d;" glyph-name="plus-circle" d="M512 896c-247.4 0-448-200.6-448-448s200.6-448 448-448 448 200.6 448 448-200.6 448-448 448zM768 416h-224v-224h-64v224h-224v64h224v224h64v-224h224v-64z" />
<glyph unicode="&#xe62e;" glyph-name="close-circle" d="M512 894c-247.4 0-448-200.6-448-448s200.6-448 448-448c247.4 0 448 200.6 448 448s-200.6 448-448 448zM728.6 295c3-3 4.6-7 4.6-11.2s-1.6-8.4-4.6-11.2l-43.2-43.4c-3.2-3.2-7.2-4.6-11.2-4.6s-8.2 1.6-11.2 4.6l-151 151.2-150.8-151.4c-3-3.2-7.2-4.6-11.2-4.6s-8.2 1.6-11.2 4.6l-43.2 43.4c-3 3-4.6 7-4.6 11.2s1.6 8.4 4.6 11.2l151.4 152-151.8 150c-6.2 6.2-6.2 16.4 0 22.6l43.2 43.4c3 3 7 4.6 11.2 4.6s8.2-1.6 11.2-4.6l151.4-149.4 151.4 149.4c3 3 7 4.6 11.2 4.6s8.2-1.6 11.2-4.6l43.2-43.4c6.2-6.2 6.2-16.4 0-22.6l-151.8-150 151.2-151.8z" />
<glyph unicode="&#xe62f;" glyph-name="receive2" d="M990.208 279.347l-163.021 109.67h-100.506l174.080-133.53h-181.504c-5.222 0-9.882-2.662-12.288-6.81l-41.779-114.432h-306.381l-41.83 114.432c-2.304 4.147-7.066 6.81-12.288 6.81h-181.453l174.131 133.53h-100.557l-162.97-109.67c-24.269-14.49-38.758-47.923-32.256-74.189l28.723-157.389c6.502-26.317 35.379-47.872 64.051-47.872h835.226c28.774 0 57.6 21.555 64.102 47.872l28.723 157.389c6.605 26.317-7.936 59.699-32.205 74.189zM778.291 608.154h-169.011v262.144h-194.56v-262.144h-168.96l266.24-249.856 266.291 249.856z" />
<glyph unicode="&#xe630;" glyph-name="bank" horiz-adv-x="1077" d="M956.82 724.392h-0.037l-424.442 186.726-424.479-186.726v-108.561h848.959v108.561zM191.457 218.489c-12.592 0-22.798-10.203-22.798-22.798s10.203-22.798 22.798-22.798h134.618c12.592 0 22.798 10.203 22.798 22.798s-10.203 22.798-22.798 22.798h-7.597v325.689h7.597c12.592 0 22.798 10.203 22.798 22.798s-10.203 22.798-22.798 22.798h-134.618c-12.592 0-22.798-10.203-22.798-22.798s10.203-22.798 22.798-22.798h7.597v-325.689h-7.597zM465.031 218.489c-12.592 0-22.798-10.203-22.798-22.798s10.203-22.798 22.798-22.798h134.618c12.592 0 22.798 10.203 22.798 22.798s-10.203 22.798-22.798 22.798h-7.597v325.689h7.597c12.592 0 22.798 10.203 22.798 22.798s-10.203 22.798-22.798 22.798h-134.618c-12.592 0-22.798-10.203-22.798-22.798s10.203-22.798 22.798-22.798h7.597v-325.689h-7.597zM742.951 218.489c-12.592 0-22.798-10.203-22.798-22.798s10.203-22.798 22.798-22.798h134.618c12.592 0 22.798 10.203 22.798 22.798s-10.203 22.798-22.798 22.798h-7.597v325.689h7.597c12.592 0 22.798 10.203 22.798 22.798s-10.203 22.798-22.798 22.798h-134.618c-12.592 0-22.798-10.203-22.798-22.798s10.203-22.798 22.798-22.798h7.597v-325.689h-7.597zM107.885 125.129v-13.029c0-11.989 9.721-21.712 21.712-21.712h805.487c11.989 0 21.712 9.723 21.712 21.712v13.029c0 11.989-9.723 21.712-21.712 21.712h-805.487c-11.992 0-21.712-9.721-21.712-21.712zM991.56 64.331h-918.439c-11.992 0-21.712-9.723-21.712-21.712v-19.54c0-11.989 9.721-21.712 21.712-21.712h918.439c11.989 0 21.712 9.723 21.712 21.712v19.54c0 11.992-9.721 21.712-21.712 21.712z" />
<glyph unicode="&#xe631;" glyph-name="buy-btc" horiz-adv-x="1082" d="M386.16 450.906v-108.319c34.571 0 133.093-4.992 137.898 54.16 0.194 64.144-103.327 54.16-137.898 54.16zM499.471 549.434c0 59.152-83.739 49.361-113.311 49.361v-98.522c29.579 0 113.311-4.992 113.311 49.167zM568.614 308.022c-24.581-14.789-59.152-19.782-93.723-19.782v-78.934h-49.361v78.934c-14.789 0-24.581 0-39.37 0v-78.934h-49.361v78.934c-9.797 0-24.581 0-34.571 0h-64.144l9.797 59.152h34.571c14.789 0 19.782 9.797 19.782 14.789v216.832c0 9.797-9.797 19.782-29.579 19.782h-34.571v49.361h68.949c9.797 0 19.782 0 29.579 0v78.934h49.361v-78.934c14.789 0 24.581 0 39.37 0v78.934h49.361v-78.934c64.144-4.992 113.311-24.581 118.304-83.739 4.992-44.362-14.789-68.949-39.37-78.934 19.782-4.992 39.37-14.789 49.361-29.579 39.37 68.949 103.52 123.109 182.261 137.898 14.789 4.992 29.579 4.992 44.362 4.992-59.152 162.672-211.84 280.976-394.294 280.976-231.621 0-418.874-187.253-418.874-418.874s187.447-418.874 419.068-418.874c83.739 0 162.672 24.581 231.621 68.949-59.152 59.152-93.723 123.109-98.522 197.050zM844.598 549.434c-123.109 0-221.824-98.522-221.824-221.824s98.522-221.631 221.824-221.631 221.824 98.522 221.824 221.824-98.716 221.631-221.824 221.631zM908.555 219.291c9.797-9.797 9.797-24.581 0-34.571-4.992-4.992-9.797-4.992-19.782-4.992-9.797 0-14.789 0-19.782 4.992l-128.101 128.101c-9.797 9.797-9.797 24.581 0 34.571l128.101 128.101c14.789 4.992 29.579 4.992 39.37-4.992 9.797-9.797 9.797-24.581 0-34.571l-108.319-108.319 108.513-108.319z" />
<glyph unicode="&#xe632;" glyph-name="sell-btc" horiz-adv-x="1057" d="M373.040 450.906v-108.323c34.571 0 133.101-4.992 137.902 54.164 0.194 64.148-103.331 54.164-137.902 54.164zM486.357 549.438c0 59.156-83.743 49.361-113.319 49.361v-98.532c29.579 0 113.319-4.992 113.319 49.167zM555.5 308.014c-24.587-14.789-59.156-19.782-93.727-19.782v-78.938h-49.361v78.938c-14.789 0-24.587 0-39.374 0v-78.938h-49.361v78.938c-9.797 0-24.587 0-34.571 0h-64.148l9.797 59.156h34.571c14.789 0 19.782 9.797 19.782 14.789v216.84c0 9.797-9.797 19.782-29.579 19.782h-34.571v49.361h68.953c9.797 0 19.782 0 29.579 0v78.938h49.361v-78.938c14.789 0 24.587 0 39.374 0v78.938h49.361v-78.938c64.148-4.992 113.319-24.587 118.314-83.743 4.992-44.366-14.789-68.953-39.374-78.938 19.782-4.992 39.374-14.789 49.361-29.579 39.374 68.953 103.524 123.113 182.269 137.902 14.789 4.992 29.579 4.992 44.366 4.992-59.156 162.68-211.848 280.988-394.31 280.988-231.629 0-418.894-187.261-418.894-418.894s187.455-418.894 419.088-418.894c83.743 0 162.68 24.587 231.629 68.953-59.156 59.156-93.727 123.113-98.532 197.058zM831.498 105.957c123.113 0 221.836 98.532 221.836 221.836s-98.532 221.836-221.836 221.836-221.836-98.532-221.836-221.836c0-123.306 98.532-221.836 221.836-221.836zM767.348 436.119c-9.797 9.797-9.797 24.587 0 34.571 4.992 4.992 9.797 9.797 19.782 9.797 9.797 0 14.789 0 19.782-4.992l127.915-128.109c9.797-9.797 9.797-24.587 0-34.571l-133.101-128.109c-9.797-9.797-24.587-9.797-34.571 0s-9.797 24.587 0 34.571l108.323 108.323-108.133 108.517z" />
</font></defs></svg>

Before

Width:  |  Height:  |  Size: 26 KiB

After

Width:  |  Height:  |  Size: 31 KiB

Before After
Before After

Binary file not shown.

Binary file not shown.

14
public/img/bank.svg Normal file
View file

@ -0,0 +1,14 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg width="41px" height="39px" viewBox="0 0 41 39" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:sketch="http://www.bohemiancoding.com/sketch/ns">
<!-- Generator: Sketch 3.3.3 (12072) - http://www.bohemiancoding.com/sketch -->
<title>Shape + Shape Copy</title>
<desc>Created with Sketch.</desc>
<defs></defs>
<g id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd" sketch:type="MSPage">
<g id="Copay-v1-Buy--1" sketch:type="MSArtboardGroup" transform="translate(-560.000000, -485.000000)" fill="#919191">
<g id="Shape-+-Shape-Copy" sketch:type="MSLayerGroup" transform="translate(560.000000, 485.000000)">
<path d="M38.1230248,7.86230248 L38.1213792,7.86230248 L29.1855982,3.93115124 L20.25,0 L11.3144018,3.93115124 L2.37871219,7.86230248 L2.37697517,7.86230248 L2.37697517,12.4334086 L38.1230248,12.4334086 L38.1230248,7.86230248 Z M5.89672686,29.1636569 C5.36656998,29.1636569 4.93679458,29.5934323 4.93679458,30.1235892 C4.93679458,30.653746 5.36656998,31.0835214 5.89672686,31.0835214 L11.5648984,31.0835214 C12.0950553,31.0835214 12.5248307,30.653746 12.5248307,30.1235892 C12.5248307,29.5934323 12.0950553,29.1636569 11.5648984,29.1636569 L11.244921,29.1636569 L11.244921,15.4503386 L11.5648984,15.4503386 C12.0950553,15.4503386 12.5248307,15.0205632 12.5248307,14.4904063 C12.5248307,13.9602494 12.0950553,13.530474 11.5648984,13.530474 L5.89672686,13.530474 C5.36656998,13.530474 4.93679458,13.9602494 4.93679458,14.4904063 C4.93679458,15.0205632 5.36656998,15.4503386 5.89672686,15.4503386 L6.21670429,15.4503386 L6.21670429,29.1636569 L5.89672686,29.1636569 Z M17.4159142,29.1636569 C16.8857573,29.1636569 16.4559819,29.5934323 16.4559819,30.1235892 C16.4559819,30.653746 16.8857573,31.0835214 17.4159142,31.0835214 L23.0840858,31.0835214 C23.6142427,31.0835214 24.0440181,30.653746 24.0440181,30.1235892 C24.0440181,29.5934323 23.6142427,29.1636569 23.0840858,29.1636569 L22.7641084,29.1636569 L22.7641084,15.4503386 L23.0840858,15.4503386 C23.6142427,15.4503386 24.0440181,15.0205632 24.0440181,14.4904063 C24.0440181,13.9602494 23.6142427,13.530474 23.0840858,13.530474 L17.4159142,13.530474 C16.8857573,13.530474 16.4559819,13.9602494 16.4559819,14.4904063 C16.4559819,15.0205632 16.8857573,15.4503386 17.4159142,15.4503386 L17.7358916,15.4503386 L17.7358916,29.1636569 L17.4159142,29.1636569 Z M29.1179458,29.1636569 C28.5877889,29.1636569 28.1580135,29.5934323 28.1580135,30.1235892 C28.1580135,30.653746 28.5877889,31.0835214 29.1179458,31.0835214 L34.7861174,31.0835214 C35.3162743,31.0835214 35.7460497,30.653746 35.7460497,30.1235892 C35.7460497,29.5934323 35.3162743,29.1636569 34.7861174,29.1636569 L34.46614,29.1636569 L34.46614,15.4503386 L34.7861174,15.4503386 C35.3162743,15.4503386 35.7460497,15.0205632 35.7460497,14.4904063 C35.7460497,13.9602494 35.3162743,13.530474 34.7861174,13.530474 L29.1179458,13.530474 C28.5877889,13.530474 28.1580135,13.9602494 28.1580135,14.4904063 C28.1580135,15.0205632 28.5877889,15.4503386 29.1179458,15.4503386 L29.4379233,15.4503386 L29.4379233,29.1636569 L29.1179458,29.1636569 Z M2.37788939,33.0948081 L2.37788939,33.6433409 C2.37788939,34.1481738 2.78718623,34.5575621 3.29211061,34.5575621 L37.2078894,34.5575621 C37.7127223,34.5575621 38.1221106,34.1481738 38.1221106,33.6433409 L38.1221106,33.0948081 C38.1221106,32.5899752 37.7127223,32.1805869 37.2078894,32.1805869 L3.29211061,32.1805869 C2.78718623,32.1805869 2.37788939,32.5898837 2.37788939,33.0948081 Z M39.5857788,35.6546275 L0.914221219,35.6546275 C0.40929684,35.6546275 0,36.0640158 0,36.5688488 L0,37.3916479 C0,37.8964808 0.40929684,38.3058691 0.914221219,38.3058691 L39.5857788,38.3058691 C40.0906117,38.3058691 40.5,37.8964808 40.5,37.3916479 L40.5,36.5688488 C40.5,36.0639244 40.0907032,35.6546275 39.5857788,35.6546275 Z" id="Shape" sketch:type="MSShapeGroup"></path>
</g>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 3.9 KiB

BIN
public/img/glidera-logo.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.5 KiB

View file

@ -0,0 +1,124 @@
<div
class="topbar-container"
ng-include="'views/includes/topbar.html'"
ng-init="titleSection='Buy'; goBackToState = 'glidera'">
</div>
<div class="content glidera" ng-controller="buyGlideraController as buy">
<div class="onGoingProcess" ng-show="buy.loading">
<div class="onGoingProcess-content" ng-style="{'background-color':index.backgroundColor}">
<div class="spinner">
<div class="rect1"></div>
<div class="rect2"></div>
<div class="rect3"></div>
<div class="rect4"></div>
<div class="rect5"></div>
</div>
<span>{{buy.loading|translate}}</span>
</div>
</div>
<div ng-show="index.glideraLimits && !buy.show2faCodeInput && !buy.success">
<h4 class="title m0">
<div class="left">
<i class="fi-info size-24 m10r"></i>
</div>
<div class="size-10">
<span class="text-light" translate>Daily buy limit</span>:
${{index.glideraLimits.dailyBuy}}
(remaining ${{index.glideraLimits.dailyBuyRemaining}})
<br>
<span class="text-light" translate>Monthly buy limit</span>:
${{index.glideraLimits.monthlyBuy}}
(remaining ${{index.glideraLimits.monthlyBuyRemaining}})
</div>
</h4>
</div>
<div class="row m20t">
<div class="columns">
<div class="box-notification" ng-show="index.glideraLimits.transactDisabledPendingFirstTransaction">
<span class="text-warning size-14" translate>
This operation was disabled because you have a pending first transaction
</span>
</div>
<div ng-show="!buy.show2faCodeInput && !buy.success">
<form name="buyPriceForm"
ng-submit="buy.get2faCode(index.glideraToken)" novalidate>
<label><span translate>Amount in</span> {{showAlternative ? 'USD' : 'BTC'}}</label>
<div class="input">
<input ng-show="!showAlternative" type="number" id="qty"
name="qty" ng-attr-placeholder="{{'Amount'|translate}}"
ng-minlength="0.00000001" ng-maxlength="10000000000"
ng-model="qty" autocomplete="off" ng-change="buy.getBuyPrice(index.glideraToken, {'qty': qty})">
<input ng-show="showAlternative" type="number" id="fiat"
name="fiat" ng-attr-placeholder="{{'Amount'|translate}}"
ng-model="fiat" autocomplete="off" ng-change="buy.getBuyPrice(index.glideraToken, {'fiat': fiat})">
<a ng-show="!showAlternative" class="postfix"
ng-click="showAlternative = true; qty = null; buy.buyPrice = null">BTC</a>
<a ng-show="showAlternative" class="postfix"
ng-click="showAlternative = false; fiat = null; buy.buyPrice = null">USD</a>
<div class="text-center text-gray size-12 m20b" ng-show="buy.buyPrice.qty">
Buy
<span ng-show="qty">{{buy.buyPrice.currency}} {{buy.buyPrice.subtotal}} in Bitcoin</span>
<span ng-show="fiat">{{buy.buyPrice.qty}} BTC</span>
at {{buy.buyPrice.price}} {{buy.buyPrice.currency}}/BTC
</div>
<div class="text-center text-gray size-12 m20b" ng-show="!buy.buyPrice.qty" translate>
(Enter the amount to get the exchange rate)
</div>
<input class="button black expand round"
ng-style="{'background-color':index.backgroundColor}"
type="submit" value="{{'Continue'|translate}}"
ng-disabled="index.glideraLimits.transactDisabledPendingFirstTransaction || !buy.buyPrice.qty || buy.loading">
</div>
</form>
</div>
<div ng-show="buy.show2faCodeInput && !buy.success">
<div class="m10t text-center" translate>
{{buy.buyPrice.currency}} {{buy.buyPrice.subtotal}} &rarr; {{buy.buyPrice.qty}} BTC
<p class="m20t" translate>
A SMS containing a confirmation code was sent to your phone. <br>
Please, enter the code below
</p>
<form name="buyForm"
ng-submit="buy.sendRequest(index.glideraToken, index.glideraPermissions, twoFaCode)" novalidate>
<input type="number" ng-model="twoFaCode" required>
<input class="button black expand round"
ng-style="{'background-color':index.backgroundColor}"
type="submit" value="{{'Buy'|translate}}" ng-disabled="buyForm.$invalid || buy.loading">
</form>
<p class="m10t size-12 text-gray" translate>
Fiat will be immediately withdrawn from your bank account. The bitcoins will be purchased and deposited to your wallet ({{index.walletName}}) in 2-4 business days.
</p>
</div>
</div>
<div class="box-notification" ng-show="buy.error && !buy.success">
<span class="text-warning size-14">
{{buy.error|translate}}
</span>
</div>
<div class="text-center" ng-show="buy.success">
<h1 translate>Purchase initiated</h1>
<p class="text-gray" translate>
A transfer has been initiated from your bank account. Your bitcoins should arrive to your wallet in 4-6 business days.
</p>
<button class="outline dark-gray round expand"
ng-click="$root.go('glidera')">
OK
</button>
</div>
</div>
</div>
</div>
<div class="extra-margin-bottom"></div>

189
public/views/glidera.html Normal file
View file

@ -0,0 +1,189 @@
<div
class="topbar-container"
ng-include="'views/includes/topbar.html'"
ng-init="titleSection='Glidera'; closeToHome = true">
</div>
<div class="content glidera" ng-controller="glideraController as glidera">
<div class="onGoingProcess" ng-show="glidera.loading || index.glideraLoading">
<div class="onGoingProcess-content" ng-style="{'background-color':index.backgroundColor}">
<div class="spinner">
<div class="rect1"></div>
<div class="rect2"></div>
<div class="rect3"></div>
<div class="rect4"></div>
<div class="rect5"></div>
</div>
<span ng-show="glidera.loading" translate>Connecting to Glidera...</span>
<span ng-show="index.glideraLoading">{{index.glideraLoading|translate}}</span>
</div>
</div>
<div class="row m20t">
<div class="columns">
<div class="text-center m5b">
<img src="img/glidera-logo.png" ng-click="index.updateGlidera(index.glideraToken, index.glideraPermissions)" width="100">
</div>
<div class="m20b box-notification" ng-if="index.glideraError">
<div class="text-warning">
<span>{{index.glideraError}}</span>
</div>
</div>
<div class="m10t text-center" ng-show="index.glideraError">
<button
class="dark-gray outline round tiny"
ng-show="index.glideraError.indexOf('Forbidden') == 40"
ng-click="index.glideraToken = null; index.glideraError = null">
Request a new token
</button>
<div ng-show="index.glideraError.indexOf('Forbidden') != 40">
<button
class="dark-gray outline round tiny"
ng-click="index.initGlidera(index.glideraToken)">
Retry
</button>
<div class="m20t size-12">
<a class="text-gray" ng-click="$root.go('preferencesGlidera')" translate>Preferences</a>
</div>
</div>
</div>
</div>
</div>
<div ng-if="!index.glideraToken && !index.glideraLoading && !index.glideraError"
class="row">
<div class="columns" ng-init="showOauthForm = false">
<div class="text-center" ng-show="!showOauthForm">
<p translate>You can buy and sell Bitcoin with a US bank account directly in Copay.</p>
<div class="m10b text-gray size-12" translate>Connect your Glidera account to get started</div>
<div class="box-notification size-12 text-warning" ng-show="index.network == 'testnet'">
<i class="fi-info"></i>
Testnet wallets only work with Glidera Sandbox Accounts
</div>
<a class="button dark-gray outline round tiny"
ng-click="$root.openExternalLink(glidera.getAuthenticateUrl(), '_system'); showOauthForm = true" translate>
Connect to Glidera
</a>
<div>
<a href ng-click="showOauthForm = true" class="text-gray size-12">
Do you already have the Oauth Code?
</a>
</div>
</div>
<div class="text-center" ng-show="showOauthForm">
<div class="text-left box-notification size-12 text-warning" ng-show="glidera.error">
{{glidera.error}}
</div>
<form name="oauthCodeForm" ng-submit="glidera.submitOauthCode(code)" novalidate>
<label>OAuth Code</label>
<input type="text" ng-model="code" ng-disabled="glidera.loading"
ng-attr-placeholder="{{'Paste the authorization code here'|translate}}" required>
<input
class="button expand round"
ng-style="{'background-color':index.backgroundColor}"
type="submit" value="Get started" ng-disabled="oauthCodeForm.$invalid || glidera.loading">
</form>
<div>
<a href class="size-12 text-gray"
ng-click="showOauthForm = false; index.glideraError = null; glidera.error = null" translate>Go back</a>
</div>
</div>
</div>
</div>
<div ng-if="index.glideraToken && index.glideraPermissions">
<div class="text-center m10b">
<div class="size-12" ng-show="index.glideraEmail">
{{index.glideraEmail}}
</div>
<div ng-show="index.glideraPersonalInfo" class="size-12">
{{index.glideraPersonalInfo.firstName}} {{index.glideraPersonalInfo.lastName}}
</div>
<div class="columns text-warning size-12 m20t m20b"
ng-show="index.glideraStatus && (!index.glideraStatus.userEmailIsSetup || !index.glideraStatus.userPhoneIsSetup
|| (!index.glideraStatus.userBankAccountIsSetup && index.glideraStatus.bankAccountState != 'VERIFIED'))">
<span translate>Your Glidera account is not ready to transact. Please, verify it at</span>
<a href
ng-init="glideraUrl = index.network == 'testnet' ? 'https://sandbox.glidera.io/login' :
'https://glidera.io/login'"
ng-click="$root.openExternalLink(glideraUrl)">Glidera.io</a>
</div>
</div>
<ul class="no-bullet m0 size-14">
<li class="line-b line-t p20 pointer"
ng-show="index.glideraPermissions.transact &&
(index.glideraStatus.userCanBuy || index.glideraStatus.userCanTransact)"
ng-click="$root.go('buyGlidera')">
<i class="icon-buy-btc size-24 m5r"></i>
<span translate>Buy Bitcoin</span>
<span class="right text-gray">
<i class="icon-arrow-right3 size-24 right"></i>
</span>
</li>
<li class="line-b p20 pointer"
ng-show="index.glideraPermissions.transact &&
(index.glideraStatus.userCanSell || index.glideraStatus.userCanTransact)"
ng-click="$root.go('sellGlidera')">
<i class="icon-sell-btc size-24 m5r"></i>
<span translate>Sell Bitcoin</span>
<span class="right text-gray">
<i class="icon-arrow-right3 size-24 right"></i>
</span>
</li>
<li class="line-b p20 pointer" ng-click="$root.go('preferencesGlidera')">
<span translate>Preferences</span>
<span class="right text-gray">
<i class="icon-arrow-right3 size-24 right"></i>
</span>
</li>
</ul>
<div ng-show="index.glideraPermissions.transaction_history">
<h4 class="title m0" translate>Activity</h4>
<div ng-show="index.glideraTxs.length == 0 && !index.glideraLoadingHistory"
class="size-12 p10 text-center text-gray" translate>
No activity in your account
</div>
<div ng-repeat="tx in index.glideraTxs"
ng-click="glidera.openTxModal(index.glideraToken, tx)"
class="row collapse last-transactions-content">
<div class="large-3 medium-3 small-3 columns">
<span class="label tu radius" ng-show="tx.type == 'BUY'"
ng-style="{'background-color':index.backgroundColor}" translate>Bought</span>
<span class="label tu gray radius" ng-show="tx.type == 'SELL'" translate>Sold</span>
</div>
<div class="large-4 medium-4 small-4 columns">
<span class="size-16">
{{tx.subtotal}} {{tx.currency}}
</span>
</div>
<div class="large-4 medium-4 small-4 columns text-right">
<div class="m5t size-12 text-gray">
<time ng-if="tx.transactionDate">{{tx.transactionDate | amTimeAgo}}</time>
</div>
</div>
<div class="large-1 medium-1 small-1 columns text-right">
<i class="icon-arrow-right3 size-18"></i>
</div>
<div class="size-12 text-gray columns m5t">
<span class="text-success" ng-if="tx.status == 'COMPLETE'">Completed</span>
<span class="text-info" ng-if="tx.status == 'PROCESSING'">Processing</span>
<span class="text-warning" ng-if="tx.status == 'ERROR'">Error</span>
</div>
</div>
</div>
</div>
</div>
<div class="extra-margin-bottom"></div>

View file

@ -0,0 +1,35 @@
<div
class="topbar-container"
ng-include="'views/includes/topbar.html'"
ng-init="titleSection='Glidera'; closeToHome = true">
</div>
<div class="content glidera" ng-controller="glideraUriController as glidera" ng-init="glidera.checkCode()">
<div class="onGoingProcess" ng-show="glidera.loading">
<div class="onGoingProcess-content" ng-style="{'background-color':index.backgroundColor}">
<div class="spinner">
<div class="rect1"></div>
<div class="rect2"></div>
<div class="rect3"></div>
<div class="rect4"></div>
<div class="rect5"></div>
</div>
<span ng-show="glidera.loading" translate>Connecting to Glidera...</span>
</div>
</div>
<div class="row m20t">
<div class="large-12 columns">
<div class="text-center">
<img src="img/glidera-logo.png"
ng-click="index.updateGlidera(index.glideraToken, index.glideraPermissions)" width="100">
</div>
<div class="m10t text-center" ng-show="glidera.error">
<div class="notification m10b size-12 text-warning">{{glidera.error}}</div>
<button class="outline dark-gray tiny round" ng-click="glidera.submitOauthCode(glidera.code)">Try again</button>
</div>
</div>
</div>
</div>

View file

@ -1,4 +1,4 @@
<a ng-click="index.setTab(item)" ng-class="{'active': index.tab == item.link}" id="menu-{{item.link}}">
<a ng-click="index.setTab(item.link)" ng-class="{'active': index.tab == item.link}" id="menu-{{item.link}}">
<i class="size-24 {{item.icon}} db"></i>
<div class="size-10 tu">
{{ item.title|translate }}
@ -6,4 +6,4 @@
{{ index.pendingTxProposalsCountForUs }}
</span>
</div>
</a>
</a>

View file

@ -15,7 +15,7 @@
</section>
<section class="right-small" ng-show="showCamera">
<qr-scanner ng-show="index.isComplete" on-scan="topbar.onQrCodeScanned(data)" before-scan="topbar.openSendScreen()" />
<qr-scanner ng-show="index.isComplete" on-scan="topbar.onQrCodeScanned(data)" before-scan="topbar.openSendScreen()"></qr-scanner>
</section>
<section class="middle tab-bar-section">

View file

@ -1,6 +1,6 @@
<div class="ng-animate-disabled row collapse last-transactions-content line-b"
ng-class="{'text-gray':!tx.pendingForUs}"
ng-click="home.openTxpModal(tx, index.copayers)">
ng-click="home.openTxpModal(tx, index.copayers, !!index.glideraStatus)">
<div class="small-1 columns text-center" >
<i class="icon-circle-active size-10" ng-show="tx.pendingForUs" ng-style="{'color':index.backgroundColor}" style="margin-top:8px;"></i>
&nbsp;

View file

@ -0,0 +1,15 @@
<div class="m20tp text-center">
<div class="row">
<h1 class="text-center m20b" translate>Revoke Glidera Token</h1>
<div class="large-6 medium-6 small-6 columns">
<button class="button warning expand round" ng-click="ok()">
<i class="fi-trash"></i> <span translate>Yes</span>
</button>
</div>
<div class="large-6 medium-6 small-6 columns">
<button class="button light-gray expand outline round" ng-click="cancel()">
<i class="fi-x"></i> <span class="tu" translate>Cancel</span>
</button>
</div>
</div>
</div>

View file

@ -0,0 +1,60 @@
<nav class="tab-bar">
<section class="left-small">
<a ng-click="cancel()">
<i class="icon-arrow-left3 icon-back"></i>
<span class="text-back" translate>Back</span>
</a>
</section>
<section class="middle tab-bar-section">
<h1 class="title ellipsis" ng-style="{'color':color}" translate>
Transaction
</h1>
</section>
</nav>
<div class="modal-content fix-modals-touch">
<div class="header-modal text-center">
<span class="label tu radius" ng-show="tx.type == 'BUY'"
ng-style="{'background-color':color}" translate>Bought</span>
<span class="label tu gray radius" ng-show="tx.type == 'SELL'" translate>Sold</span>
<div class="size-42">
{{tx.subtotal}} {{tx.currency}}
</div>
<div class="size-12 text-gray">
<span class="text-success" ng-if="tx.status == 'COMPLETE'">Completed</span>
<span class="text-info" ng-if="tx.status == 'PROCESSING'">Processing</span>
<span class="text-warning" ng-if="tx.status == 'ERROR'">Error</span>
</div>
</div>
<h4 class="title m0" translate>Details</h4>
<ul class="no-bullet size-14 m0">
<li ng-show="tx.transactionDate" class="line-b p10 oh">
<span class="text-gray" translate>Date</span>:
<span class="right">{{tx.transactionDate | amCalendar}}</span>
</li>
<li ng-show="tx.price" class="line-b p10 oh">
<span class="text-gray" translate>Price</span>:
<span class="right">${{tx.price}} {{tx.currency}}</span>
</li>
<li ng-show="tx.subtotal" class="line-b p10 oh">
<span class="text-gray" translate>Subtotal</span>:
<span class="right">${{tx.subtotal}} {{tx.currency}}</span>
</li>
<li ng-show="tx.fees" class="line-b p10 oh">
<span class="text-gray" translate>Fees</span>:
<span class="right">${{tx.fees}} {{tx.currency}}</span>
</li>
<li ng-show="tx.total" class="line-b p10 oh">
<span class="text-gray" translate>Total</span>:
<span class="right">${{tx.total}} {{tx.currency}}</span>
</li>
</ul>
<div class="extra-margin-bottom"></div>
</div>

View file

@ -133,31 +133,31 @@
</div>
<div class="text-center text-gray m20t" ng-show="tx.status != 'pending'">
<div class="m10t size-12"
ng-show="tx.status=='accepted'" translate>
Payment accepted...
</div>
<div
ng-show="!loading && tx.status!='broadcasted' && tx.status=='accepted' && tx.status!='rejected'">
<div class="m10b size-12" translate>But not broadcasted. Try to send manually</div>
<div ng-show="tx.status=='accepted' && !tx.isGlidera" >
<div class="m10b size-12" translate>Payment accepted, but not yet broadcasted</div>
<button class="primary round"
ng-click="broadcast(tx)"
ng-disabled="loading"> <i class="fi-upload-cloud"></i>
ng-disabled="loading"
> <i class="fi-upload-cloud"></i>
<span translate>Broadcast Payment</span>
</button>
</div>
<div ng-show="tx.status=='accepted' && tx.isGlidera" >
<div class="m10 size-12" translate>Payment accepted. It will be broadcasted by Glidera. It case there is a problem, it can be deleted after 6 hours it was created.</div>
</div>
<div class="text-success m10t"
ng-show="tx.status=='broadcasted'" translate>
Payment sent!
Payment sent
</div>
<div class="text-center text-warning m10t"
ng-show="tx.status=='rejected'" translate>
Payment finally rejected
Payment rejected
</div>
</div>
<div class="row columns text-center m20t" ng-if="tx.canBeRemoved">
<div class="text-gray size-12 m20b" show="tx.canBeRemoved" translate>
<div class="text-gray size-12 m20b" ng-if="!tx.isGlidera" translate>
* A payment proposal can be deleted if 1) you are the creator, and no other copayer has signed, or 2) 24 hours have passed since the proposal was created.
</div>
<button class="tiny round outline dark-gray warning" ng-click="remove(tx)"

View file

@ -0,0 +1,266 @@
<div
class="topbar-container"
ng-include="'views/includes/topbar.html'"
ng-init="titleSection='Preferences'; goBackToState = 'glidera'">
</div>
<div class="content preferences" ng-controller="preferencesGlideraController as glidera">
<ul ng-if="index.glideraToken" class="no-bullet m0 size-14">
<h4 class="title m0" translate>Permissions</h4>
<li class="line-b p20">
<span translate>Email</span>
<span class="right text-gray">
{{index.glideraPermissions.view_email_address}}
</span>
</li>
<li class="line-b p20">
<span translate>Personal Information</span>
<span class="right text-gray">
{{index.glideraPermissions.personal_info}}
</span>
</li>
<li class="line-b p20">
<span translate>Buy/Sell</span>
<span class="right text-gray">
{{index.glideraPermissions.transact}}
</span>
</li>
<li class="line-b p20">
<span translate>Transaction History</span>
<span class="right text-gray">
{{index.glideraPermissions.transaction_history}}
</span>
</li>
</ul>
<ul ng-if="index.glideraPermissions.view_email_address"
ng-init="glidera.getEmail(index.glideraToken)"
class="no-bullet m0 size-14">
<h4 class="title m0" translate>Email</h4>
<li class="line-b p20">
<span translate>Email</span>
<span class="right text-gray">
{{glidera.email.email}}
</span>
</li>
<li class="line-b p20">
<span translate>Active</span>
<span class="right text-gray">
{{glidera.email.userEmailIsSetup}}
</span>
</li>
</ul>
<ul ng-if="index.glideraPermissions.personal_info"
ng-init="glidera.getPersonalInfo(index.glideraToken)"
class="no-bullet m0 size-14">
<h4 class="title m0" translate>Personal Information</h4>
<li class="line-b p20">
<span translate>First Name</span>
<span class="right text-gray">
{{glidera.personalInfo.firstName}}
</span>
</li>
<li class="line-b p20">
<span translate>Middle Name</span>
<span class="right text-gray">
{{glidera.personalInfo.middleName}}
</span>
</li>
<li class="line-b p20">
<span translate>Last Name</span>
<span class="right text-gray">
{{glidera.personalInfo.lastName}}
</span>
</li>
<li class="line-b p20">
<span translate>Birth Date</span>
<span class="right text-gray">
{{glidera.personalInfo.birthDate}}
</span>
</li>
<li class="line-b p20">
<span translate>Address 1</span>
<span class="right text-gray">
{{glidera.personalInfo.address1}}
</span>
</li>
<li class="line-b p20">
<span translate>Address 2</span>
<span class="right text-gray">
{{glidera.personalInfo.address2}}
</span>
</li>
<li class="line-b p20">
<span translate>City</span>
<span class="right text-gray">
{{glidera.personalInfo.city}}
</span>
</li>
<li class="line-b p20">
<span translate>State</span>
<span class="right text-gray">
{{glidera.personalInfo.state}}
</span>
</li>
<li class="line-b p20">
<span translate>ZIP Code</span>
<span class="right text-gray">
{{glidera.personalInfo.zipCode}}
</span>
</li>
<li class="line-b p20">
<span translate>Country</span>
<span class="right text-gray">
{{glidera.personalInfo.countryCode}}
</span>
</li>
<li class="line-b p20">
<span translate>Occupation</span>
<span class="right text-gray">
{{glidera.personalInfo.occupation}}
</span>
</li>
<li class="line-b p20">
<span translate>Basic Information State</span>
<span class="right text-gray">
{{glidera.personalInfo.basicInfoState}}
</span>
</li>
</ul>
<ul ng-if="index.glideraToken" ng-init="glidera.getStatus(index.glideraToken)"
class="no-bullet m0 size-14">
<h4 class="title m0" translate>Status</h4>
<li class="line-b p20">
<span translate>Buy/Sell</span>
<span class="right text-gray">
{{glidera.status.userCanTransact}}
</span>
</li>
<li class="line-b p20">
<span translate>Buy</span>
<span class="right text-gray">
{{glidera.status.userCanBuy}}
</span>
</li>
<li class="line-b p20">
<span translate>Sell</span>
<span class="right text-gray">
{{glidera.status.userCanSell}}
</span>
</li>
<li class="line-b p20">
<span translate>Email Is Setup</span>
<span class="right text-gray">
{{glidera.status.userEmailIsSetup}}
</span>
</li>
<li class="line-b p20">
<span translate>Phone Is Setup</span>
<span class="right text-gray">
{{glidera.status.userPhoneIsSetup}}
</span>
</li>
<li class="line-b p20">
<span translate>Bank Account Is Setup</span>
<span class="right text-gray">
{{glidera.status.userBankAccountIsSetup}}
</span>
</li>
<li class="line-b p20">
<span translate>Personal Information State</span>
<span class="right text-gray">
{{glidera.status.personalInfoState}}
</span>
</li>
<li class="line-b p20">
<span translate>Bank Account State</span>
<span class="right text-gray">
{{glidera.status.bankAccountState}}
</span>
</li>
<li class="line-b p20">
<span translate>Country</span>
<span class="right text-gray">
{{glidera.status.country}}
</span>
</li>
</ul>
<ul ng-if="index.glideraToken" ng-init="glidera.getLimits(index.glideraToken)"
class="no-bullet m0 size-14">
<h4 class="title m0" translate>Limits</h4>
<li class="line-b p20">
<span translate>Daily Buy</span>
<span class="right text-gray">
{{glidera.limits.dailyBuy}} {{glidera.limits.currency}}
</span>
</li>
<li class="line-b p20">
<span translate>Daily Sell</span>
<span class="right text-gray">
{{glidera.limits.dailySell}} {{glidera.limits.currency}}
</span>
</li>
<li class="line-b p20">
<span translate>Monthly Buy</span>
<span class="right text-gray">
{{glidera.limits.monthlyBuy}} {{glidera.limits.currency}}
</span>
</li>
<li class="line-b p20">
<span translate>Monthly Sell</span>
<span class="right text-gray">
{{glidera.limits.monthlySell}} {{glidera.limits.currency}}
</span>
</li>
<li class="line-b p20">
<span translate>Daily Buy Remaining</span>
<span class="right text-gray">
{{glidera.limits.dailyBuyRemaining}} {{glidera.limits.currency}}
</span>
</li>
<li class="line-b p20">
<span translate>Daily Sell Remaining</span>
<span class="right text-gray">
{{glidera.limits.dailySellRemaining}} {{glidera.limits.currency}}
</span>
</li>
<li class="line-b p20">
<span translate>Monthly Buy Remaining</span>
<span class="right text-gray">
{{glidera.limits.monthlyBuyRemaining}} {{glidera.limits.currency}}
</span>
</li>
<li class="line-b p20">
<span translate>Monthly Sell Remaining</span>
<span class="right text-gray">
{{glidera.limits.monthlySellRemaining}} {{glidera.limits.currency}}
</span>
</li>
<li class="line-b p20">
<span translate>Buy/Sell Disabled (pending first transaction)</span>
<span class="right text-gray">
{{glidera.limits.transactDisabledPendingFirstTransaction}}
</span>
</li>
</ul>
<ul class="no-bullet m0 size-14">
<h4 class="title m0" translate>Account</h4>
<li class="line-b p20" ng-click="glidera.revokeToken()">
<i class="icon-arrow-right3 size-24 right text-gray"></i>
<span class="text-warning" translate>Revoke Token</span>
</li>
</ul>
</div>
<div class="extra-margin-bottom"></div>

View file

@ -0,0 +1,120 @@
<div
class="topbar-container"
ng-include="'views/includes/topbar.html'"
ng-init="titleSection='Sell'; goBackToState = 'glidera'">
</div>
<div class="content glidera" ng-controller="sellGlideraController as sell">
<div class="onGoingProcess" ng-show="sell.loading">
<div class="onGoingProcess-content" ng-style="{'background-color':index.backgroundColor}">
<div class="spinner">
<div class="rect1"></div>
<div class="rect2"></div>
<div class="rect3"></div>
<div class="rect4"></div>
<div class="rect5"></div>
</div>
<span>{{sell.loading|translate}}</span>
</div>
</div>
<div ng-show="index.glideraLimits && !sell.show2faCodeInput && !sell.success">
<h4 class="title m0">
<div class="left">
<i class="fi-info size-24 m10r"></i>
</div>
<div class="size-10">
<span class="text-light" translate>Daily sell limit</span>:
${{index.glideraLimits.dailySell}}
(${{index.glideraLimits.dailySellRemaining}} remaining)
<br>
<span class="text-light" translate>Monthly sell limit</span>:
${{index.glideraLimits.monthlySell}}
(${{index.glideraLimits.monthlySellRemaining}} remaining)
</div>
</h4>
</div>
<div class="row m20t">
<div class="columns">
<div class="box-notification" ng-show="index.glideraLimits.transactDisabledPendingFirstTransaction">
<span class="text-warning size-14" translate>
This operation was disabled because you have a pending first transaction
</span>
</div>
<div ng-show="!sell.show2faCodeInput && !sell.success">
<form name="sellPriceForm"
ng-submit="sell.get2faCode(index.glideraToken)" novalidate>
<label><span translate>Amount in</span> {{showAlternative ? 'USD' : 'BTC'}}</label>
<div class="input">
<input ng-show="!showAlternative" type="number" id="qty"
name="qty" ng-attr-placeholder="{{'Amount'|translate}}"
ng-minlength="0.00000001" ng-maxlength="10000000000"
ng-model="qty" autocomplete="off" ng-change="sell.getSellPrice(index.glideraToken, {'qty': qty})">
<input ng-show="showAlternative" type="number" id="fiat"
name="fiat" ng-attr-placeholder="{{'Amount'|translate}}"
ng-model="fiat" autocomplete="off" ng-change="sell.getSellPrice(index.glideraToken, {'fiat': fiat})">
<a ng-show="!showAlternative" class="postfix"
ng-click="showAlternative = true; qty = null; sell.sellPrice = null">BTC</a>
<a ng-show="showAlternative" class="postfix"
ng-click="showAlternative = false; fiat = null; sell.sellPrice = null">USD</a>
<div class="text-center text-gray size-12 m20b" ng-show="sell.sellPrice.qty">
Sell
<span ng-show="qty"> {{sell.sellPrice.currency}} {{sell.sellPrice.subtotal}} in Bitcoin</span>
<span ng-show="fiat">{{sell.sellPrice.qty}} BTC</span>
at {{sell.sellPrice.price}} {{sell.sellPrice.currency}}/BTC
</div>
<div class="text-center text-gray size-12 m20b" ng-show="!sell.sellPrice.qty" translate>
(Enter the amount to get the exchange rate)
</div>
<input class="button black expand round"
ng-style="{'background-color':index.backgroundColor}"
type="submit" value="{{'Continue'|translate}}"
ng-disabled="index.glideraLimits.transactDisabledPendingFirstTransaction || !sell.sellPrice.qty || sell.loading">
</div>
</form>
</div>
<div ng-show="sell.show2faCodeInput && !sell.success">
<div class="m10t text-center" translate>
{{sell.sellPrice.qty}} BTC &rarr; {{sell.sellPrice.currency}} {{sell.sellPrice.subtotal}}
<p class="m20t" translate>
A SMS containing a confirmation code was sent to your phone. <br>
Please, enter the code below
</p>
<form name="sellForm"
ng-submit="sell.createTx(index.glideraToken, index.glideraPermissions, twoFaCode)" novalidate>
<input type="number" ng-model="twoFaCode" required>
<input class="button black expand round"
ng-style="{'background-color':index.backgroundColor}"
type="submit" value="{{'Sell'|translate}}" ng-disabled="sellForm.$invalid || sell.loading">
</form>
<p class="m10t size-12 text-gray" translate>
Bitcoins will be immediately sent from your wallet to Glidera. Fiat will be deposited in your bank account in 4-6 business days.
</p>
</div>
</div>
<div class="box-notification" ng-show="sell.error && !sell.success">
<span class="text-warning size-14">
{{sell.error|translate}}
</span>
</div>
<div class="text-center" ng-show="sell.success">
<h1 translate>Sale initiated</h1>
<p class="text-gray" translate>
A transfer has been initiated to your bank account and should arrive in 4-6 business days.
</p>
<button class="outline dark-gray round expand"
ng-click="$root.go('glidera')">OK</button>
</div>
</div>
</div>
<div class="extra-margin-bottom"></div>

View file

@ -96,7 +96,7 @@
<span translate>Pending Confirmation</span>:
{{index.pendingAmountStr}}
</div>
</div>
</div>
@ -112,6 +112,13 @@
ng-style="{'background-color':index.backgroundColor}">{{ (index.alias || index.walletName) | limitTo: 1}}
</div>
<div class="right">
<a ng-show="!index.isShared" class="button outline round light-gray tiny preferences-icon m10r"
ng-click="$root.go('glidera')">
<i class="icon-bank size-18 vm"></i>
<span class="show-for-medium-up">Glidera</span>
</a>
<a ng-click="$root.go('preferences')" class="button outline round light-gray tiny preferences-icon m0">
<i class="fi-widget size-18 vm"></i>
<span class="show-for-medium-up" translate>Preferences</span>
@ -161,26 +168,18 @@
</div>
<div ng-if="index.txps[0]">
<div ng-show="index.requiresMultipleSignatures">
<h4 class="title m0" translate>Payment Proposals</h4>
<div class="last-transactions pr" ng-repeat="tx in index.txps"
ng-include="index.txTemplateUrl">
</div>
<div class="text-gray text-center size-12 p10t"
ng-show="index.lockedBalanceSat && !index.updatingStatus">
<span translate>Total Locked Balance</span>:
<b>{{index.lockedBalanceStr}} </b>
<span> {{index.lockedBalanceAlternative}}
{{index.alternativeIsoCode}} </span>
</div>
<h4 ng-show="index.requiresMultipleSignatures" class="title m0" translate>Payment Proposals</h4>
<h4 ng-show="!index.requiresMultipleSignatures" class="title m0" translate>Unsent transactions</h4>
<div class="last-transactions pr" ng-repeat="tx in index.txps"
ng-include="index.txTemplateUrl">
</div>
<div ng-show="!index.requiresMultipleSignatures">
<h4 class="title m0" translate>Unsent transactions</h4>
<div class="last-transactions pr" ng-repeat="tx in index.txps"
ng-include="index.txTemplateUrl">
</div>
<div class="text-gray text-center size-12 p10t"
ng-show="index.lockedBalanceSat && !index.updatingStatus">
<span translate>Total Locked Balance</span>:
<b>{{index.lockedBalanceStr}} </b>
<span> {{index.lockedBalanceAlternative}}
{{index.alternativeIsoCode}} </span>
</div>
</div>
<div class="extra-margin-bottom"></div>
@ -275,7 +274,7 @@
</div>
<div class="m20t text-center" ng-show="!home.generatingAddress && home.addr[index.walletId]">
<a class="size-12 text-gray" ng-click="home.openCustomizedAmountModal(home.addr[index.walletId])">
<i class="fi-bitcoin"></i>
<i class="fi-bitcoin"></i>
<span translate>Request a specific amount</span>
</a>
</div>
@ -411,7 +410,7 @@
<li ng-repeat="fee in (index.network == 'livenet' ? index.feeLevels.livenet : index.feeLevels.testnet)"
ng-click="home.setFee(fee.level)" class="line-b p20">
{{index.feeOpts[fee.level]|translate}}
<i class="fi-check size-16 right"
<i class="fi-check size-16 right"
ng-show="(home.currentSendFeeLevel || index.currentFeeLevel) == fee.level"></i>
</li>
</ul>
@ -522,7 +521,7 @@
<div ng-if="!index.isCordova && index.txHistory[0] && !index.updatingTxHistory" class="m20t text-center">
<input id="export_file" type="file" nwsaveas="Copay-{{index.alias || index.walletName}}.csv" accept=".csv" style="display:none">
<a class="text-gray size-12" ng-click="index.csvHistory();">
<i class="fi-page-export-csv"></i>
<i class="fi-page-export-csv"></i>
<span translate>Download CSV file</span>
</a>
</div>

View file

@ -24,214 +24,159 @@
-moz-osx-font-smoothing: grayscale;
}
.icon-minus-circle:before {
content: "\e62c";
.icon-sell-btc:before {
content: "\e632";
}
.icon-plus-circle:before {
content: "\e62d";
.icon-buy-btc:before {
content: "\e631";
}
.icon-close-circle:before {
content: "\e62e";
}
.icon-checkmark-circle:before {
content: "\e62b";
}
.icon-circle:before {
content: "\e629";
}
.icon-circle-active:before {
content: "\e627";
}
.icon-scan:before {
content: "\e62a";
}
.icon-trash:before {
content: "\e626";
}
.icon-wallet:before {
content: "\e622";
}
.icon-history:before {
content: "\e623";
}
.icon-reference:before {
content: "\e621";
}
.icon-bell:before {
content: "\e61c";
}
.icon-trash:before {
content: "\e626";
}
.icon-wallet:before {
content: "\e622";
}
.icon-history:before {
content: "\e623";
}
.icon-reference:before {
content: "\e621";
}
.icon-bell:before {
content: "\e61c";
}
.icon-receive:before {
content: "\e625";
}
.icon-wrench:before {
content: "\e61d";
}
.icon-download:before {
content: "\e61e";
}
.icon-upload:before {
content: "\e61f";
}
.icon-power:before {
content: "\e620";
}
.icon-forward:before {
content: "\e624";
}
.icon-compose:before {
content: "\e610";
}
.icon-contact:before {
content: "\e611";
}
.icon-email:before {
content: "\e612";
}
.icon-gear:before {
content: "\e613";
}
.icon-home:before {
content: "\e614";
}
.icon-locked:before {
content: "\e615";
}
.icon-paperplane:before {
content: "\e617";
}
.icon-people:before {
content: "\e618";
}
.icon-person:before {
content: "\e619";
}
.icon-pricetag:before {
content: "\e61a";
}
.icon-pricetags:before {
content: "\e61b";
}
.icon-bitcoin:before {
content: "\e60f";
}
.icon-usd:before {
content: "\e616";
}
.icon-erase:before {
content: "\e628";
}
.icon-receive2:before {
content: "\e62f";
}
.icon-arrow-left:before {
content: "\e600";
}
.icon-arrow-down:before {
content: "\e601";
}
.icon-arrow-up:before {
content: "\e602";
}
.icon-arrow-right:before {
content: "\e603";
}
.icon-arrow-left2:before {
content: "\e604";
}
.icon-arrow-down2:before {
content: "\e605";
}
.icon-arrow-up2:before {
content: "\e606";
}
.icon-arrow-right2:before {
content: "\e607";
}
.icon-arrow-left3:before {
content: "\e608";
}
.icon-arrow-down3:before {
content: "\e609";
}
.icon-arrow-up3:before {
content: "\e60a";
}
.icon-arrow-right3:before {
content: "\e60b";
}
.icon-arrow-left4:before {
content: "\e60c";
}
.icon-arrow-down4:before {
content: "\e60d";
}
.icon-arrow-up4:before {
content: "\e60e";
}
.icon-bank:before {
content: "\e630";
}
.icon-minus-circle:before {
content: "\e62c";
}
.icon-plus-circle:before {
content: "\e62d";
}
.icon-close-circle:before {
content: "\e62e";
}
.icon-checkmark-circle:before {
content: "\e62b";
}
.icon-circle:before {
content: "\e629";
}
.icon-circle-active:before {
content: "\e627";
}
.icon-circle-active:before {
content: "\e627";
}
.icon-scan:before {
content: "\e62a";
}
.icon-trash:before {
content: "\e626";
}
.icon-wallet:before {
content: "\e622";
}
.icon-history:before {
content: "\e623";
}
.icon-reference:before {
content: "\e621";
}
.icon-bell:before {
content: "\e61c";
}
.icon-receive:before {
content: "\e625";
}
.icon-wrench:before {
content: "\e61d";
}
.icon-download:before {
content: "\e61e";
}
.icon-upload:before {
content: "\e61f";
}
.icon-power:before {
content: "\e620";
}
.icon-forward:before {
content: "\e624";
}
.icon-compose:before {
content: "\e610";
}
.icon-contact:before {
content: "\e611";
}
.icon-email:before {
content: "\e612";
}
.icon-gear:before {
content: "\e613";
}
.icon-home:before {
content: "\e614";
}
.icon-locked:before {
content: "\e615";
}
.icon-paperplane:before {
content: "\e617";
}
.icon-people:before {
content: "\e618";
}
.icon-person:before {
content: "\e619";
}
.icon-pricetag:before {
content: "\e61a";
}
.icon-pricetags:before {
content: "\e61b";
}
.icon-bitcoin:before {
content: "\e60f";
}
.icon-usd:before {
content: "\e616";
}

View file

@ -410,7 +410,6 @@ ul.manage li {
.line-t {
border-top: 1px solid #E9E9EC;
padding-top: 0.5rem;
}
.line-b {
@ -1098,7 +1097,16 @@ input.ng-invalid-match, input.ng-invalid-match:focus {
}
.preferences-icon {
padding: 0.6rem 0.8rem !important;
width: auto;
height: 40px;
}
@media only screen and (max-width: 40em) {
.preferences-icon {
width: 40px;
height: 40px;
padding: 0.55rem !important;
}
}
.alertModal {

View file

@ -0,0 +1,80 @@
'use strict';
angular.module('copayApp.controllers').controller('buyGlideraController',
function($scope, $timeout, profileService, addressService, glideraService, gettext, gettextCatalog, bwsError) {
this.addr = {};
this.show2faCodeInput = null;
this.error = null;
this.success = null;
this.loading = null;
this.getBuyPrice = function(token, price) {
var self = this;
if (!price || (price && !price.qty && !price.fiat)) {
this.buyPrice = null;
return;
}
glideraService.buyPrice(token, price, function(err, buyPrice) {
if (err) {
self.error = gettext('Could not get exchange information. Please, try again.');
}
else {
self.buyPrice = buyPrice;
}
});
};
this.get2faCode = function(token) {
var self = this;
this.loading = gettext('Sending 2FA code...');
$timeout(function() {
glideraService.get2faCode(token, function(err, sent) {
self.loading = null;
if (err) {
self.error = gettext('Could not send confirmation code to your phone');
}
else {
self.error = null;
self.show2faCodeInput = sent;
}
});
}, 100);
};
this.sendRequest = function(token, permissions, twoFaCode) {
var fc = profileService.focusedClient;
if (!fc) return;
var self = this;
self.error = null;
addressService.getAddress(fc.credentials.walletId, null, function(err, addr) {
if (!addr) {
self.error = bwsError.msg(err);
$scope.$apply();
}
else {
self.loading = gettext('Buying bitcoin...');
var data = {
destinationAddress: addr,
qty: self.buyPrice.qty,
priceUuid: self.buyPrice.priceUuid,
useCurrentPrice: false,
ip: null
};
$timeout(function() {
glideraService.buy(token, twoFaCode, data, function(err, data) {
self.loading = null;
if (err) {
self.error = err;
}
else {
self.success = data;
$scope.$emit('Local/GlideraTx');
}
});
}, 100);
}
});
};
});

View file

@ -0,0 +1,76 @@
'use strict';
angular.module('copayApp.controllers').controller('glideraController',
function($scope, $timeout, $modal, profileService, configService, storageService, glideraService, isChromeApp) {
var config = configService.getSync().wallet.settings;
this.getAuthenticateUrl = function() {
return glideraService.getOauthCodeUrl();
};
this.submitOauthCode = function(code) {
var fc = profileService.focusedClient;
var self = this;
this.loading = true;
this.error = null;
$timeout(function() {
glideraService.getToken(code, function(err, data) {
self.loading = null;
if (err) {
self.error = err;
$timeout(function() {
$scope.$apply();
}, 100);
}
else if (data && data.access_token) {
storageService.setGlideraToken(fc.credentials.network, data.access_token, function() {
$scope.$emit('Local/GlideraTokenUpdated', data.access_token);
$timeout(function() {
$scope.$apply();
}, 100);
});
}
});
}, 100);
};
// DISABLE ANIMATION ON CHROMEAPP
if (isChromeApp) {
var animatedSlideRight = 'full';
}
else {
var animatedSlideRight = 'full animated slideInRight';
}
this.openTxModal = function(token, tx) {
var self = this;
var fc = profileService.focusedClient;
var ModalInstanceCtrl = function($scope, $modalInstance) {
$scope.tx = tx;
$scope.settings = config;
$scope.color = fc.backgroundColor;
glideraService.getTransaction(token, tx.transactionUuid, function(error, tx) {
$scope.tx = tx;
});
$scope.cancel = function() {
$modalInstance.dismiss('cancel');
};
};
var modalInstance = $modal.open({
templateUrl: 'views/modals/glidera-tx-details.html',
windowClass: animatedSlideRight,
controller: ModalInstanceCtrl,
});
modalInstance.result.finally(function() {
var m = angular.element(document.getElementsByClassName('reveal-modal'));
m.addClass('slideOutRight');
});
};
});

View file

@ -0,0 +1,37 @@
'use strict';
angular.module('copayApp.controllers').controller('glideraUriController',
function($scope, $stateParams, $timeout, profileService, glideraService, storageService, go) {
this.submitOauthCode = function(code) {
var fc = profileService.focusedClient;
var self = this;
this.loading = true;
this.error = null;
$timeout(function() {
glideraService.getToken(code, function(err, data) {
self.loading = null;
if (err) {
self.error = err;
$timeout(function() {
$scope.$apply();
}, 100);
}
else if (data && data.access_token) {
storageService.setGlideraToken(fc.credentials.network, data.access_token, function() {
$scope.$emit('Local/GlideraTokenUpdated', data.access_token);
$timeout(function() {
go.path('glidera');
$scope.$apply();
}, 100);
});
}
});
}, 100);
};
this.checkCode = function() {
this.code = $stateParams.code;
this.submitOauthCode(this.code);
};
});

View file

@ -1,6 +1,6 @@
'use strict';
angular.module('copayApp.controllers').controller('indexController', function($rootScope, $scope, $log, $filter, $timeout, lodash, go, profileService, configService, isCordova, rateService, storageService, addressService, gettextCatalog, gettext, amMoment, nodeWebkit, addonManager, feeService, isChromeApp, bwsError, utilService, $state) {
angular.module('copayApp.controllers').controller('indexController', function($rootScope, $scope, $log, $filter, $timeout, lodash, go, profileService, configService, isCordova, rateService, storageService, addressService, gettextCatalog, gettext, amMoment, nodeWebkit, addonManager, feeService, isChromeApp, bwsError, utilService, $state, glideraService) {
var self = this;
self.isCordova = isCordova;
self.onGoingProcess = {};
@ -113,6 +113,13 @@ angular.module('copayApp.controllers').controller('indexController', function($r
self.pendingTxProposalsCountForUs = null;
self.setSpendUnconfirmed();
self.glideraToken = null;
self.glideraError = null;
self.glideraPermissions = null;
self.glideraEmail = null;
self.glideraPersonalInfo = null;
self.glideraTxs = null;
$timeout(function() {
self.hasProfile = true;
self.noFocusedWallet = false;
@ -134,6 +141,7 @@ angular.module('copayApp.controllers').controller('indexController', function($r
self.copayers = [];
self.updateColor();
self.updateAlias();
self.initGlidera();
storageService.getBackupFlag(self.walletId, function(err, val) {
self.needsBackup = self.network == 'testnet' ? false : !val;
@ -145,18 +153,6 @@ angular.module('copayApp.controllers').controller('indexController', function($r
self.setTab = function(tab, reset, tries) {
tries = tries || 0;
// check if the whole menu item passed
if (typeof tab == 'object') {
if (tab.open) {
if (tab.link) {
self.tab = tab.link;
}
tab.open();
return;
} else {
return self.setTab(tab.link);
}
}
if (self.tab === tab && !reset)
return;
@ -166,30 +162,27 @@ angular.module('copayApp.controllers').controller('indexController', function($r
}, 300);
}
if (!self.tab || !$state.is('walletHome'))
if (!self.tab)
self.tab = 'walletHome';
go.path('walletHome', function() {
if (document.getElementById(self.tab)) {
document.getElementById(self.tab).className = 'tab-out tab-view ' + self.tab;
var old = document.getElementById('menu-' + self.tab);
if (old) {
old.className = '';
}
if (document.getElementById(self.tab)) {
document.getElementById(self.tab).className = 'tab-out tab-view ' + self.tab;
var old = document.getElementById('menu-' + self.tab);
if (old) {
old.className = '';
}
}
if (document.getElementById(tab)) {
document.getElementById(tab).className = 'tab-in tab-view ' + tab;
var newe = document.getElementById('menu-' + tab);
if (newe) {
newe.className = 'active';
}
if (document.getElementById(tab)) {
document.getElementById(tab).className = 'tab-in tab-view ' + tab;
var newe = document.getElementById('menu-' + tab);
if (newe) {
newe.className = 'active';
}
}
self.tab = tab;
$rootScope.$emit('Local/TabChanged', tab);
});
self.tab = tab;
$rootScope.$emit('Local/TabChanged', tab);
};
@ -400,6 +393,7 @@ angular.module('copayApp.controllers').controller('indexController', function($r
self.setOngoingProcess('updatingPendingTxps', true);
$log.debug('Updating PendingTxps');
fc.getTxProposals({}, function(err, txps) {
console.log('[index.js:395]',txps); //TODO
self.setOngoingProcess('updatingPendingTxps', false);
if (err) {
self.handleError(err);
@ -843,6 +837,79 @@ angular.module('copayApp.controllers').controller('indexController', function($r
}), 'name');
};
self.initGlidera = function(accessToken) {
if (self.isShared) return;
self.glideraStatus = null;
glideraService.setCredentials(self.network);
var getToken = function(cb) {
if (accessToken) {
cb(null, accessToken);
} else {
storageService.getGlideraToken(self.network, cb);
}
};
getToken(function(err, accessToken) {
if (err || !accessToken) return;
else {
self.glideraLoading = gettext('Connecting to Glidera...');
glideraService.getAccessTokenPermissions(accessToken, function(err, p) {
self.glideraLoading = null;
if (err) {
self.glideraError = err;
}
else {
self.glideraToken = accessToken;
self.glideraPermissions = p;
self.updateGlidera({ fullUpdate: true});
}
});
}
});
};
self.updateGlidera = function(opts) {
if (!self.glideraToken || !self.glideraPermissions) return;
var accessToken = self.glideraToken;
var permissions = self.glideraPermissions;
opts = opts || {};
glideraService.getStatus(accessToken, function(err, data) {
self.glideraStatus = data;
});
glideraService.getLimits(accessToken, function(err, limits) {
self.glideraLimits = limits;
});
if (permissions.transaction_history) {
self.glideraLoadingHistory = gettext('Getting Glidera transactions...');
glideraService.getTransactions(accessToken, function(err, data) {
self.glideraLoadingHistory = null;
self.glideraTxs = data;
});
}
if (permissions.view_email_address && opts.fullUpdate) {
self.glideraLoadingEmail = gettext('Getting Glidera Email...');
glideraService.getEmail(accessToken, function(err, data) {
self.glideraLoadingEmail = null;
self.glideraEmail = data.email;
});
}
if (permissions.personal_info && opts.fullUpdate) {
self.glideraLoadingPersonalInfo = gettext('Getting Glidera Personal Information...');
glideraService.getPersonalInfo(accessToken, function(err, data) {
self.glideraLoadingPersonalInfo = null;
self.glideraPersonalInfo = data;
});
}
};
// UX event handlers
$rootScope.$on('Local/ColorUpdated', function(event) {
self.updateColor();
@ -892,6 +959,18 @@ angular.module('copayApp.controllers').controller('indexController', function($r
});
});
$rootScope.$on('Local/GlideraTokenUpdated', function(event, accessToken) {
self.initGlidera(accessToken);
});
$rootScope.$on('Local/GlideraTx', function(event, accessToken, permissions) {
self.updateGlidera();
});
$rootScope.$on('Local/GlideraError', function(event) {
self.debouncedUpdate();
});
$rootScope.$on('Local/UnitSettingUpdated', function(event) {
self.updateAll();
self.updateTxHistory();
@ -989,8 +1068,8 @@ angular.module('copayApp.controllers').controller('indexController', function($r
});
});
lodash.each(['NewTxProposal', 'TxProposalFinallyRejected', 'TxProposalRemoved',
'Local/NewTxProposal', 'Local/TxProposalAction', 'ScanFinished'
lodash.each(['NewTxProposal', 'TxProposalFinallyRejected', 'TxProposalRemoved', 'NewOutgoingTxByThirdParty',
'Local/NewTxProposal', 'Local/TxProposalAction', 'ScanFinished', 'Local/GlideraTx'
], function(eventName) {
$rootScope.$on(eventName, function(event, untilItChanges) {
self.updateAll({

View file

@ -0,0 +1,61 @@
'use strict';
angular.module('copayApp.controllers').controller('preferencesGlideraController',
function($scope, $modal, $timeout, profileService, applicationService, glideraService, storageService) {
this.getEmail = function(token) {
var self = this;
glideraService.getEmail(token, function(error, data) {
self.email = data;
});
};
this.getPersonalInfo = function(token) {
var self = this;
glideraService.getPersonalInfo(token, function(error, info) {
self.personalInfo = info;
});
};
this.getStatus = function(token) {
var self = this;
glideraService.getStatus(token, function(error, data) {
self.status = data;
});
};
this.getLimits = function(token) {
var self = this;
glideraService.getLimits(token, function(error, limits) {
self.limits = limits;
});
};
this.revokeToken = function() {
var fc = profileService.focusedClient;
var ModalInstanceCtrl = function($scope, $modalInstance) {
$scope.ok = function() {
$modalInstance.close(true);
};
$scope.cancel = function() {
$modalInstance.dismiss();
};
};
var modalInstance = $modal.open({
templateUrl: 'views/modals/glidera-confirmation.html',
windowClass: 'full',
controller: ModalInstanceCtrl
});
modalInstance.result.then(function(ok) {
if (ok) {
storageService.removeGlideraToken(fc.credentials.network, function() {
$timeout(function() {
applicationService.restart();
}, 100);
});
}
});
};
});

View file

@ -0,0 +1,158 @@
'use strict';
angular.module('copayApp.controllers').controller('sellGlideraController',
function($scope, $timeout, $log, gettext, gettextCatalog, configService, profileService, addressService, feeService, glideraService, bwsError) {
var config = configService.getSync();
this.data = {};
this.show2faCodeInput = null;
this.success = null;
this.error = null;
this.loading = null;
this.currentSpendUnconfirmed = config.wallet.spendUnconfirmed;
this.currentFeeLevel = config.wallet.settings.feeLevel || 'normal';
this.getSellPrice = function(token, price) {
var self = this;
if (!price || (price && !price.qty && !price.fiat)) {
this.error = null;
this.sellPrice = null;
return;
}
glideraService.sellPrice(token, price, function(err, sellPrice) {
if (err) {
self.error = gettext('Could not get exchange information. Please, try again.');
}
else {
self.error = null;
self.sellPrice = sellPrice;
}
});
};
this.get2faCode = function(token) {
var self = this;
this.loading = gettext('Sending 2FA code...');
$timeout(function() {
glideraService.get2faCode(token, function(err, sent) {
self.loading = null;
if (err) {
self.error = gettext('Could not send confirmation code to your phone');
}
else {
self.show2faCodeInput = sent;
}
});
}, 100);
};
this.createTx = function(token, permissions, twoFaCode) {
var self = this;
var fc = profileService.focusedClient;
self.error = null;
this.loading = gettext('Selling Bitcoin...');
$timeout(function() {
addressService.getAddress(fc.credentials.walletId, null, function(err, refundAddress) {
if (!refundAddress) {
self.loading = null;
self.error = bwsError.msg(err);
return;
}
glideraService.getSellAddress(token, function(error, sellAddress) {
if (!sellAddress) {
self.loading = null;
self.error = gettext('Could not get the destination bitcoin address');
return;
}
var amount = parseInt((self.sellPrice.qty * 100000000).toFixed(0));
feeService.getCurrentFeeValue(self.currentFeeLevel, function(err, feePerKb) {
if (err) $log.debug(err);
fc.sendTxProposal({
toAddress: sellAddress,
amount: amount,
message: 'Glidera transaction',
customData: {'glideraToken': token},
payProUrl: null,
feePerKb: feePerKb,
excludeUnconfirmedUtxos: self.currentSpendUnconfirmed ? false : true
}, function(err, txp) {
if (err) {
profileService.lockFC();
$log.error(err);
$timeout(function() {
self.loading = null;
self.error = bwsError.msg(err, gettextCatalog.getString('Error'));
}, 1);
return;
}
if (!fc.canSign()) {
self.loading = null;
$log.info('No signing proposal: No private key');
return;
}
_signTx(txp, function(err, txp, rawTx) {
profileService.lockFC();
if (err) {
self.loading = null;
self.error = err;
$scope.$apply();
}
else {
var data = {
refundAddress: refundAddress,
signedTransaction: rawTx,
priceUuid: self.sellPrice.priceUuid,
useCurrentPrice: self.sellPrice.priceUuid ? false : true,
ip: null
};
glideraService.sell(token, twoFaCode, data, function(err, data) {
self.loading = null;
if (err) {
self.error = err;
fc.removeTxProposal(txp, function(err, txpb) {
$timeout(function() {
$scope.$emit('Local/GlideraError');
}, 100);
});
}
else {
self.success = data;
$scope.$emit('Local/GlideraTx');
}
});
}
});
});
});
});
});
}, 100);
};
var _signTx = function(txp, cb) {
var self = this;
var fc = profileService.focusedClient;
fc.signTxProposal(txp, function(err, signedTx) {
profileService.lockFC();
if (err) {
err = bwsError.msg(err, gettextCatalog.getString('Could not accept payment'));
return cb(err);
}
else {
if (signedTx.status == 'accepted') {
return cb(null, txp, signedTx.raw);
} else {
return cb(gettext('The transaction could not be signed'));
}
}
});
};
});

View file

@ -30,8 +30,7 @@ angular.module('copayApp.controllers').controller('walletHomeController', functi
if (isChromeApp) {
var animatedSlideUp = 'full';
var animatedSlideRight = 'full';
}
else {
} else {
var animatedSlideUp = 'full animated slideInUp';
var animatedSlideRight = 'full animated slideInRight';
}
@ -174,18 +173,30 @@ angular.module('copayApp.controllers').controller('walletHomeController', functi
});
};
this.openTxpModal = function(tx, copayers) {
var GLIDERA_LOCK_TIME = 6 * 60 * 60 ;
// isGlidera flag is a security mesure so glidera status is not
// only determined by the tx.message
this.openTxpModal = function(tx, copayers, isGlidera) {
var fc = profileService.focusedClient;
var refreshUntilItChanges = false;
var currentSpendUnconfirmed = $scope.currentSpendUnconfirmed;
var ModalInstanceCtrl = function($scope, $modalInstance) {
$scope.error = null;
$scope.tx = tx;
$scope.copayers = copayers
$scope.copayerId = fc.credentials.copayerId;
$scope.canSign = fc.canSign();
$scope.loading = null;
$scope.color = fc.backgroundColor;
// ToDo: use tx.customData instead of tx.message
if (tx.message === 'Glidera transaction' && isGlidera) {
tx.isGlidera = true;
if (tx.canBeRemoved) {
tx.canBeRemoved = (Date.now()/1000 - (tx.ts || tx.createdOn)) > GLIDERA_LOCK_TIME;
}
}
$scope.tx = tx;
refreshUntilItChanges = false;
$scope.currentSpendUnconfirmed = currentSpendUnconfirmed;

View file

@ -9,8 +9,14 @@ angular.element(document).ready(function() {
var handleBitcoinURI = function(url) {
if (!url) return;
if (url.indexOf('glidera') != -1) {
url = '#/uri-glidera' + url.replace('bitcoin://glidera', '');
}
else {
url = '#/uri-payment/' + url;
}
setTimeout(function() {
window.location = '#/uri-payment/' + url;
window.location = url;
}, 1000);
};

View file

@ -288,6 +288,56 @@ angular
},
}
})
.state('uriglidera', {
url: '/uri-glidera?code',
needProfile: true,
views: {
'main': {
templateUrl: 'views/glideraUri.html'
},
}
})
.state('glidera', {
url: '/glidera',
walletShouldBeComplete: true,
needProfile: true,
views: {
'main': {
templateUrl: 'views/glidera.html'
},
}
})
.state('buyGlidera', {
url: '/buy',
walletShouldBeComplete: true,
needProfile: true,
views: {
'main': {
templateUrl: 'views/buyGlidera.html'
},
}
})
.state('sellGlidera', {
url: '/sell',
walletShouldBeComplete: true,
needProfile: true,
views: {
'main': {
templateUrl: 'views/sellGlidera.html'
},
}
})
.state('preferencesGlidera', {
url: '/preferencesGlidera',
walletShouldBeComplete: true,
needProfile: true,
views: {
'main': {
templateUrl: 'views/preferencesGlidera.html'
},
}
})
.state('preferencesAdvanced', {
url: '/preferencesAdvanced',
@ -486,11 +536,16 @@ angular
copayers: -1,
cordova: -1,
payment: -1,
uriglidera: -1,
preferences: 11,
glidera: 11,
preferencesColor: 12,
backup: 12,
preferencesAdvanced: 12,
buyGlidera: 12,
sellGlidera: 12,
preferencesGlidera: 12,
delete: 13,
preferencesLanguage: 12,
preferencesUnit: 12,

View file

@ -0,0 +1,253 @@
'use strict';
angular.module('copayApp.services').factory('glideraService', function($http, $log, isCordova) {
var root = {};
var credentials = {};
root.setCredentials = function(network) {
if (network == 'testnet') {
credentials.HOST = 'https://sandbox.glidera.io';
if (isCordova) {
credentials.REDIRECT_URI = 'bitcoin://glidera';
credentials.CLIENT_ID = 'dfc56e4336e32bb8ba46dde34f3d7d6d';
credentials.CLIENT_SECRET = '5eb679058f6c7eb81123162323d4fba5';
}
else {
credentials.REDIRECT_URI = 'urn:ietf:wg:oauth:2.0:oob';
credentials.CLIENT_ID = '9915b6ffa6dc3baffb87135ed3873d49';
credentials.CLIENT_SECRET = 'd74eda05b9c6a228fd5c85cfbd0eb7eb';
}
}
else {
credentials.HOST = 'https://glidera.io';
credentials.REDIRECT_URI = 'urn:ietf:wg:oauth:2.0:oob';
credentials.CLIENT_ID = '';
credentials.CLIENT_SECRET = '';
};
};
root.getOauthCodeUrl = function() {
return credentials.HOST
+ '/oauth2/auth?response_type=code&client_id='
+ credentials.CLIENT_ID
+ '&redirect_uri='
+ credentials.REDIRECT_URI;
};
root.getToken = function(code, cb) {
var req = {
method: 'POST',
url: credentials.HOST + '/api/v1/oauth/token',
headers: {
'Content-Type': 'application/json',
'Accept': 'application/json'
},
data: {
grant_type : 'authorization_code',
code: code,
client_id : credentials.CLIENT_ID,
client_secret: credentials.CLIENT_SECRET,
redirect_uri: credentials.REDIRECT_URI
}
};
$http(req).then(function(data) {
$log.info('Glidera Authorization Access Token: SUCCESS');
return cb(null, data.data);
}, function(data) {
$log.error('Glidera Authorization Access Token: ERROR ' + data.statusText);
return cb('Glidera Authorization Access Token: ERROR ' + data.statusText);
});
};
var _get = function(endpoint, token) {
return {
method: 'GET',
url: credentials.HOST + '/api/v1' + endpoint,
headers: {
'Content-Type': 'application/json',
'Accept': 'application/json',
'Authorization': 'Bearer ' + token
}
};
};
root.getAccessTokenPermissions = function(token, cb) {
if (!token) return cb('Invalid Token');
$http(_get('/oauth/token', token)).then(function(data) {
$log.info('Glidera Access Token Permissions: SUCCESS');
return cb(null, data.data);
}, function(data) {
$log.error('Glidera Access Token Permissions: ERROR ' + data.statusText);
return cb('Glidera Access Token Permissions: ERROR ' + data.statusText);
});
};
root.getEmail = function(token, cb) {
if (!token) return cb('Invalid Token');
$http(_get('/user/email', token)).then(function(data) {
$log.info('Glidera Get Email: SUCCESS');
return cb(null, data.data);
}, function(data) {
$log.error('Glidera Get Email: ERROR ' + data.statusText);
return cb('Glidera Get Email: ERROR ' + data.statusText);
});
};
root.getPersonalInfo = function(token, cb) {
if (!token) return cb('Invalid Token');
$http(_get('/user/personalinfo', token)).then(function(data) {
$log.info('Glidera Get Personal Info: SUCCESS');
return cb(null, data.data);
}, function(data) {
$log.error('Glidera Get Personal Info: ERROR ' + data.statusText);
return cb('Glidera Get Personal Info: ERROR ' + data.statusText);
});
};
root.getStatus = function(token, cb) {
if (!token) return cb('Invalid Token');
$http(_get('/user/status', token)).then(function(data) {
$log.info('Glidera User Status: SUCCESS');
return cb(null, data.data);
}, function(data) {
$log.error('Glidera User Status: ERROR ' + data.statusText);
return cb('Glidera User Status: ERROR ' + data.statusText);
});
};
root.getLimits = function(token, cb) {
if (!token) return cb('Invalid Token');
$http(_get('/user/limits', token)).then(function(data) {
$log.info('Glidera Transaction Limits: SUCCESS');
return cb(null, data.data);
}, function(data) {
$log.error('Glidera Transaction Limits: ERROR ' + data.statusText);
return cb('Glidera Transaction Limits: ERROR ' + data.statusText);
});
};
root.getTransactions = function(token, cb) {
if (!token) return cb('Invalid Token');
$http(_get('/transaction', token)).then(function(data) {
$log.info('Glidera Transactions: SUCCESS');
return cb(null, data.data.transactions);
}, function(data) {
$log.error('Glidera Transactions: ERROR ' + data.statusText);
return cb('Glidera Transactions: ERROR ' + data.statusText);
});
};
root.getTransaction = function(token, txid, cb) {
if (!token) return cb('Invalid Token');
if (!txid) return cb('TxId required');
$http(_get('/transaction/' + txid, token)).then(function(data) {
$log.info('Glidera Transaction: SUCCESS');
return cb(null, data.data);
}, function(data) {
$log.error('Glidera Transaction: ERROR ' + data.statusText);
return cb('Glidera Transaction: ERROR ' + data.statusText);
});
};
root.getSellAddress = function(token, cb) {
if (!token) return cb('Invalid Token');
$http(_get('/user/create_sell_address', token)).then(function(data) {
$log.info('Glidera Create Sell Address: SUCCESS');
return cb(null, data.data.sellAddress);
}, function(data) {
$log.error('Glidera Create Sell Address: ERROR ' + data.statusText);
return cb('Glidera Create Sell Address: ERROR ' + data.statusText);
});
};
root.get2faCode = function(token, cb) {
if (!token) return cb('Invalid Token');
$http(_get('/authentication/get2faCode', token)).then(function(data) {
$log.info('Glidera Sent 2FA code by SMS: SUCCESS');
return cb(null, data.status == 200 ? true : false);
}, function(data) {
$log.error('Glidera Sent 2FA code by SMS: ERROR ' + data.statusText);
return cb('Glidera Sent 2FA code by SMS: ERROR ' + data.statusText);
});
};
var _post = function(endpoint, token, twoFaCode, data) {
return {
method: 'POST',
url: credentials.HOST + '/api/v1' + endpoint,
headers: {
'Content-Type': 'application/json',
'Accept': 'application/json',
'Authorization': 'Bearer ' + token,
'2FA_CODE': twoFaCode
},
data: data
};
};
root.sellPrice = function(token, price, cb) {
var data = {
qty: price.qty,
fiat: price.fiat
};
$http(_post('/prices/sell', token, null, data)).then(function(data) {
$log.info('Glidera Sell Price: SUCCESS');
return cb(null, data.data);
}, function(data) {
$log.error('Glidera Sell Price: ERROR ' + data.statusText);
return cb('Glidera Sell Price: ERROR ' + data.statusText);
});
};
root.sell = function(token, twoFaCode, data, cb) {
var data = {
refundAddress: data.refundAddress,
signedTransaction: data.signedTransaction,
priceUuid: data.priceUuid,
useCurrentPrice: data.useCurrentPrice,
ip: data.ip
};
$http(_post('/sell', token, twoFaCode, data)).then(function(data) {
$log.info('Glidera Sell: SUCCESS');
return cb(null, data.data);
}, function(data) {
$log.error('Glidera Sell Request: ERROR ' + data.statusText);
return cb('Glidera Sell Request: ERROR ' + data.statusText);
});
};
root.buyPrice = function(token, price, cb) {
var data = {
qty: price.qty,
fiat: price.fiat
};
$http(_post('/prices/buy', token, null, data)).then(function(data) {
$log.info('Glidera Buy Price: SUCCESS');
return cb(null, data.data);
}, function(data) {
$log.error('Glidera Buy Price: ERROR ' + data.statusText);
return cb('Glidera Buy Price: ERROR ' + data.statusText);
});
};
root.buy = function(token, twoFaCode, data, cb) {
var data = {
destinationAddress: data.destinationAddress,
qty: data.qty,
priceUuid: data.priceUuid,
useCurrentPrice: data.useCurrentPrice,
ip: data.ip
};
$http(_post('/buy', token, twoFaCode, data)).then(function(data) {
$log.info('Glidera Buy: SUCCESS');
return cb(null, data.data);
}, function(data) {
$log.error('Glidera Buy Request: ERROR ' + data.statusText);
return cb('Glidera Buy Request: ERROR ' + data.statusText);
});
};
return root;
});

View file

@ -29,12 +29,13 @@ angular.module('copayApp.services').factory('go', function($window, $rootScope,
}
};
root.openExternalLink = function(url) {
root.openExternalLink = function(url, target) {
if (nodeWebkit.isDefined()) {
nodeWebkit.openExternalLink(url);
}
else {
var ref = window.open(url, '_blank', 'location=no');
target = target || '_blank';
var ref = window.open(url, target, 'location=no');
}
};
@ -89,8 +90,8 @@ angular.module('copayApp.services').factory('go', function($window, $rootScope,
root.path(path);
};
$rootScope.openExternalLink = function(url) {
root.openExternalLink(url);
$rootScope.openExternalLink = function(url, target) {
root.openExternalLink(url, target);
};

View file

@ -192,5 +192,17 @@ angular.module('copayApp.services')
storage.get('remotePrefStored', cb);
};
root.setGlideraToken = function(network, token, cb) {
storage.set('glideraToken-' + network, token, cb);
};
root.getGlideraToken = function(network, cb) {
storage.get('glideraToken-' + network, cb);
};
root.removeGlideraToken = function(network, cb) {
storage.remove('glideraToken-' + network, cb);
};
return root;
});