cloud-ide-layout 1.0.8 → 1.0.10

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.
Files changed (83) hide show
  1. package/README.md +34 -448
  2. package/fesm2022/{cloud-ide-layout-cloud-ide-layout-D3xzVSNA.mjs → cloud-ide-layout-cloud-ide-layout-DLceZY3Y.mjs} +335 -343
  3. package/fesm2022/{cloud-ide-layout-cloud-ide-layout-D3xzVSNA.mjs.map → cloud-ide-layout-cloud-ide-layout-DLceZY3Y.mjs.map} +1 -1
  4. package/fesm2022/{cloud-ide-layout-drawer-theme.component-BSUFE_o2.mjs → cloud-ide-layout-drawer-theme.component-Bn5--C_Q.mjs} +69 -67
  5. package/fesm2022/{cloud-ide-layout-drawer-theme.component-BSUFE_o2.mjs.map → cloud-ide-layout-drawer-theme.component-Bn5--C_Q.mjs.map} +1 -1
  6. package/fesm2022/{cloud-ide-layout-home-wrapper.component-Dr4MO4MB.mjs → cloud-ide-layout-home-wrapper.component-Bo-4LNLx.mjs} +56 -51
  7. package/fesm2022/{cloud-ide-layout-home-wrapper.component-Dr4MO4MB.mjs.map → cloud-ide-layout-home-wrapper.component-Bo-4LNLx.mjs.map} +1 -1
  8. package/fesm2022/{cloud-ide-layout-sidedrawer-notes.component-BWx03JYS.mjs → cloud-ide-layout-sidedrawer-notes.component-BmadMzdl.mjs} +28 -32
  9. package/fesm2022/{cloud-ide-layout-sidedrawer-notes.component-BWx03JYS.mjs.map → cloud-ide-layout-sidedrawer-notes.component-BmadMzdl.mjs.map} +1 -1
  10. package/fesm2022/cloud-ide-layout.mjs +1 -1
  11. package/index.d.ts +579 -3
  12. package/package.json +4 -6
  13. package/esm2022/cloud-ide-layout.mjs +0 -5
  14. package/esm2022/lib/cloud-ide-layout.component.mjs +0 -16
  15. package/esm2022/lib/cloud-ide-layout.routes.mjs +0 -28
  16. package/esm2022/lib/cloud-ide-layout.service.mjs +0 -14
  17. package/esm2022/lib/layout/console/console-wrapper/console-wrapper.component.mjs +0 -11
  18. package/esm2022/lib/layout/console/console.service.mjs +0 -28
  19. package/esm2022/lib/layout/footer/footer-wrapper/footer-wrapper.component.mjs +0 -20
  20. package/esm2022/lib/layout/footer/footer.service.mjs +0 -28
  21. package/esm2022/lib/layout/header/header-wrapper/header-wrapper.component.mjs +0 -84
  22. package/esm2022/lib/layout/header/header.service.mjs +0 -28
  23. package/esm2022/lib/layout/home/home-wrapper/home-wrapper.component.mjs +0 -198
  24. package/esm2022/lib/layout/layout/layout-wrapper/layout-wrapper.component.mjs +0 -28
  25. package/esm2022/lib/layout/request/request-wrapper/request-wrapper.component.mjs +0 -60
  26. package/esm2022/lib/layout/request/request.service.mjs +0 -235
  27. package/esm2022/lib/layout/request/tab-content/tab-content.component.mjs +0 -84
  28. package/esm2022/lib/layout/shared/shared-wrapper/shared-wrapper.component.mjs +0 -49
  29. package/esm2022/lib/layout/shared/shared.service.mjs +0 -508
  30. package/esm2022/lib/layout/sidebar/sidebar-wrapper/sidebar-wrapper.component.mjs +0 -488
  31. package/esm2022/lib/layout/sidebar/sidebar.service.mjs +0 -35
  32. package/esm2022/lib/layout/sidedrawer/cide-lyt-drawer-base.class.mjs +0 -40
  33. package/esm2022/lib/layout/sidedrawer/drawer-theme/drawer-theme.component.mjs +0 -296
  34. package/esm2022/lib/layout/sidedrawer/sidedrawer-notes/sidedrawer-notes.component.mjs +0 -175
  35. package/esm2022/lib/layout/sidedrawer/sidedrawer-notes/sidedrawer-notes.service.mjs +0 -51
  36. package/esm2022/lib/layout/sidedrawer/sidedrawer-wrapper/sidedrawer-wrapper.component.mjs +0 -257
  37. package/esm2022/lib/layout/sidedrawer/sidedrawer.service.mjs +0 -70
  38. package/esm2022/lib/services/app-state/app-state-helper.service.mjs +0 -222
  39. package/esm2022/lib/services/app-state/app-state.service.mjs +0 -256
  40. package/esm2022/lib/services/app-state/index.mjs +0 -3
  41. package/esm2022/lib/services/cache-manager/cache-manager.service.mjs +0 -112
  42. package/esm2022/lib/services/file-manager/file-manager.service.mjs +0 -21
  43. package/esm2022/lib/services/tab-state.service.mjs +0 -128
  44. package/esm2022/lib/services/theme/theme.service.mjs +0 -151
  45. package/esm2022/lib/services/user-status/user-status.service.mjs +0 -135
  46. package/esm2022/lib/utils/custom-route-reuse-strategy.mjs +0 -61
  47. package/esm2022/lib/utils/index.mjs +0 -2
  48. package/esm2022/public-api.mjs +0 -18
  49. package/lib/cloud-ide-layout.component.d.ts +0 -5
  50. package/lib/cloud-ide-layout.routes.d.ts +0 -3
  51. package/lib/cloud-ide-layout.service.d.ts +0 -6
  52. package/lib/layout/console/console-wrapper/console-wrapper.component.d.ts +0 -5
  53. package/lib/layout/console/console.service.d.ts +0 -9
  54. package/lib/layout/footer/footer-wrapper/footer-wrapper.component.d.ts +0 -9
  55. package/lib/layout/footer/footer.service.d.ts +0 -9
  56. package/lib/layout/header/header-wrapper/header-wrapper.component.d.ts +0 -25
  57. package/lib/layout/header/header.service.d.ts +0 -9
  58. package/lib/layout/home/home-wrapper/home-wrapper.component.d.ts +0 -94
  59. package/lib/layout/layout/layout-wrapper/layout-wrapper.component.d.ts +0 -5
  60. package/lib/layout/request/request-wrapper/request-wrapper.component.d.ts +0 -14
  61. package/lib/layout/request/request.service.d.ts +0 -60
  62. package/lib/layout/request/tab-content/tab-content.component.d.ts +0 -19
  63. package/lib/layout/shared/shared-wrapper/shared-wrapper.component.d.ts +0 -17
  64. package/lib/layout/shared/shared.service.d.ts +0 -114
  65. package/lib/layout/sidebar/sidebar-wrapper/sidebar-wrapper.component.d.ts +0 -140
  66. package/lib/layout/sidebar/sidebar.service.d.ts +0 -12
  67. package/lib/layout/sidedrawer/cide-lyt-drawer-base.class.d.ts +0 -16
  68. package/lib/layout/sidedrawer/drawer-theme/drawer-theme.component.d.ts +0 -71
  69. package/lib/layout/sidedrawer/sidedrawer-notes/sidedrawer-notes.component.d.ts +0 -48
  70. package/lib/layout/sidedrawer/sidedrawer-notes/sidedrawer-notes.service.d.ts +0 -13
  71. package/lib/layout/sidedrawer/sidedrawer-wrapper/sidedrawer-wrapper.component.d.ts +0 -30
  72. package/lib/layout/sidedrawer/sidedrawer.service.d.ts +0 -30
  73. package/lib/services/app-state/app-state-helper.service.d.ts +0 -150
  74. package/lib/services/app-state/app-state.service.d.ts +0 -85
  75. package/lib/services/app-state/index.d.ts +0 -3
  76. package/lib/services/cache-manager/cache-manager.service.d.ts +0 -64
  77. package/lib/services/file-manager/file-manager.service.d.ts +0 -9
  78. package/lib/services/tab-state.service.d.ts +0 -79
  79. package/lib/services/theme/theme.service.d.ts +0 -71
  80. package/lib/services/user-status/user-status.service.d.ts +0 -57
  81. package/lib/utils/custom-route-reuse-strategy.d.ts +0 -15
  82. package/lib/utils/index.d.ts +0 -1
  83. package/public-api.d.ts +0 -12
