@cloudea/yang-editor 1.0.5 → 1.0.7

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.
package/dist/utils.js CHANGED
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.SelectionUtils = void 0;
3
+ exports.FormatCleaner = exports.SelectionUtils = void 0;
4
4
  const componets_1 = require("./componets");
5
5
  class SelectionUtils {
6
6
  constructor(element) {
@@ -34,4 +34,87 @@ class SelectionUtils {
34
34
  }
35
35
  }
36
36
  exports.SelectionUtils = SelectionUtils;
37
+ /**
38
+ * utils for format cleaning
39
+ */
40
+ class FormatCleaner {
41
+ /**
42
+ * clean HTML string and return plain text
43
+ * @param htmlString html string
44
+ * @returns plain text
45
+ */
46
+ static cleanHTMLString(htmlString) {
47
+ // remove Word XML namespace labels
48
+ htmlString = htmlString.replace(/<\/?[ovwm]:[^>]*>/gi, '');
49
+ // remove Word conditional comments
50
+ htmlString = htmlString.replace(/<!--\[if[\s\S]*?<!\[endif\]-->/gi, '');
51
+ htmlString = htmlString.replace(/<!--[\s\S]*?-->/g, '');
52
+ const tempDiv = document.createElement('div');
53
+ tempDiv.innerHTML = htmlString;
54
+ // remove all <style> tags (including @page, @font-face rules)
55
+ const styleTags = tempDiv.querySelectorAll('style');
56
+ styleTags.forEach(style => style.remove());
57
+ // remove other unwanted tags
58
+ FormatCleaner.unwantedTags.forEach(tag => {
59
+ const elements = tempDiv.querySelectorAll(tag);
60
+ elements.forEach(el => el.remove());
61
+ });
62
+ return this.extractPlainText(tempDiv);
63
+ }
64
+ /**
65
+ * extract plain text from node, remove all HTML tags and styles
66
+ * @param node DOM node
67
+ * @returns plain text content
68
+ */
69
+ static extractPlainText(node) {
70
+ if (node.nodeType === Node.TEXT_NODE) {
71
+ return node.textContent || '';
72
+ }
73
+ else if (node.nodeType === Node.ELEMENT_NODE) {
74
+ const element = node;
75
+ const tagName = element.tagName.toLowerCase();
76
+ if (FormatCleaner.unwantedTags.includes(tagName)) {
77
+ return '';
78
+ }
79
+ if (tagName === 'br') {
80
+ return '\n';
81
+ }
82
+ // block elements(p、div etc.)
83
+ const isBlock = ['p', 'div', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6',
84
+ 'li', 'tr', 'td', 'th', 'blockquote', 'pre'].includes(tagName);
85
+ let result = '';
86
+ for (let child of Array.from(element.childNodes)) {
87
+ result += this.extractPlainText(child);
88
+ }
89
+ if (isBlock && result.trim()) {
90
+ result += '\n';
91
+ }
92
+ return result;
93
+ }
94
+ return '';
95
+ }
96
+ /**
97
+ * remove all styles and other properties
98
+ * @param element HTML element
99
+ */
100
+ static removeAllStyles(element) {
101
+ // remove style attribute
102
+ element.removeAttribute('style');
103
+ // remove common format attributes
104
+ const formatAttributes = ['class', 'align', 'valign', 'bgcolor', 'color',
105
+ 'face', 'size', 'width', 'height', 'border',
106
+ 'cellpadding', 'cellspacing', 'dir'];
107
+ formatAttributes.forEach(attr => {
108
+ if (element.hasAttribute(attr)) {
109
+ element.removeAttribute(attr);
110
+ }
111
+ });
112
+ // recursively process child elements
113
+ for (let child of Array.from(element.children)) {
114
+ this.removeAllStyles(child);
115
+ }
116
+ }
117
+ }
118
+ exports.FormatCleaner = FormatCleaner;
119
+ FormatCleaner.unwantedTags = ['style', 'script', 'link', 'meta', 'head', 'title', 'xml'];
37
120
  //# sourceMappingURL=utils.js.map
package/dist/utils.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"utils.js","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":";;;AAAA,2CAA+C;AAE/C,MAAa,cAAc;IAIvB,YAAY,OAAoB;QAC5B,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;IAC3B,CAAC;IAEM,oBAAoB;QACvB,IAAI,KAAK,GAAG,IAAI,CAAC,iBAAiB,EAAE,CAAC;QACrC,IAAG,KAAK,EAAE,CAAC;YACP,IAAI,IAAI,GAAG,KAAK,CAAC,cAAc,CAAC;YAChC,OAAM,IAAI,IAAI,IAAI,KAAK,IAAI,CAAC,OAAO,EAAE,CAAC;gBAClC,IAAG,IAAI,CAAC,QAAQ,KAAK,IAAI,CAAC,YAAY,EAAE,CAAC;oBACrC,IAAI,IAAI,GAAG,IAAmB,CAAC;oBAC/B,IAAG,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,4BAAgB,CAAC,eAAe,CAAC,EAAE,CAAC;wBAC3D,OAAO,IAAI,CAAC;oBAChB,CAAC;gBACL,CAAC;gBACD,IAAI,GAAG,IAAI,CAAC,UAAkB,CAAC;YACnC,CAAC;QACL,CAAC;QACD,OAAO,IAAI,CAAC;IAChB,CAAC;IAEM,iBAAiB;QACpB,IAAI,SAAS,GAAG,MAAM,CAAC,YAAY,EAAE,CAAC;QACtC,IAAG,SAAS,IAAI,SAAS,CAAC,UAAU,GAAG,CAAC,EAAE,CAAC;YACvC,IAAI,KAAK,GAAG,SAAS,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;YACpC,IAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,uBAAuB,CAAC,EAAE,CAAC;gBACtD,OAAO,KAAK,CAAC;YACjB,CAAC;QACL,CAAC;QACD,OAAO,IAAI,CAAC;IAChB,CAAC;CACJ;AAnCD,wCAmCC"}
1
+ {"version":3,"file":"utils.js","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":";;;AAAA,2CAA+C;AAE/C,MAAa,cAAc;IAIvB,YAAY,OAAoB;QAC5B,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;IAC3B,CAAC;IAEM,oBAAoB;QACvB,IAAI,KAAK,GAAG,IAAI,CAAC,iBAAiB,EAAE,CAAC;QACrC,IAAG,KAAK,EAAE,CAAC;YACP,IAAI,IAAI,GAAG,KAAK,CAAC,cAAc,CAAC;YAChC,OAAM,IAAI,IAAI,IAAI,KAAK,IAAI,CAAC,OAAO,EAAE,CAAC;gBAClC,IAAG,IAAI,CAAC,QAAQ,KAAK,IAAI,CAAC,YAAY,EAAE,CAAC;oBACrC,IAAI,IAAI,GAAG,IAAmB,CAAC;oBAC/B,IAAG,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,4BAAgB,CAAC,eAAe,CAAC,EAAE,CAAC;wBAC3D,OAAO,IAAI,CAAC;oBAChB,CAAC;gBACL,CAAC;gBACD,IAAI,GAAG,IAAI,CAAC,UAAkB,CAAC;YACnC,CAAC;QACL,CAAC;QACD,OAAO,IAAI,CAAC;IAChB,CAAC;IAEM,iBAAiB;QACpB,IAAI,SAAS,GAAG,MAAM,CAAC,YAAY,EAAE,CAAC;QACtC,IAAG,SAAS,IAAI,SAAS,CAAC,UAAU,GAAG,CAAC,EAAE,CAAC;YACvC,IAAI,KAAK,GAAG,SAAS,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;YACpC,IAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,uBAAuB,CAAC,EAAE,CAAC;gBACtD,OAAO,KAAK,CAAC;YACjB,CAAC;QACL,CAAC;QACD,OAAO,IAAI,CAAC;IAChB,CAAC;CACJ;AAnCD,wCAmCC;AAED;;GAEG;AACH,MAAa,aAAa;IAItB;;;;OAIG;IACH,MAAM,CAAC,eAAe,CAAC,UAAkB;QACrC,mCAAmC;QACnC,UAAU,GAAG,UAAU,CAAC,OAAO,CAAC,qBAAqB,EAAE,EAAE,CAAC,CAAC;QAE3D,mCAAmC;QACnC,UAAU,GAAG,UAAU,CAAC,OAAO,CAAC,kCAAkC,EAAE,EAAE,CAAC,CAAC;QACxE,UAAU,GAAG,UAAU,CAAC,OAAO,CAAC,kBAAkB,EAAE,EAAE,CAAC,CAAC;QAExD,MAAM,OAAO,GAAG,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;QAC9C,OAAO,CAAC,SAAS,GAAG,UAAU,CAAC;QAE/B,8DAA8D;QAC9D,MAAM,SAAS,GAAG,OAAO,CAAC,gBAAgB,CAAC,OAAO,CAAC,CAAC;QACpD,SAAS,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC;QAE3C,6BAA6B;QAC7B,aAAa,CAAC,YAAY,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE;YACrC,MAAM,QAAQ,GAAG,OAAO,CAAC,gBAAgB,CAAC,GAAG,CAAC,CAAC;YAC/C,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,CAAC;QACxC,CAAC,CAAC,CAAC;QAEH,OAAO,IAAI,CAAC,gBAAgB,CAAC,OAAO,CAAC,CAAC;IAC1C,CAAC;IAED;;;;OAIG;IACH,MAAM,CAAC,gBAAgB,CAAC,IAAU;QAC9B,IAAI,IAAI,CAAC,QAAQ,KAAK,IAAI,CAAC,SAAS,EAAE,CAAC;YACnC,OAAO,IAAI,CAAC,WAAW,IAAI,EAAE,CAAC;QAClC,CAAC;aAAM,IAAI,IAAI,CAAC,QAAQ,KAAK,IAAI,CAAC,YAAY,EAAE,CAAC;YAC7C,MAAM,OAAO,GAAG,IAAmB,CAAC;YACpC,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC;YAC9C,IAAI,aAAa,CAAC,YAAY,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;gBAC/C,OAAO,EAAE,CAAC;YACd,CAAC;YACD,IAAI,OAAO,KAAK,IAAI,EAAE,CAAC;gBACnB,OAAO,IAAI,CAAC;YAChB,CAAC;YACD,6BAA6B;YAC7B,MAAM,OAAO,GAAG,CAAC,GAAG,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI;gBAC/C,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,YAAY,EAAE,KAAK,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;YAC/E,IAAI,MAAM,GAAG,EAAE,CAAC;YAChB,KAAK,IAAI,KAAK,IAAI,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,CAAC;gBAC/C,MAAM,IAAI,IAAI,CAAC,gBAAgB,CAAC,KAAK,CAAC,CAAC;YAC3C,CAAC;YACD,IAAI,OAAO,IAAI,MAAM,CAAC,IAAI,EAAE,EAAE,CAAC;gBAC3B,MAAM,IAAI,IAAI,CAAC;YACnB,CAAC;YACD,OAAO,MAAM,CAAC;QAClB,CAAC;QACD,OAAO,EAAE,CAAC;IACd,CAAC;IAED;;;OAGG;IACH,MAAM,CAAC,eAAe,CAAC,OAAoB;QACvC,yBAAyB;QACzB,OAAO,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC;QAEjC,kCAAkC;QAClC,MAAM,gBAAgB,GAAG,CAAC,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,OAAO;YAC/C,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,QAAQ;YAC3C,aAAa,EAAE,aAAa,EAAE,KAAK,CAAC,CAAC;QAE9D,gBAAgB,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE;YAC5B,IAAI,OAAO,CAAC,YAAY,CAAC,IAAI,CAAC,EAAE,CAAC;gBAC7B,OAAO,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC;YAClC,CAAC;QACL,CAAC,CAAC,CAAC;QAEH,qCAAqC;QACrC,KAAK,IAAI,KAAK,IAAI,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC7C,IAAI,CAAC,eAAe,CAAC,KAAoB,CAAC,CAAC;QAC/C,CAAC;IACL,CAAC;;AAxFL,sCAyFC;AAvFkB,0BAAY,GAAG,CAAC,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,CAAC,CAAC"}
Binary file
Binary file
Binary file
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@cloudea/yang-editor",
3
- "version": "1.0.5",
3
+ "version": "1.0.7",
4
4
  "description": "a fast block editor",
5
5
  "main": "./dist/index.js",
6
6
  "types": "./dist/index.d.ts",
package/src/componets.ts CHANGED
@@ -1,5 +1,6 @@
1
1
  import { images } from "./images";
2
2
  import {YangEditor, YangEditorColor} from "./index";
3
+ import { FormatCleaner } from "./utils";
3
4
 
4
5
  export interface EditorElement {
5
6
  }
@@ -10,6 +11,8 @@ export interface EditorComponent extends EditorElement {
10
11
  onMounted(): void;
11
12
  }
12
13
 
14
+ export type EditorFunction = "insertCollapse" | "insertImage" | "insertCode"
15
+
13
16
  export class EditorBody implements EditorComponent {
14
17
  public readonly element: HTMLDivElement;
15
18
  public readonly context: YangEditor;
@@ -162,20 +165,38 @@ export class EditorContent implements EditorComponent {
162
165
  }
163
166
 
164
167
  this.element.onpaste = (e) => {
165
- // TODO: handle paste event
166
- //e.preventDefault();
167
- // let clipboardData = e.clipboardData;
168
- // if (clipboardData) {
169
- // let html = clipboardData.getData("text/html");
170
- // let text = clipboardData.getData("text/plain");
171
- // if (html) {
172
- // let div = document.createElement("div");
173
- // div.innerHTML = html;
174
- // this.element.appendChild(div);
175
- // } else if (text) {
176
- // this.element.appendChild(document.createTextNode(text));
177
- // }
178
- // }
168
+ e.preventDefault();
169
+
170
+ let clipboardData = e.clipboardData;
171
+ if (!clipboardData) return;
172
+
173
+ // get clipboard content
174
+ let html = clipboardData.getData("text/html");
175
+ let text = clipboardData.getData("text/plain");
176
+
177
+ let cleanedText = '';
178
+ if (html) {
179
+ cleanedText = FormatCleaner.cleanHTMLString(html);
180
+ } else if (text) {
181
+ cleanedText = text;
182
+ }
183
+ if (cleanedText) {
184
+ // insert content into selection range
185
+ const range = this.context.selectionUtils.getSelectionRange();
186
+ if (range) {
187
+ const lines = cleanedText.split('\n').filter(line => line.trim());
188
+ const fragment = document.createDocumentFragment();
189
+ lines.forEach((line, index) => {
190
+ fragment.appendChild(document.createTextNode(line));
191
+ if (index < lines.length - 1) {
192
+ fragment.appendChild(document.createElement('br'));
193
+ }
194
+ });
195
+ range.deleteContents();
196
+ range.insertNode(fragment);
197
+ range.collapse(false);
198
+ }
199
+ }
179
200
  }
180
201
 
181
202
  this.insertDefaultParagraph();
@@ -187,14 +208,14 @@ export class EditorContent implements EditorComponent {
187
208
  this.element.appendChild(document.createElement('p'));
188
209
  }
189
210
 
190
- insertCollapse() {
211
+ insertCollapse(args: {className?: string}) {
191
212
  let paragraphElement = this.context.selectionUtils.getSelectedParagraph();
192
213
  if(paragraphElement?.innerText.trim() === "") {
193
- paragraphElement.replaceWith(new EditorCollapse(this.context).onMount());
214
+ paragraphElement.replaceWith(new EditorCollapse(this.context, undefined, args.className).onMount());
194
215
  } else {
195
216
  for(let child of this.element.children) {
196
217
  if(child === paragraphElement) {
197
- child.after(new EditorCollapse(this.context).onMount());
218
+ child.after(new EditorCollapse(this.context, undefined, args.className).onMount());
198
219
  break;
199
220
  }
200
221
  }
@@ -272,11 +293,16 @@ class ButtonAdd implements EditorComponent {
272
293
  this.element.classList.add("yang-editor-button-add");
273
294
  this.element.innerText = "";
274
295
  this.element.style.backgroundImage = `url("${images.add2x}")`;
275
- this.element.title = "Add Collapsed Panel";
276
- this.element.onclick = () => this.context.body.content.insertCollapse();
296
+
297
+ let div = document.createElement("div");
298
+ div.classList.add("yang-editor-button-add-bridge");
299
+ this.element.appendChild(div)
300
+
301
+ //this.element.onclick = () => this.context.body.content.insertCollapse();
277
302
  }
278
303
 
279
304
  onMount(): HTMLElement {
305
+ this.element.appendChild(new EditorComponentMenu(this.context).onMount());
280
306
  return this.element;
281
307
  }
282
308
 
@@ -532,7 +558,7 @@ export class EditorCollapse implements EditorComponent {
532
558
  body: HTMLDivElement;
533
559
  container: HTMLDivElement;
534
560
 
535
- constructor(editor: YangEditor, element?: HTMLElement) {
561
+ constructor(editor: YangEditor, element?: HTMLElement, className?: string) {
536
562
  this.context = editor;
537
563
  if(element) {
538
564
  this.element = element;
@@ -568,6 +594,9 @@ export class EditorCollapse implements EditorComponent {
568
594
  this.container.contentEditable = "false";
569
595
  this.button.style.backgroundImage = `url("${images.down2x}")`;
570
596
  }
597
+ if (className) {
598
+ this.container.classList.add(className);
599
+ }
571
600
  }
572
601
 
573
602
  getElement(): HTMLElement {
@@ -620,6 +649,70 @@ export class EditorCollapse implements EditorComponent {
620
649
 
621
650
  }
622
651
 
652
+
653
+ export class EditorComponentMenu implements EditorComponent {
654
+ public readonly element: HTMLDivElement;
655
+ public readonly context: YangEditor;
656
+ public readonly functions: Map<EditorFunction, (args:any) => void> = new Map();
657
+
658
+ constructor(editor: YangEditor) {
659
+ this.context = editor;
660
+ this.element = document.createElement("div");
661
+ this.functions.set("insertCollapse", (args) => this.context.body.content.insertCollapse(args));
662
+ }
663
+
664
+ onMounted(): void {
665
+ throw new Error("Method not implemented.");
666
+ }
667
+
668
+ getElement(): HTMLElement {
669
+ return this.element;
670
+ }
671
+
672
+ onMount(): HTMLElement {
673
+ this.element.classList.add("yang-editor-component-menu");
674
+
675
+ if (this.context.options.menus) {
676
+
677
+ let ul = document.createElement("ul");
678
+ let lis = new Array<HTMLLIElement>();
679
+
680
+ for (let item of this.context.options.menus) {
681
+ let li = document.createElement("li");
682
+ let icon = document.createElement("button");
683
+ let text = document.createElement("p");
684
+ li.classList.add("yang-editor-component-menu-item");
685
+ icon.classList.add("yang-editor-component-menu-item-icon");
686
+ text.classList.add("yang-editor-component-menu-item-text");
687
+ let title = item.name;
688
+ icon.style.backgroundImage = `url("${item.icon}")`;
689
+ text.innerText = title;
690
+ if (item.className) {
691
+ li.classList.add(item.className);
692
+ }
693
+ if (item.callback) {
694
+ let func = this.functions.get(item.callback);
695
+ if (func) {
696
+ li.onclick = () => {
697
+ func(item.args)
698
+ };
699
+ }
700
+ }
701
+ li.appendChild(icon);
702
+ li.appendChild(text);
703
+ ul.appendChild(li);
704
+ lis.push(li);
705
+ }
706
+
707
+ this.element.appendChild(ul);
708
+ }
709
+ return this.getElement();
710
+ }
711
+
712
+
713
+ }
714
+
715
+
623
716
  export class EditorParagraphMenu implements EditorComponent {
624
717
  public readonly element: HTMLDivElement;
625
718
  public readonly context: YangEditor;
package/src/images.ts CHANGED
@@ -5,12 +5,15 @@ export const images = {
5
5
  add2x: 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAXNSR0IArs4c6QAAAARzQklUCAgICHwIZIgAAAGmSURBVFiFxVbJYcMgEJwlaSRV+Gn0slWEKzA9WOoBd5DUoPhl/HUVqQTyELqsA1bB8fxWAmZgYWcJHFRKgtypjQkSAOBg6phusDDItYldkqJJG7JoUImdLv4m4Pt45RPzhEwLWL1rvoixgEpJCHdNQxwW8fY/5AAAicOG8Hk3/Y9iMOR55B7uhIsqpgU8/AivBQNLGUAlW0Sl5FgAeu87BkQ35Npgp4u2DkTP7bhqAdzdAxhcKKIbTwBkcwr+BJi7TwF/CmLV7hNChIc8CT4NAs5tXyYCAOFydIsjLGUcdxvgoorF+2UpC6SAytXkAIJPVEAuC0iRnoChUdhyZypdvw5USkI8rOHcNuimlrL3xQH1SnM57AQIyNG4cKvjp3KrWErk2ghYZh1Phjq1Ark2bDNJiPoVvCIN/hKLNuCeQuMhlZJ8M+teVndXn9uOdXAw2J+zJux6wq/7Dw4bAlJ1wjPYnz/64bASrkkFB5ayx0/jUrw/r+jzIsknfGXaC3a6SCaiaV5nTC1cMEOWukTswm4aV7Fbs4kQEknMEzAryKMp5yt6h1+8AKTXUlzRcwAAAABJRU5ErkJggg==',
6
6
  bold2x: 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAXNSR0IArs4c6QAAAARzQklUCAgICHwIZIgAAADcSURBVFiF7ZRrDoMgEISnTe9VejLxZMLJ7A/YoIllH80Gf/AlRg0Ph3V2gMlkMA9mfAMQhHslALk+R5ucawG74RILeCnErMz4G61aS33/KPa/hCqwGdbsEPy+p0lWn+OplxECgGJIEV4CqBvCKAFUes64LgI0hlW1YWTGj20IlNNza1isQSRqQcDPA4AuxrubaIIooJRdXAmNByQktAxgQ0iCJYoJqkB3racHUr2HUQKINEJARDt5/j3NR0DA2YCpN1naBQG6ViRWTgDHP0kYJR/wyIGMcx5MJvfmC0EdViqgG/sdAAAAAElFTkSuQmCC',
7
7
  clear2x: 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAXNSR0IArs4c6QAAAARzQklUCAgICHwIZIgAAADoSURBVFiF7ZdLDsIwDESHm+VmhJOlN4MFjWRckoztGiTESF70E7/XqIla4J8v5xIcX/YCgG2vj6QAaADuqpoQSoVrsK40CQ3vT1wA1GwJDa9v7kmVWMHTJWTTVVIk2Bk4TaIoWD+OSJjh2j4q0TxwDfFI9E1rKcA2t0rIXXMaS1OLBPUeVAPcIkH3pafJIFFBPn1EYCSh4cUisLyZkDBvQrIBtV5JCQreI2fBI1Ej8KjEKXCvxKlwq0QKnJUIw5nP8qYa3/D8/L4Ozs+yuj6VGK1xS3mXN4DjdHvrJZ4/o+IYI7MFx/9YHqpw4/wia7QRAAAAAElFTkSuQmCC',
8
+ code2x: 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAXNSR0IArs4c6QAAAARzQklUCAgICHwIZIgAAACNSURBVFiF7ZbBCYAwEAQXK7GElJKS0klKtAT9RJCA4XK3Zx7egL+VGcgjAYIgkLM7bUUkAAeAKtjWtk1s+dm+PNjmx44S0cuL4J/CitDIaREWuTmCIVdHMOXTER5ycYSnfBixOYjULD0Czwix3CNiWs6MUMsZEWa5JYImf4v49DruI5Y8SG52p20Q/JwLnf9zIcEOe6AAAAAASUVORK5CYII=',
9
+ collapse2x: 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAXNSR0IArs4c6QAAAARzQklUCAgICHwIZIgAAABgSURBVFiF7ZSxDcAgEMRuZEbIBozAqKQIKUARCjwQItn92U+DBAAAm+MkecP+SA6TIEoKHduQtpYHZKKWI3o2w4TD4y3iafE3genxWmhZ/Cm4PF4e8Un8xuv6KwAA4L+cIcQlYuhEL/UAAAAASUVORK5CYII=',
8
10
  copy2x: 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAXNSR0IArs4c6QAAAARzQklUCAgICHwIZIgAAADMSURBVFiF7ZZbEsIgDEVvHffVuDLpyqArqx8FrRiVhEd/cmYYZngklwwhAMbJTML1BOCu9LXG3in3wwHYGjQ6GpVEYIv9Taf/Gb2gtZFOoIXifn8cvFQYbIIJ4AR4vN9az6zpJsAhS5Pe5ALm2C/YU3SCPu1UAhKhp9MSAcMwASZgpADiBq8CAwGvilbD+msyPcPEzCXnNe3jWZdGQPqF+0uPO+AhKGCSCJRCksWnp+G3CNBIEbnjFl9vV+qQu9Vp88zMlbBgYDk3qnkARgpONsy9a0IAAAAASUVORK5CYII=',
9
11
  cut2x: 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAXNSR0IArs4c6QAAAARzQklUCAgICHwIZIgAAADxSURBVFiF7ZZRDoMgDIZ/lx2sN1t3MrzZ9uDIutKCIOjD+BJjgtB+AYoAk39nKXynzxPhUSIWAcDLeE6RYJWQVRuNTE4iUU6shjiOe3SOS0OVyc2Y951BWgn4ij4tAQvCZhuc73uWgPC7iSnX2ROwpoyddm+8nIEqYqIYxCpJS0KPO4QM5smw09+Sa4aQTqNO5kkNRUo0H1C3rkqDIFy0BAR755+yCWUwrwypMO6QROkgytW4lGg6iGIAnVzL5SCkS2fSUgWrSJLrs2D7AQHAw5MYXYa8R0JDuPhCAqSlxkbbcBhp6XVPXnMtX9V7MunCG5oyltrXyXn1AAAAAElFTkSuQmCC',
10
12
  delete2x: 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAXNSR0IArs4c6QAAAARzQklUCAgICHwIZIgAAADESURBVFiF7ZdhDoMgDIXflt1rvdnYyexO5n4I0URb4RHFBF9CTKptP4tgAXrXg/QTw65kvCIFAKMxhtJgLwJAAbyNe18i3vU0wC5x7VhN0fPQV6lUqoQcmaR5Bc4AGDEt3SYAEq/WsqUBJNO2KwYgYPpAlwkl2op3QgbALCejLlbBDXADXBuA6YhS16MLm0a7olBsS7aVKBCx2k/BWQA/BiA5fSoSy94D3sFEMP/dtBKAPQC5h5DcIXCUS+YGcaSkX0f6A9JRRH7yUeoDAAAAAElFTkSuQmCC',
11
13
  deleteline2x: 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAXNSR0IArs4c6QAAAARzQklUCAgICHwIZIgAAADwSURBVFiF7VZtDsIgDH3THcSj1JNZTzY82fyzxa4gUFZM1L2k6TLa1xcoH8CBf8fQmEfKB+W7gQHMBaM3ubtAFYWlTd4CJlWAEwK5lwhZvERKBaERTkYx98J4qIjZoGYXzMZ44DVTDxRmoZeAapwrYgjARQgI3iJKYMTdTV7kckpzpKnuD4s3NZ3OlwLmdFw3DIB9G7pjFN/XHTy3xZP6H9C+RE0gxPfCx6FFUC64Rw8EbM+KrIAxN7gkrwSa2CKoGYy29ZQ3KO0RABivV2xFu7wJJGHuKOZEbCrORUSNuRVfQYifZiljC+nXPcsP/B6ekq1yptAqTwMAAAAASUVORK5CYII=',
12
14
  down2x: 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAXNSR0IArs4c6QAAAARzQklUCAgICHwIZIgAAABiSURBVFiF7ZBBCoAwDARXX5an+bPiy+rFo5TYaSvIDuSWMEMkY4wxH7MlduKeXg5wqyKpwiktwU7qkpzkOMQ/ECSARmA5iRgm74kYLn8TMU2eiZgub0Uskz9FLJcbY8x/uAClcl7rtXA5XgAAAABJRU5ErkJggg==',
13
15
  fgcolor: 'data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB3aWR0aD0iMTciIGhlaWdodD0iMTciIHZpZXdCb3g9IjAgMCAxNyAxNyIgZmlsbD0ibm9uZSI+PHBhdGggICBmaWxsPSJyZ2JhKDIyOCwgNzMsIDkxLCAxKSIgIGQ9Ik0yLjUgMEwxNC41IDBDMTUuODgwNyAwIDE3IDEuMTE5MjkgMTcgMi41TDE3IDE0LjVDMTcgMTUuODgwNyAxNS44ODA3IDE3IDE0LjUgMTdMMi41IDE3QzEuMTE5MjkgMTcgMCAxNS44ODA3IDAgMTQuNUwwIDIuNUMwIDEuMTE5MjkgMS4xMTkyOSAwIDIuNSAwWk0yLjUgMUMxLjY3MTU3IDEgMSAxLjY3MTU3IDEgMi41TDEgMTQuNUMxIDE1LjMyODQgMS42NzE1NyAxNiAyLjUgMTZMMTQuNSAxNkMxNS4zMjg0IDE2IDE2IDE1LjMyODQgMTYgMTQuNUwxNiAyLjVDMTYgMS42NzE1NyAxNS4zMjg0IDEgMTQuNSAxTDIuNSAxWiI+PC9wYXRoPjxnICBjbGlwLXBhdGg9InVybCgjY2xpcC1wYXRoLXVEbXBUYVlCZC1HQWJ2bVU0a1JTbSkiPjxwYXRoIGQ9Ik0xMy40Njg2IDEwLjM5NzNDMTMuNDQ4IDEwLjQxNzkgMTMuNDI3MiAxMC40MzgxIDEzLjQwNjEgMTAuNDU4MUMxMy4zODUgMTAuNDc4MSAxMy4zNjM3IDEwLjQ5NzggMTMuMzQyMSAxMC41MTczQzEzLjMyMDYgMTAuNTM2NyAxMy4yOTg4IDEwLjU1NiAxMy4yNzY3IDEwLjU3NDlDMTMuMjU0NyAxMC41OTM4IDEzLjIzMjQgMTAuNjEyNSAxMy4yMDk5IDEwLjYzMDlDMTMuMTg3NCAxMC42NDkyIDEzLjE2NDcgMTAuNjY3MyAxMy4xNDE3IDEwLjY4NTFDMTMuMTE4OCAxMC43MDMgMTMuMDk1NiAxMC43MjA1IDEzLjA3MjIgMTAuNzM3N0MxMy4wNDg5IDEwLjc1NSAxMy4wMjUzIDEwLjc3MTkgMTMuMDAxNSAxMC43ODg2QzEyLjk3NzcgMTAuODA1MiAxMi45NTM3IDEwLjgyMTYgMTIuOTI5NCAxMC44Mzc3QzEyLjkwNTIgMTAuODUzOCAxMi44ODA5IDEwLjg2OTUgMTIuODU2MyAxMC44ODVDMTIuODMxNyAxMC45MDA1IDEyLjgwNjkgMTAuOTE1NiAxMi43ODE5IDEwLjkzMDVDMTIuNzU2OSAxMC45NDUzIDEyLjczMTggMTAuOTU5OSAxMi43MDY1IDEwLjk3NDFDMTIuNjgxMSAxMC45ODgzIDEyLjY1NTYgMTEuMDAyMiAxMi42Mjk5IDExLjAxNThDMTIuNjA0MyAxMS4wMjk0IDEyLjU3ODQgMTEuMDQyNyAxMi41NTI0IDExLjA1NTdDMTIuNTI2NCAxMS4wNjg2IDEyLjUwMDMgMTEuMDgxMyAxMi40NzQgMTEuMDkzNkMxMi40NDc2IDExLjEwNTkgMTIuNDIxMiAxMS4xMTc5IDEyLjM5NDYgMTEuMTI5NkMxMi4zNjc5IDExLjE0MTIgMTIuMzQxMiAxMS4xNTI1IDEyLjMxNDMgMTEuMTYzNkMxMi4yODc0IDExLjE3NDYgMTIuMjYwNCAxMS4xODUyIDEyLjIzMzIgMTEuMTk1NUMxMi4yMDYxIDExLjIwNTkgMTIuMTc4OCAxMS4yMTU5IDEyLjE1MTQgMTEuMjI1NUMxMi4xMjQgMTEuMjM1MiAxMi4wOTY1IDExLjI0NDUgMTIuMDY4OSAxMS4yNTM1QzEyLjA0MTIgMTEuMjYyNSAxMi4wMTM1IDExLjI3MTEgMTEuOTg1NiAxMS4yNzk0QzExLjk1NzggMTEuMjg3NyAxMS45Mjk5IDExLjI5NTYgMTEuOTAxOCAxMS4zMDMyQzExLjg3MzggMTEuMzEwOCAxMS44NDU2IDExLjMxODEgMTEuODE3NCAxMS4zMjVDMTEuNzg5MiAxMS4zMzE5IDExLjc2MDkgMTEuMzM4NSAxMS43MzI1IDExLjM0NDdDMTEuNzA0MSAxMS4zNTA5IDExLjY3NTcgMTEuMzU2NyAxMS42NDcxIDExLjM2MjJDMTEuNjE4NiAxMS4zNjc3IDExLjU5IDExLjM3MjkgMTEuNTYxNCAxMS4zNzc3QzExLjUzMjcgMTEuMzgyNSAxMS41MDQgMTEuMzg2OSAxMS40NzUyIDExLjM5MUMxMS40NDY1IDExLjM5NTEgMTEuNDE3NyAxMS4zOTg4IDExLjM4ODggMTEuNDAyMkMxMS4zNTk5IDExLjQwNTYgMTEuMzMxMSAxMS40MDg2IDExLjMwMjEgMTEuNDExM0MxMS4yNzMyIDExLjQxMzkgMTEuMjQ0MiAxMS40MTYyIDExLjIxNTIgMTEuNDE4MkMxMS4xODYzIDExLjQyMDEgMTEuMTU3MiAxMS40MjE3IDExLjEyODIgMTEuNDIyOUMxMS4wOTkyIDExLjQyNDIgMTEuMDcwMiAxMS40MjUgMTEuMDQxMSAxMS40MjU1QzExLjAxMjEgMTEuNDI2MSAxMC45ODMgMTEuNDI2MiAxMC45NTM5IDExLjQyNkw5Ljg0OTI5IDExLjQyNkM5LjYxNzI4IDExLjQyNiA5LjM5Nzk2IDExLjY0NDcgOS4zOTc5NiAxMS44NzczQzkuMzk3OTYgMTEuOTY0IDkuNDUzMjkgMTIuMDU2NyA5LjU0Mzk2IDEyLjE5NEM5Ljc4MDYyIDEyLjQ0NDcgOS44OTA2MiAxMi43MzYgOS44OTA2MiAxMy4xMDQ3QzkuODkwNjIgMTMuNDYyNyA5LjczOTk2IDEzLjgyIDkuNDc1OTYgMTQuMDg0NkM5LjQ2NzkzIDE0LjA5MjcgOS40NTk4MiAxNC4xMDA3IDkuNDUxNjEgMTQuMTA4NUM5LjQ0MzM5IDE0LjExNjQgOS40MzUwOSAxNC4xMjQxIDkuNDI2NjkgMTQuMTMxOEM5LjQxODI5IDE0LjEzOTUgOS40MDk3OSAxNC4xNDcgOS40MDEyMSAxNC4xNTQ1QzkuMzkyNjMgMTQuMTYxOSA5LjM4Mzk1IDE0LjE2OTMgOS4zNzUyIDE0LjE3NjVDOS4zNjY0MyAxNC4xODM4IDkuMzU3NTkgMTQuMTkwOSA5LjM0ODY2IDE0LjE5NzlDOS4zMzk3MiAxNC4yMDQ5IDkuMzMwNyAxNC4yMTE5IDkuMzIxNiAxNC4yMTg3QzkuMzEyNDkgMTQuMjI1NSA5LjMwMzMyIDE0LjIzMjMgOS4yOTQwNSAxNC4yMzg4QzkuMjg0NzkgMTQuMjQ1NCA5LjI3NTQ1IDE0LjI1MTggOS4yNjYwMyAxNC4yNTgzQzkuMjU2NjEgMTQuMjY0NiA5LjI0NzExIDE0LjI3MDggOS4yMzc1NCAxNC4yNzdDOS4yMjc5NiAxNC4yODMxIDkuMjE4MzIgMTQuMjg5MSA5LjIwODYxIDE0LjI5NTFDOS4xOTg4OSAxNC4zMDA5IDkuMTg5MDkgMTQuMzA2NyA5LjE3OTI0IDE0LjMxMjRDOS4xNjkzOCAxNC4zMTggOS4xNTk0NyAxNC4zMjM1IDkuMTQ5NDcgMTQuMzI4OUM5LjEzOTQ4IDE0LjMzNDMgOS4xMjk0MiAxNC4zMzk3IDkuMTE5MzEgMTQuMzQ0OUM5LjEwOTE4IDE0LjM1IDkuMDk5IDE0LjM1NTEgOS4wODg3NiAxNC4zNkM5LjA3ODUyIDE0LjM2NDkgOS4wNjgyMSAxNC4zNjk3IDkuMDU3ODYgMTQuMzc0NEM5LjA0NzUxIDE0LjM3OTEgOS4wMzcwOSAxNC4zODM3IDkuMDI2NjIgMTQuMzg4MUM5LjAxNjE2IDE0LjM5MjYgOS4wMDU2NCAxNC4zOTY4IDguOTk1MDUgMTQuNDAxQzguOTg0NDggMTQuNDA1MiA4Ljk3Mzg3IDE0LjQwOTIgOC45NjMxOSAxNC40MTMyQzguOTUyNTIgMTQuNDE3MSA4Ljk0MTggMTQuNDIwOCA4LjkzMTA1IDE0LjQyNDZDOC45MjAyOCAxNC40MjgyIDguOTA5NDcgMTQuNDMxNyA4Ljg5ODYzIDE0LjQzNTFDOC44ODc3OCAxNC40Mzg1IDguODc2ODkgMTQuNDQxOCA4Ljg2NTk3IDE0LjQ0NUM4Ljg1NTA0IDE0LjQ0OCA4Ljg0NDA4IDE0LjQ1MSA4LjgzMzA4IDE0LjQ1MzlDOC44MjIwNyAxNC40NTY3IDguODExMDUgMTQuNDU5NSA4Ljc5OTk4IDE0LjQ2MjFDOC43ODg5MSAxNC40NjQ2IDguNzc3ODEgMTQuNDY3MiA4Ljc2NjY5IDE0LjQ2OTZDOC43NTU1NyAxNC40NzE4IDguNzQ0NDEgMTQuNDc0IDguNzMzMjMgMTQuNDc2MUM4LjcyMjA3IDE0LjQ3ODEgOC43MTA4NiAxNC40OCA4LjY5OTY0IDE0LjQ4MTlDOC42ODg0MSAxNC40ODM2IDguNjc3MTYgMTQuNDg1MyA4LjY2NTkgMTQuNDg2OUM4LjY1NDY0IDE0LjQ4ODMgOC42NDMzNSAxNC40ODk3IDguNjMyMDYgMTQuNDkxQzguNjIwNzYgMTQuNDkyMiA4LjYwOTQ1IDE0LjQ5MzQgOC41OTgxMiAxNC40OTQzQzguNTg2NzkgMTQuNDk1MiA4LjU3NTQ1IDE0LjQ5NjIgOC41NjQxMSAxNC40OTY5QzguNTUyNzcgMTQuNDk3NiA4LjU0MTQxIDE0LjQ5OCA4LjUzMDA2IDE0LjQ5ODVDOC41MTg3IDE0LjQ5ODkgOC41MDczMyAxNC40OTkxIDguNDk1OTcgMTQuNDk5M0M4LjM5OTE4IDE0LjQ5OTggOC4zMDI0MyAxNC40OTc5IDguMjA1NzQgMTQuNDkzN0M4LjEwOTA1IDE0LjQ4OTUgOC4wMTI1MiAxNC40ODI4IDcuOTE2MTQgMTQuNDczOUM3LjgxOTc3IDE0LjQ2NSA3LjcyMzY2IDE0LjQ1MzYgNy42Mjc4NCAxNC40NEM3LjUzMjAyIDE0LjQyNjQgNy40MzY1OCAxNC40MTA1IDcuMzQxNTMgMTQuMzkyMkM3LjI0NjQ4IDE0LjM3MzkgNy4xNTE5MyAxNC4zNTM0IDcuMDU3ODkgMTQuMzMwNkM2Ljk2MzgzIDE0LjMwNzcgNi44NzA0IDE0LjI4MjYgNi43Nzc1NyAxNC4yNTUyQzYuNjg0NzUgMTQuMjI3OCA2LjU5MjY0IDE0LjE5ODEgNi41MDEyNSAxNC4xNjYyQzYuNDA5ODYgMTQuMTM0NCA2LjMxOTMxIDE0LjEwMDMgNi4yMjk1OCAxNC4wNjRDNi4xMzk4NSAxNC4wMjc3IDYuMDUxMDYgMTMuOTg5MyA1Ljk2MzIgMTMuOTQ4N0M1Ljg3NTM1IDEzLjkwODEgNS43ODg1MiAxMy44NjUzIDUuNzAyNzQgMTMuODIwNUM1LjYxNjk2IDEzLjc3NTcgNS41MzIzMyAxMy43Mjg4IDUuNDQ4ODMgMTMuNjc5OEM1LjM2NTM0IDEzLjYzMDkgNS4yODMwNyAxMy41OCA1LjIwMjA1IDEzLjUyN0M1LjEyMTAyIDEzLjQ3NDEgNS4wNDEzNCAxMy40MTkyIDQuOTYyOTkgMTMuMzYyNEM0Ljg4NDY0IDEzLjMwNTUgNC44MDc3MiAxMy4yNDY4IDQuNzMyMjIgMTMuMTg2M0M0LjY1NjczIDEzLjEyNTcgNC41ODI3NSAxMy4wNjMzIDQuNTEwMjggMTIuOTk5MkM0LjQzNzgyIDEyLjkzNSA0LjM2Njk2IDEyLjg2OTEgNC4yOTc3IDEyLjgwMTVDNC4yMjg0NCAxMi43MzM5IDQuMTYwODcgMTIuNjY0NyA0LjA5NDk4IDEyLjU5MzhDNC4wMjkwOSAxMi41MjI5IDMuOTY0OTcgMTIuNDUwNCAzLjkwMjYgMTIuMzc2NEMzLjg0MDIzIDEyLjMwMjQgMy43Nzk3MSAxMi4yMjY5IDMuNzIxMDIgMTIuMTQ5OUMzLjY2MjMyIDEyLjA3MyAzLjYwNTUzIDExLjk5NDYgMy41NTA2NSAxMS45MTQ5QzMuNDk1NzcgMTEuODM1MiAzLjQ0Mjg2IDExLjc1NDIgMy4zOTE5MiAxMS42NzE5QzMuMzQwOTggMTEuNTg5NiAzLjI5MjA2IDExLjUwNjEgMy4yNDUxOCAxMS40MjE0QzMuMTk4MyAxMS4zMzY3IDMuMTUzNTEgMTEuMjUxIDMuMTEwOCAxMS4xNjQxQzMuMDY4MDkgMTEuMDc3MyAzLjAyNzUyIDEwLjk4OTQgMi45ODkwOCAxMC45MDA2QzIuOTUwNjUgMTAuODExOCAyLjkxNDM5IDEwLjcyMjEgMi44ODAzMiAxMC42MzE1QzIuODQ2MjUgMTAuNTQwOSAyLjgxNDQgMTAuNDQ5NSAyLjc4NDc3IDEwLjM1NzRDMi43NTUxNCAxMC4yNjUyIDIuNzI3NzcgMTAuMTcyNCAyLjcwMjY2IDEwLjA3ODlDMi42Nzc1NSA5Ljk4NTQ4IDIuNjU0NzIgOS44OTE0NSAyLjYzNDE4IDkuNzk2ODZDMi42MTM2NCA5LjcwMjI4IDIuNTk1NDEgOS42MDcyNyAyLjU3OTQ5IDkuNTExNzlDMi41NjM1OCA5LjQxNjMyIDIuNTQ5OTkgOS4zMjA1MiAyLjUzODczIDkuMjI0MzlDMi41Mjc0NyA5LjEyODI2IDIuNTE4NTYgOS4wMzE5MSAyLjUxMTk5IDguOTM1MzVDMi41MDU0MiA4LjgzODc5IDIuNTAxMiA4Ljc0MjEyIDIuNDk5MzMgOC42NDUzNkwyLjQ5OTMzIDguMzU1MzVDMi41MDAyOCA4LjMwNzAyIDIuNTAxODIgOC4yNTg3MiAyLjUwMzk1IDguMjEwNDNDMi41MDYwNyA4LjE2MjEzIDIuNTA4NzggOC4xMTM4NyAyLjUxMjA4IDguMDY1NjVDMi41MTUzOCA4LjAxNzQzIDIuNTE5MjYgNy45NjkyNSAyLjUyMzcyIDcuOTIxMTJDMi41MjgxOSA3Ljg3MyAyLjUzMzIzIDcuODI0OTMgMi41Mzg4NyA3Ljc3NjkxQzIuNTQ0NSA3LjcyODkgMi41NTA3MSA3LjY4MDk3IDIuNTU3NSA3LjYzMzEyQzIuNTY0MyA3LjU4NTI3IDIuNTcxNjcgNy41Mzc1IDIuNTc5NjIgNy40ODk4MkMyLjU4NzU4IDcuNDQyMTMgMi41OTYxMSA3LjM5NDU3IDIuNjA1MjEgNy4zNDcwOUMyLjYxNDMyIDcuMjk5NjIgMi42MjQgNy4yNTIyNyAyLjYzNDI2IDcuMjA1MDNDMi42NDQ1MSA3LjE1Nzc5IDIuNjU1MzQgNy4xMTA2OSAyLjY2Njc0IDcuMDYzNzJDMi42NzgxNCA3LjAxNjc0IDIuNjkwMSA2Ljk2OTkxIDIuNzAyNjQgNi45MjMyNEMyLjcxNTE3IDYuODc2NTUgMi43MjgyNyA2LjgzMDAzIDIuNzQxOTQgNi43ODM2NkMyLjc1NTYgNi43MzczIDIuNzY5ODIgNi42OTExIDIuNzg0NjEgNi42NDUwOEMyLjc5OTM5IDYuNTk5MDYgMi44MTQ3MyA2LjU1MzIyIDIuODMwNjMgNi41MDc1N0MyLjg0NjUyIDYuNDYxOTMgMi44NjI5NyA2LjQxNjQ4IDIuODc5OTcgNi4zNzEyNEMyLjg5Njk3IDYuMzI1OTkgMi45MTQ1MSA2LjI4MDk1IDIuOTMyNiA2LjIzNjEyQzIuOTUwNjkgNi4xOTEzIDIuOTY5MzMgNi4xNDY3MSAyLjk4ODUgNi4xMDIzM0MzLjAwNzY3IDYuMDU3OTYgMy4wMjczOCA2LjAxMzgzIDMuMDQ3NjIgNS45Njk5M0MzLjA2Nzg3IDUuOTI2MDQgMy4wODg2NCA1Ljg4MjQgMy4xMDk5NCA1LjgzOTAxQzMuMTMxMjUgNS43OTU2MSAzLjE1MzA3IDUuNzUyNDkgMy4xNzU0MiA1LjcwOTYzQzMuMTk3NzcgNS42NjY3OCAzLjIyMDYzIDUuNjI0MTkgMy4yNDQwMiA1LjU4MTg5QzMuMjY3NCA1LjUzOTU4IDMuMjkxMjkgNS40OTc1NyAzLjMxNTY5IDUuNDU1ODRDMy4zNDAwOSA1LjQxNDExIDMuMzY1IDUuMzcyNyAzLjM5MDQgNS4zMzE1N0MzLjQxNTgxIDUuMjkwNDUgMy40NDE3MSA1LjI0OTY0IDMuNDY4MSA1LjIwOTE1QzMuNDk0NSA1LjE2ODY2IDMuNTIxMzggNS4xMjg0OSAzLjU0ODc1IDUuMDg4NjRDMy41NzYxMiA1LjA0ODgxIDMuNjAzOTcgNS4wMDkzMSAzLjYzMjMgNC45NzAxM0MzLjY2MDYzIDQuOTMwOTcgMy42ODk0NCA0Ljg5MjE2IDMuNzE4NyA0Ljg1MzdDMy43NDc5NyA0LjgxNTIyIDMuNzc3NyA0Ljc3NzExIDMuODA3OSA0LjczOTM3QzMuODM4MSA0LjcwMTYyIDMuODY4NzUgNC42NjQyNSAzLjg5OTg1IDQuNjI3MjVDMy45MzA5NSA0LjU5MDI2IDMuOTYyNSA0LjU1MzY0IDMuOTk0NDkgNC41MTczOUM0LjAyNjQ3IDQuNDgxMTYgNC4wNTg5IDQuNDQ1MzEgNC4wOTE3NSA0LjQwOTg2QzQuMTI0NjEgNC4zNzQ0MSA0LjE1NzkgNC4zMzkzNyA0LjE5MTYxIDQuMzA0NzNDNC4yMjUzMiA0LjI3MDA4IDQuMjU5NDUgNC4yMzU4NSA0LjI5Mzk4IDQuMjAyMDRDNC4zMjg2MSA0LjE2ODE2IDQuMzYzNjUgNC4xMzQ3MiA0LjM5OTEgNC4xMDE2OUM0LjQzNDU1IDQuMDY4NjggNC40NzAzOSA0LjAzNjA5IDQuNTA2NjMgNC4wMDM5NUM0LjU0Mjg4IDMuOTcxNzkgNC41Nzk1IDMuOTQwMDggNC42MTY1MSAzLjkwODgyQzQuNjUzNTIgMy44Nzc1NyA0LjY5MDkgMy44NDY3NiA0LjcyODY3IDMuODE2NDJDNC43NjY0MyAzLjc4NjA3IDQuODA0NTUgMy43NTYxOSA0Ljg0MzAzIDMuNzI2NzZDNC44ODE1MyAzLjY5NzM0IDQuOTIwMzYgMy42NjgzOSA0Ljk1OTU1IDMuNjM5OTJDNC45OTg3NSAzLjYxMTQ0IDUuMDM4MjggMy41ODM0NSA1LjA3ODE2IDMuNTU1OTRDNS4xMTgwMiAzLjUyODQyIDUuMTU4MjIgMy41MDE0IDUuMTk4NzUgMy40NzQ4N0M1LjIzOTI5IDMuNDQ4MzMgNS4yODAxMyAzLjQyMjI5IDUuMzIxMyAzLjM5Njc1QzUuMzYyNDYgMy4zNzEyMSA1LjQwMzk0IDMuMzQ2MTcgNS40NDU3MSAzLjMyMTY0QzUuNDg3NDkgMy4yOTcxMSA1LjUyOTU1IDMuMjczMDkgNS41NzE5MSAzLjI0OTU4QzUuNjE0MjggMy4yMjYwNyA1LjY1NjkxIDMuMjAzMDggNS42OTk4MiAzLjE4MDYxQzUuNzQyNzQgMy4xNTgxNCA1Ljc4NTkyIDMuMTM2MiA1LjgyOTM4IDMuMTE0NzhDNS44NzI4MyAzLjA5MzM2IDUuOTE2NTQgMy4wNzI0NyA1Ljk2MDUgMy4wNTIxMkM2LjAwNDQ1IDMuMDMxNzYgNi4wNDg2NiAzLjAxMTk0IDYuMDkzMTEgMi45OTI2NkM2LjEzNzU0IDIuOTczMzggNi4xODIyMiAyLjk1NDY0IDYuMjI3MTEgMi45MzY0NUM2LjI3MiAyLjkxODI2IDYuMzE3MTIgMi45MDA2MSA2LjM2MjQ1IDIuODgzNTJDNi40MDc3OCAyLjg2NjQyIDYuNDUzMzEgMi44NDk4OCA2LjQ5OTA0IDIuODMzOUM2LjU0NDc3IDIuODE3OTEgNi41OTA2OCAyLjgwMjQ4IDYuNjM2OCAyLjc4NzYxQzYuNjgyOSAyLjc3Mjc0IDYuNzI5MTggMi43NTg0MyA2Ljc3NTY0IDIuNzQ0NjlDNi44MjIwOSAyLjczMDk1IDYuODY4NzEgMi43MTc3NyA2LjkxNTQ4IDIuNzA1MTZDNi45NjIyNSAyLjY5MjU1IDcuMDA5MTcgMi42ODA1MSA3LjA1NjI1IDIuNjY5MDVDNy4xMDMzMSAyLjY1NzU4IDcuMTUwNTEgMi42NDY2OSA3LjE5Nzg0IDIuNjM2MzdDNy4yNDUxOCAyLjYyNjA1IDcuMjkyNjQgMi42MTYzMSA3LjM0MDIgMi42MDcxNEM3LjM4Nzc3IDIuNTk3OTggNy40MzU0NCAyLjU4OTQgNy40ODMyMiAyLjU4MTM5QzcuNTMxIDIuNTczMzkgNy41Nzg4NyAyLjU2NTk3IDcuNjI2ODMgMi41NTkxM0M3LjY3NDggMi41NTIyOSA3LjcyMjgzIDIuNTQ2MDQgNy43NzA5NCAyLjU0MDM3QzcuODE5MDQgMi41MzQ3IDcuODY3MjIgMi41Mjk2MSA3LjkxNTQ1IDIuNTI1MTJDNy45NjM2OSAyLjUyMDYyIDguMDExOTcgMi41MTY3MSA4LjA2MDMxIDIuNTEzMzlDOC4xMDg2NCAyLjUxMDA3IDguMTU3IDIuNTA3MzMgOC4yMDU0IDIuNTA1MTlDOC4yNTM4IDIuNTAzMDQgOC4zMDIyMSAyLjUwMTQ5IDguMzUwNjQgMi41MDA1MkM4LjM5OTA3IDIuNDk5NTUgOC40NDc1MiAyLjQ5OTE3IDguNDk1OTcgMi40OTkzOUMxMC4wOTMzIDIuNDk5MzkgMTEuNTk1OSAzLjA1NTM4IDEyLjcyNTkgNC4wNjI3MkMxMi43NTk3IDQuMDkyNDIgMTIuNzkzMSA0LjEyMjU0IDEyLjgyNjIgNC4xNTMwOUMxMi44NTkyIDQuMTgzNjQgMTIuODkxOSA0LjIxNDYxIDEyLjkyNDEgNC4yNDU5OUMxMi45NTY0IDQuMjc3MzYgMTIuOTg4MiA0LjMwOTE0IDEzLjAxOTYgNC4zNDEzMkMxMy4wNTExIDQuMzczNSAxMy4wODIxIDQuNDA2MDYgMTMuMTEyOCA0LjQzOTAzQzEzLjE0MzQgNC40NzE5OSAxMy4xNzM2IDQuNTA1MzQgMTMuMjAzNCA0LjUzOTA3QzEzLjIzMzEgNC41NzI4IDEzLjI2MjUgNC42MDY5IDEzLjI5MTQgNC42NDEzNkMxMy4zMjAzIDQuNjc1ODMgMTMuMzQ4OCA0LjcxMDY0IDEzLjM3NjkgNC43NDU4NEMxMy40MDQ5IDQuNzgxMDMgMTMuNDMyNSA0LjgxNjU2IDEzLjQ1OTYgNC44NTI0NUMxMy40ODY4IDQuODg4MzQgMTMuNTEzNSA0LjkyNDU2IDEzLjUzOTcgNC45NjExMUMxMy41NjU5IDQuOTk3NjcgMTMuNTkxNyA1LjAzNDU1IDEzLjYxNyA1LjA3MTc2QzEzLjY0MjMgNS4xMDg5NiAxMy42NjcxIDUuMTQ2NDkgMTMuNjkxNSA1LjE4NDMzQzEzLjcxNTggNS4yMjIxNyAxMy43Mzk3IDUuMjYwMyAxMy43NjMxIDUuMjk4NzRDMTMuNzg2NSA1LjMzNzE5IDEzLjgwOTQgNS4zNzU5MiAxMy44MzE4IDUuNDE0OTNDMTMuODU0MiA1LjQ1Mzk0IDEzLjg3NjEgNS40OTMyMyAxMy44OTc1IDUuNTMyODFDMTMuOTE4OSA1LjU3MjM4IDEzLjkzOTggNS42MTIyMiAxMy45NjAyIDUuNjUyMzJDMTMuOTgwNiA1LjY5MjQyIDE0LjAwMDUgNS43MzI3NyAxNC4wMTk5IDUuNzczMzdDMTQuMDM5NiA1LjgxNDI2IDE0LjA1ODYgNS44NTU0MyAxNC4wNzcxIDUuODk2ODVDMTQuMDk1NiA1LjkzODI4IDE0LjExMzUgNS45Nzk5NiAxNC4xMzA4IDYuMDIxODlDMTQuMTQ4MSA2LjA2MzgyIDE0LjE2NDggNi4xMDU5OCAxNC4xODEgNi4xNDgzOEMxNC4xOTcxIDYuMTkwNzcgMTQuMjEyNyA2LjIzMzM5IDE0LjIyNzcgNi4yNzYyMkMxNC4yNDI2IDYuMzE5MDYgMTQuMjU2OSA2LjM2MjA5IDE0LjI3MDcgNi40MDUzMkMxNC4yODQ0IDYuNDQ4NTUgMTQuMjk3NSA2LjQ5MTk3IDE0LjMxMDEgNi41MzU1NkMxNC4zMjI1IDYuNTc5MTYgMTQuMzM0NCA2LjYyMjkzIDE0LjM0NTggNi42NjY4N0MxNC4zNTcxIDYuNzEwOCAxNC4zNjc4IDYuNzU0ODggMTQuMzc3OSA2Ljc5OTExQzE0LjM4NzkgNi44NDMzNCAxNC4zOTczIDYuODg3NzEgMTQuNDA2MiA2LjkzMjJDMTQuNDE1IDYuOTc2NyAxNC40MjMyIDcuMDIxMyAxNC40MzA5IDcuMDY2MDNDMTQuNDM4NCA3LjExMDc2IDE0LjQ0NTQgNy4xNTU1OSAxNC40NTE3IDcuMjAwNUMxNC40NTgxIDcuMjQ1NDIgMTQuNDYzNyA3LjI5MDQyIDE0LjQ2ODkgNy4zMzU1QzE0LjQ3MzggNy4zODA1OSAxNC40NzgyIDcuNDI1NzMgMTQuNDgyMSA3LjQ3MDkzQzE0LjQ4NTkgNy41MTYxMyAxNC40ODkgNy41NjEzNyAxNC40OTE2IDcuNjA2NjZDMTQuNDk0MiA3LjY1MTk2IDE0LjQ5NiA3LjY5NzI5IDE0LjQ5NzMgNy43NDI2M0MxNC40OTg2IDcuNzg3OTYgMTQuNDk5MyA3LjgzMzMzIDE0LjQ5OTMgNy44Nzg2OUMxNC40OTkzIDguODM5MzUgMTQuMTMyNiA5LjczNDAyIDEzLjQ2ODYgMTAuMzk3M1pNMTIuMDk3MyA0Ljc2NzM3QzExLjE0MDYgMy45MTQ3MSA5Ljg2MTI5IDMuNDQ0NzEgOC40OTU5NyAzLjQ0NDcxQzguNDE0NDUgMy40NDQyNyA4LjMzMjk4IDMuNDQ1OCA4LjI1MTU1IDMuNDQ5MzFDOC4xNzAxMSAzLjQ1MjgzIDguMDg4ODEgMy40NTgzMiA4LjAwNzYzIDMuNDY1NzlDNy45MjY0NyAzLjQ3MzI2IDcuODQ1NTMgMy40ODI3IDcuNzY0ODIgMy40OTQxMUM3LjY4NDExIDMuNTA1NTEgNy42MDM3MiAzLjUxODg4IDcuNTIzNjcgMy41MzQyQzcuNDQzNjEgMy41NDk1MSA3LjM2Mzk3IDMuNTY2NzcgNy4yODQ3NSAzLjU4NTk2QzcuMjA1NTMgMy42MDUxNSA3LjEyNjgzIDMuNjI2MjYgNy4wNDg2MyAzLjY0OTI4QzYuOTcwNDQgMy42NzIzMSA2Ljg5Mjg1IDMuNjk3MjEgNi44MTU4NyAzLjcyNDAxQzYuNzM4ODkgMy43NTA4MSA2LjY2MjYgMy43Nzk0NiA2LjU4NzAyIDMuODA5OTdDNi41MTE0MyAzLjg0MDQ3IDYuNDM2NjMgMy44NzI3OSA2LjM2MjYxIDMuOTA2OTRDNi4yODg2IDMuOTQxMDkgNi4yMTU0NiAzLjk3NzAyIDYuMTQzMTkgNC4wMTQ3MkM2LjA3MDkyIDQuMDUyNDEgNS45OTk2MSA0LjA5MTg2IDUuOTI5MjcgNC4xMzMwM0M1Ljg1ODkyIDQuMTc0MiA1Ljc4OTYxIDQuMjE3MDYgNS43MjEzNSA0LjI2MTYxQzUuNjUzMDkgNC4zMDYxNSA1LjU4NTk0IDQuMzUyMzIgNS41MTk5MyA0LjQwMDEzQzUuNDUzOTIgNC40NDc5NSA1LjM4OTEgNC40OTczMyA1LjMyNTQ4IDQuNTQ4MjlDNS4yNjE4NiA0LjU5OTI2IDUuMTk5NTMgNC42NTE3NSA1LjEzODQ2IDQuNzA1NzNDNS4wNzc0MSA0Ljc1OTczIDUuMDE3NyA0LjgxNTE5IDQuOTU5MzMgNC44NzIwOEM0LjkwMDk2IDQuOTI4OTggNC44NDQwMiA0Ljk4NzI3IDQuNzg4NDkgNS4wNDY5NEM0LjczMjk2IDUuMTA2NjEgNC42Nzg5MSA1LjE2NzU5IDQuNjI2MzUgNS4yMjk5QzQuNTczNzkgNS4yOTIyIDQuNTIyNzcgNS4zNTU3NCA0LjQ3MzMxIDUuNDIwNTJDNC40MjM4NCA1LjQ4NTMxIDQuMzc1OTcgNS41NTEyNSA0LjMyOTcgNS42MTgzN0M0LjI4MzQ1IDUuNjg1NDggNC4yMzg4NSA1Ljc1MzY3IDQuMTk1OSA1LjgyMjk1QzQuMTUyOTUgNS44OTIyMyA0LjExMTcxIDUuOTYyNTIgNC4wNzIxOCA2LjAzMzgxQzQuMDMyNjYgNi4xMDUwOSAzLjk5NDg5IDYuMTc3MjkgMy45NTg4OCA2LjI1MDQyQzMuOTIyODYgNi4zMjM1NCAzLjg4ODY2IDYuMzk3NSAzLjg1NjIzIDYuNDcyMjlDMy44MjM4MiA2LjU0NzA4IDMuNzkzMjQgNi42MjI2MSAzLjc2NDUgNi42OTg4OEMzLjczNTc2IDYuNzc1MTYgMy43MDg4OSA2Ljg1MjA5IDMuNjgzOSA2LjkyOTY4QzMuNjU4ODkgNy4wMDcyNiAzLjYzNTggNy4wODU0IDMuNjE0NiA3LjE2NDEyQzMuNTkzNCA3LjI0MjgyIDMuNTc0MTMgNy4zMjE5OSAzLjU1Njc5IDcuNDAxNjRDMy41Mzk0NCA3LjQ4MTI5IDMuNTI0MDQgNy41NjEzIDMuNTEwNTkgNy42NDE3QzMuNDk3MTQgNy43MjIwOSAzLjQ4NTY1IDcuODAyNzcgMy40NzYxMiA3Ljg4MzcyQzMuNDY2NTkgNy45NjQ2NyAzLjQ1OTA0IDguMDQ1ODEgMy40NTM0NiA4LjEyNzEzQzMuNDQ3ODggOC4yMDg0NSAzLjQ0NDI4IDguMjg5ODYgMy40NDI2NiA4LjM3MTM1TDMuNDQyNjYgOC42Mjg2OEMzLjQ0NDI4IDguNzEwMTggMy40NDc4OCA4Ljc5MTU5IDMuNDUzNDYgOC44NzI5MUMzLjQ1OTA0IDguOTU0MjMgMy40NjY1OSA5LjAzNTM3IDMuNDc2MTIgOS4xMTYzMkMzLjQ4NTY1IDkuMTk3MjcgMy40OTcxNCA5LjI3Nzk1IDMuNTEwNTkgOS4zNTgzNEMzLjUyNDA0IDkuNDM4NzMgMy41Mzk0NCA5LjUxODc0IDMuNTU2NzkgOS41OTgzOUMzLjU3NDEzIDkuNjc4MDQgMy41OTM0IDkuNzU3MjEgMy42MTQ2IDkuODM1OTJDMy42MzU4IDkuOTE0NjMgMy42NTg4OSA5Ljk5Mjc3IDMuNjgzOSAxMC4wNzA0QzMuNzA4ODkgMTAuMTQ3OSAzLjczNTc2IDEwLjIyNDkgMy43NjQ1IDEwLjMwMTFDMy43OTMyNCAxMC4zNzc0IDMuODIzODIgMTAuNDUzIDMuODU2MjMgMTAuNTI3OEMzLjg4ODY2IDEwLjYwMjUgMy45MjI4NiAxMC42NzY1IDMuOTU4ODggMTAuNzQ5NkMzLjk5NDg5IDEwLjgyMjcgNC4wMzI2NiAxMC44OTQ5IDQuMDcyMTggMTAuOTY2MkM0LjExMTcxIDExLjAzNzUgNC4xNTI5NSAxMS4xMDc4IDQuMTk1OSAxMS4xNzcxQzQuMjM4ODQgMTEuMjQ2NCA0LjI4MzQ0IDExLjMxNDYgNC4zMjk3IDExLjM4MTdDNC4zNzU5NyAxMS40NDg4IDQuNDIzODQgMTEuNTE0NyA0LjQ3MzMxIDExLjU3OTVDNC41MjI3NyAxMS42NDQzIDQuNTczNzkgMTEuNzA3OCA0LjYyNjM1IDExLjc3MDFDNC42Nzg5MSAxMS44MzI0IDQuNzMyOTYgMTEuODkzNCA0Ljc4ODQ5IDExLjk1MzFDNC44NDQwMiAxMi4wMTI4IDQuOTAwOTYgMTIuMDcxMSA0Ljk1OTMzIDEyLjEyOEM1LjAxNzcgMTIuMTg0OSA1LjA3NzQxIDEyLjI0MDMgNS4xMzg0NiAxMi4yOTQzQzUuMTk5NTMgMTIuMzQ4MyA1LjI2MTg2IDEyLjQwMDggNS4zMjU0OCAxMi40NTE3QzUuMzg5MSAxMi41MDI3IDUuNDUzOTIgMTIuNTUyMSA1LjUxOTkzIDEyLjU5OTlDNS41ODU5NCAxMi42NDc3IDUuNjUzMDkgMTIuNjkzOSA1LjcyMTM1IDEyLjczODRDNS43ODk2MSAxMi43ODMgNS44NTg5MiAxMi44MjU4IDUuOTI5MjcgMTIuODY3QzUuOTk5NjEgMTIuOTA4MiA2LjA3MDkyIDEyLjk0NzYgNi4xNDMxOSAxMi45ODUzQzYuMjE1NDYgMTMuMDIzIDYuMjg4NiAxMy4wNTkgNi4zNjI2MSAxMy4wOTMxQzYuNDM2NjMgMTMuMTI3MiA2LjUxMTQzIDEzLjE1OTYgNi41ODcwMiAxMy4xOTAxQzYuNjYyNiAxMy4yMjA2IDYuNzM4ODkgMTMuMjQ5MiA2LjgxNTg3IDEzLjI3NkM2Ljg5Mjg1IDEzLjMwMjggNi45NzA0MyAxMy4zMjc3IDcuMDQ4NjMgMTMuMzUwN0M3LjEyNjgzIDEzLjM3MzggNy4yMDU1MyAxMy4zOTQ5IDcuMjg0NzUgMTMuNDE0MUM3LjM2Mzk3IDEzLjQzMzMgNy40NDM2MSAxMy40NTA1IDcuNTIzNjcgMTMuNDY1OEM3LjYwMzcyIDEzLjQ4MTIgNy42ODQxMSAxMy40OTQ1IDcuNzY0ODIgMTMuNTA1OUM3Ljg0NTUzIDEzLjUxNzMgNy45MjY0NyAxMy41MjY4IDguMDA3NjMgMTMuNTM0MkM4LjA4ODgxIDEzLjU0MTcgOC4xNzAxMSAxMy41NDcyIDguMjUxNTUgMTMuNTUwN0M4LjMzMjk4IDEzLjU1NDIgOC40MTQ0NSAxMy41NTU4IDguNDk1OTcgMTMuNTU1M0M4LjcyNzk2IDEzLjU1NTMgOC45NDcyOSAxMy4zMzY3IDguOTQ3MjkgMTMuMTA0N0M4Ljk0NzI5IDEyLjk1NjcgOC45MTk5NiAxMi45MDMzIDguODQxOTYgMTIuODI1M0w4LjgwODYzIDEyLjc5MTNMOC43NzkyOSAxMi43NDZDOC42NDI2MyAxMi41NDIgOC40NTUzIDEyLjI2MTMgOC40NTUzIDExLjg3NzNDOC40NTUzIDExLjUxODcgOC42MDU5NiAxMS4xNjEzIDguODcwNjIgMTAuODk2N0M4Ljg3ODYzIDEwLjg4ODYgOC44ODY3NCAxMC44ODA2IDguODk0OTQgMTAuODcyOEM4LjkwMzE0IDEwLjg2NDkgOC45MTE0NCAxMC44NTcxIDguOTE5ODMgMTAuODQ5NEM4LjkyODIzIDEwLjg0MTggOC45MzY3MiAxMC44MzQyIDguOTQ1MjkgMTAuODI2N0M4Ljk1Mzg2IDEwLjgxOTMgOC45NjI1NCAxMC44MTE5IDguOTcxMjkgMTAuODA0N0M4Ljk4MDA0IDEwLjc5NzQgOC45ODg4OCAxMC43OTAzIDguOTk3ODEgMTAuNzgzMkM5LjAwNjc0IDEwLjc3NjIgOS4wMTU3NSAxMC43NjkyIDkuMDI0ODQgMTAuNzYyNEM5LjAzMzk1IDEwLjc1NTYgOS4wNDMxMyAxMC43NDg5IDkuMDUyMzggMTAuNzQyM0M5LjA2MTY0IDEwLjczNTcgOS4wNzA5OCAxMC43MjkyIDkuMDgwMzkgMTAuNzIyOUM5LjA4OTgxIDEwLjcxNjUgOS4wOTkzIDEwLjcxMDIgOS4xMDg4OCAxMC43MDQxQzkuMTE4NDUgMTAuNjk4IDkuMTI4MDkgMTAuNjkxOSA5LjEzNzggMTAuNjg2QzkuMTQ3NTIgMTAuNjgwMSA5LjE1NzMxIDEwLjY3NDMgOS4xNjcxNyAxMC42Njg3QzkuMTc3MDIgMTAuNjYzIDkuMTg2OTQgMTAuNjU3NSA5LjE5NjkzIDEwLjY1MkM5LjIwNjkzIDEwLjY0NjYgOS4yMTY5OCAxMC42NDEzIDkuMjI3MSAxMC42MzYxQzkuMjM3MjIgMTAuNjMwOSA5LjI0NzQxIDEwLjYyNTkgOS4yNTc2NSAxMC42MjA5QzkuMjY3ODkgMTAuNjE2IDkuMjc4MTkgMTAuNjExMiA5LjI4ODU1IDEwLjYwNjVDOS4yOTg5MSAxMC42MDE4IDkuMzA5MzMgMTAuNTk3MyA5LjMxOTc5IDEwLjU5MjhDOS4zMzAyNiAxMC41ODg0IDkuMzQwNzggMTAuNTg0MSA5LjM1MTM2IDEwLjU3OTlDOS4zNjE5NSAxMC41NzU4IDkuMzcyNTYgMTAuNTcxNyA5LjM4MzI0IDEwLjU2NzhDOS4zOTM5MSAxMC41NjM5IDkuNDA0NjIgMTAuNTYwMSA5LjQxNTM5IDEwLjU1NjRDOS40MjYxNiAxMC41NTI4IDkuNDM2OTcgMTAuNTQ5MyA5LjQ0NzgyIDEwLjU0NTlDOS40NTg2NyAxMC41NDI1IDkuNDY5NTYgMTAuNTM5MiA5LjQ4MDQ5IDEwLjUzNjFDOS40OTE0MyAxMC41MzMgOS41MDIzOSAxMC41MyA5LjUxMzQgMTAuNTI3MUM5LjUyNDQgMTAuNTI0MiA5LjUzNTQzIDEwLjUyMTUgOS41NDY1IDEwLjUxODlDOS41NTc1OCAxMC41MTYzIDkuNTY4NjggMTAuNTEzOSA5LjU3OTgxIDEwLjUxMTVDOS41OTA5MyAxMC41MDkyIDkuNjAyMDkgMTAuNTA3IDkuNjEzMjggMTAuNTA1QzkuNjI0NDYgMTAuNTAyOSA5LjYzNTY2IDEwLjUwMSA5LjY0Njg5IDEwLjQ5OTJDOS42NTgxMiAxMC40OTc0IDkuNjY5MzcgMTAuNDk1OCA5LjY4MDY0IDEwLjQ5NDNDOS42OTE5IDEwLjQ5MjggOS43MDMxOCAxMC40OTE0IDkuNzE0NDkgMTAuNDkwMkM5LjcyNTggMTAuNDg5IDkuNzM3MTEgMTAuNDg3OSA5Ljc0ODQ0IDEwLjQ4NjlDOS43NTk3NyAxMC40ODU5IDkuNzcxMTEgMTAuNDg1MSA5Ljc4MjQ2IDEwLjQ4NDRDOS43OTM4IDEwLjQ4MzggOS44MDUxNiAxMC40ODMyIDkuODE2NTMgMTAuNDgyOEM5LjgyNzg4IDEwLjQ4MjQgOS44MzkyNSAxMC40ODIxIDkuODUwNjIgMTAuNDgyTDEwLjk1NTMgMTAuNDgyQzEyLjQxNDYgMTAuNDgyIDEzLjU1NTkgOS4zMzkzNSAxMy41NTU5IDcuODgwNjhDMTMuNTUzMyA2LjcwODY5IDEzLjAzNDYgNS42MDQwNCAxMi4wOTczIDQuNzY3MzdaTTExLjkyNzMgOC45MDUzNUMxMS40NjkzIDguOTA1MzUgMTEuMDY2NiA4LjUwNDAxIDExLjA2NjYgOC4wNDQwMkMxMS4wNjY2IDcuNTg2MDMgMTEuNDY3OSA3LjE4MzM2IDExLjkyNzMgNy4xODMzNkMxMi4zODY2IDcuMTgzMzYgMTIuNzg5MyA3LjU4NjAzIDEyLjc4NzkgOC4wNDQwMkMxMi43ODc5IDguNTAyNjggMTIuMzg2NiA4LjkwNTM1IDExLjkyNzMgOC45MDUzNVpNMTAuMjA5OSA2LjYxMDdDOS43NTE5NiA2LjYxMDcgOS4zNDkyOSA2LjIwODcgOS4zNDkyOSA1Ljc0OTM3QzkuMzQ5MjkgNS4yOTEzNyA5Ljc1MDYyIDQuODg4NyAxMC4yMDk5IDQuODg4N0MxMC42NjkzIDQuODg4NyAxMS4wNzE5IDUuMjkxMzcgMTEuMDcwNiA1Ljc0OTM3QzExLjA2NjYgNi4yMTMzNiAxMC42NjkzIDYuNjEwNyAxMC4yMDk5IDYuNjEwN1pNNi44MDU5NyA2LjQyMzM2QzYuNzk1MjcgNi40MTQ0OCA2Ljc4NDc4IDYuNDA1MzQgNi43NzQ1MyA2LjM5NTk1QzYuNzY0MjcgNi4zODY1NyA2Ljc1NDI0IDYuMzc2OTMgNi43NDQ0NSA2LjM2NzA1QzYuNzM0NjUgNi4zNTcxOCA2LjcyNTEgNi4zNDcwNyA2LjcxNTc5IDYuMzM2NzNDNi43MDY0OSA2LjMyNjM5IDYuNjk3NDQgNi4zMTU4MyA2LjY4ODY1IDYuMzA1MDZDNi42Nzk4NSA2LjI5NDI4IDYuNjcxMzMgNi4yODMzIDYuNjYzMDcgNi4yNzIxMUM2LjY1NDgxIDYuMjYwOTIgNi42NDY4MyA2LjI0OTUzIDYuNjM5MTIgNi4yMzc5NkM2LjYzMTQxIDYuMjI2MzggNi42MjM5OCA2LjIxNDYzIDYuNjE2ODQgNi4yMDI2OUM2LjYwOTcgNi4xOTA3NSA2LjYwMjg2IDYuMTc4NjUgNi41OTYzMSA2LjE2NjM4QzYuNTg5NzYgNi4xNTQxMSA2LjU4MzUgNi4xNDE2OSA2LjU3NzU1IDYuMTI5MTJDNi41NzE1OSA2LjExNjU0IDYuNTY1OTUgNi4xMDM4NCA2LjU2MDYxIDYuMDkxQzYuNTU1MjggNi4wNzgxNSA2LjU1MDI1IDYuMDY1MTggNi41NDU1NCA2LjA1MjA5QzYuNTQwODQgNi4wMzkgNi41MzY0NSA2LjAyNTgyIDYuNTMyMzggNi4wMTI1MkM2LjUyODMyIDUuOTk5MjIgNi41MjQ1NyA1Ljk4NTgyIDYuNTIxMTQgNS45NzIzNEM2LjUxNzczIDUuOTU4ODYgNi41MTQ2NCA1Ljk0NTMgNi41MTE4OCA1LjkzMTY3QzYuNTA5MTEgNS45MTgwNCA2LjUwNjY4IDUuOTA0MzQgNi41MDQ1OSA1Ljg5MDU5QzYuNTAyNDkgNS44NzY4NSA2LjUwMDcyIDUuODYzMDYgNi40OTkyOCA1Ljg0OTIyQzYuNDk3ODUgNS44MzUzOCA2LjQ5Njc2IDUuODIxNTIgNi40OTYgNS44MDc2NEM2LjQ5NTIzIDUuNzkzNzUgNi40OTQ4MSA1Ljc3OTg1IDYuNDk0NzIgNS43NjU5NEM2LjQ5NDY0IDUuNzUyMDMgNi40OTQ4OCA1LjczODEyIDYuNDk1NDcgNS43MjQyM0M2LjQ5NjA1IDUuNzEwMzQgNi40OTY5OCA1LjY5NjQ2IDYuNDk4MjUgNS42ODI2MUM2LjQ5OTUgNS42Njg3NiA2LjUwMTA5IDUuNjU0OTQgNi41MDMwMiA1LjY0MTE3QzYuNTA0OTUgNS42Mjc0IDYuNTA3MjEgNS42MTM2OCA2LjUwOTggNS42QzYuNTEyMzkgNS41ODYzNCA2LjUxNTMyIDUuNTcyNzUgNi41MTg1NyA1LjU1OTIyQzYuNTIxODEgNS41NDU3IDYuNTI1NCA1LjUzMjI2IDYuNTI5MyA1LjUxODkxQzYuNTMzMiA1LjUwNTU2IDYuNTM3NDIgNS40OTIzMiA2LjU0MTk3IDUuNDc5MTdDNi41NDY1IDUuNDY2MDIgNi41NTEzNyA1LjQ1Mjk5IDYuNTU2NTUgNS40NDAwOUM2LjU2MTcyIDUuNDI3MTggNi41NjcyIDUuNDE0NCA2LjU3MyA1LjQwMTc2QzYuNTc4NzkgNS4zODkxMSA2LjU4NDg4IDUuMzc2NjEgNi41OTEyOCA1LjM2NDI2QzYuNTk3NjkgNS4zNTE5MiA2LjYwNDM4IDUuMzM5NzMgNi42MTEzNyA1LjMyNzdDNi42MTgzNiA1LjMxNTY3IDYuNjI1NjQgNS4zMDM4MiA2LjYzMzIgNS4yOTIxNUM2LjY0MDc2IDUuMjgwNDggNi42NDg2MSA1LjI2OSA2LjY1NjczIDUuMjU3NzFDNi42NjQ4NSA1LjI0NjQxIDYuNjczMjMgNS4yMzUzMyA2LjY4MTg5IDUuMjI0NDRDNi42OTA1NSA1LjIxMzU1IDYuNjk5NDcgNS4yMDI4OCA2LjcwODY0IDUuMTkyNDNDNi43MTc4MiA1LjE4MTk3IDYuNzI3MjQgNS4xNzE3NCA2LjczNjkxIDUuMTYxNzVDNi43NDY1OCA1LjE1MTc1IDYuNzU2NDggNS4xNDIgNi43NjY2MyA1LjEzMjQ3QzYuNzc2NzcgNS4xMjI5NiA2Ljc4NzE0IDUuMTEzNjkgNi43OTc3MiA1LjEwNDY4QzYuODA4MzEgNS4wOTU2NiA2LjgxOTEyIDUuMDg2OTEgNi44MzAxMyA1LjA3ODQxQzYuODQxMTUgNS4wNjk5MiA2Ljg1MjM2IDUuMDYxNyA2Ljg2Mzc4IDUuMDUzNzVDNi44NzUxOSA1LjA0NTggNi44ODY3OSA1LjAzODE0IDYuODk4NTcgNS4wMzA3NEM2LjkxMDM2IDUuMDIzMzYgNi45MjIzMSA1LjAxNjI2IDYuOTM0NDQgNS4wMDk0NUM2Ljk0NjU3IDUuMDAyNjQgNi45NTg4NiA0Ljk5NjE0IDYuOTcxMzEgNC45ODk5M0M2Ljk4Mzc1IDQuOTgzNyA2Ljk5NjM0IDQuOTc3OCA3LjAwOTA3IDQuOTcyMkM3LjAyMTggNC45NjY1OSA3LjAzNDY2IDQuOTYxMzEgNy4wNDc2NCA0Ljk1NjMzQzcuMDYwNjMgNC45NTEzNSA3LjA3MzczIDQuOTQ2NjggNy4wODY5NSA0Ljk0MjM0QzcuMTAwMTYgNC45Mzc5OSA3LjExMzQ3IDQuOTMzOTcgNy4xMjY4OCA0LjkzMDI3QzcuMTQwMjggNC45MjY1NyA3LjE1Mzc3IDQuOTIzMiA3LjE2NzM0IDQuOTIwMTVDNy4xODA5MSA0LjkxNzA5IDcuMTk0NTUgNC45MTQzOCA3LjIwODI1IDQuOTEyQzcuMjIxOTUgNC45MDk2MiA3LjIzNTcxIDQuOTA3NTUgNy4yNDk1MSA0LjkwNTgzQzcuMjYzMzIgNC45MDQxMSA3LjI3NzE2IDQuOTAyNzMgNy4yOTEwMiA0LjkwMTY4QzcuMzA0ODggNC45MDA2MyA3LjMxODc3IDQuODk5OTEgNy4zMzI2OCA0Ljg5OTU0QzcuMzQ2NTggNC44OTkxNiA3LjM2MDQ4IDQuODk5MTMgNy4zNzQzOSA0Ljg5OTQyQzcuMzg4MyA0Ljg5OTcyIDcuNDAyMTggNC45MDAzNSA3LjQxNjA2IDQuOTAxMzJDNy40Mjk5MyA0LjkwMjI5IDcuNDQzNzcgNC45MDM1OSA3LjQ1NzU5IDQuOTA1MjNDNy40NzE0MSA0LjkwNjg4IDcuNDg1MTYgNC45MDg4NCA3LjQ5ODg5IDQuOTExMTVDNy41MTI2MSA0LjkxMzQ2IDcuNTI2MjYgNC45MTYxIDcuNTM5ODQgNC45MTkwNkM3LjU1MzQzIDQuOTIyMDMgNy41NjY5NCA0LjkyNTMzIDcuNTgwMzcgNC45Mjg5NUM3LjU5MzggNC45MzI1NyA3LjYwNzEzIDQuOTM2NTIgNy42MjAzOCA0Ljk0MDc5QzcuNjMzNjEgNC45NDUwNiA3LjY0NjczIDQuOTQ5NjQgNy42NTk3NSA0Ljk1NDU1QzcuNjcyNzcgNC45NTk0NiA3LjY4NTY2IDQuOTY0NjcgNy42OTg0MiA0Ljk3MDE5QzcuNzExMTggNC45NzU3MiA3LjcyMzggNC45ODE1NiA3LjczNjI5IDQuOTg3N0M3Ljc0ODc3IDQuOTkzODQgNy43NjEwOCA1LjAwMDI3IDcuNzczMjYgNS4wMDcwMUM3Ljc4NTQyIDUuMDEzNzUgNy43OTc0MiA1LjAyMDc4IDcuODA5MjUgNS4wMjgxMUM3LjgyMTA3IDUuMDM1NDIgNy44MzI3MiA1LjA0MzAxIDcuODQ0MTggNS4wNTA5QzcuODU1NjQgNS4wNTg3OSA3Ljg2NjkgNS4wNjY5NCA3Ljg3Nzk2IDUuMDc1MzdMNy44Nzg2MyA1LjA3NjA0QzcuODg5NjYgNS4wODQ4MSA3LjkwMDQ1IDUuMDkzODUgNy45MTEwNCA1LjEwMzE1QzcuOTIxNjIgNS4xMTI0NSA3LjkzMTk1IDUuMTIyMDEgNy45NDIwNyA1LjEzMTgyQzcuOTUyMTcgNS4xNDE2MyA3Ljk2MjAyIDUuMTUxNjggNy45NzE2NCA1LjE2MTk4QzcuOTgxMjcgNS4xNzIyNyA3Ljk5MDYyIDUuMTgyNzkgNy45OTk3MSA1LjE5MzU1QzguMDA4ODIgNS4yMDQzMSA4LjAxNzY0IDUuMjE1MjggOC4wMjYyIDUuMjI2NDdDOC4wMzQ3NSA1LjIzNzY2IDguMDQzMDIgNS4yNDkwNSA4LjA1MTAzIDUuMjYwNjRDOC4wNTkwMyA1LjI3MjIzIDguMDY2NzQgNS4yODQwMiA4LjA3NDE2IDUuMjk2QzguMDgxNTggNS4zMDc5NyA4LjA4ODY5IDUuMzIwMTMgOC4wOTU1MSA1LjMzMjQ0QzguMTAyMzQgNS4zNDQ3NyA4LjEwODg2IDUuMzU3MjUgOC4xMTUwNiA1LjM2OTg5QzguMTIxMjcgNS4zODI1NCA4LjEyNzE2IDUuMzk1MzQgOC4xMzI3NCA1LjQwODI2QzguMTM4MzMgNS40MjEyIDguMTQzNTkgNS40MzQyNyA4LjE0ODUzIDUuNDQ3NDZDOC4xNTM0NiA1LjQ2MDY0IDguMTU4MDggNS40NzM5NiA4LjE2MjM2IDUuNDg3MzhDOC4xNjY2MyA1LjUwMDc5IDguMTcwNTkgNS41MTQzMSA4LjE3NDIyIDUuNTI3OTJDOC4xNzc4NCA1LjU0MTUzIDguMTgxMTIgNS41NTUyMyA4LjE4NDA2IDUuNTY5MDFDOC4xODcwMSA1LjU4Mjc4IDguMTg5NjIgNS41OTY2MiA4LjE5MTg5IDUuNjEwNTJDOC4xOTQxNSA1LjYyNDQzIDguMTk2MDggNS42MzgzNyA4LjE5NzY2IDUuNjUyMzZDOC4xOTkyNSA1LjY2NjM3IDguMjAwNDggNS42ODA0IDguMjAxMzcgNS42OTQ0NUM4LjIwMjI3IDUuNzA4NTEgOC4yMDI4MSA1LjcyMjU4IDguMjAzMDEgNS43MzY2N0M4LjIwMzIxIDUuNzUwNzUgOC4yMDMwNyA1Ljc2NDg0IDguMjAyNTcgNS43Nzg5MUM4LjIwMjA4IDUuNzkyOTkgOC4yMDEyNSA1LjgwNzA1IDguMjAwMDcgNS44MjEwOEM4LjE5ODg4IDUuODM1MTIgOC4xOTczNiA1Ljg0OTEyIDguMTk1NSA1Ljg2MzA4QzguMTkzNjIgNS44NzcwNCA4LjE5MTQxIDUuODkwOTUgOC4xODg4NiA1LjkwNDhDOC4xODYzMSA1LjkxODY2IDguMTgzNDEgNS45MzI0NCA4LjE4MDE4IDUuOTQ2MTVDOC4xNzY5NiA1Ljk1OTg2IDguMTczNCA1Ljk3MzQ4IDguMTY5NDkgNS45ODcwMkM4LjE2NTU5IDYuMDAwNTUgOC4xNjEzNiA2LjAxMzk5IDguMTU2OCA2LjAyNzMyQzguMTUyMjQgNi4wNDA2NCA4LjE0NzM2IDYuMDUzODUgOC4xNDIxNSA2LjA2Njk0QzguMTM2OTQgNi4wODAwMyA4LjEzMTQyIDYuMDkyOTggOC4xMjU1NyA2LjEwNThDOC4xMTk3MiA2LjExODYxIDguMTEzNTcgNi4xMzEyNyA4LjEwNzEgNi4xNDM3OUM4LjEwMDYzIDYuMTU2MzEgOC4wOTM4NiA2LjE2ODY2IDguMDg2NzggNi4xODA4M0M4LjA3OTcxIDYuMTkzMDEgOC4wNzIzNCA2LjIwNTAxIDguMDY0NjggNi4yMTY4M0M4LjA1NzAyIDYuMjI4NjYgOC4wNDkwNyA2LjI0MDI4IDguMDQwODMgNi4yNTE3MUM4LjAzMjU5IDYuMjYzMTMgOC4wMjQwOSA2LjI3NDM2IDguMDE1MyA2LjI4NTM2QzguMDA2NTQgNi4yOTYzOSA3Ljk5NzUyIDYuMzA3MjEgNy45ODgyMyA2LjMxNzhDNy45Nzg5MyA2LjMyODM5IDcuOTY5MzggNi4zMzg3NSA3Ljk1OTU5IDYuMzQ4ODdDNy45NDk3OCA2LjM1ODk5IDcuOTM5NzMgNi4zNjg4NyA3LjkyOTQ2IDYuMzc4NDlDNy45MTkxNyA2LjM4ODExIDcuOTA4NjYgNi4zOTc0OSA3Ljg5NzkxIDYuNDA2NjFDNy44ODcxNiA2LjQxNTcxIDcuODc2MiA2LjQyNDU2IDcuODY1MDIgNi40MzMxM0M3Ljg1Mzg0IDYuNDQxNjkgNy44NDI0NiA2LjQ0OTk5IDcuODMwODcgNi40NThDNy44MTkyOCA2LjQ2NjAyIDcuODA3NSA2LjQ3Mzc0IDcuNzk1NTQgNi40ODExN0M3Ljc4MzU3IDYuNDg4NjEgNy43NzE0MiA2LjQ5NTc1IDcuNzU5MSA2LjUwMjU4QzcuNzQ2NzkgNi41MDk0MSA3LjczNDMyIDYuNTE1OTUgNy43MjE2NyA2LjUyMjE4QzcuNzA5MDMgNi41Mjg0IDcuNjk2MjQgNi41MzQzMiA3LjY4MzMyIDYuNTM5OTFDNy42NzAzOSA2LjU0NTUgNy42NTczMiA2LjU1MDc3IDcuNjQ0MTQgNi41NTU3M0M3LjYzMDk2IDYuNTYwNjggNy42MTc2NCA2LjU2NTMxIDcuNjA0MjMgNi41Njk2MUM3LjU5MDgxIDYuNTczOTEgNy41NzczIDYuNTc3ODggNy41NjM2OSA2LjU4MTUyQzcuNTUwMDkgNi41ODUxNSA3LjUzNjM5IDYuNTg4NDUgNy41MjI2MiA2LjU5MTQxQzcuNTA4ODQgNi41OTQzOCA3LjQ5NSA2LjU5NyA3LjQ4MTEgNi41OTkyOUM3LjQ2NzIgNi42MDE1NyA3LjQ1MzI1IDYuNjAzNSA3LjQzOTI1IDYuNjA1MUM3LjQyNTI1IDYuNjA2NyA3LjQxMTIyIDYuNjA3OTYgNy4zOTcxNyA2LjYwODg2QzcuMzgzMTEgNi42MDk3NiA3LjM2OTAzIDYuNjEwMzIgNy4zNTQ5NSA2LjYxMDU1QzcuMzQwODYgNi42MTA3NyA3LjMyNjc3IDYuNjEwNjQgNy4zMTI2OSA2LjYxMDE2QzcuMjk4NjEgNi42MDk2OCA3LjI4NDU1IDYuNjA4ODYgNy4yNzA1MSA2LjYwNzY5QzcuMjU2NDcgNi42MDY1MyA3LjI0MjQ3IDYuNjA1MDIgNy4yMjg1IDYuNjAzMTVDNy4yMTQ1MyA2LjYwMTMgNy4yMDA2MiA2LjU5OTExIDcuMTg2NzcgNi41OTY1N0M3LjE3MjkxIDYuNTk0MDIgNy4xNTkxMyA2LjU5MTE1IDcuMTQ1NCA2LjU4NzkzQzcuMTMxNjggNi41ODQ3MiA3LjExODA1IDYuNTgxMTcgNy4xMDQ1MiA2LjU3NzI4QzcuMDkwOTggNi41NzM0IDcuMDc3NTQgNi41NjkxOCA3LjA2NDIgNi41NjQ2M0M3LjA1MDg3IDYuNTYwMDkgNy4wMzc2NSA2LjU1NTIxIDcuMDI0NTYgNi41NTAwMkM3LjAxMTQ3IDYuNTQ0ODMgNi45OTg1MSA2LjUzOTMxIDYuOTg1NjggNi41MzM0N0M2Ljk3Mjg2IDYuNTI3NjQgNi45NjAxOSA2LjUyMTUgNi45NDc2NiA2LjUxNTA0QzYuOTM1MTMgNi41MDg1OCA2LjkyMjc4IDYuNTAxODIgNi45MTA1OSA2LjQ5NDc1QzYuODk4MzkgNi40ODc2OSA2Ljg4NjM4IDYuNDgwMzQgNi44NzQ1NiA2LjQ3MjY5QzYuODYyNzMgNi40NjUwNCA2Ljg1MTEgNi40NTcwOSA2LjgzOTY2IDYuNDQ4ODZDNi44MjgyMiA2LjQ0MDY0IDYuODE3IDYuNDMyMTQgNi44MDU5NyA2LjQyMzM2Wk01LjYyNTMyIDguOTA1MzVDNS4xNjczMSA4LjkwNTM1IDQuNzY0NjQgOC41MDQwMSA0Ljc2NDY0IDguMDQ0MDJDNC43NjQ2NCA3LjU4NjAzIDUuMTY1MzIgNy4xODMzNiA1LjYyNTMyIDcuMTgzMzZDNi4wODMzMSA3LjE4MzM2IDYuNDg1OTggNy41ODYwMyA2LjQ4NTk4IDguMDQ0MDJDNi40ODU5OCA4LjUwMjY4IDYuMDg0NjQgOC45MDUzNSA1LjYyNTMyIDguOTA1MzVaIiAgIGZpbGw9IiNFNDQ5NUIiID48L3BhdGg+PC9nPjxkZWZzPjxjbGlwUGF0aCBpZD0iY2xpcC1wYXRoLXVEbXBUYVlCZC1HQWJ2bVU0a1JTbSI+PHBhdGggZD0iTTIuNSAxNC41TDE0LjUgMTQuNUwxNC41IDIuNUwyLjUgMi41TDIuNSAxNC41WiIgZmlsbD0id2hpdGUiLz48L2NsaXBQYXRoPjwvZGVmcz48L3N2Zz4=',
16
+ image2x: 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAXNSR0IArs4c6QAAAARzQklUCAgICHwIZIgAAAGtSURBVFiF7ZbhUcJAEIU/Gf8TKjB2oB3ECtQKCBUoFYgVgBUQKlArgA7ECggVECvQH7vHHeEmCXCMM8qbyVwme7l9t/t27+CE/44zz7cYSIGLwL7mwDuQV026A1bA95GelfpYw41ABCx0zIDZHruswhXwiETgGijKExJlOQ3s2MVUfSTmQ8sxmpznRyRg1l7rq+Wft4EhkrsVMAjN6LzGPkDyZvAEtIF+KAJ1EXjQ8VIfkBINhiYpOCrqUpAhKVg4315q/kl0jJDmU+ApuaYE+sAXNhUZfiGmQNdxXsYMIR5VOesiNTquIeUiRqJT7nZT4FVtvs7aNQscooFUHcRIffcQoXaAG+AeK94USUcldolAit3NYAfSphOuI+DTQIwcGG3gE9ldUbIP9f15RwJ5ldFEwHeCDdUx2F3sc2aMaaCBHFHtm75H2FIcY5Xe24PAFnwEZmyKqAOM1JbqmBHo0GpSBQXSD3pYLUxCOIf6RuQiQ0opJuBlxSWw1DGumD+nQT1XwKxtfG1dyT500uhARz4kiIYKRFve8+FXL6UGMXCLXCJDYknA6jnh7+AHjaWWLLCZ8v4AAAAASUVORK5CYII=',
14
17
  italic2x: 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAXNSR0IArs4c6QAAAARzQklUCAgICHwIZIgAAACtSURBVFiF7ZZhCoMwDIXj2L2Wmy03MzuZ+9NqkBVtXkoY9INSQZv3fDRaosnkz1iJaHMMbhV8DLV7g2fn858yzrzLrI372qnTBdMRtYwUaiHGQDcRe+AVUAMCih9NwIpqhgGLywAKvPuRBBhYG4IQ0H4VJIHafpplgMv869M73ICYa80wYIEMeAn7+XgSYFQURSig/SrLDbEzV4eP1jqXAe9bXtXdST8TTibpfAEImy7CCzNLkwAAAABJRU5ErkJggg==',
15
18
  link2x: 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAXNSR0IArs4c6QAAAARzQklUCAgICHwIZIgAAAEGSURBVFiF7VdbDsMgDPOk3Wu52dKTtT3Z9jGYsoiCA1T7qSWEqhLbJDxa4MKfcZvIJQCe5nlPvU7UKEIBvBrtFBMl4dU1/17OEtcKuR87bMLPjCGcaiKTrUEiwW+phqCdcTZ7IbFeQQ9BsAyK+FbSxliaz6aLrbcSApQBL86A3R1NA8q6TBDEDFe5e8QjR67lj7urkLEx9OzlBHFbpqYBlogxK4y4JT5aRJ6I2R2CQKYYA9PXyJ0gytgALIY8goWJUXRcFASnsIMFsRSX4oevWbvIJBCnGDP/hSC2yr34sIEIoaDv86zLRM5IbqV308Qz5EBsqjD7Z6Spf6R+x+dc2EbELwDAGwAuxWOeKuGGAAAAAElFTkSuQmCC',
16
19
  menu2: 'data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPHN2ZyB3aWR0aD0iMWVtIiBoZWlnaHQ9IjFlbSIgdmlld0JveD0iMCAwIDI1NiAyNTYiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgY2xhc3M9Imxhcmt1aS1pY29uIGxhcmt1aS1pY29uLWRyYWciIHN0eWxlPSJ3aWR0aDogMTZweDsgaGVpZ2h0OiAxNnB4OyI+PHBhdGggZD0iTTg4IDE4N2M5Ljk0MSAwIDE4IDguMDU5IDE4IDE4cy04LjA1OSAxOC0xOCAxOC0xOC04LjA1OS0xOC0xOCA4LjA1OS0xOCAxOC0xOFptODAgMGM5Ljk0MSAwIDE4IDguMDU5IDE4IDE4cy04LjA1OSAxOC0xOCAxOC0xOC04LjA1OS0xOC0xOCA4LjA1OS0xOCAxOC0xOFptLTgwLTc2YzkuOTQxIDAgMTggOC4wNTkgMTggMThzLTguMDU5IDE4LTE4IDE4LTE4LTguMDU5LTE4LTE4IDguMDU5LTE4IDE4LTE4Wm04MCAwYzkuOTQxIDAgMTggOC4wNTkgMTggMThzLTguMDU5IDE4LTE4IDE4LTE4LTguMDU5LTE4LTE4IDguMDU5LTE4IDE4LTE4Wk04OCAzNWM5Ljk0MSAwIDE4IDguMDU5IDE4IDE4cy04LjA1OSAxOC0xOCAxOC0xOC04LjA1OS0xOC0xOCA4LjA1OS0xOCAxOC0xOFptODAgMGM5Ljk0MSAwIDE4IDguMDU5IDE4IDE4cy04LjA1OSAxOC0xOCAxOC0xOC04LjA1OS0xOC0xOCA4LjA1OS0xOCAxOC0xOFoiIGZpbGw9ImN1cnJlbnRDb2xvciIgZmlsbC1ydWxlPSJub256ZXJvIj48L3BhdGg+PC9zdmc+',
package/src/index.ts CHANGED
@@ -1,5 +1,6 @@
1
- import {ComponentFactory, EditorBody, EditorComponent, EditorContent, EditorParagraph, EditorParagraphMenu, EditorToolbar} from "./componets";
1
+ import {ComponentFactory, EditorBody, EditorComponent, EditorToolbar, EditorFunction} from "./componets";
2
2
  import { SelectionUtils } from "./utils";
3
+ import {images} from "./images";
3
4
 
4
5
  export type YangEditorMode = "edit" | "readonly";
5
6
 
@@ -8,6 +9,14 @@ export interface YangEditorColor {
8
9
  name: string;
9
10
  }
10
11
 
12
+ export interface YangEditorMenuItem {
13
+ name: string;
14
+ icon: string;
15
+ className?: string;
16
+ callback?: EditorFunction;
17
+ args?: any
18
+ }
19
+
11
20
  export interface YangEditorOptions {
12
21
  elem: string;
13
22
  width: string;
@@ -16,6 +25,7 @@ export interface YangEditorOptions {
16
25
  events: {
17
26
  onContentChange?: (html: string) => void,
18
27
  },
28
+ menus?: YangEditorMenuItem[],
19
29
  components?: {
20
30
  foreColorStrip?: {
21
31
  colors?: YangEditorColor[]
@@ -29,6 +39,20 @@ export interface YangEditorOptions {
29
39
  }
30
40
  }
31
41
 
42
+ const defaultOptions : YangEditorOptions = {
43
+ menus: [
44
+ { name: "折叠面板", icon: images.collapse2x, className: 'gray', callback: "insertCollapse", args: {className: "gray"} },
45
+ { name: "图片", icon: images.image2x, args: null },
46
+ { name: "代码块", icon: images.code2x, args: null },
47
+ ],
48
+ components: {},
49
+ elem: "yang-editor",
50
+ events: {},
51
+ width: "100%",
52
+ height: "auto",
53
+ mode: 'edit'
54
+ }
55
+
32
56
  export class YangEditor {
33
57
 
34
58
  public readonly element: HTMLElement;
@@ -36,10 +60,13 @@ export class YangEditor {
36
60
  public readonly body: EditorBody;
37
61
  public readonly selectionUtils: SelectionUtils;
38
62
  public readonly componentFactory: ComponentFactory;
63
+ public readonly options: YangEditorOptions;
39
64
 
40
65
  private components: Array<EditorComponent> = new Array<EditorComponent>();
41
66
 
42
- constructor(public options: YangEditorOptions) {
67
+ constructor(options: YangEditorOptions) {
68
+ this.options = {...defaultOptions, ...options};
69
+
43
70
  let element = document.getElementById(options.elem);
44
71
  if(element === null ) {
45
72
  throw new Error(`Invalid Yang Editor option "${options.elem}"`);
package/src/style.css CHANGED
@@ -73,8 +73,24 @@
73
73
  background-size: contain;
74
74
  background-repeat: no-repeat;
75
75
  cursor: pointer;
76
+ position: relative;
77
+ }
78
+
79
+ .yang-editor-button-add .yang-editor-button-add-bridge {
80
+ width: 128px;
81
+ height: 40px;
82
+ position: absolute;
83
+ top: -4px;
84
+ left: -4px;
85
+ display: none;
86
+ }
87
+
88
+ .yang-editor .yang-editor-button-add:hover .yang-editor-button-add-bridge {
89
+ display: block;
90
+ z-index: 1;
76
91
  }
77
92
 
93
+
78
94
  .yang-editor .yang-editor-color-strip {
79
95
  padding-left: 19px;
80
96
  display: flex;
@@ -289,3 +305,54 @@
289
305
  border-radius: 6px;
290
306
  }
291
307
 
308
+ .yang-editor .yang-editor-button-add:hover .yang-editor-component-menu {
309
+ display: block;
310
+ }
311
+
312
+ .yang-editor .yang-editor-component-menu {
313
+ width: 180px;
314
+ padding: 4px 8px;
315
+ opacity: 1;
316
+ background: rgba(255, 255, 255, 1);
317
+ border: 1px solid rgba(217, 217, 217, 1);
318
+ box-shadow: 1px 1px 5px rgba(217, 217, 217, 0.3);
319
+ border-radius: 6px;
320
+ position: absolute;
321
+ left: 0;
322
+ top: 31px;
323
+ display: none;
324
+ z-index: 1;
325
+ }
326
+
327
+ .yang-editor .yang-editor-component-menu-item {
328
+ border-radius: 6px;
329
+ cursor: pointer;
330
+ padding: 8px;
331
+ display: flex;
332
+ align-items: center;
333
+ }
334
+
335
+ .yang-editor .yang-editor-component-menu-item:hover {
336
+ background: rgba(239, 240, 240, 1);
337
+ }
338
+
339
+ .yang-editor .yang-editor-component-menu-item-icon {
340
+ flex-shrink: 0;
341
+ background: transparent;
342
+ margin-right: 8px;
343
+ background-size: 16px 16px;
344
+ background-repeat: no-repeat;
345
+ background-position: center;
346
+ width: 20px;
347
+ height: 20px;
348
+ cursor: pointer;
349
+ border: none;
350
+ outline: none;
351
+
352
+ }
353
+
354
+ .yang-editor .yang-editor-component-menu-item-text {
355
+ flex-shrink: 1;
356
+ flex-grow: 1;
357
+ text-align: left;
358
+ }
package/src/utils.ts CHANGED
@@ -2,7 +2,7 @@ import { ComponentFactory } from "./componets";
2
2
 
3
3
  export class SelectionUtils {
4
4
 
5
- private element: HTMLElement;
5
+ private readonly element: HTMLElement;
6
6
 
7
7
  constructor(element: HTMLElement) {
8
8
  this.element = element;
@@ -35,4 +35,98 @@ export class SelectionUtils {
35
35
  }
36
36
  return null;
37
37
  }
38
+ }
39
+
40
+ /**
41
+ * utils for format cleaning
42
+ */
43
+ export class FormatCleaner {
44
+
45
+ private static unwantedTags = ['style', 'script', 'link', 'meta', 'head', 'title', 'xml'];
46
+
47
+ /**
48
+ * clean HTML string and return plain text
49
+ * @param htmlString html string
50
+ * @returns plain text
51
+ */
52
+ static cleanHTMLString(htmlString: string): string {
53
+ // remove Word XML namespace labels
54
+ htmlString = htmlString.replace(/<\/?[ovwm]:[^>]*>/gi, '');
55
+
56
+ // remove Word conditional comments
57
+ htmlString = htmlString.replace(/<!--\[if[\s\S]*?<!\[endif\]-->/gi, '');
58
+ htmlString = htmlString.replace(/<!--[\s\S]*?-->/g, '');
59
+
60
+ const tempDiv = document.createElement('div');
61
+ tempDiv.innerHTML = htmlString;
62
+
63
+ // remove all <style> tags (including @page, @font-face rules)
64
+ const styleTags = tempDiv.querySelectorAll('style');
65
+ styleTags.forEach(style => style.remove());
66
+
67
+ // remove other unwanted tags
68
+ FormatCleaner.unwantedTags.forEach(tag => {
69
+ const elements = tempDiv.querySelectorAll(tag);
70
+ elements.forEach(el => el.remove());
71
+ });
72
+
73
+ return this.extractPlainText(tempDiv);
74
+ }
75
+
76
+ /**
77
+ * extract plain text from node, remove all HTML tags and styles
78
+ * @param node DOM node
79
+ * @returns plain text content
80
+ */
81
+ static extractPlainText(node: Node): string {
82
+ if (node.nodeType === Node.TEXT_NODE) {
83
+ return node.textContent || '';
84
+ } else if (node.nodeType === Node.ELEMENT_NODE) {
85
+ const element = node as HTMLElement;
86
+ const tagName = element.tagName.toLowerCase();
87
+ if (FormatCleaner.unwantedTags.includes(tagName)) {
88
+ return '';
89
+ }
90
+ if (tagName === 'br') {
91
+ return '\n';
92
+ }
93
+ // block elements(p、div etc.)
94
+ const isBlock = ['p', 'div', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6',
95
+ 'li', 'tr', 'td', 'th', 'blockquote', 'pre'].includes(tagName);
96
+ let result = '';
97
+ for (let child of Array.from(element.childNodes)) {
98
+ result += this.extractPlainText(child);
99
+ }
100
+ if (isBlock && result.trim()) {
101
+ result += '\n';
102
+ }
103
+ return result;
104
+ }
105
+ return '';
106
+ }
107
+
108
+ /**
109
+ * remove all styles and other properties
110
+ * @param element HTML element
111
+ */
112
+ static removeAllStyles(element: HTMLElement): void {
113
+ // remove style attribute
114
+ element.removeAttribute('style');
115
+
116
+ // remove common format attributes
117
+ const formatAttributes = ['class', 'align', 'valign', 'bgcolor', 'color',
118
+ 'face', 'size', 'width', 'height', 'border',
119
+ 'cellpadding', 'cellspacing', 'dir'];
120
+
121
+ formatAttributes.forEach(attr => {
122
+ if (element.hasAttribute(attr)) {
123
+ element.removeAttribute(attr);
124
+ }
125
+ });
126
+
127
+ // recursively process child elements
128
+ for (let child of Array.from(element.children)) {
129
+ this.removeAllStyles(child as HTMLElement);
130
+ }
131
+ }
38
132
  }