@networkpro/web 1.12.7 → 1.12.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.
Files changed (60) hide show
  1. package/CHANGELOG.md +54 -2
  2. package/README.md +27 -0
  3. package/cspell.json +3 -0
  4. package/package.json +7 -7
  5. package/src/app.html +1 -1
  6. package/src/lib/components/foss/FossItemContent.svelte +2 -2
  7. package/src/lib/data/fossData.js +8 -1
  8. package/src/lib/images.js +15 -8
  9. package/src/lib/img/qr/pgp-contact.webp +0 -0
  10. package/src/lib/img/qr/pgp-github.webp +0 -0
  11. package/src/lib/img/qr/pgp-security.png +0 -0
  12. package/src/lib/img/qr/pgp-security.webp +0 -0
  13. package/src/lib/img/qr/pgp-support.webp +0 -0
  14. package/src/lib/img/qr/vcard.webp +0 -0
  15. package/src/lib/meta.js +5 -0
  16. package/src/lib/pages/AboutContent.svelte +62 -32
  17. package/src/lib/pages/LicenseContent.svelte +13 -19
  18. package/src/lib/pages/PGPContent.svelte +110 -0
  19. package/src/lib/pages/TermsConditionsContent.svelte +1 -1
  20. package/src/lib/styles/css/default.css +18 -0
  21. package/src/lib/styles/css/style.css +13 -4
  22. package/src/lib/styles/global.min.css +1 -1
  23. package/src/routes/pgp/+page.server.js +18 -0
  24. package/src/routes/pgp/+page.svelte +61 -0
  25. package/src/routes/pgp/[key]/+server.js +35 -0
  26. package/src/service-worker.js +16 -5
  27. package/static/{assets → bin}/license/CC-BY-4.0.html +1 -1
  28. package/static/{assets → bin}/license/COPYING.html +1 -1
  29. package/static/pgp/pgp-contact.webp +0 -0
  30. package/static/pgp/pgp-github.webp +0 -0
  31. package/static/pgp/pgp-security.png +0 -0
  32. package/static/pgp/pgp-security.webp +0 -0
  33. package/static/pgp/pgp-support.webp +0 -0
  34. package/static/pgp/security@s.neteng.pro.asc +22 -0
  35. package/static/pgp/vcard.webp +0 -0
  36. package/static/sitemap.xml +13 -13
  37. package/static/assets/bin/contact.vcf +0 -13
  38. package/static/assets/bin/contact@s.neteng.pro.asc +0 -17
  39. package/static/assets/bin/github@sl.neteng.cc.asc +0 -29
  40. package/static/assets/bin/linksheet.json +0 -8
  41. package/static/assets/bin/support@neteng.pro.asc +0 -47
  42. package/static/assets/consulting-terms.pdf +0 -0
  43. /package/{assets → static/bin}/consulting-terms.pdf +0 -0
  44. /package/{assets → static}/bin/contact.vcf +0 -0
  45. /package/static/{assets → bin}/license/CC-BY-4.0-rdfa.xml +0 -0
  46. /package/static/{assets → bin}/license/CC-BY-4.0.md +0 -0
  47. /package/static/{assets → bin}/license/CC-BY-4.0.txt +0 -0
  48. /package/static/{assets → bin}/license/CC-BY-4.0.xml +0 -0
  49. /package/static/{assets → bin}/license/COPYING-rdfa.xml +0 -0
  50. /package/static/{assets → bin}/license/COPYING.md +0 -0
  51. /package/static/{assets → bin}/license/COPYING.odt +0 -0
  52. /package/static/{assets → bin}/license/COPYING.txt +0 -0
  53. /package/{assets → static}/bin/linksheet.json +0 -0
  54. /package/{assets/bin → static/pgp}/contact@s.neteng.pro.asc +0 -0
  55. /package/{assets/bin → static/pgp}/github@sl.neteng.cc.asc +0 -0
  56. /package/static/{img/qr → pgp}/pgp-contact.png +0 -0
  57. /package/static/{img/qr → pgp}/pgp-github.png +0 -0
  58. /package/static/{img/qr → pgp}/pgp-support.png +0 -0
  59. /package/{assets/bin → static/pgp}/support@neteng.pro.asc +0 -0
  60. /package/static/{img/qr → pgp}/vcard.png +0 -0
