@tehw0lf/wordlist-generator 0.0.1 → 0.0.2

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.
File without changes
@@ -0,0 +1,155 @@
1
+ import { moveItemInArray } from '@angular/cdk/drag-drop';
2
+ import { Component, Input, ViewEncapsulation } from '@angular/core';
3
+ import { FormBuilder, Validators } from '@angular/forms';
4
+ import { Subject } from 'rxjs';
5
+ import { reduce, takeUntil, tap } from 'rxjs/operators';
6
+ import { FileType } from './filetypes';
7
+ import { toPlaintext, toXML } from './parsers';
8
+ import { WordlistGeneratorService } from './wordlist-generator.service';
9
+ import * as i0 from "@angular/core";
10
+ import * as i1 from "@angular/forms";
11
+ import * as i2 from "./wordlist-generator.service";
12
+ import * as i3 from "@angular/material/button";
13
+ import * as i4 from "@angular/material/menu";
14
+ import * as i5 from "@angular/material/form-field";
15
+ import * as i6 from "@angular/material/icon";
16
+ import * as i7 from "@angular/common";
17
+ import * as i8 from "@angular/material/input";
18
+ import * as i9 from "@angular/cdk/drag-drop";
19
+ /* eslint-disable @angular-eslint/component-selector */
20
+ export class WordlistGeneratorComponent {
21
+ constructor(formBuilder, wordlistGenerator) {
22
+ this.formBuilder = formBuilder;
23
+ this.wordlistGenerator = wordlistGenerator;
24
+ this.buttonColor = '#cc7832';
25
+ this.textColor = '#cc7832';
26
+ this.displayWordlist = false;
27
+ this.fileType = FileType.plaintext;
28
+ this.fileTypes = Object.values(FileType);
29
+ this.filteredCharset = [];
30
+ this.prefix = '';
31
+ this.suffix = '';
32
+ this.unsubscribe$ = new Subject();
33
+ this.removeDuplicates = (unfiltered) => [...new Set(unfiltered)].join('');
34
+ }
35
+ ngOnInit() {
36
+ this.generateForm();
37
+ }
38
+ ngOnDestroy() {
39
+ this.unsubscribe$.next();
40
+ this.unsubscribe$.complete();
41
+ }
42
+ get charsets() {
43
+ if (this.charsetForm) {
44
+ return this.charsetForm.get('charsets');
45
+ }
46
+ return undefined;
47
+ }
48
+ addCharset() {
49
+ if (this.charsets) {
50
+ this.charsets.push(this.formBuilder.control('', Validators.required));
51
+ }
52
+ }
53
+ cloneCharset(index) {
54
+ if (this.charsets) {
55
+ const charset = this.charsets.value[index];
56
+ this.charsets.insert(index, this.formBuilder.control(charset, Validators.required));
57
+ }
58
+ }
59
+ downloadWordlist() {
60
+ if (this.charsets) {
61
+ if (this.filteredCharset !== this.filterCharset(this.charsets.value)) {
62
+ this.generateWordlist();
63
+ }
64
+ const filename = `wordlist_${this.wordsGenerated}_words_${this.charsets.length}_positions.${this.fileType}`;
65
+ this.getWordlist()
66
+ .pipe(tap((wordlist) => {
67
+ if (wordlist.length > 0) {
68
+ const parsed = this.parseWordlist(wordlist);
69
+ const file = new Blob([parsed.wordlist], {
70
+ type: parsed.contentType
71
+ });
72
+ if (window.navigator.msSaveOrOpenBlob) {
73
+ window.navigator.msSaveOrOpenBlob(file, filename);
74
+ }
75
+ else {
76
+ const a = document.createElement('a');
77
+ const url = URL.createObjectURL(file);
78
+ a.href = url;
79
+ a.download = filename;
80
+ document.body.appendChild(a);
81
+ a.click();
82
+ setTimeout(() => {
83
+ document.body.removeChild(a);
84
+ window.URL.revokeObjectURL(url);
85
+ }, 0);
86
+ }
87
+ }
88
+ }))
89
+ .subscribe();
90
+ }
91
+ }
92
+ drop(event) {
93
+ if (this.charsets) {
94
+ moveItemInArray(this.charsets.controls, event.previousIndex, event.currentIndex);
95
+ this.charsets.updateValueAndValidity();
96
+ }
97
+ }
98
+ generateForm() {
99
+ this.charsetForm = this.formBuilder.group({
100
+ charsets: this.formBuilder.array([
101
+ this.formBuilder.control('', Validators.required)
102
+ ]),
103
+ prefix: this.formBuilder.control(''),
104
+ suffix: this.formBuilder.control('')
105
+ });
106
+ }
107
+ generateWordlist() {
108
+ if (this.charsetForm && this.charsets && this.charsets.valid) {
109
+ this.filteredCharset = this.filterCharset(this.charsets.value);
110
+ this.prefix = this.charsetForm.get('prefix')?.value
111
+ ? this.charsetForm.get('prefix')?.value
112
+ : '';
113
+ this.suffix = this.charsetForm.get('suffix')?.value
114
+ ? this.charsetForm.get('suffix')?.value
115
+ : '';
116
+ this.wordsGenerated = this.filteredCharset
117
+ .map((charset) => charset.length)
118
+ .reduce((previousLength, currentLength) => previousLength * currentLength);
119
+ this.displayWordlist = this.wordsGenerated <= 100;
120
+ this.wordlist$ = this.getWordlist();
121
+ }
122
+ }
123
+ getWordlist() {
124
+ return this.wordlistGenerator
125
+ .generateWordlist(...this.filteredCharset)
126
+ .pipe(reduce((wordlist, word) => `${wordlist}${this.prefix}${word}${this.suffix}\n`, ''), takeUntil(this.unsubscribe$));
127
+ }
128
+ filterCharset(charsets) {
129
+ return charsets.map((charset) => this.removeDuplicates(charset));
130
+ }
131
+ parseWordlist(wordlist) {
132
+ switch (this.fileType) {
133
+ case FileType.plaintext:
134
+ return toPlaintext(wordlist);
135
+ case FileType.xml:
136
+ return toXML(wordlist);
137
+ }
138
+ }
139
+ removeCharset(i) {
140
+ if (this.charsets && this.charsets.length > 1) {
141
+ this.charsets.removeAt(i);
142
+ }
143
+ }
144
+ }
145
+ WordlistGeneratorComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.1.0", ngImport: i0, type: WordlistGeneratorComponent, deps: [{ token: i1.FormBuilder }, { token: i2.WordlistGeneratorService }], target: i0.ɵɵFactoryTarget.Component });
146
+ WordlistGeneratorComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.1.0", type: WordlistGeneratorComponent, selector: "wordlist-generator", inputs: { buttonColor: "buttonColor", textColor: "textColor" }, ngImport: i0, template: "<div class=\"meta-container\" fxLayout=\"row wrap\">\n <div class=\"form-container\" fxLayout=\"column\" fxFlex>\n <div fxLayout=\"row wrap\">\n <button\n class=\"generate-wordlist\"\n [ngStyle]=\"{ color: buttonColor }\"\n mat-raised-button\n (click)=\"generateWordlist()\"\n >\n Generate wordlist\n </button>\n <button\n class=\"choose-format\"\n [ngStyle]=\"{ color: buttonColor }\"\n mat-raised-button\n [matMenuTriggerFor]=\"menu\"\n *ngIf=\"wordlist$\"\n >\n Choose format\n </button>\n <mat-menu #menu=\"matMenu\">\n <button\n [ngStyle]=\"{ color: buttonColor }\"\n mat-menu-item\n *ngFor=\"let type of fileTypes\"\n (click)=\"fileType = type\"\n >\n {{ type }}\n </button>\n </mat-menu>\n <button\n class=\"download-wordlist\"\n [ngStyle]=\"{ color: buttonColor }\"\n mat-raised-button\n *ngIf=\"wordlist$\"\n (click)=\"downloadWordlist()\"\n >\n Download as\n <ng-container *ngIf=\"this.fileType\">{{ this.fileType }}</ng-container>\n </button>\n </div>\n <form *ngIf=\"charsetForm\" [formGroup]=\"charsetForm\">\n <mat-form-field class=\"fix\" appearance=\"outline\">\n <mat-label [ngStyle]=\"{ color: textColor }\"\n >prefix (optional)</mat-label\n >\n <input\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 class=\"charset\"></div>\n <div cdkDropList (cdkDropListDropped)=\"drop($event)\">\n <div\n class=\"charset-container\"\n cdkDrag\n *ngFor=\"let charset of charsets?.controls; let i = index\"\n >\n <mat-icon class=\"drag-indicator\" [ngStyle]=\"{ color: buttonColor }\"\n >drag_indicator</mat-icon\n >\n <mat-form-field class=\"charset\" appearance=\"outline\">\n <mat-label [ngStyle]=\"{ color: textColor }\">\n character set for string position {{ i }}\n </mat-label>\n <input\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]=\"{ color: buttonColor }\"\n (click)=\"cloneCharset(i)\"\n >\n <mat-icon>content_copy</mat-icon>\n </button>\n <button\n mat-raised-button\n class=\"remove-charset\"\n [ngStyle]=\"{ color: buttonColor }\"\n (click)=\"removeCharset(i)\"\n [disabled]=\"this.charsets?.value.length === 1\"\n >\n <mat-icon>remove</mat-icon>\n </button>\n <button\n mat-raised-button\n [ngStyle]=\"{ color: buttonColor }\"\n (click)=\"addCharset()\"\n >\n <mat-icon>add</mat-icon>\n </button>\n </div>\n </div>\n </div>\n <mat-form-field class=\"fix\" appearance=\"outline\">\n <mat-label [ngStyle]=\"{ color: textColor }\"\n >suffix (optional)</mat-label\n >\n <input\n matInput\n type=\"text\"\n id=\"suffix\"\n formControlName=\"suffix\"\n (keydown.enter)=\"$event.preventDefault()\"\n />\n </mat-form-field>\n </form>\n </div>\n <div class=\"wordlist-container\" *ngIf=\"wordlist$\" fxLayout=\"column\" fxFlex>\n <ng-container *ngIf=\"displayWordlist; else wordlistTooLarge\">\n <h3 class=\"wordlist-header\">Generated wordlist:</h3>\n <code class=\"wordlist\">\n {{ wordlist$ | async }}\n </code></ng-container\n >\n <ng-template #wordlistTooLarge>\n The generated wordlist is too large to be displayed. You can still\n download it.\n </ng-template>\n </div>\n</div>\n", styles: [".meta-container{max-width:100vw}.meta-container .form-container{float:left}.meta-container .form-container .charset-container .drag-indicator{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}.meta-container .form-container .charset{width:18.875em}.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}.meta-container .form-container .generate-wordlist,.meta-container .form-container .download-wordlist{margin:0 0 10px;width:150px}.meta-container .wordlist-container{max-height:80vh}.meta-container .wordlist-container .wordlist-header{margin-top:0}.meta-container .wordlist-container .wordlist{margin-left:1em;overflow-wrap:normal;width:1%}.mat-menu-panel{width:150px}.mat-form-field-appearance-outline .mat-form-field-infix{border:0;padding:1em 0 .5em}.mat-form-field-appearance-outline .mat-form-field-wrapper{padding-bottom:.25em}.mat-form-field-label{transition:none!important}.mat-form-field-should-float .mat-form-field-label-wrapper{top:-.1em;padding-top:.1em}.mat-form-field-should-float .mat-form-field-label{transition:none!important}.fix{width:21em}\n"], components: [{ type: i3.MatButton, selector: "button[mat-button], button[mat-raised-button], button[mat-icon-button], button[mat-fab], button[mat-mini-fab], button[mat-stroked-button], button[mat-flat-button]", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { type: i4.MatMenu, selector: "mat-menu", exportAs: ["matMenu"] }, { type: i4.MatMenuItem, selector: "[mat-menu-item]", inputs: ["disabled", "disableRipple", "role"], exportAs: ["matMenuItem"] }, { type: i5.MatFormField, selector: "mat-form-field", inputs: ["color", "appearance", "hideRequiredMarker", "hintLabel", "floatLabel"], exportAs: ["matFormField"] }, { type: i6.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }], directives: [{ type: i7.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { type: i7.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i4.MatMenuTrigger, selector: "[mat-menu-trigger-for], [matMenuTriggerFor]", exportAs: ["matMenuTrigger"] }, { type: i7.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i1.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { type: i1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { type: i5.MatLabel, selector: "mat-label" }, { type: i8.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly"], exportAs: ["matInput"] }, { type: i1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { type: i1.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { type: i1.FormArrayName, selector: "[formArrayName]", inputs: ["formArrayName"] }, { type: i9.CdkDropList, selector: "[cdkDropList], cdk-drop-list", inputs: ["cdkDropListConnectedTo", "cdkDropListData", "cdkDropListOrientation", "id", "cdkDropListLockAxis", "cdkDropListDisabled", "cdkDropListSortingDisabled", "cdkDropListEnterPredicate", "cdkDropListSortPredicate", "cdkDropListAutoScrollDisabled", "cdkDropListAutoScrollStep"], outputs: ["cdkDropListDropped", "cdkDropListEntered", "cdkDropListExited", "cdkDropListSorted"], exportAs: ["cdkDropList"] }, { type: i9.CdkDrag, selector: "[cdkDrag]", inputs: ["cdkDragData", "cdkDragLockAxis", "cdkDragRootElement", "cdkDragBoundary", "cdkDragStartDelay", "cdkDragFreeDragPosition", "cdkDragDisabled", "cdkDragConstrainPosition", "cdkDragPreviewClass", "cdkDragPreviewContainer"], outputs: ["cdkDragStarted", "cdkDragReleased", "cdkDragEnded", "cdkDragEntered", "cdkDragExited", "cdkDragDropped", "cdkDragMoved"], exportAs: ["cdkDrag"] }, { type: i1.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }], pipes: { "async": i7.AsyncPipe }, encapsulation: i0.ViewEncapsulation.None });
147
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.1.0", ngImport: i0, type: WordlistGeneratorComponent, decorators: [{
148
+ type: Component,
149
+ args: [{ selector: 'wordlist-generator', encapsulation: ViewEncapsulation.None, template: "<div class=\"meta-container\" fxLayout=\"row wrap\">\n <div class=\"form-container\" fxLayout=\"column\" fxFlex>\n <div fxLayout=\"row wrap\">\n <button\n class=\"generate-wordlist\"\n [ngStyle]=\"{ color: buttonColor }\"\n mat-raised-button\n (click)=\"generateWordlist()\"\n >\n Generate wordlist\n </button>\n <button\n class=\"choose-format\"\n [ngStyle]=\"{ color: buttonColor }\"\n mat-raised-button\n [matMenuTriggerFor]=\"menu\"\n *ngIf=\"wordlist$\"\n >\n Choose format\n </button>\n <mat-menu #menu=\"matMenu\">\n <button\n [ngStyle]=\"{ color: buttonColor }\"\n mat-menu-item\n *ngFor=\"let type of fileTypes\"\n (click)=\"fileType = type\"\n >\n {{ type }}\n </button>\n </mat-menu>\n <button\n class=\"download-wordlist\"\n [ngStyle]=\"{ color: buttonColor }\"\n mat-raised-button\n *ngIf=\"wordlist$\"\n (click)=\"downloadWordlist()\"\n >\n Download as\n <ng-container *ngIf=\"this.fileType\">{{ this.fileType }}</ng-container>\n </button>\n </div>\n <form *ngIf=\"charsetForm\" [formGroup]=\"charsetForm\">\n <mat-form-field class=\"fix\" appearance=\"outline\">\n <mat-label [ngStyle]=\"{ color: textColor }\"\n >prefix (optional)</mat-label\n >\n <input\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 class=\"charset\"></div>\n <div cdkDropList (cdkDropListDropped)=\"drop($event)\">\n <div\n class=\"charset-container\"\n cdkDrag\n *ngFor=\"let charset of charsets?.controls; let i = index\"\n >\n <mat-icon class=\"drag-indicator\" [ngStyle]=\"{ color: buttonColor }\"\n >drag_indicator</mat-icon\n >\n <mat-form-field class=\"charset\" appearance=\"outline\">\n <mat-label [ngStyle]=\"{ color: textColor }\">\n character set for string position {{ i }}\n </mat-label>\n <input\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]=\"{ color: buttonColor }\"\n (click)=\"cloneCharset(i)\"\n >\n <mat-icon>content_copy</mat-icon>\n </button>\n <button\n mat-raised-button\n class=\"remove-charset\"\n [ngStyle]=\"{ color: buttonColor }\"\n (click)=\"removeCharset(i)\"\n [disabled]=\"this.charsets?.value.length === 1\"\n >\n <mat-icon>remove</mat-icon>\n </button>\n <button\n mat-raised-button\n [ngStyle]=\"{ color: buttonColor }\"\n (click)=\"addCharset()\"\n >\n <mat-icon>add</mat-icon>\n </button>\n </div>\n </div>\n </div>\n <mat-form-field class=\"fix\" appearance=\"outline\">\n <mat-label [ngStyle]=\"{ color: textColor }\"\n >suffix (optional)</mat-label\n >\n <input\n matInput\n type=\"text\"\n id=\"suffix\"\n formControlName=\"suffix\"\n (keydown.enter)=\"$event.preventDefault()\"\n />\n </mat-form-field>\n </form>\n </div>\n <div class=\"wordlist-container\" *ngIf=\"wordlist$\" fxLayout=\"column\" fxFlex>\n <ng-container *ngIf=\"displayWordlist; else wordlistTooLarge\">\n <h3 class=\"wordlist-header\">Generated wordlist:</h3>\n <code class=\"wordlist\">\n {{ wordlist$ | async }}\n </code></ng-container\n >\n <ng-template #wordlistTooLarge>\n The generated wordlist is too large to be displayed. You can still\n download it.\n </ng-template>\n </div>\n</div>\n", styles: [".meta-container{max-width:100vw}.meta-container .form-container{float:left}.meta-container .form-container .charset-container .drag-indicator{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}.meta-container .form-container .charset{width:18.875em}.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}.meta-container .form-container .generate-wordlist,.meta-container .form-container .download-wordlist{margin:0 0 10px;width:150px}.meta-container .wordlist-container{max-height:80vh}.meta-container .wordlist-container .wordlist-header{margin-top:0}.meta-container .wordlist-container .wordlist{margin-left:1em;overflow-wrap:normal;width:1%}.mat-menu-panel{width:150px}.mat-form-field-appearance-outline .mat-form-field-infix{border:0;padding:1em 0 .5em}.mat-form-field-appearance-outline .mat-form-field-wrapper{padding-bottom:.25em}.mat-form-field-label{transition:none!important}.mat-form-field-should-float .mat-form-field-label-wrapper{top:-.1em;padding-top:.1em}.mat-form-field-should-float .mat-form-field-label{transition:none!important}.fix{width:21em}\n"] }]
150
+ }], ctorParameters: function () { return [{ type: i1.FormBuilder }, { type: i2.WordlistGeneratorService }]; }, propDecorators: { buttonColor: [{
151
+ type: Input
152
+ }], textColor: [{
153
+ type: Input
154
+ }] } });
155
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid29yZGxpc3QtZ2VuZXJhdG9yLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL2xpYnMvd29yZGxpc3QtZ2VuZXJhdG9yL3NyYy9saWIvd29yZGxpc3QtZ2VuZXJhdG9yLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL2xpYnMvd29yZGxpc3QtZ2VuZXJhdG9yL3NyYy9saWIvd29yZGxpc3QtZ2VuZXJhdG9yLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBZSxlQUFlLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUN0RSxPQUFPLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBcUIsaUJBQWlCLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDdkYsT0FBTyxFQUFhLFdBQVcsRUFBYSxVQUFVLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUMvRSxPQUFPLEVBQWMsT0FBTyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQzNDLE9BQU8sRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFLEdBQUcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRXhELE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDdkMsT0FBTyxFQUFFLFdBQVcsRUFBRSxLQUFLLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFDL0MsT0FBTyxFQUFFLHdCQUF3QixFQUFFLE1BQU0sOEJBQThCLENBQUM7Ozs7Ozs7Ozs7O0FBRXhFLHVEQUF1RDtBQU92RCxNQUFNLE9BQU8sMEJBQTBCO0lBaUJyQyxZQUNVLFdBQXdCLEVBQ3hCLGlCQUEyQztRQUQzQyxnQkFBVyxHQUFYLFdBQVcsQ0FBYTtRQUN4QixzQkFBaUIsR0FBakIsaUJBQWlCLENBQTBCO1FBbEI1QyxnQkFBVyxHQUFHLFNBQVMsQ0FBQztRQUN4QixjQUFTLEdBQUcsU0FBUyxDQUFDO1FBTS9CLG9CQUFlLEdBQUcsS0FBSyxDQUFDO1FBQ3hCLGFBQVEsR0FB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bW92ZUl0ZW1JbkFycmF5IH0gZnJvbSAnQGFuZ3VsYXIvY2RrL2RyYWctZHJvcCc7XG5pbXBvcnQgeyBDb21wb25lbnQsIElucHV0LCBPbkRlc3Ryb3ksIE9uSW5pdCwgVmlld0VuY2Fwc3VsYXRpb24gfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEZvcm1BcnJheSwgRm9ybUJ1aWxkZXIsIEZvcm1Hcm91cCwgVmFsaWRhdG9ycyB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IE9ic2VydmFibGUsIFN1YmplY3QgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IHJlZHVjZSwgdGFrZVVudGlsLCB0YXAgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5cbmltcG9ydCB7IEZpbGVUeXBlIH0gZnJvbSAnLi9maWxldHlwZXMnO1xuaW1wb3J0IHsgdG9QbGFpbnRleHQsIHRvWE1MIH0gZnJvbSAnLi9wYXJzZXJzJztcbmltcG9ydCB7IFdvcmRsaXN0R2VuZXJhdG9yU2VydmljZSB9IGZyb20gJy4vd29yZGxpc3QtZ2VuZXJhdG9yLnNlcnZpY2UnO1xuXG4vKiBlc2xpbnQtZGlzYWJsZSBAYW5ndWxhci1lc2xpbnQvY29tcG9uZW50LXNlbGVjdG9yICovXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICd3b3JkbGlzdC1nZW5lcmF0b3InLFxuICB0ZW1wbGF0ZVVybDogJy4vd29yZGxpc3QtZ2VuZXJhdG9yLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vd29yZGxpc3QtZ2VuZXJhdG9yLmNvbXBvbmVudC5zY3NzJ10sXG4gIGVuY2Fwc3VsYXRpb246IFZpZXdFbmNhcHN1bGF0aW9uLk5vbmVcbn0pXG5leHBvcnQgY2xhc3MgV29yZGxpc3RHZW5lcmF0b3JDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSB7XG4gIEBJbnB1dCgpIGJ1dHRvbkNvbG9yID0gJyNjYzc4MzInO1xuICBASW5wdXQoKSB0ZXh0Q29sb3IgPSAnI2NjNzgzMic7XG5cbiAgY2hhcnNldEZvcm06IEZvcm1Hcm91cCB8IHVuZGVmaW5lZDtcbiAgd29yZHNHZW5lcmF0ZWQ6IG51bWJlciB8IHVuZGVmaW5lZDtcbiAgd29yZGxpc3QkOiBPYnNlcnZhYmxlPHN0cmluZz4gfCB1bmRlZmluZWQ7XG5cbiAgZGlzcGxheVdvcmRsaXN0ID0gZmFsc2U7XG4gIGZpbGVUeXBlID0gRmlsZVR5cGUucGxhaW50ZXh0O1xuICBmaWxlVHlwZXMgPSBPYmplY3QudmFsdWVzKEZpbGVUeXBlKTtcbiAgZmlsdGVyZWRDaGFyc2V0OiBzdHJpbmdbXSA9IFtdO1xuICBwcmVmaXggPSAnJztcbiAgc3VmZml4ID0gJyc7XG5cbiAgcHJpdmF0ZSB1bnN1YnNjcmliZSQgPSBuZXcgU3ViamVjdDx2b2lkPigpO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgZm9ybUJ1aWxkZXI6IEZvcm1CdWlsZGVyLFxuICAgIHByaXZhdGUgd29yZGxpc3RHZW5lcmF0b3I6IFdvcmRsaXN0R2VuZXJhdG9yU2VydmljZVxuICApIHt9XG5cbiAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgdGhpcy5nZW5lcmF0ZUZvcm0oKTtcbiAgfVxuXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIHRoaXMudW5zdWJzY3JpYmUkLm5leHQoKTtcbiAgICB0aGlzLnVuc3Vic2NyaWJlJC5jb21wbGV0ZSgpO1xuICB9XG5cbiAgZ2V0IGNoYXJzZXRzKCk6IEZvcm1BcnJheSB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKHRoaXMuY2hhcnNldEZvcm0pIHtcbiAgICAgIHJldHVybiB0aGlzLmNoYXJzZXRGb3JtLmdldCgnY2hhcnNldHMnKSBhcyBGb3JtQXJyYXk7XG4gICAgfVxuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICBhZGRDaGFyc2V0KCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmNoYXJzZXRzKSB7XG4gICAgICB0aGlzLmNoYXJzZXRzLnB1c2godGhpcy5mb3JtQnVpbGRlci5jb250cm9sKCcnLCBWYWxpZGF0b3JzLnJlcXVpcmVkKSk7XG4gICAgfVxuICB9XG5cbiAgY2xvbmVDaGFyc2V0KGluZGV4OiBudW1iZXIpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5jaGFyc2V0cykge1xuICAgICAgY29uc3QgY2hhcnNldCA9IHRoaXMuY2hhcnNldHMudmFsdWVbaW5kZXhdO1xuICAgICAgdGhpcy5jaGFyc2V0cy5pbnNlcnQoXG4gICAgICAgIGluZGV4LFxuICAgICAgICB0aGlzLmZvcm1CdWlsZGVyLmNvbnRyb2woY2hhcnNldCwgVmFsaWRhdG9ycy5yZXF1aXJlZClcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgZG93bmxvYWRXb3JkbGlzdCgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5jaGFyc2V0cykge1xuICAgICAgaWYgKHRoaXMuZmlsdGVyZWRDaGFyc2V0ICE9PSB0aGlzLmZpbHRlckNoYXJzZXQodGhpcy5jaGFyc2V0cy52YWx1ZSkpIHtcbiAgICAgICAgdGhpcy5nZW5lcmF0ZVdvcmRsaXN0KCk7XG4gICAgICB9XG4gICAgICBjb25zdCBmaWxlbmFtZSA9IGB3b3JkbGlzdF8ke3RoaXMud29yZHNHZW5lcmF0ZWR9X3dvcmRzXyR7dGhpcy5jaGFyc2V0cy5sZW5ndGh9X3Bvc2l0aW9ucy4ke3RoaXMuZmlsZVR5cGV9YDtcbiAgICAgIHRoaXMuZ2V0V29yZGxpc3QoKVxuICAgICAgICAucGlwZShcbiAgICAgICAgICB0YXAoKHdvcmRsaXN0OiBzdHJpbmcpID0+IHtcbiAgICAgICAgICAgIGlmICh3b3JkbGlzdC5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgIGNvbnN0IHBhcnNlZCA9IHRoaXMucGFyc2VXb3JkbGlzdCh3b3JkbGlzdCk7XG4gICAgICAgICAgICAgIGNvbnN0IGZpbGUgPSBuZXcgQmxvYihbcGFyc2VkLndvcmRsaXN0XSwge1xuICAgICAgICAgICAgICAgIHR5cGU6IHBhcnNlZC5jb250ZW50VHlwZVxuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgaWYgKCh3aW5kb3cubmF2aWdhdG9yIGFzIGFueSkubXNTYXZlT3JPcGVuQmxvYikge1xuICAgICAgICAgICAgICAgICh3aW5kb3cubmF2aWdhdG9yIGFzIGFueSkubXNTYXZlT3JPcGVuQmxvYihmaWxlLCBmaWxlbmFtZSk7XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgY29uc3QgYSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2EnKTtcbiAgICAgICAgICAgICAgICBjb25zdCB1cmwgPSBVUkwuY3JlYXRlT2JqZWN0VVJMKGZpbGUpO1xuICAgICAgICAgICAgICAgIGEuaHJlZiA9IHVybDtcbiAgICAgICAgICAgICAgICBhLmRvd25sb2FkID0gZmlsZW5hbWU7XG4gICAgICAgICAgICAgICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChhKTtcbiAgICAgICAgICAgICAgICBhLmNsaWNrKCk7XG4gICAgICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICBkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKGEpO1xuICAgICAgICAgICAgICAgICAgd2luZG93LlVSTC5yZXZva2VPYmplY3RVUkwodXJsKTtcbiAgICAgICAgICAgICAgICB9LCAwKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pXG4gICAgICAgIClcbiAgICAgICAgLnN1YnNjcmliZSgpO1xuICAgIH1cbiAgfVxuXG4gIGRyb3AoZXZlbnQ6IENka0RyYWdEcm9wPHN0cmluZ1tdPik6IHZvaWQge1xuICAgIGlmICh0aGlzLmNoYXJzZXRzKSB7XG4gICAgICBtb3ZlSXRlbUluQXJyYXkoXG4gICAgICAgIHRoaXMuY2hhcnNldHMuY29udHJvbHMsXG4gICAgICAgIGV2ZW50LnByZXZpb3VzSW5kZXgsXG4gICAgICAgIGV2ZW50LmN1cnJlbnRJbmRleFxuICAgICAgKTtcbiAgICAgIHRoaXMuY2hhcnNldHMudXBkYXRlVmFsdWVBbmRWYWxpZGl0eSgpO1xuICAgIH1cbiAgfVxuXG4gIGdlbmVyYXRlRm9ybSgpOiB2b2lkIHtcbiAgICB0aGlzLmNoYXJzZXRGb3JtID0gdGhpcy5mb3JtQnVpbGRlci5ncm91cCh7XG4gICAgICBjaGFyc2V0czogdGhpcy5mb3JtQnVpbGRlci5hcnJheShbXG4gICAgICAgIHRoaXMuZm9ybUJ1aWxkZXIuY29udHJvbCgnJywgVmFsaWRhdG9ycy5yZXF1aXJlZClcbiAgICAgIF0pLFxuICAgICAgcHJlZml4OiB0aGlzLmZvcm1CdWlsZGVyLmNvbnRyb2woJycpLFxuICAgICAgc3VmZml4OiB0aGlzLmZvcm1CdWlsZGVyLmNvbnRyb2woJycpXG4gICAgfSk7XG4gIH1cblxuICBnZW5lcmF0ZVdvcmRsaXN0KCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmNoYXJzZXRGb3JtICYmIHRoaXMuY2hhcnNldHMgJiYgdGhpcy5jaGFyc2V0cy52YWxpZCkge1xuICAgICAgdGhpcy5maWx0ZXJlZENoYXJzZXQgPSB0aGlzLmZpbHRlckNoYXJzZXQodGhpcy5jaGFyc2V0cy52YWx1ZSk7XG4gICAgICB0aGlzLnByZWZpeCA9IHRoaXMuY2hhcnNldEZvcm0uZ2V0KCdwcmVmaXgnKT8udmFsdWVcbiAgICAgICAgPyB0aGlzLmNoYXJzZXRGb3JtLmdldCgncHJlZml4Jyk/LnZhbHVlXG4gICAgICAgIDogJyc7XG4gICAgICB0aGlzLnN1ZmZpeCA9IHRoaXMuY2hhcnNldEZvcm0uZ2V0KCdzdWZmaXgnKT8udmFsdWVcbiAgICAgICAgPyB0aGlzLmNoYXJzZXRGb3JtLmdldCgnc3VmZml4Jyk/LnZhbHVlXG4gICAgICAgIDogJyc7XG5cbiAgICAgIHRoaXMud29yZHNHZW5lcmF0ZWQgPSB0aGlzLmZpbHRlcmVkQ2hhcnNldFxuICAgICAgICAubWFwKChjaGFyc2V0OiBzdHJpbmcpID0+IGNoYXJzZXQubGVuZ3RoKVxuICAgICAgICAucmVkdWNlKFxuICAgICAgICAgIChwcmV2aW91c0xlbmd0aDogbnVtYmVyLCBjdXJyZW50TGVuZ3RoOiBudW1iZXIpID0+XG4gICAgICAgICAgICBwcmV2aW91c0xlbmd0aCAqIGN1cnJlbnRMZW5ndGhcbiAgICAgICAgKTtcbiAgICAgIHRoaXMuZGlzcGxheVdvcmRsaXN0ID0gdGhpcy53b3Jkc0dlbmVyYXRlZCA8PSAxMDA7XG4gICAgICB0aGlzLndvcmRsaXN0JCA9IHRoaXMuZ2V0V29yZGxpc3QoKTtcbiAgICB9XG4gIH1cblxuICBnZXRXb3JkbGlzdCgpOiBPYnNlcnZhYmxlPHN0cmluZz4ge1xuICAgIHJldHVybiB0aGlzLndvcmRsaXN0R2VuZXJhdG9yXG4gICAgICAuZ2VuZXJhdGVXb3JkbGlzdCguLi50aGlzLmZpbHRlcmVkQ2hhcnNldClcbiAgICAgIC5waXBlKFxuICAgICAgICByZWR1Y2UoXG4gICAgICAgICAgKHdvcmRsaXN0OiBzdHJpbmcsIHdvcmQ6IHN0cmluZykgPT5cbiAgICAgICAgICAgIGAke3dvcmRsaXN0fSR7dGhpcy5wcmVmaXh9JHt3b3JkfSR7dGhpcy5zdWZmaXh9XFxuYCxcbiAgICAgICAgICAnJ1xuICAgICAgICApLFxuICAgICAgICB0YWtlVW50aWwodGhpcy51bnN1YnNjcmliZSQpXG4gICAgICApO1xuICB9XG5cbiAgZmlsdGVyQ2hhcnNldChjaGFyc2V0czogc3RyaW5nW10pOiBzdHJpbmdbXSB7XG4gICAgcmV0dXJuIGNoYXJzZXRzLm1hcCgoY2hhcnNldDogc3RyaW5nKSA9PiB0aGlzLnJlbW92ZUR1cGxpY2F0ZXMoY2hhcnNldCkpO1xuICB9XG5cbiAgcGFyc2VXb3JkbGlzdCh3b3JkbGlzdDogc3RyaW5nKTogeyB3b3JkbGlzdDogc3RyaW5nOyBjb250ZW50VHlwZTogc3RyaW5nIH0ge1xuICAgIHN3aXRjaCAodGhpcy5maWxlVHlwZSkge1xuICAgICAgY2FzZSBGaWxlVHlwZS5wbGFpbnRleHQ6XG4gICAgICAgIHJldHVybiB0b1BsYWludGV4dCh3b3JkbGlzdCk7XG4gICAgICBjYXNlIEZpbGVUeXBlLnhtbDpcbiAgICAgICAgcmV0dXJuIHRvWE1MKHdvcmRsaXN0KTtcbiAgICB9XG4gIH1cblxuICByZW1vdmVDaGFyc2V0KGk6IG51bWJlcik6IHZvaWQge1xuICAgIGlmICh0aGlzLmNoYXJzZXRzICYmIHRoaXMuY2hhcnNldHMubGVuZ3RoID4gMSkge1xuICAgICAgdGhpcy5jaGFyc2V0cy5yZW1vdmVBdChpKTtcbiAgICB9XG4gIH1cblxuICByZW1vdmVEdXBsaWNhdGVzID0gKHVuZmlsdGVyZWQ6IHN0cmluZyk6IHN0cmluZyA9PlxuICAgIFsuLi5uZXcgU2V0KHVuZmlsdGVyZWQpXS5qb2luKCcnKTtcbn1cbiIsIjxkaXYgY2xhc3M9XCJtZXRhLWNvbnRhaW5lclwiIGZ4TGF5b3V0PVwicm93IHdyYXBcIj5cbiAgPGRpdiBjbGFzcz1cImZvcm0tY29udGFpbmVyXCIgZnhMYXlvdXQ9XCJjb2x1bW5cIiBmeEZsZXg+XG4gICAgPGRpdiBmeExheW91dD1cInJvdyB3cmFwXCI+XG4gICAgICA8YnV0dG9uXG4gICAgICAgIGNsYXNzPVwiZ2VuZXJhdGUtd29yZGxpc3RcIlxuICAgICAgICBbbmdTdHlsZV09XCJ7IGNvbG9yOiBidXR0b25Db2xvciB9XCJcbiAgICAgICAgbWF0LXJhaXNlZC1idXR0b25cbiAgICAgICAgKGNsaWNrKT1cImdlbmVyYXRlV29yZGxpc3QoKVwiXG4gICAgICA+XG4gICAgICAgIEdlbmVyYXRlIHdvcmRsaXN0XG4gICAgICA8L2J1dHRvbj5cbiAgICAgIDxidXR0b25cbiAgICAgICAgY2xhc3M9XCJjaG9vc2UtZm9ybWF0XCJcbiAgICAgICAgW25nU3R5bGVdPVwieyBjb2xvcjogYnV0dG9uQ29sb3IgfVwiXG4gICAgICAgIG1hdC1yYWlzZWQtYnV0dG9uXG4gICAgICAgIFttYXRNZW51VHJpZ2dlckZvcl09XCJtZW51XCJcbiAgICAgICAgKm5nSWY9XCJ3b3JkbGlzdCRcIlxuICAgICAgPlxuICAgICAgICBDaG9vc2UgZm9ybWF0XG4gICAgICA8L2J1dHRvbj5cbiAgICAgIDxtYXQtbWVudSAjbWVudT1cIm1hdE1lbnVcIj5cbiAgICAgICAgPGJ1dHRvblxuICAgICAgICAgIFtuZ1N0eWxlXT1cInsgY29sb3I6IGJ1dHRvbkNvbG9yIH1cIlxuICAgICAgICAgIG1hdC1tZW51LWl0ZW1cbiAgICAgICAgICAqbmdGb3I9XCJsZXQgdHlwZSBvZiBmaWxlVHlwZXNcIlxuICAgICAgICAgIChjbGljayk9XCJmaWxlVHlwZSA9IHR5cGVcIlxuICAgICAgICA+XG4gICAgICAgICAge3sgdHlwZSB9fVxuICAgICAgICA8L2J1dHRvbj5cbiAgICAgIDwvbWF0LW1lbnU+XG4gICAgICA8YnV0dG9uXG4gICAgICAgIGNsYXNzPVwiZG93bmxvYWQtd29yZGxpc3RcIlxuICAgICAgICBbbmdTdHlsZV09XCJ7IGNvbG9yOiBidXR0b25Db2xvciB9XCJcbiAgICAgICAgbWF0LXJhaXNlZC1idXR0b25cbiAgICAgICAgKm5nSWY9XCJ3b3JkbGlzdCRcIlxuICAgICAgICAoY2xpY2spPVwiZG93bmxvYWRXb3JkbGlzdCgpXCJcbiAgICAgID5cbiAgICAgICAgRG93bmxvYWQgYXNcbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInRoaXMuZmlsZVR5cGVcIj57eyB0aGlzLmZpbGVUeXBlIH19PC9uZy1jb250YWluZXI+XG4gICAgICA8L2J1dHRvbj5cbiAgICA8L2Rpdj5cbiAgICA8Zm9ybSAqbmdJZj1cImNoYXJzZXRGb3JtXCIgW2Zvcm1Hcm91cF09XCJjaGFyc2V0Rm9ybVwiPlxuICAgICAgPG1hdC1mb3JtLWZpZWxkIGNsYXNzPVwiZml4XCIgYXBwZWFyYW5jZT1cIm91dGxpbmVcIj5cbiAgICAgICAgPG1hdC1sYWJlbCBbbmdTdHlsZV09XCJ7IGNvbG9yOiB0ZXh0Q29sb3IgfVwiXG4gICAgICAgICAgPnByZWZpeCAob3B0aW9uYWwpPC9tYXQtbGFiZWxcbiAgICAgICAgPlxuICAgICAgICA8aW5wdXRcbiAgICAgICAgICBtYXRJbnB1dFxuICAgICAgICAgIHR5cGU9XCJ0ZXh0XCJcbiAgICAgICAgICBpZD1cInByZWZpeFwiXG4gICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwicHJlZml4XCJcbiAgICAgICAgICAoa2V5ZG93bi5lbnRlcik9XCIkZXZlbnQucHJldmVudERlZmF1bHQoKVwiXG4gICAgICAgIC8+XG4gICAgICA8L21hdC1mb3JtLWZpZWxkPlxuICAgICAgPGRpdiBmb3JtQXJyYXlOYW1lPVwiY2hhcnNldHNcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImNoYXJzZXRcIj48L2Rpdj5cbiAgICAgICAgPGRpdiBjZGtEcm9wTGlzdCAoY2RrRHJvcExpc3REcm9wcGVkKT1cImRyb3AoJGV2ZW50KVwiPlxuICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgIGNsYXNzPVwiY2hhcnNldC1jb250YWluZXJcIlxuICAgICAgICAgICAgY2RrRHJhZ1xuICAgICAgICAgICAgKm5nRm9yPVwibGV0IGNoYXJzZXQgb2YgY2hhcnNldHM/LmNvbnRyb2xzOyBsZXQgaSA9IGluZGV4XCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICA8bWF0LWljb24gY2xhc3M9XCJkcmFnLWluZGljYXRvclwiIFtuZ1N0eWxlXT1cInsgY29sb3I6IGJ1dHRvbkNvbG9yIH1cIlxuICAgICAgICAgICAgICA+ZHJhZ19pbmRpY2F0b3I8L21hdC1pY29uXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICA8bWF0LWZvcm0tZmllbGQgY2xhc3M9XCJjaGFyc2V0XCIgYXBwZWFyYW5jZT1cIm91dGxpbmVcIj5cbiAgICAgICAgICAgICAgPG1hdC1sYWJlbCBbbmdTdHlsZV09XCJ7IGNvbG9yOiB0ZXh0Q29sb3IgfVwiPlxuICAgICAgICAgICAgICAgIGNoYXJhY3RlciBzZXQgZm9yIHN0cmluZyBwb3NpdGlvbiB7eyBpIH19XG4gICAgICAgICAgICAgIDwvbWF0LWxhYmVsPlxuICAgICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgICBtYXRJbnB1dFxuICAgICAgICAgICAgICAgIHR5cGU9XCJ0ZXh0XCJcbiAgICAgICAgICAgICAgICBpZD1cInBvc2l0aW9uLXt7IGkgfX1cIlxuICAgICAgICAgICAgICAgIFtmb3JtQ29udHJvbE5hbWVdPVwiaVwiXG4gICAgICAgICAgICAgICAgKGtleWRvd24uZW50ZXIpPVwiJGV2ZW50LnByZXZlbnREZWZhdWx0KClcIlxuICAgICAgICAgICAgICAgIHJlcXVpcmVkXG4gICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxuICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICBtYXQtcmFpc2VkLWJ1dHRvblxuICAgICAgICAgICAgICBjbGFzcz1cImNsb25lLWNoYXJzZXRcIlxuICAgICAgICAgICAgICBbbmdTdHlsZV09XCJ7IGNvbG9yOiBidXR0b25Db2xvciB9XCJcbiAgICAgICAgICAgICAgKGNsaWNrKT1cImNsb25lQ2hhcnNldChpKVwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgIDxtYXQtaWNvbj5jb250ZW50X2NvcHk8L21hdC1pY29uPlxuICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgIG1hdC1yYWlzZWQtYnV0dG9uXG4gICAgICAgICAgICAgIGNsYXNzPVwicmVtb3ZlLWNoYXJzZXRcIlxuICAgICAgICAgICAgICBbbmdTdHlsZV09XCJ7IGNvbG9yOiBidXR0b25Db2xvciB9XCJcbiAgICAgICAgICAgICAgKGNsaWNrKT1cInJlbW92ZUNoYXJzZXQoaSlcIlxuICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwidGhpcy5jaGFyc2V0cz8udmFsdWUubGVuZ3RoID09PSAxXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgPG1hdC1pY29uPnJlbW92ZTwvbWF0LWljb24+XG4gICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgbWF0LXJhaXNlZC1idXR0b25cbiAgICAgICAgICAgICAgW25nU3R5bGVdPVwieyBjb2xvcjogYnV0dG9uQ29sb3IgfVwiXG4gICAgICAgICAgICAgIChjbGljayk9XCJhZGRDaGFyc2V0KClcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICA8bWF0LWljb24+YWRkPC9tYXQtaWNvbj5cbiAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgICAgPG1hdC1mb3JtLWZpZWxkIGNsYXNzPVwiZml4XCIgYXBwZWFyYW5jZT1cIm91dGxpbmVcIj5cbiAgICAgICAgPG1hdC1sYWJlbCBbbmdTdHlsZV09XCJ7IGNvbG9yOiB0ZXh0Q29sb3IgfVwiXG4gICAgICAgICAgPnN1ZmZpeCAob3B0aW9uYWwpPC9tYXQtbGFiZWxcbiAgICAgICAgPlxuICAgICAgICA8aW5wdXRcbiAgICAgICAgICBtYXRJbnB1dFxuICAgICAgICAgIHR5cGU9XCJ0ZXh0XCJcbiAgICAgICAgICBpZD1cInN1ZmZpeFwiXG4gICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwic3VmZml4XCJcbiAgICAgICAgICAoa2V5ZG93bi5lbnRlcik9XCIkZXZlbnQucHJldmVudERlZmF1bHQoKVwiXG4gICAgICAgIC8+XG4gICAgICA8L21hdC1mb3JtLWZpZWxkPlxuICAgIDwvZm9ybT5cbiAgPC9kaXY+XG4gIDxkaXYgY2xhc3M9XCJ3b3JkbGlzdC1jb250YWluZXJcIiAqbmdJZj1cIndvcmRsaXN0JFwiIGZ4TGF5b3V0PVwiY29sdW1uXCIgZnhGbGV4PlxuICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJkaXNwbGF5V29yZGxpc3Q7IGVsc2Ugd29yZGxpc3RUb29MYXJnZVwiPlxuICAgICAgPGgzIGNsYXNzPVwid29yZGxpc3QtaGVhZGVyXCI+R2VuZXJhdGVkIHdvcmRsaXN0OjwvaDM+XG4gICAgICA8Y29kZSBjbGFzcz1cIndvcmRsaXN0XCI+XG4gICAgICAgIHt7IHdvcmRsaXN0JCB8IGFzeW5jIH19XG4gICAgICA8L2NvZGU+PC9uZy1jb250YWluZXJcbiAgICA+XG4gICAgPG5nLXRlbXBsYXRlICN3b3JkbGlzdFRvb0xhcmdlPlxuICAgICAgVGhlIGdlbmVyYXRlZCB3b3JkbGlzdCBpcyB0b28gbGFyZ2UgdG8gYmUgZGlzcGxheWVkLiBZb3UgY2FuIHN0aWxsXG4gICAgICBkb3dubG9hZCBpdC5cbiAgICA8L25nLXRlbXBsYXRlPlxuICA8L2Rpdj5cbjwvZGl2PlxuIl19
@@ -14,8 +14,8 @@ import { WordlistGeneratorService } from './wordlist-generator.service';
14
14
  import * as i0 from "@angular/core";
15
15
  export class WordlistGeneratorModule {
16
16
  }
17
- WordlistGeneratorModule.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.11", ngImport: i0, type: WordlistGeneratorModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
18
- WordlistGeneratorModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "12.0.0", version: "12.2.11", ngImport: i0, type: WordlistGeneratorModule, declarations: [WordlistGeneratorComponent], imports: [CommonModule,
17
+ WordlistGeneratorModule.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.1.0", ngImport: i0, type: WordlistGeneratorModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
18
+ WordlistGeneratorModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "12.0.0", version: "13.1.0", ngImport: i0, type: WordlistGeneratorModule, declarations: [WordlistGeneratorComponent], imports: [CommonModule,
19
19
  BrowserModule,
20
20
  BrowserAnimationsModule,
21
21
  DragDropModule,
@@ -25,7 +25,7 @@ WordlistGeneratorModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "12.0.0",
25
25
  MatInputModule,
26
26
  MatMenuModule,
27
27
  MatButtonModule], exports: [WordlistGeneratorComponent] });
28
- WordlistGeneratorModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "12.2.11", ngImport: i0, type: WordlistGeneratorModule, providers: [WordlistGeneratorService], imports: [[
28
+ WordlistGeneratorModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "13.1.0", ngImport: i0, type: WordlistGeneratorModule, providers: [WordlistGeneratorService], imports: [[
29
29
  CommonModule,
30
30
  BrowserModule,
31
31
  BrowserAnimationsModule,
@@ -37,7 +37,7 @@ WordlistGeneratorModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0",
37
37
  MatMenuModule,
38
38
  MatButtonModule
39
39
  ]] });
40
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.11", ngImport: i0, type: WordlistGeneratorModule, decorators: [{
40
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.1.0", ngImport: i0, type: WordlistGeneratorModule, decorators: [{
41
41
  type: NgModule,
42
42
  args: [{
43
43
  declarations: [WordlistGeneratorComponent],
@@ -57,4 +57,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.11", ngImpo
57
57
  providers: [WordlistGeneratorService]
58
58
  }]
59
59
  }] });
