@serve.zone/dcrouter 13.0.4 → 13.0.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (45) hide show
  1. package/dist_serve/bundle.js +1059 -972
  2. package/dist_ts/00_commitinfo_data.js +1 -1
  3. package/dist_ts/classes.dcrouter.js +5 -2
  4. package/dist_ts/opsserver/handlers/certificate.handler.js +31 -23
  5. package/dist_ts_web/00_commitinfo_data.js +1 -1
  6. package/dist_ts_web/elements/ops-view-apitokens.js +1 -1
  7. package/dist_ts_web/elements/ops-view-certificates.js +1 -1
  8. package/dist_ts_web/elements/ops-view-config.js +1 -1
  9. package/dist_ts_web/elements/ops-view-emails.js +1 -1
  10. package/dist_ts_web/elements/ops-view-logs.js +1 -1
  11. package/dist_ts_web/elements/ops-view-network.js +1 -1
  12. package/dist_ts_web/elements/ops-view-networktargets.js +1 -1
  13. package/dist_ts_web/elements/ops-view-overview.js +1 -1
  14. package/dist_ts_web/elements/ops-view-remoteingress.js +1 -1
  15. package/dist_ts_web/elements/ops-view-routes.js +1 -1
  16. package/dist_ts_web/elements/ops-view-security.js +1 -1
  17. package/dist_ts_web/elements/ops-view-sourceprofiles.js +1 -1
  18. package/dist_ts_web/elements/ops-view-targetprofiles.d.ts +1 -0
  19. package/dist_ts_web/elements/ops-view-targetprofiles.js +51 -52
  20. package/dist_ts_web/elements/ops-view-vpn.js +1 -1
  21. package/dist_ts_web/elements/shared/index.d.ts +0 -1
  22. package/dist_ts_web/elements/shared/index.js +1 -2
  23. package/package.json +5 -5
  24. package/ts/00_commitinfo_data.ts +1 -1
  25. package/ts/classes.dcrouter.ts +4 -1
  26. package/ts/opsserver/handlers/certificate.handler.ts +30 -22
  27. package/ts_web/00_commitinfo_data.ts +1 -1
  28. package/ts_web/elements/ops-view-apitokens.ts +1 -1
  29. package/ts_web/elements/ops-view-certificates.ts +1 -1
  30. package/ts_web/elements/ops-view-config.ts +1 -1
  31. package/ts_web/elements/ops-view-emails.ts +1 -1
  32. package/ts_web/elements/ops-view-logs.ts +1 -1
  33. package/ts_web/elements/ops-view-network.ts +1 -1
  34. package/ts_web/elements/ops-view-networktargets.ts +1 -1
  35. package/ts_web/elements/ops-view-overview.ts +1 -1
  36. package/ts_web/elements/ops-view-remoteingress.ts +1 -1
  37. package/ts_web/elements/ops-view-routes.ts +1 -1
  38. package/ts_web/elements/ops-view-security.ts +1 -1
  39. package/ts_web/elements/ops-view-sourceprofiles.ts +1 -1
  40. package/ts_web/elements/ops-view-targetprofiles.ts +51 -48
  41. package/ts_web/elements/ops-view-vpn.ts +1 -1
  42. package/ts_web/elements/shared/index.ts +1 -2
  43. package/dist_ts_web/elements/shared/ops-sectionheading.d.ts +0 -5
  44. package/dist_ts_web/elements/shared/ops-sectionheading.js +0 -82
  45. package/ts_web/elements/shared/ops-sectionheading.ts +0 -38
