vcomply-workflow-engine 7.4.6 → 7.4.8

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,4 +1,21 @@
1
- export const RISK_CLASS_LIST = ['high', 'low-medium', 'low', 'medium-high'];
1
+ export const RISK_CLASS_LIST = [
2
+ 'high',
3
+ 'medium-high',
4
+ 'medium',
5
+ 'low-medium',
6
+ 'low',
7
+ ];
8
+ export const VALIDATION_SEVERITY = {
9
+ ERROR: 'error',
10
+ WARNING: 'warning',
11
+ INFO: 'info',
12
+ };
13
+ export const NON_BLOCKING_DROPDOWN_FIELDS = [
14
+ 'assignor',
15
+ 'assigneeType',
16
+ 'keyResponsibility',
17
+ 'dueTime',
18
+ ];
2
19
  export const YES_NO_DROPDOWN_LIST = ['Yes', 'No'];
3
20
  export const PROGRAM_TYPE_DROPDOWN_LIST = [
4
21
  'Regulations',
@@ -41,6 +58,28 @@ export const FREQUENCY_DROPDOWN_LIST = [
41
58
  'One Time',
42
59
  'Other Frequency',
43
60
  ];
61
+ /** Due Date (Day) max is 7 for these frequencies (DD-02). */
62
+ export const WEEKDAY_FREQUENCIES = [
63
+ 'weekly',
64
+ 'every week',
65
+ 'every 2 weeks',
66
+ 'every 3 weeks',
67
+ 'every fortnight',
68
+ ];
69
+ export const SHORT_MONTH_NAMES = [
70
+ 'jan',
71
+ 'feb',
72
+ 'mar',
73
+ 'apr',
74
+ 'may',
75
+ 'jun',
76
+ 'jul',
77
+ 'aug',
78
+ 'sep',
79
+ 'oct',
80
+ 'nov',
81
+ 'dec',
82
+ ];
44
83
  export const FULL_MONTH_NAMES = [
45
84
  'January',
46
85
  'February',
@@ -55,8 +94,108 @@ export const FULL_MONTH_NAMES = [
55
94
  'November',
56
95
  'December',
57
96
  ];
97
+ export const FILE_VALIDATION_MESSAGES = {
98
+ HEADERS_MISSING: 'One or more required columns are missing or have been renamed. Use the original VComply template without modifying column headers.',
99
+ EXTRA_COLUMNS: 'Additional columns have been detected in the template. Please do not insert or delete columns. Download a fresh template and re-populate.',
100
+ };
101
+ export const REQUIRED_TEMPLATE_HEADERS = [
102
+ 'responsibility name',
103
+ 'entrusted by',
104
+ 'key responsibility',
105
+ 'risk class',
106
+ 'format',
107
+ 'evidence',
108
+ 'reviewer',
109
+ ];
110
+ export const REQUIRED_FREQUENCY_HEADERS = ['frequency'];
111
+ export const REQUIRED_ASSIGNEE_HEADERS = ['entrust to', 'person or group'];
112
+ export const ALLOWED_TEMPLATE_HEADERS = [
113
+ 'responsibility name',
114
+ 'program',
115
+ 'program type',
116
+ 'program category',
117
+ 'entrusted by',
118
+ 'entrust to',
119
+ 'person or group',
120
+ 'all or any persons',
121
+ 'key responsibility',
122
+ 'frequency of occurrence and completion window',
123
+ 'frequency',
124
+ 'due date',
125
+ 'due time',
126
+ 'start',
127
+ 'fail',
128
+ 'responsibility ends after occurences',
129
+ 'responsibility ends after occurrences',
130
+ 'responsibility ends by date',
131
+ 'responsibility centre',
132
+ 'responsibility center',
133
+ 'risk class',
134
+ 'objective',
135
+ 'notes',
136
+ 'format & evidence',
137
+ 'format and evidence',
138
+ 'format',
139
+ 'format for responsibility',
140
+ 'evidence',
141
+ 'review of responsibility',
142
+ 'reviewer',
143
+ 'reviewer type',
144
+ 'review start',
145
+ 'review fail',
146
+ 'overseer',
147
+ 'always notify',
148
+ 'notify on failure',
149
+ 'collaborator',
150
+ 'assessments or checkpoints',
151
+ 'who should be shown',
152
+ 'created the responsibility',
153
+ 'number of occurrences',
154
+ 'specify the type',
155
+ 'no. of days',
156
+ 'completion window',
157
+ 'entrusted to',
158
+ 'assignor',
159
+ 'assignee',
160
+ ];
58
161
  export const VALIDATION_MESSAGES = {
59
162
  DROPDOWN: 'The data added in this field is not valid. Select from the dropdown provided in the template.',
163
+ FILE_HEADERS_MISSING: FILE_VALIDATION_MESSAGES.HEADERS_MISSING,
164
+ FILE_EXTRA_COLUMNS: FILE_VALIDATION_MESSAGES.EXTRA_COLUMNS,
165
+ RESPONSIBILITY_NAME_REQUIRED: 'This is a mandatory field. Enter a name for this responsibility.',
166
+ RESPONSIBILITY_NAME_WHITESPACE: 'Responsibility Name cannot be blank or contain only spaces.',
167
+ PROGRAM_CATEGORY_MISMATCH: 'Program Category does not belong to the selected Program. Select a valid category for this Program.',
168
+ PROGRAM_CATEGORY_WITHOUT_PROGRAM: 'Program Category has been provided without a Program. Select a Program, or clear the Program Category field.',
169
+ PROGRAM_TYPE_WITHOUT_PROGRAM: 'Program Type has been provided without a Program. Please also select a Program, or clear the Program Type field.',
170
+ ENTRUSTED_BY_INVALID: 'This is not a valid user. Select a user from the dropdown or leave blank to use your account as the default.',
171
+ ENTRUSTED_BY_INACTIVE: 'The user selected in this field is inactive. Select an active user or leave blank to use your account as the default.',
172
+ ASSIGNEE_REQUIRED: 'This is a mandatory field. Select a user or group.',
173
+ ASSIGNEE_INVALID: 'This is not a valid user or group in VComply. Select from the dropdown provided in the template.',
174
+ ASSIGNEE_INACTIVE: 'The user selected in this field is inactive. Select an active user or group.',
175
+ ASSIGNEE_TYPE_INVALID: 'The data added in this field is not valid. Select from the dropdown provided in the template or the default selection of "Any select person can completed this" will be applied.',
176
+ GROUP_ALL_ANY_BLANK: "A group has been assigned. The default selection of 'Any selected person can complete this' will be applied.",
177
+ KEY_RESPONSIBILITY_INVALID: "The data added in this field is not valid. Please select 'Yes', 'No', or leave blank (defaults to 'Not a Key Responsibility').",
178
+ FREQUENCY_REQUIRED: 'This is mandatory field. Select a frequency.',
179
+ DUE_DATE_DAY_NOT_NUMBER: 'The data added in this field is not valid. Enter a number from the dropdown provided in the template.',
180
+ DUE_DATE_DAY_OUT_OF_RANGE: 'The value provided is out of range for a [Weekly] frequency. Select a valid option.',
181
+ DUE_DATE_REQUIRED: 'This is mandatory field. Select from the dropdown provided in the template.',
182
+ DUE_DATE_MONTH_INVALID: 'The data added in this field is not valid. Select a month from the dropdown provided in the template.',
183
+ DUE_TIME_BLANK: 'The responsibilities will be created with a default time of 11:30 PM according to your VComply timezone.',
184
+ RC_TYPE_WITHOUT_NAME: 'Responsibility Center Type has been provided without a Responsibility Center Name. Enter the Responsibility Center name.',
185
+ RC_INACTIVE: 'This Responsibility Center no longer exists in VComply. Select an active Responsibility Center or leave blank.',
186
+ FORMAT_LINK_WITHOUT_YES: 'A format link has been provided but Format selecton is set to "No". Set the Format field to "Yes" and upload the template again.',
187
+ FORMAT_INVALID_URL: 'This is an invalid URL.',
188
+ REVIEWER_INACTIVE: 'This user is inactive. Select an active user or group.',
189
+ REVIEW_WINDOW_WITHOUT_REVIEWER: 'Review window has been specified but no Reviewer has been selected. Select a Reviewer, or clear these fields.',
190
+ OVERSIGHT_DUPLICATE_ASSIGNEE: 'This user is already assigned as the primary Assignee. Adding them to oversight is redundant.',
191
+ OVERSIGHT_DUPLICATE_ASSIGNOR: 'This user is already assigned as the Assignor. Adding them to oversight is redundant.',
192
+ OVERSIGHT_INACTIVE: 'This user is inactive. Select an active user or group.',
193
+ COLLABORATOR_INACTIVE: 'This user is inactive. Select an active user.',
194
+ COLLABORATOR_GROUP: 'Collaborators must be individual users, not groups. Please select a specific user for the Collaborator field.',
195
+ ONE_TIME_LIFECYCLE: "A 'One Time' responsibility cannot also have a lifecycle end rule. Clear the Ends After Occurrences and Ends By Date fields.",
196
+ ENDS_AFTER_ONE_OCCURRENCE: "Ending after 1 occurrence is equivalent to a 'One Time' responsibility. Consider using the 'One Time' frequency instead.",
197
+ USER_NOT_IN_PROGRAM: 'This user is not associated with the selected Program.',
198
+ PAST_DUE_DATE: 'This date occurs in the past. Select a future date.',
60
199
  RISK_CLASS: 'Invalid risk class. Select a valid option from the drop-down list.',
61
200
  DAY: 'Invalid day selection. Select a valid day from the drop-down list in the template.',
62
201
  DATE_FORMAT: 'Invalid date format. Select a valid date from the drop-down list in the template.',
@@ -71,4 +210,7 @@ export const VALIDATION_MESSAGES = {
71
210
  ENDS_BY_DATE_PAST: 'The Ends By Date is in the past. This responsibility will be created with no future occurrences.',
72
211
  ENDS_BY_DATE_CONFLICT: "You have provided values for both 'Ends After Occurrences' and 'Ends By Date'. Fill in only one, or leave both blank if the responsibility will always be active.",
73
212
  };
74
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVzcG9uc2liaWxpdHkuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy92eC13b3JrZmxvdy1lbmdpbmUvc3JjL2xpYi9jb25zdGFudHMvcmVzcG9uc2liaWxpdHkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsTUFBTSxDQUFDLE1BQU0sZUFBZSxHQUFHLENBQUMsTUFBTSxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQUUsYUFBYSxDQUFDLENBQUM7QUFFNUUsTUFBTSxDQUFDLE1BQU0sb0JBQW9CLEdBQUcsQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLENBQUM7QUFFbEQsTUFBTSxDQUFDLE1BQU0sMEJBQTBCLEdBQUc7SUFDeEMsYUFBYTtJQUNiLFdBQVc7SUFDWCxtQkFBbUI7SUFDbkIsUUFBUTtDQUNULENBQUM7QUFFRixNQUFNLENBQUMsTUFBTSwyQkFBMkIsR0FBRztJQUN6QywyREFBMkQ7SUFDM0Qsc0RBQXNEO0NBQ3ZELENBQUM7QUFFRixNQUFNLENBQUMsTUFBTSxxQkFBcUIsR0FBRztJQUNuQyw0QkFBNEI7SUFDNUIsa0NBQWtDO0NBQ25DLENBQUM7QUFFRixNQUFNLENBQUMsTUFBTSwyQkFBMkIsR0FBRztJQUN6QyxZQUFZO0lBQ1osd0NBQXdDO0NBQ3pDLENBQUM7QUFFRixNQUFNLENBQUMsTUFBTSx1QkFBdUIsR0FBRztJQUNyQyxPQUFPO0lBQ1AscUJBQXFCO0lBQ3JCLFFBQVE7SUFDUixlQUFlO0lBQ2YsaUJBQWlCO0lBQ2pCLGVBQWU7SUFDZixlQUFlO0lBQ2YsU0FBUztJQUNULGVBQWU7SUFDZix1QkFBdUI7SUFDdkIsV0FBVztJQUNYLGdCQUFnQjtJQUNoQixVQUFVO0lBQ1YsUUFBUTtJQUNSLGVBQWU7SUFDZixlQUFlO0lBQ2YsZUFBZTtJQUNmLGVBQWU7SUFDZixnQkFBZ0I7SUFDaEIsVUFBVTtJQUNWLGlCQUFpQjtDQUNsQixDQUFDO0FBRUYsTUFBTSxDQUFDLE1BQU0sZ0JBQWdCLEdBQUc7SUFDOUIsU0FBUztJQUNULFVBQVU7SUFDVixPQUFPO0lBQ1AsT0FBTztJQUNQLEtBQUs7SUFDTCxNQUFNO0lBQ04sTUFBTTtJQUNOLFFBQVE7SUFDUixXQUFXO0lBQ1gsU0FBUztJQUNULFVBQVU7SUFDVixVQUFVO0NBQ1gsQ0FBQztBQUVGLE1BQU0sQ0FBQyxNQUFNLG1CQUFtQixHQUFHO0lBQ2pDLFFBQVEsRUFDTiwrRkFBK0Y7SUFDakcsVUFBVSxFQUNSLG9FQUFvRTtJQUN0RSxHQUFHLEVBQUUsb0ZBQW9GO0lBQ3pGLFdBQVcsRUFDVCxtRkFBbUY7SUFDckYsUUFBUSxFQUFFLG1CQUFtQjtJQUM3QixRQUFRLEVBQ04scUhBQXFIO0lBQ3ZILHdDQUF3QyxFQUFFLHdCQUF3QjtJQUNsRSw4QkFBOEIsRUFBRSx1QkFBdUI7SUFDdkQseUJBQXlCLEVBQ3ZCLHNFQUFzRTtJQUN4RSxlQUFlLEVBQUUsMkJBQTJCO0lBQzVDLDBCQUEwQixFQUN4QiwrRkFBK0Y7SUFDakcsdUJBQXVCLEVBQ3JCLHNIQUFzSDtJQUN4SCxpQkFBaUIsRUFDZixrR0FBa0c7SUFDcEcscUJBQXFCLEVBQ25CLG1LQUFtSztDQUN0SyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IGNvbnN0IFJJU0tfQ0xBU1NfTElTVCA9IFsnaGlnaCcsICdsb3ctbWVkaXVtJywgJ2xvdycsICdtZWRpdW0taGlnaCddO1xyXG5cclxuZXhwb3J0IGNvbnN0IFlFU19OT19EUk9QRE9XTl9MSVNUID0gWydZZXMnLCAnTm8nXTtcclxuXHJcbmV4cG9ydCBjb25zdCBQUk9HUkFNX1RZUEVfRFJPUERPV05fTElTVCA9IFtcclxuICAnUmVndWxhdGlvbnMnLFxyXG4gICdTdGFuZGFyZHMnLFxyXG4gICdJbnRlcm5hbCBDb250cm9scycsXHJcbiAgJ090aGVycycsXHJcbl07XHJcblxyXG5leHBvcnQgY29uc3QgQVNTSUdORUVfVFlQRV9EUk9QRE9XTl9MSVNUID0gW1xyXG4gICdBbGwgc2VsZWN0ZWQgcGVyc29ucyBuZWVkIHRvIGNvbXBsZXRlIHRoaXMgcmVzcG9uc2liaWxpdHknLFxyXG4gICdBbnkgc2VsZWN0ZWQgcGVyc29uIGNhbiBjb21wbGV0ZSB0aGlzIHJlc3BvbnNpYmlsaXR5JyxcclxuXTtcclxuXHJcbmV4cG9ydCBjb25zdCBSQ19UWVBFX0RST1BET1dOX0xJU1QgPSBbXHJcbiAgJ0Fzc2lnbiBzYW1lIHJlc3BvbnNpYmlsaXR5JyxcclxuICAnQ3JlYXRlIHNlcGFyYXRlIHJlc3BvbnNpYmlsaXRpZXMnLFxyXG5dO1xyXG5cclxuZXhwb3J0IGNvbnN0IFJFVklFV0VSX1RZUEVfRFJPUERPV05fTElTVCA9IFtcclxuICAnU0VRVUVOVElBTCcsXHJcbiAgJ0FOWSBSRVZJRVdFUiBDQU4gTUFSSyBUSElTIEFTIFJFVklFV0VEJyxcclxuXTtcclxuXHJcbmV4cG9ydCBjb25zdCBGUkVRVUVOQ1lfRFJPUERPV05fTElTVCA9IFtcclxuICAnRGFpbHknLFxyXG4gICdFdmVyeSBBbHRlcm5hdGUgRGF5JyxcclxuICAnV2Vla2x5JyxcclxuICAnRXZlcnkgMTAgRGF5cycsXHJcbiAgJ0V2ZXJ5IEZvcnRuaWdodCcsXHJcbiAgJ0V2ZXJ5IDIgV2Vla3MnLFxyXG4gICdFdmVyeSAzIFdlZWtzJyxcclxuICAnTW9udGhseScsXHJcbiAgJ0V2ZXJ5IDQ1IERheXMnLFxyXG4gICdFdmVyeSBBbHRlcm5hdGUgTW9udGgnLFxyXG4gICdRdWFydGVybHknLFxyXG4gICdFdmVyeSAxMjAgRGF5cycsXHJcbiAgJ0JpYW5udWFsJyxcclxuICAnQW5udWFsJyxcclxuICAnRXZlcnkgMiBZZWFycycsXHJcbiAgJ0V2ZXJ5IDMgWWVhcnMnLFxyXG4gICdFdmVyeSA0IFllYXJzJyxcclxuICAnRXZlcnkgNSBZZWFycycsXHJcbiAgJ0V2ZXJ5IDEwIFllYXJzJyxcclxuICAnT25lIFRpbWUnLFxyXG4gICdPdGhlciBGcmVxdWVuY3knLFxyXG5dO1xyXG5cclxuZXhwb3J0IGNvbnN0IEZVTExfTU9OVEhfTkFNRVMgPSBbXHJcbiAgJ0phbnVhcnknLFxyXG4gICdGZWJydWFyeScsXHJcbiAgJ01hcmNoJyxcclxuICAnQXByaWwnLFxyXG4gICdNYXknLFxyXG4gICdKdW5lJyxcclxuICAnSnVseScsXHJcbiAgJ0F1Z3VzdCcsXHJcbiAgJ1NlcHRlbWJlcicsXHJcbiAgJ09jdG9iZXInLFxyXG4gICdOb3ZlbWJlcicsXHJcbiAgJ0RlY2VtYmVyJyxcclxuXTtcclxuXHJcbmV4cG9ydCBjb25zdCBWQUxJREFUSU9OX01FU1NBR0VTID0ge1xyXG4gIERST1BET1dOOlxyXG4gICAgJ1RoZSBkYXRhIGFkZGVkIGluIHRoaXMgZmllbGQgaXMgbm90IHZhbGlkLiBTZWxlY3QgZnJvbSB0aGUgZHJvcGRvd24gcHJvdmlkZWQgaW4gdGhlIHRlbXBsYXRlLicsXHJcbiAgUklTS19DTEFTUzpcclxuICAgICdJbnZhbGlkIHJpc2sgY2xhc3MuIFNlbGVjdCBhIHZhbGlkIG9wdGlvbiBmcm9tIHRoZSBkcm9wLWRvd24gbGlzdC4nLFxyXG4gIERBWTogJ0ludmFsaWQgZGF5IHNlbGVjdGlvbi4gU2VsZWN0IGEgdmFsaWQgZGF5IGZyb20gdGhlIGRyb3AtZG93biBsaXN0IGluIHRoZSB0ZW1wbGF0ZS4nLFxyXG4gIERBVEVfRk9STUFUOlxyXG4gICAgJ0ludmFsaWQgZGF0ZSBmb3JtYXQuIFNlbGVjdCBhIHZhbGlkIGRhdGUgZnJvbSB0aGUgZHJvcC1kb3duIGxpc3QgaW4gdGhlIHRlbXBsYXRlLicsXHJcbiAgRFVFX0RBVEU6ICdJbnZhbGlkIER1ZSBEYXRlLicsXHJcbiAgRFVFX1RJTUU6XHJcbiAgICBcIlRoaXMgdmFsdWUgZG9lcyBub3QgbWF0Y2ggdGhlIFZDb21wbHkgdGVtcGxhdGUncyBmb3JtYXQuIFVzZSB0aGUgY29ycmVjdCB2YWx1ZSBmcm9tIHRoZSBkcm9wLWRvd25zIGluIHRoZSB0ZW1wbGF0ZS5cIixcclxuICBFTkRTX0FGVEVSX09DQ1VSUkVOQ0VTX0dSRUFURVJfVEhBTl9aRVJPOiAnTXVzdCBiZSBncmVhdGVyIHRoYW4gMCcsXHJcbiAgRU5EU19BRlRFUl9PQ0NVUlJFTkNFU19OVU1FUklDOiAnTXVzdCBiZSBudW1lcmljIHZhbHVlJyxcclxuICBXSE9MRV9OVU1CRVJfTk9OX05FR0FUSVZFOlxyXG4gICAgJ011c3QgYmUgYSB3aG9sZSBudW1iZXIuIE5lZ2F0aXZlIGFuZCBkZWNpbWFsIHZhbHVlcyBhcmUgbm90IGFsbG93ZWQuJyxcclxuICBQT1NJVElWRV9OVU1CRVI6ICdNdXN0IGJlIGEgcG9zaXRpdmUgbnVtYmVyJyxcclxuICBFTkRTX0JZX0RBVEVfSU5WQUxJRF9WQUxVRTpcclxuICAgICdUaGUgZGF0YSBhZGRlZCBpbiB0aGlzIGZpZWxkIGlzIG5vdCB2YWxpZC4gU2VsZWN0IGZyb20gdGhlIGRyb3Bkb3duIHByb3ZpZGVkIGluIHRoZSB0ZW1wbGF0ZS4nLFxyXG4gIEVORFNfQllfREFURV9JTkNPTVBMRVRFOlxyXG4gICAgJ0VuZHMgQnkgRGF0ZSByZXF1aXJlcyBib3RoIGEgZGF5IGFuZCBhIG1vbnRoLiBQbGVhc2UgY29tcGxldGUgYm90aCBmaWVsZHMgb3IgY2xlYXIgYm90aCB0byBsZWF2ZSB0aGUgZW5kIGRhdGUgdW5zZXQuJyxcclxuICBFTkRTX0JZX0RBVEVfUEFTVDpcclxuICAgICdUaGUgRW5kcyBCeSBEYXRlIGlzIGluIHRoZSBwYXN0LiBUaGlzIHJlc3BvbnNpYmlsaXR5IHdpbGwgYmUgY3JlYXRlZCB3aXRoIG5vIGZ1dHVyZSBvY2N1cnJlbmNlcy4nLFxyXG4gIEVORFNfQllfREFURV9DT05GTElDVDpcclxuICAgIFwiWW91IGhhdmUgcHJvdmlkZWQgdmFsdWVzIGZvciBib3RoICdFbmRzIEFmdGVyIE9jY3VycmVuY2VzJyBhbmQgJ0VuZHMgQnkgRGF0ZScuIEZpbGwgaW4gb25seSBvbmUsIG9yIGxlYXZlIGJvdGggYmxhbmsgaWYgdGhlIHJlc3BvbnNpYmlsaXR5IHdpbGwgYWx3YXlzIGJlIGFjdGl2ZS5cIixcclxufTtcclxuIl19
213
+ export function dueDateDayOutOfRangeMessage(frequency) {
214
+ return `The value provided is out of range for a [${frequency}] frequency. Select a valid option.`;
215
+ }
216
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVzcG9uc2liaWxpdHkuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy92eC13b3JrZmxvdy1lbmdpbmUvc3JjL2xpYi9jb25zdGFudHMvcmVzcG9uc2liaWxpdHkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsTUFBTSxDQUFDLE1BQU0sZUFBZSxHQUFHO0lBQzdCLE1BQU07SUFDTixhQUFhO0lBQ2IsUUFBUTtJQUNSLFlBQVk7SUFDWixLQUFLO0NBQ04sQ0FBQztBQUVGLE1BQU0sQ0FBQyxNQUFNLG1CQUFtQixHQUFHO0lBQ2pDLEtBQUssRUFBRSxPQUFPO0lBQ2QsT0FBTyxFQUFFLFNBQVM7SUFDbEIsSUFBSSxFQUFFLE1BQU07Q0FDSixDQUFDO0FBRVgsTUFBTSxDQUFDLE1BQU0sNEJBQTRCLEdBQUc7SUFDMUMsVUFBVTtJQUNWLGNBQWM7SUFDZCxtQkFBbUI7SUFDbkIsU0FBUztDQUNWLENBQUM7QUFFRixNQUFNLENBQUMsTUFBTSxvQkFBb0IsR0FBRyxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsQ0FBQztBQUVsRCxNQUFNLENBQUMsTUFBTSwwQkFBMEIsR0FBRztJQUN4QyxhQUFhO0lBQ2IsV0FBVztJQUNYLG1CQUFtQjtJQUNuQixRQUFRO0NBQ1QsQ0FBQztBQUVGLE1BQU0sQ0FBQyxNQUFNLDJCQUEyQixHQUFHO0lBQ3pDLDJEQUEyRDtJQUMzRCxzREFBc0Q7Q0FDdkQsQ0FBQztBQUVGLE1BQU0sQ0FBQyxNQUFNLHFCQUFxQixHQUFHO0lBQ25DLDRCQUE0QjtJQUM1QixrQ0FBa0M7Q0FDbkMsQ0FBQztBQUVGLE1BQU0sQ0FBQyxNQUFNLDJCQUEyQixHQUFHO0lBQ3pDLFlBQVk7SUFDWix3Q0FBd0M7Q0FDekMsQ0FBQztBQUVGLE1BQU0sQ0FBQyxNQUFNLHVCQUF1QixHQUFHO0lBQ3JDLE9BQU87SUFDUCxxQkFBcUI7SUFDckIsUUFBUTtJQUNSLGVBQWU7SUFDZixpQkFBaUI7SUFDakIs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QUN4RSxlQUFlLEVBQUUsMkJBQTJCO0lBQzVDLDBCQUEwQixFQUN4QiwrRkFBK0Y7SUFDakcsdUJBQXVCLEVBQ3JCLHNIQUFzSDtJQUN4SCxpQkFBaUIsRUFDZixrR0FBa0c7SUFDcEcscUJBQXFCLEVBQ25CLG1LQUFtSztDQUN0SyxDQUFDO0FBRUYsTUFBTSxVQUFVLDJCQUEyQixDQUFDLFNBQWlCO0lBQzNELE9BQU8sNkNBQTZDLFNBQVMscUNBQXFDLENBQUM7QUFDckcsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCBjb25zdCBSSVNLX0NMQVNTX0xJU1QgPSBbXHJcbiAgJ2hpZ2gnLFxyXG4gICdtZWRpdW0taGlnaCcsXHJcbiAgJ21lZGl1bScsXHJcbiAgJ2xvdy1tZWRpdW0nLFxyXG4gICdsb3cnLFxyXG5dO1xyXG5cclxuZXhwb3J0IGNvbnN0IFZBTElEQVRJT05fU0VWRVJJVFkgPSB7XHJcbiAgRVJST1I6ICdlcnJvcicsXHJcbiAgV0FSTklORzogJ3dhcm5pbmcnLFxyXG4gIElORk86ICdpbmZvJyxcclxufSBhcyBjb25zdDtcclxuXHJcbmV4cG9ydCBjb25zdCBOT05fQkxPQ0tJTkdfRFJPUERPV05fRklFTERTID0gW1xyXG4gICdhc3NpZ25vcicsXHJcbiAgJ2Fzc2lnbmVlVHlwZScsXHJcbiAgJ2tleVJlc3BvbnNpYmlsaXR5JyxcclxuICAnZHVlVGltZScsXHJcbl07XHJcblxyXG5leHBvcnQgY29uc3QgWUVTX05PX0RST1BET1dOX0xJU1QgPSBbJ1llcycsICdObyddO1xyXG5cclxuZXhwb3J0IGNvbnN0IFBST0dSQU1fVFlQRV9EUk9QRE9XTl9MSVNUID0gW1xyXG4gICdSZWd1bGF0aW9ucycsXHJcbiAgJ1N0YW5kYXJkcycsXHJcbiAgJ0ludGVybmFsIENvbnRyb2xzJyxcclxuICAnT3RoZXJzJyxcclxuXTtcclxuXHJcbmV4cG9ydCBjb25zdCBBU1NJR05FRV9UWVBFX0RST1BET1dOX0xJU1QgPSBbXHJcbiAgJ0FsbCBzZWxlY3RlZCBwZXJzb25zIG5lZWQgdG8gY29tcGxldGUgdGhpcyByZXNwb25zaWJpbGl0eScsXHJcbiAgJ0FueSBzZWxlY3RlZCBwZXJzb24gY2FuIGNvbXBsZXRlIHRoaXMgcmVzcG9uc2liaWxpdHknLFxyXG5dO1xyXG5cclxuZXhwb3J0IGNvbnN0IFJDX1RZUEVfRFJPUERPV05fTElTVCA9IFtcclxuICAnQXNzaWduIHNhbWUgcmVzcG9uc2liaWxpdHknLFxyXG4gICdDcmVhdGUgc2VwYXJhdGUgcmVzcG9uc2liaWxpdGllcycsXHJcbl07XHJcblxyXG5leHBvcnQgY29uc3QgUkVWSUVXRVJfVFlQRV9EUk9QRE9XTl9MSVNUID0gW1xyXG4gICdTRVFVRU5USUFMJyxcclxuICAnQU5ZIFJFVklFV0VSIENBTiBNQVJLIFRISVMgQVMgUkVWSUVXRUQnLFxyXG5dO1xyXG5cclxuZXhwb3J0IGNvbnN0IEZSRVFVRU5DWV9EUk9QRE9XTl9MSVNUID0gW1xyXG4gICdEYWlseScsXHJcbiAgJ0V2ZXJ5IEFsdGVybmF0ZSBEYXknLFxyXG4gICdXZWVrbHknLFxyXG4gICdFdmVyeSAxMCBEYXlzJyxcclxuICAnRXZlcnkgRm9ydG5pZ2h0JyxcclxuICAnRXZlcnkgMiBXZWVrcycsXHJcbiAgJ0V2ZXJ5IDMgV2Vla3MnLFxyXG4gICdNb250aGx5JyxcclxuICAnRXZlcnkgNDUgRGF5cycsXHJcbiAgJ0V2ZXJ5IEFsdGVybmF0ZSBNb250aCcsXHJcbiAgJ1F1YXJ0ZXJseScsXHJcbiAgJ0V2ZXJ5IDEyMCBEYXlzJyxcclxuICAnQmlhbm51YWwnLFxyXG4gICdBbm51YWwnLFxyXG4gICdFdmVyeSAyIFllYXJzJyxcclxuICAnRXZlcnkgMyBZZWFycycsXHJcbiAgJ0V2ZXJ5IDQgWWVhcnMnLFxyXG4gICdFdmVyeSA1IFllYXJzJyxcclxuICAnRXZlcnkgMTAgWWVhcnMnLFxyXG4gICdPbmUgVGltZScsXHJcbiAgJ090aGVyIEZyZXF1ZW5jeScsXHJcbl07XHJcblxyXG4vKiogRHVlIERhdGUgKERheSkgbWF4IGlzIDcgZm9yIHRoZXNlIGZyZXF1ZW5jaWVzIChERC0wMikuICovXHJcbmV4cG9ydCBjb25zdCBXRUVLREFZX0ZSRVFVRU5DSUVTID0gW1xyXG4gICd3ZWVrbHknLFxyXG4gICdldmVyeSB3ZWVrJyxcclxuICAnZXZlcnkgMiB3ZWVrcycsXHJcbiAgJ2V2ZXJ5IDMgd2Vla3MnLFxyXG4gICdldmVyeSBmb3J0bmlnaHQnLFxyXG5dO1xyXG5cclxuZXhwb3J0IGNvbnN0IFNIT1JUX01PTlRIX05BTUVTID0gW1xyXG4gICdqYW4nLFxyXG4gICdmZWInLFxyXG4gICdtYXInLFxyXG4gICdhcHInLFxyXG4gICdtYXknLFxyXG4gICdqdW4nLFxyXG4gICdqdWwnLFxyXG4gICdhdWcnLFxyXG4gICdzZXAnLFxyXG4gICdvY3QnLFxyXG4gICdub3YnLFxyXG4gICdkZWMnLFxyXG5dO1xyXG5cclxuZXhwb3J0IGNvbnN0IEZVTExfTU9OVEhfTkFNRVMgPSBbXHJcbiAgJ0phbnVhcnknLFxyXG4gICdGZWJydWFyeScsXHJcbiAgJ01hcmNoJyxcclxuICAnQXByaWwnLFxyXG4gICdNYXknLFxyXG4gICdKdW5lJyxcclxuICAnSnVseScsXHJcbiAgJ0F1Z3VzdCcsXHJcbiAgJ1NlcHRlbWJlcicsXHJcbiAgJ09jdG9iZXInLFxyXG4gICdOb3ZlbWJlcicsXHJcbiAgJ0RlY2VtYmVyJyxcclxuXTtcclxuXHJcbmV4cG9ydCBjb25zdCBGSUxFX1ZBTElEQVRJT05fTUVTU0FHRVMgPSB7XHJcbiAgSEVBREVSU19NSVNTSU5HOlxyXG4gICAgJ09uZSBvciBtb3JlIHJlcXVpcmVkIGNvbHVtbnMgYXJlIG1pc3Npbmcgb3IgaGF2ZSBiZWVuIHJlbmFtZWQuIFVzZSB0aGUgb3JpZ2luYWwgVkNvbXBseSB0ZW1wbGF0ZSB3aXRob3V0IG1vZGlmeWluZyBjb2x1bW4gaGVhZGVycy4nLFxyXG4gIEVYVFJBX0NPTFVNTlM6XHJcbiAgICAnQWRkaXRpb25hbCBjb2x1bW5zIGhhdmUgYmVlbiBkZXRlY3RlZCBpbiB0aGUgdGVtcGxhdGUuIFBsZWFzZSBkbyBub3QgaW5zZXJ0IG9yIGRlbGV0ZSBjb2x1bW5zLiBEb3dubG9hZCBhIGZyZXNoIHRlbXBsYXRlIGFuZCByZS1wb3B1bGF0ZS4nLFxyXG59O1xyXG5cclxuZXhwb3J0IGNvbnN0IFJFUVVJUkVEX1RFTVBMQVRFX0hFQURFUlMgPSBbXHJcbiAgJ3Jlc3BvbnNpYmlsaXR5IG5hbWUnLFxyXG4gICdlbnRydXN0ZWQgYnknLFxyXG4gICdrZXkgcmVzcG9uc2liaWxpdHknLFxyXG4gICdyaXNrIGNsYXNzJyxcclxuICAnZm9ybWF0JyxcclxuICAnZXZpZGVuY2UnLFxyXG4gICdyZXZpZXdlcicsXHJcbl07XHJcblxyXG5leHBvcnQgY29uc3QgUkVRVUlSRURfRlJFUVVFTkNZX0hFQURFUlMgPSBbJ2ZyZXF1ZW5jeSddO1xyXG5cclxuZXhwb3J0IGNvbnN0IFJFUVVJUkVEX0FTU0lHTkVFX0hFQURFUlMgPSBbJ2VudHJ1c3QgdG8nLCAncGVyc29uIG9yIGdyb3VwJ107XHJcblxyXG5leHBvcnQgY29uc3QgQUxMT1dFRF9URU1QTEFURV9IRUFERVJTID0gW1xyXG4gICdyZXNwb25zaWJpbGl0eSBuYW1lJyxcclxuICAncHJvZ3JhbScsXHJcbiAgJ3Byb2dyYW0gdHlwZScsXHJcbiAgJ3Byb2dyYW0gY2F0ZWdvcnknLFxyXG4gICdlbnRydXN0ZWQgYnknLFxyXG4gICdlbnRydXN0IHRvJyxcclxuICAncGVyc29uIG9yIGdyb3VwJyxcclxuICAnYWxsIG9yIGFueSBwZXJzb25zJyxcclxuICAna2V5IHJlc3BvbnNpYmlsaXR5JyxcclxuICAnZnJlcXVlbmN5IG9mIG9jY3VycmVuY2UgYW5kIGNvbXBsZXRpb24gd2luZG93JyxcclxuICAnZnJlcXVlbmN5JyxcclxuICAnZHVlIGRhdGUnLFxyXG4gICdkdWUgdGltZScsXHJcbiAgJ3N0YXJ0JyxcclxuICAnZmFpbCcsXHJcbiAgJ3Jlc3BvbnNpYmlsaXR5IGVuZHMgYWZ0ZXIgb2NjdXJlbmNlcycsXHJcbiAgJ3Jlc3BvbnNpYmlsaXR5IGVuZHMgYWZ0ZXIgb2NjdXJyZW5jZXMnLFxyXG4gICdyZXNwb25zaWJpbGl0eSBlbmRzIGJ5IGRhdGUnLFxyXG4gICdyZXNwb25zaWJpbGl0eSBjZW50cmUnLFxyXG4gICdyZXNwb25zaWJpbGl0eSBjZW50ZXInLFxyXG4gICdyaXNrIGNsYXNzJyxcclxuICAnb2JqZWN0aXZlJyxcclxuICAnbm90ZXMnLFxyXG4gICdmb3JtYXQgJiBldmlkZW5jZScsXHJcbiAgJ2Zvcm1hdCBhbmQgZXZpZGVuY2UnLFxyXG4gICdmb3JtYXQnLFxyXG4gICdmb3JtYXQgZm9yIHJlc3BvbnNpYmlsaXR5JyxcclxuICAnZXZpZGVuY2UnLFxyXG4gICdyZXZpZXcgb2YgcmVzcG9uc2liaWxpdHknLFxyXG4gICdyZXZpZXdlcicsXHJcbiAgJ3Jldmlld2VyIHR5cGUnLFxyXG4gICdyZXZpZXcgc3RhcnQnLFxyXG4gICdyZXZpZXcgZmFpbCcsXHJcbiAgJ292ZXJzZWVyJyxcclxuICAnYWx3YXlzIG5vdGlmeScsXHJcbiAgJ25vdGlmeSBvbiBmYWlsdXJlJyxcclxuICAnY29sbGFib3JhdG9yJyxcclxuICAnYXNzZXNzbWVudHMgb3IgY2hlY2twb2ludHMnLFxyXG4gICd3aG8gc2hvdWxkIGJlIHNob3duJyxcclxuICAnY3JlYXRlZCB0aGUgcmVzcG9uc2liaWxpdHknLFxyXG4gICdudW1iZXIgb2Ygb2NjdXJyZW5jZXMnLFxyXG4gICdzcGVjaWZ5IHRoZSB0eXBlJyxcclxuICAnbm8uIG9mIGRheXMnLFxyXG4gICdjb21wbGV0aW9uIHdpbmRvdycsXHJcbiAgJ2VudHJ1c3RlZCB0bycsXHJcbiAgJ2Fzc2lnbm9yJyxcclxuICAnYXNzaWduZWUnLFxyXG5dO1xyXG5cclxuZXhwb3J0IGNvbnN0IFZBTElEQVRJT05fTUVTU0FHRVMgPSB7XHJcbiAgRFJPUERPV046XHJcbiAgICAnVGhlIGRhdGEgYWRkZWQgaW4gdGhpcyBmaWVsZCBpcyBub3QgdmFsaWQuIFNlbGVjdCBmcm9tIHRoZSBkcm9wZG93biBwcm92aWRlZCBpbiB0aGUgdGVtcGxhdGUuJyxcclxuICBGSUxFX0hFQURFUlNfTUlTU0lORzogRklMRV9WQUxJREFUSU9OX01FU1NBR0VTLkhFQURFUlNfTUlTU0lORyxcclxuICBGSUxFX0VYVFJBX0NPTFVNTlM6IEZJTEVfVkFMSURBVElPTl9NRVNTQUdFUy5FWFRSQV9DT0xVTU5TLFxyXG4gIFJFU1BPTlNJQklMSVRZX05BTUVfUkVRVUlSRUQ6XHJcbiAgICAnVGhpcyBpcyBhIG1hbmRhdG9yeSBmaWVsZC4gRW50ZXIgYSBuYW1lIGZvciB0aGlzIHJlc3BvbnNpYmlsaXR5LicsXHJcbiAgUkVTUE9OU0lCSUxJVFlfTkFNRV9XSElURVNQQUNFOlxyXG4gICAgJ1Jlc3BvbnNpYmlsaXR5IE5hbWUgY2Fubm90IGJlIGJsYW5rIG9yIGNvbnRhaW4gb25seSBzcGFjZXMuJyxcclxuICBQUk9HUkFNX0NBVEVHT1JZX01JU01BVENIOlxyXG4gICAgJ1Byb2dyYW0gQ2F0ZWdvcnkgZG9lcyBub3QgYmVsb25nIHRvIHRoZSBzZWxlY3RlZCBQcm9ncmFtLiBTZWxlY3QgYSB2YWxpZCBjYXRlZ29yeSBmb3IgdGhpcyBQcm9ncmFtLicsXHJcbiAgUFJPR1JBTV9DQVRFR09SWV9XSVRIT1VUX1BST0dSQU06XHJcbiAgICAnUHJvZ3JhbSBDYXRlZ29yeSBoYXMgYmVlbiBwcm92aWRlZCB3aXRob3V0IGEgUHJvZ3JhbS4gU2VsZWN0IGEgUHJvZ3JhbSwgb3IgY2xlYXIgdGhlIFByb2dyYW0gQ2F0ZWdvcnkgZmllbGQuJyxcclxuICBQUk9HUkFNX1RZUEVfV0lUSE9VVF9QUk9HUkFNOlxyXG4gICAgJ1Byb2dyYW0gVHlwZSBoYXMgYmVlbiBwcm92aWRlZCB3aXRob3V0IGEgUHJvZ3JhbS4gUGxlYXNlIGFsc28gc2VsZWN0IGEgUHJvZ3JhbSwgb3IgY2xlYXIgdGhlIFByb2dyYW0gVHlwZSBmaWVsZC4nLFxyXG4gIEVOVFJVU1RFRF9CWV9JTlZBTElEOlxyXG4gICAgJ1RoaXMgaXMgbm90IGEgdmFsaWQgdXNlci4gU2VsZWN0IGEgdXNlciBmcm9tIHRoZSBkcm9wZG93biBvciBsZWF2ZSBibGFuayB0byB1c2UgeW91ciBhY2NvdW50IGFzIHRoZSBkZWZhdWx0LicsXHJcbiAgRU5UUlVTVEVEX0JZX0lOQUNUSVZFOlxyXG4gICAgJ1RoZSB1c2VyIHNlbGVjdGVkIGluIHRoaXMgZmllbGQgaXMgaW5hY3RpdmUuIFNlbGVjdCBhbiBhY3RpdmUgdXNlciBvciBsZWF2ZSBibGFuayB0byB1c2UgeW91ciBhY2NvdW50IGFzIHRoZSBkZWZhdWx0LicsXHJcbiAgQVNTSUdORUVfUkVRVUlSRUQ6ICdUaGlzIGlzIGEgbWFuZGF0b3J5IGZpZWxkLiBTZWxlY3QgYSB1c2VyIG9yIGdyb3VwLicsXHJcbiAgQVNTSUdORUVfSU5WQUxJRDpcclxuICAgICdUaGlzIGlzIG5vdCBhIHZhbGlkIHVzZXIgb3IgZ3JvdXAgaW4gVkNvbXBseS4gU2VsZWN0IGZyb20gdGhlIGRyb3Bkb3duIHByb3ZpZGVkIGluIHRoZSB0ZW1wbGF0ZS4nLFxyXG4gIEFTU0lHTkVFX0lOQUNUSVZFOlxyXG4gICAgJ1RoZSB1c2VyIHNlbGVjdGVkIGluIHRoaXMgZmllbGQgaXMgaW5hY3RpdmUuIFNlbGVjdCBhbiBhY3RpdmUgdXNlciBvciBncm91cC4nLFxyXG4gIEFTU0lHTkVFX1RZUEVfSU5WQUxJRDpcclxuICAgICdUaGUgZGF0YSBhZGRlZCBpbiB0aGlzIGZpZWxkIGlzIG5vdCB2YWxpZC4gU2VsZWN0IGZyb20gdGhlIGRyb3Bkb3duIHByb3ZpZGVkIGluIHRoZSB0ZW1wbGF0ZSBvciB0aGUgZGVmYXVsdCBzZWxlY3Rpb24gb2YgXCJBbnkgc2VsZWN0IHBlcnNvbiBjYW4gY29tcGxldGVkIHRoaXNcIiB3aWxsIGJlIGFwcGxpZWQuJyxcclxuICBHUk9VUF9BTExfQU5ZX0JMQU5LOlxyXG4gICAgXCJBIGdyb3VwIGhhcyBiZWVuIGFzc2lnbmVkLiBUaGUgZGVmYXVsdCBzZWxlY3Rpb24gb2YgJ0FueSBzZWxlY3RlZCBwZXJzb24gY2FuIGNvbXBsZXRlIHRoaXMnIHdpbGwgYmUgYXBwbGllZC5cIixcclxuICBLRVlfUkVTUE9OU0lCSUxJVFlfSU5WQUxJRDpcclxuICAgIFwiVGhlIGRhdGEgYWRkZWQgaW4gdGhpcyBmaWVsZCBpcyBub3QgdmFsaWQuIFBsZWFzZSBzZWxlY3QgJ1llcycsICdObycsIG9yIGxlYXZlIGJsYW5rIChkZWZhdWx0cyB0byAnTm90IGEgS2V5IFJlc3BvbnNpYmlsaXR5JykuXCIsXHJcbiAgRlJFUVVFTkNZX1JFUVVJUkVEOiAnVGhpcyBpcyBtYW5kYXRvcnkgZmllbGQuIFNlbGVjdCBhIGZyZXF1ZW5jeS4nLFxyXG4gIERVRV9EQVRFX0RBWV9OT1RfTlVNQkVSOlxyXG4gICAgJ1RoZSBkYXRhIGFkZGVkIGluIHRoaXMgZmllbGQgaXMgbm90IHZhbGlkLiBFbnRlciBhIG51bWJlciBmcm9tIHRoZSBkcm9wZG93biBwcm92aWRlZCBpbiB0aGUgdGVtcGxhdGUuJyxcclxuICBEVUVfREFURV9EQVlfT1VUX09GX1JBTkdFOlxyXG4gICAgJ1RoZSB2YWx1ZSBwcm92aWRlZCBpcyBvdXQgb2YgcmFuZ2UgZm9yIGEgW1dlZWtseV0gZnJlcXVlbmN5LiBTZWxlY3QgYSB2YWxpZCBvcHRpb24uJyxcclxuICBEVUVfREFURV9SRVFVSVJFRDpcclxuICAgICdUaGlzIGlzIG1hbmRhdG9yeSBmaWVsZC4gU2VsZWN0IGZyb20gdGhlIGRyb3Bkb3duIHByb3ZpZGVkIGluIHRoZSB0ZW1wbGF0ZS4nLFxyXG4gIERVRV9EQVRFX01PTlRIX0lOVkFMSUQ6XHJcbiAgICAnVGhlIGRhdGEgYWRkZWQgaW4gdGhpcyBmaWVsZCBpcyBub3QgdmFsaWQuIFNlbGVjdCBhIG1vbnRoIGZyb20gdGhlIGRyb3Bkb3duIHByb3ZpZGVkIGluIHRoZSB0ZW1wbGF0ZS4nLFxyXG4gIERVRV9USU1FX0JMQU5LOlxyXG4gICAgJ1RoZSByZXNwb25zaWJpbGl0aWVzIHdpbGwgYmUgY3JlYXRlZCB3aXRoIGEgZGVmYXVsdCB0aW1lIG9mIDExOjMwIFBNIGFjY29yZGluZyB0byB5b3VyIFZDb21wbHkgdGltZXpvbmUuJyxcclxuICBSQ19UWVBFX1dJVEhPVVRfTkFNRTpcclxuICAgICdSZXNwb25zaWJpbGl0eSBDZW50ZXIgVHlwZSBoYXMgYmVlbiBwcm92aWRlZCB3aXRob3V0IGEgUmVzcG9uc2liaWxpdHkgQ2VudGVyIE5hbWUuIEVudGVyIHRoZSBSZXNwb25zaWJpbGl0eSBDZW50ZXIgbmFtZS4nLFxyXG4gIFJDX0lOQUNUSVZFOlxyXG4gICAgJ1RoaXMgUmVzcG9uc2liaWxpdHkgQ2VudGVyIG5vIGxvbmdlciBleGlzdHMgaW4gVkNvbXBseS4gU2VsZWN0IGFuIGFjdGl2ZSBSZXNwb25zaWJpbGl0eSBDZW50ZXIgb3IgbGVhdmUgYmxhbmsuJyxcclxuICBGT1JNQVRfTElOS19XSVRIT1VUX1lFUzpcclxuICAgICdBIGZvcm1hdCBsaW5rIGhhcyBiZWVuIHByb3ZpZGVkIGJ1dCBGb3JtYXQgc2VsZWN0b24gaXMgc2V0IHRvIFwiTm9cIi4gU2V0IHRoZSBGb3JtYXQgZmllbGQgdG8gXCJZZXNcIiBhbmQgdXBsb2FkIHRoZSB0ZW1wbGF0ZSBhZ2Fpbi4nLFxyXG4gIEZPUk1BVF9JTlZBTElEX1VSTDogJ1RoaXMgaXMgYW4gaW52YWxpZCBVUkwuJyxcclxuICBSRVZJRVdFUl9JTkFDVElWRTogJ1RoaXMgdXNlciBpcyBpbmFjdGl2ZS4gU2VsZWN0IGFuIGFjdGl2ZSB1c2VyIG9yIGdyb3VwLicsXHJcbiAgUkVWSUVXX1dJTkRPV19XSVRIT1VUX1JFVklFV0VSOlxyXG4gICAgJ1JldmlldyB3aW5kb3cgaGFzIGJlZW4gc3BlY2lmaWVkIGJ1dCBubyBSZXZpZXdlciBoYXMgYmVlbiBzZWxlY3RlZC4gU2VsZWN0IGEgUmV2aWV3ZXIsIG9yIGNsZWFyIHRoZXNlIGZpZWxkcy4nLFxyXG4gIE9WRVJTSUdIVF9EVVBMSUNBVEVfQVNTSUdORUU6XHJcbiAgICAnVGhpcyB1c2VyIGlzIGFscmVhZHkgYXNzaWduZWQgYXMgdGhlIHByaW1hcnkgQXNzaWduZWUuIEFkZGluZyB0aGVtIHRvIG92ZXJzaWdodCBpcyByZWR1bmRhbnQuJyxcclxuICBPVkVSU0lHSFRfRFVQTElDQVRFX0FTU0lHTk9SOlxyXG4gICAgJ1RoaXMgdXNlciBpcyBhbHJlYWR5IGFzc2lnbmVkIGFzIHRoZSBBc3NpZ25vci4gQWRkaW5nIHRoZW0gdG8gb3ZlcnNpZ2h0IGlzIHJlZHVuZGFudC4nLFxyXG4gIE9WRVJTSUdIVF9JTkFDVElWRTogJ1RoaXMgdXNlciBpcyBpbmFjdGl2ZS4gU2VsZWN0IGFuIGFjdGl2ZSB1c2VyIG9yIGdyb3VwLicsXHJcbiAgQ09MTEFCT1JBVE9SX0lOQUNUSVZFOiAnVGhpcyB1c2VyIGlzIGluYWN0aXZlLiBTZWxlY3QgYW4gYWN0aXZlIHVzZXIuJyxcclxuICBDT0xMQUJPUkFUT1JfR1JPVVA6XHJcbiAgICAnQ29sbGFib3JhdG9ycyBtdXN0IGJlIGluZGl2aWR1YWwgdXNlcnMsIG5vdCBncm91cHMuIFBsZWFzZSBzZWxlY3QgYSBzcGVjaWZpYyB1c2VyIGZvciB0aGUgQ29sbGFib3JhdG9yIGZpZWxkLicsXHJcbiAgT05FX1RJTUVfTElGRUNZQ0xFOlxyXG4gICAgXCJBICdPbmUgVGltZScgcmVzcG9uc2liaWxpdHkgY2Fubm90IGFsc28gaGF2ZSBhIGxpZmVjeWNsZSBlbmQgcnVsZS4gQ2xlYXIgdGhlIEVuZHMgQWZ0ZXIgT2NjdXJyZW5jZXMgYW5kIEVuZHMgQnkgRGF0ZSBmaWVsZHMuXCIsXHJcbiAgRU5EU19BRlRFUl9PTkVfT0NDVVJSRU5DRTpcclxuICAgIFwiRW5kaW5nIGFmdGVyIDEgb2NjdXJyZW5jZSBpcyBlcXVpdmFsZW50IHRvIGEgJ09uZSBUaW1lJyByZXNwb25zaWJpbGl0eS4gQ29uc2lkZXIgdXNpbmcgdGhlICdPbmUgVGltZScgZnJlcXVlbmN5IGluc3RlYWQuXCIsXHJcbiAgVVNFUl9OT1RfSU5fUFJPR1JBTTpcclxuICAgICdUaGlzIHVzZXIgaXMgbm90IGFzc29jaWF0ZWQgd2l0aCB0aGUgc2VsZWN0ZWQgUHJvZ3JhbS4nLFxyXG4gIFBBU1RfRFVFX0RBVEU6ICdUaGlzIGRhdGUgb2NjdXJzIGluIHRoZSBwYXN0LiBTZWxlY3QgYSBmdXR1cmUgZGF0ZS4nLFxyXG4gIFJJU0tfQ0xBU1M6XHJcbiAgICAnSW52YWxpZCByaXNrIGNsYXNzLiBTZWxlY3QgYSB2YWxpZCBvcHRpb24gZnJvbSB0aGUgZHJvcC1kb3duIGxpc3QuJyxcclxuICBEQVk6ICdJbnZhbGlkIGRheSBzZWxlY3Rpb24uIFNlbGVjdCBhIHZhbGlkIGRheSBmcm9tIHRoZSBkcm9wLWRvd24gbGlzdCBpbiB0aGUgdGVtcGxhdGUuJyxcclxuICBEQVRFX0ZPUk1BVDpcclxuICAgICdJbnZhbGlkIGRhdGUgZm9ybWF0LiBTZWxlY3QgYSB2YWxpZCBkYXRlIGZyb20gdGhlIGRyb3AtZG93biBsaXN0IGluIHRoZSB0ZW1wbGF0ZS4nLFxyXG4gIERVRV9EQVRFOiAnSW52YWxpZCBEdWUgRGF0ZS4nLFxyXG4gIERVRV9USU1FOlxyXG4gICAgXCJUaGlzIHZhbHVlIGRvZXMgbm90IG1hdGNoIHRoZSBWQ29tcGx5IHRlbXBsYXRlJ3MgZm9ybWF0LiBVc2UgdGhlIGNvcnJlY3QgdmFsdWUgZnJvbSB0aGUgZHJvcC1kb3ducyBpbiB0aGUgdGVtcGxhdGUuXCIsXHJcbiAgRU5EU19BRlRFUl9PQ0NVUlJFTkNFU19HUkVBVEVSX1RIQU5fWkVSTzogJ011c3QgYmUgZ3JlYXRlciB0aGFuIDAnLFxyXG4gIEVORFNfQUZURVJfT0NDVVJSRU5DRVNfTlVNRVJJQzogJ011c3QgYmUgbnVtZXJpYyB2YWx1ZScsXHJcbiAgV0hPTEVfTlVNQkVSX05PTl9ORUdBVElWRTpcclxuICAgICdNdXN0IGJlIGEgd2hvbGUgbnVtYmVyLiBOZWdhdGl2ZSBhbmQgZGVjaW1hbCB2YWx1ZXMgYXJlIG5vdCBhbGxvd2VkLicsXHJcbiAgUE9TSVRJVkVfTlVNQkVSOiAnTXVzdCBiZSBhIHBvc2l0aXZlIG51bWJlcicsXHJcbiAgRU5EU19CWV9EQVRFX0lOVkFMSURfVkFMVUU6XHJcbiAgICAnVGhlIGRhdGEgYWRkZWQgaW4gdGhpcyBmaWVsZCBpcyBub3QgdmFsaWQuIFNlbGVjdCBmcm9tIHRoZSBkcm9wZG93biBwcm92aWRlZCBpbiB0aGUgdGVtcGxhdGUuJyxcclxuICBFTkRTX0JZX0RBVEVfSU5DT01QTEVURTpcclxuICAgICdFbmRzIEJ5IERhdGUgcmVxdWlyZXMgYm90aCBhIGRheSBhbmQgYSBtb250aC4gUGxlYXNlIGNvbXBsZXRlIGJvdGggZmllbGRzIG9yIGNsZWFyIGJvdGggdG8gbGVhdmUgdGhlIGVuZCBkYXRlIHVuc2V0LicsXHJcbiAgRU5EU19CWV9EQVRFX1BBU1Q6XHJcbiAgICAnVGhlIEVuZHMgQnkgRGF0ZSBpcyBpbiB0aGUgcGFzdC4gVGhpcyByZXNwb25zaWJpbGl0eSB3aWxsIGJlIGNyZWF0ZWQgd2l0aCBubyBmdXR1cmUgb2NjdXJyZW5jZXMuJyxcclxuICBFTkRTX0JZX0RBVEVfQ09ORkxJQ1Q6XHJcbiAgICBcIllvdSBoYXZlIHByb3ZpZGVkIHZhbHVlcyBmb3IgYm90aCAnRW5kcyBBZnRlciBPY2N1cnJlbmNlcycgYW5kICdFbmRzIEJ5IERhdGUnLiBGaWxsIGluIG9ubHkgb25lLCBvciBsZWF2ZSBib3RoIGJsYW5rIGlmIHRoZSByZXNwb25zaWJpbGl0eSB3aWxsIGFsd2F5cyBiZSBhY3RpdmUuXCIsXHJcbn07XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gZHVlRGF0ZURheU91dE9mUmFuZ2VNZXNzYWdlKGZyZXF1ZW5jeTogc3RyaW5nKTogc3RyaW5nIHtcclxuICByZXR1cm4gYFRoZSB2YWx1ZSBwcm92aWRlZCBpcyBvdXQgb2YgcmFuZ2UgZm9yIGEgWyR7ZnJlcXVlbmN5fV0gZnJlcXVlbmN5LiBTZWxlY3QgYSB2YWxpZCBvcHRpb24uYDtcclxufVxyXG4iXX0=
@@ -32,6 +32,151 @@ export class BulkUploadService {
32
32
  }
33
33
  return false;
34
34
  }
35
+ getHeaderRows(data) {
36
+ const listData = XLSX.utils.sheet_to_json(data, {
37
+ header: 1,
38
+ raw: false,
39
+ });
40
+ const rows = listData.filter((res) => {
41
+ let isUndefined = '';
42
+ (res || []).forEach((el) => {
43
+ isUndefined = isUndefined + el;
44
+ });
45
+ if (listData[2] && listData[2][1] === 'Program') {
46
+ return !(res?.length === 9 && res[8] === '' && !isUndefined.length);
47
+ }
48
+ return !(res?.length === 6 && res[5] === '' && !isUndefined.length);
49
+ });
50
+ return {
51
+ header: cloneDeep(rows[2] || []),
52
+ subHeading: cloneDeep(rows[3] || []),
53
+ };
54
+ }
55
+ /**
56
+ * F-02: required header missing or renamed.
57
+ * F-03: extra columns inserted.
58
+ */
59
+ validateResponsibilityHeaders(sheets) {
60
+ let sawSheet = false;
61
+ let missing = false;
62
+ let extra = false;
63
+ (sheets || []).forEach((sheet) => {
64
+ const header = sheet?.header || [];
65
+ if (!header.some((cell) => this.normalizeHeaderLabel(cell))) {
66
+ return;
67
+ }
68
+ sawSheet = true;
69
+ const status = this.validateSheetHeaders(header, sheet?.subHeading || [], sheet?.sheet);
70
+ if (status === 'missing') {
71
+ missing = true;
72
+ }
73
+ else if (status === 'extra') {
74
+ extra = true;
75
+ }
76
+ });
77
+ if (!sawSheet || missing) {
78
+ return 'missing';
79
+ }
80
+ return extra ? 'extra' : 'ok';
81
+ }
82
+ validateSheetHeaders(header = [], subHeading = [], sheet) {
83
+ const firstHeader = this.normalizeHeaderLabel(header[0]);
84
+ if (!firstHeader.includes('responsibility name')) {
85
+ return 'missing';
86
+ }
87
+ const hasProgram = this.hasProgramColumns(header);
88
+ const expectedKeyIndex = hasProgram ? 7 : 4;
89
+ const keyIndex = this.findLabelIndex(header, subHeading, 'key responsibility');
90
+ if (keyIndex === -1) {
91
+ return 'missing';
92
+ }
93
+ // An inserted column shifts Key Responsibility off its template index
94
+ // (program templates: H / 7, otherwise: E / 4). That is F-03, not a remap.
95
+ if (keyIndex !== expectedKeyIndex) {
96
+ return 'extra';
97
+ }
98
+ const hasAssigneeColumn = this.findLabelIndex(header, subHeading, 'entrust to') !== -1 ||
99
+ this.findLabelIndex(header, subHeading, 'person or group') !== -1 ||
100
+ this.findLabelIndex(header, subHeading, 'entrusted by') !== -1;
101
+ if (!hasAssigneeColumn) {
102
+ return 'missing';
103
+ }
104
+ if (sheet === 'frequency') {
105
+ const frequencyIndex = this.findLabelIndex(header, subHeading, 'frequency');
106
+ if (frequencyIndex === -1) {
107
+ return 'missing';
108
+ }
109
+ const expectedFrequencyIndex = hasProgram ? 8 : 5;
110
+ if (frequencyIndex !== expectedFrequencyIndex) {
111
+ return 'extra';
112
+ }
113
+ }
114
+ const lastIndex = Math.max(this.lastFilledIndex(header), this.lastFilledIndex(subHeading));
115
+ if (lastIndex < 8) {
116
+ return 'missing';
117
+ }
118
+ if (lastIndex > this.getExpectedLastHeaderIndex(header, subHeading, sheet)) {
119
+ return 'extra';
120
+ }
121
+ return 'ok';
122
+ }
123
+ hasProgramColumns(header = []) {
124
+ return (header[1] === 'Program' ||
125
+ this.normalizeHeaderLabel(header[1]) === 'program');
126
+ }
127
+ findLabelIndex(header = [], subHeading = [], needle) {
128
+ const maxLen = Math.max(header.length, subHeading.length);
129
+ for (let index = 0; index < maxLen; index++) {
130
+ const headerLabel = this.normalizeHeaderLabel(header[index]);
131
+ const subLabel = this.normalizeHeaderLabel(subHeading[index]);
132
+ if (headerLabel.includes(needle) || subLabel.includes(needle)) {
133
+ return index;
134
+ }
135
+ }
136
+ return -1;
137
+ }
138
+ getExpectedLastHeaderIndex(header = [], subHeading = [], sheet) {
139
+ const hasProgram = this.hasProgramColumns(header);
140
+ const hasExtended = [...header, ...subHeading].some((cell) => {
141
+ const label = this.normalizeHeaderLabel(cell);
142
+ return (label.includes('due time') ||
143
+ label.includes('responsibility ends after') ||
144
+ label.includes('responsibility ends by date'));
145
+ });
146
+ if (sheet === 'ongoing') {
147
+ return hasProgram ? 22 : 20;
148
+ }
149
+ if (hasProgram && hasExtended) {
150
+ return 31;
151
+ }
152
+ if (hasProgram) {
153
+ return 27;
154
+ }
155
+ if (hasExtended) {
156
+ return 26;
157
+ }
158
+ return 22;
159
+ }
160
+ getMaxHeaderIndex(header = [], subHeading = [], sheet) {
161
+ return this.getExpectedLastHeaderIndex(header, subHeading, sheet);
162
+ }
163
+ normalizeHeaderLabel(value) {
164
+ return String(value ?? '')
165
+ .replace(/[\u200B-\u200D\uFEFF]/g, '')
166
+ .replace(/\u00a0/g, ' ')
167
+ .replace(/\*/g, '')
168
+ .replace(/\s+/g, ' ')
169
+ .trim()
170
+ .toLowerCase();
171
+ }
172
+ lastFilledIndex(row = []) {
173
+ for (let index = row.length - 1; index >= 0; index--) {
174
+ if (this.normalizeHeaderLabel(row[index])) {
175
+ return index;
176
+ }
177
+ }
178
+ return -1;
179
+ }
35
180
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: BulkUploadService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
36
181
  static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: BulkUploadService, providedIn: 'root' }); }
