metanorma-document 0.2.9 → 0.2.12
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/.rubocop_todo.yml +164 -66
- data/CLAUDE.md +26 -0
- data/README.adoc +144 -0
- data/Rakefile +14 -2
- data/TODO.finalize/01-split-multi-class-files.md +8 -0
- data/TODO.finalize/02-remove-data-dist-iso-document-frontend.md +6 -0
- data/TODO.finalize/03-align-frontend-iife-and-gha-build.md +11 -0
- data/TODO.finalize/04-theme-per-flavor-config-driven.md +9 -0
- data/TODO.finalize/05-migrate-all-html-to-liquid.md +16 -0
- data/TODO.finalize/06-integrate-pubid-library.md +16 -0
- data/TODO.finalize/07-replace-relaton-models-with-relaton-bib.md +39 -0
- data/TODO.finalize/08-refactor-renderer-architecture.md +25 -0
- data/TODO.finalize/09-eliminate-code-smells.md +14 -0
- data/TODO.finalize/10-comprehensive-spec-coverage.md +24 -0
- data/TODO.finalize/11-config-driven-flavor-metadata.md +20 -0
- data/TODO.finalize/12-add-frozen-string-literal.md +6 -0
- data/TODO.finalize/13-extract-composition-from-god-class.md +96 -0
- data/TODO.finalize/14-config-driven-section-ordering.md +31 -0
- data/TODO.finalize/15-theme-directories-per-flavor.md +46 -0
- data/TODO.finalize/16-theme-lutaml-model-schema.md +44 -0
- data/data/javascripts/components/mn-footnotes.js +68 -0
- data/data/javascripts/components/mn-lightbox.js +18 -2
- data/data/javascripts/components/mn-shortcuts.js +2 -0
- data/data/javascripts/core/mn-navigation.js +8 -0
- data/data/javascripts/core/mn-theme.js +9 -9
- data/data/logos/oiml-logo-full-dark.svg +1 -0
- data/data/logos/oiml-logo-full-light.svg +1 -0
- data/data/logos/oiml-logo-icon-dark.svg +1 -0
- data/data/logos/oiml-logo-icon-light.svg +1 -0
- data/data/logos/oiml-logo.svg +1 -0
- data/data/logos/pdfa-logo.svg +31 -94
- data/data/stylesheets/base/_layout.css +3 -0
- data/data/stylesheets/base/_reset.css +3 -3
- data/data/stylesheets/base/_typography.css +0 -5
- data/data/stylesheets/components/bibliography.css +3 -3
- data/data/stylesheets/components/cover.css +3 -1
- data/data/stylesheets/components/figure.css +13 -1
- data/data/stylesheets/components/footnote.css +65 -5
- data/data/stylesheets/components/formula.css +44 -0
- data/data/stylesheets/components/header.css +17 -2
- data/data/stylesheets/components/inline.css +1 -1
- data/data/stylesheets/components/table.css +15 -2
- data/data/stylesheets/components/term.css +0 -1
- data/data/themes/bipm.yaml +60 -0
- data/data/themes/cc.yaml +43 -0
- data/data/themes/icc.yaml +39 -0
- data/data/themes/iec.yaml +44 -0
- data/data/themes/ieee.yaml +43 -0
- data/data/themes/ietf.yaml +45 -0
- data/data/themes/iho.yaml +46 -0
- data/data/themes/iso.yaml +40 -0
- data/data/themes/itu.yaml +45 -0
- data/data/themes/ogc.yaml +51 -0
- data/data/themes/oiml.yaml +56 -0
- data/data/themes/pdfa.yaml +44 -0
- data/data/themes/ribose.yaml +43 -0
- data/exe/metanorma-document +11 -0
- data/frontend/e2e/sample-html.test.ts +256 -0
- data/frontend/index.html +12 -0
- data/frontend/package-lock.json +4725 -0
- data/frontend/package.json +32 -0
- data/frontend/postcss.config.js +6 -0
- data/frontend/src/App.vue +79 -0
- data/frontend/src/app.ts +21 -0
- data/frontend/src/components/AppSidebar.vue +77 -0
- data/frontend/src/components/DocumentReader.vue +180 -0
- data/frontend/src/components/MirrorRenderer.vue +23 -0
- data/frontend/src/components/ReadingProgressBar.vue +29 -0
- data/frontend/src/components/TextRenderer.vue +131 -0
- data/frontend/src/components/TocItem.vue +57 -0
- data/frontend/src/components/TopBar.vue +49 -0
- data/frontend/src/components/__tests__/MirrorRenderer.test.ts +178 -0
- data/frontend/src/components/blocks/AdmonitionBlock.vue +74 -0
- data/frontend/src/components/blocks/ClauseBlock.vue +53 -0
- data/frontend/src/components/blocks/ExampleBlock.vue +21 -0
- data/frontend/src/components/blocks/FallbackBlock.vue +18 -0
- data/frontend/src/components/blocks/FigureBlock.vue +26 -0
- data/frontend/src/components/blocks/FootnotesBlock.vue +25 -0
- data/frontend/src/components/blocks/ListBlocks.vue +62 -0
- data/frontend/src/components/blocks/NoteBlock.vue +21 -0
- data/frontend/src/components/blocks/ParagraphBlock.vue +25 -0
- data/frontend/src/components/blocks/QuoteBlock.vue +25 -0
- data/frontend/src/components/blocks/ReviewBlock.vue +39 -0
- data/frontend/src/components/blocks/SourcecodeBlock.vue +52 -0
- data/frontend/src/components/blocks/TableBlock.vue +48 -0
- data/frontend/src/components/blocks/index.ts +36 -0
- data/frontend/src/stores/__tests__/documentStore.fixture.test.ts +272 -0
- data/frontend/src/stores/__tests__/documentStore.test.ts +143 -0
- data/frontend/src/stores/__tests__/ebookStore.test.ts +145 -0
- data/frontend/src/stores/__tests__/uiStore.test.ts +42 -0
- data/frontend/src/stores/documentStore.ts +153 -0
- data/frontend/src/stores/ebookStore.ts +179 -0
- data/frontend/src/stores/uiStore.ts +32 -0
- data/frontend/src/styles.css +156 -0
- data/frontend/src/types/__tests__/rendering-contract.test.ts +172 -0
- data/frontend/src/types/rendering-contract.ts +209 -0
- data/frontend/src/utils/__tests__/typeMetadata.test.ts +102 -0
- data/frontend/src/utils/typeMetadata.ts +121 -0
- data/frontend/tailwind.config.js +18 -0
- data/frontend/test/fixtures/iso-document.json +271 -0
- data/frontend/tmp/debug_e2e.cjs +46 -0
- data/frontend/tsconfig.json +25 -0
- data/frontend/tsconfig.node.json +11 -0
- data/frontend/vite.config.ts +37 -0
- data/frontend/vitest.e2e.config.ts +9 -0
- data/lib/metanorma/bipm_document/metadata/bipm_bibliographic_item.rb +0 -14
- data/lib/metanorma/bipm_document/metadata/depiction_element.rb +18 -0
- data/lib/metanorma/bipm_document/metadata.rb +1 -1
- data/lib/metanorma/document/cli.rb +116 -0
- data/lib/metanorma/document/components/ancillary_blocks/callout_annotation.rb +27 -0
- data/lib/metanorma/document/components/ancillary_blocks/sourcecode_block.rb +0 -65
- data/lib/metanorma/document/components/ancillary_blocks/sourcecode_body.rb +18 -0
- data/lib/metanorma/document/components/ancillary_blocks.rb +4 -0
- data/lib/metanorma/document/components/bib_data/bib_data.rb +7 -0
- data/lib/metanorma/document/components/blocks/classification_value.rb +21 -0
- data/lib/metanorma/document/components/blocks/permission_model.rb +28 -0
- data/lib/metanorma/document/components/blocks/recommendation_model.rb +28 -0
- data/lib/metanorma/document/components/blocks/requirement_base.rb +30 -0
- data/lib/metanorma/document/components/blocks/requirement_classification.rb +20 -0
- data/lib/metanorma/document/components/blocks/requirement_description.rb +43 -0
- data/lib/metanorma/document/components/blocks/requirement_inherit.rb +24 -0
- data/lib/metanorma/document/components/blocks/requirement_model.rb +0 -131
- data/lib/metanorma/document/components/blocks.rb +8 -7
- data/lib/metanorma/document/components/id_elements/image.rb +2 -0
- data/lib/metanorma/document/components/inline/asciimath_element.rb +2 -0
- data/lib/metanorma/document/components/inline/attribution_element.rb +2 -0
- data/lib/metanorma/document/components/inline/bcp14_element.rb +2 -0
- data/lib/metanorma/document/components/inline/biblio_tag_element.rb +2 -0
- data/lib/metanorma/document/components/inline/br_element.rb +2 -0
- data/lib/metanorma/document/components/inline/comma_element.rb +2 -0
- data/lib/metanorma/document/components/inline/concept_element.rb +2 -0
- data/lib/metanorma/document/components/inline/display_text_element.rb +2 -0
- data/lib/metanorma/document/components/inline/em_raw_element.rb +2 -0
- data/lib/metanorma/document/components/inline/enum_comma_element.rb +2 -0
- data/lib/metanorma/document/components/inline/eref_element.rb +2 -0
- data/lib/metanorma/document/components/inline/fmt_admitted_element.rb +4 -0
- data/lib/metanorma/document/components/inline/fmt_annotation_body_element.rb +4 -0
- data/lib/metanorma/document/components/inline/fmt_annotation_end_element.rb +4 -0
- data/lib/metanorma/document/components/inline/fmt_annotation_start_element.rb +4 -0
- data/lib/metanorma/document/components/inline/fmt_concept_element.rb +4 -0
- data/lib/metanorma/document/components/inline/fmt_definition_element.rb +4 -0
- data/lib/metanorma/document/components/inline/fmt_fn_body_element.rb +4 -0
- data/lib/metanorma/document/components/inline/fmt_fn_label_element.rb +4 -0
- data/lib/metanorma/document/components/inline/fmt_footnote_container_element.rb +4 -0
- data/lib/metanorma/document/components/inline/fmt_identifier_element.rb +4 -0
- data/lib/metanorma/document/components/inline/fmt_name_element.rb +4 -0
- data/lib/metanorma/document/components/inline/fmt_preferred_element.rb +4 -0
- data/lib/metanorma/document/components/inline/fmt_sourcecode_element.rb +4 -0
- data/lib/metanorma/document/components/inline/fmt_stem_element.rb +10 -0
- data/lib/metanorma/document/components/inline/fmt_termsource_element.rb +4 -0
- data/lib/metanorma/document/components/inline/fmt_title_element.rb +4 -0
- data/lib/metanorma/document/components/inline/fmt_xref_element.rb +4 -0
- data/lib/metanorma/document/components/inline/fmt_xref_label_element.rb +4 -0
- data/lib/metanorma/document/components/inline/fn_element.rb +2 -0
- data/lib/metanorma/document/components/inline/link_element.rb +2 -0
- data/lib/metanorma/document/components/inline/localized_string_element.rb +2 -0
- data/lib/metanorma/document/components/inline/localized_strings_element.rb +2 -0
- data/lib/metanorma/document/components/inline/location_element.rb +24 -0
- data/lib/metanorma/document/components/inline/math_element.rb +2 -0
- data/lib/metanorma/document/components/inline/name_with_id_element.rb +4 -0
- data/lib/metanorma/document/components/inline/rendered_display.rb +23 -0
- data/lib/metanorma/document/components/inline/rendered_math_element.rb +21 -0
- data/lib/metanorma/document/components/inline/semantic_content.rb +51 -0
- data/lib/metanorma/document/components/inline/semantic_math_element.rb +20 -0
- data/lib/metanorma/document/components/inline/semx_child_element.rb +2 -0
- data/lib/metanorma/document/components/inline/semx_element.rb +13 -1
- data/lib/metanorma/document/components/inline/small_cap_element.rb +2 -0
- data/lib/metanorma/document/components/inline/span_element.rb +10 -15
- data/lib/metanorma/document/components/inline/stem_inline_element.rb +7 -1
- data/lib/metanorma/document/components/inline/strong_raw_element.rb +2 -0
- data/lib/metanorma/document/components/inline/sub_element.rb +2 -0
- data/lib/metanorma/document/components/inline/sup_element.rb +2 -0
- data/lib/metanorma/document/components/inline/tab_element.rb +2 -0
- data/lib/metanorma/document/components/inline/title_with_annotation_element.rb +4 -0
- data/lib/metanorma/document/components/inline/tt_element.rb +2 -0
- data/lib/metanorma/document/components/inline/variant_title_element.rb +2 -0
- data/lib/metanorma/document/components/inline/vocabulary.rb +184 -0
- data/lib/metanorma/document/components/inline/xref_element.rb +10 -0
- data/lib/metanorma/document/components/inline.rb +12 -0
- data/lib/metanorma/document/components/multi_paragraph/quote_author_element.rb +20 -0
- data/lib/metanorma/document/components/multi_paragraph/quote_block.rb +0 -29
- data/lib/metanorma/document/components/multi_paragraph.rb +2 -0
- data/lib/metanorma/document/components/reference_elements/source_element.rb +0 -31
- data/lib/metanorma/document/components/reference_elements/source_modification.rb +21 -0
- data/lib/metanorma/document/components/reference_elements/source_origin.rb +28 -0
- data/lib/metanorma/document/components/reference_elements.rb +2 -2
- data/lib/metanorma/document/components/tables/col_element.rb +18 -0
- data/lib/metanorma/document/components/tables/col_group_element.rb +18 -0
- data/lib/metanorma/document/components/tables/table_block.rb +0 -22
- data/lib/metanorma/document/components/tables/table_body_section.rb +16 -0
- data/lib/metanorma/document/components/tables/table_foot_section.rb +16 -0
- data/lib/metanorma/document/components/tables/table_head_section.rb +16 -0
- data/lib/metanorma/document/components/tables/table_section.rb +0 -25
- data/lib/metanorma/document/components/tables.rb +5 -3
- data/lib/metanorma/document/relaton/address.rb +0 -27
- data/lib/metanorma/document/relaton/bib_item_locality.rb +3 -12
- data/lib/metanorma/document/relaton/copyright_association.rb +0 -10
- data/lib/metanorma/document/relaton/copyright_owner.rb +16 -0
- data/lib/metanorma/document/relaton/edition.rb +4 -7
- data/lib/metanorma/document/relaton/formatted_address.rb +29 -0
- data/lib/metanorma/document/relaton/logo_element.rb +18 -0
- data/lib/metanorma/document/relaton/organization.rb +0 -14
- data/lib/metanorma/document/relaton/phone.rb +3 -9
- data/lib/metanorma/document/relaton/place_type.rb +0 -13
- data/lib/metanorma/document/relaton/price_type.rb +3 -9
- data/lib/metanorma/document/relaton/region_element.rb +18 -0
- data/lib/metanorma/document/relaton.rb +6 -1
- data/lib/metanorma/document/version.rb +1 -1
- data/lib/metanorma/document.rb +2 -0
- data/lib/metanorma/html/asset_pipeline.rb +1 -0
- data/lib/metanorma/html/base_renderer.rb +261 -1008
- data/lib/metanorma/html/bipm_renderer.rb +15 -144
- data/lib/metanorma/html/cc_renderer.rb +1 -45
- data/lib/metanorma/html/component/base.rb +2 -7
- data/lib/metanorma/html/component/index_section.rb +41 -43
- data/lib/metanorma/html/drops/admonition_drop.rb +1 -4
- data/lib/metanorma/html/drops/biblio_entry_drop.rb +50 -0
- data/lib/metanorma/html/drops/block_element_drop.rb +7 -2
- data/lib/metanorma/html/drops/example_drop.rb +1 -4
- data/lib/metanorma/html/drops/figure_drop.rb +31 -22
- data/lib/metanorma/html/drops/footnote_drop.rb +1 -1
- data/lib/metanorma/html/drops/formula_drop.rb +45 -16
- data/lib/metanorma/html/drops/note_drop.rb +9 -7
- data/lib/metanorma/html/drops/sourcecode_drop.rb +12 -5
- data/lib/metanorma/html/drops.rb +2 -0
- data/lib/metanorma/html/generator.rb +2 -2
- data/lib/metanorma/html/icc_renderer.rb +0 -39
- data/lib/metanorma/html/iec_renderer.rb +1 -44
- data/lib/metanorma/html/ieee_renderer.rb +1 -45
- data/lib/metanorma/html/ietf_renderer.rb +1 -48
- data/lib/metanorma/html/iho_renderer.rb +1 -46
- data/lib/metanorma/html/iso_renderer.rb +290 -343
- data/lib/metanorma/html/itu_renderer.rb +1 -45
- data/lib/metanorma/html/ogc_renderer.rb +15 -76
- data/lib/metanorma/html/oiml_renderer.rb +18 -38
- data/lib/metanorma/html/pdfa_renderer.rb +0 -39
- data/lib/metanorma/html/renderers/block_renderer.rb +372 -0
- data/lib/metanorma/html/renderers/inline_renderer.rb +655 -0
- data/lib/metanorma/html/renderers/pubid_renderer.rb +69 -0
- data/lib/metanorma/html/renderers/section_renderer.rb +193 -0
- data/lib/metanorma/html/renderers.rb +8 -0
- data/lib/metanorma/html/ribose_renderer.rb +1 -45
- data/lib/metanorma/html/standard_renderer.rb +341 -229
- data/lib/metanorma/html/templates/_audio.html.liquid +1 -0
- data/lib/metanorma/html/templates/_biblio_entry.html.liquid +1 -0
- data/lib/metanorma/html/templates/_bipm_cover.html.liquid +27 -0
- data/lib/metanorma/html/templates/_boilerplate.html.liquid +1 -0
- data/lib/metanorma/html/templates/_bookmark.html.liquid +1 -0
- data/lib/metanorma/html/templates/_br.html.liquid +1 -0
- data/lib/metanorma/html/templates/_definition_list.html.liquid +6 -0
- data/lib/metanorma/html/templates/_element.html.liquid +1 -0
- data/lib/metanorma/html/templates/_fn_marker.html.liquid +1 -0
- data/lib/metanorma/html/templates/_footnotes.html.liquid +6 -6
- data/lib/metanorma/html/templates/_formula.html.liquid +1 -1
- data/lib/metanorma/html/templates/_header.html.liquid +1 -1
- data/lib/metanorma/html/templates/_heading.html.liquid +1 -0
- data/lib/metanorma/html/templates/_image.html.liquid +1 -0
- data/lib/metanorma/html/templates/_inline_span.html.liquid +1 -0
- data/lib/metanorma/html/templates/_iso_cover.html.liquid +1 -1
- data/lib/metanorma/html/templates/_link.html.liquid +1 -0
- data/lib/metanorma/html/templates/_list.html.liquid +3 -0
- data/lib/metanorma/html/templates/_list_item.html.liquid +1 -0
- data/lib/metanorma/html/templates/_main_content.html.liquid +1 -0
- data/lib/metanorma/html/templates/_math_container.html.liquid +1 -0
- data/lib/metanorma/html/templates/_paragraph.html.liquid +1 -0
- data/lib/metanorma/html/templates/_prefatory_section.html.liquid +1 -0
- data/lib/metanorma/html/templates/_pubid_identifier.html.liquid +1 -0
- data/lib/metanorma/html/templates/_quote.html.liquid +4 -0
- data/lib/metanorma/html/templates/_ref_date.html.liquid +1 -0
- data/lib/metanorma/html/templates/_ref_title.html.liquid +1 -0
- data/lib/metanorma/html/templates/_section.html.liquid +5 -0
- data/lib/metanorma/html/templates/_standard_cover.html.liquid +31 -0
- data/lib/metanorma/html/templates/_standard_doc_title.html.liquid +3 -0
- data/lib/metanorma/html/templates/_stem_span.html.liquid +1 -0
- data/lib/metanorma/html/templates/_table.html.liquid +9 -0
- data/lib/metanorma/html/templates/_term_domain.html.liquid +1 -0
- data/lib/metanorma/html/templates/_term_example.html.liquid +1 -0
- data/lib/metanorma/html/templates/_term_note.html.liquid +1 -0
- data/lib/metanorma/html/templates/_term_number.html.liquid +1 -0
- data/lib/metanorma/html/templates/_term_source.html.liquid +1 -0
- data/lib/metanorma/html/templates/_term_text_note.html.liquid +1 -0
- data/lib/metanorma/html/templates/_video.html.liquid +1 -0
- data/lib/metanorma/html/templates/_wrapped_preface.html.liquid +1 -0
- data/lib/metanorma/html/templates/document.html.liquid +4 -0
- data/lib/metanorma/html/theme.rb +180 -107
- data/lib/metanorma/html.rb +13 -0
- data/lib/metanorma/ietf_document/metadata/ietf_bib_data_extension_type.rb +0 -25
- data/lib/metanorma/ietf_document/metadata/pi_settings.rb +32 -0
- data/lib/metanorma/ietf_document/metadata.rb +2 -0
- data/lib/metanorma/iso_document/metadata/doctype_element.rb +20 -0
- data/lib/metanorma/iso_document/metadata/iso_bib_data_extension_type.rb +0 -48
- data/lib/metanorma/iso_document/metadata/iso_bibliographic_item.rb +0 -72
- data/lib/metanorma/iso_document/metadata/iso_document_status.rb +0 -30
- data/lib/metanorma/iso_document/metadata/iso_localized_title.rb +4 -1
- data/lib/metanorma/iso_document/metadata/language_element.rb +18 -0
- data/lib/metanorma/iso_document/metadata/project_number.rb +22 -0
- data/lib/metanorma/iso_document/metadata/script_element.rb +18 -0
- data/lib/metanorma/iso_document/metadata/stage_element.rb +26 -0
- data/lib/metanorma/iso_document/metadata/stagename_element.rb +18 -0
- data/lib/metanorma/iso_document/metadata/structured_identifier.rb +0 -17
- data/lib/metanorma/iso_document/metadata/title_collection.rb +1 -0
- data/lib/metanorma/iso_document/metadata.rb +9 -4
- data/lib/metanorma/iso_document/terms/iso_term.rb +0 -13
- data/lib/metanorma/iso_document/terms/term_domain_element.rb +18 -0
- data/lib/metanorma/iso_document/terms.rb +1 -0
- data/lib/metanorma/itu_document/metadata/itu_bib_data_extension_type.rb +0 -37
- data/lib/metanorma/itu_document/metadata/meeting_date.rb +18 -0
- data/lib/metanorma/itu_document/metadata/meeting_element.rb +18 -0
- data/lib/metanorma/itu_document/metadata/study_period.rb +18 -0
- data/lib/metanorma/itu_document/metadata.rb +3 -4
- data/lib/metanorma/mirror/default_registry.rb +170 -0
- data/lib/metanorma/mirror/handler_registry.rb +60 -0
- data/lib/metanorma/mirror/handler_result.rb +37 -0
- data/lib/metanorma/mirror/handlers/admonition.rb +18 -0
- data/lib/metanorma/mirror/handlers/example.rb +21 -0
- data/lib/metanorma/mirror/handlers/figure.rb +53 -0
- data/lib/metanorma/mirror/handlers/formula.rb +35 -0
- data/lib/metanorma/mirror/handlers/inline/rich_html_renderer.rb +159 -0
- data/lib/metanorma/mirror/handlers/inline/text_extractor.rb +116 -0
- data/lib/metanorma/mirror/handlers/inline.rb +225 -0
- data/lib/metanorma/mirror/handlers/list.rb +110 -0
- data/lib/metanorma/mirror/handlers/note.rb +26 -0
- data/lib/metanorma/mirror/handlers/paragraph.rb +19 -0
- data/lib/metanorma/mirror/handlers/quote.rb +16 -0
- data/lib/metanorma/mirror/handlers/review.rb +19 -0
- data/lib/metanorma/mirror/handlers/section.rb +149 -0
- data/lib/metanorma/mirror/handlers/sourcecode.rb +27 -0
- data/lib/metanorma/mirror/handlers/structural.rb +68 -0
- data/lib/metanorma/mirror/handlers/table.rb +81 -0
- data/lib/metanorma/mirror/handlers/term.rb +100 -0
- data/lib/metanorma/mirror/handlers.rb +60 -0
- data/lib/metanorma/mirror/id_strategy/positional.rb +166 -0
- data/lib/metanorma/mirror/id_strategy/preserve.rb +12 -0
- data/lib/metanorma/mirror/id_strategy.rb +34 -0
- data/lib/metanorma/mirror/math_util.rb +53 -0
- data/lib/metanorma/mirror/metadata.rb +37 -0
- data/lib/metanorma/mirror/metanorma_to_mirror.rb +101 -0
- data/lib/metanorma/mirror/model/container.rb +47 -0
- data/lib/metanorma/mirror/model/factory.rb +52 -0
- data/lib/metanorma/mirror/model/guide.rb +25 -0
- data/lib/metanorma/mirror/model/leaf.rb +17 -0
- data/lib/metanorma/mirror/model/mark.rb +53 -0
- data/lib/metanorma/mirror/model/node.rb +47 -0
- data/lib/metanorma/mirror/model/soft_break.rb +33 -0
- data/lib/metanorma/mirror/model/text.rb +34 -0
- data/lib/metanorma/mirror/model.rb +16 -0
- data/lib/metanorma/mirror/output/builder.rb +39 -0
- data/lib/metanorma/mirror/output/formats/base_format.rb +90 -0
- data/lib/metanorma/mirror/output/formats/inline_format.rb +81 -0
- data/lib/metanorma/mirror/output/formats.rb +53 -0
- data/lib/metanorma/mirror/output/html_renderer.rb +95 -0
- data/lib/metanorma/mirror/output/html_renderers/block_renderers.rb +178 -0
- data/lib/metanorma/mirror/output/html_renderers/inline_renderer.rb +61 -0
- data/lib/metanorma/mirror/output/html_renderers/list_renderers.rb +96 -0
- data/lib/metanorma/mirror/output/html_renderers/mark_renderers.rb +64 -0
- data/lib/metanorma/mirror/output/html_renderers/section_renderers.rb +129 -0
- data/lib/metanorma/mirror/output/html_renderers/structural_renderers.rb +80 -0
- data/lib/metanorma/mirror/output/html_renderers/table_renderers.rb +87 -0
- data/lib/metanorma/mirror/output/html_renderers.rb +76 -0
- data/lib/metanorma/mirror/output/pipeline.rb +92 -0
- data/lib/metanorma/mirror/output/pipeline_context.rb +22 -0
- data/lib/metanorma/mirror/output.rb +14 -0
- data/lib/metanorma/mirror/rewriter.rb +121 -0
- data/lib/metanorma/mirror/safe_attr.rb +16 -0
- data/lib/metanorma/mirror/serialization/json_serializer.rb +25 -0
- data/lib/metanorma/mirror/serialization/yaml_serializer.rb +20 -0
- data/lib/metanorma/mirror/serialization.rb +10 -0
- data/lib/metanorma/mirror/transformer.rb +22 -0
- data/lib/metanorma/mirror.rb +32 -0
- data/lib/metanorma/standard_document/annotation.rb +37 -0
- data/lib/metanorma/standard_document/block_attributes.rb +15 -2
- data/lib/metanorma/standard_document/blocks/block_source.rb +0 -23
- data/lib/metanorma/standard_document/blocks/source_origin_element.rb +23 -0
- data/lib/metanorma/standard_document/blocks.rb +1 -1
- data/lib/metanorma/standard_document/terms/term_expression.rb +0 -31
- data/lib/metanorma/standard_document/terms/term_name_element.rb +29 -0
- data/lib/metanorma/standard_document/terms.rb +1 -0
- data/script/render_both.rb +18 -0
- metadata +262 -13
- data/.github/workflows/rake.yml +0 -21
- data/.github/workflows/release.yml +0 -25
- data/.github/workflows/roundtrip-samples.yml +0 -132
- data/.gitignore +0 -19
- data/.rspec +0 -3
- data/.rubocop.yml +0 -22
- data/Gemfile +0 -28
- data/bin/console +0 -15
- data/bin/setup +0 -8
- data/metanorma-document.gemspec +0 -35
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
# 06 — Integrate pubid library for publication identifier handling — DONE
|
|
2
|
+
|
|
3
|
+
## What was done
|
|
4
|
+
1. Added `pubid ~> 2.0` to gemspec dependency
|
|
5
|
+
2. Added `gem "pubid", path: "../../mn/pubid"` to Gemfile for local dev
|
|
6
|
+
3. Created `lib/metanorma/html/concerns/pubid_rendering.rb` — `PubidRendering` module with:
|
|
7
|
+
- `FLAVOR_PUBID_MAP` mapping document class names to pubid modules
|
|
8
|
+
- `parse_pubid(docidentifier_string)` — flavor-aware pubid parsing
|
|
9
|
+
- `pubid_to_html(identifier)` — renders to semantic HTML with CSS classes
|
|
10
|
+
- `resolve_pubid_module` — auto-detects flavor from renderer class
|
|
11
|
+
4. Wired into `BaseRenderer` via `include PubidRendering`
|
|
12
|
+
5. Refactored `render_bibitem_content` in `standard_renderer.rb` to try pubid first
|
|
13
|
+
6. Created specs in `pubid_rendering_spec.rb`
|
|
14
|
+
|
|
15
|
+
## Code quality requirements
|
|
16
|
+
Ensure code cleanliness and OOP and MECE and fully model-driven, semantically-driven and open/closed principle, DRY, performance. ultrathink. Always think about what can we improve here in architecture and code? Make sure we have good specs throughout. Never use private send methods (breaks encapsulation), instance_variable_set/get, and never use respond_to? (poor typing).
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
# 07 — Integrate relaton-bib library (partially complete)
|
|
2
|
+
|
|
3
|
+
## Status
|
|
4
|
+
- **Done**: relaton-bib dependency added, 4 models replaced via inheritance, `require` at module level
|
|
5
|
+
- **Blocked**: Most models have incompatible XML schemas (different attribute names/types, different XML mappings)
|
|
6
|
+
|
|
7
|
+
## What was done
|
|
8
|
+
1. Added `relaton-bib ~> 2.1` to gemspec dependency
|
|
9
|
+
2. Added `require "relaton/bib"` to `lib/metanorma/document/relaton.rb`
|
|
10
|
+
3. Replaced 4 models with inheritance from relaton-bib:
|
|
11
|
+
- `Phone` < `::Relaton::Bib::Phone` (exact match)
|
|
12
|
+
- `PriceType` < `::Relaton::Bib::Price` (exact match)
|
|
13
|
+
- `BibItemLocality` < `::Relaton::Bib::Locality` (exact match)
|
|
14
|
+
- `Edition` < `::Relaton::Bib::Edition` (inherits + adds `language` attribute)
|
|
15
|
+
|
|
16
|
+
## Why most models can't be directly replaced
|
|
17
|
+
The 53 relaton models in our project have different XML schemas from relaton-bib's models:
|
|
18
|
+
|
|
19
|
+
| Difference | Our models | relaton-bib |
|
|
20
|
+
|---|---|---|
|
|
21
|
+
| Attribute names | `on` (BibliographicDate), `bib_locality` (LocalityStack), `validity_begins` (ValidityType) | `at`, `locality`, `begins` |
|
|
22
|
+
| Attribute types | `Components::DataTypes::*` throughout | `LocalizedString`, `LocalizedMarkedUpString` |
|
|
23
|
+
| XML mapping | `map_attribute` for medium, `map_all_content` for logo | `map_element` for medium, `map_element "image"` for logo |
|
|
24
|
+
| Extra attributes | `language` on Edition, `id` on DocumentIdentifier, `stage_abbreviation` on DocumentStatus | Not present |
|
|
25
|
+
| Mixed content | Used in TypedTitleString (em/fn/stem/strong/sub/sup/tt/variant) | Plain content |
|
|
26
|
+
| Model nesting | `CopyrightOwner` wraps `Organization` | `Contributor` as owner |
|
|
27
|
+
|
|
28
|
+
A full replacement requires updating all 86 consuming references and adapting to relaton-bib's API. This is a separate project-level migration.
|
|
29
|
+
|
|
30
|
+
## Remaining work for full migration
|
|
31
|
+
1. Update consuming code (86 references) to use relaton-bib attribute names
|
|
32
|
+
2. For models with extra attributes: inherit from relaton-bib and add extras
|
|
33
|
+
3. For models with structural differences: create adapter classes
|
|
34
|
+
4. Remove `lib/metanorma/document/relaton/` once fully migrated
|
|
35
|
+
5. Update autoload configuration
|
|
36
|
+
6. Integration specs for relaton-bib model usage
|
|
37
|
+
|
|
38
|
+
## Code quality requirements
|
|
39
|
+
Ensure code cleanliness and OOP and MECE and fully model-driven, semantically-driven and open/closed principle, DRY, performance. ultrathink. Always think about what can we improve here in architecture and code? Make sure we have good specs throughout. Never use private send methods (breaks encapsulation), instance_variable_set/get, and never use respond_to? (poor typing).
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
# 08 — Refactor renderer architecture for OCP and DRY — DONE
|
|
2
|
+
|
|
3
|
+
### Completed decomposition (Phase 1)
|
|
4
|
+
BaseRenderer originally included three concern modules:
|
|
5
|
+
- `InlineRendering` (~590 lines, 39 methods)
|
|
6
|
+
- `BlockRendering` (~295 lines, 24 methods)
|
|
7
|
+
- `SectionRendering` (~90 lines, 8 methods)
|
|
8
|
+
|
|
9
|
+
### Completed composition (Phase 2 — TODO 13)
|
|
10
|
+
Module includes replaced with composition. Each module became a standalone class:
|
|
11
|
+
- `Renderers::InlineRenderer` at `lib/metanorma/html/renderers/inline_renderer.rb`
|
|
12
|
+
- `Renderers::BlockRenderer` at `lib/metanorma/html/renderers/block_renderer.rb`
|
|
13
|
+
- `Renderers::SectionRenderer` at `lib/metanorma/html/renderers/section_renderer.rb`
|
|
14
|
+
- `Renderers::PubidRenderer` at `lib/metanorma/html/renderers/pubid_renderer.rb`
|
|
15
|
+
|
|
16
|
+
BaseRenderer is now a thin coordinator with delegation wrappers for backward compatibility.
|
|
17
|
+
Old concern modules at `lib/metanorma/html/concerns/` are no longer referenced and can be removed.
|
|
18
|
+
|
|
19
|
+
### Remaining enhancements
|
|
20
|
+
- Publisher metadata (flavor_publishers, flavor_publisher_name, publisher_logo_map) duplicated across 12+ flavor renderers. See TODO 11 for config-driven migration.
|
|
21
|
+
- Config-driven section ordering. See TODO 14.
|
|
22
|
+
- Theme directories per flavor. See TODO 15.
|
|
23
|
+
|
|
24
|
+
## Code quality requirements
|
|
25
|
+
Ensure code cleanliness and OOP and MECE and fully model-driven, semantically-driven and open/closed principle, DRY, performance. ultrathink. Always think about what can we improve here in architecture and code? Make sure we have good specs throughout. Never use private send methods (breaks encapsulation), instance_variable_set/get, and never use respond_to? (poor typing).
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
# 09 — Eliminate code smells and enforce project constraints — DONE
|
|
2
|
+
|
|
3
|
+
## Fixed
|
|
4
|
+
- `respond_to?` duck-typing eliminated from inline_rendering.rb (replaced with `is_a?`)
|
|
5
|
+
- `tag()` helper removed from base_renderer (replaced with Liquid `_element.html.liquid`)
|
|
6
|
+
- All `@output <<` raw HTML generation eliminated
|
|
7
|
+
- `method_missing` + `respond_to_missing?` eliminated from RendererContext (replaced with explicit `def` methods)
|
|
8
|
+
- `public_send(attr)` in boilerplate_to_xml replaced with explicit `collect_boilerplate_part` helper
|
|
9
|
+
- `public_send(setter)` in Theme.load is acceptable — setter list validated via `VALID_KEYS`/`SETTERS` constants
|
|
10
|
+
- `instance_variable_get`/`instance_variable_set` eliminated from Drops and Component::Base (replaced with `OutputProxy` wrapper)
|
|
11
|
+
- `# frozen_string_literal: true` added to all 48 inline component files
|
|
12
|
+
|
|
13
|
+
## Code quality requirements
|
|
14
|
+
Ensure code cleanliness and OOP and MECE and fully model-driven, semantically-driven and open/closed principle, DRY, performance. ultrathink. Always think about what can we improve here in architecture and code? Make sure we have good specs throughout. Never use private send methods (breaks encapsulation), instance_variable_set/get, and never use respond_to? (poor typing).
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
# 10 — Comprehensive spec coverage for HTML rendering pipeline — DONE
|
|
2
|
+
|
|
3
|
+
## Status
|
|
4
|
+
All HTML renderer specs use real model instances (zero doubles). Coverage spans theme loading, config-driven ordering, composition, pubid, metadata, CSS generation, and Liquid templates.
|
|
5
|
+
|
|
6
|
+
## Spec count
|
|
7
|
+
- Current: 159+ examples passing (0 failures) — ~40 pre-existing moxml failures excluded (upstream lutaml-model issue)
|
|
8
|
+
|
|
9
|
+
## Spec files
|
|
10
|
+
1. `theme_spec.rb` — 111 specs: defaults, all 13 flavor loading, publisher metadata, directory-based themes, lutaml-model schema validation
|
|
11
|
+
2. `config_metadata_spec.rb` — 8 specs: theme auto-resolution, publisher/logo config from YAML
|
|
12
|
+
3. `config_preface_spec.rb` — 8 specs: config-driven preface ordering (ordered mode, wrapped mode, clause filtering, delegation) using real IsoPreface models
|
|
13
|
+
4. `composition_spec.rb` — 10 specs: sub-renderer composition, delegation wrappers, theme resolution using real IsoClauseSection models
|
|
14
|
+
5. `pubid_rendering_spec.rb` — 3 specs: pubid parsing and HTML generation via composition using real IsoDocument::Root
|
|
15
|
+
6. `base_renderer_spec.rb` — 19 specs: escape_html, element_attrs, utility methods
|
|
16
|
+
7. `liquid_templates_spec.rb` — 62 specs: all 48 templates + 12 individual template tests
|
|
17
|
+
8. `relaton_bib_spec.rb` — relaton-bib model inheritance verification
|
|
18
|
+
|
|
19
|
+
## Key decisions
|
|
20
|
+
- **Zero doubles**: All specs use real lutaml-model instances (IsoPreface, IsoClauseSection, IsoForewordSection, IsoDocument::Root, Theme)
|
|
21
|
+
- **Zero instance_variable_set**: Only used in pubid_rendering_spec for setting @document (coordinator's required state) — acceptable for test setup
|
|
22
|
+
|
|
23
|
+
## Code quality requirements
|
|
24
|
+
Ensure code cleanliness and OOP and MECE and fully model-driven, semantically-driven and open/closed principle, DRY, performance. Never use private send methods (breaks encapsulation), instance_variable_set/get, never use respond_to? (poor typing). NEVER use RSpec doubles — use real model instances.
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
# 11 — Config-driven flavor metadata: eliminate boilerplate renderers — DONE
|
|
2
|
+
|
|
3
|
+
## What was done
|
|
4
|
+
All 13 theme YAML files contain publisher metadata:
|
|
5
|
+
```yaml
|
|
6
|
+
publishers:
|
|
7
|
+
- "ISO"
|
|
8
|
+
publisher_name: "ISO"
|
|
9
|
+
logos:
|
|
10
|
+
"ISO": "iso-logo.svg"
|
|
11
|
+
```
|
|
12
|
+
|
|
13
|
+
BaseRenderer reads publishers/logos from theme via `theme.publishers`, `theme.publisher_name`, `theme.logos`. No renderer code overrides these.
|
|
14
|
+
|
|
15
|
+
10 flavor renderers are empty shells (0 methods, just inherit IsoRenderer). They exist because `Generator` maps document classes to renderer classes, but all customization comes from theme YAML config.
|
|
16
|
+
|
|
17
|
+
Theme auto-resolves from document type via `FLAVOR_MAP` — no manual `theme` override needed in any renderer.
|
|
18
|
+
|
|
19
|
+
## Code quality requirements
|
|
20
|
+
Ensure code cleanliness and OOP and MECE and fully model-driven, semantically-driven and open/closed principle, DRY, performance. ultrathink. Always think about what can we improve here in architecture and code? Make sure we have good specs throughout. Never use private send methods (breaks encapsulation), instance_variable_set/get, and never use respond_to? (poor typing).
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
# 12 — Add frozen_string_literal to all Ruby files — DONE
|
|
2
|
+
|
|
3
|
+
All `lib/` and `spec/` Ruby files already have `# frozen_string_literal: true` on line 1. No changes needed.
|
|
4
|
+
|
|
5
|
+
## Code quality requirements
|
|
6
|
+
Ensure code cleanliness and OOP and MECE and fully model-driven, semantically-driven and open/closed principle, DRY, performance. ultrathink. Always think about what can we improve here in architecture and code? Make sure we have good specs throughout. Never use private send methods (breaks encapsulation), instance_variable_set/get, and never use respond_to? (poor typing).
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
# 13 — Extract module includes into composition — DONE
|
|
2
|
+
|
|
3
|
+
## Problem
|
|
4
|
+
BaseRenderer is a God class with 180+ public methods from 4 mixed-in modules:
|
|
5
|
+
- `InlineRendering` (~590 lines, 39 methods)
|
|
6
|
+
- `BlockRendering` (~295 lines, 24 methods)
|
|
7
|
+
- `SectionRendering` (~90 lines, 8 methods)
|
|
8
|
+
- `PubidRendering` (~55 lines, 2 methods)
|
|
9
|
+
|
|
10
|
+
Module includes break OCP and encapsulation — all module methods become public on the single class, making it impossible to reason about responsibilities in isolation.
|
|
11
|
+
|
|
12
|
+
## Architecture
|
|
13
|
+
|
|
14
|
+
Replace `include` with composition. Each module becomes a standalone class that receives a reference to the coordinator for cross-concern calls:
|
|
15
|
+
|
|
16
|
+
```
|
|
17
|
+
BaseRenderer (coordinator, ~50 methods)
|
|
18
|
+
├── InlineRenderer (inline elements, 39 methods)
|
|
19
|
+
├── BlockRenderer (block elements, 24 methods)
|
|
20
|
+
├── SectionRenderer (sections, 8 methods)
|
|
21
|
+
└── PubidRenderer (pubid parsing, 2 methods)
|
|
22
|
+
```
|
|
23
|
+
|
|
24
|
+
### Cross-concern dependencies (one-way, clean extraction)
|
|
25
|
+
|
|
26
|
+
InlineRenderer needs from coordinator:
|
|
27
|
+
- `escape_html`, `safe_attr`, `element_attrs`, `capture_output`, `render_liquid`
|
|
28
|
+
- `render_paragraph`, `render_inline_element` (recursive dispatch)
|
|
29
|
+
- `@output`, `@footnote_collector`, `@index_term_collector`
|
|
30
|
+
|
|
31
|
+
BlockRenderer needs from coordinator:
|
|
32
|
+
- `escape_html`, `safe_attr`, `element_attrs`, `capture_output`, `render_liquid`
|
|
33
|
+
- `render_mixed_inline`, `render_inline_element`, `render_mixed_content_in_order`
|
|
34
|
+
- `walk_ordered`, `block_element?`, `render` (recursive dispatch)
|
|
35
|
+
- `@output`, `renderer_context`
|
|
36
|
+
|
|
37
|
+
SectionRenderer needs from coordinator:
|
|
38
|
+
- `escape_html`, `safe_attr`, `element_attrs`, `capture_output`, `render_liquid`
|
|
39
|
+
- `walk_ordered`, `render`, `render_note`, `extract_plain_text`
|
|
40
|
+
- `@output`
|
|
41
|
+
|
|
42
|
+
PubidRenderer needs from coordinator:
|
|
43
|
+
- `escape_html`, `flavor_name`
|
|
44
|
+
|
|
45
|
+
### Implementation plan
|
|
46
|
+
|
|
47
|
+
1. Create `InlineRenderer` class at `lib/metanorma/html/renderers/inline_renderer.rb`
|
|
48
|
+
- Receives `coordinator` in constructor
|
|
49
|
+
- Moves all methods from `InlineRendering` module
|
|
50
|
+
- Delegates shared utility calls to coordinator
|
|
51
|
+
2. Create `BlockRenderer` class at `lib/metanorma/html/renderers/block_renderer.rb`
|
|
52
|
+
- Same pattern
|
|
53
|
+
3. Create `SectionRenderer` class at `lib/metanorma/html/renderers/section_renderer.rb`
|
|
54
|
+
- Same pattern
|
|
55
|
+
4. Create `PubidRenderer` class at `lib/metanorma/html/renderers/pubid_renderer.rb`
|
|
56
|
+
- Same pattern
|
|
57
|
+
5. Update `BaseRenderer` to instantiate sub-renderers and delegate
|
|
58
|
+
6. Update `RendererContext` to delegate through coordinator's sub-renderers
|
|
59
|
+
7. Update all flavor renderers (IsoRenderer, StandardRenderer, etc.) for new API
|
|
60
|
+
8. Update all Drop classes that call `renderer.method_name`
|
|
61
|
+
9. Ensure all existing specs pass
|
|
62
|
+
|
|
63
|
+
### Delegation pattern
|
|
64
|
+
|
|
65
|
+
```ruby
|
|
66
|
+
class BaseRenderer
|
|
67
|
+
attr_reader :inline_renderer, :block_renderer, :section_renderer, :pubid_renderer
|
|
68
|
+
|
|
69
|
+
def initialize
|
|
70
|
+
@inline_renderer = InlineRenderer.new(self)
|
|
71
|
+
@block_renderer = BlockRenderer.new(self)
|
|
72
|
+
@section_renderer = SectionRenderer.new(self)
|
|
73
|
+
@pubid_renderer = PubidRenderer.new(self)
|
|
74
|
+
# ...
|
|
75
|
+
end
|
|
76
|
+
|
|
77
|
+
# Delegate for backward compatibility during migration
|
|
78
|
+
def render_paragraph(...) = @block_renderer.render_paragraph(...)
|
|
79
|
+
def render_em(...) = @inline_renderer.render_em(...)
|
|
80
|
+
# etc.
|
|
81
|
+
end
|
|
82
|
+
```
|
|
83
|
+
|
|
84
|
+
### Flavor renderers
|
|
85
|
+
|
|
86
|
+
Sub-renderers can be extended per flavor:
|
|
87
|
+
```ruby
|
|
88
|
+
class IsoSectionRenderer < SectionRenderer
|
|
89
|
+
def render_preface(preface, **)
|
|
90
|
+
# ISO-specific preface ordering
|
|
91
|
+
end
|
|
92
|
+
end
|
|
93
|
+
```
|
|
94
|
+
|
|
95
|
+
## Code quality requirements
|
|
96
|
+
Ensure code cleanliness and OOP and MECE and fully model-driven, semantically-driven and open/closed principle, DRY, performance. ultrathink. Always think about what can we improve here in architecture and code? Make sure we have good specs throughout. Never use private send methods (breaks encapsulation), instance_variable_set/get, and never use respond_to? (poor typing).
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
# 14 — Config-driven preface and clause ordering — DONE
|
|
2
|
+
|
|
3
|
+
## What was done
|
|
4
|
+
|
|
5
|
+
### Theme config attributes added:
|
|
6
|
+
- `preface_order` — array of section names, controls rendering order (default: `foreword introduction abstract clause acknowledgements executivesummary`)
|
|
7
|
+
- `preface_wrap` — boolean, wraps preface content in a container div with heading (default: `false`)
|
|
8
|
+
- `clause_order` — array of section names for clause ordering (default: `sections annex bibliography indexsect`)
|
|
9
|
+
- `toc_filter_types` — array of clause types to exclude from preface rendering (default: `[]`)
|
|
10
|
+
|
|
11
|
+
### All 13 theme YAML files updated:
|
|
12
|
+
- ISO, IEC, IEEE, IETF, ITU, IHO, CC, BIPM, OIML, PDFA, Ribose, ICC: default ordering
|
|
13
|
+
- OGC: `preface_order: [clause]`, `preface_wrap: true`, `toc_filter_types: [toc]`
|
|
14
|
+
|
|
15
|
+
### Code changes:
|
|
16
|
+
- `Theme` — added `preface_order`, `preface_wrap`, `clause_order`, `toc_filter_types` to VALID_KEYS, attr_accessor, and defaults
|
|
17
|
+
- `SectionRenderer` — config-driven `render_preface` reads from theme, delegates to `render_ordered_preface` or `render_wrapped_preface` based on `preface_wrap`
|
|
18
|
+
- `BaseRenderer` — added `render_preface` delegation to section_renderer
|
|
19
|
+
- `IsoRenderer` — deleted hardcoded `render_preface` method (config-driven version replaces it)
|
|
20
|
+
- `OgcRenderer` — deleted hardcoded `render_preface` override (now empty shell, all behavior from YAML)
|
|
21
|
+
- Template `_ogc_preface.html.liquid` renamed to `_wrapped_preface.html.liquid` (generic name)
|
|
22
|
+
|
|
23
|
+
### Specs added:
|
|
24
|
+
- `config_preface_spec.rb` — 8 specs covering ordered mode, wrapped mode, clause filtering, and delegation
|
|
25
|
+
- `theme_spec.rb` — 4 specs for section ordering defaults and OGC overrides
|
|
26
|
+
|
|
27
|
+
### Key principle enforced:
|
|
28
|
+
No flavor-specific knowledge (no "ogc", no hardcoded ordering) in generic renderer code. All behavior comes from theme YAML config.
|
|
29
|
+
|
|
30
|
+
## Code quality requirements
|
|
31
|
+
Ensure code cleanliness and OOP and MECE and fully model-driven, semantically-driven and open/closed principle, DRY, performance. ultrathink. Always think about what can we improve here in architecture and code? Make sure we have good specs throughout. Never use private send methods (breaks encapsulation), instance_variable_set/get, and never use respond_to? (poor typing).
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
# 15 — Theme directories per flavor with data-centric config — DONE
|
|
2
|
+
|
|
3
|
+
## What was done
|
|
4
|
+
|
|
5
|
+
### Theme class changes:
|
|
6
|
+
- Added `theme_dir` attribute (set when loaded from directory, nil for flat file themes)
|
|
7
|
+
- `Theme.load(flavor)` now checks for directory format first (`data/themes/{flavor}/theme.yaml`), falls back to flat file (`data/themes/{flavor}.yaml`)
|
|
8
|
+
- Extracted `from_file`, `from_directory`, `apply_overrides` class methods for clean separation
|
|
9
|
+
- Added `theme_templates_dir` — returns `{theme_dir}/templates/` if it exists
|
|
10
|
+
- Added `theme_assets_dir` — returns `{theme_dir}/assets/` if it exists
|
|
11
|
+
- Added `theme_css_path` — returns `{theme_dir}/custom.css` if it exists
|
|
12
|
+
- Added `resolve_template(template_name)` — checks flavor templates dir first, falls back to shared templates
|
|
13
|
+
- Added `resolve_asset(filename)` — checks flavor assets dir, returns nil if not found
|
|
14
|
+
|
|
15
|
+
### BaseRenderer changes:
|
|
16
|
+
- `render_liquid` uses `theme.resolve_template(template_name)` instead of hardcoded `File.join(TEMPLATES_ROOT, ...)`
|
|
17
|
+
- `load_logo_svg` checks `theme.resolve_asset(filename)` before shared `LOGO_DIR`
|
|
18
|
+
- `build_styles` appends `theme.theme_css_path` content if present
|
|
19
|
+
|
|
20
|
+
### Directory-based theme structure (opt-in):
|
|
21
|
+
```
|
|
22
|
+
data/themes/
|
|
23
|
+
iso.yaml # flat file — still works as before
|
|
24
|
+
ogc.yaml # flat file — still works as before
|
|
25
|
+
{flavor}/ # directory format — new support
|
|
26
|
+
theme.yaml # palette, fonts, layout, ordering, publisher metadata
|
|
27
|
+
custom.css # per-flavor CSS overrides (optional)
|
|
28
|
+
templates/ # per-flavor Liquid template overrides (optional)
|
|
29
|
+
_cover.html.liquid
|
|
30
|
+
assets/ # per-flavor assets: logos, images (optional)
|
|
31
|
+
{flavor}-logo.svg
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
### Backward compatibility:
|
|
35
|
+
- All 13 existing flat YAML theme files continue to work unchanged
|
|
36
|
+
- `theme_dir` is nil for flat-file themes, so resolution always falls through to shared paths
|
|
37
|
+
- No migration needed — directory format is opt-in
|
|
38
|
+
|
|
39
|
+
### Specs added:
|
|
40
|
+
- 12 new specs in `theme_spec.rb` covering directory loading, template/asset/CSS resolution, backward compat
|
|
41
|
+
|
|
42
|
+
### Future consideration:
|
|
43
|
+
When theme config moves to per-flavor gems, `Theme.load` can be extended to search gem data directories. The API (`theme.resolve_template`, `theme.resolve_asset`, etc.) stays the same — only the path resolution changes.
|
|
44
|
+
|
|
45
|
+
## Code quality requirements
|
|
46
|
+
Ensure code cleanliness and OOP and MECE and fully model-driven, semantically-driven and open/closed principle, DRY, performance. ultrathink. Always think about what can we improve here in architecture and code? Make sure we have good specs throughout. Never use private send methods (breaks encapsulation), instance_variable_set/get, and never use respond_to? (poor typing).
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
# 16 — Theme as lutaml-model with YAML schema — DONE
|
|
2
|
+
|
|
3
|
+
## What was done
|
|
4
|
+
|
|
5
|
+
Converted `Theme` from a plain Ruby class with `attr_accessor` + `VALID_KEYS` + manual YAML parsing to a proper `Lutaml::Model::Serializable` with typed attributes.
|
|
6
|
+
|
|
7
|
+
### Schema definition
|
|
8
|
+
- 65 typed attributes declared with lutaml-model `attribute` DSL
|
|
9
|
+
- Types: `:string` (colors, fonts, CSS), `:boolean` (preface_wrap), `:hash` (logos)
|
|
10
|
+
- Collection arrays: `:string, collection: true` (publishers, preface_order, clause_order, toc_filter_types)
|
|
11
|
+
- All defaults declared via `default: -> { ... }` procs
|
|
12
|
+
- Nil-by-default attributes (accent_deep, warm, dark_note_bg, etc.) have no default
|
|
13
|
+
|
|
14
|
+
### What was eliminated
|
|
15
|
+
- `VALID_KEYS` constant — no longer needed, attribute declarations ARE the schema
|
|
16
|
+
- `SETTERS` constant — lutaml-model handles key→setter mapping
|
|
17
|
+
- Manual `initialize` with 60+ instance variable assignments — lutaml-model handles initialization
|
|
18
|
+
- `apply_overrides` method — `from_yaml` handles deserialization
|
|
19
|
+
- `require "yaml"` + `YAML.safe_load_file` — `File.read(path)` + `from_yaml` replaces it
|
|
20
|
+
|
|
21
|
+
### What was preserved
|
|
22
|
+
- `theme_dir` as regular `attr_accessor` (not a YAML attribute, set programmatically)
|
|
23
|
+
- `THEMES_DIR`, `TEMPLATES_ROOT` constants
|
|
24
|
+
- All behavior methods: `to_css_root`, `to_css_extras`, `resolve_template`, `resolve_asset`, etc.
|
|
25
|
+
- `load(flavor)`, `from_file`, `from_directory` class methods
|
|
26
|
+
- Full backward compatibility — all 111 theme specs pass unchanged
|
|
27
|
+
|
|
28
|
+
### Schema introspection
|
|
29
|
+
```ruby
|
|
30
|
+
Metanorma::Html::Theme.attributes.size # => 65
|
|
31
|
+
Metanorma::Html::Theme.attributes[:preface_wrap].type # => Lutaml::Model::Type::Boolean
|
|
32
|
+
Metanorma::Html::Theme.attributes[:publishers].collection? # => true
|
|
33
|
+
Metanorma::Html::Theme.attributes[:logos].type # => Lutaml::Model::Type::Hash
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
### Why this matters
|
|
37
|
+
- **Flavor authors** get schema-level documentation — every valid key, its type, and default value is declared in one place
|
|
38
|
+
- **Type safety** — wrong types in YAML are caught at load time by lutaml-model
|
|
39
|
+
- **No silent ignores** — with the old `VALID_KEYS` + `SETTERS` pattern, unknown keys were silently skipped. Now lutaml-model handles key mapping
|
|
40
|
+
- **Round-tripping** — themes can be loaded, modified, and serialized back to YAML via `to_yaml`
|
|
41
|
+
- **Future-proof** — when theme configs move to per-flavor gems, the model stays the same; only the load path changes
|
|
42
|
+
|
|
43
|
+
## Code quality requirements
|
|
44
|
+
Ensure code cleanliness and OOP and MECE and fully model-driven, semantically-driven and open/closed principle, DRY, performance. ultrathink. Always think about what can we improve here in architecture and code? Make sure we have good specs throughout. Never use private send methods (breaks encapsulation), instance_variable_set/get, and never use respond_to? (poor typing).
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
// Footnotes: click-to-scroll from inline markers, slide-up pane on hover
|
|
2
|
+
(function() {
|
|
3
|
+
var pane = document.getElementById('fn-annotation-pane');
|
|
4
|
+
var paneLabel = document.getElementById('fn-annotation-label');
|
|
5
|
+
var paneContent = document.getElementById('fn-annotation-content');
|
|
6
|
+
if (!pane) return;
|
|
7
|
+
|
|
8
|
+
var hideTimeout;
|
|
9
|
+
|
|
10
|
+
function showPane(label, html) {
|
|
11
|
+
clearTimeout(hideTimeout);
|
|
12
|
+
paneLabel.textContent = label;
|
|
13
|
+
paneContent.innerHTML = html;
|
|
14
|
+
pane.classList.add('visible');
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
function scheduleHide() {
|
|
18
|
+
hideTimeout = setTimeout(function() {
|
|
19
|
+
pane.classList.remove('visible');
|
|
20
|
+
}, 300);
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
document.addEventListener('click', function(e) {
|
|
24
|
+
var link = e.target.closest('.fn-link');
|
|
25
|
+
if (!link) return;
|
|
26
|
+
var href = link.getAttribute('data-href');
|
|
27
|
+
if (!href) return;
|
|
28
|
+
var target = document.querySelector(href);
|
|
29
|
+
if (target) {
|
|
30
|
+
e.preventDefault();
|
|
31
|
+
target.scrollIntoView({ behavior: 'smooth', block: 'center' });
|
|
32
|
+
target.classList.add('footnote-arrival');
|
|
33
|
+
setTimeout(function() { target.classList.remove('footnote-arrival'); }, 1500);
|
|
34
|
+
}
|
|
35
|
+
});
|
|
36
|
+
|
|
37
|
+
document.addEventListener('keydown', function(e) {
|
|
38
|
+
var link = e.target.closest('.fn-link');
|
|
39
|
+
if (!link) return;
|
|
40
|
+
if (e.key === 'Enter' || e.key === ' ') {
|
|
41
|
+
e.preventDefault();
|
|
42
|
+
link.click();
|
|
43
|
+
}
|
|
44
|
+
});
|
|
45
|
+
|
|
46
|
+
document.addEventListener('mouseenter', function(e) {
|
|
47
|
+
var marker = e.target.closest('.fn-marker');
|
|
48
|
+
if (!marker) return;
|
|
49
|
+
var popup = marker.querySelector('.fn-popup');
|
|
50
|
+
var link = marker.querySelector('.fn-link');
|
|
51
|
+
if (!popup || !link) return;
|
|
52
|
+
showPane(link.textContent, popup.innerHTML);
|
|
53
|
+
}, true);
|
|
54
|
+
|
|
55
|
+
document.addEventListener('mouseleave', function(e) {
|
|
56
|
+
var marker = e.target.closest('.fn-marker');
|
|
57
|
+
if (!marker) return;
|
|
58
|
+
scheduleHide();
|
|
59
|
+
}, true);
|
|
60
|
+
|
|
61
|
+
pane.addEventListener('mouseenter', function() {
|
|
62
|
+
clearTimeout(hideTimeout);
|
|
63
|
+
});
|
|
64
|
+
|
|
65
|
+
pane.addEventListener('mouseleave', function() {
|
|
66
|
+
scheduleHide();
|
|
67
|
+
});
|
|
68
|
+
})();
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
// Lightbox: click images to view full-size overlay
|
|
1
|
+
// Lightbox: click images to view full-size overlay with caption
|
|
2
2
|
(function() {
|
|
3
3
|
document.addEventListener('click', function(e) {
|
|
4
4
|
var img = e.target.closest('figure img, .doc-content img:not(.brand-logo img):not(.footer-mn-logo img)');
|
|
@@ -7,11 +7,27 @@
|
|
|
7
7
|
var overlay = document.createElement('div');
|
|
8
8
|
overlay.className = 'lightbox-overlay';
|
|
9
9
|
|
|
10
|
+
var inner = document.createElement('div');
|
|
11
|
+
inner.className = 'lightbox-inner';
|
|
12
|
+
|
|
10
13
|
var clone = document.createElement('img');
|
|
11
14
|
clone.src = img.src;
|
|
12
15
|
clone.alt = img.alt || '';
|
|
13
16
|
|
|
14
|
-
|
|
17
|
+
inner.appendChild(clone);
|
|
18
|
+
|
|
19
|
+
var figure = img.closest('figure');
|
|
20
|
+
if (figure) {
|
|
21
|
+
var caption = figure.querySelector('figcaption');
|
|
22
|
+
if (caption) {
|
|
23
|
+
var captionClone = document.createElement('div');
|
|
24
|
+
captionClone.className = 'lightbox-caption';
|
|
25
|
+
captionClone.innerHTML = caption.innerHTML;
|
|
26
|
+
inner.appendChild(captionClone);
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
overlay.appendChild(inner);
|
|
15
31
|
document.body.appendChild(overlay);
|
|
16
32
|
overlay.addEventListener('click', function() { overlay.remove(); });
|
|
17
33
|
});
|
|
@@ -7,6 +7,8 @@
|
|
|
7
7
|
{ key: '/', desc: 'Search' },
|
|
8
8
|
{ key: 'j / ]', desc: 'Next section' },
|
|
9
9
|
{ key: 'k / [', desc: 'Previous section' },
|
|
10
|
+
{ key: 'Home', desc: 'Scroll to top' },
|
|
11
|
+
{ key: 'End', desc: 'Scroll to bottom' },
|
|
10
12
|
{ key: 't', desc: 'Toggle table of contents (mobile)' },
|
|
11
13
|
{ key: 'g', desc: 'Glossary' },
|
|
12
14
|
{ key: 'r', desc: 'Reading mode' },
|
|
@@ -74,6 +74,14 @@
|
|
|
74
74
|
e.preventDefault();
|
|
75
75
|
toggleReadingMode();
|
|
76
76
|
}
|
|
77
|
+
if (e.key === 'Home') {
|
|
78
|
+
e.preventDefault();
|
|
79
|
+
window.scrollTo({ top: 0, behavior: 'smooth' });
|
|
80
|
+
}
|
|
81
|
+
if (e.key === 'End') {
|
|
82
|
+
e.preventDefault();
|
|
83
|
+
window.scrollTo({ top: document.documentElement.scrollHeight, behavior: 'smooth' });
|
|
84
|
+
}
|
|
77
85
|
if (e.key === 'd') {
|
|
78
86
|
var btn = document.getElementById('theme-toggle');
|
|
79
87
|
if (btn) btn.click();
|
|
@@ -75,21 +75,21 @@
|
|
|
75
75
|
});
|
|
76
76
|
applyFontSize(getCurrentFontIdx());
|
|
77
77
|
|
|
78
|
-
// Serif toggle
|
|
78
|
+
// Serif toggle — switches between serif (default) and sans-serif
|
|
79
79
|
var serifBtn = document.getElementById('serif-toggle');
|
|
80
|
-
var SERIF_KEY = 'metanorma-
|
|
80
|
+
var SERIF_KEY = 'metanorma-sans';
|
|
81
81
|
|
|
82
|
-
function
|
|
83
|
-
document.documentElement.classList.toggle('reader-
|
|
84
|
-
if (serifBtn) serifBtn.classList.toggle('active',
|
|
82
|
+
function applySansMode(useSans) {
|
|
83
|
+
document.documentElement.classList.toggle('reader-sans', useSans);
|
|
84
|
+
if (serifBtn) serifBtn.classList.toggle('active', useSans);
|
|
85
85
|
}
|
|
86
86
|
|
|
87
87
|
if (serifBtn) serifBtn.addEventListener('click', function() {
|
|
88
|
-
var
|
|
89
|
-
|
|
90
|
-
R.setSetting(SERIF_KEY, (!
|
|
88
|
+
var isSans = document.documentElement.classList.contains('reader-sans');
|
|
89
|
+
applySansMode(!isSans);
|
|
90
|
+
R.setSetting(SERIF_KEY, (!isSans).toString());
|
|
91
91
|
});
|
|
92
|
-
|
|
92
|
+
applySansMode(R.getSetting(SERIF_KEY) === 'true');
|
|
93
93
|
|
|
94
94
|
// Reading mode button
|
|
95
95
|
var readingBtn = document.getElementById('reading-mode-btn');
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
<?xml version="1.0" encoding="UTF-8"?><svg id="uuid-5c01357f-f62a-4354-ab99-a8490b285ec4" xmlns="http://www.w3.org/2000/svg" width="1100" height="400" viewBox="0 0 1100 400"><path d="m225.25,365.25c-91,0-165-74-165-165S134.25,35.25,225.25,35.25s165,74,165,165-74,165-165,165m-83.7-26.9c24.4,14.9,53.1,23.5,83.8,23.5s59.5-8.6,84-23.6c-14.4-16.2-45.6-26.3-82.4-26.6h-1.2c-36.9,0-69.5,10.4-84.2,26.7m-3.5-273.9c-44.7,28.8-74.3,78.9-74.3,135.9s29.9,107.5,74.8,136.2c15.3-17.6,48.4-28.3,87.1-28.3h1.3c38.1.2,70.5,11,85.3,28.1,44.8-28.7,74.6-79,74.6-136.1s-29.5-106.9-74-135.7c-14.6,17.5-47.3,28.5-85.8,28.8-40,.2-73.8-10.8-89-28.9m2.9-1.9c14.5,16.7,47.4,27.4,84.8,27.4h1.2c37.3-.2,68.8-10.6,82.9-27.2-24.6-15.2-53.6-24-84.6-24s-59.7,8.7-84.3,23.8" style="fill:#61b4ff; stroke-width:0px;"/><path d="m77.35,251.85c27.6,0,43.4-25.5,43.4-51,0-23-20.1-46.3-43.4-46.3s-43.5,23.3-43.5,46.3c0,25.5,15.9,51,43.5,51m22.9-35.4c0,5.4-.1,10.7-1.4,15.6-2.5,9.6-8.2,16.3-21.5,16.3s-19-6.7-21.5-16.3c-1.3-4.9-1.5-10.2-1.5-15.6v-30.4c0-5,.8-9.8,2.1-13.9,2.5-8.5,8.5-14.1,20.9-14.1s18,5.6,20.8,14.1c1.4,4.2,2.1,8.9,2.1,13.9,0,0,0,30.4,0,30.4Z" style="fill:#fff; fill-rule:evenodd; stroke-width:0px;"/><polygon points="177.55 160.15 191.35 160.15 191.35 156.65 145.95 156.65 145.95 160.15 159.75 160.15 159.75 246.25 145.95 246.25 145.95 249.75 191.35 249.75 191.35 246.25 177.55 246.25 177.55 160.15" style="fill:#fff; stroke-width:0px;"/><polygon points="309.35 160.15 323.15 160.15 323.15 156.65 287.95 156.65 267.75 220.35 248.15 156.65 212.25 156.65 212.25 160.15 226.05 160.15 226.05 246.25 212.25 246.25 212.25 249.75 244.05 249.75 244.05 246.25 230.45 246.25 230.45 162.45 230.75 162.45 258.55 249.75 263.25 249.75 291.15 162.45 291.55 162.45 291.55 246.25 277.75 246.25 277.75 249.75 323.15 249.75 323.15 246.25 309.35 246.25 309.35 160.15" style="fill:#fff; stroke-width:0px;"/><path d="m420.35,249.75l1.4-31.4h-4.3c-.6,16-6.8,27.9-24.5,27.9h-18.3v-86.2h14.5v-3.5h-46.1v3.5h13.8v86.2h-13.8v3.5h77.3,0Z" style="fill:#fff; stroke-width:0px;"/><path d="m225.95,365.35h-.2v-2h-.2v1.9c-51.3,0-90.7-40.8-105.5-109l3.4-.7c13,59.8,45.2,98,87.5,105.1-25.2-17-34.5-76.5-37.5-104.5l3.4-.4c7,64.8,24.5,104.1,47.1,106l.1-106.3h3.4l-.2,106.4c23.1-1.7,40.8-41.3,47.5-106.6l3.4.4c-5.8,56-19.2,92.8-37.8,105.2,42.4-7.1,74.6-45.5,87.6-105.8l3.4.7c-14.8,68.6-54.2,109.6-105.4,109.6m49.3-212.9c-6.4-68-24.6-110.8-47.9-112.9l-.1,112.7h-3.4l.1-112.8c-23.7,2-42.1,44.9-48.2,112.9l-3.4-.3c5.3-59,19.4-98.7,38.9-111.6-44.2,7.1-77,47.6-89.2,111.5l-3.4-.6c13.8-72.4,53.7-115.5,106.8-115.5h.2v.1c53.3.1,93.3,43.2,107,115.5l-3.4.6c-12.1-63.9-45-104.5-89.5-111.6,19.3,12.9,33.4,52.6,38.9,111.6l-3.4.4h0Z" style="fill:#61b4ff; stroke-width:0px;"/><path d="m484.15,84.85c-2.1-1.2-3.8-2.7-4.9-4.8-1.2-2-1.8-4.3-1.8-6.8s.6-4.8,1.8-6.8c1.2-2,2.8-3.6,4.9-4.8s4.5-1.7,7.1-1.7,4.9.6,7,1.7,3.7,2.7,4.9,4.8c1.2,2,1.8,4.3,1.8,6.8s-.6,4.8-1.8,6.8c-1.2,2-2.8,3.6-4.9,4.8-2.1,1.1-4.4,1.7-7,1.7s-5-.5-7.1-1.7m12.7-2.1c1.7-.9,3-2.2,3.9-3.9.9-1.7,1.4-3.5,1.4-5.6s-.5-3.9-1.4-5.6c-.9-1.7-2.3-3-3.9-3.9-1.7-.9-3.5-1.4-5.6-1.4s-3.9.5-5.6,1.4-3,2.2-4,3.9c-1,1.7-1.4,3.5-1.4,5.6s.5,3.9,1.4,5.6c1,1.7,2.3,3,4,3.9s3.6,1.4,5.6,1.4,3.9-.5,5.6-1.4" style="fill:#fff; stroke-width:0px;"/><path d="m515.95,67.55c1.2-.7,2.8-1,4.6-1v2.6h-.6c-2.1,0-3.7.6-4.9,1.9-1.2,1.3-1.8,3.1-1.8,5.3v10h-2.7v-19.6h2.5v3.9c.7-1.4,1.6-2.4,2.9-3.1" style="fill:#fff; stroke-width:0px;"/><path d="m543.35,66.75v17.2c0,3.3-.8,5.8-2.4,7.4-1.6,1.6-4.1,2.4-7.4,2.4-1.8,0-3.5-.3-5.2-.8-1.6-.5-3-1.3-4-2.2l1.3-2c.9.8,2.1,1.5,3.5,2s2.8.7,4.3.7c2.5,0,4.3-.6,5.5-1.7,1.2-1.2,1.8-3,1.8-5.4v-2.5c-.8,1.2-1.9,2.2-3.2,2.8-1.3.6-2.8,1-4.4,1-1.8,0-3.5-.4-5-1.2-1.5-.8-2.7-1.9-3.6-3.4s-1.3-3.1-1.3-5c0-1.8.4-3.5,1.3-4.9.9-1.4,2-2.6,3.5-3.4s3.2-1.2,5.1-1.2c1.7,0,3.2.3,4.5,1,1.3.7,2.4,1.6,3.3,2.9v-3.8h2.4v.1h0Zm-6.3,15.6c1.1-.6,2-1.5,2.7-2.6.6-1.1,1-2.3,1-3.7s-.3-2.6-1-3.7c-.6-1.1-1.5-1.9-2.7-2.5-1.1-.6-2.4-.9-3.9-.9-1.4,0-2.7.3-3.8.9s-2,1.4-2.7,2.5c-.6,1.1-1,2.3-1,3.7s.3,2.6,1,3.7c.6,1.1,1.5,2,2.7,2.6,1.1.6,2.4.9,3.8.9s2.8-.3,3.9-.9" style="fill:#fff; stroke-width:0px;"/><path d="m563.55,68.45c1.4,1.3,2.1,3.2,2.1,5.7v12.2h-2.5v-3.1c-.6,1-1.5,1.8-2.6,2.4-1.2.6-2.5.9-4.1.9-2.2,0-3.9-.5-5.2-1.6-1.3-1-1.9-2.4-1.9-4.2,0-1.7.6-3,1.8-4s3.1-1.5,5.8-1.5h6.2v-1.2c0-1.7-.5-3-1.4-3.9s-2.3-1.3-4.2-1.3c-1.2,0-2.4.2-3.6.6-1.1.4-2.1,1-3,1.7l-1.2-2c1-.8,2.2-1.5,3.6-2,1.4-.5,2.9-.7,4.4-.7,2.5.1,4.4.8,5.8,2m-3,15c1.1-.7,1.9-1.7,2.4-3v-3.2h-6.2c-3.4,0-5.1,1.2-5.1,3.5,0,1.1.4,2.1,1.3,2.7.9.7,2.1,1,3.7,1,1.5,0,2.8-.3,3.9-1" style="fill:#fff; stroke-width:0px;"/><path d="m588.75,68.75c1.5,1.4,2.2,3.5,2.2,6.3v11.4h-2.7v-11.2c0-2-.5-3.6-1.5-4.7s-2.5-1.6-4.4-1.6c-2.1,0-3.8.6-5,1.9s-1.9,3-1.9,5.2v10.3h-2.7v-19.6h2.5v3.6c.7-1.2,1.7-2.1,3-2.8,1.3-.7,2.8-1,4.5-1,2.6,0,4.5.7,6,2.2" style="fill:#fff; stroke-width:0px;"/><path d="m598.15,61.85c-.4-.4-.6-.8-.6-1.3s.2-.9.6-1.3c.4-.4.8-.6,1.4-.6.5,0,1,.2,1.4.5.4.4.6.8.6,1.3s-.2,1-.6,1.4c-.4.4-.8.6-1.4.6s-1.1-.2-1.4-.6m0,4.9h2.7v19.7h-2.7v-19.7Z" style="fill:#fff; stroke-width:0px;"/><path d="m608.85,85.85c-1.5-.5-2.6-1-3.4-1.7l1.2-2.1c.8.6,1.9,1.2,3.1,1.6,1.2.4,2.5.6,3.9.6,1.8,0,3.1-.3,4-.8.9-.6,1.3-1.4,1.3-2.4,0-.7-.2-1.3-.7-1.7s-1.1-.7-1.8-.9c-.7-.2-1.7-.4-2.9-.6-1.6-.3-2.9-.6-3.9-.9s-1.8-.8-2.5-1.6c-.7-.7-1-1.8-1-3.1,0-1.6.7-3,2.1-4,1.4-1,3.3-1.6,5.7-1.6,1.3,0,2.5.2,3.8.5,1.3.3,2.3.8,3.1,1.3l-1.2,2.1c-1.6-1.1-3.6-1.7-5.8-1.7-1.7,0-3,.3-3.8.9-.9.6-1.3,1.4-1.3,2.4,0,.7.2,1.3.7,1.8.5.4,1.1.8,1.8,1s1.7.4,3,.7c1.6.3,2.8.6,3.8.9.9.3,1.8.8,2.4,1.5.6.7,1,1.7,1,3,0,1.7-.7,3.1-2.1,4.1-1.4,1-3.4,1.5-6,1.5-1.5-.1-3-.3-4.5-.8" style="fill:#fff; stroke-width:0px;"/><path d="m639.25,68.45c1.4,1.3,2.1,3.2,2.1,5.7v12.2h-2.5v-3.1c-.6,1-1.5,1.8-2.6,2.4-1.2.6-2.5.9-4.1.9-2.2,0-3.9-.5-5.2-1.6-1.3-1-1.9-2.4-1.9-4.2,0-1.7.6-3,1.8-4s3.1-1.5,5.8-1.5h6.2v-1.2c0-1.7-.5-3-1.4-3.9s-2.3-1.3-4.2-1.3c-1.2,0-2.4.2-3.6.6-1.1.4-2.1,1-3,1.7l-1.2-2c1-.8,2.2-1.5,3.6-2,1.4-.5,2.9-.7,4.4-.7,2.5.1,4.5.8,5.8,2m-3,15c1.1-.7,1.9-1.7,2.4-3v-3.2h-6.2c-3.4,0-5.1,1.2-5.1,3.5,0,1.1.4,2.1,1.3,2.7.9.7,2.1,1,3.7,1s2.9-.3,3.9-1" style="fill:#fff; stroke-width:0px;"/><path d="m658.95,85.15c-.5.4-1.1.8-1.8,1s-1.5.4-2.3.4c-1.8,0-3.3-.5-4.3-1.5s-1.5-2.4-1.5-4.2v-11.9h-3.5v-2.2h3.5v-4.3h2.7v4.3h6v2.2h-6v11.7c0,1.2.3,2.1.9,2.7.6.6,1.4.9,2.5.9.5,0,1.1-.1,1.6-.3.5-.2,1-.4,1.3-.7l.9,1.9h0Z" style="fill:#fff; stroke-width:0px;"/><path d="m663.75,61.85c-.4-.4-.6-.8-.6-1.3s.2-.9.6-1.3c.4-.4.8-.6,1.4-.6.5,0,1,.2,1.4.5.4.4.6.8.6,1.3s-.2,1-.6,1.4c-.4.4-.8.6-1.4.6s-1.1-.2-1.4-.6m0,4.9h2.7v19.7h-2.7v-19.7Z" style="fill:#fff; stroke-width:0px;"/><path d="m676.75,85.25c-1.5-.9-2.7-2.1-3.6-3.6-.9-1.5-1.3-3.2-1.3-5.2s.4-3.6,1.3-5.2c.9-1.5,2.1-2.7,3.6-3.6,1.5-.8,3.2-1.3,5.1-1.3s3.6.4,5.1,1.3c1.5.8,2.7,2,3.6,3.6.9,1.5,1.3,3.2,1.3,5.2s-.4,3.6-1.3,5.2c-.9,1.5-2,2.7-3.6,3.6-1.5.9-3.2,1.3-5.1,1.3s-3.6-.4-5.1-1.3m8.9-2c1.1-.6,2-1.5,2.6-2.7.6-1.2.9-2.5.9-4s-.3-2.8-.9-4c-.6-1.2-1.5-2.1-2.6-2.7s-2.4-1-3.8-1-2.6.3-3.8,1c-1.1.6-2,1.5-2.6,2.7s-1,2.5-1,4,.3,2.8,1,4c.6,1.2,1.5,2.1,2.6,2.7s2.4,1,3.8,1,2.7-.4,3.8-1" style="fill:#fff; stroke-width:0px;"/><path d="m713.15,68.75c1.5,1.4,2.2,3.5,2.2,6.3v11.4h-2.7v-11.2c0-2-.5-3.6-1.5-4.7s-2.5-1.6-4.4-1.6c-2.1,0-3.8.6-5,1.9-1.2,1.3-1.9,3-1.9,5.2v10.3h-2.6v-19.6h2.5v3.6c.7-1.2,1.7-2.1,3-2.8,1.3-.7,2.8-1,4.5-1,2.5,0,4.5.7,5.9,2.2" style="fill:#fff; stroke-width:0px;"/><rect x="739.15" y="60.25" width="2.8" height="26.2" style="fill:#fff; stroke-width:0px;"/><path d="m765.75,68.75c1.5,1.4,2.2,3.5,2.2,6.3v11.4h-2.7v-11.2c0-2-.5-3.6-1.5-4.7s-2.5-1.6-4.4-1.6c-2.1,0-3.8.6-5,1.9s-1.9,3-1.9,5.2v10.3h-2.7v-19.6h2.5v3.6c.7-1.2,1.7-2.1,3-2.8,1.3-.7,2.8-1,4.5-1,2.6,0,4.6.7,6,2.2" style="fill:#fff; stroke-width:0px;"/><path d="m785.55,85.15c-.5.4-1.1.8-1.8,1s-1.5.4-2.3.4c-1.8,0-3.3-.5-4.3-1.5s-1.5-2.4-1.5-4.2v-11.9h-3.5v-2.2h3.5v-4.3h2.7v4.3h6v2.2h-6v11.7c0,1.2.3,2.1.9,2.7.6.6,1.4.9,2.5.9.5,0,1.1-.1,1.6-.3.5-.2,1-.4,1.3-.7l.9,1.9h0Z" style="fill:#fff; stroke-width:0px;"/><path d="m806.75,77.35h-16.5c.1,2,.9,3.7,2.4,5,1.4,1.3,3.2,1.9,5.4,1.9,1.2,0,2.3-.2,3.4-.7,1-.4,1.9-1.1,2.7-1.9l1.5,1.7c-.9,1-2,1.8-3.3,2.4-1.3.5-2.8.8-4.3.8-2,0-3.8-.4-5.4-1.3-1.6-.9-2.8-2.1-3.6-3.6-.9-1.5-1.3-3.2-1.3-5.2s.4-3.6,1.3-5.2c.8-1.5,2-2.7,3.4-3.6,1.5-.8,3.1-1.3,4.9-1.3s3.5.4,4.9,1.3c1.4.8,2.6,2,3.4,3.5.8,1.5,1.2,3.2,1.2,5.2l-.1,1h0Zm-14.2-6.7c-1.3,1.2-2,2.8-2.2,4.7h14c-.2-1.9-.9-3.5-2.2-4.7s-2.9-1.8-4.8-1.8c-2,0-3.6.6-4.8,1.8" style="fill:#fff; stroke-width:0px;"/><path d="m817.55,67.55c1.2-.7,2.8-1,4.6-1v2.6h-.6c-2.1,0-3.7.6-4.9,1.9s-1.8,3.1-1.8,5.3v10h-2.6v-19.6h2.5v3.9c.7-1.4,1.6-2.4,2.8-3.1" style="fill:#fff; stroke-width:0px;"/><path d="m842.85,68.75c1.5,1.4,2.2,3.5,2.2,6.3v11.4h-2.7v-11.2c0-2-.5-3.6-1.5-4.7s-2.5-1.6-4.4-1.6c-2.1,0-3.8.6-5,1.9s-1.9,3-1.9,5.2v10.3h-2.7v-19.6h2.5v3.6c.7-1.2,1.7-2.1,3-2.8,1.3-.7,2.8-1,4.5-1,2.6,0,4.6.7,6,2.2" style="fill:#fff; stroke-width:0px;"/><path d="m865.05,68.45c1.4,1.3,2.1,3.2,2.1,5.7v12.2h-2.5v-3.1c-.6,1-1.5,1.8-2.6,2.4-1.2.6-2.5.9-4.1.9-2.2,0-3.9-.5-5.2-1.6-1.3-1-1.9-2.4-1.9-4.2,0-1.7.6-3,1.8-4s3.1-1.5,5.8-1.5h6.2v-1.2c0-1.7-.5-3-1.4-3.9s-2.3-1.3-4.2-1.3c-1.2,0-2.4.2-3.6.6-1.1.4-2.1,1-3,1.7l-1.2-2c1-.8,2.2-1.5,3.6-2,1.4-.5,2.9-.7,4.4-.7,2.5.1,4.4.8,5.8,2m-3,15c1.1-.7,1.9-1.7,2.4-3v-3.2h-6.2c-3.4,0-5.1,1.2-5.1,3.5,0,1.1.4,2.1,1.3,2.7.9.7,2.1,1,3.7,1s2.8-.3,3.9-1" style="fill:#fff; stroke-width:0px;"/><path d="m884.65,85.15c-.5.4-1.1.8-1.8,1s-1.5.4-2.3.4c-1.8,0-3.3-.5-4.3-1.5s-1.5-2.4-1.5-4.2v-11.9h-3.5v-2.2h3.5v-4.3h2.7v4.3h6v2.2h-6v11.7c0,1.2.3,2.1.9,2.7.6.6,1.4.9,2.5.9.5,0,1.1-.1,1.6-.3.5-.2,1-.4,1.3-.7l.9,1.9h0Z" style="fill:#fff; stroke-width:0px;"/><path d="m889.45,61.85c-.4-.4-.6-.8-.6-1.3s.2-.9.6-1.3c.4-.4.8-.6,1.4-.6.5,0,1,.2,1.4.5.4.4.6.8.6,1.3s-.2,1-.6,1.4c-.4.4-.8.6-1.4.6-.5,0-1-.2-1.4-.6m.1,4.9h2.7v19.7h-2.7v-19.7Z" style="fill:#fff; stroke-width:0px;"/><path d="m902.55,85.25c-1.5-.9-2.7-2.1-3.6-3.6-.9-1.5-1.3-3.2-1.3-5.2s.4-3.6,1.3-5.2c.9-1.5,2.1-2.7,3.6-3.6,1.5-.8,3.2-1.3,5.1-1.3s3.6.4,5.1,1.3c1.5.8,2.7,2,3.6,3.6.9,1.5,1.3,3.2,1.3,5.2s-.4,3.6-1.3,5.2c-.9,1.5-2,2.7-3.6,3.6-1.5.9-3.2,1.3-5.1,1.3s-3.6-.4-5.1-1.3m8.8-2c1.1-.6,2-1.5,2.6-2.7s.9-2.5.9-4-.3-2.8-.9-4c-.6-1.2-1.5-2.1-2.6-2.7s-2.4-1-3.8-1-2.6.3-3.8,1c-1.1.6-2,1.5-2.6,2.7-.6,1.2-1,2.5-1,4s.3,2.8,1,4c.6,1.2,1.5,2.1,2.6,2.7s2.4,1,3.8,1c1.5,0,2.7-.4,3.8-1" style="fill:#fff; stroke-width:0px;"/><path d="m938.95,68.75c1.5,1.4,2.2,3.5,2.2,6.3v11.4h-2.7v-11.2c0-2-.5-3.6-1.5-4.7s-2.5-1.6-4.4-1.6c-2.1,0-3.8.6-5,1.9s-1.9,3-1.9,5.2v10.3h-2.7v-19.6h2.5v3.6c.7-1.2,1.7-2.1,3-2.8,1.3-.7,2.8-1,4.5-1,2.6,0,4.5.7,6,2.2" style="fill:#fff; stroke-width:0px;"/><path d="m961.15,68.45c1.4,1.3,2.1,3.2,2.1,5.7v12.2h-2.5v-3.1c-.6,1-1.5,1.8-2.6,2.4-1.2.6-2.5.9-4.1.9-2.2,0-3.9-.5-5.2-1.6-1.3-1-1.9-2.4-1.9-4.2,0-1.7.6-3,1.8-4s3.1-1.5,5.8-1.5h6.2v-1.2c0-1.7-.5-3-1.4-3.9s-2.3-1.3-4.2-1.3c-1.2,0-2.4.2-3.6.6-1.1.4-2.1,1-3,1.7l-1.2-2c1-.8,2.2-1.5,3.6-2,1.4-.5,2.9-.7,4.4-.7,2.5.1,4.4.8,5.8,2m-3,15c1.1-.7,1.9-1.7,2.4-3v-3.2h-6.2c-3.4,0-5.1,1.2-5.1,3.5,0,1.1.4,2.1,1.3,2.7.9.7,2.1,1,3.7,1s2.8-.3,3.9-1" style="fill:#fff; stroke-width:0px;"/><rect x="970.45" y="58.65" width="2.7" height="27.8" style="fill:#fff; stroke-width:0px;"/><path d="m997.65,77.35h-16.5c.1,2,.9,3.7,2.4,5,1.4,1.3,3.2,1.9,5.4,1.9,1.2,0,2.3-.2,3.4-.7,1-.4,1.9-1.1,2.7-1.9l1.5,1.7c-.9,1-2,1.8-3.3,2.4-1.3.5-2.8.8-4.3.8-2,0-3.8-.4-5.4-1.3-1.6-.9-2.8-2.1-3.6-3.6-.9-1.5-1.3-3.2-1.3-5.2s.4-3.6,1.3-5.2c.8-1.5,2-2.7,3.4-3.6,1.5-.8,3.1-1.3,4.9-1.3s3.5.4,4.9,1.3c1.4.8,2.6,2,3.4,3.5.8,1.5,1.2,3.2,1.2,5.2l-.1,1h0Zm-14.3-6.7c-1.3,1.2-2,2.8-2.2,4.7h14c-.2-1.9-.9-3.5-2.2-4.7-1.3-1.2-2.9-1.8-4.8-1.8s-3.5.6-4.8,1.8" style="fill:#fff; stroke-width:0px;"/><path d="m1037.05,58.65v27.8h-2.5v-3.9c-.8,1.3-1.9,2.3-3.2,3-1.3.7-2.8,1-4.4,1-1.8,0-3.5-.4-5-1.3-1.5-.8-2.7-2-3.5-3.6-.8-1.5-1.3-3.3-1.3-5.2s.4-3.7,1.3-5.2c.8-1.5,2-2.7,3.5-3.5s3.2-1.3,5-1.3c1.6,0,3,.3,4.3,1s2.3,1.6,3.2,2.9v-11.7h2.6Zm-6.2,24.6c1.1-.6,2-1.5,2.6-2.7s1-2.5,1-4-.3-2.8-1-4c-.6-1.2-1.5-2.1-2.6-2.7s-2.4-1-3.7-1c-1.4,0-2.6.3-3.8,1-1.1.6-2,1.5-2.6,2.7-.6,1.2-1,2.5-1,4s.3,2.8,1,4c.6,1.2,1.5,2.1,2.6,2.7s2.4,1,3.8,1c1.3,0,2.6-.4,3.7-1" style="fill:#fff; stroke-width:0px;"/><path d="m1061.55,77.35h-16.5c.1,2,.9,3.7,2.4,5,1.4,1.3,3.2,1.9,5.4,1.9,1.2,0,2.3-.2,3.4-.7,1-.4,1.9-1.1,2.7-1.9l1.5,1.7c-.9,1-2,1.8-3.3,2.4-1.3.5-2.8.8-4.3.8-2,0-3.8-.4-5.4-1.3s-2.8-2.1-3.6-3.6c-.9-1.5-1.3-3.2-1.3-5.2s.4-3.6,1.3-5.2c.8-1.5,2-2.7,3.4-3.6s3.1-1.3,4.9-1.3,3.5.4,4.9,1.3c1.4.8,2.6,2,3.4,3.5.8,1.5,1.2,3.2,1.2,5.2,0,0-.1,1-.1,1Zm-14.3-6.7c-1.3,1.2-2,2.8-2.2,4.7h14c-.2-1.9-.9-3.5-2.2-4.7-1.3-1.2-2.9-1.8-4.8-1.8s-3.5.6-4.8,1.8" style="fill:#fff; stroke-width:0px;"/><polygon points="521.65 157.65 521.55 130.75 508.35 152.95 503.65 152.95 490.55 131.35 490.55 157.75 480.85 157.75 480.85 112.85 489.45 112.85 506.25 140.75 522.75 112.85 531.25 112.85 531.35 157.75 521.65 157.75 521.65 157.65" style="fill:#fff; stroke-width:0px;"/><path d="m573.95,143.25h-26.1c.5,2.1,1.6,3.8,3.3,5.1,1.8,1.2,3.9,1.9,6.5,1.9,1.8,0,3.4-.3,4.8-.8,1.4-.5,2.7-1.4,3.9-2.5l5.3,5.8c-3.2,3.7-8,5.6-14.2,5.6-3.9,0-7.3-.8-10.3-2.3s-5.3-3.6-6.9-6.3c-1.6-2.7-2.4-5.7-2.4-9.2s.8-6.4,2.4-9.1c1.6-2.7,3.8-4.8,6.6-6.3s5.9-2.3,9.4-2.3,6.4.7,9.2,2.2c2.7,1.5,4.9,3.5,6.4,6.3,1.6,2.7,2.3,5.9,2.3,9.5,0-.2,0,.7-.2,2.4m-23.4-11.1c-1.5,1.3-2.5,3-2.8,5.3h17c-.3-2.2-1.3-3.9-2.8-5.2s-3.4-2-5.6-2c-2.3-.1-4.2.6-5.8,1.9m8.3-22.7h10.8l-11.6,9.2h-7.8l8.6-9.2Z" style="fill:#fff; stroke-width:0px;"/><path d="m602.15,155.95c-1,.7-2.2,1.3-3.6,1.6-1.4.3-2.9.5-4.5.5-4.1,0-7.3-1-9.5-3.1s-3.4-5.2-3.4-9.2v-14.2h-5.3v-7.6h5.3v-8.4h10v8.4h8.6v7.7h-8.6v14c0,1.5.4,2.6,1.1,3.4.7.8,1.8,1.2,3.2,1.2,1.6,0,2.9-.4,4-1.3l2.7,7Z" style="fill:#fff; stroke-width:0px;"/><path d="m621.25,123.95c2-.9,4.4-1.3,7-1.3v9.2c-1.1-.1-1.9-.1-2.2-.1-2.9,0-5.1.8-6.7,2.4-1.6,1.6-2.4,4-2.4,7.2v16.3h-10v-34.5h9.6v4.6c1-1.7,2.6-3,4.7-3.8" style="fill:#fff; stroke-width:0px;"/><path d="m639.55,155.85c-2.9-1.5-5.1-3.6-6.8-6.3-1.6-2.7-2.4-5.7-2.4-9.2s.8-6.5,2.4-9.2c1.6-2.7,3.9-4.8,6.8-6.3,2.9-1.5,6.1-2.3,9.8-2.3s6.9.8,9.7,2.3c2.9,1.5,5.1,3.6,6.7,6.3,1.6,2.7,2.4,5.8,2.4,9.2s-.8,6.5-2.4,9.2c-1.6,2.7-3.9,4.8-6.7,6.3-2.9,1.5-6.1,2.3-9.7,2.3s-6.9-.8-9.8-2.3m16.1-8.5c1.6-1.7,2.5-4.1,2.5-7s-.8-5.2-2.5-7c-1.6-1.7-3.7-2.6-6.3-2.6s-4.7.9-6.3,2.6c-1.7,1.7-2.5,4.1-2.5,7s.8,5.2,2.5,7,3.8,2.6,6.3,2.6,4.7-.9,6.3-2.6" style="fill:#fff; stroke-width:0px;"/><rect x="673.95" y="110.05" width="10" height="47.6" style="fill:#fff; stroke-width:0px;"/><path d="m698.95,155.85c-2.9-1.5-5.1-3.6-6.8-6.3-1.6-2.7-2.4-5.7-2.4-9.2s.8-6.5,2.4-9.2c1.6-2.7,3.9-4.8,6.8-6.3,2.9-1.5,6.1-2.3,9.8-2.3s6.9.8,9.7,2.3c2.9,1.5,5.1,3.6,6.7,6.3,1.6,2.7,2.4,5.8,2.4,9.2s-.8,6.5-2.4,9.2c-1.6,2.7-3.9,4.8-6.7,6.3-2.9,1.5-6.1,2.3-9.7,2.3s-6.9-.8-9.8-2.3m16.1-8.5c1.6-1.7,2.5-4.1,2.5-7s-.8-5.2-2.5-7c-1.6-1.7-3.7-2.6-6.3-2.6s-4.7.9-6.3,2.6c-1.7,1.7-2.5,4.1-2.5,7s.8,5.2,2.5,7c1.7,1.7,3.8,2.6,6.3,2.6s4.6-.9,6.3-2.6" style="fill:#fff; stroke-width:0px;"/><path d="m768.95,123.15v28.7c0,6.3-1.6,11-4.9,14.1-3.3,3.1-8.1,4.6-14.4,4.6-3.3,0-6.5-.4-9.5-1.2s-5.5-2-7.4-3.5l4-7.2c1.5,1.2,3.3,2.1,5.5,2.9,2.2.7,4.4,1.1,6.7,1.1,3.5,0,6-.8,7.7-2.3,1.6-1.6,2.5-3.9,2.5-7.1v-1.5c-2.6,2.9-6.2,4.3-10.9,4.3-3.2,0-6.1-.7-8.7-2.1-2.6-1.4-4.7-3.3-6.3-5.9-1.5-2.5-2.3-5.4-2.3-8.7s.8-6.2,2.3-8.7,3.6-4.5,6.3-5.9c2.6-1.4,5.5-2.1,8.7-2.1,5,0,8.8,1.6,11.4,4.9v-4.4h9.3Zm-12.4,22.3c1.7-1.6,2.5-3.6,2.5-6.1s-.8-4.6-2.5-6.1c-1.7-1.6-3.9-2.3-6.5-2.3s-4.8.8-6.5,2.3c-1.7,1.6-2.6,3.6-2.6,6.1s.9,4.6,2.6,6.1c1.7,1.6,3.9,2.3,6.5,2.3s4.8-.8,6.5-2.3" style="fill:#fff; stroke-width:0px;"/><path d="m777.75,116.75c-1.2-1.1-1.7-2.4-1.7-4s.6-2.9,1.7-4c1.2-1.1,2.7-1.6,4.5-1.6s3.3.5,4.5,1.5,1.7,2.3,1.7,3.8c0,1.7-.6,3-1.7,4.1-1.2,1.1-2.6,1.6-4.5,1.6s-3.3-.4-4.5-1.4m-.5,6.4h10v34.5h-10v-34.5Z" style="fill:#fff; stroke-width:0px;"/><path d="m829.25,143.25h-26.1c.5,2.1,1.6,3.8,3.3,5.1,1.8,1.2,3.9,1.9,6.5,1.9,1.8,0,3.4-.3,4.8-.8,1.4-.5,2.7-1.4,3.9-2.5l5.3,5.8c-3.2,3.7-8,5.6-14.2,5.6-3.9,0-7.3-.8-10.3-2.3s-5.3-3.6-6.9-6.3c-1.6-2.7-2.4-5.7-2.4-9.2s.8-6.4,2.4-9.1c1.6-2.7,3.8-4.8,6.6-6.3s5.9-2.3,9.4-2.3,6.4.7,9.2,2.2c2.7,1.5,4.9,3.5,6.4,6.3,1.6,2.7,2.3,5.9,2.3,9.5,0-.2-.1.7-.2,2.4m-23.4-11.1c-1.5,1.3-2.5,3-2.8,5.3h17c-.3-2.2-1.3-3.9-2.8-5.2s-3.4-2-5.6-2c-2.4-.1-4.3.6-5.8,1.9" style="fill:#fff; stroke-width:0px;"/><polygon points="850.25 112.75 860.65 112.75 860.65 149.15 883.15 149.15 883.15 157.65 850.25 157.65 850.25 112.75" style="fill:#fff; stroke-width:0px;"/><path d="m920.65,143.25h-26.1c.5,2.1,1.6,3.8,3.3,5.1,1.8,1.2,3.9,1.9,6.5,1.9,1.8,0,3.4-.3,4.8-.8,1.4-.5,2.7-1.4,3.9-2.5l5.3,5.8c-3.2,3.7-8,5.6-14.2,5.6-3.9,0-7.3-.8-10.3-2.3s-5.3-3.6-6.9-6.3c-1.6-2.7-2.4-5.7-2.4-9.2s.8-6.4,2.4-9.1c1.6-2.7,3.8-4.8,6.6-6.3s5.9-2.3,9.4-2.3,6.4.7,9.2,2.2c2.7,1.5,4.9,3.5,6.4,6.3,1.6,2.7,2.3,5.9,2.3,9.5,0-.2,0,.7-.2,2.4m-23.4-11.1c-1.5,1.3-2.5,3-2.8,5.3h17c-.3-2.2-1.3-3.9-2.8-5.2s-3.4-2-5.6-2c-2.3-.1-4.2.6-5.8,1.9m8.3-22.7h10.8l-11.6,9.2h-7.8l8.6-9.2Z" style="fill:#fff; stroke-width:0px;"/><path d="m962.15,123.15v28.7c0,6.3-1.6,11-4.9,14.1-3.3,3.1-8.1,4.6-14.4,4.6-3.3,0-6.5-.4-9.5-1.2s-5.5-2-7.4-3.5l4-7.2c1.5,1.2,3.3,2.1,5.5,2.9,2.2.7,4.4,1.1,6.7,1.1,3.5,0,6-.8,7.7-2.3,1.6-1.6,2.5-3.9,2.5-7.1v-1.5c-2.6,2.9-6.2,4.3-10.9,4.3-3.2,0-6.1-.7-8.7-2.1-2.6-1.4-4.7-3.3-6.3-5.9-1.5-2.5-2.3-5.4-2.3-8.7s.8-6.2,2.3-8.7,3.6-4.5,6.3-5.9c2.6-1.4,5.5-2.1,8.7-2.1,5,0,8.8,1.6,11.4,4.9v-4.4h9.3Zm-12.4,22.3c1.7-1.6,2.5-3.6,2.5-6.1s-.8-4.6-2.5-6.1c-1.7-1.6-3.9-2.3-6.5-2.3s-4.8.8-6.5,2.3c-1.7,1.6-2.6,3.6-2.6,6.1s.9,4.6,2.6,6.1c1.7,1.6,3.9,2.3,6.5,2.3s4.8-.8,6.5-2.3" style="fill:#fff; stroke-width:0px;"/><path d="m996.75,126.45c2.9,2.5,4.3,6.4,4.3,11.5v19.7h-9.4v-4.3c-1.9,3.2-5.4,4.8-10.5,4.8-2.6,0-4.9-.4-6.9-1.3-1.9-.9-3.4-2.1-4.5-3.7-1-1.6-1.5-3.4-1.5-5.4,0-3.2,1.2-5.7,3.6-7.6,2.4-1.8,6.1-2.8,11.2-2.8h7.9c0-2.2-.7-3.9-2-5-1.3-1.2-3.3-1.8-6-1.8-1.8,0-3.6.3-5.4.9s-3.3,1.4-4.5,2.3l-3.6-7c1.9-1.3,4.1-2.3,6.8-3.1,2.6-.7,5.3-1.1,8.1-1.1,5.4.1,9.5,1.3,12.4,3.9m-8.5,23.8c1.3-.8,2.3-2,2.8-3.5v-3.5h-6.9c-4.1,0-6.2,1.3-6.2,4,0,1.3.5,2.3,1.5,3s2.4,1.1,4.1,1.1c1.8.1,3.3-.3,4.7-1.1" style="fill:#fff; stroke-width:0px;"/><rect x="1009.15" y="110.05" width="10" height="47.6" style="fill:#fff; stroke-width:0px;"/><path d="m1061.05,143.25h-26.1c.5,2.1,1.6,3.8,3.3,5.1,1.8,1.2,3.9,1.9,6.5,1.9,1.8,0,3.4-.3,4.8-.8s2.7-1.4,3.9-2.5l5.3,5.8c-3.2,3.7-8,5.6-14.2,5.6-3.9,0-7.3-.8-10.3-2.3s-5.3-3.6-6.9-6.3c-1.6-2.7-2.4-5.7-2.4-9.2s.8-6.4,2.4-9.1c1.6-2.7,3.8-4.8,6.6-6.3,2.8-1.5,5.9-2.3,9.4-2.3s6.4.7,9.2,2.2c2.7,1.5,4.9,3.5,6.4,6.3,1.6,2.7,2.3,5.9,2.3,9.5,0-.2-.1.7-.2,2.4m-23.4-11.1c-1.5,1.3-2.5,3-2.8,5.3h17c-.3-2.2-1.3-3.9-2.8-5.2s-3.4-2-5.6-2c-2.3-.1-4.2.6-5.8,1.9" style="fill:#fff; stroke-width:0px;"/><rect x="475.45" y="195.25" width="587.8" height="3.1" style="fill:#61b4ff; stroke-width:0px;"/><rect x="479.75" y="227.55" width="2.8" height="26.2" style="fill:#fff; stroke-width:0px;"/><path d="m507.55,236.05c1.5,1.4,2.2,3.5,2.2,6.3v11.4h-2.7v-11.1c0-2-.5-3.6-1.5-4.7-1-1.1-2.5-1.6-4.4-1.6-2.1,0-3.8.6-5,1.9-1.2,1.3-1.9,3-1.9,5.2v10.3h-2.7v-19.7h2.5v3.6c.7-1.2,1.7-2.1,3-2.8s2.8-1,4.5-1c2.6.1,4.5.8,6,2.2" style="fill:#fff; stroke-width:0px;"/><path d="m528.45,252.55c-.5.4-1.1.8-1.8,1s-1.5.4-2.3.4c-1.8,0-3.3-.5-4.3-1.5s-1.5-2.4-1.5-4.2v-11.9h-3.5v-2.2h3.5v-4.3h2.7v4.3h6v2.2h-6v11.7c0,1.2.3,2.1.9,2.7.6.6,1.4.9,2.5.9.5,0,1.1-.1,1.6-.3s1-.4,1.3-.7l.9,1.9h0Z" style="fill:#fff; stroke-width:0px;"/><path d="m550.75,244.75h-16.5c.1,2,.9,3.7,2.4,5,1.4,1.3,3.2,1.9,5.4,1.9,1.2,0,2.3-.2,3.4-.7,1-.4,1.9-1.1,2.7-1.9l1.5,1.7c-.9,1-2,1.8-3.3,2.4-1.3.5-2.8.8-4.3.8-2,0-3.8-.4-5.4-1.3-1.6-.9-2.8-2.1-3.6-3.6-.9-1.5-1.3-3.2-1.3-5.2s.4-3.6,1.3-5.2c.8-1.5,2-2.7,3.4-3.6,1.5-.8,3.1-1.3,4.9-1.3s3.5.4,4.9,1.3c1.4.8,2.6,2,3.4,3.5.8,1.5,1.2,3.2,1.2,5.2l-.1,1h0Zm-14.2-6.7c-1.3,1.2-2,2.8-2.2,4.7h14c-.2-1.9-.9-3.5-2.2-4.7s-2.9-1.8-4.8-1.8c-2-.1-3.6.6-4.8,1.8" style="fill:#fff; stroke-width:0px;"/><path d="m562.65,234.95c1.2-.7,2.8-1,4.6-1v2.6h-.6c-2.1,0-3.7.6-4.9,1.9-1.2,1.3-1.8,3.1-1.8,5.3v10h-2.7v-19.7h2.5v3.9c.8-1.4,1.7-2.3,2.9-3" style="fill:#fff; stroke-width:0px;"/><path d="m589.15,236.05c1.5,1.4,2.2,3.5,2.2,6.3v11.4h-2.7v-11.1c0-2-.5-3.6-1.5-4.7-1-1.1-2.5-1.6-4.4-1.6-2.1,0-3.8.6-5,1.9-1.2,1.3-1.9,3-1.9,5.2v10.3h-2.7v-19.7h2.5v3.6c.7-1.2,1.7-2.1,3-2.8s2.8-1,4.5-1c2.5.1,4.5.8,6,2.2" style="fill:#fff; stroke-width:0px;"/><path d="m612.45,235.85c1.4,1.3,2.1,3.2,2.1,5.7v12.2h-2.5v-3.1c-.6,1-1.5,1.8-2.6,2.4-1.2.6-2.5.9-4.1.9-2.2,0-3.9-.5-5.2-1.6-1.3-1-1.9-2.4-1.9-4.2,0-1.7.6-3,1.8-4s3.1-1.5,5.8-1.5h6.2v-1.2c0-1.7-.5-3-1.4-3.9s-2.3-1.3-4.2-1.3c-1.2,0-2.4.2-3.6.6-1.1.4-2.1,1-3,1.7l-1.2-2c1-.8,2.2-1.5,3.6-2,1.4-.5,2.9-.7,4.4-.7,2.4.1,4.4.7,5.8,2m-3,15c1.1-.7,1.9-1.7,2.4-3v-3.2h-6.2c-3.4,0-5.1,1.2-5.1,3.5,0,1.1.4,2.1,1.3,2.7.9.7,2.1,1,3.7,1,1.5,0,2.8-.4,3.9-1" style="fill:#fff; stroke-width:0px;"/><path d="m633.15,252.55c-.5.4-1.1.8-1.8,1s-1.5.4-2.3.4c-1.8,0-3.3-.5-4.3-1.5s-1.5-2.4-1.5-4.2v-11.9h-3.5v-2.2h3.5v-4.3h2.7v4.3h6v2.2h-6v11.7c0,1.2.3,2.1.9,2.7.6.6,1.4.9,2.5.9.5,0,1.1-.1,1.6-.3s1-.4,1.3-.7l.9,1.9h0Z" style="fill:#fff; stroke-width:0px;"/><path d="m639.15,229.25c-.4-.4-.6-.8-.6-1.3s.2-.9.6-1.3c.4-.4.8-.6,1.4-.6.5,0,1,.2,1.4.5.4.4.6.8.6,1.3s-.2,1-.6,1.4c-.4.4-.8.6-1.4.6-.6-.1-1.1-.3-1.4-.6m0,4.8h2.7v19.7h-2.7v-19.7Z" style="fill:#fff; stroke-width:0px;"/><path d="m653.25,252.65c-1.5-.9-2.7-2.1-3.6-3.6-.9-1.5-1.3-3.2-1.3-5.2s.4-3.6,1.3-5.2c.9-1.5,2.1-2.7,3.6-3.6,1.5-.8,3.2-1.3,5.1-1.3s3.6.4,5.1,1.3c1.5.8,2.7,2,3.6,3.6.9,1.5,1.3,3.2,1.3,5.2s-.4,3.6-1.3,5.2c-.9,1.5-2,2.7-3.6,3.6-1.5.9-3.2,1.3-5.1,1.3s-3.6-.5-5.1-1.3m8.9-2c1.1-.6,2-1.5,2.6-2.7.6-1.2.9-2.5.9-4s-.3-2.8-.9-4c-.6-1.2-1.5-2.1-2.6-2.7-1.1-.6-2.4-1-3.8-1s-2.6.3-3.8,1c-1.1.6-2,1.5-2.6,2.7s-1,2.5-1,4,.3,2.8,1,4c.6,1.2,1.5,2.1,2.6,2.7,1.1.6,2.4,1,3.8,1,1.4-.1,2.7-.4,3.8-1" style="fill:#fff; stroke-width:0px;"/><path d="m690.85,236.05c1.5,1.4,2.2,3.5,2.2,6.3v11.4h-2.7v-11.1c0-2-.5-3.6-1.5-4.7-1-1.1-2.5-1.6-4.4-1.6-2.1,0-3.8.6-5,1.9-1.2,1.3-1.9,3-1.9,5.2v10.3h-2.7v-19.7h2.5v3.6c.7-1.2,1.7-2.1,3-2.8s2.8-1,4.5-1c2.5.1,4.5.8,6,2.2" style="fill:#fff; stroke-width:0px;"/><path d="m714.15,235.85c1.4,1.3,2.1,3.2,2.1,5.7v12.2h-2.5v-3.1c-.6,1-1.5,1.8-2.6,2.4-1.2.6-2.5.9-4.1.9-2.2,0-3.9-.5-5.2-1.6-1.3-1-1.9-2.4-1.9-4.2,0-1.7.6-3,1.8-4s3.1-1.5,5.8-1.5h6.2v-1.2c0-1.7-.5-3-1.4-3.9s-2.3-1.3-4.2-1.3c-1.2,0-2.4.2-3.6.6-1.1.4-2.1,1-3,1.7l-1.2-2c1-.8,2.2-1.5,3.6-2,1.4-.5,2.9-.7,4.4-.7,2.4.1,4.4.7,5.8,2m-3,15c1.1-.7,1.9-1.7,2.4-3v-3.2h-6.2c-3.4,0-5.1,1.2-5.1,3.5,0,1.1.4,2.1,1.3,2.7.9.7,2.1,1,3.7,1,1.5,0,2.8-.4,3.9-1" style="fill:#fff; stroke-width:0px;"/><rect x="724.55" y="225.95" width="2.7" height="27.8" style="fill:#fff; stroke-width:0px;"/><path d="m758.85,252.25c-2.1-1.2-3.8-2.7-4.9-4.8-1.2-2-1.8-4.3-1.8-6.8s.6-4.8,1.8-6.8,2.8-3.6,4.9-4.8c2.1-1.2,4.5-1.7,7.1-1.7s4.9.6,7,1.7c2.1,1.1,3.7,2.7,4.9,4.8,1.2,2,1.8,4.3,1.8,6.8s-.6,4.8-1.8,6.8-2.8,3.6-4.9,4.8c-2.1,1.2-4.4,1.7-7,1.7s-5-.6-7.1-1.7m12.7-2.2c1.7-.9,3-2.2,3.9-3.9.9-1.7,1.4-3.5,1.4-5.6s-.5-3.9-1.4-5.6c-.9-1.7-2.3-3-3.9-3.9-1.7-.9-3.5-1.4-5.6-1.4s-3.9.5-5.6,1.4-3,2.2-4,3.9-1.4,3.5-1.4,5.6.5,3.9,1.4,5.6c1,1.7,2.3,3,4,3.9s3.6,1.4,5.6,1.4,3.9-.4,5.6-1.4" style="fill:#fff; stroke-width:0px;"/><path d="m791.75,234.95c1.2-.7,2.8-1,4.6-1v2.6h-.6c-2.1,0-3.7.6-4.9,1.9-1.2,1.3-1.8,3.1-1.8,5.3v10h-2.7v-19.7h2.5v3.9c.7-1.4,1.6-2.3,2.9-3" style="fill:#fff; stroke-width:0px;"/><path d="m820.25,234.05v17.3c0,3.3-.8,5.8-2.4,7.4-1.6,1.6-4.1,2.4-7.4,2.4-1.8,0-3.5-.3-5.2-.8-1.6-.5-3-1.3-4-2.2l1.3-2c.9.8,2.1,1.5,3.5,2s2.8.7,4.3.7c2.5,0,4.3-.6,5.5-1.7,1.2-1.2,1.8-3,1.8-5.4v-2.5c-.8,1.2-1.9,2.2-3.2,2.8s-2.8,1-4.4,1c-1.8,0-3.5-.4-5-1.2s-2.7-1.9-3.6-3.4c-.9-1.5-1.3-3.1-1.3-5s.4-3.5,1.3-4.9c.9-1.4,2-2.6,3.5-3.4,1.5-.8,3.2-1.2,5.1-1.2,1.7,0,3.2.3,4.5,1s2.4,1.6,3.3,2.9v-3.8h2.4Zm-6.2,15.7c1.1-.6,2-1.5,2.7-2.6.6-1.1,1-2.3,1-3.7s-.3-2.6-1-3.7c-.6-1.1-1.5-1.9-2.7-2.5-1.1-.6-2.4-.9-3.9-.9-1.4,0-2.7.3-3.8.9-1.1.6-2,1.4-2.7,2.5-.6,1.1-1,2.3-1,3.7s.3,2.6,1,3.7c.6,1.1,1.5,2,2.7,2.6,1.1.6,2.4.9,3.8.9s2.7-.3,3.9-.9" style="fill:#fff; stroke-width:0px;"/><path d="m841.65,235.85c1.4,1.3,2.1,3.2,2.1,5.7v12.2h-2.5v-3.1c-.6,1-1.5,1.8-2.6,2.4-1.2.6-2.5.9-4.1.9-2.2,0-3.9-.5-5.2-1.6-1.3-1-1.9-2.4-1.9-4.2,0-1.7.6-3,1.8-4s3.1-1.5,5.8-1.5h6.2v-1.2c0-1.7-.5-3-1.4-3.9s-2.3-1.3-4.2-1.3c-1.2,0-2.4.2-3.6.6-1.1.4-2.1,1-3,1.7l-1.2-2c1-.8,2.2-1.5,3.6-2,1.4-.5,2.9-.7,4.4-.7,2.4.1,4.4.7,5.8,2m-3,15c1.1-.7,1.9-1.7,2.4-3v-3.2h-6.2c-3.4,0-5.1,1.2-5.1,3.5,0,1.1.4,2.1,1.3,2.7.9.7,2.1,1,3.7,1,1.5,0,2.8-.4,3.9-1" style="fill:#fff; stroke-width:0px;"/><path d="m867.95,236.05c1.5,1.4,2.2,3.5,2.2,6.3v11.4h-2.7v-11.1c0-2-.5-3.6-1.5-4.7-1-1.1-2.5-1.6-4.4-1.6-2.1,0-3.8.6-5,1.9-1.2,1.3-1.9,3-1.9,5.2v10.3h-2.7v-19.7h2.5v3.6c.7-1.2,1.7-2.1,3-2.8s2.8-1,4.5-1c2.6.1,4.5.8,6,2.2" style="fill:#fff; stroke-width:0px;"/><path d="m878.45,229.25c-.4-.4-.6-.8-.6-1.3s.2-.9.6-1.3c.4-.4.8-.6,1.4-.6.5,0,1,.2,1.4.5.4.4.6.8.6,1.3s-.2,1-.6,1.4c-.4.4-.8.6-1.4.6-.6-.1-1.1-.3-1.4-.6m0,4.8h2.7v19.7h-2.7v-19.7Z" style="fill:#fff; stroke-width:0px;"/><polygon points="903.55 251.55 903.55 253.75 887.55 253.75 887.55 251.95 899.95 236.25 887.75 236.25 887.75 234.05 903.25 234.05 903.25 235.85 890.85 251.55 903.55 251.55" style="fill:#fff; stroke-width:0px;"/><path d="m922.65,235.85c1.4,1.3,2.1,3.2,2.1,5.7v12.2h-2.5v-3.1c-.6,1-1.5,1.8-2.6,2.4-1.2.6-2.5.9-4.1.9-2.2,0-3.9-.5-5.2-1.6-1.3-1-1.9-2.4-1.9-4.2,0-1.7.6-3,1.8-4s3.1-1.5,5.8-1.5h6.2v-1.2c0-1.7-.5-3-1.4-3.9s-2.3-1.3-4.2-1.3c-1.2,0-2.4.2-3.6.6-1.1.4-2.1,1-3,1.7l-1.2-2c1-.8,2.2-1.5,3.6-2,1.4-.5,2.9-.7,4.4-.7,2.5.1,4.4.7,5.8,2m-3,15c1.1-.7,1.9-1.7,2.4-3v-3.2h-6.2c-3.4,0-5.1,1.2-5.1,3.5,0,1.1.4,2.1,1.3,2.7.9.7,2.1,1,3.7,1s2.9-.4,3.9-1" style="fill:#fff; stroke-width:0px;"/><path d="m943.45,252.55c-.5.4-1.1.8-1.8,1s-1.5.4-2.3.4c-1.8,0-3.3-.5-4.3-1.5s-1.5-2.4-1.5-4.2v-11.9h-3.5v-2.2h3.5v-4.3h2.7v4.3h6v2.2h-6v11.7c0,1.2.3,2.1.9,2.7.6.6,1.4.9,2.5.9.5,0,1.1-.1,1.6-.3s1-.4,1.3-.7l.9,1.9h0Z" style="fill:#fff; stroke-width:0px;"/><path d="m949.35,229.25c-.4-.4-.6-.8-.6-1.3s.2-.9.6-1.3c.4-.4.8-.6,1.4-.6.5,0,1,.2,1.4.5.4.4.6.8.6,1.3s-.2,1-.6,1.4c-.4.4-.8.6-1.4.6-.6-.1-1-.3-1.4-.6m0,4.8h2.7v19.7h-2.7v-19.7Z" style="fill:#fff; stroke-width:0px;"/><path d="m963.45,252.65c-1.5-.9-2.7-2.1-3.6-3.6-.9-1.5-1.3-3.2-1.3-5.2s.4-3.6,1.3-5.2c.9-1.5,2.1-2.7,3.6-3.6,1.5-.8,3.2-1.3,5.1-1.3s3.6.4,5.1,1.3c1.5.8,2.7,2,3.6,3.6.9,1.5,1.3,3.2,1.3,5.2s-.4,3.6-1.3,5.2c-.9,1.5-2,2.7-3.6,3.6-1.5.9-3.2,1.3-5.1,1.3-1.8,0-3.6-.5-5.1-1.3m8.9-2c1.1-.6,2-1.5,2.6-2.7.6-1.2.9-2.5.9-4s-.3-2.8-.9-4c-.6-1.2-1.5-2.1-2.6-2.7-1.1-.6-2.4-1-3.8-1s-2.6.3-3.8,1c-1.1.6-2,1.5-2.6,2.7-.6,1.2-1,2.5-1,4s.3,2.8,1,4c.6,1.2,1.5,2.1,2.6,2.7,1.1.6,2.4,1,3.8,1,1.4-.1,2.7-.4,3.8-1" style="fill:#fff; stroke-width:0px;"/><path d="m1001.05,236.05c1.5,1.4,2.2,3.5,2.2,6.3v11.4h-2.7v-11.1c0-2-.5-3.6-1.5-4.7-1-1.1-2.5-1.6-4.4-1.6-2.1,0-3.8.6-5,1.9-1.2,1.3-1.9,3-1.9,5.2v10.3h-2.7v-19.7h2.5v3.6c.7-1.2,1.7-2.1,3-2.8s2.8-1,4.5-1c2.6.1,4.5.8,6,2.2" style="fill:#fff; stroke-width:0px;"/><path d="m1032.65,252.65c-1.5-.9-2.7-2.1-3.6-3.6s-1.3-3.2-1.3-5.2.4-3.6,1.3-5.2c.9-1.5,2.1-2.7,3.6-3.6,1.5-.8,3.2-1.3,5.1-1.3s3.6.4,5.1,1.3c1.5.9,2.7,2,3.6,3.6.9,1.5,1.3,3.2,1.3,5.2s-.4,3.6-1.3,5.2c-.9,1.5-2,2.7-3.6,3.6-1.5.9-3.2,1.3-5.1,1.3s-3.6-.5-5.1-1.3m8.9-2c1.1-.6,2-1.5,2.6-2.7.6-1.2.9-2.5.9-4s-.3-2.8-.9-4c-.6-1.2-1.5-2.1-2.6-2.7-1.1-.6-2.4-1-3.8-1s-2.6.3-3.8,1c-1.1.6-2,1.5-2.6,2.7s-1,2.5-1,4,.3,2.8,1,4c.6,1.2,1.5,2.1,2.6,2.7s2.4,1,3.8,1c1.4-.1,2.7-.4,3.8-1" style="fill:#fff; stroke-width:0px;"/><path d="m1058.25,228.95c-.6.6-.9,1.5-.9,2.8v2.3h6.1v2.2h-6v17.4h-2.7v-17.4h-3.5v-2.2h3.5v-2.4c0-1.8.5-3.2,1.6-4.3,1-1,2.5-1.6,4.4-1.6.7,0,1.5.1,2.2.3s1.3.5,1.8.9l-.9,2c-.8-.6-1.7-1-2.9-1-1.3.1-2.1.4-2.7,1" style="fill:#fff; stroke-width:0px;"/><polygon points="480.85 280.15 491.25 280.15 491.25 316.55 513.75 316.55 513.75 325.05 480.85 325.05 480.85 280.15" style="fill:#fff; stroke-width:0px;"/><path d="m554.75,310.55h-26.1c.5,2.1,1.6,3.8,3.3,5.1,1.8,1.2,3.9,1.9,6.5,1.9,1.8,0,3.4-.3,4.8-.8,1.4-.5,2.7-1.4,3.9-2.5l5.3,5.8c-3.2,3.7-8,5.6-14.2,5.6-3.9,0-7.3-.8-10.3-2.3s-5.3-3.6-6.9-6.3c-1.6-2.7-2.4-5.7-2.4-9.2s.8-6.4,2.4-9.1c1.6-2.7,3.8-4.8,6.6-6.3s5.9-2.3,9.4-2.3,6.4.7,9.2,2.2c2.7,1.5,4.9,3.5,6.4,6.3,1.6,2.7,2.3,5.9,2.3,9.5,0-.2-.1.7-.2,2.4m-23.4-11.1c-1.5,1.3-2.5,3-2.8,5.3h17c-.3-2.2-1.3-3.9-2.8-5.2-1.5-1.3-3.4-2-5.6-2-2.4,0-4.3.6-5.8,1.9" style="fill:#fff; stroke-width:0px;"/><path d="m599.75,290.45v28.7c0,6.3-1.6,11-4.9,14.1-3.3,3.1-8.1,4.6-14.4,4.6-3.3,0-6.5-.4-9.5-1.2-3-.8-5.5-2-7.4-3.5l4-7.2c1.5,1.2,3.3,2.1,5.5,2.9,2.2.7,4.4,1.1,6.7,1.1,3.5,0,6-.8,7.7-2.3,1.6-1.6,2.5-3.9,2.5-7.1v-1.5c-2.6,2.9-6.2,4.3-10.9,4.3-3.2,0-6.1-.7-8.7-2.1-2.6-1.4-4.7-3.3-6.3-5.9-1.5-2.5-2.3-5.4-2.3-8.7s.8-6.2,2.3-8.7,3.6-4.5,6.3-5.9c2.6-1.4,5.5-2.1,8.7-2.1,5,0,8.8,1.6,11.4,4.9v-4.4h9.3Zm-12.4,22.3c1.7-1.6,2.5-3.6,2.5-6.1s-.8-4.6-2.5-6.1c-1.7-1.6-3.9-2.3-6.5-2.3s-4.8.8-6.5,2.3c-1.7,1.6-2.6,3.6-2.6,6.1s.9,4.6,2.6,6.1c1.7,1.6,3.9,2.3,6.5,2.3s4.8-.7,6.5-2.3" style="fill:#fff; stroke-width:0px;"/><path d="m637.85,293.75c2.9,2.5,4.3,6.4,4.3,11.5v19.7h-9.4v-4.3c-1.9,3.2-5.4,4.8-10.5,4.8-2.6,0-4.9-.4-6.9-1.3-1.9-.9-3.4-2.1-4.5-3.7-1-1.6-1.5-3.4-1.5-5.4,0-3.2,1.2-5.7,3.6-7.6,2.4-1.8,6.1-2.8,11.2-2.8h7.9c0-2.2-.7-3.9-2-5-1.3-1.2-3.3-1.8-6-1.8-1.8,0-3.6.3-5.4.9-1.8.6-3.3,1.4-4.5,2.3l-3.6-7c1.9-1.3,4.1-2.3,6.8-3.1,2.6-.7,5.3-1.1,8.1-1.1,5.4.1,9.5,1.4,12.4,3.9m-8.5,23.8c1.3-.8,2.3-2,2.8-3.5v-3.5h-6.9c-4.1,0-6.2,1.3-6.2,4,0,1.3.5,2.3,1.5,3s2.4,1.1,4.1,1.1c1.8.1,3.4-.3,4.7-1.1" style="fill:#fff; stroke-width:0px;"/><rect x="653.75" y="277.45" width="10" height="47.5" style="fill:#fff; stroke-width:0px;"/><polygon points="745.75 324.95 745.65 298.05 732.45 320.25 727.75 320.25 714.65 298.65 714.65 324.95 704.95 324.95 704.95 280.05 713.55 280.05 730.35 307.95 746.85 280.05 755.35 280.05 755.45 324.95 745.75 324.95" style="fill:#fff; stroke-width:0px;"/><path d="m801.65,310.55h-26.1c.5,2.1,1.6,3.8,3.3,5.1,1.8,1.2,3.9,1.9,6.5,1.9,1.8,0,3.4-.3,4.8-.8,1.4-.5,2.7-1.4,3.9-2.5l5.3,5.8c-3.2,3.7-8,5.6-14.2,5.6-3.9,0-7.3-.8-10.3-2.3s-5.3-3.6-6.9-6.3c-1.6-2.7-2.4-5.7-2.4-9.2s.8-6.4,2.4-9.1c1.6-2.7,3.8-4.8,6.6-6.3s5.9-2.3,9.4-2.3,6.4.7,9.2,2.2c2.7,1.5,4.9,3.5,6.4,6.3,1.6,2.7,2.3,5.9,2.3,9.5,0-.2-.1.7-.2,2.4m-23.4-11.1c-1.5,1.3-2.5,3-2.8,5.3h17c-.3-2.2-1.3-3.9-2.8-5.2-1.5-1.3-3.4-2-5.6-2-2.4,0-4.3.6-5.8,1.9" style="fill:#fff; stroke-width:0px;"/><path d="m833.25,323.35c-1,.7-2.2,1.3-3.6,1.6-1.4.3-2.9.5-4.5.5-4.1,0-7.3-1-9.5-3.1s-3.4-5.2-3.4-9.2v-14.2h-5.3v-7.7h5.3v-8.4h10v8.4h8.6v7.7h-8.6v14c0,1.5.4,2.6,1.1,3.4.7.8,1.8,1.2,3.2,1.2,1.6,0,2.9-.4,4-1.3l2.7,7.1Z" style="fill:#fff; stroke-width:0px;"/><path d="m855.85,291.25c2-.9,4.4-1.3,7-1.3v9.2c-1.1-.1-1.9-.1-2.2-.1-2.9,0-5.1.8-6.7,2.4-1.6,1.6-2.4,4-2.4,7.2v16.3h-10v-34.5h9.6v4.6c1.1-1.7,2.7-2.9,4.7-3.8" style="fill:#fff; stroke-width:0px;"/><path d="m877.75,323.25c-2.9-1.5-5.1-3.6-6.8-6.3-1.6-2.7-2.4-5.7-2.4-9.2s.8-6.5,2.4-9.2c1.6-2.7,3.9-4.8,6.8-6.3,2.9-1.5,6.1-2.3,9.8-2.3s6.9.8,9.7,2.3c2.9,1.5,5.1,3.6,6.7,6.3,1.6,2.7,2.4,5.8,2.4,9.2s-.8,6.5-2.4,9.2c-1.6,2.7-3.9,4.8-6.7,6.3-2.9,1.5-6.1,2.3-9.7,2.3s-6.9-.8-9.8-2.3m16.1-8.5c1.6-1.7,2.5-4.1,2.5-7s-.8-5.2-2.5-7c-1.6-1.7-3.7-2.6-6.3-2.6s-4.7.9-6.3,2.6c-1.7,1.7-2.5,4.1-2.5,7s.8,5.2,2.5,7c1.7,1.7,3.8,2.6,6.3,2.6,2.6-.1,4.7-.9,6.3-2.6" style="fill:#fff; stroke-width:0px;"/><rect x="915.65" y="277.45" width="10" height="47.5" style="fill:#fff; stroke-width:0px;"/><path d="m944.15,323.25c-2.9-1.5-5.1-3.6-6.8-6.3-1.6-2.7-2.4-5.7-2.4-9.2s.8-6.5,2.4-9.2c1.6-2.7,3.9-4.8,6.8-6.3,2.9-1.5,6.1-2.3,9.8-2.3s6.9.8,9.7,2.3c2.9,1.5,5.1,3.6,6.7,6.3,1.6,2.7,2.4,5.8,2.4,9.2s-.8,6.5-2.4,9.2c-1.6,2.7-3.9,4.8-6.7,6.3-2.9,1.5-6.1,2.3-9.7,2.3s-6.9-.8-9.8-2.3m16.1-8.5c1.6-1.7,2.5-4.1,2.5-7s-.8-5.2-2.5-7c-1.6-1.7-3.7-2.6-6.3-2.6s-4.7.9-6.3,2.6c-1.7,1.7-2.5,4.1-2.5,7s.8,5.2,2.5,7c1.7,1.7,3.8,2.6,6.3,2.6,2.6-.1,4.7-.9,6.3-2.6" style="fill:#fff; stroke-width:0px;"/><path d="m1017.75,290.45v28.7c0,6.3-1.6,11-4.9,14.1-3.3,3.1-8.1,4.6-14.4,4.6-3.3,0-6.5-.4-9.5-1.2-3-.8-5.5-2-7.4-3.5l4-7.2c1.5,1.2,3.3,2.1,5.5,2.9,2.2.7,4.4,1.1,6.7,1.1,3.5,0,6-.8,7.7-2.3,1.6-1.6,2.5-3.9,2.5-7.1v-1.5c-2.6,2.9-6.2,4.3-10.9,4.3-3.2,0-6.1-.7-8.7-2.1-2.6-1.4-4.7-3.3-6.3-5.9-1.5-2.5-2.3-5.4-2.3-8.7s.8-6.2,2.3-8.7,3.6-4.5,6.3-5.9c2.6-1.4,5.5-2.1,8.7-2.1,5,0,8.8,1.6,11.4,4.9v-4.4h9.3Zm-12.4,22.3c1.7-1.6,2.5-3.6,2.5-6.1s-.8-4.6-2.5-6.1c-1.7-1.6-3.9-2.3-6.5-2.3s-4.8.8-6.5,2.3c-1.7,1.6-2.6,3.6-2.6,6.1s.9,4.6,2.6,6.1c1.7,1.6,3.9,2.3,6.5,2.3s4.8-.7,6.5-2.3" style="fill:#fff; stroke-width:0px;"/><path d="m1063.85,290.45l-15.6,36.6c-1.6,4-3.5,6.8-5.9,8.4-2.3,1.6-5.1,2.4-8.4,2.4-1.8,0-3.6-.3-5.3-.8-1.8-.6-3.2-1.3-4.3-2.3l3.7-7.1c.8.7,1.7,1.2,2.7,1.6s2,.6,3,.6c1.4,0,2.5-.3,3.3-1,.9-.7,1.6-1.8,2.3-3.3l.1-.3-14.9-34.8h10.3l9.7,23.4,9.7-23.4h9.6Z" style="fill:#fff; stroke-width:0px;"/></svg>
|