diff --git a/.editorconfig b/.editorconfig
index 02e8abc..fd5c354 100644
--- a/.editorconfig
+++ b/.editorconfig
@@ -19,3 +19,13 @@ indent_size = 4
[{Makefile,*.mk,go.mod,go.sum,*.go,.gitmodules}]
indent_style = tab
+
+# Ignore paths
+[Gemfile.lock]
+charset = unset
+end_of_line = unset
+insert_final_newline = unset
+trim_trailing_whitespace = unset
+indent_style = unset
+indent_size = unset
+generated_code = true
diff --git a/.github/workflows/jekyll-gh-pages.yml b/.github/workflows/jekyll-gh-pages.yml
index f0985b1..3400f5a 100644
--- a/.github/workflows/jekyll-gh-pages.yml
+++ b/.github/workflows/jekyll-gh-pages.yml
@@ -80,10 +80,14 @@ jobs:
- name: Display structure of downloaded files
run: ls -R
- name: SonarCloud Scan
- uses: SonarSource/sonarcloud-github-action@master
+ uses: SonarSource/sonarcloud-github-action@v2.3.0
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} # Needed to get PR information, if any
SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }}
+ with:
+ args: >
+ -Dsonar.organization=${{ vars.SONAR_ORGANISATION_KEY }}
+ -Dsonar.projectKey=${{ vars.SONAR_PROJECT_KEY }}
# Deployment job
deploy:
environment:
diff --git a/.github/workflows/stage-2-test.yaml b/.github/workflows/stage-2-test.yaml
index 8d1fd43..a3a980e 100644
--- a/.github/workflows/stage-2-test.yaml
+++ b/.github/workflows/stage-2-test.yaml
@@ -87,10 +87,14 @@ jobs:
with:
fetch-depth: 0 # Full history is needed to improving relevancy of reporting
- name: Stage 2 Test - Sonar Cloud Scan
- uses: SonarSource/sonarcloud-github-action@master
+ uses: SonarSource/sonarcloud-github-action@v2.3.0
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} # Needed to get PR information, if any
SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }}
+ with:
+ args: >
+ -Dsonar.organization=${{ vars.SONAR_ORGANISATION_KEY }}
+ -Dsonar.projectKey=${{ vars.SONAR_PROJECT_KEY }}
# - name: "Perform static analysis"
# uses: ./.github/actions/perform-static-analysis
# with:
diff --git a/docs/.vscode/launch.json b/docs/.vscode/launch.json
index 7a0ce95..f0aa0b6 100644
--- a/docs/.vscode/launch.json
+++ b/docs/.vscode/launch.json
@@ -2,10 +2,14 @@
"version": "0.2.0",
"configurations": [
{
+ "name": "Debug",
+ "request": "launch",
+ "runtimeArgs": ["run-script", "debug"],
+ "runtimeExecutable": "npm",
+ "skipFiles": ["/**"],
"type": "node",
- "request": "attach",
- "name": "Attach",
- "preLaunchTask": "jekyll"
+ "preLaunchTask": "stop-already-running",
+ "console": "integratedTerminal"
}
]
}
diff --git a/docs/.vscode/tasks.json b/docs/.vscode/tasks.json
index ba15193..fd80f47 100644
--- a/docs/.vscode/tasks.json
+++ b/docs/.vscode/tasks.json
@@ -2,11 +2,11 @@
"version": "2.0.0",
"tasks": [
{
- "label": "jekyll",
+ "label": "stop-already-running",
"options": {
"cwd": "${workspaceFolder}"
- },
- "command": "make debug",
+ },
+ "command": "kill $(lsof -ti :4000); exit 0;",
"type": "shell"
}
]
diff --git a/docs/Gemfile b/docs/Gemfile
index da46d85..e4ff8d8 100644
--- a/docs/Gemfile
+++ b/docs/Gemfile
@@ -34,3 +34,4 @@ gem "wdm", "~> 0.1.1", :platforms => [:mingw, :x64_mingw, :mswin]
gem "http_parser.rb", "~> 0.6.0", :platforms => [:jruby]
gem "just-the-docs"
+gem 'jemoji'
diff --git a/docs/Gemfile.lock b/docs/Gemfile.lock
index bb1714e..3fbe054 100644
--- a/docs/Gemfile.lock
+++ b/docs/Gemfile.lock
@@ -1,11 +1,25 @@
GEM
remote: https://rubygems.org/
specs:
+ activesupport (7.1.3.4)
+ base64
+ bigdecimal
+ concurrent-ruby (~> 1.0, >= 1.0.2)
+ connection_pool (>= 2.2.5)
+ drb
+ i18n (>= 1.6, < 2)
+ minitest (>= 5.1)
+ mutex_m
+ tzinfo (~> 2.0)
addressable (2.8.6)
public_suffix (>= 2.0.2, < 6.0)
+ base64 (0.2.0)
+ bigdecimal (3.1.8)
cgi (0.4.1)
colorator (1.1.0)
concurrent-ruby (1.2.3)
+ connection_pool (2.4.1)
+ drb (2.2.1)
em-websocket (0.5.3)
eventmachine (>= 0.12.9)
http_parser.rb (~> 0)
@@ -14,7 +28,11 @@ GEM
eventmachine (1.2.7)
ffi (1.16.3)
forwardable-extended (2.6.0)
+ gemoji (4.1.0)
google-protobuf (3.25.3-x86_64-linux)
+ html-pipeline (2.14.3)
+ activesupport (>= 2)
+ nokogiri (>= 1.4)
http_parser.rb (0.8.0)
i18n (1.14.5)
concurrent-ruby (~> 1.0)
@@ -48,6 +66,10 @@ GEM
jekyll (>= 3.8, < 5.0)
jekyll-watch (2.2.1)
listen (~> 3.0)
+ jemoji (0.13.0)
+ gemoji (>= 3, < 5)
+ html-pipeline (~> 2.2)
+ jekyll (>= 3.0, < 5.0)
just-the-docs (0.8.2)
jekyll (>= 3.8.5)
jekyll-include-cache
@@ -66,6 +88,8 @@ GEM
jekyll (>= 3.5, < 5.0)
jekyll-feed (~> 0.9)
jekyll-seo-tag (~> 2.1)
+ minitest (5.23.1)
+ mutex_m (0.2.0)
nokogiri (1.16.5-x86_64-linux)
racc (~> 1.4)
pathutil (0.16.2)
@@ -86,6 +110,8 @@ GEM
strscan (3.1.0)
terminal-table (3.0.2)
unicode-display_width (>= 1.1.1, < 3)
+ tzinfo (2.0.6)
+ concurrent-ruby (~> 1.0)
unicode-display_width (2.5.0)
webrick (1.8.1)
@@ -97,6 +123,7 @@ DEPENDENCIES
jekyll (~> 4.3.3)
jekyll-drawio
jekyll-feed (~> 0.12)
+ jemoji
just-the-docs
minima (~> 2.5)
tzinfo (>= 1, < 3)
@@ -104,4 +131,4 @@ DEPENDENCIES
wdm (~> 0.1.1)
BUNDLED WITH
- 2.5.10
+ 2.5.10
diff --git a/docs/_config.yml b/docs/_config.yml
index 09a0936..471c9b7 100644
--- a/docs/_config.yml
+++ b/docs/_config.yml
@@ -119,6 +119,7 @@ just_the_docs:
theme: just-the-docs
plugins:
- jekyll-feed
+ - jemoji
color_scheme: nhs
mermaid:
diff --git a/docs/_includes/fullscreen.html b/docs/_includes/fullscreen.html
new file mode 100644
index 0000000..49c3710
--- /dev/null
+++ b/docs/_includes/fullscreen.html
@@ -0,0 +1,3 @@
+
diff --git a/docs/_includes/nhs-notify-head.html b/docs/_includes/nhs-notify-head.html
new file mode 100644
index 0000000..f066b8a
--- /dev/null
+++ b/docs/_includes/nhs-notify-head.html
@@ -0,0 +1 @@
+
diff --git a/docs/_includes/page-info-header.html b/docs/_includes/page-info-header.html
index 0664a04..fe6f752 100644
--- a/docs/_includes/page-info-header.html
+++ b/docs/_includes/page-info-header.html
@@ -1,56 +1,58 @@
{% if page.is_not_draft %}{% else %} {% assign is_draft = true %} {% endif %} {%
-assign wordWarning = 200 %} {% assign wordCount = content | number_of_words%} {%
-assign readTime = wordCount | divided_by: 100.0 | ceil %} {% if page.sub_title
-%}
-{{ page.title }}
-{{ page.summary }}
-{% else %}
-{{ page.title }}
-{% endif %}
+ assign wordWarning = 200 %} {% assign wordCount = content | number_of_words%} {%
+ assign readTime = wordCount | divided_by: 100.0 | ceil %} {% if page.sub_title
+ %}
+ {{ page.title }}
+ {{ page.summary }}
+ {% else %}
+ {{ page.title }}
+ {% endif %}
-
-
- {% if page.last_modified_date %} {{ page.last_modified_date | date:
- "%Y-%m-%d"}} | {% else %} 2022-07-01 | {% endif %} ๐ {{ wordCount }} words
- | โฑ {{readTime}} mins {% if site.gh_edit_link and site.gh_edit_link_text and
- site.gh_edit_repository and site.gh_edit_branch and site.gh_edit_view_mode
- %} |
- ๐งพ History
+
+
+ {% if page.last_modified_date %} {{ page.last_modified_date | date:
+ "%Y-%m-%d"}} | {% else %} 2022-07-01 | {% endif %} ๐ {{ wordCount }} words
+ | โฑ {{readTime}} mins {% if site.gh_edit_link and site.gh_edit_link_text and
+ site.gh_edit_repository and site.gh_edit_branch and site.gh_edit_view_mode
+ %} |
+ ๐งพ History
- {% endif %} | {% if page.author %} โ {{page.author}} {% else %} โ Ross
- Buggins {% endif %} | {% if page.owner %} ๐ {{page.owner}} {% else %} ๐
- Ross Buggins {% endif %}
-
+ {% endif %} | {% if page.author %} โ {{page.author}} {% else %} โ Ross
+ Buggins {% endif %} | {% if page.owner %} ๐ {{page.owner}} {% else %} ๐
+ Ross Buggins {% endif %}
-
- {% for tag in page.tags %}{{tag}},{% endfor %}
-
+
+ {% for tag in page.tags %}{{tag}},{% endfor %}
+
- {% if wordCount < wordWarning %}
-
- ๐ง This page has less that {{wordWarning}} words. So it looks like this page
- is still under construction.
-
- {% endif %} {% if page.description %}
-
{{page.description}}
- {% endif %} {% if page.todo or is_draft %}
-
Known Issues / Todo
+ {% if wordCount < wordWarning %}
+
+ ๐ง This page has less that {{wordWarning}} words. So it looks like this page
+ is still under construction.
+
+ {% endif %} {% if page.description %}
+
{{page.description}}
+ {% endif %} {% if page.todo or is_draft %}
+
Known Issues / Todo
-
- {% if page.is_not_draft %}{% else %}
- -
- โ
This page is draft and is subject to rapid change, and may not
- be fully accurate or complete
-
- {% endif %} {% for todo in page.todo %}
- - {{todo}}
- {% endfor %}
-
- {% endif %}
-
+
+ {% if page.is_not_draft %}{% else %}
+ -
+ โ
This page is draft and is subject to rapid change, and may not
+ be fully accurate or complete
+
+ {% endif %} {% for todo in page.todo %}
+ - {{todo}}
+ {% endfor %}
+
+ {% endif %}
+
+ {% include fullscreen.html %}
+
+
diff --git a/docs/_layouts/default.html b/docs/_layouts/default.html
index 4eaae58..7165405 100644
--- a/docs/_layouts/default.html
+++ b/docs/_layouts/default.html
@@ -6,15 +6,17 @@
{% include head.html %}
+{% include nhs-notify-head.html %}
+
Skip to main content
{% include icons/icons.html %}
{% if page.nav_enabled == true %}
- {% include components/sidebar.html %}
+ {% include components/sidebar.html %}
{% elsif layout.nav_enabled == true and page.nav_enabled == nil %}
- {% include components/sidebar.html %}
+ {% include components/sidebar.html %}
{% elsif site.nav_enabled != false and layout.nav_enabled == nil and page.nav_enabled == nil %}
- {% include components/sidebar.html %}
+ {% include components/sidebar.html %}
{% endif %}
{% include components/header.html %}
@@ -23,25 +25,29 @@
{% if site.heading_anchors != false %}
- {% include vendor/anchor_headings.html html=content beforeHeading="true" anchorBody="" anchorClass="anchor-heading" anchorAttrs="aria-labelledby=\"%html_id%\"" %}
+ {% include vendor/anchor_headings.html html=content beforeHeading="true" anchorBody="" anchorClass="anchor-heading" anchorAttrs="aria-labelledby=\"%html_id%\"" %}
{% else %}
- {{ content }}
+ {{ content }}
{% endif %}
{% if page.has_children == true and page.has_toc != false %}
- {% include components/children_nav.html %}
+ {% include components/children_nav.html %}
{% endif %}
{% include components/footer.html %}
{% if site.search_enabled != false %}
- {% include components/search_footer.html %}
+ {% include components/search_footer.html %}
{% endif %}
{% if site.mermaid %}
- {% include components/mermaid.html %}
+ {% include components/mermaid.html %}
{% endif %}
+
diff --git a/docs/assets/architecture/kruchten_4_1_model.png b/docs/assets/diagrams/architecture/kruchten_4_1_model.png
similarity index 100%
rename from docs/assets/architecture/kruchten_4_1_model.png
rename to docs/assets/diagrams/architecture/kruchten_4_1_model.png
diff --git a/docs/assets/diagrams/architecture/target-architecture/target-architecture.drawio b/docs/assets/diagrams/architecture/target-architecture/target-architecture.drawio
new file mode 100644
index 0000000..107ebfc
--- /dev/null
+++ b/docs/assets/diagrams/architecture/target-architecture/target-architecture.drawio
@@ -0,0 +1,205 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/assets/userguides/test.drawio b/docs/assets/diagrams/userguides/test.drawio
similarity index 100%
rename from docs/assets/userguides/test.drawio
rename to docs/assets/diagrams/userguides/test.drawio
diff --git a/docs/assets/js/nhs-notify.js b/docs/assets/js/nhs-notify.js
new file mode 100644
index 0000000..cf06374
--- /dev/null
+++ b/docs/assets/js/nhs-notify.js
@@ -0,0 +1,109 @@
+// Quick poc for view full screen
+
+window.addEventListener("load", (event) => {
+ var fullScreenParamName = "fullscreen";
+ var urlParams = new URLSearchParams(document.location.search);
+ var param = urlParams.get(fullScreenParamName);
+ if (param) {
+ tempViewFullScreen();
+ } else {
+ setViewAtStart();
+ }
+});
+
+let nhsNotify = nhsNotifyDefaults();
+
+function nhsNotifyDefaults() {
+ var defaults = {};
+ defaults.storageName = "cb-checked";
+ defaults.buttonName = "fullScreenButton";
+ defaults.standard = "Standard";
+ defaults.fullScreen = "Full Screen";
+ return defaults;
+}
+
+function tempViewFullScreen() {
+ viewFullScreen();
+ var buttons = document.getElementsByName(nhsNotify.buttonName);
+ buttons.forEach((item) => {
+ item.style.display = "none";
+ });
+}
+
+function viewFullScreen() {
+ var sideBar = document.getElementsByClassName("side-bar")[0];
+ var main = document.getElementsByClassName("main")[0];
+ var pageInfo = document.getElementsByClassName("page-info")[0];
+ sideBar.style.display = "none";
+ main.style.maxWidth = "100%";
+ main.style.marginLeft = "0px";
+ if (pageInfo) pageInfo.style.display = "none";
+}
+function setFullScreen() {
+ viewFullScreen();
+ afterChange(nhsNotify.standard, nhsNotify.fullScreen);
+}
+
+function setStandard() {
+ var sideBar = document.getElementsByClassName("side-bar")[0];
+ var main = document.getElementsByClassName("main")[0];
+ var pageInfo = document.getElementsByClassName("page-info")[0];
+ sideBar.style.display = "";
+ main.style.maxWidth = "";
+ main.style.marginLeft = "";
+ pageInfo.style.display = "";
+ afterChange(nhsNotify.fullScreen, nhsNotify.standard);
+}
+
+function setViewAtStart() {
+ var currentStatus = localStorage.getItem(nhsNotify.storageName);
+ if (currentStatus == nhsNotify.fullScreen) makeChange(currentStatus);
+}
+
+function makeChange(newStatus) {
+ if (newStatus == nhsNotify.fullScreen) {
+ setFullScreen();
+ } else {
+ setStandard();
+ }
+}
+
+function afterChange(currentStatus, newStatus) {
+ var storageName = nhsNotify.storageName;
+ var buttonName = nhsNotify.buttonName;
+ var buttons = document.getElementsByName(buttonName);
+ localStorage.setItem(storageName, newStatus);
+
+ buttons.forEach((item) => {
+ item.textContent = currentStatus + " View";
+ });
+}
+
+function fullScreenToggle() {
+ var standard = nhsNotify.standard;
+ var fullScreen = nhsNotify.fullScreen;
+ var storageName = nhsNotify.storageName;
+ var currentStatus = "";
+ var newStatus = "";
+
+ currentStatus = localStorage.getItem(storageName);
+
+ if (
+ currentStatus == "false" ||
+ currentStatus == "undefined" ||
+ currentStatus == null
+ ) {
+ currentStatus = standard;
+ newStatus = fullScreen;
+ }
+
+ if (currentStatus == standard) {
+ newStatus = fullScreen;
+ currentStatus = standard;
+ } else {
+ newStatus = standard;
+ currentStatus = fullScreen;
+ }
+
+ makeChange(newStatus);
+}
diff --git a/docs/collections/_architecture/target-architecture/index.md b/docs/collections/_architecture/target-architecture/index.md
new file mode 100644
index 0000000..a190e4b
--- /dev/null
+++ b/docs/collections/_architecture/target-architecture/index.md
@@ -0,0 +1,33 @@
+---
+title: Target architecture
+description: Notify Application Stack Target Architecture
+summary: Notify Application Stack Target Architecture
+last_modified_date: 2024-03-06
+author: Ross Buggins
+parent: Architecture
+---
+
+## Table of contents
+
+- [Table of contents](#table-of-contents)
+- [Proposed target architecture](#proposed-target-architecture)
+- [Architectural aims and goals](#architectural-aims-and-goals)
+ - [Conceptual example boundaries](#conceptual-example-boundaries)
+
+## Proposed target architecture
+
+With focus on:
+
+- distributed system
+- Event Driven Architecture
+- notify managed Event Bus for inter BC integration events
+- interact with external EDA Event Bus' via subscribing to integration events
+- separate datastore per bounded context
+- multiple microservices per bounded context
+- microservice is the smallest deployable unit
+
+## Architectural aims and goals
+
+### Conceptual example boundaries
+
+{% drawio path="assets/diagrams/architecture/target-architecture/target-architecture.drawio" page_number=0 height=800 %}
diff --git a/docs/collections/_guides/developer-guides/git.md b/docs/collections/_guides/developer-guides/git.md
new file mode 100644
index 0000000..f01dda6
--- /dev/null
+++ b/docs/collections/_guides/developer-guides/git.md
@@ -0,0 +1,7 @@
+---
+title: Git
+parent: Developer Guides
+description: Getting started with Git
+summary: Getting started with Git
+last_modified_date: 2024-05-28
+---
diff --git a/docs/collections/_guides/user-guides/drawio.md b/docs/collections/_guides/user-guides/drawio.md
index f5e49bf..03c64aa 100644
--- a/docs/collections/_guides/user-guides/drawio.md
+++ b/docs/collections/_guides/user-guides/drawio.md
@@ -1,15 +1,14 @@
---
-
title: Draw IO
parent: User Guides
-
---
+
## Using Draw io
Reference a drawio file by:
{{ "test.drawio" | relative_url }}
-{% drawio path="assets/userguides/test.drawio" page_number=0 height=400 %}
+{% drawio path="assets/diagrams/userguides/test.drawio" page_number=0 height=400 %}
[Something](test.drawio)
diff --git a/docs/collections/_principles/accelerate-dora.md b/docs/collections/_principles/accelerate-dora.md
index 8a3a75b..ac6d57b 100644
--- a/docs/collections/_principles/accelerate-dora.md
+++ b/docs/collections/_principles/accelerate-dora.md
@@ -5,4 +5,3 @@ description: About Accelerate. Devops. Dora.
summary: About Accelerate. Devops. Dora.
last_modified_date: 2024-05-28
---
-
diff --git a/docs/pages/contributing.md b/docs/pages/contributing.md
new file mode 100644
index 0000000..b50330e
--- /dev/null
+++ b/docs/pages/contributing.md
@@ -0,0 +1,15 @@
+---
+# Feel free to add content and custom Front Matter to this file.
+# To modify the layout, see https://jekyllrb.com/docs/themes/#overriding-theme-defaults
+
+layout: page
+title: Contributing
+description: Contributing to the documentation
+summary: Contributing to the documentation
+nav_order: 2
+permalink: /contributing
+---
+
+## Contributing
+
+- [Contributing](#contributing)
diff --git a/docs/pages/index.md b/docs/pages/index.md
index 98e6aad..f5f7db3 100644
--- a/docs/pages/index.md
+++ b/docs/pages/index.md
@@ -20,10 +20,11 @@ permalink: /
Please visit the [NHS Service Catalogue](https://digital.nhs.uk/services/nhs-notify) for:
-- NHS Notify web site.
-- Onboarding guidance.
-- Customer support.
-- Supplier support.
+- Use of the live NHS Notify SaaS
+- NHS Notify web site
+- Onboarding guidance
+- Customer support
+- Supplier support
> ### Who/what is this repository is for?
>
diff --git a/nhs-notify.code-workspace b/nhs-notify.code-workspace
index 1eed561..93deb15 100644
--- a/nhs-notify.code-workspace
+++ b/nhs-notify.code-workspace
@@ -40,7 +40,8 @@
"editor.defaultFormatter": "esbenp.prettier-vscode"
},
"[html]": {
- "editor.defaultFormatter": "esbenp.prettier-vscode"
+ "editor.defaultFormatter": "vscode.html-language-features",
+ "files.insertFinalNewline": true
},
"[json]": {
"editor.defaultFormatter": "esbenp.prettier-vscode"
diff --git a/scripts/config/gitleaks.toml b/scripts/config/gitleaks.toml
index af5f0bb..e4b6bc1 100644
--- a/scripts/config/gitleaks.toml
+++ b/scripts/config/gitleaks.toml
@@ -16,4 +16,9 @@ regexes = [
]
[allowlist]
-paths = ['''.terraform.lock.hcl''', '''poetry.lock''', '''yarn.lock''']
+paths = [
+ '''.terraform.lock.hcl''',
+ '''poetry.lock''',
+ '''yarn.lock''',
+ '''Gemfile.lock''',
+]
diff --git a/sonar-project.properties b/sonar-project.properties
deleted file mode 100644
index 3539908..0000000
--- a/sonar-project.properties
+++ /dev/null
@@ -1,13 +0,0 @@
-sonar.projectKey=NHSDigital_nhs-notify
-sonar.organization=nhsdigital
-
-# This is the name and version displayed in the SonarCloud UI.
-#sonar.projectName=nhs-notify
-#sonar.projectVersion=1.0
-
-
-# Path is relative to the sonar-project.properties file. Replace "\" by "/" on Windows.
-#sonar.sources=.
-
-# Encoding of the source code. Default is default system encoding
-#sonar.sourceEncoding=UTF-8