@matechat/ng 0.0.1-alpha.0 → 20.0.1-alpha.0

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 (42) hide show
  1. package/Base/base.component.d.ts +5 -5
  2. package/Bubble/bubble.component.d.ts +7 -5
  3. package/Input/button/button.component.d.ts +3 -2
  4. package/Input/input.component.d.ts +13 -4
  5. package/MarkdownCard/code-block.component.d.ts +49 -0
  6. package/MarkdownCard/index.d.ts +3 -0
  7. package/MarkdownCard/markdown-card.component.d.ts +200 -0
  8. package/MarkdownCard/markdown-card.module.d.ts +13 -0
  9. package/README.md +117 -13
  10. package/components-common/Base/foundation.d.ts +2 -0
  11. package/components-common/MarkdownCard/codeblock-foundation.d.ts +21 -0
  12. package/components-common/MarkdownCard/common/MDCardService.d.ts +14 -0
  13. package/components-common/MarkdownCard/common/MermaidService.d.ts +23 -0
  14. package/components-common/MarkdownCard/common/mdCard.types.d.ts +56 -0
  15. package/components-common/MarkdownCard/common/parser.d.ts +150 -0
  16. package/components-common/MarkdownCard/foundation.d.ts +38 -0
  17. package/esm2022/Base/base.component.mjs +2 -2
  18. package/esm2022/Bubble/bubble.component.mjs +15 -8
  19. package/esm2022/Input/button/button.component.mjs +1 -1
  20. package/esm2022/Input/input.component.mjs +107 -3
  21. package/esm2022/Locale/locale.service.mjs +5 -5
  22. package/esm2022/MarkdownCard/code-block.component.mjs +175 -0
  23. package/esm2022/MarkdownCard/index.mjs +4 -0
  24. package/esm2022/MarkdownCard/markdown-card.component.mjs +436 -0
  25. package/esm2022/MarkdownCard/markdown-card.module.mjs +44 -0
  26. package/esm2022/components-common/Base/foundation.mjs +4 -1
  27. package/esm2022/components-common/Input/foundation.mjs +1 -2
  28. package/esm2022/components-common/MarkdownCard/codeblock-foundation.mjs +132 -0
  29. package/esm2022/components-common/MarkdownCard/common/MDCardService.mjs +69 -0
  30. package/esm2022/components-common/MarkdownCard/common/MermaidService.mjs +222 -0
  31. package/esm2022/components-common/MarkdownCard/common/mdCard.types.mjs +6 -0
  32. package/esm2022/components-common/MarkdownCard/common/parser.mjs +194 -0
  33. package/esm2022/components-common/MarkdownCard/foundation.mjs +84 -0
  34. package/esm2022/public-api.mjs +2 -1
  35. package/fesm2022/matechat-ng.mjs +1514 -17
  36. package/fesm2022/matechat-ng.mjs.map +1 -1
  37. package/package.json +12 -7
  38. package/public-api.d.ts +1 -0
  39. package/fesm2022/matechat-ng-en-us-DsYnUbZd.mjs +0 -28
  40. package/fesm2022/matechat-ng-en-us-DsYnUbZd.mjs.map +0 -1
  41. package/fesm2022/matechat-ng-zh-cn--_YVZHnW.mjs +0 -28
  42. package/fesm2022/matechat-ng-zh-cn--_YVZHnW.mjs.map +0 -1
