ngx-techlify-core 11.3.2 → 11.3.3
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/bundles/ngx-techlify-core.umd.js +572 -4
- package/bundles/ngx-techlify-core.umd.js.map +1 -1
- package/bundles/ngx-techlify-core.umd.min.js +2 -2
- package/bundles/ngx-techlify-core.umd.min.js.map +1 -1
- package/esm2015/lib/techlify-tagger-tag-form-field/techlify-tagger-tag-form-config.model.js +15 -0
- package/esm2015/lib/techlify-tagger-tag-form-field/techlify-tagger-tag-form-field.component.js +269 -0
- package/esm2015/lib/techlify-tagger-tag-form-field/techlify-tagger-tag-form-field.module.js +25 -0
- package/esm2015/lib/techlify-tagger-tag-selector/techlify-tagger-tag-selector.component.js +168 -0
- package/esm2015/lib/techlify-tagger-tag-selector/techlify-tagger-tag-selector.module.js +29 -0
- package/esm2015/public-api.js +6 -1
- package/fesm2015/ngx-techlify-core.js +472 -2
- package/fesm2015/ngx-techlify-core.js.map +1 -1
- package/lib/techlify-tagger-tag-form-field/techlify-tagger-tag-form-config.model.d.ts +12 -0
- package/lib/techlify-tagger-tag-form-field/techlify-tagger-tag-form-field.component.d.ts +76 -0
- package/lib/techlify-tagger-tag-form-field/techlify-tagger-tag-form-field.module.d.ts +2 -0
- package/lib/techlify-tagger-tag-selector/techlify-tagger-tag-selector.component.d.ts +58 -0
- package/lib/techlify-tagger-tag-selector/techlify-tagger-tag-selector.module.d.ts +2 -0
- package/ngx-techlify-core.metadata.json +1 -1
- package/package.json +1 -1
- package/public-api.d.ts +5 -0
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { COMMA, ENTER } from '@angular/cdk/keycodes';
|
|
2
|
+
export class TechlifyTaggerTagFormConfigModel {
|
|
3
|
+
constructor() {
|
|
4
|
+
this.selectable = true;
|
|
5
|
+
this.removable = true;
|
|
6
|
+
this.separatorKeysCodes = [ENTER, COMMA];
|
|
7
|
+
this.placeholder = 'New Tag..';
|
|
8
|
+
this.apiUrl = 'api/techlify-tagger-tags';
|
|
9
|
+
this.createApiUrl = 'api/techlify-tagger-tags';
|
|
10
|
+
this.isCreateable = true;
|
|
11
|
+
this.isCacheTags = false;
|
|
12
|
+
this.isSingle = false;
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVjaGxpZnktdGFnZ2VyLXRhZy1mb3JtLWNvbmZpZy5tb2RlbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25neC10ZWNobGlmeS1jb3JlL3NyYy9saWIvdGVjaGxpZnktdGFnZ2VyLXRhZy1mb3JtLWZpZWxkL3RlY2hsaWZ5LXRhZ2dlci10YWctZm9ybS1jb25maWcubW9kZWwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUVyRCxNQUFNLE9BQU8sZ0NBQWdDO0lBV3pDO1FBQ0ksSUFBSSxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUM7UUFDdkIsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUM7UUFDdEIsSUFBSSxDQUFDLGtCQUFrQixHQUFHLENBQUMsS0FBSyxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBQ3pDLElBQUksQ0FBQyxXQUFXLEdBQUcsV0FBVyxDQUFDO1FBQy9CLElBQUksQ0FBQyxNQUFNLEdBQUcsMEJBQTBCLENBQUM7UUFDekMsSUFBSSxDQUFDLFlBQVksR0FBRywwQkFBMEIsQ0FBQztRQUMvQyxJQUFJLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQztRQUN6QixJQUFJLENBQUMsV0FBVyxHQUFHLEtBQUssQ0FBQztRQUN6QixJQUFJLENBQUMsUUFBUSxHQUFHLEtBQUssQ0FBQztJQUMxQixDQUFDO0NBQ0oiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDT01NQSwgRU5URVIgfSBmcm9tICdAYW5ndWxhci9jZGsva2V5Y29kZXMnO1xuXG5leHBvcnQgY2xhc3MgVGVjaGxpZnlUYWdnZXJUYWdGb3JtQ29uZmlnTW9kZWwge1xuICAgIHNlbGVjdGFibGU6IGJvb2xlYW47XG4gICAgcmVtb3ZhYmxlOiBib29sZWFuO1xuICAgIHNlcGFyYXRvcktleXNDb2RlczogbnVtYmVyW107XG4gICAgcGxhY2Vob2xkZXI6IHN0cmluZztcbiAgICBhcGlVcmw6IHN0cmluZztcbiAgICBpc0NyZWF0ZWFibGU6IGJvb2xlYW47XG4gICAgY3JlYXRlQXBpVXJsOiBzdHJpbmc7XG4gICAgaXNDYWNoZVRhZ3M6IGJvb2xlYW47XG4gICAgaXNTaW5nbGU6IGJvb2xlYW47XG5cbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgdGhpcy5zZWxlY3RhYmxlID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5yZW1vdmFibGUgPSB0cnVlO1xuICAgICAgICB0aGlzLnNlcGFyYXRvcktleXNDb2RlcyA9IFtFTlRFUiwgQ09NTUFdO1xuICAgICAgICB0aGlzLnBsYWNlaG9sZGVyID0gJ05ldyBUYWcuLic7XG4gICAgICAgIHRoaXMuYXBpVXJsID0gJ2FwaS90ZWNobGlmeS10YWdnZXItdGFncyc7XG4gICAgICAgIHRoaXMuY3JlYXRlQXBpVXJsID0gJ2FwaS90ZWNobGlmeS10YWdnZXItdGFncyc7XG4gICAgICAgIHRoaXMuaXNDcmVhdGVhYmxlID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5pc0NhY2hlVGFncyA9IGZhbHNlO1xuICAgICAgICB0aGlzLmlzU2luZ2xlID0gZmFsc2U7XG4gICAgfVxufSJdfQ==
|
package/esm2015/lib/techlify-tagger-tag-form-field/techlify-tagger-tag-form-field.component.js
ADDED
|
@@ -0,0 +1,269 @@
|
|
|
1
|
+
var TechlifyTaggerTagFormFieldComponent_1;
|
|
2
|
+
import { __awaiter, __decorate } from "tslib";
|
|
3
|
+
import { FocusMonitor } from '@angular/cdk/a11y';
|
|
4
|
+
import { coerceBooleanProperty } from '@angular/cdk/coercion';
|
|
5
|
+
import { Component, ElementRef, ViewChild, Input, Inject, Optional, Self } from '@angular/core';
|
|
6
|
+
import { FormControl, NgControl } from '@angular/forms';
|
|
7
|
+
import { MatFormField, MatFormFieldControl, MAT_FORM_FIELD } from '@angular/material/form-field';
|
|
8
|
+
import { UntilDestroy, untilDestroyed } from '@ngneat/until-destroy';
|
|
9
|
+
import { Subject } from 'rxjs';
|
|
10
|
+
import { debounceTime } from 'rxjs/operators';
|
|
11
|
+
import { HttpService } from '../core/http.service';
|
|
12
|
+
import { TechlifyTaggerTagFormConfigModel } from './techlify-tagger-tag-form-config.model';
|
|
13
|
+
let TechlifyTaggerTagFormFieldComponent = TechlifyTaggerTagFormFieldComponent_1 = class TechlifyTaggerTagFormFieldComponent {
|
|
14
|
+
constructor(_focusMonitor, _elementRef, httpService, _formField, ngControl) {
|
|
15
|
+
this._focusMonitor = _focusMonitor;
|
|
16
|
+
this._elementRef = _elementRef;
|
|
17
|
+
this.httpService = httpService;
|
|
18
|
+
this._formField = _formField;
|
|
19
|
+
this.ngControl = ngControl;
|
|
20
|
+
this.stateChanges = new Subject();
|
|
21
|
+
this.focused = false;
|
|
22
|
+
this.controlType = 'techlify-tagger-form-field';
|
|
23
|
+
this.id = `techlify-tagger-form-field-${TechlifyTaggerTagFormFieldComponent_1.nextId++}`;
|
|
24
|
+
this.onChange = (_) => { };
|
|
25
|
+
this.onTouched = () => { };
|
|
26
|
+
this.tagInputCtrl = new FormControl();
|
|
27
|
+
/**Pass the configuration for Techlify Tagger */
|
|
28
|
+
this.config = new TechlifyTaggerTagFormConfigModel();
|
|
29
|
+
/**Pass the default list of tags */
|
|
30
|
+
this._allTags = [];
|
|
31
|
+
/**Pass the Categories to filter for a model */
|
|
32
|
+
this.categories = [];
|
|
33
|
+
this._required = false;
|
|
34
|
+
this._disabled = false;
|
|
35
|
+
this._value = [];
|
|
36
|
+
this.tagInputCtrl.valueChanges
|
|
37
|
+
.subscribe(filterValue => {
|
|
38
|
+
this.filterString = filterValue;
|
|
39
|
+
});
|
|
40
|
+
//Set Focus Monitor
|
|
41
|
+
_focusMonitor.monitor(_elementRef, true).subscribe(origin => {
|
|
42
|
+
if (this.focused && !origin) {
|
|
43
|
+
this.onTouched();
|
|
44
|
+
}
|
|
45
|
+
this.focused = !!origin;
|
|
46
|
+
this.stateChanges.next();
|
|
47
|
+
});
|
|
48
|
+
if (this.ngControl != null) {
|
|
49
|
+
this.ngControl.valueAccessor = this;
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
get allTags() {
|
|
53
|
+
return this._allTags;
|
|
54
|
+
}
|
|
55
|
+
set allTags(value) {
|
|
56
|
+
this._allTags = value;
|
|
57
|
+
}
|
|
58
|
+
get tags() {
|
|
59
|
+
return this.allTags.filter(x => this.value.some(y => y == x.id));
|
|
60
|
+
}
|
|
61
|
+
//Default Getter and Setters for a Form Field Implementation
|
|
62
|
+
get empty() {
|
|
63
|
+
return this.value.length == 0;
|
|
64
|
+
}
|
|
65
|
+
get shouldLabelFloat() {
|
|
66
|
+
return this.focused || !this.empty || this.tagInputCtrl.value;
|
|
67
|
+
}
|
|
68
|
+
get required() {
|
|
69
|
+
return this._required;
|
|
70
|
+
}
|
|
71
|
+
set required(value) {
|
|
72
|
+
this._required = coerceBooleanProperty(value);
|
|
73
|
+
this.stateChanges.next();
|
|
74
|
+
}
|
|
75
|
+
get disabled() {
|
|
76
|
+
return this._disabled;
|
|
77
|
+
}
|
|
78
|
+
set disabled(value) {
|
|
79
|
+
this._disabled = coerceBooleanProperty(value);
|
|
80
|
+
this._disabled ? this.tagInputCtrl.disable() : this.tagInputCtrl.enable();
|
|
81
|
+
this.stateChanges.next();
|
|
82
|
+
}
|
|
83
|
+
get value() {
|
|
84
|
+
return this._value;
|
|
85
|
+
}
|
|
86
|
+
set value(tagIds) {
|
|
87
|
+
this._value = tagIds || [];
|
|
88
|
+
this.stateChanges.next();
|
|
89
|
+
}
|
|
90
|
+
get errorState() {
|
|
91
|
+
return this.tagInputCtrl.dirty && this.required && (this.value.length == 0);
|
|
92
|
+
}
|
|
93
|
+
get placeholder() {
|
|
94
|
+
return this._placeholder;
|
|
95
|
+
}
|
|
96
|
+
set placeholder(value) {
|
|
97
|
+
this._placeholder = value;
|
|
98
|
+
this.stateChanges.next();
|
|
99
|
+
}
|
|
100
|
+
ngOnInit() {
|
|
101
|
+
}
|
|
102
|
+
ngOnChanges(changes) {
|
|
103
|
+
//API to load all tags for the model type
|
|
104
|
+
if (this.allTags.length == 0) {
|
|
105
|
+
this.httpService
|
|
106
|
+
.cache(!this.config.isCacheTags)
|
|
107
|
+
.get(this.config.apiUrl, {
|
|
108
|
+
params: {
|
|
109
|
+
categories: this.categories.join(','),
|
|
110
|
+
perPage: '1000'
|
|
111
|
+
}
|
|
112
|
+
}).pipe(debounceTime(500), untilDestroyed(this)).subscribe((result) => {
|
|
113
|
+
this.allTags = result.data;
|
|
114
|
+
});
|
|
115
|
+
}
|
|
116
|
+
//API to load only the selected tags for the model
|
|
117
|
+
if (this.modelId && this.value.length == 0) {
|
|
118
|
+
//Model Id is passed and no tags are present, so we query db for the avilable tags for the model ID.
|
|
119
|
+
this.httpService
|
|
120
|
+
.cache(!this.config.isCacheTags)
|
|
121
|
+
.get(this.config.apiUrl, {
|
|
122
|
+
params: {
|
|
123
|
+
categories: this.categories.join(','),
|
|
124
|
+
model_type: this.modelType,
|
|
125
|
+
model_id: this.modelId,
|
|
126
|
+
perPage: '1000'
|
|
127
|
+
}
|
|
128
|
+
}).pipe(debounceTime(500), untilDestroyed(this)).subscribe((result) => {
|
|
129
|
+
this.value = ((result === null || result === void 0 ? void 0 : result.data) || []).map((x) => x.id);
|
|
130
|
+
this._handleInput();
|
|
131
|
+
});
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
init() {
|
|
135
|
+
if (this.modelId && this.allTags.length == 0) {
|
|
136
|
+
//Model Id is passed and no tags are passed, so we query db for the avilable tags for the model ID.
|
|
137
|
+
this.httpService
|
|
138
|
+
.cache(!this.config.isCacheTags)
|
|
139
|
+
.get(this.config.apiUrl, {
|
|
140
|
+
params: {
|
|
141
|
+
categories: this.categories.join(','),
|
|
142
|
+
model_type: this.modelType,
|
|
143
|
+
model_id: this.modelId
|
|
144
|
+
}
|
|
145
|
+
}).pipe(untilDestroyed(this)).subscribe((result) => {
|
|
146
|
+
this.allTags = result.data;
|
|
147
|
+
});
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
get filteredTags() {
|
|
151
|
+
return this._filter();
|
|
152
|
+
}
|
|
153
|
+
setDescribedByIds(ids) {
|
|
154
|
+
// Just a empty implementation for Mat Form Field Interface
|
|
155
|
+
}
|
|
156
|
+
onContainerClick() {
|
|
157
|
+
// Just a empty implementation for Mat Form Field Interface
|
|
158
|
+
}
|
|
159
|
+
add(event) {
|
|
160
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
161
|
+
const value = (event.value || '').trim();
|
|
162
|
+
// Add our tag
|
|
163
|
+
// Validate for single mode
|
|
164
|
+
if (!this.config.isSingle || (this.value.length === 0)) {
|
|
165
|
+
if (value && this.config.isCreateable) {
|
|
166
|
+
const tags = this.allTags;
|
|
167
|
+
let tag = tags.find((item) => item.title.toLowerCase() == value.toLowerCase());
|
|
168
|
+
if (!tag) {
|
|
169
|
+
//No tag present in the list
|
|
170
|
+
try {
|
|
171
|
+
const result = yield this.httpService.post(this.config.createApiUrl, {
|
|
172
|
+
title: value,
|
|
173
|
+
description: value,
|
|
174
|
+
category_title: (this.categories.length > 0) ? (this.defaultCreateCategory ? this.defaultCreateCategory : this.categories[0]) : ''
|
|
175
|
+
}).toPromise();
|
|
176
|
+
tag = result.item;
|
|
177
|
+
}
|
|
178
|
+
catch (error) {
|
|
179
|
+
return;
|
|
180
|
+
}
|
|
181
|
+
this.allTags.push(tag);
|
|
182
|
+
}
|
|
183
|
+
else {
|
|
184
|
+
//Optionally clean the existing value, to avoid duplicate
|
|
185
|
+
this.remove(tag);
|
|
186
|
+
}
|
|
187
|
+
this.value.push(tag.id);
|
|
188
|
+
this._handleInput();
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
// Clear the input value
|
|
192
|
+
event.input.value = '';
|
|
193
|
+
this.tagInputCtrl.setValue(null);
|
|
194
|
+
});
|
|
195
|
+
}
|
|
196
|
+
remove(tag) {
|
|
197
|
+
this.value = this.value.filter(x => x !== tag.id);
|
|
198
|
+
this._handleInput();
|
|
199
|
+
}
|
|
200
|
+
selected(event) {
|
|
201
|
+
// Validate for single mode
|
|
202
|
+
if (!this.config.isSingle || (this.value.length === 0)) {
|
|
203
|
+
//Clean the existing value, to avoid duplicate
|
|
204
|
+
this.remove({ id: event.option.value });
|
|
205
|
+
this.value.push(event.option.value);
|
|
206
|
+
this._handleInput();
|
|
207
|
+
}
|
|
208
|
+
this.tagInput.nativeElement.value = '';
|
|
209
|
+
this.tagInputCtrl.setValue(null);
|
|
210
|
+
}
|
|
211
|
+
_filter() {
|
|
212
|
+
const filterValue = this.filterString ? this.filterString.toString().toLowerCase() : null;
|
|
213
|
+
const availableTags = this.allTags.filter((tag) => !this.value.some((item) => item == tag.id));
|
|
214
|
+
return filterValue ? availableTags.filter((tag) => tag.title.toLowerCase().includes(filterValue)) : availableTags;
|
|
215
|
+
}
|
|
216
|
+
writeValue(tagIds) {
|
|
217
|
+
this.value = tagIds || [];
|
|
218
|
+
}
|
|
219
|
+
registerOnChange(fn) {
|
|
220
|
+
this.onChange = fn;
|
|
221
|
+
}
|
|
222
|
+
registerOnTouched(fn) {
|
|
223
|
+
this.onTouched = fn;
|
|
224
|
+
}
|
|
225
|
+
setDisabledState(isDisabled) {
|
|
226
|
+
this.disabled = isDisabled;
|
|
227
|
+
}
|
|
228
|
+
_handleInput() {
|
|
229
|
+
this.onChange(this.value);
|
|
230
|
+
}
|
|
231
|
+
ngOnDestroy() {
|
|
232
|
+
this.stateChanges.complete();
|
|
233
|
+
this._focusMonitor.stopMonitoring(this._elementRef);
|
|
234
|
+
}
|
|
235
|
+
};
|
|
236
|
+
TechlifyTaggerTagFormFieldComponent.nextId = 0;
|
|
237
|
+
TechlifyTaggerTagFormFieldComponent.decorators = [
|
|
238
|
+
{ type: Component, args: [{
|
|
239
|
+
selector: 'app-techlify-tagger-tag-form-field',
|
|
240
|
+
template: "<mat-chip-list #chipList aria-label=\"Tag Selection\">\n <mat-chip *ngFor=\"let tag of tags\" [selectable]=\"config.selectable\" [removable]=\"config.removable\"\n (removed)=\"remove(tag)\">\n {{tag.title}}\n <button matChipRemove *ngIf=\"config.removable\" class=\"border-0\">\n <mat-icon class=\"mat-relative-icon\">cancel</mat-icon>\n </button>\n </mat-chip>\n <input placeholder=\"{{config.isCreateable? config.placeholder:''}}\" #tagInput [formControl]=\"tagInputCtrl\"\n [matAutocomplete]=\"auto\" [matChipInputFor]=\"chipList\"\n [matChipInputSeparatorKeyCodes]=\"config.separatorKeysCodes\" (matChipInputTokenEnd)=\"add($event)\"\n #trigger=\"matAutocompleteTrigger\" (click)=\"trigger.openPanel()\">\n</mat-chip-list>\n<mat-autocomplete #auto=\"matAutocomplete\" (optionSelected)=\"selected($event)\">\n <mat-option *ngFor=\"let tag of filteredTags\" [value]=\"tag.id\">\n {{tag.title}}\n </mat-option>\n</mat-autocomplete>",
|
|
241
|
+
providers: [{ provide: MatFormFieldControl, useExisting: TechlifyTaggerTagFormFieldComponent_1 }],
|
|
242
|
+
styles: [".mat-relative-icon{font-size:20px;position:relative;right:7px;top:-3px}"]
|
|
243
|
+
},] }
|
|
244
|
+
];
|
|
245
|
+
TechlifyTaggerTagFormFieldComponent.ctorParameters = () => [
|
|
246
|
+
{ type: FocusMonitor },
|
|
247
|
+
{ type: ElementRef },
|
|
248
|
+
{ type: HttpService },
|
|
249
|
+
{ type: MatFormField, decorators: [{ type: Optional }, { type: Inject, args: [MAT_FORM_FIELD,] }] },
|
|
250
|
+
{ type: NgControl, decorators: [{ type: Optional }, { type: Self }] }
|
|
251
|
+
];
|
|
252
|
+
TechlifyTaggerTagFormFieldComponent.propDecorators = {
|
|
253
|
+
tagInput: [{ type: ViewChild, args: ['tagInput',] }],
|
|
254
|
+
config: [{ type: Input }],
|
|
255
|
+
modelType: [{ type: Input }],
|
|
256
|
+
modelId: [{ type: Input }],
|
|
257
|
+
allTags: [{ type: Input }],
|
|
258
|
+
categories: [{ type: Input }],
|
|
259
|
+
defaultCreateCategory: [{ type: Input }],
|
|
260
|
+
required: [{ type: Input }],
|
|
261
|
+
disabled: [{ type: Input }],
|
|
262
|
+
value: [{ type: Input }],
|
|
263
|
+
placeholder: [{ type: Input }]
|
|
264
|
+
};
|
|
265
|
+
TechlifyTaggerTagFormFieldComponent = TechlifyTaggerTagFormFieldComponent_1 = __decorate([
|
|
266
|
+
UntilDestroy()
|
|
267
|
+
], TechlifyTaggerTagFormFieldComponent);
|
|
268
|
+
export { TechlifyTaggerTagFormFieldComponent };
|
|
269
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVjaGxpZnktdGFnZ2VyLXRhZy1mb3JtLWZpZWxkLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25neC10ZWNobGlmeS1jb3JlL3NyYy9saWIvdGVjaGxpZnktdGFnZ2VyLXRhZy1mb3JtLWZpZWxkL3RlY2hsaWZ5LXRhZ2dlci10YWctZm9ybS1maWVsZC5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFBQSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFDakQsT0FBTyxFQUFnQixxQkFBcUIsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQzVFLE9BQU8sRUFBRSxTQUFTLEVBQUUsVUFBVSxFQUFFLFNBQVMsRUFBVSxLQUFLLEVBQWEsTUFBTSxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQTRCLE1BQU0sZUFBZSxDQUFDO0FBQzdJLE9BQU8sRUFBd0IsV0FBVyxFQUFFLFNBQVMsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRzlFLE9BQU8sRUFBRSxZQUFZLEVBQUUsbUJBQW1CLEVBQUUsY0FBYyxFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFDakcsT0FBTyxFQUFFLFlBQVksRUFBRSxjQUFjLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUNyRSxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQy9CLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUM5QyxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDbkQsT0FBTyxFQUFFLGdDQUFnQyxFQUFFLE1BQU0seUNBQXlDLENBQUM7SUFTOUUsbUNBQW1DLGlEQUFuQyxtQ0FBbUM7SUFxSzlDLFlBQ1UsYUFBMkIsRUFDM0IsV0FBb0MsRUFDcEMsV0FBd0IsRUFDVyxVQUF3QixFQUN4QyxTQUFvQjtRQUp2QyxrQkFBYSxHQUFiLGFBQWEsQ0FBYztR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QztJQUM1QixDQUFDO0lBS0QsV0FBVztRQUNULElBQUksQ0FBQyxZQUFZLENBQUMsUUFBUSxFQUFFLENBQUM7UUFDN0IsSUFBSSxDQUFDLGFBQWEsQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDO0lBQ3RELENBQUM7Q0FFRixDQUFBO0FBN1JRLDBDQUFNLEdBQUcsQ0FBQyxDQUFDOztZQVJuQixTQUFTLFNBQUM7Z0JBQ1QsUUFBUSxFQUFFLG9DQUFvQztnQkFDOUMsa2dDQUE4RDtnQkFFOUQsU0FBUyxFQUFFLENBQUMsRUFBRSxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsV0FBVyxFQUFFLHFDQUFtQyxFQUFFLENBQUM7O2FBQ2hHOzs7WUFuQlEsWUFBWTtZQUVELFVBQVU7WUFRckIsV0FBVztZQUpYLFlBQVksdUJBdUxoQixRQUFRLFlBQUksTUFBTSxTQUFDLGNBQWM7WUExTE0sU0FBUyx1QkEyTGhELFFBQVEsWUFBSSxJQUFJOzs7dUJBN0psQixTQUFTLFNBQUMsVUFBVTtxQkFHcEIsS0FBSzt3QkFFTCxLQUFLO3NCQUVMLEtBQUs7c0JBSUwsS0FBSzt5QkFTTCxLQUFLO29DQUVMLEtBQUs7dUJBZUwsS0FBSzt1QkFVTCxLQUFLO29CQWFMLEtBQUs7MEJBYUwsS0FBSzs7QUF0RkssbUNBQW1DO0lBUC9DLFlBQVksRUFBRTtHQU9GLG1DQUFtQyxDQStSL0M7U0EvUlksbUNBQW1DIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRm9jdXNNb25pdG9yIH0gZnJvbSAnQGFuZ3VsYXIvY2RrL2ExMXknO1xuaW1wb3J0IHsgQm9vbGVhbklucHV0LCBjb2VyY2VCb29sZWFuUHJvcGVydHkgfSBmcm9tICdAYW5ndWxhci9jZGsvY29lcmNpb24nO1xuaW1wb3J0IHsgQ29tcG9uZW50LCBFbGVtZW50UmVmLCBWaWV3Q2hpbGQsIE9uSW5pdCwgSW5wdXQsIE9uRGVzdHJveSwgSW5qZWN0LCBPcHRpb25hbCwgU2VsZiwgT25DaGFuZ2VzLCBTaW1wbGVDaGFuZ2VzIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBDb250cm9sVmFsdWVBY2Nlc3NvciwgRm9ybUNvbnRyb2wsIE5nQ29udHJvbCB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IE1hdEF1dG9jb21wbGV0ZVNlbGVjdGVkRXZlbnQgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9hdXRvY29tcGxldGUnO1xuaW1wb3J0IHsgTWF0Q2hpcElucHV0RXZlbnQgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9jaGlwcyc7XG5pbXBvcnQgeyBNYXRGb3JtRmllbGQsIE1hdEZvcm1GaWVsZENvbnRyb2wsIE1BVF9GT1JNX0ZJRUxEIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvZm9ybS1maWVsZCc7XG5pbXBvcnQgeyBVbnRpbERlc3Ryb3ksIHVudGlsRGVzdHJveWVkIH0gZnJvbSAnQG5nbmVhdC91bnRpbC1kZXN0cm95JztcbmltcG9ydCB7IFN1YmplY3QgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IGRlYm91bmNlVGltZSB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7IEh0dHBTZXJ2aWNlIH0gZnJvbSAnLi4vY29yZS9odHRwLnNlcnZpY2UnO1xuaW1wb3J0IHsgVGVjaGxpZnlUYWdnZXJUYWdGb3JtQ29uZmlnTW9kZWwgfSBmcm9tICcuL3RlY2hsaWZ5LXRhZ2dlci10YWctZm9ybS1jb25maWcubW9kZWwnO1xuXG5AVW50aWxEZXN0cm95KClcbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2FwcC10ZWNobGlmeS10YWdnZXItdGFnLWZvcm0tZmllbGQnLFxuICB0ZW1wbGF0ZVVybDogJy4vdGVjaGxpZnktdGFnZ2VyLXRhZy1mb3JtLWZpZWxkLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vdGVjaGxpZnktdGFnZ2VyLXRhZy1mb3JtLWZpZWxkLmNvbXBvbmVudC5zY3NzJ10sXG4gIHByb3ZpZGVyczogW3sgcHJvdmlkZTogTWF0Rm9ybUZpZWxkQ29udHJvbCwgdXNlRXhpc3Rpbmc6IFRlY2hsaWZ5VGFnZ2VyVGFnRm9ybUZpZWxkQ29tcG9uZW50IH1dLFxufSlcbmV4cG9ydCBjbGFzcyBUZWNobGlmeVRhZ2dlclRhZ0Zvcm1GaWVsZENvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgQ29udHJvbFZhbHVlQWNjZXNzb3IsIE1hdEZvcm1GaWVsZENvbnRyb2w8YW55PiwgT25EZXN0cm95LCBPbkNoYW5nZXMge1xuXG4gIHN0YXRpYyBuZXh0SWQgPSAwO1xuICBzdGF0ZUNoYW5nZXMgPSBuZXcgU3ViamVjdDx2b2lkPigpO1xuICBmb2N1c2VkID0gZmFsc2U7XG4gIGNvbnRyb2xUeXBlID0gJ3RlY2hsaWZ5LXRhZ2dlci1mb3JtLWZpZWxkJztcbiAgaWQgPSBgdGVjaGxpZnktdGFnZ2VyLWZvcm0tZmllbGQtJHtUZWNobGlmeVRhZ2dlclRhZ0Zvcm1GaWVsZENvbXBvbmVudC5uZXh0SWQrK31gO1xuXG4gIG9uQ2hhbmdlID0gKF86IGFueSkgPT4geyB9O1xuICBvblRvdWNoZWQgPSAoKSA9PiB7IH07XG5cbiAgdGFnSW5wdXRDdHJsID0gbmV3IEZvcm1Db250cm9sKCk7XG4gIGZpbHRlclN0cmluZzogYW55O1xuICBAVmlld0NoaWxkKCd0YWdJbnB1dCcpIHRhZ0lucHV0OiBFbGVtZW50UmVmPEhUTUxJbnB1dEVsZW1lbnQ+O1xuXG4gIC8qKlBhc3MgdGhlIGNvbmZpZ3VyYXRpb24gZm9yIFRlY2hsaWZ5IFRhZ2dlciAqL1xuICBASW5wdXQoKSBjb25maWc6IFRlY2hsaWZ5VGFnZ2VyVGFnRm9ybUNvbmZpZ01vZGVsID0gbmV3IFRlY2hsaWZ5VGFnZ2VyVGFnRm9ybUNvbmZpZ01vZGVsKCk7XG4gIC8qKlBhc3MgdGhlIE1vZGVsIFR5cGUgZm9yIFRlY2hsaWZ5IFRhZ2dlciwgUmVxdWlyZWQgKi9cbiAgQElucHV0KCkgbW9kZWxUeXBlITogc3RyaW5nO1xuICAvKipQYXNzIHRoZSBNb2RlbCBJRCBmb3IgVGVjaGxpZnkgVGFnZ2VyICovXG4gIEBJbnB1dCgpIG1vZGVsSWQ6IHN0cmluZztcblxuICAvKipQYXNzIHRoZSBkZWZhdWx0IGxpc3Qgb2YgdGFncyAqL1xuICBwcml2YXRlIF9hbGxUYWdzOiBhbnlbXSA9IFtdO1xuICBASW5wdXQoKVxuICBnZXQgYWxsVGFncygpIHtcbiAgICByZXR1cm4gdGhpcy5fYWxsVGFncztcbiAgfVxuICBzZXQgYWxsVGFncyh2YWx1ZSkge1xuICAgIHRoaXMuX2FsbFRhZ3MgPSB2YWx1ZTtcbiAgfVxuXG4gIC8qKlBhc3MgdGhlIENhdGVnb3JpZXMgdG8gZmlsdGVyIGZvciBhIG1vZGVsICovXG4gIEBJbnB1dCgpIGNhdGVnb3JpZXM6IHN0cmluZ1tdID0gW107XG4gIC8qKlBhc3MgZGVmYXVsdCBjYXRlZ29yeSB0byBiZSB1c2VkIGZvciBhc3NpZ25pbmcgdGhlIHRhZ3MsIHdoZW4gd2UgZmlsdGVyIGJ5IG1vcmUgdGhhbiBvbmUgY2F0ZWdvcnkgKi9cbiAgQElucHV0KCkgZGVmYXVsdENyZWF0ZUNhdGVnb3J5OiBzdHJpbmc7XG5cbiAgZ2V0IHRhZ3MoKSB7XG4gICAgcmV0dXJuIHRoaXMuYWxsVGFncy5maWx0ZXIoeCA9PiB0aGlzLnZhbHVlLnNvbWUoeSA9PiB5ID09IHguaWQpKTtcbiAgfVxuXG4gIC8vRGVmYXVsdCBHZXR0ZXIgYW5kIFNldHRlcnMgZm9yIGEgRm9ybSBGaWVsZCBJbXBsZW1lbnRhdGlvblxuICBnZXQgZW1wdHkoKSB7XG4gICAgcmV0dXJuIHRoaXMudmFsdWUubGVuZ3RoID09IDA7XG4gIH1cblxuICBnZXQgc2hvdWxkTGFiZWxGbG9hdCgpIHtcbiAgICByZXR1cm4gdGhpcy5mb2N1c2VkIHx8ICF0aGlzLmVtcHR5IHx8IHRoaXMudGFnSW5wdXRDdHJsLnZhbHVlO1xuICB9XG5cbiAgQElucHV0KClcbiAgZ2V0IHJlcXVpcmVkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9yZXF1aXJlZDtcbiAgfVxuICBzZXQgcmVxdWlyZWQodmFsdWU6IGJvb2xlYW4pIHtcbiAgICB0aGlzLl9yZXF1aXJlZCA9IGNvZXJjZUJvb2xlYW5Qcm9wZXJ0eSh2YWx1ZSk7XG4gICAgdGhpcy5zdGF0ZUNoYW5nZXMubmV4dCgpO1xuICB9XG4gIHByaXZhdGUgX3JlcXVpcmVkID0gZmFsc2U7XG5cbiAgQElucHV0KClcbiAgZ2V0IGRpc2FibGVkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9kaXNhYmxlZDtcbiAgfVxuICBzZXQgZGlzYWJsZWQodmFsdWU6IGJvb2xlYW4pIHtcbiAgICB0aGlzLl9kaXNhYmxlZCA9IGNvZXJjZUJvb2xlYW5Qcm9wZXJ0eSh2YWx1ZSk7XG4gICAgdGhpcy5fZGlzYWJsZWQgPyB0aGlzLnRhZ0lucHV0Q3RybC5kaXNhYmxlKCkgOiB0aGlzLnRhZ0lucHV0Q3RybC5lbmFibGUoKTtcbiAgICB0aGlzLnN0YXRlQ2hhbmdlcy5uZXh0KCk7XG4gIH1cbiAgcHJpdmF0ZSBfZGlzYWJsZWQgPSBmYWxzZTtcblxuXG4gIHByaXZhdGUgX3ZhbHVlOiBhbnlbXSA9IFtdO1xuICBASW5wdXQoKVxuICBnZXQgdmFsdWUoKTogYW55W10ge1xuICAgIHJldHVybiB0aGlzLl92YWx1ZTtcbiAgfVxuICBzZXQgdmFsdWUodGFnSWRzOiBhbnlbXSkge1xuICAgIHRoaXMuX3ZhbHVlID0gdGFnSWRzIHx8IFtdO1xuICAgIHRoaXMuc3RhdGVDaGFuZ2VzLm5leHQoKTtcbiAgfVxuXG4gIGdldCBlcnJvclN0YXRlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLnRhZ0lucHV0Q3RybC5kaXJ0eSAmJiB0aGlzLnJlcXVpcmVkICYmICh0aGlzLnZhbHVlLmxlbmd0aCA9PSAwKTtcbiAgfVxuXG4gIEBJbnB1dCgpXG4gIGdldCBwbGFjZWhvbGRlcigpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9wbGFjZWhvbGRlcjtcbiAgfVxuICBzZXQgcGxhY2Vob2xkZXIodmFsdWU6IHN0cmluZykge1xuICAgIHRoaXMuX3BsYWNlaG9sZGVyID0gdmFsdWU7XG4gICAgdGhpcy5zdGF0ZUNoYW5nZXMubmV4dCgpO1xuICB9XG4gIHByaXZhdGUgX3BsYWNlaG9sZGVyOiBzdHJpbmc7XG5cblxuICBuZ09uSW5pdCgpOiB2b2lkIHtcblxuICB9XG5cbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcykge1xuXG4gICAgLy9BUEkgdG8gbG9hZCBhbGwgdGFncyBmb3IgdGhlIG1vZGVsIHR5cGVcbiAgICBpZiAodGhpcy5hbGxUYWdzLmxlbmd0aCA9PSAwKSB7XG4gICAgICB0aGlzLmh0dHBTZXJ2aWNlXG4gICAgICAgIC5jYWNoZSghdGhpcy5jb25maWcuaXNDYWNoZVRhZ3MpXG4gICAgICAgIC5nZXQodGhpcy5jb25maWcuYXBpVXJsLCB7XG4gICAgICAgICAgcGFyYW1zOiB7XG4gICAgICAgICAgICBjYXRlZ29yaWVzOiB0aGlzLmNhdGVnb3JpZXMuam9pbignLCcpLFxuICAgICAgICAgICAgcGVyUGFnZTogJzEwMDAnXG4gICAgICAgICAgfVxuICAgICAgICB9KS5waXBlKFxuICAgICAgICAgIGRlYm91bmNlVGltZSg1MDApLFxuICAgICAgICAgIHVudGlsRGVzdHJveWVkKHRoaXMpXG4gICAgICAgICkuc3Vic2NyaWJlKChyZXN1bHQ6IGFueSkgPT4ge1xuICAgICAgICAgIHRoaXMuYWxsVGFncyA9IHJlc3VsdC5kYXRhO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvL0FQSSB0byBsb2FkIG9ubHkgdGhlIHNlbGVjdGVkIHRhZ3MgZm9yIHRoZSBtb2RlbFxuICAgIGlmICh0aGlzLm1vZGVsSWQgJiYgdGhpcy52YWx1ZS5sZW5ndGggPT0gMCkge1xuICAgICAgLy9Nb2RlbCBJZCBpcyBwYXNzZWQgYW5kIG5vIHRhZ3MgYXJlIHByZXNlbnQsIHNvIHdlIHF1ZXJ5IGRiIGZvciB0aGUgYXZpbGFibGUgdGFncyBmb3IgdGhlIG1vZGVsIElELlxuICAgICAgdGhpcy5odHRwU2VydmljZVxuICAgICAgICAuY2FjaGUoIXRoaXMuY29uZmlnLmlzQ2FjaGVUYWdzKVxuICAgICAgICAuZ2V0KHRoaXMuY29uZmlnLmFwaVVybCwge1xuICAgICAgICAgIHBhcmFtczoge1xuICAgICAgICAgICAgY2F0ZWdvcmllczogdGhpcy5jYXRlZ29yaWVzLmpvaW4oJywnKSxcbiAgICAgICAgICAgIG1vZGVsX3R5cGU6IHRoaXMubW9kZWxUeXBlLFxuICAgICAgICAgICAgbW9kZWxfaWQ6IHRoaXMubW9kZWxJZCxcbiAgICAgICAgICAgIHBlclBhZ2U6ICcxMDAwJ1xuICAgICAgICAgIH1cbiAgICAgICAgfSkucGlwZShcbiAgICAgICAgICBkZWJvdW5jZVRpbWUoNTAwKSxcbiAgICAgICAgICB1bnRpbERlc3Ryb3llZCh0aGlzKVxuICAgICAgICApLnN1YnNjcmliZSgocmVzdWx0OiBhbnkpID0+IHtcbiAgICAgICAgICB0aGlzLnZhbHVlID0gKHJlc3VsdD8uZGF0YSB8fCBbXSkubWFwKCh4OiBhbnkpID0+IHguaWQpO1xuICAgICAgICAgIHRoaXMuX2hhbmRsZUlucHV0KCk7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIGluaXQoKSB7XG4gICAgaWYgKHRoaXMubW9kZWxJZCAmJiB0aGlzLmFsbFRhZ3MubGVuZ3RoID09IDApIHtcbiAgICAgIC8vTW9kZWwgSWQgaXMgcGFzc2VkIGFuZCBubyB0YWdzIGFyZSBwYXNzZWQsIHNvIHdlIHF1ZXJ5IGRiIGZvciB0aGUgYXZpbGFibGUgdGFncyBmb3IgdGhlIG1vZGVsIElELlxuICAgICAgdGhpcy5odHRwU2VydmljZVxuICAgICAgICAuY2FjaGUoIXRoaXMuY29uZmlnLmlzQ2FjaGVUYWdzKVxuICAgICAgICAuZ2V0KHRoaXMuY29uZmlnLmFwaVVybCwge1xuICAgICAgICAgIHBhcmFtczoge1xuICAgICAgICAgICAgY2F0ZWdvcmllczogdGhpcy5jYXRlZ29yaWVzLmpvaW4oJywnKSxcbiAgICAgICAgICAgIG1vZGVsX3R5cGU6IHRoaXMubW9kZWxUeXBlLFxuICAgICAgICAgICAgbW9kZWxfaWQ6IHRoaXMubW9kZWxJZFxuICAgICAgICAgIH1cbiAgICAgICAgfSkucGlwZShcbiAgICAgICAgICB1bnRpbERlc3Ryb3llZCh0aGlzKVxuICAgICAgICApLnN1YnNjcmliZSgocmVzdWx0OiBhbnkpID0+IHtcbiAgICAgICAgICB0aGlzLmFsbFRhZ3MgPSByZXN1bHQuZGF0YTtcbiAgICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgZ2V0IGZpbHRlcmVkVGFncygpOiBhbnlbXSB7XG4gICAgcmV0dXJuIHRoaXMuX2ZpbHRlcigpO1xuICB9XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBfZm9jdXNNb25pdG9yOiBGb2N1c01vbml0b3IsXG4gICAgcHJpdmF0ZSBfZWxlbWVudFJlZjogRWxlbWVudFJlZjxIVE1MRWxlbWVudD4sXG4gICAgcHJpdmF0ZSBodHRwU2VydmljZTogSHR0cFNlcnZpY2UsXG4gICAgQE9wdGlvbmFsKCkgQEluamVjdChNQVRfRk9STV9GSUVMRCkgcHVibGljIF9mb3JtRmllbGQ6IE1hdEZvcm1GaWVsZCxcbiAgICBAT3B0aW9uYWwoKSBAU2VsZigpIHB1YmxpYyBuZ0NvbnRyb2w6IE5nQ29udHJvbCkge1xuXG4gICAgdGhpcy50YWdJbnB1dEN0cmwudmFsdWVDaGFuZ2VzXG4gICAgICAuc3Vic2NyaWJlKGZpbHRlclZhbHVlID0+IHtcbiAgICAgICAgdGhpcy5maWx0ZXJTdHJpbmcgPSBmaWx0ZXJWYWx1ZTtcbiAgICAgIH0pO1xuXG4gICAgLy9TZXQgRm9jdXMgTW9uaXRvclxuICAgIF9mb2N1c01vbml0b3IubW9uaXRvcihfZWxlbWVudFJlZiwgdHJ1ZSkuc3Vic2NyaWJlKG9yaWdpbiA9PiB7XG4gICAgICBpZiAodGhpcy5mb2N1c2VkICYmICFvcmlnaW4pIHtcbiAgICAgICAgdGhpcy5vblRvdWNoZWQoKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuZm9jdXNlZCA9ICEhb3JpZ2luO1xuICAgICAgdGhpcy5zdGF0ZUNoYW5nZXMubmV4dCgpO1xuICAgIH0pO1xuXG4gICAgaWYgKHRoaXMubmdDb250cm9sICE9IG51bGwpIHtcbiAgICAgIHRoaXMubmdDb250cm9sLnZhbHVlQWNjZXNzb3IgPSB0aGlzO1xuICAgIH1cbiAgfVxuXG4gIHNldERlc2NyaWJlZEJ5SWRzKGlkczogc3RyaW5nW10pIHtcbiAgICAvLyBKdXN0IGEgZW1wdHkgaW1wbGVtZW50YXRpb24gZm9yIE1hdCBGb3JtIEZpZWxkIEludGVyZmFjZVxuICB9XG5cbiAgb25Db250YWluZXJDbGljaygpIHtcbiAgICAvLyBKdXN0IGEgZW1wdHkgaW1wbGVtZW50YXRpb24gZm9yIE1hdCBGb3JtIEZpZWxkIEludGVyZmFjZVxuICB9XG5cblxuICBhc3luYyBhZGQoZXZlbnQ6IE1hdENoaXBJbnB1dEV2ZW50KSB7XG4gICAgY29uc3QgdmFsdWUgPSAoZXZlbnQudmFsdWUgfHwgJycpLnRyaW0oKTtcbiAgICAvLyBBZGQgb3VyIHRhZ1xuICAgIC8vIFZhbGlkYXRlIGZvciBzaW5nbGUgbW9kZVxuICAgIGlmICghdGhpcy5jb25maWcuaXNTaW5nbGUgfHwgKHRoaXMudmFsdWUubGVuZ3RoID09PSAwKSkge1xuICAgICAgaWYgKHZhbHVlICYmIHRoaXMuY29uZmlnLmlzQ3JlYXRlYWJsZSkge1xuICAgICAgICBjb25zdCB0YWdzID0gdGhpcy5hbGxUYWdzO1xuICAgICAgICBsZXQgdGFnID0gdGFncy5maW5kKChpdGVtOiBhbnkpID0+IGl0ZW0udGl0bGUudG9Mb3dlckNhc2UoKSA9PSB2YWx1ZS50b0xvd2VyQ2FzZSgpKTtcbiAgICAgICAgaWYgKCF0YWcpIHtcbiAgICAgICAgICAvL05vIHRhZyBwcmVzZW50IGluIHRoZSBsaXN0XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdDogYW55ID0gYXdhaXQgdGhpcy5odHRwU2VydmljZS5wb3N0KHRoaXMuY29uZmlnLmNyZWF0ZUFwaVVybCwge1xuICAgICAgICAgICAgICB0aXRsZTogdmFsdWUsXG4gICAgICAgICAgICAgIGRlc2NyaXB0aW9uOiB2YWx1ZSxcbiAgICAgICAgICAgICAgY2F0ZWdvcnlfdGl0bGU6ICh0aGlzLmNhdGVnb3JpZXMubGVuZ3RoID4gMCkgPyAodGhpcy5kZWZhdWx0Q3JlYXRlQ2F0ZWdvcnkgPyB0aGlzLmRlZmF1bHRDcmVhdGVDYXRlZ29yeSA6IHRoaXMuY2F0ZWdvcmllc1swXSkgOiAnJ1xuICAgICAgICAgICAgfSkudG9Qcm9taXNlKCk7XG4gICAgICAgICAgICB0YWcgPSByZXN1bHQuaXRlbTtcbiAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cbiAgICAgICAgICB0aGlzLmFsbFRhZ3MucHVzaCh0YWcpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vT3B0aW9uYWxseSBjbGVhbiB0aGUgZXhpc3RpbmcgdmFsdWUsIHRvIGF2b2lkIGR1cGxpY2F0ZVxuICAgICAgICAgIHRoaXMucmVtb3ZlKHRhZyk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy52YWx1ZS5wdXNoKHRhZy5pZCk7XG4gICAgICAgIHRoaXMuX2hhbmRsZUlucHV0KCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gQ2xlYXIgdGhlIGlucHV0IHZhbHVlXG4gICAgZXZlbnQuaW5wdXQudmFsdWUgPSAnJztcblxuICAgIHRoaXMudGFnSW5wdXRDdHJsLnNldFZhbHVlKG51bGwpO1xuICB9XG5cbiAgcmVtb3ZlKHRhZzogYW55KTogdm9pZCB7XG4gICAgdGhpcy52YWx1ZSA9IHRoaXMudmFsdWUuZmlsdGVyKHggPT4geCAhPT0gdGFnLmlkKTtcbiAgICB0aGlzLl9oYW5kbGVJbnB1dCgpO1xuICB9XG5cbiAgc2VsZWN0ZWQoZXZlbnQ6IE1hdEF1dG9jb21wbGV0ZVNlbGVjdGVkRXZlbnQpOiB2b2lkIHtcbiAgICAvLyBWYWxpZGF0ZSBmb3Igc2luZ2xlIG1vZGVcbiAgICBpZiAoIXRoaXMuY29uZmlnLmlzU2luZ2xlIHx8ICh0aGlzLnZhbHVlLmxlbmd0aCA9PT0gMCkpIHtcbiAgICAgIC8vQ2xlYW4gdGhlIGV4aXN0aW5nIHZhbHVlLCB0byBhdm9pZCBkdXBsaWNhdGVcbiAgICAgIHRoaXMucmVtb3ZlKHsgaWQ6IGV2ZW50Lm9wdGlvbi52YWx1ZSB9KTtcbiAgICAgIHRoaXMudmFsdWUucHVzaChldmVudC5vcHRpb24udmFsdWUpO1xuICAgICAgdGhpcy5faGFuZGxlSW5wdXQoKTtcbiAgICB9XG4gICAgdGhpcy50YWdJbnB1dC5uYXRpdmVFbGVtZW50LnZhbHVlID0gJyc7XG4gICAgdGhpcy50YWdJbnB1dEN0cmwuc2V0VmFsdWUobnVsbCk7XG4gIH1cblxuICBwcml2YXRlIF9maWx0ZXIoKTogYW55W10ge1xuICAgIGNvbnN0IGZpbHRlclZhbHVlID0gdGhpcy5maWx0ZXJTdHJpbmcgPyB0aGlzLmZpbHRlclN0cmluZy50b1N0cmluZygpLnRvTG93ZXJDYXNlKCkgOiBudWxsO1xuICAgIGNvbnN0IGF2YWlsYWJsZVRhZ3MgPSB0aGlzLmFsbFRhZ3MuZmlsdGVyKCh0YWc6IGFueSkgPT4gIXRoaXMudmFsdWUuc29tZSgoaXRlbTogYW55KSA9PiBpdGVtID09IHRhZy5pZCkpO1xuICAgIHJldHVybiBmaWx0ZXJWYWx1ZSA/IGF2YWlsYWJsZVRhZ3MuZmlsdGVyKCh0YWc6IGFueSkgPT4gdGFnLnRpdGxlLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMoZmlsdGVyVmFsdWUpKSA6IGF2YWlsYWJsZVRhZ3M7XG4gIH1cblxuICB3cml0ZVZhbHVlKHRhZ0lkczogYW55W10pOiB2b2lkIHtcbiAgICB0aGlzLnZhbHVlID0gdGFnSWRzIHx8IFtdO1xuICB9XG5cbiAgcmVnaXN0ZXJPbkNoYW5nZShmbjogYW55KTogdm9pZCB7XG4gICAgdGhpcy5vbkNoYW5nZSA9IGZuO1xuICB9XG5cbiAgcmVnaXN0ZXJPblRvdWNoZWQoZm46IGFueSk6IHZvaWQge1xuICAgIHRoaXMub25Ub3VjaGVkID0gZm47XG4gIH1cblxuICBzZXREaXNhYmxlZFN0YXRlKGlzRGlzYWJsZWQ6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICB0aGlzLmRpc2FibGVkID0gaXNEaXNhYmxlZDtcbiAgfVxuXG4gIF9oYW5kbGVJbnB1dCgpOiB2b2lkIHtcbiAgICB0aGlzLm9uQ2hhbmdlKHRoaXMudmFsdWUpO1xuICB9XG5cbiAgc3RhdGljIG5nQWNjZXB0SW5wdXRUeXBlX2Rpc2FibGVkOiBCb29sZWFuSW5wdXQ7XG4gIHN0YXRpYyBuZ0FjY2VwdElucHV0VHlwZV9yZXF1aXJlZDogQm9vbGVhbklucHV0O1xuXG4gIG5nT25EZXN0cm95KCkge1xuICAgIHRoaXMuc3RhdGVDaGFuZ2VzLmNvbXBsZXRlKCk7XG4gICAgdGhpcy5fZm9jdXNNb25pdG9yLnN0b3BNb25pdG9yaW5nKHRoaXMuX2VsZW1lbnRSZWYpO1xuICB9XG5cbn1cbiJdfQ==
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { NgModule } from '@angular/core';
|
|
2
|
+
import { CommonModule } from '@angular/common';
|
|
3
|
+
import { TechlifyTaggerTagFormFieldComponent } from './techlify-tagger-tag-form-field.component';
|
|
4
|
+
import { FlexLayoutModule } from '@angular/flex-layout';
|
|
5
|
+
import { ReactiveFormsModule } from '@angular/forms';
|
|
6
|
+
import { MatAutocompleteModule } from '@angular/material/autocomplete';
|
|
7
|
+
import { MaterialModule } from '../material.module';
|
|
8
|
+
export class TechlifyTaggerTagFormFieldModule {
|
|
9
|
+
}
|
|
10
|
+
TechlifyTaggerTagFormFieldModule.decorators = [
|
|
11
|
+
{ type: NgModule, args: [{
|
|
12
|
+
declarations: [
|
|
13
|
+
TechlifyTaggerTagFormFieldComponent
|
|
14
|
+
],
|
|
15
|
+
imports: [
|
|
16
|
+
CommonModule,
|
|
17
|
+
MaterialModule,
|
|
18
|
+
FlexLayoutModule,
|
|
19
|
+
MatAutocompleteModule,
|
|
20
|
+
ReactiveFormsModule
|
|
21
|
+
],
|
|
22
|
+
exports: [TechlifyTaggerTagFormFieldComponent]
|
|
23
|
+
},] }
|
|
24
|
+
];
|
|
25
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVjaGxpZnktdGFnZ2VyLXRhZy1mb3JtLWZpZWxkLm1vZHVsZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25neC10ZWNobGlmeS1jb3JlL3NyYy9saWIvdGVjaGxpZnktdGFnZ2VyLXRhZy1mb3JtLWZpZWxkL3RlY2hsaWZ5LXRhZ2dlci10YWctZm9ybS1maWVsZC5tb2R1bGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUN6QyxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDL0MsT0FBTyxFQUFFLG1DQUFtQyxFQUFFLE1BQU0sNENBQTRDLENBQUM7QUFDakcsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDeEQsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDckQsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFDdkUsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBaUJwRCxNQUFNLE9BQU8sZ0NBQWdDOzs7WUFiNUMsUUFBUSxTQUFDO2dCQUNSLFlBQVksRUFBRTtvQkFDWixtQ0FBbUM7aUJBQ3BDO2dCQUNELE9BQU8sRUFBRTtvQkFDUCxZQUFZO29CQUNaLGNBQWM7b0JBQ2QsZ0JBQWdCO29CQUNoQixxQkFBcUI7b0JBQ3JCLG1CQUFtQjtpQkFDcEI7Z0JBQ0QsT0FBTyxFQUFFLENBQUMsbUNBQW1DLENBQUM7YUFDL0MiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBOZ01vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IFRlY2hsaWZ5VGFnZ2VyVGFnRm9ybUZpZWxkQ29tcG9uZW50IH0gZnJvbSAnLi90ZWNobGlmeS10YWdnZXItdGFnLWZvcm0tZmllbGQuY29tcG9uZW50JztcbmltcG9ydCB7IEZsZXhMYXlvdXRNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9mbGV4LWxheW91dCc7XG5pbXBvcnQgeyBSZWFjdGl2ZUZvcm1zTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgTWF0QXV0b2NvbXBsZXRlTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvYXV0b2NvbXBsZXRlJztcbmltcG9ydCB7IE1hdGVyaWFsTW9kdWxlIH0gZnJvbSAnLi4vbWF0ZXJpYWwubW9kdWxlJztcblxuXG5cbkBOZ01vZHVsZSh7XG4gIGRlY2xhcmF0aW9uczogW1xuICAgIFRlY2hsaWZ5VGFnZ2VyVGFnRm9ybUZpZWxkQ29tcG9uZW50XG4gIF0sXG4gIGltcG9ydHM6IFtcbiAgICBDb21tb25Nb2R1bGUsXG4gICAgTWF0ZXJpYWxNb2R1bGUsXG4gICAgRmxleExheW91dE1vZHVsZSxcbiAgICBNYXRBdXRvY29tcGxldGVNb2R1bGUsXG4gICAgUmVhY3RpdmVGb3Jtc01vZHVsZVxuICBdLFxuICBleHBvcnRzOiBbVGVjaGxpZnlUYWdnZXJUYWdGb3JtRmllbGRDb21wb25lbnRdXG59KVxuZXhwb3J0IGNsYXNzIFRlY2hsaWZ5VGFnZ2VyVGFnRm9ybUZpZWxkTW9kdWxlIHsgfVxuIl19
|
|
@@ -0,0 +1,168 @@
|
|
|
1
|
+
var TechlifyTaggerTagSelectorComponent_1;
|
|
2
|
+
import { __decorate } from "tslib";
|
|
3
|
+
import { FocusMonitor } from '@angular/cdk/a11y';
|
|
4
|
+
import { coerceBooleanProperty } from '@angular/cdk/coercion';
|
|
5
|
+
import { Component, ElementRef, Input, Inject, Optional, Self } from '@angular/core';
|
|
6
|
+
import { FormControl, NgControl } from '@angular/forms';
|
|
7
|
+
import { MatFormField, MatFormFieldControl, MAT_FORM_FIELD } from '@angular/material/form-field';
|
|
8
|
+
import { UntilDestroy, untilDestroyed } from '@ngneat/until-destroy';
|
|
9
|
+
import { Subject } from 'rxjs';
|
|
10
|
+
import { HttpService } from '../core/http.service';
|
|
11
|
+
let TechlifyTaggerTagSelectorComponent = TechlifyTaggerTagSelectorComponent_1 = class TechlifyTaggerTagSelectorComponent {
|
|
12
|
+
constructor(_focusMonitor, _elementRef, httpService, _formField, ngControl) {
|
|
13
|
+
this._focusMonitor = _focusMonitor;
|
|
14
|
+
this._elementRef = _elementRef;
|
|
15
|
+
this.httpService = httpService;
|
|
16
|
+
this._formField = _formField;
|
|
17
|
+
this.ngControl = ngControl;
|
|
18
|
+
/**Pass the Categories to filter for a model */
|
|
19
|
+
this.categories = [];
|
|
20
|
+
this.multiple = false;
|
|
21
|
+
this.enableSearch = true;
|
|
22
|
+
this.tagSelectorCtrl = new FormControl();
|
|
23
|
+
this.showAllTags = false;
|
|
24
|
+
this.useSelectButtonStyle = false;
|
|
25
|
+
this.tags = [];
|
|
26
|
+
this.stateChanges = new Subject();
|
|
27
|
+
this.focused = false;
|
|
28
|
+
this.controlType = 'techlify-tagger-selector';
|
|
29
|
+
this.id = `techlify-tagger-selector-${TechlifyTaggerTagSelectorComponent_1.nextId++}`;
|
|
30
|
+
this.onChange = (_) => { };
|
|
31
|
+
this.onTouched = () => { };
|
|
32
|
+
this._required = false;
|
|
33
|
+
this._disabled = false;
|
|
34
|
+
//Set Focus Monitor
|
|
35
|
+
_focusMonitor.monitor(_elementRef, true).subscribe(origin => {
|
|
36
|
+
if (this.focused && !origin) {
|
|
37
|
+
this.onTouched();
|
|
38
|
+
}
|
|
39
|
+
this.focused = !!origin;
|
|
40
|
+
this.stateChanges.next();
|
|
41
|
+
});
|
|
42
|
+
if (this.ngControl != null) {
|
|
43
|
+
this.ngControl.valueAccessor = this;
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
get apiUrl() {
|
|
47
|
+
var _a;
|
|
48
|
+
if (this.showAllTags) {
|
|
49
|
+
return 'api/techlify-tagger-tags';
|
|
50
|
+
}
|
|
51
|
+
else if (((_a = this.categories) === null || _a === void 0 ? void 0 : _a.length) > 0) {
|
|
52
|
+
return 'api/techlify-tagger-tags?categories=' + this.categories.join(',');
|
|
53
|
+
}
|
|
54
|
+
else {
|
|
55
|
+
return '';
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
//Default Getter and Setters for a Form Field Implementation
|
|
59
|
+
get empty() {
|
|
60
|
+
return this.value.length == 0;
|
|
61
|
+
}
|
|
62
|
+
get shouldLabelFloat() {
|
|
63
|
+
return this.focused || !this.empty;
|
|
64
|
+
}
|
|
65
|
+
get required() {
|
|
66
|
+
return this._required;
|
|
67
|
+
}
|
|
68
|
+
set required(value) {
|
|
69
|
+
this._required = coerceBooleanProperty(value);
|
|
70
|
+
this.stateChanges.next();
|
|
71
|
+
}
|
|
72
|
+
get disabled() {
|
|
73
|
+
return this._disabled;
|
|
74
|
+
}
|
|
75
|
+
set disabled(value) {
|
|
76
|
+
this._disabled = coerceBooleanProperty(value);
|
|
77
|
+
this._disabled ? this.tagSelectorCtrl.disable() : this.tagSelectorCtrl.enable();
|
|
78
|
+
this.stateChanges.next();
|
|
79
|
+
}
|
|
80
|
+
get value() {
|
|
81
|
+
return this._value;
|
|
82
|
+
}
|
|
83
|
+
set value(val) {
|
|
84
|
+
this._value = val;
|
|
85
|
+
this.tagSelectorCtrl.setValue(val);
|
|
86
|
+
this.stateChanges.next();
|
|
87
|
+
}
|
|
88
|
+
get errorState() {
|
|
89
|
+
return this.tagSelectorCtrl.dirty && this.required && (this.value.length == 0);
|
|
90
|
+
}
|
|
91
|
+
get placeholder() {
|
|
92
|
+
return this._placeholder;
|
|
93
|
+
}
|
|
94
|
+
set placeholder(value) {
|
|
95
|
+
this._placeholder = value;
|
|
96
|
+
this.stateChanges.next();
|
|
97
|
+
}
|
|
98
|
+
ngOnInit() {
|
|
99
|
+
if (this.useSelectButtonStyle) {
|
|
100
|
+
this.httpService.get(this.apiUrl)
|
|
101
|
+
.pipe(untilDestroyed(this))
|
|
102
|
+
.subscribe((res) => {
|
|
103
|
+
this.tags = res.data;
|
|
104
|
+
});
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
selectionChange(value) {
|
|
108
|
+
this.value = value;
|
|
109
|
+
this._handleInput();
|
|
110
|
+
}
|
|
111
|
+
setDescribedByIds(ids) {
|
|
112
|
+
// Just a empty implementation for Mat Form Field Interface
|
|
113
|
+
}
|
|
114
|
+
onContainerClick() {
|
|
115
|
+
// Just a empty implementation for Mat Form Field Interface
|
|
116
|
+
}
|
|
117
|
+
writeValue(val) {
|
|
118
|
+
this.value = val;
|
|
119
|
+
}
|
|
120
|
+
registerOnChange(fn) {
|
|
121
|
+
this.onChange = fn;
|
|
122
|
+
}
|
|
123
|
+
registerOnTouched(fn) {
|
|
124
|
+
this.onTouched = fn;
|
|
125
|
+
}
|
|
126
|
+
setDisabledState(isDisabled) {
|
|
127
|
+
this.disabled = isDisabled;
|
|
128
|
+
}
|
|
129
|
+
_handleInput() {
|
|
130
|
+
this.onChange(this.value);
|
|
131
|
+
}
|
|
132
|
+
ngOnDestroy() {
|
|
133
|
+
this.stateChanges.complete();
|
|
134
|
+
this._focusMonitor.stopMonitoring(this._elementRef);
|
|
135
|
+
}
|
|
136
|
+
};
|
|
137
|
+
TechlifyTaggerTagSelectorComponent.nextId = 0;
|
|
138
|
+
TechlifyTaggerTagSelectorComponent.decorators = [
|
|
139
|
+
{ type: Component, args: [{
|
|
140
|
+
selector: 'app-techlify-tagger-tag-selector',
|
|
141
|
+
template: "<app-searchable-selector *ngIf=\"apiUrl && !useSelectButtonStyle\" [formControl]=\"tagSelectorCtrl\" [apiUrl]=\"apiUrl\"\n [enableSearch]=\"enableSearch\" [multiple]=\"multiple\" (selectionChange)=\"selectionChange($event)\">\n</app-searchable-selector>\n\n<mat-button-toggle-group *ngIf=\"apiUrl && useSelectButtonStyle\" [formControl]=\"tagSelectorCtrl\" [multiple]=\"multiple\"\n (change)=\"selectionChange($event.value)\">\n <mat-button-toggle *ngFor=\"let tag of tags\" [value]=\"tag.id\">{{tag.title}}</mat-button-toggle>\n</mat-button-toggle-group>",
|
|
142
|
+
providers: [{ provide: MatFormFieldControl, useExisting: TechlifyTaggerTagSelectorComponent_1 }],
|
|
143
|
+
styles: [""]
|
|
144
|
+
},] }
|
|
145
|
+
];
|
|
146
|
+
TechlifyTaggerTagSelectorComponent.ctorParameters = () => [
|
|
147
|
+
{ type: FocusMonitor },
|
|
148
|
+
{ type: ElementRef },
|
|
149
|
+
{ type: HttpService },
|
|
150
|
+
{ type: MatFormField, decorators: [{ type: Optional }, { type: Inject, args: [MAT_FORM_FIELD,] }] },
|
|
151
|
+
{ type: NgControl, decorators: [{ type: Optional }, { type: Self }] }
|
|
152
|
+
];
|
|
153
|
+
TechlifyTaggerTagSelectorComponent.propDecorators = {
|
|
154
|
+
categories: [{ type: Input }],
|
|
155
|
+
multiple: [{ type: Input }],
|
|
156
|
+
enableSearch: [{ type: Input }],
|
|
157
|
+
showAllTags: [{ type: Input }],
|
|
158
|
+
useSelectButtonStyle: [{ type: Input }],
|
|
159
|
+
required: [{ type: Input }],
|
|
160
|
+
disabled: [{ type: Input }],
|
|
161
|
+
value: [{ type: Input }],
|
|
162
|
+
placeholder: [{ type: Input }]
|
|
163
|
+
};
|
|
164
|
+
TechlifyTaggerTagSelectorComponent = TechlifyTaggerTagSelectorComponent_1 = __decorate([
|
|
165
|
+
UntilDestroy()
|
|
166
|
+
], TechlifyTaggerTagSelectorComponent);
|
|
167
|
+
export { TechlifyTaggerTagSelectorComponent };
|
|
168
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVjaGxpZnktdGFnZ2VyLXRhZy1zZWxlY3Rvci5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtdGVjaGxpZnktY29yZS9zcmMvbGliL3RlY2hsaWZ5LXRhZ2dlci10YWctc2VsZWN0b3IvdGVjaGxpZnktdGFnZ2VyLXRhZy1zZWxlY3Rvci5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFBQSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFDakQsT0FBTyxFQUFnQixxQkFBcUIsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQzVFLE9BQU8sRUFBRSxTQUFTLEVBQUUsVUFBVSxFQUFVLEtBQUssRUFBYSxNQUFNLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUN4RyxPQUFPLEVBQXdCLFdBQVcsRUFBRSxTQUFTLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUM5RSxPQUFPLEVBQUUsWUFBWSxFQUFFLG1CQUFtQixFQUFFLGNBQWMsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBQ2pHLE9BQU8sRUFBRSxZQUFZLEVBQUUsY0FBYyxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDckUsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUUvQixPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sc0JBQXNCLENBQUM7SUFTdEMsa0NBQWtDLGdEQUFsQyxrQ0FBa0M7SUF5RzdDLFlBQ1UsYUFBMkIsRUFDM0IsV0FBb0MsRUFDcEMsV0FBd0IsRUFDVyxVQUF3QixFQUN4QyxTQUFvQjtRQUp2QyxrQkFBYSxHQUFiLGFBQWEsQ0FBYztRQUMzQixnQkFBVyxHQUFYLFdBQVcsQ0FBeUI7UUFDcEMsZ0JBQVcsR0FBWCxXQUFXLENBQWE7UUFDVyxlQUFVLEdBQVYsVUFBVSxDQUFjO1FBQ3hDLGNBQVMsR0FBVCxTQUFTLENBQVc7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S0FBSzswQkFjTCxLQUFLOztBQS9FSyxrQ0FBa0M7SUFQOUMsWUFBWSxFQUFFO0dBT0Ysa0NBQWtDLENBa0s5QztTQWxLWSxrQ0FBa0MiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBGb2N1c01vbml0b3IgfSBmcm9tICdAYW5ndWxhci9jZGsvYTExeSc7XG5pbXBvcnQgeyBCb29sZWFuSW5wdXQsIGNvZXJjZUJvb2xlYW5Qcm9wZXJ0eSB9IGZyb20gJ0Bhbmd1bGFyL2Nkay9jb2VyY2lvbic7XG5pbXBvcnQgeyBDb21wb25lbnQsIEVsZW1lbnRSZWYsIE9uSW5pdCwgSW5wdXQsIE9uRGVzdHJveSwgSW5qZWN0LCBPcHRpb25hbCwgU2VsZiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQ29udHJvbFZhbHVlQWNjZXNzb3IsIEZvcm1Db250cm9sLCBOZ0NvbnRyb2wgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBNYXRGb3JtRmllbGQsIE1hdEZvcm1GaWVsZENvbnRyb2wsIE1BVF9GT1JNX0ZJRUxEIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvZm9ybS1maWVsZCc7XG5pbXBvcnQgeyBVbnRpbERlc3Ryb3ksIHVudGlsRGVzdHJveWVkIH0gZnJvbSAnQG5nbmVhdC91bnRpbC1kZXN0cm95JztcbmltcG9ydCB7IFN1YmplY3QgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IGRlYm91bmNlVGltZSB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7IEh0dHBTZXJ2aWNlIH0gZnJvbSAnLi4vY29yZS9odHRwLnNlcnZpY2UnO1xuXG5AVW50aWxEZXN0cm95KClcbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2FwcC10ZWNobGlmeS10YWdnZXItdGFnLXNlbGVjdG9yJyxcbiAgdGVtcGxhdGVVcmw6ICcuL3RlY2hsaWZ5LXRhZ2dlci10YWctc2VsZWN0b3IuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi90ZWNobGlmeS10YWdnZXItdGFnLXNlbGVjdG9yLmNvbXBvbmVudC5zY3NzJ10sXG4gIHByb3ZpZGVyczogW3sgcHJvdmlkZTogTWF0Rm9ybUZpZWxkQ29udHJvbCwgdXNlRXhpc3Rpbmc6IFRlY2hsaWZ5VGFnZ2VyVGFnU2VsZWN0b3JDb21wb25lbnQgfV0sXG59KVxuZXhwb3J0IGNsYXNzIFRlY2hsaWZ5VGFnZ2VyVGFnU2VsZWN0b3JDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIENvbnRyb2xWYWx1ZUFjY2Vzc29yLCBNYXRGb3JtRmllbGRDb250cm9sPGFueT4sIE9uRGVzdHJveSB7XG5cbiAgLyoqUGFzcyB0aGUgQ2F0ZWdvcmllcyB0byBmaWx0ZXIgZm9yIGEgbW9kZWwgKi9cbiAgQElucHV0KCkgY2F0ZWdvcmllczogc3RyaW5nW10gPSBbXTtcbiAgQElucHV0KCkgbXVsdGlwbGU6IGJvb2xlYW4gPSBmYWxzZTtcbiAgQElucHV0KCkgZW5hYmxlU2VhcmNoOiBib29sZWFuID0gdHJ1ZTtcbiAgdGFnU2VsZWN0b3JDdHJsID0gbmV3IEZvcm1Db250cm9sKCk7XG4gIEBJbnB1dCgpIHNob3dBbGxUYWdzOiBib29sZWFuID0gZmFsc2U7XG4gIEBJbnB1dCgpIHVzZVNlbGVjdEJ1dHRvblN0eWxlOiBib29sZWFuID0gZmFsc2U7XG5cbiAgdGFnczogYW55W10gPSBbXTtcblxuICBzdGF0aWMgbmV4dElkID0gMDtcbiAgc3RhdGVDaGFuZ2VzID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcbiAgZm9jdXNlZCA9IGZhbHNlO1xuICBjb250cm9sVHlwZSA9ICd0ZWNobGlmeS10YWdnZXItc2VsZWN0b3InO1xuICBpZCA9IGB0ZWNobGlmeS10YWdnZXItc2VsZWN0b3ItJHtUZWNobGlmeVRhZ2dlclRhZ1NlbGVjdG9yQ29tcG9uZW50Lm5leHRJZCsrfWA7XG5cbiAgb25DaGFuZ2UgPSAoXzogYW55KSA9PiB7IH07XG4gIG9uVG91Y2hlZCA9ICgpID0+IHsgfTtcblxuICBnZXQgYXBpVXJsKCkge1xuICAgIGlmICh0aGlzLnNob3dBbGxUYWdzKSB7XG4gICAgICByZXR1cm4gJ2FwaS90ZWNobGlmeS10YWdnZXItdGFncydcbiAgICB9XG4gICAgZWxzZSBpZiAodGhpcy5jYXRlZ29yaWVzPy5sZW5ndGggPiAwKSB7XG4gICAgICByZXR1cm4gJ2FwaS90ZWNobGlmeS10YWdnZXItdGFncz9jYXRlZ29yaWVzPScgKyB0aGlzLmNhdGVnb3JpZXMuam9pbignLCcpO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgIHJldHVybiAnJztcbiAgICB9XG4gIH1cblxuICAvL0RlZmF1bHQgR2V0dGVyIGFuZCBTZXR0ZXJzIGZvciBhIEZvcm0gRmllbGQgSW1wbGVtZW50YXRpb25cbiAgZ2V0IGVtcHR5KCkge1xuICAgIHJldHVybiB0aGlzLnZhbHVlLmxlbmd0aCA9PSAwO1xuICB9XG5cbiAgZ2V0IHNob3VsZExhYmVsRmxvYXQoKSB7XG4gICAgcmV0dXJuIHRoaXMuZm9jdXNlZCB8fCAhdGhpcy5lbXB0eTtcbiAgfVxuXG4gIEBJbnB1dCgpXG4gIGdldCByZXF1aXJlZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fcmVxdWlyZWQ7XG4gIH1cbiAgc2V0IHJlcXVpcmVkKHZhbHVlOiBib29sZWFuKSB7XG4gICAgdGhpcy5fcmVxdWlyZWQgPSBjb2VyY2VCb29sZWFuUHJvcGVydHkodmFsdWUpO1xuICAgIHRoaXMuc3RhdGVDaGFuZ2VzLm5leHQoKTtcbiAgfVxuICBwcml2YXRlIF9yZXF1aXJlZCA9IGZhbHNlO1xuXG4gIEBJbnB1dCgpXG4gIGdldCBkaXNhYmxlZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fZGlzYWJsZWQ7XG4gIH1cbiAgc2V0IGRpc2FibGVkKHZhbHVlOiBib29sZWFuKSB7XG4gICAgdGhpcy5fZGlzYWJsZWQgPSBjb2VyY2VCb29sZWFuUHJvcGVydHkodmFsdWUpO1xuICAgIHRoaXMuX2Rpc2FibGVkID8gdGhpcy50YWdTZWxlY3RvckN0cmwuZGlzYWJsZSgpIDogdGhpcy50YWdTZWxlY3RvckN0cmwuZW5hYmxlKCk7XG4gICAgdGhpcy5zdGF0ZUNoYW5nZXMubmV4dCgpO1xuICB9XG4gIHByaXZhdGUgX2Rpc2FibGVkID0gZmFsc2U7XG5cblxuICBwcml2YXRlIF92YWx1ZTogYW55O1xuICBASW5wdXQoKVxuICBnZXQgdmFsdWUoKTogYW55IHtcbiAgICByZXR1cm4gdGhpcy5fdmFsdWU7XG4gIH1cbiAgc2V0IHZhbHVlKHZhbDogYW55KSB7XG4gICAgdGhpcy5fdmFsdWUgPSB2YWw7XG4gICAgdGhpcy50YWdTZWxlY3RvckN0cmwuc2V0VmFsdWUodmFsKTtcbiAgICB0aGlzLnN0YXRlQ2hhbmdlcy5uZXh0KCk7XG4gIH1cblxuICBnZXQgZXJyb3JTdGF0ZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy50YWdTZWxlY3RvckN0cmwuZGlydHkgJiYgdGhpcy5yZXF1aXJlZCAmJiAodGhpcy52YWx1ZS5sZW5ndGggPT0gMCk7XG4gIH1cblxuICBASW5wdXQoKVxuICBnZXQgcGxhY2Vob2xkZXIoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5fcGxhY2Vob2xkZXI7XG4gIH1cbiAgc2V0IHBsYWNlaG9sZGVyKHZhbHVlOiBzdHJpbmcpIHtcbiAgICB0aGlzLl9wbGFjZWhvbGRlciA9IHZhbHVlO1xuICAgIHRoaXMuc3RhdGVDaGFuZ2VzLm5leHQoKTtcbiAgfVxuICBwcml2YXRlIF9wbGFjZWhvbGRlcjogc3RyaW5nO1xuXG5cbiAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMudXNlU2VsZWN0QnV0dG9uU3R5bGUpIHtcbiAgICAgIHRoaXMuaHR0cFNlcnZpY2UuZ2V0KHRoaXMuYXBpVXJsKVxuICAgICAgICAucGlwZSh1bnRpbERlc3Ryb3llZCh0aGlzKSlcbiAgICAgICAgLnN1YnNjcmliZSgocmVzOiBhbnkpID0+IHtcbiAgICAgICAgICB0aGlzLnRhZ3MgPSByZXMuZGF0YTtcbiAgICAgICAgfSlcbiAgICB9XG4gIH1cblxuICBzZWxlY3Rpb25DaGFuZ2UodmFsdWU6IGFueSkge1xuICAgIHRoaXMudmFsdWUgPSB2YWx1ZTtcbiAgICB0aGlzLl9oYW5kbGVJbnB1dCgpO1xuICB9XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBfZm9jdXNNb25pdG9yOiBGb2N1c01vbml0b3IsXG4gICAgcHJpdmF0ZSBfZWxlbWVudFJlZjogRWxlbWVudFJlZjxIVE1MRWxlbWVudD4sXG4gICAgcHJpdmF0ZSBodHRwU2VydmljZTogSHR0cFNlcnZpY2UsXG4gICAgQE9wdGlvbmFsKCkgQEluamVjdChNQVRfRk9STV9GSUVMRCkgcHVibGljIF9mb3JtRmllbGQ6IE1hdEZvcm1GaWVsZCxcbiAgICBAT3B0aW9uYWwoKSBAU2VsZigpIHB1YmxpYyBuZ0NvbnRyb2w6IE5nQ29udHJvbCkge1xuXG4gICAgLy9TZXQgRm9jdXMgTW9uaXRvclxuICAgIF9mb2N1c01vbml0b3IubW9uaXRvcihfZWxlbWVudFJlZiwgdHJ1ZSkuc3Vic2NyaWJlKG9yaWdpbiA9PiB7XG4gICAgICBpZiAodGhpcy5mb2N1c2VkICYmICFvcmlnaW4pIHtcbiAgICAgICAgdGhpcy5vblRvdWNoZWQoKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuZm9jdXNlZCA9ICEhb3JpZ2luO1xuICAgICAgdGhpcy5zdGF0ZUNoYW5nZXMubmV4dCgpO1xuICAgIH0pO1xuXG4gICAgaWYgKHRoaXMubmdDb250cm9sICE9IG51bGwpIHtcbiAgICAgIHRoaXMubmdDb250cm9sLnZhbHVlQWNjZXNzb3IgPSB0aGlzO1xuICAgIH1cbiAgfVxuXG4gIHNldERlc2NyaWJlZEJ5SWRzKGlkczogc3RyaW5nW10pIHtcbiAgICAvLyBKdXN0IGEgZW1wdHkgaW1wbGVtZW50YXRpb24gZm9yIE1hdCBGb3JtIEZpZWxkIEludGVyZmFjZVxuICB9XG5cbiAgb25Db250YWluZXJDbGljaygpIHtcbiAgICAvLyBKdXN0IGEgZW1wdHkgaW1wbGVtZW50YXRpb24gZm9yIE1hdCBGb3JtIEZpZWxkIEludGVyZmFjZVxuICB9XG5cbiAgd3JpdGVWYWx1ZSh2YWw6IGFueSk6IHZvaWQge1xuICAgIHRoaXMudmFsdWUgPSB2YWw7XG4gIH1cblxuICByZWdpc3Rlck9uQ2hhbmdlKGZuOiBhbnkpOiB2b2lkIHtcbiAgICB0aGlzLm9uQ2hhbmdlID0gZm47XG4gIH1cblxuICByZWdpc3Rlck9uVG91Y2hlZChmbjogYW55KTogdm9pZCB7XG4gICAgdGhpcy5vblRvdWNoZWQgPSBmbjtcbiAgfVxuXG4gIHNldERpc2FibGVkU3RhdGUoaXNEaXNhYmxlZDogYm9vbGVhbik6IHZvaWQge1xuICAgIHRoaXMuZGlzYWJsZWQgPSBpc0Rpc2FibGVkO1xuICB9XG5cbiAgX2hhbmRsZUlucHV0KCk6IHZvaWQge1xuICAgIHRoaXMub25DaGFuZ2UodGhpcy52YWx1ZSk7XG4gIH1cblxuICBzdGF0aWMgbmdBY2NlcHRJbnB1dFR5cGVfZGlzYWJsZWQ6IEJvb2xlYW5JbnB1dDtcbiAgc3RhdGljIG5nQWNjZXB0SW5wdXRUeXBlX3JlcXVpcmVkOiBCb29sZWFuSW5wdXQ7XG5cbiAgbmdPbkRlc3Ryb3koKSB7XG4gICAgdGhpcy5zdGF0ZUNoYW5nZXMuY29tcGxldGUoKTtcbiAgICB0aGlzLl9mb2N1c01vbml0b3Iuc3RvcE1vbml0b3JpbmcodGhpcy5fZWxlbWVudFJlZik7XG4gIH1cblxufVxuIl19
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { NgModule } from '@angular/core';
|
|
2
|
+
import { CommonModule } from '@angular/common';
|
|
3
|
+
import { TechlifyTaggerTagSelectorComponent } from './techlify-tagger-tag-selector.component';
|
|
4
|
+
import { FlexLayoutModule } from '@angular/flex-layout';
|
|
5
|
+
import { ReactiveFormsModule } from '@angular/forms';
|
|
6
|
+
import { MatAutocompleteModule } from '@angular/material/autocomplete';
|
|
7
|
+
import { MatButtonToggleModule } from '@angular/material/button-toggle';
|
|
8
|
+
import { MaterialModule } from '../material.module';
|
|
9
|
+
import { SearchableSelectorModule } from '../searchable-selector/searchable-selector.module';
|
|
10
|
+
export class TechlifyTaggerTagSelectorModule {
|
|
11
|
+
}
|
|
12
|
+
TechlifyTaggerTagSelectorModule.decorators = [
|
|
13
|
+
{ type: NgModule, args: [{
|
|
14
|
+
declarations: [
|
|
15
|
+
TechlifyTaggerTagSelectorComponent
|
|
16
|
+
],
|
|
17
|
+
imports: [
|
|
18
|
+
CommonModule,
|
|
19
|
+
MaterialModule,
|
|
20
|
+
FlexLayoutModule,
|
|
21
|
+
MatAutocompleteModule,
|
|
22
|
+
ReactiveFormsModule,
|
|
23
|
+
SearchableSelectorModule,
|
|
24
|
+
MatButtonToggleModule
|
|
25
|
+
],
|
|
26
|
+
exports: [TechlifyTaggerTagSelectorComponent]
|
|
27
|
+
},] }
|
|
28
|
+
];
|
|
29
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVjaGxpZnktdGFnZ2VyLXRhZy1zZWxlY3Rvci5tb2R1bGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtdGVjaGxpZnktY29yZS9zcmMvbGliL3RlY2hsaWZ5LXRhZ2dlci10YWctc2VsZWN0b3IvdGVjaGxpZnktdGFnZ2VyLXRhZy1zZWxlY3Rvci5tb2R1bGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUN6QyxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDL0MsT0FBTyxFQUFFLGtDQUFrQyxFQUFFLE1BQU0sMENBQTBDLENBQUM7QUFDOUYsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDeEQsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDckQsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFDdkUsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0saUNBQWlDLENBQUM7QUFDeEUsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQ3BELE9BQU8sRUFBRSx3QkFBd0IsRUFBRSxNQUFNLG1EQUFtRCxDQUFDO0FBbUI3RixNQUFNLE9BQU8sK0JBQStCOzs7WUFmM0MsUUFBUSxTQUFDO2dCQUNSLFlBQVksRUFBRTtvQkFDWixrQ0FBa0M7aUJBQ25DO2dCQUNELE9BQU8sRUFBRTtvQkFDUCxZQUFZO29CQUNaLGNBQWM7b0JBQ2QsZ0JBQWdCO29CQUNoQixxQkFBcUI7b0JBQ3JCLG1CQUFtQjtvQkFDbkIsd0JBQXdCO29CQUN4QixxQkFBcUI7aUJBQ3RCO2dCQUNELE9BQU8sRUFBRSxDQUFDLGtDQUFrQyxDQUFDO2FBQzlDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgTmdNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IENvbW1vbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyBUZWNobGlmeVRhZ2dlclRhZ1NlbGVjdG9yQ29tcG9uZW50IH0gZnJvbSAnLi90ZWNobGlmeS10YWdnZXItdGFnLXNlbGVjdG9yLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBGbGV4TGF5b3V0TW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvZmxleC1sYXlvdXQnO1xuaW1wb3J0IHsgUmVhY3RpdmVGb3Jtc01vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IE1hdEF1dG9jb21wbGV0ZU1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2F1dG9jb21wbGV0ZSc7XG5pbXBvcnQgeyBNYXRCdXR0b25Ub2dnbGVNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9idXR0b24tdG9nZ2xlJztcbmltcG9ydCB7IE1hdGVyaWFsTW9kdWxlIH0gZnJvbSAnLi4vbWF0ZXJpYWwubW9kdWxlJztcbmltcG9ydCB7IFNlYXJjaGFibGVTZWxlY3Rvck1vZHVsZSB9IGZyb20gJy4uL3NlYXJjaGFibGUtc2VsZWN0b3Ivc2VhcmNoYWJsZS1zZWxlY3Rvci5tb2R1bGUnO1xuXG5cblxuQE5nTW9kdWxlKHtcbiAgZGVjbGFyYXRpb25zOiBbXG4gICAgVGVjaGxpZnlUYWdnZXJUYWdTZWxlY3RvckNvbXBvbmVudFxuICBdLFxuICBpbXBvcnRzOiBbXG4gICAgQ29tbW9uTW9kdWxlLFxuICAgIE1hdGVyaWFsTW9kdWxlLFxuICAgIEZsZXhMYXlvdXRNb2R1bGUsXG4gICAgTWF0QXV0b2NvbXBsZXRlTW9kdWxlLFxuICAgIFJlYWN0aXZlRm9ybXNNb2R1bGUsXG4gICAgU2VhcmNoYWJsZVNlbGVjdG9yTW9kdWxlLFxuICAgIE1hdEJ1dHRvblRvZ2dsZU1vZHVsZVxuICBdLFxuICBleHBvcnRzOiBbVGVjaGxpZnlUYWdnZXJUYWdTZWxlY3RvckNvbXBvbmVudF1cbn0pXG5leHBvcnQgY2xhc3MgVGVjaGxpZnlUYWdnZXJUYWdTZWxlY3Rvck1vZHVsZSB7IH1cbiJdfQ==
|