60
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid29yZGxpc3QtZ2VuZXJhdG9yLm1vZHVsZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL2xpYnMvd29yZGxpc3QtZ2VuZXJhdG9yL3NyYy9saWIvd29yZGxpc3QtZ2VuZXJhdG9yLm1vZHVsZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDekQsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQ3hELE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMvQyxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3pDLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ3JELE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUMzRCxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDdkQsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQ3pELE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUN2RCxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDMUQsT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0sc0NBQXNDLENBQUM7QUFFL0UsT0FBTyxFQUFFLDBCQUEwQixFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFDNUUsT0FBTyxFQUFFLHdCQUF3QixFQUFFLE1BQU0sOEJBQThCLENBQUM7O0FBbUJ4RSxNQUFNLE9BQU8sdUJBQXVCOztxSEFBdkIsdUJBQXVCO3NIQUF2Qix1QkFBdUIsaUJBaEJuQiwwQkFBMEIsYUFFdkMsWUFBWTtRQUNaLGFBQWE7UUFDYix1QkFBdUI7UUFDdkIsY0FBYztRQUNkLG1CQUFtQjtRQUNuQixlQUFlO1FBQ2YsYUFBYTtRQUNiLGNBQWM7UUFDZCxhQUFhO1FBQ2IsZUFBZSxhQUVQLDBCQUEwQjtzSEFHekIsdUJBQXVCLGFBRnZCLENBQUMsd0JBQXdCLENBQUMsWUFiNUI7WUFDUCxZQUFZO1lBQ1osYUFBYTtZQUNiLHVCQUF1QjtZQUN2QixjQUFjO1lBQ2QsbUJBQW1CO1lBQ25CLGVBQWU7WUFDZixhQUFhO1lBQ2IsY0FBYztZQUNkLGFBQWE7WUFDYixlQUFlO1NBQ2hCOzRGQUlVLHVCQUF1QjtrQkFqQm5DLFFBQVE7bUJBQUM7b0JBQ1IsWUFBWSxFQUFFLENBQUMsMEJBQTBCLENBQUM7b0JBQzFDLE9BQU8sRUFBRTt3QkFDUCxZQUFZO3dCQUNaLGFBQWE7d0JBQ2IsdUJBQXVCO3dCQUN2QixjQUFjO3dCQUNkLG1CQUFtQjt3QkFDbkIsZUFBZTt3QkFDZixhQUFhO3dCQUNiLGNBQWM7d0JBQ2QsYUFBYTt3QkFDYixlQUFlO3FCQUNoQjtvQkFDRCxPQUFPLEVBQUUsQ0FBQywwQkFBMEIsQ0FBQztvQkFDckMsU0FBUyxFQUFFLENBQUMsd0JBQXdCLENBQUM7aUJBQ3RDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ2xpcGJvYXJkTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY2RrL2NsaXBib2FyZCc7XG5pbXBvcnQgeyBEcmFnRHJvcE1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2Nkay9kcmFnLWRyb3AnO1xuaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IE5nTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBSZWFjdGl2ZUZvcm1zTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgTWF0QnV0dG9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvYnV0dG9uJztcbmltcG9ydCB7IE1hdEljb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9pY29uJztcbmltcG9ydCB7IE1hdElucHV0TW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvaW5wdXQnO1xuaW1wb3J0IHsgTWF0TWVudU1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL21lbnUnO1xuaW1wb3J0IHsgQnJvd3Nlck1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL3BsYXRmb3JtLWJyb3dzZXInO1xuaW1wb3J0IHsgQnJvd3NlckFuaW1hdGlvbnNNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9wbGF0Zm9ybS1icm93c2VyL2FuaW1hdGlvbnMnO1xuXG5pbXBvcnQgeyBXb3JkbGlzdEdlbmVyYXRvckNvbXBvbmVudCB9IGZyb20gJy4vd29yZGxpc3QtZ2VuZXJhdG9yLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBXb3JkbGlzdEdlbmVyYXRvclNlcnZpY2UgfSBmcm9tICcuL3dvcmRsaXN0LWdlbmVyYXRvci5zZXJ2aWNlJztcblxuQE5nTW9kdWxlKHtcbiAgZGVjbGFyYXRpb25zOiBbV29yZGxpc3RHZW5lcmF0b3JDb21wb25lbnRdLFxuICBpbXBvcnRzOiBbXG4gICAgQ29tbW9uTW9kdWxlLFxuICAgIEJyb3dzZXJNb2R1bGUsXG4gICAgQnJvd3NlckFuaW1hdGlvbnNNb2R1bGUsXG4gICAgRHJhZ0Ryb3BNb2R1bGUsXG4gICAgUmVhY3RpdmVGb3Jtc01vZHVsZSxcbiAgICBDbGlwYm9hcmRNb2R1bGUsXG4gICAgTWF0SWNvbk1vZHVsZSxcbiAgICBNYXRJbnB1dE1vZHVsZSxcbiAgICBNYXRNZW51TW9kdWxlLFxuICAgIE1hdEJ1dHRvbk1vZHVsZVxuICBdLFxuICBleHBvcnRzOiBbV29yZGxpc3RHZW5lcmF0b3JDb21wb25lbnRdLFxuICBwcm92aWRlcnM6IFtXb3JkbGlzdEdlbmVyYXRvclNlcnZpY2VdXG59KVxuZXhwb3J0IGNsYXNzIFdvcmRsaXN0R2VuZXJhdG9yTW9kdWxlIHt9XG4iXX0=
60
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid29yZGxpc3QtZ2VuZXJhdG9yLm1vZHVsZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL2xpYnMvd29yZGxpc3QtZ2VuZXJhdG9yL3NyYy9saWIvd29yZGxpc3QtZ2VuZXJhdG9yLm1vZHVsZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDekQsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQ3hELE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMvQyxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3pDLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ3JELE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUMzRCxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDdkQsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQ3pELE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUN2RCxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDMUQsT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0sc0NBQXNDLENBQUM7QUFFL0UsT0FBTyxFQUFFLDBCQUEwQixFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFDNUUsT0FBTyxFQUFFLHdCQUF3QixFQUFFLE1BQU0sOEJBQThCLENBQUM7O0FBbUJ4RSxNQUFNLE9BQU8sdUJBQXVCOztvSEFBdkIsdUJBQXVCO3FIQUF2Qix1QkFBdUIsaUJBaEJuQiwwQkFBMEIsYUFFdkMsWUFBWTtRQUNaLGFBQWE7UUFDYix1QkFBdUI7UUFDdkIsY0FBYztRQUNkLG1CQUFtQjtRQUNuQixlQUFlO1FBQ2YsYUFBYTtRQUNiLGNBQWM7UUFDZCxhQUFhO1FBQ2IsZUFBZSxhQUVQLDBCQUEwQjtxSEFHekIsdUJBQXVCLGFBRnZCLENBQUMsd0JBQXdCLENBQUMsWUFiNUI7WUFDUCxZQUFZO1lBQ1osYUFBYTtZQUNiLHVCQUF1QjtZQUN2QixjQUFjO1lBQ2QsbUJBQW1CO1lBQ25CLGVBQWU7WUFDZixhQUFhO1lBQ2IsY0FBYztZQUNkLGFBQWE7WUFDYixlQUFlO1NBQ2hCOzJGQUlVLHVCQUF1QjtrQkFqQm5DLFFBQVE7bUJBQUM7b0JBQ1IsWUFBWSxFQUFFLENBQUMsMEJBQTBCLENBQUM7b0JBQzFDLE9BQU8sRUFBRTt3QkFDUCxZQUFZO3dCQUNaLGFBQWE7d0JBQ2IsdUJBQXVCO3dCQUN2QixjQUFjO3dCQUNkLG1CQUFtQjt3QkFDbkIsZUFBZTt3QkFDZixhQUFhO3dCQUNiLGNBQWM7d0JBQ2QsYUFBYTt3QkFDYixlQUFlO3FCQUNoQjtvQkFDRCxPQUFPLEVBQUUsQ0FBQywwQkFBMEIsQ0FBQztvQkFDckMsU0FBUyxFQUFFLENBQUMsd0JBQXdCLENBQUM7aUJBQ3RDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ2xpcGJvYXJkTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY2RrL2NsaXBib2FyZCc7XG5pbXBvcnQgeyBEcmFnRHJvcE1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2Nkay9kcmFnLWRyb3AnO1xuaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IE5nTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBSZWFjdGl2ZUZvcm1zTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgTWF0QnV0dG9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvYnV0dG9uJztcbmltcG9ydCB7IE1hdEljb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9pY29uJztcbmltcG9ydCB7IE1hdElucHV0TW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvaW5wdXQnO1xuaW1wb3J0IHsgTWF0TWVudU1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL21lbnUnO1xuaW1wb3J0IHsgQnJvd3Nlck1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL3BsYXRmb3JtLWJyb3dzZXInO1xuaW1wb3J0IHsgQnJvd3NlckFuaW1hdGlvbnNNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9wbGF0Zm9ybS1icm93c2VyL2FuaW1hdGlvbnMnO1xuXG5pbXBvcnQgeyBXb3JkbGlzdEdlbmVyYXRvckNvbXBvbmVudCB9IGZyb20gJy4vd29yZGxpc3QtZ2VuZXJhdG9yLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBXb3JkbGlzdEdlbmVyYXRvclNlcnZpY2UgfSBmcm9tICcuL3dvcmRsaXN0LWdlbmVyYXRvci5zZXJ2aWNlJztcblxuQE5nTW9kdWxlKHtcbiAgZGVjbGFyYXRpb25zOiBbV29yZGxpc3RHZW5lcmF0b3JDb21wb25lbnRdLFxuICBpbXBvcnRzOiBbXG4gICAgQ29tbW9uTW9kdWxlLFxuICAgIEJyb3dzZXJNb2R1bGUsXG4gICAgQnJvd3NlckFuaW1hdGlvbnNNb2R1bGUsXG4gICAgRHJhZ0Ryb3BNb2R1bGUsXG4gICAgUmVhY3RpdmVGb3Jtc01vZHVsZSxcbiAgICBDbGlwYm9hcmRNb2R1bGUsXG4gICAgTWF0SWNvbk1vZHVsZSxcbiAgICBNYXRJbnB1dE1vZHVsZSxcbiAgICBNYXRNZW51TW9kdWxlLFxuICAgIE1hdEJ1dHRvbk1vZHVsZVxuICBdLFxuICBleHBvcnRzOiBbV29yZGxpc3RHZW5lcmF0b3JDb21wb25lbnRdLFxuICBwcm92aWRlcnM6IFtXb3JkbGlzdEdlbmVyYXRvclNlcnZpY2VdXG59KVxuZXhwb3J0IGNsYXNzIFdvcmRsaXN0R2VuZXJhdG9yTW9kdWxlIHt9XG4iXX0=
@@ -13,12 +13,12 @@ export class WordlistGeneratorService {
13
13
  }));
