mirror of
https://github.com/simple-login/app.git
synced 2024-11-16 17:08:30 +01:00
c18d9f5280
register page redirect user to dashboard if they are logged in enable csrf for login page Set models more strict bootstrap developer page add helper method to ModelMixin, remove CRUDMixin display list of clients on developer index, add copy client-secret to clipboard using clipboardjs add toastr and use jquery non slim display a toast when user copies the client-secret create new client, generate client-id using unidecode client detail page: can edit client add delete client implement /oauth/authorize and /oauth/allow-deny implement /oauth/token add /oauth/user_info endpoint handle scopes: wip take into account scope: display scope, return user data according to scope create virtual-domain, gen email, client_user model WIP create authorize_nonlogin_user page user can choose to generate a new email no need to interfere with root logger log for before and after request if user has already allowed a client: generate a auth-code and redirect user to client get_user_info takes into account gen email display list of clients that have user has authorised use yk-client domain instead of localhost as cookie depends on the domain name use wtforms instead of flask_wtf Dockerfile delete virtual domain EMAIL_DOMAIN can come from env var bind to host 0.0.0.0 fix signup error: use session as default csrf_context rename yourkey to simplelogin add python-dotenv, ipython, sqlalchemy_utils create DB_URI, FLASK_SECRET. Load config from CONFIG file if exist add shortcuts to logging create shell add psycopg2 do not add local data in Dockerfile add drop_db into shell add shell.prepare_db() fix prepare_db setup sentry copy assets from tabler/dist add icon downloaded from https://commons.wikimedia.org/wiki/File:Simpleicons_Interface_key-tool-1.svg integrate tabler - login and register page add favicon template: default, header. Use gravatar for user avatar url use default template for dashboard, developer page use another icon add clipboard and notie prettify dashboard add notie css add fake gen email and client-user prettify list client page, use notie for toast add email, name scope to new client display client scope in client list prettify new-client, client-detail add sentry-sdk and blinker add arrow, add dt jinja filter, prettify logout, dashboard comment "last used" in dashboard for now prettify date display add copy email to clipboard to dashboard use "users" as table name for User as "user" is reserved key in postgres call prepare_db() when creating new db error page 400, 401, 403, 404 prettify authorize_login_user create already_authorize.html for user who has already authorized a client user can generate new email display all other generated emails add ENV variable, only reset DB when ENV=local fix: not return other users gen emails display nb users for each client refactor shell: remove prepare_db() add sendgrid add /favicon.ico route add new config: URL, SUPPORT_EMAIL, SENDGRID_API_KEY user needs to activate their account before login create copy button on dashboard client can have multiple redirect uris, in client detail can add/remove redirect-uri, use redirect_uri passed in /authorize refactor: move get_user_info into ClientUser model dashboard: display all apps, all generated emails add "id" into user_info add trigger email button invalidate the session at each new version by changing the secret centralize Client creation into Client.create_new user can enable/disable email forwarding setup auto dismiss alert: just add .alert-auto-dismiss move name down in register form add shell.add_real_data move blueprint template to its own package prettify authorize page for non-authenticated user update readme, return error if not redirect_uri add flask-wtf, use psycopg2-binary use flask-wtf FlaskForm instead of Form rename email -> email_utils add AWS_REGION, BUCKET, AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY to config add s3 module add File model, add Client.icon_id handle client icon update can create client with icon display client icon in client list page add Client.home_url take into account Client.home_url add boto3 register: ask name first only show "trigger test email" if email forwarding is enabled display gen email in alphabetical order, client in client.name alphabetical order better error page the modal does not get close when user clicks outside of modal add Client.published column discover page that displays all published Client add missing bootstrap.bundle.min.js.map developer can publish/unpublish their app in discover use notie for display flash message create hotmail account fix missing jquery add footer, add global jinja2 variable strengthen model: use nullable=False whenever possible, rename client_id to oauth_client_id, client_secret to oauth_client_secret add flask-migrate init migrate 1st migrate version fix rename client_id -> oauth_client_id prettify UI use flask_migrate.upgrade() instead of db.create_all() make sure requirejs.config is called for all page enable sentry for js, use uppercase for global jinja2 variables add flask-admin add User.is_admin column setup flask admin, only accessible to admin user fix migration: add server_default replace session[redirect_after_login] by "next" request args add pyproject.toml: ignore migrations/ in black add register waiting_activation_email page better email wording add pytest add get_host_name_and_scheme and tests example fail test fix test fix client-id display add flask-cors /user_info supports cors, add /me as /user_info synonym return client in /me support implicit flow no need to use with "app.app_context()" add watchtower to requirement add param ENABLE_CLOUDWATCH, CLOUDWATCH_LOG_GROUP, CLOUDWATCH_LOG_STREAM add cloudwatch logger if cloudwatch is enabled add 500 error page add help text for list of used client display list of app/website that an email has been used click on client name brings to client detail page create style.css to add additional style, append its url with the current sha1 to avoid cache POC on how to send email using postfix add sqlalchemy-utils use arrow instead of datetime add new params STRIPE_API, STRIPE_YEARLY_SKU, STRIPE_MONTHLY_PLAN show full error in local add plan, plan_expiration to User, need to create enum directly in migration script, cf https://github.com/sqlalchemy/alembic/issues/67 reformat all html files: use space instead of tab new user will have trial plan for 15 days add new param MAX_NB_EMAIL_FREE_PLAN only user with enough quota can create new email if user cannot create new gen email, pick randomly one from existing gen emails. Use flush instead of commit rename STRIPE_YEARLY_SKU -> STRIPE_YEARLY_PLAN open client page in discover in a new tab add stripe not logging /static call: disable flask logging, replace by after_request add param STRIPE_SECRET_KEY add 3 columns stripe_customer_id, stripe_card_token, stripe_subscription_id user can upgrade their pricing add setting page as coming-soon add GenEmail, ClientUser to admin ignore /admin/static logging add more fake data add ondelete="cascade" whenever possible rename plan_expiration -> trial_expiration reset migration: delete old migrations, create new one rename test_send_email -> poc_send_email to avoid the file being called by pytest add new param LYRA_ANALYTICS_ID, add lyra analytics add how to create new migration into readme add drift to base.html notify admin when new user signs up or pays subscription log exception in case of 500 use sendgrid to notify admin add alias /userinfo to user_info endpoint add change_password to shell add info on how payment is handled invite user to retry if card not working remove drift and add "contact us" link move poc_send_email into poc/ support getting client-id, client-secret from form-data in addition to basic auth client-id, client-secret is passed in form-data by passport-oauth2 for ex add jwtRS256 private and public key add jwk-jws-jwt poc add new param OPENID_PRIVATE_KEY_PATH, OPENID_PRIVATE_KEY_PATH add scope, redirect_url to AuthorizationCode and OauthToken take into scope when creating oauth-token, authorization-code add jwcrypto add jose_utils: make_id_token and verify_id_token add &scope to redirect uri add "email_verified": True into user_info fix user not activated add /oauth2 as alias for /oauth handle case where scope and state are empty remove threaded=False Use Email Alias as wording remove help text user can re-send activation email add "expired" into ActivationCode Handle the case activation code is expired reformat: use form.validate_on_submit instead of request.method == post && form.validate use error text instead of flash() display client oauth-id and oauth-secret on client detail page not display oauth-secret on client listing fix expiration check improve page title, footer add /jwks and /.well-known/openid-configuration init properly tests, fix blueprint conflict bug in flask-admin create oauth_models module rename Scope -> ScopeE to distinguish with Scope DB model set app.url_map.strict_slashes = False use ScopeE instead of SCOPE_NAME, ... support access_token passed as args in /userinfo merge /allow-deny into /authorize improve wording take into account the case response_type=code and openid is in scope take into account response_type=id_token, id_token token, id_token code make sure to use in-memory db in test fix scope can be null allow cross_origin for /.well-known/openid-configuration and /jwks fix footer link center authorize form rename trial_expiration to plan_expiration move stripe init to create_app() use real email to be able to receive email notification add user.profile_picture_id column use user profile picture and fallback to gravatar use nguyenkims+local@gm to distinguish with staging handle plan cancel, reactivation, user profile update fix can_create_new_email create cron.py that set plan to free when expired add crontab.yml add yacron use notify_admin instead of LOG.error add ResetPasswordCode model user can change password in setting increase display time for notie add forgot_password page If login error: redirect to this page upon success login. hide discover tab add column user.is_developer only show developer menu to developer comment out the publish button set local user to developer make sure only developer can access /developer blueprint User is invited to upgrade if they are in free plan or their trial ends soon not sending email when in local mode create Partner model create become partner page use normal error handling on local fix migration add "import sqlalchemy_utils" into migration template small refactoring on setting page handle promo code. TODO: add migration file add migration for user.promo_codes move email alias on top of apps in dashboard add introjs move encode_url to utils create GenEmail.create_new_gen_email create a first alias mail to show user how to use when they login show intro when user visits the website the first time fix register
1 line
No EOL
17 KiB
XML
Executable file
1 line
No EOL
17 KiB
XML
Executable file
<svg width="100" height="60" viewBox="0 0 100 60" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"><title>MasterCard-dark</title><desc>Created with Sketch.</desc><g id="Dark-Payment-badges" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd" transform="translate(-290.000000, -164.000000)"><g id="MasterCard-dark" transform="translate(290.000000, 164.000000)"><rect id="Rectangle" fill="#006" x="0" y="0" width="100" height="60" rx="4"/><path d="M56.1286209,30.4854021 C56.1286209,41.2636578 47.3919703,50 36.6140231,50 C25.8357674,50 17.0985,41.2636578 17.0985,30.4854021 C17.0985,19.7074549 25.8357674,10.9701875 36.6140231,10.9701875 C47.3919703,10.9701875 56.1286209,19.7074549 56.1286209,30.4854021" id="Fill-333" fill="#C00"/><path d="M62.8141062,10.9701875 C57.7705401,10.9701875 53.1766205,12.8831899 49.7126768,16.0214636 C49.0079839,16.6610843 48.3501676,17.3518992 47.7429289,18.0874321 L51.6858171,18.0874321 C52.2242827,18.7430896 52.7204976,19.4323625 53.1735365,20.1543259 L46.2549011,20.1543259 C45.841029,20.8176933 45.4647815,21.5069663 45.1304764,22.2212196 L54.2973444,22.2212196 C54.6106784,22.8901382 54.8863875,23.5791028 55.1238552,24.2871881 L44.3039656,24.2871881 C44.078834,24.9601159 43.8888599,25.6496973 43.7371273,26.3528483 L55.6900768,26.3528483 C55.9762715,27.6851343 56.1286209,29.0673811 56.1286209,30.4854021 C56.1286209,32.6519089 55.7755034,34.7373066 55.1238552,36.6848498 L44.3039656,36.6848498 C44.5414333,37.3923183 44.8171425,38.0822081 45.1298596,38.7520519 L54.2973444,38.7520519 C53.9624225,39.4644548 53.5880255,40.1543446 53.1716861,40.8186372 L46.2549011,40.8186372 C46.7060897,41.5384418 47.2032297,42.2286399 47.7429289,42.8833722 L51.6845835,42.8833722 C51.0785784,43.6195219 50.4201454,44.3103368 49.7132936,44.9499575 C53.1769289,48.0882312 57.7705401,50 62.8141062,50 C73.591745,50 82.328704,41.2636578 82.328704,30.4854021 C82.328704,19.7083801 73.591745,10.9701875 62.8141062,10.9701875" id="Fill-334" fill="#F90"/><path d="M32.056803,32.6219942 C31.8344469,32.5967054 31.7363759,32.588687 31.5837181,32.588687 C30.3828103,32.588687 29.7755716,33.0007088 29.7755716,33.8145752 C29.7755716,34.3157245 30.0719436,34.6343012 30.5345429,34.6343012 C31.3977532,34.6343012 32.0197951,33.8127248 32.056803,32.6219942 L32.056803,32.6219942 Z M33.5978755,36.2089893 L31.8418485,36.2089893 L31.8822489,35.3747685 C31.3468673,36.0335099 30.6323055,36.3480775 29.6617722,36.3480775 C28.5139091,36.3480775 27.726565,35.4518684 27.726565,34.1494971 C27.726565,32.1890012 29.0955506,31.0457641 31.4458635,31.0457641 C31.6867236,31.0457641 31.9945063,31.0679689 32.3096906,31.1077524 C32.3750713,30.841912 32.3923417,30.7290378 32.3923417,30.585632 C32.3923417,30.0527176 32.0234959,29.8528747 31.0338417,29.8528747 C29.9973109,29.8423891 29.1424273,30.1005195 28.7911603,30.2158609 C28.813365,30.0820155 29.085065,28.4052472 29.085065,28.4052472 C30.1404083,28.0949973 30.8367744,27.9790391 31.6204177,27.9790391 C33.439975,27.9790391 34.4037235,28.7956811 34.4015647,30.3395292 C34.4052655,30.7537098 34.3364924,31.2628774 34.2300946,31.9345716 C34.0462885,33.1003219 33.651537,35.600517 33.5978755,36.2089893 L33.5978755,36.2089893 Z" id="Fill-336" fill="#006"/><polyline id="Fill-337" fill="#006" points="26.8399163 36.2089893 24.7209031 36.2089893 25.9353805 28.6001557 23.2248569 36.2089893 21.7812387 36.2089893 21.6026753 28.6427149 20.3271348 36.2089893 18.3441258 36.2089893 20.0005397 26.3102891 23.0472188 26.3102891 23.2313333 31.8509953 25.0900573 26.3102891 28.4784431 26.3102891 26.8399163 36.2089893"/><path d="M65.4318015,32.6219942 C65.2094454,32.5967054 65.112608,32.588687 64.9602586,32.588687 C63.7584256,32.588687 63.1518037,33.0007088 63.1518037,33.8145752 C63.1518037,34.3157245 63.446942,34.6343012 63.910775,34.6343012 C64.7733685,34.6343012 65.3957188,33.8127248 65.4318015,32.6219942 L65.4318015,32.6219942 Z M66.9737992,36.2089893 L65.218389,36.2089893 L65.2581726,35.3747685 C64.722791,36.0335099 64.0085376,36.3480775 63.0386211,36.3480775 C61.889216,36.3480775 61.1027971,35.4518684 61.1027971,34.1494971 C61.1027971,32.1890012 62.4723995,31.0457641 64.8220956,31.0457641 C65.0626472,31.0457641 65.3698132,31.0679689 65.6853059,31.1077524 C65.750995,30.841912 65.767957,30.7290378 65.767957,30.585632 C65.767957,30.0527176 65.3991111,29.8528747 64.409457,29.8528747 C63.3729262,29.8423891 62.518351,30.1005195 62.1658503,30.2158609 C62.1892887,30.0820155 62.4616055,28.4052472 62.4616055,28.4052472 C63.5163319,28.0949973 64.2133149,27.9790391 64.9957245,27.9790391 C66.8165154,27.9790391 67.7790304,28.7956811 67.77718,30.3395292 C67.7808808,30.7537098 67.7127245,31.2628774 67.6057099,31.9345716 C67.4225205,33.1003219 67.0268439,35.600517 66.9737992,36.2089893 L66.9737992,36.2089893 Z" id="Fill-338" fill="#006"/><path d="M43.0133136,36.0865546 C42.433214,36.2691272 41.9814087,36.3480775 41.4910534,36.3480775 C40.4082626,36.3480775 39.8170607,35.7257272 39.8170607,34.5794061 C39.8019491,34.223513 39.9728025,33.2875204 40.1072647,32.4338705 C40.2300077,31.681684 41.0262953,26.9403494 41.0262953,26.9403494 L43.131739,26.9403494 L42.8859445,28.158836 L44.1580927,28.158836 L43.8709727,30.0937347 L42.594507,30.0937347 C42.3499461,31.6243217 42.0011463,33.5314644 41.9971371,33.7843521 C41.9971371,34.1994578 42.2185679,34.3807968 42.7228012,34.3807968 C42.964278,34.3807968 43.1511682,34.3561248 43.2939571,34.3049305 L43.0133136,36.0865546" id="Fill-339" fill="#006"/><path d="M49.4699664,36.0214823 C48.7464611,36.2426048 48.0491697,36.3505446 47.3093192,36.3480775 C44.9516047,36.3449935 43.7226325,35.1144793 43.7226325,32.7567648 C43.7226325,30.0052241 45.2859098,27.9790391 47.4086238,27.9790391 C49.1446049,27.9790391 50.253918,29.1133326 50.253918,30.8915643 C50.253918,31.4827663 50.1780517,32.0588566 49.9939372,32.8717978 L45.8003202,32.8717978 C45.6587648,34.0397069 46.4057085,34.526053 47.6315967,34.526053 C48.3844,34.526053 49.0647294,34.3706196 49.8206167,34.0199693 L49.4699664,36.0214823 L49.4699664,36.0214823 Z M48.2863289,31.2493078 C48.2983565,31.0812301 48.5093018,29.8121659 47.3056184,29.8121659 C46.6357746,29.8121659 46.1555965,30.3234924 45.9609964,31.2493078 L48.2863289,31.2493078 L48.2863289,31.2493078 Z" id="Fill-340" fill="#006"/><path d="M34.8684816,30.7040574 C34.8684816,31.7214675 35.3619209,32.4236933 36.4814112,32.9513649 C37.3390704,33.3550599 37.4726074,33.4744105 37.4726074,33.839864 C37.4726074,34.3410132 37.0938927,34.5686121 36.2559712,34.5686121 C35.6234437,34.5686121 35.0356342,34.4693074 34.3574636,34.2500354 C34.3574636,34.2500354 34.0795956,36.0251831 34.0663344,36.109993 C34.5477461,36.2142321 34.9770383,36.3113779 36.2710828,36.3480775 C38.5063626,36.3480775 39.5388843,35.4968947 39.5388843,33.6572914 C39.5388843,32.5513707 39.107125,31.9021896 38.0456137,31.4136848 C37.1577314,31.006289 37.0550344,30.9150027 37.0550344,30.5393721 C37.0550344,30.1042203 37.4075351,29.8818642 38.0918737,29.8818642 C38.5079046,29.8818642 39.0756682,29.9262738 39.6144422,30.0024485 L39.9157486,28.1353976 C39.3674142,28.0481206 38.5353522,27.9790391 38.0511649,27.9790391 C35.6814228,27.9790391 34.8607717,29.2166464 34.8684816,30.7040574" id="Fill-341" fill="#006"/><path d="M59.7739035,28.1915264 C60.3623298,28.1915264 60.9118978,28.3444925 61.6671683,28.7259828 L62.0141178,26.5776715 C61.7026342,26.4555453 60.6105915,25.73975 59.6853928,25.73975 C58.2679885,25.73975 57.0683143,26.4441345 56.2260752,27.6040252 C54.9961778,27.1969378 54.4900941,28.0197478 53.8708279,28.8400906 L53.3203347,28.9683848 C53.3619686,28.6985352 53.3999017,28.430536 53.3878742,28.158836 L51.4412563,28.158836 C51.1760326,30.6510127 50.7051065,33.1743378 50.3365691,35.6674397 L50.24004,36.2089893 L52.3596701,36.2089893 C52.7134044,33.9101791 52.9067709,32.4388049 53.0245795,31.4420575 L53.8227175,30.9998126 C53.9426849,30.5554088 54.3149232,30.4061435 55.0637173,30.424339 C54.9659546,30.9492351 54.9129099,31.5021954 54.9129099,32.0742766 C54.9129099,34.7083171 56.3358654,36.3480775 58.6155548,36.3480775 C59.2030559,36.3480775 59.7075976,36.2709776 60.4887736,36.0581819 L60.8600867,33.8025476 C60.1575525,34.1476467 59.5823874,34.3101733 59.0608838,34.3101733 C57.829136,34.3101733 57.0837343,33.400703 57.0837343,31.8984889 C57.0837343,29.7184125 58.1915054,28.1915264 59.7739035,28.1915264" id="Fill-342" fill="#006"/><path d="M77.7110377,26.3102891 L77.2401116,29.1700781 C76.6618624,28.4080228 76.0395122,27.8559876 75.2179358,27.8559876 C74.149023,27.8559876 73.1760224,28.6664616 72.538869,29.8599679 C71.6516035,29.6758533 70.7347316,29.3628278 70.7347316,29.3628278 L70.7341148,29.3705378 C70.8047383,28.7034696 70.8346531,28.2976158 70.8275599,28.158836 L68.8812504,28.158836 C68.616952,30.6510127 68.1454091,33.1743378 67.77718,35.6674397 L67.6797258,36.2089893 L69.7999726,36.2089893 C70.0861674,34.3511904 70.3048227,32.8067255 70.4661156,31.5836129 C71.1908546,30.9285723 71.5535324,30.3589583 72.2841309,30.3959663 C71.960003,31.1799179 71.7709541,32.082295 71.7709541,33.0081104 C71.7709541,35.0198006 72.7880558,36.3480775 74.3288199,36.3480775 C75.10537,36.3480775 75.7011979,36.0800782 76.2822226,35.4595784 L76.1823012,36.2083725 L78.1868982,36.2083725 L79.800753,26.3102891 L77.7110377,26.3102891 L77.7110377,26.3102891 Z M75.0615772,34.34934 C74.3405391,34.34934 73.975394,33.8145752 73.975394,32.762316 C73.975394,31.1799179 74.6578822,30.0582688 75.6185468,30.0582688 C76.3466781,30.0582688 76.7414295,30.6121544 76.7414295,31.6348072 C76.7414295,33.2307749 76.0475306,34.34934 75.0615772,34.34934 L75.0615772,34.34934 Z" id="Fill-343" fill="#006"/><polyline id="Fill-344" fill="#FFF" points="27.4493138 35.6214881 25.3309174 35.6214881 26.5450864 28.0126546 23.8351796 35.6214881 22.3909445 35.6214881 22.2126896 28.0567558 20.9368407 35.6214881 18.9538316 35.6214881 20.6102456 25.7237132 23.6569247 25.7237132 23.7420429 31.8509953 25.7978343 25.7237132 29.088149 25.7237132 27.4493138 35.6214881"/><path d="M32.6665089,32.0357266 C32.4444612,32.0098211 32.3463902,32.0027279 32.1937324,32.0027279 C30.9928246,32.0027279 30.3852775,32.4141329 30.3852775,33.2273825 C30.3852775,33.7279149 30.6819579,34.0483421 31.1448656,34.0483421 C32.0077675,34.0483421 32.6298094,33.2267657 32.6665089,32.0357266 L32.6665089,32.0357266 Z M34.207273,35.6214881 L32.4521712,35.6214881 L32.4922632,34.7878842 C31.9568816,35.4463172 31.2423198,35.7611931 30.2717865,35.7611931 C29.123615,35.7611931 28.3365793,34.8637505 28.3365793,33.5616876 C28.3365793,31.6008833 29.7058733,30.4591882 32.0561862,30.4591882 C32.2964295,30.4591882 32.6042122,30.4810846 32.9197049,30.5217933 C32.9850856,30.2553361 33.002356,30.1421535 33.002356,29.9981309 C33.002356,29.4655249 32.6335102,29.267224 31.643856,29.267224 C30.6070168,29.254888 29.7524416,29.5130184 29.4008662,29.6280514 C29.4233793,29.4948228 29.6947709,27.8180545 29.6947709,27.8180545 C30.7504225,27.5084214 31.4467887,27.3915379 32.230432,27.3915379 C34.0496809,27.3915379 35.013121,28.2091051 35.011579,29.7523364 C35.0149714,30.1659002 34.9468151,30.6775351 34.8401089,31.3473789 C34.6559944,32.5122039 34.2612429,35.013941 34.207273,35.6214881 L34.207273,35.6214881 Z" id="Fill-345" fill="#FFF"/><path d="M62.6235153,25.9901704 L62.2765658,28.1381732 C61.5200617,27.7579166 60.9720357,27.6040252 60.3842262,27.6040252 C58.8024449,27.6040252 57.6928234,29.1327618 57.6928234,31.3131465 C57.6928234,32.8153607 58.4385335,33.7229805 59.6702812,33.7229805 C60.1920933,33.7229805 60.768492,33.5616876 61.4694842,33.2153549 L61.0972459,35.4709892 C60.3173035,35.6834764 59.8124534,35.7611931 59.2252607,35.7611931 C56.9440293,35.7611931 55.5232326,34.1211244 55.5232326,31.4877007 C55.5232326,27.9491243 57.4874293,25.4760684 60.2950987,25.4760684 C61.2202973,25.4760684 62.3129569,25.8680442 62.6235153,25.9901704" id="Fill-346" fill="#FFF"/><path d="M66.041199,32.0357266 C65.8203849,32.0098211 65.7220055,32.0027279 65.5696561,32.0027279 C64.3693651,32.0027279 63.7615096,32.4141329 63.7615096,33.2273825 C63.7615096,33.7279149 64.0578815,34.0483421 64.5204809,34.0483421 C65.3830744,34.0483421 66.005733,33.2267657 66.041199,32.0357266 L66.041199,32.0357266 Z M67.5831967,35.6214881 L65.8280949,35.6214881 L65.8678785,34.7878842 C65.3324968,35.4463172 64.6179351,35.7611931 63.6483269,35.7611931 C62.4989219,35.7611931 61.7128114,34.8637505 61.7128114,33.5616876 C61.7128114,31.6008833 63.0808718,30.4591882 65.4318015,30.4591882 C65.6720447,30.4591882 65.9792107,30.4810846 66.294395,30.5217933 C66.3600841,30.2553361 66.3773545,30.1421535 66.3773545,29.9981309 C66.3773545,29.4655249 66.0094338,29.267224 65.0191629,29.267224 C63.9832489,29.254888 63.1289821,29.5130184 62.7767898,29.6280514 C62.7989946,29.4948228 63.0706946,27.8180545 63.0706946,27.8180545 C64.1263462,27.5084214 64.8220956,27.3915379 65.6057388,27.3915379 C67.4249877,27.3915379 68.3893531,28.2091051 68.3868859,29.7523364 C68.3912035,30.1659002 68.3224304,30.6775351 68.2157242,31.3473789 C68.0322264,32.5122039 67.637475,35.013941 67.5831967,35.6214881 L67.5831967,35.6214881 Z" id="Fill-347" fill="#FFF"/><path d="M43.6227111,35.4993619 C43.0432283,35.6819344 42.5908062,35.7611931 42.1010677,35.7611931 C41.0179685,35.7611931 40.4264582,35.1385344 40.4264582,33.9934469 C40.411655,33.6363203 40.5828168,32.7018697 40.7175874,31.8472945 C40.8394052,31.0944912 41.6360012,26.3537735 41.6360012,26.3537735 L43.7420617,26.3537735 L43.4956504,27.5719517 L44.5768992,27.5719517 L44.2888541,29.5062336 L43.2042129,29.5062336 C42.959652,31.0383625 42.6108522,32.9442717 42.6065346,33.1971593 C42.6065346,33.6134987 42.8288906,33.793604 43.3325071,33.793604 C43.5739839,33.793604 43.7605656,33.7698573 43.9039714,33.7174294 L43.6227111,35.4993619" id="Fill-348" fill="#FFF"/><path d="M50.0805975,35.4355232 C49.3567837,35.6572625 48.6579504,35.7618099 47.9190251,35.7611931 C45.5610022,35.7596511 44.3329552,34.527595 44.3329552,32.1701888 C44.3329552,29.4177229 45.8959241,27.3915379 48.0170961,27.3915379 C49.7549276,27.3915379 50.8636239,28.5258315 50.8636239,30.306222 C50.8636239,30.8961903 50.786524,31.4719723 50.6045683,32.2852219 L46.4103345,32.2852219 C46.2681623,33.4531309 47.0160312,33.9404022 48.2406858,33.9404022 C48.9941059,33.9404022 49.6741269,33.7843521 50.4309394,33.4327766 L50.0805975,35.4355232 L50.0805975,35.4355232 Z M48.8966516,30.6618067 C48.9080624,30.4934205 49.1199329,29.2249732 47.9165579,29.2249732 C47.2460973,29.2249732 46.7659192,29.7372249 46.5707023,30.6618067 L48.8966516,30.6618067 L48.8966516,30.6618067 Z" id="Fill-349" fill="#FFF"/><path d="M35.4778791,30.1165563 C35.4778791,31.1358168 35.9719352,31.8365005 37.0917339,32.364789 C37.9493931,32.7681756 38.0823133,32.8875262 38.0823133,33.253288 C38.0823133,33.7550541 37.703907,33.9814194 36.8653687,33.9814194 C36.233458,33.9814194 35.6453401,33.8833483 34.9668611,33.664693 C34.9668611,33.664693 34.6893015,35.4386072 34.6763487,35.5221835 C35.157452,35.6276561 35.5870526,35.7238768 36.8804803,35.7611931 C39.1163769,35.7611931 40.1488986,34.9103188 40.1488986,33.0707155 C40.1488986,31.964178 39.7165224,31.3153053 38.6553196,30.828034 C37.7671289,30.4194046 37.6650487,30.3290436 37.6650487,29.9527961 C37.6650487,29.5176444 38.017241,29.2937463 38.7021964,29.2937463 C39.1173021,29.2937463 39.6856825,29.3400062 40.2241481,29.4158725 L40.5257628,27.5491301 C39.9771201,27.4624698 39.1456749,27.3915379 38.6611792,27.3915379 C36.2908203,27.3915379 35.4707859,28.6294537 35.4778791,30.1165563" id="Fill-350" fill="#FFF"/><path d="M78.7966041,35.6214881 L76.7926238,35.6214881 L76.8919285,34.8723856 C76.3105954,35.4931939 75.7150758,35.7611931 74.9385258,35.7611931 C73.3989953,35.7611931 72.3803516,34.4344583 72.3803516,32.4206093 C72.3803516,29.7430844 73.9596657,27.4862166 75.8276417,27.4862166 C76.6492181,27.4862166 77.2712599,27.8217553 77.8507427,28.584119 L78.3207436,25.7237132 L80.4101505,25.7237132 L78.7966041,35.6214881 L78.7966041,35.6214881 Z M75.6709747,33.7615305 C76.6581616,33.7615305 77.350827,32.6435821 77.350827,31.0491565 C77.350827,30.0261952 76.956384,29.4704593 76.2282527,29.4704593 C75.2672797,29.4704593 74.5850999,30.5924168 74.5850999,32.1754316 C74.5850999,33.2289245 74.9505534,33.7615305 75.6709747,33.7615305 L75.6709747,33.7615305 Z" id="Fill-351" fill="#FFF"/><path d="M69.4915731,27.5719517 C69.2266579,30.0635116 68.7554234,32.5868366 68.3868859,35.0802469 L68.2903569,35.6214881 L70.4093701,35.6214881 C71.1674162,30.6988146 71.3496803,29.7381501 72.538869,29.8581175 C72.7279179,28.8505762 73.0804186,27.9682451 73.3428666,27.5235329 C72.4556011,27.3384932 71.960003,27.8399509 71.3105136,28.7929055 C71.3623247,28.3805753 71.4557698,27.9805811 71.438191,27.5719517 L69.4915731,27.5719517" id="Fill-352" fill="#FFF"/><path d="M52.0518873,27.5719517 C51.7857385,30.0635116 51.3138872,32.5868366 50.9459666,35.0802469 L50.8497459,35.6214881 L52.969376,35.6214881 C53.7277305,30.6988146 53.9093778,29.7381501 55.096716,29.8581175 C55.2869986,28.8505762 55.640116,27.9682451 55.9019472,27.5235329 C55.015607,27.3384932 54.5190837,27.8399509 53.8708279,28.7929055 C53.9220222,28.3805753 54.016084,27.9805811 53.9975801,27.5719517 L52.0518873,27.5719517" id="Fill-353" fill="#FFF"/></g></g></svg> |