taler-docs

Documentation for GNU Taler components, APIs and protocols
Log | Files | Refs | README | LICENSE

commit 44f24924a827ad1e745173d89b207fba6abb3cc7
parent c8dec415cadf6a9263704ef29687fd98ae467df4
Author: Özgür Kesim <oec-taler@kesim.org>
Date:   Sat, 13 Dec 2025 12:36:23 +0100

cleanup of some issues reported by sphinx

Diffstat:
D_static/_static/taler-logo.svg | 2--
Mconf.py | 6+++++-
Mcore/api-common.rst | 50+++++++++++++++++++++++++++++++++++++++++++++++++-
Mcore/api-exchange.rst | 54++++++++++++++++++++++--------------------------------
Mcore/index.rst | 3++-
Mdeployments/tops.rst | 51++++++++++++++++++++++++---------------------------
Mdesign-documents/053-wallet-ui.rst | 4++++
Mimages/taler-logo.svg | 55+++++++++++++++++++++++++++++++++++++++++++++++++++++--
8 files changed, 159 insertions(+), 66 deletions(-)

diff --git a/_static/_static/taler-logo.svg b/_static/_static/taler-logo.svg @@ -1 +0,0 @@ -<?xml version="1.0" encoding="UTF-8" standalone="no"?><svg xmlns="http://www.w3.org/2000/svg" width="670" height="300" viewBox="0 0 201 90"><g fill="#0042b3" fill-rule="evenodd" stroke-width=".3"><path d="M86.7 1.1c15.6 0 29 9.4 36 23.2h-5.9A35.1 35.1 0 0086.7 6.5C67 6.5 51 23.6 51 44.7c0 10.4 3.8 19.7 10 26.6a31.4 31.4 0 01-4.2 3A45.2 45.2 0 0146 44.7c0-24 18.2-43.6 40.7-43.6zm35.8 64.3a40.4 40.4 0 01-39 22.8c3-1.5 6-3.5 8.6-5.7a35.6 35.6 0 0024.6-17.1z"/><path d="M64.2 1.1l3.1.1c-3 1.6-5.9 3.5-8.5 5.8a37.5 37.5 0 00-30.2 37.7c0 14.3 7.3 26.7 18 33.3a29.6 29.6 0 01-8.5.2c-9-8-14.6-20-14.6-33.5 0-24 18.2-43.6 40.7-43.6zm5.4 81.4a35.6 35.6 0 0024.6-17.1h5.9a40.4 40.4 0 01-39 22.8c3-1.5 5.9-3.5 8.5-5.7zm24.8-58.2a37 37 0 00-12.6-12.8 29.6 29.6 0 018.5-.2c4 3.6 7.4 8 9.9 13z"/><path d="M41.8 1.1c1 0 2 0 3.1.2-3 1.5-5.9 3.4-8.5 5.6A37.5 37.5 0 006.1 44.7c0 21.1 16 38.3 35.7 38.3 12.6 0 23.6-7 30-17.6h5.8a40.4 40.4 0 01-35.8 23C19.3 88.4 1 68.8 1 44.7c0-24 18.2-43.6 40.7-43.6zm30.1 23.2a38.1 38.1 0 00-4.5-6.1c1.3-1.2 2.7-2.2 4.3-3 2.3 2.7 4.4 5.8 6 9.1z"/></g><path d="M76.1 34.4h9.2v-5H61.9v5H71v26h5.1zM92.6 52.9h13.7l3 7.4h5.3l-12.7-31.2h-4.7L84.5 60.3h5.2zm11.8-4.9h-9.9l5-12.4zM123.8 29.4h-4.6v31h20.6v-5h-16zM166.5 29.4H145v31h21.6v-5H150v-8.3h14.5v-4.9h-14.5v-8h16.4zM191.2 39.5c0 1.6-.5 2.8-1.6 3.8s-2.6 1.4-4.4 1.4h-7.4V34.3h7.4c1.9 0 3.4.4 4.4 1.3 1 .9 1.6 2.2 1.6 3.9zm6 20.8l-7.7-11.7c1-.3 1.9-.7 2.7-1.3a8.8 8.8 0 003.6-4.6c.4-1 .5-2.2.5-3.5 0-1.5-.2-2.9-.7-4.1a8.4 8.4 0 00-2.1-3.1c-1-.8-2-1.5-3.4-2-1.3-.4-2.8-.6-4.5-.6h-12.9v31h5V49.4h6.5l7 10.8z"/></svg> -\ No newline at end of file diff --git a/conf.py b/conf.py @@ -153,13 +153,17 @@ html_theme = "sphinx_book_theme" html_theme_options = { # Set the name of the project to appear in the sidebar "home_page_in_toc": True, + "collapse_navigation": True, + "collapse_navbar": True, "logo": { + "alt_text": "GNU Taler", "image_light": "images/taler-logo.svg", "image_dark": "images/taler-logo-white.svg", }, "show_navbar_depth": 1, "show_toc_level": 2, - "extra_navbar": "<div class='admonition note'><p class='admonition-title'>Questions or Suggestions?</p><p>Do you have any question or suggestion regarding the documentation? Go to our <a href='https://ich.taler.net/t/lost-in-documentation/255'>TALER Integration Community Hub</a>!</p></div>", + "use_fullscreen_button": False, + "use_download_button": False, "extra_footer": "<div>Do you have any question or suggestion regarding the documentation? Go to our <a href='https://ich.taler.net/t/lost-in-documentation/255'>TALER Integration Community Hub</a>!</div>", } diff --git a/core/api-common.rst b/core/api-common.rst @@ -660,6 +660,11 @@ Keys // RSA public key converted to Crockford `Base32`. type RsaPublicKey = string; +.. ts:def:: PursePublicKey + + type PursePublicKey = EddsaPublicKey; + + .. _blinded-coin: Blinded coin @@ -771,6 +776,49 @@ Signatures type DenominationBlindingKeySecret = | RsaBlindingKeySecret; + +.. ts:def:: DenomCipher + + interface DenomCipher = { + // specifier for the ciper + cipher: string; + } + +.. ts:def:: BlindedDenominationSignature + + type BlindedDenominationSignature = DenomCipher & ( + | RsaBlindedDenominationSignature + | CSBlindedDenominationSignature + ) + +.. ts:def:: RsaBlindedDenominationSignature + + interface RsaBlindedDenominationSignature extends DenomCipher { + cipher: "RSA"; + + // (blinded) RSA signature + blinded_rsa_signature: BlindedRsaSignature; + } + +.. ts:def:: CSBlindedDenominationSignature + + interface CSBlindedDenominationSignature extends DenomCipher { + cipher: "CS"; + + // Signer chosen bit value, 0 or 1, used + // in Clause Blind Schnorr to make the + // ROS problem harder. + b: Integer; + + // Blinded scalar calculated from c_b. + s: Cs25519Scalar; + + } +.. ts:def:: PurseContractSignature + + type PurseContractSignature = EddsaSignature + + .. _amount: Amounts @@ -2113,7 +2161,7 @@ within the * purpose.purpose = TALER_SIGNATURE_EXCHANGE_CONFIRM_PURSE_REFUND. */ struct GNUNET_CRYPTO_EccSignaturePurpose purpose; - struct TALER_PursePublicKey purse_pub; + struct TALER_PursePublicKeyP purse_pub; union TALER_CoinSpendPublicKeyP coin_pub; struct TALER_AmountNBO refunded_amount; struct TALER_AmountNBO refund_fee; diff --git a/core/api-exchange.rst b/core/api-exchange.rst @@ -1887,36 +1887,6 @@ exchange. } -.. ts:def:: BlindedDenominationSignature - - type BlindedDenominationSignature = DenomCipher & ( - | RsaBlindedDenominationSignature - | CSBlindedDenominationSignature - ) - -.. ts:def:: RsaBlindedDenominationSignature - - interface RsaBlindedDenominationSignature extends DenomCipher { - cipher: "RSA"; - - // (blinded) RSA signature - blinded_rsa_signature: BlindedRsaSignature; - } - -.. ts:def:: CSBlindedDenominationSignature - - interface CSBlindedDenominationSignature extends DenomCipher { - cipher: "CS"; - - // Signer chosen bit value, 0 or 1, used - // in Clause Blind Schnorr to make the - // ROS problem harder. - b: Integer; - - // Blinded scalar calculated from c_b. - s: Cs25519Scalar; - - } .. ts:def:: AgeWithdrawResponse @@ -2159,7 +2129,7 @@ Melt can be decided by looking at the error code (``TALER_EC_EXCHANGE_GENERIC_INSUFFICIENT_FUNDS`` or ``TALER_EC_EXCHANGE_GENERIC_COIN_CONFLICTING_DENOMINATION_KEY``). - The response is `DepositDoubleSpendError` in both cases. + The response is `MeltForbiddenResponse` in both cases. :http:statuscode:`410 Gone`: The requested denomination key is not yet or no longer valid. It either before the validity start, past the expiration or was revoked. The response is a @@ -2296,6 +2266,25 @@ Melt } + .. ts:def:: MeltForbiddenResponse + + interface MeltForbiddenResponse { + + // Must be TALER_EC_EXCHANGE_GENERIC_INSUFFICIENT_FUNDS + // or TALER_EC_EXCHANGE_GENERIC_COIN_CONFLICTING_DENOMINATION_KEY + code: Integer; + + // A string explaining that the user tried to + // double-spend. + hint: string; + + // EdDSA public key of a coin being double-spent. + coin_pub: EddsaPublicKey; + + // Hash of the public key of the denomination of the coin. + h_denom_pub: HashCode; + + } ^^^^^^^^^^^ Reveal-Melt @@ -3779,7 +3768,7 @@ The GET request should come with the following HTTP headers: // The original coin, from which this coin was derived from // in a call to /refresh, and which was then credited with // the residual value of this coin in a call to /recoup-refresh. - old_coin_pub: EddsPublicKey; + old_coin_pub: EddsaPublicKey; // Signature by the coin over a `TALER_RecoupRequestPS` // with purpose ``TALER_SIGNATURE_WALLET_COIN_RECOUP``. @@ -4723,6 +4712,7 @@ Wallet-to-wallet transfers econtract: EncryptedContract; } + .. http:post:: /purses/$PURSE_PUB/deposit Deposit money into a purse. Used by the buyer for a PULL payment. diff --git a/core/index.rst b/core/index.rst @@ -1,6 +1,6 @@ .. This file is part of GNU TALER. - Copyright (C) 2014-2023 Taler Systems SA + Copyright (C) 2014-2025 Taler Systems SA TALER is free software; you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software @@ -18,6 +18,7 @@ @author Sree Harsha Totakura @author Marcello Stanisci @author Christian Grothoff + @author Özgür Kesim ----------------- API Specification diff --git a/deployments/tops.rst b/deployments/tops.rst @@ -1,9 +1,6 @@ Taler Operations Deployment =========================== -.. contents:: Table of Contents - :depth: 3 - Definitions / Glossary ---------------------- @@ -1992,7 +1989,7 @@ Events: .. code:: javascript if (propBecameTrue(ACCOUNT_OPEN)) { - emit(INCR_ACCOUNT_OPEN); # event-rule 1 + emit(INCR_ACCOUNT_OPEN); // event-rule 1 const isPep = ( newProps.PEP_FOREIGN || @@ -2001,27 +1998,27 @@ Events: ); if (isPep) { - emit(INCR_PEP); # event-rule 2 + emit(INCR_PEP); // event-rule 2 } if (newProps.PEP_FOREIGN) { - emit(INCR_PEP_FOREIGN); # event-rule 3 + emit(INCR_PEP_FOREIGN); // event-rule 3 } if (newProps.PEP_DOMESTIC) { - emit(INCR_PEP_DOMESTIC); # event-rule 4 + emit(INCR_PEP_DOMESTIC); // event-rule 4 } if (newProps.PEP_INTERNATIONAL_ORGANIZATION) { - emit(INCR_PEP_INTERNATIONAL_ORGANIZATION); # event-rule 5 + emit(INCR_PEP_INTERNATIONAL_ORGANIZATION); // event-rule 5 } if (newProps.HIGH_RISK_CUSTOMER) { - emit(INCR_HIGH_RISK_CUSTOMER); # event-rule 6 + emit(INCR_HIGH_RISK_CUSTOMER); // event-rule 6 } if (newProps.HIGH_RISK_COUNTRY) { - emit(INCR_HIGH_RISK_COUNTRY); # event-rule 7 + emit(INCR_HIGH_RISK_COUNTRY); // event-rule 7 } } @@ -2045,22 +2042,22 @@ Events: if (oldProps.ACCOUNT_OPEN) { if (propBecameTrue(PEP_FOREIGN) { - emit(INCR_PEP_FOREIGN); # event-rule 8 + emit(INCR_PEP_FOREIGN); // event-rule 8 } if (propBecameTrue(PEP_INTERNATIONAL_ORGANIZATION) { - emit(INCR_PEP_INTERNATIONAL_ORGANIZATION); # event-rule 9 + emit(INCR_PEP_INTERNATIONAL_ORGANIZATION); // event-rule 9 } if (propBecameTrue(PEP_DOMESTIC) { - emit(INCR_PEP_DOMESTIC); # event-rule 10 + emit(INCR_PEP_DOMESTIC); // event-rule 10 } if (propBecameFalse(PEP_FOREIGN) { - emit(DECR_PEP_FOREIGN); # event-rule 11 + emit(DECR_PEP_FOREIGN); // event-rule 11 } if (propBecameFalse(PEP_INTERNATIONAL_ORGANIZATION) { - emit(DECR_PEP_INTERNATIONAL_ORGANIZATION); # event-rule 12 + emit(DECR_PEP_INTERNATIONAL_ORGANIZATION); // event-rule 12 } if (propBecameFalse(PEP_DOMESTIC) { - emit(DECR_PEP_DOMESTIC); # event-rule 13 + emit(DECR_PEP_DOMESTIC); // event-rule 13 } const wasPep = ( oldProps.PEP_DOMESTIC || @@ -2071,22 +2068,22 @@ Events: newProps.PEP_FOREIGN || newProps.PEP_INTERNATIONAL_ORGANIZATION); if (wasPep && !isPep) { - emit(DECR_PEP); # event-rule 14 + emit(DECR_PEP); // event-rule 14 } if (!wasPep & isPep) { - emit(INCR_PEP); # event-rule 15 + emit(INCR_PEP); // event-rule 15 } if (propBecameTrue(HIGH_RISK_COUNTRY)) { - emit(INCR_HIGH_RISK_COUNTRY); # event-rule 16 + emit(INCR_HIGH_RISK_COUNTRY); // event-rule 16 } if (propBecameFalse(HIGH_RISK_COUNTRY)) { - emit(DECR_HIGH_RISK_COUNTRY); # event-rule 17 + emit(DECR_HIGH_RISK_COUNTRY); // event-rule 17 } if (propBecameTrue(HIGH_RISK_CUSTOMER)) { - emit(INCR_HIGH_RISK_CUSTOMER); # event-rule 18 + emit(INCR_HIGH_RISK_CUSTOMER); // event-rule 18 } if (propBecameFalse(HIGH_RISK_CUSTOMER)) { - emit(DECR_HIGH_RISK_CUSTOMER); # event-rule 19 + emit(DECR_HIGH_RISK_CUSTOMER); // event-rule 19 } } @@ -2124,23 +2121,23 @@ Events: if (newProps.INVESTIGATION_STATE == "REPORTED_SUSPICION_SIMPLE" || newProps.INVESTIGATION_STATE == "REPORTED_SUSPICION_SUBSTANTIATED" || newProps.INVESTIGATION_STATE == "INVESTIGATION_COMPLETED_WITHOUT_SUSPICION") { - emit(INCR_INVESTIGATION_CONCLUDED); # event-rule 20 + emit(INCR_INVESTIGATION_CONCLUDED); // event-rule 20 } if (newProps.INVESTIGATION_STATE == "REPORTED_SUSPICION_SUBSTANTIATED") { - // FIXME-#9676: if possible, we should force the AML officer to tick + // FIXME-//9676: if possible, we should force the AML officer to tick // an extra check-box "I submitted this case to MROS". No need to // actually do anything here server-side, it's more an explicit // acknowledgement/reminder to make really sure this event is only // emitted if the report was files. - emit(MROS_REPORTED_SUSPICION_SUBSTANTIATED); # event-rule 21 + emit(MROS_REPORTED_SUSPICION_SUBSTANTIATED); // event-rule 21 } if (newProps.INVESTIGATION_STATE == "REPORTED_SUSPICION_SIMPLE") { - // FIXME-#9676: if possible, we should force the AML officer to tick + // FIXME-//9676: if possible, we should force the AML officer to tick // an extra check-box "I submitted this case to MROS". No need to // actually do anything here server-side, it's more an explicit // acknowledgement/reminder to make really sure this event is only // emitted if the report was files. - emit(MROS_REPORTED_SUSPICION_SIMPLE); # event-rule 22 + emit(MROS_REPORTED_SUSPICION_SIMPLE); // event-rule 22 } } diff --git a/design-documents/053-wallet-ui.rst b/design-documents/053-wallet-ui.rst @@ -509,21 +509,25 @@ Proposed Design ^^^^^^^^^^^^^^^ .. image:: ../screenshots/design/cta-withdraw-1.png + After choosing "Withdraw", the user is presented with this screen. The keyboard for amount entry automatically opens. The Withdraw button is disabled until a valid amount is entered. Once a valid amount is provided, the button is enabled and displayed with the primary color. .. image:: ../screenshots/design/cta-withdraw-2.png + The user can select a currency from a dropdown list. A warning icon appears next to the currency selector; tapping it opens a dialog (see next image). The warning icon uses the warning color from the :doc:`066-wallet-color-scheme`. .. image:: ../screenshots/design/cta-withdraw-3.png + The warning dialog displays the message: "The service provider is not trusted by the developers of this wallet." Colors warningContainer and onWarningContainer are applied here. .. image:: ../screenshots/design/cta-withdraw-4.png + If applicable, fees are displayed below the amount input field. Below the amount section, amount shortcuts defined by the exchange are shown for quick selection. diff --git a/images/taler-logo.svg b/images/taler-logo.svg @@ -1 +1,53 @@ -<?xml version="1.0" encoding="UTF-8" standalone="no"?><svg xmlns="http://www.w3.org/2000/svg" width="670" height="300" viewBox="0 0 201 90"><g fill="#0042b3" fill-rule="evenodd" stroke-width=".3"><path d="M86.7 1.1c15.6 0 29 9.4 36 23.2h-5.9A35.1 35.1 0 0086.7 6.5C67 6.5 51 23.6 51 44.7c0 10.4 3.8 19.7 10 26.6a31.4 31.4 0 01-4.2 3A45.2 45.2 0 0146 44.7c0-24 18.2-43.6 40.7-43.6zm35.8 64.3a40.4 40.4 0 01-39 22.8c3-1.5 6-3.5 8.6-5.7a35.6 35.6 0 0024.6-17.1z"/><path d="M64.2 1.1l3.1.1c-3 1.6-5.9 3.5-8.5 5.8a37.5 37.5 0 00-30.2 37.7c0 14.3 7.3 26.7 18 33.3a29.6 29.6 0 01-8.5.2c-9-8-14.6-20-14.6-33.5 0-24 18.2-43.6 40.7-43.6zm5.4 81.4a35.6 35.6 0 0024.6-17.1h5.9a40.4 40.4 0 01-39 22.8c3-1.5 5.9-3.5 8.5-5.7zm24.8-58.2a37 37 0 00-12.6-12.8 29.6 29.6 0 018.5-.2c4 3.6 7.4 8 9.9 13z"/><path d="M41.8 1.1c1 0 2 0 3.1.2-3 1.5-5.9 3.4-8.5 5.6A37.5 37.5 0 006.1 44.7c0 21.1 16 38.3 35.7 38.3 12.6 0 23.6-7 30-17.6h5.8a40.4 40.4 0 01-35.8 23C19.3 88.4 1 68.8 1 44.7c0-24 18.2-43.6 40.7-43.6zm30.1 23.2a38.1 38.1 0 00-4.5-6.1c1.3-1.2 2.7-2.2 4.3-3 2.3 2.7 4.4 5.8 6 9.1z"/></g><path d="M76.1 34.4h9.2v-5H61.9v5H71v26h5.1zM92.6 52.9h13.7l3 7.4h5.3l-12.7-31.2h-4.7L84.5 60.3h5.2zm11.8-4.9h-9.9l5-12.4zM123.8 29.4h-4.6v31h20.6v-5h-16zM166.5 29.4H145v31h21.6v-5H150v-8.3h14.5v-4.9h-14.5v-8h16.4zM191.2 39.5c0 1.6-.5 2.8-1.6 3.8s-2.6 1.4-4.4 1.4h-7.4V34.3h7.4c1.9 0 3.4.4 4.4 1.3 1 .9 1.6 2.2 1.6 3.9zm6 20.8l-7.7-11.7c1-.3 1.9-.7 2.7-1.3a8.8 8.8 0 003.6-4.6c.4-1 .5-2.2.5-3.5 0-1.5-.2-2.9-.7-4.1a8.4 8.4 0 00-2.1-3.1c-1-.8-2-1.5-3.4-2-1.3-.4-2.8-.6-4.5-.6h-12.9v31h5V49.4h6.5l7 10.8z"/></svg> -\ No newline at end of file +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<svg + width="196.2" + height="87.300003" + viewBox="0 0 196.2 87.300004" + version="1.1" + id="svg4" + sodipodi:docname="taler-logo.svg" + inkscape:version="1.4.2 (ebf0e940d0, 2025-05-08)" + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" + xmlns="http://www.w3.org/2000/svg" + xmlns:svg="http://www.w3.org/2000/svg"> + <defs + id="defs4" /> + <sodipodi:namedview + id="namedview4" + pagecolor="#ffffff" + bordercolor="#000000" + borderopacity="0.25" + inkscape:showpageshadow="2" + inkscape:pageopacity="0.0" + inkscape:pagecheckerboard="0" + inkscape:deskcolor="#d1d1d1" + inkscape:zoom="2.0492537" + inkscape:cx="97.840495" + inkscape:cy="42.942462" + inkscape:window-width="3836" + inkscape:window-height="2113" + inkscape:window-x="0" + inkscape:window-y="0" + inkscape:window-maximized="1" + inkscape:current-layer="svg4" /> + <g + fill="#0042b3" + fill-rule="evenodd" + stroke-width="0.3" + id="g3" + transform="translate(-1,-1.1)"> + <path + d="m 86.7,1.1 c 15.6,0 29,9.4 36,23.2 h -5.9 A 35.1,35.1 0 0 0 86.7,6.5 C 67,6.5 51,23.6 51,44.7 c 0,10.4 3.8,19.7 10,26.6 a 31.4,31.4 0 0 1 -4.2,3 A 45.2,45.2 0 0 1 46,44.7 C 46,20.7 64.2,1.1 86.7,1.1 Z m 35.8,64.3 a 40.4,40.4 0 0 1 -39,22.8 c 3,-1.5 6,-3.5 8.6,-5.7 a 35.6,35.6 0 0 0 24.6,-17.1 z" + id="path1" /> + <path + d="m 64.2,1.1 3.1,0.1 C 64.3,2.8 61.4,4.7 58.8,7 A 37.5,37.5 0 0 0 28.6,44.7 c 0,14.3 7.3,26.7 18,33.3 a 29.6,29.6 0 0 1 -8.5,0.2 c -9,-8 -14.6,-20 -14.6,-33.5 0,-24 18.2,-43.6 40.7,-43.6 z m 5.4,81.4 A 35.6,35.6 0 0 0 94.2,65.4 h 5.9 a 40.4,40.4 0 0 1 -39,22.8 c 3,-1.5 5.9,-3.5 8.5,-5.7 z M 94.4,24.3 A 37,37 0 0 0 81.8,11.5 29.6,29.6 0 0 1 90.3,11.3 c 4,3.6 7.4,8 9.9,13 z" + id="path2" /> + <path + d="m 41.8,1.1 c 1,0 2,0 3.1,0.2 -3,1.5 -5.9,3.4 -8.5,5.6 A 37.5,37.5 0 0 0 6.1,44.7 c 0,21.1 16,38.3 35.7,38.3 12.6,0 23.6,-7 30,-17.6 h 5.8 a 40.4,40.4 0 0 1 -35.8,23 C 19.3,88.4 1,68.8 1,44.7 1,20.7 19.2,1.1 41.7,1.1 Z m 30.1,23.2 a 38.1,38.1 0 0 0 -4.5,-6.1 c 1.3,-1.2 2.7,-2.2 4.3,-3 2.3,2.7 4.4,5.8 6,9.1 z" + id="path3" /> + </g> + <path + d="m 75.1,33.3 h 9.2 v -5 H 60.9 v 5 H 70 v 26 h 5.1 z m 16.5,18.5 h 13.7 l 3,7.4 h 5.3 L 100.9,28 H 96.2 L 83.5,59.2 h 5.2 z m 11.8,-4.9 h -9.9 l 5,-12.4 z m 19.4,-18.6 h -4.6 v 31 h 20.6 v -5 h -16 z m 42.7,0 H 144 v 31 h 21.6 v -5 H 149 V 46 h 14.5 V 41.1 H 149 v -8 h 16.4 z m 24.7,10.1 c 0,1.6 -0.5,2.8 -1.6,3.8 -1.1,1 -2.6,1.4 -4.4,1.4 h -7.4 V 33.2 h 7.4 c 1.9,0 3.4,0.4 4.4,1.3 1,0.9 1.6,2.2 1.6,3.9 z m 6,20.8 -7.7,-11.7 c 1,-0.3 1.9,-0.7 2.7,-1.3 a 8.8,8.8 0 0 0 3.6,-4.6 c 0.4,-1 0.5,-2.2 0.5,-3.5 0,-1.5 -0.2,-2.9 -0.7,-4.1 a 8.4,8.4 0 0 0 -2.1,-3.1 c -1,-0.8 -2,-1.5 -3.4,-2 -1.3,-0.4 -2.8,-0.6 -4.5,-0.6 h -12.9 v 31 h 5 v -11 h 6.5 l 7,10.8 z" + id="path4" /> +</svg>