@@ -0,0 +1,436 @@
1
+ import { DiffDOM } from 'diff-dom';
2
+ import { Component, Input, ViewChild, Output, EventEmitter, ViewContainerRef, } from '@angular/core';
3
+ import markdownit from 'markdown-it';
4
+ import { MDCardService } from '../components-common/MarkdownCard/common/MDCardService';
5
+ import { CodeBlockComponent } from './code-block.component';
6
+ import BaseComponent from '../Base/base.component';
7
+ import { MarkdownCardFoundation, } from '../components-common/MarkdownCard/foundation';
8
+ import MdParserUtils from '../components-common/MarkdownCard/common/parser';
9
+ import * as i0 from "@angular/core";
10
+ import * as i1 from "@angular/common";
11
+ export class MarkdownCardComponent extends BaseComponent {
12
+ constructor(renderer, cdr) {
13
+ super();
14
+ this.renderer = renderer;
15
+ this.cdr = cdr;
16
+ this.content = '';
17
+ this.typing = false;
18
+ this.enableThink = false;
19
+ this.typingOptions = {};
20
+ this.thinkOptions = {};
21
+ this.mdOptions = {};
22
+ this.mdPlugins = [];
23
+ this.customXssRules = [];
24
+ this.theme = 'light';
25
+ this.enableMermaid = false;
26
+ this.mermaidConfig = {};
27
+ this.actionsTemplate = null;
28
+ this.headerTemplate = null;
29
+ this.contentTemplate = null;
30
+ // 组件缓存映射表,用于存储已创建的CodeBlockComponent实例
31
+ this.codeBlockComponentsCache = new Map();
32
+ this.afterMdtInit = new EventEmitter();
33
+ this.typingStart = new EventEmitter();
34
+ this.typingEvent = new EventEmitter();
35
+ this.typingEnd = new EventEmitter();
36
+ this.typingIndex = 0;
37
+ this.isTyping = false;
38
+ this.timer = null;
39
+ this.parser = MdParserUtils;
40
+ this.noDiff = false;
41
+ this.mdt = markdownit({
42
+ breaks: true,
43
+ linkify: true,
44
+ html: true,
45
+ highlight: (str, lang) => {
46
+ // 与Vue组件保持一致的高亮处理
47
+ return '';
48
+ },
49
+ ...this.mdOptions,
50
+ });
51
+ this.mdCardService = new MDCardService();
52
+ this.foundation = new MarkdownCardFoundation(this.adapter);
53
+ // 初始化 diffDom 实例
54
+ this.diffDom = new DiffDOM({
55
+ // 配置filterOuterDiff钩子,识别code-block-wrapper元素并直接替换
56
+ filterOuterDiff: (t1, t2, diffs) => {
57
+ // 检查是否是class为code-block-wrapper的div元素
58
+ const isTargetElement = t2.nodeName === 'DIV' &&
59
+ t2.attributes &&
60
+ t2.attributes.class &&
61
+ t2.attributes.class.includes('code-block-wrapper');
62
+ if (isTargetElement) {
63
+ t1.innerDone = true;
64
+ t2.innerDone = true;
65
+ }
66
+ },
67
+ });
68
+ }
69
+ ngOnInit() {
70
+ this.mdCardService.setMdPlugins(this.mdPlugins || [], this.mdt);
71
+ this.parseContent();
72
+ this.afterMdtInit.emit(this.mdt);
73
+ }
74
+ get adapter() {
75
+ return {
76
+ ...super.adapter,
77
+ locale: (key, params) => this.adapter.locale(key, params),
78
+ typingStart: () => this.typingStart.emit(),
79
+ typingEnd: () => this.typingEnd.emit(),
80
+ typingEvent: () => this.typingEvent.emit(),
81
+ parseContent: (content) => {
82
+ // 解析 Markdown 内容
83
+ const tokens = this.mdt.parse(content, {});
84
+ const ast = this.parser.tokensToAst(tokens);
85
+ const vnodes = this.astToVnodes(ast);
86
+ this.renderContent(vnodes);
87
+ },
88
+ };
89
+ }
90
+ ngOnChanges(changes) {
91
+ if (changes['content']) {
92
+ if (!this.typing) {
93
+ this.typingIndex = this.content?.length || 0;
94
+ this.parseContent();
95
+ return;
96
+ }
97
+ if (this.content.indexOf(changes['content']?.previousValue) === -1) {
98
+ this.typingIndex = 0;
99
+ }
100
+ // 使用setTimeout模拟Vue的nextTick行为
101
+ setTimeout(() => this.typewriterStart());
102
+ }
103
+ if (changes['enableThink'] || changes['thinkOptions'] || changes['theme']) {
104
+ this.parseContent();
105
+ }
106
+ if (changes['customXssRules']) {
107
+ this.mdCardService.setCustomXssRules(this.customXssRules || []);
108
+ this.parseContent();
109
+ }
110
+ if (changes['mdPlugins']) {
111
+ this.mdCardService.setMdPlugins(this.mdPlugins || [], this.mdt);
112
+ this.parseContent();
113
+ }
114
+ }
115
+ parseContent() {
116
+ this.foundation.parseContent();
117
+ }
118
+ renderContent(vnodes) {
119
+ if (!this.markdownContainer || !this.markdownContainer.element) {
120
+ return;
121
+ }
122
+ if (this.noDiff) {
123
+ this.renderContentNoDiff(vnodes);
124
+ return;
125
+ }
126
+ const container = this.markdownContainer.element.nativeElement;
127
+ const parser = new DOMParser();
128
+ const newContainerDiv = parser.parseFromString(`<div></div>`, 'text/html');
129
+ const codeBlockWrappers = vnodes.filter((node) => {
130
+ return (node.nodeName === 'DIV' &&
131
+ node.className?.includes('code-block-wrapper'));
132
+ });
133
+ vnodes.forEach((node) => {
134
+ if (node &&
135
+ (node.nodeType ||
136
+ typeof node === 'string' ||
137
+ node instanceof HTMLElement)) {
138
+ if (codeBlockWrappers.includes(node)) {
139
+ newContainerDiv.body.firstChild?.appendChild(this.getEmptyCodeBlock(node));
140
+ }
141
+ else {
142
+ newContainerDiv.body.firstChild?.appendChild(node);
143
+ }
144
+ }
145
+ });
146
+ let newContainerDivHTML = newContainerDiv.body?.firstChild?.outerHTML || '';
147
+ const patches = this.diffDom.diff(container, newContainerDivHTML);
148
+ this.diffDom.apply(container, patches);
149
+ // 将codeBlockWrappers中的每个div元素替换container中的对应key属性的元素
150
+ codeBlockWrappers.forEach((newCodeBlock) => {
151
+ if (newCodeBlock &&
152
+ newCodeBlock.attributes &&
153
+ newCodeBlock.attributes.key) {
154
+ const key = newCodeBlock?.attributes?.key?.value;
155
+ const existingElement = container.querySelector(`[key="${key}"]`);
156
+ if (existingElement &&
157
+ newCodeBlock instanceof HTMLElement &&
158
+ existingElement !== newCodeBlock) {
159
+ existingElement.replaceWith(newCodeBlock);
160
+ }
161
+ }
162
+ });
163
+ }
164
+ getEmptyCodeBlock(node) {
165
+ const codeNode = document.createElement('div');
166
+ codeNode.className = 'code-block-wrapper';
167
+ codeNode.setAttribute('key', node?.attributes?.key?.value);
168
+ return codeNode;
169
+ }
170
+ astToVnodes(nodes) {
171
+ return nodes.map((node) => this.processASTNode(node));
172
+ }
173
+ processASTNode(node) {
174
+ if (node.nodeType === 'html_inline' || node.nodeType === 'html_block') {
175
+ return this.processHTMLNode(node);
176
+ }
177
+ if (node.nodeType === 'inline') {
178
+ return this.processInlineToken(node);
179
+ }
180
+ if (this.foundation.isToken(node)) {
181
+ return this.processToken(node);
182
+ }
183
+ return this.processASTNodeInternal(node);
184
+ }
185
+ processHTMLNode(node) {
186
+ if (!node.openNode?.content)
187
+ return;
188
+ const parser = new DOMParser();
189
+ const tagName = node.nodeType === 'html_block' ? 'div' : 'span';
190
+ const containerDocument = parser.parseFromString(`<${tagName}>${node.openNode.content}</${tagName}>`, 'text/html');
191
+ const containerBody = containerDocument.body.firstChild;
192
+ // 处理子节点
193
+ if (node.children && node.children.length > 0) {
194
+ node.children.forEach((child) => {
195
+ const childVnode = this.processASTNode(child);
196
+ if (childVnode && containerBody) {
197
+ (containerBody?.firstChild || containerBody).appendChild(childVnode);
198
+ }
199
+ });
200
+ }
201
+ return containerBody;
202
+ }
203
+ renderContentNoDiff(vnodes) {
204
+ const container = this.markdownContainer.element.nativeElement;
205
+ const newContentFragement = this.renderer.createElement('div');
206
+ vnodes.forEach((node) => {
207
+ if (node &&
208
+ (node.nodeType ||
209
+ typeof node === 'string' ||
210
+ node instanceof HTMLElement)) {
211
+ newContentFragement.appendChild(node);
212
+ }
213
+ });
214
+ while (container.firstChild) {
215
+ container.removeChild(container.firstChild);
216
+ }
217
+ container.appendChild(newContentFragement);
218
+ }
219
+ processInlineToken(node) {
220
+ let html = '';
221
+ try {
222
+ if (!node.openNode) {
223
+ return null;
224
+ }
225
+ html = this.mdt.renderer.render([node.openNode], this.mdt.options, {});
226
+ }
227
+ catch (error) {
228
+ console.error('Error rendering inline token:', node);
229
+ return null;
230
+ }
231
+ // 将HTML字符串转换为DOM节点
232
+ const parser = new DOMParser();
233
+ const doc = parser.parseFromString(`<div>${html}</div>`, 'text/html');
234
+ const token = doc.body.firstChild;
235
+ // 如果只有一个子节点,直接返回子节点而不是包含div
236
+ if (token && token.childNodes.length === 1) {
237
+ return token.firstChild;
238
+ }
239
+ return token;
240
+ }
241
+ processFenceNode(token) {
242
+ const language = token.info?.replace(/<span\b[^>]*>/i, '').replace('</span>', '') || '';
243
+ const code = token.content || '';
244
+ return this.createCodeBlock(language, code, token.tokenIndex || 0);
245
+ }
246
+ processASTNodeInternal(node) {
247
+ let tagName = 'div';
248
+ if (node.openNode?.tag && this.parser.isValidTagName(node.openNode?.tag)) {
249
+ tagName = node.openNode?.tag;
250
+ }
251
+ const element = this.renderer.createElement(tagName);
252
+ // 设置属性
253
+ if (node.openNode.attrs) {
254
+ node.openNode.attrs.forEach(([key, value]) => {
255
+ this.renderer.setAttribute(element, key, value);
256
+ });
257
+ }
258
+ // 特殊处理fence类型的token
259
+ if (node.openNode.type === 'fence') {
260
+ return this.processFenceNode(node.openNode);
261
+ }
262
+ // 处理所有带tag的AST节点
263
+ if (node.openNode?.tag) {
264
+ let tagName = this.parser.isValidTagName(node.openNode?.tag)
265
+ ? node.openNode?.tag
266
+ : 'div';
267
+ const element = this.renderer.createElement(tagName);
268
+ // 递归处理所有子节点并添加到当前元素
269
+ node.children.forEach((child) => {
270
+ const childNode = this.processASTNode(child);
271
+ if (childNode) {
272
+ element.appendChild(childNode);
273
+ }
274
+ });
275
+ return element;
276
+ }
277
+ node.children.forEach((child) => {
278
+ const childNode = this.processASTNode(child);
279
+ if (childNode) {
280
+ element.appendChild(childNode);
281
+ }
282
+ });
283
+ return element;
284
+ }
285
+ processToken(token) {
286
+ if (token.type === 'text') {
287
+ return this.renderer.createText(token.content || '');
288
+ }
289
+ if (token.type === 'inline') {
290
+ return this.processInlineToken(token);
291
+ }
292
+ if (token.type === 'fence') {
293
+ return this.processFenceNode(token);
294
+ }
295
+ if (token.type === 'softbreak') {
296
+ if (this.mdt.options.breaks) {
297
+ return this.renderer.createElement('br');
298
+ }
299
+ else {
300
+ return this.renderer.createText('\n');
301
+ }
302
+ }
303
+ if (token.type === 'html_block' || token.type === 'html_inline') {
304
+ const parser = new DOMParser();
305
+ const tagName = token.type === 'html_block' ? 'div' : 'span';
306
+ const doc = parser.parseFromString(`<${tagName}>${token.content}</${tagName}>`, 'text/html');
307
+ const tokenDom = doc.body;
308
+ // 如果只有一个子节点,直接返回子节点而不是包含div
309
+ if (tokenDom.firstChild && tokenDom.childNodes.length === 1) {
310
+ return tokenDom.firstChild;
311
+ }
312
+ return tokenDom;
313
+ }
314
+ if (token.tag) {
315
+ const tagName = this.parser.isValidTagName(token.tag) ? token.tag : 'div';
316
+ const element = this.renderer.createElement(tagName);
317
+ if (token.attrs) {
318
+ token.attrs.forEach(([key, value]) => {
319
+ this.renderer.setAttribute(element, key, value);
320
+ });
321
+ }
322
+ // 设置内容
323
+ if (token.content) {
324
+ const textNode = this.renderer.createText(token.content);
325
+ element.appendChild(textNode);
326
+ }
327
+ return element;
328
+ }
329
+ return this.renderer.createText(token.content || '');
330
+ }
331
+ createCodeBlock(language, code, blockIndex) {
332
+ const key = `code-block-${blockIndex}`;
333
+ // 检查缓存中是否已存在相同blockIndex的组件
334
+ if (this.codeBlockComponentsCache.has(key)) {
335
+ const cachedItem = this.codeBlockComponentsCache.get(key);
336
+ if (cachedItem) {
337
+ // 更新现有组件的属性
338
+ const componentRef = cachedItem.componentRef;
339
+ componentRef.setInput('language', language);
340
+ componentRef.setInput('code', code);
341
+ componentRef.setInput('theme', this.theme);
342
+ // 触发变更检测
343
+ componentRef.changeDetectorRef.detectChanges();
344
+ // 返回缓存的容器,无需重新创建
345
+ return cachedItem.container;
346
+ }
347
+ }
348
+ // 缓存中不存在,创建新组件
349
+ const codeBlockContainer = this.renderer.createElement('div');
350
+ this.renderer.setAttribute(codeBlockContainer, 'key', key);
351
+ const componentRef = this.markdownContainer.createComponent(CodeBlockComponent, {
352
+ projectableNodes: [],
353
+ injector: this.markdownContainer.injector,
354
+ });
355
+ // 设置组件属性
356
+ componentRef.instance.language = language;
357
+ componentRef.instance.code = code;
358
+ componentRef.instance.blockIndex = blockIndex;
359
+ componentRef.instance.theme = this.theme;
360
+ componentRef.instance.enableMermaid = this.enableMermaid;
361
+ componentRef.instance.mermaidConfig = this.mermaidConfig || {};
362
+ componentRef.instance.actionsTemplate = this.actionsTemplate;
363
+ componentRef.instance.headerTemplate = this.headerTemplate;
364
+ componentRef.instance.contentTemplate = this.contentTemplate;
365
+ // 触发变更检测
366
+ componentRef.changeDetectorRef.detectChanges();
367
+ // 将组件的DOM元素附加到容器中
368
+ this.renderer.appendChild(codeBlockContainer, componentRef.location.nativeElement);
369
+ // 添加样式类
370
+ this.renderer.addClass(codeBlockContainer, 'code-block-wrapper');
371
+ // 缓存组件实例和容器
372
+ this.codeBlockComponentsCache.set(key, {
373
+ componentRef: componentRef,
374
+ container: codeBlockContainer,
375
+ });
376
+ // 返回创建的DOM容器
377
+ return codeBlockContainer;
378
+ }
379
+ typewriterStart() {
380
+ this.foundation.typewriterStart();
381
+ }
382
+ // 在组件销毁时清理缓存,避免内存泄漏
383
+ ngOnDestroy() {
384
+ // 销毁所有缓存的组件实例
385
+ this.codeBlockComponentsCache.forEach((cachedItem) => {
386
+ cachedItem.componentRef.destroy();
387
+ });
388
+ this.codeBlockComponentsCache.clear();
389
+ }
390
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.0", ngImport: i0, type: MarkdownCardComponent, deps: [{ token: i0.Renderer2 }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component }); }
391
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.0", type: MarkdownCardComponent, selector: "mc-markdown-card", inputs: { content: "content", typing: "typing", enableThink: "enableThink", typingOptions: "typingOptions", thinkOptions: "thinkOptions", mdOptions: "mdOptions", mdPlugins: "mdPlugins", customXssRules: "customXssRules", theme: "theme", enableMermaid: "enableMermaid", mermaidConfig: "mermaidConfig", actionsTemplate: "actionsTemplate", headerTemplate: "headerTemplate", contentTemplate: "contentTemplate" }, outputs: { afterMdtInit: "afterMdtInit", typingStart: "typingStart", typingEvent: "typingEvent", typingEnd: "typingEnd" }, viewQueries: [{ propertyName: "markdownContainer", first: true, predicate: ["markdownContainer"], descendants: true, read: ViewContainerRef, static: true }], usesInheritance: true, usesOnChanges: true, ngImport: i0, template: "<div class=\"mc-markdown-render\" [ngClass]=\"theme === 'dark' ? 'mc-markdown-render-dark' : 'mc-markdown-render-light'\">\n <div #markdownContainer></div>\n</div>\n<ng-content></ng-content>", styles: [".mc-markdown-render ::ng-deep .h1,.mc-markdown-render ::ng-deep .h2,.mc-markdown-render ::ng-deep .h3,.mc-markdown-render ::ng-deep .h4,.mc-markdown-render ::ng-deep .h5,.mc-markdown-render ::ng-deep .h6,.mc-markdown-render ::ng-deep h1,.mc-markdown-render ::ng-deep h2,.mc-markdown-render ::ng-deep h3,.mc-markdown-render ::ng-deep h4,.mc-markdown-render ::ng-deep h5,.mc-markdown-render ::ng-deep h6{line-height:1.1;margin:16px 0 12px}.mc-markdown-render ::ng-deep .h1:first-child,.mc-markdown-render ::ng-deep .h2:first-child,.mc-markdown-render ::ng-deep .h3:first-child,.mc-markdown-render ::ng-deep .h4:first-child,.mc-markdown-render ::ng-deep .h5:first-child,.mc-markdown-render ::ng-deep .h6:first-child,.mc-markdown-render ::ng-deep h1:first-child,.mc-markdown-render ::ng-deep h2:first-child,.mc-markdown-render ::ng-deep h3:first-child,.mc-markdown-render ::ng-deep h4:first-child,.mc-markdown-render ::ng-deep h5:first-child,.mc-markdown-render ::ng-deep h6:first-child{margin-top:0}.mc-markdown-render ::ng-deep h1{font-size:32px;line-height:40px;overflow-wrap:break-word}.mc-markdown-render ::ng-deep h3{line-height:28px;font-size:20px;overflow-wrap:break-word}.mc-markdown-render ::ng-deep caption{border:1px dashed var(--devui-line, #d7d8da);border-bottom:0;padding:3px;text-align:center}.mc-markdown-render ::ng-deep p{overflow-wrap:break-word;margin:0;padding:0;line-height:24px}.mc-markdown-render ::ng-deep p:last-child{margin:0}.mc-markdown-render ::ng-deep ul,.mc-markdown-render ::ng-deep ol{margin:0;padding:0;padding-inline-start:1.75em}.mc-markdown-render ::ng-deep ul>li,.mc-markdown-render ::ng-deep ol>li{line-height:21px}.mc-markdown-render ::ng-deep ul{list-style-type:disc}.mc-markdown-render ::ng-deep ul li::marker{font-size:20px}.mc-markdown-render ::ng-deep ol{list-style-type:decimal}.mc-markdown-render ::ng-deep table{margin-bottom:10px;border-collapse:collapse;display:table}.mc-markdown-render ::ng-deep td,.mc-markdown-render ::ng-deep th{padding:5px 10px;border:1px solid var(--devui-dividing-line, #f2f2f3);background-color:var(--devui-base-bg, #ffffff)}.mc-markdown-render ::ng-deep th{border-top:1px solid var(--devui-dividing-line, #f2f2f3);background-color:var(--devui-global-bg, #f6f6f8)}.mc-markdown-render ::ng-deep td p{margin:0;padding:0}.mc-markdown-render ::ng-deep blockquote{padding:0 8px;margin:0;color:var(--devui-text-weak, #575d6c);border-left:5px solid var(--devui-dividing-line, #f2f2f3)}.mc-markdown-render ::ng-deep a{color:var(--devui-link, #526ecc);text-decoration:none;cursor:pointer}.mc-markdown-render ::ng-deep a:hover{color:var(--devui-link-active, #526ecc)}.mc-markdown-render ::ng-deep img{max-width:100%}.mc-markdown-render{font-size:var(--devui-font-size, 14px);overflow-x:auto}.mc-markdown-render.mc-markdown-render-dark{color:#ced1db}.mc-markdown-render.mc-markdown-render-light{color:#252b3a}::ng-deep .mc-think-block{color:var(--devui-aide-text, #71757f);border-left:1px solid var(--devui-line, #d7d8da);padding-left:8px;margin-bottom:1rem}::ng-deep .mc-typewriter-color{background-image:-webkit-linear-gradient(left,#191919,#5588f0,#e171ee,#f2c55c);background-clip:text;-webkit-background-clip:text;-webkit-text-fill-color:transparent}::ng-deep .mc-typewriter-gradient{background:linear-gradient(to right,var(--devui-text, #252b3a),var(--devui-base-bg, #ffffff));background-clip:text;-webkit-background-clip:text;-webkit-text-fill-color:transparent}::ng-deep .mc-typewriter-cursor{font-weight:900;animation:typewriter .8s linear 0s infinite}@keyframes typewriter{0%{opacity:1}50%{opacity:0}to{opacity:1}}\n"], dependencies: [{ kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }] }); }
392
+ }
393
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.0", ngImport: i0, type: MarkdownCardComponent, decorators: [{
394
+ type: Component,
395
+ args: [{ selector: 'mc-markdown-card', template: "<div class=\"mc-markdown-render\" [ngClass]=\"theme === 'dark' ? 'mc-markdown-render-dark' : 'mc-markdown-render-light'\">\n <div #markdownContainer></div>\n</div>\n<ng-content></ng-content>", styles: [".mc-markdown-render ::ng-deep .h1,.mc-markdown-render ::ng-deep .h2,.mc-markdown-render ::ng-deep .h3,.mc-markdown-render ::ng-deep .h4,.mc-markdown-render ::ng-deep .h5,.mc-markdown-render ::ng-deep .h6,.mc-markdown-render ::ng-deep h1,.mc-markdown-render ::ng-deep h2,.mc-markdown-render ::ng-deep h3,.mc-markdown-render ::ng-deep h4,.mc-markdown-render ::ng-deep h5,.mc-markdown-render ::ng-deep h6{line-height:1.1;margin:16px 0 12px}.mc-markdown-render ::ng-deep .h1:first-child,.mc-markdown-render ::ng-deep .h2:first-child,.mc-markdown-render ::ng-deep .h3:first-child,.mc-markdown-render ::ng-deep .h4:first-child,.mc-markdown-render ::ng-deep .h5:first-child,.mc-markdown-render ::ng-deep .h6:first-child,.mc-markdown-render ::ng-deep h1:first-child,.mc-markdown-render ::ng-deep h2:first-child,.mc-markdown-render ::ng-deep h3:first-child,.mc-markdown-render ::ng-deep h4:first-child,.mc-markdown-render ::ng-deep h5:first-child,.mc-markdown-render ::ng-deep h6:first-child{margin-top:0}.mc-markdown-render ::ng-deep h1{font-size:32px;line-height:40px;overflow-wrap:break-word}.mc-markdown-render ::ng-deep h3{line-height:28px;font-size:20px;overflow-wrap:break-word}.mc-markdown-render ::ng-deep caption{border:1px dashed var(--devui-line, #d7d8da);border-bottom:0;padding:3px;text-align:center}.mc-markdown-render ::ng-deep p{overflow-wrap:break-word;margin:0;padding:0;line-height:24px}.mc-markdown-render ::ng-deep p:last-child{margin:0}.mc-markdown-render ::ng-deep ul,.mc-markdown-render ::ng-deep ol{margin:0;padding:0;padding-inline-start:1.75em}.mc-markdown-render ::ng-deep ul>li,.mc-markdown-render ::ng-deep ol>li{line-height:21px}.mc-markdown-render ::ng-deep ul{list-style-type:disc}.mc-markdown-render ::ng-deep ul li::marker{font-size:20px}.mc-markdown-render ::ng-deep ol{list-style-type:decimal}.mc-markdown-render ::ng-deep table{margin-bottom:10px;border-collapse:collapse;display:table}.mc-markdown-render ::ng-deep td,.mc-markdown-render ::ng-deep th{padding:5px 10px;border:1px solid var(--devui-dividing-line, #f2f2f3);background-color:var(--devui-base-bg, #ffffff)}.mc-markdown-render ::ng-deep th{border-top:1px solid var(--devui-dividing-line, #f2f2f3);background-color:var(--devui-global-bg, #f6f6f8)}.mc-markdown-render ::ng-deep td p{margin:0;padding:0}.mc-markdown-render ::ng-deep blockquote{padding:0 8px;margin:0;color:var(--devui-text-weak, #575d6c);border-left:5px solid var(--devui-dividing-line, #f2f2f3)}.mc-markdown-render ::ng-deep a{color:var(--devui-link, #526ecc);text-decoration:none;cursor:pointer}.mc-markdown-render ::ng-deep a:hover{color:var(--devui-link-active, #526ecc)}.mc-markdown-render ::ng-deep img{max-width:100%}.mc-markdown-render{font-size:var(--devui-font-size, 14px);overflow-x:auto}.mc-markdown-render.mc-markdown-render-dark{color:#ced1db}.mc-markdown-render.mc-markdown-render-light{color:#252b3a}::ng-deep .mc-think-block{color:var(--devui-aide-text, #71757f);border-left:1px solid var(--devui-line, #d7d8da);padding-left:8px;margin-bottom:1rem}::ng-deep .mc-typewriter-color{background-image:-webkit-linear-gradient(left,#191919,#5588f0,#e171ee,#f2c55c);background-clip:text;-webkit-background-clip:text;-webkit-text-fill-color:transparent}::ng-deep .mc-typewriter-gradient{background:linear-gradient(to right,var(--devui-text, #252b3a),var(--devui-base-bg, #ffffff));background-clip:text;-webkit-background-clip:text;-webkit-text-fill-color:transparent}::ng-deep .mc-typewriter-cursor{font-weight:900;animation:typewriter .8s linear 0s infinite}@keyframes typewriter{0%{opacity:1}50%{opacity:0}to{opacity:1}}\n"] }]
396
+ }], ctorParameters: () => [{ type: i0.Renderer2 }, { type: i0.ChangeDetectorRef }], propDecorators: { content: [{
397
+ type: Input
398
+ }], typing: [{
399
+ type: Input
400
+ }], enableThink: [{
401
+ type: Input
402
+ }], typingOptions: [{
403
+ type: Input
404
+ }], thinkOptions: [{
405
+ type: Input
406
+ }], mdOptions: [{
407
+ type: Input
408
+ }], mdPlugins: [{
409
+ type: Input
410
+ }], customXssRules: [{
411
+ type: Input
412
+ }], theme: [{
413
+ type: Input
414
+ }], enableMermaid: [{
415
+ type: Input
416
+ }], mermaidConfig: [{
417
+ type: Input
418
+ }], actionsTemplate: [{
419
+ type: Input
420
+ }], headerTemplate: [{
421
+ type: Input
422
+ }], contentTemplate: [{
423
+ type: Input
424
+ }], afterMdtInit: [{
425
+ type: Output
426
+ }], typingStart: [{
427
+ type: Output
428
+ }], typingEvent: [{
429
+ type: Output
430
+ }], typingEnd: [{
431
+ type: Output
432
+ }], markdownContainer: [{
433
+ type: ViewChild,
434
+ args: ['markdownContainer', { read: ViewContainerRef, static: true }]
435
+ }] } });
436
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWFya2Rvd24tY2FyZC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wcm9qZWN0cy9jb21wb25lbnRzLW5nL3NyYy9NYXJrZG93bkNhcmQvbWFya2Rvd24tY2FyZC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi9wcm9qZWN0cy9jb21wb25lbnRzLW5nL3NyYy9NYXJrZG93bkNhcmQvbWFya2Rvd24tY2FyZC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sVUFBVSxDQUFDO0FBQ25DLE9BQU8sRUFDTCxTQUFTLEVBQ1QsS0FBSyxFQU1MLFNBQVMsRUFDVCxNQUFNLEVBQ04sWUFBWSxFQUVaLGdCQUFnQixHQUVqQixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLFVBQVUsTUFBTSxhQUFhLENBQUM7QUFFckMsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLHdEQUF3RCxDQUFDO0FBRXZGLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBSzVELE9BQU8sYUFBYSxNQUFNLHdCQUF3QixDQUFDO0FBQ25ELE9BQU8sRUFFTCxzQkFBc0IsR0FDdkIsTUFBTSw4Q0FBOEMsQ0FBQztBQUN0RCxPQUFPLGFBQWEsTUFBTSxpREFBaUQsQ0FBQzs7O0FBTzVFLE1BQU0sT0FBTyxxQkFDWCxTQUFRLGFBQXFDO0lBeUM3QyxZQUFvQixRQUFtQixFQUFTLEdBQXNCO1FBQ3BFLEtBQUssRUFBRSxDQUFDO1FBRFUsYUFBUSxHQUFSLFFBQVEsQ0FBVztRQUFTLFFBQUcsR0FBSCxHQUFHLENBQW1CO1FBckM3RCxZQUFPLEdBQVcsRUFBRSxDQUFDO1FBQ3JCLFdBQU0sR0FBWSxLQUFLLENBQUM7UUFDeEIsZ0JBQVcsR0FBWSxLQUFLLENBQUM7UUFDN0Isa0JBQWEsR0FBNkMsRUFBRSxDQUFDO1FBQzdELGlCQUFZLEdBQXNDLEVBQUUsQ0FB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WTtzQkFBcEIsS0FBSztnQkFDRyxTQUFTO3NCQUFqQixLQUFLO2dCQUNHLFNBQVM7c0JBQWpCLEtBQUs7Z0JBQ0csY0FBYztzQkFBdEIsS0FBSztnQkFDRyxLQUFLO3NCQUFiLEtBQUs7Z0JBQ0csYUFBYTtzQkFBckIsS0FBSztnQkFDRyxhQUFhO3NCQUFyQixLQUFLO2dCQUNHLGVBQWU7c0JBQXZCLEtBQUs7Z0JBQ0csY0FBYztzQkFBdEIsS0FBSztnQkFDRyxlQUFlO3NCQUF2QixLQUFLO2dCQVFJLFlBQVk7c0JBQXJCLE1BQU07Z0JBQ0csV0FBVztzQkFBcEIsTUFBTTtnQkFDRyxXQUFXO3NCQUFwQixNQUFNO2dCQUNHLFNBQVM7c0JBQWxCLE1BQU07Z0JBR1AsaUJBQWlCO3NCQURoQixTQUFTO3VCQUFDLG1CQUFtQixFQUFFLEVBQUUsSUFBSSxFQUFFLGdCQUFnQixFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBEaWZmRE9NIH0gZnJvbSAnZGlmZi1kb20nO1xuaW1wb3J0IHtcbiAgQ29tcG9uZW50LFxuICBJbnB1dCxcbiAgT25Jbml0LFxuICBPbkNoYW5nZXMsXG4gIE9uRGVzdHJveSxcbiAgQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gIFNpbXBsZUNoYW5nZXMsXG4gIFZpZXdDaGlsZCxcbiAgT3V0cHV0LFxuICBFdmVudEVtaXR0ZXIsXG4gIFJlbmRlcmVyMixcbiAgVmlld0NvbnRhaW5lclJlZixcbiAgVGVtcGxhdGVSZWYsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IG1hcmtkb3duaXQgZnJvbSAnbWFya2Rvd24taXQnO1xuaW1wb3J0IHR5cGUgeyBUb2tlbiB9IGZyb20gJ21hcmtkb3duLWl0JztcbmltcG9ydCB7IE1EQ2FyZFNlcnZpY2UgfSBmcm9tICcuLi9jb21wb25lbnRzLWNvbW1vbi9NYXJrZG93bkNhcmQvY29tbW9uL01EQ2FyZFNlcnZpY2UnO1xuaW1wb3J0IHR5cGUgeyBBU1ROb2RlIH0gZnJvbSAnLi4vY29tcG9uZW50cy1jb21tb24vTWFya2Rvd25DYXJkL2NvbW1vbi9tZENhcmQudHlwZXMnO1xuaW1wb3J0IHsgQ29kZUJsb2NrQ29tcG9uZW50IH0gZnJvbSAnLi9jb2RlLWJsb2NrLmNvbXBvbmVudCc7XG5pbXBvcnQge1xuICBNYXJrZG93bkNhcmRQcm9wcyxcbiAgZGVmYXVsdFR5cGluZ0NvbmZpZyxcbn0gZnJvbSAnLi4vY29tcG9uZW50cy1jb21tb24vTWFya2Rvd25DYXJkL2NvbW1vbi9tZENhcmQudHlwZXMnO1xuaW1wb3J0IEJhc2VDb21wb25lbnQgZnJvbSAnLi4vQmFzZS9iYXNlLmNvbXBvbmVudCc7XG5pbXBvcnQge1xuICBNYXJrZG93bkNhcmRBZGFwdGVyLFxuICBNYXJrZG93bkNhcmRGb3VuZGF0aW9uLFxufSBmcm9tICcuLi9jb21wb25lbnRzLWNvbW1vbi9NYXJrZG93bkNhcmQvZm91bmRhdGlvbic7XG5pbXBvcnQgTWRQYXJzZXJVdGlscyBmcm9tICcuLi9jb21wb25lbnRzLWNvbW1vbi9NYXJrZG93bkNhcmQvY29tbW9uL3BhcnNlcic7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ21jLW1hcmtkb3duLWNhcmQnLFxuICB0ZW1wbGF0ZVVybDogJy4vbWFya2Rvd24tY2FyZC5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL21hcmtkb3duLWNhcmQuY29tcG9uZW50LnNjc3MnXSxcbn0pXG5leHBvcnQgY2xhc3MgTWFya2Rvd25DYXJkQ29tcG9uZW50XG4gIGV4dGVuZHMgQmFzZUNvbXBvbmVudDxNYXJrZG93bkNhcmRGb3VuZGF0aW9uPlxuICBpbXBsZW1lbnRzIE9uSW5pdCwgT25DaGFuZ2VzLCBPbkRlc3Ryb3lcbntcbiAgcHJpdmF0ZSBkaWZmRG9tOiBEaWZmRE9NO1xuICBASW5wdXQoKSBjb250ZW50OiBzdHJpbmcgPSAnJztcbiAgQElucHV0KCkgdHlwaW5nOiBib29sZWFuID0gZmFsc2U7XG4gIEBJbnB1dCgpIGVuYWJsZVRoaW5rOiBib29sZWFuID0gZmFsc2U7XG4gIEBJbnB1dCgpIHR5cGluZ09wdGlvbnM6IE1hcmtkb3duQ2FyZFByb3BzWyd0eXBpbmdPcHRpb25zJ10gfCBhbnkgPSB7fTtcbiAgQElucHV0KCkgdGhpbmtPcHRpb25zOiBNYXJrZG93bkNhcmRQcm9wc1sndGhpbmtPcHRpb25zJ10gPSB7fTtcbiAgQElucHV0KCkgbWRPcHRpb25zOiBNYXJrZG93bkNhcmRQcm9wc1snbWRPcHRpb25zJ10gPSB7fTtcbiAgQElucHV0KCkgbWRQbHVnaW5zOiBNYXJrZG93bkNhcmRQcm9wc1snbWRQbHVnaW5zJ10gPSBbXTtcbiAgQElucHV0KCkgY3VzdG9tWHNzUnVsZXM6IE1hcmtkb3duQ2FyZFByb3BzWydjdXN0b21Yc3NSdWxlcyddID0gW107XG4gIEBJbnB1dCgpIHRoZW1lOiAnbGlnaHQnIHwgJ2RhcmsnIHwgYW55ID0gJ2xpZ2h0JztcbiAgQElucHV0KCkgZW5hYmxlTWVybWFpZDogYm9vbGVhbiA9IGZhbHNlO1xuICBASW5wdXQoKSBtZXJtYWlkQ29uZmlnOiBNYXJrZG93bkNhcmRQcm9wc1snbWVybWFpZENvbmZpZyddID0ge307XG4gIEBJbnB1dCgpIGFjdGlvbnNUZW1wbGF0ZTogVGVtcGxhdGVSZWY8YW55PiB8IG51bGwgPSBudWxsO1xuICBASW5wdXQoKSBoZWFkZXJUZW1wbGF0ZTogVGVtcGxhdGVSZWY8YW55PiB8IG51bGwgPSBudWxsO1xuICBASW5wdXQoKSBjb250ZW50VGVtcGxhdGU6IFRlbXBsYXRlUmVmPGFueT4gfCBudWxsID0gbnVsbDtcblxuICAvLyDnu4Tku7bnvJPlrZjmmKDlsITooajvvIznlKjkuo7lrZjlgqjlt7LliJvlu7rnmoRDb2RlQmxvY2tDb21wb25lbnTlrp7kvotcbiAgcHJpdmF0ZSBjb2RlQmxvY2tDb21wb25lbnRzQ2FjaGU6IE1hcDxcbiAgICBzdHJpbmcsXG4gICAgeyBjb21wb25lbnRSZWY6IGFueTsgY29udGFpbmVyOiBIVE1MRWxlbWVudCB9XG4gID4gPSBuZXcgTWFwKCk7XG5cbiAgQE91dHB1dCgpIGFmdGVyTWR0SW5pdCA9IG5ldyBFdmVudEVtaXR0ZXI8bWFya2Rvd25pdD4oKTtcbiAgQE91dHB1dCgpIHR5cGluZ1N0YXJ0ID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xuICBAT3V0cHV0KCkgdHlwaW5nRXZlbnQgPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7XG4gIEBPdXRwdXQoKSB0eXBpbmdFbmQgPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7XG5cbiAgQFZpZXdDaGlsZCgnbWFya2Rvd25Db250YWluZXInLCB7IHJlYWQ6IFZpZXdDb250YWluZXJSZWYsIHN0YXRpYzogdHJ1ZSB9KVxuICBtYXJrZG93bkNvbnRhaW5lciE6IFZpZXdDb250YWluZXJSZWY7XG5cbiAgcHJpdmF0ZSBtZHQ6IG1hcmtkb3duaXQ7XG4gIHR5cGluZ0luZGV4OiBudW1iZXIgPSAwO1xuICBpc1R5cGluZzogYm9vbGVhbiA9IGZhbHNlO1xuICB0aW1lcjogbnVtYmVyIHwgbnVsbCA9IG51bGw7XG4gIHBhcnNlciA9IE1kUGFyc2VyVXRpbHM7XG4gIG1kQ2FyZFNlcnZpY2U7XG4gIG5vRGlmZjogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgcmVuZGVyZXI6IFJlbmRlcmVyMiwgcHVibGljIGNkcjogQ2hhbmdlRGV0ZWN0b3JSZWYpIHtcbiAgICBzdXBlcigpO1xuICAgIHRoaXMubWR0ID0gbWFya2Rvd25pdCh7XG4gICAgICBicmVha3M6IHRydWUsXG4gICAgICBsaW5raWZ5OiB0cnVlLFxuICAgICAgaHRtbDogdHJ1ZSxcbiAgICAgIGhpZ2hsaWdodDogKHN0ciwgbGFuZykgPT4ge1xuICAgICAgICAvLyDkuI5WdWXnu4Tku7bkv53mjIHkuIDoh7TnmoTpq5jkuq7lpITnkIZcbiAgICAgICAgcmV0dXJuICcnO1xuICAgICAgfSxcbiAgICAgIC4uLnRoaXMubWRPcHRpb25zLFxuICAgIH0pO1xuICAgIHRoaXMubWRDYXJkU2VydmljZSA9IG5ldyBNRENhcmRTZXJ2aWNlKCk7XG4gICAgdGhpcy5mb3VuZGF0aW9uID0gbmV3IE1hcmtkb3duQ2FyZEZvdW5kYXRpb24odGhpcy5hZGFwdGVyKTtcblxuICAgIC8vIOWIneWni+WMliBkaWZmRG9tIOWunuS+i1xuICAgIHRoaXMuZGlmZkRvbSA9IG5ldyBEaWZmRE9NKHtcbiAgICAgIC8vIOmFjee9rmZpbHRlck91dGVyRGlmZumSqeWtkO+8jOivhuWIq2NvZGUtYmxvY2std3JhcHBlcuWFg+e0oOW5tuebtOaOpeabv+aNolxuICAgICAgZmlsdGVyT3V0ZXJEaWZmOiAodDEsIHQyLCBkaWZmcykgPT4ge1xuICAgICAgICAvLyDmo4Dmn6XmmK/lkKbmmK9jbGFzc+S4umNvZGUtYmxvY2std3JhcHBlcueahGRpduWFg+e0oFxuICAgICAgICBjb25zdCBpc1RhcmdldEVsZW1lbnQgPVxuICAgICAgICAgIHQyLm5vZGVOYW1lID09PSAnRElWJyAmJlxuICAgICAgICAgIHQyLmF0dHJpYnV0ZXMgJiZcbiAgICAgICAgICB0Mi5hdHRyaWJ1dGVzLmNsYXNzICYmXG4gICAgICAgICAgdDIuYXR0cmlidXRlcy5jbGFzcy5pbmNsdWRlcygnY29kZS1ibG9jay13cmFwcGVyJyk7XG5cbiAgICAgICAgaWYgKGlzVGFyZ2V0RWxlbWVudCkge1xuICAgICAgICAgIHQxLmlubmVyRG9uZSA9IHRydWU7XG4gICAgICAgICAgdDIuaW5uZXJEb25lID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICB9KTtcbiAgfVxuXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIHRoaXMubWRDYXJkU2VydmljZS5zZXRNZFBsdWdpbnModGhpcy5tZFBsdWdpbnMgfHwgW10sIHRoaXMubWR0KTtcbiAgICB0aGlzLnBhcnNlQ29udGVudCgpO1xuICAgIHRoaXMuYWZ0ZXJNZHRJbml0LmVtaXQodGhpcy5tZHQpO1xuICB9XG5cbiAgb3ZlcnJpZGUgZ2V0IGFkYXB0ZXIoKTogTWFya2Rvd25DYXJkQWRhcHRlciB7XG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLnN1cGVyLmFkYXB0ZXIsXG4gICAgICBsb2NhbGU6IChrZXk6IHN0cmluZywgcGFyYW1zPzogUmVjb3JkPHN0cmluZywgc3RyaW5nPikgPT5cbiAgICAgICAgdGhpcy5hZGFwdGVyLmxvY2FsZShrZXksIHBhcmFtcyksXG4gICAgICB0eXBpbmdTdGFydDogKCkgPT4gdGhpcy50eXBpbmdTdGFydC5lbWl0KCksXG4gICAgICB0eXBpbmdFbmQ6ICgpID0+IHRoaXMudHlwaW5nRW5kLmVtaXQoKSxcbiAgICAgIHR5cGluZ0V2ZW50OiAoKSA9PiB0aGlzLnR5cGluZ0V2ZW50LmVtaXQoKSxcbiAgICAgIHBhcnNlQ29udGVudDogKGNvbnRlbnQ6IHN0cmluZykgPT4ge1xuICAgICAgICAvLyDop6PmnpAgTWFya2Rvd24g5YaF5a65XG4gICAgICAgIGNvbnN0IHRva2VuczogYW55ID0gdGhpcy5tZHQucGFyc2UoY29udGVudCwge30pO1xuICAgICAgICBjb25zdCBhc3QgPSB0aGlzLnBhcnNlci50b2tlbnNUb0FzdCh0b2tlbnMpO1xuICAgICAgICBjb25zdCB2bm9kZXMgPSB0aGlzLmFzdFRvVm5vZGVzKGFzdCk7XG4gICAgICAgIHRoaXMucmVuZGVyQ29udGVudCh2bm9kZXMpO1xuICAgICAgfSxcbiAgICB9O1xuICB9XG5cbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcyk6IHZvaWQge1xuICAgIGlmIChjaGFuZ2VzWydjb250ZW50J10pIHtcbiAgICAgIGlmICghdGhpcy50eXBpbmcpIHtcbiAgICAgICAgdGhpcy50eXBpbmdJbmRleCA9IHRoaXMuY29udGVudD8ubGVuZ3RoIHx8IDA7XG4gICAgICAgIHRoaXMucGFyc2VDb250ZW50KCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLmNvbnRlbnQuaW5kZXhPZihjaGFuZ2VzWydjb250ZW50J10/LnByZXZpb3VzVmFsdWUpID09PSAtMSkge1xuICAgICAgICB0aGlzLnR5cGluZ0luZGV4ID0gMDtcbiAgICAgIH1cbiAgICAgIC8vIOS9v+eUqHNldFRpbWVvdXTmqKHmi59WdWXnmoRuZXh0VGlja+ihjOS4ulxuICAgICAgc2V0VGltZW91dCgoKSA9PiB0aGlzLnR5cGV3cml0ZXJTdGFydCgpKTtcbiAgICB9XG5cbiAgICBpZiAoY2hhbmdlc1snZW5hYmxlVGhpbmsnXSB8fCBjaGFuZ2VzWyd0aGlua09wdGlvbnMnXSB8fCBjaGFuZ2VzWyd0aGVtZSddKSB7XG4gICAgICB0aGlzLnBhcnNlQ29udGVudCgpO1xuICAgIH1cblxuICAgIGlmIChjaGFuZ2VzWydjdXN0b21Yc3NSdWxlcyddKSB7XG4gICAgICB0aGlzLm1kQ2FyZFNlcnZpY2Uuc2V0Q3VzdG9tWHNzUnVsZXModGhpcy5jdXN0b21Yc3NSdWxlcyB8fCBbXSk7XG4gICAgICB0aGlzLnBhcnNlQ29udGVudCgpO1xuICAgIH1cblxuICAgIGlmIChjaGFuZ2VzWydtZFBsdWdpbnMnXSkge1xuICAgICAgdGhpcy5tZENhcmRTZXJ2aWNlLnNldE1kUGx1Z2lucyh0aGlzLm1kUGx1Z2lucyB8fCBbXSwgdGhpcy5tZHQpO1xuICAgICAgdGhpcy5wYXJzZUNvbnRlbnQoKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHBhcnNlQ29udGVudCgpIHtcbiAgICB0aGlzLmZvdW5kYXRpb24ucGFyc2VDb250ZW50KCk7XG4gIH1cblxuICBwcml2YXRlIHJlbmRlckNvbnRlbnQodm5vZGVzKSB7XG4gICAgaWYgKCF0aGlzLm1hcmtkb3duQ29udGFpbmVyIHx8ICF0aGlzLm1hcmtkb3duQ29udGFpbmVyLmVsZW1lbnQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5ub0RpZmYpIHtcbiAgICAgIHRoaXMucmVuZGVyQ29udGVudE5vRGlmZih2bm9kZXMpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGNvbnRhaW5lciA9IHRoaXMubWFya2Rvd25Db250YWluZXIuZWxlbWVudC5uYXRpdmVFbGVtZW50O1xuICAgIGNvbnN0IHBhcnNlciA9IG5ldyBET01QYXJzZXIoKTtcbiAgICBjb25zdCBuZXdDb250YWluZXJEaXYgPSBwYXJzZXIucGFyc2VGcm9tU3RyaW5nKGA8ZGl2PjwvZGl2PmAsICd0ZXh0L2h0bWwnKTtcbiAgICBjb25zdCBjb2RlQmxvY2tXcmFwcGVycyA9IHZub2Rlcy5maWx0ZXIoKG5vZGUpID0+IHtcbiAgICAgIHJldHVybiAoXG4gICAgICAgIG5vZGUubm9kZU5hbWUgPT09ICdESVYnICYmXG4gICAgICAgIG5vZGUuY2xhc3NOYW1lPy5pbmNsdWRlcygnY29kZS1ibG9jay13cmFwcGVyJylcbiAgICAgICk7XG4gICAgfSk7XG5cbiAgICB2bm9kZXMuZm9yRWFjaCgobm9kZSkgPT4ge1xuICAgICAgaWYgKFxuICAgICAgICBub2RlICYmXG4gICAgICAgIChub2RlLm5vZGVUeXBlIHx8XG4gICAgICAgICAgdHlwZW9mIG5vZGUgPT09ICdzdHJpbmcnIHx8XG4gICAgICAgICAgbm9kZSBpbnN0YW5jZW9mIEhUTUxFbGVtZW50KVxuICAgICAgKSB7XG4gICAgICAgIGlmIChjb2RlQmxvY2tXcmFwcGVycy5pbmNsdWRlcyhub2RlKSkge1xuICAgICAgICAgIG5ld0NvbnRhaW5lckRpdi5ib2R5LmZpcnN0Q2hpbGQ/LmFwcGVuZENoaWxkKHRoaXMuZ2V0RW1wdHlDb2RlQmxvY2sobm9kZSkpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIG5ld0NvbnRhaW5lckRpdi5ib2R5LmZpcnN0Q2hpbGQ/LmFwcGVuZENoaWxkKG5vZGUpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG4gICAgbGV0IG5ld0NvbnRhaW5lckRpdkhUTUwgPVxuICAgICAgKG5ld0NvbnRhaW5lckRpdi5ib2R5Py5maXJzdENoaWxkIGFzIEhUTUxFbGVtZW50KT8ub3V0ZXJIVE1MIHx8ICcnO1xuICAgIGNvbnN0IHBhdGNoZXMgPSB0aGlzLmRpZmZEb20uZGlmZihjb250YWluZXIsIG5ld0NvbnRhaW5lckRpdkhUTUwpO1xuICAgIHRoaXMuZGlmZkRvbS5hcHBseShjb250YWluZXIsIHBhdGNoZXMpO1xuICAgIC8vIOWwhmNvZGVCbG9ja1dyYXBwZXJz5Lit55qE5q+P5LiqZGl25YWD57Sg5pu/5o2iY29udGFpbmVy5Lit55qE5a+55bqUa2V55bGe5oCn55qE5YWD57SgXG4gICAgY29kZUJsb2NrV3JhcHBlcnMuZm9yRWFjaCgobmV3Q29kZUJsb2NrKSA9PiB7XG4gICAgICBpZiAoXG4gICAgICAgIG5ld0NvZGVCbG9jayAmJlxuICAgICAgICBuZXdDb2RlQmxvY2suYXR0cmlidXRlcyAmJlxuICAgICAgICBuZXdDb2RlQmxvY2suYXR0cmlidXRlcy5rZXlcbiAgICAgICkge1xuICAgICAgICBjb25zdCBrZXkgPSBuZXdDb2RlQmxvY2s/LmF0dHJpYnV0ZXM/LmtleT8udmFsdWU7XG4gICAgICAgIGNvbnN0IGV4aXN0aW5nRWxlbWVudCA9IGNvbnRhaW5lci5xdWVyeVNlbGVjdG9yKGBba2V5PVwiJHtrZXl9XCJdYCk7XG4gICAgICAgIGlmIChcbiAgICAgICAgICBleGlzdGluZ0VsZW1lbnQgJiZcbiAgICAgICAgICBuZXdDb2RlQmxvY2sgaW5zdGFuY2VvZiBIVE1MRWxlbWVudCAmJlxuICAgICAgICAgIGV4aXN0aW5nRWxlbWVudCAhPT0gbmV3Q29kZUJsb2NrXG4gICAgICAgICkge1xuICAgICAgICAgIGV4aXN0aW5nRWxlbWVudC5yZXBsYWNlV2l0aChuZXdDb2RlQmxvY2spO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGdldEVtcHR5Q29kZUJsb2NrKG5vZGUpIHtcbiAgICBjb25zdCBjb2RlTm9kZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgIGNvZGVOb2RlLmNsYXNzTmFtZSA9ICdjb2RlLWJsb2NrLXdyYXBwZXInO1xuICAgIGNvZGVOb2RlLnNldEF0dHJpYnV0ZSgna2V5Jywgbm9kZT8uYXR0cmlidXRlcz8ua2V5Py52YWx1ZSk7XG4gICAgcmV0dXJuIGNvZGVOb2RlO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3RUb1Zub2Rlcyhub2RlczogQVNUTm9kZVtdKSB7XG4gICAgcmV0dXJuIG5vZGVzLm1hcCgobm9kZSkgPT4gdGhpcy5wcm9jZXNzQVNUTm9kZShub2RlKSk7XG4gIH1cblxuICBwcml2YXRlIHByb2Nlc3NBU1ROb2RlKG5vZGU6IEFTVE5vZGUgfCBUb2tlbiB8IGFueSkge1xuICAgIGlmIChub2RlLm5vZGVUeXBlID09PSAnaHRtbF9pbmxpbmUnIHx8IG5vZGUubm9kZVR5cGUgPT09ICdodG1sX2Jsb2NrJykge1xuICAgICAgcmV0dXJuIHRoaXMucHJvY2Vzc0hUTUxOb2RlKG5vZGUpO1xuICAgIH1cblxuICAgIGlmIChub2RlLm5vZGVUeXBlID09PSAnaW5saW5lJykge1xuICAgICAgcmV0dXJuIHRoaXMucHJvY2Vzc0lubGluZVRva2VuKG5vZGUpO1xuICAgIH1cbiAgICBpZiAodGhpcy5mb3VuZGF0aW9uLmlzVG9rZW4obm9kZSkpIHtcbiAgICAgIHJldHVybiB0aGlzLnByb2Nlc3NUb2tlbihub2RlKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5wcm9jZXNzQVNUTm9kZUludGVybmFsKG5vZGUpO1xuICB9XG5cbiAgcHJpdmF0ZSBwcm9jZXNzSFRNTE5vZGUobm9kZTogQVNUTm9kZSkge1xuICAgIGlmICghbm9kZS5vcGVuTm9kZT8uY29udGVudCkgcmV0dXJuO1xuXG4gICAgY29uc3QgcGFyc2VyID0gbmV3IERPTVBhcnNlcigpO1xuICAgIGNvbnN0IHRhZ05hbWUgPSBub2RlLm5vZGVUeXBlID09PSAnaHRtbF9ibG9jaycgPyAnZGl2JyA6ICdzcGFuJztcbiAgICBjb25zdCBjb250YWluZXJEb2N1bWVudCA9IHBhcnNlci5wYXJzZUZyb21TdHJpbmcoXG4gICAgICBgPCR7dGFnTmFtZX0+JHtub2RlLm9wZW5Ob2RlLmNvbnRlbnR9PC8ke3RhZ05hbWV9PmAsXG4gICAgICAndGV4dC9odG1sJ1xuICAgICk7XG4gICAgY29uc3QgY29udGFpbmVyQm9keSA9IGNvbnRhaW5lckRvY3VtZW50LmJvZHkuZmlyc3RDaGlsZDtcbiAgICAvLyDlpITnkIblrZDoioLngrlcbiAgICBpZiAobm9kZS5jaGlsZHJlbiAmJiBub2RlLmNoaWxkcmVuLmxlbmd0aCA+IDApIHtcbiAgICAgIG5vZGUuY2hpbGRyZW4uZm9yRWFjaCgoY2hpbGQpID0+IHtcbiAgICAgICAgY29uc3QgY2hpbGRWbm9kZSA9IHRoaXMucHJvY2Vzc0FTVE5vZGUoY2hpbGQgYXMgYW55KTtcbiAgICAgICAgaWYgKGNoaWxkVm5vZGUgJiYgY29udGFpbmVyQm9keSkge1xuICAgICAgICAgIChjb250YWluZXJCb2R5Py5maXJzdENoaWxkIHx8IGNvbnRhaW5lckJvZHkpLmFwcGVuZENoaWxkKGNoaWxkVm5vZGUpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuIGNvbnRhaW5lckJvZHk7XG4gIH1cblxuICBwcml2YXRlIHJlbmRlckNvbnRlbnROb0RpZmYodm5vZGVzKSB7XG4gICAgY29uc3QgY29udGFpbmVyID0gdGhpcy5tYXJrZG93bkNvbnRhaW5lci5lbGVtZW50Lm5hdGl2ZUVsZW1lbnQ7XG4gICAgY29uc3QgbmV3Q29udGVudEZyYWdlbWVudCA9IHRoaXMucmVuZGVyZXIuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgdm5vZGVzLmZvckVhY2goKG5vZGUpID0+IHtcbiAgICAgIGlmIChcbiAgICAgICAgbm9kZSAmJlxuICAgICAgICAobm9kZS5ub2RlVHlwZSB8fFxuICAgICAgICAgIHR5cGVvZiBub2RlID09PSAnc3RyaW5nJyB8fFxuICAgICAgICAgIG5vZGUgaW5zdGFuY2VvZiBIVE1MRWxlbWVudClcbiAgICAgICkge1xuICAgICAgICBuZXdDb250ZW50RnJhZ2VtZW50LmFwcGVuZENoaWxkKG5vZGUpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHdoaWxlIChjb250YWluZXIuZmlyc3RDaGlsZCkge1xuICAgICAgY29udGFpbmVyLnJlbW92ZUNoaWxkKGNvbnRhaW5lci5maXJzdENoaWxkKTtcbiAgICB9XG4gICAgY29udGFpbmVyLmFwcGVuZENoaWxkKG5ld0NvbnRlbnRGcmFnZW1lbnQpO1xuICB9XG5cbiAgcHJpdmF0ZSBwcm9jZXNzSW5saW5lVG9rZW4obm9kZTogQVNUTm9kZSB8IGFueSkge1xuICAgIGxldCBodG1sID0gJyc7XG4gICAgdHJ5IHtcbiAgICAgIGlmICghbm9kZS5vcGVuTm9kZSkge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cbiAgICAgIGh0bWwgPSB0aGlzLm1kdC5yZW5kZXJlci5yZW5kZXIoW25vZGUub3Blbk5vZGVdLCB0aGlzLm1kdC5vcHRpb25zLCB7fSk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ0Vycm9yIHJlbmRlcmluZyBpbmxpbmUgdG9rZW46Jywgbm9kZSk7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICAvLyDlsIZIVE1M5a2X56ym5Liy6L2s5o2i5Li6RE9N6IqC54K5XG4gICAgY29uc3QgcGFyc2VyID0gbmV3IERPTVBhcnNlcigpO1xuICAgIGNvbnN0IGRvYyA9IHBhcnNlci5wYXJzZUZyb21TdHJpbmcoYDxkaXY+JHtodG1sfTwvZGl2PmAsICd0ZXh0L2h0bWwnKTtcbiAgICBjb25zdCB0b2tlbiA9IGRvYy5ib2R5LmZpcnN0Q2hpbGQ7XG4gICAgLy8g5aaC5p6c5Y+q5pyJ5LiA5Liq5a2Q6IqC54K577yM55u05o6l6L+U5Zue5a2Q6IqC54K56ICM5LiN5piv5YyF5ZCrZGl2XG4gICAgaWYgKHRva2VuICYmIHRva2VuLmNoaWxkTm9kZXMubGVuZ3RoID09PSAxKSB7XG4gICAgICByZXR1cm4gdG9rZW4uZmlyc3RDaGlsZDtcbiAgICB9XG4gICAgcmV0dXJuIHRva2VuO1xuICB9XG5cbiAgcHJpdmF0ZSBwcm9jZXNzRmVuY2VOb2RlKHRva2VuOiBUb2tlbikge1xuICAgIGNvbnN0IGxhbmd1YWdlID1cbiAgICAgIHRva2VuLmluZm8/LnJlcGxhY2UoLzxzcGFuXFxiW14+XSo+L2ksICcnKS5yZXBsYWNlKCc8L3NwYW4+JywgJycpIHx8ICcnO1xuICAgIGNvbnN0IGNvZGUgPSB0b2tlbi5jb250ZW50IHx8ICcnO1xuICAgIHJldHVybiB0aGlzLmNyZWF0ZUNvZGVCbG9jayhsYW5ndWFnZSwgY29kZSwgKHRva2VuIGFzIGFueSkudG9rZW5JbmRleCB8fCAwKTtcbiAgfVxuXG4gIHByaXZhdGUgcHJvY2Vzc0FTVE5vZGVJbnRlcm5hbChub2RlOiBBU1ROb2RlIHwgYW55KSB7XG4gICAgbGV0IHRhZ05hbWUgPSAnZGl2JztcbiAgICBpZiAobm9kZS5vcGVuTm9kZT8udGFnICYmIHRoaXMucGFyc2VyLmlzVmFsaWRUYWdOYW1lKG5vZGUub3Blbk5vZGU/LnRhZykpIHtcbiAgICAgIHRhZ05hbWUgPSBub2RlLm9wZW5Ob2RlPy50YWc7XG4gICAgfVxuICAgIGNvbnN0IGVsZW1lbnQgPSB0aGlzLnJlbmRlcmVyLmNyZWF0ZUVsZW1lbnQodGFnTmFtZSk7XG5cbiAgICAvLyDorr7nva7lsZ7mgKdcbiAgICBpZiAobm9kZS5vcGVuTm9kZS5hdHRycykge1xuICAgICAgbm9kZS5vcGVuTm9kZS5hdHRycy5mb3JFYWNoKChba2V5LCB2YWx1ZV0pID0+IHtcbiAgICAgICAgdGhpcy5yZW5kZXJlci5zZXRBdHRyaWJ1dGUoZWxlbWVudCwga2V5LCB2YWx1ZSk7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICAvLyDnibnmrorlpITnkIZmZW5jZeexu+Wei+eahHRva2VuXG4gICAgaWYgKG5vZGUub3Blbk5vZGUudHlwZSA9PT0gJ2ZlbmNlJykge1xuICAgICAgcmV0dXJuIHRoaXMucHJvY2Vzc0ZlbmNlTm9kZShub2RlLm9wZW5Ob2RlIGFzIHVua25vd24gYXMgVG9rZW4pO1xuICAgIH1cblxuICAgIC8vIOWkhOeQhuaJgOacieW4pnRhZ+eahEFTVOiKgueCuVxuICAgIGlmIChub2RlLm9wZW5Ob2RlPy50YWcpIHtcbiAgICAgIGxldCB0YWdOYW1lID0gdGhpcy5wYXJzZXIuaXNWYWxpZFRhZ05hbWUobm9kZS5vcGVuTm9kZT8udGFnKVxuICAgICAgICA/IG5vZGUub3Blbk5vZGU/LnRhZ1xuICAgICAgICA6ICdkaXYnO1xuICAgICAgY29uc3QgZWxlbWVudCA9IHRoaXMucmVuZGVyZXIuY3JlYXRlRWxlbWVudCh0YWdOYW1lKTtcblxuICAgICAgLy8g6YCS5b2S5aSE55CG5omA5pyJ5a2Q6IqC54K55bm25re75Yqg5Yiw5b2T5YmN5YWD57SgXG4gICAgICBub2RlLmNoaWxkcmVuLmZvckVhY2goKGNoaWxkKSA9PiB7XG4gICAgICAgIGNvbnN0IGNoaWxkTm9kZSA9IHRoaXMucHJvY2Vzc0FTVE5vZGUoY2hpbGQpO1xuICAgICAgICBpZiAoY2hpbGROb2RlKSB7XG4gICAgICAgICAgZWxlbWVudC5hcHBlbmRDaGlsZChjaGlsZE5vZGUpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIHJldHVybiBlbGVtZW50O1xuICAgIH1cblxuICAgIG5vZGUuY2hpbGRyZW4uZm9yRWFjaCgoY2hpbGQpID0+IHtcbiAgICAgIGNvbnN0IGNoaWxkTm9kZSA9IHRoaXMucHJvY2Vzc0FTVE5vZGUoY2hpbGQpO1xuICAgICAgaWYgKGNoaWxkTm9kZSkge1xuICAgICAgICBlbGVtZW50LmFwcGVuZENoaWxkKGNoaWxkTm9kZSk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIGVsZW1lbnQ7XG4gIH1cblxuICBwcml2YXRlIHByb2Nlc3NUb2tlbih0b2tlbjogVG9rZW4pIHtcbiAgICBpZiAodG9rZW4udHlwZSA9PT0gJ3RleHQnKSB7XG4gICAgICByZXR1cm4gdGhpcy5yZW5kZXJlci5jcmVhdGVUZXh0KHRva2VuLmNvbnRlbnQgfHwgJycpO1xuICAgIH1cblxuICAgIGlmICh0b2tlbi50eXBlID09PSAnaW5saW5lJykge1xuICAgICAgcmV0dXJuIHRoaXMucHJvY2Vzc0lubGluZVRva2VuKHRva2VuKTtcbiAgICB9XG5cbiAgICBpZiAodG9rZW4udHlwZSA9PT0gJ2ZlbmNlJykge1xuICAgICAgcmV0dXJuIHRoaXMucHJvY2Vzc0ZlbmNlTm9kZSh0b2tlbik7XG4gICAgfVxuXG4gICAgaWYgKHRva2VuLnR5cGUgPT09ICdzb2Z0YnJlYWsnKSB7XG4gICAgICBpZiAodGhpcy5tZHQub3B0aW9ucy5icmVha3MpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucmVuZGVyZXIuY3JlYXRlRWxlbWVudCgnYnInKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiB0aGlzLnJlbmRlcmVyLmNyZWF0ZVRleHQoJ1xcbicpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICh0b2tlbi50eXBlID09PSAnaHRtbF9ibG9jaycgfHwgdG9rZW4udHlwZSA9PT0gJ2h0bWxfaW5saW5lJykge1xuICAgICAgY29uc3QgcGFyc2VyID0gbmV3IERPTVBhcnNlcigpO1xuICAgICAgY29uc3QgdGFnTmFtZSA9IHRva2VuLnR5cGUgPT09ICdodG1sX2Jsb2NrJyA/ICdkaXYnIDogJ3NwYW4nO1xuICAgICAgY29uc3QgZG9jID0gcGFyc2VyLnBhcnNlRnJvbVN0cmluZyhcbiAgICAgICAgYDwke3RhZ05hbWV9PiR7dG9rZW4uY29udGVudH08LyR7dGFnTmFtZX0+YCxcbiAgICAgICAgJ3RleHQvaHRtbCdcbiAgICAgICk7XG4gICAgICBjb25zdCB0b2tlbkRvbSA9IGRvYy5ib2R5O1xuICAgICAgLy8g5aaC5p6c5Y+q5pyJ5LiA5Liq5a2Q6IqC54K577yM55u05o6l6L+U5Zue5a2Q6IqC54K56ICM5LiN5piv5YyF5ZCrZGl2XG4gICAgICBpZiAodG9rZW5Eb20uZmlyc3RDaGlsZCAmJiB0b2tlbkRvbS5jaGlsZE5vZGVzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICByZXR1cm4gdG9rZW5Eb20uZmlyc3RDaGlsZDtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0b2tlbkRvbTtcbiAgICB9XG5cbiAgICBpZiAodG9rZW4udGFnKSB7XG4gICAgICBjb25zdCB0YWdOYW1lID0gdGhpcy5wYXJzZXIuaXNWYWxpZFRhZ05hbWUodG9rZW4udGFnKSA/IHRva2VuLnRhZyA6ICdkaXYnO1xuICAgICAgY29uc3QgZWxlbWVudCA9IHRoaXMucmVuZGVyZXIuY3JlYXRlRWxlbWVudCh0YWdOYW1lKTtcblxuICAgICAgaWYgKHRva2VuLmF0dHJzKSB7XG4gICAgICAgIHRva2VuLmF0dHJzLmZvckVhY2goKFtrZXksIHZhbHVlXSkgPT4ge1xuICAgICAgICAgIHRoaXMucmVuZGVyZXIuc2V0QXR0cmlidXRlKGVsZW1lbnQsIGtleSwgdmFsdWUpO1xuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgLy8g6K6+572u5YaF5a65XG4gICAgICBpZiAodG9rZW4uY29udGVudCkge1xuICAgICAgICBjb25zdCB0ZXh0Tm9kZSA9IHRoaXMucmVuZGVyZXIuY3JlYXRlVGV4dCh0b2tlbi5jb250ZW50KTtcbiAgICAgICAgZWxlbWVudC5hcHBlbmRDaGlsZCh0ZXh0Tm9kZSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gZWxlbWVudDtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5yZW5kZXJlci5jcmVhdGVUZXh0KHRva2VuLmNvbnRlbnQgfHwgJycpO1xuICB9XG5cbiAgcHJpdmF0ZSBjcmVhdGVDb2RlQmxvY2sobGFuZ3VhZ2U6IHN0cmluZywgY29kZTogc3RyaW5nLCBibG9ja0luZGV4OiBudW1iZXIpIHtcbiAgICBjb25zdCBrZXkgPSBgY29kZS1ibG9jay0ke2Jsb2NrSW5kZXh9YDtcblxuICAgIC8vIOajgOafpee8k+WtmOS4reaYr+WQpuW3suWtmOWcqOebuOWQjGJsb2NrSW5kZXjnmoTnu4Tku7ZcbiAgICBpZiAodGhpcy5jb2RlQmxvY2tDb21wb25lbnRzQ2FjaGUuaGFzKGtleSkpIHtcbiAgICAgIGNvbnN0IGNhY2hlZEl0ZW0gPSB0aGlzLmNvZGVCbG9ja0NvbXBvbmVudHNDYWNoZS5nZXQoa2V5KTtcbiAgICAgIGlmIChjYWNoZWRJdGVtKSB7XG4gICAgICAgIC8vIOabtOaWsOeOsOaciee7hOS7tueahOWxnuaAp1xuICAgICAgICBjb25zdCBjb21wb25lbnRSZWYgPSBjYWNoZWRJdGVtLmNvbXBvbmVudFJlZjtcbiAgICAgICAgY29tcG9uZW50UmVmLnNldElucHV0KCdsYW5ndWFnZScsIGxhbmd1YWdlKTtcbiAgICAgICAgY29tcG9uZW50UmVmLnNldElucHV0KCdjb2RlJywgY29kZSk7XG4gICAgICAgIGNvbXBvbmVudFJlZi5zZXRJbnB1dCgndGhlbWUnLCB0aGlzLnRoZW1lKTtcblxuICAgICAgICAvLyDop6blj5Hlj5jmm7Tmo4DmtYtcbiAgICAgICAgY29tcG9uZW50UmVmLmNoYW5nZURldGVjdG9yUmVmLmRldGVjdENoYW5nZXMoKTtcbiAgICAgICAgLy8g6L+U5Zue57yT5a2Y55qE5a655Zmo77yM5peg6ZyA6YeN5paw5Yib5bu6XG4gICAgICAgIHJldHVybiBjYWNoZWRJdGVtLmNvbnRhaW5lcjtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyDnvJPlrZjkuK3kuI3lrZjlnKjvvIzliJvlu7rmlrDnu4Tku7ZcbiAgICBjb25zdCBjb2RlQmxvY2tDb250YWluZXIgPSB0aGlzLnJlbmRlcmVyLmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgIHRoaXMucmVuZGVyZXIuc2V0QXR0cmlidXRlKGNvZGVCbG9ja0NvbnRhaW5lciwgJ2tleScsIGtleSk7XG5cbiAgICBjb25zdCBjb21wb25lbnRSZWYgPSB0aGlzLm1hcmtkb3duQ29udGFpbmVyLmNyZWF0ZUNvbXBvbmVudChcbiAgICAgIENvZGVCbG9ja0NvbXBvbmVudCxcbiAgICAgIHtcbiAgICAgICAgcHJvamVjdGFibGVOb2RlczogW10sXG4gICAgICAgIGluamVjdG9yOiB0aGlzLm1hcmtkb3duQ29udGFpbmVyLmluamVjdG9yLFxuICAgICAgfVxuICAgICk7XG5cbiAgICAvLyDorr7nva7nu4Tku7blsZ7mgKdcbiAgICBjb21wb25lbnRSZWYuaW5zdGFuY2UubGFuZ3VhZ2UgPSBsYW5ndWFnZTtcbiAgICBjb21wb25lbnRSZWYuaW5zdGFuY2UuY29kZSA9IGNvZGU7XG4gICAgY29tcG9uZW50UmVmLmluc3RhbmNlLmJsb2NrSW5kZXggPSBibG9ja0luZGV4O1xuICAgIGNvbXBvbmVudFJlZi5pbnN0YW5jZS50aGVtZSA9IHRoaXMudGhlbWU7XG4gICAgY29tcG9uZW50UmVmLmluc3RhbmNlLmVuYWJsZU1lcm1haWQgPSB0aGlzLmVuYWJsZU1lcm1haWQ7XG4gICAgY29tcG9uZW50UmVmLmluc3RhbmNlLm1lcm1haWRDb25maWcgPSB0aGlzLm1lcm1haWRDb25maWcgfHwge307XG4gICAgY29tcG9uZW50UmVmLmluc3RhbmNlLmFjdGlvbnNUZW1wbGF0ZSA9IHRoaXMuYWN0aW9uc1RlbXBsYXRlO1xuICAgIGNvbXBvbmVudFJlZi5pbnN0YW5jZS5oZWFkZXJUZW1wbGF0ZSA9IHRoaXMuaGVhZGVyVGVtcGxhdGU7XG4gICAgY29tcG9uZW50UmVmLmluc3RhbmNlLmNvbnRlbnRUZW1wbGF0ZSA9IHRoaXMuY29udGVudFRlbXBsYXRlO1xuXG4gICAgLy8g6Kem5Y+R5Y+Y5pu05qOA5rWLXG4gICAgY29tcG9uZW50UmVmLmNoYW5nZURldGVjdG9yUmVmLmRldGVjdENoYW5nZXMoKTtcblxuICAgIC8vIOWwhue7hOS7tueahERPTeWFg+e0oOmZhOWKoOWIsOWuueWZqOS4rVxuICAgIHRoaXMucmVuZGVyZXIuYXBwZW5kQ2hpbGQoXG4gICAgICBjb2RlQmxvY2tDb250YWluZXIsXG4gICAgICBjb21wb25lbnRSZWYubG9jYXRpb24ubmF0aXZlRWxlbWVudFxuICAgICk7XG5cbiAgICAvLyDmt7vliqDmoLflvI/nsbtcbiAgICB0aGlzLnJlbmRlcmVyLmFkZENsYXNzKGNvZGVCbG9ja0NvbnRhaW5lciwgJ2NvZGUtYmxvY2std3JhcHBlcicpO1xuXG4gICAgLy8g57yT5a2Y57uE5Lu25a6e5L6L5ZKM5a655ZmoXG4gICAgdGhpcy5jb2RlQmxvY2tDb21wb25lbnRzQ2FjaGUuc2V0KGtleSwge1xuICAgICAgY29tcG9uZW50UmVmOiBjb21wb25lbnRSZWYsXG4gICAgICBjb250YWluZXI6IGNvZGVCbG9ja0NvbnRhaW5lcixcbiAgICB9KTtcblxuICAgIC8vIOi/lOWbnuWIm+W7uueahERPTeWuueWZqFxuICAgIHJldHVybiBjb2RlQmxvY2tDb250YWluZXI7XG4gIH1cblxuICBwcml2YXRlIHR5cGV3cml0ZXJTdGFydCgpOiB2b2lkIHtcbiAgICB0aGlzLmZvdW5kYXRpb24udHlwZXdyaXRlclN0YXJ0KCk7XG4gIH1cblxuICAvLyDlnKjnu4Tku7bplIDmr4Hml7bmuIXnkIbnvJPlrZjvvIzpgb/lhY3lhoXlrZjms4TmvI9cbiAgb3ZlcnJpZGUgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgLy8g6ZSA5q+B5omA5pyJ57yT5a2Y55qE57uE5Lu25a6e5L6LXG4gICAgdGhpcy5jb2RlQmxvY2tDb21wb25lbnRzQ2FjaGUuZm9yRWFjaCgoY2FjaGVkSXRlbSkgPT4ge1xuICAgICAgY2FjaGVkSXRlbS5jb21wb25lbnRSZWYuZGVzdHJveSgpO1xuICAgIH0pO1xuICAgIHRoaXMuY29kZUJsb2NrQ29tcG9uZW50c0NhY2hlLmNsZWFyKCk7XG4gIH1cbn1cbiIsIjxkaXYgY2xhc3M9XCJtYy1tYXJrZG93bi1yZW5kZXJcIiBbbmdDbGFzc109XCJ0aGVtZSA9PT0gJ2RhcmsnID8gJ21jLW1hcmtkb3duLXJlbmRlci1kYXJrJyA6ICdtYy1tYXJrZG93bi1yZW5kZXItbGlnaHQnXCI+XG4gIDxkaXYgI21hcmtkb3duQ29udGFpbmVyPjwvZGl2PlxuPC9kaXY+XG48bmctY29udGVudD48L25nLWNvbnRlbnQ+Il19
@@ -0,0 +1,44 @@
1
+ import { NgModule } from '@angular/core';
2
+ import { CommonModule } from '@angular/common';
3
+ import { TranslatePipe } from '../Locale';
4
+ import { MarkdownCardComponent } from './markdown-card.component';
5
+ import { CodeBlockComponent } from './code-block.component';
6
+ import { LocaleModule } from '../Locale';
7
+ import * as i0 from "@angular/core";
8
+ export class MarkdownCardModule {
9
+ static forRoot() {
10
+ return {
11
+ ngModule: MarkdownCardModule,
12
+ providers: []
13
+ };
14
+ }
15
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.0", ngImport: i0, type: MarkdownCardModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
16
+ static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "17.3.0", ngImport: i0, type: MarkdownCardModule, declarations: [MarkdownCardComponent,
17
+ CodeBlockComponent], imports: [CommonModule,
18
+ TranslatePipe,
19
+ LocaleModule], exports: [MarkdownCardComponent,
20
+ CodeBlockComponent] }); }
21
+ static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "17.3.0", ngImport: i0, type: MarkdownCardModule, imports: [CommonModule,
22
+ LocaleModule] }); }
23
+ }
24
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.0", ngImport: i0, type: MarkdownCardModule, decorators: [{
25
+ type: NgModule,
26
+ args: [{
27
+ declarations: [
28
+ MarkdownCardComponent,
29
+ CodeBlockComponent
30
+ ],
31
+ imports: [
32
+ CommonModule,
33
+ TranslatePipe,
34
+ LocaleModule,
35
+ ],
36
+ exports: [
37
+ MarkdownCardComponent,
38
+ CodeBlockComponent
39
+ ],
40
+ providers: [],
41
+ bootstrap: []
42
+ }]
43
+ }] });
44
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWFya2Rvd24tY2FyZC5tb2R1bGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wcm9qZWN0cy9jb21wb25lbnRzLW5nL3NyYy9NYXJrZG93bkNhcmQvbWFya2Rvd24tY2FyZC5tb2R1bGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFFBQVEsRUFBdUIsTUFBTSxlQUFlLENBQUM7QUFDOUQsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQy9DLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFDMUMsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDbEUsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDNUQsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLFdBQVcsQ0FBQzs7QUFtQnpDLE1BQU0sT0FBTyxrQkFBa0I7SUFDN0IsTUFBTSxDQUFDLE9BQU87UUFDWixPQUFPO1lBQ0wsUUFBUSxFQUFFLGtCQUFrQjtZQUM1QixTQUFTLEVBQUUsRUFDVjtTQUNGLENBQUM7SUFDSixDQUFDOzhHQVBVLGtCQUFrQjsrR0FBbEIsa0JBQWtCLGlCQWhCM0IscUJBQXFCO1lBQ3JCLGtCQUFrQixhQUdsQixZQUFZO1lBQ1osYUFBYTtZQUNiLFlBQVksYUFHWixxQkFBcUI7WUFDckIsa0JBQWtCOytHQU1ULGtCQUFrQixZQVozQixZQUFZO1lBRVosWUFBWTs7MkZBVUgsa0JBQWtCO2tCQWxCOUIsUUFBUTttQkFBQztvQkFDUixZQUFZLEVBQUU7d0JBQ1oscUJBQXFCO3dCQUNyQixrQkFBa0I7cUJBQ25CO29CQUNELE9BQU8sRUFBRTt3QkFDUCxZQUFZO3dCQUNaLGFBQWE7d0JBQ2IsWUFBWTtxQkFDYjtvQkFDRCxPQUFPLEVBQUU7d0JBQ1AscUJBQXFCO3dCQUNyQixrQkFBa0I7cUJBQ25CO29CQUNELFNBQVMsRUFBRSxFQUNWO29CQUNELFNBQVMsRUFBRSxFQUFFO2lCQUNkIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgTmdNb2R1bGUsIE1vZHVsZVdpdGhQcm92aWRlcnMgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IENvbW1vbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyBUcmFuc2xhdGVQaXBlIH0gZnJvbSAnLi4vTG9jYWxlJztcbmltcG9ydCB7IE1hcmtkb3duQ2FyZENvbXBvbmVudCB9IGZyb20gJy4vbWFya2Rvd24tY2FyZC5jb21wb25lbnQnO1xuaW1wb3J0IHsgQ29kZUJsb2NrQ29tcG9uZW50IH0gZnJvbSAnLi9jb2RlLWJsb2NrLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBMb2NhbGVNb2R1bGUgfSBmcm9tICcuLi9Mb2NhbGUnO1xuQE5nTW9kdWxlKHtcbiAgZGVjbGFyYXRpb25zOiBbXG4gICAgTWFya2Rvd25DYXJkQ29tcG9uZW50LFxuICAgIENvZGVCbG9ja0NvbXBvbmVudFxuICBdLFxuICBpbXBvcnRzOiBbXG4gICAgQ29tbW9uTW9kdWxlLFxuICAgIFRyYW5zbGF0ZVBpcGUsXG4gICAgTG9jYWxlTW9kdWxlLFxuICBdLFxuICBleHBvcnRzOiBbXG4gICAgTWFya2Rvd25DYXJkQ29tcG9uZW50LFxuICAgIENvZGVCbG9ja0NvbXBvbmVudFxuICBdLFxuICBwcm92aWRlcnM6IFtcbiAgXSxcbiAgYm9vdHN0cmFwOiBbXVxufSlcbmV4cG9ydCBjbGFzcyBNYXJrZG93bkNhcmRNb2R1bGUge1xuICBzdGF0aWMgZm9yUm9vdCgpOiBNb2R1bGVXaXRoUHJvdmlkZXJzPE1hcmtkb3duQ2FyZE1vZHVsZT4ge1xuICAgIHJldHVybiB7XG4gICAgICBuZ01vZHVsZTogTWFya2Rvd25DYXJkTW9kdWxlLFxuICAgICAgcHJvdmlkZXJzOiBbXG4gICAgICBdXG4gICAgfTtcbiAgfVxufSJdfQ==
@@ -52,6 +52,9 @@ class BaseFoundation {
52
52
  setCache(key, value) {
53
53
  return key && this._adapter.setCache(key, value);
54
54
  }
55
+ nextTick(cb) {
56
+ return this._adapter.nextTick(cb);
57
+ }
55
58
  _isInProps(key) {
56
59
  const props = this.getProps();
57
60
  return key in props;
@@ -60,4 +63,4 @@ class BaseFoundation {
60
63
  destroy() { }
61
64
  }
62
65
  export default BaseFoundation;
63
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm91bmRhdGlvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2NvbXBvbmVudHMtbmcvc3JjL2NvbXBvbmVudHMtY29tbW9uL0Jhc2UvZm91bmRhdGlvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxNQUFNLElBQUksR0FBRyxHQUFHLEVBQUUsR0FBRSxDQUFDLENBQUM7QUFjdEIsTUFBTSxjQUFjO0lBQ2xCLE1BQU0sS0FBSyxVQUFVO1FBQ25CLE9BQU8sRUFBRSxDQUFDO0lBQ1osQ0FBQztJQUVELE1BQU0sS0FBSyxPQUFPO1FBQ2hCLE9BQU8sRUFBRSxDQUFDO0lBQ1osQ0FBQztJQUVELE1BQU0sS0FBSyxPQUFPO1FBQ2hCLE9BQU8sRUFBRSxDQUFDO0lBQ1osQ0FBQztJQUVELE1BQU0sS0FBSyxjQUFjO1FBQ3ZCLE9BQU87WUFDTCxPQUFPLEVBQUUsSUFBSTtZQUNiLFFBQVEsRUFBRSxJQUFJO1lBQ2QsUUFBUSxFQUFFLElBQUk7WUFDZCxTQUFTLEVBQUUsSUFBSTtZQUNmLFFBQVEsRUFBRSxJQUFJO1lBQ2QsVUFBVSxFQUFFLElBQUk7WUFDaEIsV0FBVyxFQUFFLElBQUk7WUFDakIsUUFBUSxFQUFFLElBQUk7WUFDZCxRQUFRLEVBQUUsSUFBSTtZQUNkLFNBQVMsRUFBRSxJQUFJO1lBQ2YsZUFBZSxFQUFFLElBQUk7U0FDdEIsQ0FBQztJQUNKLENBQUM7SUFJRCxZQUFZLE9BQVU7UUFDcEIsSUFBSSxDQUFDLFFBQVEsR0FBRyxFQUFFLEdBQUcsY0FBYyxDQUFDLGNBQWMsRUFBRSxHQUFHLE9BQU8sRUFBRSxDQUFDO0lBQ25FLENBQUM7SUFFRCxPQUFPLENBQUMsR0FBVztRQUNqQixPQUFPLElBQUksQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ3BDLENBQUM7SUFFRCxRQUFRO1FBQ04sT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsRUFBUyxDQUFDO0lBQ3pDLENBQUM7SUFFRCxRQUFRLENBQUMsR0FBVztRQUNsQixPQUFPLElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ3JDLENBQUM7SUFFRCxTQUFTO1FBQ1AsT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDLFNBQVMsRUFBRSxDQUFDO0lBQ25DLENBQUM7SUFFRCxRQUFRLENBQUMsTUFBVyxFQUFFLEVBQTJCO1FBQy9DLE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsRUFBRSxHQUFHLE1BQU0sRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDO0lBQ25ELENBQUM7SUFFRCwwQkFBMEI7SUFDMUIsU0FBUztRQUNQLE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQyxTQUFTLEVBQUUsQ0FBQztJQUNuQyxDQUFDO0lBRUQsUUFBUSxDQUFDLEdBQVc7UUFDbEIsT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUNyQyxDQUFDO0lBRUQsUUFBUSxDQUFDLEdBQVcsRUFBRSxLQUFVO1FBQzlCLE9BQU8sR0FBRyxJQUFJLElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLEdBQUcsRUFBRSxLQUFLLENBQUMsQ0FBQztJQUNuRCxDQUFDO0lBRUQsVUFBVSxDQUFDLEdBQVc7UUFDcEIsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO1FBQzlCLE9BQU8sR0FBRyxJQUFLLEtBQWEsQ0FBQztJQUMvQixDQUFDO0lBRUQsSUFBSSxDQUFDLFNBQWUsSUFBRyxDQUFDO0lBRXhCLE9BQU8sS0FBSSxDQUFDO0NBQ2I7QUFDRCxlQUFlLGNBQWMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImNvbnN0IG5vb3AgPSAoKSA9PiB7fTtcbmV4cG9ydCB0eXBlIG5vb3BGdW5jdGlvbiA9ICguLi5hcmdzOiBhbnkpID0+IGFueTtcblxuZXhwb3J0IGludGVyZmFjZSBEZWZhdWx0QWRhcHRlciB7XG4gIGdldFByb3Aoa2V5OiBzdHJpbmcpOiBhbnk7XG4gIGdldFByb3BzKCk6IGFueTtcbiAgZ2V0U3RhdGUoa2V5OiBzdHJpbmcpOiBhbnk7XG4gIGdldFN0YXRlcygpOiBhbnk7XG4gIHNldFN0YXRlKHM6IGFueSwgY2FsbGJhY2s/OiBhbnkpOiB2b2lkO1xuICBnZXRDYWNoZShjOiBzdHJpbmcpOiBhbnk7XG4gIGdldENhY2hlcygpOiBhbnk7XG4gIHNldENhY2hlKGtleTogYW55LCB2YWx1ZTogYW55KTogdm9pZDtcbn1cblxuY2xhc3MgQmFzZUZvdW5kYXRpb248VCBleHRlbmRzIERlZmF1bHRBZGFwdGVyPiB7XG4gIHN0YXRpYyBnZXQgY3NzQ2xhc3NlcygpIHtcbiAgICByZXR1cm4ge307XG4gIH1cblxuICBzdGF0aWMgZ2V0IHN0cmluZ3MoKSB7XG4gICAgcmV0dXJuIHt9O1xuICB9XG5cbiAgc3RhdGljIGdldCBudW1iZXJzKCkge1xuICAgIHJldHVybiB7fTtcbiAgfVxuXG4gIHN0YXRpYyBnZXQgZGVmYXVsdEFkYXB0ZXIoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGdldFByb3A6IG5vb3AsXG4gICAgICBnZXRQcm9wczogbm9vcCxcbiAgICAgIGdldFN0YXRlOiBub29wLFxuICAgICAgZ2V0U3RhdGVzOiBub29wLFxuICAgICAgc2V0U3RhdGU6IG5vb3AsXG4gICAgICBnZXRDb250ZXh0OiBub29wLFxuICAgICAgZ2V0Q29udGV4dHM6IG5vb3AsXG4gICAgICBnZXRDYWNoZTogbm9vcCxcbiAgICAgIHNldENhY2hlOiBub29wLFxuICAgICAgZ2V0Q2FjaGVzOiBub29wLFxuICAgICAgc3RvcFByb3BhZ2F0aW9uOiBub29wLFxuICAgIH07XG4gIH1cblxuICBfYWRhcHRlciE6IFQ7XG5cbiAgY29uc3RydWN0b3IoYWRhcHRlcjogVCkge1xuICAgIHRoaXMuX2FkYXB0ZXIgPSB7IC4uLkJhc2VGb3VuZGF0aW9uLmRlZmF1bHRBZGFwdGVyLCAuLi5hZGFwdGVyIH07XG4gIH1cblxuICBnZXRQcm9wKGtleTogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMuX2FkYXB0ZXIuZ2V0UHJvcChrZXkpO1xuICB9XG5cbiAgZ2V0UHJvcHMoKTogYW55IHtcbiAgICByZXR1cm4gdGhpcy5fYWRhcHRlci5nZXRQcm9wcygpIGFzIGFueTtcbiAgfVxuXG4gIGdldFN0YXRlKGtleTogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMuX2FkYXB0ZXIuZ2V0U3RhdGUoa2V5KTtcbiAgfVxuXG4gIGdldFN0YXRlcygpOiBhbnkge1xuICAgIHJldHVybiB0aGlzLl9hZGFwdGVyLmdldFN0YXRlcygpO1xuICB9XG5cbiAgc2V0U3RhdGUoc3RhdGVzOiBhbnksIGNiPzogKC4uLmFyZ3M6IGFueSkgPT4gdm9pZCkge1xuICAgIHJldHVybiB0aGlzLl9hZGFwdGVyLnNldFN0YXRlKHsgLi4uc3RhdGVzIH0sIGNiKTtcbiAgfVxuXG4gIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG4gIGdldENhY2hlcygpIHtcbiAgICByZXR1cm4gdGhpcy5fYWRhcHRlci5nZXRDYWNoZXMoKTtcbiAgfVxuXG4gIGdldENhY2hlKGtleTogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMuX2FkYXB0ZXIuZ2V0Q2FjaGUoa2V5KTtcbiAgfVxuXG4gIHNldENhY2hlKGtleTogc3RyaW5nLCB2YWx1ZTogYW55KSB7XG4gICAgcmV0dXJuIGtleSAmJiB0aGlzLl9hZGFwdGVyLnNldENhY2hlKGtleSwgdmFsdWUpO1xuICB9XG5cbiAgX2lzSW5Qcm9wcyhrZXk6IHN0cmluZykge1xuICAgIGNvbnN0IHByb3BzID0gdGhpcy5nZXRQcm9wcygpO1xuICAgIHJldHVybiBrZXkgaW4gKHByb3BzIGFzIGFueSk7XG4gIH1cblxuICBpbml0KGxpZmVjeWNsZT86IGFueSkge31cblxuICBkZXN0cm95KCkge31cbn1cbmV4cG9ydCBkZWZhdWx0IEJhc2VGb3VuZGF0aW9uO1xuIl19
66
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm91bmRhdGlvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2NvbXBvbmVudHMtbmcvc3JjL2NvbXBvbmVudHMtY29tbW9uL0Jhc2UvZm91bmRhdGlvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxNQUFNLElBQUksR0FBRyxHQUFHLEVBQUUsR0FBRSxDQUFDLENBQUM7QUFldEIsTUFBTSxjQUFjO0lBQ2xCLE1BQU0sS0FBSyxVQUFVO1FBQ25CLE9BQU8sRUFBRSxDQUFDO0lBQ1osQ0FBQztJQUVELE1BQU0sS0FBSyxPQUFPO1FBQ2hCLE9BQU8sRUFBRSxDQUFDO0lBQ1osQ0FBQztJQUVELE1BQU0sS0FBSyxPQUFPO1FBQ2hCLE9BQU8sRUFBRSxDQUFDO0lBQ1osQ0FBQztJQUVELE1BQU0sS0FBSyxjQUFjO1FBQ3ZCLE9BQU87WUFDTCxPQUFPLEVBQUUsSUFBSTtZQUNiLFFBQVEsRUFBRSxJQUFJO1lBQ2QsUUFBUSxFQUFFLElBQUk7WUFDZCxTQUFTLEVBQUUsSUFBSTtZQUNmLFFBQVEsRUFBRSxJQUFJO1lBQ2QsVUFBVSxFQUFFLElBQUk7WUFDaEIsV0FBVyxFQUFFLElBQUk7WUFDakIsUUFBUSxFQUFFLElBQUk7WUFDZCxRQUFRLEVBQUUsSUFBSTtZQUNkLFNBQVMsRUFBRSxJQUFJO1lBQ2YsZUFBZSxFQUFFLElBQUk7U0FDdEIsQ0FBQztJQUNKLENBQUM7SUFJRCxZQUFZLE9BQVU7UUFDcEIsSUFBSSxDQUFDLFFBQVEsR0FBRyxFQUFFLEdBQUcsY0FBYyxDQUFDLGNBQWMsRUFBRSxHQUFHLE9BQU8sRUFBRSxDQUFDO0lBQ25FLENBQUM7SUFFRCxPQUFPLENBQUMsR0FBVztRQUNqQixPQUFPLElBQUksQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ3BDLENBQUM7SUFFRCxRQUFRO1FBQ04sT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsRUFBUyxDQUFDO0lBQ3pDLENBQUM7SUFFRCxRQUFRLENBQUMsR0FBVztRQUNsQixPQUFPLElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ3JDLENBQUM7SUFFRCxTQUFTO1FBQ1AsT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDLFNBQVMsRUFBRSxDQUFDO0lBQ25DLENBQUM7SUFFRCxRQUFRLENBQUMsTUFBVyxFQUFFLEVBQTJCO1FBQy9DLE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsRUFBRSxHQUFHLE1BQU0sRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDO0lBQ25ELENBQUM7SUFFRCwwQkFBMEI7SUFDMUIsU0FBUztRQUNQLE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQyxTQUFTLEVBQUUsQ0FBQztJQUNuQyxDQUFDO0lBRUQsUUFBUSxDQUFDLEdBQVc7UUFDbEIsT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUNyQyxDQUFDO0lBRUQsUUFBUSxDQUFDLEdBQVcsRUFBRSxLQUFVO1FBQzlCLE9BQU8sR0FBRyxJQUFJLElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLEdBQUcsRUFBRSxLQUFLLENBQUMsQ0FBQztJQUNuRCxDQUFDO0lBRUQsUUFBUSxDQUFDLEVBQTBCO1FBQ2pDLE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDLENBQUM7SUFDcEMsQ0FBQztJQUVELFVBQVUsQ0FBQyxHQUFXO1FBQ3BCLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztRQUM5QixPQUFPLEdBQUcsSUFBSyxLQUFhLENBQUM7SUFDL0IsQ0FBQztJQUVELElBQUksQ0FBQyxTQUFlLElBQUcsQ0FBQztJQUV4QixPQUFPLEtBQUksQ0FBQztDQUNiO0FBQ0QsZUFBZSxjQUFjLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJjb25zdCBub29wID0gKCkgPT4ge307XG5leHBvcnQgdHlwZSBub29wRnVuY3Rpb24gPSAoLi4uYXJnczogYW55KSA9PiBhbnk7XG5cbmV4cG9ydCBpbnRlcmZhY2UgRGVmYXVsdEFkYXB0ZXIge1xuICBnZXRQcm9wKGtleTogc3RyaW5nKTogYW55O1xuICBnZXRQcm9wcygpOiBhbnk7XG4gIGdldFN0YXRlKGtleTogc3RyaW5nKTogYW55O1xuICBnZXRTdGF0ZXMoKTogYW55O1xuICBzZXRTdGF0ZShzOiBhbnksIGNhbGxiYWNrPzogYW55KTogdm9pZDtcbiAgZ2V0Q2FjaGUoYzogc3RyaW5nKTogYW55O1xuICBnZXRDYWNoZXMoKTogYW55O1xuICBzZXRDYWNoZShrZXk6IGFueSwgdmFsdWU6IGFueSk6IHZvaWQ7XG4gIG5leHRUaWNrKGNiOiAoLi4uYXJnczogYW55KSA9PiB2b2lkKTogdm9pZDtcbn1cblxuY2xhc3MgQmFzZUZvdW5kYXRpb248VCBleHRlbmRzIERlZmF1bHRBZGFwdGVyPiB7XG4gIHN0YXRpYyBnZXQgY3NzQ2xhc3NlcygpIHtcbiAgICByZXR1cm4ge307XG4gIH1cblxuICBzdGF0aWMgZ2V0IHN0cmluZ3MoKSB7XG4gICAgcmV0dXJuIHt9O1xuICB9XG5cbiAgc3RhdGljIGdldCBudW1iZXJzKCkge1xuICAgIHJldHVybiB7fTtcbiAgfVxuXG4gIHN0YXRpYyBnZXQgZGVmYXVsdEFkYXB0ZXIoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGdldFByb3A6IG5vb3AsXG4gICAgICBnZXRQcm9wczogbm9vcCxcbiAgICAgIGdldFN0YXRlOiBub29wLFxuICAgICAgZ2V0U3RhdGVzOiBub29wLFxuICAgICAgc2V0U3RhdGU6IG5vb3AsXG4gICAgICBnZXRDb250ZXh0OiBub29wLFxuICAgICAgZ2V0Q29udGV4dHM6IG5vb3AsXG4gICAgICBnZXRDYWNoZTogbm9vcCxcbiAgICAgIHNldENhY2hlOiBub29wLFxuICAgICAgZ2V0Q2FjaGVzOiBub29wLFxuICAgICAgc3RvcFByb3BhZ2F0aW9uOiBub29wLFxuICAgIH07XG4gIH1cblxuICBfYWRhcHRlciE6IFQ7XG5cbiAgY29uc3RydWN0b3IoYWRhcHRlcjogVCkge1xuICAgIHRoaXMuX2FkYXB0ZXIgPSB7IC4uLkJhc2VGb3VuZGF0aW9uLmRlZmF1bHRBZGFwdGVyLCAuLi5hZGFwdGVyIH07XG4gIH1cblxuICBnZXRQcm9wKGtleTogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMuX2FkYXB0ZXIuZ2V0UHJvcChrZXkpO1xuICB9XG5cbiAgZ2V0UHJvcHMoKTogYW55IHtcbiAgICByZXR1cm4gdGhpcy5fYWRhcHRlci5nZXRQcm9wcygpIGFzIGFueTtcbiAgfVxuXG4gIGdldFN0YXRlKGtleTogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMuX2FkYXB0ZXIuZ2V0U3RhdGUoa2V5KTtcbiAgfVxuXG4gIGdldFN0YXRlcygpOiBhbnkge1xuICAgIHJldHVybiB0aGlzLl9hZGFwdGVyLmdldFN0YXRlcygpO1xuICB9XG5cbiAgc2V0U3RhdGUoc3RhdGVzOiBhbnksIGNiPzogKC4uLmFyZ3M6IGFueSkgPT4gdm9pZCkge1xuICAgIHJldHVybiB0aGlzLl9hZGFwdGVyLnNldFN0YXRlKHsgLi4uc3RhdGVzIH0sIGNiKTtcbiAgfVxuXG4gIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG4gIGdldENhY2hlcygpIHtcbiAgICByZXR1cm4gdGhpcy5fYWRhcHRlci5nZXRDYWNoZXMoKTtcbiAgfVxuXG4gIGdldENhY2hlKGtleTogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMuX2FkYXB0ZXIuZ2V0Q2FjaGUoa2V5KTtcbiAgfVxuXG4gIHNldENhY2hlKGtleTogc3RyaW5nLCB2YWx1ZTogYW55KSB7XG4gICAgcmV0dXJuIGtleSAmJiB0aGlzLl9hZGFwdGVyLnNldENhY2hlKGtleSwgdmFsdWUpO1xuICB9XG5cbiAgbmV4dFRpY2soY2I6ICguLi5hcmdzOiBhbnkpID0+IHZvaWQpIHtcbiAgICByZXR1cm4gdGhpcy5fYWRhcHRlci5uZXh0VGljayhjYik7XG4gIH1cblxuICBfaXNJblByb3BzKGtleTogc3RyaW5nKSB7XG4gICAgY29uc3QgcHJvcHMgPSB0aGlzLmdldFByb3BzKCk7XG4gICAgcmV0dXJuIGtleSBpbiAocHJvcHMgYXMgYW55KTtcbiAgfVxuXG4gIGluaXQobGlmZWN5Y2xlPzogYW55KSB7fVxuXG4gIGRlc3Ryb3koKSB7fVxufVxuZXhwb3J0IGRlZmF1bHQgQmFzZUZvdW5kYXRpb247XG4iXX0=