@tehw0lf/wordlist-generator 0.20.4 → 0.20.6
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.
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { moveItemInArray, CdkDropList, CdkDrag } from '@angular/cdk/drag-drop';
|
|
2
|
-
import { NgStyle
|
|
2
|
+
import { NgStyle } from '@angular/common';
|
|
3
3
|
import * as i0 from '@angular/core';
|
|
4
|
-
import { Injectable, inject, input, ViewEncapsulation, Component } from '@angular/core';
|
|
4
|
+
import { Injectable, inject, input, signal, computed, ChangeDetectionStrategy, ViewEncapsulation, Component } from '@angular/core';
|
|
5
5
|
import * as i3 from '@angular/forms';
|
|
6
6
|
import { UntypedFormBuilder, Validators, ReactiveFormsModule } from '@angular/forms';
|
|
7
7
|
import * as i1 from '@angular/material/button';
|
|
@@ -14,8 +14,10 @@ import * as i5 from '@angular/material/input';
|
|
|
14
14
|
import { MatInputModule } from '@angular/material/input';
|
|
15
15
|
import * as i2 from '@angular/material/menu';
|
|
16
16
|
import { MatMenuModule } from '@angular/material/menu';
|
|
17
|
+
import * as i7 from '@angular/material/progress-bar';
|
|
18
|
+
import { MatProgressBarModule } from '@angular/material/progress-bar';
|
|
17
19
|
import { from, Subject } from 'rxjs';
|
|
18
|
-
import { map,
|
|
20
|
+
import { map, takeUntil, shareReplay, reduce, finalize } from 'rxjs/operators';
|
|
19
21
|
import { product } from 'cartesian-product-generator';
|
|
20
22
|
|
|
21
23
|
var FileType;
|
|
@@ -47,15 +49,68 @@ const toCSV = (wordlist) => {
|
|
|
47
49
|
};
|
|
48
50
|
|
|
49
51
|
class WordlistGeneratorService {
|
|
52
|
+
constructor() {
|
|
53
|
+
this.LARGE_DATASET_THRESHOLD = 50000;
|
|
54
|
+
}
|
|
50
55
|
generateWordlist(...charsets) {
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
56
|
+
const estimatedSize = this.estimateWordlistSize(charsets);
|
|
57
|
+
if (estimatedSize > this.LARGE_DATASET_THRESHOLD) {
|
|
58
|
+
return this.generateWithWebWorker(charsets);
|
|
59
|
+
}
|
|
60
|
+
return this.generateSynchronously(charsets);
|
|
54
61
|
}
|
|
55
|
-
|
|
56
|
-
|
|
62
|
+
generateSynchronously(charsets) {
|
|
63
|
+
return from(product(...charsets)).pipe(map((word) => word.join('')));
|
|
64
|
+
}
|
|
65
|
+
generateWithWebWorker(charsets) {
|
|
66
|
+
const subject = new Subject();
|
|
67
|
+
if (typeof Worker !== 'undefined') {
|
|
68
|
+
const worker = new Worker(new URL('./wordlist.worker', import.meta.url));
|
|
69
|
+
worker.onmessage = ({ data }) => {
|
|
70
|
+
switch (data.type) {
|
|
71
|
+
case 'batch':
|
|
72
|
+
if (data.words) {
|
|
73
|
+
data.words.forEach(word => subject.next(word));
|
|
74
|
+
}
|
|
75
|
+
break;
|
|
76
|
+
case 'complete':
|
|
77
|
+
subject.complete();
|
|
78
|
+
worker.terminate();
|
|
79
|
+
break;
|
|
80
|
+
case 'error':
|
|
81
|
+
subject.error(new Error(data.error || 'Worker error'));
|
|
82
|
+
worker.terminate();
|
|
83
|
+
break;
|
|
84
|
+
}
|
|
85
|
+
};
|
|
86
|
+
worker.onerror = (error) => {
|
|
87
|
+
subject.error(error);
|
|
88
|
+
worker.terminate();
|
|
89
|
+
};
|
|
90
|
+
const message = {
|
|
91
|
+
type: 'generate',
|
|
92
|
+
charsets,
|
|
93
|
+
batchSize: 1000
|
|
94
|
+
};
|
|
95
|
+
worker.postMessage(message);
|
|
96
|
+
}
|
|
97
|
+
else {
|
|
98
|
+
// Fallback for environments without Worker support
|
|
99
|
+
this.generateSynchronously(charsets).subscribe({
|
|
100
|
+
next: (word) => subject.next(word),
|
|
101
|
+
error: (err) => subject.error(err),
|
|
102
|
+
complete: () => subject.complete()
|
|
103
|
+
});
|
|
104
|
+
}
|
|
105
|
+
return subject.asObservable();
|
|
106
|
+
}
|
|
107
|
+
estimateWordlistSize(charsets) {
|
|
108
|
+
return charsets.reduce((total, charset) => total * charset.length, 1);
|
|
109
|
+
}
|
|
110
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.1.6", ngImport: i0, type: WordlistGeneratorService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
111
|
+
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.1.6", ngImport: i0, type: WordlistGeneratorService, providedIn: 'root' }); }
|
|
57
112
|
}
|
|
58
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.
|
|
113
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.1.6", ngImport: i0, type: WordlistGeneratorService, decorators: [{
|
|
59
114
|
type: Injectable,
|
|
60
115
|
args: [{
|
|
61
116
|
providedIn: 'root'
|
|
@@ -70,19 +125,23 @@ class WordlistGeneratorComponent {
|
|
|
70
125
|
this.buttonStyle = input({
|
|
71
126
|
'background-color': '#333333',
|
|
72
127
|
color: '#cc7832'
|
|
73
|
-
});
|
|
74
|
-
this.dragStyle = input({ color: '#cc7832' });
|
|
75
|
-
this.textStyle = input({ color: '#cc7832' });
|
|
76
|
-
this.
|
|
77
|
-
this.
|
|
128
|
+
}, ...(ngDevMode ? [{ debugName: "buttonStyle" }] : []));
|
|
129
|
+
this.dragStyle = input({ color: '#cc7832' }, ...(ngDevMode ? [{ debugName: "dragStyle" }] : []));
|
|
130
|
+
this.textStyle = input({ color: '#cc7832' }, ...(ngDevMode ? [{ debugName: "textStyle" }] : []));
|
|
131
|
+
this.wordlist = signal('', ...(ngDevMode ? [{ debugName: "wordlist" }] : []));
|
|
132
|
+
this.displayWordlist = signal(false, ...(ngDevMode ? [{ debugName: "displayWordlist" }] : []));
|
|
133
|
+
this.fileType = signal(FileType.plaintext, ...(ngDevMode ? [{ debugName: "fileType" }] : []));
|
|
78
134
|
this.fileTypes = Object.values(FileType);
|
|
79
|
-
this.filteredCharset = [];
|
|
80
|
-
this.prefix = '';
|
|
81
|
-
this.suffix = '';
|
|
135
|
+
this.filteredCharset = signal([], ...(ngDevMode ? [{ debugName: "filteredCharset" }] : []));
|
|
136
|
+
this.prefix = signal('', ...(ngDevMode ? [{ debugName: "prefix" }] : []));
|
|
137
|
+
this.suffix = signal('', ...(ngDevMode ? [{ debugName: "suffix" }] : []));
|
|
138
|
+
this.isGenerating = signal(false, ...(ngDevMode ? [{ debugName: "isGenerating" }] : []));
|
|
139
|
+
this.isLargeDataset = signal(false, ...(ngDevMode ? [{ debugName: "isLargeDataset" }] : []));
|
|
140
|
+
this.wordsGenerated = signal(undefined, ...(ngDevMode ? [{ debugName: "wordsGenerated" }] : []));
|
|
141
|
+
this.canGenerate = computed(() => this.charsetForm?.valid && this.filteredCharset().length > 0, ...(ngDevMode ? [{ debugName: "canGenerate" }] : []));
|
|
142
|
+
this.hasWordlist = computed(() => this.wordlist().length > 0, ...(ngDevMode ? [{ debugName: "hasWordlist" }] : []));
|
|
82
143
|
this.unsubscribe$ = new Subject();
|
|
83
144
|
this.removeDuplicates = (unfiltered) => [...new Set(unfiltered)].join('');
|
|
84
|
-
}
|
|
85
|
-
ngOnInit() {
|
|
86
145
|
this.generateForm();
|
|
87
146
|
}
|
|
88
147
|
ngOnDestroy() {
|
|
@@ -108,37 +167,39 @@ class WordlistGeneratorComponent {
|
|
|
108
167
|
}
|
|
109
168
|
downloadWordlist() {
|
|
110
169
|
if (this.charsets) {
|
|
111
|
-
|
|
170
|
+
const currentCharset = this.filterCharset(this.charsets.value);
|
|
171
|
+
if (JSON.stringify(this.filteredCharset()) !==
|
|
172
|
+
JSON.stringify(currentCharset)) {
|
|
112
173
|
this.generateWordlist();
|
|
113
174
|
}
|
|
114
|
-
const filename = `wordlist_${this.wordsGenerated}_words_${this.charsets.length}_positions.${this.fileType}`;
|
|
115
|
-
this.
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
175
|
+
const filename = `wordlist_${this.wordsGenerated()}_words_${this.charsets.length}_positions.${this.fileType()}`;
|
|
176
|
+
const wordlistContent = this.wordlist();
|
|
177
|
+
if (wordlistContent && wordlistContent.length > 0) {
|
|
178
|
+
this.performDownload(wordlistContent, filename);
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
performDownload(wordlistContent, filename) {
|
|
183
|
+
const parsed = this.parseWordlist(wordlistContent);
|
|
184
|
+
const file = new Blob([parsed.wordlist], {
|
|
185
|
+
type: parsed.contentType
|
|
186
|
+
});
|
|
187
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
188
|
+
if (window.navigator.msSaveOrOpenBlob) {
|
|
189
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
190
|
+
window.navigator.msSaveOrOpenBlob(file, filename);
|
|
191
|
+
}
|
|
192
|
+
else {
|
|
193
|
+
const a = document.createElement('a');
|
|
194
|
+
const url = URL.createObjectURL(file);
|
|
195
|
+
a.href = url;
|
|
196
|
+
a.download = filename;
|
|
197
|
+
document.body.appendChild(a);
|
|
198
|
+
a.click();
|
|
199
|
+
setTimeout(() => {
|
|
200
|
+
document.body.removeChild(a);
|
|
201
|
+
window.URL.revokeObjectURL(url);
|
|
202
|
+
}, 0);
|
|
142
203
|
}
|
|
143
204
|
}
|
|
144
205
|
drop(event) {
|
|
@@ -158,30 +219,40 @@ class WordlistGeneratorComponent {
|
|
|
158
219
|
}
|
|
159
220
|
generateWordlist() {
|
|
160
221
|
if (this.charsetForm && this.charsets && this.charsets.valid) {
|
|
161
|
-
this.filteredCharset
|
|
162
|
-
this.prefix
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
this.suffix = this.charsetForm.get('suffix')?.value
|
|
166
|
-
? this.charsetForm.get('suffix')?.value
|
|
167
|
-
: '';
|
|
168
|
-
this.wordsGenerated = this.filteredCharset
|
|
222
|
+
this.filteredCharset.set(this.filterCharset(this.charsets.value));
|
|
223
|
+
this.prefix.set(this.charsetForm.get('prefix')?.value || '');
|
|
224
|
+
this.suffix.set(this.charsetForm.get('suffix')?.value || '');
|
|
225
|
+
const wordsCount = this.filteredCharset()
|
|
169
226
|
.map((charset) => charset.length)
|
|
170
227
|
.reduce((previousLength, currentLength) => previousLength * currentLength);
|
|
171
|
-
this.
|
|
172
|
-
this.
|
|
228
|
+
this.wordsGenerated.set(wordsCount);
|
|
229
|
+
this.isLargeDataset.set(wordsCount > 50000);
|
|
230
|
+
this.displayWordlist.set(wordsCount <= 100);
|
|
231
|
+
this.isGenerating.set(true);
|
|
232
|
+
// Generate wordlist and update signal
|
|
233
|
+
this.getWordlist()
|
|
234
|
+
.pipe(takeUntil(this.unsubscribe$))
|
|
235
|
+
.subscribe({
|
|
236
|
+
next: (wordlist) => this.wordlist.set(wordlist),
|
|
237
|
+
error: (error) => {
|
|
238
|
+
console.error('Error generating wordlist:', error);
|
|
239
|
+
this.isGenerating.set(false);
|
|
240
|
+
}
|
|
241
|
+
});
|
|
173
242
|
}
|
|
174
243
|
}
|
|
175
244
|
getWordlist() {
|
|
176
245
|
return this.wordlistGenerator
|
|
177
|
-
.generateWordlist(...this.filteredCharset)
|
|
178
|
-
.pipe(reduce((wordlist, word) => `${wordlist}${this.prefix}${word}${this.suffix}\n`, ''),
|
|
246
|
+
.generateWordlist(...this.filteredCharset())
|
|
247
|
+
.pipe(shareReplay({ bufferSize: 1, refCount: true }), reduce((wordlist, word) => `${wordlist}${this.prefix()}${word}${this.suffix()}\n`, ''), finalize(() => {
|
|
248
|
+
this.isGenerating.set(false);
|
|
249
|
+
}), takeUntil(this.unsubscribe$));
|
|
179
250
|
}
|
|
180
251
|
filterCharset(charsets) {
|
|
181
252
|
return charsets.map((charset) => this.removeDuplicates(charset));
|
|
182
253
|
}
|
|
183
254
|
parseWordlist(wordlist) {
|
|
184
|
-
switch (this.fileType) {
|
|
255
|
+
switch (this.fileType()) {
|
|
185
256
|
case FileType.plaintext:
|
|
186
257
|
return toPlaintext(wordlist);
|
|
187
258
|
case FileType.xml:
|
|
@@ -195,10 +266,10 @@ class WordlistGeneratorComponent {
|
|
|
195
266
|
this.charsets.removeAt(i);
|
|
196
267
|
}
|
|
197
268
|
}
|
|
198
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.
|
|
199
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.0.3", type: WordlistGeneratorComponent, isStandalone: true, selector: "wordlist-generator", inputs: { buttonStyle: { classPropertyName: "buttonStyle", publicName: "buttonStyle", isSignal: true, isRequired: false, transformFunction: null }, dragStyle: { classPropertyName: "dragStyle", publicName: "dragStyle", isSignal: true, isRequired: false, transformFunction: null }, textStyle: { classPropertyName: "textStyle", publicName: "textStyle", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0, template: "<div class=\"meta-container flex-row-wrap\">\n <div class=\"form-container flex-column flex-fxflex\">\n <div class=\"flex-row-wrap bottom-10\">\n <button\n class=\"generate-wordlist\"\n [ngStyle]=\"buttonStyle()\"\n mat-raised-button\n (click)=\"generateWordlist()\"\n >\n Generate wordlist\n </button>\n @if (wordlist$) {\n <button\n class=\"choose-format\"\n [ngStyle]=\"buttonStyle()\"\n mat-raised-button\n [matMenuTriggerFor]=\"menu\"\n >\n Choose format\n </button>\n }\n <mat-menu #menu=\"matMenu\">\n @for (type of fileTypes; track type) {\n <button\n [ngStyle]=\"buttonStyle()\"\n mat-menu-item\n (click)=\"fileType = type\"\n >\n {{ type }}\n </button>\n }\n </mat-menu>\n @if (wordlist$) {\n <button\n class=\"download-wordlist\"\n [ngStyle]=\"buttonStyle()\"\n mat-raised-button\n (click)=\"downloadWordlist()\"\n >\n Download as\n @if (this.fileType) {\n {{ this.fileType }}\n }\n </button>\n }\n </div>\n @if (charsetForm) {\n <form [formGroup]=\"charsetForm\">\n <mat-form-field class=\"fixed-width bottom-10\" appearance=\"outline\">\n <mat-label [ngStyle]=\"textStyle()\">prefix (optional)</mat-label>\n <input\n [ngStyle]=\"textStyle()\"\n matInput\n type=\"text\"\n id=\"prefix\"\n formControlName=\"prefix\"\n (keydown.enter)=\"$event.preventDefault()\"\n />\n </mat-form-field>\n <div formArrayName=\"charsets\">\n <div cdkDropList (cdkDropListDropped)=\"drop($event)\">\n @for (\n charset of charsets?.controls;\n track charset;\n let i = $index\n ) {\n <div class=\"charset-container\" cdkDrag>\n <mat-icon class=\"drag-indicator\" [ngStyle]=\"dragStyle()\"\n >drag_indicator</mat-icon\n >\n <mat-form-field class=\"charset bottom-10\" appearance=\"outline\">\n <mat-label [ngStyle]=\"textStyle()\">\n character set for string position {{ i }}\n </mat-label>\n <input\n [ngStyle]=\"textStyle()\"\n matInput\n type=\"text\"\n id=\"position-{{ i }}\"\n [formControlName]=\"i\"\n (keydown.enter)=\"$event.preventDefault()\"\n required\n />\n </mat-form-field>\n <button\n mat-raised-button\n class=\"clone-charset\"\n [ngStyle]=\"buttonStyle()\"\n (click)=\"cloneCharset(i)\"\n >\n <mat-icon class=\"row-button-icon\">content_copy</mat-icon>\n </button>\n <button\n mat-raised-button\n class=\"remove-charset\"\n [ngStyle]=\"buttonStyle()\"\n (click)=\"removeCharset(i)\"\n [disabled]=\"this.charsets?.value.length === 1\"\n >\n <mat-icon class=\"row-button-icon\">remove</mat-icon>\n </button>\n <button\n mat-raised-button\n [ngStyle]=\"buttonStyle()\"\n (click)=\"addCharset()\"\n >\n <mat-icon class=\"row-button-icon\">add</mat-icon>\n </button>\n </div>\n }\n </div>\n </div>\n <mat-form-field class=\"fixed-width\" appearance=\"outline\">\n <mat-label [ngStyle]=\"textStyle()\">suffix (optional)</mat-label>\n <input\n [ngStyle]=\"textStyle()\"\n matInput\n type=\"text\"\n id=\"suffix\"\n formControlName=\"suffix\"\n (keydown.enter)=\"$event.preventDefault()\"\n />\n </mat-form-field>\n </form>\n }\n </div>\n @if (wordlist$) {\n <div class=\"wordlist-container flex-column flex-fxflex\">\n @if (displayWordlist) {\n <h3 class=\"wordlist-header\">Generated wordlist:</h3>\n <code class=\"wordlist\">\n {{ wordlist$ | async }}\n </code>\n } @else {\n The generated wordlist is too large to be displayed. You can still\n download it.\n }\n </div>\n }\n</div>\n", styles: [".flex-align-start{justify-content:flex-start}.flex-align-stretch{align-content:stretch;align-items:stretch}.flex-column{display:flex;flex-direction:column;box-sizing:border-box}.flex-row{display:flex;flex-direction:row;box-sizing:border-box}.flex-row-wrap{display:flex;flex-direction:row;flex-wrap:wrap;box-sizing:border-box}.flex-fxflex{flex:1 1 0%}.flex-fxflex-responsive{flex:0 1 calc(33.3% - 32px)}.flex-fxflex-lt-md{flex:0 1 calc(50% - 32px)}.flex-fxflex-lt-sm{flex:100%}.flex-fxflex-fill{height:100%;min-height:100%;min-width:100%;width:100%}.flex-gap-5{margin-right:5px}.flex-gap-12{margin-right:12px}.flex-gap-20{margin-right:20px}.meta-container{max-width:100vw}.meta-container .form-container{float:left}.meta-container .form-container .charset-container .drag-indicator{height:20px;width:20px;margin-right:10px}.meta-container .form-container .charset-container .clone-charset{margin:0 10px}.meta-container .form-container .charset-container .remove-charset{margin-right:10px}@media screen and (max-width: 430px){.meta-container .form-container .charset-container{margin-bottom:15px}}.meta-container .form-container .charset{width:19.15em}.meta-container .form-container .charset-container:not(:last-child) .add-charset{display:none}.meta-container .form-container .choose-format{margin:0 34px 10px;width:150px;line-height:36px;letter-spacing:normal}.meta-container .form-container .generate-wordlist,.meta-container .form-container .download-wordlist{margin:0 0 10px;width:150px;line-height:36px;letter-spacing:normal}.meta-container .wordlist-container{max-height:80vh}.meta-container .wordlist-container .wordlist-header{margin-top:0}.meta-container .wordlist-container .wordlist{font-size:12px;margin-left:1em;overflow-wrap:normal;width:1%}.row-button-icon{font-size:24px!important;height:24px!important;width:24px!important;margin:0!important}.mat-mdc-menu-panel{width:150px}.mat-mdc-menu-item-text{line-height:48px!important;letter-spacing:normal!important;font-size:14px!important}.mat-mdc-form-field{height:50px!important}.mat-mdc-form-field-infix{height:42px!important;min-height:42px!important;max-height:42px!important;border:0!important;padding:.5em 0!important}.mat-mdc-text-field-wrapper{height:42px!important;padding-left:12px!important;padding-bottom:0!important}.mat-mdc-floating-label:not(.mdc-floating-label--float-above){top:19px!important}.mat-mdc-form-field:not(.mat-form-field-no-animations) .mdc-floating-label{transition:none!important}.fixed-width{width:21em}.bottom-10{margin-bottom:10px}\n"], dependencies: [{ kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i1.MatButton, selector: " button[matButton], a[matButton], button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button], a[mat-button], a[mat-raised-button], a[mat-flat-button], a[mat-stroked-button] ", inputs: ["matButton"], exportAs: ["matButton", "matAnchor"] }, { kind: "directive", type: NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "ngmodule", type: MatMenuModule }, { kind: "component", type: i2.MatMenu, selector: "mat-menu", inputs: ["backdropClass", "aria-label", "aria-labelledby", "aria-describedby", "xPosition", "yPosition", "overlapTrigger", "hasBackdrop", "class", "classList"], outputs: ["closed", "close"], exportAs: ["matMenu"] }, { kind: "component", type: i2.MatMenuItem, selector: "[mat-menu-item]", inputs: ["role", "disabled", "disableRipple"], exportAs: ["matMenuItem"] }, { kind: "directive", type: i2.MatMenuTrigger, selector: "[mat-menu-trigger-for], [matMenuTriggerFor]", inputs: ["mat-menu-trigger-for", "matMenuTriggerFor", "matMenuTriggerData", "matMenuTriggerRestoreFocus"], outputs: ["menuOpened", "onMenuOpen", "menuClosed", "onMenuClose"], exportAs: ["matMenuTrigger"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i3.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i3.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i3.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i3.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i3.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "directive", type: i3.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i3.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "directive", type: i3.FormArrayName, selector: "[formArrayName]", inputs: ["formArrayName"] }, { kind: "ngmodule", type: MatFormFieldModule }, { kind: "component", type: i4.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i4.MatLabel, selector: "mat-label" }, { kind: "ngmodule", type: MatInputModule }, { kind: "directive", type: i5.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly", "disabledInteractive"], exportAs: ["matInput"] }, { kind: "directive", type: CdkDropList, selector: "[cdkDropList], cdk-drop-list", inputs: ["cdkDropListConnectedTo", "cdkDropListData", "cdkDropListOrientation", "id", "cdkDropListLockAxis", "cdkDropListDisabled", "cdkDropListSortingDisabled", "cdkDropListEnterPredicate", "cdkDropListSortPredicate", "cdkDropListAutoScrollDisabled", "cdkDropListAutoScrollStep", "cdkDropListElementContainer"], outputs: ["cdkDropListDropped", "cdkDropListEntered", "cdkDropListExited", "cdkDropListSorted"], exportAs: ["cdkDropList"] }, { kind: "directive", type: CdkDrag, selector: "[cdkDrag]", inputs: ["cdkDragData", "cdkDragLockAxis", "cdkDragRootElement", "cdkDragBoundary", "cdkDragStartDelay", "cdkDragFreeDragPosition", "cdkDragDisabled", "cdkDragConstrainPosition", "cdkDragPreviewClass", "cdkDragPreviewContainer", "cdkDragScale"], outputs: ["cdkDragStarted", "cdkDragReleased", "cdkDragEnded", "cdkDragEntered", "cdkDragExited", "cdkDragDropped", "cdkDragMoved"], exportAs: ["cdkDrag"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i6.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "pipe", type: AsyncPipe, name: "async" }], encapsulation: i0.ViewEncapsulation.None }); }
|
|
269
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.1.6", ngImport: i0, type: WordlistGeneratorComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
270
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.1.6", type: WordlistGeneratorComponent, isStandalone: true, selector: "wordlist-generator", inputs: { buttonStyle: { classPropertyName: "buttonStyle", publicName: "buttonStyle", isSignal: true, isRequired: false, transformFunction: null }, dragStyle: { classPropertyName: "dragStyle", publicName: "dragStyle", isSignal: true, isRequired: false, transformFunction: null }, textStyle: { classPropertyName: "textStyle", publicName: "textStyle", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0, template: "<div class=\"meta-container flex-row-wrap\">\n <div class=\"form-container flex-column flex-fxflex\">\n <div class=\"flex-row-wrap bottom-10\">\n <button\n class=\"generate-wordlist\"\n [ngStyle]=\"buttonStyle()\"\n mat-raised-button\n (click)=\"generateWordlist()\"\n [disabled]=\"isGenerating()\"\n >\n @if (isGenerating()) {\n Generating...\n } @else {\n Generate wordlist\n }\n </button>\n @if (hasWordlist() && !isGenerating()) {\n <button\n class=\"choose-format\"\n [ngStyle]=\"buttonStyle()\"\n mat-raised-button\n [matMenuTriggerFor]=\"menu\"\n >\n Choose format\n </button>\n }\n <mat-menu #menu=\"matMenu\">\n @for (type of fileTypes; track type) {\n <button\n [ngStyle]=\"buttonStyle()\"\n mat-menu-item\n (click)=\"fileType.set(type)\"\n >\n {{ type }}\n </button>\n }\n </mat-menu>\n @if (hasWordlist() && !isGenerating()) {\n <button\n class=\"download-wordlist\"\n [ngStyle]=\"buttonStyle()\"\n mat-raised-button\n (click)=\"downloadWordlist()\"\n >\n Download as\n @if (this.fileType()) {\n {{ this.fileType() }}\n }\n </button>\n }\n </div>\n \n @if (isGenerating() && isLargeDataset()) {\n <div class=\"progress-container\">\n <mat-progress-bar mode=\"indeterminate\" role=\"progressbar\" aria-label=\"Generating wordlist\"></mat-progress-bar>\n <p [ngStyle]=\"textStyle()\">Processing large dataset using Web Worker...</p>\n </div>\n }\n \n @if (charsetForm) {\n <form [formGroup]=\"charsetForm\">\n <mat-form-field class=\"fixed-width bottom-10\" appearance=\"outline\">\n <mat-label [ngStyle]=\"textStyle()\">prefix (optional)</mat-label>\n <input\n [ngStyle]=\"textStyle()\"\n matInput\n type=\"text\"\n id=\"prefix\"\n formControlName=\"prefix\"\n (keydown.enter)=\"$event.preventDefault()\"\n />\n </mat-form-field>\n <div formArrayName=\"charsets\">\n <div cdkDropList (cdkDropListDropped)=\"drop($event)\">\n @for (\n charset of charsets?.controls;\n track charset;\n let i = $index\n ) {\n <div class=\"charset-container\" cdkDrag>\n <mat-icon class=\"drag-indicator\" [ngStyle]=\"dragStyle()\"\n >drag_indicator</mat-icon\n >\n <mat-form-field class=\"charset bottom-10\" appearance=\"outline\">\n <mat-label [ngStyle]=\"textStyle()\">\n character set for string position {{ i }}\n </mat-label>\n <input\n [ngStyle]=\"textStyle()\"\n matInput\n type=\"text\"\n id=\"position-{{ i }}\"\n [formControlName]=\"i\"\n (keydown.enter)=\"$event.preventDefault()\"\n required\n />\n </mat-form-field>\n <button\n mat-raised-button\n class=\"clone-charset\"\n [ngStyle]=\"buttonStyle()\"\n (click)=\"cloneCharset(i)\"\n >\n <mat-icon class=\"row-button-icon\">content_copy</mat-icon>\n </button>\n <button\n mat-raised-button\n class=\"remove-charset\"\n [ngStyle]=\"buttonStyle()\"\n (click)=\"removeCharset(i)\"\n [disabled]=\"this.charsets?.value.length === 1\"\n >\n <mat-icon class=\"row-button-icon\">remove</mat-icon>\n </button>\n <button\n mat-raised-button\n [ngStyle]=\"buttonStyle()\"\n (click)=\"addCharset()\"\n >\n <mat-icon class=\"row-button-icon\">add</mat-icon>\n </button>\n </div>\n }\n </div>\n </div>\n <mat-form-field class=\"fixed-width\" appearance=\"outline\">\n <mat-label [ngStyle]=\"textStyle()\">suffix (optional)</mat-label>\n <input\n [ngStyle]=\"textStyle()\"\n matInput\n type=\"text\"\n id=\"suffix\"\n formControlName=\"suffix\"\n (keydown.enter)=\"$event.preventDefault()\"\n />\n </mat-form-field>\n </form>\n }\n </div>\n @if (hasWordlist()) {\n <div class=\"wordlist-container flex-column flex-fxflex\">\n @if (displayWordlist()) {\n <h3 class=\"wordlist-header\">Generated wordlist:</h3>\n <code class=\"wordlist\">\n {{ wordlist() }}\n </code>\n } @else {\n The generated wordlist is too large to be displayed. You can still\n download it.\n <!-- Wordlist is already loaded in the signal for large datasets -->\n }\n </div>\n }\n</div>\n", styles: [".flex-align-start{justify-content:flex-start}.flex-align-stretch{align-content:stretch;align-items:stretch}.flex-column{display:flex;flex-direction:column;box-sizing:border-box}.flex-row{display:flex;flex-direction:row;box-sizing:border-box}.flex-row-wrap{display:flex;flex-direction:row;flex-wrap:wrap;box-sizing:border-box}.flex-fxflex{flex:1 1 0%}.flex-fxflex-responsive{flex:0 1 calc(33.3% - 32px)}.flex-fxflex-lt-md{flex:0 1 calc(50% - 32px)}.flex-fxflex-lt-sm{flex:100%}.flex-fxflex-fill{height:100%;min-height:100%;min-width:100%;width:100%}.flex-gap-5{margin-right:5px}.flex-gap-12{margin-right:12px}.flex-gap-20{margin-right:20px}.meta-container{max-width:100vw}.meta-container .form-container{float:left}.meta-container .form-container .charset-container .drag-indicator{height:20px;width:20px;margin-right:10px}.meta-container .form-container .charset-container .clone-charset{margin:0 10px}.meta-container .form-container .charset-container .remove-charset{margin-right:10px}@media screen and (max-width: 430px){.meta-container .form-container .charset-container{margin-bottom:15px}}.meta-container .form-container .charset{width:19.15em}.meta-container .form-container .charset-container:not(:last-child) .add-charset{display:none}.meta-container .form-container .choose-format{margin:0 34px 10px;width:150px;line-height:36px;letter-spacing:normal}.meta-container .form-container .generate-wordlist,.meta-container .form-container .download-wordlist{margin:0 0 10px;width:150px;line-height:36px;letter-spacing:normal}.meta-container .wordlist-container{max-height:80vh}.meta-container .wordlist-container .wordlist-header{margin-top:0}.meta-container .wordlist-container .wordlist{font-size:12px;margin-left:1em;overflow-wrap:normal;width:1%}.row-button-icon{font-size:24px!important;height:24px!important;width:24px!important;margin:0!important}.mat-mdc-menu-panel{width:150px}.mat-mdc-menu-item-text{line-height:48px!important;letter-spacing:normal!important;font-size:14px!important}.mat-mdc-form-field{height:50px!important}.mat-mdc-form-field-infix{height:42px!important;min-height:42px!important;max-height:42px!important;border:0!important;padding:.5em 0!important}.mat-mdc-text-field-wrapper{height:42px!important;padding-left:12px!important;padding-bottom:0!important}.mat-mdc-floating-label:not(.mdc-floating-label--float-above){top:19px!important}.mat-mdc-form-field:not(.mat-form-field-no-animations) .mdc-floating-label{transition:none!important}.fixed-width{width:21em}.bottom-10{margin-bottom:10px}\n"], dependencies: [{ kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i1.MatButton, selector: " button[matButton], a[matButton], button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button], a[mat-button], a[mat-raised-button], a[mat-flat-button], a[mat-stroked-button] ", inputs: ["matButton"], exportAs: ["matButton", "matAnchor"] }, { kind: "directive", type: NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "ngmodule", type: MatMenuModule }, { kind: "component", type: i2.MatMenu, selector: "mat-menu", inputs: ["backdropClass", "aria-label", "aria-labelledby", "aria-describedby", "xPosition", "yPosition", "overlapTrigger", "hasBackdrop", "class", "classList"], outputs: ["closed", "close"], exportAs: ["matMenu"] }, { kind: "component", type: i2.MatMenuItem, selector: "[mat-menu-item]", inputs: ["role", "disabled", "disableRipple"], exportAs: ["matMenuItem"] }, { kind: "directive", type: i2.MatMenuTrigger, selector: "[mat-menu-trigger-for], [matMenuTriggerFor]", inputs: ["mat-menu-trigger-for", "matMenuTriggerFor", "matMenuTriggerData", "matMenuTriggerRestoreFocus"], outputs: ["menuOpened", "onMenuOpen", "menuClosed", "onMenuClose"], exportAs: ["matMenuTrigger"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i3.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i3.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i3.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i3.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i3.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "directive", type: i3.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i3.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "directive", type: i3.FormArrayName, selector: "[formArrayName]", inputs: ["formArrayName"] }, { kind: "ngmodule", type: MatFormFieldModule }, { kind: "component", type: i4.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i4.MatLabel, selector: "mat-label" }, { kind: "ngmodule", type: MatInputModule }, { kind: "directive", type: i5.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly", "disabledInteractive"], exportAs: ["matInput"] }, { kind: "directive", type: CdkDropList, selector: "[cdkDropList], cdk-drop-list", inputs: ["cdkDropListConnectedTo", "cdkDropListData", "cdkDropListOrientation", "id", "cdkDropListLockAxis", "cdkDropListDisabled", "cdkDropListSortingDisabled", "cdkDropListEnterPredicate", "cdkDropListSortPredicate", "cdkDropListAutoScrollDisabled", "cdkDropListAutoScrollStep", "cdkDropListElementContainer", "cdkDropListHasAnchor"], outputs: ["cdkDropListDropped", "cdkDropListEntered", "cdkDropListExited", "cdkDropListSorted"], exportAs: ["cdkDropList"] }, { kind: "directive", type: CdkDrag, selector: "[cdkDrag]", inputs: ["cdkDragData", "cdkDragLockAxis", "cdkDragRootElement", "cdkDragBoundary", "cdkDragStartDelay", "cdkDragFreeDragPosition", "cdkDragDisabled", "cdkDragConstrainPosition", "cdkDragPreviewClass", "cdkDragPreviewContainer", "cdkDragScale"], outputs: ["cdkDragStarted", "cdkDragReleased", "cdkDragEnded", "cdkDragEntered", "cdkDragExited", "cdkDragDropped", "cdkDragMoved"], exportAs: ["cdkDrag"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i6.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "ngmodule", type: MatProgressBarModule }, { kind: "component", type: i7.MatProgressBar, selector: "mat-progress-bar", inputs: ["color", "value", "bufferValue", "mode"], outputs: ["animationEnd"], exportAs: ["matProgressBar"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
|
|
200
271
|
}
|
|
201
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.
|
|
272
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.1.6", ngImport: i0, type: WordlistGeneratorComponent, decorators: [{
|
|
202
273
|
type: Component,
|
|
203
274
|
args: [{ selector: 'wordlist-generator', encapsulation: ViewEncapsulation.None, imports: [
|
|
204
275
|
MatButtonModule,
|
|
@@ -210,9 +281,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.0.3", ngImpor
|
|
|
210
281
|
CdkDropList,
|
|
211
282
|
CdkDrag,
|
|
212
283
|
MatIconModule,
|
|
213
|
-
|
|
214
|
-
], template: "<div class=\"meta-container flex-row-wrap\">\n <div class=\"form-container flex-column flex-fxflex\">\n <div class=\"flex-row-wrap bottom-10\">\n <button\n class=\"generate-wordlist\"\n [ngStyle]=\"buttonStyle()\"\n mat-raised-button\n (click)=\"generateWordlist()\"\n >\n Generate wordlist\n </button>\n @if (
|
|
215
|
-
}] });
|
|
284
|
+
MatProgressBarModule
|
|
285
|
+
], changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"meta-container flex-row-wrap\">\n <div class=\"form-container flex-column flex-fxflex\">\n <div class=\"flex-row-wrap bottom-10\">\n <button\n class=\"generate-wordlist\"\n [ngStyle]=\"buttonStyle()\"\n mat-raised-button\n (click)=\"generateWordlist()\"\n [disabled]=\"isGenerating()\"\n >\n @if (isGenerating()) {\n Generating...\n } @else {\n Generate wordlist\n }\n </button>\n @if (hasWordlist() && !isGenerating()) {\n <button\n class=\"choose-format\"\n [ngStyle]=\"buttonStyle()\"\n mat-raised-button\n [matMenuTriggerFor]=\"menu\"\n >\n Choose format\n </button>\n }\n <mat-menu #menu=\"matMenu\">\n @for (type of fileTypes; track type) {\n <button\n [ngStyle]=\"buttonStyle()\"\n mat-menu-item\n (click)=\"fileType.set(type)\"\n >\n {{ type }}\n </button>\n }\n </mat-menu>\n @if (hasWordlist() && !isGenerating()) {\n <button\n class=\"download-wordlist\"\n [ngStyle]=\"buttonStyle()\"\n mat-raised-button\n (click)=\"downloadWordlist()\"\n >\n Download as\n @if (this.fileType()) {\n {{ this.fileType() }}\n }\n </button>\n }\n </div>\n \n @if (isGenerating() && isLargeDataset()) {\n <div class=\"progress-container\">\n <mat-progress-bar mode=\"indeterminate\" role=\"progressbar\" aria-label=\"Generating wordlist\"></mat-progress-bar>\n <p [ngStyle]=\"textStyle()\">Processing large dataset using Web Worker...</p>\n </div>\n }\n \n @if (charsetForm) {\n <form [formGroup]=\"charsetForm\">\n <mat-form-field class=\"fixed-width bottom-10\" appearance=\"outline\">\n <mat-label [ngStyle]=\"textStyle()\">prefix (optional)</mat-label>\n <input\n [ngStyle]=\"textStyle()\"\n matInput\n type=\"text\"\n id=\"prefix\"\n formControlName=\"prefix\"\n (keydown.enter)=\"$event.preventDefault()\"\n />\n </mat-form-field>\n <div formArrayName=\"charsets\">\n <div cdkDropList (cdkDropListDropped)=\"drop($event)\">\n @for (\n charset of charsets?.controls;\n track charset;\n let i = $index\n ) {\n <div class=\"charset-container\" cdkDrag>\n <mat-icon class=\"drag-indicator\" [ngStyle]=\"dragStyle()\"\n >drag_indicator</mat-icon\n >\n <mat-form-field class=\"charset bottom-10\" appearance=\"outline\">\n <mat-label [ngStyle]=\"textStyle()\">\n character set for string position {{ i }}\n </mat-label>\n <input\n [ngStyle]=\"textStyle()\"\n matInput\n type=\"text\"\n id=\"position-{{ i }}\"\n [formControlName]=\"i\"\n (keydown.enter)=\"$event.preventDefault()\"\n required\n />\n </mat-form-field>\n <button\n mat-raised-button\n class=\"clone-charset\"\n [ngStyle]=\"buttonStyle()\"\n (click)=\"cloneCharset(i)\"\n >\n <mat-icon class=\"row-button-icon\">content_copy</mat-icon>\n </button>\n <button\n mat-raised-button\n class=\"remove-charset\"\n [ngStyle]=\"buttonStyle()\"\n (click)=\"removeCharset(i)\"\n [disabled]=\"this.charsets?.value.length === 1\"\n >\n <mat-icon class=\"row-button-icon\">remove</mat-icon>\n </button>\n <button\n mat-raised-button\n [ngStyle]=\"buttonStyle()\"\n (click)=\"addCharset()\"\n >\n <mat-icon class=\"row-button-icon\">add</mat-icon>\n </button>\n </div>\n }\n </div>\n </div>\n <mat-form-field class=\"fixed-width\" appearance=\"outline\">\n <mat-label [ngStyle]=\"textStyle()\">suffix (optional)</mat-label>\n <input\n [ngStyle]=\"textStyle()\"\n matInput\n type=\"text\"\n id=\"suffix\"\n formControlName=\"suffix\"\n (keydown.enter)=\"$event.preventDefault()\"\n />\n </mat-form-field>\n </form>\n }\n </div>\n @if (hasWordlist()) {\n <div class=\"wordlist-container flex-column flex-fxflex\">\n @if (displayWordlist()) {\n <h3 class=\"wordlist-header\">Generated wordlist:</h3>\n <code class=\"wordlist\">\n {{ wordlist() }}\n </code>\n } @else {\n The generated wordlist is too large to be displayed. You can still\n download it.\n <!-- Wordlist is already loaded in the signal for large datasets -->\n }\n </div>\n }\n</div>\n", styles: [".flex-align-start{justify-content:flex-start}.flex-align-stretch{align-content:stretch;align-items:stretch}.flex-column{display:flex;flex-direction:column;box-sizing:border-box}.flex-row{display:flex;flex-direction:row;box-sizing:border-box}.flex-row-wrap{display:flex;flex-direction:row;flex-wrap:wrap;box-sizing:border-box}.flex-fxflex{flex:1 1 0%}.flex-fxflex-responsive{flex:0 1 calc(33.3% - 32px)}.flex-fxflex-lt-md{flex:0 1 calc(50% - 32px)}.flex-fxflex-lt-sm{flex:100%}.flex-fxflex-fill{height:100%;min-height:100%;min-width:100%;width:100%}.flex-gap-5{margin-right:5px}.flex-gap-12{margin-right:12px}.flex-gap-20{margin-right:20px}.meta-container{max-width:100vw}.meta-container .form-container{float:left}.meta-container .form-container .charset-container .drag-indicator{height:20px;width:20px;margin-right:10px}.meta-container .form-container .charset-container .clone-charset{margin:0 10px}.meta-container .form-container .charset-container .remove-charset{margin-right:10px}@media screen and (max-width: 430px){.meta-container .form-container .charset-container{margin-bottom:15px}}.meta-container .form-container .charset{width:19.15em}.meta-container .form-container .charset-container:not(:last-child) .add-charset{display:none}.meta-container .form-container .choose-format{margin:0 34px 10px;width:150px;line-height:36px;letter-spacing:normal}.meta-container .form-container .generate-wordlist,.meta-container .form-container .download-wordlist{margin:0 0 10px;width:150px;line-height:36px;letter-spacing:normal}.meta-container .wordlist-container{max-height:80vh}.meta-container .wordlist-container .wordlist-header{margin-top:0}.meta-container .wordlist-container .wordlist{font-size:12px;margin-left:1em;overflow-wrap:normal;width:1%}.row-button-icon{font-size:24px!important;height:24px!important;width:24px!important;margin:0!important}.mat-mdc-menu-panel{width:150px}.mat-mdc-menu-item-text{line-height:48px!important;letter-spacing:normal!important;font-size:14px!important}.mat-mdc-form-field{height:50px!important}.mat-mdc-form-field-infix{height:42px!important;min-height:42px!important;max-height:42px!important;border:0!important;padding:.5em 0!important}.mat-mdc-text-field-wrapper{height:42px!important;padding-left:12px!important;padding-bottom:0!important}.mat-mdc-floating-label:not(.mdc-floating-label--float-above){top:19px!important}.mat-mdc-form-field:not(.mat-form-field-no-animations) .mdc-floating-label{transition:none!important}.fixed-width{width:21em}.bottom-10{margin-bottom:10px}\n"] }]
|
|
286
|
+
}], ctorParameters: () => [] });
|
|
216
287
|
|
|
217
288
|
/**
|
|
218
289
|
* Generated bundle index. Do not edit.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tehw0lf-wordlist-generator.mjs","sources":["../tmp-esm2022/lib/filetypes.js","../tmp-esm2022/lib/parsers.js","../tmp-esm2022/lib/wordlist-generator.service.js","../tmp-esm2022/lib/wordlist-generator.component.js","../tmp-esm2022/tehw0lf-wordlist-generator.js"],"sourcesContent":["export var FileType;\n(function (FileType) {\n FileType[\"plaintext\"] = \"txt\";\n FileType[\"xml\"] = \"xml\";\n FileType[\"csv\"] = \"csv\";\n})(FileType || (FileType = {}));\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmlsZXR5cGVzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vbGlicy93b3JkbGlzdC1nZW5lcmF0b3Ivc3JjL2xpYi9maWxldHlwZXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsTUFBTSxDQUFOLElBQVksUUFJWDtBQUpELFdBQVksUUFBUTtJQUNsQiw2QkFBaUIsQ0FBQTtJQUNqQix1QkFBVyxDQUFBO0lBQ1gsdUJBQVcsQ0FBQTtBQUNiLENBQUMsRUFKVyxRQUFRLEtBQVIsUUFBUSxRQUluQiIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCBlbnVtIEZpbGVUeXBlIHtcbiAgcGxhaW50ZXh0ID0gJ3R4dCcsXG4gIHhtbCA9ICd4bWwnLFxuICBjc3YgPSAnY3N2J1xufVxuIl19","export const toPlaintext = (wordlist) => ({\n wordlist,\n contentType: 'text/plain'\n});\nexport const toXML = (wordlist) => {\n const head = '<wordlist><word>';\n const glue = '</word><word>';\n const tail = '</word></wordlist>';\n return {\n wordlist: head + wordlist.replace(/\\n/g, glue) + tail,\n contentType: 'text/xml'\n };\n};\nexport const toCSV = (wordlist) => {\n const glue = ',';\n return {\n wordlist: wordlist.replace(/\\n/g, glue),\n contentType: 'text/csv'\n };\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGFyc2Vycy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL2xpYnMvd29yZGxpc3QtZ2VuZXJhdG9yL3NyYy9saWIvcGFyc2Vycy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxNQUFNLENBQUMsTUFBTSxXQUFXLEdBQUcsQ0FDekIsUUFBZ0IsRUFDMkIsRUFBRSxDQUFDLENBQUM7SUFDL0MsUUFBUTtJQUNSLFdBQVcsRUFBRSxZQUFZO0NBQzFCLENBQUMsQ0FBQztBQUVILE1BQU0sQ0FBQyxNQUFNLEtBQUssR0FBRyxDQUNuQixRQUFnQixFQUMyQixFQUFFO0lBQzdDLE1BQU0sSUFBSSxHQUFHLGtCQUFrQixDQUFDO0lBQ2hDLE1BQU0sSUFBSSxHQUFHLGVBQWUsQ0FBQztJQUM3QixNQUFNLElBQUksR0FBRyxvQkFBb0IsQ0FBQztJQUNsQyxPQUFPO1FBQ0wsUUFBUSxFQUFFLElBQUksR0FBRyxRQUFRLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsR0FBRyxJQUFJO1FBQ3JELFdBQVcsRUFBRSxVQUFVO0tBQ3hCLENBQUM7QUFDSixDQUFDLENBQUM7QUFFRixNQUFNLENBQUMsTUFBTSxLQUFLLEdBQUcsQ0FDbkIsUUFBZ0IsRUFDMkIsRUFBRTtJQUM3QyxNQUFNLElBQUksR0FBRyxHQUFHLENBQUM7SUFDakIsT0FBTztRQUNMLFFBQVEsRUFBRSxRQUFRLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUM7UUFDdkMsV0FBVyxFQUFFLFVBQVU7S0FDeEIsQ0FBQztBQUNKLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCBjb25zdCB0b1BsYWludGV4dCA9IChcbiAgd29yZGxpc3Q6IHN0cmluZ1xuKTogeyB3b3JkbGlzdDogc3RyaW5nOyBjb250ZW50VHlwZTogc3RyaW5nIH0gPT4gKHtcbiAgd29yZGxpc3QsXG4gIGNvbnRlbnRUeXBlOiAndGV4dC9wbGFpbidcbn0pO1xuXG5leHBvcnQgY29uc3QgdG9YTUwgPSAoXG4gIHdvcmRsaXN0OiBzdHJpbmdcbik6IHsgd29yZGxpc3Q6IHN0cmluZzsgY29udGVudFR5cGU6IHN0cmluZyB9ID0+IHtcbiAgY29uc3QgaGVhZCA9ICc8d29yZGxpc3Q+PHdvcmQ+JztcbiAgY29uc3QgZ2x1ZSA9ICc8L3dvcmQ+PHdvcmQ+JztcbiAgY29uc3QgdGFpbCA9ICc8L3dvcmQ+PC93b3JkbGlzdD4nO1xuICByZXR1cm4ge1xuICAgIHdvcmRsaXN0OiBoZWFkICsgd29yZGxpc3QucmVwbGFjZSgvXFxuL2csIGdsdWUpICsgdGFpbCxcbiAgICBjb250ZW50VHlwZTogJ3RleHQveG1sJ1xuICB9O1xufTtcblxuZXhwb3J0IGNvbnN0IHRvQ1NWID0gKFxuICB3b3JkbGlzdDogc3RyaW5nXG4pOiB7IHdvcmRsaXN0OiBzdHJpbmc7IGNvbnRlbnRUeXBlOiBzdHJpbmcgfSA9PiB7XG4gIGNvbnN0IGdsdWUgPSAnLCc7XG4gIHJldHVybiB7XG4gICAgd29yZGxpc3Q6IHdvcmRsaXN0LnJlcGxhY2UoL1xcbi9nLCBnbHVlKSxcbiAgICBjb250ZW50VHlwZTogJ3RleHQvY3N2J1xuICB9O1xufTtcbiJdfQ==","import { Injectable } from '@angular/core';\nimport { product } from 'cartesian-product-generator';\nimport { from } from 'rxjs';\nimport { map } from 'rxjs/operators';\nimport * as i0 from \"@angular/core\";\nexport class WordlistGeneratorService {\n generateWordlist(...charsets) {\n return from(product(...charsets)).pipe(map((word) => {\n return word.join('');\n }));\n }\n static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: \"12.0.0\", version: \"20.0.3\", ngImport: i0, type: WordlistGeneratorService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }\n static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: \"12.0.0\", version: \"20.0.3\", ngImport: i0, type: WordlistGeneratorService, providedIn: 'root' }); }\n}\ni0.ɵɵngDeclareClassMetadata({ minVersion: \"12.0.0\", version: \"20.0.3\", ngImport: i0, type: WordlistGeneratorService, decorators: [{\n type: Injectable,\n args: [{\n providedIn: 'root'\n }]\n }] });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid29yZGxpc3QtZ2VuZXJhdG9yLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9saWJzL3dvcmRsaXN0LWdlbmVyYXRvci9zcmMvbGliL3dvcmRsaXN0LWdlbmVyYXRvci5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDM0MsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBQ3RELE9BQU8sRUFBRSxJQUFJLEVBQWMsTUFBTSxNQUFNLENBQUM7QUFDeEMsT0FBTyxFQUFFLEdBQUcsRUFBRSxNQUFNLGdCQUFnQixDQUFDOztBQUtyQyxNQUFNLE9BQU8sd0JBQXdCO0lBRW5DLGdCQUFnQixDQUFDLEdBQUcsUUFBa0I7UUFDcEMsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsUUFBUSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQ3BDLEdBQUcsQ0FBQyxDQUFDLElBQWMsRUFBRSxFQUFFO1lBQ3JCLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUN2QixDQUFDLENBQUMsQ0FDSCxDQUFDO0lBQ0osQ0FBQzs4R0FSVSx3QkFBd0I7a0hBQXhCLHdCQUF3QixjQUZ2QixNQUFNOzsyRkFFUCx3QkFBd0I7a0JBSHBDLFVBQVU7bUJBQUM7b0JBQ1YsVUFBVSxFQUFFLE1BQU07aUJBQ25CIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgcHJvZHVjdCB9IGZyb20gJ2NhcnRlc2lhbi1wcm9kdWN0LWdlbmVyYXRvcic7XG5pbXBvcnQgeyBmcm9tLCBPYnNlcnZhYmxlIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBtYXAgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5cbkBJbmplY3RhYmxlKHtcbiAgcHJvdmlkZWRJbjogJ3Jvb3QnXG59KVxuZXhwb3J0IGNsYXNzIFdvcmRsaXN0R2VuZXJhdG9yU2VydmljZSB7XG5cbiAgZ2VuZXJhdGVXb3JkbGlzdCguLi5jaGFyc2V0czogc3RyaW5nW10pOiBPYnNlcnZhYmxlPHN0cmluZz4ge1xuICAgIHJldHVybiBmcm9tKHByb2R1Y3QoLi4uY2hhcnNldHMpKS5waXBlKFxuICAgICAgbWFwKCh3b3JkOiBzdHJpbmdbXSkgPT4ge1xuICAgICAgICByZXR1cm4gd29yZC5qb2luKCcnKTtcbiAgICAgIH0pXG4gICAgKTtcbiAgfVxufVxuIl19","import { CdkDrag, CdkDropList, moveItemInArray } from '@angular/cdk/drag-drop';\nimport { AsyncPipe, NgStyle } from '@angular/common';\nimport { Component, input, ViewEncapsulation, inject } from '@angular/core';\nimport { ReactiveFormsModule, UntypedFormBuilder, Validators } from '@angular/forms';\nimport { MatButtonModule } from '@angular/material/button';\nimport { MatFormFieldModule } from '@angular/material/form-field';\nimport { MatIconModule } from '@angular/material/icon';\nimport { MatInputModule } from '@angular/material/input';\nimport { MatMenuModule } from '@angular/material/menu';\nimport { Subject } from 'rxjs';\nimport { reduce, takeUntil, tap } from 'rxjs/operators';\nimport { FileType } from './filetypes';\nimport { toCSV, toPlaintext, toXML } from './parsers';\nimport { WordlistGeneratorService } from './wordlist-generator.service';\nimport * as i0 from \"@angular/core\";\nimport * as i1 from \"@angular/material/button\";\nimport * as i2 from \"@angular/material/menu\";\nimport * as i3 from \"@angular/forms\";\nimport * as i4 from \"@angular/material/form-field\";\nimport * as i5 from \"@angular/material/input\";\nimport * as i6 from \"@angular/material/icon\";\n/* eslint-disable @angular-eslint/component-selector */\nexport class WordlistGeneratorComponent {\n constructor() {\n this.formBuilder = inject(UntypedFormBuilder);\n this.wordlistGenerator = inject(WordlistGeneratorService);\n this.buttonStyle = input({\n 'background-color': '#333333',\n color: '#cc7832'\n });\n this.dragStyle = input({ color: '#cc7832' });\n this.textStyle = input({ color: '#cc7832' });\n this.displayWordlist = false;\n this.fileType = FileType.plaintext;\n this.fileTypes = Object.values(FileType);\n this.filteredCharset = [];\n this.prefix = '';\n this.suffix = '';\n this.unsubscribe$ = new Subject();\n this.removeDuplicates = (unfiltered) => [...new Set(unfiltered)].join('');\n }\n ngOnInit() {\n this.generateForm();\n }\n ngOnDestroy() {\n this.unsubscribe$.next();\n this.unsubscribe$.complete();\n }\n get charsets() {\n if (this.charsetForm) {\n return this.charsetForm.get('charsets');\n }\n return undefined;\n }\n addCharset() {\n if (this.charsets) {\n this.charsets.push(this.formBuilder.control('', Validators.required));\n }\n }\n cloneCharset(index) {\n if (this.charsets) {\n const charset = this.charsets.value[index];\n this.charsets.insert(index, this.formBuilder.control(charset, Validators.required));\n }\n }\n downloadWordlist() {\n if (this.charsets) {\n if (this.filteredCharset !== this.filterCharset(this.charsets.value)) {\n this.generateWordlist();\n }\n const filename = `wordlist_${this.wordsGenerated}_words_${this.charsets.length}_positions.${this.fileType}`;\n this.getWordlist()\n .pipe(tap((wordlist) => {\n if (wordlist.length > 0) {\n const parsed = this.parseWordlist(wordlist);\n const file = new Blob([parsed.wordlist], {\n type: parsed.contentType\n });\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n if (window.navigator.msSaveOrOpenBlob) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n window.navigator.msSaveOrOpenBlob(file, filename);\n }\n else {\n const a = document.createElement('a');\n const url = URL.createObjectURL(file);\n a.href = url;\n a.download = filename;\n document.body.appendChild(a);\n a.click();\n setTimeout(() => {\n document.body.removeChild(a);\n window.URL.revokeObjectURL(url);\n }, 0);\n }\n }\n }))\n .subscribe();\n }\n }\n drop(event) {\n if (this.charsets) {\n moveItemInArray(this.charsets.controls, event.previousIndex, event.currentIndex);\n this.charsets.updateValueAndValidity();\n }\n }\n generateForm() {\n this.charsetForm = this.formBuilder.group({\n charsets: this.formBuilder.array([\n this.formBuilder.control('', Validators.required)\n ]),\n prefix: this.formBuilder.control(''),\n suffix: this.formBuilder.control('')\n });\n }\n generateWordlist() {\n if (this.charsetForm && this.charsets && this.charsets.valid) {\n this.filteredCharset = this.filterCharset(this.charsets.value);\n this.prefix = this.charsetForm.get('prefix')?.value\n ? this.charsetForm.get('prefix')?.value\n : '';\n this.suffix = this.charsetForm.get('suffix')?.value\n ? this.charsetForm.get('suffix')?.value\n : '';\n this.wordsGenerated = this.filteredCharset\n .map((charset) => charset.length)\n .reduce((previousLength, currentLength) => previousLength * currentLength);\n this.displayWordlist = this.wordsGenerated <= 100;\n this.wordlist$ = this.getWordlist();\n }\n }\n getWordlist() {\n return this.wordlistGenerator\n .generateWordlist(...this.filteredCharset)\n .pipe(reduce((wordlist, word) => `${wordlist}${this.prefix}${word}${this.suffix}\\n`, ''), takeUntil(this.unsubscribe$));\n }\n filterCharset(charsets) {\n return charsets.map((charset) => this.removeDuplicates(charset));\n }\n parseWordlist(wordlist) {\n switch (this.fileType) {\n case FileType.plaintext:\n return toPlaintext(wordlist);\n case FileType.xml:\n return toXML(wordlist);\n case FileType.csv:\n return toCSV(wordlist);\n }\n }\n removeCharset(i) {\n if (this.charsets && this.charsets.length > 1) {\n this.charsets.removeAt(i);\n }\n }\n static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: \"12.0.0\", version: \"20.0.3\", ngImport: i0, type: WordlistGeneratorComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }\n static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: \"17.0.0\", version: \"20.0.3\", type: WordlistGeneratorComponent, isStandalone: true, selector: \"wordlist-generator\", inputs: { buttonStyle: { classPropertyName: \"buttonStyle\", publicName: \"buttonStyle\", isSignal: true, isRequired: false, transformFunction: null }, dragStyle: { classPropertyName: \"dragStyle\", publicName: \"dragStyle\", isSignal: true, isRequired: false, transformFunction: null }, textStyle: { classPropertyName: \"textStyle\", publicName: \"textStyle\", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0, template: \"<div class=\\\"meta-container flex-row-wrap\\\">\\n <div class=\\\"form-container flex-column flex-fxflex\\\">\\n <div class=\\\"flex-row-wrap bottom-10\\\">\\n <button\\n class=\\\"generate-wordlist\\\"\\n [ngStyle]=\\\"buttonStyle()\\\"\\n mat-raised-button\\n (click)=\\\"generateWordlist()\\\"\\n >\\n Generate wordlist\\n </button>\\n @if (wordlist$) {\\n <button\\n class=\\\"choose-format\\\"\\n [ngStyle]=\\\"buttonStyle()\\\"\\n mat-raised-button\\n [matMenuTriggerFor]=\\\"menu\\\"\\n >\\n Choose format\\n </button>\\n }\\n <mat-menu #menu=\\\"matMenu\\\">\\n @for (type of fileTypes; track type) {\\n <button\\n [ngStyle]=\\\"buttonStyle()\\\"\\n mat-menu-item\\n (click)=\\\"fileType = type\\\"\\n >\\n {{ type }}\\n </button>\\n }\\n </mat-menu>\\n @if (wordlist$) {\\n <button\\n class=\\\"download-wordlist\\\"\\n [ngStyle]=\\\"buttonStyle()\\\"\\n mat-raised-button\\n (click)=\\\"downloadWordlist()\\\"\\n >\\n Download as\\n @if (this.fileType) {\\n {{ this.fileType }}\\n }\\n </button>\\n }\\n </div>\\n @if (charsetForm) {\\n <form [formGroup]=\\\"charsetForm\\\">\\n <mat-form-field class=\\\"fixed-width bottom-10\\\" appearance=\\\"outline\\\">\\n <mat-label [ngStyle]=\\\"textStyle()\\\">prefix (optional)</mat-label>\\n <input\\n [ngStyle]=\\\"textStyle()\\\"\\n matInput\\n type=\\\"text\\\"\\n id=\\\"prefix\\\"\\n formControlName=\\\"prefix\\\"\\n (keydown.enter)=\\\"$event.preventDefault()\\\"\\n />\\n </mat-form-field>\\n <div formArrayName=\\\"charsets\\\">\\n <div cdkDropList (cdkDropListDropped)=\\\"drop($event)\\\">\\n @for (\\n charset of charsets?.controls;\\n track charset;\\n let i = $index\\n ) {\\n <div class=\\\"charset-container\\\" cdkDrag>\\n <mat-icon class=\\\"drag-indicator\\\" [ngStyle]=\\\"dragStyle()\\\"\\n >drag_indicator</mat-icon\\n >\\n <mat-form-field class=\\\"charset bottom-10\\\" appearance=\\\"outline\\\">\\n <mat-label [ngStyle]=\\\"textStyle()\\\">\\n character set for string position {{ i }}\\n </mat-label>\\n <input\\n [ngStyle]=\\\"textStyle()\\\"\\n matInput\\n type=\\\"text\\\"\\n id=\\\"position-{{ i }}\\\"\\n [formControlName]=\\\"i\\\"\\n (keydown.enter)=\\\"$event.preventDefault()\\\"\\n required\\n />\\n </mat-form-field>\\n <button\\n mat-raised-button\\n class=\\\"clone-charset\\\"\\n [ngStyle]=\\\"buttonStyle()\\\"\\n (click)=\\\"cloneCharset(i)\\\"\\n >\\n <mat-icon class=\\\"row-button-icon\\\">content_copy</mat-icon>\\n </button>\\n <button\\n mat-raised-button\\n class=\\\"remove-charset\\\"\\n [ngStyle]=\\\"buttonStyle()\\\"\\n (click)=\\\"removeCharset(i)\\\"\\n [disabled]=\\\"this.charsets?.value.length === 1\\\"\\n >\\n <mat-icon class=\\\"row-button-icon\\\">remove</mat-icon>\\n </button>\\n <button\\n mat-raised-button\\n [ngStyle]=\\\"buttonStyle()\\\"\\n (click)=\\\"addCharset()\\\"\\n >\\n <mat-icon class=\\\"row-button-icon\\\">add</mat-icon>\\n </button>\\n </div>\\n }\\n </div>\\n </div>\\n <mat-form-field class=\\\"fixed-width\\\" appearance=\\\"outline\\\">\\n <mat-label [ngStyle]=\\\"textStyle()\\\">suffix (optional)</mat-label>\\n <input\\n [ngStyle]=\\\"textStyle()\\\"\\n matInput\\n type=\\\"text\\\"\\n id=\\\"suffix\\\"\\n formControlName=\\\"suffix\\\"\\n (keydown.enter)=\\\"$event.preventDefault()\\\"\\n />\\n </mat-form-field>\\n </form>\\n }\\n </div>\\n @if (wordlist$) {\\n <div class=\\\"wordlist-container flex-column flex-fxflex\\\">\\n @if (displayWordlist) {\\n <h3 class=\\\"wordlist-header\\\">Generated wordlist:</h3>\\n <code class=\\\"wordlist\\\">\\n {{ wordlist$ | async }}\\n </code>\\n } @else {\\n The generated wordlist is too large to be displayed. You can still\\n download it.\\n }\\n </div>\\n }\\n</div>\\n\", styles: [\".flex-align-start{justify-content:flex-start}.flex-align-stretch{align-content:stretch;align-items:stretch}.flex-column{display:flex;flex-direction:column;box-sizing:border-box}.flex-row{display:flex;flex-direction:row;box-sizing:border-box}.flex-row-wrap{display:flex;flex-direction:row;flex-wrap:wrap;box-sizing:border-box}.flex-fxflex{flex:1 1 0%}.flex-fxflex-responsive{flex:0 1 calc(33.3% - 32px)}.flex-fxflex-lt-md{flex:0 1 calc(50% - 32px)}.flex-fxflex-lt-sm{flex:100%}.flex-fxflex-fill{height:100%;min-height:100%;min-width:100%;width:100%}.flex-gap-5{margin-right:5px}.flex-gap-12{margin-right:12px}.flex-gap-20{margin-right:20px}.meta-container{max-width:100vw}.meta-container .form-container{float:left}.meta-container .form-container .charset-container .drag-indicator{height:20px;width:20px;margin-right:10px}.meta-container .form-container .charset-container .clone-charset{margin:0 10px}.meta-container .form-container .charset-container .remove-charset{margin-right:10px}@media screen and (max-width: 430px){.meta-container .form-container .charset-container{margin-bottom:15px}}.meta-container .form-container .charset{width:19.15em}.meta-container .form-container .charset-container:not(:last-child) .add-charset{display:none}.meta-container .form-container .choose-format{margin:0 34px 10px;width:150px;line-height:36px;letter-spacing:normal}.meta-container .form-container .generate-wordlist,.meta-container .form-container .download-wordlist{margin:0 0 10px;width:150px;line-height:36px;letter-spacing:normal}.meta-container .wordlist-container{max-height:80vh}.meta-container .wordlist-container .wordlist-header{margin-top:0}.meta-container .wordlist-container .wordlist{font-size:12px;margin-left:1em;overflow-wrap:normal;width:1%}.row-button-icon{font-size:24px!important;height:24px!important;width:24px!important;margin:0!important}.mat-mdc-menu-panel{width:150px}.mat-mdc-menu-item-text{line-height:48px!important;letter-spacing:normal!important;font-size:14px!important}.mat-mdc-form-field{height:50px!important}.mat-mdc-form-field-infix{height:42px!important;min-height:42px!important;max-height:42px!important;border:0!important;padding:.5em 0!important}.mat-mdc-text-field-wrapper{height:42px!important;padding-left:12px!important;padding-bottom:0!important}.mat-mdc-floating-label:not(.mdc-floating-label--float-above){top:19px!important}.mat-mdc-form-field:not(.mat-form-field-no-animations) .mdc-floating-label{transition:none!important}.fixed-width{width:21em}.bottom-10{margin-bottom:10px}\\n\"], dependencies: [{ kind: \"ngmodule\", type: MatButtonModule }, { kind: \"component\", type: i1.MatButton, selector: \" button[matButton], a[matButton], button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button], a[mat-button], a[mat-raised-button], a[mat-flat-button], a[mat-stroked-button] \", inputs: [\"matButton\"], exportAs: [\"matButton\", \"matAnchor\"] }, { kind: \"directive\", type: NgStyle, selector: \"[ngStyle]\", inputs: [\"ngStyle\"] }, { kind: \"ngmodule\", type: MatMenuModule }, { kind: \"component\", type: i2.MatMenu, selector: \"mat-menu\", inputs: [\"backdropClass\", \"aria-label\", \"aria-labelledby\", \"aria-describedby\", \"xPosition\", \"yPosition\", \"overlapTrigger\", \"hasBackdrop\", \"class\", \"classList\"], outputs: [\"closed\", \"close\"], exportAs: [\"matMenu\"] }, { kind: \"component\", type: i2.MatMenuItem, selector: \"[mat-menu-item]\", inputs: [\"role\", \"disabled\", \"disableRipple\"], exportAs: [\"matMenuItem\"] }, { kind: \"directive\", type: i2.MatMenuTrigger, selector: \"[mat-menu-trigger-for], [matMenuTriggerFor]\", inputs: [\"mat-menu-trigger-for\", \"matMenuTriggerFor\", \"matMenuTriggerData\", \"matMenuTriggerRestoreFocus\"], outputs: [\"menuOpened\", \"onMenuOpen\", \"menuClosed\", \"onMenuClose\"], exportAs: [\"matMenuTrigger\"] }, { kind: \"ngmodule\", type: ReactiveFormsModule }, { kind: \"directive\", type: i3.ɵNgNoValidate, selector: \"form:not([ngNoForm]):not([ngNativeValidate])\" }, { kind: \"directive\", type: i3.DefaultValueAccessor, selector: \"input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]\" }, { kind: \"directive\", type: i3.NgControlStatus, selector: \"[formControlName],[ngModel],[formControl]\" }, { kind: \"directive\", type: i3.NgControlStatusGroup, selector: \"[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]\" }, { kind: \"directive\", type: i3.RequiredValidator, selector: \":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]\", inputs: [\"required\"] }, { kind: \"directive\", type: i3.FormGroupDirective, selector: \"[formGroup]\", inputs: [\"formGroup\"], outputs: [\"ngSubmit\"], exportAs: [\"ngForm\"] }, { kind: \"directive\", type: i3.FormControlName, selector: \"[formControlName]\", inputs: [\"formControlName\", \"disabled\", \"ngModel\"], outputs: [\"ngModelChange\"] }, { kind: \"directive\", type: i3.FormArrayName, selector: \"[formArrayName]\", inputs: [\"formArrayName\"] }, { kind: \"ngmodule\", type: MatFormFieldModule }, { kind: \"component\", type: i4.MatFormField, selector: \"mat-form-field\", inputs: [\"hideRequiredMarker\", \"color\", \"floatLabel\", \"appearance\", \"subscriptSizing\", \"hintLabel\"], exportAs: [\"matFormField\"] }, { kind: \"directive\", type: i4.MatLabel, selector: \"mat-label\" }, { kind: \"ngmodule\", type: MatInputModule }, { kind: \"directive\", type: i5.MatInput, selector: \"input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]\", inputs: [\"disabled\", \"id\", \"placeholder\", \"name\", \"required\", \"type\", \"errorStateMatcher\", \"aria-describedby\", \"value\", \"readonly\", \"disabledInteractive\"], exportAs: [\"matInput\"] }, { kind: \"directive\", type: CdkDropList, selector: \"[cdkDropList], cdk-drop-list\", inputs: [\"cdkDropListConnectedTo\", \"cdkDropListData\", \"cdkDropListOrientation\", \"id\", \"cdkDropListLockAxis\", \"cdkDropListDisabled\", \"cdkDropListSortingDisabled\", \"cdkDropListEnterPredicate\", \"cdkDropListSortPredicate\", \"cdkDropListAutoScrollDisabled\", \"cdkDropListAutoScrollStep\", \"cdkDropListElementContainer\"], outputs: [\"cdkDropListDropped\", \"cdkDropListEntered\", \"cdkDropListExited\", \"cdkDropListSorted\"], exportAs: [\"cdkDropList\"] }, { kind: \"directive\", type: CdkDrag, selector: \"[cdkDrag]\", inputs: [\"cdkDragData\", \"cdkDragLockAxis\", \"cdkDragRootElement\", \"cdkDragBoundary\", \"cdkDragStartDelay\", \"cdkDragFreeDragPosition\", \"cdkDragDisabled\", \"cdkDragConstrainPosition\", \"cdkDragPreviewClass\", \"cdkDragPreviewContainer\", \"cdkDragScale\"], outputs: [\"cdkDragStarted\", \"cdkDragReleased\", \"cdkDragEnded\", \"cdkDragEntered\", \"cdkDragExited\", \"cdkDragDropped\", \"cdkDragMoved\"], exportAs: [\"cdkDrag\"] }, { kind: \"ngmodule\", type: MatIconModule }, { kind: \"component\", type: i6.MatIcon, selector: \"mat-icon\", inputs: [\"color\", \"inline\", \"svgIcon\", \"fontSet\", \"fontIcon\"], exportAs: [\"matIcon\"] }, { kind: \"pipe\", type: AsyncPipe, name: \"async\" }], encapsulation: i0.ViewEncapsulation.None }); }\n}\ni0.ɵɵngDeclareClassMetadata({ minVersion: \"12.0.0\", version: \"20.0.3\", ngImport: i0, type: WordlistGeneratorComponent, decorators: [{\n type: Component,\n args: [{ selector: 'wordlist-generator', encapsulation: ViewEncapsulation.None, imports: [\n MatButtonModule,\n NgStyle,\n MatMenuModule,\n ReactiveFormsModule,\n MatFormFieldModule,\n MatInputModule,\n CdkDropList,\n CdkDrag,\n MatIconModule,\n AsyncPipe\n ], template: \"<div class=\\\"meta-container flex-row-wrap\\\">\\n <div class=\\\"form-container flex-column flex-fxflex\\\">\\n <div class=\\\"flex-row-wrap bottom-10\\\">\\n <button\\n class=\\\"generate-wordlist\\\"\\n [ngStyle]=\\\"buttonStyle()\\\"\\n mat-raised-button\\n (click)=\\\"generateWordlist()\\\"\\n >\\n Generate wordlist\\n </button>\\n @if (wordlist$) {\\n <button\\n class=\\\"choose-format\\\"\\n [ngStyle]=\\\"buttonStyle()\\\"\\n mat-raised-button\\n [matMenuTriggerFor]=\\\"menu\\\"\\n >\\n Choose format\\n </button>\\n }\\n <mat-menu #menu=\\\"matMenu\\\">\\n @for (type of fileTypes; track type) {\\n <button\\n [ngStyle]=\\\"buttonStyle()\\\"\\n mat-menu-item\\n (click)=\\\"fileType = type\\\"\\n >\\n {{ type }}\\n </button>\\n }\\n </mat-menu>\\n @if (wordlist$) {\\n <button\\n class=\\\"download-wordlist\\\"\\n [ngStyle]=\\\"buttonStyle()\\\"\\n mat-raised-button\\n (click)=\\\"downloadWordlist()\\\"\\n >\\n Download as\\n @if (this.fileType) {\\n {{ this.fileType }}\\n }\\n </button>\\n }\\n </div>\\n @if (charsetForm) {\\n <form [formGroup]=\\\"charsetForm\\\">\\n <mat-form-field class=\\\"fixed-width bottom-10\\\" appearance=\\\"outline\\\">\\n <mat-label [ngStyle]=\\\"textStyle()\\\">prefix (optional)</mat-label>\\n <input\\n [ngStyle]=\\\"textStyle()\\\"\\n matInput\\n type=\\\"text\\\"\\n id=\\\"prefix\\\"\\n formControlName=\\\"prefix\\\"\\n (keydown.enter)=\\\"$event.preventDefault()\\\"\\n />\\n </mat-form-field>\\n <div formArrayName=\\\"charsets\\\">\\n <div cdkDropList (cdkDropListDropped)=\\\"drop($event)\\\">\\n @for (\\n charset of charsets?.controls;\\n track charset;\\n let i = $index\\n ) {\\n <div class=\\\"charset-container\\\" cdkDrag>\\n <mat-icon class=\\\"drag-indicator\\\" [ngStyle]=\\\"dragStyle()\\\"\\n >drag_indicator</mat-icon\\n >\\n <mat-form-field class=\\\"charset bottom-10\\\" appearance=\\\"outline\\\">\\n <mat-label [ngStyle]=\\\"textStyle()\\\">\\n character set for string position {{ i }}\\n </mat-label>\\n <input\\n [ngStyle]=\\\"textStyle()\\\"\\n matInput\\n type=\\\"text\\\"\\n id=\\\"position-{{ i }}\\\"\\n [formControlName]=\\\"i\\\"\\n (keydown.enter)=\\\"$event.preventDefault()\\\"\\n required\\n />\\n </mat-form-field>\\n <button\\n mat-raised-button\\n class=\\\"clone-charset\\\"\\n [ngStyle]=\\\"buttonStyle()\\\"\\n (click)=\\\"cloneCharset(i)\\\"\\n >\\n <mat-icon class=\\\"row-button-icon\\\">content_copy</mat-icon>\\n </button>\\n <button\\n mat-raised-button\\n class=\\\"remove-charset\\\"\\n [ngStyle]=\\\"buttonStyle()\\\"\\n (click)=\\\"removeCharset(i)\\\"\\n [disabled]=\\\"this.charsets?.value.length === 1\\\"\\n >\\n <mat-icon class=\\\"row-button-icon\\\">remove</mat-icon>\\n </button>\\n <button\\n mat-raised-button\\n [ngStyle]=\\\"buttonStyle()\\\"\\n (click)=\\\"addCharset()\\\"\\n >\\n <mat-icon class=\\\"row-button-icon\\\">add</mat-icon>\\n </button>\\n </div>\\n }\\n </div>\\n </div>\\n <mat-form-field class=\\\"fixed-width\\\" appearance=\\\"outline\\\">\\n <mat-label [ngStyle]=\\\"textStyle()\\\">suffix (optional)</mat-label>\\n <input\\n [ngStyle]=\\\"textStyle()\\\"\\n matInput\\n type=\\\"text\\\"\\n id=\\\"suffix\\\"\\n formControlName=\\\"suffix\\\"\\n (keydown.enter)=\\\"$event.preventDefault()\\\"\\n />\\n </mat-form-field>\\n </form>\\n }\\n </div>\\n @if (wordlist$) {\\n <div class=\\\"wordlist-container flex-column flex-fxflex\\\">\\n @if (displayWordlist) {\\n <h3 class=\\\"wordlist-header\\\">Generated wordlist:</h3>\\n <code class=\\\"wordlist\\\">\\n {{ wordlist$ | async }}\\n </code>\\n } @else {\\n The generated wordlist is too large to be displayed. You can still\\n download it.\\n }\\n </div>\\n }\\n</div>\\n\", styles: [\".flex-align-start{justify-content:flex-start}.flex-align-stretch{align-content:stretch;align-items:stretch}.flex-column{display:flex;flex-direction:column;box-sizing:border-box}.flex-row{display:flex;flex-direction:row;box-sizing:border-box}.flex-row-wrap{display:flex;flex-direction:row;flex-wrap:wrap;box-sizing:border-box}.flex-fxflex{flex:1 1 0%}.flex-fxflex-responsive{flex:0 1 calc(33.3% - 32px)}.flex-fxflex-lt-md{flex:0 1 calc(50% - 32px)}.flex-fxflex-lt-sm{flex:100%}.flex-fxflex-fill{height:100%;min-height:100%;min-width:100%;width:100%}.flex-gap-5{margin-right:5px}.flex-gap-12{margin-right:12px}.flex-gap-20{margin-right:20px}.meta-container{max-width:100vw}.meta-container .form-container{float:left}.meta-container .form-container .charset-container .drag-indicator{height:20px;width:20px;margin-right:10px}.meta-container .form-container .charset-container .clone-charset{margin:0 10px}.meta-container .form-container .charset-container .remove-charset{margin-right:10px}@media screen and (max-width: 430px){.meta-container .form-container .charset-container{margin-bottom:15px}}.meta-container .form-container .charset{width:19.15em}.meta-container .form-container .charset-container:not(:last-child) .add-charset{display:none}.meta-container .form-container .choose-format{margin:0 34px 10px;width:150px;line-height:36px;letter-spacing:normal}.meta-container .form-container .generate-wordlist,.meta-container .form-container .download-wordlist{margin:0 0 10px;width:150px;line-height:36px;letter-spacing:normal}.meta-container .wordlist-container{max-height:80vh}.meta-container .wordlist-container .wordlist-header{margin-top:0}.meta-container .wordlist-container .wordlist{font-size:12px;margin-left:1em;overflow-wrap:normal;width:1%}.row-button-icon{font-size:24px!important;height:24px!important;width:24px!important;margin:0!important}.mat-mdc-menu-panel{width:150px}.mat-mdc-menu-item-text{line-height:48px!important;letter-spacing:normal!important;font-size:14px!important}.mat-mdc-form-field{height:50px!important}.mat-mdc-form-field-infix{height:42px!important;min-height:42px!important;max-height:42px!important;border:0!important;padding:.5em 0!important}.mat-mdc-text-field-wrapper{height:42px!important;padding-left:12px!important;padding-bottom:0!important}.mat-mdc-floating-label:not(.mdc-floating-label--float-above){top:19px!important}.mat-mdc-form-field:not(.mat-form-field-no-animations) .mdc-floating-label{transition:none!important}.fixed-width{width:21em}.bottom-10{margin-bottom:10px}\\n\"] }]\n }] });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid29yZGxpc3QtZ2VuZXJhdG9yLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL2xpYnMvd29yZGxpc3QtZ2VuZXJhdG9yL3NyYy9saWIvd29yZGxpc3QtZ2VuZXJhdG9yLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL2xpYnMvd29yZGxpc3QtZ2VuZXJhdG9yL3NyYy9saWIvd29yZGxpc3QtZ2VuZXJhdG9yLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCxPQUFPLEVBRVAsV0FBVyxFQUNYLGVBQWUsRUFDaEIsTUFBTSx3QkFBd0IsQ0FBQztBQUNoQyxPQUFPLEVBQUUsU0FBUyxFQUFFLE9BQU8sRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ3JELE9BQU8sRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFxQixpQkFBaUIsRUFBRSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDL0YsT0FBTyxFQUNMLG1CQUFtQixFQUVuQixrQkFBa0IsRUFFbEIsVUFBVSxFQUNYLE1BQU0sZ0JBQWdCLENBQUM7QUFDeEIsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQzNELE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBQ2xFLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUN2RCxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDekQsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQ3ZELE9BQU8sRUFBYyxPQUFPLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDM0MsT0FBTyxFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUUsR0FBRyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFFeEQsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUN2QyxPQUFP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Z0Ryb3AsXG4gIENka0Ryb3BMaXN0LFxuICBtb3ZlSXRlbUluQXJyYXlcbn0gZnJvbSAnQGFuZ3VsYXIvY2RrL2RyYWctZHJvcCc7XG5pbXBvcnQgeyBBc3luY1BpcGUsIE5nU3R5bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgQ29tcG9uZW50LCBpbnB1dCwgT25EZXN0cm95LCBPbkluaXQsIFZpZXdFbmNhcHN1bGF0aW9uLCBpbmplY3QgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7XG4gIFJlYWN0aXZlRm9ybXNNb2R1bGUsXG4gIFVudHlwZWRGb3JtQXJyYXksXG4gIFVudHlwZWRGb3JtQnVpbGRlcixcbiAgVW50eXBlZEZvcm1Hcm91cCxcbiAgVmFsaWRhdG9yc1xufSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBNYXRCdXR0b25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9idXR0b24nO1xuaW1wb3J0IHsgTWF0Rm9ybUZpZWxkTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvZm9ybS1maWVsZCc7XG5pbXBvcnQgeyBNYXRJY29uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvaWNvbic7XG5pbXBvcnQgeyBNYXRJbnB1dE1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2lucHV0JztcbmltcG9ydCB7IE1hdE1lbnVNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9tZW51JztcbmltcG9ydCB7IE9ic2VydmFibGUsIFN1YmplY3QgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IHJlZHVjZSwgdGFrZVVudGlsLCB0YXAgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5cbmltcG9ydCB7IEZpbGVUeXBlIH0gZnJvbSAnLi9maWxldHlwZXMnO1xuaW1wb3J0IHsgdG9DU1YsIHRvUGxhaW50ZXh0LCB0b1hNTCB9IGZyb20gJy4vcGFyc2Vycyc7XG5pbXBvcnQgeyBXb3JkbGlzdEdlbmVyYXRvclNlcnZpY2UgfSBmcm9tICcuL3dvcmRsaXN0LWdlbmVyYXRvci5zZXJ2aWNlJztcblxuLyogZXNsaW50LWRpc2FibGUgQGFuZ3VsYXItZXNsaW50L2NvbXBvbmVudC1zZWxlY3RvciAqL1xuQENvbXBvbmVudCh7XG4gICAgc2VsZWN0b3I6ICd3b3JkbGlzdC1nZW5lcmF0b3InLFxuICAgIHRlbXBsYXRlVXJsOiAnLi93b3JkbGlzdC1nZW5lcmF0b3IuY29tcG9uZW50Lmh0bWwnLFxuICAgIHN0eWxlVXJsczogWycuL3dvcmRsaXN0LWdlbmVyYXRvci5jb21wb25lbnQuc2NzcyddLFxuICAgIGVuY2Fwc3VsYXRpb246IFZpZXdFbmNhcHN1bGF0aW9uLk5vbmUsXG4gICAgaW1wb3J0czogW1xuICAgICAgICBNYXRCdXR0b25Nb2R1bGUsXG4gICAgICAgIE5nU3R5bGUsXG4gICAgICAgIE1hdE1lbnVNb2R1bGUsXG4gICAgICAgIFJlYWN0aXZlRm9ybXNNb2R1bGUsXG4gICAgICAgIE1hdEZvcm1GaWVsZE1vZHVsZSxcbiAgICAgICAgTWF0SW5wdXRNb2R1bGUsXG4gICAgICAgIENka0Ryb3BMaXN0LFxuICAgICAgICBDZGtEcmFnLFxuICAgICAgICBNYXRJY29uTW9kdWxlLFxuICAgICAgICBBc3luY1BpcGVcbiAgICBdXG59KVxuZXhwb3J0IGNsYXNzIFdvcmRsaXN0R2VuZXJhdG9yQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3kge1xuICBwcml2YXRlIGZvcm1CdWlsZGVyID0gaW5qZWN0KFVudHlwZWRGb3JtQnVpbGRlcik7XG4gIHByaXZhdGUgd29yZGxpc3RHZW5lcmF0b3IgPSBpbmplY3QoV29yZGxpc3RHZW5lcmF0b3JTZXJ2aWNlKTtcblxuICBidXR0b25TdHlsZSA9IGlucHV0KHtcbiAgICAnYmFja2dyb3VuZC1jb2xvcic6ICcjMzMzMzMzJyxcbiAgICBjb2xvcjogJyNjYzc4MzInXG4gIH0pO1xuXG4gIGRyYWdTdHlsZSA9IGlucHV0KHsgY29sb3I6ICcjY2M3ODMyJyB9KTtcbiAgdGV4dFN0eWxlID0gaW5wdXQoeyBjb2xvcjogJyNjYzc4MzInIH0pO1xuXG4gIGNoYXJzZXRGb3JtOiBVbnR5cGVkRm9ybUdyb3VwIHwgdW5kZWZpbmVkO1xuICB3b3Jkc0dlbmVyYXRlZDogbnVtYmVyIHwgdW5kZWZpbmVkO1xuICB3b3JkbGlzdCQ6IE9ic2VydmFibGU8c3RyaW5nPiB8IHVuZGVmaW5lZDtcblxuICBkaXNwbGF5V29yZGxpc3QgPSBmYWxzZTtcbiAgZmlsZVR5cGUgPSBGaWxlVHlwZS5wbGFpbnRleHQ7XG4gIGZpbGVUeXBlcyA9IE9iamVjdC52YWx1ZXMoRmlsZVR5cGUpO1xuICBmaWx0ZXJlZENoYXJzZXQ6IHN0cmluZ1tdID0gW107XG4gIHByZWZpeCA9ICcnO1xuICBzdWZmaXggPSAnJztcblxuICBwcml2YXRlIHVuc3Vic2NyaWJlJCA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XG5cbiAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgdGhpcy5nZW5lcmF0ZUZvcm0oKTtcbiAgfVxuXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIHRoaXMudW5zdWJzY3JpYmUkLm5leHQoKTtcbiAgICB0aGlzLnVuc3Vic2NyaWJlJC5jb21wbGV0ZSgpO1xuICB9XG5cbiAgZ2V0IGNoYXJzZXRzKCk6IFVudHlwZWRGb3JtQXJyYXkgfCB1bmRlZmluZWQge1xuICAgIGlmICh0aGlzLmNoYXJzZXRGb3JtKSB7XG4gICAgICByZXR1cm4gdGhpcy5jaGFyc2V0Rm9ybS5nZXQoJ2NoYXJzZXRzJykgYXMgVW50eXBlZEZvcm1BcnJheTtcbiAgICB9XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIGFkZENoYXJzZXQoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuY2hhcnNldHMpIHtcbiAgICAgIHRoaXMuY2hhcnNldHMucHVzaCh0aGlzLmZvcm1CdWlsZGVyLmNvbnRyb2woJycsIFZhbGlkYXRvcnMucmVxdWlyZWQpKTtcbiAgICB9XG4gIH1cblxuICBjbG9uZUNoYXJzZXQoaW5kZXg6IG51bWJlcik6IHZvaWQge1xuICAgIGlmICh0aGlzLmNoYXJzZXRzKSB7XG4gICAgICBjb25zdCBjaGFyc2V0ID0gdGhpcy5jaGFyc2V0cy52YWx1ZVtpbmRleF07XG4gICAgICB0aGlzLmNoYXJzZXRzLmluc2VydChcbiAgICAgICAgaW5kZXgsXG4gICAgICAgIHRoaXMuZm9ybUJ1aWxkZXIuY29udHJvbChjaGFyc2V0LCBWYWxpZGF0b3JzLnJlcXVpcmVkKVxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICBkb3dubG9hZFdvcmRsaXN0KCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmNoYXJzZXRzKSB7XG4gICAgICBpZiAodGhpcy5maWx0ZXJlZENoYXJzZXQgIT09IHRoaXMuZmlsdGVyQ2hhcnNldCh0aGlzLmNoYXJzZXRzLnZhbHVlKSkge1xuICAgICAgICB0aGlzLmdlbmVyYXRlV29yZGxpc3QoKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGZpbGVuYW1lID0gYHdvcmRsaXN0XyR7dGhpcy53b3Jkc0dlbmVyYXRlZH1fd29yZHNfJHt0aGlzLmNoYXJzZXRzLmxlbmd0aH1fcG9zaXRpb25zLiR7dGhpcy5maWxlVHlwZX1gO1xuICAgICAgdGhpcy5nZXRXb3JkbGlzdCgpXG4gICAgICAgIC5waXBlKFxuICAgICAgICAgIHRhcCgod29yZGxpc3Q6IHN0cmluZykgPT4ge1xuICAgICAgICAgICAgaWYgKHdvcmRsaXN0Lmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgY29uc3QgcGFyc2VkID0gdGhpcy5wYXJzZVdvcmRsaXN0KHdvcmRsaXN0KTtcbiAgICAgICAgICAgICAgY29uc3QgZmlsZSA9IG5ldyBCbG9iKFtwYXJzZWQud29yZGxpc3RdLCB7XG4gICAgICAgICAgICAgICAgdHlwZTogcGFyc2VkLmNvbnRlbnRUeXBlXG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICAgICAgICAgICAgICBpZiAoKHdpbmRvdy5uYXZpZ2F0b3IgYXMgYW55KS5tc1NhdmVPck9wZW5CbG9iKSB7XG4gICAgICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICAgICAgICAgICAgICAod2luZG93Lm5hdmlnYXRvciBhcyBhbnkpLm1zU2F2ZU9yT3BlbkJsb2IoZmlsZSwgZmlsZW5hbWUpO1xuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGNvbnN0IGEgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdhJyk7XG4gICAgICAgICAgICAgICAgY29uc3QgdXJsID0gVVJMLmNyZWF0ZU9iamVjdFVSTChmaWxlKTtcbiAgICAgICAgICAgICAgICBhLmhyZWYgPSB1cmw7XG4gICAgICAgICAgICAgICAgYS5kb3dubG9hZCA9IGZpbGVuYW1lO1xuICAgICAgICAgICAgICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoYSk7XG4gICAgICAgICAgICAgICAgYS5jbGljaygpO1xuICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChhKTtcbiAgICAgICAgICAgICAgICAgIHdpbmRvdy5VUkwucmV2b2tlT2JqZWN0VVJMKHVybCk7XG4gICAgICAgICAgICAgICAgfSwgMCk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KVxuICAgICAgICApXG4gICAgICAgIC5zdWJzY3JpYmUoKTtcbiAgICB9XG4gIH1cblxuICBkcm9wKGV2ZW50OiBDZGtEcmFnRHJvcDxzdHJpbmdbXT4pOiB2b2lkIHtcbiAgICBpZiAodGhpcy5jaGFyc2V0cykge1xuICAgICAgbW92ZUl0ZW1JbkFycmF5KFxuICAgICAgICB0aGlzLmNoYXJzZXRzLmNvbnRyb2xzLFxuICAgICAgICBldmVudC5wcmV2aW91c0luZGV4LFxuICAgICAgICBldmVudC5jdXJyZW50SW5kZXhcbiAgICAgICk7XG4gICAgICB0aGlzLmNoYXJzZXRzLnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoKTtcbiAgICB9XG4gIH1cblxuICBnZW5lcmF0ZUZvcm0oKTogdm9pZCB7XG4gICAgdGhpcy5jaGFyc2V0Rm9ybSA9IHRoaXMuZm9ybUJ1aWxkZXIuZ3JvdXAoe1xuICAgICAgY2hhcnNldHM6IHRoaXMuZm9ybUJ1aWxkZXIuYXJyYXkoW1xuICAgICAgICB0aGlzLmZvcm1CdWlsZGVyLmNvbnRyb2woJycsIFZhbGlkYXRvcnMucmVxdWlyZWQpXG4gICAgICBdKSxcbiAgICAgIHByZWZpeDogdGhpcy5mb3JtQnVpbGRlci5jb250cm9sKCcnKSxcbiAgICAgIHN1ZmZpeDogdGhpcy5mb3JtQnVpbGRlci5jb250cm9sKCcnKVxuICAgIH0pO1xuICB9XG5cbiAgZ2VuZXJhdGVXb3JkbGlzdCgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5jaGFyc2V0Rm9ybSAmJiB0aGlzLmNoYXJzZXRzICYmIHRoaXMuY2hhcnNldHMudmFsaWQpIHtcbiAgICAgIHRoaXMuZmlsdGVyZWRDaGFyc2V0ID0gdGhpcy5maWx0ZXJDaGFyc2V0KHRoaXMuY2hhcnNldHMudmFsdWUpO1xuICAgICAgdGhpcy5wcmVmaXggPSB0aGlzLmNoYXJzZXRGb3JtLmdldCgncHJlZml4Jyk/LnZhbHVlXG4gICAgICAgID8gdGhpcy5jaGFyc2V0Rm9ybS5nZXQoJ3ByZWZpeCcpPy52YWx1ZVxuICAgICAgICA6ICcnO1xuICAgICAgdGhpcy5zdWZmaXggPSB0aGlzLmNoYXJzZXRGb3JtLmdldCgnc3VmZml4Jyk/LnZhbHVlXG4gICAgICAgID8gdGhpcy5jaGFyc2V0Rm9ybS5nZXQoJ3N1ZmZpeCcpPy52YWx1ZVxuICAgICAgICA6ICcnO1xuXG4gICAgICB0aGlzLndvcmRzR2VuZXJhdGVkID0gdGhpcy5maWx0ZXJlZENoYXJzZXRcbiAgICAgICAgLm1hcCgoY2hhcnNldDogc3RyaW5nKSA9PiBjaGFyc2V0Lmxlbmd0aClcbiAgICAgICAgLnJlZHVjZShcbiAgICAgICAgICAocHJldmlvdXNMZW5ndGg6IG51bWJlciwgY3VycmVudExlbmd0aDogbnVtYmVyKSA9PlxuICAgICAgICAgICAgcHJldmlvdXNMZW5ndGggKiBjdXJyZW50TGVuZ3RoXG4gICAgICAgICk7XG4gICAgICB0aGlzLmRpc3BsYXlXb3JkbGlzdCA9IHRoaXMud29yZHNHZW5lcmF0ZWQgPD0gMTAwO1xuICAgICAgdGhpcy53b3JkbGlzdCQgPSB0aGlzLmdldFdvcmRsaXN0KCk7XG4gICAgfVxuICB9XG5cbiAgZ2V0V29yZGxpc3QoKTogT2JzZXJ2YWJsZTxzdHJpbmc+IHtcbiAgICByZXR1cm4gdGhpcy53b3JkbGlzdEdlbmVyYXRvclxuICAgICAgLmdlbmVyYXRlV29yZGxpc3QoLi4udGhpcy5maWx0ZXJlZENoYXJzZXQpXG4gICAgICAucGlwZShcbiAgICAgICAgcmVkdWNlKFxuICAgICAgICAgICh3b3JkbGlzdDogc3RyaW5nLCB3b3JkOiBzdHJpbmcpID0+XG4gICAgICAgICAgICBgJHt3b3JkbGlzdH0ke3RoaXMucHJlZml4fSR7d29yZH0ke3RoaXMuc3VmZml4fVxcbmAsXG4gICAgICAgICAgJydcbiAgICAgICAgKSxcbiAgICAgICAgdGFrZVVudGlsKHRoaXMudW5zdWJzY3JpYmUkKVxuICAgICAgKTtcbiAgfVxuXG4gIGZpbHRlckNoYXJzZXQoY2hhcnNldHM6IHN0cmluZ1tdKTogc3RyaW5nW10ge1xuICAgIHJldHVybiBjaGFyc2V0cy5tYXAoKGNoYXJzZXQ6IHN0cmluZykgPT4gdGhpcy5yZW1vdmVEdXBsaWNhdGVzKGNoYXJzZXQpKTtcbiAgfVxuXG4gIHBhcnNlV29yZGxpc3Qod29yZGxpc3Q6IHN0cmluZyk6IHsgd29yZGxpc3Q6IHN0cmluZzsgY29udGVudFR5cGU6IHN0cmluZyB9IHtcbiAgICBzd2l0Y2ggKHRoaXMuZmlsZVR5cGUpIHtcbiAgICAgIGNhc2UgRmlsZVR5cGUucGxhaW50ZXh0OlxuICAgICAgICByZXR1cm4gdG9QbGFpbnRleHQod29yZGxpc3QpO1xuICAgICAgY2FzZSBGaWxlVHlwZS54bWw6XG4gICAgICAgIHJldHVybiB0b1hNTCh3b3JkbGlzdCk7XG4gICAgICBjYXNlIEZpbGVUeXBlLmNzdjpcbiAgICAgICAgcmV0dXJuIHRvQ1NWKHdvcmRsaXN0KTtcbiAgICB9XG4gIH1cblxuICByZW1vdmVDaGFyc2V0KGk6IG51bWJlcik6IHZvaWQge1xuICAgIGlmICh0aGlzLmNoYXJzZXRzICYmIHRoaXMuY2hhcnNldHMubGVuZ3RoID4gMSkge1xuICAgICAgdGhpcy5jaGFyc2V0cy5yZW1vdmVBdChpKTtcbiAgICB9XG4gIH1cblxuICByZW1vdmVEdXBsaWNhdGVzID0gKHVuZmlsdGVyZWQ6IHN0cmluZyk6IHN0cmluZyA9PlxuICAgIFsuLi5uZXcgU2V0KHVuZmlsdGVyZWQpXS5qb2luKCcnKTtcbn1cbiIsIjxkaXYgY2xhc3M9XCJtZXRhLWNvbnRhaW5lciBmbGV4LXJvdy13cmFwXCI+XG4gIDxkaXYgY2xhc3M9XCJmb3JtLWNvbnRhaW5lciBmbGV4LWNvbHVtbiBmbGV4LWZ4ZmxleFwiPlxuICAgIDxkaXYgY2xhc3M9XCJmbGV4LXJvdy13cmFwIGJvdHRvbS0xMFwiPlxuICAgICAgPGJ1dHRvblxuICAgICAgICBjbGFzcz1cImdlbmVyYXRlLXdvcmRsaXN0XCJcbiAgICAgICAgW25nU3R5bGVdPVwiYnV0dG9uU3R5bGUoKVwiXG4gICAgICAgIG1hdC1yYWlzZWQtYnV0dG9uXG4gICAgICAgIChjbGljayk9XCJnZW5lcmF0ZVdvcmRsaXN0KClcIlxuICAgICAgPlxuICAgICAgICBHZW5lcmF0ZSB3b3JkbGlzdFxuICAgICAgPC9idXR0b24+XG4gICAgICBAaWYgKHdvcmRsaXN0JCkge1xuICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgY2xhc3M9XCJjaG9vc2UtZm9ybWF0XCJcbiAgICAgICAgICBbbmdTdHlsZV09XCJidXR0b25TdHlsZSgpXCJcbiAgICAgICAgICBtYXQtcmFpc2VkLWJ1dHRvblxuICAgICAgICAgIFttYXRNZW51VHJpZ2dlckZvcl09XCJtZW51XCJcbiAgICAgICAgPlxuICAgICAgICAgIENob29zZSBmb3JtYXRcbiAgICAgICAgPC9idXR0b24+XG4gICAgICB9XG4gICAgICA8bWF0LW1lbnUgI21lbnU9XCJtYXRNZW51XCI+XG4gICAgICAgIEBmb3IgKHR5cGUgb2YgZmlsZVR5cGVzOyB0cmFjayB0eXBlKSB7XG4gICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgW25nU3R5bGVdPVwiYnV0dG9uU3R5bGUoKVwiXG4gICAgICAgICAgICBtYXQtbWVudS1pdGVtXG4gICAgICAgICAgICAoY2xpY2spPVwiZmlsZVR5cGUgPSB0eXBlXCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICB7eyB0eXBlIH19XG4gICAgICAgICAgPC9idXR0b24+XG4gICAgICAgIH1cbiAgICAgIDwvbWF0LW1lbnU+XG4gICAgICBAaWYgKHdvcmRsaXN0JCkge1xuICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgY2xhc3M9XCJkb3dubG9hZC13b3JkbGlzdFwiXG4gICAgICAgICAgW25nU3R5bGVdPVwiYnV0dG9uU3R5bGUoKVwiXG4gICAgICAgICAgbWF0LXJhaXNlZC1idXR0b25cbiAgICAgICAgICAoY2xpY2spPVwiZG93bmxvYWRXb3JkbGlzdCgpXCJcbiAgICAgICAgPlxuICAgICAgICAgIERvd25sb2FkIGFzXG4gICAgICAgICAgQGlmICh0aGlzLmZpbGVUeXBlKSB7XG4gICAgICAgICAgICB7eyB0aGlzLmZpbGVUeXBlIH19XG4gICAgICAgICAgfVxuICAgICAgICA8L2J1dHRvbj5cbiAgICAgIH1cbiAgICA8L2Rpdj5cbiAgICBAaWYgKGNoYXJzZXRGb3JtKSB7XG4gICAgICA8Zm9ybSBbZm9ybUdyb3VwXT1cImNoYXJzZXRGb3JtXCI+XG4gICAgICAgIDxtYXQtZm9ybS1maWVsZCBjbGFzcz1cImZpeGVkLXdpZHRoIGJvdHRvbS0xMFwiIGFwcGVhcmFuY2U9XCJvdXRsaW5lXCI+XG4gICAgICAgICAgPG1hdC1sYWJlbCBbbmdTdHlsZV09XCJ0ZXh0U3R5bGUoKVwiPnByZWZpeCAob3B0aW9uYWwpPC9tYXQtbGFiZWw+XG4gICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICBbbmdTdHlsZV09XCJ0ZXh0U3R5bGUoKVwiXG4gICAgICAgICAgICBtYXRJbnB1dFxuICAgICAgICAgICAgdHlwZT1cInRleHRcIlxuICAgICAgICAgICAgaWQ9XCJwcmVmaXhcIlxuICAgICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwicHJlZml4XCJcbiAgICAgICAgICAgIChrZXlkb3duLmVudGVyKT1cIiRldmVudC5wcmV2ZW50RGVmYXVsdCgpXCJcbiAgICAgICAgICAvPlxuICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxuICAgICAgICA8ZGl2IGZvcm1BcnJheU5hbWU9XCJjaGFyc2V0c1wiPlxuICAgICAgICAgIDxkaXYgY2RrRHJvcExpc3QgKGNka0Ryb3BMaXN0RHJvcHBlZCk9XCJkcm9wKCRldmVudClcIj5cbiAgICAgICAgICAgIEBmb3IgKFxuICAgICAgICAgICAgICBjaGFyc2V0IG9mIGNoYXJzZXRzPy5jb250cm9scztcbiAgICAgICAgICAgICAgdHJhY2sgY2hhcnNldDtcbiAgICAgICAgICAgICAgbGV0IGkgPSAkaW5kZXhcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2hhcnNldC1jb250YWluZXJcIiBjZGtEcmFnPlxuICAgICAgICAgICAgICAgIDxtYXQtaWNvbiBjbGFzcz1cImRyYWctaW5kaWNhdG9yXCIgW25nU3R5bGVdPVwiZHJhZ1N0eWxlKClcIlxuICAgICAgICAgICAgICAgICAgPmRyYWdfaW5kaWNhdG9yPC9tYXQtaWNvblxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICA8bWF0LWZvcm0tZmllbGQgY2xhc3M9XCJjaGFyc2V0IGJvdHRvbS0xMFwiIGFwcGVhcmFuY2U9XCJvdXRsaW5lXCI+XG4gICAgICAgICAgICAgICAgICA8bWF0LWxhYmVsIFtuZ1N0eWxlXT1cInRleHRTdHlsZSgpXCI+XG4gICAgICAgICAgICAgICAgICAgIGNoYXJhY3RlciBzZXQgZm9yIHN0cmluZyBwb3NpdGlvbiB7eyBpIH19XG4gICAgICAgICAgICAgICAgICA8L21hdC1sYWJlbD5cbiAgICAgICAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICAgICAgICBbbmdTdHlsZV09XCJ0ZXh0U3R5bGUoKVwiXG4gICAgICAgICAgICAgICAgICAgIG1hdElucHV0XG4gICAgICAgICAgICAgICAgICAgIHR5cGU9XCJ0ZXh0XCJcbiAgICAgICAgICAgICAgICAgICAgaWQ9XCJwb3NpdGlvbi17eyBpIH19XCJcbiAgICAgICAgICAgICAgICAgICAgW2Zvcm1Db250cm9sTmFtZV09XCJpXCJcbiAgICAgICAgICAgICAgICAgICAgKGtleWRvd24uZW50ZXIpPVwiJGV2ZW50LnByZXZlbnREZWZhdWx0KClcIlxuICAgICAgICAgICAgICAgICAgICByZXF1aXJlZFxuICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxuICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgIG1hdC1yYWlzZWQtYnV0dG9uXG4gICAgICAgICAgICAgICAgICBjbGFzcz1cImNsb25lLWNoYXJzZXRcIlxuICAgICAgICAgICAgICAgICAgW25nU3R5bGVdPVwiYnV0dG9uU3R5bGUoKVwiXG4gICAgICAgICAgICAgICAgICAoY2xpY2spPVwiY2xvbmVDaGFyc2V0KGkpXCJcbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICA8bWF0LWljb24gY2xhc3M9XCJyb3ctYnV0dG9uLWljb25cIj5jb250ZW50X2NvcHk8L21hdC1pY29uPlxuICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgIG1hdC1yYWlzZWQtYnV0dG9uXG4gICAgICAgICAgICAgICAgICBjbGFzcz1cInJlbW92ZS1jaGFyc2V0XCJcbiAgICAgICAgICAgICAgICAgIFtuZ1N0eWxlXT1cImJ1dHRvblN0eWxlKClcIlxuICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cInJlbW92ZUNoYXJzZXQoaSlcIlxuICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cInRoaXMuY2hhcnNldHM/LnZhbHVlLmxlbmd0aCA9PT0gMVwiXG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgPG1hdC1pY29uIGNsYXNzPVwicm93LWJ1dHRvbi1pY29uXCI+cmVtb3ZlPC9tYXQtaWNvbj5cbiAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICBtYXQtcmFpc2VkLWJ1dHRvblxuICAgICAgICAgICAgICAgICAgW25nU3R5bGVdPVwiYnV0dG9uU3R5bGUoKVwiXG4gICAgICAgICAgICAgICAgICAoY2xpY2spPVwiYWRkQ2hhcnNldCgpXCJcbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICA8bWF0LWljb24gY2xhc3M9XCJyb3ctYnV0dG9uLWljb25cIj5hZGQ8L21hdC1pY29uPlxuICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxtYXQtZm9ybS1maWVsZCBjbGFzcz1cImZpeGVkLXdpZHRoXCIgYXBwZWFyYW5jZT1cIm91dGxpbmVcIj5cbiAgICAgICAgICA8bWF0LWxhYmVsIFtuZ1N0eWxlXT1cInRleHRTdHlsZSgpXCI+c3VmZml4IChvcHRpb25hbCk8L21hdC1sYWJlbD5cbiAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgIFtuZ1N0eWxlXT1cInRleHRTdHlsZSgpXCJcbiAgICAgICAgICAgIG1hdElucHV0XG4gICAgICAgICAgICB0eXBlPVwidGV4dFwiXG4gICAgICAgICAgICBpZD1cInN1ZmZpeFwiXG4gICAgICAgICAgICBmb3JtQ29udHJvbE5hbWU9XCJzdWZmaXhcIlxuICAgICAgICAgICAgKGtleWRvd24uZW50ZXIpPVwiJGV2ZW50LnByZXZlbnREZWZhdWx0KClcIlxuICAgICAgICAgIC8+XG4gICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XG4gICAgICA8L2Zvcm0+XG4gICAgfVxuICA8L2Rpdj5cbiAgQGlmICh3b3JkbGlzdCQpIHtcbiAgICA8ZGl2IGNsYXNzPVwid29yZGxpc3QtY29udGFpbmVyIGZsZXgtY29sdW1uIGZsZXgtZnhmbGV4XCI+XG4gICAgICBAaWYgKGRpc3BsYXlXb3JkbGlzdCkge1xuICAgICAgICA8aDMgY2xhc3M9XCJ3b3JkbGlzdC1oZWFkZXJcIj5HZW5lcmF0ZWQgd29yZGxpc3Q6PC9oMz5cbiAgICAgICAgPGNvZGUgY2xhc3M9XCJ3b3JkbGlzdFwiPlxuICAgICAgICAgIHt7IHdvcmRsaXN0JCB8IGFzeW5jIH19XG4gICAgICAgIDwvY29kZT5cbiAgICAgIH0gQGVsc2Uge1xuICAgICAgICBUaGUgZ2VuZXJhdGVkIHdvcmRsaXN0IGlzIHRvbyBsYXJnZSB0byBiZSBkaXNwbGF5ZWQuIFlvdSBjYW4gc3RpbGxcbiAgICAgICAgZG93bmxvYWQgaXQuXG4gICAgICB9XG4gICAgPC9kaXY+XG4gIH1cbjwvZGl2PlxuIl19","/**\n * Generated bundle index. Do not edit.\n */\nexport * from './index';\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVodzBsZi13b3JkbGlzdC1nZW5lcmF0b3IuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9saWJzL3dvcmRsaXN0LWdlbmVyYXRvci9zcmMvdGVodzBsZi13b3JkbGlzdC1nZW5lcmF0b3IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7O0dBRUc7QUFFSCxjQUFjLFNBQVMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogR2VuZXJhdGVkIGJ1bmRsZSBpbmRleC4gRG8gbm90IGVkaXQuXG4gKi9cblxuZXhwb3J0ICogZnJvbSAnLi9pbmRleCc7XG4iXX0="],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"tehw0lf-wordlist-generator.mjs","sources":["../tmp-esm2022/lib/filetypes.js","../tmp-esm2022/lib/parsers.js","../tmp-esm2022/lib/wordlist-generator.service.js","../tmp-esm2022/lib/wordlist-generator.component.js","../tmp-esm2022/tehw0lf-wordlist-generator.js"],"sourcesContent":["export var FileType;\n(function (FileType) {\n FileType[\"plaintext\"] = \"txt\";\n FileType[\"xml\"] = \"xml\";\n FileType[\"csv\"] = \"csv\";\n})(FileType || (FileType = {}));\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmlsZXR5cGVzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vbGlicy93b3JkbGlzdC1nZW5lcmF0b3Ivc3JjL2xpYi9maWxldHlwZXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsTUFBTSxDQUFOLElBQVksUUFJWDtBQUpELFdBQVksUUFBUTtJQUNsQiw2QkFBaUIsQ0FBQTtJQUNqQix1QkFBVyxDQUFBO0lBQ1gsdUJBQVcsQ0FBQTtBQUNiLENBQUMsRUFKVyxRQUFRLEtBQVIsUUFBUSxRQUluQiIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCBlbnVtIEZpbGVUeXBlIHtcbiAgcGxhaW50ZXh0ID0gJ3R4dCcsXG4gIHhtbCA9ICd4bWwnLFxuICBjc3YgPSAnY3N2J1xufVxuIl19","export const toPlaintext = (wordlist) => ({\n wordlist,\n contentType: 'text/plain'\n});\nexport const toXML = (wordlist) => {\n const head = '<wordlist><word>';\n const glue = '</word><word>';\n const tail = '</word></wordlist>';\n return {\n wordlist: head + wordlist.replace(/\\n/g, glue) + tail,\n contentType: 'text/xml'\n };\n};\nexport const toCSV = (wordlist) => {\n const glue = ',';\n return {\n wordlist: wordlist.replace(/\\n/g, glue),\n contentType: 'text/csv'\n };\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGFyc2Vycy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL2xpYnMvd29yZGxpc3QtZ2VuZXJhdG9yL3NyYy9saWIvcGFyc2Vycy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxNQUFNLENBQUMsTUFBTSxXQUFXLEdBQUcsQ0FDekIsUUFBZ0IsRUFDMkIsRUFBRSxDQUFDLENBQUM7SUFDL0MsUUFBUTtJQUNSLFdBQVcsRUFBRSxZQUFZO0NBQzFCLENBQUMsQ0FBQztBQUVILE1BQU0sQ0FBQyxNQUFNLEtBQUssR0FBRyxDQUNuQixRQUFnQixFQUMyQixFQUFFO0lBQzdDLE1BQU0sSUFBSSxHQUFHLGtCQUFrQixDQUFDO0lBQ2hDLE1BQU0sSUFBSSxHQUFHLGVBQWUsQ0FBQztJQUM3QixNQUFNLElBQUksR0FBRyxvQkFBb0IsQ0FBQztJQUNsQyxPQUFPO1FBQ0wsUUFBUSxFQUFFLElBQUksR0FBRyxRQUFRLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsR0FBRyxJQUFJO1FBQ3JELFdBQVcsRUFBRSxVQUFVO0tBQ3hCLENBQUM7QUFDSixDQUFDLENBQUM7QUFFRixNQUFNLENBQUMsTUFBTSxLQUFLLEdBQUcsQ0FDbkIsUUFBZ0IsRUFDMkIsRUFBRTtJQUM3QyxNQUFNLElBQUksR0FBRyxHQUFHLENBQUM7SUFDakIsT0FBTztRQUNMLFFBQVEsRUFBRSxRQUFRLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUM7UUFDdkMsV0FBVyxFQUFFLFVBQVU7S0FDeEIsQ0FBQztBQUNKLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCBjb25zdCB0b1BsYWludGV4dCA9IChcbiAgd29yZGxpc3Q6IHN0cmluZ1xuKTogeyB3b3JkbGlzdDogc3RyaW5nOyBjb250ZW50VHlwZTogc3RyaW5nIH0gPT4gKHtcbiAgd29yZGxpc3QsXG4gIGNvbnRlbnRUeXBlOiAndGV4dC9wbGFpbidcbn0pO1xuXG5leHBvcnQgY29uc3QgdG9YTUwgPSAoXG4gIHdvcmRsaXN0OiBzdHJpbmdcbik6IHsgd29yZGxpc3Q6IHN0cmluZzsgY29udGVudFR5cGU6IHN0cmluZyB9ID0+IHtcbiAgY29uc3QgaGVhZCA9ICc8d29yZGxpc3Q+PHdvcmQ+JztcbiAgY29uc3QgZ2x1ZSA9ICc8L3dvcmQ+PHdvcmQ+JztcbiAgY29uc3QgdGFpbCA9ICc8L3dvcmQ+PC93b3JkbGlzdD4nO1xuICByZXR1cm4ge1xuICAgIHdvcmRsaXN0OiBoZWFkICsgd29yZGxpc3QucmVwbGFjZSgvXFxuL2csIGdsdWUpICsgdGFpbCxcbiAgICBjb250ZW50VHlwZTogJ3RleHQveG1sJ1xuICB9O1xufTtcblxuZXhwb3J0IGNvbnN0IHRvQ1NWID0gKFxuICB3b3JkbGlzdDogc3RyaW5nXG4pOiB7IHdvcmRsaXN0OiBzdHJpbmc7IGNvbnRlbnRUeXBlOiBzdHJpbmcgfSA9PiB7XG4gIGNvbnN0IGdsdWUgPSAnLCc7XG4gIHJldHVybiB7XG4gICAgd29yZGxpc3Q6IHdvcmRsaXN0LnJlcGxhY2UoL1xcbi9nLCBnbHVlKSxcbiAgICBjb250ZW50VHlwZTogJ3RleHQvY3N2J1xuICB9O1xufTtcbiJdfQ==","import { Injectable } from '@angular/core';\nimport { product } from 'cartesian-product-generator';\nimport { from, Subject } from 'rxjs';\nimport { map } from 'rxjs/operators';\nimport * as i0 from \"@angular/core\";\nexport class WordlistGeneratorService {\n constructor() {\n this.LARGE_DATASET_THRESHOLD = 50000;\n }\n generateWordlist(...charsets) {\n const estimatedSize = this.estimateWordlistSize(charsets);\n if (estimatedSize > this.LARGE_DATASET_THRESHOLD) {\n return this.generateWithWebWorker(charsets);\n }\n return this.generateSynchronously(charsets);\n }\n generateSynchronously(charsets) {\n return from(product(...charsets)).pipe(map((word) => word.join('')));\n }\n generateWithWebWorker(charsets) {\n const subject = new Subject();\n if (typeof Worker !== 'undefined') {\n const worker = new Worker(new URL('./wordlist.worker', import.meta.url));\n worker.onmessage = ({ data }) => {\n switch (data.type) {\n case 'batch':\n if (data.words) {\n data.words.forEach(word => subject.next(word));\n }\n break;\n case 'complete':\n subject.complete();\n worker.terminate();\n break;\n case 'error':\n subject.error(new Error(data.error || 'Worker error'));\n worker.terminate();\n break;\n }\n };\n worker.onerror = (error) => {\n subject.error(error);\n worker.terminate();\n };\n const message = {\n type: 'generate',\n charsets,\n batchSize: 1000\n };\n worker.postMessage(message);\n }\n else {\n // Fallback for environments without Worker support\n this.generateSynchronously(charsets).subscribe({\n next: (word) => subject.next(word),\n error: (err) => subject.error(err),\n complete: () => subject.complete()\n });\n }\n return subject.asObservable();\n }\n estimateWordlistSize(charsets) {\n return charsets.reduce((total, charset) => total * charset.length, 1);\n }\n static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: \"12.0.0\", version: \"20.1.6\", ngImport: i0, type: WordlistGeneratorService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }\n static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: \"12.0.0\", version: \"20.1.6\", ngImport: i0, type: WordlistGeneratorService, providedIn: 'root' }); }\n}\ni0.ɵɵngDeclareClassMetadata({ minVersion: \"12.0.0\", version: \"20.1.6\", ngImport: i0, type: WordlistGeneratorService, decorators: [{\n type: Injectable,\n args: [{\n providedIn: 'root'\n }]\n }] });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid29yZGxpc3QtZ2VuZXJhdG9yLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9saWJzL3dvcmRsaXN0LWdlbmVyYXRvci9zcmMvbGliL3dvcmRsaXN0LWdlbmVyYXRvci5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDM0MsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBQ3RELE9BQU8sRUFBRSxJQUFJLEVBQWMsT0FBTyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQ2pELE9BQU8sRUFBRSxHQUFHLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQzs7QUFpQnJDLE1BQU0sT0FBTyx3QkFBd0I7SUFIckM7UUFJbUIsNEJBQXVCLEdBQUcsS0FBSyxDQUFDO0tBcUVsRDtJQW5FQyxnQkFBZ0IsQ0FBQyxHQUFHLFFBQWtCO1FBQ3BDLE1BQU0sYUFBYSxHQUFHLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUUxRCxJQUFJLGFBQWEsR0FBRyxJQUFJLENBQUMsdUJBQXVCLEVBQUUsQ0FBQztZQUNqRCxPQUFPLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUM5QyxDQUFDO1FBRUQsT0FBTyxJQUFJLENBQUMscUJBQXFCLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDOUMsQ0FBQztJQUVPLHFCQUFxQixDQUFDLFFBQWtCO1FBQzlDLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLFFBQVEsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUNwQyxHQUFHLENBQUMsQ0FBQyxJQUFjLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FDdkMsQ0FBQztJQUNKLENBQUM7SUFFTyxxQkFBcUIsQ0FBQyxRQUFrQjtRQUM5QyxNQUFNLE9BQU8sR0FBRyxJQUFJLE9BQU8sRUFBVSxDQUFDO1FBRXRDLElBQUksT0FBTyxNQUFNLEtBQUssV0FBVyxFQUFFLENBQUM7WUFDbEMsTUFBTSxNQUFNLEdBQUcsSUFBSSxNQUFNLENBQUMsSUFBSSxHQUFHLENBQUMsbUJBQW1CLEVBQUUsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO1lBRXpFLE1BQU0sQ0FBQyxTQUFTLEdBQUcsQ0FBQyxFQUFFLElBQUksRUFBd0MsRUFBRSxFQUFFO2dCQUNwRSxRQUFRLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztvQkFDbEIsS0FBSyxPQUFPO3dCQUNWLElBQUksSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDOzRCQUNmLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO3dCQUNqRCxDQUFDO3dCQUNELE1BQU07b0JBQ1IsS0FBSyxVQUFVO3dCQUNiLE9BQU8sQ0FBQyxRQUFRLEVBQUUsQ0FBQzt3QkFDbkIsTUFBTSxDQUFDLFNBQVMsRUFBRSxDQUFDO3dCQUNuQixNQUFNO29CQUNSLEtBQUssT0FBTzt3QkFDVixPQUFPLENBQUMsS0FBSyxDQUFDLElBQUksS0FBSyxDQUFDLElBQUksQ0FBQyxLQUFLLElBQUksY0FBYyxDQUFDLENBQUMsQ0FBQzt3QkFDdkQsTUFBTSxDQUFDLFNBQVMsRUFBRSxDQUFDO3dCQUNuQixNQUFNO2dCQUNWLENBQUM7WUFDSCxDQUFDLENBQUM7WUFFRixNQUFNLENBQUMsT0FBTyxHQUFHLENBQUMsS0FBSyxFQUFFLEVBQUU7Z0JBQ3pCLE9BQU8sQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUM7Z0JBQ3JCLE1BQU0sQ0FBQyxTQUFTLEVBQUUsQ0FBQztZQUNyQixDQUFDLENBQUM7WUFFRixNQUFNLE9BQU8sR0FBMEI7Z0JBQ3JDLElBQUksRUFBRSxVQUFVO2dCQUNoQixRQUFRO2dCQUNSLFNBQVMsRUFBRSxJQUFJO2FBQ2hCLENBQUM7WUFFRixNQUFNLENBQUMsV0FBVyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQzlCLENBQUM7YUFBTSxDQUFDO1lBQ04sbURBQW1EO1lBQ25ELElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxRQUFRLENBQUMsQ0FBQyxTQUFTLENBQUM7Z0JBQzdDLElBQUksRUFBRSxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUM7Z0JBQ2xDLEtBQUssRUFBRSxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUM7Z0JBQ2xDLFFBQVEsRUFBRSxHQUFHLEVBQUUsQ0FBQyxPQUFPLENBQUMsUUFBUSxFQUFFO2FBQ25DLENBQUMsQ0FBQztRQUNMLENBQUM7UUFFRCxPQUFPLE9BQU8sQ0FBQyxZQUFZLEVBQUUsQ0FBQztJQUNoQyxDQUFDO0lBRU8sb0JBQW9CLENBQUMsUUFBa0I7UUFDN0MsT0FBTyxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUMsS0FBSyxFQUFFLE9BQU8sRUFBRSxFQUFFLENBQUMsS0FBSyxHQUFHLE9BQU8sQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDeEUsQ0FBQzs4R0FyRVUsd0JBQXdCO2tIQUF4Qix3QkFBd0IsY0FGdkIsTUFBTTs7MkZBRVAsd0JBQXdCO2tCQUhwQyxVQUFVO21CQUFDO29CQUNWLFVBQVUsRUFBRSxNQUFNO2lCQUNuQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IHByb2R1Y3QgfSBmcm9tICdjYXJ0ZXNpYW4tcHJvZHVjdC1nZW5lcmF0b3InO1xuaW1wb3J0IHsgZnJvbSwgT2JzZXJ2YWJsZSwgU3ViamVjdCB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgbWFwIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuXG5pbnRlcmZhY2UgV29yZGxpc3RXb3JrZXJNZXNzYWdlIHtcbiAgdHlwZTogJ2dlbmVyYXRlJztcbiAgY2hhcnNldHM6IHN0cmluZ1tdO1xuICBiYXRjaFNpemU/OiBudW1iZXI7XG59XG5cbmludGVyZmFjZSBXb3JkbGlzdFdvcmtlclJlc3BvbnNlIHtcbiAgdHlwZTogJ2JhdGNoJyB8ICdjb21wbGV0ZScgfCAnZXJyb3InO1xuICB3b3Jkcz86IHN0cmluZ1tdO1xuICBlcnJvcj86IHN0cmluZztcbn1cblxuQEluamVjdGFibGUoe1xuICBwcm92aWRlZEluOiAncm9vdCdcbn0pXG5leHBvcnQgY2xhc3MgV29yZGxpc3RHZW5lcmF0b3JTZXJ2aWNlIHtcbiAgcHJpdmF0ZSByZWFkb25seSBMQVJHRV9EQVRBU0VUX1RIUkVTSE9MRCA9IDUwMDAwO1xuXG4gIGdlbmVyYXRlV29yZGxpc3QoLi4uY2hhcnNldHM6IHN0cmluZ1tdKTogT2JzZXJ2YWJsZTxzdHJpbmc+IHtcbiAgICBjb25zdCBlc3RpbWF0ZWRTaXplID0gdGhpcy5lc3RpbWF0ZVdvcmRsaXN0U2l6ZShjaGFyc2V0cyk7XG4gICAgXG4gICAgaWYgKGVzdGltYXRlZFNpemUgPiB0aGlzLkxBUkdFX0RBVEFTRVRfVEhSRVNIT0xEKSB7XG4gICAgICByZXR1cm4gdGhpcy5nZW5lcmF0ZVdpdGhXZWJXb3JrZXIoY2hhcnNldHMpO1xuICAgIH1cbiAgICBcbiAgICByZXR1cm4gdGhpcy5nZW5lcmF0ZVN5bmNocm9ub3VzbHkoY2hhcnNldHMpO1xuICB9XG5cbiAgcHJpdmF0ZSBnZW5lcmF0ZVN5bmNocm9ub3VzbHkoY2hhcnNldHM6IHN0cmluZ1tdKTogT2JzZXJ2YWJsZTxzdHJpbmc+IHtcbiAgICByZXR1cm4gZnJvbShwcm9kdWN0KC4uLmNoYXJzZXRzKSkucGlwZShcbiAgICAgIG1hcCgod29yZDogc3RyaW5nW10pID0+IHdvcmQuam9pbignJykpXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgZ2VuZXJhdGVXaXRoV2ViV29ya2VyKGNoYXJzZXRzOiBzdHJpbmdbXSk6IE9ic2VydmFibGU8c3RyaW5nPiB7XG4gICAgY29uc3Qgc3ViamVjdCA9IG5ldyBTdWJqZWN0PHN0cmluZz4oKTtcbiAgICBcbiAgICBpZiAodHlwZW9mIFdvcmtlciAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIGNvbnN0IHdvcmtlciA9IG5ldyBXb3JrZXIobmV3IFVSTCgnLi93b3JkbGlzdC53b3JrZXInLCBpbXBvcnQubWV0YS51cmwpKTtcbiAgICAgIFxuICAgICAgd29ya2VyLm9ubWVzc2FnZSA9ICh7IGRhdGEgfTogTWVzc2FnZUV2ZW50PFdvcmRsaXN0V29ya2VyUmVzcG9uc2U+KSA9PiB7XG4gICAgICAgIHN3aXRjaCAoZGF0YS50eXBlKSB7XG4gICAgICAgICAgY2FzZSAnYmF0Y2gnOlxuICAgICAgICAgICAgaWYgKGRhdGEud29yZHMpIHtcbiAgICAgICAgICAgICAgZGF0YS53b3Jkcy5mb3JFYWNoKHdvcmQgPT4gc3ViamVjdC5uZXh0KHdvcmQpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgJ2NvbXBsZXRlJzpcbiAgICAgICAgICAgIHN1YmplY3QuY29tcGxldGUoKTtcbiAgICAgICAgICAgIHdvcmtlci50ZXJtaW5hdGUoKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgJ2Vycm9yJzpcbiAgICAgICAgICAgIHN1YmplY3QuZXJyb3IobmV3IEVycm9yKGRhdGEuZXJyb3IgfHwgJ1dvcmtlciBlcnJvcicpKTtcbiAgICAgICAgICAgIHdvcmtlci50ZXJtaW5hdGUoKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9O1xuICAgICAgXG4gICAgICB3b3JrZXIub25lcnJvciA9IChlcnJvcikgPT4ge1xuICAgICAgICBzdWJqZWN0LmVycm9yKGVycm9yKTtcbiAgICAgICAgd29ya2VyLnRlcm1pbmF0ZSgpO1xuICAgICAgfTtcbiAgICAgIFxuICAgICAgY29uc3QgbWVzc2FnZTogV29yZGxpc3RXb3JrZXJNZXNzYWdlID0ge1xuICAgICAgICB0eXBlOiAnZ2VuZXJhdGUnLFxuICAgICAgICBjaGFyc2V0cyxcbiAgICAgICAgYmF0Y2hTaXplOiAxMDAwXG4gICAgICB9O1xuICAgICAgXG4gICAgICB3b3JrZXIucG9zdE1lc3NhZ2UobWVzc2FnZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIEZhbGxiYWNrIGZvciBlbnZpcm9ubWVudHMgd2l0aG91dCBXb3JrZXIgc3VwcG9ydFxuICAgICAgdGhpcy5nZW5lcmF0ZVN5bmNocm9ub3VzbHkoY2hhcnNldHMpLnN1YnNjcmliZSh7XG4gICAgICAgIG5leHQ6ICh3b3JkKSA9PiBzdWJqZWN0Lm5leHQod29yZCksXG4gICAgICAgIGVycm9yOiAoZXJyKSA9PiBzdWJqZWN0LmVycm9yKGVyciksXG4gICAgICAgIGNvbXBsZXRlOiAoKSA9PiBzdWJqZWN0LmNvbXBsZXRlKClcbiAgICAgIH0pO1xuICAgIH1cbiAgICBcbiAgICByZXR1cm4gc3ViamVjdC5hc09ic2VydmFibGUoKTtcbiAgfVxuXG4gIHByaXZhdGUgZXN0aW1hdGVXb3JkbGlzdFNpemUoY2hhcnNldHM6IHN0cmluZ1tdKTogbnVtYmVyIHtcbiAgICByZXR1cm4gY2hhcnNldHMucmVkdWNlKCh0b3RhbCwgY2hhcnNldCkgPT4gdG90YWwgKiBjaGFyc2V0Lmxlbmd0aCwgMSk7XG4gIH1cbn1cbiJdfQ==","import { CdkDrag, CdkDropList, moveItemInArray } from '@angular/cdk/drag-drop';\nimport { NgStyle } from '@angular/common';\nimport { ChangeDetectionStrategy, Component, computed, inject, input, signal, ViewEncapsulation } from '@angular/core';\nimport { ReactiveFormsModule, UntypedFormBuilder, Validators } from '@angular/forms';\nimport { MatButtonModule } from '@angular/material/button';\nimport { MatFormFieldModule } from '@angular/material/form-field';\nimport { MatIconModule } from '@angular/material/icon';\nimport { MatInputModule } from '@angular/material/input';\nimport { MatMenuModule } from '@angular/material/menu';\nimport { MatProgressBarModule } from '@angular/material/progress-bar';\nimport { Subject } from 'rxjs';\nimport { finalize, reduce, shareReplay, takeUntil } from 'rxjs/operators';\nimport { FileType } from './filetypes';\nimport { toCSV, toPlaintext, toXML } from './parsers';\nimport { WordlistGeneratorService } from './wordlist-generator.service';\nimport * as i0 from \"@angular/core\";\nimport * as i1 from \"@angular/material/button\";\nimport * as i2 from \"@angular/material/menu\";\nimport * as i3 from \"@angular/forms\";\nimport * as i4 from \"@angular/material/form-field\";\nimport * as i5 from \"@angular/material/input\";\nimport * as i6 from \"@angular/material/icon\";\nimport * as i7 from \"@angular/material/progress-bar\";\n/* eslint-disable @angular-eslint/component-selector */\nexport class WordlistGeneratorComponent {\n constructor() {\n this.formBuilder = inject(UntypedFormBuilder);\n this.wordlistGenerator = inject(WordlistGeneratorService);\n this.buttonStyle = input({\n 'background-color': '#333333',\n color: '#cc7832'\n }, ...(ngDevMode ? [{ debugName: \"buttonStyle\" }] : []));\n this.dragStyle = input({ color: '#cc7832' }, ...(ngDevMode ? [{ debugName: \"dragStyle\" }] : []));\n this.textStyle = input({ color: '#cc7832' }, ...(ngDevMode ? [{ debugName: \"textStyle\" }] : []));\n this.wordlist = signal('', ...(ngDevMode ? [{ debugName: \"wordlist\" }] : []));\n this.displayWordlist = signal(false, ...(ngDevMode ? [{ debugName: \"displayWordlist\" }] : []));\n this.fileType = signal(FileType.plaintext, ...(ngDevMode ? [{ debugName: \"fileType\" }] : []));\n this.fileTypes = Object.values(FileType);\n this.filteredCharset = signal([], ...(ngDevMode ? [{ debugName: \"filteredCharset\" }] : []));\n this.prefix = signal('', ...(ngDevMode ? [{ debugName: \"prefix\" }] : []));\n this.suffix = signal('', ...(ngDevMode ? [{ debugName: \"suffix\" }] : []));\n this.isGenerating = signal(false, ...(ngDevMode ? [{ debugName: \"isGenerating\" }] : []));\n this.isLargeDataset = signal(false, ...(ngDevMode ? [{ debugName: \"isLargeDataset\" }] : []));\n this.wordsGenerated = signal(undefined, ...(ngDevMode ? [{ debugName: \"wordsGenerated\" }] : []));\n this.canGenerate = computed(() => this.charsetForm?.valid && this.filteredCharset().length > 0, ...(ngDevMode ? [{ debugName: \"canGenerate\" }] : []));\n this.hasWordlist = computed(() => this.wordlist().length > 0, ...(ngDevMode ? [{ debugName: \"hasWordlist\" }] : []));\n this.unsubscribe$ = new Subject();\n this.removeDuplicates = (unfiltered) => [...new Set(unfiltered)].join('');\n this.generateForm();\n }\n ngOnDestroy() {\n this.unsubscribe$.next();\n this.unsubscribe$.complete();\n }\n get charsets() {\n if (this.charsetForm) {\n return this.charsetForm.get('charsets');\n }\n return undefined;\n }\n addCharset() {\n if (this.charsets) {\n this.charsets.push(this.formBuilder.control('', Validators.required));\n }\n }\n cloneCharset(index) {\n if (this.charsets) {\n const charset = this.charsets.value[index];\n this.charsets.insert(index, this.formBuilder.control(charset, Validators.required));\n }\n }\n downloadWordlist() {\n if (this.charsets) {\n const currentCharset = this.filterCharset(this.charsets.value);\n if (JSON.stringify(this.filteredCharset()) !==\n JSON.stringify(currentCharset)) {\n this.generateWordlist();\n }\n const filename = `wordlist_${this.wordsGenerated()}_words_${this.charsets.length}_positions.${this.fileType()}`;\n const wordlistContent = this.wordlist();\n if (wordlistContent && wordlistContent.length > 0) {\n this.performDownload(wordlistContent, filename);\n }\n }\n }\n performDownload(wordlistContent, filename) {\n const parsed = this.parseWordlist(wordlistContent);\n const file = new Blob([parsed.wordlist], {\n type: parsed.contentType\n });\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n if (window.navigator.msSaveOrOpenBlob) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n window.navigator.msSaveOrOpenBlob(file, filename);\n }\n else {\n const a = document.createElement('a');\n const url = URL.createObjectURL(file);\n a.href = url;\n a.download = filename;\n document.body.appendChild(a);\n a.click();\n setTimeout(() => {\n document.body.removeChild(a);\n window.URL.revokeObjectURL(url);\n }, 0);\n }\n }\n drop(event) {\n if (this.charsets) {\n moveItemInArray(this.charsets.controls, event.previousIndex, event.currentIndex);\n this.charsets.updateValueAndValidity();\n }\n }\n generateForm() {\n this.charsetForm = this.formBuilder.group({\n charsets: this.formBuilder.array([\n this.formBuilder.control('', Validators.required)\n ]),\n prefix: this.formBuilder.control(''),\n suffix: this.formBuilder.control('')\n });\n }\n generateWordlist() {\n if (this.charsetForm && this.charsets && this.charsets.valid) {\n this.filteredCharset.set(this.filterCharset(this.charsets.value));\n this.prefix.set(this.charsetForm.get('prefix')?.value || '');\n this.suffix.set(this.charsetForm.get('suffix')?.value || '');\n const wordsCount = this.filteredCharset()\n .map((charset) => charset.length)\n .reduce((previousLength, currentLength) => previousLength * currentLength);\n this.wordsGenerated.set(wordsCount);\n this.isLargeDataset.set(wordsCount > 50000);\n this.displayWordlist.set(wordsCount <= 100);\n this.isGenerating.set(true);\n // Generate wordlist and update signal\n this.getWordlist()\n .pipe(takeUntil(this.unsubscribe$))\n .subscribe({\n next: (wordlist) => this.wordlist.set(wordlist),\n error: (error) => {\n console.error('Error generating wordlist:', error);\n this.isGenerating.set(false);\n }\n });\n }\n }\n getWordlist() {\n return this.wordlistGenerator\n .generateWordlist(...this.filteredCharset())\n .pipe(shareReplay({ bufferSize: 1, refCount: true }), reduce((wordlist, word) => `${wordlist}${this.prefix()}${word}${this.suffix()}\\n`, ''), finalize(() => {\n this.isGenerating.set(false);\n }), takeUntil(this.unsubscribe$));\n }\n filterCharset(charsets) {\n return charsets.map((charset) => this.removeDuplicates(charset));\n }\n parseWordlist(wordlist) {\n switch (this.fileType()) {\n case FileType.plaintext:\n return toPlaintext(wordlist);\n case FileType.xml:\n return toXML(wordlist);\n case FileType.csv:\n return toCSV(wordlist);\n }\n }\n removeCharset(i) {\n if (this.charsets && this.charsets.length > 1) {\n this.charsets.removeAt(i);\n }\n }\n static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: \"12.0.0\", version: \"20.1.6\", ngImport: i0, type: WordlistGeneratorComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }\n static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: \"17.0.0\", version: \"20.1.6\", type: WordlistGeneratorComponent, isStandalone: true, selector: \"wordlist-generator\", inputs: { buttonStyle: { classPropertyName: \"buttonStyle\", publicName: \"buttonStyle\", isSignal: true, isRequired: false, transformFunction: null }, dragStyle: { classPropertyName: \"dragStyle\", publicName: \"dragStyle\", isSignal: true, isRequired: false, transformFunction: null }, textStyle: { classPropertyName: \"textStyle\", publicName: \"textStyle\", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0, template: \"<div class=\\\"meta-container flex-row-wrap\\\">\\n <div class=\\\"form-container flex-column flex-fxflex\\\">\\n <div class=\\\"flex-row-wrap bottom-10\\\">\\n <button\\n class=\\\"generate-wordlist\\\"\\n [ngStyle]=\\\"buttonStyle()\\\"\\n mat-raised-button\\n (click)=\\\"generateWordlist()\\\"\\n [disabled]=\\\"isGenerating()\\\"\\n >\\n @if (isGenerating()) {\\n Generating...\\n } @else {\\n Generate wordlist\\n }\\n </button>\\n @if (hasWordlist() && !isGenerating()) {\\n <button\\n class=\\\"choose-format\\\"\\n [ngStyle]=\\\"buttonStyle()\\\"\\n mat-raised-button\\n [matMenuTriggerFor]=\\\"menu\\\"\\n >\\n Choose format\\n </button>\\n }\\n <mat-menu #menu=\\\"matMenu\\\">\\n @for (type of fileTypes; track type) {\\n <button\\n [ngStyle]=\\\"buttonStyle()\\\"\\n mat-menu-item\\n (click)=\\\"fileType.set(type)\\\"\\n >\\n {{ type }}\\n </button>\\n }\\n </mat-menu>\\n @if (hasWordlist() && !isGenerating()) {\\n <button\\n class=\\\"download-wordlist\\\"\\n [ngStyle]=\\\"buttonStyle()\\\"\\n mat-raised-button\\n (click)=\\\"downloadWordlist()\\\"\\n >\\n Download as\\n @if (this.fileType()) {\\n {{ this.fileType() }}\\n }\\n </button>\\n }\\n </div>\\n \\n @if (isGenerating() && isLargeDataset()) {\\n <div class=\\\"progress-container\\\">\\n <mat-progress-bar mode=\\\"indeterminate\\\" role=\\\"progressbar\\\" aria-label=\\\"Generating wordlist\\\"></mat-progress-bar>\\n <p [ngStyle]=\\\"textStyle()\\\">Processing large dataset using Web Worker...</p>\\n </div>\\n }\\n \\n @if (charsetForm) {\\n <form [formGroup]=\\\"charsetForm\\\">\\n <mat-form-field class=\\\"fixed-width bottom-10\\\" appearance=\\\"outline\\\">\\n <mat-label [ngStyle]=\\\"textStyle()\\\">prefix (optional)</mat-label>\\n <input\\n [ngStyle]=\\\"textStyle()\\\"\\n matInput\\n type=\\\"text\\\"\\n id=\\\"prefix\\\"\\n formControlName=\\\"prefix\\\"\\n (keydown.enter)=\\\"$event.preventDefault()\\\"\\n />\\n </mat-form-field>\\n <div formArrayName=\\\"charsets\\\">\\n <div cdkDropList (cdkDropListDropped)=\\\"drop($event)\\\">\\n @for (\\n charset of charsets?.controls;\\n track charset;\\n let i = $index\\n ) {\\n <div class=\\\"charset-container\\\" cdkDrag>\\n <mat-icon class=\\\"drag-indicator\\\" [ngStyle]=\\\"dragStyle()\\\"\\n >drag_indicator</mat-icon\\n >\\n <mat-form-field class=\\\"charset bottom-10\\\" appearance=\\\"outline\\\">\\n <mat-label [ngStyle]=\\\"textStyle()\\\">\\n character set for string position {{ i }}\\n </mat-label>\\n <input\\n [ngStyle]=\\\"textStyle()\\\"\\n matInput\\n type=\\\"text\\\"\\n id=\\\"position-{{ i }}\\\"\\n [formControlName]=\\\"i\\\"\\n (keydown.enter)=\\\"$event.preventDefault()\\\"\\n required\\n />\\n </mat-form-field>\\n <button\\n mat-raised-button\\n class=\\\"clone-charset\\\"\\n [ngStyle]=\\\"buttonStyle()\\\"\\n (click)=\\\"cloneCharset(i)\\\"\\n >\\n <mat-icon class=\\\"row-button-icon\\\">content_copy</mat-icon>\\n </button>\\n <button\\n mat-raised-button\\n class=\\\"remove-charset\\\"\\n [ngStyle]=\\\"buttonStyle()\\\"\\n (click)=\\\"removeCharset(i)\\\"\\n [disabled]=\\\"this.charsets?.value.length === 1\\\"\\n >\\n <mat-icon class=\\\"row-button-icon\\\">remove</mat-icon>\\n </button>\\n <button\\n mat-raised-button\\n [ngStyle]=\\\"buttonStyle()\\\"\\n (click)=\\\"addCharset()\\\"\\n >\\n <mat-icon class=\\\"row-button-icon\\\">add</mat-icon>\\n </button>\\n </div>\\n }\\n </div>\\n </div>\\n <mat-form-field class=\\\"fixed-width\\\" appearance=\\\"outline\\\">\\n <mat-label [ngStyle]=\\\"textStyle()\\\">suffix (optional)</mat-label>\\n <input\\n [ngStyle]=\\\"textStyle()\\\"\\n matInput\\n type=\\\"text\\\"\\n id=\\\"suffix\\\"\\n formControlName=\\\"suffix\\\"\\n (keydown.enter)=\\\"$event.preventDefault()\\\"\\n />\\n </mat-form-field>\\n </form>\\n }\\n </div>\\n @if (hasWordlist()) {\\n <div class=\\\"wordlist-container flex-column flex-fxflex\\\">\\n @if (displayWordlist()) {\\n <h3 class=\\\"wordlist-header\\\">Generated wordlist:</h3>\\n <code class=\\\"wordlist\\\">\\n {{ wordlist() }}\\n </code>\\n } @else {\\n The generated wordlist is too large to be displayed. You can still\\n download it.\\n <!-- Wordlist is already loaded in the signal for large datasets -->\\n }\\n </div>\\n }\\n</div>\\n\", styles: [\".flex-align-start{justify-content:flex-start}.flex-align-stretch{align-content:stretch;align-items:stretch}.flex-column{display:flex;flex-direction:column;box-sizing:border-box}.flex-row{display:flex;flex-direction:row;box-sizing:border-box}.flex-row-wrap{display:flex;flex-direction:row;flex-wrap:wrap;box-sizing:border-box}.flex-fxflex{flex:1 1 0%}.flex-fxflex-responsive{flex:0 1 calc(33.3% - 32px)}.flex-fxflex-lt-md{flex:0 1 calc(50% - 32px)}.flex-fxflex-lt-sm{flex:100%}.flex-fxflex-fill{height:100%;min-height:100%;min-width:100%;width:100%}.flex-gap-5{margin-right:5px}.flex-gap-12{margin-right:12px}.flex-gap-20{margin-right:20px}.meta-container{max-width:100vw}.meta-container .form-container{float:left}.meta-container .form-container .charset-container .drag-indicator{height:20px;width:20px;margin-right:10px}.meta-container .form-container .charset-container .clone-charset{margin:0 10px}.meta-container .form-container .charset-container .remove-charset{margin-right:10px}@media screen and (max-width: 430px){.meta-container .form-container .charset-container{margin-bottom:15px}}.meta-container .form-container .charset{width:19.15em}.meta-container .form-container .charset-container:not(:last-child) .add-charset{display:none}.meta-container .form-container .choose-format{margin:0 34px 10px;width:150px;line-height:36px;letter-spacing:normal}.meta-container .form-container .generate-wordlist,.meta-container .form-container .download-wordlist{margin:0 0 10px;width:150px;line-height:36px;letter-spacing:normal}.meta-container .wordlist-container{max-height:80vh}.meta-container .wordlist-container .wordlist-header{margin-top:0}.meta-container .wordlist-container .wordlist{font-size:12px;margin-left:1em;overflow-wrap:normal;width:1%}.row-button-icon{font-size:24px!important;height:24px!important;width:24px!important;margin:0!important}.mat-mdc-menu-panel{width:150px}.mat-mdc-menu-item-text{line-height:48px!important;letter-spacing:normal!important;font-size:14px!important}.mat-mdc-form-field{height:50px!important}.mat-mdc-form-field-infix{height:42px!important;min-height:42px!important;max-height:42px!important;border:0!important;padding:.5em 0!important}.mat-mdc-text-field-wrapper{height:42px!important;padding-left:12px!important;padding-bottom:0!important}.mat-mdc-floating-label:not(.mdc-floating-label--float-above){top:19px!important}.mat-mdc-form-field:not(.mat-form-field-no-animations) .mdc-floating-label{transition:none!important}.fixed-width{width:21em}.bottom-10{margin-bottom:10px}\\n\"], dependencies: [{ kind: \"ngmodule\", type: MatButtonModule }, { kind: \"component\", type: i1.MatButton, selector: \" button[matButton], a[matButton], button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button], a[mat-button], a[mat-raised-button], a[mat-flat-button], a[mat-stroked-button] \", inputs: [\"matButton\"], exportAs: [\"matButton\", \"matAnchor\"] }, { kind: \"directive\", type: NgStyle, selector: \"[ngStyle]\", inputs: [\"ngStyle\"] }, { kind: \"ngmodule\", type: MatMenuModule }, { kind: \"component\", type: i2.MatMenu, selector: \"mat-menu\", inputs: [\"backdropClass\", \"aria-label\", \"aria-labelledby\", \"aria-describedby\", \"xPosition\", \"yPosition\", \"overlapTrigger\", \"hasBackdrop\", \"class\", \"classList\"], outputs: [\"closed\", \"close\"], exportAs: [\"matMenu\"] }, { kind: \"component\", type: i2.MatMenuItem, selector: \"[mat-menu-item]\", inputs: [\"role\", \"disabled\", \"disableRipple\"], exportAs: [\"matMenuItem\"] }, { kind: \"directive\", type: i2.MatMenuTrigger, selector: \"[mat-menu-trigger-for], [matMenuTriggerFor]\", inputs: [\"mat-menu-trigger-for\", \"matMenuTriggerFor\", \"matMenuTriggerData\", \"matMenuTriggerRestoreFocus\"], outputs: [\"menuOpened\", \"onMenuOpen\", \"menuClosed\", \"onMenuClose\"], exportAs: [\"matMenuTrigger\"] }, { kind: \"ngmodule\", type: ReactiveFormsModule }, { kind: \"directive\", type: i3.ɵNgNoValidate, selector: \"form:not([ngNoForm]):not([ngNativeValidate])\" }, { kind: \"directive\", type: i3.DefaultValueAccessor, selector: \"input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]\" }, { kind: \"directive\", type: i3.NgControlStatus, selector: \"[formControlName],[ngModel],[formControl]\" }, { kind: \"directive\", type: i3.NgControlStatusGroup, selector: \"[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]\" }, { kind: \"directive\", type: i3.RequiredValidator, selector: \":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]\", inputs: [\"required\"] }, { kind: \"directive\", type: i3.FormGroupDirective, selector: \"[formGroup]\", inputs: [\"formGroup\"], outputs: [\"ngSubmit\"], exportAs: [\"ngForm\"] }, { kind: \"directive\", type: i3.FormControlName, selector: \"[formControlName]\", inputs: [\"formControlName\", \"disabled\", \"ngModel\"], outputs: [\"ngModelChange\"] }, { kind: \"directive\", type: i3.FormArrayName, selector: \"[formArrayName]\", inputs: [\"formArrayName\"] }, { kind: \"ngmodule\", type: MatFormFieldModule }, { kind: \"component\", type: i4.MatFormField, selector: \"mat-form-field\", inputs: [\"hideRequiredMarker\", \"color\", \"floatLabel\", \"appearance\", \"subscriptSizing\", \"hintLabel\"], exportAs: [\"matFormField\"] }, { kind: \"directive\", type: i4.MatLabel, selector: \"mat-label\" }, { kind: \"ngmodule\", type: MatInputModule }, { kind: \"directive\", type: i5.MatInput, selector: \"input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]\", inputs: [\"disabled\", \"id\", \"placeholder\", \"name\", \"required\", \"type\", \"errorStateMatcher\", \"aria-describedby\", \"value\", \"readonly\", \"disabledInteractive\"], exportAs: [\"matInput\"] }, { kind: \"directive\", type: CdkDropList, selector: \"[cdkDropList], cdk-drop-list\", inputs: [\"cdkDropListConnectedTo\", \"cdkDropListData\", \"cdkDropListOrientation\", \"id\", \"cdkDropListLockAxis\", \"cdkDropListDisabled\", \"cdkDropListSortingDisabled\", \"cdkDropListEnterPredicate\", \"cdkDropListSortPredicate\", \"cdkDropListAutoScrollDisabled\", \"cdkDropListAutoScrollStep\", \"cdkDropListElementContainer\", \"cdkDropListHasAnchor\"], outputs: [\"cdkDropListDropped\", \"cdkDropListEntered\", \"cdkDropListExited\", \"cdkDropListSorted\"], exportAs: [\"cdkDropList\"] }, { kind: \"directive\", type: CdkDrag, selector: \"[cdkDrag]\", inputs: [\"cdkDragData\", \"cdkDragLockAxis\", \"cdkDragRootElement\", \"cdkDragBoundary\", \"cdkDragStartDelay\", \"cdkDragFreeDragPosition\", \"cdkDragDisabled\", \"cdkDragConstrainPosition\", \"cdkDragPreviewClass\", \"cdkDragPreviewContainer\", \"cdkDragScale\"], outputs: [\"cdkDragStarted\", \"cdkDragReleased\", \"cdkDragEnded\", \"cdkDragEntered\", \"cdkDragExited\", \"cdkDragDropped\", \"cdkDragMoved\"], exportAs: [\"cdkDrag\"] }, { kind: \"ngmodule\", type: MatIconModule }, { kind: \"component\", type: i6.MatIcon, selector: \"mat-icon\", inputs: [\"color\", \"inline\", \"svgIcon\", \"fontSet\", \"fontIcon\"], exportAs: [\"matIcon\"] }, { kind: \"ngmodule\", type: MatProgressBarModule }, { kind: \"component\", type: i7.MatProgressBar, selector: \"mat-progress-bar\", inputs: [\"color\", \"value\", \"bufferValue\", \"mode\"], outputs: [\"animationEnd\"], exportAs: [\"matProgressBar\"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }\n}\ni0.ɵɵngDeclareClassMetadata({ minVersion: \"12.0.0\", version: \"20.1.6\", ngImport: i0, type: WordlistGeneratorComponent, decorators: [{\n type: Component,\n args: [{ selector: 'wordlist-generator', encapsulation: ViewEncapsulation.None, imports: [\n MatButtonModule,\n NgStyle,\n MatMenuModule,\n ReactiveFormsModule,\n MatFormFieldModule,\n MatInputModule,\n CdkDropList,\n CdkDrag,\n MatIconModule,\n MatProgressBarModule\n ], changeDetection: ChangeDetectionStrategy.OnPush, template: \"<div class=\\\"meta-container flex-row-wrap\\\">\\n <div class=\\\"form-container flex-column flex-fxflex\\\">\\n <div class=\\\"flex-row-wrap bottom-10\\\">\\n <button\\n class=\\\"generate-wordlist\\\"\\n [ngStyle]=\\\"buttonStyle()\\\"\\n mat-raised-button\\n (click)=\\\"generateWordlist()\\\"\\n [disabled]=\\\"isGenerating()\\\"\\n >\\n @if (isGenerating()) {\\n Generating...\\n } @else {\\n Generate wordlist\\n }\\n </button>\\n @if (hasWordlist() && !isGenerating()) {\\n <button\\n class=\\\"choose-format\\\"\\n [ngStyle]=\\\"buttonStyle()\\\"\\n mat-raised-button\\n [matMenuTriggerFor]=\\\"menu\\\"\\n >\\n Choose format\\n </button>\\n }\\n <mat-menu #menu=\\\"matMenu\\\">\\n @for (type of fileTypes; track type) {\\n <button\\n [ngStyle]=\\\"buttonStyle()\\\"\\n mat-menu-item\\n (click)=\\\"fileType.set(type)\\\"\\n >\\n {{ type }}\\n </button>\\n }\\n </mat-menu>\\n @if (hasWordlist() && !isGenerating()) {\\n <button\\n class=\\\"download-wordlist\\\"\\n [ngStyle]=\\\"buttonStyle()\\\"\\n mat-raised-button\\n (click)=\\\"downloadWordlist()\\\"\\n >\\n Download as\\n @if (this.fileType()) {\\n {{ this.fileType() }}\\n }\\n </button>\\n }\\n </div>\\n \\n @if (isGenerating() && isLargeDataset()) {\\n <div class=\\\"progress-container\\\">\\n <mat-progress-bar mode=\\\"indeterminate\\\" role=\\\"progressbar\\\" aria-label=\\\"Generating wordlist\\\"></mat-progress-bar>\\n <p [ngStyle]=\\\"textStyle()\\\">Processing large dataset using Web Worker...</p>\\n </div>\\n }\\n \\n @if (charsetForm) {\\n <form [formGroup]=\\\"charsetForm\\\">\\n <mat-form-field class=\\\"fixed-width bottom-10\\\" appearance=\\\"outline\\\">\\n <mat-label [ngStyle]=\\\"textStyle()\\\">prefix (optional)</mat-label>\\n <input\\n [ngStyle]=\\\"textStyle()\\\"\\n matInput\\n type=\\\"text\\\"\\n id=\\\"prefix\\\"\\n formControlName=\\\"prefix\\\"\\n (keydown.enter)=\\\"$event.preventDefault()\\\"\\n />\\n </mat-form-field>\\n <div formArrayName=\\\"charsets\\\">\\n <div cdkDropList (cdkDropListDropped)=\\\"drop($event)\\\">\\n @for (\\n charset of charsets?.controls;\\n track charset;\\n let i = $index\\n ) {\\n <div class=\\\"charset-container\\\" cdkDrag>\\n <mat-icon class=\\\"drag-indicator\\\" [ngStyle]=\\\"dragStyle()\\\"\\n >drag_indicator</mat-icon\\n >\\n <mat-form-field class=\\\"charset bottom-10\\\" appearance=\\\"outline\\\">\\n <mat-label [ngStyle]=\\\"textStyle()\\\">\\n character set for string position {{ i }}\\n </mat-label>\\n <input\\n [ngStyle]=\\\"textStyle()\\\"\\n matInput\\n type=\\\"text\\\"\\n id=\\\"position-{{ i }}\\\"\\n [formControlName]=\\\"i\\\"\\n (keydown.enter)=\\\"$event.preventDefault()\\\"\\n required\\n />\\n </mat-form-field>\\n <button\\n mat-raised-button\\n class=\\\"clone-charset\\\"\\n [ngStyle]=\\\"buttonStyle()\\\"\\n (click)=\\\"cloneCharset(i)\\\"\\n >\\n <mat-icon class=\\\"row-button-icon\\\">content_copy</mat-icon>\\n </button>\\n <button\\n mat-raised-button\\n class=\\\"remove-charset\\\"\\n [ngStyle]=\\\"buttonStyle()\\\"\\n (click)=\\\"removeCharset(i)\\\"\\n [disabled]=\\\"this.charsets?.value.length === 1\\\"\\n >\\n <mat-icon class=\\\"row-button-icon\\\">remove</mat-icon>\\n </button>\\n <button\\n mat-raised-button\\n [ngStyle]=\\\"buttonStyle()\\\"\\n (click)=\\\"addCharset()\\\"\\n >\\n <mat-icon class=\\\"row-button-icon\\\">add</mat-icon>\\n </button>\\n </div>\\n }\\n </div>\\n </div>\\n <mat-form-field class=\\\"fixed-width\\\" appearance=\\\"outline\\\">\\n <mat-label [ngStyle]=\\\"textStyle()\\\">suffix (optional)</mat-label>\\n <input\\n [ngStyle]=\\\"textStyle()\\\"\\n matInput\\n type=\\\"text\\\"\\n id=\\\"suffix\\\"\\n formControlName=\\\"suffix\\\"\\n (keydown.enter)=\\\"$event.preventDefault()\\\"\\n />\\n </mat-form-field>\\n </form>\\n }\\n </div>\\n @if (hasWordlist()) {\\n <div class=\\\"wordlist-container flex-column flex-fxflex\\\">\\n @if (displayWordlist()) {\\n <h3 class=\\\"wordlist-header\\\">Generated wordlist:</h3>\\n <code class=\\\"wordlist\\\">\\n {{ wordlist() }}\\n </code>\\n } @else {\\n The generated wordlist is too large to be displayed. You can still\\n download it.\\n <!-- Wordlist is already loaded in the signal for large datasets -->\\n }\\n </div>\\n }\\n</div>\\n\", styles: [\".flex-align-start{justify-content:flex-start}.flex-align-stretch{align-content:stretch;align-items:stretch}.flex-column{display:flex;flex-direction:column;box-sizing:border-box}.flex-row{display:flex;flex-direction:row;box-sizing:border-box}.flex-row-wrap{display:flex;flex-direction:row;flex-wrap:wrap;box-sizing:border-box}.flex-fxflex{flex:1 1 0%}.flex-fxflex-responsive{flex:0 1 calc(33.3% - 32px)}.flex-fxflex-lt-md{flex:0 1 calc(50% - 32px)}.flex-fxflex-lt-sm{flex:100%}.flex-fxflex-fill{height:100%;min-height:100%;min-width:100%;width:100%}.flex-gap-5{margin-right:5px}.flex-gap-12{margin-right:12px}.flex-gap-20{margin-right:20px}.meta-container{max-width:100vw}.meta-container .form-container{float:left}.meta-container .form-container .charset-container .drag-indicator{height:20px;width:20px;margin-right:10px}.meta-container .form-container .charset-container .clone-charset{margin:0 10px}.meta-container .form-container .charset-container .remove-charset{margin-right:10px}@media screen and (max-width: 430px){.meta-container .form-container .charset-container{margin-bottom:15px}}.meta-container .form-container .charset{width:19.15em}.meta-container .form-container .charset-container:not(:last-child) .add-charset{display:none}.meta-container .form-container .choose-format{margin:0 34px 10px;width:150px;line-height:36px;letter-spacing:normal}.meta-container .form-container .generate-wordlist,.meta-container .form-container .download-wordlist{margin:0 0 10px;width:150px;line-height:36px;letter-spacing:normal}.meta-container .wordlist-container{max-height:80vh}.meta-container .wordlist-container .wordlist-header{margin-top:0}.meta-container .wordlist-container .wordlist{font-size:12px;margin-left:1em;overflow-wrap:normal;width:1%}.row-button-icon{font-size:24px!important;height:24px!important;width:24px!important;margin:0!important}.mat-mdc-menu-panel{width:150px}.mat-mdc-menu-item-text{line-height:48px!important;letter-spacing:normal!important;font-size:14px!important}.mat-mdc-form-field{height:50px!important}.mat-mdc-form-field-infix{height:42px!important;min-height:42px!important;max-height:42px!important;border:0!important;padding:.5em 0!important}.mat-mdc-text-field-wrapper{height:42px!important;padding-left:12px!important;padding-bottom:0!important}.mat-mdc-floating-label:not(.mdc-floating-label--float-above){top:19px!important}.mat-mdc-form-field:not(.mat-form-field-no-animations) .mdc-floating-label{transition:none!important}.fixed-width{width:21em}.bottom-10{margin-bottom:10px}\\n\"] }]\n }], ctorParameters: () => [] });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid29yZGxpc3QtZ2VuZXJhdG9yLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL2xpYnMvd29yZGxpc3QtZ2VuZXJhdG9yL3NyYy9saWIvd29yZGxpc3QtZ2VuZXJhdG9yLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL2xpYnMvd29yZGxpc3QtZ2VuZXJhdG9yL3NyYy9saWIvd29yZGxpc3QtZ2VuZXJhdG9yLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCxPQUFPLEVBRVAsV0FBVyxFQUNYLGVBQWUsRUFDaEIsTUFBTSx3QkFBd0IsQ0FBQztBQUNoQyxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDMUMsT0FBTyxFQUNMLHVCQUF1QixFQUN2QixTQUFTLEVBQ1QsUUFBUSxFQUNSLE1BQU0sRUFDTixLQUFLLEVBRUwsTUFBTSxFQUNOLGlCQUFpQixFQUNsQixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQ0wsbUJBQW1CLEVBRW5CLGtCQUFrQixFQUVsQixVQUFVLEVBQ1gsTUFBTSxnQkFBZ0IsQ0FBQztBQUN4QixPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDM0QsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFDbEUsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQ3ZELE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUN6RCxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDdkQsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFDdEUsT0FBTyxFQUFjLE9BQU8sRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUMzQyxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBRSxXQUFXLEVBQUUs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LGNBQWMsa1lBQ2QsV0FBVyxzaEJBQ1gsT0FBTyx1Y0FDUCxhQUFhLG1MQUNiLG9CQUFvQjs7MkZBSVgsMEJBQTBCO2tCQW5CdEMsU0FBUzsrQkFDRSxvQkFBb0IsaUJBR2YsaUJBQWlCLENBQUMsSUFBSSxXQUM1Qjt3QkFDUCxlQUFlO3dCQUNmLE9BQU87d0JBQ1AsYUFBYTt3QkFDYixtQkFBbUI7d0JBQ25CLGtCQUFrQjt3QkFDbEIsY0FBYzt3QkFDZCxXQUFXO3dCQUNYLE9BQU87d0JBQ1AsYUFBYTt3QkFDYixvQkFBb0I7cUJBQ3JCLG1CQUNnQix1QkFBdUIsQ0FBQyxNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQ2RrRHJhZyxcbiAgQ2RrRHJhZ0Ryb3AsXG4gIENka0Ryb3BMaXN0LFxuICBtb3ZlSXRlbUluQXJyYXlcbn0gZnJvbSAnQGFuZ3VsYXIvY2RrL2RyYWctZHJvcCc7XG5pbXBvcnQgeyBOZ1N0eWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7XG4gIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICBDb21wb25lbnQsXG4gIGNvbXB1dGVkLFxuICBpbmplY3QsXG4gIGlucHV0LFxuICBPbkRlc3Ryb3ksXG4gIHNpZ25hbCxcbiAgVmlld0VuY2Fwc3VsYXRpb25cbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge1xuICBSZWFjdGl2ZUZvcm1zTW9kdWxlLFxuICBVbnR5cGVkRm9ybUFycmF5LFxuICBVbnR5cGVkRm9ybUJ1aWxkZXIsXG4gIFVudHlwZWRGb3JtR3JvdXAsXG4gIFZhbGlkYXRvcnNcbn0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgTWF0QnV0dG9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvYnV0dG9uJztcbmltcG9ydCB7IE1hdEZvcm1GaWVsZE1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2Zvcm0tZmllbGQnO1xuaW1wb3J0IHsgTWF0SWNvbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2ljb24nO1xuaW1wb3J0IHsgTWF0SW5wdXRNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9pbnB1dCc7XG5pbXBvcnQgeyBNYXRNZW51TW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvbWVudSc7XG5pbXBvcnQgeyBNYXRQcm9ncmVzc0Jhck1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL3Byb2dyZXNzLWJhcic7XG5pbXBvcnQgeyBPYnNlcnZhYmxlLCBTdWJqZWN0IH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBmaW5hbGl6ZSwgcmVkdWNlLCBzaGFyZVJlcGxheSwgdGFrZVVudGlsIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuXG5pbXBvcnQgeyBGaWxlVHlwZSB9IGZyb20gJy4vZmlsZXR5cGVzJztcbmltcG9ydCB7IHRvQ1NWLCB0b1BsYWludGV4dCwgdG9YTUwgfSBmcm9tICcuL3BhcnNlcnMnO1xuaW1wb3J0IHsgV29yZGxpc3RHZW5lcmF0b3JTZXJ2aWNlIH0gZnJvbSAnLi93b3JkbGlzdC1nZW5lcmF0b3Iuc2VydmljZSc7XG5cbi8qIGVzbGludC1kaXNhYmxlIEBhbmd1bGFyLWVzbGludC9jb21wb25lbnQtc2VsZWN0b3IgKi9cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ3dvcmRsaXN0LWdlbmVyYXRvcicsXG4gIHRlbXBsYXRlVXJsOiAnLi93b3JkbGlzdC1nZW5lcmF0b3IuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi93b3JkbGlzdC1nZW5lcmF0b3IuY29tcG9uZW50LnNjc3MnXSxcbiAgZW5jYXBzdWxhdGlvbjogVmlld0VuY2Fwc3VsYXRpb24uTm9uZSxcbiAgaW1wb3J0czogW1xuICAgIE1hdEJ1dHRvbk1vZHVsZSxcbiAgICBOZ1N0eWxlLFxuICAgIE1hdE1lbnVNb2R1bGUsXG4gICAgUmVhY3RpdmVGb3Jtc01vZHVsZSxcbiAgICBNYXRGb3JtRmllbGRNb2R1bGUsXG4gICAgTWF0SW5wdXRNb2R1bGUsXG4gICAgQ2RrRHJvcExpc3QsXG4gICAgQ2RrRHJhZyxcbiAgICBNYXRJY29uTW9kdWxlLFxuICAgIE1hdFByb2dyZXNzQmFyTW9kdWxlXG4gIF0sXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoXG59KVxuZXhwb3J0IGNsYXNzIFdvcmRsaXN0R2VuZXJhdG9yQ29tcG9uZW50IGltcGxlbWVudHMgT25EZXN0cm95IHtcbiAgcHJpdmF0ZSBmb3JtQnVpbGRlciA9IGluamVjdChVbnR5cGVkRm9ybUJ1aWxkZXIpO1xuICBwcml2YXRlIHdvcmRsaXN0R2VuZXJhdG9yID0gaW5qZWN0KFdvcmRsaXN0R2VuZXJhdG9yU2VydmljZSk7XG5cbiAgYnV0dG9uU3R5bGUgPSBpbnB1dCh7XG4gICAgJ2JhY2tncm91bmQtY29sb3InOiAnIzMzMzMzMycsXG4gICAgY29sb3I6ICcjY2M3ODMyJ1xuICB9KTtcblxuICBkcmFnU3R5bGUgPSBpbnB1dCh7IGNvbG9yOiAnI2NjNzgzMicgfSk7XG4gIHRleHRTdHlsZSA9IGlucHV0KHsgY29sb3I6ICcjY2M3ODMyJyB9KTtcblxuICBjaGFyc2V0Rm9ybTogVW50eXBlZEZvcm1Hcm91cCB8IHVuZGVmaW5lZDtcbiAgd29yZGxpc3QgPSBzaWduYWw8c3RyaW5nPignJyk7XG5cbiAgZGlzcGxheVdvcmRsaXN0ID0gc2lnbmFsKGZhbHNlKTtcbiAgZmlsZVR5cGUgPSBzaWduYWwoRmlsZVR5cGUucGxhaW50ZXh0KTtcbiAgZmlsZVR5cGVzID0gT2JqZWN0LnZhbHVlcyhGaWxlVHlwZSk7XG4gIGZpbHRlcmVkQ2hhcnNldCA9IHNpZ25hbDxzdHJpbmdbXT4oW10pO1xuICBwcmVmaXggPSBzaWduYWwoJycpO1xuICBzdWZmaXggPSBzaWduYWwoJycpO1xuICBpc0dlbmVyYXRpbmcgPSBzaWduYWwoZmFsc2UpO1xuICBpc0xhcmdlRGF0YXNldCA9IHNpZ25hbChmYWxzZSk7XG4gIHdvcmRzR2VuZXJhdGVkID0gc2lnbmFsPG51bWJlciB8IHVuZGVmaW5lZD4odW5kZWZpbmVkKTtcblxuICBjYW5HZW5lcmF0ZSA9IGNvbXB1dGVkKFxuICAgICgpID0+IHRoaXMuY2hhcnNldEZvcm0/LnZhbGlkICYmIHRoaXMuZmlsdGVyZWRDaGFyc2V0KCkubGVuZ3RoID4gMFxuICApO1xuXG4gIGhhc1dvcmRsaXN0ID0gY29tcHV0ZWQoKCkgPT4gdGhpcy53b3JkbGlzdCgpLmxlbmd0aCA+IDApO1xuXG4gIHByaXZhdGUgdW5zdWJzY3JpYmUkID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICB0aGlzLmdlbmVyYXRlRm9ybSgpO1xuICB9XG5cbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgdGhpcy51bnN1YnNjcmliZSQubmV4dCgpO1xuICAgIHRoaXMudW5zdWJzY3JpYmUkLmNvbXBsZXRlKCk7XG4gIH1cblxuICBnZXQgY2hhcnNldHMoKTogVW50eXBlZEZvcm1BcnJheSB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKHRoaXMuY2hhcnNldEZvcm0pIHtcbiAgICAgIHJldHVybiB0aGlzLmNoYXJzZXRGb3JtLmdldCgnY2hhcnNldHMnKSBhcyBVbnR5cGVkRm9ybUFycmF5O1xuICAgIH1cbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgYWRkQ2hhcnNldCgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5jaGFyc2V0cykge1xuICAgICAgdGhpcy5jaGFyc2V0cy5wdXNoKHRoaXMuZm9ybUJ1aWxkZXIuY29udHJvbCgnJywgVmFsaWRhdG9ycy5yZXF1aXJlZCkpO1xuICAgIH1cbiAgfVxuXG4gIGNsb25lQ2hhcnNldChpbmRleDogbnVtYmVyKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuY2hhcnNldHMpIHtcbiAgICAgIGNvbnN0IGNoYXJzZXQgPSB0aGlzLmNoYXJzZXRzLnZhbHVlW2luZGV4XTtcbiAgICAgIHRoaXMuY2hhcnNldHMuaW5zZXJ0KFxuICAgICAgICBpbmRleCxcbiAgICAgICAgdGhpcy5mb3JtQnVpbGRlci5jb250cm9sKGNoYXJzZXQsIFZhbGlkYXRvcnMucmVxdWlyZWQpXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIGRvd25sb2FkV29yZGxpc3QoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuY2hhcnNldHMpIHtcbiAgICAgIGNvbnN0IGN1cnJlbnRDaGFyc2V0ID0gdGhpcy5maWx0ZXJDaGFyc2V0KHRoaXMuY2hhcnNldHMudmFsdWUpO1xuICAgICAgaWYgKFxuICAgICAgICBKU09OLnN0cmluZ2lmeSh0aGlzLmZpbHRlcmVkQ2hhcnNldCgpKSAhPT1cbiAgICAgICAgSlNPTi5zdHJpbmdpZnkoY3VycmVudENoYXJzZXQpXG4gICAgICApIHtcbiAgICAgICAgdGhpcy5nZW5lcmF0ZVdvcmRsaXN0KCk7XG4gICAgICB9XG4gICAgICBjb25zdCBmaWxlbmFtZSA9IGB3b3JkbGlzdF8ke3RoaXMud29yZHNHZW5lcmF0ZWQoKX1fd29yZHNfJHt0aGlzLmNoYXJzZXRzLmxlbmd0aH1fcG9zaXRpb25zLiR7dGhpcy5maWxlVHlwZSgpfWA7XG4gICAgICBjb25zdCB3b3JkbGlzdENvbnRlbnQgPSB0aGlzLndvcmRsaXN0KCk7XG5cbiAgICAgIGlmICh3b3JkbGlzdENvbnRlbnQgJiYgd29yZGxpc3RDb250ZW50Lmxlbmd0aCA+IDApIHtcbiAgICAgICAgdGhpcy5wZXJmb3JtRG93bmxvYWQod29yZGxpc3RDb250ZW50LCBmaWxlbmFtZSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBwZXJmb3JtRG93bmxvYWQod29yZGxpc3RDb250ZW50OiBzdHJpbmcsIGZpbGVuYW1lOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBjb25zdCBwYXJzZWQgPSB0aGlzLnBhcnNlV29yZGxpc3Qod29yZGxpc3RDb250ZW50KTtcbiAgICBjb25zdCBmaWxlID0gbmV3IEJsb2IoW3BhcnNlZC53b3JkbGlzdF0sIHtcbiAgICAgIHR5cGU6IHBhcnNlZC5jb250ZW50VHlwZVxuICAgIH0pO1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgaWYgKCh3aW5kb3cubmF2aWdhdG9yIGFzIGFueSkubXNTYXZlT3JPcGVuQmxvYikge1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICAgICh3aW5kb3cubmF2aWdhdG9yIGFzIGFueSkubXNTYXZlT3JPcGVuQmxvYihmaWxlLCBmaWxlbmFtZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IGEgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdhJyk7XG4gICAgICBjb25zdCB1cmwgPSBVUkwuY3JlYXRlT2JqZWN0VVJMKGZpbGUpO1xuICAgICAgYS5ocmVmID0gdXJsO1xuICAgICAgYS5kb3dubG9hZCA9IGZpbGVuYW1lO1xuICAgICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChhKTtcbiAgICAgIGEuY2xpY2soKTtcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICBkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKGEpO1xuICAgICAgICB3aW5kb3cuVVJMLnJldm9rZU9iamVjdFVSTCh1cmwpO1xuICAgICAgfSwgMCk7XG4gICAgfVxuICB9XG5cbiAgZHJvcChldmVudDogQ2RrRHJhZ0Ryb3A8c3RyaW5nW10+KTogdm9pZCB7XG4gICAgaWYgKHRoaXMuY2hhcnNldHMpIHtcbiAgICAgIG1vdmVJdGVtSW5BcnJheShcbiAgICAgICAgdGhpcy5jaGFyc2V0cy5jb250cm9scyxcbiAgICAgICAgZXZlbnQucHJldmlvdXNJbmRleCxcbiAgICAgICAgZXZlbnQuY3VycmVudEluZGV4XG4gICAgICApO1xuICAgICAgdGhpcy5jaGFyc2V0cy51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KCk7XG4gICAgfVxuICB9XG5cbiAgZ2VuZXJhdGVGb3JtKCk6IHZvaWQge1xuICAgIHRoaXMuY2hhcnNldEZvcm0gPSB0aGlzLmZvcm1CdWlsZGVyLmdyb3VwKHtcbiAgICAgIGNoYXJzZXRzOiB0aGlzLmZvcm1CdWlsZGVyLmFycmF5KFtcbiAgICAgICAgdGhpcy5mb3JtQnVpbGRlci5jb250cm9sKCcnLCBWYWxpZGF0b3JzLnJlcXVpcmVkKVxuICAgICAgXSksXG4gICAgICBwcmVmaXg6IHRoaXMuZm9ybUJ1aWxkZXIuY29udHJvbCgnJyksXG4gICAgICBzdWZmaXg6IHRoaXMuZm9ybUJ1aWxkZXIuY29udHJvbCgnJylcbiAgICB9KTtcbiAgfVxuXG4gIGdlbmVyYXRlV29yZGxpc3QoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuY2hhcnNldEZvcm0gJiYgdGhpcy5jaGFyc2V0cyAmJiB0aGlzLmNoYXJzZXRzLnZhbGlkKSB7XG4gICAgICB0aGlzLmZpbHRlcmVkQ2hhcnNldC5zZXQodGhpcy5maWx0ZXJDaGFyc2V0KHRoaXMuY2hhcnNldHMudmFsdWUpKTtcbiAgICAgIHRoaXMucHJlZml4LnNldCh0aGlzLmNoYXJzZXRGb3JtLmdldCgncHJlZml4Jyk/LnZhbHVlIHx8ICcnKTtcbiAgICAgIHRoaXMuc3VmZml4LnNldCh0aGlzLmNoYXJzZXRGb3JtLmdldCgnc3VmZml4Jyk/LnZhbHVlIHx8ICcnKTtcblxuICAgICAgY29uc3Qgd29yZHNDb3VudCA9IHRoaXMuZmlsdGVyZWRDaGFyc2V0KClcbiAgICAgICAgLm1hcCgoY2hhcnNldDogc3RyaW5nKSA9PiBjaGFyc2V0Lmxlbmd0aClcbiAgICAgICAgLnJlZHVjZShcbiAgICAgICAgICAocHJldmlvdXNMZW5ndGg6IG51bWJlciwgY3VycmVudExlbmd0aDogbnVtYmVyKSA9PlxuICAgICAgICAgICAgcHJldmlvdXNMZW5ndGggKiBjdXJyZW50TGVuZ3RoXG4gICAgICAgICk7XG5cbiAgICAgIHRoaXMud29yZHNHZW5lcmF0ZWQuc2V0KHdvcmRzQ291bnQpO1xuICAgICAgdGhpcy5pc0xhcmdlRGF0YXNldC5zZXQod29yZHNDb3VudCA+IDUwMDAwKTtcbiAgICAgIHRoaXMuZGlzcGxheVdvcmRsaXN0LnNldCh3b3Jkc0NvdW50IDw9IDEwMCk7XG4gICAgICB0aGlzLmlzR2VuZXJhdGluZy5zZXQodHJ1ZSk7XG5cbiAgICAgIC8vIEdlbmVyYXRlIHdvcmRsaXN0IGFuZCB1cGRhdGUgc2lnbmFsXG4gICAgICB0aGlzLmdldFdvcmRsaXN0KClcbiAgICAgICAgLnBpcGUodGFrZVVudGlsKHRoaXMudW5zdWJzY3JpYmUkKSlcbiAgICAgICAgLnN1YnNjcmliZSh7XG4gICAgICAgICAgbmV4dDogKHdvcmRsaXN0KSA9PiB0aGlzLndvcmRsaXN0LnNldCh3b3JkbGlzdCksXG4gICAgICAgICAgZXJyb3I6IChlcnJvcikgPT4ge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcignRXJyb3IgZ2VuZXJhdGluZyB3b3JkbGlzdDonLCBlcnJvcik7XG4gICAgICAgICAgICB0aGlzLmlzR2VuZXJhdGluZy5zZXQoZmFsc2UpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBnZXRXb3JkbGlzdCgpOiBPYnNlcnZhYmxlPHN0cmluZz4ge1xuICAgIHJldHVybiB0aGlzLndvcmRsaXN0R2VuZXJhdG9yXG4gICAgICAuZ2VuZXJhdGVXb3JkbGlzdCguLi50aGlzLmZpbHRlcmVkQ2hhcnNldCgpKVxuICAgICAgLnBpcGUoXG4gICAgICAgIHNoYXJlUmVwbGF5KHsgYnVmZmVyU2l6ZTogMSwgcmVmQ291bnQ6IHRydWUgfSksXG4gICAgICAgIHJlZHVjZShcbiAgICAgICAgICAod29yZGxpc3Q6IHN0cmluZywgd29yZDogc3RyaW5nKSA9PlxuICAgICAgICAgICAgYCR7d29yZGxpc3R9JHt0aGlzLnByZWZpeCgpfSR7d29yZH0ke3RoaXMuc3VmZml4KCl9XFxuYCxcbiAgICAgICAgICAnJ1xuICAgICAgICApLFxuICAgICAgICBmaW5hbGl6ZSgoKSA9PiB7XG4gICAgICAgICAgdGhpcy5pc0dlbmVyYXRpbmcuc2V0KGZhbHNlKTtcbiAgICAgICAgfSksXG4gICAgICAgIHRha2VVbnRpbCh0aGlzLnVuc3Vic2NyaWJlJClcbiAgICAgICk7XG4gIH1cblxuICBmaWx0ZXJDaGFyc2V0KGNoYXJzZXRzOiBzdHJpbmdbXSk6IHN0cmluZ1tdIHtcbiAgICByZXR1cm4gY2hhcnNldHMubWFwKChjaGFyc2V0OiBzdHJpbmcpID0+IHRoaXMucmVtb3ZlRHVwbGljYXRlcyhjaGFyc2V0KSk7XG4gIH1cblxuICBwYXJzZVdvcmRsaXN0KHdvcmRsaXN0OiBzdHJpbmcpOiB7IHdvcmRsaXN0OiBzdHJpbmc7IGNvbnRlbnRUeXBlOiBzdHJpbmcgfSB7XG4gICAgc3dpdGNoICh0aGlzLmZpbGVUeXBlKCkpIHtcbiAgICAgIGNhc2UgRmlsZVR5cGUucGxhaW50ZXh0OlxuICAgICAgICByZXR1cm4gdG9QbGFpbnRleHQod29yZGxpc3QpO1xuICAgICAgY2FzZSBGaWxlVHlwZS54bWw6XG4gICAgICAgIHJldHVybiB0b1hNTCh3b3JkbGlzdCk7XG4gICAgICBjYXNlIEZpbGVUeXBlLmNzdjpcbiAgICAgICAgcmV0dXJuIHRvQ1NWKHdvcmRsaXN0KTtcbiAgICB9XG4gIH1cblxuICByZW1vdmVDaGFyc2V0KGk6IG51bWJlcik6IHZvaWQge1xuICAgIGlmICh0aGlzLmNoYXJzZXRzICYmIHRoaXMuY2hhcnNldHMubGVuZ3RoID4gMSkge1xuICAgICAgdGhpcy5jaGFyc2V0cy5yZW1vdmVBdChpKTtcbiAgICB9XG4gIH1cblxuICByZW1vdmVEdXBsaWNhdGVzID0gKHVuZmlsdGVyZWQ6IHN0cmluZyk6IHN0cmluZyA9PlxuICAgIFsuLi5uZXcgU2V0KHVuZmlsdGVyZWQpXS5qb2luKCcnKTtcbn1cbiIsIjxkaXYgY2xhc3M9XCJtZXRhLWNvbnRhaW5lciBmbGV4LXJvdy13cmFwXCI+XG4gIDxkaXYgY2xhc3M9XCJmb3JtLWNvbnRhaW5lciBmbGV4LWNvbHVtbiBmbGV4LWZ4ZmxleFwiPlxuICAgIDxkaXYgY2xhc3M9XCJmbGV4LXJvdy13cmFwIGJvdHRvbS0xMFwiPlxuICAgICAgPGJ1dHRvblxuICAgICAgICBjbGFzcz1cImdlbmVyYXRlLXdvcmRsaXN0XCJcbiAgICAgICAgW25nU3R5bGVdPVwiYnV0dG9uU3R5bGUoKVwiXG4gICAgICAgIG1hdC1yYWlzZWQtYnV0dG9uXG4gICAgICAgIChjbGljayk9XCJnZW5lcmF0ZVdvcmRsaXN0KClcIlxuICAgICAgICBbZGlzYWJsZWRdPVwiaXNHZW5lcmF0aW5nKClcIlxuICAgICAgPlxuICAgICAgICBAaWYgKGlzR2VuZXJhdGluZygpKSB7XG4gICAgICAgICAgR2VuZXJhdGluZy4uLlxuICAgICAgICB9IEBlbHNlIHtcbiAgICAgICAgICBHZW5lcmF0ZSB3b3JkbGlzdFxuICAgICAgICB9XG4gICAgICA8L2J1dHRvbj5cbiAgICAgIEBpZiAoaGFzV29yZGxpc3QoKSAmJiAhaXNHZW5lcmF0aW5nKCkpIHtcbiAgICAgICAgPGJ1dHRvblxuICAgICAgICAgIGNsYXNzPVwiY2hvb3NlLWZvcm1hdFwiXG4gICAgICAgICAgW25nU3R5bGVdPVwiYnV0dG9uU3R5bGUoKVwiXG4gICAgICAgICAgbWF0LXJhaXNlZC1idXR0b25cbiAgICAgICAgICBbbWF0TWVudVRyaWdnZXJGb3JdPVwibWVudVwiXG4gICAgICAgID5cbiAgICAgICAgICBDaG9vc2UgZm9ybWF0XG4gICAgICAgIDwvYnV0dG9uPlxuICAgICAgfVxuICAgICAgPG1hdC1tZW51ICNtZW51PVwibWF0TWVudVwiPlxuICAgICAgICBAZm9yICh0eXBlIG9mIGZpbGVUeXBlczsgdHJhY2sgdHlwZSkge1xuICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgIFtuZ1N0eWxlXT1cImJ1dHRvblN0eWxlKClcIlxuICAgICAgICAgICAgbWF0LW1lbnUtaXRlbVxuICAgICAgICAgICAgKGNsaWNrKT1cImZpbGVUeXBlLnNldCh0eXBlKVwiXG4gICAgICAgICAgPlxuICAgICAgICAgICAge3sgdHlwZSB9fVxuICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICB9XG4gICAgICA8L21hdC1tZW51PlxuICAgICAgQGlmIChoYXNXb3JkbGlzdCgpICYmICFpc0dlbmVyYXRpbmcoKSkge1xuICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgY2xhc3M9XCJkb3dubG9hZC13b3JkbGlzdFwiXG4gICAgICAgICAgW25nU3R5bGVdPVwiYnV0dG9uU3R5bGUoKVwiXG4gICAgICAgICAgbWF0LXJhaXNlZC1idXR0b25cbiAgICAgICAgICAoY2xpY2spPVwiZG93bmxvYWRXb3JkbGlzdCgpXCJcbiAgICAgICAgPlxuICAgICAgICAgIERvd25sb2FkIGFzXG4gICAgICAgICAgQGlmICh0aGlzLmZpbGVUeXBlKCkpIHtcbiAgICAgICAgICAgIHt7IHRoaXMuZmlsZVR5cGUoKSB9fVxuICAgICAgICAgIH1cbiAgICAgICAgPC9idXR0b24+XG4gICAgICB9XG4gICAgPC9kaXY+XG4gICAgXG4gICAgQGlmIChpc0dlbmVyYXRpbmcoKSAmJiBpc0xhcmdlRGF0YXNldCgpKSB7XG4gICAgICA8ZGl2IGNsYXNzPVwicHJvZ3Jlc3MtY29udGFpbmVyXCI+XG4gICAgICAgIDxtYXQtcHJvZ3Jlc3MtYmFyIG1vZGU9XCJpbmRldGVybWluYXRlXCIgcm9sZT1cInByb2dyZXNzYmFyXCIgYXJpYS1sYWJlbD1cIkdlbmVyYXRpbmcgd29yZGxpc3RcIj48L21hdC1wcm9ncmVzcy1iYXI+XG4gICAgICAgIDxwIFtuZ1N0eWxlXT1cInRleHRTdHlsZSgpXCI+UHJvY2Vzc2luZyBsYXJnZSBkYXRhc2V0IHVzaW5nIFdlYiBXb3JrZXIuLi48L3A+XG4gICAgICA8L2Rpdj5cbiAgICB9XG4gICAgXG4gICAgQGlmIChjaGFyc2V0Rm9ybSkge1xuICAgICAgPGZvcm0gW2Zvcm1Hcm91cF09XCJjaGFyc2V0Rm9ybVwiPlxuICAgICAgICA8bWF0LWZvcm0tZmllbGQgY2xhc3M9XCJmaXhlZC13aWR0aCBib3R0b20tMTBcIiBhcHBlYXJhbmNlPVwib3V0bGluZVwiPlxuICAgICAgICAgIDxtYXQtbGFiZWwgW25nU3R5bGVdPVwidGV4dFN0eWxlKClcIj5wcmVmaXggKG9wdGlvbmFsKTwvbWF0LWxhYmVsPlxuICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgW25nU3R5bGVdPVwidGV4dFN0eWxlKClcIlxuICAgICAgICAgICAgbWF0SW5wdXRcbiAgICAgICAgICAgIHR5cGU9XCJ0ZXh0XCJcbiAgICAgICAgICAgIGlkPVwicHJlZml4XCJcbiAgICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cInByZWZpeFwiXG4gICAgICAgICAgICAoa2V5ZG93bi5lbnRlcik9XCIkZXZlbnQucHJldmVudERlZmF1bHQoKVwiXG4gICAgICAgICAgLz5cbiAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cbiAgICAgICAgPGRpdiBmb3JtQXJyYXlOYW1lPVwiY2hhcnNldHNcIj5cbiAgICAgICAgICA8ZGl2IGNka0Ryb3BMaXN0IChjZGtEcm9wTGlzdERyb3BwZWQpPVwiZHJvcCgkZXZlbnQpXCI+XG4gICAgICAgICAgICBAZm9yIChcbiAgICAgICAgICAgICAgY2hhcnNldCBvZiBjaGFyc2V0cz8uY29udHJvbHM7XG4gICAgICAgICAgICAgIHRyYWNrIGNoYXJzZXQ7XG4gICAgICAgICAgICAgIGxldCBpID0gJGluZGV4XG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNoYXJzZXQtY29udGFpbmVyXCIgY2RrRHJhZz5cbiAgICAgICAgICAgICAgICA8bWF0LWljb24gY2xhc3M9XCJkcmFnLWluZGljYXRvclwiIFtuZ1N0eWxlXT1cImRyYWdTdHlsZSgpXCJcbiAgICAgICAgICAgICAgICAgID5kcmFnX2luZGljYXRvcjwvbWF0LWljb25cbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgPG1hdC1mb3JtLWZpZWxkIGNsYXNzPVwiY2hhcnNldCBib3R0b20tMTBcIiBhcHBlYXJhbmNlPVwib3V0bGluZVwiPlxuICAgICAgICAgICAgICAgICAgPG1hdC1sYWJlbCBbbmdTdHlsZV09XCJ0ZXh0U3R5bGUoKVwiPlxuICAgICAgICAgICAgICAgICAgICBjaGFyYWN0ZXIgc2V0IGZvciBzdHJpbmcgcG9zaXRpb24ge3sgaSB9fVxuICAgICAgICAgICAgICAgICAgPC9tYXQtbGFiZWw+XG4gICAgICAgICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgICAgICAgW25nU3R5bGVdPVwidGV4dFN0eWxlKClcIlxuICAgICAgICAgICAgICAgICAgICBtYXRJbnB1dFxuICAgICAgICAgICAgICAgICAgICB0eXBlPVwidGV4dFwiXG4gICAgICAgICAgICAgICAgICAgIGlkPVwicG9zaXRpb24te3sgaSB9fVwiXG4gICAgICAgICAgICAgICAgICAgIFtmb3JtQ29udHJvbE5hbWVdPVwiaVwiXG4gICAgICAgICAgICAgICAgICAgIChrZXlkb3duLmVudGVyKT1cIiRldmVudC5wcmV2ZW50RGVmYXVsdCgpXCJcbiAgICAgICAgICAgICAgICAgICAgcmVxdWlyZWRcbiAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cbiAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICBtYXQtcmFpc2VkLWJ1dHRvblxuICAgICAgICAgICAgICAgICAgY2xhc3M9XCJjbG9uZS1jaGFyc2V0XCJcbiAgICAgICAgICAgICAgICAgIFtuZ1N0eWxlXT1cImJ1dHRvblN0eWxlKClcIlxuICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImNsb25lQ2hhcnNldChpKVwiXG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgPG1hdC1pY29uIGNsYXNzPVwicm93LWJ1dHRvbi1pY29uXCI+Y29udGVudF9jb3B5PC9tYXQtaWNvbj5cbiAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICBtYXQtcmFpc2VkLWJ1dHRvblxuICAgICAgICAgICAgICAgICAgY2xhc3M9XCJyZW1vdmUtY2hhcnNldFwiXG4gICAgICAgICAgICAgICAgICBbbmdTdHlsZV09XCJidXR0b25TdHlsZSgpXCJcbiAgICAgICAgICAgICAgICAgIChjbGljayk9XCJyZW1vdmVDaGFyc2V0KGkpXCJcbiAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJ0aGlzLmNoYXJzZXRzPy52YWx1ZS5sZW5ndGggPT09IDFcIlxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgIDxtYXQtaWNvbiBjbGFzcz1cInJvdy1idXR0b24taWNvblwiPnJlbW92ZTwvbWF0LWljb24+XG4gICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgbWF0LXJhaXNlZC1idXR0b25cbiAgICAgICAgICAgICAgICAgIFtuZ1N0eWxlXT1cImJ1dHRvblN0eWxlKClcIlxuICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImFkZENoYXJzZXQoKVwiXG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgPG1hdC1pY29uIGNsYXNzPVwicm93LWJ1dHRvbi1pY29uXCI+YWRkPC9tYXQtaWNvbj5cbiAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICB9XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8bWF0LWZvcm0tZmllbGQgY2xhc3M9XCJmaXhlZC13aWR0aFwiIGFwcGVhcmFuY2U9XCJvdXRsaW5lXCI+XG4gICAgICAgICAgPG1hdC1sYWJlbCBbbmdTdHlsZV09XCJ0ZXh0U3R5bGUoKVwiPnN1ZmZpeCAob3B0aW9uYWwpPC9tYXQtbGFiZWw+XG4gICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICBbbmdTdHlsZV09XCJ0ZXh0U3R5bGUoKVwiXG4gICAgICAgICAgICBtYXRJbnB1dFxuICAgICAgICAgICAgdHlwZT1cInRleHRcIlxuICAgICAgICAgICAgaWQ9XCJzdWZmaXhcIlxuICAgICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwic3VmZml4XCJcbiAgICAgICAgICAgIChrZXlkb3duLmVudGVyKT1cIiRldmVudC5wcmV2ZW50RGVmYXVsdCgpXCJcbiAgICAgICAgICAvPlxuICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxuICAgICAgPC9mb3JtPlxuICAgIH1cbiAgPC9kaXY+XG4gIEBpZiAoaGFzV29yZGxpc3QoKSkge1xuICAgIDxkaXYgY2xhc3M9XCJ3b3JkbGlzdC1jb250YWluZXIgZmxleC1jb2x1bW4gZmxleC1meGZsZXhcIj5cbiAgICAgIEBpZiAoZGlzcGxheVdvcmRsaXN0KCkpIHtcbiAgICAgICAgPGgzIGNsYXNzPVwid29yZGxpc3QtaGVhZGVyXCI+R2VuZXJhdGVkIHdvcmRsaXN0OjwvaDM+XG4gICAgICAgIDxjb2RlIGNsYXNzPVwid29yZGxpc3RcIj5cbiAgICAgICAgICB7eyB3b3JkbGlzdCgpIH19XG4gICAgICAgIDwvY29kZT5cbiAgICAgIH0gQGVsc2Uge1xuICAgICAgICBUaGUgZ2VuZXJhdGVkIHdvcmRsaXN0IGlzIHRvbyBsYXJnZSB0byBiZSBkaXNwbGF5ZWQuIFlvdSBjYW4gc3RpbGxcbiAgICAgICAgZG93bmxvYWQgaXQuXG4gICAgICAgIDwhLS0gV29yZGxpc3QgaXMgYWxyZWFkeSBsb2FkZWQgaW4gdGhlIHNpZ25hbCBmb3IgbGFyZ2UgZGF0YXNldHMgLS0+XG4gICAgICB9XG4gICAgPC9kaXY+XG4gIH1cbjwvZGl2PlxuIl19","/**\n * Generated bundle index. Do not edit.\n */\nexport * from './index';\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVodzBsZi13b3JkbGlzdC1nZW5lcmF0b3IuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9saWJzL3dvcmRsaXN0LWdlbmVyYXRvci9zcmMvdGVodzBsZi13b3JkbGlzdC1nZW5lcmF0b3IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7O0dBRUc7QUFFSCxjQUFjLFNBQVMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogR2VuZXJhdGVkIGJ1bmRsZSBpbmRleC4gRG8gbm90IGVkaXQuXG4gKi9cblxuZXhwb3J0ICogZnJvbSAnLi9pbmRleCc7XG4iXX0="],"names":[],"mappings":"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"}
|
package/index.d.ts
CHANGED
|
@@ -1,8 +1,7 @@
|
|
|
1
1
|
import * as _angular_core from '@angular/core';
|
|
2
|
-
import {
|
|
2
|
+
import { OnDestroy } from '@angular/core';
|
|
3
3
|
import { CdkDragDrop } from '@angular/cdk/drag-drop';
|
|
4
4
|
import { UntypedFormGroup, UntypedFormArray } from '@angular/forms';
|
|
5
|
-
import { Observable } from 'rxjs';
|
|
6
5
|
|
|
7
6
|
declare enum FileType {
|
|
8
7
|
plaintext = "txt",
|
|
@@ -10,7 +9,7 @@ declare enum FileType {
|
|
|
10
9
|
csv = "csv"
|
|
11
10
|
}
|
|
12
11
|
|
|
13
|
-
declare class WordlistGeneratorComponent implements
|
|
12
|
+
declare class WordlistGeneratorComponent implements OnDestroy {
|
|
14
13
|
private formBuilder;
|
|
15
14
|
private wordlistGenerator;
|
|
16
15
|
buttonStyle: _angular_core.InputSignal<{
|
|
@@ -24,25 +23,30 @@ declare class WordlistGeneratorComponent implements OnInit, OnDestroy {
|
|
|
24
23
|
color: string;
|
|
25
24
|
}>;
|
|
26
25
|
charsetForm: UntypedFormGroup | undefined;
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
fileType: FileType;
|
|
26
|
+
wordlist: _angular_core.WritableSignal<string>;
|
|
27
|
+
displayWordlist: _angular_core.WritableSignal<boolean>;
|
|
28
|
+
fileType: _angular_core.WritableSignal<FileType>;
|
|
31
29
|
fileTypes: FileType[];
|
|
32
|
-
filteredCharset: string[]
|
|
33
|
-
prefix: string
|
|
34
|
-
suffix: string
|
|
30
|
+
filteredCharset: _angular_core.WritableSignal<string[]>;
|
|
31
|
+
prefix: _angular_core.WritableSignal<string>;
|
|
32
|
+
suffix: _angular_core.WritableSignal<string>;
|
|
33
|
+
isGenerating: _angular_core.WritableSignal<boolean>;
|
|
34
|
+
isLargeDataset: _angular_core.WritableSignal<boolean>;
|
|
35
|
+
wordsGenerated: _angular_core.WritableSignal<number | undefined>;
|
|
36
|
+
canGenerate: _angular_core.Signal<boolean | undefined>;
|
|
37
|
+
hasWordlist: _angular_core.Signal<boolean>;
|
|
35
38
|
private unsubscribe$;
|
|
36
|
-
|
|
39
|
+
constructor();
|
|
37
40
|
ngOnDestroy(): void;
|
|
38
41
|
get charsets(): UntypedFormArray | undefined;
|
|
39
42
|
addCharset(): void;
|
|
40
43
|
cloneCharset(index: number): void;
|
|
41
44
|
downloadWordlist(): void;
|
|
45
|
+
private performDownload;
|
|
42
46
|
drop(event: CdkDragDrop<string[]>): void;
|
|
43
47
|
generateForm(): void;
|
|
44
48
|
generateWordlist(): void;
|
|
45
|
-
getWordlist
|
|
49
|
+
private getWordlist;
|
|
46
50
|
filterCharset(charsets: string[]): string[];
|
|
47
51
|
parseWordlist(wordlist: string): {
|
|
48
52
|
wordlist: string;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@tehw0lf/wordlist-generator",
|
|
3
|
-
"version": "0.20.
|
|
3
|
+
"version": "0.20.6",
|
|
4
4
|
"license": "MIT",
|
|
5
5
|
"homepage": "https://github.com/tehw0lf/tehwolf.de.git",
|
|
6
6
|
"repository": {
|
|
@@ -8,16 +8,16 @@
|
|
|
8
8
|
"url": "git+https://github.com/tehw0lf/tehwolf.de.git"
|
|
9
9
|
},
|
|
10
10
|
"peerDependencies": {
|
|
11
|
-
"@angular/animations": "20.
|
|
12
|
-
"@angular/cdk": "20.
|
|
13
|
-
"@angular/common": "20.
|
|
14
|
-
"@angular/core": "20.
|
|
15
|
-
"@angular/forms": "20.
|
|
16
|
-
"@angular/material": "20.
|
|
17
|
-
"@tehw0lf/mvc": "
|
|
11
|
+
"@angular/animations": "20.1.6",
|
|
12
|
+
"@angular/cdk": "20.1.5",
|
|
13
|
+
"@angular/common": "20.1.6",
|
|
14
|
+
"@angular/core": "20.1.6",
|
|
15
|
+
"@angular/forms": "20.1.6",
|
|
16
|
+
"@angular/material": "20.1.5",
|
|
17
|
+
"@tehw0lf/mvc": "0.0.7"
|
|
18
18
|
},
|
|
19
19
|
"dependencies": {
|
|
20
|
-
"tslib": "
|
|
20
|
+
"tslib": "2.8.1"
|
|
21
21
|
},
|
|
22
22
|
"module": "fesm2022/tehw0lf-wordlist-generator.mjs",
|
|
23
23
|
"typings": "index.d.ts",
|