@snabcentr/client-ui 0.16.2 → 0.17.1

Sign up to get free protection for your applications and to get access to all the features.
@@ -1,7 +1,7 @@
1
1
  import { ScFilesService } from '@snabcentr/client-core';
2
2
  import { Observable } from 'rxjs';
3
- import { TreeIconService } from './services/tree-icon.service';
4
- import { TreeNode } from './interfaces/tree-node';
3
+ import { TreeNode } from '../interfaces/tree-node';
4
+ import { TreeIconService } from '../services/tree-icon.service';
5
5
  import * as i0 from "@angular/core";
6
6
  /**
7
7
  * Компонент файлов и документов.
@@ -1,5 +1,5 @@
1
1
  import * as i0 from "@angular/core";
2
- import * as i1 from "./files-and-documents.component";
2
+ import * as i1 from "./files-and-documents/files-and-documents.component";
3
3
  import * as i2 from "./directives/tree.directive";
4
4
  import * as i3 from "./directives/tree-top.directive";
5
5
  import * as i4 from "./file-tree-item/file-tree-item.component";
package/files/index.d.ts CHANGED
@@ -1,5 +1,5 @@
1
- export * from './files-and-documents.component';
2
- export * from './files-and-documents.module';
1
+ export * from './files-and-documents/files-and-documents.component';
3
2
  export * from './services';
4
3
  export * from './directives';
5
4
  export * from './interfaces/tree-node';
5
+ export * from './files-and-documents.module';
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@snabcentr/client-ui",
3
- "version": "0.16.2",
3
+ "version": "0.17.1",
4
4
  "author": "Snabcentr Ltd.",
5
5
  "repository": "https://gitlab.snabcentr.met/web/angular/snabcentr-client-ui-lib",
6
6
  "license": "Commercial",
package/public-api.d.ts CHANGED
@@ -18,5 +18,5 @@ export * from './share-button';
18
18
  export * from './user';
19
19
  export * from './validators';
20
20
  export * from './verification';
21
- export * from './tokens';
22
21
  export * from './profile';
22
+ export * from './tokens';
@@ -772,6 +772,11 @@ video {
772
772
  display: none;
773
773
  }
774
774
 
775
+ .size-6 {
776
+ width: 1.5rem;
777
+ height: 1.5rem;
778
+ }
779
+
775
780
  .\!h-20 {
776
781
  height: 5rem !important;
777
782
  }
@@ -836,10 +841,6 @@ video {
836
841
  height: 14rem;
837
842
  }
838
843
 
839
- .h-6 {
840
- height: 1.5rem;
841
- }
842
-
843
844
  .h-8 {
844
845
  height: 2rem;
845
846
  }
@@ -896,10 +897,6 @@ video {
896
897
  width: 10rem;
897
898
  }
898
899
 
899
- .w-6 {
900
- width: 1.5rem;
901
- }
902
-
903
900
  .w-8 {
904
901
  width: 2rem;
905
902
  }
@@ -912,7 +909,7 @@ video {
912
909
  width: 100%;
913
910
  }
914
911
 
915
- .min-w-\[10rem\] {
912
+ .min-w-40 {
916
913
  min-width: 10rem;
917
914
  }
918
915
 
package/tokens/index.d.ts CHANGED
@@ -1 +1,2 @@
1
1
  export * from './sc-linear-values-token';
2
+ export * from './sc-min-length-search-term';
@@ -0,0 +1,5 @@
1
+ import { InjectionToken } from '@angular/core';
2
+ /**
3
+ * Токен минимального количества введенных символов в поиске для подсветки терма.
4
+ */
5
+ export declare const SC_MIN_LENGTH_SEARCH_TERM: InjectionToken<number>;
@@ -1,60 +0,0 @@
1
- import { ChangeDetectionStrategy, Component, Inject } from '@angular/core';
2
- import { TUI_TREE_LOADING, TUI_TREE_LOADER } from '@taiga-ui/kit';
3
- import { map } from 'rxjs';
4
- import { TreeLoaderService } from './services/tree-loader.service';
5
- import * as i0 from "@angular/core";
6
- import * as i1 from "./services/tree-icon.service";
7
- import * as i2 from "@snabcentr/client-core";
8
- import * as i3 from "@angular/common";
9
- import * as i4 from "@taiga-ui/kit";
10
- import * as i5 from "@taiga-ui/core";
11
- import * as i6 from "./directives/tree.directive";
12
- import * as i7 from "./directives/tree-top.directive";
13
- /**
14
- * Компонент файлов и документов.
15
- */
16
- export class FilesAndDocumentsComponent {
17
- /**
18
- * Инициализирует экземпляр класса {@link FilesAndDocumentsComponent}.
19
- *
20
- * @param loading Объект отвечающий за значок загрузки, в момент раскрытия элемента дерева.
21
- * @param iconService Сервис для определения и назначения значка элементу дерева.
22
- * @param filesService Сервис для загрузки файлов.
23
- */
24
- constructor(loading, iconService, filesService) {
25
- this.loading = loading;
26
- this.iconService = iconService;
27
- this.filesService = filesService;
28
- /**
29
- * Данные визуализации и их начальное получение.
30
- */
31
- this.data$ = this.filesService.getFiles().pipe(map((data) => data.map((item) => ({
32
- text: item.name,
33
- icon: this.iconService.getIconName(item),
34
- hasChildren: this.iconService.hasChildren(item),
35
- createdAt: item.createdAt,
36
- id: item.id,
37
- link: item.link
38
- }))));
39
- }
40
- }
41
- FilesAndDocumentsComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: FilesAndDocumentsComponent, deps: [{ token: TUI_TREE_LOADING }, { token: i1.TreeIconService }, { token: i2.ScFilesService }], target: i0.ɵɵFactoryTarget.Component });
42
- FilesAndDocumentsComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.3.0", type: FilesAndDocumentsComponent, selector: "sc-files-and-documents", providers: [
43
- {
44
- provide: TUI_TREE_LOADER,
45
- useClass: TreeLoaderService
46
- }
47
- ], ngImport: i0, template: "<ng-container *ngIf=\"data$ | async as data; else skeleton\">\n <tui-tree\n *ngFor=\"let node of data\"\n #tree=\"scTree\"\n scTree\n [scTopNodeText]=\"node.text\"\n [scTopNodeIcon]=\"node.icon\"\n [scTopNodeLink]=\"node.link\"\n [scTopNodeChilds]=\"node.hasChildren\"\n [scTopNodeParent]=\"node.id\"\n [scTopNodeDate]=\"node.createdAt\"\n [childrenHandler]=\"tree.childrenHandler\"\n [content]=\"content\"\n [map]=\"tree.map\"\n [tuiTreeController]=\"false\"\n [value]=\"tree.service.data$ | async\"\n (toggled)=\"tree.onToggled($event)\"\n class=\"overflow-hidden\"\n ></tui-tree>\n</ng-container>\n\n<ng-template #content let-item>\n <tui-loader *ngIf=\"item === loading; else text\" class=\"w-8 my-4\"></tui-loader>\n <ng-template #text>\n <tui-svg [src]=\"item.icon\" class=\"tui-space_right-2\"></tui-svg>\n <a tuiLink [pseudo]=\"true\" *ngIf=\"item.link\" href=\"{{ item.link }}\" class=\"grow\">{{ item.text }}</a>\n <p *ngIf=\"!item.link\" class=\"grow\">{{ item.text }}</p>\n <p>{{ item.createdAt }}</p>\n </ng-template>\n</ng-template>\n\n<ng-template #skeleton>\n <div class=\"flex flex-col gap-2\">\n <div *ngFor=\"let _ of [].constructor(7)\" class=\"flex items-center gap-2\">\n <div class=\"tui-skeleton h-6 w-6\"></div>\n <div class=\"tui-skeleton h-4 w-40\"></div>\n </div>\n </div>\n</ng-template>\n", dependencies: [{ kind: "directive", type: i3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i4.TuiTreeComponent, selector: "tui-tree[value]", inputs: ["value", "trackBy", "content"] }, { kind: "directive", type: i4.TuiTreeChildrenDirective, selector: "tui-tree[childrenHandler]", inputs: ["childrenHandler"] }, { kind: "directive", type: i4.TuiTreeControllerDirective, selector: "[tuiTreeController][map]", inputs: ["tuiTreeController", "map"], outputs: ["toggled"], exportAs: ["tuiTreeController"] }, { kind: "component", type: i5.TuiSvgComponent, selector: "tui-svg", inputs: ["src"] }, { kind: "component", type: i5.TuiLoaderComponent, selector: "tui-loader", inputs: ["size", "inheritColor", "overlay", "textContent", "showLoader"] }, { kind: "component", type: i5.TuiLinkComponent, selector: "a[tuiLink], button[tuiLink]", inputs: ["pseudo", "icon", "iconAlign", "iconRotated", "mode"], exportAs: ["tuiLink"] }, { kind: "directive", type: i6.TreeDirective, selector: "[scTree]", exportAs: ["scTree"] }, { kind: "directive", type: i7.TreeTopDirective, selector: "[scTopNodeText]", inputs: ["scTopNodeText", "scTopNodeIcon", "scTopNodeLink", "scTopNodeChilds", "scTopNodeParent", "scTopNodeDate"] }, { kind: "pipe", type: i3.AsyncPipe, name: "async" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
48
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: FilesAndDocumentsComponent, decorators: [{
49
- type: Component,
50
- args: [{ selector: 'sc-files-and-documents', changeDetection: ChangeDetectionStrategy.OnPush, providers: [
51
- {
52
- provide: TUI_TREE_LOADER,
53
- useClass: TreeLoaderService
54
- }
55
- ], template: "<ng-container *ngIf=\"data$ | async as data; else skeleton\">\n <tui-tree\n *ngFor=\"let node of data\"\n #tree=\"scTree\"\n scTree\n [scTopNodeText]=\"node.text\"\n [scTopNodeIcon]=\"node.icon\"\n [scTopNodeLink]=\"node.link\"\n [scTopNodeChilds]=\"node.hasChildren\"\n [scTopNodeParent]=\"node.id\"\n [scTopNodeDate]=\"node.createdAt\"\n [childrenHandler]=\"tree.childrenHandler\"\n [content]=\"content\"\n [map]=\"tree.map\"\n [tuiTreeController]=\"false\"\n [value]=\"tree.service.data$ | async\"\n (toggled)=\"tree.onToggled($event)\"\n class=\"overflow-hidden\"\n ></tui-tree>\n</ng-container>\n\n<ng-template #content let-item>\n <tui-loader *ngIf=\"item === loading; else text\" class=\"w-8 my-4\"></tui-loader>\n <ng-template #text>\n <tui-svg [src]=\"item.icon\" class=\"tui-space_right-2\"></tui-svg>\n <a tuiLink [pseudo]=\"true\" *ngIf=\"item.link\" href=\"{{ item.link }}\" class=\"grow\">{{ item.text }}</a>\n <p *ngIf=\"!item.link\" class=\"grow\">{{ item.text }}</p>\n <p>{{ item.createdAt }}</p>\n </ng-template>\n</ng-template>\n\n<ng-template #skeleton>\n <div class=\"flex flex-col gap-2\">\n <div *ngFor=\"let _ of [].constructor(7)\" class=\"flex items-center gap-2\">\n <div class=\"tui-skeleton h-6 w-6\"></div>\n <div class=\"tui-skeleton h-4 w-40\"></div>\n </div>\n </div>\n</ng-template>\n" }]
56
- }], ctorParameters: function () { return [{ type: undefined, decorators: [{
57
- type: Inject,
58
- args: [TUI_TREE_LOADING]
59
- }] }, { type: i1.TreeIconService }, { type: i2.ScFilesService }]; } });
60
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmlsZXMtYW5kLWRvY3VtZW50cy5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wcm9qZWN0cy9jbGllbnQtdWkvZmlsZXMvZmlsZXMtYW5kLWRvY3VtZW50cy5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi9wcm9qZWN0cy9jbGllbnQtdWkvZmlsZXMvZmlsZXMtYW5kLWRvY3VtZW50cy5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsU0FBUyxFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMzRSxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsZUFBZSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRWxFLE9BQU8sRUFBYyxHQUFHLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFFdkMsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sZ0NBQWdDLENBQUM7Ozs7Ozs7OztBQUduRTs7R0FFRztBQVlILE1BQU0sT0FBTywwQkFBMEI7SUFpQm5DOzs7Ozs7T0FNRztJQUNILFlBQTZELE9BQWdCLEVBQWtCLFdBQTRCLEVBQW1CLFlBQTRCO1FBQTdHLFlBQU8sR0FBUCxPQUFPLENBQVM7UUFBa0IsZ0JBQVcsR0FBWCxXQUFXLENBQWlCO1FBQW1CLGlCQUFZLEdBQVosWUFBWSxDQUFnQjtRQXZCMUs7O1dBRUc7UUFDSSxVQUFLLEdBQTJCLElBQUksQ0FBQyxZQUFZLENBQUMsUUFBUSxFQUFFLENBQUMsSUFBSSxDQUNwRSxHQUFHLENBQUMsQ0FBQyxJQUFzQixFQUFFLEVBQUUsQ0FDM0IsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsQ0FBQztZQUNoQixJQUFJLEVBQUUsSUFBSSxDQUFDLElBQUk7WUFDZixJQUFJLEVBQUUsSUFBSSxDQUFDLFdBQVcsQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDO1lBQ3hDLFdBQVcsRUFBRSxJQUFJLENBQUMsV0FBVyxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUM7WUFDL0MsU0FBUyxFQUFFLElBQUksQ0FBQyxTQUFTO1lBQ3pCLEVBQUUsRUFBRSxJQUFJLENBQUMsRUFBRTtZQUNYLElBQUksRUFBRSxJQUFJLENBQUMsSUFBSTtTQUNsQixDQUFDLENBQUMsQ0FDTixDQUNKLENBQUM7SUFTMkssQ0FBQzs7dUhBeEJySywwQkFBMEIsa0JBd0JSLGdCQUFnQjsyR0F4QmxDLDBCQUEwQixpREFQeEI7UUFDUDtZQUNJLE9BQU8sRUFBRSxlQUFlO1lBQ3hCLFFBQVEsRUFBRSxpQkFBaUI7U0FDOUI7S0FDSiwwQkNwQkwsNitDQXVDQTsyRkRqQmEsMEJBQTBCO2tCQVh0QyxTQUFTOytCQUNJLHdCQUF3QixtQkFFakIsdUJBQXVCLENBQUMsTUFBTSxhQUNwQzt3QkFDUDs0QkFDSSxPQUFPLEVBQUUsZUFBZTs0QkFDeEIsUUFBUSxFQUFFLGlCQUFpQjt5QkFDOUI7cUJBQ0o7OzBCQTBCbUIsTUFBTTsyQkFBQyxnQkFBZ0IiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSwgQ29tcG9uZW50LCBJbmplY3QgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IFRVSV9UUkVFX0xPQURJTkcsIFRVSV9UUkVFX0xPQURFUiB9IGZyb20gJ0B0YWlnYS11aS9raXQnO1xuaW1wb3J0IHsgU2NEb2N1bWVudEluZm8sIFNjRmlsZXNTZXJ2aWNlIH0gZnJvbSAnQHNuYWJjZW50ci9jbGllbnQtY29yZSc7XG5pbXBvcnQgeyBPYnNlcnZhYmxlLCBtYXAgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IFRyZWVJY29uU2VydmljZSB9IGZyb20gJy4vc2VydmljZXMvdHJlZS1pY29uLnNlcnZpY2UnO1xuaW1wb3J0IHsgVHJlZUxvYWRlclNlcnZpY2UgfSBmcm9tICcuL3NlcnZpY2VzL3RyZWUtbG9hZGVyLnNlcnZpY2UnO1xuaW1wb3J0IHsgVHJlZU5vZGUgfSBmcm9tICcuL2ludGVyZmFjZXMvdHJlZS1ub2RlJztcblxuLyoqXG4gKiDQmtC+0LzQv9C+0L3QtdC90YIg0YTQsNC50LvQvtCyINC4INC00L7QutGD0LzQtdC90YLQvtCyLlxuICovXG5AQ29tcG9uZW50KHtcbiAgICBzZWxlY3RvcjogJ3NjLWZpbGVzLWFuZC1kb2N1bWVudHMnLFxuICAgIHRlbXBsYXRlVXJsOiAnLi9maWxlcy1hbmQtZG9jdW1lbnRzLmNvbXBvbmVudC5odG1sJyxcbiAgICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbiAgICBwcm92aWRlcnM6IFtcbiAgICAgICAge1xuICAgICAgICAgICAgcHJvdmlkZTogVFVJX1RSRUVfTE9BREVSLFxuICAgICAgICAgICAgdXNlQ2xhc3M6IFRyZWVMb2FkZXJTZXJ2aWNlXG4gICAgICAgIH1cbiAgICBdXG59KVxuZXhwb3J0IGNsYXNzIEZpbGVzQW5kRG9jdW1lbnRzQ29tcG9uZW50IHtcbiAgICAvKipcbiAgICAgKiDQlNCw0L3QvdGL0LUg0LLQuNC30YPQsNC70LjQt9Cw0YbQuNC4INC4INC40YUg0L3QsNGH0LDQu9GM0L3QvtC1INC/0L7Qu9GD0YfQtdC90LjQtS5cbiAgICAgKi9cbiAgICBwdWJsaWMgZGF0YSQ6IE9ic2VydmFibGU8VHJlZU5vZGVbXT4gPSB0aGlzLmZpbGVzU2VydmljZS5nZXRGaWxlcygpLnBpcGUoXG4gICAgICAgIG1hcCgoZGF0YTogU2NEb2N1bWVudEluZm9bXSkgPT5cbiAgICAgICAgICAgIGRhdGEubWFwKChpdGVtKSA9PiAoe1xuICAgICAgICAgICAgICAgIHRleHQ6IGl0ZW0ubmFtZSxcbiAgICAgICAgICAgICAgICBpY29uOiB0aGlzLmljb25TZXJ2aWNlLmdldEljb25OYW1lKGl0ZW0pLFxuICAgICAgICAgICAgICAgIGhhc0NoaWxkcmVuOiB0aGlzLmljb25TZXJ2aWNlLmhhc0NoaWxkcmVuKGl0ZW0pLFxuICAgICAgICAgICAgICAgIGNyZWF0ZWRBdDogaXRlbS5jcmVhdGVkQXQsXG4gICAgICAgICAgICAgICAgaWQ6IGl0ZW0uaWQsXG4gICAgICAgICAgICAgICAgbGluazogaXRlbS5saW5rXG4gICAgICAgICAgICB9KSlcbiAgICAgICAgKVxuICAgICk7XG5cbiAgICAvKipcbiAgICAgKiDQmNC90LjRhtC40LDQu9C40LfQuNGA0YPQtdGCINGN0LrQt9C10LzQv9C70Y/RgCDQutC70LDRgdGB0LAge0BsaW5rIEZpbGVzQW5kRG9jdW1lbnRzQ29tcG9uZW50fS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBsb2FkaW5nINCe0LHRitC10LrRgiDQvtGC0LLQtdGH0LDRjtGJ0LjQuSDQt9CwINC30L3QsNGH0L7QuiDQt9Cw0LPRgNGD0LfQutC4LCDQsiDQvNC+0LzQtdC90YIg0YDQsNGB0LrRgNGL0YLQuNGPINGN0LvQtdC80LXQvdGC0LAg0LTQtdGA0LXQstCwLlxuICAgICAqIEBwYXJhbSBpY29uU2VydmljZSDQodC10YDQstC40YEg0LTQu9GPINC+0L/RgNC10LTQtdC70LXQvdC40Y8g0Lgg0L3QsNC30L3QsNGH0LXQvdC40Y8g0LfQvdCw0YfQutCwINGN0LvQtdC80LXQvdGC0YMg0LTQtdGA0LXQstCwLlxuICAgICAqIEBwYXJhbSBmaWxlc1NlcnZpY2Ug0KHQtdGA0LLQuNGBINC00LvRjyDQt9Cw0LPRgNGD0LfQutC4INGE0LDQudC70L7Qsi5cbiAgICAgKi9cbiAgICBwdWJsaWMgY29uc3RydWN0b3IoQEluamVjdChUVUlfVFJFRV9MT0FESU5HKSBwdWJsaWMgcmVhZG9ubHkgbG9hZGluZzogdW5rbm93biwgcHVibGljIHJlYWRvbmx5IGljb25TZXJ2aWNlOiBUcmVlSWNvblNlcnZpY2UsIHByaXZhdGUgcmVhZG9ubHkgZmlsZXNTZXJ2aWNlOiBTY0ZpbGVzU2VydmljZSkge31cbn1cbiIsIjxuZy1jb250YWluZXIgKm5nSWY9XCJkYXRhJCB8IGFzeW5jIGFzIGRhdGE7IGVsc2Ugc2tlbGV0b25cIj5cbiAgICA8dHVpLXRyZWVcbiAgICAgICAgKm5nRm9yPVwibGV0IG5vZGUgb2YgZGF0YVwiXG4gICAgICAgICN0cmVlPVwic2NUcmVlXCJcbiAgICAgICAgc2NUcmVlXG4gICAgICAgIFtzY1RvcE5vZGVUZXh0XT1cIm5vZGUudGV4dFwiXG4gICAgICAgIFtzY1RvcE5vZGVJY29uXT1cIm5vZGUuaWNvblwiXG4gICAgICAgIFtzY1RvcE5vZGVMaW5rXT1cIm5vZGUubGlua1wiXG4gICAgICAgIFtzY1RvcE5vZGVDaGlsZHNdPVwibm9kZS5oYXNDaGlsZHJlblwiXG4gICAgICAgIFtzY1RvcE5vZGVQYXJlbnRdPVwibm9kZS5pZFwiXG4gICAgICAgIFtzY1RvcE5vZGVEYXRlXT1cIm5vZGUuY3JlYXRlZEF0XCJcbiAgICAgICAgW2NoaWxkcmVuSGFuZGxlcl09XCJ0cmVlLmNoaWxkcmVuSGFuZGxlclwiXG4gICAgICAgIFtjb250ZW50XT1cImNvbnRlbnRcIlxuICAgICAgICBbbWFwXT1cInRyZWUubWFwXCJcbiAgICAgICAgW3R1aVRyZWVDb250cm9sbGVyXT1cImZhbHNlXCJcbiAgICAgICAgW3ZhbHVlXT1cInRyZWUuc2VydmljZS5kYXRhJCB8IGFzeW5jXCJcbiAgICAgICAgKHRvZ2dsZWQpPVwidHJlZS5vblRvZ2dsZWQoJGV2ZW50KVwiXG4gICAgICAgIGNsYXNzPVwib3ZlcmZsb3ctaGlkZGVuXCJcbiAgICA+PC90dWktdHJlZT5cbjwvbmctY29udGFpbmVyPlxuXG48bmctdGVtcGxhdGUgI2NvbnRlbnQgbGV0LWl0ZW0+XG4gICAgPHR1aS1sb2FkZXIgKm5nSWY9XCJpdGVtID09PSBsb2FkaW5nOyBlbHNlIHRleHRcIiBjbGFzcz1cInctOCBteS00XCI+PC90dWktbG9hZGVyPlxuICAgIDxuZy10ZW1wbGF0ZSAjdGV4dD5cbiAgICAgICAgPHR1aS1zdmcgW3NyY109XCJpdGVtLmljb25cIiBjbGFzcz1cInR1aS1zcGFjZV9yaWdodC0yXCI+PC90dWktc3ZnPlxuICAgICAgICA8YSB0dWlMaW5rIFtwc2V1ZG9dPVwidHJ1ZVwiICpuZ0lmPVwiaXRlbS5saW5rXCIgaHJlZj1cInt7IGl0ZW0ubGluayB9fVwiIGNsYXNzPVwiZ3Jvd1wiPnt7IGl0ZW0udGV4dCB9fTwvYT5cbiAgICAgICAgPHAgKm5nSWY9XCIhaXRlbS5saW5rXCIgY2xhc3M9XCJncm93XCI+e3sgaXRlbS50ZXh0IH19PC9wPlxuICAgICAgICA8cD57eyBpdGVtLmNyZWF0ZWRBdCB9fTwvcD5cbiAgICA8L25nLXRlbXBsYXRlPlxuPC9uZy10ZW1wbGF0ZT5cblxuPG5nLXRlbXBsYXRlICNza2VsZXRvbj5cbiAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LWNvbCBnYXAtMlwiPlxuICAgICAgICA8ZGl2ICpuZ0Zvcj1cImxldCBfIG9mIFtdLmNvbnN0cnVjdG9yKDcpXCIgY2xhc3M9XCJmbGV4IGl0ZW1zLWNlbnRlciBnYXAtMlwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInR1aS1za2VsZXRvbiBoLTYgdy02XCI+PC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwidHVpLXNrZWxldG9uIGgtNCB3LTQwXCI+PC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuPC9uZy10ZW1wbGF0ZT5cbiJdfQ==