37
182
  }
@@ -41,4 +186,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImpo
41
186
  providedIn: 'root'
42
187
  }]
43
188
  }], ctorParameters: function () { return []; } });
44
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYnVsay11cGxvYWQuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3Z4LXdvcmtmbG93LWVuZ2luZS9zcmMvbGliL3NlcnZpY2VzL2J1bGstdXBsb2FkLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMzQyxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sV0FBVyxDQUFDO0FBQ3RDLE9BQU8sS0FBSyxJQUFJLE1BQU0sTUFBTSxDQUFDOztBQU03QixNQUFNLE9BQU8saUJBQWlCO0lBRTVCLGdCQUFnQixDQUFDO0lBRWpCLGFBQWEsQ0FBQyxJQUFTLEVBQUUsY0FBc0I7UUFDN0MsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxhQUFhLENBQUMsSUFBSSxFQUFFO1lBQzlDLE1BQU0sRUFBRSxDQUFDLEVBQUUsR0FBRyxFQUFFLEtBQUs7U0FDdEIsQ0FBUSxDQUFDO1FBQ1YsSUFBSSxTQUFTLEdBQUcsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsY0FBYyxDQUFDLENBQUM7UUFDbEQsT0FBTyxJQUFJLENBQUMsY0FBYyxDQUFDLFNBQVMsQ0FBQyxDQUFDO0lBQ3hDLENBQUM7SUFFRCxjQUFjLENBQUMsSUFBUztRQUN0QixJQUFJLE9BQU8sR0FBRyxLQUFLLENBQUM7UUFDcEIsSUFBSSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxXQUFnQixFQUFFLEVBQUUsQ0FBQyxXQUFXLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDO1FBQ2pFLElBQUksSUFBSSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7WUFDbkIsT0FBTyxHQUFHLElBQUksQ0FBQztTQUNoQjtRQUNELE9BQU8sT0FBTyxDQUFDO0lBQ2pCLENBQUM7SUFFRCxnQkFBZ0IsQ0FBQyxJQUFTLEVBQUUsV0FBbUI7UUFDN0MsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxhQUFhLENBQUMsSUFBSSxFQUFFO1lBQzlDLE1BQU0sRUFBRSxDQUFDLEVBQUUsR0FBRyxFQUFFLEtBQUs7U0FDdEIsQ0FBUSxDQUFDO1FBQ1YsTUFBTSxNQUFNLEdBQUcsU0FBUyxDQUFDLFFBQVEsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDO1FBQ2hELElBQUcsV0FBVyxLQUFLLENBQUMsRUFBRTtZQUNwQixPQUFPLE1BQU0sQ0FBQyxDQUFDLENBQUMsS0FBSyxzQkFBc0IsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFBLENBQUMsQ0FBQyxLQUFLLENBQUM7U0FDM0Q7YUFBTSxJQUFHLFdBQVcsS0FBSyxDQUFDLEVBQUU7WUFDM0IsT0FBTyxNQUFNLENBQUMsQ0FBQyxDQUFDLEtBQUssNEJBQTRCLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQSxDQUFDLENBQUMsS0FBSyxDQUFDO1NBQ2pFO1FBQ0QsT0FBTyxLQUFLLENBQUM7SUFDZixDQUFDOytHQWhDVSxpQkFBaUI7bUhBQWpCLGlCQUFpQixjQUZoQixNQUFNOzs0RkFFUCxpQkFBaUI7a0JBSDdCLFVBQVU7bUJBQUM7b0JBQ1YsVUFBVSxFQUFFLE1BQU07aUJBQ25CIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBjbG9uZURlZXAgfSBmcm9tICdsb2Rhc2gtZXMnO1xyXG5pbXBvcnQgKiBhcyBYTFNYIGZyb20gJ3hsc3gnO1xyXG50eXBlIEFPQSA9IGFueVtdW107XHJcblxyXG5ASW5qZWN0YWJsZSh7XHJcbiAgcHJvdmlkZWRJbjogJ3Jvb3QnXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBCdWxrVXBsb2FkU2VydmljZSB7XHJcblxyXG4gIGNvbnN0cnVjdG9yKCkgeyB9XHJcblxyXG4gIGhhc0RhdGFJbkxpc3QoZGF0YTogYW55LCBkYXRhU3RhcnRJbmRleDogbnVtYmVyKSB7XHJcbiAgICBjb25zdCBsaXN0RGF0YSA9IFhMU1gudXRpbHMuc2hlZXRfdG9fanNvbihkYXRhLCB7XHJcbiAgICAgIGhlYWRlcjogMSwgcmF3OiBmYWxzZSxcclxuICAgIH0pIGFzIEFPQTtcclxuICAgIGxldCBmaW5hbERhdGEgPSBsaXN0RGF0YS5zbGljZSgwLCBkYXRhU3RhcnRJbmRleCk7XHJcbiAgICByZXR1cm4gdGhpcy5jaGVja0VtcHR5RmlsZShmaW5hbERhdGEpO1xyXG4gIH1cclxuXHJcbiAgY2hlY2tFbXB0eUZpbGUoZGF0YTogYW55KSB7XHJcbiAgICBsZXQgaXNFbXB0eSA9IGZhbHNlO1xyXG4gICAgZGF0YSA9IGRhdGEuZmlsdGVyKChkYXRhRWxlbWVudDogYW55KSA9PiBkYXRhRWxlbWVudC5sZW5ndGggPiAwKTtcclxuICAgIGlmIChkYXRhLmxlbmd0aCA8IDEpIHtcclxuICAgICAgaXNFbXB0eSA9IHRydWU7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gaXNFbXB0eTtcclxuICB9XHJcblxyXG4gIGNoZWNrQ29ycmVjdEZpbGUoZGF0YTogYW55LCBoZWFkZXJJbmRleDogbnVtYmVyKTogYm9vbGVhbiB7XHJcbiAgICBjb25zdCBsaXN0RGF0YSA9IFhMU1gudXRpbHMuc2hlZXRfdG9fanNvbihkYXRhLCB7XHJcbiAgICAgIGhlYWRlcjogMSwgcmF3OiBmYWxzZSxcclxuICAgIH0pIGFzIEFPQTtcclxuICAgIGNvbnN0IGhlYWRlciA9IGNsb25lRGVlcChsaXN0RGF0YVtoZWFkZXJJbmRleF0pO1xyXG4gICAgaWYoaGVhZGVySW5kZXggPT09IDIpIHtcclxuICAgICAgcmV0dXJuIGhlYWRlclswXSA9PT0gJ1Jlc3BvbnNpYmlsaXR5IE5hbWUqJyA/IHRydWU6IGZhbHNlO1xyXG4gICAgfSBlbHNlIGlmKGhlYWRlckluZGV4ID09PSAwKSB7XHJcbiAgICAgIHJldHVybiBoZWFkZXJbMF0gPT09ICdFbnRlciBSZXNwb25zaWJpbGl0eSBOYW1lKicgPyB0cnVlOiBmYWxzZTtcclxuICAgIH0gXHJcbiAgICByZXR1cm4gZmFsc2U7XHJcbiAgfVxyXG59XHJcbiJdfQ==
189
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYnVsay11cGxvYWQuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3Z4LXdvcmtmbG93LWVuZ2luZS9zcmMvbGliL3NlcnZpY2VzL2J1bGstdXBsb2FkLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMzQyxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sV0FBVyxDQUFDO0FBQ3RDLE9BQU8sS0FBSyxJQUFJLE1BQU0sTUFBTSxDQUFDOztBQU03QixNQUFNLE9BQU8saUJBQWlCO0lBRTVCLGdCQUFnQixDQUFDO0lBRWpCLGFBQWEsQ0FBQyxJQUFTLEVBQUUsY0FBc0I7UUFDN0MsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxhQUFhLENBQUMsSUFBSSxFQUFFO1lBQzlDLE1BQU0sRUFBRSxDQUFDLEVBQUUsR0FBRyxFQUFFLEtBQUs7U0FDdEIsQ0FBUSxDQUFDO1FBQ1YsSUFBSSxTQUFTLEdBQUcsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsY0FBYyxDQUFDLENBQUM7UUFDbEQsT0FBTyxJQUFJLENBQUMsY0FBYyxDQUFDLFNBQVMsQ0FBQyxDQUFDO0lBQ3hDLENBQUM7SUFFRCxjQUFjLENBQUMsSUFBUztRQUN0QixJQUFJLE9BQU8sR0FBRyxLQUFLLENBQUM7UUFDcEIsSUFBSSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxXQUFnQixFQUFFLEVBQUUsQ0FBQyxXQUFXLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDO1FBQ2pFLElBQUksSUFBSSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7WUFDbkIsT0FBTyxHQUFHLElBQUksQ0FBQztTQUNoQjtRQUNELE9BQU8sT0FBTyxDQUFDO0lBQ2pCLENBQUM7SUFFRCxnQkFBZ0IsQ0FBQyxJQUFTLEVBQUUsV0FBbUI7UUFD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S0FBSyxFQUFFLEVBQUU7WUFDcEQsSUFBSSxJQUFJLENBQUMsb0JBQW9CLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUU7Z0JBQ3pDLE9BQU8sS0FBSyxDQUFDO2FBQ2Q7U0FDRjtRQUNELE9BQU8sQ0FBQyxDQUFDLENBQUM7SUFDWixDQUFDOytHQS9OVSxpQkFBaUI7bUhBQWpCLGlCQUFpQixjQUZoQixNQUFNOzs0RkFFUCxpQkFBaUI7a0JBSDdCLFVBQVU7bUJBQUM7b0JBQ1YsVUFBVSxFQUFFLE1BQU07aUJBQ25CIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBjbG9uZURlZXAgfSBmcm9tICdsb2Rhc2gtZXMnO1xyXG5pbXBvcnQgKiBhcyBYTFNYIGZyb20gJ3hsc3gnO1xyXG50eXBlIEFPQSA9IGFueVtdW107XHJcblxyXG5ASW5qZWN0YWJsZSh7XHJcbiAgcHJvdmlkZWRJbjogJ3Jvb3QnXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBCdWxrVXBsb2FkU2VydmljZSB7XHJcblxyXG4gIGNvbnN0cnVjdG9yKCkgeyB9XHJcblxyXG4gIGhhc0RhdGFJbkxpc3QoZGF0YTogYW55LCBkYXRhU3RhcnRJbmRleDogbnVtYmVyKSB7XHJcbiAgICBjb25zdCBsaXN0RGF0YSA9IFhMU1gudXRpbHMuc2hlZXRfdG9fanNvbihkYXRhLCB7XHJcbiAgICAgIGhlYWRlcjogMSwgcmF3OiBmYWxzZSxcclxuICAgIH0pIGFzIEFPQTtcclxuICAgIGxldCBmaW5hbERhdGEgPSBsaXN0RGF0YS5zbGljZSgwLCBkYXRhU3RhcnRJbmRleCk7XHJcbiAgICByZXR1cm4gdGhpcy5jaGVja0VtcHR5RmlsZShmaW5hbERhdGEpO1xyXG4gIH1cclxuXHJcbiAgY2hlY2tFbXB0eUZpbGUoZGF0YTogYW55KSB7XHJcbiAgICBsZXQgaXNFbXB0eSA9IGZhbHNlO1xyXG4gICAgZGF0YSA9IGRhdGEuZmlsdGVyKChkYXRhRWxlbWVudDogYW55KSA9PiBkYXRhRWxlbWVudC5sZW5ndGggPiAwKTtcclxuICAgIGlmIChkYXRhLmxlbmd0aCA8IDEpIHtcclxuICAgICAgaXNFbXB0eSA9IHRydWU7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gaXNFbXB0eTtcclxuICB9XHJcblxyXG4gIGNoZWNrQ29ycmVjdEZpbGUoZGF0YTogYW55LCBoZWFkZXJJbmRleDogbnVtYmVyKTogYm9vbGVhbiB7XHJcbiAgICBjb25zdCBsaXN0RGF0YSA9IFhMU1gudXRpbHMuc2hlZXRfdG9fanNvbihkYXRhLCB7XHJcbiAgICAgIGhlYWRlcjogMSwgcmF3OiBmYWxzZSxcclxuICAgIH0pIGFzIEFPQTtcclxuICAgIGNvbnN0IGhlYWRlciA9IGNsb25lRGVlcChsaXN0RGF0YVtoZWFkZXJJbmRleF0pO1xyXG4gICAgaWYoaGVhZGVySW5kZXggPT09IDIpIHtcclxuICAgICAgcmV0dXJuIGhlYWRlclswXSA9PT0gJ1Jlc3BvbnNpYmlsaXR5IE5hbWUqJyA/IHRydWU6IGZhbHNlO1xyXG4gICAgfSBlbHNlIGlmKGhlYWRlckluZGV4ID09PSAwKSB7XHJcbiAgICAgIHJldHVybiBoZWFkZXJbMF0gPT09ICdFbnRlciBSZXNwb25zaWJpbGl0eSBOYW1lKicgPyB0cnVlOiBmYWxzZTtcclxuICAgIH0gXHJcbiAgICByZXR1cm4gZmFsc2U7XHJcbiAgfVxyXG5cclxuICBnZXRIZWFkZXJSb3dzKGRhdGE6IGFueSk6IHsgaGVhZGVyOiBhbnlbXTsgc3ViSGVhZGluZzogYW55W10gfSB7XHJcbiAgICBjb25zdCBsaXN0RGF0YSA9IFhMU1gudXRpbHMuc2hlZXRfdG9fanNvbihkYXRhLCB7XHJcbiAgICAgIGhlYWRlcjogMSxcclxuICAgICAgcmF3OiBmYWxzZSxcclxuICAgIH0pIGFzIEFPQTtcclxuICAgIGNvbnN0IHJvd3MgPSBsaXN0RGF0YS5maWx0ZXIoKHJlczogYW55KSA9PiB7XHJcbiAgICAgIGxldCBpc1VuZGVmaW5lZCA9ICcnO1xyXG4gICAgICAocmVzIHx8IFtdKS5mb3JFYWNoKChlbDogYW55KSA9PiB7XHJcbiAgICAgICAgaXNVbmRlZmluZWQgPSBpc1VuZGVmaW5lZCArIGVsO1xyXG4gICAgICB9KTtcclxuICAgICAgaWYgKGxpc3REYXRhWzJdICYmIGxpc3REYXRhWzJdWzFdID09PSAnUHJvZ3JhbScpIHtcclxuICAgICAgICByZXR1cm4gIShyZXM/Lmxlbmd0aCA9PT0gOSAmJiByZXNbOF0gPT09ICcnICYmICFpc1VuZGVmaW5lZC5sZW5ndGgpO1xyXG4gICAgICB9XHJcbiAgICAgIHJldHVybiAhKHJlcz8ubGVuZ3RoID09PSA2ICYmIHJlc1s1XSA9PT0gJycgJiYgIWlzVW5kZWZpbmVkLmxlbmd0aCk7XHJcbiAgICB9KTtcclxuICAgIHJldHVybiB7XHJcbiAgICAgIGhlYWRlcjogY2xvbmVEZWVwKHJvd3NbMl0gfHwgW10pLFxyXG4gICAgICBzdWJIZWFkaW5nOiBjbG9uZURlZXAocm93c1szXSB8fCBbXSksXHJcbiAgICB9O1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogRi0wMjogcmVxdWlyZWQgaGVhZGVyIG1pc3Npbmcgb3IgcmVuYW1lZC5cclxuICAgKiBGLTAzOiBleHRyYSBjb2x1bW5zIGluc2VydGVkLlxyXG4gICAqL1xyXG4gIHZhbGlkYXRlUmVzcG9uc2liaWxpdHlIZWFkZXJzKFxyXG4gICAgc2hlZXRzOiBBcnJheTx7IGhlYWRlcj86IGFueVtdOyBzdWJIZWFkaW5nPzogYW55W107IHNoZWV0Pzogc3RyaW5nIH0+XHJcbiAgKTogJ29rJyB8ICdtaXNzaW5nJyB8ICdleHRyYScge1xyXG4gICAgbGV0IHNhd1NoZWV0ID0gZmFsc2U7XHJcbiAgICBsZXQgbWlzc2luZyA9IGZhbHNlO1xyXG4gICAgbGV0IGV4dHJhID0gZmFsc2U7XHJcbiAgICAoc2hlZXRzIHx8IFtdKS5mb3JFYWNoKChzaGVldCkgPT4ge1xyXG4gICAgICBjb25zdCBoZWFkZXIgPSBzaGVldD8uaGVhZGVyIHx8IFtdO1xyXG4gICAgICBpZiAoIWhlYWRlci5zb21lKChjZWxsKSA9PiB0aGlzLm5vcm1hbGl6ZUhlYWRlckxhYmVsKGNlbGwpKSkge1xyXG4gICAgICAgIHJldHVybjtcclxuICAgICAgfVxyXG4gICAgICBzYXdTaGVldCA9IHRydWU7XHJcbiAgICAgIGNvbnN0IHN0YXR1cyA9IHRoaXMudmFsaWRhdGVTaGVldEhlYWRlcnMoaGVhZGVyLCBzaGVldD8uc3ViSGVhZGluZyB8fCBbXSwgc2hlZXQ/LnNoZWV0KTtcclxuICAgICAgaWYgKHN0YXR1cyA9PT0gJ21pc3NpbmcnKSB7XHJcbiAgICAgICAgbWlzc2luZyA9IHRydWU7XHJcbiAgICAgIH0gZWxzZSBpZiAoc3RhdHVzID09PSAnZXh0cmEnKSB7XHJcbiAgICAgICAgZXh0cmEgPSB0cnVlO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICAgIGlmICghc2F3U2hlZXQgfHwgbWlzc2luZykge1xyXG4gICAgICByZXR1cm4gJ21pc3NpbmcnO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGV4dHJhID8gJ2V4dHJhJyA6ICdvayc7XHJcbiAgfVxyXG5cclxuICB2YWxpZGF0ZVNoZWV0SGVhZGVycyhcclxuICAgIGhlYWRlcjogYW55W10gPSBbXSxcclxuICAgIHN1YkhlYWRpbmc6IGFueVtdID0gW10sXHJcbiAgICBzaGVldD86IHN0cmluZ1xyXG4gICk6ICdvaycgfCAnbWlzc2luZycgfCAnZXh0cmEnIHtcclxuICAgIGNvbnN0IGZpcnN0SGVhZGVyID0gdGhpcy5ub3JtYWxpemVIZWFkZXJMYWJlbChoZWFkZXJbMF0pO1xyXG4gICAgaWYgKCFmaXJzdEhlYWRlci5pbmNsdWRlcygncmVzcG9uc2liaWxpdHkgbmFtZScpKSB7XHJcbiAgICAgIHJldHVybiAnbWlzc2luZyc7XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgaGFzUHJvZ3JhbSA9IHRoaXMuaGFzUHJvZ3JhbUNvbHVtbnMoaGVhZGVyKTtcclxuICAgIGNvbnN0IGV4cGVjdGVkS2V5SW5kZXggPSBoYXNQcm9ncmFtID8gNyA6IDQ7XHJcbiAgICBjb25zdCBrZXlJbmRleCA9IHRoaXMuZmluZExhYmVsSW5kZXgoXHJcbiAgICAgIGhlYWRlcixcclxuICAgICAgc3ViSGVhZGluZyxcclxuICAgICAgJ2tleSByZXNwb25zaWJpbGl0eSdcclxuICAgICk7XHJcbiAgICBpZiAoa2V5SW5kZXggPT09IC0xKSB7XHJcbiAgICAgIHJldHVybiAnbWlzc2luZyc7XHJcbiAgICB9XHJcbiAgICAvLyBBbiBpbnNlcnRlZCBjb2x1bW4gc2hpZnRzIEtleSBSZXNwb25zaWJpbGl0eSBvZmYgaXRzIHRlbXBsYXRlIGluZGV4XHJcbiAgICAvLyAocHJvZ3JhbSB0ZW1wbGF0ZXM6IEggLyA3LCBvdGhlcndpc2U6IEUgLyA0KS4gVGhhdCBpcyBGLTAzLCBub3QgYSByZW1hcC5cclxuICAgIGlmIChrZXlJbmRleCAhPT0gZXhwZWN0ZWRLZXlJbmRleCkge1xyXG4gICAgICByZXR1cm4gJ2V4dHJhJztcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBoYXNBc3NpZ25lZUNvbHVtbiA9XHJcbiAgICAgIHRoaXMuZmluZExhYmVsSW5kZXgoaGVhZGVyLCBzdWJIZWFkaW5nLCAnZW50cnVzdCB0bycpICE9PSAtMSB8fFxyXG4gICAgICB0aGlzLmZpbmRMYWJlbEluZGV4KGhlYWRlciwgc3ViSGVhZGluZywgJ3BlcnNvbiBvciBncm91cCcpICE9PSAtMSB8fFxyXG4gICAgICB0aGlzLmZpbmRMYWJlbEluZGV4KGhlYWRlciwgc3ViSGVhZGluZywgJ2VudHJ1c3RlZCBieScpICE9PSAtMTtcclxuICAgIGlmICghaGFzQXNzaWduZWVDb2x1bW4pIHtcclxuICAgICAgcmV0dXJuICdtaXNzaW5nJztcclxuICAgIH1cclxuXHJcbiAgICBpZiAoc2hlZXQgPT09ICdmcmVxdWVuY3knKSB7XHJcbiAgICAgIGNvbnN0IGZyZXF1ZW5jeUluZGV4ID0gdGhpcy5maW5kTGFiZWxJbmRleChcclxuICAgICAgICBoZWFkZXIsXHJcbiAgICAgICAgc3ViSGVhZGluZyxcclxuICAgICAgICAnZnJlcXVlbmN5J1xyXG4gICAgICApO1xyXG4gICAgICBpZiAoZnJlcXVlbmN5SW5kZXggPT09IC0xKSB7XHJcbiAgICAgICAgcmV0dXJuICdtaXNzaW5nJztcclxuICAgICAgfVxyXG4gICAgICBjb25zdCBleHBlY3RlZEZyZXF1ZW5jeUluZGV4ID0gaGFzUHJvZ3JhbSA/IDggOiA1O1xyXG4gICAgICBpZiAoZnJlcXVlbmN5SW5kZXggIT09IGV4cGVjdGVkRnJlcXVlbmN5SW5kZXgpIHtcclxuICAgICAgICByZXR1cm4gJ2V4dHJhJztcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IGxhc3RJbmRleCA9IE1hdGgubWF4KFxyXG4gICAgICB0aGlzLmxhc3RGaWxsZWRJbmRleChoZWFkZXIpLFxyXG4gICAgICB0aGlzLmxhc3RGaWxsZWRJbmRleChzdWJIZWFkaW5nKVxyXG4gICAgKTtcclxuICAgIGlmIChsYXN0SW5kZXggPCA4KSB7XHJcbiAgICAgIHJldHVybiAnbWlzc2luZyc7XHJcbiAgICB9XHJcbiAgICBpZiAobGFzdEluZGV4ID4gdGhpcy5nZXRFeHBlY3RlZExhc3RIZWFkZXJJbmRleChoZWFkZXIsIHN1YkhlYWRpbmcsIHNoZWV0KSkge1xyXG4gICAgICByZXR1cm4gJ2V4dHJhJztcclxuICAgIH1cclxuICAgIHJldHVybiAnb2snO1xyXG4gIH1cclxuXHJcbiAgaGFzUHJvZ3JhbUNvbHVtbnMoaGVhZGVyOiBhbnlbXSA9IFtdKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gKFxyXG4gICAgICBoZWFkZXJbMV0gPT09ICdQcm9ncmFtJyB8fFxyXG4gICAgICB0aGlzLm5vcm1hbGl6ZUhlYWRlckxhYmVsKGhlYWRlclsxXSkgPT09ICdwcm9ncmFtJ1xyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIGZpbmRMYWJlbEluZGV4KFxyXG4gICAgaGVhZGVyOiBhbnlbXSA9IFtdLFxyXG4gICAgc3ViSGVhZGluZzogYW55W10gPSBbXSxcclxuICAgIG5lZWRsZTogc3RyaW5nXHJcbiAgKTogbnVtYmVyIHtcclxuICAgIGNvbnN0IG1heExlbiA9IE1hdGgubWF4KGhlYWRlci5sZW5ndGgsIHN1YkhlYWRpbmcubGVuZ3RoKTtcclxuICAgIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCBtYXhMZW47IGluZGV4KyspIHtcclxuICAgICAgY29uc3QgaGVhZGVyTGFiZWwgPSB0aGlzLm5vcm1hbGl6ZUhlYWRlckxhYmVsKGhlYWRlcltpbmRleF0pO1xyXG4gICAgICBjb25zdCBzdWJMYWJlbCA9IHRoaXMubm9ybWFsaXplSGVhZGVyTGFiZWwoc3ViSGVhZGluZ1tpbmRleF0pO1xyXG4gICAgICBpZiAoaGVhZGVyTGFiZWwuaW5jbHVkZXMobmVlZGxlKSB8fCBzdWJMYWJlbC5pbmNsdWRlcyhuZWVkbGUpKSB7XHJcbiAgICAgICAgcmV0dXJuIGluZGV4O1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gLTE7XHJcbiAgfVxyXG5cclxuICBnZXRFeHBlY3RlZExhc3RIZWFkZXJJbmRleChcclxuICAgIGhlYWRlcjogYW55W10gPSBbXSxcclxuICAgIHN1YkhlYWRpbmc6IGFueVtdID0gW10sXHJcbiAgICBzaGVldD86IHN0cmluZ1xyXG4gICk6IG51bWJlciB7XHJcbiAgICBjb25zdCBoYXNQcm9ncmFtID0gdGhpcy5oYXNQcm9ncmFtQ29sdW1ucyhoZWFkZXIpO1xyXG4gICAgY29uc3QgaGFzRXh0ZW5kZWQgPSBbLi4uaGVhZGVyLCAuLi5zdWJIZWFkaW5nXS5zb21lKChjZWxsKSA9PiB7XHJcbiAgICAgIGNvbnN0IGxhYmVsID0gdGhpcy5ub3JtYWxpemVIZWFkZXJMYWJlbChjZWxsKTtcclxuICAgICAgcmV0dXJuIChcclxuICAgICAgICBsYWJlbC5pbmNsdWRlcygnZHVlIHRpbWUnKSB8fFxyXG4gICAgICAgIGxhYmVsLmluY2x1ZGVzKCdyZXNwb25zaWJpbGl0eSBlbmRzIGFmdGVyJykgfHxcclxuICAgICAgICBsYWJlbC5pbmNsdWRlcygncmVzcG9uc2liaWxpdHkgZW5kcyBieSBkYXRlJylcclxuICAgICAgKTtcclxuICAgIH0pO1xyXG4gICAgaWYgKHNoZWV0ID09PSAnb25nb2luZycpIHtcclxuICAgICAgcmV0dXJuIGhhc1Byb2dyYW0gPyAyMiA6IDIwO1xyXG4gICAgfVxyXG4gICAgaWYgKGhhc1Byb2dyYW0gJiYgaGFzRXh0ZW5kZWQpIHtcclxuICAgICAgcmV0dXJuIDMxO1xyXG4gICAgfVxyXG4gICAgaWYgKGhhc1Byb2dyYW0pIHtcclxuICAgICAgcmV0dXJuIDI3O1xyXG4gICAgfVxyXG4gICAgaWYgKGhhc0V4dGVuZGVkKSB7XHJcbiAgICAgIHJldHVybiAyNjtcclxuICAgIH1cclxuICAgIHJldHVybiAyMjtcclxuICB9XHJcblxyXG4gIGdldE1heEhlYWRlckluZGV4KFxyXG4gICAgaGVhZGVyOiBhbnlbXSA9IFtdLFxyXG4gICAgc3ViSGVhZGluZzogYW55W10gPSBbXSxcclxuICAgIHNoZWV0Pzogc3RyaW5nXHJcbiAgKTogbnVtYmVyIHtcclxuICAgIHJldHVybiB0aGlzLmdldEV4cGVjdGVkTGFzdEhlYWRlckluZGV4KGhlYWRlciwgc3ViSGVhZGluZywgc2hlZXQpO1xyXG4gIH1cclxuXHJcbiAgbm9ybWFsaXplSGVhZGVyTGFiZWwodmFsdWU6IGFueSk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gU3RyaW5nKHZhbHVlID8/ICcnKVxyXG4gICAgICAucmVwbGFjZSgvW1xcdTIwMEItXFx1MjAwRFxcdUZFRkZdL2csICcnKVxyXG4gICAgICAucmVwbGFjZSgvXFx1MDBhMC9nLCAnICcpXHJcbiAgICAgIC5yZXBsYWNlKC9cXCovZywgJycpXHJcbiAgICAgIC5yZXBsYWNlKC9cXHMrL2csICcgJylcclxuICAgICAgLnRyaW0oKVxyXG4gICAgICAudG9Mb3dlckNhc2UoKTtcclxuICB9XHJcblxyXG4gIGxhc3RGaWxsZWRJbmRleChyb3c6IGFueVtdID0gW10pOiBudW1iZXIge1xyXG4gICAgZm9yIChsZXQgaW5kZXggPSByb3cubGVuZ3RoIC0gMTsgaW5kZXggPj0gMDsgaW5kZXgtLSkge1xyXG4gICAgICBpZiAodGhpcy5ub3JtYWxpemVIZWFkZXJMYWJlbChyb3dbaW5kZXhdKSkge1xyXG4gICAgICAgIHJldHVybiBpbmRleDtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIC0xO1xyXG4gIH1cclxufVxyXG4iXX0=