14
14
  }
15
15
  }
16
- WordlistGeneratorService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.11", ngImport: i0, type: WordlistGeneratorService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
17
- WordlistGeneratorService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "12.2.11", ngImport: i0, type: WordlistGeneratorService, providedIn: 'root' });
18
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.11", ngImport: i0, type: WordlistGeneratorService, decorators: [{
16
+ WordlistGeneratorService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.1.0", ngImport: i0, type: WordlistGeneratorService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
17
+ WordlistGeneratorService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "13.1.0", ngImport: i0, type: WordlistGeneratorService, providedIn: 'root' });
18
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.1.0", ngImport: i0, type: WordlistGeneratorService, decorators: [{
19
19
  type: Injectable,
20
20
  args: [{
21
21
  providedIn: 'root'
22
22
  }]
23
23
  }], ctorParameters: function () { return []; } });
24
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid29yZGxpc3QtZ2VuZXJhdG9yLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9saWJzL3dvcmRsaXN0LWdlbmVyYXRvci9zcmMvbGliL3dvcmRsaXN0LWdlbmVyYXRvci5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDM0MsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBQ3RELE9BQU8sRUFBRSxJQUFJLEVBQWMsTUFBTSxNQUFNLENBQUM7QUFDeEMsT0FBTyxFQUFFLEdBQUcsRUFBRSxNQUFNLGdCQUFnQixDQUFDOztBQUtyQyxNQUFNLE9BQU8sd0JBQXdCO0lBQ25DO1FBQ0UsRUFBRTtJQUNKLENBQUM7SUFFRCxnQkFBZ0IsQ0FBQyxHQUFHLFFBQWtCO1FBQ3BDLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLFFBQVEsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUNwQyxHQUFHLENBQUMsQ0FBQyxJQUFjLEVBQUUsRUFBRTtZQUNyQixPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDdkIsQ0FBQyxDQUFDLENBQ0gsQ0FBQztJQUNKLENBQUM7O3NIQVhVLHdCQUF3QjswSEFBeEIsd0JBQXdCLGNBRnZCLE1BQU07NEZBRVAsd0JBQXdCO2tCQUhwQyxVQUFVO21CQUFDO29CQUNWLFVBQVUsRUFBRSxNQUFNO2lCQUNuQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IHByb2R1Y3QgfSBmcm9tICdjYXJ0ZXNpYW4tcHJvZHVjdC1nZW5lcmF0b3InO1xuaW1wb3J0IHsgZnJvbSwgT2JzZXJ2YWJsZSB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgbWFwIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuXG5ASW5qZWN0YWJsZSh7XG4gIHByb3ZpZGVkSW46ICdyb290J1xufSlcbmV4cG9ydCBjbGFzcyBXb3JkbGlzdEdlbmVyYXRvclNlcnZpY2Uge1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICAvL1xuICB9XG5cbiAgZ2VuZXJhdGVXb3JkbGlzdCguLi5jaGFyc2V0czogc3RyaW5nW10pOiBPYnNlcnZhYmxlPHN0cmluZz4ge1xuICAgIHJldHVybiBmcm9tKHByb2R1Y3QoLi4uY2hhcnNldHMpKS5waXBlKFxuICAgICAgbWFwKCh3b3JkOiBzdHJpbmdbXSkgPT4ge1xuICAgICAgICByZXR1cm4gd29yZC5qb2luKCcnKTtcbiAgICAgIH0pXG4gICAgKTtcbiAgfVxufVxuIl19
24
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid29yZGxpc3QtZ2VuZXJhdG9yLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9saWJzL3dvcmRsaXN0LWdlbmVyYXRvci9zcmMvbGliL3dvcmRsaXN0LWdlbmVyYXRvci5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDM0MsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBQ3RELE9BQU8sRUFBRSxJQUFJLEVBQWMsTUFBTSxNQUFNLENBQUM7QUFDeEMsT0FBTyxFQUFFLEdBQUcsRUFBRSxNQUFNLGdCQUFnQixDQUFDOztBQUtyQyxNQUFNLE9BQU8sd0JBQXdCO0lBQ25DO1FBQ0UsRUFBRTtJQUNKLENBQUM7SUFFRCxnQkFBZ0IsQ0FBQyxHQUFHLFFBQWtCO1FBQ3BDLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLFFBQVEsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUNwQyxHQUFHLENBQUMsQ0FBQyxJQUFjLEVBQUUsRUFBRTtZQUNyQixPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDdkIsQ0FBQyxDQUFDLENBQ0gsQ0FBQztJQUNKLENBQUM7O3FIQVhVLHdCQUF3Qjt5SEFBeEIsd0JBQXdCLGNBRnZCLE1BQU07MkZBRVAsd0JBQXdCO2tCQUhwQyxVQUFVO21CQUFDO29CQUNWLFVBQVUsRUFBRSxNQUFNO2lCQUNuQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IHByb2R1Y3QgfSBmcm9tICdjYXJ0ZXNpYW4tcHJvZHVjdC1nZW5lcmF0b3InO1xuaW1wb3J0IHsgZnJvbSwgT2JzZXJ2YWJsZSB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgbWFwIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuXG5ASW5qZWN0YWJsZSh7XG4gIHByb3ZpZGVkSW46ICdyb290J1xufSlcbmV4cG9ydCBjbGFzcyBXb3JkbGlzdEdlbmVyYXRvclNlcnZpY2Uge1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICAvL1xuICB9XG5cbiAgZ2VuZXJhdGVXb3JkbGlzdCguLi5jaGFyc2V0czogc3RyaW5nW10pOiBPYnNlcnZhYmxlPHN0cmluZz4ge1xuICAgIHJldHVybiBmcm9tKHByb2R1Y3QoLi4uY2hhcnNldHMpKS5waXBlKFxuICAgICAgbWFwKCh3b3JkOiBzdHJpbmdbXSkgPT4ge1xuICAgICAgICByZXR1cm4gd29yZC5qb2luKCcnKTtcbiAgICAgIH0pXG4gICAgKTtcbiAgfVxufVxuIl19
@@ -0,0 +1,254 @@
1
+ import * as i9 from '@angular/cdk/drag-drop';
2
+ import { moveItemInArray, DragDropModule } from '@angular/cdk/drag-drop';
3
+ import * as i0 from '@angular/core';
4
+ import { Injectable, Component, ViewEncapsulation, Input, NgModule } from '@angular/core';
5
+ import * as i1 from '@angular/forms';
6
+ import { Validators, ReactiveFormsModule } from '@angular/forms';
7
+ import { from, Subject } from 'rxjs';
8
+ import { map, tap, reduce, takeUntil } from 'rxjs/operators';
9
+ import { product } from 'cartesian-product-generator';
10
+ import * as i3 from '@angular/material/button';
11
+ import { MatButtonModule } from '@angular/material/button';
12
+ import * as i4 from '@angular/material/menu';
13
+ import { MatMenuModule } from '@angular/material/menu';
14
+ import * as i5 from '@angular/material/form-field';
15
+ import * as i6 from '@angular/material/icon';
16
+ import { MatIconModule } from '@angular/material/icon';
17
+ import * as i7 from '@angular/common';
18
+ import { CommonModule } from '@angular/common';
19
+ import * as i8 from '@angular/material/input';
20
+ import { MatInputModule } from '@angular/material/input';
21
+ import { ClipboardModule } from '@angular/cdk/clipboard';
22
+ import { BrowserModule } from '@angular/platform-browser';
23
+ import { BrowserAnimationsModule } from '@angular/platform-browser/animations';
24
+
25
+ /* eslint-disable no-shadow */
26
+ var FileType;
27
+ (function (FileType) {
28
+ FileType["plaintext"] = "txt";
29
+ FileType["xml"] = "xml";
30
+ })(FileType || (FileType = {}));
31
+
32
+ const toPlaintext = (wordlist) => ({
33
+ wordlist,
34
+ contentType: 'text/plain'
35
+ });
36
+ const toXML = (wordlist) => {
37
+ const head = '<wordlist><word>';
38
+ const glue = '</word><word>';
39
+ const tail = '</word></wordlist>';
40
+ return {
41
+ wordlist: head + wordlist.replace(/\n/g, glue) + tail,
42
+ contentType: 'text/xml'
43
+ };
44
+ };
45
+
46
+ class WordlistGeneratorService {
47
+ constructor() {
48
+ //
49
+ }
50
+ generateWordlist(...charsets) {
51
+ return from(product(...charsets)).pipe(map((word) => {
52
+ return word.join('');
53
+ }));
54
+ }
55
+ }
56
+ WordlistGeneratorService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.1.0", ngImport: i0, type: WordlistGeneratorService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
57
+ WordlistGeneratorService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "13.1.0", ngImport: i0, type: WordlistGeneratorService, providedIn: 'root' });
58
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.1.0", ngImport: i0, type: WordlistGeneratorService, decorators: [{
59
+ type: Injectable,
60
+ args: [{
61
+ providedIn: 'root'
62
+ }]
63
+ }], ctorParameters: function () { return []; } });
64
+
65
+ /* eslint-disable @angular-eslint/component-selector */
66
+ class WordlistGeneratorComponent {
67
+ constructor(formBuilder, wordlistGenerator) {
68
+ this.formBuilder = formBuilder;
69
+ this.wordlistGenerator = wordlistGenerator;
70
+ this.buttonColor = '#cc7832';
71
+ this.textColor = '#cc7832';
72
+ this.displayWordlist = false;
73
+ this.fileType = FileType.plaintext;
74
+ this.fileTypes = Object.values(FileType);
75
+ this.filteredCharset = [];
76
+ this.prefix = '';
77
+ this.suffix = '';
78
+ this.unsubscribe$ = new Subject();
79
+ this.removeDuplicates = (unfiltered) => [...new Set(unfiltered)].join('');
80
+ }
81
+ ngOnInit() {
82
+ this.generateForm();
83
+ }
84
+ ngOnDestroy() {
85
+ this.unsubscribe$.next();
86
+ this.unsubscribe$.complete();
87
+ }
88
+ get charsets() {
89
+ if (this.charsetForm) {
90
+ return this.charsetForm.get('charsets');
91
+ }
92
+ return undefined;
93
+ }
94
+ addCharset() {
95
+ if (this.charsets) {
96
+ this.charsets.push(this.formBuilder.control('', Validators.required));
97
+ }
98
+ }
99
+ cloneCharset(index) {
100
+ if (this.charsets) {
101
+ const charset = this.charsets.value[index];
102
+ this.charsets.insert(index, this.formBuilder.control(charset, Validators.required));
103
+ }
104
+ }
105
+ downloadWordlist() {
106
+ if (this.charsets) {
107
+ if (this.filteredCharset !== this.filterCharset(this.charsets.value)) {
108
+ this.generateWordlist();
109
+ }
110
+ const filename = `wordlist_${this.wordsGenerated}_words_${this.charsets.length}_positions.${this.fileType}`;
111
+ this.getWordlist()
112
+ .pipe(tap((wordlist) => {
113
+ if (wordlist.length > 0) {
114
+ const parsed = this.parseWordlist(wordlist);
115
+ const file = new Blob([parsed.wordlist], {
116
+ type: parsed.contentType
117
+ });
118
+ if (window.navigator.msSaveOrOpenBlob) {
119
+ window.navigator.msSaveOrOpenBlob(file, filename);
120
+ }
121
+ else {
122
+ const a = document.createElement('a');
123
+ const url = URL.createObjectURL(file);
124
+ a.href = url;
125
+ a.download = filename;
126
+ document.body.appendChild(a);
127
+ a.click();
128
+ setTimeout(() => {
129
+ document.body.removeChild(a);
130
+ window.URL.revokeObjectURL(url);
131
+ }, 0);
132
+ }
133
+ }
134
+ }))
135
+ .subscribe();
136
+ }
137
+ }
138
+ drop(event) {
139
+ if (this.charsets) {
140
+ moveItemInArray(this.charsets.controls, event.previousIndex, event.currentIndex);
141
+ this.charsets.updateValueAndValidity();
142
+ }
143
+ }
144
+ generateForm() {
145
+ this.charsetForm = this.formBuilder.group({
146
+ charsets: this.formBuilder.array([
147
+ this.formBuilder.control('', Validators.required)
148
+ ]),
149
+ prefix: this.formBuilder.control(''),
150
+ suffix: this.formBuilder.control('')
151
+ });
152
+ }
153
+ generateWordlist() {
154
+ var _a, _b, _c, _d;
155
+ if (this.charsetForm && this.charsets && this.charsets.valid) {
156
+ this.filteredCharset = this.filterCharset(this.charsets.value);
157
+ this.prefix = ((_a = this.charsetForm.get('prefix')) === null || _a === void 0 ? void 0 : _a.value)
158
+ ? (_b = this.charsetForm.get('prefix')) === null || _b === void 0 ? void 0 : _b.value
159
+ : '';
160
+ this.suffix = ((_c = this.charsetForm.get('suffix')) === null || _c === void 0 ? void 0 : _c.value)
161
+ ? (_d = this.charsetForm.get('suffix')) === null || _d === void 0 ? void 0 : _d.value
162
+ : '';
163
+ this.wordsGenerated = this.filteredCharset
164
+ .map((charset) => charset.length)
165
+ .reduce((previousLength, currentLength) => previousLength * currentLength);
166
+ this.displayWordlist = this.wordsGenerated <= 100;
167
+ this.wordlist$ = this.getWordlist();
168
+ }
169
+ }
170
+ getWordlist() {
171
+ return this.wordlistGenerator
172
+ .generateWordlist(...this.filteredCharset)
173
+ .pipe(reduce((wordlist, word) => `${wordlist}${this.prefix}${word}${this.suffix}\n`, ''), takeUntil(this.unsubscribe$));
174
+ }
175
+ filterCharset(charsets) {
176
+ return charsets.map((charset) => this.removeDuplicates(charset));
177
+ }
178
+ parseWordlist(wordlist) {
179
+ switch (this.fileType) {
180
+ case FileType.plaintext:
181
+ return toPlaintext(wordlist);
182
+ case FileType.xml:
183
+ return toXML(wordlist);
184
+ }
185
+ }
186
+ removeCharset(i) {
187
+ if (this.charsets && this.charsets.length > 1) {
188
+ this.charsets.removeAt(i);
189
+ }
190
+ }
191
+ }
192
+ WordlistGeneratorComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.1.0", ngImport: i0, type: WordlistGeneratorComponent, deps: [{ token: i1.FormBuilder }, { token: WordlistGeneratorService }], target: i0.ɵɵFactoryTarget.Component });
193
+ WordlistGeneratorComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.1.0", type: WordlistGeneratorComponent, selector: "wordlist-generator", inputs: { buttonColor: "buttonColor", textColor: "textColor" }, ngImport: i0, template: "<div class=\"meta-container\" fxLayout=\"row wrap\">\n <div class=\"form-container\" fxLayout=\"column\" fxFlex>\n <div fxLayout=\"row wrap\">\n <button\n class=\"generate-wordlist\"\n [ngStyle]=\"{ color: buttonColor }\"\n mat-raised-button\n (click)=\"generateWordlist()\"\n >\n Generate wordlist\n </button>\n <button\n class=\"choose-format\"\n [ngStyle]=\"{ color: buttonColor }\"\n mat-raised-button\n [matMenuTriggerFor]=\"menu\"\n *ngIf=\"wordlist$\"\n >\n Choose format\n </button>\n <mat-menu #menu=\"matMenu\">\n <button\n [ngStyle]=\"{ color: buttonColor }\"\n mat-menu-item\n *ngFor=\"let type of fileTypes\"\n (click)=\"fileType = type\"\n >\n {{ type }}\n </button>\n </mat-menu>\n <button\n class=\"download-wordlist\"\n [ngStyle]=\"{ color: buttonColor }\"\n mat-raised-button\n *ngIf=\"wordlist$\"\n (click)=\"downloadWordlist()\"\n >\n Download as\n <ng-container *ngIf=\"this.fileType\">{{ this.fileType }}</ng-container>\n </button>\n </div>\n <form *ngIf=\"charsetForm\" [formGroup]=\"charsetForm\">\n <mat-form-field class=\"fix\" appearance=\"outline\">\n <mat-label [ngStyle]=\"{ color: textColor }\"\n >prefix (optional)</mat-label\n >\n <input\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 class=\"charset\"></div>\n <div cdkDropList (cdkDropListDropped)=\"drop($event)\">\n <div\n class=\"charset-container\"\n cdkDrag\n *ngFor=\"let charset of charsets?.controls; let i = index\"\n >\n <mat-icon class=\"drag-indicator\" [ngStyle]=\"{ color: buttonColor }\"\n >drag_indicator</mat-icon\n >\n <mat-form-field class=\"charset\" appearance=\"outline\">\n <mat-label [ngStyle]=\"{ color: textColor }\">\n character set for string position {{ i }}\n </mat-label>\n <input\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]=\"{ color: buttonColor }\"\n (click)=\"cloneCharset(i)\"\n >\n <mat-icon>content_copy</mat-icon>\n </button>\n <button\n mat-raised-button\n class=\"remove-charset\"\n [ngStyle]=\"{ color: buttonColor }\"\n (click)=\"removeCharset(i)\"\n [disabled]=\"this.charsets?.value.length === 1\"\n >\n <mat-icon>remove</mat-icon>\n </button>\n <button\n mat-raised-button\n [ngStyle]=\"{ color: buttonColor }\"\n (click)=\"addCharset()\"\n >\n <mat-icon>add</mat-icon>\n </button>\n </div>\n </div>\n </div>\n <mat-form-field class=\"fix\" appearance=\"outline\">\n <mat-label [ngStyle]=\"{ color: textColor }\"\n >suffix (optional)</mat-label\n >\n <input\n matInput\n type=\"text\"\n id=\"suffix\"\n formControlName=\"suffix\"\n (keydown.enter)=\"$event.preventDefault()\"\n />\n </mat-form-field>\n </form>\n </div>\n <div class=\"wordlist-container\" *ngIf=\"wordlist$\" fxLayout=\"column\" fxFlex>\n <ng-container *ngIf=\"displayWordlist; else wordlistTooLarge\">\n <h3 class=\"wordlist-header\">Generated wordlist:</h3>\n <code class=\"wordlist\">\n {{ wordlist$ | async }}\n </code></ng-container\n >\n <ng-template #wordlistTooLarge>\n The generated wordlist is too large to be displayed. You can still\n download it.\n </ng-template>\n </div>\n</div>\n", styles: [".meta-container{max-width:100vw}.meta-container .form-container{float:left}.meta-container .form-container .charset-container .drag-indicator{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}.meta-container .form-container .charset{width:18.875em}.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}.meta-container .form-container .generate-wordlist,.meta-container .form-container .download-wordlist{margin:0 0 10px;width:150px}.meta-container .wordlist-container{max-height:80vh}.meta-container .wordlist-container .wordlist-header{margin-top:0}.meta-container .wordlist-container .wordlist{margin-left:1em;overflow-wrap:normal;width:1%}.mat-menu-panel{width:150px}.mat-form-field-appearance-outline .mat-form-field-infix{border:0;padding:1em 0 .5em}.mat-form-field-appearance-outline .mat-form-field-wrapper{padding-bottom:.25em}.mat-form-field-label{transition:none!important}.mat-form-field-should-float .mat-form-field-label-wrapper{top:-.1em;padding-top:.1em}.mat-form-field-should-float .mat-form-field-label{transition:none!important}.fix{width:21em}\n"], components: [{ type: i3.MatButton, selector: "button[mat-button], button[mat-raised-button], button[mat-icon-button], button[mat-fab], button[mat-mini-fab], button[mat-stroked-button], button[mat-flat-button]", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { type: i4.MatMenu, selector: "mat-menu", exportAs: ["matMenu"] }, { type: i4.MatMenuItem, selector: "[mat-menu-item]", inputs: ["disabled", "disableRipple", "role"], exportAs: ["matMenuItem"] }, { type: i5.MatFormField, selector: "mat-form-field", inputs: ["color", "appearance", "hideRequiredMarker", "hintLabel", "floatLabel"], exportAs: ["matFormField"] }, { type: i6.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }], directives: [{ type: i7.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { type: i7.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i4.MatMenuTrigger, selector: "[mat-menu-trigger-for], [matMenuTriggerFor]", exportAs: ["matMenuTrigger"] }, { type: i7.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i1.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { type: i1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { type: i5.MatLabel, selector: "mat-label" }, { type: i8.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly"], exportAs: ["matInput"] }, { type: i1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { type: i1.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { type: i1.FormArrayName, selector: "[formArrayName]", inputs: ["formArrayName"] }, { type: i9.CdkDropList, selector: "[cdkDropList], cdk-drop-list", inputs: ["cdkDropListConnectedTo", "cdkDropListData", "cdkDropListOrientation", "id", "cdkDropListLockAxis", "cdkDropListDisabled", "cdkDropListSortingDisabled", "cdkDropListEnterPredicate", "cdkDropListSortPredicate", "cdkDropListAutoScrollDisabled", "cdkDropListAutoScrollStep"], outputs: ["cdkDropListDropped", "cdkDropListEntered", "cdkDropListExited", "cdkDropListSorted"], exportAs: ["cdkDropList"] }, { type: i9.CdkDrag, selector: "[cdkDrag]", inputs: ["cdkDragData", "cdkDragLockAxis", "cdkDragRootElement", "cdkDragBoundary", "cdkDragStartDelay", "cdkDragFreeDragPosition", "cdkDragDisabled", "cdkDragConstrainPosition", "cdkDragPreviewClass", "cdkDragPreviewContainer"], outputs: ["cdkDragStarted", "cdkDragReleased", "cdkDragEnded", "cdkDragEntered", "cdkDragExited", "cdkDragDropped", "cdkDragMoved"], exportAs: ["cdkDrag"] }, { type: i1.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }], pipes: { "async": i7.AsyncPipe }, encapsulation: i0.ViewEncapsulation.None });
194
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.1.0", ngImport: i0, type: WordlistGeneratorComponent, decorators: [{
195
+ type: Component,
196
+ args: [{ selector: 'wordlist-generator', encapsulation: ViewEncapsulation.None, template: "<div class=\"meta-container\" fxLayout=\"row wrap\">\n <div class=\"form-container\" fxLayout=\"column\" fxFlex>\n <div fxLayout=\"row wrap\">\n <button\n class=\"generate-wordlist\"\n [ngStyle]=\"{ color: buttonColor }\"\n mat-raised-button\n (click)=\"generateWordlist()\"\n >\n Generate wordlist\n </button>\n <button\n class=\"choose-format\"\n [ngStyle]=\"{ color: buttonColor }\"\n mat-raised-button\n [matMenuTriggerFor]=\"menu\"\n *ngIf=\"wordlist$\"\n >\n Choose format\n </button>\n <mat-menu #menu=\"matMenu\">\n <button\n [ngStyle]=\"{ color: buttonColor }\"\n mat-menu-item\n *ngFor=\"let type of fileTypes\"\n (click)=\"fileType = type\"\n >\n {{ type }}\n </button>\n </mat-menu>\n <button\n class=\"download-wordlist\"\n [ngStyle]=\"{ color: buttonColor }\"\n mat-raised-button\n *ngIf=\"wordlist$\"\n (click)=\"downloadWordlist()\"\n >\n Download as\n <ng-container *ngIf=\"this.fileType\">{{ this.fileType }}</ng-container>\n </button>\n </div>\n <form *ngIf=\"charsetForm\" [formGroup]=\"charsetForm\">\n <mat-form-field class=\"fix\" appearance=\"outline\">\n <mat-label [ngStyle]=\"{ color: textColor }\"\n >prefix (optional)</mat-label\n >\n <input\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 class=\"charset\"></div>\n <div cdkDropList (cdkDropListDropped)=\"drop($event)\">\n <div\n class=\"charset-container\"\n cdkDrag\n *ngFor=\"let charset of charsets?.controls; let i = index\"\n >\n <mat-icon class=\"drag-indicator\" [ngStyle]=\"{ color: buttonColor }\"\n >drag_indicator</mat-icon\n >\n <mat-form-field class=\"charset\" appearance=\"outline\">\n <mat-label [ngStyle]=\"{ color: textColor }\">\n character set for string position {{ i }}\n </mat-label>\n <input\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]=\"{ color: buttonColor }\"\n (click)=\"cloneCharset(i)\"\n >\n <mat-icon>content_copy</mat-icon>\n </button>\n <button\n mat-raised-button\n class=\"remove-charset\"\n [ngStyle]=\"{ color: buttonColor }\"\n (click)=\"removeCharset(i)\"\n [disabled]=\"this.charsets?.value.length === 1\"\n >\n <mat-icon>remove</mat-icon>\n </button>\n <button\n mat-raised-button\n [ngStyle]=\"{ color: buttonColor }\"\n (click)=\"addCharset()\"\n >\n <mat-icon>add</mat-icon>\n </button>\n </div>\n </div>\n </div>\n <mat-form-field class=\"fix\" appearance=\"outline\">\n <mat-label [ngStyle]=\"{ color: textColor }\"\n >suffix (optional)</mat-label\n >\n <input\n matInput\n type=\"text\"\n id=\"suffix\"\n formControlName=\"suffix\"\n (keydown.enter)=\"$event.preventDefault()\"\n />\n </mat-form-field>\n </form>\n </div>\n <div class=\"wordlist-container\" *ngIf=\"wordlist$\" fxLayout=\"column\" fxFlex>\n <ng-container *ngIf=\"displayWordlist; else wordlistTooLarge\">\n <h3 class=\"wordlist-header\">Generated wordlist:</h3>\n <code class=\"wordlist\">\n {{ wordlist$ | async }}\n </code></ng-container\n >\n <ng-template #wordlistTooLarge>\n The generated wordlist is too large to be displayed. You can still\n download it.\n </ng-template>\n </div>\n</div>\n", styles: [".meta-container{max-width:100vw}.meta-container .form-container{float:left}.meta-container .form-container .charset-container .drag-indicator{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}.meta-container .form-container .charset{width:18.875em}.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}.meta-container .form-container .generate-wordlist,.meta-container .form-container .download-wordlist{margin:0 0 10px;width:150px}.meta-container .wordlist-container{max-height:80vh}.meta-container .wordlist-container .wordlist-header{margin-top:0}.meta-container .wordlist-container .wordlist{margin-left:1em;overflow-wrap:normal;width:1%}.mat-menu-panel{width:150px}.mat-form-field-appearance-outline .mat-form-field-infix{border:0;padding:1em 0 .5em}.mat-form-field-appearance-outline .mat-form-field-wrapper{padding-bottom:.25em}.mat-form-field-label{transition:none!important}.mat-form-field-should-float .mat-form-field-label-wrapper{top:-.1em;padding-top:.1em}.mat-form-field-should-float .mat-form-field-label{transition:none!important}.fix{width:21em}\n"] }]
197
+ }], ctorParameters: function () { return [{ type: i1.FormBuilder }, { type: WordlistGeneratorService }]; }, propDecorators: { buttonColor: [{
198
+ type: Input
199
+ }], textColor: [{
200
+ type: Input
201
+ }] } });
202
+
203
+ class WordlistGeneratorModule {
204
+ }
205
+ WordlistGeneratorModule.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.1.0", ngImport: i0, type: WordlistGeneratorModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
206
+ WordlistGeneratorModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "12.0.0", version: "13.1.0", ngImport: i0, type: WordlistGeneratorModule, declarations: [WordlistGeneratorComponent], imports: [CommonModule,
207
+ BrowserModule,
208
+ BrowserAnimationsModule,
209
+ DragDropModule,
210
+ ReactiveFormsModule,
211
+ ClipboardModule,
212
+ MatIconModule,
213
+ MatInputModule,
214
+ MatMenuModule,
215
+ MatButtonModule], exports: [WordlistGeneratorComponent] });
216
+ WordlistGeneratorModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "13.1.0", ngImport: i0, type: WordlistGeneratorModule, providers: [WordlistGeneratorService], imports: [[
217
+ CommonModule,
218
+ BrowserModule,
219
+ BrowserAnimationsModule,
220
+ DragDropModule,
221
+ ReactiveFormsModule,
222
+ ClipboardModule,
223
+ MatIconModule,
224
+ MatInputModule,
225
+ MatMenuModule,
226
+ MatButtonModule
227
+ ]] });
228
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.1.0", ngImport: i0, type: WordlistGeneratorModule, decorators: [{
229
+ type: NgModule,
230
+ args: [{
231
+ declarations: [WordlistGeneratorComponent],
232
+ imports: [
233
+ CommonModule,
234
+ BrowserModule,
235
+ BrowserAnimationsModule,
236
+ DragDropModule,
237
+ ReactiveFormsModule,
238
+ ClipboardModule,
239
+ MatIconModule,
240
+ MatInputModule,
241
+ MatMenuModule,
242
+ MatButtonModule
243
+ ],
244
+ exports: [WordlistGeneratorComponent],
245
+ providers: [WordlistGeneratorService]
246
+ }]
247
+ }] });
248
+
249
+ /**
250
+ * Generated bundle index. Do not edit.
251
+ */
252
+
253
+ export { WordlistGeneratorComponent, WordlistGeneratorModule };
254
+ //# sourceMappingURL=tehw0lf-wordlist-generator.mjs.map