@@ -1,175 +0,0 @@
1
- import { CommonModule } from '@angular/common';
2
- import { Component, inject, signal } from '@angular/core';
3
- import { ReactiveFormsModule, FormBuilder } from '@angular/forms';
4
- import { CideLytDrawerNotesService } from './sidedrawer-notes.service';
5
- import { CideInputComponent } from 'cloud-ide-element';
6
- import { CideEleButtonComponent } from 'cloud-ide-element';
7
- import { CideTextareaComponent } from 'cloud-ide-element';
8
- import { AppStateHelperService } from '../../../services/app-state/app-state-helper.service';
9
- import { CideLytDrawerBase } from '../cide-lyt-drawer-base.class';
10
- import * as i0 from "@angular/core";
11
- import * as i1 from "@angular/common";
12
- import * as i2 from "@angular/forms";
13
- export class CideLytSidedrawerNotesComponent extends CideLytDrawerBase {
14
- constructor() {
15
- super(...arguments);
16
- this.notesSignal = signal([]);
17
- this.notes = this.notesSignal.asReadonly();
18
- this.isFormVisible = false;
19
- this.isEditing = false;
20
- this.editingNoteId = null;
21
- this.hoveredNoteIndex = null;
22
- this.notesService = inject(CideLytDrawerNotesService);
23
- this.fb = inject(FormBuilder);
24
- this.appState = inject(AppStateHelperService);
25
- }
26
- ngOnInit() {
27
- super.ngOnInit();
28
- this.initForm();
29
- this.notesService.getNotes().subscribe({
30
- next: (notes) => {
31
- this.notesSignal.set(notes);
32
- },
33
- error: (error) => {
34
- console.error('Error loading notes:', error);
35
- }
36
- });
37
- }
38
- afterContextInit() {
39
- // Any additional setup after context is ready can go here
40
- }
41
- initForm() {
42
- this.noteForm = this.fb.group({
43
- sypn_title: [''],
44
- sypn_desc: [''],
45
- sypn_is_page_specific: [true],
46
- sypn_is_user_specific: [true],
47
- sypn_is_entity_specific: [false],
48
- sypn_is_theme_specific: [false]
49
- });
50
- }
51
- showAddForm() {
52
- this.isFormVisible = true;
53
- }
54
- hideAddForm() {
55
- this.isFormVisible = false;
56
- this.isEditing = false;
57
- this.editingNoteId = null;
58
- }
59
- startEdit(note) {
60
- this.isEditing = true;
61
- this.editingNoteId = note._id || '';
62
- this.noteForm.patchValue({
63
- sypn_title: note.sypn_title || '',
64
- sypn_desc: note.sypn_desc || '',
65
- sypn_is_page_specific: note.sypn_is_page_specific || false,
66
- sypn_is_user_specific: note.sypn_is_user_specific || false,
67
- sypn_is_entity_specific: note.sypn_is_entity_specific || false,
68
- sypn_is_theme_specific: note.sypn_is_theme_specific || false
69
- });
70
- this.isFormVisible = true;
71
- }
72
- cancelEdit() {
73
- this.isEditing = false;
74
- this.editingNoteId = null;
75
- this.resetForm();
76
- this.isFormVisible = false;
77
- }
78
- onNoteHover(index) {
79
- this.hoveredNoteIndex = index;
80
- }
81
- onNoteLeave() {
82
- this.hoveredNoteIndex = null;
83
- }
84
- onSubmit() {
85
- if (this.noteForm.invalid || !this.noteForm.get('sypn_title')?.value?.trim()) {
86
- return;
87
- }
88
- const formValue = this.noteForm.value;
89
- if (this.isEditing && this.editingNoteId) {
90
- console.log('formValue', this.appState.currentUser());
91
- const noteToUpdate = {
92
- _id: this.editingNoteId,
93
- sypn_title: formValue.sypn_title,
94
- sypn_desc: formValue.sypn_desc,
95
- sypn_page_id_sypg: this.pageId || "",
96
- sypn_user_id_user: this.appState.currentUser()?._id || "",
97
- sypn_entity_id_sype: this.appState.getActiveEntityId() || "",
98
- sypn_page_them_id_sytm: this.themeId || "",
99
- sypn_is_page_specific: formValue.sypn_is_page_specific,
100
- sypn_is_user_specific: formValue.sypn_is_user_specific,
101
- sypn_is_entity_specific: formValue.sypn_is_entity_specific,
102
- sypn_is_theme_specific: formValue.sypn_is_theme_specific,
103
- };
104
- this.notesService.updateNote(noteToUpdate).subscribe({
105
- next: () => {
106
- const currentNotes = this.notesSignal();
107
- const updatedNotes = currentNotes.map((note) => note._id === this.editingNoteId ? noteToUpdate : note);
108
- this.notesSignal.set(updatedNotes);
109
- this.resetForm();
110
- this.isFormVisible = false;
111
- this.isEditing = false;
112
- this.editingNoteId = null;
113
- },
114
- error: (err) => console.error('Failed to update note', err)
115
- });
116
- }
117
- else {
118
- const noteToAdd = {
119
- sypn_title: formValue.sypn_title,
120
- sypn_desc: formValue.sypn_desc,
121
- sypn_page_id_sypg: this.pageId || "",
122
- sypn_user_id_user: this.appState.currentUser()?._id || "",
123
- sypn_entity_id_sype: this.appState.getActiveEntityId() || "",
124
- sypn_page_them_id_sytm: this.themeId || "",
125
- sypn_is_page_specific: formValue.sypn_is_page_specific,
126
- sypn_is_user_specific: formValue.sypn_is_user_specific,
127
- sypn_is_entity_specific: formValue.sypn_is_entity_specific,
128
- sypn_is_theme_specific: formValue.sypn_is_theme_specific,
129
- };
130
- this.notesService.addNote(noteToAdd).subscribe({
131
- next: (response) => {
132
- const responseData = response;
133
- const newNoteWithId = {
134
- ...noteToAdd,
135
- _id: responseData._id || responseData.id || Date.now().toString()
136
- };
137
- const currentNotes = this.notesSignal();
138
- this.notesSignal.set([newNoteWithId, ...currentNotes]);
139
- this.resetForm();
140
- this.isFormVisible = false;
141
- },
142
- error: (err) => console.error('Failed to add note', err)
143
- });
144
- }
145
- }
146
- resetForm() {
147
- this.noteForm.reset({
148
- sypn_title: '',
149
- sypn_desc: '',
150
- sypn_is_page_specific: true,
151
- sypn_is_user_specific: true,
152
- sypn_is_entity_specific: false,
153
- sypn_is_theme_specific: false
154
- });
155
- }
156
- getState() {
157
- return {
158
- newNoteModel: { ...(this.noteForm?.value ? this.noteForm?.value : {}) },
159
- isFormVisible: this.isFormVisible,
160
- };
161
- }
162
- setState(state) {
163
- if (state) {
164
- this.noteForm.patchValue(state.newNoteModel);
165
- this.isFormVisible = state.isFormVisible;
166
- }
167
- }
168
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.7", ngImport: i0, type: CideLytSidedrawerNotesComponent, deps: null, target: i0.ɵɵFactoryTarget.Component }); }
169
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.7", type: CideLytSidedrawerNotesComponent, isStandalone: true, selector: "cide-lyt-sidedrawer-notes", usesInheritance: true, ngImport: i0, template: "<div class=\"tw-relative tw-h-full tw-bg-white tw-overflow-hidden tw-flex tw-flex-col\">\n <!-- FIXED HEADER SECTION (ABSOLUTE POSITIONED) -->\n <div class=\"tw-bg-white tw-border-b tw-border-gray-200\">\n <!-- DYNAMIC HEADING -->\n <div class=\"tw-flex tw-justify-between tw-items-center tw-p-2 tw-bg-white tw-border-b tw-border-gray-200\">\n <h6 class=\"tw-font-semibold tw-text-gray-800\">\n {{ isFormVisible ? (isEditing ? 'Edit Note' : 'Add a New Note') : 'Notes' }}\n </h6>\n <button *ngIf=\"!isFormVisible\" (click)=\"showAddForm()\" cideEleButton variant=\"primary\"\n class=\"tw-p-2 !tw-w-7 !tw-px-0 !tw-rounded-full tw-animate-pulse\" title=\"Add New Note\">\n <!-- Using inline SVG for the plus icon for simplicity -->\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\"\n stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n <line x1=\"12\" y1=\"5\" x2=\"12\" y2=\"19\"></line>\n <line x1=\"5\" y1=\"12\" x2=\"19\" y2=\"12\"></line>\n </svg>\n </button>\n </div>\n\n <!-- ADD NOTE FORM (ANIMATED WRAPPER) -->\n <div class=\"tw-transition-all tw-duration-300 tw-ease-in-out tw-animate-fade-in\" [class.tw-opacity-100]=\"isFormVisible\"\n [class.tw-opacity-0]=\"!isFormVisible\" [class.tw-max-h-0]=\"!isFormVisible\">\n <form [formGroup]=\"noteForm\" (ngSubmit)=\"onSubmit()\" class=\"tw-p-3 tw-space-y-4\" *ngIf=\"isFormVisible\">\n <!-- Title Input -->\n <cide-ele-input name=\"sypn_title\" formControlName=\"sypn_title\" placeholder=\"Note Title\" label=\"Note Title\"\n [required]=\"true\" [type]=\"'text'\" class=\"tw-w-full tw-transition-all tw-duration-200 focus:tw-scale-[1.02]\"></cide-ele-input>\n\n <!-- Description Textarea -->\n <cide-ele-textarea placeholder=\"What's on your mind? (Optional)\" id=\"sypn_desc\" formControlName=\"sypn_desc\"\n rows=\"4\" label=\"Description\" class=\"tw-transition-all tw-duration-200 focus:tw-scale-[1.02]\"></cide-ele-textarea>\n\n <!-- Toggle Switches -->\n <div class=\"tw-grid tw-grid-cols-2 tw-gap-4\">\n <cide-ele-input [type]=\"'checkbox'\" formControlName=\"sypn_is_page_specific\" label=\"Page Specific\"\n class=\"tw-flex tw-items-center tw-space-x-2\"></cide-ele-input>\n\n <cide-ele-input [type]=\"'checkbox'\" formControlName=\"sypn_is_user_specific\" label=\"User Specific\"\n class=\"tw-flex tw-items-center tw-space-x-2\"></cide-ele-input>\n\n <cide-ele-input [type]=\"'checkbox'\" formControlName=\"sypn_is_entity_specific\" label=\"Entity Specific\"\n class=\"tw-flex tw-items-center tw-space-x-2\"></cide-ele-input>\n\n <cide-ele-input [type]=\"'checkbox'\" formControlName=\"sypn_is_theme_specific\" label=\"Theme Specific\"\n class=\"tw-flex tw-items-center tw-space-x-2\"></cide-ele-input>\n </div>\n\n <!-- Action Buttons -->\n <div class=\"tw-flex tw-space-x-3 tw-pt-4\">\n <button cideEleButton size=\"xs\" variant=\"primary\" type=\"submit\" [disabled]=\"noteForm.invalid\">\n {{ isEditing ? 'Update Note' : 'Add Note' }}\n </button>\n <button cideEleButton size=\"xs\" variant=\"secondary\" type=\"button\"\n (click)=\"isEditing ? cancelEdit() : hideAddForm()\">\n {{ isEditing ? 'Cancel Edit' : 'Cancel' }}\n </button>\n </div>\n </form>\n </div>\n </div>\n\n <!-- SCROLLABLE NOTES SECTION (BELOW FIXED HEADER) -->\n <div class=\"tw-overflow-y-auto tw-scroll-smooth notes-scroll-container\">\n <!-- Modern Angular v20 pattern: Use Signals directly -->\n <div class=\"\" *ngIf=\"notes() as notes; else loading\">\n <!-- Show notes if the array is not empty -->\n <div *ngIf=\"notes.length > 0; else noNotes\">\n <div *ngFor=\"let note of notes; let i = index\"\n class=\"tw-bg-white tw-border-b tw-border-gray-200 tw-p-4 tw-shadow-sm hover:tw-shadow-md tw-transition-all tw-duration-300 tw-ease-in-out tw-relative tw-transform hover:tw-translate-y-[-2px] hover:tw-shadow-lg\"\n (mouseenter)=\"onNoteHover(i)\" (mouseleave)=\"onNoteLeave()\">\n <!-- Edit Button (visible on hover) -->\n <button (click)=\"startEdit(note)\" [class.tw-opacity-100]=\"hoveredNoteIndex === i\"\n [class.tw-opacity-0]=\"hoveredNoteIndex !== i\"\n class=\"tw-absolute tw-top-2 tw-right-2 tw-transition-all tw-duration-200 tw-p-1 tw-rounded tw-bg-gray-100 hover:tw-bg-gray-200 hover:tw-scale-110 tw-z-10\"\n title=\"Edit Note\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\"\n stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n <path d=\"M11 4H4a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2v-7\"></path>\n <path d=\"m18.5 2.5 3 3L12 15l-4 1 1-4 9.5-9.5z\"></path>\n </svg>\n </button>\n\n <h6 class=\"tw-font-medium tw-text-gray-900 tw-mb-2 tw-pr-8\">{{ note.sypn_title }}</h6>\n <p class=\"tw-text-gray-600 tw-text-sm tw-mb-3\">{{ note.sypn_desc }}</p>\n <div class=\"tw-flex tw-flex-wrap tw-gap-2\">\n <span *ngIf=\"note.sypn_is_page_specific\"\n class=\"tw-px-2 tw-py-1 tw-bg-blue-100 tw-text-blue-800 tw-text-xs tw-rounded-full tw-transition-all tw-duration-200 hover:tw-scale-105 hover:tw-bg-blue-200\">Page Specific</span>\n <span *ngIf=\"note.sypn_is_user_specific\"\n class=\"tw-px-2 tw-py-1 tw-bg-green-100 tw-text-green-800 tw-text-xs tw-rounded-full tw-transition-all tw-duration-200 hover:tw-scale-105 hover:tw-bg-green-200\">User Specific</span>\n <span *ngIf=\"note.sypn_is_entity_specific\"\n class=\"tw-px-2 tw-py-1 tw-bg-purple-100 tw-text-purple-800 tw-text-xs tw-rounded-full tw-transition-all tw-duration-200 hover:tw-scale-105 hover:tw-bg-purple-200\">Entity\n Specific</span>\n <span *ngIf=\"note.sypn_is_theme_specific\"\n class=\"tw-px-2 tw-py-1 tw-bg-orange-100 tw-text-orange-800 tw-text-xs tw-rounded-full tw-transition-all tw-duration-200 hover:tw-scale-105 hover:tw-bg-orange-200\">Theme\n Specific</span>\n </div>\n <!-- <p class=\"note-date\">{{ note.createdAt | date:'short' }}</p> -->\n </div>\n </div>\n </div>\n\n <!-- Template to show when there are no notes -->\n <ng-template #noNotes>\n <div class=\"tw-flex tw-flex-col tw-items-center tw-justify-center tw-p-8 tw-text-center\">\n <div class=\"tw-w-12 tw-h-12 tw-bg-gray-100 tw-rounded-full tw-flex tw-items-center tw-justify-center tw-mb-4 tw-animate-bounce\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\"\n stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"\n class=\"tw-text-gray-400\">\n <path d=\"M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z\"></path>\n <polyline points=\"14,2 14,8 20,8\"></polyline>\n <line x1=\"16\" y1=\"13\" x2=\"8\" y2=\"13\"></line>\n <line x1=\"16\" y1=\"17\" x2=\"8\" y2=\"17\"></line>\n <polyline points=\"10,9 9,9 8,9\"></polyline>\n </svg>\n </div>\n <p class=\"tw-text-gray-500 tw-mb-2\">No notes found.</p>\n <p class=\"tw-text-sm tw-text-gray-400\">Click the '+' to add one!</p>\n </div>\n </ng-template>\n\n <!-- Template to show while notes are loading -->\n <ng-template #loading>\n <div class=\"tw-flex tw-flex-col tw-items-center tw-justify-center tw-p-8\">\n <div class=\"tw-w-8 tw-h-8 tw-border-4 tw-border-blue-200 tw-border-t-blue-600 tw-rounded-full tw-animate-spin tw-mb-4\"></div>\n <p class=\"tw-text-gray-500 tw-text-sm\">Loading notes...</p>\n </div>\n </ng-template>\n </div>\n</div>", styles: [""], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i2.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i2.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "directive", type: i2.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i2.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "component", type: CideInputComponent, selector: "cide-ele-input", inputs: ["fill", "label", "labelHide", "disabled", "clearInput", "labelPlacement", "labelDir", "placeholder", "leadingIcon", "trailingIcon", "helperText", "helperTextCollapse", "hideHelperAndErrorText", "errorText", "maxlength", "minlength", "required", "autocapitalize", "autocomplete", "type", "width", "id", "ngModel", "option", "min", "max", "size"], outputs: ["ngModelChange"] }, { kind: "component", type: CideEleButtonComponent, selector: "button[cideEleButton], a[cideEleButton]", inputs: ["label", "variant", "size", "type", "shape", "elevation", "disabled", "id", "loading", "fullWidth", "leftIcon", "rightIcon", "customClass", "tooltip", "ariaLabel", "testId", "routerLink", "routerExtras", "preventDoubleClick", "animated"], outputs: ["btnClick", "doubleClick"] }, { kind: "component", type: CideTextareaComponent, selector: "cide-ele-textarea", inputs: ["label", "labelHide", "placeholder", "helperText", "errorText", "required", "disabled", "minlength", "maxlength", "rows", "id", "ngModel", "size", "fill", "labelPlacement", "labelDir", "leadingIcon", "trailingIcon", "clearInput"], outputs: ["ngModelChange"] }] }); }
170
- }
171
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.7", ngImport: i0, type: CideLytSidedrawerNotesComponent, decorators: [{
172
- type: Component,
173
- args: [{ selector: 'cide-lyt-sidedrawer-notes', standalone: true, imports: [CommonModule, ReactiveFormsModule, CideInputComponent, CideEleButtonComponent, CideTextareaComponent], template: "<div class=\"tw-relative tw-h-full tw-bg-white tw-overflow-hidden tw-flex tw-flex-col\">\n <!-- FIXED HEADER SECTION (ABSOLUTE POSITIONED) -->\n <div class=\"tw-bg-white tw-border-b tw-border-gray-200\">\n <!-- DYNAMIC HEADING -->\n <div class=\"tw-flex tw-justify-between tw-items-center tw-p-2 tw-bg-white tw-border-b tw-border-gray-200\">\n <h6 class=\"tw-font-semibold tw-text-gray-800\">\n {{ isFormVisible ? (isEditing ? 'Edit Note' : 'Add a New Note') : 'Notes' }}\n </h6>\n <button *ngIf=\"!isFormVisible\" (click)=\"showAddForm()\" cideEleButton variant=\"primary\"\n class=\"tw-p-2 !tw-w-7 !tw-px-0 !tw-rounded-full tw-animate-pulse\" title=\"Add New Note\">\n <!-- Using inline SVG for the plus icon for simplicity -->\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\"\n stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n <line x1=\"12\" y1=\"5\" x2=\"12\" y2=\"19\"></line>\n <line x1=\"5\" y1=\"12\" x2=\"19\" y2=\"12\"></line>\n </svg>\n </button>\n </div>\n\n <!-- ADD NOTE FORM (ANIMATED WRAPPER) -->\n <div class=\"tw-transition-all tw-duration-300 tw-ease-in-out tw-animate-fade-in\" [class.tw-opacity-100]=\"isFormVisible\"\n [class.tw-opacity-0]=\"!isFormVisible\" [class.tw-max-h-0]=\"!isFormVisible\">\n <form [formGroup]=\"noteForm\" (ngSubmit)=\"onSubmit()\" class=\"tw-p-3 tw-space-y-4\" *ngIf=\"isFormVisible\">\n <!-- Title Input -->\n <cide-ele-input name=\"sypn_title\" formControlName=\"sypn_title\" placeholder=\"Note Title\" label=\"Note Title\"\n [required]=\"true\" [type]=\"'text'\" class=\"tw-w-full tw-transition-all tw-duration-200 focus:tw-scale-[1.02]\"></cide-ele-input>\n\n <!-- Description Textarea -->\n <cide-ele-textarea placeholder=\"What's on your mind? (Optional)\" id=\"sypn_desc\" formControlName=\"sypn_desc\"\n rows=\"4\" label=\"Description\" class=\"tw-transition-all tw-duration-200 focus:tw-scale-[1.02]\"></cide-ele-textarea>\n\n <!-- Toggle Switches -->\n <div class=\"tw-grid tw-grid-cols-2 tw-gap-4\">\n <cide-ele-input [type]=\"'checkbox'\" formControlName=\"sypn_is_page_specific\" label=\"Page Specific\"\n class=\"tw-flex tw-items-center tw-space-x-2\"></cide-ele-input>\n\n <cide-ele-input [type]=\"'checkbox'\" formControlName=\"sypn_is_user_specific\" label=\"User Specific\"\n class=\"tw-flex tw-items-center tw-space-x-2\"></cide-ele-input>\n\n <cide-ele-input [type]=\"'checkbox'\" formControlName=\"sypn_is_entity_specific\" label=\"Entity Specific\"\n class=\"tw-flex tw-items-center tw-space-x-2\"></cide-ele-input>\n\n <cide-ele-input [type]=\"'checkbox'\" formControlName=\"sypn_is_theme_specific\" label=\"Theme Specific\"\n class=\"tw-flex tw-items-center tw-space-x-2\"></cide-ele-input>\n </div>\n\n <!-- Action Buttons -->\n <div class=\"tw-flex tw-space-x-3 tw-pt-4\">\n <button cideEleButton size=\"xs\" variant=\"primary\" type=\"submit\" [disabled]=\"noteForm.invalid\">\n {{ isEditing ? 'Update Note' : 'Add Note' }}\n </button>\n <button cideEleButton size=\"xs\" variant=\"secondary\" type=\"button\"\n (click)=\"isEditing ? cancelEdit() : hideAddForm()\">\n {{ isEditing ? 'Cancel Edit' : 'Cancel' }}\n </button>\n </div>\n </form>\n </div>\n </div>\n\n <!-- SCROLLABLE NOTES SECTION (BELOW FIXED HEADER) -->\n <div class=\"tw-overflow-y-auto tw-scroll-smooth notes-scroll-container\">\n <!-- Modern Angular v20 pattern: Use Signals directly -->\n <div class=\"\" *ngIf=\"notes() as notes; else loading\">\n <!-- Show notes if the array is not empty -->\n <div *ngIf=\"notes.length > 0; else noNotes\">\n <div *ngFor=\"let note of notes; let i = index\"\n class=\"tw-bg-white tw-border-b tw-border-gray-200 tw-p-4 tw-shadow-sm hover:tw-shadow-md tw-transition-all tw-duration-300 tw-ease-in-out tw-relative tw-transform hover:tw-translate-y-[-2px] hover:tw-shadow-lg\"\n (mouseenter)=\"onNoteHover(i)\" (mouseleave)=\"onNoteLeave()\">\n <!-- Edit Button (visible on hover) -->\n <button (click)=\"startEdit(note)\" [class.tw-opacity-100]=\"hoveredNoteIndex === i\"\n [class.tw-opacity-0]=\"hoveredNoteIndex !== i\"\n class=\"tw-absolute tw-top-2 tw-right-2 tw-transition-all tw-duration-200 tw-p-1 tw-rounded tw-bg-gray-100 hover:tw-bg-gray-200 hover:tw-scale-110 tw-z-10\"\n title=\"Edit Note\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\"\n stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n <path d=\"M11 4H4a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2v-7\"></path>\n <path d=\"m18.5 2.5 3 3L12 15l-4 1 1-4 9.5-9.5z\"></path>\n </svg>\n </button>\n\n <h6 class=\"tw-font-medium tw-text-gray-900 tw-mb-2 tw-pr-8\">{{ note.sypn_title }}</h6>\n <p class=\"tw-text-gray-600 tw-text-sm tw-mb-3\">{{ note.sypn_desc }}</p>\n <div class=\"tw-flex tw-flex-wrap tw-gap-2\">\n <span *ngIf=\"note.sypn_is_page_specific\"\n class=\"tw-px-2 tw-py-1 tw-bg-blue-100 tw-text-blue-800 tw-text-xs tw-rounded-full tw-transition-all tw-duration-200 hover:tw-scale-105 hover:tw-bg-blue-200\">Page Specific</span>\n <span *ngIf=\"note.sypn_is_user_specific\"\n class=\"tw-px-2 tw-py-1 tw-bg-green-100 tw-text-green-800 tw-text-xs tw-rounded-full tw-transition-all tw-duration-200 hover:tw-scale-105 hover:tw-bg-green-200\">User Specific</span>\n <span *ngIf=\"note.sypn_is_entity_specific\"\n class=\"tw-px-2 tw-py-1 tw-bg-purple-100 tw-text-purple-800 tw-text-xs tw-rounded-full tw-transition-all tw-duration-200 hover:tw-scale-105 hover:tw-bg-purple-200\">Entity\n Specific</span>\n <span *ngIf=\"note.sypn_is_theme_specific\"\n class=\"tw-px-2 tw-py-1 tw-bg-orange-100 tw-text-orange-800 tw-text-xs tw-rounded-full tw-transition-all tw-duration-200 hover:tw-scale-105 hover:tw-bg-orange-200\">Theme\n Specific</span>\n </div>\n <!-- <p class=\"note-date\">{{ note.createdAt | date:'short' }}</p> -->\n </div>\n </div>\n </div>\n\n <!-- Template to show when there are no notes -->\n <ng-template #noNotes>\n <div class=\"tw-flex tw-flex-col tw-items-center tw-justify-center tw-p-8 tw-text-center\">\n <div class=\"tw-w-12 tw-h-12 tw-bg-gray-100 tw-rounded-full tw-flex tw-items-center tw-justify-center tw-mb-4 tw-animate-bounce\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\"\n stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"\n class=\"tw-text-gray-400\">\n <path d=\"M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z\"></path>\n <polyline points=\"14,2 14,8 20,8\"></polyline>\n <line x1=\"16\" y1=\"13\" x2=\"8\" y2=\"13\"></line>\n <line x1=\"16\" y1=\"17\" x2=\"8\" y2=\"17\"></line>\n <polyline points=\"10,9 9,9 8,9\"></polyline>\n </svg>\n </div>\n <p class=\"tw-text-gray-500 tw-mb-2\">No notes found.</p>\n <p class=\"tw-text-sm tw-text-gray-400\">Click the '+' to add one!</p>\n </div>\n </ng-template>\n\n <!-- Template to show while notes are loading -->\n <ng-template #loading>\n <div class=\"tw-flex tw-flex-col tw-items-center tw-justify-center tw-p-8\">\n <div class=\"tw-w-8 tw-h-8 tw-border-4 tw-border-blue-200 tw-border-t-blue-600 tw-rounded-full tw-animate-spin tw-mb-4\"></div>\n <p class=\"tw-text-gray-500 tw-text-sm\">Loading notes...</p>\n </div>\n </ng-template>\n </div>\n</div>" }]
174
- }] });
175
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2lkZWRyYXdlci1ub3Rlcy5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9jbG91ZC1pZGUtbGF5b3V0L3NyYy9saWIvbGF5b3V0L3NpZGVkcmF3ZXIvc2lkZWRyYXdlci1ub3Rlcy9zaWRlZHJhd2VyLW5vdGVzLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2Nsb3VkLWlkZS1sYXlvdXQvc3JjL2xpYi9sYXlvdXQvc2lkZWRyYXdlci9zaWRlZHJhd2VyLW5vdGVzL3NpZGVkcmF3ZXItbm90ZXMuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQy9DLE9BQU8sRUFBRSxTQUFTLEVBQVUsTUFBTSxFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNsRSxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsV0FBVyxFQUFhLE1BQU0sZ0JBQWdCLENBQUM7QUFDN0UsT0FBTyxFQUFFLHlCQUF5QixFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFFdkUsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFDdkQsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFDM0QsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFDMUQsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sc0RBQXNELENBQUM7QUFDN0YsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sK0JBQStCLENBQUM7Ozs7QUF3QmxFLE1BQU0sT0FBTywrQkFBZ0MsU0FBUSxpQkFBaUI7SUFQdEU7O1FBUVUsZ0JBQVcsR0FBRyxNQUFNLENBQWMsRUFBRSxDQUFDLENBQUM7UUFDOUMsVUFBSyxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMs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RUFBRSxLQUFLO1lBQzlCLHNCQUFzQixFQUFFLEtBQUs7U0FDOUIsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVNLFFBQVE7UUFDYixPQUFPO1lBQ0wsWUFBWSxFQUFFLEVBQUUsR0FBRyxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUU7WUFDdkUsYUFBYSxFQUFFLElBQUksQ0FBQyxhQUFhO1NBQ2xDLENBQUM7SUFDSixDQUFDO0lBRU0sUUFBUSxDQUFDLEtBQTBCO1FBQ3hDLElBQUksS0FBSyxFQUFFLENBQUM7WUFDVixJQUFJLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUMsWUFBWSxDQUFDLENBQUM7WUFDN0MsSUFBSSxDQUFDLGFBQWEsR0FBRyxLQUFLLENBQUMsYUFBYSxDQUFDO1FBQzNDLENBQUM7SUFDSCxDQUFDOzhHQXRLVSwrQkFBK0I7a0dBQS9CLCtCQUErQiw0R0NqQzVDLGlnUUErSE0seUREbEdNLFlBQVksK1BBQUUsbUJBQW1CLDA1QkFBRSxrQkFBa0IsMGJBQUUsc0JBQXNCLGtYQUFFLHFCQUFxQjs7MkZBSW5HLCtCQUErQjtrQkFQM0MsU0FBUzsrQkFDRSwyQkFBMkIsY0FDekIsSUFBSSxXQUNQLENBQUMsWUFBWSxFQUFFLG1CQUFtQixFQUFFLGtCQUFrQixFQUFFLHNCQUFzQixFQUFFLHFCQUFxQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IENvbXBvbmVudCwgT25Jbml0LCBpbmplY3QsIHNpZ25hbCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgUmVhY3RpdmVGb3Jtc01vZHVsZSwgRm9ybUJ1aWxkZXIsIEZvcm1Hcm91cCB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IENpZGVMeXREcmF3ZXJOb3Rlc1NlcnZpY2UgfSBmcm9tICcuL3NpZGVkcmF3ZXItbm90ZXMuc2VydmljZSc7XG5pbXBvcnQgeyBJQ29yZVN5cG4gfSBmcm9tICdjbG91ZC1pZGUtbG1zLW1vZGVsJztcbmltcG9ydCB7IENpZGVJbnB1dENvbXBvbmVudCB9IGZyb20gJ2Nsb3VkLWlkZS1lbGVtZW50JztcbmltcG9ydCB7IENpZGVFbGVCdXR0b25Db21wb25lbnQgfSBmcm9tICdjbG91ZC1pZGUtZWxlbWVudCc7XG5pbXBvcnQgeyBDaWRlVGV4dGFyZWFDb21wb25lbnQgfSBmcm9tICdjbG91ZC1pZGUtZWxlbWVudCc7XG5pbXBvcnQgeyBBcHBTdGF0ZUhlbHBlclNlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi9zZXJ2aWNlcy9hcHAtc3RhdGUvYXBwLXN0YXRlLWhlbHBlci5zZXJ2aWNlJztcbmltcG9ydCB7IENpZGVMeXREcmF3ZXJCYXNlIH0gZnJvbSAnLi4vY2lkZS1seXQtZHJhd2VyLWJhc2UuY2xhc3MnO1xuXG5leHBvcnQgaW50ZXJmYWNlIE5ld05vdGVNb2RlbCB7XG4gIHRpdGxlOiBzdHJpbmc7XG4gIGRlc2NyaXB0aW9uOiBzdHJpbmc7XG4gIGlzUGFnZVNwZWNpZmljOiBib29sZWFuO1xuICBpc1VzZXJTcGVjaWZpYzogYm9vbGVhbjtcbiAgaXNFbnRpdHlTcGVjaWZpYzogYm9vbGVhbjtcbiAgaXNUaGVtZVNwZWNpZmljOiBib29sZWFuO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIE5vdGVzQ29tcG9uZW50U3RhdGUge1xuICBuZXdOb3RlTW9kZWw6IE5ld05vdGVNb2RlbDtcbiAgaXNGb3JtVmlzaWJsZTogYm9vbGVhbjtcbiAgc2Nyb2xsVG9wOiBudW1iZXI7XG59XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2NpZGUtbHl0LXNpZGVkcmF3ZXItbm90ZXMnLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBpbXBvcnRzOiBbQ29tbW9uTW9kdWxlLCBSZWFjdGl2ZUZvcm1zTW9kdWxlLCBDaWRlSW5wdXRDb21wb25lbnQsIENpZGVFbGVCdXR0b25Db21wb25lbnQsIENpZGVUZXh0YXJlYUNvbXBvbmVudF0sXG4gIHRlbXBsYXRlVXJsOiAnLi9zaWRlZHJhd2VyLW5vdGVzLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmw6ICcuL3NpZGVkcmF3ZXItbm90ZXMuY29tcG9uZW50LmNzcydcbn0pXG5leHBvcnQgY2xhc3MgQ2lkZUx5dFNpZGVkcmF3ZXJOb3Rlc0NvbXBvbmVudCBleHRlbmRzIENpZGVMeXREcmF3ZXJCYXNlIGltcGxlbWVudHMgT25Jbml0IHtcbiAgcHJpdmF0ZSBub3Rlc1NpZ25hbCA9IHNpZ25hbDxJQ29yZVN5cG5bXT4oW10pO1xuICBub3RlcyA9IHRoaXMubm90ZXNTaWduYWwuYXNSZWFkb25seSgpO1xuICBpc0Zvcm1WaXNpYmxlID0gZmFsc2U7XG4gIGlzRWRpdGluZyA9IGZhbHNlO1xuICBlZGl0aW5nTm90ZUlkOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcbiAgaG92ZXJlZE5vdGVJbmRleDogbnVtYmVyIHwgbnVsbCA9IG51bGw7XG4gIG5vdGVGb3JtITogRm9ybUdyb3VwO1xuICBwcml2YXRlIG5vdGVzU2VydmljZSA9IGluamVjdChDaWRlTHl0RHJhd2VyTm90ZXNTZXJ2aWNlKTtcbiAgcHJpdmF0ZSBmYiA9IGluamVjdChGb3JtQnVpbGRlcik7XG4gIHByaXZhdGUgYXBwU3RhdGUgPSBpbmplY3QoQXBwU3RhdGVIZWxwZXJTZXJ2aWNlKTtcblxuICBvdmVycmlkZSBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICBzdXBlci5uZ09uSW5pdCgpO1xuICAgIHRoaXMuaW5pdEZvcm0oKTtcbiAgICB0aGlzLm5vdGVzU2VydmljZS5nZXROb3RlcygpLnN1YnNjcmliZSh7XG4gICAgICBuZXh0OiAobm90ZXMpID0+IHtcbiAgICAgICAgdGhpcy5ub3Rlc1NpZ25hbC5zZXQobm90ZXMpO1xuICAgICAgfSxcbiAgICAgIGVycm9yOiAoZXJyb3IpID0+IHtcbiAgICAgICAgY29uc29sZS5lcnJvcignRXJyb3IgbG9hZGluZyBub3RlczonLCBlcnJvcik7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgYWZ0ZXJDb250ZXh0SW5pdCgpOiB2b2lkIHtcbiAgICAvLyBBbnkgYWRkaXRpb25hbCBzZXR1cCBhZnRlciBjb250ZXh0IGlzIHJlYWR5IGNhbiBnbyBoZXJlXG4gIH1cblxuICBwcml2YXRlIGluaXRGb3JtKCk6IHZvaWQge1xuICAgIHRoaXMubm90ZUZvcm0gPSB0aGlzLmZiLmdyb3VwKHtcbiAgICAgIHN5cG5fdGl0bGU6IFsnJ10sXG4gICAgICBzeXBuX2Rlc2M6IFsnJ10sXG4gICAgICBzeXBuX2lzX3BhZ2Vfc3BlY2lmaWM6IFt0cnVlXSxcbiAgICAgIHN5cG5faXNfdXNlcl9zcGVjaWZpYzogW3RydWVdLFxuICAgICAgc3lwbl9pc19lbnRpdHlfc3BlY2lmaWM6IFtmYWxzZV0sXG4gICAgICBzeXBuX2lzX3RoZW1lX3NwZWNpZmljOiBbZmFsc2VdXG4gICAgfSk7XG4gIH1cblxuICBzaG93QWRkRm9ybSgpOiB2b2lkIHtcbiAgICB0aGlzLmlzRm9ybVZpc2libGUgPSB0cnVlO1xuICB9XG5cbiAgaGlkZUFkZEZvcm0oKTogdm9pZCB7XG4gICAgdGhpcy5pc0Zvcm1WaXNpYmxlID0gZmFsc2U7XG4gICAgdGhpcy5pc0VkaXRpbmcgPSBmYWxzZTtcbiAgICB0aGlzLmVkaXRpbmdOb3RlSWQgPSBudWxsO1xuICB9XG5cbiAgc3RhcnRFZGl0KG5vdGU6IElDb3JlU3lwbik6IHZvaWQge1xuICAgIHRoaXMuaXNFZGl0aW5nID0gdHJ1ZTtcbiAgICB0aGlzLmVkaXRpbmdOb3RlSWQgPSBub3RlLl9pZCB8fCAnJztcbiAgICB0aGlzLm5vdGVGb3JtLnBhdGNoVmFsdWUoe1xuICAgICAgc3lwbl90aXRsZTogbm90ZS5zeXBuX3RpdGxlIHx8ICcnLFxuICAgICAgc3lwbl9kZXNjOiBub3RlLnN5cG5fZGVzYyB8fCAnJyxcbiAgICAgIHN5cG5faXNfcGFnZV9zcGVjaWZpYzogbm90ZS5zeXBuX2lzX3BhZ2Vfc3BlY2lmaWMgfHwgZmFsc2UsXG4gICAgICBzeXBuX2lzX3VzZXJfc3BlY2lmaWM6IG5vdGUuc3lwbl9pc191c2VyX3NwZWNpZmljIHx8IGZhbHNlLFxuICAgICAgc3lwbl9pc19lbnRpdHlfc3BlY2lmaWM6IG5vdGUuc3lwbl9pc19lbnRpdHlfc3BlY2lmaWMgfHwgZmFsc2UsXG4gICAgICBzeXBuX2lzX3RoZW1lX3NwZWNpZmljOiBub3RlLnN5cG5faXNfdGhlbWVfc3BlY2lmaWMgfHwgZmFsc2VcbiAgICB9KTtcbiAgICB0aGlzLmlzRm9ybVZpc2libGUgPSB0cnVlO1xuICB9XG5cbiAgY2FuY2VsRWRpdCgpOiB2b2lkIHtcbiAgICB0aGlzLmlzRWRpdGluZyA9IGZhbHNlO1xuICAgIHRoaXMuZWRpdGluZ05vdGVJZCA9IG51bGw7XG4gICAgdGhpcy5yZXNldEZvcm0oKTtcbiAgICB0aGlzLmlzRm9ybVZpc2libGUgPSBmYWxzZTtcbiAgfVxuXG4gIG9uTm90ZUhvdmVyKGluZGV4OiBudW1iZXIpOiB2b2lkIHtcbiAgICB0aGlzLmhvdmVyZWROb3RlSW5kZXggPSBpbmRleDtcbiAgfVxuXG4gIG9uTm90ZUxlYXZlKCk6IHZvaWQge1xuICAgIHRoaXMuaG92ZXJlZE5vdGVJbmRleCA9IG51bGw7XG4gIH1cblxuICBvblN1Ym1pdCgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5ub3RlRm9ybS5pbnZhbGlkIHx8ICF0aGlzLm5vdGVGb3JtLmdldCgnc3lwbl90aXRsZScpPy52YWx1ZT8udHJpbSgpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGZvcm1WYWx1ZSA9IHRoaXMubm90ZUZvcm0udmFsdWU7XG4gICAgaWYgKHRoaXMuaXNFZGl0aW5nICYmIHRoaXMuZWRpdGluZ05vdGVJZCkge1xuICAgICAgY29uc29sZS5sb2coJ2Zvcm1WYWx1ZScsIHRoaXMuYXBwU3RhdGUuY3VycmVudFVzZXIoKSk7XG4gICAgICBjb25zdCBub3RlVG9VcGRhdGU6IElDb3JlU3lwbiA9IHtcbiAgICAgICAgX2lkOiB0aGlzLmVkaXRpbmdOb3RlSWQsXG4gICAgICAgIHN5cG5fdGl0bGU6IGZvcm1WYWx1ZS5zeXBuX3RpdGxlLFxuICAgICAgICBzeXBuX2Rlc2M6IGZvcm1WYWx1ZS5zeXBuX2Rlc2MsXG4gICAgICAgIHN5cG5fcGFnZV9pZF9zeXBnOiB0aGlzLnBhZ2VJZCB8fCBcIlwiLFxuICAgICAgICBzeXBuX3VzZXJfaWRfdXNlcjogdGhpcy5hcHBTdGF0ZS5jdXJyZW50VXNlcigpPy5faWQgfHwgXCJcIixcbiAgICAgICAgc3lwbl9lbnRpdHlfaWRfc3lwZTogdGhpcy5hcHBTdGF0ZS5nZXRBY3RpdmVFbnRpdHlJZCgpIHx8IFwiXCIsXG4gICAgICAgIHN5cG5fcGFnZV90aGVtX2lkX3N5dG06IHRoaXMudGhlbWVJZCB8fCBcIlwiLFxuICAgICAgICBzeXBuX2lzX3BhZ2Vfc3BlY2lmaWM6IGZvcm1WYWx1ZS5zeXBuX2lzX3BhZ2Vfc3BlY2lmaWMsXG4gICAgICAgIHN5cG5faXNfdXNlcl9zcGVjaWZpYzogZm9ybVZhbHVlLnN5cG5faXNfdXNlcl9zcGVjaWZpYyxcbiAgICAgICAgc3lwbl9pc19lbnRpdHlfc3BlY2lmaWM6IGZvcm1WYWx1ZS5zeXBuX2lzX2VudGl0eV9zcGVjaWZpYyxcbiAgICAgICAgc3lwbl9pc190aGVtZV9zcGVjaWZpYzogZm9ybVZhbHVlLnN5cG5faXNfdGhlbWVfc3BlY2lmaWMsXG4gICAgICB9O1xuICAgICAgdGhpcy5ub3Rlc1NlcnZpY2UudXBkYXRlTm90ZShub3RlVG9VcGRhdGUpLnN1YnNjcmliZSh7XG4gICAgICAgIG5leHQ6ICgpID0+IHtcbiAgICAgICAgICBjb25zdCBjdXJyZW50Tm90ZXMgPSB0aGlzLm5vdGVzU2lnbmFsKCk7XG4gICAgICAgICAgY29uc3QgdXBkYXRlZE5vdGVzID0gY3VycmVudE5vdGVzLm1hcCgobm90ZTogSUNvcmVTeXBuKSA9PlxuICAgICAgICAgICAgbm90ZS5faWQgPT09IHRoaXMuZWRpdGluZ05vdGVJZCA/IG5vdGVUb1VwZGF0ZSA6IG5vdGVcbiAgICAgICAgICApO1xuICAgICAgICAgIHRoaXMubm90ZXNTaWduYWwuc2V0KHVwZGF0ZWROb3Rlcyk7XG4gICAgICAgICAgdGhpcy5yZXNldEZvcm0oKTtcbiAgICAgICAgICB0aGlzLmlzRm9ybVZpc2libGUgPSBmYWxzZTtcbiAgICAgICAgICB0aGlzLmlzRWRpdGluZyA9IGZhbHNlO1xuICAgICAgICAgIHRoaXMuZWRpdGluZ05vdGVJZCA9IG51bGw7XG4gICAgICAgIH0sXG4gICAgICAgIGVycm9yOiAoZXJyOiB1bmtub3duKSA9PiBjb25zb2xlLmVycm9yKCdGYWlsZWQgdG8gdXBkYXRlIG5vdGUnLCBlcnIpXG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3Qgbm90ZVRvQWRkOiBJQ29yZVN5cG4gPSB7XG4gICAgICAgIHN5cG5fdGl0bGU6IGZvcm1WYWx1ZS5zeXBuX3RpdGxlLFxuICAgICAgICBzeXBuX2Rlc2M6IGZvcm1WYWx1ZS5zeXBuX2Rlc2MsXG4gICAgICAgIHN5cG5fcGFnZV9pZF9zeXBnOiB0aGlzLnBhZ2VJZCB8fCBcIlwiLFxuICAgICAgICBzeXBuX3VzZXJfaWRfdXNlcjogdGhpcy5hcHBTdGF0ZS5jdXJyZW50VXNlcigpPy5faWQgfHwgXCJcIixcbiAgICAgICAgc3lwbl9lbnRpdHlfaWRfc3lwZTogdGhpcy5hcHBTdGF0ZS5nZXRBY3RpdmVFbnRpdHlJZCgpIHx8IFwiXCIsXG4gICAgICAgIHN5cG5fcGFnZV90aGVtX2lkX3N5dG06IHRoaXMudGhlbWVJZCB8fCBcIlwiLFxuICAgICAgICBzeXBuX2lzX3BhZ2Vfc3BlY2lmaWM6IGZvcm1WYWx1ZS5zeXBuX2lzX3BhZ2Vfc3BlY2lmaWMsXG4gICAgICAgIHN5cG5faXNfdXNlcl9zcGVjaWZpYzogZm9ybVZhbHVlLnN5cG5faXNfdXNlcl9zcGVjaWZpYyxcbiAgICAgICAgc3lwbl9pc19lbnRpdHlfc3BlY2lmaWM6IGZvcm1WYWx1ZS5zeXBuX2lzX2VudGl0eV9zcGVjaWZpYyxcbiAgICAgICAgc3lwbl9pc190aGVtZV9zcGVjaWZpYzogZm9ybVZhbHVlLnN5cG5faXNfdGhlbWVfc3BlY2lmaWMsXG4gICAgICB9O1xuICAgICAgdGhpcy5ub3Rlc1NlcnZpY2UuYWRkTm90ZShub3RlVG9BZGQpLnN1YnNjcmliZSh7XG4gICAgICAgIG5leHQ6IChyZXNwb25zZTogdW5rbm93bikgPT4ge1xuICAgICAgICAgIGNvbnN0IHJlc3BvbnNlRGF0YSA9IHJlc3BvbnNlIGFzIHsgX2lkPzogc3RyaW5nOyBpZD86IHN0cmluZyB9O1xuICAgICAgICAgIGNvbnN0IG5ld05vdGVXaXRoSWQ6IElDb3JlU3lwbiA9IHtcbiAgICAgICAgICAgIC4uLm5vdGVUb0FkZCxcbiAgICAgICAgICAgIF9pZDogcmVzcG9uc2VEYXRhLl9pZCB8fCByZXNwb25zZURhdGEuaWQgfHwgRGF0ZS5ub3coKS50b1N0cmluZygpXG4gICAgICAgICAgfTtcbiAgICAgICAgICBjb25zdCBjdXJyZW50Tm90ZXMgPSB0aGlzLm5vdGVzU2lnbmFsKCk7XG4gICAgICAgICAgdGhpcy5ub3Rlc1NpZ25hbC5zZXQoW25ld05vdGVXaXRoSWQsIC4uLmN1cnJlbnROb3Rlc10pO1xuICAgICAgICAgIHRoaXMucmVzZXRGb3JtKCk7XG4gICAgICAgICAgdGhpcy5pc0Zvcm1WaXNpYmxlID0gZmFsc2U7XG4gICAgICAgIH0sXG4gICAgICAgIGVycm9yOiAoZXJyOiB1bmtub3duKSA9PiBjb25zb2xlLmVycm9yKCdGYWlsZWQgdG8gYWRkIG5vdGUnLCBlcnIpXG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHJlc2V0Rm9ybSgpOiB2b2lkIHtcbiAgICB0aGlzLm5vdGVGb3JtLnJlc2V0KHtcbiAgICAgIHN5cG5fdGl0bGU6ICcnLFxuICAgICAgc3lwbl9kZXNjOiAnJyxcbiAgICAgIHN5cG5faXNfcGFnZV9zcGVjaWZpYzogdHJ1ZSxcbiAgICAgIHN5cG5faXNfdXNlcl9zcGVjaWZpYzogdHJ1ZSxcbiAgICAgIHN5cG5faXNfZW50aXR5X3NwZWNpZmljOiBmYWxzZSxcbiAgICAgIHN5cG5faXNfdGhlbWVfc3BlY2lmaWM6IGZhbHNlXG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgZ2V0U3RhdGUoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIG5ld05vdGVNb2RlbDogeyAuLi4odGhpcy5ub3RlRm9ybT8udmFsdWUgPyB0aGlzLm5vdGVGb3JtPy52YWx1ZSA6IHt9KSB9LFxuICAgICAgaXNGb3JtVmlzaWJsZTogdGhpcy5pc0Zvcm1WaXNpYmxlLFxuICAgIH07XG4gIH1cblxuICBwdWJsaWMgc2V0U3RhdGUoc3RhdGU6IE5vdGVzQ29tcG9uZW50U3RhdGUpIHtcbiAgICBpZiAoc3RhdGUpIHtcbiAgICAgIHRoaXMubm90ZUZvcm0ucGF0Y2hWYWx1ZShzdGF0ZS5uZXdOb3RlTW9kZWwpO1xuICAgICAgdGhpcy5pc0Zvcm1WaXNpYmxlID0gc3RhdGUuaXNGb3JtVmlzaWJsZTtcbiAgICB9XG4gIH1cbn0iLCI8ZGl2IGNsYXNzPVwidHctcmVsYXRpdmUgdHctaC1mdWxsIHR3LWJnLXdoaXRlIHR3LW92ZXJmbG93LWhpZGRlbiB0dy1mbGV4IHR3LWZsZXgtY29sXCI+XG4gIDwhLS0gRklYRUQgSEVBREVSIFNFQ1RJT04gKEFCU09MVVRFIFBPU0lUSU9ORUQpIC0tPlxuICA8ZGl2IGNsYXNzPVwidHctYmctd2hpdGUgdHctYm9yZGVyLWIgdHctYm9yZGVyLWdyYXktMjAwXCI+XG4gICAgPCEtLSBEWU5BTUlDIEhFQURJTkcgLS0+XG4gICAgPGRpdiBjbGFzcz1cInR3LWZsZXggdHctanVzdGlmeS1iZXR3ZWVuIHR3LWl0ZW1zLWNlbnRlciB0dy1wLTIgdHctYmctd2hpdGUgdHctYm9yZGVyLWIgdHctYm9yZGVyLWdyYXktMjAwXCI+XG4gICAgICA8aDYgY2xhc3M9XCJ0dy1mb250LXNlbWlib2xkIHR3LXRleHQtZ3JheS04MDBcIj5cbiAgICAgICAge3sgaXNGb3JtVmlzaWJsZSA/IChpc0VkaXRpbmcgPyAnRWRpdCBOb3RlJyA6ICdBZGQgYSBOZXcgTm90ZScpIDogJ05vdGVzJyB9fVxuICAgICAgPC9oNj5cbiAgICAgIDxidXR0b24gKm5nSWY9XCIhaXNGb3JtVmlzaWJsZVwiIChjbGljayk9XCJzaG93QWRkRm9ybSgpXCIgY2lkZUVsZUJ1dHRvbiB2YXJpYW50PVwicHJpbWFyeVwiXG4gICAgICAgIGNsYXNzPVwidHctcC0yICF0dy13LTcgIXR3LXB4LTAgIXR3LXJvdW5kZWQtZnVsbCB0dy1hbmltYXRlLXB1bHNlXCIgdGl0bGU9XCJBZGQgTmV3IE5vdGVcIj5cbiAgICAgICAgPCEtLSBVc2luZyBpbmxpbmUgU1ZHIGZvciB0aGUgcGx1cyBpY29uIGZvciBzaW1wbGljaXR5IC0tPlxuICAgICAgICA8c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB3aWR0aD1cIjIwXCIgaGVpZ2h0PVwiMjBcIiB2aWV3Qm94PVwiMCAwIDI0IDI0XCIgZmlsbD1cIm5vbmVcIlxuICAgICAgICAgIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiIHN0cm9rZS13aWR0aD1cIjJcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIj5cbiAgICAgICAgICA8bGluZSB4MT1cIjEyXCIgeTE9XCI1XCIgeDI9XCIxMlwiIHkyPVwiMTlcIj48L2xpbmU+XG4gICAgICAgICAgPGxpbmUgeDE9XCI1XCIgeTE9XCIxMlwiIHgyPVwiMTlcIiB5Mj1cIjEyXCI+PC9saW5lPlxuICAgICAgICA8L3N2Zz5cbiAgICAgIDwvYnV0dG9uPlxuICAgIDwvZGl2PlxuXG4gICAgPCEtLSBBREQgTk9URSBGT1JNIChBTklNQVRFRCBXUkFQUEVSKSAtLT5cbiAgICA8ZGl2IGNsYXNzPVwidHctdHJhbnNpdGlvbi1hbGwgdHctZHVyYXRpb24tMzAwIHR3LWVhc2UtaW4tb3V0IHR3LWFuaW1hdGUtZmFkZS1pblwiIFtjbGFzcy50dy1vcGFjaXR5LTEwMF09XCJpc0Zvcm1WaXNpYmxlXCJcbiAgICAgIFtjbGFzcy50dy1vcGFjaXR5LTBdPVwiIWlzRm9ybVZpc2libGVcIiBbY2xhc3MudHctbWF4LWgtMF09XCIhaXNGb3JtVmlzaWJsZVwiPlxuICAgICAgPGZvcm0gW2Zvcm1Hcm91cF09XCJub3RlRm9ybVwiIChuZ1N1Ym1pdCk9XCJvblN1Ym1pdCgpXCIgY2xhc3M9XCJ0dy1wLTMgdHctc3BhY2UteS00XCIgKm5nSWY9XCJpc0Zvcm1WaXNpYmxlXCI+XG4gICAgICAgIDwhLS0gVGl0bGUgSW5wdXQgLS0+XG4gICAgICAgIDxjaWRlLWVsZS1pbnB1dCBuYW1lPVwic3lwbl90aXRsZVwiIGZvcm1Db250cm9sTmFtZT1cInN5cG5fdGl0bGVcIiBwbGFjZWhvbGRlcj1cIk5vdGUgVGl0bGVcIiBsYWJlbD1cIk5vdGUgVGl0bGVcIlxuICAgICAgICAgIFtyZXF1aXJlZF09XCJ0cnVlXCIgW3R5cGVdPVwiJ3RleHQnXCIgY2xhc3M9XCJ0dy13LWZ1bGwgdHctdHJhbnNpdGlvbi1hbGwgdHctZHVyYXRpb24tMjAwIGZvY3VzOnR3LXNjYWxlLVsxLjAyXVwiPjwvY2lkZS1lbGUtaW5wdXQ+XG5cbiAgICAgICAgPCEtLSBEZXNjcmlwdGlvbiBUZXh0YXJlYSAtLT5cbiAgICAgICAgPGNpZGUtZWxlLXRleHRhcmVhIHBsYWNlaG9sZGVyPVwiV2hhdCdzIG9uIHlvdXIgbWluZD8gKE9wdGlvbmFsKVwiIGlkPVwic3lwbl9kZXNjXCIgZm9ybUNvbnRyb2xOYW1lPVwic3lwbl9kZXNjXCJcbiAgICAgICAgICByb3dzPVwiNFwiIGxhYmVsPVwiRGVzY3JpcHRpb25cIiBjbGFzcz1cInR3LXRyYW5zaXRpb24tYWxsIHR3LWR1cmF0aW9uLTIwMCBmb2N1czp0dy1zY2FsZS1bMS4wMl1cIj48L2NpZGUtZWxlLXRleHRhcmVhPlxuXG4gICAgICAgIDwhLS0gVG9nZ2xlIFN3aXRjaGVzIC0tPlxuICAgICAgICA8ZGl2IGNsYXNzPVwidHctZ3JpZCB0dy1ncmlkLWNvbHMtMiB0dy1nYXAtNFwiPlxuICAgICAgICAgIDxjaWRlLWVsZS1pbnB1dCBbdHlwZV09XCInY2hlY2tib3gnXCIgZm9ybUNvbnRyb2xOYW1lPVwic3lwbl9pc19wYWdlX3NwZWNpZmljXCIgbGFiZWw9XCJQYWdlIFNwZWNpZmljXCJcbiAgICAgICAgICAgIGNsYXNzPVwidHctZmxleCB0dy1pdGVtcy1jZW50ZXIgdHctc3BhY2UteC0yXCI+PC9jaWRlLWVsZS1pbnB1dD5cblxuICAgICAgICAgIDxjaWRlLWVsZS1pbnB1dCBbdHlwZV09XCInY2hlY2tib3gnXCIgZm9ybUNvbnRyb2xOYW1lPVwic3lwbl9pc191c2VyX3NwZWNpZmljXCIgbGFiZWw9XCJVc2VyIFNwZWNpZmljXCJcbiAgICAgICAgICAgIGNsYXNzPVwidHctZmxleCB0dy1pdGVtcy1jZW50ZXIgdHctc3BhY2UteC0yXCI+PC9jaWRlLWVsZS1pbnB1dD5cblxuICAgICAgICAgIDxjaWRlLWVsZS1pbnB1dCBbdHlwZV09XCInY2hlY2tib3gnXCIgZm9ybUNvbnRyb2xOYW1lPVwic3lwbl9pc19lbnRpdHlfc3BlY2lmaWNcIiBsYWJlbD1cIkVudGl0eSBTcGVjaWZpY1wiXG4gICAgICAgICAgICBjbGFzcz1cInR3LWZsZXggdHctaXRlbXMtY2VudGVyIHR3LXNwYWNlLXgtMlwiPjwvY2lkZS1lbGUtaW5wdXQ+XG5cbiAgICAgICAgICA8Y2lkZS1lbGUtaW5wdXQgW3R5cGVdPVwiJ2NoZWNrYm94J1wiIGZvcm1Db250cm9sTmFtZT1cInN5cG5faXNfdGhlbWVfc3BlY2lmaWNcIiBsYWJlbD1cIlRoZW1lIFNwZWNpZmljXCJcbiAgICAgICAgICAgIGNsYXNzPVwidHctZmxleCB0dy1pdGVtcy1jZW50ZXIgdHctc3BhY2UteC0yXCI+PC9jaWRlLWVsZS1pbnB1dD5cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgPCEtLSBBY3Rpb24gQnV0dG9ucyAtLT5cbiAgICAgICAgPGRpdiBjbGFzcz1cInR3LWZsZXggdHctc3BhY2UteC0zIHR3LXB0LTRcIj5cbiAgICAgICAgICA8YnV0dG9uIGNpZGVFbGVCdXR0b24gc2l6ZT1cInhzXCIgdmFyaWFudD1cInByaW1hcnlcIiB0eXBlPVwic3VibWl0XCIgW2Rpc2FibGVkXT1cIm5vdGVGb3JtLmludmFsaWRcIj5cbiAgICAgICAgICAgIHt7IGlzRWRpdGluZyA/ICdVcGRhdGUgTm90ZScgOiAnQWRkIE5vdGUnIH19XG4gICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgPGJ1dHRvbiBjaWRlRWxlQnV0dG9uIHNpemU9XCJ4c1wiIHZhcmlhbnQ9XCJzZWNvbmRhcnlcIiB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgIChjbGljayk9XCJpc0VkaXRpbmcgPyBjYW5jZWxFZGl0KCkgOiBoaWRlQWRkRm9ybSgpXCI+XG4gICAgICAgICAgICB7eyBpc0VkaXRpbmcgPyAnQ2FuY2VsIEVkaXQnIDogJ0NhbmNlbCcgfX1cbiAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Zvcm0+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuXG4gIDwhLS0gU0NST0xMQUJMRSBOT1RFUyBTRUNUSU9OIChCRUxPVyBGSVhFRCBIRUFERVIpIC0tPlxuICA8ZGl2IGNsYXNzPVwidHctb3ZlcmZsb3cteS1hdXRvIHR3LXNjcm9sbC1zbW9vdGggbm90ZXMtc2Nyb2xsLWNvbnRhaW5lclwiPlxuICAgIDwhLS0gTW9kZXJuIEFuZ3VsYXIgdjIwIHBhdHRlcm46IFVzZSBTaWduYWxzIGRpcmVjdGx5IC0tPlxuICAgIDxkaXYgY2xhc3M9XCJcIiAqbmdJZj1cIm5vdGVzKCkgYXMgbm90ZXM7IGVsc2UgbG9hZGluZ1wiPlxuICAgICAgPCEtLSBTaG93IG5vdGVzIGlmIHRoZSBhcnJheSBpcyBub3QgZW1wdHkgLS0+XG4gICAgICA8ZGl2ICpuZ0lmPVwibm90ZXMubGVuZ3RoID4gMDsgZWxzZSBub05vdGVzXCI+XG4gICAgICAgIDxkaXYgKm5nRm9yPVwibGV0IG5vdGUgb2Ygbm90ZXM7IGxldCBpID0gaW5kZXhcIlxuICAgICAgICAgIGNsYXNzPVwidHctYmctd2hpdGUgdHctYm9yZGVyLWIgdHctYm9yZGVyLWdyYXktMjAwIHR3LXAtNCB0dy1zaGFkb3ctc20gaG92ZXI6dHctc2hhZG93LW1kIHR3LXRyYW5zaXRpb24tYWxsIHR3LWR1cmF0aW9uLTMwMCB0dy1lYXNlLWluLW91dCB0dy1yZWxhdGl2ZSB0dy10cmFuc2Zvcm0gaG92ZXI6dHctdHJhbnNsYXRlLXktWy0ycHhdIGhvdmVyOnR3LXNoYWRvdy1sZ1wiXG4gICAgICAgICAgKG1vdXNlZW50ZXIpPVwib25Ob3RlSG92ZXIoaSlcIiAobW91c2VsZWF2ZSk9XCJvbk5vdGVMZWF2ZSgpXCI+XG4gICAgICAgICAgPCEtLSBFZGl0IEJ1dHRvbiAodmlzaWJsZSBvbiBob3ZlcikgLS0+XG4gICAgICAgICAgPGJ1dHRvbiAoY2xpY2spPVwic3RhcnRFZGl0KG5vdGUpXCIgW2NsYXNzLnR3LW9wYWNpdHktMTAwXT1cImhvdmVyZWROb3RlSW5kZXggPT09IGlcIlxuICAgICAgICAgICAgW2NsYXNzLnR3LW9wYWNpdHktMF09XCJob3ZlcmVkTm90ZUluZGV4ICE9PSBpXCJcbiAgICAgICAgICAgIGNsYXNzPVwidHctYWJzb2x1dGUgdHctdG9wLTIgdHctcmlnaHQtMiB0dy10cmFuc2l0aW9uLWFsbCB0dy1kdXJhdGlvbi0yMDAgdHctcC0xIHR3LXJvdW5kZWQgdHctYmctZ3JheS0xMDAgaG92ZXI6dHctYmctZ3JheS0yMDAgaG92ZXI6dHctc2NhbGUtMTEwIHR3LXotMTBcIlxuICAgICAgICAgICAgdGl0bGU9XCJFZGl0IE5vdGVcIj5cbiAgICAgICAgICAgIDxzdmcgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHdpZHRoPVwiMTZcIiBoZWlnaHQ9XCIxNlwiIHZpZXdCb3g9XCIwIDAgMjQgMjRcIiBmaWxsPVwibm9uZVwiXG4gICAgICAgICAgICAgIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiIHN0cm9rZS13aWR0aD1cIjJcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIj5cbiAgICAgICAgICAgICAgPHBhdGggZD1cIk0xMSA0SDRhMiAyIDAgMCAwLTIgMnYxNGEyIDIgMCAwIDAgMiAyaDE0YTIgMiAwIDAgMCAyLTJ2LTdcIj48L3BhdGg+XG4gICAgICAgICAgICAgIDxwYXRoIGQ9XCJtMTguNSAyLjUgMyAzTDEyIDE1bC00IDEgMS00IDkuNS05LjV6XCI+PC9wYXRoPlxuICAgICAgICAgICAgPC9zdmc+XG4gICAgICAgICAgPC9idXR0b24+XG5cbiAgICAgICAgICA8aDYgY2xhc3M9XCJ0dy1mb250LW1lZGl1bSB0dy10ZXh0LWdyYXktOTAwIHR3LW1iLTIgdHctcHItOFwiPnt7IG5vdGUuc3lwbl90aXRsZSB9fTwvaDY+XG4gICAgICAgICAgPHAgY2xhc3M9XCJ0dy10ZXh0LWdyYXktNjAwIHR3LXRleHQtc20gdHctbWItM1wiPnt7IG5vdGUuc3lwbl9kZXNjIH19PC9wPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0dy1mbGV4IHR3LWZsZXgtd3JhcCB0dy1nYXAtMlwiPlxuICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJub3RlLnN5cG5faXNfcGFnZV9zcGVjaWZpY1wiXG4gICAgICAgICAgICAgIGNsYXNzPVwidHctcHgtMiB0dy1weS0xIHR3LWJnLWJsdWUtMTAwIHR3LXRleHQtYmx1ZS04MDAgdHctdGV4dC14cyB0dy1yb3VuZGVkLWZ1bGwgdHctdHJhbnNpdGlvbi1hbGwgdHctZHVyYXRpb24tMjAwIGhvdmVyOnR3LXNjYWxlLTEwNSBob3Zlcjp0dy1iZy1ibHVlLTIwMFwiPlBhZ2UgU3BlY2lmaWM8L3NwYW4+XG4gICAgICAgICAgICA8c3BhbiAqbmdJZj1cIm5vdGUuc3lwbl9pc191c2VyX3NwZWNpZmljXCJcbiAgICAgICAgICAgICAgY2xhc3M9XCJ0dy1weC0yIHR3LXB5LTEgdHctYmctZ3JlZW4tMTAwIHR3LXRleHQtZ3JlZW4tODAwIHR3LXRleHQteHMgdHctcm91bmRlZC1mdWxsIHR3LXRyYW5zaXRpb24tYWxsIHR3LWR1cmF0aW9uLTIwMCBob3Zlcjp0dy1zY2FsZS0xMDUgaG92ZXI6dHctYmctZ3JlZW4tMjAwXCI+VXNlciBTcGVjaWZpYzwvc3Bhbj5cbiAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwibm90ZS5zeXBuX2lzX2VudGl0eV9zcGVjaWZpY1wiXG4gICAgICAgICAgICAgIGNsYXNzPVwidHctcHgtMiB0dy1weS0xIHR3LWJnLXB1cnBsZS0xMDAgdHctdGV4dC1wdXJwbGUtODAwIHR3LXRleHQteHMgdHctcm91bmRlZC1mdWxsIHR3LXRyYW5zaXRpb24tYWxsIHR3LWR1cmF0aW9uLTIwMCBob3Zlcjp0dy1zY2FsZS0xMDUgaG92ZXI6dHctYmctcHVycGxlLTIwMFwiPkVudGl0eVxuICAgICAgICAgICAgICBTcGVjaWZpYzwvc3Bhbj5cbiAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwibm90ZS5zeXBuX2lzX3RoZW1lX3NwZWNpZmljXCJcbiAgICAgICAgICAgICAgY2xhc3M9XCJ0dy1weC0yIHR3LXB5LTEgdHctYmctb3JhbmdlLTEwMCB0dy10ZXh0LW9yYW5nZS04MDAgdHctdGV4dC14cyB0dy1yb3VuZGVkLWZ1bGwgdHctdHJhbnNpdGlvbi1hbGwgdHctZHVyYXRpb24tMjAwIGhvdmVyOnR3LXNjYWxlLTEwNSBob3Zlcjp0dy1iZy1vcmFuZ2UtMjAwXCI+VGhlbWVcbiAgICAgICAgICAgICAgU3BlY2lmaWM8L3NwYW4+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPCEtLSA8cCBjbGFzcz1cIm5vdGUtZGF0ZVwiPnt7IG5vdGUuY3JlYXRlZEF0IHwgZGF0ZTonc2hvcnQnIH19PC9wPiAtLT5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cblxuICAgIDwhLS0gVGVtcGxhdGUgdG8gc2hvdyB3aGVuIHRoZXJlIGFyZSBubyBub3RlcyAtLT5cbiAgICA8bmctdGVtcGxhdGUgI25vTm90ZXM+XG4gICAgICA8ZGl2IGNsYXNzPVwidHctZmxleCB0dy1mbGV4LWNvbCB0dy1pdGVtcy1jZW50ZXIgdHctanVzdGlmeS1jZW50ZXIgdHctcC04IHR3LXRleHQtY2VudGVyXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJ0dy13LTEyIHR3LWgtMTIgdHctYmctZ3JheS0xMDAgdHctcm91bmRlZC1mdWxsIHR3LWZsZXggdHctaXRlbXMtY2VudGVyIHR3LWp1c3RpZnktY2VudGVyIHR3LW1iLTQgdHctYW5pbWF0ZS1ib3VuY2VcIj5cbiAgICAgICAgICA8c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB3aWR0aD1cIjIwXCIgaGVpZ2h0PVwiMjBcIiB2aWV3Qm94PVwiMCAwIDI0IDI0XCIgZmlsbD1cIm5vbmVcIlxuICAgICAgICAgICAgc3Ryb2tlPVwiY3VycmVudENvbG9yXCIgc3Ryb2tlLXdpZHRoPVwiMlwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiXG4gICAgICAgICAgICBjbGFzcz1cInR3LXRleHQtZ3JheS00MDBcIj5cbiAgICAgICAgICAgIDxwYXRoIGQ9XCJNMTQgMkg2YTIgMiAwIDAgMC0yIDJ2MTZhMiAyIDAgMCAwIDIgMmgxMmEyIDIgMCAwIDAgMi0yVjh6XCI+PC9wYXRoPlxuICAgICAgICAgICAgPHBvbHlsaW5lIHBvaW50cz1cIjE0LDIgMTQsOCAyMCw4XCI+PC9wb2x5bGluZT5cbiAgICAgICAgICAgIDxsaW5lIHgxPVwiMTZcIiB5MT1cIjEzXCIgeDI9XCI4XCIgeTI9XCIxM1wiPjwvbGluZT5cbiAgICAgICAgICAgIDxsaW5lIHgxPVwiMTZcIiB5MT1cIjE3XCIgeDI9XCI4XCIgeTI9XCIxN1wiPjwvbGluZT5cbiAgICAgICAgICAgIDxwb2x5bGluZSBwb2ludHM9XCIxMCw5IDksOSA4LDlcIj48L3BvbHlsaW5lPlxuICAgICAgICAgIDwvc3ZnPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPHAgY2xhc3M9XCJ0dy10ZXh0LWdyYXktNTAwIHR3LW1iLTJcIj5ObyBub3RlcyBmb3VuZC48L3A+XG4gICAgICAgIDxwIGNsYXNzPVwidHctdGV4dC1zbSB0dy10ZXh0LWdyYXktNDAwXCI+Q2xpY2sgdGhlICcrJyB0byBhZGQgb25lITwvcD5cbiAgICAgIDwvZGl2PlxuICAgIDwvbmctdGVtcGxhdGU+XG5cbiAgICA8IS0tIFRlbXBsYXRlIHRvIHNob3cgd2hpbGUgbm90ZXMgYXJlIGxvYWRpbmcgLS0+XG4gICAgPG5nLXRlbXBsYXRlICNsb2FkaW5nPlxuICAgICAgPGRpdiBjbGFzcz1cInR3LWZsZXggdHctZmxleC1jb2wgdHctaXRlbXMtY2VudGVyIHR3LWp1c3RpZnktY2VudGVyIHR3LXAtOFwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwidHctdy04IHR3LWgtOCB0dy1ib3JkZXItNCB0dy1ib3JkZXItYmx1ZS0yMDAgdHctYm9yZGVyLXQtYmx1ZS02MDAgdHctcm91bmRlZC1mdWxsIHR3LWFuaW1hdGUtc3BpbiB0dy1tYi00XCI+PC9kaXY+XG4gICAgICAgIDxwIGNsYXNzPVwidHctdGV4dC1ncmF5LTUwMCB0dy10ZXh0LXNtXCI+TG9hZGluZyBub3Rlcy4uLjwvcD5cbiAgICAgIDwvZGl2PlxuICAgIDwvbmctdGVtcGxhdGU+XG4gIDwvZGl2PlxuPC9kaXY+Il19
@@ -1,51 +0,0 @@
1
- import { HttpClient } from '@angular/common/http';
2
- import { Injectable, inject } from '@angular/core';
3
- import { cidePath, coreRoutesUrl, hostManagerRoutesUrl } from 'cloud-ide-lms-model';
4
- import { of } from 'rxjs';
5
- import { map } from 'rxjs/operators';
6
- import * as i0 from "@angular/core";
7
- export class CideLytDrawerNotesService {
8
- constructor() {
9
- // Modern Angular v20 dependency injection pattern
10
- this.http = inject(HttpClient);
11
- // Modern Angular v20 pattern: Use constructor for initialization only
12
- }
13
- getNotes() {
14
- const url = cidePath.join([
15
- hostManagerRoutesUrl.cideSuiteHost,
16
- coreRoutesUrl.module,
17
- coreRoutesUrl.systemPageNotesManager
18
- ]);
19
- return this.http.get(url).pipe(map((res) => res.data || []));
20
- }
21
- addNote(note) {
22
- const url = cidePath.join([
23
- hostManagerRoutesUrl.cideSuiteHost,
24
- coreRoutesUrl.module,
25
- coreRoutesUrl.systemPageNotesManager
26
- ]);
27
- return this.http.post(url, note).pipe(map((res) => res.data));
28
- }
29
- updateNote(note) {
30
- const url = cidePath.join([
31
- hostManagerRoutesUrl.cideSuiteHost,
32
- coreRoutesUrl.module,
33
- coreRoutesUrl.systemPageNotesManager
34
- ]);
35
- return this.http.post(url, note).pipe(map((res) => res.data));
36
- }
37
- deleteNote(noteId) {
38
- // Mock implementation: simulate deleting a note.
39
- console.log('Deleting note with ID:', noteId);
40
- return of({ success: true });
41
- }
42
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.7", ngImport: i0, type: CideLytDrawerNotesService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
43
- static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.7", ngImport: i0, type: CideLytDrawerNotesService, providedIn: 'root' }); }
44
- }
45
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.7", ngImport: i0, type: CideLytDrawerNotesService, decorators: [{
46
- type: Injectable,
47
- args: [{
48
- providedIn: 'root'
49
- }]
50
- }], ctorParameters: () => [] });
51
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2lkZWRyYXdlci1ub3Rlcy5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvY2xvdWQtaWRlLWxheW91dC9zcmMvbGliL2xheW91dC9zaWRlZHJhd2VyL3NpZGVkcmF3ZXItbm90ZXMvc2lkZWRyYXdlci1ub3Rlcy5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUNsRCxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNuRCxPQUFPLEVBQXlHLFFBQVEsRUFBRSxhQUFhLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUMzTCxPQUFPLEVBQWMsRUFBRSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQ3RDLE9BQU8sRUFBRSxHQUFHLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQzs7QUFLckMsTUFBTSxPQUFPLHlCQUF5QjtJQUlwQztRQUhBLGtEQUFrRDtRQUMxQyxTQUFJLEdBQUcsTUFBTSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBR2hDLHNFQUFzRTtJQUN4RSxDQUFDO0lBRUQsUUFBUTtRQUNOLE1BQU0sR0FBRyxHQUFHLFFBQVEsQ0FBQyxJQUFJLENBQUM7WUFDeEIsb0JBQW9CLENBQUMsYUFBYTtZQUNsQyxhQUFhLENBQUMsTUFBTTtZQUNwQixhQUFhLENBQUMsc0JBQXNCO1NBQ3JDLENBQUMsQ0FBQztRQUNILE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQTJDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLEdBQUcsQ0FBQyxJQUFJLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQztJQUN6RyxDQUFDO0lBRUQsT0FBTyxDQUFDLElBQWU7UUFDckIsTUFBTSxHQUFHLEdBQUcsUUFBUSxDQUFDLElBQUksQ0FBQztZQUN4QixvQkFBb0IsQ0FBQyxhQUFhO1lBQ2xDLGFBQWEsQ0FBQyxNQUFNO1lBQ3BCLGFBQWEsQ0FBQyxzQkFBc0I7U0FDckMsQ0FBQyxDQUFDO1FBQ0gsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBbUQsR0FBRyxFQUFFLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO0lBQ2xILENBQUM7SUFFRCxVQUFVLENBQUMsSUFBZTtRQUN4QixNQUFNLEdBQUcsR0FBRyxRQUFRLENBQUMsSUFBSSxDQUFDO1lBQ3hCLG9CQUFvQixDQUFDLGFBQWE7WUFDbEMsYUFBYSxDQUFDLE1BQU07WUFDcEIsYUFBYSxDQUFDLHNCQUFzQjtTQUNyQyxDQUFDLENBQUM7UUFDSCxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFtRCxHQUFHLEVBQUUsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7SUFDbEgsQ0FBQztJQUVELFVBQVUsQ0FBQyxNQUFjO1FBQ3ZCLGlEQUFpRDtRQUNqRCxPQUFPLENBQUMsR0FBRyxDQUFDLHdCQUF3QixFQUFFLE1BQU0sQ0FBQyxDQUFDO1FBQzlDLE9BQU8sRUFBRSxDQUFDLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7SUFDL0IsQ0FBQzs4R0F2Q1UseUJBQXlCO2tIQUF6Qix5QkFBeUIsY0FGeEIsTUFBTTs7MkZBRVAseUJBQXlCO2tCQUhyQyxVQUFVO21CQUFDO29CQUNWLFVBQVUsRUFBRSxNQUFNO2lCQUNuQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEh0dHBDbGllbnQgfSBmcm9tICdAYW5ndWxhci9jb21tb24vaHR0cCc7XG5pbXBvcnQgeyBJbmplY3RhYmxlLCBpbmplY3QgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IElDb3JlU3lwbiwgSVBhZ2VOb3Rlc01hbmFnZXJDcmVhdGVVcGRhdGVDb250cm9sbGVyUmVzcG9vbnNlLCBJUGFnZU5vdGVzTWFuYWdlckxpc3RDb250cm9sbGVyUmVzcG9vbnNlLCBjaWRlUGF0aCwgY29yZVJvdXRlc1VybCwgaG9zdE1hbmFnZXJSb3V0ZXNVcmwgfSBmcm9tICdjbG91ZC1pZGUtbG1zLW1vZGVsJztcbmltcG9ydCB7IE9ic2VydmFibGUsIG9mIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBtYXAgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5cbkBJbmplY3RhYmxlKHtcbiAgcHJvdmlkZWRJbjogJ3Jvb3QnXG59KVxuZXhwb3J0IGNsYXNzIENpZGVMeXREcmF3ZXJOb3Rlc1NlcnZpY2Uge1xuICAvLyBNb2Rlcm4gQW5ndWxhciB2MjAgZGVwZW5kZW5jeSBpbmplY3Rpb24gcGF0dGVyblxuICBwcml2YXRlIGh0dHAgPSBpbmplY3QoSHR0cENsaWVudCk7XG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgLy8gTW9kZXJuIEFuZ3VsYXIgdjIwIHBhdHRlcm46IFVzZSBjb25zdHJ1Y3RvciBmb3IgaW5pdGlhbGl6YXRpb24gb25seVxuICB9XG5cbiAgZ2V0Tm90ZXMoKTogT2JzZXJ2YWJsZTxJQ29yZVN5cG5bXT4ge1xuICAgIGNvbnN0IHVybCA9IGNpZGVQYXRoLmpvaW4oW1xuICAgICAgaG9zdE1hbmFnZXJSb3V0ZXNVcmwuY2lkZVN1aXRlSG9zdCxcbiAgICAgIGNvcmVSb3V0ZXNVcmwubW9kdWxlLFxuICAgICAgY29yZVJvdXRlc1VybC5zeXN0ZW1QYWdlTm90ZXNNYW5hZ2VyXG4gICAgXSk7XG4gICAgcmV0dXJuIHRoaXMuaHR0cC5nZXQ8SVBhZ2VOb3Rlc01hbmFnZXJMaXN0Q29udHJvbGxlclJlc3Bvb25zZT4odXJsKS5waXBlKG1hcCgocmVzKSA9PiByZXMuZGF0YSB8fCBbXSkpO1xuICB9XG5cbiAgYWRkTm90ZShub3RlOiBJQ29yZVN5cG4pOiBPYnNlcnZhYmxlPHVua25vd24+IHtcbiAgICBjb25zdCB1cmwgPSBjaWRlUGF0aC5qb2luKFtcbiAgICAgIGhvc3RNYW5hZ2VyUm91dGVzVXJsLmNpZGVTdWl0ZUhvc3QsXG4gICAgICBjb3JlUm91dGVzVXJsLm1vZHVsZSxcbiAgICAgIGNvcmVSb3V0ZXNVcmwuc3lzdGVtUGFnZU5vdGVzTWFuYWdlclxuICAgIF0pO1xuICAgIHJldHVybiB0aGlzLmh0dHAucG9zdDxJUGFnZU5vdGVzTWFuYWdlckNyZWF0ZVVwZGF0ZUNvbnRyb2xsZXJSZXNwb29uc2U+KHVybCwgbm90ZSkucGlwZShtYXAoKHJlcykgPT4gcmVzLmRhdGEpKTtcbiAgfVxuXG4gIHVwZGF0ZU5vdGUobm90ZTogSUNvcmVTeXBuKTogT2JzZXJ2YWJsZTx1bmtub3duPiB7XG4gICAgY29uc3QgdXJsID0gY2lkZVBhdGguam9pbihbXG4gICAgICBob3N0TWFuYWdlclJvdXRlc1VybC5jaWRlU3VpdGVIb3N0LFxuICAgICAgY29yZVJvdXRlc1VybC5tb2R1bGUsXG4gICAgICBjb3JlUm91dGVzVXJsLnN5c3RlbVBhZ2VOb3Rlc01hbmFnZXJcbiAgICBdKTtcbiAgICByZXR1cm4gdGhpcy5odHRwLnBvc3Q8SVBhZ2VOb3Rlc01hbmFnZXJDcmVhdGVVcGRhdGVDb250cm9sbGVyUmVzcG9vbnNlPih1cmwsIG5vdGUpLnBpcGUobWFwKChyZXMpID0+IHJlcy5kYXRhKSk7XG4gIH1cblxuICBkZWxldGVOb3RlKG5vdGVJZDogc3RyaW5nKTogT2JzZXJ2YWJsZTx1bmtub3duPiB7XG4gICAgLy8gTW9jayBpbXBsZW1lbnRhdGlvbjogc2ltdWxhdGUgZGVsZXRpbmcgYSBub3RlLlxuICAgIGNvbnNvbGUubG9nKCdEZWxldGluZyBub3RlIHdpdGggSUQ6Jywgbm90ZUlkKTtcbiAgICByZXR1cm4gb2YoeyBzdWNjZXNzOiB0cnVlIH0pO1xuICB9XG5cbiAgLy8gQWRkaXRpb25hbCBtZXRob2RzIGZvciB1cGRhdGluZyBhbmQgZGVsZXRpbmcgbm90ZXMgY291bGQgYmUgYWRkZWQgaGVyZS5cbiAgLy8gWW91IG1pZ2h0IGFsc28gaW5jbHVkZSBlcnJvciBoYW5kbGluZyBvciBtb3JlIGNvbXBsZXggZGF0YSBtYW5pcHVsYXRpb24uXG59Il19