@@ -95,7 +95,7 @@ let OpsViewConfig = (() => {
95
95
  ];
96
96
  render() {
97
97
  return html `
98
- <ops-sectionheading>Configuration</ops-sectionheading>
98
+ <dees-heading level="2">Configuration</dees-heading>
99
99
 
100
100
  ${this.configState.isLoading
101
101
  ? html `
@@ -115,7 +115,7 @@ let OpsViewEmails = (() => {
115
115
  ];
116
116
  render() {
117
117
  return html `
118
- <ops-sectionheading>Email Operations</ops-sectionheading>
118
+ <dees-heading level="2">Email Operations</dees-heading>
119
119
  <div class="viewContainer">
120
120
  ${this.currentView === 'detail' && this.selectedEmail
121
121
  ? html `
@@ -78,7 +78,7 @@ let OpsViewLogs = (() => {
78
78
  ];
79
79
  render() {
80
80
  return html `
81
- <ops-sectionheading>Logs</ops-sectionheading>
81
+ <dees-heading level="2">Logs</dees-heading>
82
82
 
83
83
  <dees-chart-log
84
84
  .label=${'Application Logs'}
@@ -312,7 +312,7 @@ let OpsViewNetwork = (() => {
312
312
  ];
313
313
  render() {
314
314
  return html `
315
- <ops-sectionheading>Network Activity</ops-sectionheading>
315
+ <dees-heading level="2">Network Activity</dees-heading>
316
316
 
317
317
  <div class="networkContainer">
318
318
  <!-- Stats Grid -->
@@ -96,7 +96,7 @@ let OpsViewNetworkTargets = (() => {
96
96
  },
97
97
  ];
98
98
  return html `
99
- <ops-sectionheading>Network Targets</ops-sectionheading>
99
+ <dees-heading level="2">Network Targets</dees-heading>
100
100
  <div class="targetsContainer">
101
101
  <dees-statsgrid .tiles=${statsTiles}></dees-statsgrid>
102
102
  <dees-table
@@ -137,7 +137,7 @@ let OpsViewOverview = (() => {
137
137
  ];
138
138
  render() {
139
139
  return html `
140
- <ops-sectionheading>Overview</ops-sectionheading>
140
+ <dees-heading level="2">Overview</dees-heading>
141
141
 
142
142
  ${this.statsState.isLoading ? html `
143
143
  <div class="loadingMessage">
@@ -206,7 +206,7 @@ let OpsViewRemoteIngress = (() => {
206
206
  },
207
207
  ];
208
208
  return html `
209
- <ops-sectionheading>Remote Ingress</ops-sectionheading>
209
+ <dees-heading level="2">Remote Ingress</dees-heading>
210
210
 
211
211
  ${this.riState.newEdgeId ? html `
212
212
  <div class="secretDialog">
@@ -243,7 +243,7 @@ let OpsViewRoutes = (() => {
243
243
  };
244
244
  });
245
245
  return html `
246
- <ops-sectionheading>Route Management</ops-sectionheading>
246
+ <dees-heading level="2">Route Management</dees-heading>
247
247
 
248
248
  <div class="routesContainer">
249
249
  <dees-statsgrid
@@ -238,7 +238,7 @@ let OpsViewSecurity = (() => {
238
238
  ];
239
239
  render() {
240
240
  return html `
241
- <ops-sectionheading>Security</ops-sectionheading>
241
+ <dees-heading level="2">Security</dees-heading>
242
242
 
243
243
  <div class="tabs">
244
244
  <button
@@ -96,7 +96,7 @@ let OpsViewSourceProfiles = (() => {
96
96
  },
97
97
  ];
98
98
  return html `
99
- <ops-sectionheading>Source Profiles</ops-sectionheading>
99
+ <dees-heading level="2">Source Profiles</dees-heading>
100
100
  <div class="profilesContainer">
101
101
  <dees-statsgrid .tiles=${statsTiles}></dees-statsgrid>
102
102
  <dees-table
@@ -12,6 +12,7 @@ export declare class OpsViewTargetProfiles extends DeesElement {
12
12
  connectedCallback(): Promise<void>;
13
13
  static styles: plugins.deesElement.CSSResult[];
14
14
  render(): TemplateResult;
15
+ private getRouteCandidates;
15
16
  private showCreateProfileDialog;
16
17
  private showEditProfileDialog;
17
18
  private showDetailDialog;
@@ -109,7 +109,7 @@ let OpsViewTargetProfiles = (() => {
109
109
  },
110
110
  ];
111
111
  return html `
112
- <ops-sectionheading>Target Profiles</ops-sectionheading>
112
+ <dees-heading level="2">Target Profiles</dees-heading>
113
113
  <div class="profilesContainer">
114
114
  <dees-statsgrid .tiles=${statsTiles}></dees-statsgrid>
115
115
  <dees-table
@@ -179,17 +179,25 @@ let OpsViewTargetProfiles = (() => {
179
179
  </div>
180
180
  `;
181
181
  }
182
+ getRouteCandidates() {
183
+ const routeState = appstate.routeManagementStatePart.getState();
184
+ const routes = routeState?.mergedRoutes || [];
185
+ return routes
186
+ .filter((mr) => mr.route.name)
187
+ .map((mr) => ({ viewKey: mr.route.name }));
188
+ }
182
189
  async showCreateProfileDialog() {
183
190
  const { DeesModal } = await import('@design.estate/dees-catalog');
191
+ const routeCandidates = this.getRouteCandidates();
184
192
  DeesModal.createAndShow({
185
193
  heading: 'Create Target Profile',
186
194
  content: html `
187
195
  <dees-form>
188
196
  <dees-input-text .key=${'name'} .label=${'Name'} .required=${true}></dees-input-text>
189
197
  <dees-input-text .key=${'description'} .label=${'Description'}></dees-input-text>
190
- <dees-input-text .key=${'domains'} .label=${'Domains (comma-separated, e.g. *.example.com)'} ></dees-input-text>
191
- <dees-input-text .key=${'targets'} .label=${'Targets (comma-separated host:port, e.g. 10.0.0.1:443)'}></dees-input-text>
192
- <dees-input-text .key=${'routeRefs'} .label=${'Route Refs (comma-separated route names/IDs)'}></dees-input-text>
198
+ <dees-input-list .key=${'domains'} .label=${'Domains'} .placeholder=${'e.g. *.example.com'} .allowFreeform=${true}></dees-input-list>
199
+ <dees-input-list .key=${'targets'} .label=${'Targets (host:port)'} .placeholder=${'e.g. 10.0.0.1:443'} .allowFreeform=${true}></dees-input-list>
200
+ <dees-input-list .key=${'routeRefs'} .label=${'Route Refs'} .placeholder=${'Type to search routes...'} .candidates=${routeCandidates} .allowFreeform=${true}></dees-input-list>
193
201
  </dees-form>
194
202
  `,
195
203
  menuOptions: [
@@ -204,30 +212,26 @@ let OpsViewTargetProfiles = (() => {
204
212
  const data = await form.collectFormData();
205
213
  if (!data.name)
206
214
  return;
207
- const domains = data.domains
208
- ? String(data.domains).split(',').map((s) => s.trim()).filter(Boolean)
209
- : undefined;
210
- const targets = data.targets
211
- ? String(data.targets).split(',').map((s) => {
212
- const trimmed = s.trim();
213
- const lastColon = trimmed.lastIndexOf(':');
214
- if (lastColon === -1)
215
- return null;
216
- return {
217
- host: trimmed.substring(0, lastColon),
218
- port: parseInt(trimmed.substring(lastColon + 1), 10),
219
- };
220
- }).filter((t) => t !== null && !isNaN(t.port))
221
- : undefined;
222
- const routeRefs = data.routeRefs
223
- ? String(data.routeRefs).split(',').map((s) => s.trim()).filter(Boolean)
224
- : undefined;
215
+ const domains = Array.isArray(data.domains) ? data.domains : [];
216
+ const targetStrings = Array.isArray(data.targets) ? data.targets : [];
217
+ const targets = targetStrings
218
+ .map((s) => {
219
+ const lastColon = s.lastIndexOf(':');
220
+ if (lastColon === -1)
221
+ return null;
222
+ return {
223
+ host: s.substring(0, lastColon),
224
+ port: parseInt(s.substring(lastColon + 1), 10),
225
+ };
226
+ })
227
+ .filter((t) => t !== null && !isNaN(t.port));
228
+ const routeRefs = Array.isArray(data.routeRefs) ? data.routeRefs : [];
225
229
  await appstate.targetProfilesStatePart.dispatchAction(appstate.createTargetProfileAction, {
226
230
  name: String(data.name),
227
231
  description: data.description ? String(data.description) : undefined,
228
- domains,
229
- targets,
230
- routeRefs,
232
+ domains: domains.length > 0 ? domains : undefined,
233
+ targets: targets.length > 0 ? targets : undefined,
234
+ routeRefs: routeRefs.length > 0 ? routeRefs : undefined,
231
235
  });
232
236
  modalArg.destroy();
233
237
  },
@@ -236,19 +240,20 @@ let OpsViewTargetProfiles = (() => {
236
240
  });
237
241
  }
238
242
  async showEditProfileDialog(profile) {
239
- const currentDomains = profile.domains?.join(', ') ?? '';
240
- const currentTargets = profile.targets?.map(t => `${t.host}:${t.port}`).join(', ') ?? '';
241
- const currentRouteRefs = profile.routeRefs?.join(', ') ?? '';
243
+ const currentDomains = profile.domains || [];
244
+ const currentTargets = profile.targets?.map(t => `${t.host}:${t.port}`) || [];
245
+ const currentRouteRefs = profile.routeRefs || [];
242
246
  const { DeesModal } = await import('@design.estate/dees-catalog');
247
+ const routeCandidates = this.getRouteCandidates();
243
248
  DeesModal.createAndShow({
244
249
  heading: `Edit Profile: ${profile.name}`,
245
250
  content: html `
246
251
  <dees-form>
247
252
  <dees-input-text .key=${'name'} .label=${'Name'} .value=${profile.name}></dees-input-text>
248
253
  <dees-input-text .key=${'description'} .label=${'Description'} .value=${profile.description || ''}></dees-input-text>
249
- <dees-input-text .key=${'domains'} .label=${'Domains (comma-separated, e.g. *.example.com)'} .value=${currentDomains}></dees-input-text>
250
- <dees-input-text .key=${'targets'} .label=${'Targets (comma-separated host:port, e.g. 10.0.0.1:443)'} .value=${currentTargets}></dees-input-text>
251
- <dees-input-text .key=${'routeRefs'} .label=${'Route Refs (comma-separated route names/IDs)'} .value=${currentRouteRefs}></dees-input-text>
254
+ <dees-input-list .key=${'domains'} .label=${'Domains'} .placeholder=${'e.g. *.example.com'} .allowFreeform=${true} .value=${currentDomains}></dees-input-list>
255
+ <dees-input-list .key=${'targets'} .label=${'Targets (host:port)'} .placeholder=${'e.g. 10.0.0.1:443'} .allowFreeform=${true} .value=${currentTargets}></dees-input-list>
256
+ <dees-input-list .key=${'routeRefs'} .label=${'Route Refs'} .placeholder=${'Type to search routes...'} .candidates=${routeCandidates} .allowFreeform=${true} .value=${currentRouteRefs}></dees-input-list>
252
257
  </dees-form>
253
258
  `,
254
259
  menuOptions: [
@@ -261,26 +266,20 @@ let OpsViewTargetProfiles = (() => {
261
266
  if (!form)
262
267
  return;
263
268
  const data = await form.collectFormData();
264
- const domains = data.domains
265
- ? String(data.domains).split(',').map((s) => s.trim()).filter(Boolean)
266
- : [];
267
- const targets = data.targets
268
- ? String(data.targets).split(',').map((s) => {
269
- const trimmed = s.trim();
270
- if (!trimmed)
271
- return null;
272
- const lastColon = trimmed.lastIndexOf(':');
273
- if (lastColon === -1)
274
- return null;
275
- return {
276
- host: trimmed.substring(0, lastColon),
277
- port: parseInt(trimmed.substring(lastColon + 1), 10),
278
- };
279
- }).filter((t) => t !== null && !isNaN(t.port))
280
- : [];
281
- const routeRefs = data.routeRefs
282
- ? String(data.routeRefs).split(',').map((s) => s.trim()).filter(Boolean)
283
- : [];
269
+ const domains = Array.isArray(data.domains) ? data.domains : [];
270
+ const targetStrings = Array.isArray(data.targets) ? data.targets : [];
271
+ const targets = targetStrings
272
+ .map((s) => {
273
+ const lastColon = s.lastIndexOf(':');
274
+ if (lastColon === -1)
275
+ return null;
276
+ return {
277
+ host: s.substring(0, lastColon),
278
+ port: parseInt(s.substring(lastColon + 1), 10),
279
+ };
280
+ })
281
+ .filter((t) => t !== null && !isNaN(t.port));
282
+ const routeRefs = Array.isArray(data.routeRefs) ? data.routeRefs : [];
284
283
  await appstate.targetProfilesStatePart.dispatchAction(appstate.updateTargetProfileAction, {
285
284
  id: profile.id,
286
285
  name: String(data.name),
@@ -409,4 +408,4 @@ let OpsViewTargetProfiles = (() => {
409
408
  return OpsViewTargetProfiles = _classThis;
410
409
  })();
411
410
  export { OpsViewTargetProfiles };
412
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3BzLXZpZXctdGFyZ2V0cHJvZmlsZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi90c193ZWIvZWxlbWVudHMvb3BzLXZpZXctdGFyZ2V0cHJvZmlsZXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLE9BQU8sRUFDTCxXQUFXLEVBQ1gsSUFBSSxFQUNKLGFBQWEsRUFFYixHQUFHLEVBQ0gsS0FBSyxFQUNMLFVBQVUsR0FDWCxNQUFNLDZCQUE2QixDQUFDO0FBQ3JDLE9BQU8sS0FBSyxPQUFPLE1BQU0sZUFBZSxDQUFDO0FBQ3pDLE9BQU8sS0FBSyxRQUFRLE1BQU0sZ0JBQWdCLENBQUM7QUFDM0MsT0FBTyxLQUFLLFVBQVUsTUFBTSxtQ0FBbUMsQ0FBQztBQUNoRSxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDOUMsT0FBTyxFQUFtQixNQUFNLDZCQUE2QixDQUFDO0lBU2pELHFCQUFxQjs0QkFEakMsYUFBYSxDQUFDLHlCQUF5QixDQUFDOzs7O3NCQUNFLFdBQVc7Ozs7cUNBQW5CLFNBQVEsV0FBVzs7OzsrQ0FDbkQsS0FBSyxFQUFFO1lBQ1IsOE1BQVMsbUJBQW1CLDZCQUFuQixtQkFBbUIsaUhBQStFO1lBRjdHLDZLQW9XQzs7OztRQWxXQyxtR0FBOEQsUUFBUSxDQUFDLHVCQUF1QixDQUFDLFFBQVEsRUFBRyxFQUFDO1FBQTNHLElBQVMsbUJBQW1CLHlEQUErRTtRQUEzRyxJQUFTLG1CQUFtQiwrREFBK0U7UUFFM0c7WUFDRSxLQUFLLEVBQUUsQ0FBQzs7WUFDUixNQUFNLEdBQUcsR0FBRyxRQUFRLENBQUMsdUJBQXVCLENBQUMsTUFBTSxFQUFFLENBQUMsU0FBUyxDQUFDLENBQUMsUUFBUSxFQUFFLEVBQUU7Z0JBQzNFLElBQUksQ0FBQyxtQkFBbUIsR0FBRyxRQUFRLENBQUM7WUFDdEMsQ0FBQyxDQUFDLENBQUM7WUFDSCxJ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
411
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3BzLXZpZXctdGFyZ2V0cHJvZmlsZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi90c193ZWIvZWxlbWVudHMvb3BzLXZpZXctdGFyZ2V0cHJvZmlsZXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLE9BQU8sRUFDTCxXQUFXLEVBQ1gsSUFBSSxFQUNKLGFBQWEsRUFFYixHQUFHLEVBQ0gsS0FBSyxFQUNMLFVBQVUsR0FDWCxNQUFNLDZCQUE2QixDQUFDO0FBQ3JDLE9BQU8sS0FBSyxPQUFPLE1BQU0sZUFBZSxDQUFDO0FBQ3pDLE9BQU8sS0FBSyxRQUFRLE1BQU0sZ0JBQWdCLENBQUM7QUFDM0MsT0FBTyxLQUFLLFVBQVUsTUFBTSxtQ0FBbUMsQ0FBQztBQUNoRSxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDOUMsT0FBTyxFQUFtQixNQUFNLDZCQUE2QixDQUFDO0lBU2pELHFCQUFxQjs0QkFEakMsYUFBYSxDQUFDLHlCQUF5QixDQUFDOzs7O3NCQUNFLFdBQVc7Ozs7cUNBQW5CLFNBQVEsV0FBVzs7OzsrQ0FDbkQsS0FBSyxFQUFFO1lBQ1IsOE1BQVMsbUJBQW1CLDZCQUFuQixtQkFBbUIsaUhBQStFO1lBRjdHLDZLQXVXQzs7OztRQXJXQyxtR0FBOEQsUUFBUSxDQUFDLHVCQUF1QixDQUFDLFFBQVEsRUFBRyxFQUFDO1FBQTNHLElBQVMsbUJBQW1CLHlEQUErRTtRQUEzRyxJQUFTLG1CQUFtQiwrREFBK0U7UUFFM0c7WUFDRSxLQUFLLEVBQUUsQ0FBQzs7WUFDUixNQUFNLEdBQUcsR0FBRyxRQUFRLENBQUMsdUJBQXVCLENBQUMsTUFBTSxFQUFFLENBQUMsU0FBUyxDQUFDLENBQUMsUUFBUSxFQUFFLEVBQUU7Z0JBQzNFLElBQUksQ0FBQyxtQkFBbUIsR0FBRyxRQUFRLENBQUM7WUFDdEMsQ0FBQyxDQUFDLENBQUM7WUFDSCxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztTQUNoQztRQUVELEtBQUssQ0FBQyxpQkFBaUI7WUFDckIsTUFBTSxLQUFLLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztZQUNoQyxNQUFNLFFBQVEsQ0FBQyx1QkFBdUIsQ0FBQyxjQUFjLENBQUMsUUFBUSxDQUFDLHlCQUF5QixFQUFFLElBQUksQ0FBQyxDQUFDO1FBQ2xHLENBQUM7UUFFTSxNQUFNLENBQUMsTUFBTSxHQUFHO1lBQ3JCLFVBQVUsQ0FBQyxhQUFhO1lBQ3hCLFdBQVc7WUFDWCxHQUFHLENBQUE7Ozs7Ozs7Ozs7Ozs7c0JBYWUsVUFBVSxDQUFDLE9BQU8sQ0FBQyxTQUFTLEVBQUUsU0FBUyxDQUFDO2lCQUM3QyxVQUFVLENBQUMsT0FBTyxDQUFDLFNBQVMsRUFBRSxTQUFTLENBQUM7Ozs7S0FJcEQ7U0FDRixDQUFDO1FBRUssTUFBTTtZQUNYLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxRQUFRLENBQUM7WUFFbkQsTUFBTSxVQUFVLEdBQWlCO2dCQUMvQjtvQkFDRSxFQUFFLEVBQUUsZUFBZTtvQkFDbkIsS0FBSyxFQUFFLGdCQUFnQjtvQkFDdkIsSUFBSSxFQUFFLFFBQVE7b0JBQ2QsS0FBSyxFQUFFLFFBQVEsQ0FBQyxNQUFNO29CQUN0QixJQUFJLEVBQUUsZUFBZTtvQkFDckIsV0FBVyxFQUFFLDBCQUEwQjtvQkFDdkMsS0FBSyxFQUFFLFNBQVM7aUJBQ2pCO2FBQ0YsQ0FBQztZQUVGLE9BQU8sSUFBSSxDQUFBOzs7aUNBR2tCLFVBQVU7O3NCQUVyQixpQkFBaUI7c0JBQ2pCLDhDQUE4QztrQkFDbEQsUUFBUTs2QkFDRyxDQUFDLE9BQXVDLEVBQUUsRUFBRSxDQUFDLENBQUM7Z0JBQy9ELElBQUksRUFBRSxPQUFPLENBQUMsSUFBSTtnQkFDbEIsV0FBVyxFQUFFLE9BQU8sQ0FBQyxXQUFXLElBQUksR0FBRztnQkFDdkMsT0FBTyxFQUFFLE9BQU8sQ0FBQyxPQUFPLEVBQUUsTUFBTTtvQkFDOUIsQ0FBQyxDQUFDLElBQUksQ0FBQSxHQUFHLE9BQU8sQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFBLDBCQUEwQixDQUFDLFNBQVMsQ0FBQyxFQUFFO29CQUM3RSxDQUFDLENBQUMsR0FBRztnQkFDUCxPQUFPLEVBQUUsT0FBTyxDQUFDLE9BQU8sRUFBRSxNQUFNO29CQUM5QixDQUFDLENBQUMsSUFBSSxDQUFBLEdBQUcsT0FBTyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUEsMEJBQTBCLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLElBQUksU0FBUyxDQUFDLEVBQUU7b0JBQzVGLENBQUMsQ0FBQyxHQUFHO2dCQUNQLFlBQVksRUFBRSxPQUFPLENBQUMsU0FBUyxFQUFFLE1BQU07b0JBQ3JDLENBQUMsQ0FBQyxJQUFJLENBQUEsR0FBRyxPQUFPLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQSwwQkFBMEIsQ0FBQyxTQUFTLENBQUMsRUFBRTtvQkFDL0UsQ0FBQyxDQUFDLEdBQUc7Z0JBQ1AsT0FBTyxFQUFFLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQyxrQkFBa0IsRUFBRTthQUMxRCxDQUFDO3lCQUNhO2dCQUNiO29CQUNFLElBQUksRUFBRSxnQkFBZ0I7b0JBQ3RCLFFBQVEsRUFBRSxhQUFhO29CQUN2QixJQUFJLEVBQUUsQ0FBQyxRQUFpQixDQUFDO29CQUN6QixVQUFVLEVBQUUsS0FBSyxJQUFJLEVBQUU7d0JBQ3JCLE1BQU0sSUFBSSxDQUFDLHVCQUF1QixFQUFFLENBQUM7b0JBQ3ZDLENBQUM7aUJBQ0Y7Z0JBQ0Q7b0JBQ0UsSUFBSSxFQUFFLFNBQVM7b0JBQ2YsUUFBUSxFQUFFLGlCQUFpQjtvQkFDM0IsSUFBSSxFQUFFLENBQUMsUUFBaUIsQ0FBQztvQkFDekIsVUFBVSxFQUFFLEtBQUssSUFBSSxFQUFFO3dCQUNyQixNQUFNLFFBQVEsQ0FBQyx1QkFBdUIsQ0FBQyxjQUFjLENBQUMsUUFBUSxDQUFDLHlCQUF5QixFQUFFLElBQUksQ0FBQyxDQUFDO29CQUNsRyxDQUFDO2lCQUNGO2dCQUNEO29CQUNFLElBQUksRUFBRSxRQUFRO29CQUNkLFFBQVEsRUFBRSxhQUFhO29CQUN2QixJQUFJLEVBQUUsQ0FBQyxhQUFhLENBQVE7b0JBQzVCLFVBQVUsRUFBRSxLQUFLLEVBQUUsVUFBZSxFQUFFLEVBQUU7d0JBQ3BDLE1BQU0sT0FBTyxHQUFHLFVBQVUsQ0FBQyxJQUFzQyxDQUFDO3dCQUNsRSxNQUFNLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxPQUFPLENBQUMsQ0FBQztvQkFDdkMsQ0FBQztpQkFDRjtnQkFDRDtvQkFDRSxJQUFJLEVBQUUsTUFBTTtvQkFDWixRQUFRLEVBQUUsZUFBZTtvQkFDekIsSUFBSSxFQUFFLENBQUMsT0FBTyxFQUFFLGFBQWEsQ0FBUTtvQkFDckMsVUFBVSxFQUFFLEtBQUssRUFBRSxVQUFlLEVBQUUsRUFBRTt3QkFDcEMsTUFBTSxPQUFPLEdBQUcsVUFBVSxDQUFDLElBQXNDLENBQUM7d0JBQ2xFLE1BQU0sSUFBSSxDQUFDLHFCQUFxQixDQUFDLE9BQU8sQ0FBQyxDQUFDO29CQUM1QyxDQUFDO2lCQUNGO2dCQUNEO29CQUNFLElBQUksRUFBRSxRQUFRO29CQUNkLFFBQVEsRUFBRSxlQUFlO29CQUN6QixJQUFJLEVBQUUsQ0FBQyxPQUFPLEVBQUUsYUFBYSxDQUFRO29CQUNyQyxVQUFVLEVBQUUsS0FBSyxFQUFFLFVBQWUsRUFBRSxFQUFFO3dCQUNwQyxNQUFNLE9BQU8sR0FBRyxVQUFVLENBQUMsSUFBc0MsQ0FBQzt3QkFDbEUsTUFBTSxJQUFJLENBQUMsYUFBYSxDQUFDLE9BQU8sQ0FBQyxDQUFDO29CQUNwQyxDQUFDO2lCQUNGO2FBQ0Y7OztLQUdOLENBQUM7UUFDSixDQUFDO1FBRU8sa0JBQWtCO1lBQ3hCLE1BQU0sVUFBVSxHQUFHLFFBQVEsQ0FBQyx3QkFBd0IsQ0FBQyxRQUFRLEVBQUUsQ0FBQztZQUNoRSxNQUFNLE1BQU0sR0FBRyxVQUFVLEVBQUUsWUFBWSxJQUFJLEVBQUUsQ0FBQztZQUM5QyxPQUFPLE1BQU07aUJBQ1YsTUFBTSxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQztpQkFDN0IsR0FBRyxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsT0FBTyxFQUFFLEVBQUUsQ0FBQyxLQUFLLENBQUMsSUFBSyxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQ2hELENBQUM7UUFFTyxLQUFLLENBQUMsdUJBQXVCO1lBQ25DLE1BQU0sRUFBRSxTQUFTLEVBQUUsR0FBRyxNQUFNLE1BQU0sQ0FBQyw2QkFBNkIsQ0FBQyxDQUFDO1lBQ2xFLE1BQU0sZUFBZSxHQUFHLElBQUksQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO1lBRWxELFNBQVMsQ0FBQyxhQUFhLENBQUM7Z0JBQ3RCLE9BQU8sRUFBRSx1QkFBdUI7Z0JBQ2hDLE9BQU8sRUFBRSxJQUFJLENBQUE7O2tDQUVlLE1BQU0sV0FBVyxNQUFNLGNBQWMsSUFBSTtrQ0FDekMsYUFBYSxXQUFXLGFBQWE7a0NBQ3JDLFNBQVMsV0FBVyxTQUFTLGlCQUFpQixvQkFBb0IsbUJBQW1CLElBQUk7a0NBQ3pGLFNBQVMsV0FBVyxxQkFBcUIsaUJBQWlCLG1CQUFtQixtQkFBbUIsSUFBSTtrQ0FDcEcsV0FBVyxXQUFXLFlBQVksaUJBQWlCLDBCQUEwQixnQkFBZ0IsZUFBZSxtQkFBbUIsSUFBSTs7T0FFOUo7Z0JBQ0QsV0FBVyxFQUFFO29CQUNYLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsUUFBYSxFQUFFLEVBQUUsQ0FBQyxRQUFRLENBQUMsT0FBTyxFQUFFLEVBQUU7b0JBQzdGO3dCQUNFLElBQUksRUFBRSxRQUFRO3dCQUNkLFFBQVEsRUFBRSxhQUFhO3dCQUN2QixNQUFNLEVBQUUsS0FBSyxFQUFFLFFBQWEsRUFBRSxFQUFFOzRCQUM5QixNQUFNLElBQUksR0FBRyxRQUFRLENBQUMsVUFBVSxFQUFFLGFBQWEsQ0FBQyxVQUFVLENBQUMsRUFBRSxhQUFhLENBQUMsV0FBVyxDQUFDLENBQUM7NEJBQ3hGLElBQUksQ0FBQyxJQUFJO2dDQUFFLE9BQU87NEJBQ2xCLE1BQU0sSUFBSSxHQUFHLE1BQU0sSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDOzRCQUMxQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUk7Z0NBQUUsT0FBTzs0QkFFdkIsTUFBTSxPQUFPLEdBQWEsS0FBSyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQzs0QkFDMUUsTUFBTSxhQUFhLEdBQWEsS0FBSyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQzs0QkFDaEYsTUFBTSxPQUFPLEdBQUcsYUFBYTtpQ0FDMUIsR0FBRyxDQUFDLENBQUMsQ0FBUyxFQUFFLEVBQUU7Z0NBQ2pCLE1BQU0sU0FBUyxHQUFHLENBQUMsQ0FBQyxXQUFXLENBQUMsR0FBRyxDQUFDLENBQUM7Z0NBQ3JDLElBQUksU0FBUyxLQUFLLENBQUMsQ0FBQztvQ0FBRSxPQUFPLElBQUksQ0FBQztnQ0FDbEMsT0FBTztvQ0FDTCxJQUFJLEVBQUUsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLEVBQUUsU0FBUyxDQUFDO29DQUMvQixJQUFJLEVBQUUsUUFBUSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsU0FBUyxHQUFHLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQztpQ0FDL0MsQ0FBQzs0QkFDSixDQUFDLENBQUM7aUNBQ0QsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUF1QyxFQUFFLENBQUMsQ0FBQyxLQUFLLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQzs0QkFDcEYsTUFBTSxTQUFTLEdBQWEsS0FBSyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQzs0QkFFaEYsTUFBTSxRQUFRLENBQUMsdUJBQXVCLENBQUMsY0FBYyxDQUFDLFFBQVEsQ0FBQyx5QkFBeUIsRUFBRTtnQ0FDeEYsSUFBSSxFQUFFLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDO2dDQUN2QixXQUFXLEVBQUUsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUztnQ0FDcEUsT0FBTyxFQUFFLE9BQU8sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLFNBQVM7Z0NBQ2pELE9BQU8sRUFBRSxPQUFPLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxTQUFTO2dDQUNqRCxTQUFTLEVBQUUsU0FBUyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsU0FBUzs2QkFDeEQsQ0FBQyxDQUFDOzRCQUNILFFBQVEsQ0FBQyxPQUFPLEVBQUUsQ0FBQzt3QkFDckIsQ0FBQztxQkFDRjtpQkFDRjthQUNGLENBQUMsQ0FBQztRQUNMLENBQUM7UUFFTyxLQUFLLENBQUMscUJBQXFCLENBQUMsT0FBdUM7WUFDekUsTUFBTSxjQUFjLEdBQUcsT0FBTyxDQUFDLE9BQU8sSUFBSSxFQUFFLENBQUM7WUFDN0MsTUFBTSxjQUFjLEdBQUcsT0FBTyxDQUFDLE9BQU8sRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLElBQUksRUFBRSxDQUFDO1lBQzlFLE1BQU0sZ0JBQWdCLEdBQUcsT0FBTyxDQUFDLFNBQVMsSUFBSSxFQUFFLENBQUM7WUFFakQsTUFBTSxFQUFFLFNBQVMsRUFBRSxHQUFHLE1BQU0sTUFBTSxDQUFDLDZCQUE2QixDQUFDLENBQUM7WUFDbEUsTUFBTSxlQUFlLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixFQUFFLENBQUM7WUFFbEQsU0FBUyxDQUFDLGFBQWEsQ0FBQztnQkFDdEIsT0FBTyxFQUFFLGlCQUFpQixPQUFPLENBQUMsSUFBSSxFQUFFO2dCQUN4QyxPQUFPLEVBQUUsSUFBSSxDQUFBOztrQ0FFZSxNQUFNLFdBQVcsTUFBTSxXQUFXLE9BQU8sQ0FBQyxJQUFJO2tDQUM5QyxhQUFhLFdBQVcsYUFBYSxXQUFXLE9BQU8sQ0FBQyxXQUFXLElBQUksRUFBRTtrQ0FDekUsU0FBUyxXQUFXLFNBQVMsaUJBQWlCLG9CQUFvQixtQkFBbUIsSUFBSSxXQUFXLGNBQWM7a0NBQ2xILFNBQVMsV0FBVyxxQkFBcUIsaUJBQWlCLG1CQUFtQixtQkFBbUIsSUFBSSxXQUFXLGNBQWM7a0NBQzdILFdBQVcsV0FBVyxZQUFZLGlCQUFpQiwwQkFBMEIsZ0JBQWdCLGVBQWUsbUJBQW1CLElBQUksV0FBVyxnQkFBZ0I7O09BRXpMO2dCQUNELFdBQVcsRUFBRTtvQkFDWCxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUUsUUFBUSxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLFFBQWEsRUFBRSxFQUFFLENBQUMsUUFBUSxDQUFDLE9BQU8sRUFBRSxFQUFFO29CQUM3Rjt3QkFDRSxJQUFJLEVBQUUsTUFBTTt3QkFDWixRQUFRLEVBQUUsY0FBYzt3QkFDeEIsTUFBTSxFQUFFLEtBQUssRUFBRSxRQUFhLEVBQUUsRUFBRTs0QkFDOUIsTUFBTSxJQUFJLEdBQUcsUUFBUSxDQUFDLFVBQVUsRUFBRSxhQUFhLENBQUMsVUFBVSxDQUFDLEVBQUUsYUFBYSxDQUFDLFdBQVcsQ0FBQyxDQUFDOzRCQUN4RixJQUFJLENBQUMsSUFBSTtnQ0FBRSxPQUFPOzRCQUNsQixNQUFNLElBQUksR0FBRyxNQUFNLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQzs0QkFFMUMsTUFBTSxPQUFPLEdBQWEsS0FBSyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQzs0QkFDMUUsTUFBTSxhQUFhLEdBQWEsS0FBSyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQzs0QkFDaEYsTUFBTSxPQUFPLEdBQUcsYUFBYTtpQ0FDMUIsR0FBRyxDQUFDLENBQUMsQ0FBUyxFQUFFLEVBQUU7Z0NBQ2pCLE1BQU0sU0FBUyxHQUFHLENBQUMsQ0FBQyxXQUFXLENBQUMsR0FBRyxDQUFDLENBQUM7Z0NBQ3JDLElBQUksU0FBUyxLQUFLLENBQUMsQ0FBQztvQ0FBRSxPQUFPLElBQUksQ0FBQztnQ0FDbEMsT0FBTztvQ0FDTCxJQUFJLEVBQUUsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLEVBQUUsU0FBUyxDQUFDO29DQUMvQixJQUFJLEVBQUUsUUFBUSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsU0FBUyxHQUFHLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQztpQ0FDL0MsQ0FBQzs0QkFDSixDQUFDLENBQUM7aUNBQ0QsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUF1QyxFQUFFLENBQUMsQ0FBQyxLQUFLLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQzs0QkFDcEYsTUFBTSxTQUFTLEdBQWEsS0FBSyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQzs0QkFFaEYsTUFBTSxRQUFRLENBQUMsdUJBQXVCLENBQUMsY0FBYyxDQUFDLFFBQVEsQ0FBQyx5QkFBeUIsRUFBRTtnQ0FDeEYsRUFBRSxFQUFFLE9BQU8sQ0FBQyxFQUFFO2dDQUNkLElBQUksRUFBRSxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQztnQ0FDdkIsV0FBVyxFQUFFLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVM7Z0NBQ3BFLE9BQU87Z0NBQ1AsT0FBTztnQ0FDUCxTQUFTOzZCQUNWLENBQUMsQ0FBQzs0QkFDSCxRQUFRLENBQUMsT0FBTyxFQUFFLENBQUM7d0JBQ3JCLENBQUM7cUJBQ0Y7aUJBQ0Y7YUFDRixDQUFDLENBQUM7UUFDTCxDQUFDO1FBRU8sS0FBSyxDQUFDLGdCQUFnQixDQUFDLE9BQXVDO1lBQ3BFLE1BQU0sRUFBRSxTQUFTLEVBQUUsR0FBRyxNQUFNLE1BQU0sQ0FBQyw2QkFBNkIsQ0FBQyxDQUFDO1lBRWxFLHlEQUF5RDtZQUN6RCxJQUFJLFNBQVMsR0FBRyxJQUFJLENBQUEsaURBQWlELENBQUM7WUFDdEUsSUFBSSxDQUFDO2dCQUNILE1BQU0sT0FBTyxHQUFHLElBQUksT0FBTyxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsWUFBWSxDQUFDLFlBQVksQ0FFcEUsZUFBZSxFQUFFLHVCQUF1QixDQUFDLENBQUM7Z0JBQzVDLE1BQU0sUUFBUSxHQUFHLE1BQU0sT0FBTyxDQUFDLElBQUksQ0FBQztvQkFDbEMsUUFBUSxFQUFFLFFBQVEsQ0FBQyxjQUFjLENBQUMsUUFBUSxFQUFHLENBQUMsUUFBUztvQkFDdkQsRUFBRSxFQUFFLE9BQU8sQ0FBQyxFQUFFO2lCQUNmLENBQUMsQ0FBQztnQkFDSCxJQUFJLFFBQVEsQ0FBQyxPQUFPLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDO29CQUNoQyxTQUFTLEdBQUcsSUFBSSxDQUFBOztjQUVWLFFBQVEsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFBOzswQkFFbEIsQ0FBQyxDQUFDLFFBQVEsWUFBWSxDQUFDLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUEsTUFBTSxDQUFDLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUU7O2FBRWpGLENBQUM7O1NBRUwsQ0FBQztnQkFDSixDQUFDO3FCQUFNLENBQUM7b0JBQ04sU0FBUyxHQUFHLElBQUksQ0FBQSx3RkFBd0YsQ0FBQztnQkFDM0csQ0FBQztZQUNILENBQUM7WUFBQyxNQUFNLENBQUM7Z0JBQ1AsU0FBUyxHQUFHLElBQUksQ0FBQSx3REFBd0QsQ0FBQztZQUMzRSxDQUFDO1lBRUQsU0FBUyxDQUFDLGFBQWEsQ0FBQztnQkFDdEIsT0FBTyxFQUFFLG1CQUFtQixPQUFPLENBQUMsSUFBSSxFQUFFO2dCQUMxQyxPQUFPLEVBQUUsSUFBSSxDQUFBOzs7dUhBR29HLFVBQVUsQ0FBQyxPQUFPLENBQUMsU0FBUyxFQUFFLFNBQVMsQ0FBQzs2REFDbEcsT0FBTyxDQUFDLFdBQVcsSUFBSSxHQUFHOzs7dUhBR2dDLFVBQVUsQ0FBQyxPQUFPLENBQUMsU0FBUyxFQUFFLFNBQVMsQ0FBQzs7Z0JBRS9JLE9BQU8sQ0FBQyxPQUFPLEVBQUUsTUFBTTtvQkFDdkIsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFBLDBCQUEwQixDQUFDLFNBQVMsQ0FBQztvQkFDcEUsQ0FBQyxDQUFDLEdBQUc7Ozs7dUhBSWtHLFVBQVUsQ0FBQyxPQUFPLENBQUMsU0FBUyxFQUFFLFNBQVMsQ0FBQzs7Z0JBRS9JLE9BQU8sQ0FBQyxPQUFPLEVBQUUsTUFBTTtvQkFDdkIsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFBLDBCQUEwQixDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxJQUFJLFNBQVMsQ0FBQztvQkFDbkYsQ0FBQyxDQUFDLEdBQUc7Ozs7dUhBSWtHLFVBQVUsQ0FBQyxPQUFPLENBQUMsU0FBUyxFQUFFLFNBQVMsQ0FBQzs7Z0JBRS9JLE9BQU8sQ0FBQyxTQUFTLEVBQUUsTUFBTTtvQkFDekIsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFBLDBCQUEwQixDQUFDLFNBQVMsQ0FBQztvQkFDdEUsQ0FBQyxDQUFDLEdBQUc7Ozs7dUhBSWtHLFVBQVUsQ0FBQyxPQUFPLENBQUMsU0FBUyxFQUFFLFNBQVMsQ0FBQzs2REFDbEcsSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDLGNBQWMsRUFBRSxPQUFPLE9BQU8sQ0FBQyxTQUFTOzs7dUhBR1YsVUFBVSxDQUFDLE9BQU8sQ0FBQyxTQUFTLEVBQUUsU0FBUyxDQUFDOzZEQUNsRyxJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUMsY0FBYyxFQUFFOzs7dUhBR2MsVUFBVSxDQUFDLE9BQU8sQ0FBQyxTQUFTLEVBQUUsU0FBUyxDQUFDO2NBQ2pKLFNBQVM7OztPQUdoQjtnQkFDRCxXQUFXLEVBQUU7b0JBQ1gsRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFLFFBQVEsRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxDQUFNLEVBQUUsRUFBRSxDQUFDLE1BQU0sQ0FBQyxDQUFDLE9BQU8sRUFBRSxFQUFFO2lCQUNyRjthQUNGLENBQUMsQ0FBQztRQUNMLENBQUM7UUFFTyxLQUFLLENBQUMsYUFBYSxDQUFDLE9BQXVDO1lBQ2pFLE1BQU0sUUFBUSxDQUFDLHVCQUF1QixDQUFDLGNBQWMsQ0FBQyxRQUFRLENBQUMseUJBQXlCLEVBQUU7Z0JBQ3hGLEVBQUUsRUFBRSxPQUFPLENBQUMsRUFBRTtnQkFDZCxLQUFLLEVBQUUsS0FBSzthQUNiLENBQUMsQ0FBQztZQUVILE1BQU0sWUFBWSxHQUFHLFFBQVEsQ0FBQyx1QkFBdUIsQ0FBQyxRQUFRLEVBQUcsQ0FBQztZQUNsRSxJQUFJLFlBQVksQ0FBQyxLQUFLLEVBQUUsUUFBUSxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUM7Z0JBQzNDLE1BQU0sRUFBRSxTQUFTLEVBQUUsR0FBRyxNQUFNLE1BQU0sQ0FBQyw2QkFBNkIsQ0FBQyxDQUFDO2dCQUNsRSxTQUFTLENBQUMsYUFBYSxDQUFDO29CQUN0QixPQUFPLEVBQUUsZ0JBQWdCO29CQUN6QixPQUFPLEVBQUUsSUFBSSxDQUFBLE1BQU0sWUFBWSxDQUFDLEtBQUssb0JBQW9CO29CQUN6RCxXQUFXLEVBQUU7d0JBQ1g7NEJBQ0UsSUFBSSxFQUFFLGNBQWM7NEJBQ3BCLFFBQVEsRUFBRSxlQUFlOzRCQUN6QixNQUFNLEVBQUUsS0FBSyxFQUFFLFFBQWEsRUFBRSxFQUFFO2dDQUM5QixNQUFNLFFBQVEsQ0FBQyx1QkFBdUIsQ0FBQyxjQUFjLENBQUMsUUFBUSxDQUFDLHlCQUF5QixFQUFFO29DQUN4RixFQUFFLEVBQUUsT0FBTyxDQUFDLEVBQUU7b0NBQ2QsS0FBSyxFQUFFLElBQUk7aUNBQ1osQ0FBQyxDQUFDO2dDQUNILFFBQVEsQ0FBQyxPQUFPLEVBQUUsQ0FBQzs0QkFDckIsQ0FBQzt5QkFDRjt3QkFDRCxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUUsUUFBUSxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLFFBQWEsRUFBRSxFQUFFLENBQUMsUUFBUSxDQUFDLE9BQU8sRUFBRSxFQUFFO3FCQUM5RjtpQkFDRixDQUFDLENBQUM7WUFDTCxDQUFDO1FBQ0gsQ0FBQzs7WUF0V1UsdURBQXFCOzs7OztTQUFyQixxQkFBcUIifQ==
@@ -255,7 +255,7 @@ let OpsViewVpn = (() => {
255
255
  },
256
256
  ];
257
257
  return html `
258
- <ops-sectionheading>VPN</ops-sectionheading>
258
+ <dees-heading level="2">VPN</dees-heading>
259
259
  <div class="vpnContainer">
260
260
 
261
261
  ${this.vpnState.newClientConfig ? html `
@@ -1,2 +1 @@
1
1
  export * from './css.js';
2
- export * from './ops-sectionheading.js';
@@ -1,3 +1,2 @@
1
1
  export * from './css.js';
2
- export * from './ops-sectionheading.js';
3
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi90c193ZWIvZWxlbWVudHMvc2hhcmVkL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLGNBQWMsVUFBVSxDQUFDO0FBQ3pCLGNBQWMseUJBQXlCLENBQUMifQ==
2
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi90c193ZWIvZWxlbWVudHMvc2hhcmVkL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLGNBQWMsVUFBVSxDQUFDIn0=
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@serve.zone/dcrouter",
3
3
  "private": false,
4
- "version": "13.0.4",
4
+ "version": "13.0.6",
5
5
  "description": "A multifaceted routing service handling mail and SMS delivery functions.",
6
6
  "type": "module",
7
7
  "exports": {
@@ -35,14 +35,14 @@
35
35
  "@api.global/typedserver": "^8.4.6",
36
36
  "@api.global/typedsocket": "^4.1.2",
37
37
  "@apiclient.xyz/cloudflare": "^7.1.0",
38
- "@design.estate/dees-catalog": "^3.59.1",
38
+ "@design.estate/dees-catalog": "^3.61.1",
39
39
  "@design.estate/dees-element": "^2.2.4",
40
40
  "@push.rocks/lik": "^6.4.0",
41
41
  "@push.rocks/projectinfo": "^5.1.0",
42
42
  "@push.rocks/qenv": "^6.1.3",
43
- "@push.rocks/smartacme": "^9.4.0",
44
- "@push.rocks/smartdata": "^7.1.5",
45
- "@push.rocks/smartdb": "^2.5.4",
43
+ "@push.rocks/smartacme": "^9.5.0",
44
+ "@push.rocks/smartdata": "^7.1.6",
45
+ "@push.rocks/smartdb": "^2.5.9",
46
46
  "@push.rocks/smartdns": "^7.9.0",
47
47
  "@push.rocks/smartfs": "^1.5.0",
48
48
  "@push.rocks/smartguard": "^3.1.0",
@@ -3,6 +3,6 @@
3
3
  */
4
4
  export const commitinfo = {
5
5
  name: '@serve.zone/dcrouter',
6
- version: '13.0.4',
6
+ version: '13.0.6',
7
7
  description: 'A multifaceted routing service handling mail and SMS delivery functions.'
8
8
  }
@@ -1076,7 +1076,10 @@ export class DcRouter {
1076
1076
  if (!expiryDate) {
1077
1077
  try {
1078
1078
  const cleanDomain = entry.domain.replace(/^\*\.?/, '');
1079
- const certDoc = await AcmeCertDoc.findByDomain(cleanDomain);
1079
+ const domParts = cleanDomain.split('.');
1080
+ const baseDomain = domParts.length > 2 ? domParts.slice(-2).join('.') : cleanDomain;
1081
+ const certDoc = await AcmeCertDoc.findByDomain(baseDomain)
1082
+ || (baseDomain !== cleanDomain ? await AcmeCertDoc.findByDomain(cleanDomain) : null);
1080
1083
  if (certDoc?.validUntil) {
1081
1084
  expiryDate = new Date(certDoc.validUntil).toISOString();
1082
1085
  }
@@ -191,7 +191,11 @@ export class CertificateHandler {
191
191
  // Check persisted cert data from smartdata document classes
192
192
  if (status === 'unknown') {
193
193
  const cleanDomain = domain.replace(/^\*\.?/, '');
194
- const acmeDoc = await AcmeCertDoc.findByDomain(cleanDomain);
194
+ // SmartAcme stores certs under the base domain (e.g. example.com for api.example.com)
195
+ const parts = cleanDomain.split('.');
196
+ const baseDomain = parts.length > 2 ? parts.slice(-2).join('.') : cleanDomain;
197
+ const acmeDoc = await AcmeCertDoc.findByDomain(baseDomain)
198
+ || (baseDomain !== cleanDomain ? await AcmeCertDoc.findByDomain(cleanDomain) : null);
195
199
  const proxyDoc = !acmeDoc ? await ProxyCertDoc.findByDomain(domain) : null;
196
200
 
197
201
  if (acmeDoc?.validUntil) {
@@ -331,31 +335,32 @@ export class CertificateHandler {
331
335
  await dcRouter.certProvisionScheduler.clearBackoff(domain);
332
336
  }
333
337
 
334
- // Clear status map entry so it gets refreshed
335
- dcRouter.certificateStatusMap.delete(domain);
336
-
337
- // Try to provision via SmartAcme directly
338
- if (dcRouter.smartAcme) {
339
- try {
340
- await dcRouter.smartAcme.getCertificateForDomain(domain, { forceRenew: forceRenew ?? false });
341
- return { success: true, message: forceRenew ? `Certificate force-renewed for domain '${domain}'` : `Certificate reprovisioning triggered for domain '${domain}'` };
342
- } catch (err: unknown) {
343
- return { success: false, message: (err as Error).message || `Failed to reprovision certificate for ${domain}` };
344
- }
338
+ // Find routes matching this domain needed to provision through SmartProxy
339
+ const routeNames = dcRouter.findRouteNamesForDomain(domain);
340
+ if (routeNames.length === 0) {
341
+ return { success: false, message: `No routes found for domain '${domain}'` };
345
342
  }
346
343
 
347
- // Fallback: try provisioning via the first matching route
348
- const routeNames = dcRouter.findRouteNamesForDomain(domain);
349
- if (routeNames.length > 0) {
344
+ // If forceRenew, invalidate SmartAcme's cache so the next provision gets a fresh cert
345
+ if (forceRenew && dcRouter.smartAcme) {
350
346
  try {
351
- await smartProxy.provisionCertificate(routeNames[0]);
352
- return { success: true, message: `Certificate reprovisioning triggered for domain '${domain}' via route '${routeNames[0]}'` };
353
- } catch (err: unknown) {
354
- return { success: false, message: (err as Error).message || `Failed to reprovision certificate for ${domain}` };
347
+ await dcRouter.smartAcme.getCertificateForDomain(domain, { forceRenew: true });
348
+ } catch {
349
+ // Cache invalidation failed — proceed with provisioning anyway
355
350
  }
356
351
  }
357
352
 
358
- return { success: false, message: `No routes found for domain '${domain}'` };
353
+ // Clear status map entry so it gets refreshed by the certificate-issued event
354
+ dcRouter.certificateStatusMap.delete(domain);
355
+
356
+ // Provision through SmartProxy — this triggers the full pipeline:
357
+ // certProvisionFunction → bridge.loadCertificate → certificate-issued event → status map updated
358
+ try {
359
+ await smartProxy.provisionCertificate(routeNames[0]);
360
+ return { success: true, message: forceRenew ? `Certificate force-renewed for domain '${domain}'` : `Certificate reprovisioning triggered for domain '${domain}'` };
361
+ } catch (err: unknown) {
362
+ return { success: false, message: (err as Error).message || `Failed to reprovision certificate for ${domain}` };
363
+ }
359
364
  }
360
365
 
361
366
  /**
@@ -364,9 +369,12 @@ export class CertificateHandler {
364
369
  private async deleteCertificate(domain: string): Promise<{ success: boolean; message?: string }> {
365
370
  const dcRouter = this.opsServerRef.dcRouterRef;
366
371
  const cleanDomain = domain.replace(/^\*\.?/, '');
372
+ const parts = cleanDomain.split('.');
373
+ const baseDomain = parts.length > 2 ? parts.slice(-2).join('.') : cleanDomain;
367
374
 
368
- // Delete from smartdata document classes
369
- const acmeDoc = await AcmeCertDoc.findByDomain(cleanDomain);
375
+ // Delete from smartdata document classes (try base domain first, then exact)
376
+ const acmeDoc = await AcmeCertDoc.findByDomain(baseDomain)
377
+ || (baseDomain !== cleanDomain ? await AcmeCertDoc.findByDomain(cleanDomain) : null);
370
378
  if (acmeDoc) {
371
379
  await acmeDoc.delete();
372
380
  }
@@ -3,6 +3,6 @@
3
3
  */
4
4
  export const commitinfo = {
5
5
  name: '@serve.zone/dcrouter',
6
- version: '13.0.4',
6
+ version: '13.0.6',
7
7
  description: 'A multifaceted routing service handling mail and SMS delivery functions.'
8
8
  }
@@ -100,7 +100,7 @@ export class OpsViewApiTokens extends DeesElement {
100
100
  const { apiTokens } = this.routeState;
101
101
 
102
102
  return html`
103
- <ops-sectionheading>API Tokens</ops-sectionheading>
103
+ <dees-heading level="2">API Tokens</dees-heading>
104
104
 
105
105
  <div class="apiTokensContainer">
106
106
  <dees-table
@@ -159,7 +159,7 @@ export class OpsViewCertificates extends DeesElement {
159
159
  const { summary } = this.certState;
160
160
 
161
161
  return html`
162
- <ops-sectionheading>Certificates</ops-sectionheading>
162
+ <dees-heading level="2">Certificates</dees-heading>
163
163
 
164
164
  <div class="certificatesContainer">
165
165
  ${this.renderStatsTiles(summary)}
@@ -57,7 +57,7 @@ export class OpsViewConfig extends DeesElement {
57
57
 
58
58
  public render() {
59
59
  return html`
60
- <ops-sectionheading>Configuration</ops-sectionheading>
60
+ <dees-heading level="2">Configuration</dees-heading>
61
61
 
62
62
  ${this.configState.isLoading
63
63
  ? html`
@@ -60,7 +60,7 @@ export class OpsViewEmails extends DeesElement {
60
60
 
61
61
  public render() {
62
62
  return html`
63
- <ops-sectionheading>Email Operations</ops-sectionheading>
63
+ <dees-heading level="2">Email Operations</dees-heading>
64
64
  <div class="viewContainer">
65
65
  ${this.currentView === 'detail' && this.selectedEmail
66
66
  ? html`
@@ -39,7 +39,7 @@ export class OpsViewLogs extends DeesElement {
39
39
 
40
40
  public render() {
41
41
  return html`
42
- <ops-sectionheading>Logs</ops-sectionheading>
42
+ <dees-heading level="2">Logs</dees-heading>
43
43
 
44
44
  <dees-chart-log
45
45
  .label=${'Application Logs'}
@@ -285,7 +285,7 @@ export class OpsViewNetwork extends DeesElement {
285
285
 
286
286
  public render() {
287
287
  return html`
288
- <ops-sectionheading>Network Activity</ops-sectionheading>
288
+ <dees-heading level="2">Network Activity</dees-heading>
289
289
 
290
290
  <div class="networkContainer">
291
291
  <!-- Stats Grid -->
@@ -64,7 +64,7 @@ export class OpsViewNetworkTargets extends DeesElement {
64
64
  ];
65
65
 
66
66
  return html`
67
- <ops-sectionheading>Network Targets</ops-sectionheading>
67
+ <dees-heading level="2">Network Targets</dees-heading>
68
68
  <div class="targetsContainer">
69
69
  <dees-statsgrid .tiles=${statsTiles}></dees-statsgrid>
70
70
  <dees-table
@@ -94,7 +94,7 @@ export class OpsViewOverview extends DeesElement {
94
94
 
95
95
  public render() {
96
96
  return html`
97
- <ops-sectionheading>Overview</ops-sectionheading>
97
+ <dees-heading level="2">Overview</dees-heading>
98
98
 
99
99
  ${this.statsState.isLoading ? html`
100
100
  <div class="loadingMessage">
@@ -174,7 +174,7 @@ export class OpsViewRemoteIngress extends DeesElement {
174
174
  ];
175
175
 
176
176
  return html`
177
- <ops-sectionheading>Remote Ingress</ops-sectionheading>
177
+ <dees-heading level="2">Remote Ingress</dees-heading>
178
178
 
179
179
  ${this.riState.newEdgeId ? html`
180
180
  <div class="secretDialog">
@@ -200,7 +200,7 @@ export class OpsViewRoutes extends DeesElement {
200
200
  });
201
201
 
202
202
  return html`
203
- <ops-sectionheading>Route Management</ops-sectionheading>
203
+ <dees-heading level="2">Route Management</dees-heading>
204
204
 
205
205
  <div class="routesContainer">
206
206
  <dees-statsgrid