@thecodeblogs/blog 0.11.6 → 0.13.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/esm2020/lib/components/entry-creator/entry-creator.component.mjs +347 -0
- package/esm2020/lib/components/entry-renderer/entry-renderer.component.mjs +108 -0
- package/esm2020/lib/components/entry-renderer-wrapper/entry-renderer-wrapper.component.mjs +75 -0
- package/esm2020/lib/components/entry-selector-dialog/entry-selector-dialog-data.mjs +3 -0
- package/esm2020/lib/components/entry-selector-dialog/entry-selector-dialog.component.mjs +45 -0
- package/esm2020/lib/components/entry-summary/entry-summary.component.mjs +28 -0
- package/esm2020/lib/components/json-renderer/json-renderer.component.mjs +26 -0
- package/esm2020/lib/components/landing-page/landing-page.component.mjs +35 -0
- package/esm2020/lib/components/main/main.component.mjs +56 -0
- package/esm2020/lib/components/media-upload-modal/media-upload-modal.component.mjs +160 -0
- package/esm2020/lib/components/outline-view/outline-view.component.mjs +40 -0
- package/esm2020/lib/components/schedule-publish-dialog/schedule-publish-dialog-data.mjs +3 -0
- package/esm2020/lib/components/schedule-publish-dialog/schedule-publish-dialog.component.mjs +33 -0
- package/esm2020/lib/components/side-navigation/side-navigation.component.mjs +151 -0
- package/esm2020/lib/components/static-html/static-html.component.mjs +28 -0
- package/esm2020/lib/core.module.mjs +207 -0
- package/esm2020/lib/data/base.mjs +7 -0
- package/esm2020/lib/data/content-type.mjs +10 -0
- package/esm2020/lib/data/content.mjs +5 -0
- package/esm2020/lib/data/core-event-type.enum.mjs +7 -0
- package/esm2020/lib/data/core-event.mjs +7 -0
- package/esm2020/lib/data/entry.mjs +80 -0
- package/esm2020/lib/data/guid.mjs +12 -0
- package/esm2020/lib/data/identity.mjs +2 -0
- package/esm2020/lib/data/list-response.mjs +3 -0
- package/esm2020/lib/data/section.mjs +11 -0
- package/esm2020/lib/data/tag.mjs +7 -0
- package/esm2020/lib/data/visitor-profile.mjs +3 -0
- package/esm2020/lib/pipes/LinkyPipe.mjs +15 -0
- package/esm2020/lib/pipes/TimeAgoPipe.mjs +100 -0
- package/esm2020/lib/routing/routes.mjs +25 -0
- package/esm2020/lib/services/analytics/interaction.service.mjs +20 -0
- package/esm2020/lib/services/analytics/view.service.mjs +20 -0
- package/esm2020/lib/services/comment.service.mjs +28 -0
- package/esm2020/lib/services/django-rest-framework-endpoint.service.mjs +50 -0
- package/esm2020/lib/services/entry.service.mjs +73 -0
- package/esm2020/lib/services/identity.service.mjs +20 -0
- package/esm2020/lib/services/interaction.mjs +3 -0
- package/esm2020/lib/services/prism.service.mjs +39 -0
- package/esm2020/lib/services/static-html.service.mjs +22 -0
- package/esm2020/lib/services/tag.service.mjs +33 -0
- package/esm2020/lib/services/upload.mjs +3 -0
- package/esm2020/lib/services/upload.service.mjs +22 -0
- package/esm2020/lib/services/view.mjs +3 -0
- package/esm2020/lib/services/visitor-profile.service.mjs +35 -0
- package/esm2020/public-api.mjs +45 -0
- package/esm2020/thecodeblogs-blog.mjs +5 -0
- package/fesm2015/thecodeblogs-blog.mjs +1826 -0
- package/fesm2015/thecodeblogs-blog.mjs.map +1 -0
- package/fesm2020/thecodeblogs-blog.mjs +1820 -0
- package/fesm2020/thecodeblogs-blog.mjs.map +1 -0
- package/lib/components/entry-creator/entry-creator.component.d.ts +3 -0
- package/lib/components/entry-renderer/entry-renderer.component.d.ts +3 -0
- package/lib/components/entry-renderer-wrapper/entry-renderer-wrapper.component.d.ts +3 -0
- package/lib/components/entry-selector-dialog/entry-selector-dialog.component.d.ts +3 -0
- package/lib/components/entry-summary/entry-summary.component.d.ts +3 -0
- package/lib/components/json-renderer/json-renderer.component.d.ts +3 -0
- package/lib/components/landing-page/landing-page.component.d.ts +3 -0
- package/lib/components/main/main.component.d.ts +3 -0
- package/lib/components/media-upload-modal/media-upload-modal.component.d.ts +3 -0
- package/lib/components/outline-view/outline-view.component.d.ts +3 -0
- package/lib/components/schedule-publish-dialog/schedule-publish-dialog.component.d.ts +3 -0
- package/lib/components/side-navigation/side-navigation.component.d.ts +3 -0
- package/lib/components/static-html/static-html.component.d.ts +3 -0
- package/lib/core.module.d.ts +40 -0
- package/lib/pipes/LinkyPipe.d.ts +3 -0
- package/lib/pipes/TimeAgoPipe.d.ts +3 -0
- package/lib/services/analytics/interaction.service.d.ts +3 -0
- package/lib/services/analytics/view.service.d.ts +3 -0
- package/lib/services/comment.service.d.ts +3 -0
- package/lib/services/django-rest-framework-endpoint.service.d.ts +3 -0
- package/lib/services/entry.service.d.ts +3 -0
- package/lib/services/identity.service.d.ts +3 -0
- package/lib/services/prism.service.d.ts +3 -0
- package/lib/services/static-html.service.d.ts +3 -0
- package/lib/services/tag.service.d.ts +3 -0
- package/lib/services/upload.service.d.ts +3 -0
- package/lib/services/visitor-profile.service.d.ts +3 -0
- package/package.json +36 -24
- package/thecodeblogs-blog.d.ts +1 -3
- package/bundles/thecodeblogs-blog.umd.js +0 -2279
- package/bundles/thecodeblogs-blog.umd.js.map +0 -1
- package/bundles/thecodeblogs-blog.umd.min.js +0 -17
- package/bundles/thecodeblogs-blog.umd.min.js.map +0 -1
- package/esm2015/lib/components/entry-creator/entry-creator.component.js +0 -336
- package/esm2015/lib/components/entry-renderer/entry-renderer.component.js +0 -108
- package/esm2015/lib/components/entry-renderer-wrapper/entry-renderer-wrapper.component.js +0 -79
- package/esm2015/lib/components/entry-selector-dialog/entry-selector-dialog-data.js +0 -3
- package/esm2015/lib/components/entry-selector-dialog/entry-selector-dialog.component.js +0 -41
- package/esm2015/lib/components/entry-summary/entry-summary.component.js +0 -29
- package/esm2015/lib/components/json-renderer/json-renderer.component.js +0 -29
- package/esm2015/lib/components/landing-page/landing-page.component.js +0 -37
- package/esm2015/lib/components/main/main.component.js +0 -55
- package/esm2015/lib/components/media-upload-modal/media-upload-modal.component.js +0 -155
- package/esm2015/lib/components/outline-view/outline-view.component.js +0 -40
- package/esm2015/lib/components/schedule-publish-dialog/schedule-publish-dialog-data.js +0 -3
- package/esm2015/lib/components/schedule-publish-dialog/schedule-publish-dialog.component.js +0 -28
- package/esm2015/lib/components/side-navigation/side-navigation.component.js +0 -154
- package/esm2015/lib/components/static-html/static-html.component.js +0 -33
- package/esm2015/lib/core.module.js +0 -125
- package/esm2015/lib/data/base.js +0 -7
- package/esm2015/lib/data/content-type.js +0 -10
- package/esm2015/lib/data/content.js +0 -5
- package/esm2015/lib/data/core-event-type.enum.js +0 -7
- package/esm2015/lib/data/core-event.js +0 -7
- package/esm2015/lib/data/entry.js +0 -80
- package/esm2015/lib/data/guid.js +0 -12
- package/esm2015/lib/data/identity.js +0 -2
- package/esm2015/lib/data/list-response.js +0 -3
- package/esm2015/lib/data/section.js +0 -11
- package/esm2015/lib/data/tag.js +0 -7
- package/esm2015/lib/data/visitor-profile.js +0 -3
- package/esm2015/lib/pipes/LinkyPipe.js +0 -11
- package/esm2015/lib/pipes/TimeAgoPipe.js +0 -100
- package/esm2015/lib/routing/routes.js +0 -25
- package/esm2015/lib/services/analytics/interaction.service.js +0 -22
- package/esm2015/lib/services/analytics/view.service.js +0 -22
- package/esm2015/lib/services/comment.service.js +0 -30
- package/esm2015/lib/services/django-rest-framework-endpoint.service.js +0 -52
- package/esm2015/lib/services/entry.service.js +0 -74
- package/esm2015/lib/services/identity.service.js +0 -22
- package/esm2015/lib/services/interaction.js +0 -3
- package/esm2015/lib/services/prism.service.js +0 -37
- package/esm2015/lib/services/static-html.service.js +0 -24
- package/esm2015/lib/services/tag.service.js +0 -35
- package/esm2015/lib/services/upload.js +0 -3
- package/esm2015/lib/services/upload.service.js +0 -24
- package/esm2015/lib/services/view.js +0 -3
- package/esm2015/lib/services/visitor-profile.service.js +0 -39
- package/esm2015/public-api.js +0 -45
- package/esm2015/thecodeblogs-blog.js +0 -8
- package/fesm2015/thecodeblogs-blog.js +0 -1786
- package/fesm2015/thecodeblogs-blog.js.map +0 -1
- package/thecodeblogs-blog.metadata.json +0 -1
|
@@ -1,336 +0,0 @@
|
|
|
1
|
-
import { COMMA, ENTER, TAB } from '@angular/cdk/keycodes';
|
|
2
|
-
import { ChangeDetectorRef, Component, ViewChild, Input } from '@angular/core';
|
|
3
|
-
import { Entry } from '../../data/entry';
|
|
4
|
-
import { Section } from '../../data/section';
|
|
5
|
-
import { Content } from '../../data/content';
|
|
6
|
-
import { ContentType } from '../../data/content-type';
|
|
7
|
-
import { EntryService } from '../../services/entry.service';
|
|
8
|
-
import { IdentityService } from '../../services/identity.service';
|
|
9
|
-
import { map as loMap, filter } from 'lodash';
|
|
10
|
-
import { MatDialog } from '@angular/material/dialog';
|
|
11
|
-
import { EntrySelectorDialogComponent } from '../../components/entry-selector-dialog/entry-selector-dialog.component';
|
|
12
|
-
import { FileUploader } from 'ng2-file-upload';
|
|
13
|
-
import { MediaUploadModalComponent } from '../../components/media-upload-modal/media-upload-modal.component';
|
|
14
|
-
import { map, startWith } from 'rxjs/operators';
|
|
15
|
-
import { FormControl } from '@angular/forms';
|
|
16
|
-
import { TagService } from '../../services/tag.service';
|
|
17
|
-
const slugify = require('slugify');
|
|
18
|
-
export class EntryCreatorComponent {
|
|
19
|
-
constructor(entryService, tagService, identityService, cdr, dialog) {
|
|
20
|
-
this.entryService = entryService;
|
|
21
|
-
this.tagService = tagService;
|
|
22
|
-
this.identityService = identityService;
|
|
23
|
-
this.cdr = cdr;
|
|
24
|
-
this.dialog = dialog;
|
|
25
|
-
this.ContentType = ContentType;
|
|
26
|
-
this.Object = Object;
|
|
27
|
-
this.entry = new Entry();
|
|
28
|
-
this.separatorKeysCodes = [ENTER, COMMA, TAB];
|
|
29
|
-
this.removable = true;
|
|
30
|
-
this.all_tags = ['Angular', 'Bash', 'MacOS', 'Typescript', 'NPM', 'Databases'];
|
|
31
|
-
this.tagCtrl = new FormControl();
|
|
32
|
-
this.publishDateControl = new FormControl();
|
|
33
|
-
this.selectable = false;
|
|
34
|
-
this.scheduling = false;
|
|
35
|
-
this.customScheduleTime = '';
|
|
36
|
-
this.today = new Date();
|
|
37
|
-
this.allowedMimeTypes = [
|
|
38
|
-
'image/jpeg',
|
|
39
|
-
'image/gif',
|
|
40
|
-
'image/png',
|
|
41
|
-
'image/jpg',
|
|
42
|
-
'video/mp4',
|
|
43
|
-
'video/webm',
|
|
44
|
-
'video/ogg',
|
|
45
|
-
];
|
|
46
|
-
this.uploadUrlKey = 'path_to_file';
|
|
47
|
-
this.uploader = new FileUploader({
|
|
48
|
-
url: '/file_api/uploads/create_image/',
|
|
49
|
-
itemAlias: 'file',
|
|
50
|
-
authToken: '',
|
|
51
|
-
headers: [
|
|
52
|
-
{
|
|
53
|
-
name: 'X-CSRFToken',
|
|
54
|
-
value: EntryCreatorComponent.getCookie('csrftoken')
|
|
55
|
-
},
|
|
56
|
-
],
|
|
57
|
-
additionalParameter: {
|
|
58
|
-
'csrf_token': EntryCreatorComponent.getCookie('csrftoken')
|
|
59
|
-
},
|
|
60
|
-
removeAfterUpload: true,
|
|
61
|
-
allowedMimeType: this.allowedMimeTypes,
|
|
62
|
-
});
|
|
63
|
-
const scheduledDate = new Date();
|
|
64
|
-
this.customScheduleTime = scheduledDate.getHours() + ':' + scheduledDate.getMinutes() + ' AM';
|
|
65
|
-
}
|
|
66
|
-
static getCookie(name) {
|
|
67
|
-
const ca = document.cookie.split(';');
|
|
68
|
-
const caLen = ca.length;
|
|
69
|
-
const cookieName = `${name}=`;
|
|
70
|
-
let c;
|
|
71
|
-
for (let i = 0; i < caLen; i += 1) {
|
|
72
|
-
c = ca[i].replace(/^\s+/g, '');
|
|
73
|
-
if (c.indexOf(cookieName) === 0) {
|
|
74
|
-
return c.substring(cookieName.length, c.length);
|
|
75
|
-
}
|
|
76
|
-
}
|
|
77
|
-
return '';
|
|
78
|
-
}
|
|
79
|
-
_filter(value) {
|
|
80
|
-
const filterValue = value.toLowerCase();
|
|
81
|
-
return this.all_tags.filter(tag => tag.toLowerCase().indexOf(filterValue) === 0);
|
|
82
|
-
}
|
|
83
|
-
add(event) {
|
|
84
|
-
const input = event.input;
|
|
85
|
-
const value = event.value;
|
|
86
|
-
// Add our tag
|
|
87
|
-
if ((value || '').trim()) {
|
|
88
|
-
this.tags.push(value.trim());
|
|
89
|
-
}
|
|
90
|
-
// Reset the input value
|
|
91
|
-
if (input) {
|
|
92
|
-
input.value = '';
|
|
93
|
-
}
|
|
94
|
-
this.tagCtrl.setValue(null);
|
|
95
|
-
this.onChange();
|
|
96
|
-
}
|
|
97
|
-
remove(fruit) {
|
|
98
|
-
const index = this.tags.indexOf(fruit);
|
|
99
|
-
if (index >= 0) {
|
|
100
|
-
this.tags.splice(index, 1);
|
|
101
|
-
}
|
|
102
|
-
this.onChange();
|
|
103
|
-
}
|
|
104
|
-
selected(event) {
|
|
105
|
-
this.tags.push(event.option.viewValue);
|
|
106
|
-
this.tagInput.nativeElement.value = '';
|
|
107
|
-
this.tagCtrl.setValue(null);
|
|
108
|
-
this.onChange();
|
|
109
|
-
}
|
|
110
|
-
refreshTags() {
|
|
111
|
-
this.tagService.get().subscribe((response) => {
|
|
112
|
-
this.all_tags = loMap(response.results, (t) => t.label);
|
|
113
|
-
this.filtered_tags = this.tagCtrl.valueChanges.pipe(startWith(null), map((tag) => tag ? this._filter(tag) : this.all_tags.slice()));
|
|
114
|
-
});
|
|
115
|
-
}
|
|
116
|
-
createNewEntry() {
|
|
117
|
-
this.entry = new Entry();
|
|
118
|
-
this.entry.title = EntryCreatorComponent.DEFAULT_NEW_ENTRY_TITLE;
|
|
119
|
-
this.entry.published = false;
|
|
120
|
-
this.entry.version = 1;
|
|
121
|
-
this.entryService.create(this.entry).subscribe((response) => {
|
|
122
|
-
this.entry = response;
|
|
123
|
-
this.entry.sort();
|
|
124
|
-
setTimeout(() => {
|
|
125
|
-
this.entryService.currentlyEditedEntry.next(this.entry);
|
|
126
|
-
}, 10);
|
|
127
|
-
});
|
|
128
|
-
}
|
|
129
|
-
ngOnInit() {
|
|
130
|
-
this.refreshTags();
|
|
131
|
-
this.identityService.getMe().subscribe((me) => {
|
|
132
|
-
this.me = me;
|
|
133
|
-
});
|
|
134
|
-
const savedEntry = localStorage.getItem(EntryCreatorComponent.CURRENT_ENTRY);
|
|
135
|
-
if (savedEntry) {
|
|
136
|
-
this.entry = new Entry(JSON.parse(savedEntry));
|
|
137
|
-
if (this.entry.should_publish_in_future && this.entry.future_publish_date < new Date()) {
|
|
138
|
-
this.createNewEntry();
|
|
139
|
-
}
|
|
140
|
-
this.entry.sort();
|
|
141
|
-
if (this.entry.should_publish_in_future) {
|
|
142
|
-
// Restore scheduling settings
|
|
143
|
-
this.scheduling = true;
|
|
144
|
-
let hours = this.entry.future_publish_date.getHours();
|
|
145
|
-
let minutes = this.entry.future_publish_date.getMinutes();
|
|
146
|
-
const ampm = hours >= 12 ? 'PM' : 'AM';
|
|
147
|
-
if (hours >= 12) {
|
|
148
|
-
hours = hours % 12;
|
|
149
|
-
hours = hours ? hours : 12;
|
|
150
|
-
}
|
|
151
|
-
minutes = minutes < 10 ? '0' + minutes : minutes;
|
|
152
|
-
this.customScheduleTime = hours + ':' + minutes + ' ' + ampm;
|
|
153
|
-
}
|
|
154
|
-
setTimeout(() => {
|
|
155
|
-
this.entryService.currentlyEditedEntry.next(this.entry);
|
|
156
|
-
}, 10);
|
|
157
|
-
}
|
|
158
|
-
else {
|
|
159
|
-
this.createNewEntry();
|
|
160
|
-
}
|
|
161
|
-
this.uploader.onCompleteItem = (item, response) => {
|
|
162
|
-
// const responseObj = JSON.parse(response)
|
|
163
|
-
// this.uploadId = responseObj.id;
|
|
164
|
-
};
|
|
165
|
-
this.uploader.onWhenAddingFileFailed = (item, uploadFilter, options) => {
|
|
166
|
-
// this.error = 'This file is not a supported mimetype.'
|
|
167
|
-
// this.uploading = false;
|
|
168
|
-
};
|
|
169
|
-
this.tags = this.entry.tags;
|
|
170
|
-
}
|
|
171
|
-
onFileSelected(e) {
|
|
172
|
-
this.uploader.uploadAll();
|
|
173
|
-
}
|
|
174
|
-
startUploader(content) {
|
|
175
|
-
const dialogRef = this.dialog.open(MediaUploadModalComponent, {});
|
|
176
|
-
dialogRef.componentInstance.allowedMimeTypes = this.allowedMimeTypes;
|
|
177
|
-
dialogRef.componentInstance.uploadUrlKey = this.uploadUrlKey;
|
|
178
|
-
dialogRef.afterClosed().subscribe(() => {
|
|
179
|
-
content.value = dialogRef.componentInstance.imgLink;
|
|
180
|
-
content.additional = [];
|
|
181
|
-
content.additional.push({ key: Content.KEY_MIMETYPE, value: dialogRef.componentInstance.mimeType });
|
|
182
|
-
this.onChange();
|
|
183
|
-
});
|
|
184
|
-
}
|
|
185
|
-
addSection() {
|
|
186
|
-
this.entry.sections.push(new Section());
|
|
187
|
-
this.onChange();
|
|
188
|
-
}
|
|
189
|
-
removeSection(section) {
|
|
190
|
-
const remove = confirm('Are you sure you want to remove this section?');
|
|
191
|
-
if (remove) {
|
|
192
|
-
this.entry.sections =
|
|
193
|
-
filter(this.entry.sections, (sct) => sct.id !== section.id);
|
|
194
|
-
this.onChange();
|
|
195
|
-
}
|
|
196
|
-
}
|
|
197
|
-
addContent(section) {
|
|
198
|
-
section.contents.push(new Content());
|
|
199
|
-
this.onChange();
|
|
200
|
-
}
|
|
201
|
-
removeContent(content) {
|
|
202
|
-
const remove = confirm('Are you sure you want to remove this content?');
|
|
203
|
-
if (remove) {
|
|
204
|
-
for (const section of this.entry.sections) {
|
|
205
|
-
section.contents = filter(section.contents, (ct) => ct.id !== content.id);
|
|
206
|
-
}
|
|
207
|
-
this.onChange();
|
|
208
|
-
}
|
|
209
|
-
}
|
|
210
|
-
onChange() {
|
|
211
|
-
this.entry.slug = slugify(this.entry.title).toLowerCase();
|
|
212
|
-
localStorage.setItem(EntryCreatorComponent.CURRENT_ENTRY, JSON.stringify(this.entry));
|
|
213
|
-
this.entry.sort();
|
|
214
|
-
this.cdr.detectChanges();
|
|
215
|
-
this.entryService.currentlyEditedEntry.next(this.entry);
|
|
216
|
-
this.entryService._currentlyEditedEntry = this.entry;
|
|
217
|
-
}
|
|
218
|
-
resetDate() {
|
|
219
|
-
this.entry.create_date = new Date();
|
|
220
|
-
this.entry.edit_date = new Date();
|
|
221
|
-
this.onChange();
|
|
222
|
-
}
|
|
223
|
-
startNew() {
|
|
224
|
-
const finish = confirm('Are you sure your finished? The JSON and entry displayed will be removed. Make sure you have already copied it.');
|
|
225
|
-
if (finish) {
|
|
226
|
-
this.entry = new Entry();
|
|
227
|
-
this.entry.title = EntryCreatorComponent.DEFAULT_NEW_ENTRY_TITLE;
|
|
228
|
-
this.entry.published = false;
|
|
229
|
-
this.entry.version = 1;
|
|
230
|
-
this.entryService.currentlyEditedEntry.next(this.entry);
|
|
231
|
-
localStorage.setItem(EntryCreatorComponent.CURRENT_ENTRY, JSON.stringify(this.entry));
|
|
232
|
-
this.entryService.create(this.entry).subscribe((next) => {
|
|
233
|
-
});
|
|
234
|
-
}
|
|
235
|
-
}
|
|
236
|
-
seeEntries() {
|
|
237
|
-
const dialogRef = this.dialog.open(EntrySelectorDialogComponent, {
|
|
238
|
-
width: '500px',
|
|
239
|
-
data: { name: 'test', animal: 'test' }
|
|
240
|
-
});
|
|
241
|
-
dialogRef.afterClosed().subscribe((id) => {
|
|
242
|
-
if (id) {
|
|
243
|
-
this.entryService.getUnpublishedById(id).subscribe((result) => {
|
|
244
|
-
const entry = result;
|
|
245
|
-
this.entryService.currentlyEditedEntry.next(entry);
|
|
246
|
-
localStorage.setItem(EntryCreatorComponent.CURRENT_ENTRY, JSON.stringify(entry));
|
|
247
|
-
this.entry = entry;
|
|
248
|
-
});
|
|
249
|
-
}
|
|
250
|
-
});
|
|
251
|
-
}
|
|
252
|
-
postPublishCallback() {
|
|
253
|
-
this.entry = new Entry();
|
|
254
|
-
this.entry.title = EntryCreatorComponent.DEFAULT_NEW_ENTRY_TITLE;
|
|
255
|
-
this.entry.published = false;
|
|
256
|
-
this.entry.version = 1;
|
|
257
|
-
this.entryService.currentlyEditedEntry.next(this.entry);
|
|
258
|
-
localStorage.setItem(EntryCreatorComponent.CURRENT_ENTRY, JSON.stringify(this.entry));
|
|
259
|
-
this.entryService.create(this.entry).subscribe((next) => {
|
|
260
|
-
this.tags = [];
|
|
261
|
-
this.refreshTags();
|
|
262
|
-
});
|
|
263
|
-
}
|
|
264
|
-
cancelScheduling() {
|
|
265
|
-
this.entry.future_publish_date = null;
|
|
266
|
-
this.entry.should_publish_in_future = false;
|
|
267
|
-
this.scheduling = false;
|
|
268
|
-
this.onChange();
|
|
269
|
-
}
|
|
270
|
-
exposeScheduling() {
|
|
271
|
-
const scheduledDate = new Date();
|
|
272
|
-
scheduledDate.setDate(scheduledDate.getDate() + 1);
|
|
273
|
-
this.entry.future_publish_date = scheduledDate;
|
|
274
|
-
this.setTime(this.customScheduleTime);
|
|
275
|
-
this.entry.should_publish_in_future = true;
|
|
276
|
-
this.scheduling = true;
|
|
277
|
-
this.onChange();
|
|
278
|
-
}
|
|
279
|
-
publish() {
|
|
280
|
-
const publish = confirm('Are you sure you want to publish? Once an article is published it is available to everyone.');
|
|
281
|
-
if (publish) {
|
|
282
|
-
this.entry.published = true;
|
|
283
|
-
this.entry.publish_date = new Date();
|
|
284
|
-
this.entry.edit_date = new Date();
|
|
285
|
-
this.entryService.updateUnpublishedEntry(this.entry).subscribe(this.postPublishCallback.bind(this));
|
|
286
|
-
}
|
|
287
|
-
}
|
|
288
|
-
delete() {
|
|
289
|
-
const confirmDelete = confirm('Are you sure you want to delete this draft? Once it is deleted it cannot be recovered.');
|
|
290
|
-
if (confirmDelete) {
|
|
291
|
-
this.entryService.delete(this.entry).subscribe(() => {
|
|
292
|
-
this.entry = null;
|
|
293
|
-
});
|
|
294
|
-
}
|
|
295
|
-
}
|
|
296
|
-
onDateChange() {
|
|
297
|
-
this.entry.future_publish_date.setHours(this.hours);
|
|
298
|
-
this.entry.future_publish_date.setMinutes(this.minutes);
|
|
299
|
-
this.onChange();
|
|
300
|
-
}
|
|
301
|
-
setTime(e) {
|
|
302
|
-
const firstTimeSplit = e.split(' ');
|
|
303
|
-
const secondTimeSplit = firstTimeSplit[0].split(':');
|
|
304
|
-
this.hours = Number(secondTimeSplit[0]);
|
|
305
|
-
this.minutes = Number(secondTimeSplit[1]);
|
|
306
|
-
if (firstTimeSplit[1] === 'PM') {
|
|
307
|
-
this.hours = Number(this.hours) + 12;
|
|
308
|
-
}
|
|
309
|
-
this.entry.future_publish_date.setHours(this.hours);
|
|
310
|
-
this.entry.future_publish_date.setMinutes(this.minutes);
|
|
311
|
-
this.onChange();
|
|
312
|
-
}
|
|
313
|
-
}
|
|
314
|
-
EntryCreatorComponent.CURRENT_ENTRY = 'current_entry';
|
|
315
|
-
EntryCreatorComponent.DEFAULT_NEW_ENTRY_TITLE = 'A New Entry';
|
|
316
|
-
EntryCreatorComponent.decorators = [
|
|
317
|
-
{ type: Component, args: [{
|
|
318
|
-
selector: 'app-entry-creator',
|
|
319
|
-
template: "<div class=\"section creator fields\">\n <form #createForm=\"ngForm\" (change)=\"onChange()\" *ngIf=\"this.entry\">\n <div class=\"form-group\">\n <mat-form-field class=\"full-width\">\n <mat-label>Title</mat-label>\n <input matInput\n [(ngModel)]=\"entry.title\"\n name=\"title\">\n </mat-form-field>\n </div>\n <mat-card class=\"form-section tags\">\n <div>\n <mat-form-field class=\"full-width\" hintLabel=\"Use a comma to seperate different tags\">\n <mat-chip-list #tagList aria-label=\"Tags\">\n <mat-chip\n *ngFor=\"let tag of tags\"\n [selectable]=\"selectable\"\n [removable]=\"removable\"\n (removed)=\"remove(tag)\">\n {{tag}}\n <mat-icon matChipRemove *ngIf=\"removable\">cancel</mat-icon>\n </mat-chip>\n <input\n matInput\n placeholder=\"Tags...\"\n #tagInput\n [formControl]=\"tagCtrl\"\n [matAutocomplete]=\"tagauto\"\n [matChipInputFor]=\"tagList\"\n [matChipInputSeparatorKeyCodes]=\"separatorKeysCodes\"\n (matChipInputTokenEnd)=\"add($event)\">\n </mat-chip-list>\n <mat-autocomplete #tagauto=\"matAutocomplete\" (optionSelected)=\"selected($event)\">\n <mat-option *ngFor=\"let tag of filtered_tags | async\" [value]=\"tag\">\n {{tag}}\n </mat-option>\n </mat-autocomplete>\n </mat-form-field>\n </div>\n </mat-card>\n <mat-card class=\"form-section\" *ngFor=\"let section of entry.sections\">\n <div>\n <mat-form-field class=\"full-width\">\n <mat-label>Subheading</mat-label>\n <input matInput\n [(ngModel)]=\"section.subheading\"\n name=\"{{section.id}}-subheading\">\n </mat-form-field>\n <div class=\"form-content\" *ngFor=\"let content of section.contents\">\n <div class=\"form-group\">\n <mat-radio-group\n aria-label=\"Select the Content Type\"\n name=\"{{content.id}}-content-type\"\n class=\"radio-group\"\n [(ngModel)]=\"content.type\">\n <mat-radio-button\n *ngFor=\"let value of Object.values(ContentType)\"\n class=\"radio-button\"\n [value]=\"value\">{{value}}\n </mat-radio-button>\n </mat-radio-group>\n </div>\n <ng-container [ngSwitch]=\"content.type\">\n <ng-container *ngSwitchCase=\"ContentType.URL\">\n <mat-form-field class=\"full-width\">\n <mat-label>Value</mat-label>\n <input\n matInput\n name=\"{{content.id}}-content-value\"\n [(ngModel)]=\"content.value\">\n </mat-form-field>\n <mat-form-field class=\"full-width\">\n <mat-label>Title</mat-label>\n <input\n matInput\n name=\"{{content.id}}-content-title\"\n [(ngModel)]=\"content.title\">\n </mat-form-field>\n </ng-container>\n <ng-container *ngSwitchCase=\"ContentType.TEXT\">\n <mat-form-field class=\"full-width\">\n <mat-label>Value</mat-label>\n <textarea matInput\n cdkTextareaAutosize\n #autosize=\"cdkTextareaAutosize\"\n cdkAutosizeMinRows=\"3\"\n cdkAutosizeMaxRows=\"20\"\n name=\"{{content.id}}-content-value\"\n [(ngModel)]=\"content.value\"\n ></textarea>\n </mat-form-field>\n </ng-container>\n <ng-container *ngSwitchCase=\"ContentType.HTML\">\n <mat-form-field class=\"full-width\">\n <mat-label>Value</mat-label>\n <textarea matInput\n cdkTextareaAutosize\n #autosize=\"cdkTextareaAutosize\"\n cdkAutosizeMinRows=\"3\"\n cdkAutosizeMaxRows=\"20\"\n name=\"{{content.id}}-content-value\"\n [(ngModel)]=\"content.value\"\n ></textarea>\n </mat-form-field>\n </ng-container>\n <ng-container *ngSwitchCase=\"ContentType.CODE\">\n <mat-form-field class=\"full-width\">\n <mat-label>Value</mat-label>\n <textarea matInput\n cdkTextareaAutosize\n #autosize=\"cdkTextareaAutosize\"\n cdkAutosizeMinRows=\"10\"\n cdkAutosizeMaxRows=\"100\"\n name=\"{{content.id}}-content-value\"\n [(ngModel)]=\"content.value\"\n ></textarea>\n </mat-form-field>\n </ng-container>\n <ng-container *ngSwitchCase=\"ContentType.IMAGE\">\n <mat-form-field class=\"full-width\">\n <mat-label>Value</mat-label>\n <input\n matInput\n name=\"{{content.id}}-content-value\"\n [(ngModel)]=\"content.value\">\n </mat-form-field>\n <mat-form-field class=\"full-width\">\n <mat-label>Value</mat-label>\n <input\n matInput\n name=\"{{content.id}}-content-source\"\n [(ngModel)]=\"content.value\">\n </mat-form-field>\n <mat-form-field class=\"full-width\">\n <mat-label>Description</mat-label>\n <input\n matInput\n name=\"{{content.id}}-content-description\"\n [(ngModel)]=\"content.description\">\n </mat-form-field>\n </ng-container>\n <ng-container *ngSwitchCase=\"ContentType.MEDIA\">\n <div class=\"full-width\">\n <ng-container *ngIf=\"content.value\">\n <mat-form-field class=\"full-width\">\n <mat-label>Value</mat-label>\n <input\n matInput\n name=\"{{content.id}}-content-value\"\n [(ngModel)]=\"content.value\">\n </mat-form-field>\n <mat-form-field class=\"full-width\">\n <mat-label>Description</mat-label>\n <input\n matInput\n name=\"{{content.id}}-content-description\"\n [(ngModel)]=\"content.description\">\n </mat-form-field>\n </ng-container>\n <ng-container *ngIf=\"content.additional\">\n <ng-container *ngFor=\"let add of content.additional\">\n <mat-form-field class=\"full-width\">\n <mat-label>{{add.key}}</mat-label>\n <input\n matInput\n name=\"{{content.id}}-content-{{add.key}}\"\n [(ngModel)]=\"add.value\"\n [disabled]=\"true\"\n >\n </mat-form-field>\n </ng-container>\n </ng-container>\n <ng-container *ngIf=\"!content.value\">\n <button mat-raised-button (click)=startUploader(content)>Upload</button>\n </ng-container>\n </div>\n </ng-container>\n </ng-container>\n <button mat-raised-button (click)=removeContent(content)>Remove Content</button>\n <button mat-raised-button (click)=\"addContent(section)\">+ Add Content</button>\n </div>\n <button mat-raised-button (click)=\"removeSection(section)\">Remove Section</button>\n <button mat-raised-button (click)=\"addContent(section)\" *ngIf=\"section.contents.length === 0\">+ Add\n Content\n </button>\n <button mat-raised-button (click)=\"addSection()\">+ Add Section</button>\n </div>\n\n </mat-card>\n <button mat-raised-button (click)=\"addSection()\" *ngIf=\"entry.sections?.length === 0\">+ Add Section</button>\n <button mat-raised-button (click)=\"addSection()\" *ngIf=\"!entry.sections\">+ Add Section</button>\n\n <div class=\"controls\">\n <button mat-raised-button (click)=\"resetDate()\">Reset the Date</button>\n <button mat-raised-button (click)=\"delete()\">Delete</button>\n <button mat-raised-button [disabled]=\"scheduling\" (click)=\"publish()\">Publish</button>\n <button mat-raised-button [disabled]=\"scheduling\" (click)=\"exposeScheduling()\">Schedule</button>\n <button mat-raised-button (click)=\"startNew()\">New</button>\n </div>\n <p *ngIf=\"scheduling\">Publishing is disabled while scheduling is being used.</p>\n\n <mat-card [hidden]=\"!scheduling\">\n <h4>\n Scheduling Options\n </h4>\n\n <div class=\"form-group\">\n <mat-form-field class=\"full-width\">\n <mat-label>Date</mat-label>\n <input\n #futurePublishDate\n matInput\n [matDatepicker]=\"picker\"\n [min]=\"today\"\n (dateInput)=\"onDateChange()\"\n (dateChange)=\"onDateChange()\"\n [(ngModel)]=\"entry.future_publish_date\"\n name=\"future-publish-date\"\n >\n <mat-datepicker-toggle matSuffix [for]=\"picker\"></mat-datepicker-toggle>\n <mat-datepicker\n #picker></mat-datepicker>\n </mat-form-field>\n\n <mat-label>Time</mat-label>\n <ngx-timepicker-field\n [defaultTime]=\"customScheduleTime\"\n [format]=\"12\"\n [buttonAlign]=\"'left'\"\n (timeChanged)=\"setTime($event)\"\n ></ngx-timepicker-field>\n <p>Times are represented in your local time zone</p>\n </div>\n\n <div mat-dialog-actions>\n <div class=\"controls\">\n <button mat-raised-button (click)=\"cancelScheduling()\">Cancel Scheduling</button>\n </div>\n </div>\n <p>This post will be published as soon as its scheduled date and time arrive. No further action is needed by you. If you do not\n want to use scheduling, you can cancel scheduling and manually publish.</p>\n </mat-card>\n </form>\n <div class=\"controls\">\n <button mat-raised-button (click)=\"seeEntries()\">See Entries</button>\n <button *ngIf=\"!this.entry\" mat-raised-button (click)=\"startNew()\">New</button>\n </div>\n</div>\n",
|
|
320
|
-
styles: [".creator{min-height:calc(100vh - 100px)}form{padding:20px}.content{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}button{margin:4px}.radio-group{display:flex;flex-direction:column;margin:15px 0}.radio-button{margin:4px}.full-width{width:100%}.content-card{margin:0 0 10px}.form-section{margin-bottom:10px}.form-content:not(:last-child){border-bottom:1px dotted #aaa;padding-bottom:10px}.controls{display:inline-block;padding:10px;width:100%}[hidden]{display:none!important}"]
|
|
321
|
-
},] }
|
|
322
|
-
];
|
|
323
|
-
EntryCreatorComponent.ctorParameters = () => [
|
|
324
|
-
{ type: EntryService },
|
|
325
|
-
{ type: TagService },
|
|
326
|
-
{ type: IdentityService },
|
|
327
|
-
{ type: ChangeDetectorRef },
|
|
328
|
-
{ type: MatDialog }
|
|
329
|
-
];
|
|
330
|
-
EntryCreatorComponent.propDecorators = {
|
|
331
|
-
tagInput: [{ type: ViewChild, args: ['tagInput',] }],
|
|
332
|
-
matAutocomplete: [{ type: ViewChild, args: ['tagauto',] }],
|
|
333
|
-
allowedMimeTypes: [{ type: Input }],
|
|
334
|
-
uploadUrlKey: [{ type: Input }]
|
|
335
|
-
};
|
|
336
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW50cnktY3JlYXRvci5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiL1VzZXJzL2JqYW1lc29uL0RldmVsb3BtZW50L2Jsb2cvcHJvamVjdHMvY29yZS9zcmMvIiwic291cmNlcyI6WyJsaWIvY29tcG9uZW50cy9lbnRyeS1jcmVhdG9yL2VudHJ5LWNyZWF0b3IuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBQyxLQUFLLEVBQUUsS0FBSyxFQUFFLEdBQUcsRUFBQyxNQUFNLHVCQUF1QixDQUFDO0FBQ3hELE9BQU8sRUFBQyxpQkFBaUIsRUFBRSxTQUFTLEVBQVUsU0FBUyxFQUFvQyxLQUFLLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFFdkgsT0FBTyxFQUFDLEtBQUssRUFBQyxNQUFNLGtCQUFrQixDQUFDO0FBQ3ZDLE9BQU8sRUFBQyxPQUFPLEVBQUMsTUFBTSxvQkFBb0IsQ0FBQztBQUMzQyxPQUFPLEVBQUMsT0FBTyxFQUFDLE1BQU0sb0JBQW9CLENBQUM7QUFDM0MsT0FBTyxFQUFDLFdBQVcsRUFBQyxNQUFNLHlCQUF5QixDQUFDO0FBR3BELE9BQU8sRUFBQyxZQUFZLEVBQUMsTUFBTSw4QkFBOEIsQ0FBQztBQUMxRCxPQUFPLEVBQUMsZUFBZSxFQUFDLE1BQU0saUNBQWlDLENBQUM7QUFFaEUsT0FBTyxFQUFDLEdBQUcsSUFBSSxLQUFLLEVBQUUsTUFBTSxFQUFDLE1BQU0sUUFBUSxDQUFDO0FBQzVDLE9BQU8sRUFBQyxTQUFTLEVBQUMsTUFBTSwwQkFBMEIsQ0FBQztBQUVuRCxPQUFPLEVBQUMsNEJBQTRCLEVBQUMsTUFBTSx3RUFBd0UsQ0FBQztBQUNwSCxPQUFPLEVBQUMsWUFBWSxFQUFDLE1BQU0saUJBQWlCLENBQUM7QUFDN0MsT0FBTyxFQUFDLHlCQUF5QixFQUFDLE1BQU0sa0VBQWtFLENBQUM7QUFFM0csT0FBTyxFQUFDLEdBQUcsRUFBRSxTQUFTLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQztBQUM5QyxPQUFPLEVBQUMsV0FBVyxFQUFDLE1BQU0sZ0JBQWdCLENBQUM7QUFFM0MsT0FBTyxFQUFDLFVBQVUsRUFBQyxNQUFNLDRCQUE0QixDQUFDO0FBRXRELE1BQU0sT0FBTyxHQUFHLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQztBQU9uQyxNQUFNLE9BQU8scUJBQXFCO0lBNkU5QixZQUNZLFlBQTBCLEVBQzFCLFVBQXNCLEVBQ3RCLGVBQWdDLEVBQ2hDLEdBQXNCLEVBQ3RCLE1BQWlCO1FBSmpCLGlCQUFZLEdBQVosWUFBWSxDQUFjO1FBQzFCLGVBQVUsR0FBVixVQUFVLENBQVk7UUFDdEIsb0JBQWUsR0FBZixlQUFlLENBQWlCO1FBQ2hDLFFBQUcsR0FBSCxHQUFHLENBQW1CO1FBQ3RCLFdBQU0sR0FBTixNQUFNLENBQVc7UUE3RTdCLGdCQUFXLEdBQUcsV0FBVyxDQUFDO1FBQzFCLFdBQU0sR0FBRyxNQUFNLENBQUM7UUFFaEIsVUFBSyxHQUFVLElBQUksS0FBSyxFQUFFLENBQUM7UUFHM0IsdUJBQWtCLEdBQWEsQ0FBQyxLQUFLLEVBQUUsS0FBSyxFQUFFLEdBQUcsQ0FBQyxDQUFDO1FBQ25ELGNBQVMsR0FBRyxJQUFJLENBQUM7UUFFakIsYUFBUSxHQUFhLENBQUMsU0FBUyxFQUFFLE1BQU0sRUFBRSxPQUFPLEVBQUUsWUFBWSxFQUFFLEtBQUssRUFBRSxXQUFXLENBQUMsQ0FBQztRQUtwRixZQUFPLEdBQUcsSUFBSSxXQUFXLEVBQUUsQ0FBQztRQUM1Qix1QkFBa0IsR0FBRyxJQUFJLFdBQVcsRUFBRSxDQUFDO1FBR3ZDLGVBQVUsR0FBRyxLQUFLLENBQUM7UUFFbkIsZUFBVSxHQUFHLEtBQUssQ0FBQztRQUNuQix1QkFBa0IsR0FBRyxFQUFFLENBQUM7UUFDeEIsVUFBSyxHQUFHLElBQUksSUFBSSxFQUFFLENBQUM7UUFJVixxQkFBZ0IsR0FBRztZQUNoQixZQUFZO1lBQ1osV0FBVztZQUNYLFdBQVc7WUFDWCxXQUFXO1lBQ1gsV0FBVztZQUNYLFlBQVk7WUFDWixXQUFXO1NBQ3RCLENBQUM7UUFFTyxpQkFBWSxHQUFHLGNBQWMsQ0FBQztRQUVoQyxhQUFRLEdBQWlCLElBQUksWUFBWSxDQUM1QztZQUNJLEdBQUcsRUFBRSxpQ0FBaUM7WUFDdEMsU0FBUyxFQUFFLE1BQU07WUFDakIsU0FBUyxFQUFFLEVBQUU7WUFDYixPQUFPLEVBQUU7Z0JBQ0w7b0JBQ0ksSUFBSSxFQUFFLGFBQWE7b0JBQ25CLEtBQUssRUFBRSxxQkFBcUIsQ0FBQyxTQUFTLENBQUMsV0FBVyxDQUFDO2lCQUN0RDthQUNKO1lBQ0QsbUJBQW1CLEVBQUU7Z0JBQ2pCLFlBQVksRUFBRSxxQkFBcUIsQ0FBQyxTQUFTLENBQUMsV0FBVyxDQUFDO2FBQzdEO1lBQ0QsaUJBQWlCLEVBQUUsSUFBSTtZQUN2QixlQUFlLEVBQUUsSUFBSSxDQUFDLGdCQUFnQjtTQUN6QyxDQUNKLENBQUM7UUF3QkUsTUFBTSxhQUFhLEdBQUcsSUFBSSxJQUFJLEVBQUUsQ0FBQztRQUNqQyxJQUFJLENBQUMsa0JBQWtCLEdBQUcsYUFBYSxDQUFDLFFBQVEsRUFBRSxHQUFHLEdBQUcsR0FBRyxhQUFhLENBQUMsVUFBVSxFQUFFLEdBQUcsS0FBSyxDQUFDO0lBQ2xHLENBQUM7SUF4QkQsTUFBTSxDQUFDLFNBQVMsQ0FBQyxJQUFZO1FBQ3pCLE1BQU0sRUFBRSxHQUFrQixRQUFRLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNyRCxNQUFNLEtBQUssR0FBVyxFQUFFLENBQUMsTUFBTSxDQUFDO1FBQ2hDLE1BQU0sVUFBVSxHQUFHLEdBQUcsSUFBSSxHQUFHLENBQUM7UUFDOUIsSUFBSSxDQUFTLENBQUM7UUFFZCxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsS0FBSyxFQUFFLENBQUMsSUFBSSxDQUFDLEVBQUU7WUFDL0IsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1lBQy9CLElBQUksQ0FBQyxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDLEVBQUU7Z0JBQzdCLE9BQU8sQ0FBQyxDQUFDLFNBQVMsQ0FBQyxVQUFVLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQzthQUNuRDtTQUNKO1FBQ0QsT0FBTyxFQUFFLENBQUM7SUFDZCxDQUFDO0lBYU8sT0FBTyxDQUFDLEtBQWE7UUFDekIsTUFBTSxXQUFXLEdBQUcsS0FBSyxDQUFDLFdBQVcsRUFBRSxDQUFDO1FBQ3hDLE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsV0FBVyxFQUFFLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO0lBQ3JGLENBQUM7SUFFRCxHQUFHLENBQUMsS0FBd0I7UUFDeEIsTUFBTSxLQUFLLEdBQUcsS0FBSyxDQUFDLEtBQUssQ0FBQztRQUMxQixNQUFNLEtBQUssR0FBRyxLQUFLLENBQUMsS0FBSyxDQUFDO1FBRTFCLGNBQWM7UUFDZCxJQUFJLENBQUMsS0FBSyxJQUFJLEVBQUUsQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFO1lBQ3RCLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDO1NBQ2hDO1FBRUQsd0JBQXdCO1FBQ3hCLElBQUksS0FBSyxFQUFFO1lBQ1AsS0FBSyxDQUFDLEtBQUssR0FBRyxFQUFFLENBQUM7U0FDcEI7UUFFRCxJQUFJLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUM1QixJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7SUFDcEIsQ0FBQztJQUVELE1BQU0sQ0FBQyxLQUFhO1FBQ2hCLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBRXZDLElBQUksS0FBSyxJQUFJLENBQUMsRUFBRTtZQUNaLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQztTQUM5QjtRQUNELElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztJQUNwQixDQUFDO0lBRUQsUUFBUSxDQUFDLEtBQW1DO1FBQ3hDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDdkMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxhQUFhLENBQUMsS0FBSyxHQUFHLEVBQUUsQ0FBQztRQUN2QyxJQUFJLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUM1QixJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7SUFDcEIsQ0FBQztJQUVELFdBQVc7UUFDUCxJQUFJLENBQUMsVUFBVSxDQUFDLEdBQUcsRUFBRSxDQUFDLFNBQVMsQ0FBQyxDQUFDLFFBQVEsRUFBRSxFQUFFO1lBQ3pDLElBQUksQ0FBQyxRQUFRLEdBQUcsS0FBSyxDQUFDLFFBQVEsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUN4RCxJQUFJLENBQUMsYUFBYSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsWUFBWSxDQUFDLElBQUksQ0FDL0MsU0FBUyxDQUFDLElBQUksQ0FBQyxFQUNmLEdBQUcsQ0FBQyxDQUFDLEdBQWtCLEVBQUUsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDdEYsQ0FBQyxDQUFDLENBQUM7SUFDUCxDQUFDO0lBRUQsY0FBYztRQUNWLElBQUksQ0FBQyxLQUFLLEdBQUcsSUFBSSxLQUFLLEVBQUUsQ0FBQztRQUN6QixJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssR0FBRyxxQkFBcUIsQ0FBQyx1QkFBdUIsQ0FBQztRQUNqRSxJQUFJLENBQUMsS0FBSyxDQUFDLFNBQVMsR0FBRyxLQUFLLENBQUM7UUFDN0IsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLEdBQUcsQ0FBQyxDQUFDO1FBRXZCLElBQUksQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxRQUFRLEVBQUUsRUFBRTtZQUN4RCxJQUFJLENBQUMsS0FBSyxHQUFHLFFBQVEsQ0FBQztZQUN0QixJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksRUFBRSxDQUFDO1lBQ2xCLFVBQVUsQ0FBQyxHQUFHLEVBQUU7Z0JBQ1osSUFBSSxDQUFDLFlBQVksQ0FBQyxvQkFBb0IsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQzVELENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQztRQUNYLENBQUMsQ0FBQyxDQUFDO0lBQ1AsQ0FBQztJQUVELFFBQVE7UUFDSixJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7UUFDbkIsSUFBSSxDQUFDLGVBQWUsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRTtZQUMxQyxJQUFJLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQztRQUNqQixDQUFDLENBQUMsQ0FBQztRQUVILE1BQU0sVUFBVSxHQUNaLFlBQVksQ0FBQyxPQUFPLENBQUMscUJBQXFCLENBQUMsYUFBYSxDQUFDLENBQUM7UUFFOUQsSUFBSSxVQUFVLEVBQUU7WUFDWixJQUFJLENBQUMsS0FBSyxHQUFHLElBQUksS0FBSyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQztZQUUvQyxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsd0JBQXdCLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxtQkFBbUIsR0FBRyxJQUFJLElBQUksRUFBRSxFQUFFO2dCQUNwRixJQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7YUFDekI7WUFFRCxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksRUFBRSxDQUFDO1lBQ2xCLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyx3QkFBd0IsRUFBRTtnQkFDckMsOEJBQThCO2dCQUM5QixJQUFJLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQztnQkFDdkIsSUFBSSxLQUFLLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxtQkFBbUIsQ0FBQyxRQUFRLEVBQUUsQ0FBQztnQkFDdEQsSUFBSSxPQUFPLEdBQW9CLElBQUksQ0FBQyxLQUFLLENBQUMsbUJBQW1CLENBQUMsVUFBVSxFQUFFLENBQUM7Z0JBQzNFLE1BQU0sSUFBSSxHQUFHLEtBQUssSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO2dCQUN2QyxJQUFJLEtBQUssSUFBSSxFQUFFLEVBQUU7b0JBQ2IsS0FBSyxHQUFHLEtBQUssR0FBRyxFQUFFLENBQUM7b0JBQ25CLEtBQUssR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO2lCQUM5QjtnQkFDRCxPQUFPLEdBQUcsT0FBTyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLE9BQU8sQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDO2dCQUNqRCxJQUFJLENBQUMsa0JBQWtCLEdBQUcsS0FBSyxHQUFHLEdBQUcsR0FBRyxPQUFPLEdBQUcsR0FBRyxHQUFHLElBQUksQ0FBQzthQUNoRTtZQUNELFVBQVUsQ0FBQyxHQUFHLEVBQUU7Z0JBQ1osSUFBSSxDQUFDLFlBQVksQ0FBQyxvQkFBb0IsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQzVELENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQztTQUNWO2FBQU07WUFDSCxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7U0FDekI7UUFFRCxJQUFJLENBQUMsUUFBUSxDQUFDLGNBQWMsR0FBRyxDQUFDLElBQUksRUFBRSxRQUFRLEVBQUUsRUFBRTtZQUM5QywyQ0FBMkM7WUFDM0Msa0NBQWtDO1FBQ3RDLENBQUMsQ0FBQztRQUVGLElBQUksQ0FBQyxRQUFRLENBQUMsc0JBQXNCLEdBQUcsQ0FBQyxJQUFJLEVBQUUsWUFBWSxFQUFFLE9BQU8sRUFBRSxFQUFFO1lBQ25FLHdEQUF3RDtZQUN4RCwwQkFBMEI7UUFDOUIsQ0FBQyxDQUFDO1FBRUYsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQztJQUNoQyxDQUFDO0lBRUQsY0FBYyxDQUFDLENBQUM7UUFDWixJQUFJLENBQUMsUUFBUSxDQUFDLFNBQVMsRUFBRSxDQUFDO0lBQzlCLENBQUM7SUFFRCxhQUFhLENBQUMsT0FBTztRQUNqQixNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyx5QkFBeUIsRUFBRSxFQUM3RCxDQUFDLENBQUM7UUFDSCxTQUFTLENBQUMsaUJBQWlCLENBQUMsZ0JBQWdCLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDO1FBQ3JFLFNBQVMsQ0FBQyxpQkFBaUIsQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQztRQUM3RCxTQUFTLENBQUMsV0FBVyxFQUFFLENBQUMsU0FBUyxDQUFDLEdBQUcsRUFBRTtZQUNuQyxPQUFPLENBQUMsS0FBSyxHQUFHLFNBQVMsQ0FBQyxpQkFBaUIsQ0FBQyxPQUFPLENBQUM7WUFDcEQsT0FBTyxDQUFDLFVBQVUsR0FBRyxFQUFFLENBQUM7WUFDeEIsT0FBTyxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsRUFBQyxHQUFHLEVBQUUsT0FBTyxDQUFDLFlBQVksRUFBRSxLQUFLLEVBQUUsU0FBUyxDQUFDLGlCQUFpQixDQUFDLFFBQVEsRUFBQyxDQUFDLENBQUM7WUFDbEcsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO1FBQ3BCLENBQUMsQ0FBQyxDQUFDO0lBQ1AsQ0FBQztJQUVELFVBQVU7UUFDTixJQUFJLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsSUFBSSxPQUFPLEVBQUUsQ0FBQyxDQUFDO1FBQ3hDLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztJQUNwQixDQUFDO0lBRUQsYUFBYSxDQUFDLE9BQU87UUFDakIsTUFBTSxNQUFNLEdBQUcsT0FBTyxDQUFDLCtDQUErQyxDQUFDLENBQUM7UUFDeEUsSUFBSSxNQUFNLEVBQUU7WUFDUixJQUFJLENBQUMsS0FBSyxDQUFDLFFBQVE7Z0JBQ2YsTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsUUFBUSxFQUFFLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxLQUFLLE9BQU8sQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUNoRSxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7U0FDbkI7SUFDTCxDQUFDO0lBRUQsVUFBVSxDQUFDLE9BQU87UUFDZCxPQUFPLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxJQUFJLE9BQU8sRUFBRSxDQUFDLENBQUM7UUFDckMsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO0lBQ3BCLENBQUM7SUFFRCxhQUFhLENBQUMsT0FBTztRQUNqQixNQUFNLE1BQU0sR0FBRyxPQUFPLENBQUMsK0NBQStDLENBQUMsQ0FBQztRQUV4RSxJQUFJLE1BQU0sRUFBRTtZQUNSLEtBQUssTUFBTSxPQUFPLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxRQUFRLEVBQUU7Z0JBQ3ZDLE9BQU8sQ0FBQyxRQUFRLEdBQUcsTUFBTSxDQUNyQixPQUFPLENBQUMsUUFBUSxFQUNoQixDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsS0FBSyxPQUFPLENBQUMsRUFBRSxDQUMvQixDQUFDO2FBQ0w7WUFDRCxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7U0FDbkI7SUFDTCxDQUFDO0lBRUQsUUFBUTtRQUNKLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDLFdBQVcsRUFBRSxDQUFDO1FBQzFELFlBQVksQ0FBQyxPQUFPLENBQ2hCLHFCQUFxQixDQUFDLGFBQWEsRUFDbkMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQzdCLENBQUM7UUFDRixJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksRUFBRSxDQUFDO1FBQ2xCLElBQUksQ0FBQyxHQUFHLENBQUMsYUFBYSxFQUFFLENBQUM7UUFDekIsSUFBSSxDQUFDLFlBQVksQ0FBQyxvQkFBb0IsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3hELElBQUksQ0FBQyxZQUFZLENBQUMscUJBQXFCLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQztJQUN6RCxDQUFDO0lBRUQsU0FBUztRQUNMLElBQUksQ0FBQyxLQUFLLENBQUMsV0FBVyxHQUFHLElBQUksSUFBSSxFQUFFLENBQUM7UUFDcEMsSUFBSSxDQUFDLEtBQUssQ0FBQyxTQUFTLEdBQUcsSUFBSSxJQUFJLEVBQUUsQ0FBQztRQUVsQyxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7SUFDcEIsQ0FBQztJQUVELFFBQVE7UUFDSixNQUFNLE1BQU0sR0FBRyxPQUFPLENBQUMsaUhBQWlILENBQUMsQ0FBQztRQUMxSSxJQUFJLE1BQU0sRUFBRTtZQUVSLElBQUksQ0FBQyxLQUFLLEdBQUcsSUFBSSxLQUFLLEVBQUUsQ0FBQztZQUN6QixJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssR0FBRyxxQkFBcUIsQ0FBQyx1QkFBdUIsQ0FBQztZQUNqRSxJQUFJLENBQUMsS0FBSyxDQUFDLFNBQVMsR0FBRyxLQUFLLENBQUM7WUFDN0IsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLEdBQUcsQ0FBQyxDQUFDO1lBRXZCLElBQUksQ0FBQyxZQUFZLENBQUMsb0JBQW9CLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUN4RCxZQUFZLENBQUMsT0FBTyxDQUNoQixxQkFBcUIsQ0FBQyxhQUFhLEVBQ25DLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUM3QixDQUFDO1lBQ0YsSUFBSSxDQUFDLFlBQVksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFO1lBQ3hELENBQUMsQ0FBQyxDQUFDO1NBQ047SUFDTCxDQUFDO0lBRUQsVUFBVTtRQUNOLE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLDRCQUE0QixFQUFFO1lBQzdELEtBQUssRUFBRSxPQUFPO1lBQ2QsSUFBSSxFQUFFLEVBQUMsSUFBSSxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFDO1NBQ3ZDLENBQUMsQ0FBQztRQUVILFNBQVMsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRTtZQUNyQyxJQUFJLEVBQUUsRUFBRTtnQkFDSixJQUFJLENBQUMsWUFBWSxDQUFDLGtCQUFrQixDQUFDLEVBQUUsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLE1BQU0sRUFBRSxFQUFFO29CQUMxRCxNQUFNLEtBQUssR0FBRyxNQUFNLENBQUM7b0JBQ3JCLElBQUksQ0FBQyxZQUFZLENBQUMsb0JBQW9CLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO29CQUNuRCxZQUFZLENBQUMsT0FBTyxDQUNoQixxQkFBcUIsQ0FBQyxhQUFhLEVBQ25DLElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLENBQ3hCLENBQUM7b0JBQ0YsSUFBSSxDQUFDLEtBQUssR0FBRyxLQUFLLENBQUM7Z0JBQ3ZCLENBQUMsQ0FBQyxDQUFDO2FBQ047UUFDTCxDQUFDLENBQUMsQ0FBQztJQUNQLENBQUM7SUFFRCxtQkFBbUI7UUFDZixJQUFJLENBQUMsS0FBSyxHQUFHLElBQUksS0FBSyxFQUFFLENBQUM7UUFDekIsSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLEdBQUcscUJBQXFCLENBQUMsdUJBQXVCLENBQUM7UUFDakUsSUFBSSxDQUFDLEtBQUssQ0FBQyxTQUFTLEdBQUcsS0FBSyxDQUFDO1FBQzdCLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxHQUFHLENBQUMsQ0FBQztRQUN2QixJQUFJLENBQUMsWUFBWSxDQUFDLG9CQUFvQixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDeEQsWUFBWSxDQUFDLE9BQU8sQ0FDaEIscUJBQXFCLENBQUMsYUFBYSxFQUNuQyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FDN0IsQ0FBQztRQUNGLElBQUksQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRTtZQUNwRCxJQUFJLENBQUMsSUFBSSxHQUFHLEVBQUUsQ0FBQztZQUNmLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUN2QixDQUFDLENBQUMsQ0FBQztJQUNQLENBQUM7SUFFRCxnQkFBZ0I7UUFDWixJQUFJLENBQUMsS0FBSyxDQUFDLG1CQUFtQixHQUFHLElBQUksQ0FBQztRQUN0QyxJQUFJLENBQUMsS0FBSyxDQUFDLHdCQUF3QixHQUFHLEtBQUssQ0FBQztRQUM1QyxJQUFJLENBQUMsVUFBVSxHQUFHLEtBQUssQ0FBQztRQUN4QixJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7SUFDcEIsQ0FBQztJQUVELGdCQUFnQjtRQUNaLE1BQU0sYUFBYSxHQUFHLElBQUksSUFBSSxFQUFFLENBQUM7UUFDakMsYUFBYSxDQUFDLE9BQU8sQ0FBQyxhQUFhLENBQUMsT0FBTyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUM7UUFFbkQsSUFBSSxDQUFDLEtBQUssQ0FBQyxtQkFBbUIsR0FBRyxhQUFhLENBQUM7UUFDL0MsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsa0JBQWtCLENBQUMsQ0FBQztRQUV0QyxJQUFJLENBQUMsS0FBSyxDQUFDLHdCQUF3QixHQUFHLElBQUksQ0FBQztRQUMzQyxJQUFJLENBQUMsVUFBVSxHQUFJLElBQUksQ0FBQztRQUN4QixJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7SUFDcEIsQ0FBQztJQUNELE9BQU87UUFDSCxNQUFNLE9BQU8sR0FBRyxPQUFPLENBQUMsNkZBQTZGLENBQUMsQ0FBQztRQUN2SCxJQUFJLE9BQU8sRUFBRTtZQUNULElBQUksQ0FBQyxLQUFLLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQztZQUM1QixJQUFJLENBQUMsS0FBSyxDQUFDLFlBQVksR0FBRyxJQUFJLElBQUksRUFBRSxDQUFDO1lBQ3JDLElBQUksQ0FBQyxLQUFLLENBQUMsU0FBUyxHQUFHLElBQUksSUFBSSxFQUFFLENBQUM7WUFDbEMsSUFBSSxDQUFDLFlBQVksQ0FBQyxzQkFBc0IsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztTQUN2RztJQUNMLENBQUM7SUFDRCxNQUFNO1FBQ0YsTUFBTSxhQUFhLEdBQUcsT0FBTyxDQUFDLHdGQUF3RixDQUFDLENBQUM7UUFDeEgsSUFBSSxhQUFhLEVBQUU7WUFDZixJQUFJLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsU0FBUyxDQUFDLEdBQUcsRUFBRTtnQkFDaEQsSUFBSSxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUM7WUFDdEIsQ0FBQyxDQUFDLENBQUM7U0FDTjtJQUNMLENBQUM7SUFDRCxZQUFZO1FBQ1IsSUFBSSxDQUFDLEtBQUssQ0FBQyxtQkFBbUIsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3BELElBQUksQ0FBQyxLQUFLLENBQUMsbUJBQW1CLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUN4RCxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7SUFDcEIsQ0FBQztJQUdELE9BQU8sQ0FBQyxDQUFDO1FBQ0wsTUFBTSxjQUFjLEdBQUcsQ0FBQyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNwQyxNQUFNLGVBQWUsR0FBRyxjQUFjLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ3JELElBQUksQ0FBQyxLQUFLLEdBQUcsTUFBTSxDQUFDLGVBQWUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3hDLElBQUksQ0FBQyxPQUFPLEdBQUcsTUFBTSxDQUFDLGVBQWUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBRTFDLElBQUksY0FBYyxDQUFDLENBQUMsQ0FBQyxLQUFLLElBQUksRUFBRTtZQUM1QixJQUFJLENBQUMsS0FBSyxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsRUFBRSxDQUFDO1NBQ3hDO1FBRUQsSUFBSSxDQUFDLEtBQUssQ0FBQyxtQkFBbUIsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3BELElBQUksQ0FBQyxLQUFLLENBQUMsbUJBQW1CLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUV4RCxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7SUFDcEIsQ0FBQzs7QUE1WE0sbUNBQWEsR0FBRyxlQUFlLENBQUM7QUFDaEMsNkNBQXVCLEdBQUcsYUFBYSxDQUFDOztZQVJsRCxTQUFTLFNBQUM7Z0JBQ1AsUUFBUSxFQUFFLG1CQUFtQjtnQkFDN0IsaXViQUE2Qzs7YUFFaEQ7OztZQXJCTyxZQUFZO1lBYVosVUFBVTtZQVpWLGVBQWU7WUFUZixpQkFBaUI7WUFZakIsU0FBUzs7O3VCQWtDWixTQUFTLFNBQUMsVUFBVTs4QkFDcEIsU0FBUyxTQUFDLFNBQVM7K0JBY25CLEtBQUs7MkJBVUwsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7Q09NTUEsIEVOVEVSLCBUQUJ9IGZyb20gJ0Bhbmd1bGFyL2Nkay9rZXljb2Rlcyc7XG5pbXBvcnQge0NoYW5nZURldGVjdG9yUmVmLCBDb21wb25lbnQsIE9uSW5pdCwgVmlld0NoaWxkLCBFbGVtZW50UmVmLCBFdmVudEVtaXR0ZXIsIE91dHB1dCwgSW5wdXR9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG5pbXBvcnQge0VudHJ5fSBmcm9tICcuLi8uLi9kYXRhL2VudHJ5JztcbmltcG9ydCB7U2VjdGlvbn0gZnJvbSAnLi4vLi4vZGF0YS9zZWN0aW9uJztcbmltcG9ydCB7Q29udGVudH0gZnJvbSAnLi4vLi4vZGF0YS9jb250ZW50JztcbmltcG9ydCB7Q29udGVudFR5cGV9IGZyb20gJy4uLy4uL2RhdGEvY29udGVudC10eXBlJztcbmltcG9ydCB7SWRlbnRpdHl9IGZyb20gJy4uLy4uL2RhdGEvaWRlbnRpdHknO1xuXG5pbXBvcnQge0VudHJ5U2VydmljZX0gZnJvbSAnLi4vLi4vc2VydmljZXMvZW50cnkuc2VydmljZSc7XG5pbXBvcnQge0lkZW50aXR5U2VydmljZX0gZnJvbSAnLi4vLi4vc2VydmljZXMvaWRlbnRpdHkuc2VydmljZSc7XG5cbmltcG9ydCB7bWFwIGFzIGxvTWFwLCBmaWx0ZXJ9IGZyb20gJ2xvZGFzaCc7XG5pbXBvcnQge01hdERpYWxvZ30gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvZGlhbG9nJztcbmltcG9ydCB7TWF0QXV0b2NvbXBsZXRlU2VsZWN0ZWRFdmVudCwgTWF0QXV0b2NvbXBsZXRlfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9hdXRvY29tcGxldGUnO1xuaW1wb3J0IHtFbnRyeVNlbGVjdG9yRGlhbG9nQ29tcG9uZW50fSBmcm9tICcuLi8uLi9jb21wb25lbnRzL2VudHJ5LXNlbGVjdG9yLWRpYWxvZy9lbnRyeS1zZWxlY3Rvci1kaWFsb2cuY29tcG9uZW50JztcbmltcG9ydCB7RmlsZVVwbG9hZGVyfSBmcm9tICduZzItZmlsZS11cGxvYWQnO1xuaW1wb3J0IHtNZWRpYVVwbG9hZE1vZGFsQ29tcG9uZW50fSBmcm9tICcuLi8uLi9jb21wb25lbnRzL21lZGlhLXVwbG9hZC1tb2RhbC9tZWRpYS11cGxvYWQtbW9kYWwuY29tcG9uZW50JztcbmltcG9ydCB7T2JzZXJ2YWJsZX0gZnJvbSAncnhqcyc7XG5pbXBvcnQge21hcCwgc3RhcnRXaXRofSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQge0Zvcm1Db250cm9sfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQge01hdENoaXBJbnB1dEV2ZW50fSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9jaGlwcyc7XG5pbXBvcnQge1RhZ1NlcnZpY2V9IGZyb20gJy4uLy4uL3NlcnZpY2VzL3RhZy5zZXJ2aWNlJztcbmltcG9ydCB7U2NoZWR1bGVQdWJsaXNoRGlhbG9nQ29tcG9uZW50fSBmcm9tICcuLi9zY2hlZHVsZS1wdWJsaXNoLWRpYWxvZy9zY2hlZHVsZS1wdWJsaXNoLWRpYWxvZy5jb21wb25lbnQnO1xuY29uc3Qgc2x1Z2lmeSA9IHJlcXVpcmUoJ3NsdWdpZnknKTtcblxuQENvbXBvbmVudCh7XG4gICAgc2VsZWN0b3I6ICdhcHAtZW50cnktY3JlYXRvcicsXG4gICAgdGVtcGxhdGVVcmw6ICcuL2VudHJ5LWNyZWF0b3IuY29tcG9uZW50Lmh0bWwnLFxuICAgIHN0eWxlVXJsczogWycuL2VudHJ5LWNyZWF0b3IuY29tcG9uZW50LnNjc3MnXVxufSlcbmV4cG9ydCBjbGFzcyBFbnRyeUNyZWF0b3JDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xuXG4gICAgc3RhdGljIENVUlJFTlRfRU5UUlkgPSAnY3VycmVudF9lbnRyeSc7XG4gICAgc3RhdGljIERFRkFVTFRfTkVXX0VOVFJZX1RJVExFID0gJ0EgTmV3IEVudHJ5JztcblxuICAgIENvbnRlbnRUeXBlID0gQ29udGVudFR5cGU7XG4gICAgT2JqZWN0ID0gT2JqZWN0O1xuXG4gICAgZW50cnk6IEVudHJ5ID0gbmV3IEVudHJ5KCk7XG4gICAgbWU6IElkZW50aXR5O1xuXG4gICAgc2VwYXJhdG9yS2V5c0NvZGVzOiBudW1iZXJbXSA9IFtFTlRFUiwgQ09NTUEsIFRBQl07XG4gICAgcmVtb3ZhYmxlID0gdHJ1ZTtcbiAgICB0YWdzOiBzdHJpbmdbXTtcbiAgICBhbGxfdGFnczogc3RyaW5nW10gPSBbJ0FuZ3VsYXInLCAnQmFzaCcsICdNYWNPUycsICdUeXBlc2NyaXB0JywgJ05QTScsICdEYXRhYmFzZXMnXTtcbiAgICBmaWx0ZXJlZF90YWdzOiBPYnNlcnZhYmxlPHN0cmluZ1tdPjtcbiAgICBAVmlld0NoaWxkKCd0YWdJbnB1dCcpIHRhZ0lucHV0OiBFbGVtZW50UmVmPEhUTUxJbnB1dEVsZW1lbnQ+O1xuICAgIEBWaWV3Q2hpbGQoJ3RhZ2F1dG8nKSBtYXRBdXRvY29tcGxldGU6IE1hdEF1dG9jb21wbGV0ZTtcblxuICAgIHRhZ0N0cmwgPSBuZXcgRm9ybUNvbnRyb2woKTtcbiAgICBwdWJsaXNoRGF0ZUNvbnRyb2wgPSBuZXcgRm9ybUNvbnRyb2woKTtcblxuICAgIHRhZ190b19hZGQ6IHN0cmluZztcbiAgICBzZWxlY3RhYmxlID0gZmFsc2U7XG5cbiAgICBzY2hlZHVsaW5nID0gZmFsc2U7XG4gICAgY3VzdG9tU2NoZWR1bGVUaW1lID0gJyc7XG4gICAgdG9kYXkgPSBuZXcgRGF0ZSgpO1xuICAgIGhvdXJzOiBudW1iZXI7XG4gICAgbWludXRlczogbnVtYmVyO1xuXG4gICAgQElucHV0KCkgYWxsb3dlZE1pbWVUeXBlcyA9IFtcbiAgICAgICAgICAgICAgICAnaW1hZ2UvanBlZycsXG4gICAgICAgICAgICAgICAgJ2ltYWdlL2dpZicsXG4gICAgICAgICAgICAgICAgJ2ltYWdlL3BuZycsXG4gICAgICAgICAgICAgICAgJ2ltYWdlL2pwZycsXG4gICAgICAgICAgICAgICAgJ3ZpZGVvL21wNCcsXG4gICAgICAgICAgICAgICAgJ3ZpZGVvL3dlYm0nLFxuICAgICAgICAgICAgICAgICd2aWRlby9vZ2cnLFxuICAgIF07XG5cbiAgICBASW5wdXQoKSB1cGxvYWRVcmxLZXkgPSAncGF0aF90b19maWxlJztcblxuICAgIHB1YmxpYyB1cGxvYWRlcjogRmlsZVVwbG9hZGVyID0gbmV3IEZpbGVVcGxvYWRlcihcbiAgICAgICAge1xuICAgICAgICAgICAgdXJsOiAnL2ZpbGVfYXBpL3VwbG9hZHMvY3JlYXRlX2ltYWdlLycsXG4gICAgICAgICAgICBpdGVtQWxpYXM6ICdmaWxlJyxcbiAgICAgICAgICAgIGF1dGhUb2tlbjogJycsXG4gICAgICAgICAgICBoZWFkZXJzOiBbXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiAnWC1DU1JGVG9rZW4nLFxuICAgICAgICAgICAgICAgICAgICB2YWx1ZTogRW50cnlDcmVhdG9yQ29tcG9uZW50LmdldENvb2tpZSgnY3NyZnRva2VuJylcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIGFkZGl0aW9uYWxQYXJhbWV0ZXI6IHtcbiAgICAgICAgICAgICAgICAnY3NyZl90b2tlbic6IEVudHJ5Q3JlYXRvckNvbXBvbmVudC5nZXRDb29raWUoJ2NzcmZ0b2tlbicpXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgcmVtb3ZlQWZ0ZXJVcGxvYWQ6IHRydWUsXG4gICAgICAgICAgICBhbGxvd2VkTWltZVR5cGU6IHRoaXMuYWxsb3dlZE1pbWVUeXBlcyxcbiAgICAgICAgfVxuICAgICk7XG5cbiAgICBzdGF0aWMgZ2V0Q29va2llKG5hbWU6IHN0cmluZykge1xuICAgICAgICBjb25zdCBjYTogQXJyYXk8c3RyaW5nPiA9IGRvY3VtZW50LmNvb2tpZS5zcGxpdCgnOycpO1xuICAgICAgICBjb25zdCBjYUxlbjogbnVtYmVyID0gY2EubGVuZ3RoO1xuICAgICAgICBjb25zdCBjb29raWVOYW1lID0gYCR7bmFtZX09YDtcbiAgICAgICAgbGV0IGM6IHN0cmluZztcblxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNhTGVuOyBpICs9IDEpIHtcbiAgICAgICAgICAgIGMgPSBjYVtpXS5yZXBsYWNlKC9eXFxzKy9nLCAnJyk7XG4gICAgICAgICAgICBpZiAoYy5pbmRleE9mKGNvb2tpZU5hbWUpID09PSAwKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGMuc3Vic3RyaW5nKGNvb2tpZU5hbWUubGVuZ3RoLCBjLmxlbmd0aCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuICcnO1xuICAgIH1cblxuICAgIGNvbnN0cnVjdG9yKFxuICAgICAgICBwcml2YXRlIGVudHJ5U2VydmljZTogRW50cnlTZXJ2aWNlLFxuICAgICAgICBwcml2YXRlIHRhZ1NlcnZpY2U6IFRhZ1NlcnZpY2UsXG4gICAgICAgIHByaXZhdGUgaWRlbnRpdHlTZXJ2aWNlOiBJZGVudGl0eVNlcnZpY2UsXG4gICAgICAgIHByaXZhdGUgY2RyOiBDaGFuZ2VEZXRlY3RvclJlZixcbiAgICAgICAgcHJpdmF0ZSBkaWFsb2c6IE1hdERpYWxvZyxcbiAgICApIHtcbiAgICAgICAgY29uc3Qgc2NoZWR1bGVkRGF0ZSA9IG5ldyBEYXRlKCk7XG4gICAgICAgIHRoaXMuY3VzdG9tU2NoZWR1bGVUaW1lID0gc2NoZWR1bGVkRGF0ZS5nZXRIb3VycygpICsgJzonICsgc2NoZWR1bGVkRGF0ZS5nZXRNaW51dGVzKCkgKyAnIEFNJztcbiAgICB9XG5cbiAgICBwcml2YXRlIF9maWx0ZXIodmFsdWU6IHN0cmluZyk6IHN0cmluZ1tdIHtcbiAgICAgICAgY29uc3QgZmlsdGVyVmFsdWUgPSB2YWx1ZS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICByZXR1cm4gdGhpcy5hbGxfdGFncy5maWx0ZXIodGFnID0+IHRhZy50b0xvd2VyQ2FzZSgpLmluZGV4T2YoZmlsdGVyVmFsdWUpID09PSAwKTtcbiAgICB9XG5cbiAgICBhZGQoZXZlbnQ6IE1hdENoaXBJbnB1dEV2ZW50KTogdm9pZCB7XG4gICAgICAgIGNvbnN0IGlucHV0ID0gZXZlbnQuaW5wdXQ7XG4gICAgICAgIGNvbnN0IHZhbHVlID0gZXZlbnQudmFsdWU7XG5cbiAgICAgICAgLy8gQWRkIG91ciB0YWdcbiAgICAgICAgaWYgKCh2YWx1ZSB8fCAnJykudHJpbSgpKSB7XG4gICAgICAgICAgICB0aGlzLnRhZ3MucHVzaCh2YWx1ZS50cmltKCkpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gUmVzZXQgdGhlIGlucHV0IHZhbHVlXG4gICAgICAgIGlmIChpbnB1dCkge1xuICAgICAgICAgICAgaW5wdXQudmFsdWUgPSAnJztcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMudGFnQ3RybC5zZXRWYWx1ZShudWxsKTtcbiAgICAgICAgdGhpcy5vbkNoYW5nZSgpO1xuICAgIH1cblxuICAgIHJlbW92ZShmcnVpdDogc3RyaW5nKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IGluZGV4ID0gdGhpcy50YWdzLmluZGV4T2YoZnJ1aXQpO1xuXG4gICAgICAgIGlmIChpbmRleCA+PSAwKSB7XG4gICAgICAgICAgICB0aGlzLnRhZ3Muc3BsaWNlKGluZGV4LCAxKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLm9uQ2hhbmdlKCk7XG4gICAgfVxuXG4gICAgc2VsZWN0ZWQoZXZlbnQ6IE1hdEF1dG9jb21wbGV0ZVNlbGVjdGVkRXZlbnQpOiB2b2lkIHtcbiAgICAgICAgdGhpcy50YWdzLnB1c2goZXZlbnQub3B0aW9uLnZpZXdWYWx1ZSk7XG4gICAgICAgIHRoaXMudGFnSW5wdXQubmF0aXZlRWxlbWVudC52YWx1ZSA9ICcnO1xuICAgICAgICB0aGlzLnRhZ0N0cmwuc2V0VmFsdWUobnVsbCk7XG4gICAgICAgIHRoaXMub25DaGFuZ2UoKTtcbiAgICB9XG5cbiAgICByZWZyZXNoVGFncygpIHtcbiAgICAgICAgdGhpcy50YWdTZXJ2aWNlLmdldCgpLnN1YnNjcmliZSgocmVzcG9uc2UpID0+IHtcbiAgICAgICAgICAgIHRoaXMuYWxsX3RhZ3MgPSBsb01hcChyZXNwb25zZS5yZXN1bHRzLCAodCkgPT4gdC5sYWJlbCk7XG4gICAgICAgICAgICB0aGlzLmZpbHRlcmVkX3RhZ3MgPSB0aGlzLnRhZ0N0cmwudmFsdWVDaGFuZ2VzLnBpcGUoXG4gICAgICAgICAgICAgICAgc3RhcnRXaXRoKG51bGwpLFxuICAgICAgICAgICAgICAgIG1hcCgodGFnOiBzdHJpbmcgfCBudWxsKSA9PiB0YWcgPyB0aGlzLl9maWx0ZXIodGFnKSA6IHRoaXMuYWxsX3RhZ3Muc2xpY2UoKSkpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBjcmVhdGVOZXdFbnRyeSgpIHtcbiAgICAgICAgdGhpcy5lbnRyeSA9IG5ldyBFbnRyeSgpO1xuICAgICAgICB0aGlzLmVudHJ5LnRpdGxlID0gRW50cnlDcmVhdG9yQ29tcG9uZW50LkRFRkFVTFRfTkVXX0VOVFJZX1RJVExFO1xuICAgICAgICB0aGlzLmVudHJ5LnB1Ymxpc2hlZCA9IGZhbHNlO1xuICAgICAgICB0aGlzLmVudHJ5LnZlcnNpb24gPSAxO1xuXG4gICAgICAgIHRoaXMuZW50cnlTZXJ2aWNlLmNyZWF0ZSh0aGlzLmVudHJ5KS5zdWJzY3JpYmUoKHJlc3BvbnNlKSA9PiB7XG4gICAgICAgICAgICB0aGlzLmVudHJ5ID0gcmVzcG9uc2U7XG4gICAgICAgICAgICB0aGlzLmVudHJ5LnNvcnQoKTtcbiAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuZW50cnlTZXJ2aWNlLmN1cnJlbnRseUVkaXRlZEVudHJ5Lm5leHQodGhpcy5lbnRyeSk7XG4gICAgICAgICAgICB9LCAxMCk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIG5nT25Jbml0KCkge1xuICAgICAgICB0aGlzLnJlZnJlc2hUYWdzKCk7XG4gICAgICAgIHRoaXMuaWRlbnRpdHlTZXJ2aWNlLmdldE1lKCkuc3Vic2NyaWJlKChtZSkgPT4ge1xuICAgICAgICAgICAgdGhpcy5tZSA9IG1lO1xuICAgICAgICB9KTtcblxuICAgICAgICBjb25zdCBzYXZlZEVudHJ5ID1cbiAgICAgICAgICAgIGxvY2FsU3RvcmFnZS5nZXRJdGVtKEVudHJ5Q3JlYXRvckNvbXBvbmVudC5DVVJSRU5UX0VOVFJZKTtcblxuICAgICAgICBpZiAoc2F2ZWRFbnRyeSkge1xuICAgICAgICAgICAgdGhpcy5lbnRyeSA9IG5ldyBFbnRyeShKU09OLnBhcnNlKHNhdmVkRW50cnkpKTtcblxuICAgICAgICAgICAgaWYgKHRoaXMuZW50cnkuc2hvdWxkX3B1Ymxpc2hfaW5fZnV0dXJlICYmIHRoaXMuZW50cnkuZnV0dXJlX3B1Ymxpc2hfZGF0ZSA8IG5ldyBEYXRlKCkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmNyZWF0ZU5ld0VudHJ5KCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRoaXMuZW50cnkuc29ydCgpO1xuICAgICAgICAgICAgaWYgKHRoaXMuZW50cnkuc2hvdWxkX3B1Ymxpc2hfaW5fZnV0dXJlKSB7XG4gICAgICAgICAgICAgICAgLy8gUmVzdG9yZSBzY2hlZHVsaW5nIHNldHRpbmdzXG4gICAgICAgICAgICAgICAgdGhpcy5zY2hlZHVsaW5nID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICBsZXQgaG91cnMgPSB0aGlzLmVudHJ5LmZ1dHVyZV9wdWJsaXNoX2RhdGUuZ2V0SG91cnMoKTtcbiAgICAgICAgICAgICAgICBsZXQgbWludXRlczogc3RyaW5nIHwgbnVtYmVyID0gdGhpcy5lbnRyeS5mdXR1cmVfcHVibGlzaF9kYXRlLmdldE1pbnV0ZXMoKTtcbiAgICAgICAgICAgICAgICBjb25zdCBhbXBtID0gaG91cnMgPj0gMTIgPyAnUE0nIDogJ0FNJztcbiAgICAgICAgICAgICAgICBpZiAoaG91cnMgPj0gMTIpIHtcbiAgICAgICAgICAgICAgICAgICAgaG91cnMgPSBob3VycyAlIDEyO1xuICAgICAgICAgICAgICAgICAgICBob3VycyA9IGhvdXJzID8gaG91cnMgOiAxMjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgbWludXRlcyA9IG1pbnV0ZXMgPCAxMCA/ICcwJyArIG1pbnV0ZXMgOiBtaW51dGVzO1xuICAgICAgICAgICAgICAgIHRoaXMuY3VzdG9tU2NoZWR1bGVUaW1lID0gaG91cnMgKyAnOicgKyBtaW51dGVzICsgJyAnICsgYW1wbTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuZW50cnlTZXJ2aWNlLmN1cnJlbnRseUVkaXRlZEVudHJ5Lm5leHQodGhpcy5lbnRyeSk7XG4gICAgICAgICAgICB9LCAxMCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmNyZWF0ZU5ld0VudHJ5KCk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnVwbG9hZGVyLm9uQ29tcGxldGVJdGVtID0gKGl0ZW0sIHJlc3BvbnNlKSA9PiB7XG4gICAgICAgICAgICAvLyBjb25zdCByZXNwb25zZU9iaiA9IEpTT04ucGFyc2UocmVzcG9uc2UpXG4gICAgICAgICAgICAvLyB0aGlzLnVwbG9hZElkID0gcmVzcG9uc2VPYmouaWQ7XG4gICAgICAgIH07XG5cbiAgICAgICAgdGhpcy51cGxvYWRlci5vbldoZW5BZGRpbmdGaWxlRmFpbGVkID0gKGl0ZW0sIHVwbG9hZEZpbHRlciwgb3B0aW9ucykgPT4ge1xuICAgICAgICAgICAgLy8gdGhpcy5lcnJvciA9ICdUaGlzIGZpbGUgaXMgbm90IGEgc3VwcG9ydGVkIG1pbWV0eXBlLidcbiAgICAgICAgICAgIC8vIHRoaXMudXBsb2FkaW5nID0gZmFsc2U7XG4gICAgICAgIH07XG5cbiAgICAgICAgdGhpcy50YWdzID0gdGhpcy5lbnRyeS50YWdzO1xuICAgIH1cblxuICAgIG9uRmlsZVNlbGVjdGVkKGUpIHtcbiAgICAgICAgdGhpcy51cGxvYWRlci51cGxvYWRBbGwoKTtcbiAgICB9XG5cbiAgICBzdGFydFVwbG9hZGVyKGNvbnRlbnQpIHtcbiAgICAgICAgY29uc3QgZGlhbG9nUmVmID0gdGhpcy5kaWFsb2cub3BlbihNZWRpYVVwbG9hZE1vZGFsQ29tcG9uZW50LCB7XG4gICAgICAgIH0pO1xuICAgICAgICBkaWFsb2dSZWYuY29tcG9uZW50SW5zdGFuY2UuYWxsb3dlZE1pbWVUeXBlcyA9IHRoaXMuYWxsb3dlZE1pbWVUeXBlcztcbiAgICAgICAgZGlhbG9nUmVmLmNvbXBvbmVudEluc3RhbmNlLnVwbG9hZFVybEtleSA9IHRoaXMudXBsb2FkVXJsS2V5O1xuICAgICAgICBkaWFsb2dSZWYuYWZ0ZXJDbG9zZWQoKS5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAgICAgY29udGVudC52YWx1ZSA9IGRpYWxvZ1JlZi5jb21wb25lbnRJbnN0YW5jZS5pbWdMaW5rO1xuICAgICAgICAgICAgY29udGVudC5hZGRpdGlvbmFsID0gW107XG4gICAgICAgICAgICBjb250ZW50LmFkZGl0aW9uYWwucHVzaCh7a2V5OiBDb250ZW50LktFWV9NSU1FVFlQRSwgdmFsdWU6IGRpYWxvZ1JlZi5jb21wb25lbnRJbnN0YW5jZS5taW1lVHlwZX0pO1xuICAgICAgICAgICAgdGhpcy5vbkNoYW5nZSgpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBhZGRTZWN0aW9uKCkge1xuICAgICAgICB0aGlzLmVudHJ5LnNlY3Rpb25zLnB1c2gobmV3IFNlY3Rpb24oKSk7XG4gICAgICAgIHRoaXMub25DaGFuZ2UoKTtcbiAgICB9XG5cbiAgICByZW1vdmVTZWN0aW9uKHNlY3Rpb24pIHtcbiAgICAgICAgY29uc3QgcmVtb3ZlID0gY29uZmlybSgnQXJlIHlvdSBzdXJlIHlvdSB3YW50IHRvIHJlbW92ZSB0aGlzIHNlY3Rpb24/Jyk7XG4gICAgICAgIGlmIChyZW1vdmUpIHtcbiAgICAgICAgICAgIHRoaXMuZW50cnkuc2VjdGlvbnMgPVxuICAgICAgICAgICAgICAgIGZpbHRlcih0aGlzLmVudHJ5LnNlY3Rpb25zLCAoc2N0KSA9PiBzY3QuaWQgIT09IHNlY3Rpb24uaWQpO1xuICAgICAgICAgICAgdGhpcy5vbkNoYW5nZSgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgYWRkQ29udGVudChzZWN0aW9uKSB7XG4gICAgICAgIHNlY3Rpb24uY29udGVudHMucHVzaChuZXcgQ29udGVudCgpKTtcbiAgICAgICAgdGhpcy5vbkNoYW5nZSgpO1xuICAgIH1cblxuICAgIHJlbW92ZUNvbnRlbnQoY29udGVudCkge1xuICAgICAgICBjb25zdCByZW1vdmUgPSBjb25maXJtKCdBcmUgeW91IHN1cmUgeW91IHdhbnQgdG8gcmVtb3ZlIHRoaXMgY29udGVudD8nKTtcblxuICAgICAgICBpZiAocmVtb3ZlKSB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IHNlY3Rpb24gb2YgdGhpcy5lbnRyeS5zZWN0aW9ucykge1xuICAgICAgICAgICAgICAgIHNlY3Rpb24uY29udGVudHMgPSBmaWx0ZXIoXG4gICAgICAgICAgICAgICAgICAgIHNlY3Rpb24uY29udGVudHMsXG4gICAgICAgICAgICAgICAgICAgIChjdCkgPT4gY3QuaWQgIT09IGNvbnRlbnQuaWRcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5vbkNoYW5nZSgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgb25DaGFuZ2UoKSB7XG4gICAgICAgIHRoaXMuZW50cnkuc2x1ZyA9IHNsdWdpZnkodGhpcy5lbnRyeS50aXRsZSkudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oXG4gICAgICAgICAgICBFbnRyeUNyZWF0b3JDb21wb25lbnQuQ1VSUkVOVF9FTlRSWSxcbiAgICAgICAgICAgIEpTT04uc3RyaW5naWZ5KHRoaXMuZW50cnkpXG4gICAgICAgICk7XG4gICAgICAgIHRoaXMuZW50cnkuc29ydCgpO1xuICAgICAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgICAgIHRoaXMuZW50cnlTZXJ2aWNlLmN1cnJlbnRseUVkaXRlZEVudHJ5Lm5leHQodGhpcy5lbnRyeSk7XG4gICAgICAgIHRoaXMuZW50cnlTZXJ2aWNlLl9jdXJyZW50bHlFZGl0ZWRFbnRyeSA9IHRoaXMuZW50cnk7XG4gICAgfVxuXG4gICAgcmVzZXREYXRlKCkge1xuICAgICAgICB0aGlzLmVudHJ5LmNyZWF0ZV9kYXRlID0gbmV3IERhdGUoKTtcbiAgICAgICAgdGhpcy5lbnRyeS5lZGl0X2RhdGUgPSBuZXcgRGF0ZSgpO1xuXG4gICAgICAgIHRoaXMub25DaGFuZ2UoKTtcbiAgICB9XG5cbiAgICBzdGFydE5ldygpIHtcbiAgICAgICAgY29uc3QgZmluaXNoID0gY29uZmlybSgnQXJlIHlvdSBzdXJlIHlvdXIgZmluaXNoZWQ/IFRoZSBKU09OIGFuZCBlbnRyeSBkaXNwbGF5ZWQgd2lsbCBiZSByZW1vdmVkLiBNYWtlIHN1cmUgeW91IGhhdmUgYWxyZWFkeSBjb3BpZWQgaXQuJyk7XG4gICAgICAgIGlmIChmaW5pc2gpIHtcblxuICAgICAgICAgICAgdGhpcy5lbnRyeSA9IG5ldyBFbnRyeSgpO1xuICAgICAgICAgICAgdGhpcy5lbnRyeS50aXRsZSA9IEVudHJ5Q3JlYXRvckNvbXBvbmVudC5ERUZBVUxUX05FV19FTlRSWV9USVRMRTtcbiAgICAgICAgICAgIHRoaXMuZW50cnkucHVibGlzaGVkID0gZmFsc2U7XG4gICAgICAgICAgICB0aGlzLmVudHJ5LnZlcnNpb24gPSAxO1xuXG4gICAgICAgICAgICB0aGlzLmVudHJ5U2VydmljZS5jdXJyZW50bHlFZGl0ZWRFbnRyeS5uZXh0KHRoaXMuZW50cnkpO1xuICAgICAgICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oXG4gICAgICAgICAgICAgICAgRW50cnlDcmVhdG9yQ29tcG9uZW50LkNVUlJFTlRfRU5UUlksXG4gICAgICAgICAgICAgICAgSlNPTi5zdHJpbmdpZnkodGhpcy5lbnRyeSlcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICB0aGlzLmVudHJ5U2VydmljZS5jcmVhdGUodGhpcy5lbnRyeSkuc3Vic2NyaWJlKChuZXh0KSA9PiB7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHNlZUVudHJpZXMoKSB7XG4gICAgICAgIGNvbnN0IGRpYWxvZ1JlZiA9IHRoaXMuZGlhbG9nLm9wZW4oRW50cnlTZWxlY3RvckRpYWxvZ0NvbXBvbmVudCwge1xuICAgICAgICAgICAgd2lkdGg6ICc1MDBweCcsXG4gICAgICAgICAgICBkYXRhOiB7bmFtZTogJ3Rlc3QnLCBhbmltYWw6ICd0ZXN0J31cbiAgICAgICAgfSk7XG5cbiAgICAgICAgZGlhbG9nUmVmLmFmdGVyQ2xvc2VkKCkuc3Vic2NyaWJlKChpZCkgPT4ge1xuICAgICAgICAgICAgaWYgKGlkKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5lbnRyeVNlcnZpY2UuZ2V0VW5wdWJsaXNoZWRCeUlkKGlkKS5zdWJzY3JpYmUoKHJlc3VsdCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBlbnRyeSA9IHJlc3VsdDtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5lbnRyeVNlcnZpY2UuY3VycmVudGx5RWRpdGVkRW50cnkubmV4dChlbnRyeSk7XG4gICAgICAgICAgICAgICAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKFxuICAgICAgICAgICAgICAgICAgICAgICAgRW50cnlDcmVhdG9yQ29tcG9uZW50LkNVUlJFTlRfRU5UUlksXG4gICAgICAgICAgICAgICAgICAgICAgICBKU09OLnN0cmluZ2lmeShlbnRyeSlcbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5lbnRyeSA9IGVudHJ5O1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwb3N0UHVibGlzaENhbGxiYWNrKCkge1xuICAgICAgICB0aGlzLmVudHJ5ID0gbmV3IEVudHJ5KCk7XG4gICAgICAgIHRoaXMuZW50cnkudGl0bGUgPSBFbnRyeUNyZWF0b3JDb21wb25lbnQuREVGQVVMVF9ORVdfRU5UUllfVElUTEU7XG4gICAgICAgIHRoaXMuZW50cnkucHVibGlzaGVkID0gZmFsc2U7XG4gICAgICAgIHRoaXMuZW50cnkudmVyc2lvbiA9IDE7XG4gICAgICAgIHRoaXMuZW50cnlTZXJ2aWNlLmN1cnJlbnRseUVkaXRlZEVudHJ5Lm5leHQodGhpcy5lbnRyeSk7XG4gICAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKFxuICAgICAgICAgICAgRW50cnlDcmVhdG9yQ29tcG9uZW50LkNVUlJFTlRfRU5UUlksXG4gICAgICAgICAgICBKU09OLnN0cmluZ2lmeSh0aGlzLmVudHJ5KVxuICAgICAgICApO1xuICAgICAgICB0aGlzLmVudHJ5U2VydmljZS5jcmVhdGUodGhpcy5lbnRyeSkuc3Vic2NyaWJlKChuZXh0KSA9PiB7XG4gICAgICAgICAgICB0aGlzLnRhZ3MgPSBbXTtcbiAgICAgICAgICAgIHRoaXMucmVmcmVzaFRhZ3MoKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgY2FuY2VsU2NoZWR1bGluZygpIHtcbiAgICAgICAgdGhpcy5lbnRyeS5mdXR1cmVfcHVibGlzaF9kYXRlID0gbnVsbDtcbiAgICAgICAgdGhpcy5lbnRyeS5zaG91bGRfcHVibGlzaF9pbl9mdXR1cmUgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5zY2hlZHVsaW5nID0gZmFsc2U7XG4gICAgICAgIHRoaXMub25DaGFuZ2UoKTtcbiAgICB9XG5cbiAgICBleHBvc2VTY2hlZHVsaW5nKCkge1xuICAgICAgICBjb25zdCBzY2hlZHVsZWREYXRlID0gbmV3IERhdGUoKTtcbiAgICAgICAgc2NoZWR1bGVkRGF0ZS5zZXREYXRlKHNjaGVkdWxlZERhdGUuZ2V0RGF0ZSgpICsgMSk7XG5cbiAgICAgICAgdGhpcy5lbnRyeS5mdXR1cmVfcHVibGlzaF9kYXRlID0gc2NoZWR1bGVkRGF0ZTtcbiAgICAgICAgdGhpcy5zZXRUaW1lKHRoaXMuY3VzdG9tU2NoZWR1bGVUaW1lKTtcblxuICAgICAgICB0aGlzLmVudHJ5LnNob3VsZF9wdWJsaXNoX2luX2Z1dHVyZSA9IHRydWU7XG4gICAgICAgIHRoaXMuc2NoZWR1bGluZyA9ICB0cnVlO1xuICAgICAgICB0aGlzLm9uQ2hhbmdlKCk7XG4gICAgfVxuICAgIHB1Ymxpc2goKSB7XG4gICAgICAgIGNvbnN0IHB1Ymxpc2ggPSBjb25maXJtKCdBcmUgeW91IHN1cmUgeW91IHdhbnQgdG8gcHVibGlzaD8gT25jZSBhbiBhcnRpY2xlIGlzIHB1Ymxpc2hlZCBpdCBpcyBhdmFpbGFibGUgdG8gZXZlcnlvbmUuJyk7XG4gICAgICAgIGlmIChwdWJsaXNoKSB7XG4gICAgICAgICAgICB0aGlzLmVudHJ5LnB1Ymxpc2hlZCA9IHRydWU7XG4gICAgICAgICAgICB0aGlzLmVudHJ5LnB1Ymxpc2hfZGF0ZSA9IG5ldyBEYXRlKCk7XG4gICAgICAgICAgICB0aGlzLmVudHJ5LmVkaXRfZGF0ZSA9IG5ldyBEYXRlKCk7XG4gICAgICAgICAgICB0aGlzLmVudHJ5U2VydmljZS51cGRhdGVVbnB1Ymxpc2hlZEVudHJ5KHRoaXMuZW50cnkpLnN1YnNjcmliZSh0aGlzLnBvc3RQdWJsaXNoQ2FsbGJhY2suYmluZCh0aGlzKSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZGVsZXRlKCkge1xuICAgICAgICBjb25zdCBjb25maXJtRGVsZXRlID0gY29uZmlybSgnQXJlIHlvdSBzdXJlIHlvdSB3YW50IHRvIGRlbGV0ZSB0aGlzIGRyYWZ0PyBPbmNlIGl0IGlzIGRlbGV0ZWQgaXQgY2Fubm90IGJlIHJlY292ZXJlZC4nKTtcbiAgICAgICAgaWYgKGNvbmZpcm1EZWxldGUpIHtcbiAgICAgICAgICAgIHRoaXMuZW50cnlTZXJ2aWNlLmRlbGV0ZSh0aGlzLmVudHJ5KS5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuZW50cnkgPSBudWxsO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgb25EYXRlQ2hhbmdlKCkge1xuICAgICAgICB0aGlzLmVudHJ5LmZ1dHVyZV9wdWJsaXNoX2RhdGUuc2V0SG91cnModGhpcy5ob3Vycyk7XG4gICAgICAgIHRoaXMuZW50cnkuZnV0dXJlX3B1Ymxpc2hfZGF0ZS5zZXRNaW51dGVzKHRoaXMubWludXRlcyk7XG4gICAgICAgIHRoaXMub25DaGFuZ2UoKTtcbiAgICB9XG5cblxuICAgIHNldFRpbWUoZSkge1xuICAgICAgICBjb25zdCBmaXJzdFRpbWVTcGxpdCA9IGUuc3BsaXQoJyAnKTtcbiAgICAgICAgY29uc3Qgc2Vjb25kVGltZVNwbGl0ID0gZmlyc3RUaW1lU3BsaXRbMF0uc3BsaXQoJzonKTtcbiAgICAgICAgdGhpcy5ob3VycyA9IE51bWJlcihzZWNvbmRUaW1lU3BsaXRbMF0pO1xuICAgICAgICB0aGlzLm1pbnV0ZXMgPSBOdW1iZXIoc2Vjb25kVGltZVNwbGl0WzFdKTtcblxuICAgICAgICBpZiAoZmlyc3RUaW1lU3BsaXRbMV0gPT09ICdQTScpIHtcbiAgICAgICAgICAgIHRoaXMuaG91cnMgPSBOdW1iZXIodGhpcy5ob3VycykgKyAxMjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuZW50cnkuZnV0dXJlX3B1Ymxpc2hfZGF0ZS5zZXRIb3Vycyh0aGlzLmhvdXJzKTtcbiAgICAgICAgdGhpcy5lbnRyeS5mdXR1cmVfcHVibGlzaF9kYXRlLnNldE1pbnV0ZXModGhpcy5taW51dGVzKTtcblxuICAgICAgICB0aGlzLm9uQ2hhbmdlKCk7XG4gICAgfVxufVxuIl19
|
|
@@ -1,108 +0,0 @@
|
|
|
1
|
-
import { Component, Input, NgZone } from '@angular/core';
|
|
2
|
-
import { Router } from '@angular/router';
|
|
3
|
-
import { Content } from '../../data/content';
|
|
4
|
-
import { ContentType } from '../../data/content-type';
|
|
5
|
-
import { IdentityService } from '../../services/identity.service';
|
|
6
|
-
import { EntryService } from '../../services/entry.service';
|
|
7
|
-
import { CommentService } from '../../services/comment.service';
|
|
8
|
-
import { PrismService } from '../../services/prism.service';
|
|
9
|
-
import { EntryCreatorComponent } from '../../components/entry-creator/entry-creator.component';
|
|
10
|
-
export class EntryRendererComponent {
|
|
11
|
-
constructor(prismService, ngZone, identityService, commentService, router, entryService) {
|
|
12
|
-
this.prismService = prismService;
|
|
13
|
-
this.ngZone = ngZone;
|
|
14
|
-
this.identityService = identityService;
|
|
15
|
-
this.commentService = commentService;
|
|
16
|
-
this.router = router;
|
|
17
|
-
this.entryService = entryService;
|
|
18
|
-
this.ContentType = ContentType;
|
|
19
|
-
this.comments = [];
|
|
20
|
-
this.commentText = '';
|
|
21
|
-
this.alert = alert;
|
|
22
|
-
this.editMode = false;
|
|
23
|
-
}
|
|
24
|
-
ngOnInit() {
|
|
25
|
-
this.identityService.getMe().subscribe((me) => {
|
|
26
|
-
this.me = me;
|
|
27
|
-
});
|
|
28
|
-
this.commentService.getComments(this.entry.id).subscribe((response) => {
|
|
29
|
-
this.comments = response.results;
|
|
30
|
-
for (const comment of this.comments) {
|
|
31
|
-
comment.date_obj = new Date(comment.created_on);
|
|
32
|
-
}
|
|
33
|
-
});
|
|
34
|
-
}
|
|
35
|
-
ngAfterViewChecked() {
|
|
36
|
-
if (!this.editMode) {
|
|
37
|
-
this.ngZone.runOutsideAngular(() => {
|
|
38
|
-
try {
|
|
39
|
-
this.prismService.highlightAll();
|
|
40
|
-
}
|
|
41
|
-
catch (e) {
|
|
42
|
-
}
|
|
43
|
-
});
|
|
44
|
-
}
|
|
45
|
-
}
|
|
46
|
-
edit(entry) {
|
|
47
|
-
entry.version++;
|
|
48
|
-
entry.published = false;
|
|
49
|
-
delete entry.publish_date;
|
|
50
|
-
this.entryService.create(entry).subscribe((response) => {
|
|
51
|
-
localStorage.setItem(EntryCreatorComponent.CURRENT_ENTRY, JSON.stringify(response));
|
|
52
|
-
this.router.navigateByUrl('create(left-col:create//right-col:create)').then(() => {
|
|
53
|
-
});
|
|
54
|
-
});
|
|
55
|
-
}
|
|
56
|
-
postComment(e) {
|
|
57
|
-
e.preventDefault();
|
|
58
|
-
if (this.commentText !== '') {
|
|
59
|
-
this.commentService.postComment({ entry: this.entry.id, content: this.commentText }).subscribe((comment) => {
|
|
60
|
-
this.comments.push(comment);
|
|
61
|
-
});
|
|
62
|
-
this.commentText = '';
|
|
63
|
-
}
|
|
64
|
-
}
|
|
65
|
-
mediaIsZip(content) {
|
|
66
|
-
let mediaIsZip = false;
|
|
67
|
-
if (content.additional) {
|
|
68
|
-
for (const add of content.additional) {
|
|
69
|
-
if (add.key === Content.KEY_MIMETYPE) {
|
|
70
|
-
if (add.value === 'application/zip') {
|
|
71
|
-
mediaIsZip = true;
|
|
72
|
-
}
|
|
73
|
-
}
|
|
74
|
-
}
|
|
75
|
-
}
|
|
76
|
-
return mediaIsZip;
|
|
77
|
-
}
|
|
78
|
-
approve(comment) {
|
|
79
|
-
comment.approved = !comment.approved;
|
|
80
|
-
this.commentService.patchComment(Object.assign({}, { approved: true }, comment)).subscribe((rComment) => {
|
|
81
|
-
});
|
|
82
|
-
}
|
|
83
|
-
unapprove(comment) {
|
|
84
|
-
comment.approved = !comment.approved;
|
|
85
|
-
this.commentService.patchComment(Object.assign({}, { approved: false }, comment)).subscribe((rComment) => {
|
|
86
|
-
});
|
|
87
|
-
}
|
|
88
|
-
}
|
|
89
|
-
EntryRendererComponent.decorators = [
|
|
90
|
-
{ type: Component, args: [{
|
|
91
|
-
selector: 'app-entry-renderer',
|
|
92
|
-
template: "<div>\n <h2>{{entry?.title}}</h2>\n <a *ngIf=\"me?.id === entry?.getProp('author_id')\" href=\"javascript:void(0)\" (click)=\"edit(entry)\"><h4>[Edit]</h4></a>\n <h3>Posted {{entry?.create_date.toString() | timeAgo}} on {{entry?.create_date?.getMonth() + 1}}/{{entry?.create_date?.getDate()}}/{{entry?.create_date?.getFullYear()}}</h3>\n <h5 *ngIf=\"entry?.showEditInformation()\">Article was last edited {{entry?.edit_date.toString() | timeAgo}}</h5>\n <br>\n <p *ngIf=\"entry?.tags?.length > 0\">Tags: <span *ngFor=\"let tag of entry?.tags; let last = last\">{{tag}}<ng-container *ngIf=\"!last\"> |\n </ng-container></span><span *ngIf=\"entry?.views\">, {{entry._friendly_views}} views</span></p>\n <br>\n\n <ng-container *ngFor=\"let section of entry?.sections\">\n <h4>{{section?.subheading}}</h4>\n <ng-container *ngFor=\"let content of section?.contents\">\n <ng-container [ngSwitch]=\"content.type\">\n <ng-container *ngSwitchCase=\"ContentType.CODE\">\n <pre><code class=\"language-ts\">{{content?.value}}</code></pre>\n </ng-container>\n <ng-container *ngSwitchCase=\"ContentType.URL\">\n <a [href]=\"content?.value\" target=\"_blank\">{{content.title}}</a><br>\n </ng-container>\n <ng-container *ngSwitchCase=\"ContentType.IMAGE\">\n <div class=\"restrict\">\n <div class=\"image\">\n <img [src]=\"content?.value\"/>\n </div>\n <div class=\"description\" *ngIf=\"content?.description\">{{content?.description}}</div>\n <div class=\"source\" *ngIf=\"content?.source\">\n <a [href]=\"content?.source\" [target]=\"'_blank'\">Source: {{content?.source}}</a>\n </div>\n </div>\n </ng-container>\n\n <ng-container *ngSwitchCase=\"ContentType.MEDIA\">\n <ng-container *ngIf=\"mediaIsZip(content)\">\n <div class=\"download\">\n <a href=\"content?.value\">{{content?.description}}</a>\n </div>\n </ng-container>\n <ng-container *ngIf=\"!mediaIsZip(content)\">\n <div class=\"restrict\">\n <div class=\"image\">\n <img [src]=\"content?.value\"/>\n </div>\n <div class=\"description\" *ngIf=\"content?.description\">{{content?.description}}</div>\n <div class=\"source\" *ngIf=\"content?.source\">\n <a [href]=\"content?.source\" [target]=\"'_blank'\">Source: {{content?.source}}</a>\n </div>\n </div>\n </ng-container>\n </ng-container>\n <ng-container *ngSwitchCase=\"ContentType.HTML\">\n <app-static-html\n [value]=\"content?.value\"\n >\n </app-static-html>\n </ng-container>\n <ng-container *ngSwitchDefault>\n <p>{{content?.value}}</p>\n </ng-container>\n </ng-container>\n </ng-container>\n </ng-container>\n <ng-container>\n <h2>Comments</h2>\n <p *ngIf=\"comments?.length == 0\">There are no comments yet.</p>\n <ng-container *ngIf=\"comments?.length > 0\">\n <div *ngFor=\"let comment of comments\">\n <mat-card style=\"margin-bottom: 20px;\" class=\"restrict\">\n <mat-card-title><img class=\"gravatar\" src=\"{{comment.gravatar_url}} + ?s=30\"> {{comment.user_display_name}}</mat-card-title>\n <mat-card-subtitle>{{comment.date_obj | timeAgo}}</mat-card-subtitle>\n <mat-card-content>\n <p>{{comment.content}}</p>\n <ng-container *ngIf=\"me?.id === entry?.__server_generated_properties?.author_id\">\n <a href=\"javascript:void(0);\" *ngIf=\"!comment?.approved\" (click)=\"approve(comment)\">Approve</a>\n <a href=\"javascript:void(0);\" *ngIf=\"comment?.approved\" (click)=\"unapprove(comment)\">Unapprove</a>\n </ng-container>\n </mat-card-content>\n </mat-card>\n </div>\n </ng-container>\n </ng-container>\n <ng-container *ngIf=\"!me\">\n <a href=\"/signup\">Signup</a> or <a href=\"/login\">login</a> to join the conversation!\n </ng-container>\n <ng-container *ngIf=\"me && !me?.comments_public\">\n <p>Note, your comments will not be public be default. It is possible I will make your comments public, but for now comments are just between you and me.</p>\n </ng-container>\n <ng-container *ngIf=\"me\">\n <h2 style=\"width: 100%;\">Leave a Comment</h2>\n <br>\n <mat-form-field class=\"restrict\" style=\"width: 100%;\" appearance=\"outline\">\n <mat-label>Comment</mat-label>\n <textarea [(ngModel)]=\"commentText\" (keydown.enter)=\"postComment($event)\" matInput></textarea>\n </mat-form-field>\n <br>\n <button (click)=\"postComment($event)\" style=\"text-align: right;\" mat-button>Submit</button>\n </ng-container>\n <div style=\"margin-bottom: 30px;\"></div>\n</div>\n\n",
|
|
93
|
-
styles: [".image{justify-content:center;text-align:center;width:100%}.description,.source{font-size:12px;text-align:center}.gravatar{margin-right:20px}.smaller{text-color:grey;text-size:12px}"]
|
|
94
|
-
},] }
|
|
95
|
-
];
|
|
96
|
-
EntryRendererComponent.ctorParameters = () => [
|
|
97
|
-
{ type: PrismService },
|
|
98
|
-
{ type: NgZone },
|
|
99
|
-
{ type: IdentityService },
|
|
100
|
-
{ type: CommentService },
|
|
101
|
-
{ type: Router },
|
|
102
|
-
{ type: EntryService }
|
|
103
|
-
];
|
|
104
|
-
EntryRendererComponent.propDecorators = {
|
|
105
|
-
entry: [{ type: Input }],
|
|
106
|
-
editMode: [{ type: Input }]
|
|
107
|
-
};
|
|
108
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW50cnktcmVuZGVyZXIuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6Ii9Vc2Vycy9iamFtZXNvbi9EZXZlbG9wbWVudC9ibG9nL3Byb2plY3RzL2NvcmUvc3JjLyIsInNvdXJjZXMiOlsibGliL2NvbXBvbmVudHMvZW50cnktcmVuZGVyZXIvZW50cnktcmVuZGVyZXIuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBbUIsU0FBUyxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQW9CLE1BQU0sZUFBZSxDQUFDO0FBRTVGLE9BQU8sRUFBaUQsTUFBTSxFQUFDLE1BQU0saUJBQWlCLENBQUM7QUFHdkYsT0FBTyxFQUFDLE9BQU8sRUFBQyxNQUFNLG9CQUFvQixDQUFDO0FBQzNDLE9BQU8sRUFBQyxXQUFXLEVBQUMsTUFBTSx5QkFBeUIsQ0FBQztBQUdwRCxPQUFPLEVBQUMsZUFBZSxFQUFDLE1BQU0saUNBQWlDLENBQUM7QUFDaEUsT0FBTyxFQUFDLFlBQVksRUFBQyxNQUFNLDhCQUE4QixDQUFDO0FBQzFELE9BQU8sRUFBQyxjQUFjLEVBQUMsTUFBTSxnQ0FBZ0MsQ0FBQztBQUM5RCxPQUFPLEVBQUMsWUFBWSxFQUFDLE1BQU0sOEJBQThCLENBQUM7QUFHMUQsT0FBTyxFQUFDLHFCQUFxQixFQUFDLE1BQU0sd0RBQXdELENBQUM7QUFPN0YsTUFBTSxPQUFPLHNCQUFzQjtJQWEvQixZQUNZLFlBQTBCLEVBQzFCLE1BQWMsRUFDZCxlQUFnQyxFQUNoQyxjQUE4QixFQUM5QixNQUFjLEVBQ2QsWUFBMEI7UUFMMUIsaUJBQVksR0FBWixZQUFZLENBQWM7UUFDMUIsV0FBTSxHQUFOLE1BQU0sQ0FBUTtRQUNkLG9CQUFlLEdBQWYsZUFBZSxDQUFpQjtRQUNoQyxtQkFBYyxHQUFkLGNBQWMsQ0FBZ0I7UUFDOUIsV0FBTSxHQUFOLE1BQU0sQ0FBUTtRQUNkLGlCQUFZLEdBQVosWUFBWSxDQUFjO1FBZHRDLGdCQUFXLEdBQUcsV0FBVyxD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ckI7aUJBQ0o7YUFDSjtTQUNKO1FBQ0QsT0FBTyxVQUFVLENBQUM7SUFDdEIsQ0FBQztJQUNELE9BQU8sQ0FBQyxPQUFZO1FBQ2hCLE9BQU8sQ0FBQyxRQUFRLEdBQUcsQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDO1FBQ3JDLElBQUksQ0FBQyxjQUFjLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsRUFBRSxFQUFFLEVBQUMsUUFBUSxFQUFFLElBQUksRUFBQyxFQUFFLE9BQU8sQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsUUFBUSxFQUFFLEVBQUU7UUFFdEcsQ0FBQyxDQUFDLENBQUM7SUFDUCxDQUFDO0lBQ0QsU0FBUyxDQUFDLE9BQVk7UUFDbEIsT0FBTyxDQUFDLFFBQVEsR0FBRyxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUM7UUFDckMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxFQUFFLEVBQUUsRUFBQyxRQUFRLEVBQUUsS0FBSyxFQUFDLEVBQUUsT0FBTyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxRQUFRLEVBQUUsRUFBRTtRQUV2RyxDQUFDLENBQUMsQ0FBQztJQUNQLENBQUM7OztZQWpHSixTQUFTLFNBQUM7Z0JBQ1AsUUFBUSxFQUFFLG9CQUFvQjtnQkFDOUIsMmpMQUE4Qzs7YUFFakQ7OztZQVRPLFlBQVk7WUFad0IsTUFBTTtZQVMxQyxlQUFlO1lBRWYsY0FBYztZQVRrQyxNQUFNO1lBUXRELFlBQVk7OztvQkFlZixLQUFLO3VCQVFMLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge0FmdGVyVmlld0NoZWNrZWQsIENvbXBvbmVudCwgSW5wdXQsIE5nWm9uZSwgT25EZXN0cm95LCBPbkluaXR9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtvcmRlckJ5fSBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IHtBY3RpdmF0ZWRSb3V0ZSwgTmF2aWdhdGlvbkVuZCwgTmF2aWdhdGlvblN0YXJ0LCBSb3V0ZXJ9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XG5cbmltcG9ydCB7RW50cnl9IGZyb20gJy4uLy4uL2RhdGEvZW50cnknO1xuaW1wb3J0IHtDb250ZW50fSBmcm9tICcuLi8uLi9kYXRhL2NvbnRlbnQnO1xuaW1wb3J0IHtDb250ZW50VHlwZX0gZnJvbSAnLi4vLi4vZGF0YS9jb250ZW50LXR5cGUnO1xuaW1wb3J0IHtJZGVudGl0eX0gZnJvbSAnLi4vLi4vZGF0YS9pZGVudGl0eSc7XG5cbmltcG9ydCB7SWRlbnRpdHlTZXJ2aWNlfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9pZGVudGl0eS5zZXJ2aWNlJztcbmltcG9ydCB7RW50cnlTZXJ2aWNlfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9lbnRyeS5zZXJ2aWNlJztcbmltcG9ydCB7Q29tbWVudFNlcnZpY2V9IGZyb20gJy4uLy4uL3NlcnZpY2VzL2NvbW1lbnQuc2VydmljZSc7XG5pbXBvcnQge1ByaXNtU2VydmljZX0gZnJvbSAnLi4vLi4vc2VydmljZXMvcHJpc20uc2VydmljZSc7XG5cblxuaW1wb3J0IHtFbnRyeUNyZWF0b3JDb21wb25lbnR9IGZyb20gJy4uLy4uL2NvbXBvbmVudHMvZW50cnktY3JlYXRvci9lbnRyeS1jcmVhdG9yLmNvbXBvbmVudCc7XG5cbkBDb21wb25lbnQoe1xuICAgIHNlbGVjdG9yOiAnYXBwLWVudHJ5LXJlbmRlcmVyJyxcbiAgICB0ZW1wbGF0ZVVybDogJy4vZW50cnktcmVuZGVyZXIuY29tcG9uZW50Lmh0bWwnLFxuICAgIHN0eWxlVXJsczogWycuL2VudHJ5LXJlbmRlcmVyLmNvbXBvbmVudC5zY3NzJ11cbn0pXG5leHBvcnQgY2xhc3MgRW50cnlSZW5kZXJlckNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgQWZ0ZXJWaWV3Q2hlY2tlZCB7XG5cbiAgICBtZTogSWRlbnRpdHk7XG4gICAgQElucHV0KCkgZW50cnk6IEVudHJ5O1xuXG4gICAgQ29udGVudFR5cGUgPSBDb250ZW50VHlwZTtcbiAgICBjb21tZW50cyA9IFtdO1xuICAgIGNvbW1lbnRUZXh0ID0gJyc7XG5cbiAgICBhbGVydCA9IGFsZXJ0O1xuXG4gICAgQElucHV0KCkgZWRpdE1vZGUgPSBmYWxzZTtcblxuICAgIGNvbnN0cnVjdG9yKFxuICAgICAgICBwcml2YXRlIHByaXNtU2VydmljZTogUHJpc21TZXJ2aWNlLFxuICAgICAgICBwcml2YXRlIG5nWm9uZTogTmdab25lLFxuICAgICAgICBwcml2YXRlIGlkZW50aXR5U2VydmljZTogSWRlbnRpdHlTZXJ2aWNlLFxuICAgICAgICBwcml2YXRlIGNvbW1lbnRTZXJ2aWNlOiBDb21tZW50U2VydmljZSxcbiAgICAgICAgcHJpdmF0ZSByb3V0ZXI6IFJvdXRlcixcbiAgICAgICAgcHJpdmF0ZSBlbnRyeVNlcnZpY2U6IEVudHJ5U2VydmljZSxcbiAgICApIHtcbiAgICB9XG5cblxuICAgIG5nT25Jbml0KCkge1xuICAgICAgICB0aGlzLmlkZW50aXR5U2VydmljZS5nZXRNZSgpLnN1YnNjcmliZSgobWUpID0+IHtcbiAgICAgICAgICAgIHRoaXMubWUgPSBtZTtcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuY29tbWVudFNlcnZpY2UuZ2V0Q29tbWVudHModGhpcy5lbnRyeS5pZCkuc3Vic2NyaWJlKChyZXNwb25zZSkgPT4ge1xuICAgICAgICAgICAgdGhpcy5jb21tZW50cyA9IChyZXNwb25zZSBhcyBhbnkpLnJlc3VsdHM7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGNvbW1lbnQgb2YgdGhpcy5jb21tZW50cykge1xuICAgICAgICAgICAgICAgIGNvbW1lbnQuZGF0ZV9vYmogPSBuZXcgRGF0ZShjb21tZW50LmNyZWF0ZWRfb24pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBuZ0FmdGVyVmlld0NoZWNrZWQoKTogdm9pZCB7XG4gICAgICAgIGlmICghdGhpcy5lZGl0TW9kZSkge1xuICAgICAgICAgICAgdGhpcy5uZ1pvbmUucnVuT3V0c2lkZUFuZ3VsYXIoKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucHJpc21TZXJ2aWNlLmhpZ2hsaWdodEFsbCgpO1xuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcblxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxuICAgIGVkaXQoZW50cnk6IEVudHJ5KSB7XG4gICAgICAgIGVudHJ5LnZlcnNpb24rKztcbiAgICAgICAgZW50cnkucHVibGlzaGVkID0gZmFsc2U7XG4gICAgICAgIGRlbGV0ZSBlbnRyeS5wdWJsaXNoX2RhdGU7XG5cbiAgICAgICAgdGhpcy5lbnRyeVNlcnZpY2UuY3JlYXRlKGVudHJ5KS5zdWJzY3JpYmUoKHJlc3BvbnNlKSA9PiB7XG4gICAgICAgICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbShFbnRyeUNyZWF0b3JDb21wb25lbnQuQ1VSUkVOVF9FTlRSWSwgSlNPTi5zdHJpbmdpZnkocmVzcG9uc2UpKTtcbiAgICAgICAgICAgIHRoaXMucm91dGVyLm5hdmlnYXRlQnlVcmwoJ2NyZWF0ZShsZWZ0LWNvbDpjcmVhdGUvL3JpZ2h0LWNvbDpjcmVhdGUpJykudGhlbigoKSA9PiB7XG5cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgcG9zdENvbW1lbnQoZSkge1xuICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIGlmICh0aGlzLmNvbW1lbnRUZXh0ICE9PSAnJykge1xuICAgICAgICAgICAgdGhpcy5jb21tZW50U2VydmljZS5wb3N0Q29tbWVudCh7ZW50cnk6IHRoaXMuZW50cnkuaWQsIGNvbnRlbnQ6IHRoaXMuY29tbWVudFRleHR9KS5zdWJzY3JpYmUoKGNvbW1lbnQpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLmNvbW1lbnRzLnB1c2goY29tbWVudCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHRoaXMuY29tbWVudFRleHQgPSAnJztcbiAgICAgICAgfVxuICAgIH1cbiAgICBtZWRpYUlzWmlwKGNvbnRlbnQ6IENvbnRlbnQpOiBib29sZWFuIHtcbiAgICAgICAgbGV0IG1lZGlhSXNaaXAgPSBmYWxzZTtcbiAgICAgICAgaWYgKGNvbnRlbnQuYWRkaXRpb25hbCkge1xuICAgICAgICAgICAgZm9yIChjb25zdCBhZGQgb2YgY29udGVudC5hZGRpdGlvbmFsKSB7XG4gICAgICAgICAgICAgICAgaWYgKGFkZC5rZXkgPT09IENvbnRlbnQuS0VZX01JTUVUWVBFKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChhZGQudmFsdWUgPT09ICdhcHBsaWNhdGlvbi96aXAnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBtZWRpYUlzWmlwID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbWVkaWFJc1ppcDtcbiAgICB9XG4gICAgYXBwcm92ZShjb21tZW50OiBhbnkpIHtcbiAgICAgICAgY29tbWVudC5hcHByb3ZlZCA9ICFjb21tZW50LmFwcHJvdmVkO1xuICAgICAgICB0aGlzLmNvbW1lbnRTZXJ2aWNlLnBhdGNoQ29tbWVudChPYmplY3QuYXNzaWduKHt9LCB7YXBwcm92ZWQ6IHRydWV9LCBjb21tZW50KSkuc3Vic2NyaWJlKChyQ29tbWVudCkgPT4ge1xuXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICB1bmFwcHJvdmUoY29tbWVudDogYW55KSB7XG4gICAgICAgIGNvbW1lbnQuYXBwcm92ZWQgPSAhY29tbWVudC5hcHByb3ZlZDtcbiAgICAgICAgdGhpcy5jb21tZW50U2VydmljZS5wYXRjaENvbW1lbnQoT2JqZWN0LmFzc2lnbih7fSwge2FwcHJvdmVkOiBmYWxzZX0sIGNvbW1lbnQpKS5zdWJzY3JpYmUoKHJDb21tZW50KSA9PiB7XG5cbiAgICAgICAgfSk7XG4gICAgfVxufVxuIl19
|