@libs-ui/components-scroll-overlay 0.2.279 → 0.2.280
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/demo/scroll-overlay.demo.d.ts +32 -3
- package/esm2022/demo/scroll-overlay.demo.mjs +65 -39
- package/esm2022/scroll-overlay.directive.mjs +2 -2
- package/fesm2022/libs-ui-components-scroll-overlay.mjs +64 -38
- package/fesm2022/libs-ui-components-scroll-overlay.mjs.map +1 -1
- package/package.json +2 -2
|
@@ -3,13 +3,42 @@ import * as i0 from "@angular/core";
|
|
|
3
3
|
export declare class LibsUiComponentsScrollOverlayDemoComponent {
|
|
4
4
|
longContent: import("@angular/core").WritableSignal<string>;
|
|
5
5
|
longHorizontalContent: import("@angular/core").WritableSignal<string>;
|
|
6
|
+
scenarioOptions: readonly ["default", "customStyle", "autoHide", "horizontal"];
|
|
7
|
+
selectedScenario: typeof this.scenarioOptions[number];
|
|
6
8
|
customStyleOptions: import("@angular/core").WritableSignal<IScrollOverlayOptions>;
|
|
7
9
|
autoHideOptions: import("@angular/core").WritableSignal<IScrollOverlayOptions>;
|
|
8
10
|
horizontalOptions: import("@angular/core").WritableSignal<IScrollOverlayOptions>;
|
|
9
11
|
lastEvent: import("@angular/core").WritableSignal<string>;
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
12
|
+
get options(): IScrollOverlayOptions | undefined;
|
|
13
|
+
get content(): string;
|
|
14
|
+
onScroll(): void;
|
|
15
|
+
onScrollTop(): void;
|
|
16
|
+
onScrollBottom(): void;
|
|
17
|
+
inputsDoc: {
|
|
18
|
+
name: string;
|
|
19
|
+
type: string;
|
|
20
|
+
default: string;
|
|
21
|
+
description: string;
|
|
22
|
+
}[];
|
|
23
|
+
outputsDoc: {
|
|
24
|
+
name: string;
|
|
25
|
+
type: string;
|
|
26
|
+
description: string;
|
|
27
|
+
}[];
|
|
28
|
+
optionsDoc: {
|
|
29
|
+
name: string;
|
|
30
|
+
type: string;
|
|
31
|
+
default: string;
|
|
32
|
+
description: string;
|
|
33
|
+
}[];
|
|
34
|
+
interfacesDoc: {
|
|
35
|
+
name: string;
|
|
36
|
+
type: string;
|
|
37
|
+
description: string;
|
|
38
|
+
}[];
|
|
39
|
+
installCommandNpm: string;
|
|
40
|
+
installCommandYarn: string;
|
|
41
|
+
copyToClipboard(text: string): void;
|
|
13
42
|
static ɵfac: i0.ɵɵFactoryDeclaration<LibsUiComponentsScrollOverlayDemoComponent, never>;
|
|
14
43
|
static ɵcmp: i0.ɵɵComponentDeclaration<LibsUiComponentsScrollOverlayDemoComponent, "lib-scroll-overlay-demo", never, {}, {}, never, never, true, never>;
|
|
15
44
|
}
|
|
@@ -1,52 +1,78 @@
|
|
|
1
|
-
import { Component, signal } from '@angular/core';
|
|
2
1
|
import { CommonModule } from '@angular/common';
|
|
2
|
+
import { Component, signal } from '@angular/core';
|
|
3
3
|
import { LibsUiComponentsScrollOverlayDirective } from '../scroll-overlay.directive';
|
|
4
4
|
import * as i0 from "@angular/core";
|
|
5
|
+
import * as i1 from "@angular/common";
|
|
5
6
|
export class LibsUiComponentsScrollOverlayDemoComponent {
|
|
6
|
-
// Demo content
|
|
7
|
-
longContent = signal(
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
scrollbarPadding: 4
|
|
19
|
-
});
|
|
20
|
-
autoHideOptions = signal({
|
|
21
|
-
scrollYOpacity0: true,
|
|
22
|
-
scrollbarWidth: 8,
|
|
23
|
-
scrollbarColor: 'transparent',
|
|
24
|
-
scrollThumbColor: '#9ca3af',
|
|
25
|
-
scrollThumbHoverColor: '#6b7280'
|
|
26
|
-
});
|
|
27
|
-
horizontalOptions = signal({
|
|
28
|
-
scrollX: 'scroll',
|
|
29
|
-
scrollY: 'hidden',
|
|
30
|
-
scrollbarWidth: 8,
|
|
31
|
-
scrollbarColor: '#f3f4f6',
|
|
32
|
-
scrollThumbColor: '#3b82f6'
|
|
33
|
-
});
|
|
34
|
-
// Event handling
|
|
7
|
+
// Demo text content: generate 5000 words for vertical scrolling
|
|
8
|
+
longContent = signal(Array.from({ length: 5000 }, (_, i) => `Lorem${i + 1}`).join(' '));
|
|
9
|
+
// Demo horizontal content: generate 5000 words for horizontal scrolling
|
|
10
|
+
longHorizontalContent = signal(Array.from({ length: 5000 }, (_, i) => `Word${i + 1}`).join(' '));
|
|
11
|
+
// Scenario selection
|
|
12
|
+
scenarioOptions = ['default', 'customStyle', 'autoHide', 'horizontal'];
|
|
13
|
+
selectedScenario = 'default';
|
|
14
|
+
// Options signals
|
|
15
|
+
customStyleOptions = signal({ scrollbarWidth: 12, scrollbarColor: '#f3f4f6', scrollbarHoverColor: '#e5e7eb', scrollThumbColor: '#3b82f6', scrollThumbHoverColor: '#2563eb', scrollbarPadding: 4 });
|
|
16
|
+
autoHideOptions = signal({ scrollYOpacity0: true, scrollbarWidth: 8, scrollbarColor: 'transparent', scrollThumbColor: '#9ca3af', scrollThumbHoverColor: '#6b7280' });
|
|
17
|
+
horizontalOptions = signal({ scrollX: 'scroll', scrollY: 'hidden', scrollbarWidth: 8, scrollbarColor: '#f3f4f6', scrollThumbColor: '#3b82f6' });
|
|
18
|
+
// Scroll event log
|
|
35
19
|
lastEvent = signal('No events yet');
|
|
36
|
-
|
|
37
|
-
|
|
20
|
+
// Helpers
|
|
21
|
+
get options() {
|
|
22
|
+
switch (this.selectedScenario) {
|
|
23
|
+
case 'customStyle': return this.customStyleOptions();
|
|
24
|
+
case 'autoHide': return this.autoHideOptions();
|
|
25
|
+
case 'horizontal': return this.horizontalOptions();
|
|
26
|
+
default: return undefined;
|
|
27
|
+
}
|
|
38
28
|
}
|
|
39
|
-
|
|
40
|
-
this.
|
|
29
|
+
get content() {
|
|
30
|
+
return this.selectedScenario === 'horizontal'
|
|
31
|
+
? this.longHorizontalContent()
|
|
32
|
+
: this.longContent();
|
|
41
33
|
}
|
|
42
|
-
|
|
43
|
-
|
|
34
|
+
// Event handlers
|
|
35
|
+
onScroll() { this.lastEvent.set('Scroll event fired'); }
|
|
36
|
+
onScrollTop() { this.lastEvent.set('Reached top'); }
|
|
37
|
+
onScrollBottom() { this.lastEvent.set('Reached bottom'); }
|
|
38
|
+
// API docs
|
|
39
|
+
inputsDoc = [
|
|
40
|
+
{ name: 'options', type: 'IScrollOverlayOptions', default: 'undefined', description: 'Cấu hình tuỳ chỉnh scrollbar' },
|
|
41
|
+
{ name: 'debugMode', type: 'boolean', default: 'false', description: 'Bật chế độ debug' },
|
|
42
|
+
{ name: 'notShowScrollBarX', type: 'boolean', default: 'false', description: 'Ẩn scrollbar ngang' },
|
|
43
|
+
{ name: 'notShowScrollBarY', type: 'boolean', default: 'false', description: 'Ẩn scrollbar dọc' }
|
|
44
|
+
];
|
|
45
|
+
outputsDoc = [
|
|
46
|
+
{ name: 'outScroll', type: 'Event', description: 'Bắn ra khi scroll bất kỳ' },
|
|
47
|
+
{ name: 'outScrollTop', type: 'Event', description: 'Bắn ra khi scroll đến top' },
|
|
48
|
+
{ name: 'outScrollBottom', type: 'Event', description: 'Bắn ra khi scroll đến bottom' }
|
|
49
|
+
];
|
|
50
|
+
optionsDoc = [
|
|
51
|
+
{ name: 'scrollbarWidth', type: 'number', default: 'undefined', description: 'Chiều rộng scrollbar (px)' },
|
|
52
|
+
{ name: 'scrollbarColor', type: 'string', default: 'undefined', description: 'Màu track scrollbar' },
|
|
53
|
+
{ name: 'scrollbarHoverColor', type: 'string', default: 'undefined', description: 'Màu track khi hover' },
|
|
54
|
+
{ name: 'scrollThumbColor', type: 'string', default: 'undefined', description: 'Màu thumb' },
|
|
55
|
+
{ name: 'scrollThumbHoverColor', type: 'string', default: 'undefined', description: 'Màu thumb khi hover' },
|
|
56
|
+
{ name: 'scrollbarPadding', type: 'number', default: 'undefined', description: 'Padding scrollbar' },
|
|
57
|
+
{ name: 'scrollX', type: `'hidden' | 'scroll'`, default: 'undefined', description: 'Kiểu scroll X' },
|
|
58
|
+
{ name: 'scrollXOpacity0', type: 'boolean', default: 'undefined', description: 'Ẩn track X khi không hover' },
|
|
59
|
+
{ name: 'scrollY', type: `'hidden' | 'scroll'`, default: 'undefined', description: 'Kiểu scroll Y' },
|
|
60
|
+
{ name: 'scrollYOpacity0', type: 'boolean', default: 'undefined', description: 'Ẩn track Y khi không hover' }
|
|
61
|
+
];
|
|
62
|
+
interfacesDoc = [
|
|
63
|
+
{ name: 'IScrollOverlayOptions', type: 'interface', description: 'Các tuỳ chọn cấu hình scroll-overlay' }
|
|
64
|
+
];
|
|
65
|
+
// Installation commands
|
|
66
|
+
installCommandNpm = 'npm install @libs-ui/components-scroll-overlay';
|
|
67
|
+
installCommandYarn = 'yarn add @libs-ui/components-scroll-overlay';
|
|
68
|
+
copyToClipboard(text) {
|
|
69
|
+
navigator.clipboard.writeText(text).then(() => console.log('Copied:', text));
|
|
44
70
|
}
|
|
45
71
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: LibsUiComponentsScrollOverlayDemoComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
46
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: LibsUiComponentsScrollOverlayDemoComponent, isStandalone: true, selector: "lib-scroll-overlay-demo", ngImport: i0, template: "<div class=\"demo-container\">\n <h2>Scroll Overlay Demo</h2>\n\n <div class=\"demo-intro\">\n <h3>Gi\u1EDBi thi\u1EC7u</h3>\n <p>Demo n\u00E0y minh h\u1ECDa c\u00E1c t\u00EDnh n\u0103ng v\u00E0 c\u00E1ch s\u1EED d\u1EE5ng c\u1EE7a directive `scroll-overlay`. Demo bao g\u1ED3m 5 v\u00ED d\u1EE5 ch\u00EDnh:</p>\n <ul>\n <li><strong>Basic Usage</strong>: S\u1EED d\u1EE5ng c\u01A1 b\u1EA3n v\u1EDBi c\u1EA5u h\u00ECnh m\u1EB7c \u0111\u1ECBnh</li>\n <li><strong>Custom Styling</strong>: Tu\u1EF3 ch\u1EC9nh m\u00E0u s\u1EAFc, k\u00EDch th\u01B0\u1EDBc v\u00E0 padding c\u1EE7a thanh cu\u1ED9n</li>\n <li><strong>Auto Hide</strong>: \u1EA8n/hi\u1EC7n thanh cu\u1ED9n khi hover</li>\n <li><strong>Horizontal Scroll</strong>: Cu\u1ED9n ngang v\u1EDBi n\u1ED9i dung d\u00E0i</li>\n <li><strong>Event Handling</strong>: X\u1EED l\u00FD c\u00E1c s\u1EF1 ki\u1EC7n scroll</li>\n </ul>\n </div>\n\n <div class=\"demo-features\">\n <h3>T\u00EDnh n\u0103ng Demo</h3>\n <div class=\"features-grid\">\n <div class=\"feature-item\">\n <h4>Tu\u1EF3 bi\u1EBFn giao di\u1EC7n</h4>\n <p>Thay \u0111\u1ED5i m\u00E0u s\u1EAFc, k\u00EDch th\u01B0\u1EDBc, padding c\u1EE7a thanh cu\u1ED9n</p>\n </div>\n <div class=\"feature-item\">\n <h4>Hi\u1EC7u \u1EE9ng t\u01B0\u01A1ng t\u00E1c</h4>\n <p>Hover effects, auto-hide khi kh\u00F4ng s\u1EED d\u1EE5ng</p>\n </div>\n <div class=\"feature-item\">\n <h4>\u0110a h\u01B0\u1EDBng cu\u1ED9n</h4>\n <p>H\u1ED7 tr\u1EE3 c\u1EA3 cu\u1ED9n d\u1ECDc v\u00E0 ngang</p>\n </div>\n <div class=\"feature-item\">\n <h4>Event handling</h4>\n <p>Theo d\u00F5i c\u00E1c s\u1EF1 ki\u1EC7n scroll (top, bottom, scroll)</p>\n </div>\n <div class=\"feature-item\">\n <h4>Responsive</h4>\n <p>Ho\u1EA1t \u0111\u1ED9ng t\u1ED1t tr\u00EAn m\u1ECDi k\u00EDch th\u01B0\u1EDBc m\u00E0n h\u00ECnh</p>\n </div>\n <div class=\"feature-item\">\n <h4>T\u00EDch h\u1EE3p d\u1EC5 d\u00E0ng</h4>\n <p>C\u00F3 th\u1EC3 th\u00EAm v\u00E0o b\u1EA5t k\u1EF3 container n\u00E0o</p>\n </div>\n </div>\n </div>\n\n <div class=\"demo-api\">\n <h3>API Reference</h3>\n\n <div class=\"api-section\">\n <h4>Inputs</h4>\n <div class=\"api-table\">\n <table>\n <thead>\n <tr>\n <th>Input</th>\n <th>Type</th>\n <th>M\u00F4 t\u1EA3</th>\n </tr>\n </thead>\n <tbody>\n <tr>\n <td>options</td>\n <td>IScrollOverlayOptions</td>\n <td>Tu\u1EF3 ch\u1ECDn c\u1EA5u h\u00ECnh thanh cu\u1ED9n</td>\n </tr>\n <tr>\n <td>debugMode</td>\n <td>boolean</td>\n <td>B\u1EADt ch\u1EBF \u0111\u1ED9 debug</td>\n </tr>\n <tr>\n <td>ignoreInit</td>\n <td>boolean</td>\n <td>B\u1ECF qua kh\u1EDFi t\u1EA1o directive</td>\n </tr>\n <tr>\n <td>classContainer</td>\n <td>string</td>\n <td>Th\u00EAm class cho container b\u1ECDc ngo\u00E0i</td>\n </tr>\n <tr>\n <td>notShowScrollBarX</td>\n <td>boolean</td>\n <td>Kh\u00F4ng hi\u1EC3n th\u1ECB thanh cu\u1ED9n ngang</td>\n </tr>\n <tr>\n <td>notShowScrollBarY</td>\n <td>boolean</td>\n <td>Kh\u00F4ng hi\u1EC3n th\u1ECB thanh cu\u1ED9n d\u1ECDc</td>\n </tr>\n <tr>\n <td>elementCheckScrollX</td>\n <td>HTMLElement</td>\n <td>Ph\u1EA7n t\u1EED d\u00F9ng \u0111\u1EC3 ki\u1EC3m tra scroll X</td>\n </tr>\n <tr>\n <td>elementCheckScrollY</td>\n <td>HTMLElement</td>\n <td>Ph\u1EA7n t\u1EED d\u00F9ng \u0111\u1EC3 ki\u1EC3m tra scroll Y</td>\n </tr>\n <tr>\n <td>elementScroll</td>\n <td>HTMLElement</td>\n <td>Ph\u1EA7n t\u1EED th\u1EF1c hi\u1EC7n scroll</td>\n </tr>\n </tbody>\n </table>\n </div>\n </div>\n\n <div class=\"api-section\">\n <h4>Outputs</h4>\n <div class=\"api-table\">\n <table>\n <thead>\n <tr>\n <th>Output</th>\n <th>Type</th>\n <th>M\u00F4 t\u1EA3</th>\n </tr>\n </thead>\n <tbody>\n <tr>\n <td>outScroll</td>\n <td>Event</td>\n <td>B\u1EAFn ra khi scroll b\u1EA5t k\u1EF3</td>\n </tr>\n <tr>\n <td>outScrollX</td>\n <td>Event</td>\n <td>B\u1EAFn ra khi scroll theo chi\u1EC1u ngang</td>\n </tr>\n <tr>\n <td>outScrollY</td>\n <td>Event</td>\n <td>B\u1EAFn ra khi scroll theo chi\u1EC1u d\u1ECDc</td>\n </tr>\n <tr>\n <td>outScrollTop</td>\n <td>Event</td>\n <td>B\u1EAFn ra khi scroll t\u1EDBi \u0111\u1EA7u (top)</td>\n </tr>\n <tr>\n <td>outScrollBottom</td>\n <td>Event</td>\n <td>B\u1EAFn ra khi scroll t\u1EDBi cu\u1ED1i (bottom)</td>\n </tr>\n </tbody>\n </table>\n </div>\n </div>\n\n <div class=\"api-section\">\n <h4>Interface</h4>\n <div class=\"interface-description\">\n <p>Interface <code>IScrollOverlayOptions</code> \u0111\u1ECBnh ngh\u0129a c\u00E1c tu\u1EF3 ch\u1ECDn c\u1EA5u h\u00ECnh cho scroll-overlay directive:\n </p>\n <pre><code>export interface IScrollOverlayOptions {{ '{' }}\n scrollbarWidth?: number; // Chi\u1EC1u r\u1ED9ng thanh cu\u1ED9n (px)\n scrollbarColor?: string; // M\u00E0u n\u1EC1n track\n scrollbarHoverColor?: string; // M\u00E0u n\u1EC1n track khi hover\n scrollThumbColor?: string; // M\u00E0u thumb\n scrollThumbHoverColor?: string; // M\u00E0u thumb khi hover\n scrollbarPadding?: number; // Padding c\u1EE7a scrollbar\n scrollX?: 'hidden' | 'scroll'; // Ki\u1EC3u hi\u1EC3n th\u1ECB scroll X\n scrollXOpacity0?: boolean; // \u1EA8n track X khi kh\u00F4ng hover\n scrollY?: 'hidden' | 'scroll'; // Ki\u1EC3u hi\u1EC3n th\u1ECB scroll Y\n scrollYOpacity0?: boolean; // \u1EA8n track Y khi kh\u00F4ng hover\n{{ '}' }}</code></pre>\n </div>\n\n <div class=\"interface-usage\">\n <h5>V\u00ED d\u1EE5 s\u1EED d\u1EE5ng:</h5>\n <pre><code>// C\u1EA5u h\u00ECnh c\u01A1 b\u1EA3n\nconst basicOptions: IScrollOverlayOptions = {{ '{' }}\n scrollbarWidth: 8,\n scrollbarColor: '#f3f4f6',\n scrollThumbColor: '#3b82f6'\n{{ '}' }};\n\n// C\u1EA5u h\u00ECnh n\u00E2ng cao v\u1EDBi hover effects\nconst advancedOptions: IScrollOverlayOptions = {{ '{' }}\n scrollbarWidth: 12,\n scrollbarColor: '#f3f4f6',\n scrollbarHoverColor: '#e5e7eb',\n scrollThumbColor: '#3b82f6',\n scrollThumbHoverColor: '#2563eb',\n scrollbarPadding: 4,\n scrollYOpacity0: true\n{{ '}' }};\n\n// C\u1EA5u h\u00ECnh cho scroll ngang\nconst horizontalOptions: IScrollOverlayOptions = {{ '{' }}\n scrollX: 'scroll',\n scrollY: 'hidden',\n scrollbarWidth: 8,\n scrollbarColor: '#f3f4f6',\n scrollThumbColor: '#3b82f6'\n{{ '}' }};</code></pre>\n </div>\n\n <div class=\"interface-notes\">\n <h5>Ghi ch\u00FA:</h5>\n <ul>\n <li>T\u1EA5t c\u1EA3 c\u00E1c thu\u1ED9c t\u00EDnh \u0111\u1EC1u l\u00E0 optional (c\u00F3 d\u1EA5u ?)</li>\n <li>N\u1EBFu kh\u00F4ng cung c\u1EA5p gi\u00E1 tr\u1ECB, directive s\u1EBD s\u1EED d\u1EE5ng gi\u00E1 tr\u1ECB m\u1EB7c \u0111\u1ECBnh</li>\n <li>C\u00F3 th\u1EC3 k\u1EBFt h\u1EE3p nhi\u1EC1u options \u0111\u1EC3 t\u1EA1o ra giao di\u1EC7n thanh cu\u1ED9n ph\u00F9 h\u1EE3p</li>\n <li>M\u00E0u s\u1EAFc c\u00F3 th\u1EC3 s\u1EED d\u1EE5ng b\u1EA5t k\u1EF3 \u0111\u1ECBnh d\u1EA1ng CSS color n\u00E0o (hex, rgb, rgba, etc.)</li>\n <li>scrollX v\u00E0 scrollY ch\u1EC9 nh\u1EADn m\u1ED9t trong hai gi\u00E1 tr\u1ECB: 'hidden' ho\u1EB7c 'scroll'</li>\n </ul>\n </div>\n </div>\n\n <div class=\"api-section\">\n <h4>Options (IScrollOverlayOptions)</h4>\n <div class=\"api-table\">\n <table>\n <thead>\n <tr>\n <th>Thu\u1ED9c t\u00EDnh</th>\n <th>Type</th>\n <th>M\u00F4 t\u1EA3</th>\n </tr>\n </thead>\n <tbody>\n <tr>\n <td>scrollbarWidth</td>\n <td>number</td>\n <td>Chi\u1EC1u r\u1ED9ng thanh cu\u1ED9n (px)</td>\n </tr>\n <tr>\n <td>scrollbarColor</td>\n <td>string</td>\n <td>M\u00E0u n\u1EC1n track</td>\n </tr>\n <tr>\n <td>scrollbarHoverColor</td>\n <td>string</td>\n <td>M\u00E0u n\u1EC1n track khi hover</td>\n </tr>\n <tr>\n <td>scrollThumbColor</td>\n <td>string</td>\n <td>M\u00E0u thumb</td>\n </tr>\n <tr>\n <td>scrollThumbHoverColor</td>\n <td>string</td>\n <td>M\u00E0u thumb khi hover</td>\n </tr>\n <tr>\n <td>scrollbarPadding</td>\n <td>number</td>\n <td>Padding c\u1EE7a scrollbar</td>\n </tr>\n <tr>\n <td>scrollX</td>\n <td>'hidden'|'scroll'</td>\n <td>Ki\u1EC3u hi\u1EC3n th\u1ECB scroll X</td>\n </tr>\n <tr>\n <td>scrollXOpacity0</td>\n <td>boolean</td>\n <td>\u1EA8n track X khi kh\u00F4ng hover</td>\n </tr>\n <tr>\n <td>scrollY</td>\n <td>'hidden'|'scroll'</td>\n <td>Ki\u1EC3u hi\u1EC3n th\u1ECB scroll Y</td>\n </tr>\n <tr>\n <td>scrollYOpacity0</td>\n <td>boolean</td>\n <td>\u1EA8n track Y khi kh\u00F4ng hover</td>\n </tr>\n </tbody>\n </table>\n </div>\n </div>\n </div>\n\n <!-- Basic Demo -->\n <div class=\"demo-section\">\n <h3>1. Basic Usage</h3>\n <div class=\"demo-description\">\n <p>S\u1EED d\u1EE5ng c\u01A1 b\u1EA3n v\u1EDBi c\u1EA5u h\u00ECnh m\u1EB7c \u0111\u1ECBnh c\u1EE7a scroll-overlay directive.</p>\n <pre><code><div LibsUiComponentsScrollOverlayDirective\n style=\"width: 300px; height: 200px;\">\n N\u1ED9i dung d\u00E0i...\n</div></code></pre>\n </div>\n <div class=\"demo-box\">\n <div LibsUiComponentsScrollOverlayDirective\n style=\"width: 300px; height: 200px; border: 1px solid #ddd;\">\n <div style=\"padding: 16px;\">\n {{ longContent() }}\n </div>\n </div>\n </div>\n </div>\n\n <!-- Custom Styling Demo -->\n <div class=\"demo-section\">\n <h3>2. Custom Styling</h3>\n <div class=\"demo-description\">\n <p>Tu\u1EF3 ch\u1EC9nh m\u00E0u s\u1EAFc, k\u00EDch th\u01B0\u1EDBc v\u00E0 padding c\u1EE7a thanh cu\u1ED9n.</p>\n <pre><code><div LibsUiComponentsScrollOverlayDirective\n [options]=\"{{ '{' }}\"\n scrollbarWidth: 12,\n scrollbarColor: '#f3f4f6',\n scrollThumbColor: '#3b82f6',\n scrollbarPadding: 4\n {{ '}' }}\">\n N\u1ED9i dung d\u00E0i...\n</div></code></pre>\n </div>\n <div class=\"demo-box\">\n <div LibsUiComponentsScrollOverlayDirective\n [options]=\"customStyleOptions()\"\n style=\"width: 300px; height: 200px; border: 1px solid #ddd;\">\n <div style=\"padding: 16px;\">\n {{ longContent() }}\n </div>\n </div>\n </div>\n </div>\n\n <!-- Auto Hide Demo -->\n <div class=\"demo-section\">\n <h3>3. Auto Hide on Hover</h3>\n <div class=\"demo-description\">\n <p>\u1EA8n/hi\u1EC7n thanh cu\u1ED9n khi hover v\u00E0o container.</p>\n <pre><code><div LibsUiComponentsScrollOverlayDirective\n [options]=\"{{ '{' }}\"\n scrollYOpacity0: true,\n scrollbarColor: 'transparent',\n scrollThumbColor: '#9ca3af'\n {{ '}' }}\">\n N\u1ED9i dung d\u00E0i...\n</div></code></pre>\n </div>\n <div class=\"demo-box\">\n <div LibsUiComponentsScrollOverlayDirective\n [options]=\"autoHideOptions()\"\n style=\"width: 300px; height: 200px; border: 1px solid #ddd;\">\n <div style=\"padding: 16px;\">\n {{ longContent() }}\n </div>\n </div>\n </div>\n </div>\n\n <!-- Horizontal Scroll Demo -->\n <div class=\"demo-section\">\n <h3>4. Horizontal Scroll</h3>\n <div class=\"demo-description\">\n <p>Cu\u1ED9n ngang v\u1EDBi n\u1ED9i dung d\u00E0i.</p>\n <pre><code><div LibsUiComponentsScrollOverlayDirective\n [options]=\"{{ '{' }}\"\n scrollX: 'scroll',\n scrollY: 'hidden'\n {{ '}' }}\">\n <div style=\"white-space: nowrap;\">\n N\u1ED9i dung ngang d\u00E0i...\n </div>\n</div></code></pre>\n </div>\n <div class=\"demo-box\">\n <div LibsUiComponentsScrollOverlayDirective\n [options]=\"horizontalOptions()\"\n style=\"width: 300px; height: 100px; border: 1px solid #ddd;\">\n <div style=\"padding: 16px; white-space: nowrap;\">\n {{ longHorizontalContent() }}\n </div>\n </div>\n </div>\n </div>\n\n <!-- Event Handling Demo -->\n <div class=\"demo-section\">\n <h3>5. Event Handling</h3>\n <div class=\"demo-description\">\n <p>X\u1EED l\u00FD c\u00E1c s\u1EF1 ki\u1EC7n scroll.</p>\n <pre><code><div LibsUiComponentsScrollOverlayDirective\n (outScroll)=\"onScroll($event)\"\n (outScrollTop)=\"onScrollTop($event)\"\n (outScrollBottom)=\"onScrollBottom($event)\">\n N\u1ED9i dung d\u00E0i...\n</div></code></pre>\n </div>\n <div class=\"demo-box\">\n <div LibsUiComponentsScrollOverlayDirective\n (outScroll)=\"onScroll($event)\"\n (outScrollTop)=\"onScrollTop($event)\"\n (outScrollBottom)=\"onScrollBottom($event)\"\n style=\"width: 300px; height: 200px; border: 1px solid #ddd;\">\n <div style=\"padding: 16px;\">\n {{ longContent() }}\n </div>\n </div>\n <div class=\"event-log\">\n <p>Last Event: {{ lastEvent() }}</p>\n </div>\n </div>\n </div>\n</div>\n", styles: ["@charset \"UTF-8\";.demo-container{padding:24px;font-family:system-ui,-apple-system,sans-serif;max-width:1200px;margin:0 auto}.demo-intro{margin-bottom:32px}.demo-intro h3{color:#333;margin-bottom:16px}.demo-intro ul{list-style:none;padding:0}.demo-intro ul li{margin-bottom:8px;padding-left:20px;position:relative}.demo-intro ul li:before{content:\"\\2022\";position:absolute;left:0;color:#3b82f6}.demo-features{margin-bottom:32px}.demo-features h3{color:#333;margin-bottom:16px}.features-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(250px,1fr));gap:16px}.feature-item{background:#f8fafc;padding:16px;border-radius:8px;border:1px solid #e2e8f0}.feature-item h4{color:#1e40af;margin:0 0 8px}.feature-item p{margin:0;color:#64748b}.demo-api{margin-bottom:48px}.demo-api h3{color:#333;margin-bottom:24px}.api-section{margin-bottom:32px}.api-section h4{color:#1e40af;margin-bottom:16px}.api-table{overflow-x:auto}.api-table table{width:100%;border-collapse:collapse;background:#fff;border-radius:8px;border:1px solid #e2e8f0}.api-table table th,.api-table table td{padding:12px 16px;text-align:left;border-bottom:1px solid #e2e8f0}.api-table table th{background:#f8fafc;font-weight:600;color:#1e40af}.api-table table td{color:#64748b}.api-table table td:first-child{font-family:Fira Code,monospace;color:#334155}.api-table table td:nth-child(2){font-family:Fira Code,monospace;color:#3b82f6}.api-table table tr:last-child td{border-bottom:none}.demo-section{margin-bottom:48px}.demo-section h3{color:#333;margin-bottom:16px}.demo-description{margin-bottom:16px}.demo-description p{color:#64748b;margin-bottom:12px}.demo-description pre{background:#f8fafc;padding:16px;border-radius:8px;border:1px solid #e2e8f0;overflow-x:auto}.demo-description pre code{font-family:Fira Code,monospace;font-size:14px;color:#334155}.demo-box{display:flex;gap:16px;align-items:flex-start}.event-log{padding:16px;background:#f5f5f5;border-radius:4px;min-width:200px}.event-log p{margin:0;font-size:14px;color:#666}.demo-notes{margin-top:48px;padding:24px;background:#f8fafc;border-radius:8px;border:1px solid #e2e8f0}.demo-notes h3{color:#333;margin-bottom:16px}.demo-notes ul{list-style:none;padding:0;margin:0}.demo-notes ul li{color:#64748b;margin-bottom:12px;padding-left:24px;position:relative}.demo-notes ul li:before{content:\"\\2192\";position:absolute;left:0;color:#3b82f6}.demo-notes ul li:last-child{margin-bottom:0}.interface-description{margin-bottom:24px}.interface-description p{color:#64748b;margin-bottom:16px}.interface-description pre{background:#f8fafc;padding:16px;border-radius:8px;border:1px solid #e2e8f0;overflow-x:auto}.interface-description pre code{font-family:Fira Code,monospace;font-size:14px;color:#334155;line-height:1.6}.interface-usage{margin-bottom:24px}.interface-usage h5{color:#1e40af;margin-bottom:12px;font-size:16px}.interface-usage pre{background:#f8fafc;padding:16px;border-radius:8px;border:1px solid #e2e8f0;overflow-x:auto}.interface-usage pre code{font-family:Fira Code,monospace;font-size:14px;color:#334155;line-height:1.6}.interface-usage pre code .comment{color:#64748b}.interface-notes{background:#f8fafc;padding:16px;border-radius:8px;border:1px solid #e2e8f0}.interface-notes h5{color:#1e40af;margin-bottom:12px;font-size:16px}.interface-notes ul{list-style:none;padding:0;margin:0}.interface-notes ul li{color:#64748b;margin-bottom:8px;padding-left:20px;position:relative}.interface-notes ul li:before{content:\"\\2022\";position:absolute;left:0;color:#3b82f6}.interface-notes ul li:last-child{margin-bottom:0}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: LibsUiComponentsScrollOverlayDirective, selector: "[LibsUiComponentsScrollOverlayDirective]", inputs: ["debugMode", "ignoreInit", "classContainer", "options", "elementCheckScrollX", "elementCheckScrollY", "elementScroll"], outputs: ["outScroll", "outScrollX", "outScrollY", "outScrollTop", "outScrollBottom"] }] });
|
|
72
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: LibsUiComponentsScrollOverlayDemoComponent, isStandalone: true, selector: "lib-scroll-overlay-demo", ngImport: i0, template: "<div class=\"max-w-6xl mx-auto p-5 font-sans text-gray-800\">\n <header class=\"text-center py-10 bg-white rounded-lg mb-8 shadow-sm\">\n <h1 class=\"text-4xl font-bold mb-2\">Demo Scroll Overlay</h1>\n <p class=\"text-xl text-gray-500\">@libs-ui/components-scroll-overlay</p>\n </header>\n\n <main>\n <!-- Gi\u1EDBi thi\u1EC7u -->\n <section class=\"bg-white rounded-lg p-8 mb-8 shadow-sm\">\n <h2 class=\"text-2xl font-bold mb-5 pb-3 border-b border-gray-200\">Gi\u1EDBi thi\u1EC7u</h2>\n <p><code>scroll-overlay</code> l\u00E0 m\u1ED9t directive gi\u00FAp tu\u1EF3 bi\u1EBFn scrollbar tr\u00EAn b\u1EA5t k\u1EF3 ph\u1EA7n t\u1EED n\u00E0o trong Angular, h\u1ED7 tr\u1EE3 tu\u1EF3 ch\u1EC9nh m\u00E0u, k\u00EDch th\u01B0\u1EDBc, \u1EA9n/hi\u1EC7n v\u00E0 s\u1EF1 ki\u1EC7n scroll.</p>\n </section>\n\n <!-- C\u00E0i \u0111\u1EB7t -->\n <section class=\"bg-white rounded-lg p-8 mb-8 shadow-sm\">\n <h2 class=\"text-2xl font-bold mb-5 pb-3 border-b border-gray-200\">C\u00E0i \u0111\u1EB7t</h2>\n <div class=\"flex items-center bg-gray-100 p-4 rounded-lg mb-4\">\n <pre class=\"flex-1 text-sm overflow-x-auto\"><code>{{ installCommandNpm }}</code></pre>\n <button class=\"ml-4 px-3 py-1 bg-blue-500 text-white rounded hover:bg-blue-600\" (click)=\"copyToClipboard(installCommandNpm)\">Sao ch\u00E9p</button>\n </div>\n <div class=\"flex items-center bg-gray-100 p-4 rounded-lg\">\n <pre class=\"flex-1 text-sm overflow-x-auto\"><code>{{ installCommandYarn }}</code></pre>\n <button class=\"ml-4 px-3 py-1 bg-blue-500 text-white rounded hover:bg-blue-600\" (click)=\"copyToClipboard(installCommandYarn)\">Sao ch\u00E9p</button>\n </div>\n </section>\n\n <!-- Demo Tr\u1EF1c ti\u1EBFp -->\n <section class=\"bg-white rounded-lg p-8 mb-8 shadow-sm\">\n <h2 class=\"text-2xl font-bold mb-5 pb-3 border-b border-gray-200\">Demo Tr\u1EF1c ti\u1EBFp</h2>\n <div class=\"grid grid-cols-4 gap-4 mb-6\">\n <button *ngFor=\"let sc of scenarioOptions\"\n (click)=\"selectedScenario = sc\"\n class=\"px-3 py-1 border rounded\"\n [class.bg-blue-500]=\"selectedScenario===sc\"\n [class.text-white]=\"selectedScenario===sc\">\n {{ sc }}\n </button>\n </div>\n <div class=\"p-4 bg-gray-50 rounded-lg h-[300px]\">\n <div LibsUiComponentsScrollOverlayDirective\n [options]=\"options\"\n (outScroll)=\"onScroll()\"\n (outScrollTop)=\"onScrollTop()\"\n (outScrollBottom)=\"onScrollBottom()\"\n class=\"w-full h-full\">\n <div class=\"p-2\"\n [innerText]=\"content\"\n [class.whitespace-pre-wrap]=\"selectedScenario!=='horizontal'\"\n [class.whitespace-nowrap]=\"selectedScenario==='horizontal'\"></div>\n </div>\n </div>\n <p class=\"mt-4 text-gray-700\">S\u1EF1 ki\u1EC7n: {{ lastEvent() }}</p>\n </section>\n\n <!-- C\u00E1ch s\u1EED d\u1EE5ng -->\n <section class=\"bg-white rounded-lg p-8 mb-8 shadow-sm\">\n <h2 class=\"text-2xl font-bold mb-5 pb-3 border-b border-gray-200\">C\u00E1ch s\u1EED d\u1EE5ng</h2>\n <pre class=\"bg-gray-100 p-4 rounded-lg overflow-auto text-sm\">\n <code ngNonBindable><div LibsUiComponentsScrollOverlayDirective [options]=\"{ scrollbarWidth:12, scrollThumbColor:'#3b82f6' }\" style=\"width:300px;height:200px;overflow:auto;\">\n N\u1ED9i dung d\u00E0i...\n</div></code>\n </pre>\n </section>\n\n <!-- API Reference -->\n <section class=\"bg-white rounded-lg p-8 mb-8 shadow-sm\">\n <h2 class=\"text-2xl font-bold mb-5 pb-3 border-b border-gray-200\">API Reference</h2>\n <h3 class=\"text-xl font-semibold mb-3\">Inputs</h3>\n <table class=\"min-w-full bg-white border border-gray-200 mb-6\">\n <thead>\n <tr>\n <th class=\"py-2 px-4 border-b bg-gray-100\">T\u00EAn</th>\n <th class=\"py-2 px-4 border-b bg-gray-100\">Ki\u1EC3u</th>\n <th class=\"py-2 px-4 border-b bg-gray-100\">M\u1EB7c \u0111\u1ECBnh</th>\n <th class=\"py-2 px-4 border-b bg-gray-100\">M\u00F4 t\u1EA3</th>\n </tr>\n </thead>\n <tbody>\n <tr *ngFor=\"let input of inputsDoc\">\n <td class=\"py-2 px-4 border-b\"><code>{{ input.name }}</code></td>\n <td class=\"py-2 px-4 border-b\"><code>{{ input.type }}</code></td>\n <td class=\"py-2 px-4 border-b\">{{ input.default }}</td>\n <td class=\"py-2 px-4 border-b\">{{ input.description }}</td>\n </tr>\n </tbody>\n </table>\n <h3 class=\"text-xl font-semibold mb-3\">Outputs</h3>\n <table class=\"min-w-full bg-white border border-gray-200 mb-6\">\n <thead>\n <tr>\n <th class=\"py-2 px-4 border-b bg-gray-100\">T\u00EAn</th>\n <th class=\"py-2 px-4 border-b bg-gray-100\">Ki\u1EC3u</th>\n <th class=\"py-2 px-4 border-b bg-gray-100\">M\u00F4 t\u1EA3</th>\n </tr>\n </thead>\n <tbody>\n <tr *ngFor=\"let output of outputsDoc\">\n <td class=\"py-2 px-4 border-b\"><code>{{ output.name }}</code></td>\n <td class=\"py-2 px-4 border-b\"><code>{{ output.type }}</code></td>\n <td class=\"py-2 px-4 border-b\">{{ output.description }}</td>\n </tr>\n </tbody>\n </table>\n <h3 class=\"text-xl font-semibold mb-3\">Options</h3>\n <table class=\"min-w-full bg-white border border-gray-200 mb-6\">\n <thead>\n <tr>\n <th class=\"py-2 px-4 border-b bg-gray-100\">Thu\u1ED9c t\u00EDnh</th>\n <th class=\"py-2 px-4 border-b bg-gray-100\">Ki\u1EC3u</th>\n <th class=\"py-2 px-4 border-b bg-gray-100\">M\u1EB7c \u0111\u1ECBnh</th>\n <th class=\"py-2 px-4 border-b bg-gray-100\">M\u00F4 t\u1EA3</th>\n </tr>\n </thead>\n <tbody>\n <tr *ngFor=\"let opt of optionsDoc\">\n <td class=\"py-2 px-4 border-b\"><code>{{ opt.name }}</code></td>\n <td class=\"py-2 px-4 border-b\"><code>{{ opt.type }}</code></td>\n <td class=\"py-2 px-4 border-b\">{{ opt.default }}</td>\n <td class=\"py-2 px-4 border-b\">{{ opt.description }}</td>\n </tr>\n </tbody>\n </table>\n <h3 class=\"text-xl font-semibold mb-3\">Interfaces</h3>\n <div class=\"space-y-6\">\n <div *ngFor=\"let intf of interfacesDoc\" class=\"bg-gray-50 p-6 rounded-lg\">\n <h4 class=\"font-semibold mb-2\">{{ intf.name }}</h4>\n <pre class=\"bg-gray-100 p-4 rounded-lg overflow-auto text-sm mb-3\"><code>{{ intf.type }}</code></pre>\n <p>{{ intf.description }}</p>\n </div>\n </div>\n </section>\n </main>\n</div>\n", styles: ["@charset \"UTF-8\";.demo-container{padding:24px;font-family:system-ui,-apple-system,sans-serif;max-width:1200px;margin:0 auto}.demo-intro{margin-bottom:32px}.demo-intro h3{color:#333;margin-bottom:16px}.demo-intro ul{list-style:none;padding:0}.demo-intro ul li{margin-bottom:8px;padding-left:20px;position:relative}.demo-intro ul li:before{content:\"\\2022\";position:absolute;left:0;color:#3b82f6}.demo-features{margin-bottom:32px}.demo-features h3{color:#333;margin-bottom:16px}.features-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(250px,1fr));gap:16px}.feature-item{background:#f8fafc;padding:16px;border-radius:8px;border:1px solid #e2e8f0}.feature-item h4{color:#1e40af;margin:0 0 8px}.feature-item p{margin:0;color:#64748b}.demo-api{margin-bottom:48px}.demo-api h3{color:#333;margin-bottom:24px}.api-section{margin-bottom:32px}.api-section h4{color:#1e40af;margin-bottom:16px}.api-table{overflow-x:auto}.api-table table{width:100%;border-collapse:collapse;background:#fff;border-radius:8px;border:1px solid #e2e8f0}.api-table table th,.api-table table td{padding:12px 16px;text-align:left;border-bottom:1px solid #e2e8f0}.api-table table th{background:#f8fafc;font-weight:600;color:#1e40af}.api-table table td{color:#64748b}.api-table table td:first-child{font-family:Fira Code,monospace;color:#334155}.api-table table td:nth-child(2){font-family:Fira Code,monospace;color:#3b82f6}.api-table table tr:last-child td{border-bottom:none}.demo-section{margin-bottom:48px}.demo-section h3{color:#333;margin-bottom:16px}.demo-description{margin-bottom:16px}.demo-description p{color:#64748b;margin-bottom:12px}.demo-description pre{background:#f8fafc;padding:16px;border-radius:8px;border:1px solid #e2e8f0;overflow-x:auto}.demo-description pre code{font-family:Fira Code,monospace;font-size:14px;color:#334155}.demo-box{display:flex;gap:16px;align-items:flex-start}.event-log{padding:16px;background:#f5f5f5;border-radius:4px;min-width:200px}.event-log p{margin:0;font-size:14px;color:#666}.demo-notes{margin-top:48px;padding:24px;background:#f8fafc;border-radius:8px;border:1px solid #e2e8f0}.demo-notes h3{color:#333;margin-bottom:16px}.demo-notes ul{list-style:none;padding:0;margin:0}.demo-notes ul li{color:#64748b;margin-bottom:12px;padding-left:24px;position:relative}.demo-notes ul li:before{content:\"\\2192\";position:absolute;left:0;color:#3b82f6}.demo-notes ul li:last-child{margin-bottom:0}.interface-description{margin-bottom:24px}.interface-description p{color:#64748b;margin-bottom:16px}.interface-description pre{background:#f8fafc;padding:16px;border-radius:8px;border:1px solid #e2e8f0;overflow-x:auto}.interface-description pre code{font-family:Fira Code,monospace;font-size:14px;color:#334155;line-height:1.6}.interface-usage{margin-bottom:24px}.interface-usage h5{color:#1e40af;margin-bottom:12px;font-size:16px}.interface-usage pre{background:#f8fafc;padding:16px;border-radius:8px;border:1px solid #e2e8f0;overflow-x:auto}.interface-usage pre code{font-family:Fira Code,monospace;font-size:14px;color:#334155;line-height:1.6}.interface-usage pre code .comment{color:#64748b}.interface-notes{background:#f8fafc;padding:16px;border-radius:8px;border:1px solid #e2e8f0}.interface-notes h5{color:#1e40af;margin-bottom:12px;font-size:16px}.interface-notes ul{list-style:none;padding:0;margin:0}.interface-notes ul li{color:#64748b;margin-bottom:8px;padding-left:20px;position:relative}.interface-notes ul li:before{content:\"\\2022\";position:absolute;left:0;color:#3b82f6}.interface-notes ul li:last-child{margin-bottom:0}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: LibsUiComponentsScrollOverlayDirective, selector: "[LibsUiComponentsScrollOverlayDirective]", inputs: ["debugMode", "ignoreInit", "classContainer", "options", "elementCheckScrollX", "elementCheckScrollY", "elementScroll"], outputs: ["outScroll", "outScrollX", "outScrollY", "outScrollTop", "outScrollBottom"] }] });
|
|
47
73
|
}
|
|
48
74
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: LibsUiComponentsScrollOverlayDemoComponent, decorators: [{
|
|
49
75
|
type: Component,
|
|
50
|
-
args: [{ selector: 'lib-scroll-overlay-demo', standalone: true, imports: [CommonModule, LibsUiComponentsScrollOverlayDirective], template: "<div class=\"demo-container\">\n <h2>Scroll Overlay Demo</h2>\n\n <div class=\"demo-intro\">\n <h3>Gi\u1EDBi thi\u1EC7u</h3>\n <p>Demo n\u00E0y minh h\u1ECDa c\u00E1c t\u00EDnh n\u0103ng v\u00E0 c\u00E1ch s\u1EED d\u1EE5ng c\u1EE7a directive `scroll-overlay`. Demo bao g\u1ED3m 5 v\u00ED d\u1EE5 ch\u00EDnh:</p>\n <ul>\n <li><strong>Basic Usage</strong>: S\u1EED d\u1EE5ng c\u01A1 b\u1EA3n v\u1EDBi c\u1EA5u h\u00ECnh m\u1EB7c \u0111\u1ECBnh</li>\n <li><strong>Custom Styling</strong>: Tu\u1EF3 ch\u1EC9nh m\u00E0u s\u1EAFc, k\u00EDch th\u01B0\u1EDBc v\u00E0 padding c\u1EE7a thanh cu\u1ED9n</li>\n <li><strong>Auto Hide</strong>: \u1EA8n/hi\u1EC7n thanh cu\u1ED9n khi hover</li>\n <li><strong>Horizontal Scroll</strong>: Cu\u1ED9n ngang v\u1EDBi n\u1ED9i dung d\u00E0i</li>\n <li><strong>Event Handling</strong>: X\u1EED l\u00FD c\u00E1c s\u1EF1 ki\u1EC7n scroll</li>\n </ul>\n </div>\n\n <div class=\"demo-features\">\n <h3>T\u00EDnh n\u0103ng Demo</h3>\n <div class=\"features-grid\">\n <div class=\"feature-item\">\n <h4>Tu\u1EF3 bi\u1EBFn giao di\u1EC7n</h4>\n <p>Thay \u0111\u1ED5i m\u00E0u s\u1EAFc, k\u00EDch th\u01B0\u1EDBc, padding c\u1EE7a thanh cu\u1ED9n</p>\n </div>\n <div class=\"feature-item\">\n <h4>Hi\u1EC7u \u1EE9ng t\u01B0\u01A1ng t\u00E1c</h4>\n <p>Hover effects, auto-hide khi kh\u00F4ng s\u1EED d\u1EE5ng</p>\n </div>\n <div class=\"feature-item\">\n <h4>\u0110a h\u01B0\u1EDBng cu\u1ED9n</h4>\n <p>H\u1ED7 tr\u1EE3 c\u1EA3 cu\u1ED9n d\u1ECDc v\u00E0 ngang</p>\n </div>\n <div class=\"feature-item\">\n <h4>Event handling</h4>\n <p>Theo d\u00F5i c\u00E1c s\u1EF1 ki\u1EC7n scroll (top, bottom, scroll)</p>\n </div>\n <div class=\"feature-item\">\n <h4>Responsive</h4>\n <p>Ho\u1EA1t \u0111\u1ED9ng t\u1ED1t tr\u00EAn m\u1ECDi k\u00EDch th\u01B0\u1EDBc m\u00E0n h\u00ECnh</p>\n </div>\n <div class=\"feature-item\">\n <h4>T\u00EDch h\u1EE3p d\u1EC5 d\u00E0ng</h4>\n <p>C\u00F3 th\u1EC3 th\u00EAm v\u00E0o b\u1EA5t k\u1EF3 container n\u00E0o</p>\n </div>\n </div>\n </div>\n\n <div class=\"demo-api\">\n <h3>API Reference</h3>\n\n <div class=\"api-section\">\n <h4>Inputs</h4>\n <div class=\"api-table\">\n <table>\n <thead>\n <tr>\n <th>Input</th>\n <th>Type</th>\n <th>M\u00F4 t\u1EA3</th>\n </tr>\n </thead>\n <tbody>\n <tr>\n <td>options</td>\n <td>IScrollOverlayOptions</td>\n <td>Tu\u1EF3 ch\u1ECDn c\u1EA5u h\u00ECnh thanh cu\u1ED9n</td>\n </tr>\n <tr>\n <td>debugMode</td>\n <td>boolean</td>\n <td>B\u1EADt ch\u1EBF \u0111\u1ED9 debug</td>\n </tr>\n <tr>\n <td>ignoreInit</td>\n <td>boolean</td>\n <td>B\u1ECF qua kh\u1EDFi t\u1EA1o directive</td>\n </tr>\n <tr>\n <td>classContainer</td>\n <td>string</td>\n <td>Th\u00EAm class cho container b\u1ECDc ngo\u00E0i</td>\n </tr>\n <tr>\n <td>notShowScrollBarX</td>\n <td>boolean</td>\n <td>Kh\u00F4ng hi\u1EC3n th\u1ECB thanh cu\u1ED9n ngang</td>\n </tr>\n <tr>\n <td>notShowScrollBarY</td>\n <td>boolean</td>\n <td>Kh\u00F4ng hi\u1EC3n th\u1ECB thanh cu\u1ED9n d\u1ECDc</td>\n </tr>\n <tr>\n <td>elementCheckScrollX</td>\n <td>HTMLElement</td>\n <td>Ph\u1EA7n t\u1EED d\u00F9ng \u0111\u1EC3 ki\u1EC3m tra scroll X</td>\n </tr>\n <tr>\n <td>elementCheckScrollY</td>\n <td>HTMLElement</td>\n <td>Ph\u1EA7n t\u1EED d\u00F9ng \u0111\u1EC3 ki\u1EC3m tra scroll Y</td>\n </tr>\n <tr>\n <td>elementScroll</td>\n <td>HTMLElement</td>\n <td>Ph\u1EA7n t\u1EED th\u1EF1c hi\u1EC7n scroll</td>\n </tr>\n </tbody>\n </table>\n </div>\n </div>\n\n <div class=\"api-section\">\n <h4>Outputs</h4>\n <div class=\"api-table\">\n <table>\n <thead>\n <tr>\n <th>Output</th>\n <th>Type</th>\n <th>M\u00F4 t\u1EA3</th>\n </tr>\n </thead>\n <tbody>\n <tr>\n <td>outScroll</td>\n <td>Event</td>\n <td>B\u1EAFn ra khi scroll b\u1EA5t k\u1EF3</td>\n </tr>\n <tr>\n <td>outScrollX</td>\n <td>Event</td>\n <td>B\u1EAFn ra khi scroll theo chi\u1EC1u ngang</td>\n </tr>\n <tr>\n <td>outScrollY</td>\n <td>Event</td>\n <td>B\u1EAFn ra khi scroll theo chi\u1EC1u d\u1ECDc</td>\n </tr>\n <tr>\n <td>outScrollTop</td>\n <td>Event</td>\n <td>B\u1EAFn ra khi scroll t\u1EDBi \u0111\u1EA7u (top)</td>\n </tr>\n <tr>\n <td>outScrollBottom</td>\n <td>Event</td>\n <td>B\u1EAFn ra khi scroll t\u1EDBi cu\u1ED1i (bottom)</td>\n </tr>\n </tbody>\n </table>\n </div>\n </div>\n\n <div class=\"api-section\">\n <h4>Interface</h4>\n <div class=\"interface-description\">\n <p>Interface <code>IScrollOverlayOptions</code> \u0111\u1ECBnh ngh\u0129a c\u00E1c tu\u1EF3 ch\u1ECDn c\u1EA5u h\u00ECnh cho scroll-overlay directive:\n </p>\n <pre><code>export interface IScrollOverlayOptions {{ '{' }}\n scrollbarWidth?: number; // Chi\u1EC1u r\u1ED9ng thanh cu\u1ED9n (px)\n scrollbarColor?: string; // M\u00E0u n\u1EC1n track\n scrollbarHoverColor?: string; // M\u00E0u n\u1EC1n track khi hover\n scrollThumbColor?: string; // M\u00E0u thumb\n scrollThumbHoverColor?: string; // M\u00E0u thumb khi hover\n scrollbarPadding?: number; // Padding c\u1EE7a scrollbar\n scrollX?: 'hidden' | 'scroll'; // Ki\u1EC3u hi\u1EC3n th\u1ECB scroll X\n scrollXOpacity0?: boolean; // \u1EA8n track X khi kh\u00F4ng hover\n scrollY?: 'hidden' | 'scroll'; // Ki\u1EC3u hi\u1EC3n th\u1ECB scroll Y\n scrollYOpacity0?: boolean; // \u1EA8n track Y khi kh\u00F4ng hover\n{{ '}' }}</code></pre>\n </div>\n\n <div class=\"interface-usage\">\n <h5>V\u00ED d\u1EE5 s\u1EED d\u1EE5ng:</h5>\n <pre><code>// C\u1EA5u h\u00ECnh c\u01A1 b\u1EA3n\nconst basicOptions: IScrollOverlayOptions = {{ '{' }}\n scrollbarWidth: 8,\n scrollbarColor: '#f3f4f6',\n scrollThumbColor: '#3b82f6'\n{{ '}' }};\n\n// C\u1EA5u h\u00ECnh n\u00E2ng cao v\u1EDBi hover effects\nconst advancedOptions: IScrollOverlayOptions = {{ '{' }}\n scrollbarWidth: 12,\n scrollbarColor: '#f3f4f6',\n scrollbarHoverColor: '#e5e7eb',\n scrollThumbColor: '#3b82f6',\n scrollThumbHoverColor: '#2563eb',\n scrollbarPadding: 4,\n scrollYOpacity0: true\n{{ '}' }};\n\n// C\u1EA5u h\u00ECnh cho scroll ngang\nconst horizontalOptions: IScrollOverlayOptions = {{ '{' }}\n scrollX: 'scroll',\n scrollY: 'hidden',\n scrollbarWidth: 8,\n scrollbarColor: '#f3f4f6',\n scrollThumbColor: '#3b82f6'\n{{ '}' }};</code></pre>\n </div>\n\n <div class=\"interface-notes\">\n <h5>Ghi ch\u00FA:</h5>\n <ul>\n <li>T\u1EA5t c\u1EA3 c\u00E1c thu\u1ED9c t\u00EDnh \u0111\u1EC1u l\u00E0 optional (c\u00F3 d\u1EA5u ?)</li>\n <li>N\u1EBFu kh\u00F4ng cung c\u1EA5p gi\u00E1 tr\u1ECB, directive s\u1EBD s\u1EED d\u1EE5ng gi\u00E1 tr\u1ECB m\u1EB7c \u0111\u1ECBnh</li>\n <li>C\u00F3 th\u1EC3 k\u1EBFt h\u1EE3p nhi\u1EC1u options \u0111\u1EC3 t\u1EA1o ra giao di\u1EC7n thanh cu\u1ED9n ph\u00F9 h\u1EE3p</li>\n <li>M\u00E0u s\u1EAFc c\u00F3 th\u1EC3 s\u1EED d\u1EE5ng b\u1EA5t k\u1EF3 \u0111\u1ECBnh d\u1EA1ng CSS color n\u00E0o (hex, rgb, rgba, etc.)</li>\n <li>scrollX v\u00E0 scrollY ch\u1EC9 nh\u1EADn m\u1ED9t trong hai gi\u00E1 tr\u1ECB: 'hidden' ho\u1EB7c 'scroll'</li>\n </ul>\n </div>\n </div>\n\n <div class=\"api-section\">\n <h4>Options (IScrollOverlayOptions)</h4>\n <div class=\"api-table\">\n <table>\n <thead>\n <tr>\n <th>Thu\u1ED9c t\u00EDnh</th>\n <th>Type</th>\n <th>M\u00F4 t\u1EA3</th>\n </tr>\n </thead>\n <tbody>\n <tr>\n <td>scrollbarWidth</td>\n <td>number</td>\n <td>Chi\u1EC1u r\u1ED9ng thanh cu\u1ED9n (px)</td>\n </tr>\n <tr>\n <td>scrollbarColor</td>\n <td>string</td>\n <td>M\u00E0u n\u1EC1n track</td>\n </tr>\n <tr>\n <td>scrollbarHoverColor</td>\n <td>string</td>\n <td>M\u00E0u n\u1EC1n track khi hover</td>\n </tr>\n <tr>\n <td>scrollThumbColor</td>\n <td>string</td>\n <td>M\u00E0u thumb</td>\n </tr>\n <tr>\n <td>scrollThumbHoverColor</td>\n <td>string</td>\n <td>M\u00E0u thumb khi hover</td>\n </tr>\n <tr>\n <td>scrollbarPadding</td>\n <td>number</td>\n <td>Padding c\u1EE7a scrollbar</td>\n </tr>\n <tr>\n <td>scrollX</td>\n <td>'hidden'|'scroll'</td>\n <td>Ki\u1EC3u hi\u1EC3n th\u1ECB scroll X</td>\n </tr>\n <tr>\n <td>scrollXOpacity0</td>\n <td>boolean</td>\n <td>\u1EA8n track X khi kh\u00F4ng hover</td>\n </tr>\n <tr>\n <td>scrollY</td>\n <td>'hidden'|'scroll'</td>\n <td>Ki\u1EC3u hi\u1EC3n th\u1ECB scroll Y</td>\n </tr>\n <tr>\n <td>scrollYOpacity0</td>\n <td>boolean</td>\n <td>\u1EA8n track Y khi kh\u00F4ng hover</td>\n </tr>\n </tbody>\n </table>\n </div>\n </div>\n </div>\n\n <!-- Basic Demo -->\n <div class=\"demo-section\">\n <h3>1. Basic Usage</h3>\n <div class=\"demo-description\">\n <p>S\u1EED d\u1EE5ng c\u01A1 b\u1EA3n v\u1EDBi c\u1EA5u h\u00ECnh m\u1EB7c \u0111\u1ECBnh c\u1EE7a scroll-overlay directive.</p>\n <pre><code><div LibsUiComponentsScrollOverlayDirective\n style=\"width: 300px; height: 200px;\">\n N\u1ED9i dung d\u00E0i...\n</div></code></pre>\n </div>\n <div class=\"demo-box\">\n <div LibsUiComponentsScrollOverlayDirective\n style=\"width: 300px; height: 200px; border: 1px solid #ddd;\">\n <div style=\"padding: 16px;\">\n {{ longContent() }}\n </div>\n </div>\n </div>\n </div>\n\n <!-- Custom Styling Demo -->\n <div class=\"demo-section\">\n <h3>2. Custom Styling</h3>\n <div class=\"demo-description\">\n <p>Tu\u1EF3 ch\u1EC9nh m\u00E0u s\u1EAFc, k\u00EDch th\u01B0\u1EDBc v\u00E0 padding c\u1EE7a thanh cu\u1ED9n.</p>\n <pre><code><div LibsUiComponentsScrollOverlayDirective\n [options]=\"{{ '{' }}\"\n scrollbarWidth: 12,\n scrollbarColor: '#f3f4f6',\n scrollThumbColor: '#3b82f6',\n scrollbarPadding: 4\n {{ '}' }}\">\n N\u1ED9i dung d\u00E0i...\n</div></code></pre>\n </div>\n <div class=\"demo-box\">\n <div LibsUiComponentsScrollOverlayDirective\n [options]=\"customStyleOptions()\"\n style=\"width: 300px; height: 200px; border: 1px solid #ddd;\">\n <div style=\"padding: 16px;\">\n {{ longContent() }}\n </div>\n </div>\n </div>\n </div>\n\n <!-- Auto Hide Demo -->\n <div class=\"demo-section\">\n <h3>3. Auto Hide on Hover</h3>\n <div class=\"demo-description\">\n <p>\u1EA8n/hi\u1EC7n thanh cu\u1ED9n khi hover v\u00E0o container.</p>\n <pre><code><div LibsUiComponentsScrollOverlayDirective\n [options]=\"{{ '{' }}\"\n scrollYOpacity0: true,\n scrollbarColor: 'transparent',\n scrollThumbColor: '#9ca3af'\n {{ '}' }}\">\n N\u1ED9i dung d\u00E0i...\n</div></code></pre>\n </div>\n <div class=\"demo-box\">\n <div LibsUiComponentsScrollOverlayDirective\n [options]=\"autoHideOptions()\"\n style=\"width: 300px; height: 200px; border: 1px solid #ddd;\">\n <div style=\"padding: 16px;\">\n {{ longContent() }}\n </div>\n </div>\n </div>\n </div>\n\n <!-- Horizontal Scroll Demo -->\n <div class=\"demo-section\">\n <h3>4. Horizontal Scroll</h3>\n <div class=\"demo-description\">\n <p>Cu\u1ED9n ngang v\u1EDBi n\u1ED9i dung d\u00E0i.</p>\n <pre><code><div LibsUiComponentsScrollOverlayDirective\n [options]=\"{{ '{' }}\"\n scrollX: 'scroll',\n scrollY: 'hidden'\n {{ '}' }}\">\n <div style=\"white-space: nowrap;\">\n N\u1ED9i dung ngang d\u00E0i...\n </div>\n</div></code></pre>\n </div>\n <div class=\"demo-box\">\n <div LibsUiComponentsScrollOverlayDirective\n [options]=\"horizontalOptions()\"\n style=\"width: 300px; height: 100px; border: 1px solid #ddd;\">\n <div style=\"padding: 16px; white-space: nowrap;\">\n {{ longHorizontalContent() }}\n </div>\n </div>\n </div>\n </div>\n\n <!-- Event Handling Demo -->\n <div class=\"demo-section\">\n <h3>5. Event Handling</h3>\n <div class=\"demo-description\">\n <p>X\u1EED l\u00FD c\u00E1c s\u1EF1 ki\u1EC7n scroll.</p>\n <pre><code><div LibsUiComponentsScrollOverlayDirective\n (outScroll)=\"onScroll($event)\"\n (outScrollTop)=\"onScrollTop($event)\"\n (outScrollBottom)=\"onScrollBottom($event)\">\n N\u1ED9i dung d\u00E0i...\n</div></code></pre>\n </div>\n <div class=\"demo-box\">\n <div LibsUiComponentsScrollOverlayDirective\n (outScroll)=\"onScroll($event)\"\n (outScrollTop)=\"onScrollTop($event)\"\n (outScrollBottom)=\"onScrollBottom($event)\"\n style=\"width: 300px; height: 200px; border: 1px solid #ddd;\">\n <div style=\"padding: 16px;\">\n {{ longContent() }}\n </div>\n </div>\n <div class=\"event-log\">\n <p>Last Event: {{ lastEvent() }}</p>\n </div>\n </div>\n </div>\n</div>\n", styles: ["@charset \"UTF-8\";.demo-container{padding:24px;font-family:system-ui,-apple-system,sans-serif;max-width:1200px;margin:0 auto}.demo-intro{margin-bottom:32px}.demo-intro h3{color:#333;margin-bottom:16px}.demo-intro ul{list-style:none;padding:0}.demo-intro ul li{margin-bottom:8px;padding-left:20px;position:relative}.demo-intro ul li:before{content:\"\\2022\";position:absolute;left:0;color:#3b82f6}.demo-features{margin-bottom:32px}.demo-features h3{color:#333;margin-bottom:16px}.features-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(250px,1fr));gap:16px}.feature-item{background:#f8fafc;padding:16px;border-radius:8px;border:1px solid #e2e8f0}.feature-item h4{color:#1e40af;margin:0 0 8px}.feature-item p{margin:0;color:#64748b}.demo-api{margin-bottom:48px}.demo-api h3{color:#333;margin-bottom:24px}.api-section{margin-bottom:32px}.api-section h4{color:#1e40af;margin-bottom:16px}.api-table{overflow-x:auto}.api-table table{width:100%;border-collapse:collapse;background:#fff;border-radius:8px;border:1px solid #e2e8f0}.api-table table th,.api-table table td{padding:12px 16px;text-align:left;border-bottom:1px solid #e2e8f0}.api-table table th{background:#f8fafc;font-weight:600;color:#1e40af}.api-table table td{color:#64748b}.api-table table td:first-child{font-family:Fira Code,monospace;color:#334155}.api-table table td:nth-child(2){font-family:Fira Code,monospace;color:#3b82f6}.api-table table tr:last-child td{border-bottom:none}.demo-section{margin-bottom:48px}.demo-section h3{color:#333;margin-bottom:16px}.demo-description{margin-bottom:16px}.demo-description p{color:#64748b;margin-bottom:12px}.demo-description pre{background:#f8fafc;padding:16px;border-radius:8px;border:1px solid #e2e8f0;overflow-x:auto}.demo-description pre code{font-family:Fira Code,monospace;font-size:14px;color:#334155}.demo-box{display:flex;gap:16px;align-items:flex-start}.event-log{padding:16px;background:#f5f5f5;border-radius:4px;min-width:200px}.event-log p{margin:0;font-size:14px;color:#666}.demo-notes{margin-top:48px;padding:24px;background:#f8fafc;border-radius:8px;border:1px solid #e2e8f0}.demo-notes h3{color:#333;margin-bottom:16px}.demo-notes ul{list-style:none;padding:0;margin:0}.demo-notes ul li{color:#64748b;margin-bottom:12px;padding-left:24px;position:relative}.demo-notes ul li:before{content:\"\\2192\";position:absolute;left:0;color:#3b82f6}.demo-notes ul li:last-child{margin-bottom:0}.interface-description{margin-bottom:24px}.interface-description p{color:#64748b;margin-bottom:16px}.interface-description pre{background:#f8fafc;padding:16px;border-radius:8px;border:1px solid #e2e8f0;overflow-x:auto}.interface-description pre code{font-family:Fira Code,monospace;font-size:14px;color:#334155;line-height:1.6}.interface-usage{margin-bottom:24px}.interface-usage h5{color:#1e40af;margin-bottom:12px;font-size:16px}.interface-usage pre{background:#f8fafc;padding:16px;border-radius:8px;border:1px solid #e2e8f0;overflow-x:auto}.interface-usage pre code{font-family:Fira Code,monospace;font-size:14px;color:#334155;line-height:1.6}.interface-usage pre code .comment{color:#64748b}.interface-notes{background:#f8fafc;padding:16px;border-radius:8px;border:1px solid #e2e8f0}.interface-notes h5{color:#1e40af;margin-bottom:12px;font-size:16px}.interface-notes ul{list-style:none;padding:0;margin:0}.interface-notes ul li{color:#64748b;margin-bottom:8px;padding-left:20px;position:relative}.interface-notes ul li:before{content:\"\\2022\";position:absolute;left:0;color:#3b82f6}.interface-notes ul li:last-child{margin-bottom:0}\n"] }]
|
|
76
|
+
args: [{ selector: 'lib-scroll-overlay-demo', standalone: true, imports: [CommonModule, LibsUiComponentsScrollOverlayDirective], template: "<div class=\"max-w-6xl mx-auto p-5 font-sans text-gray-800\">\n <header class=\"text-center py-10 bg-white rounded-lg mb-8 shadow-sm\">\n <h1 class=\"text-4xl font-bold mb-2\">Demo Scroll Overlay</h1>\n <p class=\"text-xl text-gray-500\">@libs-ui/components-scroll-overlay</p>\n </header>\n\n <main>\n <!-- Gi\u1EDBi thi\u1EC7u -->\n <section class=\"bg-white rounded-lg p-8 mb-8 shadow-sm\">\n <h2 class=\"text-2xl font-bold mb-5 pb-3 border-b border-gray-200\">Gi\u1EDBi thi\u1EC7u</h2>\n <p><code>scroll-overlay</code> l\u00E0 m\u1ED9t directive gi\u00FAp tu\u1EF3 bi\u1EBFn scrollbar tr\u00EAn b\u1EA5t k\u1EF3 ph\u1EA7n t\u1EED n\u00E0o trong Angular, h\u1ED7 tr\u1EE3 tu\u1EF3 ch\u1EC9nh m\u00E0u, k\u00EDch th\u01B0\u1EDBc, \u1EA9n/hi\u1EC7n v\u00E0 s\u1EF1 ki\u1EC7n scroll.</p>\n </section>\n\n <!-- C\u00E0i \u0111\u1EB7t -->\n <section class=\"bg-white rounded-lg p-8 mb-8 shadow-sm\">\n <h2 class=\"text-2xl font-bold mb-5 pb-3 border-b border-gray-200\">C\u00E0i \u0111\u1EB7t</h2>\n <div class=\"flex items-center bg-gray-100 p-4 rounded-lg mb-4\">\n <pre class=\"flex-1 text-sm overflow-x-auto\"><code>{{ installCommandNpm }}</code></pre>\n <button class=\"ml-4 px-3 py-1 bg-blue-500 text-white rounded hover:bg-blue-600\" (click)=\"copyToClipboard(installCommandNpm)\">Sao ch\u00E9p</button>\n </div>\n <div class=\"flex items-center bg-gray-100 p-4 rounded-lg\">\n <pre class=\"flex-1 text-sm overflow-x-auto\"><code>{{ installCommandYarn }}</code></pre>\n <button class=\"ml-4 px-3 py-1 bg-blue-500 text-white rounded hover:bg-blue-600\" (click)=\"copyToClipboard(installCommandYarn)\">Sao ch\u00E9p</button>\n </div>\n </section>\n\n <!-- Demo Tr\u1EF1c ti\u1EBFp -->\n <section class=\"bg-white rounded-lg p-8 mb-8 shadow-sm\">\n <h2 class=\"text-2xl font-bold mb-5 pb-3 border-b border-gray-200\">Demo Tr\u1EF1c ti\u1EBFp</h2>\n <div class=\"grid grid-cols-4 gap-4 mb-6\">\n <button *ngFor=\"let sc of scenarioOptions\"\n (click)=\"selectedScenario = sc\"\n class=\"px-3 py-1 border rounded\"\n [class.bg-blue-500]=\"selectedScenario===sc\"\n [class.text-white]=\"selectedScenario===sc\">\n {{ sc }}\n </button>\n </div>\n <div class=\"p-4 bg-gray-50 rounded-lg h-[300px]\">\n <div LibsUiComponentsScrollOverlayDirective\n [options]=\"options\"\n (outScroll)=\"onScroll()\"\n (outScrollTop)=\"onScrollTop()\"\n (outScrollBottom)=\"onScrollBottom()\"\n class=\"w-full h-full\">\n <div class=\"p-2\"\n [innerText]=\"content\"\n [class.whitespace-pre-wrap]=\"selectedScenario!=='horizontal'\"\n [class.whitespace-nowrap]=\"selectedScenario==='horizontal'\"></div>\n </div>\n </div>\n <p class=\"mt-4 text-gray-700\">S\u1EF1 ki\u1EC7n: {{ lastEvent() }}</p>\n </section>\n\n <!-- C\u00E1ch s\u1EED d\u1EE5ng -->\n <section class=\"bg-white rounded-lg p-8 mb-8 shadow-sm\">\n <h2 class=\"text-2xl font-bold mb-5 pb-3 border-b border-gray-200\">C\u00E1ch s\u1EED d\u1EE5ng</h2>\n <pre class=\"bg-gray-100 p-4 rounded-lg overflow-auto text-sm\">\n <code ngNonBindable><div LibsUiComponentsScrollOverlayDirective [options]=\"{ scrollbarWidth:12, scrollThumbColor:'#3b82f6' }\" style=\"width:300px;height:200px;overflow:auto;\">\n N\u1ED9i dung d\u00E0i...\n</div></code>\n </pre>\n </section>\n\n <!-- API Reference -->\n <section class=\"bg-white rounded-lg p-8 mb-8 shadow-sm\">\n <h2 class=\"text-2xl font-bold mb-5 pb-3 border-b border-gray-200\">API Reference</h2>\n <h3 class=\"text-xl font-semibold mb-3\">Inputs</h3>\n <table class=\"min-w-full bg-white border border-gray-200 mb-6\">\n <thead>\n <tr>\n <th class=\"py-2 px-4 border-b bg-gray-100\">T\u00EAn</th>\n <th class=\"py-2 px-4 border-b bg-gray-100\">Ki\u1EC3u</th>\n <th class=\"py-2 px-4 border-b bg-gray-100\">M\u1EB7c \u0111\u1ECBnh</th>\n <th class=\"py-2 px-4 border-b bg-gray-100\">M\u00F4 t\u1EA3</th>\n </tr>\n </thead>\n <tbody>\n <tr *ngFor=\"let input of inputsDoc\">\n <td class=\"py-2 px-4 border-b\"><code>{{ input.name }}</code></td>\n <td class=\"py-2 px-4 border-b\"><code>{{ input.type }}</code></td>\n <td class=\"py-2 px-4 border-b\">{{ input.default }}</td>\n <td class=\"py-2 px-4 border-b\">{{ input.description }}</td>\n </tr>\n </tbody>\n </table>\n <h3 class=\"text-xl font-semibold mb-3\">Outputs</h3>\n <table class=\"min-w-full bg-white border border-gray-200 mb-6\">\n <thead>\n <tr>\n <th class=\"py-2 px-4 border-b bg-gray-100\">T\u00EAn</th>\n <th class=\"py-2 px-4 border-b bg-gray-100\">Ki\u1EC3u</th>\n <th class=\"py-2 px-4 border-b bg-gray-100\">M\u00F4 t\u1EA3</th>\n </tr>\n </thead>\n <tbody>\n <tr *ngFor=\"let output of outputsDoc\">\n <td class=\"py-2 px-4 border-b\"><code>{{ output.name }}</code></td>\n <td class=\"py-2 px-4 border-b\"><code>{{ output.type }}</code></td>\n <td class=\"py-2 px-4 border-b\">{{ output.description }}</td>\n </tr>\n </tbody>\n </table>\n <h3 class=\"text-xl font-semibold mb-3\">Options</h3>\n <table class=\"min-w-full bg-white border border-gray-200 mb-6\">\n <thead>\n <tr>\n <th class=\"py-2 px-4 border-b bg-gray-100\">Thu\u1ED9c t\u00EDnh</th>\n <th class=\"py-2 px-4 border-b bg-gray-100\">Ki\u1EC3u</th>\n <th class=\"py-2 px-4 border-b bg-gray-100\">M\u1EB7c \u0111\u1ECBnh</th>\n <th class=\"py-2 px-4 border-b bg-gray-100\">M\u00F4 t\u1EA3</th>\n </tr>\n </thead>\n <tbody>\n <tr *ngFor=\"let opt of optionsDoc\">\n <td class=\"py-2 px-4 border-b\"><code>{{ opt.name }}</code></td>\n <td class=\"py-2 px-4 border-b\"><code>{{ opt.type }}</code></td>\n <td class=\"py-2 px-4 border-b\">{{ opt.default }}</td>\n <td class=\"py-2 px-4 border-b\">{{ opt.description }}</td>\n </tr>\n </tbody>\n </table>\n <h3 class=\"text-xl font-semibold mb-3\">Interfaces</h3>\n <div class=\"space-y-6\">\n <div *ngFor=\"let intf of interfacesDoc\" class=\"bg-gray-50 p-6 rounded-lg\">\n <h4 class=\"font-semibold mb-2\">{{ intf.name }}</h4>\n <pre class=\"bg-gray-100 p-4 rounded-lg overflow-auto text-sm mb-3\"><code>{{ intf.type }}</code></pre>\n <p>{{ intf.description }}</p>\n </div>\n </div>\n </section>\n </main>\n</div>\n", styles: ["@charset \"UTF-8\";.demo-container{padding:24px;font-family:system-ui,-apple-system,sans-serif;max-width:1200px;margin:0 auto}.demo-intro{margin-bottom:32px}.demo-intro h3{color:#333;margin-bottom:16px}.demo-intro ul{list-style:none;padding:0}.demo-intro ul li{margin-bottom:8px;padding-left:20px;position:relative}.demo-intro ul li:before{content:\"\\2022\";position:absolute;left:0;color:#3b82f6}.demo-features{margin-bottom:32px}.demo-features h3{color:#333;margin-bottom:16px}.features-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(250px,1fr));gap:16px}.feature-item{background:#f8fafc;padding:16px;border-radius:8px;border:1px solid #e2e8f0}.feature-item h4{color:#1e40af;margin:0 0 8px}.feature-item p{margin:0;color:#64748b}.demo-api{margin-bottom:48px}.demo-api h3{color:#333;margin-bottom:24px}.api-section{margin-bottom:32px}.api-section h4{color:#1e40af;margin-bottom:16px}.api-table{overflow-x:auto}.api-table table{width:100%;border-collapse:collapse;background:#fff;border-radius:8px;border:1px solid #e2e8f0}.api-table table th,.api-table table td{padding:12px 16px;text-align:left;border-bottom:1px solid #e2e8f0}.api-table table th{background:#f8fafc;font-weight:600;color:#1e40af}.api-table table td{color:#64748b}.api-table table td:first-child{font-family:Fira Code,monospace;color:#334155}.api-table table td:nth-child(2){font-family:Fira Code,monospace;color:#3b82f6}.api-table table tr:last-child td{border-bottom:none}.demo-section{margin-bottom:48px}.demo-section h3{color:#333;margin-bottom:16px}.demo-description{margin-bottom:16px}.demo-description p{color:#64748b;margin-bottom:12px}.demo-description pre{background:#f8fafc;padding:16px;border-radius:8px;border:1px solid #e2e8f0;overflow-x:auto}.demo-description pre code{font-family:Fira Code,monospace;font-size:14px;color:#334155}.demo-box{display:flex;gap:16px;align-items:flex-start}.event-log{padding:16px;background:#f5f5f5;border-radius:4px;min-width:200px}.event-log p{margin:0;font-size:14px;color:#666}.demo-notes{margin-top:48px;padding:24px;background:#f8fafc;border-radius:8px;border:1px solid #e2e8f0}.demo-notes h3{color:#333;margin-bottom:16px}.demo-notes ul{list-style:none;padding:0;margin:0}.demo-notes ul li{color:#64748b;margin-bottom:12px;padding-left:24px;position:relative}.demo-notes ul li:before{content:\"\\2192\";position:absolute;left:0;color:#3b82f6}.demo-notes ul li:last-child{margin-bottom:0}.interface-description{margin-bottom:24px}.interface-description p{color:#64748b;margin-bottom:16px}.interface-description pre{background:#f8fafc;padding:16px;border-radius:8px;border:1px solid #e2e8f0;overflow-x:auto}.interface-description pre code{font-family:Fira Code,monospace;font-size:14px;color:#334155;line-height:1.6}.interface-usage{margin-bottom:24px}.interface-usage h5{color:#1e40af;margin-bottom:12px;font-size:16px}.interface-usage pre{background:#f8fafc;padding:16px;border-radius:8px;border:1px solid #e2e8f0;overflow-x:auto}.interface-usage pre code{font-family:Fira Code,monospace;font-size:14px;color:#334155;line-height:1.6}.interface-usage pre code .comment{color:#64748b}.interface-notes{background:#f8fafc;padding:16px;border-radius:8px;border:1px solid #e2e8f0}.interface-notes h5{color:#1e40af;margin-bottom:12px;font-size:16px}.interface-notes ul{list-style:none;padding:0;margin:0}.interface-notes ul li{color:#64748b;margin-bottom:8px;padding-left:20px;position:relative}.interface-notes ul li:before{content:\"\\2022\";position:absolute;left:0;color:#3b82f6}.interface-notes ul li:last-child{margin-bottom:0}\n"] }]
|
|
51
77
|
}] });
|
|
52
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2Nyb2xsLW92ZXJsYXkuZGVtby5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL2xpYnMtdWkvY29tcG9uZW50cy9zY3JvbGwtb3ZlcmxheS9zcmMvZGVtby9zY3JvbGwtb3ZlcmxheS5kZW1vLnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vbGlicy11aS9jb21wb25lbnRzL3Njcm9sbC1vdmVybGF5L3NyYy9kZW1vL3Njcm9sbC1vdmVybGF5LmRlbW8uaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNsRCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDL0MsT0FBTyxFQUFFLHNDQUFzQyxFQUFFLE1BQU0sNkJBQTZCLENBQUM7O0FBVXJGLE1BQU0sT0FBTywwQ0FBMEM7SUFDckQsZUFBZTtJQUNmLFdBQVcsR0FBRyxNQUFNLENBQUM7O21YQUU0VixDQUFDLENBQUM7SUFFblgscUJBQXFCLEdBQUcsTUFBTSxDQUFDLDhQQUE4UCxDQUFDLENBQUM7SUFFL1IsZUFBZTtJQUNmLGtCQUFrQixHQUFHLE1BQU0sQ0FBd0I7UUFDakQsY0FBYyxFQUFFLEVBQUU7UUFDbEIsY0FBYyxFQUFFLFNBQVM7UUFDekIsbUJBQW1CLEVBQUUsU0FBUztRQUM5QixnQkFBZ0IsRUFBRSxTQUFTO1FBQzNCLHFCQUFxQixFQUFFLFNBQVM7UUFDaEMsZ0JBQWdCLEVBQUUsQ0FBQztLQUNwQixDQUFDLENBQUM7SUFFSCxlQUFlLEdBQUcsTUFBTSxDQUF3QjtRQUM5QyxlQUFlLEVBQUUsSUFBSTtRQUNyQixjQUFjLEVBQUUsQ0FBQztRQUNqQixjQUFjLEVBQUUsYUFBYTtRQUM3QixnQkFBZ0IsRUFBRSxTQUFTO1FBQzNCLHFCQUFxQixFQUFFLFNBQVM7S0FDakMsQ0FBQyxDQUFDO0lBRUgsaUJBQWlCLEdBQUcsTUFBTSxDQUF3QjtRQUNoRCxPQUFPLEVBQUUsUUFBUTtRQUNqQixPQUFPLEVBQUUsUUFBUTtRQUNqQixjQUFjLEVBQUUsQ0FBQztRQUNqQixjQUFjLEVBQUUsU0FBUztRQUN6QixnQkFBZ0IsRUFBRSxTQUFTO0tBQzVCLENBQUMsQ0FBQztJQUVILGlCQUFpQjtJQUNqQixTQUFTLEdBQUcsTUFBTSxDQUFTLGVBQWUsQ0FBQyxDQUFDO0lBRTVDLFFBQVEsQ0FBQyxLQUFZO1FBQ25CLElBQUksQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLG9CQUFvQixDQUFDLENBQUM7SUFDM0MsQ0FBQztJQUVELFdBQVcsQ0FBQyxLQUFZO1FBQ3RCLElBQUksQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLGFBQWEsQ0FBQyxDQUFDO0lBQ3BDLENBQUM7SUFFRCxjQUFjLENBQUMsS0FBWTtRQUN6QixJQUFJLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO0lBQ3ZDLENBQUM7d0dBL0NVLDBDQUEwQzs0RkFBMUMsMENBQTBDLG1GQ1p2RCw4M2NBc1pBLHFpSEQ5WVksWUFBWSwrQkFBRSxzQ0FBc0M7OzRGQUluRCwwQ0FBMEM7a0JBUHRELFNBQVM7K0JBQ0UseUJBQXlCLGNBQ3ZCLElBQUksV0FDUCxDQUFDLFlBQVksRUFBRSxzQ0FBc0MsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgc2lnbmFsIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgTGlic1VpQ29tcG9uZW50c1Njcm9sbE92ZXJsYXlEaXJlY3RpdmUgfSBmcm9tICcuLi9zY3JvbGwtb3ZlcmxheS5kaXJlY3RpdmUnO1xuaW1wb3J0IHsgSVNjcm9sbE92ZXJsYXlPcHRpb25zIH0gZnJvbSAnLi4vc2Nyb2xsLmludGVyZmFjZSc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2xpYi1zY3JvbGwtb3ZlcmxheS1kZW1vJyxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgaW1wb3J0czogW0NvbW1vbk1vZHVsZSwgTGlic1VpQ29tcG9uZW50c1Njcm9sbE92ZXJsYXlEaXJlY3RpdmVdLFxuICB0ZW1wbGF0ZVVybDogJy4vc2Nyb2xsLW92ZXJsYXkuZGVtby5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vc2Nyb2xsLW92ZXJsYXkuZGVtby5zY3NzJ11cbn0pXG5leHBvcnQgY2xhc3MgTGlic1VpQ29tcG9uZW50c1Njcm9sbE92ZXJsYXlEZW1vQ29tcG9uZW50IHtcbiAgLy8gRGVtbyBjb250ZW50XG4gIGxvbmdDb250ZW50ID0gc2lnbmFsKGBMb3JlbSBpcHN1bSBkb2xvciBzaXQgYW1ldCwgY29uc2VjdGV0dXIgYWRpcGlzY2luZyBlbGl0LiBTZWQgZG8gZWl1c21vZCB0ZW1wb3IgaW5jaWRpZHVudCB1dCBsYWJvcmUgZXQgZG9sb3JlIG1hZ25hIGFsaXF1YS4gVXQgZW5pbSBhZCBtaW5pbSB2ZW5pYW0sIHF1aXMgbm9zdHJ1ZCBleGVyY2l0YXRpb24gdWxsYW1jbyBsYWJvcmlzIG5pc2kgdXQgYWxpcXVpcCBleCBlYSBjb21tb2RvIGNvbnNlcXVhdC4gRHVpcyBhdXRlIGlydXJlIGRvbG9yIGluIHJlcHJlaGVuZGVyaXQgaW4gdm9sdXB0YXRlIHZlbGl0IGVzc2UgY2lsbHVtIGRvbG9yZSBldSBmdWdpYXQgbnVsbGEgcGFyaWF0dXIuIEV4Y2VwdGV1ciBzaW50IG9jY2FlY2F0IGN1cGlkYXRhdCBub24gcHJvaWRlbnQsIHN1bnQgaW4gY3VscGEgcXVpIG9mZmljaWEgZGVzZXJ1bnQgbW9sbGl0IGFuaW0gaWQgZXN0IGxhYm9ydW0uXG5cblNlZCB1dCBwZXJzcGljaWF0aXMgdW5kZSBvbW5pcyBpc3RlIG5hdHVzIGVycm9yIHNpdCB2b2x1cHRhdGVtIGFjY3VzYW50aXVtIGRvbG9yZW1xdWUgbGF1ZGFudGl1bSwgdG90YW0gcmVtIGFwZXJpYW0sIGVhcXVlIGlwc2EgcXVhZSBhYiBpbGxvIGludmVudG9yZSB2ZXJpdGF0aXMgZXQgcXVhc2kgYXJjaGl0ZWN0byBiZWF0YWUgdml0YWUgZGljdGEgc3VudCBleHBsaWNhYm8uIE5lbW8gZW5pbSBpcHNhbSB2b2x1cHRhdGVtIHF1aWEgdm9sdXB0YXMgc2l0IGFzcGVybmF0dXIgYXV0IG9kaXQgYXV0IGZ1Z2l0LCBzZWQgcXVpYSBjb25zZXF1dW50dXIgbWFnbmkgZG9sb3JlcyBlb3MgcXVpIHJhdGlvbmUgdm9sdXB0YXRlbSBzZXF1aSBuZXNjaXVudC5gKTtcblxuICBsb25nSG9yaXpvbnRhbENvbnRlbnQgPSBzaWduYWwoYFRoaXMgaXMgYSB2ZXJ5IGxvbmcgaG9yaXpvbnRhbCBjb250ZW50IHRoYXQgd2lsbCByZXF1aXJlIHNjcm9sbGluZyB0byBzZWUgYWxsIG9mIGl0LiBJdCBjb250YWlucyBtdWx0aXBsZSBzZW50ZW5jZXMgYW5kIHdvcmRzIHRoYXQgZXh0ZW5kIGJleW9uZCB0aGUgY29udGFpbmVyIHdpZHRoLiBUaGlzIGRlbW9uc3RyYXRlcyB0aGUgaG9yaXpvbnRhbCBzY3JvbGxpbmcgY2FwYWJpbGl0eSBvZiB0aGUgc2Nyb2xsLW92ZXJsYXkgZGlyZWN0aXZlLmApO1xuXG4gIC8vIERlbW8gb3B0aW9uc1xuICBjdXN0b21TdHlsZU9wdGlvbnMgPSBzaWduYWw8SVNjcm9sbE92ZXJsYXlPcHRpb25zPih7XG4gICAgc2Nyb2xsYmFyV2lkdGg6IDEyLFxuICAgIHNjcm9sbGJhckNvbG9yOiAnI2YzZjRmNicsXG4gICAgc2Nyb2xsYmFySG92ZXJDb2xvcjogJyNlNWU3ZWInLFxuICAgIHNjcm9sbFRodW1iQ29sb3I6ICcjM2I4MmY2JyxcbiAgICBzY3JvbGxUaHVtYkhvdmVyQ29sb3I6ICcjMjU2M2ViJyxcbiAgICBzY3JvbGxiYXJQYWRkaW5nOiA0XG4gIH0pO1xuXG4gIGF1dG9IaWRlT3B0aW9ucyA9IHNpZ25hbDxJU2Nyb2xsT3ZlcmxheU9wdGlvbnM+KHtcbiAgICBzY3JvbGxZT3BhY2l0eTA6IHRydWUsXG4gICAgc2Nyb2xsYmFyV2lkdGg6IDgsXG4gICAgc2Nyb2xsYmFyQ29sb3I6ICd0cmFuc3BhcmVudCcsXG4gICAgc2Nyb2xsVGh1bWJDb2xvcjogJyM5Y2EzYWYnLFxuICAgIHNjcm9sbFRodW1iSG92ZXJDb2xvcjogJyM2YjcyODAnXG4gIH0pO1xuXG4gIGhvcml6b250YWxPcHRpb25zID0gc2lnbmFsPElTY3JvbGxPdmVybGF5T3B0aW9ucz4oe1xuICAgIHNjcm9sbFg6ICdzY3JvbGwnLFxuICAgIHNjcm9sbFk6ICdoaWRkZW4nLFxuICAgIHNjcm9sbGJhcldpZHRoOiA4LFxuICAgIHNjcm9sbGJhckNvbG9yOiAnI2YzZjRmNicsXG4gICAgc2Nyb2xsVGh1bWJDb2xvcjogJyMzYjgyZjYnXG4gIH0pO1xuXG4gIC8vIEV2ZW50IGhhbmRsaW5nXG4gIGxhc3RFdmVudCA9IHNpZ25hbDxzdHJpbmc+KCdObyBldmVudHMgeWV0Jyk7XG5cbiAgb25TY3JvbGwoZXZlbnQ6IEV2ZW50KSB7XG4gICAgdGhpcy5sYXN0RXZlbnQuc2V0KCdTY3JvbGwgZXZlbnQgZmlyZWQnKTtcbiAgfVxuXG4gIG9uU2Nyb2xsVG9wKGV2ZW50OiBFdmVudCkge1xuICAgIHRoaXMubGFzdEV2ZW50LnNldCgnUmVhY2hlZCB0b3AnKTtcbiAgfVxuXG4gIG9uU2Nyb2xsQm90dG9tKGV2ZW50OiBFdmVudCkge1xuICAgIHRoaXMubGFzdEV2ZW50LnNldCgnUmVhY2hlZCBib3R0b20nKTtcbiAgfVxufSAiLCI8ZGl2IGNsYXNzPVwiZGVtby1jb250YWluZXJcIj5cbiAgPGgyPlNjcm9sbCBPdmVybGF5IERlbW88L2gyPlxuXG4gIDxkaXYgY2xhc3M9XCJkZW1vLWludHJvXCI+XG4gICAgPGgzPkdp4bubaSB0aGnhu4d1PC9oMz5cbiAgICA8cD5EZW1vIG7DoHkgbWluaCBo4buNYSBjw6FjIHTDrW5oIG7Eg25nIHbDoCBjw6FjaCBz4butIGThu6VuZyBj4bunYSBkaXJlY3RpdmUgYHNjcm9sbC1vdmVybGF5YC4gRGVtbyBiYW8gZ+G7k20gNSB2w60gZOG7pSBjaMOtbmg6PC9wPlxuICAgIDx1bD5cbiAgICAgIDxsaT48c3Ryb25nPkJhc2ljIFVzYWdlPC9zdHJvbmc+OiBT4butIGThu6VuZyBjxqEgYuG6o24gduG7m2kgY+G6pXUgaMOsbmggbeG6t2MgxJHhu4tuaDwvbGk+XG4gICAgICA8bGk+PHN0cm9uZz5DdXN0b20gU3R5bGluZzwvc3Ryb25nPjogVHXhu7MgY2jhu4luaCBtw6B1IHPhuq9jLCBrw61jaCB0aMaw4bubYyB2w6AgcGFkZGluZyBj4bunYSB0aGFuaCBjdeG7mW48L2xpPlxuICAgICAgPGxpPjxzdHJvbmc+QXV0byBIaWRlPC9zdHJvbmc+OiDhuqhuL2hp4buHbiB0aGFuaCBjdeG7mW4ga2hpIGhvdmVyPC9saT5cbiAgICAgIDxsaT48c3Ryb25nPkhvcml6b250YWwgU2Nyb2xsPC9zdHJvbmc+OiBDdeG7mW4gbmdhbmcgduG7m2kgbuG7mWkgZHVuZyBkw6BpPC9saT5cbiAgICAgIDxsaT48c3Ryb25nPkV2ZW50IEhhbmRsaW5nPC9zdHJvbmc+OiBY4butIGzDvSBjw6FjIHPhu7Ega2nhu4duIHNjcm9sbDwvbGk+XG4gICAgPC91bD5cbiAgPC9kaXY+XG5cbiAgPGRpdiBjbGFzcz1cImRlbW8tZmVhdHVyZXNcIj5cbiAgICA8aDM+VMOtbmggbsSDbmcgRGVtbzwvaDM+XG4gICAgPGRpdiBjbGFzcz1cImZlYXR1cmVzLWdyaWRcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJmZWF0dXJlLWl0ZW1cIj5cbiAgICAgICAgPGg0PlR14buzIGJp4bq/biBnaWFvIGRp4buHbjwvaDQ+XG4gICAgICAgIDxwPlRoYXkgxJHhu5VpIG3DoHUgc+G6r2MsIGvDrWNoIHRoxrDhu5tjLCBwYWRkaW5nIGPhu6dhIHRoYW5oIGN14buZbjwvcD5cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdiBjbGFzcz1cImZlYXR1cmUtaXRlbVwiPlxuICAgICAgICA8aDQ+SGnhu4d1IOG7qW5nIHTGsMahbmcgdMOhYzwvaDQ+XG4gICAgICAgIDxwPkhvdmVyIGVmZmVjdHMsIGF1dG8taGlkZSBraGkga2jDtG5nIHPhu60gZOG7pW5nPC9wPlxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2IGNsYXNzPVwiZmVhdHVyZS1pdGVtXCI+XG4gICAgICAgIDxoND7EkGEgaMaw4bubbmcgY3Xhu5luPC9oND5cbiAgICAgICAgPHA+SOG7lyB0cuG7oyBj4bqjIGN14buZbiBk4buNYyB2w6Agbmdhbmc8L3A+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXYgY2xhc3M9XCJmZWF0dXJlLWl0ZW1cIj5cbiAgICAgICAgPGg0PkV2ZW50IGhhbmRsaW5nPC9oND5cbiAgICAgICAgPHA+VGhlbyBkw7VpIGPDoWMgc+G7sSBraeG7h24gc2Nyb2xsICh0b3AsIGJvdHRvbSwgc2Nyb2xsKTwvcD5cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdiBjbGFzcz1cImZlYXR1cmUtaXRlbVwiPlxuICAgICAgICA8aDQ+UmVzcG9uc2l2ZTwvaDQ+XG4gICAgICAgIDxwPkhv4bqhdCDEkeG7mW5nIHThu5F0IHRyw6puIG3hu41pIGvDrWNoIHRoxrDhu5tjIG3DoG4gaMOsbmg8L3A+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXYgY2xhc3M9XCJmZWF0dXJlLWl0ZW1cIj5cbiAgICAgICAgPGg0PlTDrWNoIGjhu6NwIGThu4UgZMOgbmc8L2g0PlxuICAgICAgICA8cD5Dw7MgdGjhu4MgdGjDqm0gdsOgbyBi4bqldCBr4buzIGNvbnRhaW5lciBuw6BvPC9wPlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuXG4gIDxkaXYgY2xhc3M9XCJkZW1vLWFwaVwiPlxuICAgIDxoMz5BUEkgUmVmZXJlbmNlPC9oMz5cblxuICAgIDxkaXYgY2xhc3M9XCJhcGktc2VjdGlvblwiPlxuICAgICAgPGg0PklucHV0czwvaDQ+XG4gICAgICA8ZGl2IGNsYXNzPVwiYXBpLXRhYmxlXCI+XG4gICAgICAgIDx0YWJsZT5cbiAgICAgICAgICA8dGhlYWQ+XG4gICAgICAgICAgICA8dHI+XG4gICAgICAgICAgICAgIDx0aD5JbnB1dDwvdGg+XG4gICAgICAgICAgICAgIDx0aD5UeXBlPC90aD5cbiAgICAgICAgICAgICAgPHRoPk3DtCB04bqjPC90aD5cbiAgICAgICAgICAgIDwvdHI+XG4gICAgICAgICAgPC90aGVhZD5cbiAgICAgICAgICA8dGJvZHk+XG4gICAgICAgICAgICA8dHI+XG4gICAgICAgICAgICAgIDx0ZD5vcHRpb25zPC90ZD5cbiAgICAgICAgICAgICAgPHRkPklTY3JvbGxPdmVybGF5T3B0aW9uczwvdGQ+XG4gICAgICAgICAgICAgIDx0ZD5UdeG7syBjaOG7jW4gY+G6pXUgaMOsbmggdGhhbmggY3Xhu5luPC90ZD5cbiAgICAgICAgICAgIDwvdHI+XG4gICAgICAgICAgICA8dHI+XG4gICAgICAgICAgICAgIDx0ZD5kZWJ1Z01vZGU8L3RkPlxuICAgICAgICAgICAgICA8dGQ+Ym9vbGVhbjwvdGQ+XG4gICAgICAgICAgICAgIDx0ZD5C4bqtdCBjaOG6vyDEkeG7mSBkZWJ1ZzwvdGQ+XG4gICAgICAgICAgICA8L3RyPlxuICAgICAgICAgICAgPHRyPlxuICAgICAgICAgICAgICA8dGQ+aWdub3JlSW5pdDwvdGQ+XG4gICAgICAgICAgICAgIDx0ZD5ib29sZWFuPC90ZD5cbiAgICAgICAgICAgICAgPHRkPkLhu48gcXVhIGto4bufaSB04bqhbyBkaXJlY3RpdmU8L3RkPlxuICAgICAgICAgICAgPC90cj5cbiAgICAgICAgICAgIDx0cj5cbiAgICAgICAgICAgICAgPHRkPmNsYXNzQ29udGFpbmVyPC90ZD5cbiAgICAgICAgICAgICAgPHRkPnN0cmluZzwvdGQ+XG4gICAgICAgICAgICAgIDx0ZD5UaMOqbSBjbGFzcyBjaG8gY29udGFpbmVyIGLhu41jIG5nb8OgaTwvdGQ+XG4gICAgICAgICAgICA8L3RyPlxuICAgICAgICAgICAgPHRyPlxuICAgICAgICAgICAgICA8dGQ+bm90U2hvd1Njcm9sbEJhclg8L3RkPlxuICAgICAgICAgICAgICA8dGQ+Ym9vbGVhbjwvdGQ+XG4gICAgICAgICAgICAgIDx0ZD5LaMO0bmcgaGnhu4NuIHRo4buLIHRoYW5oIGN14buZbiBuZ2FuZzwvdGQ+XG4gICAgICAgICAgICA8L3RyPlxuICAgICAgICAgICAgPHRyPlxuICAgICAgICAgICAgICA8dGQ+bm90U2hvd1Njcm9sbEJhclk8L3RkPlxuICAgICAgICAgICAgICA8dGQ+Ym9vbGVhbjwvdGQ+XG4gICAgICAgICAgICAgIDx0ZD5LaMO0bmcgaGnhu4NuIHRo4buLIHRoYW5oIGN14buZbiBk4buNYzwvdGQ+XG4gICAgICAgICAgICA8L3RyPlxuICAgICAgICAgICAgPHRyPlxuICAgICAgICAgICAgICA8dGQ+ZWxlbWVudENoZWNrU2Nyb2xsWDwvdGQ+XG4gICAgICAgICAgICAgIDx0ZD5IVE1MRWxlbWVudDwvdGQ+XG4gICAgICAgICAgICAgIDx0ZD5QaOG6p24gdOG7rSBkw7luZyDEkeG7gyBraeG7g20gdHJhIHNjcm9sbCBYPC90ZD5cbiAgICAgICAgICAgIDwvdHI+XG4gICAgICAgICAgICA8dHI+XG4gICAgICAgICAgICAgIDx0ZD5lbGVtZW50Q2hlY2tTY3JvbGxZPC90ZD5cbiAgICAgICAgICAgICAgPHRkPkhUTUxFbGVtZW50PC90ZD5cbiAgICAgICAgICAgICAgPHRkPlBo4bqnbiB04butIGTDuW5nIMSR4buDIGtp4buDbSB0cmEgc2Nyb2xsIFk8L3RkPlxuICAgICAgICAgICAgPC90cj5cbiAgICAgICAgICAgIDx0cj5cbiAgICAgICAgICAgICAgPHRkPmVsZW1lbnRTY3JvbGw8L3RkPlxuICAgICAgICAgICAgICA8dGQ+SFRNTEVsZW1lbnQ8L3RkPlxuICAgICAgICAgICAgICA8dGQ+UGjhuqduIHThu60gdGjhu7FjIGhp4buHbiBzY3JvbGw8L3RkPlxuICAgICAgICAgICAgPC90cj5cbiAgICAgICAgICA8L3Rib2R5PlxuICAgICAgICA8L3RhYmxlPlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG5cbiAgICA8ZGl2IGNsYXNzPVwiYXBpLXNlY3Rpb25cIj5cbiAgICAgIDxoND5PdXRwdXRzPC9oND5cbiAgICAgIDxkaXYgY2xhc3M9XCJhcGktdGFibGVcIj5cbiAgICAgICAgPHRhYmxlPlxuICAgICAgICAgIDx0aGVhZD5cbiAgICAgICAgICAgIDx0cj5cbiAgICAgICAgICAgICAgPHRoPk91dHB1dDwvdGg+XG4gICAgICAgICAgICAgIDx0aD5UeXBlPC90aD5cbiAgICAgICAgICAgICAgPHRoPk3DtCB04bqjPC90aD5cbiAgICAgICAgICAgIDwvdHI+XG4gICAgICAgICAgPC90aGVhZD5cbiAgICAgICAgICA8dGJvZHk+XG4gICAgICAgICAgICA8dHI+XG4gICAgICAgICAgICAgIDx0ZD5vdXRTY3JvbGw8L3RkPlxuICAgICAgICAgICAgICA8dGQ+RXZlbnQ8L3RkPlxuICAgICAgICAgICAgICA8dGQ+QuG6r24gcmEga2hpIHNjcm9sbCBi4bqldCBr4buzPC90ZD5cbiAgICAgICAgICAgIDwvdHI+XG4gICAgICAgICAgICA8dHI+XG4gICAgICAgICAgICAgIDx0ZD5vdXRTY3JvbGxYPC90ZD5cbiAgICAgICAgICAgICAgPHRkPkV2ZW50PC90ZD5cbiAgICAgICAgICAgICAgPHRkPkLhuq9uIHJhIGtoaSBzY3JvbGwgdGhlbyBjaGnhu4F1IG5nYW5nPC90ZD5cbiAgICAgICAgICAgIDwvdHI+XG4gICAgICAgICAgICA8dHI+XG4gICAgICAgICAgICAgIDx0ZD5vdXRTY3JvbGxZPC90ZD5cbiAgICAgICAgICAgICAgPHRkPkV2ZW50PC90ZD5cbiAgICAgICAgICAgICAgPHRkPkLhuq9uIHJhIGtoaSBzY3JvbGwgdGhlbyBjaGnhu4F1IGThu41jPC90ZD5cbiAgICAgICAgICAgIDwvdHI+XG4gICAgICAgICAgICA8dHI+XG4gICAgICAgICAgICAgIDx0ZD5vdXRTY3JvbGxUb3A8L3RkPlxuICAgICAgICAgICAgICA8dGQ+RXZlbnQ8L3RkPlxuICAgICAgICAgICAgICA8dGQ+QuG6r24gcmEga2hpIHNjcm9sbCB04bubaSDEkeG6p3UgKHRvcCk8L3RkPlxuICAgICAgICAgICAgPC90cj5cbiAgICAgICAgICAgIDx0cj5cbiAgICAgICAgICAgICAgPHRkPm91dFNjcm9sbEJvdHRvbTwvdGQ+XG4gICAgICAgICAgICAgIDx0ZD5FdmVudDwvdGQ+XG4gICAgICAgICAgICAgIDx0ZD5C4bqvbiByYSBraGkgc2Nyb2xsIHThu5tpIGN14buRaSAoYm90dG9tKTwvdGQ+XG4gICAgICAgICAgICA8L3RyPlxuICAgICAgICAgIDwvdGJvZHk+XG4gICAgICAgIDwvdGFibGU+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cblxuICAgIDxkaXYgY2xhc3M9XCJhcGktc2VjdGlvblwiPlxuICAgICAgPGg0PkludGVyZmFjZTwvaDQ+XG4gICAgICA8ZGl2IGNsYXNzPVwiaW50ZXJmYWNlLWRlc2NyaXB0aW9uXCI+XG4gICAgICAgIDxwPkludGVyZmFjZSA8Y29kZT5JU2Nyb2xsT3ZlcmxheU9wdGlvbnM8L2NvZGU+IMSR4buLbmggbmdoxKlhIGPDoWMgdHXhu7MgY2jhu41uIGPhuqV1IGjDrG5oIGNobyBzY3JvbGwtb3ZlcmxheSBkaXJlY3RpdmU6XG4gICAgICAgIDwvcD5cbiAgICAgICAgPHByZT48Y29kZT5leHBvcnQgaW50ZXJmYWNlIElTY3JvbGxPdmVybGF5T3B0aW9ucyB7eyAneycgfX1cbiAgc2Nyb2xsYmFyV2lkdGg/OiBudW1iZXI7ICAgICAgICAvLyBDaGnhu4F1IHLhu5luZyB0aGFuaCBjdeG7mW4gKHB4KVxuICBzY3JvbGxiYXJDb2xvcj86IHN0cmluZzsgICAgICAgIC8vIE3DoHUgbuG7gW4gdHJhY2tcbiAgc2Nyb2xsYmFySG92ZXJDb2xvcj86IHN0cmluZzsgICAvLyBNw6B1IG7hu4FuIHRyYWNrIGtoaSBob3ZlclxuICBzY3JvbGxUaHVtYkNvbG9yPzogc3RyaW5nOyAgICAgIC8vIE3DoHUgdGh1bWJcbiAgc2Nyb2xsVGh1bWJIb3ZlckNvbG9yPzogc3RyaW5nOyAvLyBNw6B1IHRodW1iIGtoaSBob3ZlclxuICBzY3JvbGxiYXJQYWRkaW5nPzogbnVtYmVyOyAgICAgIC8vIFBhZGRpbmcgY+G7p2Egc2Nyb2xsYmFyXG4gIHNjcm9sbFg/OiAnaGlkZGVuJyB8ICdzY3JvbGwnOyAgLy8gS2nhu4N1IGhp4buDbiB0aOG7iyBzY3JvbGwgWFxuICBzY3JvbGxYT3BhY2l0eTA/OiBib29sZWFuOyAgICAgIC8vIOG6qG4gdHJhY2sgWCBraGkga2jDtG5nIGhvdmVyXG4gIHNjcm9sbFk/OiAnaGlkZGVuJyB8ICdzY3JvbGwnOyAgLy8gS2nhu4N1IGhp4buDbiB0aOG7iyBzY3JvbGwgWVxuICBzY3JvbGxZT3BhY2l0eTA/OiBib29sZWFuOyAgICAgIC8vIOG6qG4gdHJhY2sgWSBraGkga2jDtG5nIGhvdmVyXG57eyAnfScgfX08L2NvZGU+PC9wcmU+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPGRpdiBjbGFzcz1cImludGVyZmFjZS11c2FnZVwiPlxuICAgICAgICA8aDU+VsOtIGThu6Ugc+G7rSBk4bulbmc6PC9oNT5cbiAgICAgICAgPHByZT48Y29kZT4vLyBD4bqldSBow6xuaCBjxqEgYuG6o25cbmNvbnN0IGJhc2ljT3B0aW9uczogSVNjcm9sbE92ZXJsYXlPcHRpb25zID0ge3sgJ3snIH19XG4gIHNjcm9sbGJhcldpZHRoOiA4LFxuICBzY3JvbGxiYXJDb2xvcjogJyNmM2Y0ZjYnLFxuICBzY3JvbGxUaHVtYkNvbG9yOiAnIzNiODJmNidcbnt7ICd9JyB9fTtcblxuLy8gQ+G6pXUgaMOsbmggbsOibmcgY2FvIHbhu5tpIGhvdmVyIGVmZmVjdHNcbmNvbnN0IGFkdmFuY2VkT3B0aW9uczogSVNjcm9sbE92ZXJsYXlPcHRpb25zID0ge3sgJ3snIH19XG4gIHNjcm9sbGJhcldpZHRoOiAxMixcbiAgc2Nyb2xsYmFyQ29sb3I6ICcjZjNmNGY2JyxcbiAgc2Nyb2xsYmFySG92ZXJDb2xvcjogJyNlNWU3ZWInLFxuICBzY3JvbGxUaHVtYkNvbG9yOiAnIzNiODJmNicsXG4gIHNjcm9sbFRodW1iSG92ZXJDb2xvcjogJyMyNTYzZWInLFxuICBzY3JvbGxiYXJQYWRkaW5nOiA0LFxuICBzY3JvbGxZT3BhY2l0eTA6IHRydWVcbnt7ICd9JyB9fTtcblxuLy8gQ+G6pXUgaMOsbmggY2hvIHNjcm9sbCBuZ2FuZ1xuY29uc3QgaG9yaXpvbnRhbE9wdGlvbnM6IElTY3JvbGxPdmVybGF5T3B0aW9ucyA9IHt7ICd7JyB9fVxuICBzY3JvbGxYOiAnc2Nyb2xsJyxcbiAgc2Nyb2xsWTogJ2hpZGRlbicsXG4gIHNjcm9sbGJhcldpZHRoOiA4LFxuICBzY3JvbGxiYXJDb2xvcjogJyNmM2Y0ZjYnLFxuICBzY3JvbGxUaHVtYkNvbG9yOiAnIzNiODJmNidcbnt7ICd9JyB9fTs8L2NvZGU+PC9wcmU+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPGRpdiBjbGFzcz1cImludGVyZmFjZS1ub3Rlc1wiPlxuICAgICAgICA8aDU+R2hpIGNow7o6PC9oNT5cbiAgICAgICAgPHVsPlxuICAgICAgICAgIDxsaT5U4bqldCBj4bqjIGPDoWMgdGh14buZYyB0w61uaCDEkeG7gXUgbMOgIG9wdGlvbmFsIChjw7MgZOG6pXUgPyk8L2xpPlxuICAgICAgICAgIDxsaT5O4bq/dSBraMO0bmcgY3VuZyBj4bqlcCBnacOhIHRy4buLLCBkaXJlY3RpdmUgc+G6vSBz4butIGThu6VuZyBnacOhIHRy4buLIG3hurdjIMSR4buLbmg8L2xpPlxuICAgICAgICAgIDxsaT5Dw7MgdGjhu4Mga+G6v3QgaOG7o3Agbmhp4buBdSBvcHRpb25zIMSR4buDIHThuqFvIHJhIGdpYW8gZGnhu4duIHRoYW5oIGN14buZbiBwaMO5IGjhu6NwPC9saT5cbiAgICAgICAgICA8bGk+TcOgdSBz4bqvYyBjw7MgdGjhu4Mgc+G7rSBk4bulbmcgYuG6pXQga+G7syDEkeG7i25oIGThuqFuZyBDU1MgY29sb3IgbsOgbyAoaGV4LCByZ2IsIHJnYmEsIGV0Yy4pPC9saT5cbiAgICAgICAgICA8bGk+c2Nyb2xsWCB2w6Agc2Nyb2xsWSBjaOG7iSBuaOG6rW4gbeG7mXQgdHJvbmcgaGFpIGdpw6EgdHLhu4s6ICdoaWRkZW4nIGhv4bq3YyAnc2Nyb2xsJzwvbGk+XG4gICAgICAgIDwvdWw+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cblxuICAgIDxkaXYgY2xhc3M9XCJhcGktc2VjdGlvblwiPlxuICAgICAgPGg0Pk9wdGlvbnMgKElTY3JvbGxPdmVybGF5T3B0aW9ucyk8L2g0PlxuICAgICAgPGRpdiBjbGFzcz1cImFwaS10YWJsZVwiPlxuICAgICAgICA8dGFibGU+XG4gICAgICAgICAgPHRoZWFkPlxuICAgICAgICAgICAgPHRyPlxuICAgICAgICAgICAgICA8dGg+VGh14buZYyB0w61uaDwvdGg+XG4gICAgICAgICAgICAgIDx0aD5UeXBlPC90aD5cbiAgICAgICAgICAgICAgPHRoPk3DtCB04bqjPC90aD5cbiAgICAgICAgICAgIDwvdHI+XG4gICAgICAgICAgPC90aGVhZD5cbiAgICAgICAgICA8dGJvZHk+XG4gICAgICAgICAgICA8dHI+XG4gICAgICAgICAgICAgIDx0ZD5zY3JvbGxiYXJXaWR0aDwvdGQ+XG4gICAgICAgICAgICAgIDx0ZD5udW1iZXI8L3RkPlxuICAgICAgICAgICAgICA8dGQ+Q2hp4buBdSBy4buZbmcgdGhhbmggY3Xhu5luIChweCk8L3RkPlxuICAgICAgICAgICAgPC90cj5cbiAgICAgICAgICAgIDx0cj5cbiAgICAgICAgICAgICAgPHRkPnNjcm9sbGJhckNvbG9yPC90ZD5cbiAgICAgICAgICAgICAgPHRkPnN0cmluZzwvdGQ+XG4gICAgICAgICAgICAgIDx0ZD5Nw6B1IG7hu4FuIHRyYWNrPC90ZD5cbiAgICAgICAgICAgIDwvdHI+XG4gICAgICAgICAgICA8dHI+XG4gICAgICAgICAgICAgIDx0ZD5zY3JvbGxiYXJIb3ZlckNvbG9yPC90ZD5cbiAgICAgICAgICAgICAgPHRkPnN0cmluZzwvdGQ+XG4gICAgICAgICAgICAgIDx0ZD5Nw6B1IG7hu4FuIHRyYWNrIGtoaSBob3ZlcjwvdGQ+XG4gICAgICAgICAgICA8L3RyPlxuICAgICAgICAgICAgPHRyPlxuICAgICAgICAgICAgICA8dGQ+c2Nyb2xsVGh1bWJDb2xvcjwvdGQ+XG4gICAgICAgICAgICAgIDx0ZD5zdHJpbmc8L3RkPlxuICAgICAgICAgICAgICA8dGQ+TcOgdSB0aHVtYjwvdGQ+XG4gICAgICAgICAgICA8L3RyPlxuICAgICAgICAgICAgPHRyPlxuICAgICAgICAgICAgICA8dGQ+c2Nyb2xsVGh1bWJIb3ZlckNvbG9yPC90ZD5cbiAgICAgICAgICAgICAgPHRkPnN0cmluZzwvdGQ+XG4gICAgICAgICAgICAgIDx0ZD5Nw6B1IHRodW1iIGtoaSBob3ZlcjwvdGQ+XG4gICAgICAgICAgICA8L3RyPlxuICAgICAgICAgICAgPHRyPlxuICAgICAgICAgICAgICA8dGQ+c2Nyb2xsYmFyUGFkZGluZzwvdGQ+XG4gICAgICAgICAgICAgIDx0ZD5udW1iZXI8L3RkPlxuICAgICAgICAgICAgICA8dGQ+UGFkZGluZyBj4bunYSBzY3JvbGxiYXI8L3RkPlxuICAgICAgICAgICAgPC90cj5cbiAgICAgICAgICAgIDx0cj5cbiAgICAgICAgICAgICAgPHRkPnNjcm9sbFg8L3RkPlxuICAgICAgICAgICAgICA8dGQ+J2hpZGRlbid8J3Njcm9sbCc8L3RkPlxuICAgICAgICAgICAgICA8dGQ+S2nhu4N1IGhp4buDbiB0aOG7iyBzY3JvbGwgWDwvdGQ+XG4gICAgICAgICAgICA8L3RyPlxuICAgICAgICAgICAgPHRyPlxuICAgICAgICAgICAgICA8dGQ+c2Nyb2xsWE9wYWNpdHkwPC90ZD5cbiAgICAgICAgICAgICAgPHRkPmJvb2xlYW48L3RkPlxuICAgICAgICAgICAgICA8dGQ+4bqobiB0cmFjayBYIGtoaSBraMO0bmcgaG92ZXI8L3RkPlxuICAgICAgICAgICAgPC90cj5cbiAgICAgICAgICAgIDx0cj5cbiAgICAgICAgICAgICAgPHRkPnNjcm9sbFk8L3RkPlxuICAgICAgICAgICAgICA8dGQ+J2hpZGRlbid8J3Njcm9sbCc8L3RkPlxuICAgICAgICAgICAgICA8dGQ+S2nhu4N1IGhp4buDbiB0aOG7iyBzY3JvbGwgWTwvdGQ+XG4gICAgICAgICAgICA8L3RyPlxuICAgICAgICAgICAgPHRyPlxuICAgICAgICAgICAgICA8dGQ+c2Nyb2xsWU9wYWNpdHkwPC90ZD5cbiAgICAgICAgICAgICAgPHRkPmJvb2xlYW48L3RkPlxuICAgICAgICAgICAgICA8dGQ+4bqobiB0cmFjayBZIGtoaSBraMO0bmcgaG92ZXI8L3RkPlxuICAgICAgICAgICAgPC90cj5cbiAgICAgICAgICA8L3Rib2R5PlxuICAgICAgICA8L3RhYmxlPlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuXG4gIDwhLS0gQmFzaWMgRGVtbyAtLT5cbiAgPGRpdiBjbGFzcz1cImRlbW8tc2VjdGlvblwiPlxuICAgIDxoMz4xLiBCYXNpYyBVc2FnZTwvaDM+XG4gICAgPGRpdiBjbGFzcz1cImRlbW8tZGVzY3JpcHRpb25cIj5cbiAgICAgIDxwPlPhu60gZOG7pW5nIGPGoSBi4bqjbiB24bubaSBj4bqldSBow6xuaCBt4bq3YyDEkeG7i25oIGPhu6dhIHNjcm9sbC1vdmVybGF5IGRpcmVjdGl2ZS48L3A+XG4gICAgICA8cHJlPjxjb2RlPiZsdDtkaXYgTGlic1VpQ29tcG9uZW50c1Njcm9sbE92ZXJsYXlEaXJlY3RpdmVcbiAgICAgc3R5bGU9XCJ3aWR0aDogMzAwcHg7IGhlaWdodDogMjAwcHg7XCImZ3Q7XG4gIE7hu5lpIGR1bmcgZMOgaS4uLlxuJmx0Oy9kaXYmZ3Q7PC9jb2RlPjwvcHJlPlxuICAgIDwvZGl2PlxuICAgIDxkaXYgY2xhc3M9XCJkZW1vLWJveFwiPlxuICAgICAgPGRpdiBMaWJzVWlDb21wb25lbnRzU2Nyb2xsT3ZlcmxheURpcmVjdGl2ZVxuICAgICAgICBzdHlsZT1cIndpZHRoOiAzMDBweDsgaGVpZ2h0OiAyMDBweDsgYm9yZGVyOiAxcHggc29saWQgI2RkZDtcIj5cbiAgICAgICAgPGRpdiBzdHlsZT1cInBhZGRpbmc6IDE2cHg7XCI+XG4gICAgICAgICAge3sgbG9uZ0NvbnRlbnQoKSB9fVxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cblxuICA8IS0tIEN1c3RvbSBTdHlsaW5nIERlbW8gLS0+XG4gIDxkaXYgY2xhc3M9XCJkZW1vLXNlY3Rpb25cIj5cbiAgICA8aDM+Mi4gQ3VzdG9tIFN0eWxpbmc8L2gzPlxuICAgIDxkaXYgY2xhc3M9XCJkZW1vLWRlc2NyaXB0aW9uXCI+XG4gICAgICA8cD5UdeG7syBjaOG7iW5oIG3DoHUgc+G6r2MsIGvDrWNoIHRoxrDhu5tjIHbDoCBwYWRkaW5nIGPhu6dhIHRoYW5oIGN14buZbi48L3A+XG4gICAgICA8cHJlPjxjb2RlPiZsdDtkaXYgTGlic1VpQ29tcG9uZW50c1Njcm9sbE92ZXJsYXlEaXJlY3RpdmVcbiAgICAgW29wdGlvbnNdPVwie3sgJ3snIH19XCJcbiAgICAgICBzY3JvbGxiYXJXaWR0aDogMTIsXG4gICAgICAgc2Nyb2xsYmFyQ29sb3I6ICcjZjNmNGY2JyxcbiAgICAgICBzY3JvbGxUaHVtYkNvbG9yOiAnIzNiODJmNicsXG4gICAgICAgc2Nyb2xsYmFyUGFkZGluZzogNFxuICAgICB7eyAnfScgfX1cIiZndDtcbiAgTuG7mWkgZHVuZyBkw6BpLi4uXG4mbHQ7L2RpdiZndDs8L2NvZGU+PC9wcmU+XG4gICAgPC9kaXY+XG4gICAgPGRpdiBjbGFzcz1cImRlbW8tYm94XCI+XG4gICAgICA8ZGl2IExpYnNVaUNvbXBvbmVudHNTY3JvbGxPdmVybGF5RGlyZWN0aXZlXG4gICAgICAgIFtvcHRpb25zXT1cImN1c3RvbVN0eWxlT3B0aW9ucygpXCJcbiAgICAgICAgc3R5bGU9XCJ3aWR0aDogMzAwcHg7IGhlaWdodDogMjAwcHg7IGJvcmRlcjogMXB4IHNvbGlkICNkZGQ7XCI+XG4gICAgICAgIDxkaXYgc3R5bGU9XCJwYWRkaW5nOiAxNnB4O1wiPlxuICAgICAgICAgIHt7IGxvbmdDb250ZW50KCkgfX1cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG5cbiAgPCEtLSBBdXRvIEhpZGUgRGVtbyAtLT5cbiAgPGRpdiBjbGFzcz1cImRlbW8tc2VjdGlvblwiPlxuICAgIDxoMz4zLiBBdXRvIEhpZGUgb24gSG92ZXI8L2gzPlxuICAgIDxkaXYgY2xhc3M9XCJkZW1vLWRlc2NyaXB0aW9uXCI+XG4gICAgICA8cD7huqhuL2hp4buHbiB0aGFuaCBjdeG7mW4ga2hpIGhvdmVyIHbDoG8gY29udGFpbmVyLjwvcD5cbiAgICAgIDxwcmU+PGNvZGU+Jmx0O2RpdiBMaWJzVWlDb21wb25lbnRzU2Nyb2xsT3ZlcmxheURpcmVjdGl2ZVxuICAgICBbb3B0aW9uc109XCJ7eyAneycgfX1cIlxuICAgICAgIHNjcm9sbFlPcGFjaXR5MDogdHJ1ZSxcbiAgICAgICBzY3JvbGxiYXJDb2xvcjogJ3RyYW5zcGFyZW50JyxcbiAgICAgICBzY3JvbGxUaHVtYkNvbG9yOiAnIzljYTNhZidcbiAgICAge3sgJ30nIH19XCImZ3Q7XG4gIE7hu5lpIGR1bmcgZMOgaS4uLlxuJmx0Oy9kaXYmZ3Q7PC9jb2RlPjwvcHJlPlxuICAgIDwvZGl2PlxuICAgIDxkaXYgY2xhc3M9XCJkZW1vLWJveFwiPlxuICAgICAgPGRpdiBMaWJzVWlDb21wb25lbnRzU2Nyb2xsT3ZlcmxheURpcmVjdGl2ZVxuICAgICAgICBbb3B0aW9uc109XCJhdXRvSGlkZU9wdGlvbnMoKVwiXG4gICAgICAgIHN0eWxlPVwid2lkdGg6IDMwMHB4OyBoZWlnaHQ6IDIwMHB4OyBib3JkZXI6IDFweCBzb2xpZCAjZGRkO1wiPlxuICAgICAgICA8ZGl2IHN0eWxlPVwicGFkZGluZzogMTZweDtcIj5cbiAgICAgICAgICB7eyBsb25nQ29udGVudCgpIH19XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuXG4gIDwhLS0gSG9yaXpvbnRhbCBTY3JvbGwgRGVtbyAtLT5cbiAgPGRpdiBjbGFzcz1cImRlbW8tc2VjdGlvblwiPlxuICAgIDxoMz40LiBIb3Jpem9udGFsIFNjcm9sbDwvaDM+XG4gICAgPGRpdiBjbGFzcz1cImRlbW8tZGVzY3JpcHRpb25cIj5cbiAgICAgIDxwPkN14buZbiBuZ2FuZyB24bubaSBu4buZaSBkdW5nIGTDoGkuPC9wPlxuICAgICAgPHByZT48Y29kZT4mbHQ7ZGl2IExpYnNVaUNvbXBvbmVudHNTY3JvbGxPdmVybGF5RGlyZWN0aXZlXG4gICAgIFtvcHRpb25zXT1cInt7ICd7JyB9fVwiXG4gICAgICAgc2Nyb2xsWDogJ3Njcm9sbCcsXG4gICAgICAgc2Nyb2xsWTogJ2hpZGRlbidcbiAgICAge3sgJ30nIH19XCImZ3Q7XG4gICZsdDtkaXYgc3R5bGU9XCJ3aGl0ZS1zcGFjZTogbm93cmFwO1wiJmd0O1xuICAgIE7hu5lpIGR1bmcgbmdhbmcgZMOgaS4uLlxuICAmbHQ7L2RpdiZndDtcbiZsdDsvZGl2Jmd0OzwvY29kZT48L3ByZT5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2IGNsYXNzPVwiZGVtby1ib3hcIj5cbiAgICAgIDxkaXYgTGlic1VpQ29tcG9uZW50c1Njcm9sbE92ZXJsYXlEaXJlY3RpdmVcbiAgICAgICAgW29wdGlvbnNdPVwiaG9yaXpvbnRhbE9wdGlvbnMoKVwiXG4gICAgICAgIHN0eWxlPVwid2lkdGg6IDMwMHB4OyBoZWlnaHQ6IDEwMHB4OyBib3JkZXI6IDFweCBzb2xpZCAjZGRkO1wiPlxuICAgICAgICA8ZGl2IHN0eWxlPVwicGFkZGluZzogMTZweDsgd2hpdGUtc3BhY2U6IG5vd3JhcDtcIj5cbiAgICAgICAgICB7eyBsb25nSG9yaXpvbnRhbENvbnRlbnQoKSB9fVxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cblxuICA8IS0tIEV2ZW50IEhhbmRsaW5nIERlbW8gLS0+XG4gIDxkaXYgY2xhc3M9XCJkZW1vLXNlY3Rpb25cIj5cbiAgICA8aDM+NS4gRXZlbnQgSGFuZGxpbmc8L2gzPlxuICAgIDxkaXYgY2xhc3M9XCJkZW1vLWRlc2NyaXB0aW9uXCI+XG4gICAgICA8cD5Y4butIGzDvSBjw6FjIHPhu7Ega2nhu4duIHNjcm9sbC48L3A+XG4gICAgICA8cHJlPjxjb2RlPiZsdDtkaXYgTGlic1VpQ29tcG9uZW50c1Njcm9sbE92ZXJsYXlEaXJlY3RpdmVcbiAgICAgKG91dFNjcm9sbCk9XCJvblNjcm9sbCgkZXZlbnQpXCJcbiAgICAgKG91dFNjcm9sbFRvcCk9XCJvblNjcm9sbFRvcCgkZXZlbnQpXCJcbiAgICAgKG91dFNjcm9sbEJvdHRvbSk9XCJvblNjcm9sbEJvdHRvbSgkZXZlbnQpXCImZ3Q7XG4gIE7hu5lpIGR1bmcgZMOgaS4uLlxuJmx0Oy9kaXYmZ3Q7PC9jb2RlPjwvcHJlPlxuICAgIDwvZGl2PlxuICAgIDxkaXYgY2xhc3M9XCJkZW1vLWJveFwiPlxuICAgICAgPGRpdiBMaWJzVWlDb21wb25lbnRzU2Nyb2xsT3ZlcmxheURpcmVjdGl2ZVxuICAgICAgICAob3V0U2Nyb2xsKT1cIm9uU2Nyb2xsKCRldmVudClcIlxuICAgICAgICAob3V0U2Nyb2xsVG9wKT1cIm9uU2Nyb2xsVG9wKCRldmVudClcIlxuICAgICAgICAob3V0U2Nyb2xsQm90dG9tKT1cIm9uU2Nyb2xsQm90dG9tKCRldmVudClcIlxuICAgICAgICBzdHlsZT1cIndpZHRoOiAzMDBweDsgaGVpZ2h0OiAyMDBweDsgYm9yZGVyOiAxcHggc29saWQgI2RkZDtcIj5cbiAgICAgICAgPGRpdiBzdHlsZT1cInBhZGRpbmc6IDE2cHg7XCI+XG4gICAgICAgICAge3sgbG9uZ0NvbnRlbnQoKSB9fVxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdiBjbGFzcz1cImV2ZW50LWxvZ1wiPlxuICAgICAgICA8cD5MYXN0IEV2ZW50OiB7eyBsYXN0RXZlbnQoKSB9fTwvcD5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cbjwvZGl2PlxuIl19
|
|
78
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2Nyb2xsLW92ZXJsYXkuZGVtby5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL2xpYnMtdWkvY29tcG9uZW50cy9zY3JvbGwtb3ZlcmxheS9zcmMvZGVtby9zY3JvbGwtb3ZlcmxheS5kZW1vLnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vbGlicy11aS9jb21wb25lbnRzL3Njcm9sbC1vdmVybGF5L3NyYy9kZW1vL3Njcm9sbC1vdmVybGF5LmRlbW8uaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDL0MsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDbEQsT0FBTyxFQUFFLHNDQUFzQyxFQUFFLE1BQU0sNkJBQTZCLENBQUM7OztBQVVyRixNQUFNLE9BQU8sMENBQTBDO0lBQ3JELGdFQUFnRTtJQUNoRSxXQUFXLEdBQUcsTUFBTSxDQUNsQixLQUFLLENBQUMsSUFBSSxDQUFDLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQ2xFLENBQUM7SUFDRix3RUFBd0U7SUFDeEUscUJBQXFCLEdBQUcsTUFBTSxDQUM1QixLQUFLLENBQUMsSUFBSSxDQUFDLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQ2pFLENBQUM7SUFFRixxQkFBcUI7SUFDckIsZUFBZSxHQUFHLENBQUMsU0FBUyxFQUFFLGFBQWEsRUFBRSxVQUFVLEVBQUUsWUFBWSxDQUFVLENBQUM7SUFDaEYsZ0JBQWdCLEdBQXdDLFNBQVMsQ0FBQztJQUVsRSxrQkFBa0I7SUFDbEIsa0JBQWtCLEdBQUcsTUFBTSxDQUF3QixFQUFFLGNBQWMsRUFBRSxFQUFFLEVBQUUsY0FBYyxFQUFFLFNBQVMsRUFBRSxtQkFBbUIsRUFBRSxTQUFTLEVBQUUsZ0JBQWdCLEVBQUUsU0FBUyxFQUFFLHFCQUFxQixFQUFFLFNBQVMsRUFBRSxnQkFBZ0IsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQzFOLGVBQWUsR0FBRyxNQUFNLENBQXdCLEVBQUUsZUFBZSxFQUFFLElBQUksRUFBRSxjQUFjLEVBQUUsQ0FBQyxFQUFFLGNBQWMsRUFBRSxhQUFhLEVBQUUsZ0JBQWdCLEVBQUUsU0FBUyxFQUFFLHFCQUFxQixFQUFFLFNBQVMsRUFBRSxDQUFDLENBQUM7SUFDNUwsaUJBQWlCLEdBQUssTUFBTSxDQUF3QixFQUFFLE9BQU8sRUFBRSxRQUFRLEVBQUUsT0FBTyxFQUFFLFFBQVEsRUFBRSxjQUFjLEVBQUUsQ0FBQyxFQUFFLGNBQWMsRUFBRSxTQUFTLEVBQUUsZ0JBQWdCLEVBQUUsU0FBUyxFQUFFLENBQUMsQ0FBQztJQUV6SyxtQkFBbUI7SUFDbkIsU0FBUyxHQUFHLE1BQU0sQ0FBUyxlQUFlLENBQUMsQ0FBQztJQUU1QyxVQUFVO0lBQ1YsSUFBSSxPQUFPO1FBQ1QsUUFBUSxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztZQUM5QixLQUFLLGFBQWEsQ0FBQyxDQUFDLE9BQU8sSUFBSSxDQUFDLGtCQUFrQixFQUFFLENBQUM7WUFDckQsS0FBSyxVQUFVLENBQUMsQ0FBSSxPQUFPLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztZQUNsRCxLQUFLLFlBQVksQ0FBQyxDQUFFLE9BQU8sSUFBSSxDQUFDLGlCQUFpQixFQUFFLENBQUM7WUFDcEQsT0FBTyxDQUFDLENBQVksT0FBTyxTQUFTLENBQUM7UUFDdkMsQ0FBQztJQUNILENBQUM7SUFFRCxJQUFJLE9BQU87UUFDVCxPQUFPLElBQUksQ0FBQyxnQkFBZ0IsS0FBSyxZQUFZO1lBQzNDLENBQUMsQ0FBQyxJQUFJLENBQUMscUJBQXFCLEVBQUU7WUFDOUIsQ0FBQyxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztJQUN6QixDQUFDO0lBRUQsaUJBQWlCO0lBQ2pCLFFBQVEsS0FBVyxJQUFJLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUM5RCxXQUFXLEtBQVEsSUFBSSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3ZELGNBQWMsS0FBSyxJQUFJLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUUxRCxXQUFXO0lBQ1gsU0FBUyxHQUFHO1FBQ1YsRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFnQixJQUFJLEVBQUUsdUJBQXVCLEVBQUUsT0FBTyxFQUFFLFdBQVcsRUFBRSxXQUFXLEVBQUUsOEJBQThCLEVBQUU7UUFDbkksRUFBRSxJQUFJLEVBQUUsV0FBVyxFQUFjLElBQUksRUFBRSxTQUFTLEVBQWUsT0FBTyxFQUFFLE9BQU8sRUFBTyxXQUFXLEVBQUUsa0JBQWtCLEVBQUU7UUFDdkgsRUFBRSxJQUFJLEVBQUUsbUJBQW1CLEVBQU0sSUFBSSxFQUFFLFNBQVMsRUFBZSxPQUFPLEVBQUUsT0FBTyxFQUFPLFdBQVcsRUFBRSxvQkFBb0IsRUFBRTtRQUN6SCxFQUFFLElBQUksRUFBRSxtQkFBbUIsRUFBTSxJQUFJLEVBQUUsU0FBUyxFQUFlLE9BQU8sRUFBRSxPQUFPLEVBQU8sV0FBVyxFQUFFLGtCQUFrQixFQUFFO0tBQ3hILENBQUM7SUFDRixVQUFVLEdBQUc7UUFDWCxFQUFFLElBQUksRUFBRSxXQUFXLEVBQVEsSUFBSSxFQUFFLE9BQU8sRUFBRSxXQUFXLEVBQUUsMEJBQTBCLEVBQUU7UUFDbkYsRUFBRSxJQUFJLEVBQUUsY0FBYyxFQUFLLElBQUksRUFBRSxPQUFPLEVBQUUsV0FBVyxFQUFFLDJCQUEyQixFQUFFO1FBQ3BGLEVBQUUsSUFBSSxFQUFFLGlCQUFpQixFQUFFLElBQUksRUFBRSxPQUFPLEVBQUUsV0FBVyxFQUFFLDhCQUE4QixFQUFFO0tBQ3hGLENBQUM7SUFDRixVQUFVLEdBQUc7UUFDWCxFQUFFLElBQUksRUFBRSxnQkFBZ0IsRUFBUyxJQUFJLEVBQUUsUUFBUSxFQUEyQixPQUFPLEVBQUUsV0FBVyxFQUFFLFdBQVcsRUFBRSwyQkFBMkIsRUFBRTtRQUMxSSxFQUFFLElBQUksRUFBRSxnQkFBZ0IsRUFBUyxJQUFJLEVBQUUsUUFBUSxFQUEyQixPQUFPLEVBQUUsV0FBVyxFQUFFLFdBQVcsRUFBRSxxQkFBcUIsRUFBRTtRQUNwSSxFQUFFLElBQUksRUFBRSxxQkFBcUIsRUFBSSxJQUFJLEVBQUUsUUFBUSxFQUEyQixPQUFPLEVBQUUsV0FBVyxFQUFFLFdBQVcsRUFBRSxxQkFBcUIsRUFBRTtRQUNwSSxFQUFFLElBQUksRUFBRSxrQkFBa0IsRUFBTyxJQUFJLEVBQUUsUUFBUSxFQUEyQixPQUFPLEVBQUUsV0FBVyxFQUFFLFdBQVcsRUFBRSxXQUFXLEVBQUU7UUFDMUgsRUFBRSxJQUFJLEVBQUUsdUJBQXVCLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBMkIsT0FBTyxFQUFFLFdBQVcsRUFBRSxXQUFXLEVBQUUscUJBQXFCLEVBQUU7UUFDcEksRUFBRSxJQUFJLEVBQUUsa0JBQWtCLEVBQU8sSUFBSSxFQUFFLFFBQVEsRUFBMkIsT0FBTyxFQUFFLFdBQVcsRUFBRSxXQUFXLEVBQUUsbUJBQW1CLEVBQUU7UUFDbEksRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFnQixJQUFJLEVBQUUscUJBQXFCLEVBQWUsT0FBTyxFQUFFLFdBQVcsRUFBRSxXQUFXLEVBQUUsZUFBZSxFQUFFO1FBQy9ILEVBQUUsSUFBSSxFQUFFLGlCQUFpQixFQUFRLElBQUksRUFBRSxTQUFTLEVBQTBCLE9BQU8sRUFBRSxXQUFXLEVBQUUsV0FBVyxFQUFFLDRCQUE0QixFQUFFO1FBQzNJLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBZ0IsSUFBSSxFQUFFLHFCQUFxQixFQUFlLE9BQU8sRUFBRSxXQUFXLEVBQUUsV0FBVyxFQUFFLGVBQWUsRUFBRTtRQUMvSCxFQUFFLElBQUksRUFBRSxpQkFBaUIsRUFBUSxJQUFJLEVBQUUsU0FBUyxFQUEwQixPQUFPLEVBQUUsV0FBVyxFQUFFLFdBQVcsRUFBRSw0QkFBNEIsRUFBRTtLQUM1SSxDQUFDO0lBQ0YsYUFBYSxHQUFHO1FBQ2QsRUFBRSxJQUFJLEVBQUUsdUJBQXVCLEVBQUUsSUFBSSxFQUFFLFdBQVcsRUFBRSxXQUFXLEVBQUUsc0NBQXNDLEVBQUU7S0FDMUcsQ0FBQztJQUVGLHdCQUF3QjtJQUN4QixpQkFBaUIsR0FBRyxnREFBZ0QsQ0FBQztJQUNyRSxrQkFBa0IsR0FBRyw2Q0FBNkMsQ0FBQztJQUVuRSxlQUFlLENBQUMsSUFBWTtRQUMxQixTQUFTLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxTQUFTLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQztJQUMvRSxDQUFDO3dHQTdFVSwwQ0FBMEM7NEZBQTFDLDBDQUEwQyxtRkNadkQseXZOQXFJQSxxaUhEN0hZLFlBQVksNEpBQUUsc0NBQXNDOzs0RkFJbkQsMENBQTBDO2tCQVB0RCxTQUFTOytCQUNFLHlCQUF5QixjQUN2QixJQUFJLFdBQ1AsQ0FBQyxZQUFZLEVBQUUsc0NBQXNDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgQ29tcG9uZW50LCBzaWduYWwgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IExpYnNVaUNvbXBvbmVudHNTY3JvbGxPdmVybGF5RGlyZWN0aXZlIH0gZnJvbSAnLi4vc2Nyb2xsLW92ZXJsYXkuZGlyZWN0aXZlJztcbmltcG9ydCB7IElTY3JvbGxPdmVybGF5T3B0aW9ucyB9IGZyb20gJy4uL3Njcm9sbC5pbnRlcmZhY2UnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdsaWItc2Nyb2xsLW92ZXJsYXktZGVtbycsXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGltcG9ydHM6IFtDb21tb25Nb2R1bGUsIExpYnNVaUNvbXBvbmVudHNTY3JvbGxPdmVybGF5RGlyZWN0aXZlXSxcbiAgdGVtcGxhdGVVcmw6ICcuL3Njcm9sbC1vdmVybGF5LmRlbW8uaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL3Njcm9sbC1vdmVybGF5LmRlbW8uc2NzcyddXG59KVxuZXhwb3J0IGNsYXNzIExpYnNVaUNvbXBvbmVudHNTY3JvbGxPdmVybGF5RGVtb0NvbXBvbmVudCB7XG4gIC8vIERlbW8gdGV4dCBjb250ZW50OiBnZW5lcmF0ZSA1MDAwIHdvcmRzIGZvciB2ZXJ0aWNhbCBzY3JvbGxpbmdcbiAgbG9uZ0NvbnRlbnQgPSBzaWduYWwoXG4gICAgQXJyYXkuZnJvbSh7IGxlbmd0aDogNTAwMCB9LCAoXywgaSkgPT4gYExvcmVtJHtpICsgMX1gKS5qb2luKCcgJylcbiAgKTtcbiAgLy8gRGVtbyBob3Jpem9udGFsIGNvbnRlbnQ6IGdlbmVyYXRlIDUwMDAgd29yZHMgZm9yIGhvcml6b250YWwgc2Nyb2xsaW5nXG4gIGxvbmdIb3Jpem9udGFsQ29udGVudCA9IHNpZ25hbChcbiAgICBBcnJheS5mcm9tKHsgbGVuZ3RoOiA1MDAwIH0sIChfLCBpKSA9PiBgV29yZCR7aSArIDF9YCkuam9pbignICcpXG4gICk7XG5cbiAgLy8gU2NlbmFyaW8gc2VsZWN0aW9uXG4gIHNjZW5hcmlvT3B0aW9ucyA9IFsnZGVmYXVsdCcsICdjdXN0b21TdHlsZScsICdhdXRvSGlkZScsICdob3Jpem9udGFsJ10gYXMgY29uc3Q7XG4gIHNlbGVjdGVkU2NlbmFyaW86IHR5cGVvZiB0aGlzLnNjZW5hcmlvT3B0aW9uc1tudW1iZXJdID0gJ2RlZmF1bHQnO1xuXG4gIC8vIE9wdGlvbnMgc2lnbmFsc1xuICBjdXN0b21TdHlsZU9wdGlvbnMgPSBzaWduYWw8SVNjcm9sbE92ZXJsYXlPcHRpb25zPih7IHNjcm9sbGJhcldpZHRoOiAxMiwgc2Nyb2xsYmFyQ29sb3I6ICcjZjNmNGY2Jywgc2Nyb2xsYmFySG92ZXJDb2xvcjogJyNlNWU3ZWInLCBzY3JvbGxUaHVtYkNvbG9yOiAnIzNiODJmNicsIHNjcm9sbFRodW1iSG92ZXJDb2xvcjogJyMyNTYzZWInLCBzY3JvbGxiYXJQYWRkaW5nOiA0IH0pO1xuICBhdXRvSGlkZU9wdGlvbnMgPSBzaWduYWw8SVNjcm9sbE92ZXJsYXlPcHRpb25zPih7IHNjcm9sbFlPcGFjaXR5MDogdHJ1ZSwgc2Nyb2xsYmFyV2lkdGg6IDgsIHNjcm9sbGJhckNvbG9yOiAndHJhbnNwYXJlbnQnLCBzY3JvbGxUaHVtYkNvbG9yOiAnIzljYTNhZicsIHNjcm9sbFRodW1iSG92ZXJDb2xvcjogJyM2YjcyODAnIH0pO1xuICBob3Jpem9udGFsT3B0aW9ucyAgID0gc2lnbmFsPElTY3JvbGxPdmVybGF5T3B0aW9ucz4oeyBzY3JvbGxYOiAnc2Nyb2xsJywgc2Nyb2xsWTogJ2hpZGRlbicsIHNjcm9sbGJhcldpZHRoOiA4LCBzY3JvbGxiYXJDb2xvcjogJyNmM2Y0ZjYnLCBzY3JvbGxUaHVtYkNvbG9yOiAnIzNiODJmNicgfSk7XG5cbiAgLy8gU2Nyb2xsIGV2ZW50IGxvZ1xuICBsYXN0RXZlbnQgPSBzaWduYWw8c3RyaW5nPignTm8gZXZlbnRzIHlldCcpO1xuXG4gIC8vIEhlbHBlcnNcbiAgZ2V0IG9wdGlvbnMoKTogSVNjcm9sbE92ZXJsYXlPcHRpb25zIHwgdW5kZWZpbmVkIHtcbiAgICBzd2l0Y2ggKHRoaXMuc2VsZWN0ZWRTY2VuYXJpbykge1xuICAgICAgY2FzZSAnY3VzdG9tU3R5bGUnOiByZXR1cm4gdGhpcy5jdXN0b21TdHlsZU9wdGlvbnMoKTtcbiAgICAgIGNhc2UgJ2F1dG9IaWRlJzogICAgcmV0dXJuIHRoaXMuYXV0b0hpZGVPcHRpb25zKCk7XG4gICAgICBjYXNlICdob3Jpem9udGFsJzogIHJldHVybiB0aGlzLmhvcml6b250YWxPcHRpb25zKCk7XG4gICAgICBkZWZhdWx0OiAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuICB9XG5cbiAgZ2V0IGNvbnRlbnQoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5zZWxlY3RlZFNjZW5hcmlvID09PSAnaG9yaXpvbnRhbCdcbiAgICAgID8gdGhpcy5sb25nSG9yaXpvbnRhbENvbnRlbnQoKVxuICAgICAgOiB0aGlzLmxvbmdDb250ZW50KCk7XG4gIH1cblxuICAvLyBFdmVudCBoYW5kbGVyc1xuICBvblNjcm9sbCgpICAgICAgIHsgdGhpcy5sYXN0RXZlbnQuc2V0KCdTY3JvbGwgZXZlbnQgZmlyZWQnKTsgfVxuICBvblNjcm9sbFRvcCgpICAgIHsgdGhpcy5sYXN0RXZlbnQuc2V0KCdSZWFjaGVkIHRvcCcpOyB9XG4gIG9uU2Nyb2xsQm90dG9tKCkgeyB0aGlzLmxhc3RFdmVudC5zZXQoJ1JlYWNoZWQgYm90dG9tJyk7IH1cblxuICAvLyBBUEkgZG9jc1xuICBpbnB1dHNEb2MgPSBbXG4gICAgeyBuYW1lOiAnb3B0aW9ucycsICAgICAgICAgICAgICAgdHlwZTogJ0lTY3JvbGxPdmVybGF5T3B0aW9ucycsIGRlZmF1bHQ6ICd1bmRlZmluZWQnLCBkZXNjcmlwdGlvbjogJ0PhuqV1IGjDrG5oIHR14buzIGNo4buJbmggc2Nyb2xsYmFyJyB9LFxuICAgIHsgbmFtZTogJ2RlYnVnTW9kZScsICAgICAgICAgICAgIHR5cGU6ICdib29sZWFuJywgICAgICAgICAgICAgIGRlZmF1bHQ6ICdmYWxzZScsICAgICAgZGVzY3JpcHRpb246ICdC4bqtdCBjaOG6vyDEkeG7mSBkZWJ1ZycgfSxcbiAgICB7IG5hbWU6ICdub3RTaG93U2Nyb2xsQmFyWCcsICAgICB0eXBlOiAnYm9vbGVhbicsICAgICAgICAgICAgICBkZWZhdWx0OiAnZmFsc2UnLCAgICAgIGRlc2NyaXB0aW9uOiAn4bqobiBzY3JvbGxiYXIgbmdhbmcnIH0sXG4gICAgeyBuYW1lOiAnbm90U2hvd1Njcm9sbEJhclknLCAgICAgdHlwZTogJ2Jvb2xlYW4nLCAgICAgICAgICAgICAgZGVmYXVsdDogJ2ZhbHNlJywgICAgICBkZXNjcmlwdGlvbjogJ+G6qG4gc2Nyb2xsYmFyIGThu41jJyB9XG4gIF07XG4gIG91dHB1dHNEb2MgPSBbXG4gICAgeyBuYW1lOiAnb3V0U2Nyb2xsJywgICAgICAgdHlwZTogJ0V2ZW50JywgZGVzY3JpcHRpb246ICdC4bqvbiByYSBraGkgc2Nyb2xsIGLhuqV0IGvhu7MnIH0sXG4gICAgeyBuYW1lOiAnb3V0U2Nyb2xsVG9wJywgICAgdHlwZTogJ0V2ZW50JywgZGVzY3JpcHRpb246ICdC4bqvbiByYSBraGkgc2Nyb2xsIMSR4bq/biB0b3AnIH0sXG4gICAgeyBuYW1lOiAnb3V0U2Nyb2xsQm90dG9tJywgdHlwZTogJ0V2ZW50JywgZGVzY3JpcHRpb246ICdC4bqvbiByYSBraGkgc2Nyb2xsIMSR4bq/biBib3R0b20nIH1cbiAgXTtcbiAgb3B0aW9uc0RvYyA9IFtcbiAgICB7IG5hbWU6ICdzY3JvbGxiYXJXaWR0aCcsICAgICAgICB0eXBlOiAnbnVtYmVyJywgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6ICd1bmRlZmluZWQnLCBkZXNjcmlwdGlvbjogJ0NoaeG7gXUgcuG7mW5nIHNjcm9sbGJhciAocHgpJyB9LFxuICAgIHsgbmFtZTogJ3Njcm9sbGJhckNvbG9yJywgICAgICAgIHR5cGU6ICdzdHJpbmcnLCAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDogJ3VuZGVmaW5lZCcsIGRlc2NyaXB0aW9uOiAnTcOgdSB0cmFjayBzY3JvbGxiYXInIH0sXG4gICAgeyBuYW1lOiAnc2Nyb2xsYmFySG92ZXJDb2xvcicsICAgdHlwZTogJ3N0cmluZycsICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OiAndW5kZWZpbmVkJywgZGVzY3JpcHRpb246ICdNw6B1IHRyYWNrIGtoaSBob3ZlcicgfSxcbiAgICB7IG5hbWU6ICdzY3JvbGxUaHVtYkNvbG9yJywgICAgICB0eXBlOiAnc3RyaW5nJywgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6ICd1bmRlZmluZWQnLCBkZXNjcmlwdGlvbjogJ03DoHUgdGh1bWInIH0sXG4gICAgeyBuYW1lOiAnc2Nyb2xsVGh1bWJIb3ZlckNvbG9yJywgdHlwZTogJ3N0cmluZycsICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OiAndW5kZWZpbmVkJywgZGVzY3JpcHRpb246ICdNw6B1IHRodW1iIGtoaSBob3ZlcicgfSxcbiAgICB7IG5hbWU6ICdzY3JvbGxiYXJQYWRkaW5nJywgICAgICB0eXBlOiAnbnVtYmVyJywgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6ICd1bmRlZmluZWQnLCBkZXNjcmlwdGlvbjogJ1BhZGRpbmcgc2Nyb2xsYmFyJyB9LFxuICAgIHsgbmFtZTogJ3Njcm9sbFgnLCAgICAgICAgICAgICAgIHR5cGU6IGAnaGlkZGVuJyB8ICdzY3JvbGwnYCwgICAgICAgICAgICAgIGRlZmF1bHQ6ICd1bmRlZmluZWQnLCBkZXNjcmlwdGlvbjogJ0tp4buDdSBzY3JvbGwgWCcgfSxcbiAgICB7IG5hbWU6ICdzY3JvbGxYT3BhY2l0eTAnLCAgICAgICB0eXBlOiAnYm9vbGVhbicsICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6ICd1bmRlZmluZWQnLCBkZXNjcmlwdGlvbjogJ+G6qG4gdHJhY2sgWCBraGkga2jDtG5nIGhvdmVyJyB9LFxuICAgIHsgbmFtZTogJ3Njcm9sbFknLCAgICAgICAgICAgICAgIHR5cGU6IGAnaGlkZGVuJyB8ICdzY3JvbGwnYCwgICAgICAgICAgICAgIGRlZmF1bHQ6ICd1bmRlZmluZWQnLCBkZXNjcmlwdGlvbjogJ0tp4buDdSBzY3JvbGwgWScgfSxcbiAgICB7IG5hbWU6ICdzY3JvbGxZT3BhY2l0eTAnLCAgICAgICB0eXBlOiAnYm9vbGVhbicsICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6ICd1bmRlZmluZWQnLCBkZXNjcmlwdGlvbjogJ+G6qG4gdHJhY2sgWSBraGkga2jDtG5nIGhvdmVyJyB9XG4gIF07XG4gIGludGVyZmFjZXNEb2MgPSBbXG4gICAgeyBuYW1lOiAnSVNjcm9sbE92ZXJsYXlPcHRpb25zJywgdHlwZTogJ2ludGVyZmFjZScsIGRlc2NyaXB0aW9uOiAnQ8OhYyB0deG7syBjaOG7jW4gY+G6pXUgaMOsbmggc2Nyb2xsLW92ZXJsYXknIH1cbiAgXTtcblxuICAvLyBJbnN0YWxsYXRpb24gY29tbWFuZHNcbiAgaW5zdGFsbENvbW1hbmROcG0gPSAnbnBtIGluc3RhbGwgQGxpYnMtdWkvY29tcG9uZW50cy1zY3JvbGwtb3ZlcmxheSc7XG4gIGluc3RhbGxDb21tYW5kWWFybiA9ICd5YXJuIGFkZCBAbGlicy11aS9jb21wb25lbnRzLXNjcm9sbC1vdmVybGF5JztcblxuICBjb3B5VG9DbGlwYm9hcmQodGV4dDogc3RyaW5nKSB7XG4gICAgbmF2aWdhdG9yLmNsaXBib2FyZC53cml0ZVRleHQodGV4dCkudGhlbigoKSA9PiBjb25zb2xlLmxvZygnQ29waWVkOicsIHRleHQpKTtcbiAgfVxufSAiLCI8ZGl2IGNsYXNzPVwibWF4LXctNnhsIG14LWF1dG8gcC01IGZvbnQtc2FucyB0ZXh0LWdyYXktODAwXCI+XG4gIDxoZWFkZXIgY2xhc3M9XCJ0ZXh0LWNlbnRlciBweS0xMCBiZy13aGl0ZSByb3VuZGVkLWxnIG1iLTggc2hhZG93LXNtXCI+XG4gICAgPGgxIGNsYXNzPVwidGV4dC00eGwgZm9udC1ib2xkIG1iLTJcIj5EZW1vIFNjcm9sbCBPdmVybGF5PC9oMT5cbiAgICA8cCBjbGFzcz1cInRleHQteGwgdGV4dC1ncmF5LTUwMFwiPiYjNjQ7bGlicy11aS9jb21wb25lbnRzLXNjcm9sbC1vdmVybGF5PC9wPlxuICA8L2hlYWRlcj5cblxuICA8bWFpbj5cbiAgICA8IS0tIEdp4bubaSB0aGnhu4d1IC0tPlxuICAgIDxzZWN0aW9uIGNsYXNzPVwiYmctd2hpdGUgcm91bmRlZC1sZyBwLTggbWItOCBzaGFkb3ctc21cIj5cbiAgICAgIDxoMiBjbGFzcz1cInRleHQtMnhsIGZvbnQtYm9sZCBtYi01IHBiLTMgYm9yZGVyLWIgYm9yZGVyLWdyYXktMjAwXCI+R2nhu5tpIHRoaeG7h3U8L2gyPlxuICAgICAgPHA+PGNvZGU+c2Nyb2xsLW92ZXJsYXk8L2NvZGU+IGzDoCBt4buZdCBkaXJlY3RpdmUgZ2nDunAgdHXhu7MgYmnhur9uIHNjcm9sbGJhciB0csOqbiBi4bqldCBr4buzIHBo4bqnbiB04butIG7DoG8gdHJvbmcgQW5ndWxhciwgaOG7lyB0cuG7oyB0deG7syBjaOG7iW5oIG3DoHUsIGvDrWNoIHRoxrDhu5tjLCDhuqluL2hp4buHbiB2w6Agc+G7sSBraeG7h24gc2Nyb2xsLjwvcD5cbiAgICA8L3NlY3Rpb24+XG5cbiAgICA8IS0tIEPDoGkgxJHhurd0IC0tPlxuICAgIDxzZWN0aW9uIGNsYXNzPVwiYmctd2hpdGUgcm91bmRlZC1sZyBwLTggbWItOCBzaGFkb3ctc21cIj5cbiAgICAgIDxoMiBjbGFzcz1cInRleHQtMnhsIGZvbnQtYm9sZCBtYi01IHBiLTMgYm9yZGVyLWIgYm9yZGVyLWdyYXktMjAwXCI+Q8OgaSDEkeG6t3Q8L2gyPlxuICAgICAgPGRpdiBjbGFzcz1cImZsZXggaXRlbXMtY2VudGVyIGJnLWdyYXktMTAwIHAtNCByb3VuZGVkLWxnIG1iLTRcIj5cbiAgICAgICAgPHByZSBjbGFzcz1cImZsZXgtMSB0ZXh0LXNtIG92ZXJmbG93LXgtYXV0b1wiPjxjb2RlPnt7IGluc3RhbGxDb21tYW5kTnBtIH19PC9jb2RlPjwvcHJlPlxuICAgICAgICA8YnV0dG9uIGNsYXNzPVwibWwtNCBweC0zIHB5LTEgYmctYmx1ZS01MDAgdGV4dC13aGl0ZSByb3VuZGVkIGhvdmVyOmJnLWJsdWUtNjAwXCIgKGNsaWNrKT1cImNvcHlUb0NsaXBib2FyZChpbnN0YWxsQ29tbWFuZE5wbSlcIj5TYW8gY2jDqXA8L2J1dHRvbj5cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdiBjbGFzcz1cImZsZXggaXRlbXMtY2VudGVyIGJnLWdyYXktMTAwIHAtNCByb3VuZGVkLWxnXCI+XG4gICAgICAgIDxwcmUgY2xhc3M9XCJmbGV4LTEgdGV4dC1zbSBvdmVyZmxvdy14LWF1dG9cIj48Y29kZT57eyBpbnN0YWxsQ29tbWFuZFlhcm4gfX08L2NvZGU+PC9wcmU+XG4gICAgICAgIDxidXR0b24gY2xhc3M9XCJtbC00IHB4LTMgcHktMSBiZy1ibHVlLTUwMCB0ZXh0LXdoaXRlIHJvdW5kZWQgaG92ZXI6YmctYmx1ZS02MDBcIiAoY2xpY2spPVwiY29weVRvQ2xpcGJvYXJkKGluc3RhbGxDb21tYW5kWWFybilcIj5TYW8gY2jDqXA8L2J1dHRvbj5cbiAgICAgIDwvZGl2PlxuICAgIDwvc2VjdGlvbj5cblxuICAgIDwhLS0gRGVtbyBUcuG7sWMgdGnhur9wIC0tPlxuICAgIDxzZWN0aW9uIGNsYXNzPVwiYmctd2hpdGUgcm91bmRlZC1sZyBwLTggbWItOCBzaGFkb3ctc21cIj5cbiAgICAgIDxoMiBjbGFzcz1cInRleHQtMnhsIGZvbnQtYm9sZCBtYi01IHBiLTMgYm9yZGVyLWIgYm9yZGVyLWdyYXktMjAwXCI+RGVtbyBUcuG7sWMgdGnhur9wPC9oMj5cbiAgICAgIDxkaXYgY2xhc3M9XCJncmlkIGdyaWQtY29scy00IGdhcC00IG1iLTZcIj5cbiAgICAgICAgPGJ1dHRvbiAqbmdGb3I9XCJsZXQgc2Mgb2Ygc2NlbmFyaW9PcHRpb25zXCJcbiAgICAgICAgICAoY2xpY2spPVwic2VsZWN0ZWRTY2VuYXJpbyA9IHNjXCJcbiAgICAgICAgICBjbGFzcz1cInB4LTMgcHktMSBib3JkZXIgcm91bmRlZFwiXG4gICAgICAgICAgW2NsYXNzLmJnLWJsdWUtNTAwXT1cInNlbGVjdGVkU2NlbmFyaW89PT1zY1wiXG4gICAgICAgICAgW2NsYXNzLnRleHQtd2hpdGVdPVwic2VsZWN0ZWRTY2VuYXJpbz09PXNjXCI+XG4gICAgICAgICAge3sgc2MgfX1cbiAgICAgICAgPC9idXR0b24+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXYgY2xhc3M9XCJwLTQgYmctZ3JheS01MCByb3VuZGVkLWxnIGgtWzMwMHB4XVwiPlxuICAgICAgICA8ZGl2IExpYnNVaUNvbXBvbmVudHNTY3JvbGxPdmVybGF5RGlyZWN0aXZlXG4gICAgICAgICAgICAgW29wdGlvbnNdPVwib3B0aW9uc1wiXG4gICAgICAgICAgICAgKG91dFNjcm9sbCk9XCJvblNjcm9sbCgpXCJcbiAgICAgICAgICAgICAob3V0U2Nyb2xsVG9wKT1cIm9uU2Nyb2xsVG9wKClcIlxuICAgICAgICAgICAgIChvdXRTY3JvbGxCb3R0b20pPVwib25TY3JvbGxCb3R0b20oKVwiXG4gICAgICAgICAgICAgY2xhc3M9XCJ3LWZ1bGwgaC1mdWxsXCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cInAtMlwiXG4gICAgICAgICAgICAgICBbaW5uZXJUZXh0XT1cImNvbnRlbnRcIlxuICAgICAgICAgICAgICAgW2NsYXNzLndoaXRlc3BhY2UtcHJlLXdyYXBdPVwic2VsZWN0ZWRTY2VuYXJpbyE9PSdob3Jpem9udGFsJ1wiXG4gICAgICAgICAgICAgICBbY2xhc3Mud2hpdGVzcGFjZS1ub3dyYXBdPVwic2VsZWN0ZWRTY2VuYXJpbz09PSdob3Jpem9udGFsJ1wiPjwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgICAgPHAgY2xhc3M9XCJtdC00IHRleHQtZ3JheS03MDBcIj5T4buxIGtp4buHbjoge3sgbGFzdEV2ZW50KCkgfX08L3A+XG4gICAgPC9zZWN0aW9uPlxuXG4gICAgPCEtLSBDw6FjaCBz4butIGThu6VuZyAtLT5cbiAgICA8c2VjdGlvbiBjbGFzcz1cImJnLXdoaXRlIHJvdW5kZWQtbGcgcC04IG1iLTggc2hhZG93LXNtXCI+XG4gICAgICA8aDIgY2xhc3M9XCJ0ZXh0LTJ4bCBmb250LWJvbGQgbWItNSBwYi0zIGJvcmRlci1iIGJvcmRlci1ncmF5LTIwMFwiPkPDoWNoIHPhu60gZOG7pW5nPC9oMj5cbiAgICAgIDxwcmUgY2xhc3M9XCJiZy1ncmF5LTEwMCBwLTQgcm91bmRlZC1sZyBvdmVyZmxvdy1hdXRvIHRleHQtc21cIj5cbiAgICAgICAgPGNvZGUgbmdOb25CaW5kYWJsZT4mbHQ7ZGl2IExpYnNVaUNvbXBvbmVudHNTY3JvbGxPdmVybGF5RGlyZWN0aXZlIFtvcHRpb25zXT1cIiYjMTIzOyBzY3JvbGxiYXJXaWR0aDoxMiwgc2Nyb2xsVGh1bWJDb2xvcjonIzNiODJmNicgJiMxMjU7XCIgc3R5bGU9XCJ3aWR0aDozMDBweDtoZWlnaHQ6MjAwcHg7b3ZlcmZsb3c6YXV0bztcIiZndDtcbiAgTuG7mWkgZHVuZyBkw6BpLi4uXG4mbHQ7L2RpdiZndDs8L2NvZGU+XG4gICAgICA8L3ByZT5cbiAgICA8L3NlY3Rpb24+XG5cbiAgICA8IS0tIEFQSSBSZWZlcmVuY2UgLS0+XG4gICAgPHNlY3Rpb24gY2xhc3M9XCJiZy13aGl0ZSByb3VuZGVkLWxnIHAtOCBtYi04IHNoYWRvdy1zbVwiPlxuICAgICAgPGgyIGNsYXNzPVwidGV4dC0yeGwgZm9udC1ib2xkIG1iLTUgcGItMyBib3JkZXItYiBib3JkZXItZ3JheS0yMDBcIj5BUEkgUmVmZXJlbmNlPC9oMj5cbiAgICAgIDxoMyBjbGFzcz1cInRleHQteGwgZm9udC1zZW1pYm9sZCBtYi0zXCI+SW5wdXRzPC9oMz5cbiAgICAgIDx0YWJsZSBjbGFzcz1cIm1pbi13LWZ1bGwgYmctd2hpdGUgYm9yZGVyIGJvcmRlci1ncmF5LTIwMCBtYi02XCI+XG4gICAgICAgIDx0aGVhZD5cbiAgICAgICAgICA8dHI+XG4gICAgICAgICAgICA8dGggY2xhc3M9XCJweS0yIHB4LTQgYm9yZGVyLWIgYmctZ3JheS0xMDBcIj5Uw6puPC90aD5cbiAgICAgICAgICAgIDx0aCBjbGFzcz1cInB5LTIgcHgtNCBib3JkZXItYiBiZy1ncmF5LTEwMFwiPktp4buDdTwvdGg+XG4gICAgICAgICAgICA8dGggY2xhc3M9XCJweS0yIHB4LTQgYm9yZGVyLWIgYmctZ3JheS0xMDBcIj5N4bq3YyDEkeG7i25oPC90aD5cbiAgICAgICAgICAgIDx0aCBjbGFzcz1cInB5LTIgcHgtNCBib3JkZXItYiBiZy1ncmF5LTEwMFwiPk3DtCB04bqjPC90aD5cbiAgICAgICAgICA8L3RyPlxuICAgICAgICA8L3RoZWFkPlxuICAgICAgICA8dGJvZHk+XG4gICAgICAgICAgPHRyICpuZ0Zvcj1cImxldCBpbnB1dCBvZiBpbnB1dHNEb2NcIj5cbiAgICAgICAgICAgIDx0ZCBjbGFzcz1cInB5LTIgcHgtNCBib3JkZXItYlwiPjxjb2RlPnt7IGlucHV0Lm5hbWUgfX08L2NvZGU+PC90ZD5cbiAgICAgICAgICAgIDx0ZCBjbGFzcz1cInB5LTIgcHgtNCBib3JkZXItYlwiPjxjb2RlPnt7IGlucHV0LnR5cGUgfX08L2NvZGU+PC90ZD5cbiAgICAgICAgICAgIDx0ZCBjbGFzcz1cInB5LTIgcHgtNCBib3JkZXItYlwiPnt7IGlucHV0LmRlZmF1bHQgfX08L3RkPlxuICAgICAgICAgICAgPHRkIGNsYXNzPVwicHktMiBweC00IGJvcmRlci1iXCI+e3sgaW5wdXQuZGVzY3JpcHRpb24gfX08L3RkPlxuICAgICAgICAgIDwvdHI+XG4gICAgICAgIDwvdGJvZHk+XG4gICAgICA8L3RhYmxlPlxuICAgICAgPGgzIGNsYXNzPVwidGV4dC14bCBmb250LXNlbWlib2xkIG1iLTNcIj5PdXRwdXRzPC9oMz5cbiAgICAgIDx0YWJsZSBjbGFzcz1cIm1pbi13LWZ1bGwgYmctd2hpdGUgYm9yZGVyIGJvcmRlci1ncmF5LTIwMCBtYi02XCI+XG4gICAgICAgIDx0aGVhZD5cbiAgICAgICAgICA8dHI+XG4gICAgICAgICAgICA8dGggY2xhc3M9XCJweS0yIHB4LTQgYm9yZGVyLWIgYmctZ3JheS0xMDBcIj5Uw6puPC90aD5cbiAgICAgICAgICAgIDx0aCBjbGFzcz1cInB5LTIgcHgtNCBib3JkZXItYiBiZy1ncmF5LTEwMFwiPktp4buDdTwvdGg+XG4gICAgICAgICAgICA8dGggY2xhc3M9XCJweS0yIHB4LTQgYm9yZGVyLWIgYmctZ3JheS0xMDBcIj5Nw7QgdOG6ozwvdGg+XG4gICAgICAgICAgPC90cj5cbiAgICAgICAgPC90aGVhZD5cbiAgICAgICAgPHRib2R5PlxuICAgICAgICAgIDx0ciAqbmdGb3I9XCJsZXQgb3V0cHV0IG9mIG91dHB1dHNEb2NcIj5cbiAgICAgICAgICAgIDx0ZCBjbGFzcz1cInB5LTIgcHgtNCBib3JkZXItYlwiPjxjb2RlPnt7IG91dHB1dC5uYW1lIH19PC9jb2RlPjwvdGQ+XG4gICAgICAgICAgICA8dGQgY2xhc3M9XCJweS0yIHB4LTQgYm9yZGVyLWJcIj48Y29kZT57eyBvdXRwdXQudHlwZSB9fTwvY29kZT48L3RkPlxuICAgICAgICAgICAgPHRkIGNsYXNzPVwicHktMiBweC00IGJvcmRlci1iXCI+e3sgb3V0cHV0LmRlc2NyaXB0aW9uIH19PC90ZD5cbiAgICAgICAgICA8L3RyPlxuICAgICAgICA8L3Rib2R5PlxuICAgICAgPC90YWJsZT5cbiAgICAgIDxoMyBjbGFzcz1cInRleHQteGwgZm9udC1zZW1pYm9sZCBtYi0zXCI+T3B0aW9uczwvaDM+XG4gICAgICA8dGFibGUgY2xhc3M9XCJtaW4tdy1mdWxsIGJnLXdoaXRlIGJvcmRlciBib3JkZXItZ3JheS0yMDAgbWItNlwiPlxuICAgICAgICA8dGhlYWQ+XG4gICAgICAgICAgPHRyPlxuICAgICAgICAgICAgPHRoIGNsYXNzPVwicHktMiBweC00IGJvcmRlci1iIGJnLWdyYXktMTAwXCI+VGh14buZYyB0w61uaDwvdGg+XG4gICAgICAgICAgICA8dGggY2xhc3M9XCJweS0yIHB4LTQgYm9yZGVyLWIgYmctZ3JheS0xMDBcIj5LaeG7g3U8L3RoPlxuICAgICAgICAgICAgPHRoIGNsYXNzPVwicHktMiBweC00IGJvcmRlci1iIGJnLWdyYXktMTAwXCI+TeG6t2MgxJHhu4tuaDwvdGg+XG4gICAgICAgICAgICA8dGggY2xhc3M9XCJweS0yIHB4LTQgYm9yZGVyLWIgYmctZ3JheS0xMDBcIj5Nw7QgdOG6ozwvdGg+XG4gICAgICAgICAgPC90cj5cbiAgICAgICAgPC90aGVhZD5cbiAgICAgICAgPHRib2R5PlxuICAgICAgICAgIDx0ciAqbmdGb3I9XCJsZXQgb3B0IG9mIG9wdGlvbnNEb2NcIj5cbiAgICAgICAgICAgIDx0ZCBjbGFzcz1cInB5LTIgcHgtNCBib3JkZXItYlwiPjxjb2RlPnt7IG9wdC5uYW1lIH19PC9jb2RlPjwvdGQ+XG4gICAgICAgICAgICA8dGQgY2xhc3M9XCJweS0yIHB4LTQgYm9yZGVyLWJcIj48Y29kZT57eyBvcHQudHlwZSB9fTwvY29kZT48L3RkPlxuICAgICAgICAgICAgPHRkIGNsYXNzPVwicHktMiBweC00IGJvcmRlci1iXCI+e3sgb3B0LmRlZmF1bHQgfX08L3RkPlxuICAgICAgICAgICAgPHRkIGNsYXNzPVwicHktMiBweC00IGJvcmRlci1iXCI+e3sgb3B0LmRlc2NyaXB0aW9uIH19PC90ZD5cbiAgICAgICAgICA8L3RyPlxuICAgICAgICA8L3Rib2R5PlxuICAgICAgPC90YWJsZT5cbiAgICAgIDxoMyBjbGFzcz1cInRleHQteGwgZm9udC1zZW1pYm9sZCBtYi0zXCI+SW50ZXJmYWNlczwvaDM+XG4gICAgICA8ZGl2IGNsYXNzPVwic3BhY2UteS02XCI+XG4gICAgICAgIDxkaXYgKm5nRm9yPVwibGV0IGludGYgb2YgaW50ZXJmYWNlc0RvY1wiIGNsYXNzPVwiYmctZ3JheS01MCBwLTYgcm91bmRlZC1sZ1wiPlxuICAgICAgICAgIDxoNCBjbGFzcz1cImZvbnQtc2VtaWJvbGQgbWItMlwiPnt7IGludGYubmFtZSB9fTwvaDQ+XG4gICAgICAgICAgPHByZSBjbGFzcz1cImJnLWdyYXktMTAwIHAtNCByb3VuZGVkLWxnIG92ZXJmbG93LWF1dG8gdGV4dC1zbSBtYi0zXCI+PGNvZGU+e3sgaW50Zi50eXBlIH19PC9jb2RlPjwvcHJlPlxuICAgICAgICAgIDxwPnt7IGludGYuZGVzY3JpcHRpb24gfX08L3A+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgPC9zZWN0aW9uPlxuICA8L21haW4+XG48L2Rpdj5cbiJdfQ==
|