package/CHANGELOG.md CHANGED
@@ -22,7 +22,58 @@ This project attempts to follow [Keep a Changelog](https://keepachangelog.com/en
22
22
 
23
23
  ---
24
24
 
25
- ## [1.12.7] - 2025-06-10
25
+ ## [1.12.8] - 2025-06-11
26
+
27
+ ### Added
28
+
29
+ - Created `/pgp` route with `+page.svelte`, `+page.server.js`, and supporting structure.
30
+ - Added `src/lib/pages/PGPContent.svelte` for rendering PGP key information.
31
+ - Dynamic routing with `src/routes/pgp/[key]/+server.js` for serving `.asc` files with correct MIME type (`application/pgp-keys`).
32
+ - Support for serving QR code images statically in `/pgp` and dynamically in `/about`.
33
+ - Added WebP versions of QR code images in `static/pgp/` and `src/lib/img/qr/`.
34
+ - Set up dynamic import for QR images in `/about` route via `src/lib/images.js`.
35
+ - Enhanced accessibility styles for focus-visible states on links.
36
+ - Improved copy-to-clipboard buttons for PGP fingerprints.
37
+ - Defined `ContactAssets` typedef and expanded `pgpKeys` data structure for strict typing.
38
+ - README updated with new section: `static/pgp/` Directory Structure.
39
+
40
+ ### Changed
41
+
42
+ - Modified `/about` route to reference `/pgp` and use dynamic WebP images for PGP keys.
43
+ - Adjusted `src/lib/meta.js` to include metadata for the `/pgp` route.
44
+ - Canonical links in `static/bin/CC-BY-4.0.html` and `static/bin/COPYING.html` updated to reflect new paths.
45
+ - Service worker updated to exclude `.asc` files in `/pgp`, while continuing to cache QR image assets.
46
+ - Moved license and binary files from `static/assets` to `static/bin`.
47
+ - File paths updated on the `/license` route to reflect the new `/bin/license` location.
48
+ - Updated sitemap.xml.
49
+ - Updated `.prettierignore` to ignore `static/bin/license`.
50
+ - Updated LinkSheet download in `FossItemContent.svelte` to reference `bin/linksheet.json`.
51
+ - Added dynamic `lsheetDl` constant in `fossData.js`.
52
+ - Updated `TermsConditionsContent.svelte` to point to `bin/consulting-terms.pdf`.
53
+ - Updated `LicenseContent.svelte` to:
54
+ - View HTML license file.
55
+ - Use `download` attribute for all other formats.
56
+ - Updated `generator` meta tag to reflect `SvelteKit 2.21.4`
57
+ - Upgraded dependencies:
58
+ - `@playwright/test` updated from `^1.52.0` → `^1.53.0`
59
+ - `@sveltejs/kit` updated from `2.21.3` → `2.21.4`
60
+ - `eslint-plugin-svelte` updated from `^3.9.1` → `^3.9.2`
61
+ - `playwright` updated from `^1.52.0` → `^1.53.0`
62
+ - `posthog-js` updated from `^1.249.5` → `^1.250.1`
63
+ - `svelte` updated from `5.33.18` → `5.33.19`
64
+
65
+ ### Fixed
66
+
67
+ - Resolved TypeScript and JSDoc typing errors in `AboutContent.svelte` and `PGPContent.svelte`.
68
+ - Verified fallback behavior on `/pgp/[key]` for unknown files:
69
+ - `.asc` files return "File not found".
70
+ - All others fall through to 404.
71
+ - Adjusted `function copy(text)` with explicit JSDoc type for parameter.
72
+ - Removed stale references to deleted assets in service worker config.
73
+
74
+ ---
75
+
76
+ ## [1.12.7] - 2025-06-09
26
77
 
27
78
  ### Changed
28
79
 
@@ -198,7 +249,8 @@ This project attempts to follow [Keep a Changelog](https://keepachangelog.com/en
198
249
 
199
250
  <!-- Link references -->
200
251
 
201
- [Unreleased]: https://github.com/netwk-pro/netwk-pro.github.io/compare/v1.12.7...HEAD
252
+ [Unreleased]: https://github.com/netwk-pro/netwk-pro.github.io/compare/v1.12.8...HEAD
253
+ [1.12.8]: https://github.com/netwk-pro/netwk-pro.github.io/releases/tag/v1.12.8
202
254
  [1.12.7]: https://github.com/netwk-pro/netwk-pro.github.io/releases/tag/v1.12.7
203
255
  [1.12.6]: https://github.com/netwk-pro/netwk-pro.github.io/releases/tag/v1.12.6
204
256
  [1.12.5]: https://github.com/netwk-pro/netwk-pro.github.io/releases/tag/v1.12.5
package/README.md CHANGED
@@ -105,6 +105,33 @@ This project follows the principles of [Keep a Changelog](https://keepachangelog
105
105
 
106
106
  &nbsp;
107
107
 
108
+ ### 🔐 `static/pgp/` Directory Structure
109
+
110
+ This directory contains public PGP key files and their corresponding QR codes.
111
+
112
+ ```bash
113
+ static/
114
+ ├── pgp/
115
+ │ ├── contact@s.neteng.pro.asc # Public key for secure email
116
+ │ ├── pgp-contact.png # QR code (PNG) for secure email key
117
+ │ ├── pgp-contact.webp # Optimized WebP version of the QR code
118
+ │ ├── pgp-security.png # QR code (PNG) for security contact key
119
+ │ ├── pgp-security.webp # WebP version of the security QR code
120
+ │ ├── pgp-support.png # QR code (PNG) for support key
121
+ │ ├── pgp-support.webp # WebP version of the support QR code
122
+ │ ├── security@s.neteng.pro.asc # Public key for security contact
123
+ │ ├── support@neteng.pro.asc # Public key for general support
124
+ └── ...
125
+ ```
126
+
127
+ - `.asc` files are **excluded from service worker precaching** but served directly via the `/pgp/[key]` route.
128
+ - QR code images are **served statically** by the `/pgp` route using `<picture>` elements.
129
+ - **WebP versions** are also used in the `/pgp` route, while the `/about` route imports **dynamic equivalents** from `src/lib/img/qr`.
130
+ - This route does **not use fallback rendering**; only explicitly defined files are available and expected to resolve.
131
+ - A dynamic `[key]/+server.js` handler under `src/routes/pgp/` serves the `.asc` files with appropriate `Content-Type` and download headers.
132
+
133
+ &nbsp;
134
+
108
135
  ### E2E Test Structure
109
136
 
110
137
  End-to-end tests are located in `tests/e2e/` and organized by feature or route:
package/cspell.json CHANGED
@@ -33,6 +33,7 @@
33
33
  "lighthouserc",
34
34
  "lightningcss",
35
35
  "linksheet",
36
+ "lsheet",
36
37
  "Mailvelope",
37
38
  "Maricopa",
38
39
  "mdsvex",
@@ -51,7 +52,9 @@
51
52
  "NWPRO",
52
53
  "obtainium",
53
54
  "openpgp",
55
+ "opgp",
54
56
  "posthog",
57
+ "precaching",
55
58
  "prefs",
56
59
  "publickey",
57
60
  "reconsent",
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@networkpro/web",
3
3
  "private": false,
4
- "version": "1.12.7",
4
+ "version": "1.12.8",
5
5
  "description": "Locking Down Networks, Unlocking Confidence™ | Security, Networking, Privacy — Network Pro Strategies",
6
6
  "keywords": [
7
7
  "advisory",
@@ -80,17 +80,17 @@
80
80
  },
81
81
  "dependencies": {
82
82
  "dompurify": "^3.2.6",
83
- "posthog-js": "^1.249.5",
83
+ "posthog-js": "^1.250.1",
84
84
  "semver": "^7.7.2",
85
- "svelte": "5.33.18"
85
+ "svelte": "5.33.19"
86
86
  },
87
87
  "devDependencies": {
88
88
  "@eslint/compat": "^1.2.9",
89
89
  "@eslint/js": "^9.28.0",
90
90
  "@lhci/cli": "^0.15.0",
91
- "@playwright/test": "^1.52.0",
91
+ "@playwright/test": "^1.53.0",
92
92
  "@sveltejs/adapter-netlify": "^5.0.2",
93
- "@sveltejs/kit": "2.21.3",
93
+ "@sveltejs/kit": "2.21.4",
94
94
  "@sveltejs/vite-plugin-svelte": "5.1.0",
95
95
  "@testing-library/jest-dom": "^6.6.3",
96
96
  "@testing-library/svelte": "^5.2.8",
@@ -100,14 +100,14 @@
100
100
  "eslint": "^9.28.0",
101
101
  "eslint-config-prettier": "^10.1.5",
102
102
  "eslint-plugin-jsdoc": "^50.7.1",
103
- "eslint-plugin-svelte": "^3.9.1",
103
+ "eslint-plugin-svelte": "^3.9.2",
104
104
  "globals": "^16.2.0",
105
105
  "jsdom": "^26.1.0",
106
106
  "lightningcss": "^1.30.1",
107
107
  "markdownlint": "^0.38.0",
108
108
  "markdownlint-cli2": "^0.18.1",
109
109
  "mdsvex": "^0.12.6",
110
- "playwright": "^1.52.0",
110
+ "playwright": "^1.53.0",
111
111
  "postcss": "^8.5.4",
112
112
  "prettier": "^3.5.3",
113
113
  "prettier-plugin-svelte": "^3.4.0",
package/src/app.html CHANGED
@@ -72,7 +72,7 @@
72
72
  content="bx4ham0zkpvzztzu213bhpt76m9siq" />
73
73
  <!-- cspell:enable -->
74
74
 
75
- <meta name="generator" content="SvelteKit 2.21.3" />
75
+ <meta name="generator" content="SvelteKit 2.21.4" />
76
76
 
77
77
  <script src="/disableSw.js"></script>
78
78
 
@@ -126,11 +126,11 @@ This file is part of Network Pro.
126
126
  ><i class="fas fa-file-arrow-down" style="margin-left: 8px;"></i
127
127
  ></span>
128
128
  <a
129
- href="/assets/bin/linksheet.json"
129
+ href="/bin/linksheet.json"
130
130
  type="application/json"
131
131
  download
132
132
  style="margin-left: 8px;"
133
- target="_blank">
133
+ target={PAGE.BLANK}>
134
134
  Obtainium App Config
135
135
  </a>
136
136
  </p>
@@ -7,8 +7,15 @@ This file is part of Network Pro.
7
7
  ========================================================================== */
8
8
 
9
9
  // Import FOSS images
10
+ import { base } from "$app/paths";
10
11
  import { acodePng, acodeWbp, eauthPng, eauthWbp, hboardPng, hboardWbp, lsheetPng, lsheetWbp, pmxPng, pmxWbp, squirclePng, squircleWbp, tosPng, tosWbp, urlPng, urlWbp } from "$lib";
11
12
 
13
+ /**
14
+ * URL to the LinkSheet config file, using the base path
15
+ * @type {string}
16
+ */
17
+ const lsheetDl = `${base}/bin/linksheet.json`;
18
+
12
19
  export const fossData = [
13
20
  {
14
21
  id: "squircle",
@@ -510,7 +517,7 @@ export const fossData = [
510
517
  hideLabels: true, // Special flag to control rendering
511
518
  downloadText: "Obtainium App Config",
512
519
  downloadHref:
513
- "https://raw.githubusercontent.com/netwk-pro/dev-sveltekit/refs/heads/master/assets/bin/linksheet.json",
520
+ {lsheetDl},
514
521
  },
515
522
  {
516
523
  label: "GitHub",
package/src/lib/images.js CHANGED
@@ -15,7 +15,7 @@ This file is part of Network Pro.
15
15
  * @description Provides convenient access to images in the src/lib/img directory
16
16
  * @module src/lib
17
17
  * @author SunDevil311
18
- * @updated 2025-05-30
18
+ * @updated 2025-06-09
19
19
  */
20
20
 
21
21
  // Import favicon images
@@ -55,9 +55,14 @@ import urlPng from "$lib/img/posts/urlcheck.png";
55
55
  import urlWbp from "$lib/img/posts/urlcheck.webp";
56
56
 
57
57
  // Import QR code images
58
- import pgpContact from "$lib/img/qr/pgp-contact.png";
59
- import pgpSupport from "$lib/img/qr/pgp-support.png";
60
- import vcfSrc from "$lib/img/qr/vcard.png";
58
+ import pgpContactPng from "$lib/img/qr/pgp-contact.png";
59
+ import pgpContactWbp from "$lib/img/qr/pgp-contact.webp";
60
+ import pgpSecurityPng from "$lib/img/qr/pgp-security.png";
61
+ import pgpSecurityWbp from "$lib/img/qr/pgp-security.webp";
62
+ import pgpSupportPng from "$lib/img/qr/pgp-support.png";
63
+ import pgpSupportWbp from "$lib/img/qr/pgp-support.webp";
64
+ import vcfPng from "$lib/img/qr/vcard.png";
65
+ import vcfWbp from "$lib/img/qr/vcard.webp";
61
66
 
62
67
  // Re-export all imports
63
68
  export {
@@ -79,9 +84,10 @@ export {
79
84
  lsheetWbp,
80
85
  obtainiumPng,
81
86
  obtainiumWbp,
82
- pgpContact,
83
- pgpSupport,
84
- pmxPng,
87
+ pgpContactPng,
88
+ pgpContactWbp, pgpSecurityPng,
89
+ pgpSecurityWbp, pgpSupportPng,
90
+ pgpSupportWbp, pmxPng,
85
91
  pmxWbp,
86
92
  squirclePng,
87
93
  squircleWbp,
@@ -89,7 +95,8 @@ export {
89
95
  tosWbp,
90
96
  urlPng,
91
97
  urlWbp,
92
- vcfSrc
98
+ vcfPng,
99
+ vcfWbp
93
100
  };
94
101
 
95
102
  // cspell:ignore eauth hboard
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
package/src/lib/meta.js CHANGED
@@ -56,6 +56,11 @@ const meta = {
56
56
  description:
57
57
  "Privacy Dashboard | Security, Networking, Privacy — Network Pro™",
58
58
  },
59
+ "/pgp": {
60
+ title: "Public PGP Keys — Network Pro™",
61
+ description:
62
+ "Public encryption keys for secure communication | Security, Networking, Privacy — Network Pro™",
63
+ },
59
64
  // Excludes redirect-only routes like /contact, /consultation, /privacy-rights
60
65
  };
61
66
 
@@ -7,14 +7,21 @@ This file is part of Network Pro.
7
7
  ========================================================================== -->
8
8
 
9
9
  <script>
10
- import { pgpContact, pgpSupport, vcfSrc } from "$lib";
10
+ import {
11
+ pgpContactPng,
12
+ pgpContactWbp,
13
+ pgpSupportPng,
14
+ pgpSupportWbp,
15
+ vcfPng,
16
+ vcfWbp,
17
+ } from "$lib";
11
18
  import { base } from "$app/paths";
12
19
  import { CONSTANTS } from "$lib";
13
20
 
14
21
  // Log the base path to verify its value
15
22
  //console.log("Base path:", base);
16
23
 
17
- console.log(CONSTANTS.COMPANY_INFO.APP_NAME);
24
+ //console.log(CONSTANTS.COMPANY_INFO.APP_NAME);
18
25
 
19
26
  const { COMPANY_INFO, PAGE } = CONSTANTS;
20
27
 
@@ -24,6 +31,12 @@ This file is part of Network Pro.
24
31
  */
25
32
  const contactLink = `${base}/contact`;
26
33
 
34
+ /**
35
+ * URL to the PGP route, using the base path
36
+ * @type {string}
37
+ */
38
+ const pgpLink = `${base}/pgp`;
39
+
27
40
  /**
28
41
  * HTML attribute for async image decoding
29
42
  * @type {"async" | "sync" | "auto"}
@@ -70,6 +83,7 @@ This file is part of Network Pro.
70
83
  * @type {Array<{
71
84
  * label: string,
72
85
  * qrSrc: string,
86
+ * qrWbp: string,
73
87
  * keySearch: string,
74
88
  * fingerprint: string[]
75
89
  * }>}
@@ -77,13 +91,15 @@ This file is part of Network Pro.
77
91
  const pgpKeys = [
78
92
  {
79
93
  label: "support@neteng.pro",
80
- qrSrc: pgpSupport,
94
+ qrSrc: pgpSupportPng,
95
+ qrWbp: pgpSupportWbp,
81
96
  keySearch: "https://keys.openpgp.org/search?q=support%40neteng.pro",
82
97
  fingerprint: ["6590B992E2E3EFF12738", "7BCE2AF093E9DEC61BA0"],
83
98
  },
84
99
  {
85
100
  label: "contact@s.neteng.pro",
86
- qrSrc: pgpContact,
101
+ qrSrc: pgpContactPng,
102
+ qrWbp: pgpContactWbp,
87
103
  keySearch: "https://keys.openpgp.org/search?q=contact%40s.neteng.pro",
88
104
  fingerprint: ["DF118BAA6C2D9DCDEBDC", "2DDCF99373499495F957"],
89
105
  },
@@ -91,18 +107,20 @@ This file is part of Network Pro.
91
107
 
92
108
  /**
93
109
  * @typedef {Object} ContactAssets
94
- * @property {string} vcf - Path to the contact vCard (.vcf file)
95
- * @property {string} qrSrc - Path to QR image for contact info
96
- * @property {string} supportAsc - Support PGP public key file (.asc)
97
- * @property {string} contactAsc - Contact PGP public key file (.asc)
110
+ * @property {string} vcf
111
+ * @property {string} qrSrc
112
+ * @property {string} qrWbp
113
+ * @property {string} supportAsc
114
+ * @property {string} contactAsc
98
115
  */
99
116
 
100
117
  /** @type {ContactAssets} */
101
118
  const contactAssets = {
102
- vcf: "/assets/bin/contact.vcf",
103
- qrSrc: vcfSrc,
104
- supportAsc: "/assets/bin/support@neteng.pro.asc",
105
- contactAsc: "/assets/bin/contact@s.neteng.pro.asc",
119
+ vcf: "/bin/contact.vcf",
120
+ qrSrc: vcfPng,
121
+ qrWbp: vcfWbp,
122
+ supportAsc: "/pgp/support@neteng.pro.asc",
123
+ contactAsc: "/pgp/contact@s.neteng.pro.asc",
106
124
  };
107
125
  </script>
108
126
 
@@ -210,8 +228,11 @@ This file is part of Network Pro.
210
228
  <div class="spacer"></div>
211
229
 
212
230
  <p>
213
- You can find our PGP keys and a vCard containing our contact information
214
- below.
231
+ You can find our PGP keys and a downloadable vCard with contact information
232
+ below. For a complete list of public keys, visit the <a
233
+ href={pgpLink}
234
+ target={PAGE.SELF}>dedicated PGP page</a
235
+ >.
215
236
  </p>
216
237
 
217
238
  <!-- BEGIN PGP KEYS -->
@@ -221,12 +242,15 @@ This file is part of Network Pro.
221
242
  <!-- Row 0 (First row) remains unchanged -->
222
243
  <tr>
223
244
  <td class="pgp-col1">
224
- <img
225
- {decoding}
226
- {loading}
227
- src={pgpKeys[0].qrSrc}
228
- class="pgp-image"
229
- alt={`PGP Key - ${pgpKeys[0].label}`} />
245
+ <picture>
246
+ <source srcset={pgpKeys[0].qrWbp} type="image/webp" />
247
+ <img
248
+ {decoding}
249
+ {loading}
250
+ src={pgpKeys[0].qrSrc}
251
+ class="pgp-image"
252
+ alt={`PGP Key - ${pgpKeys[0].label}`} />
253
+ </picture>
230
254
  </td>
231
255
  <td class="pgp-col2">
232
256
  <a rel={PAGE.REL} href={pgpKeys[0].keySearch} target={PAGE.BLANK}>
@@ -275,24 +299,30 @@ This file is part of Network Pro.
275
299
  </p>
276
300
  </td>
277
301
  <td class="pgp-col2">
278
- <img
279
- {decoding}
280
- {loading}
281
- src={pgpKeys[1].qrSrc}
282
- class="pgp-image"
283
- alt={`PGP Key - ${pgpKeys[1].label}`} />
302
+ <picture>
303
+ <source srcset={pgpKeys[1].qrWbp} type="image/webp" />
304
+ <img
305
+ {decoding}
306
+ {loading}
307
+ src={pgpKeys[1].qrSrc}
308
+ class="pgp-image"
309
+ alt={`PGP Key - ${pgpKeys[1].label}`} />
310
+ </picture>
284
311
  </td>
285
312
  </tr>
286
313
 
287
314
  <!-- Row 2 (Third row) remains unchanged -->
288
315
  <tr>
289
316
  <td class="pgp-col1">
290
- <img
291
- {decoding}
292
- {loading}
293
- src={contactAssets.qrSrc}
294
- class="pgp-image"
295
- alt="vCard" />
317
+ <picture>
318
+ <source srcset={contactAssets.qrWbp} type="image/webp" />
319
+ <img
320
+ {decoding}
321
+ {loading}
322
+ src={contactAssets.qrSrc}
323
+ class="pgp-image"
324
+ alt="vCard" />
325
+ </picture>
296
326
  </td>
297
327
  <td class="pgp-col2">
298
328
  <strong>vCard</strong>
@@ -218,22 +218,19 @@ This file is part of Network Pro.
218
218
  </ul>
219
219
  {:else if link.id === "cc-by"}
220
220
  <p class={constants.classSmall}>
221
- Download:
222
- <a href="/assets/license/CC-BY-4.0.html" download target={PAGE.BLANK}
223
- >HTML</a>
221
+ View / Download:
222
+ <a href="/bin/license/CC-BY-4.0.html" target={PAGE.BLANK}>HTML</a>
224
223
  |
225
- <a href="/assets/license/CC-BY-4.0.md" download target={PAGE.BLANK}
224
+ <a href="/bin/license/CC-BY-4.0.md" download target={PAGE.BLANK}
226
225
  >Markdown</a>
227
226
  |
228
- <a href="/assets/license/CC-BY-4.0.txt" download target={PAGE.BLANK}
227
+ <a href="/bin/license/CC-BY-4.0.txt" download target={PAGE.BLANK}
229
228
  >Text</a>
230
229
  |
231
- <a
232
- href="/assets/license/CC-BY-4.0-rdfa.xml"
233
- download
234
- target={PAGE.BLANK}>RDFa</a>
230
+ <a href="/bin/license/CC-BY-4.0-rdfa.xml" download target={PAGE.BLANK}
231
+ >RDFa</a>
235
232
  |
236
- <a href="/assets/license/CC-BY-4.0.xml" download target={PAGE.BLANK}
233
+ <a href="/bin/license/CC-BY-4.0.xml" download target={PAGE.BLANK}
237
234
  >XMP</a>
238
235
  </p>
239
236
 
@@ -314,21 +311,18 @@ This file is part of Network Pro.
314
311
  </code>
315
312
  {:else if link.id === "gnu-gpl"}
316
313
  <p class={constants.classSmall}>
317
- Download:
318
- <a href="/assets/license/COPYING.html" download target={PAGE.BLANK}
319
- >HTML</a>
314
+ View / Download:
315
+ <a href="/bin/license/COPYING.html" target={PAGE.BLANK}>HTML</a>
320
316
  |
321
- <a href="/assets/license/COPYING.md" download target={PAGE.BLANK}
317
+ <a href="/bin/license/COPYING.md" download target={PAGE.BLANK}
322
318
  >Markdown</a>
323
319
  |
324
- <a href="/assets/license/COPYING.txt" download target={PAGE.BLANK}
325
- >Text</a>
320
+ <a href="/bin/license/COPYING.txt" download target={PAGE.BLANK}>Text</a>
326
321
  |
327
- <a href="/assets/license/COPYING-rdfa.xml" download target={PAGE.BLANK}
322
+ <a href="/bin/license/COPYING-rdfa.xml" download target={PAGE.BLANK}
328
323
  >RDFa</a>
329
324
  |
330
- <a href="/assets/license/COPYING.odt" download target={PAGE.BLANK}
331
- >ODT</a>
325
+ <a href="/bin/license/COPYING.odt" download target={PAGE.BLANK}>ODT</a>
332
326
  </p>
333
327
 
334
328
  <p>
@@ -0,0 +1,110 @@
1
+ <!-- ==========================================================================
2
+ src/lib/pages/PGPContent.svelte
3
+
4
+ Copyright © 2025 Network Pro Strategies (Network Pro™)
5
+ SPDX-License-Identifier: CC-BY-4.0 OR GPL-3.0-or-later
6
+ This file is part of Network Pro.
7
+ ========================================================================== -->
8
+
9
+ <script>
10
+ import { base } from "$app/paths";
11
+ import { CONSTANTS } from "$lib";
12
+
13
+ // Log the base path to verify its value
14
+ //console.log("Base path:", base);
15
+
16
+ //console.log(CONSTANTS.COMPANY_INFO.APP_NAME);
17
+
18
+ const { COMPANY_INFO, PAGE } = CONSTANTS;
19
+
20
+ const keys = [
21
+ {
22
+ name: "General Contact & Support",
23
+ email: "support (at) neteng.pro",
24
+ fingerprint: "6590 B992 E2E3 EFF1 2738 7BCE 2AF0 93E9 DEC6 1BA0",
25
+ opgp: "https://keys.openpgp.org/search?q=support%40neteng.pro",
26
+ file: "/pgp/support@neteng.pro.asc",
27
+ img: "pgp-support",
28
+ },
29
+ {
30
+ name: "Secure Email",
31
+ email: "contact (at) s.neteng.pro",
32
+ fingerprint: "DF11 8BAA 6C2D 9DCD EBDC 2DDC F993 7349 9495 F957",
33
+ opgp: "https://keys.openpgp.org/search?q=contact%40s.neteng.pro",
34
+ file: "/pgp/contact@s.neteng.pro.asc",
35
+ img: "pgp-contact",
36
+ },
37
+ {
38
+ name: "Security Contact",
39
+ email: "security (at) s.neteng.pro",
40
+ fingerprint: "B7FE 1D4E 6CAB 3E71 4A9F DF6E 48CB 7290 C00D 0DA5",
41
+ opgp: null,
42
+ file: "/pgp/security@s.neteng.pro.asc",
43
+ img: "pgp-security",
44
+ },
45
+ ];
46
+
47
+ /**
48
+ * Copy a string to the clipboard
49
+ * @param {string} text
50
+ */
51
+ function copy(text) {
52
+ navigator.clipboard.writeText(text);
53
+ }
54
+ </script>
55
+
56
+ <h1>🔐 Public PGP Keys</h1>
57
+ <p
58
+ >Below are our public encryption keys. Use them to securely send email or
59
+ verify signed messages.</p>
60
+
61
+ {#each keys as key}
62
+ <section class="pgp-entry" aria-labelledby={`pgp-${key.img}`}>
63
+ <div class="pgp-text">
64
+ <h2 id={`pgp-${key.img}`}>{key.name}</h2>
65
+ <h3>
66
+ &lt;
67
+ {#if key.opgp}
68
+ <a rel={PAGE.REL} href={key.opgp} target={PAGE.BLANK}>
69
+ {key.email}
70
+ </a>
71
+ {:else}
72
+ {key.email}
73
+ {/if}
74
+ &gt;
75
+ </h3>
76
+ <pre><code>{key.fingerprint}</code></pre>
77
+ <p>
78
+ <button
79
+ type="button"
80
+ on:click={() => copy(key.fingerprint)}
81
+ aria-label={`Copy PGP fingerprint for ${key.name}`}
82
+ title="Copy fingerprint to clipboard">
83
+ Copy fingerprint
84
+ </button>
85
+ </p>
86
+ <p>
87
+ <a
88
+ href={key.file}
89
+ download
90
+ aria-label={`Download PGP key for ${key.name}`}
91
+ title="Download PGP key">
92
+ Download Key
93
+ </a>
94
+ </p>
95
+ </div>
96
+ <div class="pgp-qr">
97
+ <picture>
98
+ <source srcset={`/pgp/${key.img}.webp`} type="image/webp" />
99
+ <img
100
+ src={`/pgp/${key.img}.png`}
101
+ alt={`QR code for ${key.email}`}
102
+ loading="lazy"
103
+ decoding="async"
104
+ style="width: 150px; height: 150px;" />
105
+ </picture>
106
+ </div>
107
+ </section>
108
+ {/each}
109
+
110
+ <!-- cspell:ignore ebdc -->
@@ -112,7 +112,7 @@ This file is part of Network Pro.
112
112
  |
113
113
  <a href={tandcLink} target={PAGE.SELF}>Docs</a>
114
114
  |
115
- <a href="/assets/consulting-terms.pdf" target={PAGE.BLANK}>
115
+ <a href="/bin/consulting-terms.pdf" download target={PAGE.BLANK}>
116
116
  PDF <span class="fas fa-file-arrow-down"></span>
117
117
  </a>
118
118
  </sup>
@@ -518,3 +518,21 @@ footer .container {
518
518
  overflow: hidden;
519
519
  white-space: nowrap;
520
520
  }
521
+
522
+ .pgp-entry {
523
+ display: flex;
524
+ align-items: center;
525
+ flex-wrap: wrap;
526
+ gap: 2rem;
527
+ margin-bottom: 2rem;
528
+ }
529
+
530
+ .pgp-text {
531
+ flex: 2;
532
+ min-width: 250px;
533
+ }
534
+
535
+ .pgp-qr {
536
+ flex: 1;
537
+ min-width: 150px;
538
+ }
@@ -129,15 +129,24 @@ a:active {
129
129
  text-decoration: underline;
130
130
  }
131
131
 
132
+ /* visited link */
133
+ a:visited {
134
+ color: #7f6227;
135
+ }
136
+
132
137
  /* focused link */
133
- a:focus {
138
+ a:focus-visible {
134
139
  color: #191919; /* Black text when focused */
135
140
  background-color: #ffc627; /* Gold background when focused */
141
+ outline: 2px solid #ffc627;
142
+ outline-offset: 4px;
136
143
  }
137
144
 
138
- /* visited link */
139
- a:visited {
140
- color: #7f6227;
145
+ /* Reset focus style to avoid duplication */
146
+ a:focus:not(:focus-visible) {
147
+ color: inherit;
148
+ background-color: transparent;
149
+ outline: none;
141
150
  }
142
151
 
143
152
  /* visited and mouse over */
@@ -3,4 +3,4 @@ Copyright © 2025 Network Pro Strategies (Network Pro™)
3
3
  SPDX-License-Identifier: CC-BY-4.0 OR GPL-3.0-or-later
4
4
  This file is part of Network Pro.
5
5
  ========================================================================== */
6
- html{-webkit-text-size-adjust:100%}body{margin:0}main{display:block}h1{margin:.67em 0;font-size:2em}hr{box-sizing:content-box}pre{font-family:monospace;font-size:1em}a{background-color:#0000}abbr[title]{border-bottom:none;text-decoration:underline dotted}b,strong{font-weight:bolder}code,kbd,samp{font-family:monospace;font-size:1em}small{font-size:80%}sub,sup{vertical-align:baseline;font-size:75%;line-height:0;position:relative}sub{bottom:-.25em}sup{top:-.5em}img{border-style:none}button,input,optgroup,select,textarea{margin:0;font-family:inherit;font-size:100%;line-height:1.15}button,input{overflow:visible}button,select{text-transform:none}button,[type=button],[type=reset],[type=submit]{-webkit-appearance:button;appearance:button}button::-moz-focus-inner,[type=button]::-moz-focus-inner,[type=reset]::-moz-focus-inner,[type=submit]::-moz-focus-inner{border-style:none;padding:0}button:-moz-focusring,[type=button]:-moz-focusring,[type=reset]:-moz-focusring,[type=submit]:-moz-focusring{outline:1px dotted buttontext}fieldset{padding:.35em .75em .625em}legend{color:inherit;box-sizing:border-box;white-space:normal;max-width:100%;padding:0;display:table}progress{vertical-align:baseline}textarea{overflow:auto}[type=checkbox],[type=radio]{box-sizing:border-box;padding:0}[type=number]::-webkit-inner-spin-button,[type=number]::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;appearance:textfield;outline-offset:-2px}[type=search]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{font:inherit;-webkit-appearance:button}details{display:block}summary{display:list-item}template{display:none}html{color:#222;scroll-behavior:smooth;font-size:1em;line-height:1.4}::-moz-selection{text-shadow:none;background:#191919}::selection{text-shadow:none;background:#191919}hr{border:0;border-top:1px solid #ccc;height:1px;margin:1em 0;padding:0;display:block;overflow:visible}audio,canvas,iframe,img,svg,video{vertical-align:middle}fieldset{border:0;margin:0;padding:0}textarea{resize:vertical}body{color:#fafafa;background-color:#191919;margin:10px;font-family:Arial,Helvetica,sans-serif}a{text-decoration:none}a:link{color:#ffc627}a:hover,a:active{color:#ffc627;text-decoration:underline}a:focus{color:#191919;background-color:#ffc627}a:visited,a:visited:hover{color:#7f6227}.hidden,[hidden]{display:none!important}.visually-hidden{clip:rect(0,0,0,0);white-space:nowrap;border:0;width:1px;height:1px;margin:-1px;padding:0;position:absolute;overflow:hidden}.visually-hidden.focusable:active,.visually-hidden.focusable:focus{clip:auto;width:auto;height:auto;white-space:inherit;margin:0;position:static;overflow:visible}.invisible{visibility:hidden}.clearfix:before,.clearfix:after{content:"";display:table}.clearfix:after{clear:both}@media print{*,:before,:after{color:#000!important;box-shadow:none!important;text-shadow:none!important;background:#fff!important}a,a:visited{text-decoration:underline}a[href]:after{content:" (" attr(href)")"}abbr[title]:after{content:" (" attr(title)")"}a[href^=\#]:after,a[href^=javascript\:]:after{content:""}pre{white-space:pre-wrap!important}pre,blockquote{page-break-inside:avoid;border:1px solid #999}tr,img{page-break-inside:avoid}p,h2,h3{orphans:3;widows:3}h2,h3{page-break-after:avoid}}.full-width-section{background-position:50%;background-size:cover;width:100%;max-width:1920px;margin:0 auto}.container{max-width:1200px;margin:0 auto;padding:0 12px}.readable{max-width:900px;margin:0 auto}header,footer{width:100%}header .container,footer .container{max-width:1200px;margin:0 auto;padding:20px 12px}.gh{border-collapse:collapse;border-spacing:0;margin:0 auto}.gh td,.gh th{border-collapse:collapse;word-break:normal;padding:10px 5px;overflow:hidden}.gh .gh-tcell{text-align:center;vertical-align:middle}@media screen and (width<=767px){.gh,.gh col{width:auto!important}.gh-wrap{-webkit-overflow-scrolling:touch;margin:auto 0;overflow-x:auto}}.soc{border-collapse:collapse;border-spacing:0;margin:0 auto}.soc td,.soc th{border-collapse:collapse;word-break:normal;padding:8px;overflow:hidden}.soc .soc-fa{text-align:center;vertical-align:middle}@media screen and (width<=767px){.soc,.soc col{width:auto!important}.soc-wrap{-webkit-overflow-scrolling:touch;margin:auto 0;overflow-x:auto}}.foss{border-collapse:collapse;border-spacing:0}.foss td,.foss th{border-collapse:collapse;word-break:normal;padding:10px 5px;overflow:hidden}.foss .foss-cell{text-align:center;vertical-align:middle}@media screen and (width<=767px){.foss,.foss col{width:auto!important}.foss-wrap{-webkit-overflow-scrolling:touch;overflow-x:auto}}.bnav{text-align:center;border-collapse:collapse;border-spacing:0;margin:0 auto}.bnav td,.bnav th{text-align:center;vertical-align:middle;word-break:normal;border-style:none;padding:10px;font-size:.875rem;font-weight:700;line-height:1.125rem;overflow:hidden}.bnav .bnav-cell{text-align:center;vertical-align:middle;align-content:center}@media screen and (width<=767px){.bnav,.bnav col{width:auto!important}.bnav-wrap{-webkit-overflow-scrolling:touch;margin:auto 0;overflow-x:auto}}.bnav2{border-collapse:collapse;border-spacing:0;margin:0 auto}.bnav2 td{word-break:normal;border-style:none;padding:10px;font-size:.875rem;font-weight:700;line-height:1.125rem;overflow:hidden}.bnav2 th{word-break:normal;border-style:none;padding:12px;font-size:.875rem;line-height:1.125rem;overflow:hidden}.bnav2 .bnav2-cell{text-align:center;vertical-align:middle;align-content:center}@media screen and (width<=767px){.bnav2,.bnav2 col{width:auto!important}.bnav2-wrap{-webkit-overflow-scrolling:touch;margin:auto 0;overflow-x:auto}}.pgp{border-collapse:collapse;border-spacing:0;margin:0 auto}.pgp td{word-break:normal;border-style:none;padding:10px;font-size:.875rem;line-height:1.125rem;overflow:hidden}.pgp th{word-break:normal;border:1px solid #000;padding:10px;font-size:.875rem;line-height:1.125rem;overflow:hidden}.pgp .pgp-col1{text-align:right;vertical-align:middle;padding-right:1rem}.pgp .pgp-col2{text-align:left;vertical-align:middle;padding-left:1rem}@media screen and (width<=767px){.pgp,.pgp col{width:auto!important}.pgp-wrap{-webkit-overflow-scrolling:touch;margin:2rem 0 auto;overflow-x:auto}}.logo{margin-left:auto;margin-right:auto;display:block}.index-title1{text-align:center;font-style:italic;font-weight:700}.index-title2{letter-spacing:-.015em;text-align:center;font-variant:small-caps;font-size:1.25rem;line-height:1.625rem}.index1{letter-spacing:-.035em;text-align:center;font-style:italic;font-weight:700;line-height:2.125rem}.index2{letter-spacing:-.035em;text-align:center;font-variant:small-caps;font-size:1.5rem;line-height:1.75rem}.index3{letter-spacing:-.035em;text-align:center;font-size:1.5rem;line-height:1.75rem}.index4{letter-spacing:-.035em;text-align:center;font-size:1.5rem;line-height:1.75rem;text-decoration:underline}.subhead{letter-spacing:-.035em;font-variant:small-caps;font-size:1.5rem;line-height:1.75rem}.bold{font-weight:700}.emphasis{font-style:italic}.uline{text-decoration:underline}.bolditalic{font-style:italic;font-weight:700}.bquote{border-left:3px solid #9e9e9e;margin-left:30px;padding-left:10px;font-style:italic}.small-text{font-size:.75rem;line-height:1.125rem}.large-text-center{text-align:center;font-size:1.25rem;line-height:1.75rem}.prewrap{white-space:pre-wrap;display:block}.hr-styled{width:75%;margin:auto}.center-text{text-align:center}.copyright{text-align:center;font-size:.75rem;line-height:1.125rem}.gold{color:#ffc627}.visited{color:#7f6227}.goldseparator{color:#ffc627;margin:0 .5rem}.center-nav{text-align:center;padding:5px;font-size:1rem;line-height:1.5rem}.block{resize:none;background:0 0;border:none;border-radius:0;outline:none;width:100%;font-size:.75rem;line-height:1.125rem}.fingerprint{white-space:pre-line;font-weight:700;display:block}.pgp-image{width:150px;height:150px}.spacer{margin:2rem 0}.separator{margin:0 .5rem}.emoji{margin-right:8px}.headline{margin-bottom:4px;font-style:italic;font-weight:700;display:block}.label{font-family:inherit;font-weight:700}.description{font-family:inherit;font-style:normal;font-weight:400;display:inline}.sr-only{clip:rect(0,0,0,0);white-space:nowrap;border:0;width:1px;height:1px;margin:-1px;padding:0;position:absolute;overflow:hidden}
6
+ html{-webkit-text-size-adjust:100%}body{margin:0}main{display:block}h1{margin:.67em 0;font-size:2em}hr{box-sizing:content-box}pre{font-family:monospace;font-size:1em}a{background-color:#0000}abbr[title]{border-bottom:none;text-decoration:underline dotted}b,strong{font-weight:bolder}code,kbd,samp{font-family:monospace;font-size:1em}small{font-size:80%}sub,sup{vertical-align:baseline;font-size:75%;line-height:0;position:relative}sub{bottom:-.25em}sup{top:-.5em}img{border-style:none}button,input,optgroup,select,textarea{margin:0;font-family:inherit;font-size:100%;line-height:1.15}button,input{overflow:visible}button,select{text-transform:none}button,[type=button],[type=reset],[type=submit]{-webkit-appearance:button;appearance:button}button::-moz-focus-inner,[type=button]::-moz-focus-inner,[type=reset]::-moz-focus-inner,[type=submit]::-moz-focus-inner{border-style:none;padding:0}button:-moz-focusring,[type=button]:-moz-focusring,[type=reset]:-moz-focusring,[type=submit]:-moz-focusring{outline:1px dotted buttontext}fieldset{padding:.35em .75em .625em}legend{color:inherit;box-sizing:border-box;white-space:normal;max-width:100%;padding:0;display:table}progress{vertical-align:baseline}textarea{overflow:auto}[type=checkbox],[type=radio]{box-sizing:border-box;padding:0}[type=number]::-webkit-inner-spin-button,[type=number]::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;appearance:textfield;outline-offset:-2px}[type=search]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{font:inherit;-webkit-appearance:button}details{display:block}summary{display:list-item}template{display:none}html{color:#222;scroll-behavior:smooth;font-size:1em;line-height:1.4}::-moz-selection{text-shadow:none;background:#191919}::selection{text-shadow:none;background:#191919}hr{border:0;border-top:1px solid #ccc;height:1px;margin:1em 0;padding:0;display:block;overflow:visible}audio,canvas,iframe,img,svg,video{vertical-align:middle}fieldset{border:0;margin:0;padding:0}textarea{resize:vertical}body{color:#fafafa;background-color:#191919;margin:10px;font-family:Arial,Helvetica,sans-serif}a{text-decoration:none}a:link{color:#ffc627}a:hover,a:active{color:#ffc627;text-decoration:underline}a:visited{color:#7f6227}a:focus-visible{color:#191919;outline-offset:4px;background-color:#ffc627;outline:2px solid #ffc627}a:focus:not(:focus-visible){color:inherit;background-color:#0000;outline:none}a:visited:hover{color:#7f6227}.hidden,[hidden]{display:none!important}.visually-hidden{clip:rect(0,0,0,0);white-space:nowrap;border:0;width:1px;height:1px;margin:-1px;padding:0;position:absolute;overflow:hidden}.visually-hidden.focusable:active,.visually-hidden.focusable:focus{clip:auto;width:auto;height:auto;white-space:inherit;margin:0;position:static;overflow:visible}.invisible{visibility:hidden}.clearfix:before,.clearfix:after{content:"";display:table}.clearfix:after{clear:both}@media print{*,:before,:after{color:#000!important;box-shadow:none!important;text-shadow:none!important;background:#fff!important}a,a:visited{text-decoration:underline}a[href]:after{content:" (" attr(href)")"}abbr[title]:after{content:" (" attr(title)")"}a[href^=\#]:after,a[href^=javascript\:]:after{content:""}pre{white-space:pre-wrap!important}pre,blockquote{page-break-inside:avoid;border:1px solid #999}tr,img{page-break-inside:avoid}p,h2,h3{orphans:3;widows:3}h2,h3{page-break-after:avoid}}.full-width-section{background-position:50%;background-size:cover;width:100%;max-width:1920px;margin:0 auto}.container{max-width:1200px;margin:0 auto;padding:0 12px}.readable{max-width:900px;margin:0 auto}header,footer{width:100%}header .container,footer .container{max-width:1200px;margin:0 auto;padding:20px 12px}.gh{border-collapse:collapse;border-spacing:0;margin:0 auto}.gh td,.gh th{border-collapse:collapse;word-break:normal;padding:10px 5px;overflow:hidden}.gh .gh-tcell{text-align:center;vertical-align:middle}@media screen and (width<=767px){.gh,.gh col{width:auto!important}.gh-wrap{-webkit-overflow-scrolling:touch;margin:auto 0;overflow-x:auto}}.soc{border-collapse:collapse;border-spacing:0;margin:0 auto}.soc td,.soc th{border-collapse:collapse;word-break:normal;padding:8px;overflow:hidden}.soc .soc-fa{text-align:center;vertical-align:middle}@media screen and (width<=767px){.soc,.soc col{width:auto!important}.soc-wrap{-webkit-overflow-scrolling:touch;margin:auto 0;overflow-x:auto}}.foss{border-collapse:collapse;border-spacing:0}.foss td,.foss th{border-collapse:collapse;word-break:normal;padding:10px 5px;overflow:hidden}.foss .foss-cell{text-align:center;vertical-align:middle}@media screen and (width<=767px){.foss,.foss col{width:auto!important}.foss-wrap{-webkit-overflow-scrolling:touch;overflow-x:auto}}.bnav{text-align:center;border-collapse:collapse;border-spacing:0;margin:0 auto}.bnav td,.bnav th{text-align:center;vertical-align:middle;word-break:normal;border-style:none;padding:10px;font-size:.875rem;font-weight:700;line-height:1.125rem;overflow:hidden}.bnav .bnav-cell{text-align:center;vertical-align:middle;align-content:center}@media screen and (width<=767px){.bnav,.bnav col{width:auto!important}.bnav-wrap{-webkit-overflow-scrolling:touch;margin:auto 0;overflow-x:auto}}.bnav2{border-collapse:collapse;border-spacing:0;margin:0 auto}.bnav2 td{word-break:normal;border-style:none;padding:10px;font-size:.875rem;font-weight:700;line-height:1.125rem;overflow:hidden}.bnav2 th{word-break:normal;border-style:none;padding:12px;font-size:.875rem;line-height:1.125rem;overflow:hidden}.bnav2 .bnav2-cell{text-align:center;vertical-align:middle;align-content:center}@media screen and (width<=767px){.bnav2,.bnav2 col{width:auto!important}.bnav2-wrap{-webkit-overflow-scrolling:touch;margin:auto 0;overflow-x:auto}}.pgp{border-collapse:collapse;border-spacing:0;margin:0 auto}.pgp td{word-break:normal;border-style:none;padding:10px;font-size:.875rem;line-height:1.125rem;overflow:hidden}.pgp th{word-break:normal;border:1px solid #000;padding:10px;font-size:.875rem;line-height:1.125rem;overflow:hidden}.pgp .pgp-col1{text-align:right;vertical-align:middle;padding-right:1rem}.pgp .pgp-col2{text-align:left;vertical-align:middle;padding-left:1rem}@media screen and (width<=767px){.pgp,.pgp col{width:auto!important}.pgp-wrap{-webkit-overflow-scrolling:touch;margin:2rem 0 auto;overflow-x:auto}}.logo{margin-left:auto;margin-right:auto;display:block}.index-title1{text-align:center;font-style:italic;font-weight:700}.index-title2{letter-spacing:-.015em;text-align:center;font-variant:small-caps;font-size:1.25rem;line-height:1.625rem}.index1{letter-spacing:-.035em;text-align:center;font-style:italic;font-weight:700;line-height:2.125rem}.index2{letter-spacing:-.035em;text-align:center;font-variant:small-caps;font-size:1.5rem;line-height:1.75rem}.index3{letter-spacing:-.035em;text-align:center;font-size:1.5rem;line-height:1.75rem}.index4{letter-spacing:-.035em;text-align:center;font-size:1.5rem;line-height:1.75rem;text-decoration:underline}.subhead{letter-spacing:-.035em;font-variant:small-caps;font-size:1.5rem;line-height:1.75rem}.bold{font-weight:700}.emphasis{font-style:italic}.uline{text-decoration:underline}.bolditalic{font-style:italic;font-weight:700}.bquote{border-left:3px solid #9e9e9e;margin-left:30px;padding-left:10px;font-style:italic}.small-text{font-size:.75rem;line-height:1.125rem}.large-text-center{text-align:center;font-size:1.25rem;line-height:1.75rem}.prewrap{white-space:pre-wrap;display:block}.hr-styled{width:75%;margin:auto}.center-text{text-align:center}.copyright{text-align:center;font-size:.75rem;line-height:1.125rem}.gold{color:#ffc627}.visited{color:#7f6227}.goldseparator{color:#ffc627;margin:0 .5rem}.center-nav{text-align:center;padding:5px;font-size:1rem;line-height:1.5rem}.block{resize:none;background:0 0;border:none;border-radius:0;outline:none;width:100%;font-size:.75rem;line-height:1.125rem}.fingerprint{white-space:pre-line;font-weight:700;display:block}.pgp-image{width:150px;height:150px}.spacer{margin:2rem 0}.separator{margin:0 .5rem}.emoji{margin-right:8px}.headline{margin-bottom:4px;font-style:italic;font-weight:700;display:block}.label{font-family:inherit;font-weight:700}.description{font-family:inherit;font-style:normal;font-weight:400;display:inline}.sr-only{clip:rect(0,0,0,0);white-space:nowrap;border:0;width:1px;height:1px;margin:-1px;padding:0;position:absolute;overflow:hidden}.pgp-entry{flex-wrap:wrap;align-items:center;gap:2rem;margin-bottom:2rem;display:flex}.pgp-text{flex:2;min-width:250px}.pgp-qr{flex:1;min-width:150px}
@@ -0,0 +1,18 @@
1
+ /* ==========================================================================
2
+ src/routes/pgp/+page.server.js
3
+
4
+ Copyright © 2025 Network Pro Strategies (Network Pro™)
5
+ SPDX-License-Identifier: CC-BY-4.0 OR GPL-3.0-or-later
6
+ This file is part of Network Pro.
7
+ ========================================================================== */
8
+
9
+ import { defaultMeta, meta } from "$lib/meta.js";
10
+
11
+ export const prerender = false;
12
+
13
+ /** @type {import('./$types').PageServerLoad} */
14
+ export function load() {
15
+ return {
16
+ meta: meta["/pgp"] || defaultMeta,
17
+ };
18
+ }
@@ -0,0 +1,61 @@
1
+ <!-- ==========================================================================
2
+ src/routes/pgp/+page.svelte
3
+
4
+ Copyright © 2025 Network Pro Strategies (Network Pro™)
5
+ SPDX-License-Identifier: CC-BY-4.0 OR GPL-3.0-or-later
6
+ This file is part of Network Pro.
7
+ ========================================================================== -->
8
+
9
+ <script>
10
+ import PGPContent from "$lib/pages/PGPContent.svelte";
11
+ import Badges from "$lib/components/Badges.svelte";
12
+ import FullWidthSection from "$lib/components/FullWidthSection.svelte";
13
+ import LegalNav from "$lib/components/LegalNav.svelte";
14
+ import SocialMedia from "$lib/components/SocialMedia.svelte";
15
+ import MetaTags from "$lib/components/MetaTags.svelte";
16
+
17
+ /**
18
+ * @type {string}
19
+ * Style class for the div element.
20
+ */
21
+ const spaceStyle = "spacer";
22
+
23
+ export let data;
24
+ </script>
25
+
26
+ <MetaTags title={data.meta.title} description={data.meta.description} />
27
+
28
+ <link rel="canonical" href="https://netwk.pro/pgp" />
29
+
30
+ <section id="about">
31
+ <FullWidthSection containerClass="readable">
32
+ <!-- BEGIN MAIN CONTENT -->
33
+ <section id="main-content">
34
+ <PGPContent />
35
+ </section>
36
+ <!-- END MAIN CONTENT -->
37
+
38
+ <div class={spaceStyle}></div>
39
+
40
+ <!-- SOCIAL MEDIA -->
41
+ <section id="social-media">
42
+ <SocialMedia />
43
+ </section>
44
+
45
+ <hr />
46
+
47
+ <div class={spaceStyle}></div>
48
+
49
+ <!-- LEGAL NAVIGATION -->
50
+ <section id="legal-nav">
51
+ <LegalNav />
52
+ </section>
53
+
54
+ <div class={spaceStyle}></div>
55
+
56
+ <!-- BADGES -->
57
+ <section id="badges">
58
+ <Badges />
59
+ </section>
60
+ </FullWidthSection>
61
+ </section>
@@ -0,0 +1,35 @@
1
+ /* ==========================================================================
2
+ src/routes/pgp/[key]/+server.js
3
+
4
+ Copyright © 2025 Network Pro Strategies (Network Pro™)
5
+ SPDX-License-Identifier: CC-BY-4.0 OR GPL-3.0-or-later
6
+ This file is part of Network Pro.
7
+ ========================================================================== */
8
+
9
+ import { error } from "@sveltejs/kit";
10
+ import fs from "fs/promises";
11
+ import path from "path";
12
+
13
+ /**
14
+ * @type {import('@sveltejs/kit').RequestHandler}
15
+ */
16
+ export async function GET({ params, setHeaders }) {
17
+ const key = params.key;
18
+
19
+ if (!key || !key.endsWith(".asc")) {
20
+ throw error(400, "Invalid or missing file name");
21
+ }
22
+
23
+ const filePath = path.resolve("static/pgp", key);
24
+
25
+ try {
26
+ const file = await fs.readFile(filePath);
27
+ setHeaders({
28
+ "Content-Type": "application/pgp-keys",
29
+ "Content-Disposition": `attachment; filename="${key}"`,
30
+ });
31
+ return new Response(file);
32
+ } catch {
33
+ return new Response("File not found", { status: 404 });
34
+ }
35
+ }
@@ -32,6 +32,14 @@ const IGNORE_PATHS = new Set([
32
32
  "/img/logo-transparent.png",
33
33
  "/img/logo.png",
34
34
  "/img/svelte.png",
35
+ "/pgp/pgp-github.png",
36
+ "/pgp/pgp-github.webp",
37
+ "/pgp/contact@s.neteng.pro.asc",
38
+ "/pgp/github@sl.neteng.cc.asc",
39
+ "/pgp/security@s.neteng.pro.asc",
40
+ "/pgp/support@neteng.pro.asc",
41
+ "/pgp/vcard.png",
42
+ "/pgp/vcard.webp",
35
43
  "/screenshots/desktop-foss.png",
36
44
  "/webfonts/fa-brands-400.ttf",
37
45
  "/webfonts/fa-solid-900.ttf",
@@ -50,7 +58,7 @@ const ASSETS = [
50
58
 
51
59
  const shouldExclude =
52
60
  path.startsWith("http") ||
53
- path.startsWith("/assets/") ||
61
+ path.startsWith("/bin/") ||
54
62
  disallowedHosts.some(
55
63
  (host) => hostname === host || hostname.endsWith(`.${host}`),
56
64
  ) ||
@@ -81,10 +89,12 @@ const REQUIRED_ASSETS = [
81
89
  "/icon-services.png",
82
90
  "/icon-splash.png",
83
91
  "/img/banner-og-1200x630.png",
84
- "/img/qr/pgp-contact.png",
85
- "/img/qr/pgp-github.png",
86
- "/img/qr/pgp-support.png",
87
- "/img/qr/vcard.png",
92
+ "/pgp/pgp-contact.png",
93
+ "/pgp/pgp-contact.webp",
94
+ "/pgp/pgp-security.png",
95
+ "/pgp/pgp-security.webp",
96
+ "/pgp/pgp-support.png",
97
+ "/pgp/pgp-support.webp",
88
98
  "/manifest.json",
89
99
  "/offline.html",
90
100
  "/offline.min.css",
@@ -99,6 +109,7 @@ const REQUIRED_ASSETS = [
99
109
  "/webfonts/fa-brands-400.woff2",
100
110
  "/webfonts/fa-solid-900.woff2",
101
111
  "/.well-known/dnt-policy-1.0.txt",
112
+ "/.well-known/gpc.json",
102
113
  ];
103
114
 
104
115
  if (isDev) {
@@ -26,7 +26,7 @@
26
26
 
27
27
  <link
28
28
  rel="canonical"
29
- href="https://netwk.pro/assets/license/CC-BY-4.0.html" />
29
+ href="https://netwk.pro/bin/license/CC-BY-4.0.html" />
30
30
 
31
31
  <link rel="icon" href="/favicon.ico" sizes="any" type="image/x-icon" />
32
32
  </head>
@@ -26,7 +26,7 @@
26
26
 
27
27
  <link
28
28
  rel="canonical"
29
- href="https://netwk.pro/assets/license/COPYING.html" />
29
+ href="https://netwk.pro/bin/license/COPYING.html" />
30
30
 
31
31
  <link
32
32
  rel="icon"
Binary file
Binary file
Binary file
Binary file
Binary file
@@ -0,0 +1,22 @@
1
+ -----BEGIN PGP PUBLIC KEY BLOCK-----
2
+ Comment: User ID: security@s.neteng.pro <security@s.neteng.pro>
3
+ Comment: Valid from: 1/6/25 8:36 AM
4
+ Comment: Type: 255-bit EdDSA (secret key available)
5
+ Comment: Usage: Signing, Encryption, Certifying User IDs
6
+ Comment: Fingerprint: B7FE1D4E6CAB3E714A9FDF6E48CB7290C00D0DA5
7
+
8
+
9
+ mDMEZ3v4eRYJKwYBBAHaRw8BAQdAFxcxIifN3QdPmjnVFLXkCueQBV+GCpybLTgw
10
+ FPqMNvi0LXNlY3VyaXR5QHMubmV0ZW5nLnBybyA8c2VjdXJpdHlAcy5uZXRlbmcu
11
+ cHJvPojRBBMWCgCDBYJne/h5AwsJBwmQSMtykMANDaVFFAAAAAAAHAAgc2FsdEBu
12
+ b3RhdGlvbnMub3BlbnBncGpzLm9yZ3rrat4fGUXd3ubqU+S6lJBxikUj2XJHnG3R
13
+ dledkYRnAxUKCAQWAAIBAhkBApsDAh4BFiEEt/4dTmyrPnFKn99uSMtykMANDaUA
14
+ AM61AQCadROujMKqyuGezv9/l2bqY2TCwxlU6pt2OP2kBaGawQEA56C1AnZ4j43c
15
+ VnMVc66lGoTzyTceHJRtC4OF+BT2TQW4OARne/h5EgorBgEEAZdVAQUBAQdAeH9H
16
+ BjnnWYk6uRjTz/rD8XKuyVmK+M2FkvwwTGnp41UDAQgHiL4EGBYKAHAFgmd7+HkJ
17
+ kEjLcpDADQ2lRRQAAAAAABwAIHNhbHRAbm90YXRpb25zLm9wZW5wZ3Bqcy5vcmec
18
+ Wa0ZrRuAVXctQtSq1NG+iidE0NBjZDHAgMnyMjEhIAKbDBYhBLf+HU5sqz5xSp/f
19
+ bkjLcpDADQ2lAAADagD/VgytFYartgP6AuqYOgbFd+n25ziiFX936t+ooCLvhcwB
20
+ AO6Mwo291bBwCIFNJ8gA1P7P02UsXvFOO+GGgaHlff8K
21
+ =Wt2X
22
+ -----END PGP PUBLIC KEY BLOCK-----
Binary file
@@ -1,5 +1,5 @@
1
1
  <?xml version="1.0" encoding="UTF-8"?>
2
- <!-- Sitemap last updated on 2025-06-08 -->
2
+ <!-- Sitemap last updated on 2025-06-11 -->
3
3
 
4
4
  <urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
5
5
 
@@ -7,7 +7,7 @@
7
7
 
8
8
  <loc>https://netwk.pro</loc>
9
9
 
10
- <lastmod>2025-05-28</lastmod>
10
+ <lastmod>2025-06-10</lastmod>
11
11
 
12
12
  <changefreq>weekly</changefreq>
13
13
 
@@ -31,7 +31,7 @@
31
31
 
32
32
  <loc>https://netwk.pro/about</loc>
33
33
 
34
- <lastmod>2025-05-29</lastmod>
34
+ <lastmod>2025-06-10</lastmod>
35
35
 
36
36
  <changefreq>monthly</changefreq>
37
37
 
@@ -67,7 +67,7 @@
67
67
 
68
68
  <loc>https://netwk.pro/license</loc>
69
69
 
70
- <lastmod>2025-06-04</lastmod>
70
+ <lastmod>2025-06-10</lastmod>
71
71
 
72
72
  <changefreq>monthly</changefreq>
73
73
 
@@ -91,7 +91,7 @@
91
91
 
92
92
  <loc>https://netwk.pro/terms-conditions</loc>
93
93
 
94
- <lastmod>2025-05-29</lastmod>
94
+ <lastmod>2025-06-10</lastmod>
95
95
 
96
96
  <changefreq>monthly</changefreq>
97
97
 
@@ -101,25 +101,25 @@
101
101
 
102
102
  <url>
103
103
 
104
- <loc>https://netwk.pro/assets/license/COPYING.html</loc>
104
+ <loc>https://netwk.pro/bin/CC-BY-4.0.html</loc>
105
105
 
106
- <lastmod>2025-05-29</lastmod>
106
+ <lastmod>2025-06-10</lastmod>
107
107
 
108
- <changefreq>yearly</changefreq>
108
+ <changefreq>monthly</changefreq>
109
109
 
110
- <priority>0.4</priority>
110
+ <priority>0.5</priority>
111
111
 
112
112
  </url>
113
113
 
114
114
  <url>
115
115
 
116
- <loc>https://netwk.pro/assets/license/CC-BY-4.0.html</loc>
116
+ <loc>https://netwk.pro/bin/COPYING.html</loc>
117
117
 
118
- <lastmod>2025-05-29</lastmod>
118
+ <lastmod>2025-06-10</lastmod>
119
119
 
120
- <changefreq>yearly</changefreq>
120
+ <changefreq>monthly</changefreq>
121
121
 
122
- <priority>0.4</priority>
122
+ <priority>0.5</priority>
123
123
 
124
124
  </url>
125
125
 
@@ -1,13 +0,0 @@
1
- BEGIN:VCARD
2
- VERSION:3.0
3
- FN:Scott Lopez
4
- N:Lopez;Scott
5
- TEL;TYPE=WORK,PREF=1:(623) 252-4350
6
- EMAIL;TYPE=HOME:github@sl.neteng.cc
7
- EMAIL;TYPE=WORK:support@neteng.pro
8
- EMAIL;TYPE=Secure:business@s.neteng.pro
9
- ADR;TYPE=WORK:;;Peoria\, AZ 85382\nUS
10
- ORG:Network Pro Strategies
11
- TITLE:Security Consultant
12
- URL:https://netwk.pro
13
- END:VCARD
@@ -1,17 +0,0 @@
1
- -----BEGIN PGP PUBLIC KEY BLOCK-----
2
-
3
- xjMEaA9hQBYJKwYBBAHaRw8BAQdA0plJIVADzWGVQtDnYcjtokJN+xTURRDx
4
- +bPQWsRCCMrNK2NvbnRhY3RAcy5uZXRlbmcucHJvIDxjb250YWN0QHMubmV0
5
- ZW5nLnBybz7CwBEEExYKAIMFgmgPYUADCwkHCZD5k3NJlJX5V0UUAAAAAAAc
6
- ACBzYWx0QG5vdGF0aW9ucy5vcGVucGdwanMub3Jn7SJZvz9xzMXAz0AK0oap
7
- 2J4yPfF5ITdHI3E4NrGhHiUDFQoIBBYAAgECGQECmwMCHgEWIQTfEYuqbC2d
8
- zevcLdz5k3NJlJX5VwAA3lgBAPlvilH7QBDdourj+ndUWOlkN/UK5GVZFNdl
9
- Wtz+yqO9AQDi6ZJvz4FXtnLpiDnrGLl+XtS9mpb9W1K6veAfq9EPDs44BGgP
10
- YUASCisGAQQBl1UBBQEBB0CH4STLqhXPigKwiTqgROmO9+ZBwLULvQIr/opO
11
- xkvFcgMBCAfCvgQYFgoAcAWCaA9hQAmQ+ZNzSZSV+VdFFAAAAAAAHAAgc2Fs
12
- dEBub3RhdGlvbnMub3BlbnBncGpzLm9yZzQ5Pg7sTb37RQ0E0xHK7uw476sQ
13
- 4ReUd+a+A2uSan3wApsMFiEE3xGLqmwtnc3r3C3c+ZNzSZSV+VcAALq5AQDJ
14
- bhqyY8dg25WXFPtL8TgeK8BP+d4y5IaobKuZ2gHh2wD+MmeUZZBNiIM/QPMo
15
- Pgm5czd9ckE/aknVqJZPLx7KJAQ=
16
- =o5rM
17
- -----END PGP PUBLIC KEY BLOCK-----
@@ -1,29 +0,0 @@
1
- -----BEGIN PGP PUBLIC KEY BLOCK-----
2
- Comment: User ID: SunDevil311 <github@sl.neteng.cc>
3
- Comment: Valid from: 1/7/24 2:11 AM
4
- Comment: Valid until: 1/8/29 11:58 PM
5
- Comment: Type: 255-bit EdDSA (secret key available)
6
- Comment: Usage: Signing, Encryption, Certifying User IDs
7
- Comment: Fingerprint: E8B4F1193B21601207B080BBAEBBB8F6D4BB723B
8
-
9
-
10
- mDMEZZpquxYJKwYBBAHaRw8BAQdAk/oCPQnD4FIVgyVsugXB/Sq8Rp+b9Ahz31KY
11
- EOTyuIW0IVN1bkRldmlsMzExIDxnaXRodWJAc2wubmV0ZW5nLmNjPoiWBBMWCAA+
12
- AhsDBQsJCAcCBhUKCQgLAgQWAgMBAh4BAheAFiEE6LTxGTshYBIHsIC7rru49tS7
13
- cjsFAmeBrNgFCQlrKHgACgkQrru49tS7cjujpQEA9LtzB8R+5kwSnjM3mU+ZOK2X
14
- 370iUAOrDOI41/Xzdi4BAJbImQxZCPHWpNEysPkpf5OYIQhBljYGBLyPlgbqKl8B
15
- iHUEEBYKAB0WIQTzG0myNw5BdXuKqI/DoNSOqcFPXgUCZZpwcwAKCRDDoNSOqcFP
16
- XrtIAQC4+QUJEFHFaW1hePdF0k8OMVm7YX6B2ReccN7JV6WIggD/SULjDjEa59/R
17
- e3QovTnGE/+JQl7WnMG7wIWWt7AsyAyIkAQTFggAOBYhBOi08Rk7IWASB7CAu667
18
- uPbUu3I7BQJlmmq7AhsDBQsJCAcCBhUKCQgLAgQWAgMBAh4BAheAAAoJEK67uPbU
19
- u3I7V7cA/3VdMTkltx5d9mqOl8azXkXEeInblf/GHqp9gD/ziCRcAP4rifnkxfYp
20
- z8Xkl/YtqWNUqMU/AbTqLXrNrj6Ld6L4CYiWBBMWCAA+AhsDBQsJCAcCBhUKCQgL
21
- AgQWAgMBAh4BAheAFiEE6LTxGTshYBIHsIC7rru49tS7cjsFAma5TVIFCQbC4ngA
22
- CgkQrru49tS7cjsh+QEAzgTKYSbMAsJrgQrLZ+gTuZjtP2cf4LNplwVyyOW+ZBEB
23
- AK99IZScLbf0QOJowg4XXds02yKG6pB/9BhTf0gfbq4JuDgEZZpquxIKKwYBBAGX
24
- VQEFAQEHQPUDNJbixlUJE10/uCSaxUcly4+YB6aDP+qt6kYw+ExRAwEIB4h4BBgW
25
- CAAgFiEE6LTxGTshYBIHsIC7rru49tS7cjsFAmWaarsCGwwACgkQrru49tS7cjtS
26
- 9AEA9bv6Zq/PcRL25QM4NlvJDsKjePihgaYav+4ekdk0tkoA/02QjSNlzIL/CpRF
27
- 540gKvILQXFUuoPAKBL+sEggB+8D
28
- =iL2v
29
- -----END PGP PUBLIC KEY BLOCK-----
@@ -1,8 +0,0 @@
1
- {
2
- "id": "fe.linksheet.nightly",
3
- "url": "https://github.com/LinkSheet/nightly",
4
- "author": "1fexd",
5
- "name": "LinkSheet Nightly",
6
- "preferredApkIndex": 0,
7
- "additionalSettings": "{\"includePrereleases\":true,\"fallbackToOlderReleases\":true,\"filterReleaseTitlesByRegEx\":\"\",\"filterReleaseNotesByRegEx\":\"\",\"verifyLatestTag\":false,\"dontSortReleasesList\":false,\"useLatestAssetDateAsReleaseDate\":false,\"trackOnly\":false,\"versionExtractionRegEx\":\"\",\"matchGroupToUse\":\"\",\"versionDetection\":false,\"releaseDateAsVersion\":false,\"useVersionCodeAsOSVersion\":false,\"apkFilterRegEx\":\"LinkSheet.Nightly\",\"invertAPKFilter\":true,\"autoApkFilterByArch\":true,\"appName\":\"LinkSheet Nightly\",\"shizukuPretendToBeGooglePlay\":false,\"exemptFromBackgroundUpdates\":false,\"skipUpdateNotifications\":false,\"about\":\"Restore link control on Android 12+\",\"appAuthor\":\"1fexd\"}"
8
- }
@@ -1,47 +0,0 @@
1
- -----BEGIN PGP PUBLIC KEY BLOCK-----
2
- Comment: User ID: Network Pro Strategies <support@neteng.pro>
3
- Comment: a.k.a.: Network Pro Strategies <contact@neteng.pro>
4
- Comment: a.k.a.: Network Pro Strategies <github@neteng.pro>
5
- Comment: a.k.a.: Network Pro Strategies <no-reply@neteng.pro>
6
- Comment: a.k.a.: Network Pro Strategies <social@neteng.pro>
7
- Comment: a.k.a.: Network Pro Strategies <website@neteng.pro>
8
- Comment: Valid from: 3/28/25 5:16 PM
9
- Comment: Valid until: 3/27/28 5:16 PM
10
- Comment: Type: 255-bit EdDSA (secret key available)
11
- Comment: Usage: Signing, Encryption, Certifying User IDs
12
- Comment: Fingerprint: 6590B992E2E3EFF127387BCE2AF093E9DEC61BA0
13
-
14
-
15
- mDMEZ+c71xYJKwYBBAHaRw8BAQdAXrXB9LKKHj7tgAzrCkheQe+yJ0KD50yVrHM7
16
- yOopYuW0K05ldHdvcmsgUHJvIFN0cmF0ZWdpZXMgPHN1cHBvcnRAbmV0ZW5nLnBy
17
- bz6InAQTFgoARAIbAwUJBaOagAULCQgHAgIiAgYVCgkICwIEFgIDAQIeBwIXgBYh
18
- BGWQuZLi4+/xJzh7zirwk+nexhugBQJn5zzLAhkBAAoJECrwk+nexhugp9UBAJ4O
19
- J4aR6SBdYCInPri4DuRrLeLtMIT6yPN2XP0+aRH5AP4piPrWA5Qx22t7DZTF8S08
20
- 6rhDtFuslGkMab4ITA+8AbQrTmV0d29yayBQcm8gU3RyYXRlZ2llcyA8Y29udGFj
21
- dEBuZXRlbmcucHJvPoiZBBMWCgBBFiEEZZC5kuLj7/EnOHvOKvCT6d7GG6AFAmfn
22
- PJgCGwMFCQWjmoAFCwkIBwICIgIGFQoJCAsCBBYCAwECHgcCF4AACgkQKvCT6d7G
23
- G6CBCgD/aC/WM7bOfQoTZitpluifrEQIjP6RelCpksULK7jcEzkA/iTuessO95fe
24
- 72MtCRiOjFlcVXuXfgaap0PwNmwfMz0GtCpOZXR3b3JrIFBybyBTdHJhdGVnaWVz
25
- IDxnaXRodWJAbmV0ZW5nLnBybz6ImQQTFgoAQRYhBGWQuZLi4+/xJzh7zirwk+ne
26
- xhugBQJn5zyiAhsDBQkFo5qABQsJCAcCAiICBhUKCQgLAgQWAgMBAh4HAheAAAoJ
27
- ECrwk+nexhug0tsBAKjrZMO7wfGUOiNQQr5IPzSEwOLYy0hkxq4SqOuMuPpVAP9/
28
- b3sZ0BbmTaU/+gnuXyUbMRQHLDqHh7ESRxSgll3WDLQsTmV0d29yayBQcm8gU3Ry
29
- YXRlZ2llcyA8bm8tcmVwbHlAbmV0ZW5nLnBybz6ImQQTFgoAQRYhBGWQuZLi4+/x
30
- Jzh7zirwk+nexhugBQJn5zywAhsDBQkFo5qABQsJCAcCAiICBhUKCQgLAgQWAgMB
31
- Ah4HAheAAAoJECrwk+nexhugjAQA+gNrz3htQtHPTifyIps/p8CuA6LR/5F99jip
32
- 5obARSaLAQDuodGbF3NIZ5b6C98aoNQ7adj/Neg53z6rgVRHkNuiCrQqTmV0d29y
33
- ayBQcm8gU3RyYXRlZ2llcyA8c29jaWFsQG5ldGVuZy5wcm8+iJkEExYKAEEWIQRl
34
- kLmS4uPv8Sc4e84q8JPp3sYboAUCZ+c8vAIbAwUJBaOagAULCQgHAgIiAgYVCgkI
35
- CwIEFgIDAQIeBwIXgAAKCRAq8JPp3sYboE6hAQCLyAl45ty3muvvw7vpkJjhbkyp
36
- daLVTIltW6x+cotifQEAqbXMngGnwAZPxiZH/r/NbopqD57YTT+HXx62thwefw+0
37
- K05ldHdvcmsgUHJvIFN0cmF0ZWdpZXMgPHdlYnNpdGVAbmV0ZW5nLnBybz6ImQQT
38
- FgoAQRYhBGWQuZLi4+/xJzh7zirwk+nexhugBQJn5zzHAhsDBQkFo5qABQsJCAcC
39
- AiICBhUKCQgLAgQWAgMBAh4HAheAAAoJECrwk+nexhugRUcA/RHfApSl1S+APoXN
40
- jmTki5pUk8+AD1kveRymT9g49FIVAQCtX8+cbM+9jLrg9EyyJ6kvE9btGExOOufA
41
- JNY15IdwBbg4BGfnO9cSCisGAQQBl1UBBQEBB0BiSu/MobXZljtB25Inf4cJwdoH
42
- z+gqapJHs+5y9mNPCgMBCAeIfgQYFgoAJhYhBGWQuZLi4+/xJzh7zirwk+nexhug
43
- BQJn5zvXAhsMBQkFo5qAAAoJECrwk+nexhugsXoA+QHr0FAorF0ZEgDA4wL/oZpB
44
- oIARdo9kYzL+cTi/F3g6AQCtbupe/JymVJuwLUcq3AsxXe0DLyoodT7CpOdVpYLV
45
- DQ==
46
- =pBLp
47
- -----END PGP PUBLIC KEY BLOCK-----
Binary file
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes