@kumologica/sdk 3.3.0-beta9 → 3.4.0-beta3

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.
Files changed (60) hide show
  1. package/cli/commands/open.js +6 -7
  2. package/cli/commands/test-commands/TestSuiteRunner.js +75 -0
  3. package/cli/commands/test-commands/lib/TestCaseRunner.js +105 -0
  4. package/cli/commands/test-commands/lib/index.js +12 -0
  5. package/cli/commands/test-commands/lib/reporters/index.js +120 -0
  6. package/cli/commands/test.js +92 -120
  7. package/package.json +4 -5
  8. package/src/app/lib/stores/store.js +15 -1
  9. package/src/app/lib/stores/user-preference-store.js +2 -0
  10. package/src/app/lib/stores/workspace-preference-store.js +42 -0
  11. package/src/app/main-process/editor-manager.js +11 -51
  12. package/src/app/main-process/main-window.js +10 -0
  13. package/src/app/main-process/menu.js +4 -2
  14. package/src/app/main-process/modal-home.js +5 -7
  15. package/src/app/main-process/modal-newproject.js +4 -6
  16. package/src/app/main-process/modal-newtab.js +4 -6
  17. package/src/app/main-process/modal-nodelibrary.js +4 -6
  18. package/src/app/main-process/modal-welcome.js +5 -8
  19. package/src/app/main.js +3 -1
  20. package/src/app/preload.js +28 -4
  21. package/src/app/ui/editor-api/lib/index.js +6 -9
  22. package/src/app/ui/editor-client/public/red/red.js +434 -176
  23. package/src/app/ui/editor-client/public/red/red.min.js +3 -3
  24. package/src/app/ui/editor-client/public/red/style.min.css +1 -1
  25. package/src/app/ui/editor-client/public/vendor/vendor.css +21 -1
  26. package/src/app/ui/editor-client/src/js/red.js +1 -1
  27. package/src/app/ui/editor-client/src/js/ui/clipboard.js +8 -0
  28. package/src/app/ui/editor-client/src/js/ui/header.js +2 -40
  29. package/src/app/ui/editor-client/src/js/ui/palette-explorer.js +328 -0
  30. package/src/app/ui/editor-client/src/js/ui/palette.js +10 -8
  31. package/src/app/ui/editor-client/src/js/ui/project-info.js +10 -8
  32. package/src/app/ui/editor-client/src/js/ui/search.js +147 -44
  33. package/src/app/ui/editor-client/src/js/ui/ui-settings.js +1 -1
  34. package/src/app/ui/editor-client/src/js/ui/view.js +2 -5
  35. package/src/app/ui/editor-client/src/js/validators.js +2 -2
  36. package/src/app/ui/editor-client/src/sass/dropdownMenu.scss +1 -1
  37. package/src/app/ui/editor-client/src/sass/editor.scss +1 -0
  38. package/src/app/ui/editor-client/src/sass/header.scss +16 -7
  39. package/src/app/ui/editor-client/src/sass/palette.scss +46 -5
  40. package/src/app/ui/editor-client/src/sass/project-info.scss +4 -3
  41. package/src/app/ui/editor-client/src/sass/search.scss +49 -21
  42. package/src/app/ui/editor-client/src/sass/style.scss +1 -0
  43. package/src/app/ui/editor-client/src/sass/ui/common/editableList.scss +3 -3
  44. package/src/app/ui/editor-client/src/sass/ui/common/searchBox.scss +1 -2
  45. package/src/app/ui/editor-client/src/sass/ui-settings.scss +5 -3
  46. package/src/app/ui/editor-client/src/vendor/jqtree/jqtree.css +21 -1
  47. package/src/app/ui/editor-client/templates/index.mst +89 -79
  48. package/src/server/DesignerServer.js +161 -0
  49. package/src/server/certificate.pem +23 -0
  50. package/src/server/private-key.pem +28 -0
  51. package/cli/commands/test-utils/TestSuiteController.js +0 -363
  52. package/cli/commands/test-utils/TestSuiteController.test.js +0 -171
  53. package/cli/commands/test-utils/util/output.js +0 -14
  54. package/cli/commands/test-utils/util/updates/index.js +0 -17
  55. package/cli/commands/test-utils/util/updates/pkg.js +0 -13
  56. package/cli/commands/test-utils/util/updates/templates/default-settings.js +0 -209
  57. package/src/app/ui/editor-client/src/js/ui/palette-navigator.js +0 -144
  58. /package/cli/commands/{test-utils → test-commands/lib}/fixtures/example3-flow.json +0 -0
  59. /package/cli/commands/{test-utils → test-commands/lib}/fixtures/package.json +0 -0
  60. /package/cli/commands/{test-utils → test-commands/lib}/fixtures/s3-event.js +0 -0
@@ -20,8 +20,7 @@
20
20
  }
21
21
 
22
22
  .red-ui-searchBox-container {
23
- border-radius: 5px;
24
- border: 1px solid #d1cece;
23
+ border-radius: 3px;
25
24
  position: relative;
26
25
  i {
27
26
  font-size: 15px;
@@ -20,11 +20,13 @@
20
20
  position: absolute;
21
21
  width: 950px;
22
22
  background: #ecebeb;
23
- left: 36%;
24
- margin-left: -250px;
25
- top: 0px;
23
+ left: 50%;
24
+ margin-left: -360px;
25
+ top: -36px;
26
26
  border: 1px solid $primary-border-color;
27
+ border-radius: 6px;
27
28
  box-shadow: 0 0 10px rgba(0, 0, 0, 0.4);
29
+
28
30
  }
29
31
 
30
32
  .option {
@@ -47,6 +47,9 @@ ul.jqtree-tree {
47
47
 
48
48
  ul.jqtree-tree .jqtree-toggler.jqtree-toggler-left {
49
49
  margin-right: 0.5em;
50
+ margin-left: 1em;
51
+ color: grey;
52
+ font-size: smaller;
50
53
  }
51
54
 
52
55
  ul.jqtree-tree .jqtree-toggler.jqtree-toggler-right {
@@ -68,10 +71,27 @@ ul.jqtree-tree {
68
71
  ul.jqtree-tree .jqtree-title-button-left {
69
72
  margin-left: 1.5em;
70
73
  }
71
-
74
+ .jqtree-title-emptyfolder {
75
+ width: 100%;
76
+ margin-left: 2.5em !important;
77
+ color: #605d5d !important;
78
+ text-transform: uppercase;
79
+ font-weight: bold;
80
+ letter-spacing: 0.02em;
81
+ font-size: smaller;
82
+ overflow: hidden;
83
+ user-select: none;
84
+ }
72
85
  ul.jqtree-tree .jqtree-title-button-left.jqtree-title-folder {
73
86
  width: 100%;
74
87
  margin-left: 0;
88
+ color: #605d5d;
89
+ text-transform: uppercase;
90
+ font-weight: bold;
91
+ letter-spacing: 0.02em;
92
+ font-size: smaller;
93
+ overflow: hidden;
94
+ user-select: none;
75
95
  }
76
96
 
77
97
  ul.jqtree-tree li.jqtree-folder {
@@ -58,62 +58,33 @@
58
58
 
59
59
  <!-- project information -->
60
60
  <div id="right" class="left-shadow">
61
-
62
- <!-- welcome button -->
63
- <div id="btn-welcome" class="header-btn" style="margin: 0px 100px 0 20px">
64
- <i class="icofont-home" style="font-size:18px;"></i></span>
65
- </div>
66
-
67
- <!-- search button -->
68
- <div id="btn-search" class="header-btn">
69
- <i class="icofont-search-folder" style="font-size:18px"></i>
70
- </div>
71
-
72
- <div class="header-btn-separator"></div>
73
- <!-- import / export -->
74
- <div id="import-btn" class="header-btn">
75
- <i class="icofont-download" style="font-size:17px;"></i></span>
76
- </div>
77
-
78
- <div class="header-btn-separator"></div>
79
-
80
- <div id="export-btn" class="header-btn" style="margin-right: 100px">
81
- <i class="icofont-upload-alt" style="font-size:17px;"></i></span>
82
- </div>
83
-
84
- <div id="btn-settings" class="header-btn" style="margin-right:5px">
85
- <i class="icofont-settings" style="font-size:17px;"></i></span>
86
- </div>
87
-
88
61
  <!-- check project information when server running -->
89
62
  <div id="projectIndicator" style="text-align: center;">
90
63
  <div id="projectInformation">
64
+ <i class="fa fa-search"></i>
91
65
  <span id="project-title">Initializing...</span>
92
- <!-- <div style="justify-content: center;margin-top: -5px;">
93
- <i id="project-status-color" class="fa fa-circle" style="font-size: 8px;margin-right: 2px; display: none"></i>
94
- <span class="project-status"> </span>
95
- </div> -->
96
66
  </div>
97
67
  <!-- check project information when server is deploying new flow version -->
98
68
  <div id="projectDeployingInformation" style="height: 100%; padding-top: 3px">
99
- <div style="width: 40%; text-align: end;">
69
+ <span style="display: flex; width: 100%; justify-content: center; font-size:13px">
70
+ <div style="margin-top: -1px; margin-right: 5px">
100
71
  <i class="fa fa-circle-o-notch fa-spin fa-3x fa-fw" style="font-size: 11px;"></i>
101
72
  <span class="sr-only"></span>
102
73
  </div>
103
- <span style="width: 55%; padding-left:3px; text-align:start;font-size:13px">Deploying...</span>
74
+ Deploying...
75
+ </span>
104
76
  </div>
105
77
 
106
78
  <div class="progressbarWrapper">
107
79
  <div class="progressbar"></div>
108
80
  </div>
109
- </div>
110
- <div id="projectInfoExpand" style="position: relative; top: 3px; left: -19px; color: #ecebeb">
111
- <i class="fa fa-caret-down"></i>
112
- </div>
113
- <div class="btn-aux">
114
- <div id="btn-deploy" class="header-btn" style="display:none">
115
- <i class="icofont-save" style="font-size:15px"></i>
116
- </div>
81
+
82
+ <div class="btn-aux">
83
+ <div id="btn-deploy" class="header-btn" style="display:none">
84
+ <i class="icofont-save" style="font-size:15px"></i>
85
+ </div>
86
+ </div>
87
+
117
88
  </div>
118
89
 
119
90
  <!-- for the time being, keep it here, as it plays an important role in orchestrating some actions like palette and sidebars
@@ -126,6 +97,82 @@
126
97
  </div>
127
98
 
128
99
  <div id="main-container" class="hide">
100
+
101
+ <div id="palette">
102
+ <img src="red/images/spin.svg" class="palette-spinner hide"/>
103
+ <div id="palette-options">
104
+ <div id="palette-option-nodes">
105
+ <a id="palette-option-nodes-a" class="palette-option-button-selected" href="#">
106
+ <span>Nodes</span>
107
+ </a>
108
+ <a id="palette-option-projectnav-a" class="palette-option-button" href="#" style="display:none">
109
+ <span>Navigator</span>
110
+ </a>
111
+ <a id="palette-option-explorer-a" class="palette-option-button" href="#">
112
+ <span>Explorer</span>
113
+ </a>
114
+
115
+ </div>
116
+ </div>
117
+
118
+ <!-- EXPLORER -->
119
+ <div id="palette-explorer" style="display:none">
120
+ <!-- a. Current Project -->
121
+ <div id="palette-explorer-top">
122
+ <div id="exp-open-project">
123
+ <!-- controlled by palette-explorer -->
124
+ </div>
125
+
126
+ <div id="exp-open-project-createTab">
127
+ <!-- controlled by palette-explorer -->
128
+ </div>
129
+
130
+ <ul id="palette-explorer-context-menu" class="jqtree-contextmenu dropdown-menu">
131
+ <li data-item="open"><a>Open in Editor...</a></li>
132
+ <li class="context-menu-item context-menu-separator context-menu-not-selectable"></li>
133
+ <li data-item="delete"><a>Delete</a></li>
134
+ </ul>
135
+ </div>
136
+
137
+
138
+ <!-- b. Projects in Workspace -->
139
+ <div id="palette-explorer-bottom">
140
+ <div id="exp-workspace">
141
+ <!-- controlled by palette-explorer -->
142
+ </div>
143
+
144
+ <div id="exp-workspace-addFolder">
145
+ <!-- controlled by palette-explorer -->
146
+ </div>
147
+
148
+ <ul id="palette-workspace-context-menu" class="jqtree-contextmenu dropdown-menu">
149
+ <li data-item="open"><a>Open</a></li>
150
+ <li data-item="openLocation"><a>Open Location...</a></li>
151
+ <li class="context-menu-item context-menu-separator context-menu-not-selectable"></li>
152
+ <li data-item="removeFromWorkspace"><a>Remove from workspace</a></li>
153
+ </ul>
154
+ </div>
155
+
156
+ </div>
157
+
158
+ <!-- NODES -->
159
+ <div id="palette-nodes">
160
+ <div id="palette-search" class="palette-search hide">
161
+ <input type="text" placeholder="Filter nodes"></input>
162
+ </div>
163
+ <div id="palette-container" class="palette-scroll hide"></div>
164
+
165
+ <div id="palette-footer" style="display:flex; height: 40px; border:none; justify-content: center; overflow: hidden;">
166
+ <div style="display: flex; width:90%;height: 32px; padding-top:3px;">
167
+ <a id="launch-node-library" class="sidebar-header-button" style="padding: 8px 20px; width: 100%;" href="#">
168
+ <i class="fa fa-plus" style="margin-right:3px; font-size: 11px"></i>
169
+ Add more nodes
170
+ </a>
171
+ </div>
172
+ </div>
173
+ </div>
174
+ <div id="palette-shade" class="hide"></div>
175
+ </div>
129
176
 
130
177
  <div id="workspace" class="left-shadow">
131
178
  <ul id="workspace-tabs"></ul>
@@ -190,44 +237,7 @@
190
237
 
191
238
  <!-- <div id="editor-stack"></div> -->
192
239
 
193
- <div id="palette">
194
- <img src="red/images/spin.svg" class="palette-spinner hide"/>
195
- <div id="palette-options">
196
- <div id="palette-option-nodes">
197
- <a id="palette-option-nodes-a" class="palette-option-button-selected" href="#">
198
- <span>Nodes</span>
199
- </a>
200
- <a id="palette-option-projectnav-a" class="palette-option-button" href="#">
201
- <span>Navigator</span>
202
- </a>
203
- </div>
204
- </div>
205
- <div id="palette-projectnav" style="display: none">
206
- <div id="projectnav"></div>
207
- <div id="projectbtnnav"></div>
208
- <ul id="palette-context-menu" class="jqtree-contextmenu dropdown-menu">
209
- <li data-item="open"><a>Open in Workspace</a></li>
210
- <li class="context-menu-item context-menu-separator context-menu-not-selectable"></li>
211
- <li data-item="delete"><a>Delete</a></li>
212
- </ul>
213
- </div>
214
- <div id="palette-nodes">
215
- <div id="palette-search" class="palette-search hide">
216
- <input type="text" placeholder="Filter nodes"></input>
217
- </div>
218
- <div id="palette-container" class="palette-scroll hide"></div>
219
-
220
- <div id="palette-footer" style="display:flex; height: 40px; border:none; justify-content: center; overflow: hidden;">
221
- <div style="display: flex; width:90%;height: 32px; padding-top:3px;">
222
- <a id="launch-node-library" class="sidebar-header-button" style="padding: 8px 20px; width: 100%;" href="#">
223
- <i class="fa fa-plus" style="margin-right:3px; font-size: 11px"></i>
224
- Add more nodes
225
- </a>
226
- </div>
227
- </div>
228
- </div>
229
- <div id="palette-shade" class="hide"></div>
230
- </div>
240
+
231
241
 
232
242
 
233
243
  <div id="sidebar">
@@ -0,0 +1,161 @@
1
+ const {
2
+ AbstractServerfulServer,
3
+ ConfigBuilder,
4
+ PLATFORMS
5
+ } = require('@kumologica/runtime');
6
+ const tcpPortUsed = require('tcp-port-used');
7
+
8
+ /**
9
+ * This class will encapsulate the adminApp and FlowApp into two servers.
10
+ * It will be the one running on the development box of the user (either local or remote),
11
+ * and it will serve all the functioanlity to the Kumologica Cloud Editor.
12
+ */
13
+
14
+ class DesignerServer {
15
+
16
+ /**
17
+ * @param {Object} options - Configuration options.
18
+ * @param {string} options.flowPath - The path of the flow.
19
+ * @param {boolean} options.safe - A boolean indicating safety.
20
+ * @param {Object} options.cliParams - Command line parameters as an object.
21
+ * @param {Object} options.editorApi - API object for the editor.
22
+ * @param {Object} options.startupEmitter - EventEmitter object for handling events.
23
+ */
24
+ constructor(options) {
25
+
26
+ if (!options.flowPath) {
27
+ console.log(
28
+ '[ERROR] Flow is not defined. Make sure you pass the flow file to the constructor of FlowBuilder'
29
+ );
30
+ os.exit(1);
31
+ }
32
+
33
+ this.editorApi = options.editorApi;
34
+ this.startupEmitter = options.startupEmitter;
35
+
36
+ this.config = ConfigBuilder.getInstance().buildConfig(
37
+ options.flowPath,
38
+ PLATFORMS.LOCAL,
39
+ options.cliParams
40
+ );
41
+ }
42
+
43
+ async start() {
44
+ // Check if port passed by parameter is available otherwise allocate a new one
45
+ this.config.port = await this.allocatePort(this.config.port);
46
+ this.flowServer = new AbstractServerfulServer(this.config, this.editorApi, this.startupEmitter);
47
+
48
+ await this.flowServer.start();
49
+ this.flowServer.log.debug(`Runtime Configuration:${JSON.stringify(this.config, null, 2)}`);
50
+ }
51
+
52
+ async allocatePort(port) {
53
+ let inUse = await tcpPortUsed.check(port);
54
+ if (inUse){
55
+ let newPort = port + 1;
56
+ console.log(`> Port: ${port} in use. Trying with port: ${newPort}...`);
57
+ return await this.allocatePort(newPort);
58
+ } else{
59
+ return port;
60
+ }
61
+ }
62
+
63
+ getListeningPort() {
64
+ return this.flowServer.serverSettings.port;
65
+ }
66
+
67
+ async stop() {
68
+ await this.flowServer.stop();
69
+ }
70
+
71
+ /**
72
+ * The express application for HTTP Nodes
73
+ */
74
+ get httpNode() {
75
+ return this.flowServer.httpNode.expressApp;
76
+ }
77
+
78
+
79
+
80
+ /**
81
+ * Pointer to the internal HTTP Server upon which all the express applications (Nodes and Admin) are deployed upon
82
+ *
83
+ * @readonly
84
+ */
85
+ get server() {
86
+ return this.flowServer.server;
87
+ }
88
+
89
+ /**
90
+ * Access to internal runtime api
91
+ */
92
+ get runtime() {
93
+ return this.flowServer.runtime;
94
+ }
95
+
96
+
97
+
98
+ /**
99
+ *
100
+ * Returns the version of the runtime lib used internally
101
+ * @readonly
102
+ * @static
103
+ */
104
+ static get version() {
105
+ return AbstractServerfulServer.version;
106
+ }
107
+
108
+ /**
109
+ * This provides access to the internal settings module of the
110
+ * runtime.
111
+ * This is the object derived from the server settings.
112
+ */
113
+ get settings() {
114
+ return this.flowServer._.settings;
115
+ }
116
+
117
+ /**
118
+ * EventEmitter use to publish and subscribe to internal runtime events
119
+ * For example:
120
+ * runtime.events.on(
121
+ * 'runtime-event',
122
+ * (flowStarted = async data => {
123
+ * if (data.id === 'flow-started') {
124
+ * runtime.events.removeListener('runtime-event', flowStarted);
125
+ *
126
+ * @readonly
127
+ */
128
+ get events() {
129
+ return this.flowServer.events;
130
+ }
131
+
132
+ get eventTypes() {
133
+ return this.flowServer.runtimeEventTypes;
134
+ }
135
+
136
+ /**
137
+ * This provides access to the internal nodes module of the
138
+ * runtime. The details of this API remain undocumented as they should not
139
+ * be used directly.
140
+ *
141
+ * Most administrative actions should be performed use the runtime api
142
+ * under [node.runtime]
143
+ */
144
+ get nodes() {
145
+ return this.flowServer._.nodes;
146
+ }
147
+
148
+ get log() {
149
+ return this.flowServer.log;
150
+ }
151
+
152
+ get util() {
153
+ return this.flowServer.util;
154
+ }
155
+
156
+
157
+ }
158
+
159
+ module.exports = {
160
+ DesignerServer,
161
+ };
@@ -0,0 +1,23 @@
1
+ -----BEGIN CERTIFICATE-----
2
+ MIIDzTCCArWgAwIBAgIUXLMSHyKFumGMi8osuoeVxSE3LuowDQYJKoZIhvcNAQEL
3
+ BQAwdjELMAkGA1UEBhMCQVUxDDAKBgNVBAgMA05TVzEPMA0GA1UEBwwGU3lkbmV5
4
+ MRswGQYDVQQKDBJLdW1vbG9naWNhIFB0eSBMdGQxEzARBgNVBAsMCkt1bW9sb2dp
5
+ Y2ExFjAUBgNVBAMMDUROUzpsb2NhbGhvc3QwHhcNMjMxMDA5MjEzNTU0WhcNMjQx
6
+ MDA4MjEzNTU0WjB2MQswCQYDVQQGEwJBVTEMMAoGA1UECAwDTlNXMQ8wDQYDVQQH
7
+ DAZTeWRuZXkxGzAZBgNVBAoMEkt1bW9sb2dpY2EgUHR5IEx0ZDETMBEGA1UECwwK
8
+ S3Vtb2xvZ2ljYTEWMBQGA1UEAwwNRE5TOmxvY2FsaG9zdDCCASIwDQYJKoZIhvcN
9
+ AQEBBQADggEPADCCAQoCggEBAM3wwlHZnTwtnA28bTbrKGW7SZQrldOe621AOrpK
10
+ dWQ1E7DeRWn6Pu/HZNSMPs44CgwJE+WTFSd+Hezq9Rs6ek366z2pw2MlugFqsl4u
11
+ UxVqU9qfBuhvN9CNhXUKZ215hbdldRcOBdWpMz/SFbwJ9kQbqSP9OfVj7Nfy1Qtf
12
+ jYco6UAUPpSHoP6r7IZUavaBb0CrKB1owxdWm3Gz8OfcMJ7i7QdoSfeXzd3/+xTc
13
+ IIad/Bc8eHTenkXc1T3yTIoHzDnXSeSrO46PqfjU094Jbh30BkHFTpeAx6p/Zg4d
14
+ kJjn1KF7Kdf+rHwFpPI4HDjny0kCP/YWAPydOHpin1+DbKECAwEAAaNTMFEwHQYD
15
+ VR0OBBYEFKxX7B5kDPPQnWiq05Mw7q6jOKa/MB8GA1UdIwQYMBaAFKxX7B5kDPPQ
16
+ nWiq05Mw7q6jOKa/MA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQELBQADggEB
17
+ AKWZmO+uOa3pH+xPY7aTppwlCW37UhjSO3kxNpEd38iFAHhP8N2kaMVKtpmSAgoH
18
+ hcTvptU9OIlVOzmcL15rt450tGl4K2MnoVFm7f4X4LjHrYuUccI3pNzR75OXlxZm
19
+ wsBHkZf/u0Yzq1xnUeyILZckF73JfmF4PN+NhU0YusSo3QechKPSgyWxMPTjoXk4
20
+ zZ/iiyz+xAQZKpgaI7RArC6FXsYCqKY7nzcK6JGfS+zj8tCWCL+bCgffyzS4Q2JA
21
+ q79RRvwObrNMIk3XN6TchUKqQCL5NGUYV9g+FR7nc5BfowR+96J3I3Z35uIM/wgO
22
+ 36aBP9gSmkL9p4bPiqdefjI=
23
+ -----END CERTIFICATE-----
@@ -0,0 +1,28 @@
1
+ -----BEGIN PRIVATE KEY-----
2
+ MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQDN8MJR2Z08LZwN
3
+ vG026yhlu0mUK5XTnuttQDq6SnVkNROw3kVp+j7vx2TUjD7OOAoMCRPlkxUnfh3s
4
+ 6vUbOnpN+us9qcNjJboBarJeLlMValPanwbobzfQjYV1CmdteYW3ZXUXDgXVqTM/
5
+ 0hW8CfZEG6kj/Tn1Y+zX8tULX42HKOlAFD6Uh6D+q+yGVGr2gW9AqygdaMMXVptx
6
+ s/Dn3DCe4u0HaEn3l83d//sU3CCGnfwXPHh03p5F3NU98kyKB8w510nkqzuOj6n4
7
+ 1NPeCW4d9AZBxU6XgMeqf2YOHZCY59SheynX/qx8BaTyOBw458tJAj/2FgD8nTh6
8
+ Yp9fg2yhAgMBAAECggEAFQDlEKv9GVIdhFkfWmaJbDa5vl7jnP2sTSwr0Swe5OV0
9
+ 6KkCs1hOau4PHo5fKXEVtTyHxvZFRg3ax3r/HJPOPX3F2DgkMUx7uAFFx805tAlw
10
+ G+/0KGiPbLnCTrmM6uFl/dpfIsbPWYc0LuIiTVdGwpN/oKgG7TwPv8aIa+yG5q3a
11
+ ok6D658isEIIvzNuP7SyF5ZLJb7p0IvZygAiQoASKYjapwwyqbRIGECTLUDl7tcK
12
+ Mn5VkIfILqs6ajzaNEweEk0NK7SOQ1zkgH7gchdoDTP/gVc5oC+wKakRKSsZpqvm
13
+ SX7pv17kmZCKj4VwrqFqN66NGilF4GUxkmHSvmwRQQKBgQDrjNHP6HPnGtWUJjwj
14
+ AAkH1Yq37Mvt93wOjjkMXY6srIf+hm2IkxvnQFDleEg0sP/MfoEhnoJdarzV+2Yi
15
+ ddhhm+cWr9oFnTrPOq5qLrL9yQGgU8JjVTp9hRrjWt2fCKKKNSnd29LXbG0Zol1n
16
+ hscenRsuZ/Y+wASBBIZeBPt1VQKBgQDf0dsWzkb10KjOSxlzgU+8lnfPyUaYyJ5A
17
+ rSxKUYdmeHHAZNWdeHDNKf2y4TWUhP8fc6L6WNYssVLRjLml+Zen9Uv88aYV7Toz
18
+ 2lzqpMW7/XeA14oVGwEuq9tJeGkL/+UyUSenqlZFL+Cyh3dsYcUHBLrqnVpu+/sm
19
+ ZQgHIKqaHQKBgQCXryAxjZSNn1coRxL0ywIFvHrPBDsyq+uEiAuurdTB13zf5/tD
20
+ NtCCM4Wkr7d3zv961YAcgTGcLK8b8P+Nc2v7N2Ux095HPT/w0O4eTKJREY7tiuKk
21
+ Cu9Wg0+UVyBeWDYrYB7s0rFMrnL3TfpuP3mcejlVwfbt48NCvgI1K2ou3QKBgH7J
22
+ vWd04MO9OPLrnfZNiWLWhfaCGWjRNLyEnPNYrfABSMbpGA1FPfkq0Vl0tEp28KLb
23
+ ebaBfooAxV6Jbl00P5HYpfwa06/WG8Nl7n7Jam3szraA4urDym6q0eUTvcYbZrWT
24
+ PXiASLCWx526mY8e72LjbhMboi/+tC3yy5JmEd6NAoGAawp26rHYwisiFaxt45Np
25
+ Vbi4iIbjlwBvqcXww3oRTkJjB9CBniUzEYi1VQwqwrS3EMb8jsmpitAmn8sY33qL
26
+ WHS4Ms/AQx5C1eVBPcmeHRScFOD/983zJ0Dqw/eIxKDu7Ay81yDc83vCApcuAeuH
27
+ SHQhAebA262hZ4WmfytL9Tc=
28
+ -----END PRIVATE KEY-----