From a6bf7436da9c5d244a908c694fb39649a89cf106 Mon Sep 17 00:00:00 2001
From: bhavya-shukla-lrn
Date: Mon, 23 Jan 2023 09:24:15 +0000
Subject: [PATCH] [Feature] Added hmac256 signature and fixed tests also
created demo pages for the new signature LRN-38572
Change in branch
---
ChangeLog.md | 3 +
LearnosityDemo/LearnosityDemo.sln | 25 ++
LearnosityDemo/Pages/AssessAPIDemo.cshtml | 26 ++
LearnosityDemo/Pages/AssessAPIDemo.cshtml.cs | 414 ++++++++++++++++++
LearnosityDemo/Pages/AuthorAPIDemo.cshtml | 23 +
LearnosityDemo/Pages/AuthorAPIDemo.cshtml.cs | 117 +++++
LearnosityDemo/Pages/Index.cshtml | 5 +
LearnosityDemo/Pages/ItemsAPIDemo.cshtml | 3 +-
LearnosityDemo/Pages/ItemsAPIDemo.cshtml.cs | 18 +-
.../Pages/QuestioneditorAPIDemo.cshtml | 26 ++
.../Pages/QuestioneditorAPIDemo.cshtml.cs | 47 ++
LearnosityDemo/Pages/QuestionsAPIDemo.cshtml | 27 ++
.../Pages/QuestionsAPIDemo.cshtml.cs | 66 +++
LearnosityDemo/Pages/ReportsAPIDemo.cshtml | 23 +
LearnosityDemo/Pages/ReportsAPIDemo.cshtml.cs | 41 ++
LearnosityDemo/Pages/Shared/_Layout.cshtml | 15 +
LearnosityDemo/Properties/launchSettings.json | 4 +-
LearnositySDK.sln | 4 +-
LearnositySDK/LearnositySDK.csproj | 6 +-
LearnositySDK/Request/Init.cs | 40 +-
LearnositySDK/Utils/CryptoUtil.cs | 19 +-
LearnositySDK/Utils/Tools.cs | 24 +-
.../LearnositySDKIntegrationTests.cs | 2 +-
LearnositySDKUnitTests/InitTests.cs | 14 +-
docs/images/image-quickstart-index.png | Bin 0 -> 1149524 bytes
readme.md | 19 +-
26 files changed, 958 insertions(+), 53 deletions(-)
create mode 100644 LearnosityDemo/LearnosityDemo.sln
create mode 100644 LearnosityDemo/Pages/AssessAPIDemo.cshtml
create mode 100644 LearnosityDemo/Pages/AssessAPIDemo.cshtml.cs
create mode 100644 LearnosityDemo/Pages/AuthorAPIDemo.cshtml
create mode 100644 LearnosityDemo/Pages/AuthorAPIDemo.cshtml.cs
create mode 100644 LearnosityDemo/Pages/QuestioneditorAPIDemo.cshtml
create mode 100644 LearnosityDemo/Pages/QuestioneditorAPIDemo.cshtml.cs
create mode 100644 LearnosityDemo/Pages/QuestionsAPIDemo.cshtml
create mode 100644 LearnosityDemo/Pages/QuestionsAPIDemo.cshtml.cs
create mode 100644 LearnosityDemo/Pages/ReportsAPIDemo.cshtml
create mode 100644 LearnosityDemo/Pages/ReportsAPIDemo.cshtml.cs
create mode 100644 docs/images/image-quickstart-index.png
diff --git a/ChangeLog.md b/ChangeLog.md
index c3b0917..61a6fb6 100644
--- a/ChangeLog.md
+++ b/ChangeLog.md
@@ -7,6 +7,9 @@ and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.
## [Unreleased]
+## [v0.9.2] - 2023-06-23
+### Security
+- Upgraded signature to match the security standard.
## [v0.9.1] - 2019-12-23
### Added
diff --git a/LearnosityDemo/LearnosityDemo.sln b/LearnosityDemo/LearnosityDemo.sln
new file mode 100644
index 0000000..16ff9fd
--- /dev/null
+++ b/LearnosityDemo/LearnosityDemo.sln
@@ -0,0 +1,25 @@
+
+Microsoft Visual Studio Solution File, Format Version 12.00
+# Visual Studio Version 16
+VisualStudioVersion = 25.0.1704.3
+MinimumVisualStudioVersion = 10.0.40219.1
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "LearnosityDemo", "LearnosityDemo.csproj", "{27F96458-915A-4C09-91CF-C72F2144559F}"
+EndProject
+Global
+ GlobalSection(SolutionConfigurationPlatforms) = preSolution
+ Debug|Any CPU = Debug|Any CPU
+ Release|Any CPU = Release|Any CPU
+ EndGlobalSection
+ GlobalSection(ProjectConfigurationPlatforms) = postSolution
+ {27F96458-915A-4C09-91CF-C72F2144559F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {27F96458-915A-4C09-91CF-C72F2144559F}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {27F96458-915A-4C09-91CF-C72F2144559F}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {27F96458-915A-4C09-91CF-C72F2144559F}.Release|Any CPU.Build.0 = Release|Any CPU
+ EndGlobalSection
+ GlobalSection(SolutionProperties) = preSolution
+ HideSolutionNode = FALSE
+ EndGlobalSection
+ GlobalSection(ExtensibilityGlobals) = postSolution
+ SolutionGuid = {1FD8BD7C-CC74-4222-AE18-82F15D9DF2CE}
+ EndGlobalSection
+EndGlobal
diff --git a/LearnosityDemo/Pages/AssessAPIDemo.cshtml b/LearnosityDemo/Pages/AssessAPIDemo.cshtml
new file mode 100644
index 0000000..2d6cc71
--- /dev/null
+++ b/LearnosityDemo/Pages/AssessAPIDemo.cshtml
@@ -0,0 +1,26 @@
+@page
+@model LearnosityDemo.Pages.AssessAPIDemoModel
+@{
+ ViewData["Title"] = "Learnosity Example: Standalone Assessment";
+ ViewData["TopJS"] = "";
+
+}
+
+
+
+
diff --git a/LearnosityDemo/Pages/AssessAPIDemo.cshtml.cs b/LearnosityDemo/Pages/AssessAPIDemo.cshtml.cs
new file mode 100644
index 0000000..b11a371
--- /dev/null
+++ b/LearnosityDemo/Pages/AssessAPIDemo.cshtml.cs
@@ -0,0 +1,414 @@
+using System;
+using System.Text;
+using LearnositySDK;
+using LearnositySDK.Examples;
+using LearnositySDK.Request;
+using LearnositySDK.Utils;
+using Microsoft.AspNetCore.Mvc;
+using Microsoft.AspNetCore.Mvc.RazorPages;
+using Newtonsoft.Json;
+
+namespace LearnosityDemo.Pages
+{
+ public class AssessAPIDemoModel : PageModel
+ {
+ public void OnGet(string mode)
+ {
+ string uuid = Uuid.generate();
+ string courseId = "mycourse";
+ string questionsApiActivityJson = AssessAPIDemoModel.questionsApiActivity(uuid, courseId);
+ JsonObject questionsApiActivity = JsonObjectFactory.fromString(questionsApiActivityJson);
+
+ string service = "assess";
+
+ JsonObject security = new JsonObject();
+ security.set("consumer_key", Credentials.ConsumerKey);
+ security.set("user_id", "$ANONYMIZED_USER_ID");
+ security.set("domain", Credentials.Domain);
+
+ string secret = Credentials.ConsumerSecret;
+
+ JsonObject request = new JsonObject();
+ request.set("name", "Demo Activity (8 questions)");
+ request.set("state", "initial");
+ request.set("items", AssessAPIDemoModel.items(uuid));
+ request.set("questionsApiActivity", questionsApiActivity);
+
+ Init init = new Init(service, security, secret, request);
+ ViewData["InitJSON"] = init.generate();
+ }
+
+ private static JsonObject items(string uuid)
+ {
+ JsonObject items = new JsonObject(true);
+
+ for (int i = 3; i <= 10; i++)
+ {
+ JsonObject responseIDs = new JsonObject(true);
+ responseIDs.set(uuid + "_Demo" + i.ToString());
+ JsonObject item = new JsonObject();
+ item.set("reference", "Demo" + i.ToString());
+ item.set("content", "");
+ item.set("workflow", new JsonObject(true));
+ item.set("response_ids", responseIDs);
+ item.set("feature_ids", new JsonObject(true));
+ items.set(item);
+ }
+
+ return items;
+ }
+
+ private static string questionsApiActivity(string uuid, string courseId)
+ {
+ return string.Format(@"{{
+ ""type"": ""submit_practice"",
+ ""state"": ""initial"",
+ ""id"": ""assessdemo"",
+ ""name"": ""Assess API - Demo"",
+ ""course_id"": ""{1}"",
+ ""questions"": [
+ {{
+ ""type"": ""orderlist"",
+ ""list"": [
+ ""cat"",
+ ""horse"",
+ ""pig"",
+ ""elephant"",
+ ""mouse""
+ ],
+ ""stimulus"": ""Arrange these animals from smallest to largest
"",
+ ""ui_style"": ""button"",
+ ""validation"": {{
+ ""show_partial_ui"": true,
+ ""partial_scoring"": true,
+ ""valid_score"": 1,
+ ""penalty_score"": 0,
+ ""valid_response"": [
+ 4,
+ 0,
+ 2,
+ 1,
+ 3
+ ],
+ ""pairwise"": false
+ }},
+ ""instant_feedback"": true,
+ ""response_id"": ""{0}_Demo3"",
+ ""metadata"": {{
+ ""sheet_reference"": ""Demo3"",
+ ""widget_reference"": ""Demo3""
+ }}
+ }},
+ {{
+ ""type"": ""clozeassociation"",
+ ""template"": "" The United States of America was founded in {{{{response}}}}.
"",
+ ""possible_responses"": [
+ ""1676"",
+ ""1776"",
+ ""1876""
+ ],
+ ""feedback_attempts"": 2,
+ ""instant_feedback"": true,
+ ""validation"": {{
+ ""show_partial_ui"": true,
+ ""partial_scoring"": true,
+ ""valid_score"": 1,
+ ""penalty_score"": 0,
+ ""valid_responses"": [
+ [
+ ""1776""
+ ]
+ ]
+ }},
+ ""response_id"": ""{0}_Demo4"",
+ ""metadata"": {{
+ ""sheet_reference"": ""Demo4"",
+ ""widget_reference"": ""Demo4""
+ }}
+ }},
+ {{
+ ""type"": ""clozetext"",
+ ""template"": ""What is the sum of \\\\(785 \\\\times 89\\\\)
{{{{response}}}}"",
+ ""is_math"": true,
+ ""validation"": {{
+ ""show_partial_ui"": true,
+ ""partial_scoring"": true,
+ ""valid_score"": 1,
+ ""penalty_score"": 0,
+ ""valid_responses"": [
+ [
+ ""69865""
+ ]
+ ]
+ }},
+ ""instant_feedback"": true,
+ ""response_id"": ""{0}_Demo5"",
+ ""metadata"": {{
+ ""sheet_reference"": ""Demo5"",
+ ""widget_reference"": ""Demo5""
+ }}
+ }},
+ {{
+ ""type"": ""numberline"",
+ ""points"": [
+ ""5/5"",
+ ""1/4"",
+ ""2/4"",
+ ""7/8""
+ ],
+ ""is_math"": true,
+ ""labels"": {{
+ ""points"": ""0,1,2,3,4"",
+ ""show_min"": true,
+ ""show_max"": true
+ }},
+ ""line"": {{
+ ""min"": 0,
+ ""max"": 4,
+ ""left_arrow"": true,
+ ""right_arrow"": true
+ }},
+ ""stimulus"": ""Drag the points onto the numberline.
"",
+ ""ticks"": {{
+ ""distance"": "".25"",
+ ""show"": true
+ }},
+ ""validation"": {{
+ ""partial_scoring"": ""true"",
+ ""show_partial_ui"": ""true"",
+ ""valid_score"": ""1"",
+ ""penalty_score"": ""0"",
+ ""threshold"": ""0"",
+ ""valid_responses"": [
+ {{
+ ""point"": ""5/5"",
+ ""position"": ""1""
+ }},
+ {{
+ ""point"": ""1/4"",
+ ""position"": "".25""
+ }},
+ {{
+ ""point"": ""2/4"",
+ ""position"": ""2""
+ }},
+ {{
+ ""point"": ""7/8"",
+ ""position"": ""3.5""
+ }}
+ ]
+ }},
+ ""instant_feedback"": true,
+ ""snap_to_ticks"": true,
+ ""response_id"": ""{0}_Demo6"",
+ ""metadata"": {{
+ ""sheet_reference"": ""Demo6"",
+ ""widget_reference"": ""Demo6""
+ }}
+ }},
+ {{
+ ""type"": ""tokenhighlight"",
+ ""template"": ""He was told not to laugh in class.
"",
+ ""tokenization"": ""word"",
+ ""validation"": {{
+ ""show_partial_ui"": true,
+ ""partial_scoring"": true,
+ ""valid_score"": 1,
+ ""penalty_score"": 0,
+ ""valid_responses"": [
+ 5
+ ]
+ }},
+ ""stimulus"": ""Highlight the verb in the sentence below.
"",
+ ""instant_feedback"": true,
+ ""response_id"": ""{0}_Demo7"",
+ ""metadata"": {{
+ ""sheet_reference"": ""Demo7"",
+ ""widget_reference"": ""Demo7""
+ }}
+ }},
+ {{
+ ""type"": ""mcq"",
+ ""options"": [
+ {{
+ ""value"": ""0"",
+ ""label"": ""Berlin""
+ }},
+ {{
+ ""value"": ""1"",
+ ""label"": ""Paris""
+ }},
+ {{
+ ""value"": ""2"",
+ ""label"": ""London""
+ }},
+ {{
+ ""value"": ""3"",
+ ""label"": ""Madrid""
+ }}
+ ],
+ ""stimulus"": ""What\'s the capital of France?"",
+ ""stimulus_review"": ""Something Else"",
+ ""ui_style"": {{
+ ""type"": ""block"",
+ ""choice_label"": ""upper-alpha""
+ }},
+ ""valid_responses"": [
+ {{
+ ""value"": ""1"",
+ ""score"": 1
+ }}
+ ],
+ ""instant_feedback"": true,
+ ""response_id"": ""{0}_Demo8"",
+ ""metadata"": {{
+ ""sheet_reference"": ""Demo8"",
+ ""widget_reference"": ""Demo8""
+ }}
+ }},
+ {{
+ ""type"": ""clozedropdown"",
+ ""template"": ""“It’s all clear,’ he {{{{response}}}}. “Have you the chisel and the bags? Great Scott! Jump, Archie, jump, and I’ll swing for it!’ Sherlock {{{{response}}}} had sprung out and seized the {{{{response}}}} by the collar. The other dived down the hole, and I heard the sound of {{{{response}}}} cloth as Jones clutched at his skirts. The light flashed upon the barrel of a revolver, but Holmes’ {{{{response}}}} came down on the man’s wrist, and the pistol {{{{response}}}} upon the stone floor."",
+ ""possible_responses"": [
+ [
+ ""whispered"",
+ ""sprinted"",
+ ""joked""
+ ],
+ [
+ ""Homes"",
+ ""holmes"",
+ ""Holmes""
+ ],
+ [
+ ""acquaintance"",
+ ""intruder"",
+ ""shopkeeper""
+ ],
+ [
+ ""burning"",
+ ""departing"",
+ ""rending"",
+ ""broken""
+ ],
+ [
+ ""revolver"",
+ ""hunting crop""
+ ],
+ [
+ ""rattled"",
+ ""clinked"",
+ ""spilt""
+ ]
+ ],
+ ""stimulus"": ""Fill in the blanks.
"",
+ ""validation"": {{
+ ""show_partial_ui"": true,
+ ""partial_scoring"": true,
+ ""valid_score"": 1,
+ ""penalty_score"": 0,
+ ""valid_responses"": [
+ [
+ ""whispered""
+ ],
+ [
+ ""Holmes""
+ ],
+ [
+ ""intruder""
+ ],
+ [
+ ""rending""
+ ],
+ [
+ ""hunting crop""
+ ],
+ [
+ ""clinked""
+ ]
+ ]
+ }},
+ ""instant_feedback"": true,
+ ""response_id"": ""{0}_Demo9"",
+ ""metadata"": {{
+ ""sheet_reference"": ""Demo9"",
+ ""widget_reference"": ""Demo9""
+ }}
+ }},
+ {{
+ ""type"": ""graphplotting"",
+ ""axis_x"": {{
+ ""ticks_distance"": 1,
+ ""draw_labels"": true
+ }},
+ ""axis_y"": {{
+ ""ticks_distance"": 1,
+ ""draw_labels"": true
+ }},
+ ""canvas"": {{
+ ""x_min"": 0,
+ ""x_max"": 10.2,
+ ""y_min"": -0.5,
+ ""y_max"": 10.2,
+ ""snap_to"": ""grid""
+ }},
+ ""grid"": {{
+ ""x_distance"": 1,
+ ""y_distance"": 1
+ }},
+ ""toolbar"": {{
+ ""tools"": [
+ ""point"",
+ ""move""
+ ],
+ ""default_tool"": ""point""
+ }},
+ ""ui_style"": {{
+ ""margin"": ""10px""
+ }},
+ ""stimulus"": ""Plot the following points \\\\((2,5), (4,8), (8,1)\\\\).
"",
+ ""is_math"": true,
+ ""validation"": {{
+ ""valid_score"": ""1"",
+ ""penalty_score"": ""0"",
+ ""valid_responses"": [
+ [
+ {{
+ ""id"": ""lrn_1"",
+ ""type"": ""point"",
+ ""coords"": {{
+ ""x"": 2,
+ ""y"": 5
+ }}
+ }},
+ {{
+ ""id"": ""lrn_2"",
+ ""type"": ""point"",
+ ""coords"": {{
+ ""x"": 4,
+ ""y"": 8
+ }}
+ }},
+ {{
+ ""id"": ""lrn_3"",
+ ""type"": ""point"",
+ ""coords"": {{
+ ""x"": 8,
+ ""y"": 1
+ }}
+ }}
+ ]
+ ]
+ }},
+ ""instant_feedback"": true,
+ ""response_id"": ""{0}_Demo10"",
+ ""metadata"": {{
+ ""sheet_reference"": ""Demo10"",
+ ""widget_reference"": ""Demo10""
+ }}
+ }}
+ ]
+ }}", uuid, courseId);
+ }
+ }
+}
diff --git a/LearnosityDemo/Pages/AuthorAPIDemo.cshtml b/LearnosityDemo/Pages/AuthorAPIDemo.cshtml
new file mode 100644
index 0000000..878f4dd
--- /dev/null
+++ b/LearnosityDemo/Pages/AuthorAPIDemo.cshtml
@@ -0,0 +1,23 @@
+@page
+@model LearnosityDemo.Pages.AuthorAPIDemoModel
+@{
+ ViewData["Title"] = "Learnosity Example: Standalone Assessment";
+ ViewData["TopJS"] = "";
+
+ }
+
+
+
+
diff --git a/LearnosityDemo/Pages/AuthorAPIDemo.cshtml.cs b/LearnosityDemo/Pages/AuthorAPIDemo.cshtml.cs
new file mode 100644
index 0000000..41df008
--- /dev/null
+++ b/LearnosityDemo/Pages/AuthorAPIDemo.cshtml.cs
@@ -0,0 +1,117 @@
+using System;
+using System.Text;
+using LearnositySDK.Request;
+using LearnositySDK.Utils;
+using Microsoft.AspNetCore.Mvc;
+using Microsoft.AspNetCore.Mvc.RazorPages;
+using Newtonsoft.Json;
+
+namespace LearnosityDemo.Pages
+{
+ public class AuthorAPIDemoModel : PageModel
+ {
+ public void OnGet(string mode)
+ {
+ // Author API contains 2 modes
+ // item_edit mode and item_list mode
+ // the below example generate initOptions for item_edit mode
+ // more information about item_list mode can be found in initializeItemList() function
+ Init init = (mode == "item_list") ? initializeItemList() : initializeItemEdit();
+ ViewData["InitJSON"] = init.generate();
+ }
+
+ private static Init initializeItemEdit()
+ {
+ string service = "author";
+
+ JsonObject security = new JsonObject();
+ security.set("consumer_key", LearnositySDK.Credentials.ConsumerKey);
+ security.set("domain", LearnositySDK.Credentials.Domain);
+
+ string secret = LearnositySDK.Credentials.ConsumerSecret;
+
+ JsonObject request = new JsonObject();
+ request.set("mode", "item_edit");
+ request.set("reference", Uuid.generate());
+
+ JsonObject config = new JsonObject();
+ JsonObject config_item_edit = new JsonObject();
+ JsonObject config_item_edit_widget = new JsonObject();
+ config_item_edit_widget.set("delete", true);
+ config_item_edit_widget.set("edit", true);
+ config_item_edit.set("widget", config_item_edit_widget);
+ JsonObject config_item_edit_item = new JsonObject();
+ JsonObject config_item_edit_item_tags = new JsonObject();
+ JsonObject config_item_edit_item_tags_includesTagOnEdit = new JsonObject(true);
+ JsonObject config_item_edit_item_tags_includesTagOnEdit_tag = new JsonObject();
+ config_item_edit_item_tags_includesTagOnEdit_tag.set("type", "course");
+ config_item_edit_item_tags_includesTagOnEdit_tag.set("name", "commoncore");
+ config_item_edit_item_tags_includesTagOnEdit.set(config_item_edit_item_tags_includesTagOnEdit_tag);
+ config_item_edit_item_tags.set("include_tags_on_edit", config_item_edit_item_tags_includesTagOnEdit);
+ config_item_edit_item.set("tags", config_item_edit_item_tags);
+ config_item_edit.set("item", config_item_edit_item);
+ config.set("item_edit", config_item_edit);
+
+ JsonObject config_questionEditorInitOptions = new JsonObject();
+ JsonObject config_questionEditorInitOptions_ui = new JsonObject();
+ config_questionEditorInitOptions_ui.set("question_tiles", false);
+ config_questionEditorInitOptions_ui.set("documentation_link", false);
+ config_questionEditorInitOptions_ui.set("change_button", true);
+ config_questionEditorInitOptions_ui.set("source_button", false);
+ config_questionEditorInitOptions_ui.set("fixed_preview", true);
+ config_questionEditorInitOptions_ui.set("advanced_group", false);
+ config_questionEditorInitOptions_ui.set("search_field", false);
+ config_questionEditorInitOptions.set("ui", config_questionEditorInitOptions_ui);
+ config.set("question_editor_init_options", config_questionEditorInitOptions);
+
+ request.set("config", config);
+
+ JsonObject user = new JsonObject();
+ user.set("id", "brianmoser");
+ user.set("firstname", "Test");
+ user.set("lastname", "Test");
+ user.set("email", "test@test.com");
+ request.set("user", user);
+
+ return new Init(service, security, secret, request);
+ }
+
+ private static Init initializeItemList()
+ {
+ string service = "author";
+
+ JsonObject security = new JsonObject();
+ security.set("consumer_key", LearnositySDK.Credentials.ConsumerKey);
+ security.set("domain", LearnositySDK.Credentials.Domain);
+
+ string secret = LearnositySDK.Credentials.ConsumerSecret;
+
+ JsonObject request = new JsonObject();
+ request.set("mode", "item_list");
+
+ JsonObject config = new JsonObject();
+ JsonObject config_item_list = new JsonObject();
+ JsonObject config_item_list_toolbar = new JsonObject();
+ config_item_list_toolbar.set("add", true);
+ config_item_list.set("toolbar", config_item_list_toolbar);
+ config.set("item_list", config_item_list);
+ request.set("config", config);
+
+ JsonObject tags = new JsonObject(true);
+ JsonObject tag = new JsonObject();
+ tag.set("type", "course");
+ tag.set("name", "commoncore");
+ tags.set(tag);
+ request.set("tags", tags);
+
+ JsonObject user = new JsonObject();
+ user.set("id", "brianmoser");
+ user.set("firstname", "Test");
+ user.set("lastname", "Test");
+ user.set("email", "test@test.com");
+ request.set("user", user);
+
+ return new Init(service, security, secret, request);
+ }
+ }
+}
diff --git a/LearnosityDemo/Pages/Index.cshtml b/LearnosityDemo/Pages/Index.cshtml
index b78b99c..2906fb1 100644
--- a/LearnosityDemo/Pages/Index.cshtml
+++ b/LearnosityDemo/Pages/Index.cshtml
@@ -8,6 +8,11 @@
Learnosity Quick Start Guide
Click to load:
+ Click to load:
+ Click to load:
+ Click to load:
+ Click to load:
+ Click to load:
For instructions, see the tutorial for this project in the README file.
diff --git a/LearnosityDemo/Pages/ItemsAPIDemo.cshtml b/LearnosityDemo/Pages/ItemsAPIDemo.cshtml
index 0679949..10e5d7e 100644
--- a/LearnosityDemo/Pages/ItemsAPIDemo.cshtml
+++ b/LearnosityDemo/Pages/ItemsAPIDemo.cshtml
@@ -2,12 +2,11 @@
@model LearnosityDemo.Pages.ItemsAPIDemoModel
@{
ViewData["Title"] = "Learnosity Example: Standalone Assessment";
- ViewData["TopJS"] = "";
+ ViewData["TopJS"] = "";
}
-
";
+
+}
+
+
+
+
diff --git a/LearnosityDemo/Pages/QuestioneditorAPIDemo.cshtml.cs b/LearnosityDemo/Pages/QuestioneditorAPIDemo.cshtml.cs
new file mode 100644
index 0000000..ef716a6
--- /dev/null
+++ b/LearnosityDemo/Pages/QuestioneditorAPIDemo.cshtml.cs
@@ -0,0 +1,47 @@
+using System;
+using System.Text;
+using LearnositySDK;
+using LearnositySDK.Examples;
+using LearnositySDK.Request;
+using LearnositySDK.Utils;
+using Microsoft.AspNetCore.DataProtection;
+using Microsoft.AspNetCore.Mvc;
+using Microsoft.AspNetCore.Mvc.RazorPages;
+using Newtonsoft.Json;
+
+namespace LearnosityDemo.Pages
+{
+ public class QuestioneditorAPIDemoModel : PageModel
+ {
+ public void OnGet(string mode)
+ {
+ JsonObject request = new JsonObject();
+ JsonObject consumer_key = new JsonObject();
+ consumer_key.set("consumer_key", LearnositySDK.Credentials.ConsumerKey);
+ request.set("configuration", consumer_key);
+ request.set("widget_conversion", true);
+
+ JsonObject ui = new JsonObject();
+ ui.set("search_field", true);
+
+ JsonObject layout = new JsonObject();
+ layout.set("global_template", "edit_preview");
+ layout.set("mode", "advanced");
+ ui.set("layout", layout);
+ request.set("ui", ui);
+ string service = "questions";
+
+ JsonObject security = new JsonObject();
+ security.set("consumer_key", LearnositySDK.Credentials.ConsumerKey);
+ security.set("user_id", "abc");
+ security.set("domain", LearnositySDK.Credentials.Domain);
+
+ string secret = LearnositySDK.Credentials.ConsumerSecret;
+
+ Init init = new Init(service, security, secret, request);
+
+ ViewData["InitJSON"] = init.generate();
+ }
+
+ }
+}
diff --git a/LearnosityDemo/Pages/QuestionsAPIDemo.cshtml b/LearnosityDemo/Pages/QuestionsAPIDemo.cshtml
new file mode 100644
index 0000000..322b627
--- /dev/null
+++ b/LearnosityDemo/Pages/QuestionsAPIDemo.cshtml
@@ -0,0 +1,27 @@
+@page
+@model LearnosityDemo.Pages.QuestionsAPIDemoModel
+@{
+ ViewData["Title"] = "Learnosity Example: Standalone Assessment";
+ ViewData["TopJS"] = "";
+}
+
+
+
+
+
diff --git a/LearnosityDemo/Pages/QuestionsAPIDemo.cshtml.cs b/LearnosityDemo/Pages/QuestionsAPIDemo.cshtml.cs
new file mode 100644
index 0000000..63a24c1
--- /dev/null
+++ b/LearnosityDemo/Pages/QuestionsAPIDemo.cshtml.cs
@@ -0,0 +1,66 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Threading.Tasks;
+using Microsoft.AspNetCore.Mvc;
+using Microsoft.AspNetCore.Mvc.RazorPages;
+using LearnositySDK.Request;
+using LearnositySDK.Utils;
+using Newtonsoft.Json;
+using Microsoft.AspNetCore.DataProtection;
+
+
+namespace LearnosityDemo.Pages
+{
+ public class QuestionsAPIDemoModel : PageModel
+ {
+ public void OnGet()
+ {
+
+ // prepare all the params
+ string service = "questions";
+ string uuid = Uuid.generate();
+ string courseId = "mycourse";
+ JsonObject security = new JsonObject();
+ security.set("consumer_key", LearnositySDK.Credentials.ConsumerKey);
+ security.set("user_id", "abc");
+ security.set("domain", LearnositySDK.Credentials.Domain);
+ string secret = LearnositySDK.Credentials.ConsumerSecret;
+ JsonObject request = JsonObjectFactory.fromString(QuestionsAPIDemoModel.requestJson(uuid, courseId));
+
+ // Instantiate Init class
+ Init init = new Init(service, security, secret, request);
+
+ // Call the generate() method to retrieve a JavaScript object
+ ViewData["InitJSON"] = init.generate();
+ }
+
+ private static string requestJson(string uuid, string courseId)
+ {
+ return string.Format(@"{{
+ ""type"": ""local_practice"",
+ ""sigver"": ""v2"",
+ ""state"": ""initial"",
+ ""id"": ""questionsapi-demo"",
+ ""name"": ""Questions API Demo"",
+ ""course_id"": ""{1}"",
+ ""questions"": [
+ {{
+ ""type"": ""association"",
+ ""response_id"": ""60001"",
+ ""stimulus"": ""Match the cities to the parent nation."",
+ ""stimulus_list"": [""London"", ""Dublin"", ""Paris"", ""Sydney""],
+ ""possible_responses"": [""Australia"", ""France"", ""Ireland"", ""England""],
+ ""instant_feedback"" : true,
+ ""validation"": {{
+ ""valid_responses"" : [
+ [""England""],[""Ireland""],[""France""],[""Australia""]
+ ]
+ }}
+ }},
+
+ ]
+ }}", uuid, courseId);
+ }
+ }
+}
diff --git a/LearnosityDemo/Pages/ReportsAPIDemo.cshtml b/LearnosityDemo/Pages/ReportsAPIDemo.cshtml
new file mode 100644
index 0000000..b321b3c
--- /dev/null
+++ b/LearnosityDemo/Pages/ReportsAPIDemo.cshtml
@@ -0,0 +1,23 @@
+@page
+@model LearnosityDemo.Pages.ReportsAPIDemoModel
+@{
+ ViewData["Title"] = "Learnosity Example: Standalone Assessment";
+ ViewData["TopJS"] = "";
+
+ }
+
+
+
+
diff --git a/LearnosityDemo/Pages/ReportsAPIDemo.cshtml.cs b/LearnosityDemo/Pages/ReportsAPIDemo.cshtml.cs
new file mode 100644
index 0000000..be72717
--- /dev/null
+++ b/LearnosityDemo/Pages/ReportsAPIDemo.cshtml.cs
@@ -0,0 +1,41 @@
+using System;
+using System.Text;
+using LearnositySDK;
+using LearnositySDK.Request;
+using LearnositySDK.Utils;
+using Microsoft.AspNetCore.Mvc;
+using Microsoft.AspNetCore.Mvc.RazorPages;
+using Newtonsoft.Json;
+using static System.Net.Mime.MediaTypeNames;
+
+namespace LearnosityDemo.Pages
+{
+ public class ReportsAPIDemoModel : PageModel
+ {
+ public void OnGet(string mode)
+ {
+ string service = "reports";
+
+ JsonObject security = new JsonObject();
+ security.set("consumer_key", Credentials.ConsumerKey);
+ security.set("domain", Credentials.Domain);
+
+ string secret = Credentials.ConsumerSecret;
+
+ JsonObject report = new JsonObject();
+ report.set("id", "session-detail");
+ report.set("type", "session-detail-by-item");
+ report.set("user_id", "906d564c-39d4-44ba-8ddc-2d44066e2ba9");
+ report.set("session_id", "906d564c-39d4-44ba-8ddc-2d44066e2ba9");
+
+ JsonObject reports = new JsonObject(true);
+ reports.set(report);
+
+ JsonObject request = new JsonObject();
+ request.set("reports", reports);
+
+ Init init = new Init(service, security, secret, request);
+ ViewData["initJSON"] = init.generate();
+ }
+ }
+}
diff --git a/LearnosityDemo/Pages/Shared/_Layout.cshtml b/LearnosityDemo/Pages/Shared/_Layout.cshtml
index 5f90469..e4d79c0 100644
--- a/LearnosityDemo/Pages/Shared/_Layout.cshtml
+++ b/LearnosityDemo/Pages/Shared/_Layout.cshtml
@@ -25,6 +25,21 @@
Items API Demo
+
+ Questions API Demo
+
+
+ Author API Demo
+
+
+ Reports API Demo
+
+
+ Assess API Demo
+
+
+ Question Editor API Demo
+
diff --git a/LearnosityDemo/Properties/launchSettings.json b/LearnosityDemo/Properties/launchSettings.json
index afa59ec..22c4049 100644
--- a/LearnosityDemo/Properties/launchSettings.json
+++ b/LearnosityDemo/Properties/launchSettings.json
@@ -1,4 +1,4 @@
-{
+{
"iisSettings": {
"windowsAuthentication": false,
"anonymousAuthentication": true,
@@ -24,4 +24,4 @@
}
}
}
-}
+}
\ No newline at end of file
diff --git a/LearnositySDK.sln b/LearnositySDK.sln
index 27523be..3534785 100644
--- a/LearnositySDK.sln
+++ b/LearnositySDK.sln
@@ -25,13 +25,13 @@ Global
{DC1B295A-F21E-4A3C-A4DA-76130D281546}.Release|Any CPU.ActiveCfg = Release|Any CPU
{DC1B295A-F21E-4A3C-A4DA-76130D281546}.Release|Any CPU.Build.0 = Release|Any CPU
{29D6AB6C-C34D-4FAE-A433-E59C0B990DB6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {29D6AB6C-C34D-4FAE-A433-E59C0B990DB6}.Debug|Any CPU.Build.0 = Debug|Any CPU
{29D6AB6C-C34D-4FAE-A433-E59C0B990DB6}.Release|Any CPU.ActiveCfg = Release|Any CPU
{29D6AB6C-C34D-4FAE-A433-E59C0B990DB6}.Release|Any CPU.Build.0 = Release|Any CPU
+ {29D6AB6C-C34D-4FAE-A433-E59C0B990DB6}.Debug|Any CPU.Build.0 = Debug|Any CPU
{EC7DF4B1-1A89-40CA-99B1-E059D54EA373}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {EC7DF4B1-1A89-40CA-99B1-E059D54EA373}.Debug|Any CPU.Build.0 = Debug|Any CPU
{EC7DF4B1-1A89-40CA-99B1-E059D54EA373}.Release|Any CPU.ActiveCfg = Release|Any CPU
{EC7DF4B1-1A89-40CA-99B1-E059D54EA373}.Release|Any CPU.Build.0 = Release|Any CPU
+ {EC7DF4B1-1A89-40CA-99B1-E059D54EA373}.Debug|Any CPU.Build.0 = Debug|Any CPU
{48234B2A-1BD6-477F-9DCA-F7F1A1FD15B2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{48234B2A-1BD6-477F-9DCA-F7F1A1FD15B2}.Debug|Any CPU.Build.0 = Debug|Any CPU
{48234B2A-1BD6-477F-9DCA-F7F1A1FD15B2}.Release|Any CPU.ActiveCfg = Release|Any CPU
diff --git a/LearnositySDK/LearnositySDK.csproj b/LearnositySDK/LearnositySDK.csproj
index fd822af..6823e67 100644
--- a/LearnositySDK/LearnositySDK.csproj
+++ b/LearnositySDK/LearnositySDK.csproj
@@ -5,14 +5,14 @@
LearnositySDK
LearnositySDK
LearnositySDK
- 0.9.1
+ 0.9.2
Learnosity
Learnosity SDK for ASP.NET / C#
Telemetry data (basic information about the execution environment) is now added to the request objects being signed which is later read and logged internally by our APIs when the request is received. This allows us to better support our various SDKs and does not send any additional network requests. More information can be found in README.md.
- Copyright Learnosity 2017 (c)
+ Copyright Learnosity 2023 (c)
learnosity sdk asp .net
- 0.9.1
+ 0.9.2
https://github.com/Learnosity/learnosity-sdk-asp.net/blob/master/LICENSE.md
https://github.com/Learnosity/learnosity-sdk-asp.net
https://github.com/Learnosity/learnosity-sdk-asp.net
diff --git a/LearnositySDK/Request/Init.cs b/LearnositySDK/Request/Init.cs
index c2498fb..997d2b2 100644
--- a/LearnositySDK/Request/Init.cs
+++ b/LearnositySDK/Request/Init.cs
@@ -4,6 +4,7 @@
using LearnositySDK.Utils;
using System.Web;
using System.Runtime.InteropServices;
+using System.Drawing;
namespace LearnositySDK.Request
{
@@ -52,6 +53,11 @@ public class Init
///
private string requestString;
+ ///
+ /// the `prehashString` string is concatination of signaturelist (Array) , required for hashing.
+ ///
+ private string prehashString;
+
///
/// An optional value used to define what type of request is being made. This is only required for certain requests made to the Data API (http://docs.learnosity.com/dataapi/)
///
@@ -152,7 +158,7 @@ private void Initialize(string service, JsonObject securityPacket, string secret
this.signRequestData = true;
this.validSecurityKeys = new string[5] { "consumer_key", "domain", "timestamp", "expires", "user_id" };
this.validServices = new string[7] { "assess", "author", "data", "events", "items", "questions", "reports" };
- this.algorithm = "sha256";
+ this.algorithm = "hmac-sha256";
if (this.requestPacket == null)
{
@@ -208,8 +214,6 @@ public string generateSignature()
}
}
- signatureList.Add(this.secret);
-
if (this.signRequestData && !Tools.empty(this.requestString))
{
signatureList.Add(this.requestString);
@@ -220,7 +224,9 @@ public string generateSignature()
signatureList.Add(this.action);
}
- return this.hashValue(signatureList.ToArray());
+ this.prehashString = Tools.implode("_", signatureList.ToArray());
+
+ return this.hashValue(this.prehashString, this.secret);
}
///
@@ -362,15 +368,15 @@ private JsonObject generateQuestions(JsonObject output)
}
///
- /// Hash an array value
+ /// Returns a hash value
///
- /// An array to hash
+ /// String to be hashed
+ /// String used for encryption
/// The hashed string
- private string hashValue(string[] value)
+ private string hashValue(string prehash, string secret )
{
- string implode = Tools.implode("_", value);
- string hash = Tools.hash(this.algorithm, implode);
- return hash;
+ string hash = Tools.hash(this.algorithm, prehash, secret);
+ return "$02$" + hash;
}
///
@@ -406,23 +412,13 @@ private void setServiceOptions()
JsonObject questionsApiActivity = new JsonObject();
- List signatureList = new List();
-
- signatureList.Add(this.securityPacket.getString("consumer_key"));
- signatureList.Add(domain);
- signatureList.Add(this.securityPacket.getString("timestamp"));
-
if (Tools.array_key_exists("expires", this.securityPacket))
{
- signatureList.Add(this.securityPacket.getString("expires"));
questionsApiActivity.set("expires", this.securityPacket.getString("expires"));
questionsApi.remove("expires");
}
- signatureList.Add(this.securityPacket.getString("user_id"));
- signatureList.Add(this.secret);
-
- string signature = this.hashValue(signatureList.ToArray());
+ string signature = generateSignature();
questionsApiActivity.set("consumer_key", this.securityPacket.getString("consumer_key"));
questionsApiActivity.set("timestamp", this.securityPacket.getString("timestamp"));
@@ -468,7 +464,7 @@ private void setServiceOptions()
for (int i = 0; i < users.Length; i++)
{
string user_id = users[i];
- hashedUsers.set(user_id, Tools.hash(this.algorithm, user_id + this.secret));
+ hashedUsers.set(user_id, Tools.hash(this.algorithm, this.prehashString, user_id + this.secret));
}
this.requestPacket.set("users", hashedUsers);
}
diff --git a/LearnositySDK/Utils/CryptoUtil.cs b/LearnositySDK/Utils/CryptoUtil.cs
index 9b83e99..a4999f7 100755
--- a/LearnositySDK/Utils/CryptoUtil.cs
+++ b/LearnositySDK/Utils/CryptoUtil.cs
@@ -1,4 +1,6 @@
-using System.Security.Cryptography;
+using System;
+using System.Net.Sockets;
+using System.Security.Cryptography;
using System.Text;
namespace LearnositySDK.Utils
@@ -20,6 +22,21 @@ public static string sha256(string s)
return hex(hashBytes);
}
+ ///
+ /// Compute hmac256 hash for string encoded as UTF8
+ ///
+ /// String to be hashed
+ ///String used for encryption
+ /// 64-character hex string
+ public static string hmacsha256(string prehash, string secret)
+ {
+ byte[] keyByte = Encoding.UTF8.GetBytes(secret);
+ byte[] messageBytes = Encoding.UTF8.GetBytes(prehash);
+ var hmacsha256 = new HMACSHA256(keyByte);
+ byte[] hashmessage = hmacsha256.ComputeHash(messageBytes);
+ return hex(hashmessage);
+ }
+
///
/// Convert an array of bytes to a string of hex digits
///
diff --git a/LearnositySDK/Utils/Tools.cs b/LearnositySDK/Utils/Tools.cs
index a5a04e5..5526367 100755
--- a/LearnositySDK/Utils/Tools.cs
+++ b/LearnositySDK/Utils/Tools.cs
@@ -5,6 +5,7 @@
using System.Globalization;
using System.Security.Cryptography;
+
namespace LearnositySDK.Utils
{
public class Tools
@@ -138,22 +139,37 @@ public static string sha256(string str)
return CryptoUtil.sha256(str);
}
+ ///
+ /// Returns HMAC256 hash
+ ///
+ /// String to be hashed
+ ///String used for encryption
+ ///
+ public static string hmacsha256(string prehash, string secret)
+ {
+ return CryptoUtil.hmacsha256(prehash, secret);
+ }
+
///
/// Returns hash
///
- /// Possible algorithms: md5, sha256 (default), sha1
- ///
+ /// Possible algorithms: md5, sha256 (default), sha1, hmac256
+ /// String to be hashed
+ /// String used for encryption
///
- public static string hash(string algorithm, string message)
+ public static string hash(string algorithm, string prehash, string secret)
{
string str = "";
switch (algorithm)
{
+ case "hmac-sha256":
+ str = Tools.hmacsha256(prehash, secret);
+ break;
case "sha256":
// fall through
default:
- str = Tools.sha256(message);
+ str = Tools.sha256(secret);
break;
}
diff --git a/LearnositySDKIntegrationTests/LearnositySDKIntegrationTests.cs b/LearnositySDKIntegrationTests/LearnositySDKIntegrationTests.cs
index ac28403..caf54c7 100644
--- a/LearnositySDKIntegrationTests/LearnositySDKIntegrationTests.cs
+++ b/LearnositySDKIntegrationTests/LearnositySDKIntegrationTests.cs
@@ -83,7 +83,7 @@ public void InitGeneratesExactSameSignature()
// Assert signature is still the same
Assert.Equal(
- "e1eae0b86148df69173cb3b824275ea73c9c93967f7d17d6957fcdd299c8a4fe",
+ "$02$e19c8a62fba81ef6baf2731e2ab0512feaf573ca5ca5929c2ee9a77303d2e197",
init.generateSignature()
);
diff --git a/LearnositySDKUnitTests/InitTests.cs b/LearnositySDKUnitTests/InitTests.cs
index e22be66..53661b8 100644
--- a/LearnositySDKUnitTests/InitTests.cs
+++ b/LearnositySDKUnitTests/InitTests.cs
@@ -48,11 +48,11 @@ public void testGenerateSignatureStringRequests()
private Dictionary getInitTestCases() {
return new Dictionary
{
- { "assess", "03f4869659eeaca81077785135d5157874f4800e57752bf507891bf39c4d4a90" },
- { "author", "108b985a4db36ef03905572943a514fc02ed7cc6b700926183df7babc2cd1c96" },
- { "items", "dd6bf2a5fd28c9935acef5e2918a1069269154414c19ab346d476c363a7a964c" },
- { "questions", "03f4869659eeaca81077785135d5157874f4800e57752bf507891bf39c4d4a90" },
- { "reports", "91085beccf57bf0df77c89df94d1055e631b36bc11941e61460b445b4ed774bc" },
+ { "assess", "$02$8de51b7601f606a7f32665541026580d09616028dde9a929ce81cf2e88f56eb8" },
+ { "author", "$02$ca2769c4be77037cf22e0f7a2291fe48c470ac6db2f45520a259907370eff861" },
+ { "items", "$02$78ef0334e708829bd3c92decc040f91c8433b07ba32cc9198705a18c36c2ea54" },
+ { "questions", "$02$8de51b7601f606a7f32665541026580d09616028dde9a929ce81cf2e88f56eb8" },
+ { "reports", "$02$8e0069e7aa8058b47509f35be236c53fa1a878c64b12589fd42f48b568f6ac84" },
};
}
@@ -60,7 +60,7 @@ private Dictionary getInitTestCases() {
public void testGenerateJsonDataApiGetRequest()
{
Init init = TestRequest.getTestRequestFor("data", "get").getJsonInit();
- string expectedSignature = "e1eae0b86148df69173cb3b824275ea73c9c93967f7d17d6957fcdd299c8a4fe";
+ string expectedSignature = "%2402%24e19c8a62fba81ef6baf2731e2ab0512feaf573ca5ca5929c2ee9a77303d2e197";
Assert.AreEqual(
@@ -73,7 +73,7 @@ public void testGenerateJsonDataApiGetRequest()
public void testGenerateJsonDataApiPostRequest()
{
Init init = TestRequest.getTestRequestFor("data", "post").getJsonInit();
- string expectedSignature = "18e5416041a13f95681f747222ca7bdaaebde057f4f222083881cd0ad6282c38";
+ string expectedSignature = "%2402%249d1971fb9ac51482f7e73dcf87fc029d4a3dfffa05314f71af9d89fb3c2bcf16";
Assert.AreEqual(
"security=%7b%22consumer_key%22%3a%22yis0TYCu7U9V4o7M%22%2c%22domain%22%3a%22localhost%22%2c%22timestamp%22%3a%2220140626-0528%22%2c%22signature%22%3a%22" + expectedSignature + "%22%7d&request=%7b%22limit%22%3a100%7d&action=post",
diff --git a/docs/images/image-quickstart-index.png b/docs/images/image-quickstart-index.png
new file mode 100644
index 0000000000000000000000000000000000000000..eab132909c628b0176f9389ab77e5cb1f2be76eb
GIT binary patch
literal 1149524
zcmZU)2V4`&_Xi51A|N15l->jp>C#K235Yc5Qi9TZlU^dyyEIWL0R=$;K@dkV?+FMl
zS6{h|Z<*?rxlKTD)yY9gNk?5tiA~4T&DO!$hJZjVCf$hGSg-4Pj_G4{d%}zP;j>hq
z2=l{#Ur-Z#negf&^}~1)g|c%{_l
z=^*dc4Vt_I`7dE&30bS%e=ApXD%$|%kv03=%6!7)3j*qf&RG?s*I?Jk^u37*3Sw!K
zdG7=chYPMYo)Qv8&s?ngZ6B@4Mv<}9(Oz_9GO^$;(CS{3o7xsJZ5>U{o+FqRb?cLh
zcsDoK=it1f2@wj@Qb
z_E#Tp%%p1L(As*D@F=+`9?7tvoX5qX+?GUV)6+~da%^*HKQ!oT0*A1KVZsSrYzn8r
zQIi(RABSo&EALSxk+FH9dYhF_^i|yb8w?-2nF9sV^0_|w%d3$oQ5!gUe7*;X0W(1?~>R#D%m@^fUL&bkvKYx?8{yd;)Juy0wVt$3j+iSBy9B2
zrnL+|=LAO{NzM`8>?Bm2dp~-$L~RqE+~`Do`!ei4*TwxNZ+2XzqRz!5=;f-<#blj3
zaQ+QwGI5Tg8Nqu6d2Hz#^w!P8*Q7c36VR-){_cBE>oD%OSHb#_`)8Uhk?(F)JrJHt
z{v>9pew8zlnlolznRxmJWh)MK!;d_&h1qVtfyh6ol1KK|H!2pYFEo=RH63vp)(~YW
z>TgPbyElJDL)j%)GO7B#YqA6tO19Gk5|;(O^BlIchvnJ{7A+So8X87mh)$3q=pBcm
z?c1)jX(Hj&kG_H)1s^|r9Ak^C7)6e$(m9P<)=PznLQYqMjDiX4R6+Zg-i~7{yRS6k
z{#!z$1aHQLOQ@Wh5^tmCb^-`?rF79eQW_hL3j)H%HfxO~j0DXPFhr
z`el&}@``vQ7QO0
qY@%AY-Cwkq^JvpT)F&|
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