From 2a0d1dc2a060f00190a170b40eb7c571a34ccece Mon Sep 17 00:00:00 2001 From: Alexey851001 <62497171+Alexey851001@users.noreply.github.com> Date: Wed, 8 Jan 2025 14:33:21 +0000 Subject: [PATCH] =?UTF-8?q?Deploying=20to=20master=20from=20@=20CodeCavePr?= =?UTF-8?q?o/codecave.pro-new@12613cbd6ab8bbaedc0b21482b003ae10918e956=20?= =?UTF-8?q?=F0=9F=9A=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 404.html | 6 +++--- 404/index.html | 6 +++--- _gatsby/slices/_gatsby-scripts-1.html | 4 ++-- blog/10582553-73a2-569f-8bdd-980e1f77c10a/index.html | 6 +++--- blog/azure-devops/index.html | 4 ++-- blog/azure-devops/page/1/index.html | 4 ++-- blog/azure/index.html | 4 ++-- blog/azure/page/1/index.html | 4 ++-- blog/c924c93c-fac0-517e-92e7-c5b5aaa083c2/index.html | 6 +++--- blog/changelog/index.html | 4 ++-- blog/changelog/page/1/index.html | 4 ++-- blog/cloud-init/index.html | 4 ++-- blog/cloud-init/page/1/index.html | 4 ++-- blog/confluence/index.html | 4 ++-- blog/confluence/page/1/index.html | 4 ++-- blog/devops/index.html | 4 ++-- blog/devops/page/1/index.html | 4 ++-- blog/e173a2ae-ebb5-5219-9479-035dde5fe8c8/index.html | 6 +++--- blog/eced1a19-65cd-58b2-a9e4-e06c8bb532fb/index.html | 6 +++--- blog/index.html | 4 ++-- blog/page/1/index.html | 4 ++-- blog/podryabinkina/index.html | 4 ++-- blog/podryabinkina/page/1/index.html | 4 ++-- blog/proxmox/index.html | 4 ++-- blog/proxmox/page/1/index.html | 4 ++-- blog/self-hosted-build-agent/index.html | 4 ++-- blog/self-hosted-build-agent/page/1/index.html | 4 ++-- blog/twingate/index.html | 4 ++-- blog/twingate/page/1/index.html | 4 ++-- blog/virtualization/index.html | 4 ++-- blog/virtualization/page/1/index.html | 4 ++-- blog/vm/index.html | 4 ++-- blog/vm/page/1/index.html | 4 ++-- blog/vpn/index.html | 4 ++-- blog/vpn/page/1/index.html | 4 ++-- blog/wireguard/index.html | 4 ++-- blog/wireguard/page/1/index.html | 4 ++-- blog/zero-trust/index.html | 4 ++-- blog/zero-trust/page/1/index.html | 4 ++-- blog/zhmayev/index.html | 4 ++-- blog/zhmayev/page/1/index.html | 4 ++-- chunk-map.json | 2 +- ...src-pages-templates-post-tsx-4f0b1db8f77b105dfb25.js.map | 1 - ...t---src-pages-templates-post-tsx-f41bd2e7c5e393acf3b9.js | 4 ++-- ...src-pages-templates-post-tsx-f41bd2e7c5e393acf3b9.js.map | 1 + cookie-policy/index.html | 4 ++-- index.html | 4 ++-- page-data/app-data.json | 2 +- .../10582553-73a2-569f-8bdd-980e1f77c10a/page-data.json | 2 +- .../c924c93c-fac0-517e-92e7-c5b5aaa083c2/page-data.json | 2 +- .../e173a2ae-ebb5-5219-9479-035dde5fe8c8/page-data.json | 2 +- .../eced1a19-65cd-58b2-a9e4-e06c8bb532fb/page-data.json | 2 +- posts.xml | 2 +- privacy-policy/index.html | 4 ++-- projects/08716ab8-fc5f-5f90-9fc0-a8218ec51923/index.html | 4 ++-- projects/4010b091-889b-5be1-ab5a-bde195aa7729/index.html | 4 ++-- projects/4057e0b3-692b-5512-a1fc-cb93bd81fe0e/index.html | 4 ++-- projects/45987eea-191f-531c-b854-25e3d60decff/index.html | 4 ++-- projects/9f63d17d-6164-509e-b2c7-4c655ab9ad7a/index.html | 4 ++-- projects/f17de1e3-0a73-5f92-bf66-1e12d5fdc0fb/index.html | 4 ++-- projects/ff9598a3-3fad-5a4e-a8a8-a8858b3a27e7/index.html | 4 ++-- projects/index.html | 4 ++-- projects/page/1/index.html | 4 ++-- services/index.html | 4 ++-- ...75e41a6bdb.js => webpack-runtime-58c7cdd0abc723b6d241.js | 4 ++-- ...db.js.map => webpack-runtime-58c7cdd0abc723b6d241.js.map | 2 +- webpack.stats.json | 2 +- workflow/index.html | 4 ++-- 68 files changed, 130 insertions(+), 130 deletions(-) delete mode 100644 component---src-pages-templates-post-tsx-4f0b1db8f77b105dfb25.js.map rename component---src-pages-templates-post-tsx-4f0b1db8f77b105dfb25.js => component---src-pages-templates-post-tsx-f41bd2e7c5e393acf3b9.js (68%) create mode 100644 component---src-pages-templates-post-tsx-f41bd2e7c5e393acf3b9.js.map rename webpack-runtime-3ace51124175e41a6bdb.js => webpack-runtime-58c7cdd0abc723b6d241.js (97%) rename webpack-runtime-3ace51124175e41a6bdb.js.map => webpack-runtime-58c7cdd0abc723b6d241.js.map (99%) diff --git a/404.html b/404.html index cbb37324..b08c0d78 100644 --- a/404.html +++ b/404.html @@ -2,10 +2,10 @@ window.hsConversationsSettings = { loadImmediately: false }; 404

404

Nothing to see here, page is under construction

But our blog is always there for you

CONTACTS

EIN: 35-2654711, Company Code: 7296176

8 The Green STE B

Dover, DE 19901-3618, United States

+1 302 364 0193

Privacy PolicyCookie Policy

Leave your contact to get our portfolio

+*/*,:after,:before{border:0 solid}:after,:before{--tw-content:""}html{-webkit-text-size-adjust:100%;font-feature-settings:normal;font-family:ui-sans-serif,system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica Neue,Arial,Noto Sans,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol,Noto Color Emoji;font-variation-settings:normal;line-height:1.5;-moz-tab-size:4;-o-tab-size:4;tab-size:4}body{line-height:inherit;margin:0}hr{border-top-width:1px;color:inherit;height:0}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-weight:inherit}a{color:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,pre,samp{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace;font-size:1em}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}table{border-collapse:collapse;border-color:inherit;text-indent:0}button,input,optgroup,select,textarea{color:inherit;font-family:inherit;font-size:100%;font-weight:inherit;line-height:inherit;margin:0;padding:0}button,select{text-transform:none}[type=button],[type=reset],[type=submit],button{-webkit-appearance:button;background-color:transparent;background-image:none}:-moz-focusring{outline:auto}:-moz-ui-invalid{box-shadow:none}progress{vertical-align:baseline}::-webkit-inner-spin-button,::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}summary{display:list-item}blockquote,dd,dl,figure,h1,h2,h3,h4,h5,h6,hr,p,pre{margin:0}fieldset{margin:0}fieldset,legend{padding:0}menu,ol,ul{list-style:none;margin:0;padding:0}textarea{resize:vertical}input::-moz-placeholder,textarea::-moz-placeholder{color:#9ca3af;opacity:1}input::placeholder,textarea::placeholder{color:#9ca3af;opacity:1}[role=button],button{cursor:pointer}:disabled{cursor:default}audio,canvas,embed,iframe,img,object,svg,video{display:block;vertical-align:middle}img,video{height:auto;max-width:100%}[hidden]{display:none}*,:after,:before{--tw-border-spacing-x:0;--tw-border-spacing-y:0;--tw-translate-x:0;--tw-translate-y:0;--tw-rotate:0;--tw-skew-x:0;--tw-skew-y:0;--tw-scale-x:1;--tw-scale-y:1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness:proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-color:rgba(59,130,246,.5);--tw-ring-offset-shadow:0 0 #0000;--tw-ring-shadow:0 0 #0000;--tw-shadow:0 0 #0000;--tw-shadow-colored:0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: }::backdrop{--tw-border-spacing-x:0;--tw-border-spacing-y:0;--tw-translate-x:0;--tw-translate-y:0;--tw-rotate:0;--tw-skew-x:0;--tw-skew-y:0;--tw-scale-x:1;--tw-scale-y:1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness:proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-color:rgba(59,130,246,.5);--tw-ring-offset-shadow:0 0 #0000;--tw-ring-shadow:0 0 #0000;--tw-shadow:0 0 #0000;--tw-shadow-colored:0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: }.container{width:100%}@media (min-width:640px){.container{max-width:640px}}@media (min-width:768px){.container{max-width:768px}}@media (min-width:1024px){.container{max-width:1024px}}@media (min-width:1280px){.container{max-width:1280px}}@media (min-width:1440px){.container{max-width:1440px}}@media (min-width:1900px){.container{max-width:1900px}}@media (min-width:2200px){.container{max-width:2200px}}.pointer-events-none{pointer-events:none}.invisible{visibility:hidden}.fixed{position:fixed}.absolute{position:absolute}.relative{position:relative}.sticky{position:sticky}.-bottom-1{bottom:-.25rem}.-bottom-2{bottom:-.5rem}.-left-2{left:-.5rem}.-left-5{left:-1.25rem}.-right-2{right:-.5rem}.-top-16{top:-4rem}.-top-2{top:-.5rem}.bottom-0{bottom:0}.bottom-1{bottom:.25rem}.bottom-2{bottom:.5rem}.bottom-\[5\%\]{bottom:5%}.left-0{left:0}.left-2{left:.5rem}.left-\[2\%\]{left:2%}.right-0{right:0}.top-0{top:0}.top-1\/2{top:50%}.top-full{top:100%}.z-10{z-index:10}.z-20{z-index:20}.z-50{z-index:50}.-order-1{order:-1}.float-right{float:right}.mx-0{margin-left:0;margin-right:0}.mx-1{margin-left:.25rem;margin-right:.25rem}.mx-1\.5{margin-left:.375rem;margin-right:.375rem}.mx-12{margin-left:3rem;margin-right:3rem}.mx-5{margin-left:1.25rem;margin-right:1.25rem}.mx-auto{margin-left:auto;margin-right:auto}.-ml-2{margin-left:-.5rem}.mb-2{margin-bottom:.5rem}.mb-2\.5{margin-bottom:.625rem}.mb-5{margin-bottom:1.25rem}.mb-6{margin-bottom:1.5rem}.mb-8{margin-bottom:2rem}.ml-3{margin-left:.75rem}.mr-10{margin-right:2.5rem}.mr-2{margin-right:.5rem}.mr-3{margin-right:.75rem}.mr-3\.5{margin-right:.875rem}.mt-3{margin-top:.75rem}.mt-auto{margin-top:auto}.block{display:block}.inline-block{display:inline-block}.inline{display:inline}.flex{display:flex}.inline-flex{display:inline-flex}.grid{display:grid}.hidden{display:none}.aspect-square{aspect-ratio:1/1}.h-0{height:0}.h-1{height:.25rem}.h-10{height:2.5rem}.h-12{height:3rem}.h-14{height:3.5rem}.h-16{height:4rem}.h-2\/3{height:66.666667%}.h-28{height:7rem}.h-32{height:8rem}.h-40{height:10rem}.h-7{height:1.75rem}.h-8{height:2rem}.h-91{height:22.75rem}.h-\[1000px\]{height:1000px}.h-\[30rem\]{height:30rem}.h-\[72px\]{height:72px}.h-full{height:100%}.h-max{height:-moz-max-content;height:max-content}.max-h-\[424px\]{max-height:424px}.max-h-full{max-height:100%}.min-h-0{min-height:0}.min-h-\[400px\]{min-height:400px}.min-h-full{min-height:100%}.min-h-max{min-height:-moz-max-content;min-height:max-content}.min-h-screen{min-height:100vh}.w-0{width:0}.w-1{width:.25rem}.w-10{width:2.5rem}.w-12{width:3rem}.w-14{width:3.5rem}.w-16{width:4rem}.w-2\/3{width:66.666667%}.w-28{width:7rem}.w-32{width:8rem}.w-40{width:10rem}.w-7{width:1.75rem}.w-8{width:2rem}.w-\[100\%\]{width:100%}.w-\[118px\]{width:118px}.w-\[192px\]{width:192px}.w-\[220px\]{width:220px}.w-\[72px\]{width:72px}.w-\[85\%\]{width:85%}.w-full{width:100%}.w-max{width:-moz-max-content;width:max-content}.min-w-0{min-width:0}.min-w-10{min-width:2.5rem}.max-w-2xl{max-width:680px}.max-w-4\.5xl{max-width:1038px}.max-w-7xl{max-width:80rem}.max-w-\[1280px\]{max-width:1280px}.max-w-\[320px\]{max-width:320px}.max-w-\[400px\]{max-width:400px}.max-w-\[500px\]{max-width:500px}.max-w-\[544px\]{max-width:544px}.max-w-full{max-width:100%}.flex-1{flex:1 1 0%}.shrink{flex-shrink:1}.shrink-0{flex-shrink:0}.flex-grow,.grow{flex-grow:1}.grow-0{flex-grow:0}.basis-1\/3{flex-basis:33.333333%}.basis-full{flex-basis:100%}.origin-\[5\%_50\%\]{transform-origin:5% 50%}.-translate-y-1\/2{--tw-translate-y:-50%}.-translate-y-1\/2,.translate-y-0{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.translate-y-0{--tw-translate-y:0px}.translate-y-full{--tw-translate-y:100%}.transform,.translate-y-full{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}@keyframes spin{to{transform:rotate(1turn)}}.animate-spin{animation:spin 1s linear infinite}.cursor-pointer{cursor:pointer}.touch-pan-x{--tw-pan-x:pan-x;touch-action:var(--tw-pan-x) var(--tw-pan-y) var(--tw-pinch-zoom)}.touch-manipulation{touch-action:manipulation}.select-none{-webkit-user-select:none;-moz-user-select:none;user-select:none}.resize{resize:both}.break-inside-avoid{-moz-column-break-inside:avoid;break-inside:avoid}.grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.flex-col{flex-direction:column}.flex-col-reverse{flex-direction:column-reverse}.flex-wrap{flex-wrap:wrap}.flex-nowrap{flex-wrap:nowrap}.content-center{align-content:center}.items-start{align-items:flex-start}.items-end{align-items:flex-end}.items-center{align-items:center}.items-stretch{align-items:stretch}.justify-start{justify-content:flex-start}.justify-center{justify-content:center}.justify-between{justify-content:space-between}.justify-around{justify-content:space-around}.justify-evenly{justify-content:space-evenly}.gap-0{gap:0}.gap-10{gap:2.5rem}.gap-14{gap:3.5rem}.gap-2{gap:.5rem}.gap-2\.5{gap:.625rem}.gap-3{gap:.75rem}.gap-3\.5{gap:.875rem}.gap-4{gap:1rem}.gap-5{gap:1.25rem}.gap-6{gap:1.5rem}.gap-7{gap:1.75rem}.gap-8{gap:2rem}.gap-x-14{-moz-column-gap:3.5rem;column-gap:3.5rem}.gap-x-16{-moz-column-gap:4rem;column-gap:4rem}.gap-x-24{-moz-column-gap:6rem;column-gap:6rem}.gap-x-28{-moz-column-gap:7rem;column-gap:7rem}.gap-x-5{-moz-column-gap:1.25rem;column-gap:1.25rem}.gap-y-2{row-gap:.5rem}.gap-y-2\.5{row-gap:.625rem}.gap-y-5{row-gap:1.25rem}.gap-y-8{row-gap:2rem}.space-x-10>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-left:calc(2.5rem*(1 - var(--tw-space-x-reverse)));margin-right:calc(2.5rem*var(--tw-space-x-reverse))}.overflow-hidden{overflow:hidden}.whitespace-normal{white-space:normal}.whitespace-nowrap{white-space:nowrap}.whitespace-pre{white-space:pre}.rounded{border-radius:.25rem}.rounded-2\.5xl{border-radius:20px}.rounded-2xl{border-radius:1rem}.rounded-\[10px\]{border-radius:10px}.rounded-full{border-radius:9999px}.rounded-lg{border-radius:.5rem}.rounded-md{border-radius:.375rem}.rounded-xl{border-radius:.75rem}.rounded-b-2xl{border-bottom-left-radius:1rem;border-bottom-right-radius:1rem}.border{border-width:1px}.border-b{border-bottom-width:1px}.border-b-2{border-bottom-width:2px}.border-b-\[4px\]{border-bottom-width:4px}.border-t-2{border-top-width:2px}.border-solid{border-style:solid}.border-dashed{border-style:dashed}.border-main-10{--tw-border-opacity:1;border-color:rgb(143 143 143/var(--tw-border-opacity))}.border-main-100{--tw-border-opacity:1;border-color:rgb(17 17 17/var(--tw-border-opacity))}.border-secondary-10{--tw-border-opacity:1;border-color:rgb(209 209 209/var(--tw-border-opacity))}.border-secondary-100{--tw-border-opacity:1;border-color:rgb(249 249 249/var(--tw-border-opacity))}.border-secondary-70{--tw-border-opacity:1;border-color:rgb(189 189 189/var(--tw-border-opacity))}.bg-main-100{--tw-bg-opacity:1;background-color:rgb(17 17 17/var(--tw-bg-opacity))}.bg-main-70{--tw-bg-opacity:1;background-color:rgb(45 45 45/var(--tw-bg-opacity))}.bg-secondary-10{--tw-bg-opacity:1;background-color:rgb(209 209 209/var(--tw-bg-opacity))}.bg-secondary-100{--tw-bg-opacity:1;background-color:rgb(249 249 249/var(--tw-bg-opacity))}.fill-main-100{fill:#111}.object-contain{-o-object-fit:contain;object-fit:contain}.object-cover{-o-object-fit:cover;object-fit:cover}.p-2{padding:.5rem}.p-2\.5{padding:.625rem}.p-6{padding:1.5rem}.p-8{padding:2rem}.px-0{padding-left:0;padding-right:0}.px-12{padding-left:3rem;padding-right:3rem}.px-2{padding-left:.5rem;padding-right:.5rem}.px-2\.5{padding-left:.625rem;padding-right:.625rem}.px-4{padding-left:1rem;padding-right:1rem}.px-5{padding-left:1.25rem;padding-right:1.25rem}.px-6{padding-left:1.5rem;padding-right:1.5rem}.px-8{padding-left:2rem;padding-right:2rem}.py-1{padding-bottom:.25rem;padding-top:.25rem}.py-1\.5{padding-bottom:.375rem;padding-top:.375rem}.py-10{padding-bottom:2.5rem;padding-top:2.5rem}.py-12{padding-bottom:3rem;padding-top:3rem}.py-16{padding-bottom:4rem;padding-top:4rem}.py-2{padding-bottom:.5rem;padding-top:.5rem}.py-2\.5{padding-bottom:.625rem;padding-top:.625rem}.py-4{padding-bottom:1rem;padding-top:1rem}.py-5{padding-bottom:1.25rem;padding-top:1.25rem}.py-6{padding-bottom:1.5rem;padding-top:1.5rem}.py-8{padding-bottom:2rem;padding-top:2rem}.pb-10{padding-bottom:2.5rem}.pb-8{padding-bottom:2rem}.pt-2{padding-top:.5rem}.pt-2\.5{padding-top:.625rem}.pt-5{padding-top:1.25rem}.pt-8{padding-top:2rem}.text-center{text-align:center}.text-start{text-align:start}.text-2xl{font-size:1.5rem;line-height:2rem}.text-3xl{font-size:1.875rem;line-height:2.25rem}.text-4xl{font-size:2.25rem;line-height:2.5rem}.text-\[10\.5px\]{font-size:10.5px}.text-\[24px\]{font-size:24px}.text-\[72px\]{font-size:72px}.text-\[88px\]{font-size:88px}.text-base{font-size:1rem;line-height:1.5rem}.text-lg{font-size:1.125rem;line-height:1.75rem}.text-sm{font-size:.875rem;line-height:1.25rem}.text-xl{font-size:1.25rem;line-height:1.75rem}.text-xs{font-size:.75rem;line-height:1rem}.font-bold{font-weight:700}.font-extrabold{font-weight:800}.font-light{font-weight:300}.font-medium{font-weight:500}.font-normal{font-weight:400}.font-semibold{font-weight:600}.uppercase{text-transform:uppercase}.leading-5{line-height:1.25rem}.tracking-wide{letter-spacing:.025em}.text-\[\#D32F2F\]{--tw-text-opacity:1;color:rgb(211 47 47/var(--tw-text-opacity))}.text-main-10{--tw-text-opacity:1;color:rgb(143 143 143/var(--tw-text-opacity))}.text-main-100{--tw-text-opacity:1;color:rgb(17 17 17/var(--tw-text-opacity))}.text-main-70{--tw-text-opacity:1;color:rgb(45 45 45/var(--tw-text-opacity))}.text-secondary-10{--tw-text-opacity:1;color:rgb(209 209 209/var(--tw-text-opacity))}.text-secondary-100{--tw-text-opacity:1;color:rgb(249 249 249/var(--tw-text-opacity))}.text-secondary-30{--tw-text-opacity:1;color:rgb(228 228 228/var(--tw-text-opacity))}.text-secondary-70{--tw-text-opacity:1;color:rgb(189 189 189/var(--tw-text-opacity))}.underline{text-decoration-line:underline}.opacity-0{opacity:0}.opacity-50{opacity:.5}.shadow-\[0px_2px_8px_rgba\(68\2c 68\2c 68\2c 0\.1\)\]{--tw-shadow:0px 2px 8px rgba(68,68,68,.1);--tw-shadow-colored:0px 2px 8px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.brightness-\[0\.4\]{--tw-brightness:brightness(0.4)}.brightness-\[0\.4\],.brightness-\[1\.4\]{filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.brightness-\[1\.4\]{--tw-brightness:brightness(1.4)}.grayscale{--tw-grayscale:grayscale(100%)}.grayscale,.invert{filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.invert{--tw-invert:invert(100%)}.filter{filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.backdrop-blur-sm{--tw-backdrop-blur:blur(4px)}.backdrop-blur-sm,.backdrop-brightness-75{-webkit-backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia);backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia)}.backdrop-brightness-75{--tw-backdrop-brightness:brightness(.75)}.transition-all{transition-duration:.15s;transition-property:all;transition-timing-function:cubic-bezier(.4,0,.2,1)}.duration-1000{transition-duration:1s}.duration-300{transition-duration:.3s}.duration-500{transition-duration:.5s}.ease-linear{transition-timing-function:linear}.after\:h-1:after{content:var(--tw-content);height:.25rem}.after\:h-1\.5:after{content:var(--tw-content);height:.375rem}.after\:w-full:after{content:var(--tw-content);width:100%}.after\:rounded-sm:after{border-radius:.125rem;content:var(--tw-content)}.after\:bg-main-10:after{--tw-bg-opacity:1;background-color:rgb(143 143 143/var(--tw-bg-opacity));content:var(--tw-content)}.after\:bg-secondary-100:after{--tw-bg-opacity:1;background-color:rgb(249 249 249/var(--tw-bg-opacity));content:var(--tw-content)}.after\:content-\[\'\'\]:after{--tw-content:"";content:var(--tw-content)}.even\:flex-row-reverse:nth-child(2n){flex-direction:row-reverse}.hover\:border-secondary-100:hover{--tw-border-opacity:1;border-color:rgb(249 249 249/var(--tw-border-opacity))}.hover\:bg-main-100:hover{--tw-bg-opacity:1;background-color:rgb(17 17 17/var(--tw-bg-opacity))}.hover\:bg-main-70:hover{--tw-bg-opacity:1;background-color:rgb(45 45 45/var(--tw-bg-opacity))}.hover\:bg-secondary-100:hover{--tw-bg-opacity:1;background-color:rgb(249 249 249/var(--tw-bg-opacity))}.hover\:bg-secondary-30:hover{--tw-bg-opacity:1;background-color:rgb(228 228 228/var(--tw-bg-opacity))}.hover\:text-main-10:hover{--tw-text-opacity:1;color:rgb(143 143 143/var(--tw-text-opacity))}.hover\:text-secondary-10:hover{--tw-text-opacity:1;color:rgb(209 209 209/var(--tw-text-opacity))}.hover\:text-secondary-100:hover{--tw-text-opacity:1;color:rgb(249 249 249/var(--tw-text-opacity))}.hover\:text-secondary-70:hover{--tw-text-opacity:1;color:rgb(189 189 189/var(--tw-text-opacity))}.hover\:shadow-\[0px_2px_14px_rgba\(68\2c 68\2c 68\2c 0\.25\)\]:hover{--tw-shadow:0px 2px 14px rgba(68,68,68,.25);--tw-shadow-colored:0px 2px 14px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.hover\:brightness-100:hover{--tw-brightness:brightness(1)}.hover\:brightness-100:hover,.hover\:brightness-75:hover{filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.hover\:brightness-75:hover{--tw-brightness:brightness(.75)}.disabled\:bg-main-70:disabled{--tw-bg-opacity:1;background-color:rgb(45 45 45/var(--tw-bg-opacity))}.disabled\:opacity-30:disabled{opacity:.3}.group:hover .group-hover\:h-full{height:100%}.group:hover .group-hover\:scale-\[1\.05\]{--tw-scale-x:1.05;--tw-scale-y:1.05;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.group:hover .group-hover\:border-main-10{--tw-border-opacity:1;border-color:rgb(143 143 143/var(--tw-border-opacity))}@media (prefers-color-scheme:dark){.dark\:text-secondary-10{--tw-text-opacity:1;color:rgb(209 209 209/var(--tw-text-opacity))}}@media (min-width:640px){.sm\:mb-12{margin-bottom:3rem}.sm\:mb-5{margin-bottom:1.25rem}.sm\:block{display:block}.sm\:flex{display:flex}.sm\:hidden{display:none}.sm\:h-\[900px\]{height:900px}.sm\:w-64{width:16rem}.sm\:w-auto{width:auto}.sm\:w-max{width:-moz-max-content;width:max-content}.sm\:shrink-0{flex-shrink:0}.sm\:basis-5\/6{flex-basis:83.333333%}.sm\:basis-52{flex-basis:13rem}.sm\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.sm\:flex-row{flex-direction:row}.sm\:items-center{align-items:center}.sm\:justify-start{justify-content:flex-start}.sm\:justify-end{justify-content:flex-end}.sm\:justify-between{justify-content:space-between}.sm\:gap-0{gap:0}.sm\:gap-5{gap:1.25rem}.sm\:gap-x-10{-moz-column-gap:2.5rem;column-gap:2.5rem}.sm\:px-12{padding-left:3rem;padding-right:3rem}.sm\:px-5{padding-left:1.25rem;padding-right:1.25rem}.sm\:px-8{padding-left:2rem;padding-right:2rem}.sm\:py-10{padding-bottom:2.5rem;padding-top:2.5rem}.sm\:pb-14{padding-bottom:3.5rem}.sm\:pt-16{padding-top:4rem}.sm\:text-end{text-align:end}.sm\:text-3xl{font-size:1.875rem;line-height:2.25rem}.sm\:text-4xl{font-size:2.25rem;line-height:2.5rem}.sm\:text-\[148px\]{font-size:148px}.sm\:text-base{font-size:1rem;line-height:1.5rem}.sm\:text-lg{font-size:1.125rem;line-height:1.75rem}.sm\:last\:hidden:last-child{display:none}}@media (min-width:768px){.md\:mx-3{margin-left:.75rem;margin-right:.75rem}.md\:mb-12{margin-bottom:3rem}.md\:block{display:block}.md\:flex{display:flex}.md\:hidden{display:none}.md\:h-16{height:4rem}.md\:h-48{height:12rem}.md\:h-\[750px\]{height:750px}.md\:w-16{width:4rem}.md\:w-48{width:12rem}.md\:w-\[256px\]{width:256px}.md\:max-w-\[528px\]{max-width:528px}.md\:basis-4\/6{flex-basis:66.666667%}.md\:flex-row{flex-direction:row}.md\:items-start{align-items:flex-start}.md\:justify-start{justify-content:flex-start}.md\:justify-between{justify-content:space-between}.md\:gap-14{gap:3.5rem}.md\:gap-28{gap:7rem}.md\:gap-5{gap:1.25rem}.md\:gap-8{gap:2rem}.md\:gap-y-14{row-gap:3.5rem}.md\:gap-y-5{row-gap:1.25rem}.md\:p-12{padding:3rem}.md\:\!px-0{padding-left:0!important;padding-right:0!important}.md\:px-20{padding-left:5rem;padding-right:5rem}.md\:px-3{padding-left:.75rem;padding-right:.75rem}.md\:px-6{padding-left:1.5rem;padding-right:1.5rem}.md\:py-16{padding-bottom:4rem;padding-top:4rem}.md\:py-8{padding-bottom:2rem;padding-top:2rem}.md\:pt-0{padding-top:0}.md\:text-4xl{font-size:2.25rem;line-height:2.5rem}.md\:text-\[100px\]{font-size:100px}.md\:text-lg{font-size:1.125rem;line-height:1.75rem}.md\:text-xl{font-size:1.25rem;line-height:1.75rem}}@media (min-width:1024px){.lg\:order-none{order:0}.lg\:mr-28{margin-right:7rem}.lg\:block{display:block}.lg\:h-99{height:396px}.lg\:h-full{height:100%}.lg\:min-h-\[396px\]{min-height:396px}.lg\:w-1\/2{width:50%}.lg\:w-72{width:18rem}.lg\:w-80{width:20rem}.lg\:w-full{width:100%}.lg\:w-max{width:-moz-max-content;width:max-content}.lg\:max-w-\[222px\]{max-width:222px}.lg\:basis-1\/2{flex-basis:50%}.lg\:basis-\[410px\]{flex-basis:410px}.lg\:flex-row{flex-direction:row}.lg\:justify-start{justify-content:flex-start}.lg\:justify-end{justify-content:flex-end}.lg\:gap-10{gap:2.5rem}.lg\:gap-16{gap:4rem}.lg\:gap-28{gap:7rem}.lg\:gap-\[48px\]{gap:48px}.lg\:gap-x-12{-moz-column-gap:3rem;column-gap:3rem}.lg\:\!px-0{padding-left:0!important;padding-right:0!important}.lg\:\!px-20{padding-left:5rem!important;padding-right:5rem!important}.lg\:px-10{padding-left:2.5rem;padding-right:2.5rem}.lg\:px-8{padding-left:2rem;padding-right:2rem}.lg\:py-0{padding-bottom:0;padding-top:0}.lg\:py-5{padding-bottom:1.25rem;padding-top:1.25rem}.lg\:text-start{text-align:start}.lg\:text-3xl{font-size:1.875rem;line-height:2.25rem}.lg\:text-4xl{font-size:2.25rem;line-height:2.5rem}.lg\:last\:flex:last-child{display:flex}}@media (min-width:1280px){.xl\:w-\[256px\]{width:256px}.xl\:basis-2\/5{flex-basis:40%}}@media (min-width:1900px){.\33xl\:w-\[400px\]{width:400px}.\33xl\:basis-1\/3{flex-basis:33.333333%}}@media (min-width:2200px){.\34xl\:basis-1\/4{flex-basis:25%}}@font-face{font-display:swap;font-family:Rubik Glitch;font-style:normal;font-weight:400;src:url(/static/rubik-glitch-cyrillic-ext-400-normal-caa98a3bc11105fffcfef482abfb2c37.woff2) format("woff2"),url(/static/rubik-glitch-cyrillic-ext-400-normal-54f97c66997053ace86c1d9f1bdef3fd.woff) format("woff");unicode-range:u+0460-052f,u+1c80-1c88,u+20b4,u+2de0-2dff,u+a640-a69f,u+fe2e-fe2f}@font-face{font-display:swap;font-family:Rubik Glitch;font-style:normal;font-weight:400;src:url(/static/rubik-glitch-cyrillic-400-normal-b32f20a71003e8bb78b28eec73c0385b.woff2) format("woff2"),url(/static/rubik-glitch-cyrillic-400-normal-3fd27e06a8bdf8edbd455443d0854c3f.woff) format("woff");unicode-range:u+0301,u+0400-045f,u+0490-0491,u+04b0-04b1,u+2116}@font-face{font-display:swap;font-family:Rubik Glitch;font-style:normal;font-weight:400;src:url(/static/rubik-glitch-hebrew-400-normal-776cad11325d90d9061faad0b7107953.woff2) format("woff2"),url(/static/rubik-glitch-hebrew-400-normal-c8cefe9973692c5d21bdd5bb11616cc4.woff) format("woff");unicode-range:u+0590-05ff,u+200c-2010,u+20aa,u+25cc,u+fb1d-fb4f}@font-face{font-display:swap;font-family:Rubik Glitch;font-style:normal;font-weight:400;src:url(/static/rubik-glitch-latin-ext-400-normal-8ae808a02973fec508af9c0959fbbade.woff2) format("woff2"),url(/static/rubik-glitch-latin-ext-400-normal-16c59f7d884842f113e8ff185c8656c9.woff) format("woff");unicode-range:u+0100-02af,u+0304,u+0308,u+0329,u+1e00-1e9f,u+1ef2-1eff,u+2020,u+20a0-20ab,u+20ad-20c0,u+2113,u+2c60-2c7f,u+a720-a7ff}@font-face{font-display:swap;font-family:Rubik Glitch;font-style:normal;font-weight:400;src:url(/static/rubik-glitch-latin-400-normal-7a5b5bac6b066d71b0cae06ed087b905.woff2) format("woff2"),url(/static/rubik-glitch-latin-400-normal-3fb89918ce49908f5350076807cf1bef.woff) format("woff");unicode-range:u+00??,u+0131,u+0152-0153,u+02bb-02bc,u+02c6,u+02da,u+02dc,u+0304,u+0308,u+0329,u+2000-206f,u+2074,u+20ac,u+2122,u+2191,u+2193,u+2212,u+2215,u+feff,u+fffd}@font-face{font-display:swap;font-family:Montserrat Variable;font-style:normal;font-weight:100 900;src:url(/static/montserrat-cyrillic-ext-wght-normal-e84e812b71d18e04e6928fb272665c53.woff2) format("woff2-variations");unicode-range:u+0460-052f,u+1c80-1c88,u+20b4,u+2de0-2dff,u+a640-a69f,u+fe2e-fe2f}@font-face{font-display:swap;font-family:Montserrat Variable;font-style:normal;font-weight:100 900;src:url(/static/montserrat-cyrillic-wght-normal-eb1783eb42487132539645641f761eb2.woff2) format("woff2-variations");unicode-range:u+0301,u+0400-045f,u+0490-0491,u+04b0-04b1,u+2116}@font-face{font-display:swap;font-family:Montserrat Variable;font-style:normal;font-weight:100 900;src:url(data:font/woff2;base64,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) format("woff2-variations");unicode-range:u+0102-0103,u+0110-0111,u+0128-0129,u+0168-0169,u+01a0-01a1,u+01af-01b0,u+0300-0301,u+0303-0304,u+0308-0309,u+0323,u+0329,u+1ea0-1ef9,u+20ab}@font-face{font-display:swap;font-family:Montserrat Variable;font-style:normal;font-weight:100 900;src:url(/static/montserrat-latin-ext-wght-normal-82d636d9375dd92118fd22c818a99c24.woff2) format("woff2-variations");unicode-range:u+0100-02af,u+0304,u+0308,u+0329,u+1e00-1e9f,u+1ef2-1eff,u+2020,u+20a0-20ab,u+20ad-20c0,u+2113,u+2c60-2c7f,u+a720-a7ff}@font-face{font-display:swap;font-family:Montserrat Variable;font-style:normal;font-weight:100 900;src:url(/static/montserrat-latin-wght-normal-5028c63f6a70ab0cf7cba9015ae04154.woff2) format("woff2-variations");unicode-range:u+00??,u+0131,u+0152-0153,u+02bb-02bc,u+02c6,u+02da,u+02dc,u+0304,u+0308,u+0329,u+2000-206f,u+2074,u+20ac,u+2122,u+2191,u+2193,u+2212,u+2215,u+feff,u+fffd}code[class*=language-],pre[class*=language-]{word-wrap:normal;background:none;color:#ccc;font-family:Consolas,Monaco,Andale Mono,Ubuntu Mono,monospace;font-size:1em;-webkit-hyphens:none;-moz-hyphens:none;-ms-hyphens:none;hyphens:none;line-height:1.5;-moz-tab-size:4;-o-tab-size:4;tab-size:4;text-align:left;white-space:pre;word-break:normal;word-spacing:normal}pre[class*=language-]{margin:.5em 0;overflow:auto;padding:1em}:not(pre)>code[class*=language-],pre[class*=language-]{background:#2d2d2d}:not(pre)>code[class*=language-]{border-radius:.3em;padding:.1em;white-space:normal}.token.block-comment,.token.cdata,.token.comment,.token.doctype,.token.prolog{color:#999}.token.punctuation{color:#ccc}.token.attr-name,.token.deleted,.token.namespace,.token.tag{color:#e2777a}.token.function-name{color:#6196cc}.token.boolean,.token.function,.token.number{color:#f08d49}.token.class-name,.token.constant,.token.property,.token.symbol{color:#f8c555}.token.atrule,.token.builtin,.token.important,.token.keyword,.token.selector{color:#cc99cd}.token.attr-value,.token.char,.token.regex,.token.string,.token.variable{color:#7ec699}.token.entity,.token.operator,.token.url{color:#67cdcc}.token.bold,.token.important{font-weight:700}.token.italic{font-style:italic}.token.entity{cursor:help}.token.inserted{color:green}*{border:0;margin:0;padding:0}*,:after,:before{-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box}:active,:focus,a:active,a:focus{outline:none}aside,footer,header,nav{display:block}body,html{-ms-text-size-adjust:100%;-moz-text-size-adjust:100%;-webkit-text-size-adjust:100%;font-size:100%;font-size:14px;line-height:1;min-height:100vh}button,input,textarea{font-family:inherit}input::-ms-clear{display:none}button{cursor:pointer}button::-moz-focus-inner{border:0;padding:0}a,a:hover,a:visited{text-decoration:none}ul li{list-style:none}img{vertical-align:top}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:400}*{font-family:Montserrat Variable,Helvetica,Arial,sans-serif}input:-webkit-autofill,input:-webkit-autofill:active,input:-webkit-autofill:focus,input:-webkit-autofill:hover{-webkit-text-fill-color:#f9f9f9;-webkit-background-clip:text;box-shadow:inset 0 0 20px 20px #fa070700;-webkit-transition:background-color 5000s ease-in-out 0s;transition:background-color 5000s ease-in-out 0s}#contact-form input:-webkit-autofill,#contact-form input:-webkit-autofill:active,#contact-form input:-webkit-autofill:focus,#contact-form input:-webkit-autofill:hover{-webkit-text-fill-color:#111}@media (min-width:640px){.banner-title{line-height:1.5!important}}.banner-title{font-family:Montserrat Variable,Helvetica,Arial,sans-serif;b{display:block;font-weight:700}}.rubik-font{font-family:Rubik Glitch,Helvetica,Arial,sans-serif}@media screen and (max-width:640px){div#hubspot-messages-iframe-container{display:none!important}}#hubspot-messages-iframe-container{z-index:200!important}#hs-banner-parent{--hs-banner-font-family:"Montserrat Variable",Helvetica,Arial,sans-serif!important;--hs-banner-inset:auto 0px 10px 10px!important;--hs-banner-translate-x:0!important}#hs-eu-cookie-settings-button{font-weight:400!important;text-decoration:none!important}#hs-eu-cookie-confirmation{max-width:calc(100% - 20px)!important}div.privacy-policy h1{font-size:1.875rem;font-weight:600;line-height:2.25rem;text-align:center;width:100%}div.privacy-policy h2{font-size:1.5rem;font-weight:600;line-height:2rem;padding-top:1rem}div.privacy-policy h3{font-size:1.25rem;font-weight:600;line-height:1.75rem;padding-top:1rem}div.privacy-policy h4{font-weight:600;padding-top:.5rem}div.privacy-policy ul li{list-style-position:inside;list-style-type:disc;padding-top:1rem}div.privacy-policy ul li>h3{display:inline;font-weight:500;padding-top:0}div.privacy-policy a{text-decoration-line:underline}article.single-post{font-size:1rem;line-height:1.5rem}@media (min-width:640px){article.single-post{font-size:1.125rem;line-height:1.75rem}}article.single-post :is(h2,h3,h4){--tw-text-opacity:1;color:rgb(249 249 249/var(--tw-text-opacity));font-size:1.125rem;font-weight:700;line-height:1.75rem;margin-bottom:.625rem;margin-top:2rem}@media (min-width:640px){article.single-post :is(h2,h3,h4){font-size:1.25rem;line-height:1.75rem}}article.single-post h4{margin-top:1rem}article.single-post p{margin-bottom:1rem}@media (min-width:640px){article.single-post p{margin-bottom:2rem}}article.single-post span.gatsby-resp-image-wrapper{border-radius:20px!important;margin-bottom:1rem!important;margin-left:auto!important;margin-right:auto!important;max-width:444px!important;width:100%!important}@media (min-width:640px){article.single-post span.gatsby-resp-image-wrapper{margin-bottom:1.25rem!important}}article.single-post img{--tw-shadow:0 0 #0000!important;--tw-shadow-colored:0 0 #0000!important;border-radius:20px!important;box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)!important}article.single-post figcaption.gatsby-resp-image-figcaption,article.single-post span.gatsby-resp-image-wrapper+em{display:block;font-size:.875rem!important;font-style:normal;line-height:1.25rem!important;text-align:center!important;width:100%}article.single-post :is(ul,ol){margin-bottom:1rem;margin-top:1rem}@media (min-width:640px){article.single-post :is(ul,ol){margin-bottom:2rem;margin-top:2rem}}article.single-post ul li{list-style-position:inside;list-style-type:disc}article.single-post ol li{list-style-position:inside;list-style-type:decimal}article.single-post pre{--tw-bg-opacity:1;background-color:rgb(45 45 45/var(--tw-bg-opacity));border-radius:20px;font-size:.875rem;line-height:1.25rem;margin-bottom:1rem;margin-top:1rem;padding:1rem;white-space:pre-wrap}@media (min-width:640px){article.single-post pre{font-size:1rem;line-height:1.5rem;margin-bottom:2rem;margin-top:2rem;padding:2rem}}article.single-post pre code{white-space:pre-wrap}.gradient-border{-o-border-image:linear-gradient(90deg,#bdbdbd,#111) 30;border-image:linear-gradient(90deg,#bdbdbd,#111) 30}div.team-member:hover div.line{width:100%}div.applied-tech:hover div.line{height:100%}div.review-body p{padding-top:.5rem}div.review-body p:first-child{padding-top:0}div.workflow-step:nth-child(odd) div.cover{right:-.5rem}div.workflow-step:nth-child(2n) div.cover{left:-.5rem}div.why-us-card p{text-align:justify}div.contact-form-description span{display:block;padding-bottom:.5rem;padding-top:.5rem}div.contact-form-description strong{font-weight:600}ul.MuiMenu-list{--tw-bg-opacity:1;background-color:rgb(249 249 249/var(--tw-bg-opacity))}div.project-solution :is(ul,ol){margin-bottom:1rem;margin-top:1rem}@media (min-width:640px){div.project-solution :is(ul,ol){margin-bottom:1rem;margin-top:1rem}}div.project-solution ul li{list-style-type:disc}div.project-solution ol li,div.project-solution ul li{list-style-position:inside;margin-bottom:1rem;margin-top:1rem}div.project-solution ol li{list-style-type:decimal}div.project-solution p:has(+ol),div.project-solution p:has(+ul){margin-bottom:1rem;margin-top:1rem}div.project-solution p{margin-bottom:1rem}.yarl__fullsize{height:100%;width:100%}.yarl__relative{position:relative}.yarl__portal{bottom:0;left:0;opacity:0;overflow:hidden;position:fixed;right:0;top:0;transition:opacity var(--yarl__fade_animation_duration,.25s) var(--yarl__fade_animation_timing_function,ease);z-index:var(--yarl__portal_zindex,9999)}.yarl__portal_open{opacity:1}.yarl__container{background-color:var(--yarl__container_background_color,var(--yarl__color_backdrop,#000));bottom:0;left:0;outline:none;overflow:hidden;overscroll-behavior:var(--yarl__controller_overscroll_behavior,contain);position:absolute;right:0;top:0;touch-action:var(--yarl__controller_touch_action,none);-webkit-user-select:none;-moz-user-select:none;user-select:none}.yarl__carousel{align-content:center;align-items:stretch;display:flex;flex:0 0 auto;height:100%;justify-content:center;opacity:var(--yarl__pull_opacity,1);transform:translate(var(--yarl__swipe_offset,0),var(--yarl__pull_offset,0));width:calc(100% + (var(--yarl__carousel_slides_count) - 1)*(100% + var(--yarl__carousel_spacing_px, 0)*1px + var(--yarl__carousel_spacing_percent, 0)*1%))}.yarl__carousel_with_slides{-moz-column-gap:calc(var(--yarl__carousel_spacing_px, 0)*1px + 100/(var(--yarl__carousel_slides_count)*100 + (var(--yarl__carousel_slides_count) - 1)*var(--yarl__carousel_spacing_percent, 0))*var(--yarl__carousel_spacing_percent, 0)*1%);column-gap:calc(var(--yarl__carousel_spacing_px, 0)*1px + 100/(var(--yarl__carousel_slides_count)*100 + (var(--yarl__carousel_slides_count) - 1)*var(--yarl__carousel_spacing_percent, 0))*var(--yarl__carousel_spacing_percent, 0)*1%)}.yarl__flex_center{align-content:center;align-items:center;display:flex;justify-content:center}.yarl__slide{flex:1;overflow:hidden;padding:calc(var(--yarl__carousel_padding_px, 0)*1px + 100/(var(--yarl__carousel_slides_count)*100 + (var(--yarl__carousel_slides_count) - 1)*var(--yarl__carousel_spacing_percent, 0))*var(--yarl__carousel_padding_percent, 0)*1%);position:relative}[dir=rtl] .yarl__slide{--yarl__direction:-1}.yarl__slide_image{-webkit-touch-callout:none;max-height:100%;max-width:100%;-o-object-fit:contain;object-fit:contain;touch-action:var(--yarl__controller_touch_action,none);-moz-user-select:none;user-select:none;-webkit-user-select:none}.yarl__slide_image_cover{height:100%;-o-object-fit:cover;object-fit:cover;width:100%}.yarl__slide_image_loading{opacity:0}@media screen and (min-width:800px){.yarl__slide_wrapper:not(.yarl__slide_wrapper_interactive) .yarl__slide_image{-webkit-backface-visibility:hidden;-webkit-transform:translateZ(0);-webkit-transform-style:preserve-3d}}.yarl__slide_placeholder{left:50%;line-height:0;position:absolute;top:50%;transform:translateX(-50%) translateY(-50%)}.yarl__slide_loading{animation:yarl__delayed_fadein 1s linear;color:var(--yarl__slide_icon_loading_color,var(--yarl__color_button,hsla(0,0%,100%,.8)))}.yarl__slide_loading line{animation:yarl__stroke_opacity 1s linear infinite}.yarl__slide_loading line:first-of-type{animation-delay:-1.875s}.yarl__slide_loading line:nth-of-type(2){animation-delay:-1.75s}.yarl__slide_loading line:nth-of-type(3){animation-delay:-1.625s}.yarl__slide_loading line:nth-of-type(4){animation-delay:-1.5s}.yarl__slide_loading line:nth-of-type(5){animation-delay:-1.375s}.yarl__slide_loading line:nth-of-type(6){animation-delay:-1.25s}.yarl__slide_loading line:nth-of-type(7){animation-delay:-1.125s}.yarl__slide_loading line:nth-of-type(8){animation-delay:-1s}.yarl__slide_error{color:var(--yarl__slide_icon_error_color,red);height:var(--yarl__slide_icon_error_size,48px);width:var(--yarl__slide_icon_error_size,48px)}@media (prefers-reduced-motion){.yarl__portal,.yarl__slide{transition:unset}.yarl__slide_loading,.yarl__slide_loading line{animation:unset}}.yarl__toolbar{bottom:auto;display:flex;justify-content:flex-end;left:auto;padding:var(--yarl__toolbar_padding,8px);position:absolute;right:0;top:0}[dir=rtl] .yarl__toolbar{bottom:auto;left:0;right:auto;top:0}.yarl__icon{height:var(--yarl__icon_size,32px);width:var(--yarl__icon_size,32px)}.yarl__button{-webkit-tap-highlight-color:transparent;-webkit-appearance:none;-moz-appearance:none;appearance:none;background-color:var(--yarl__button_background_color,transparent);border:var(--yarl__button_border,0);color:var(--yarl__color_button,hsla(0,0%,100%,.8));cursor:pointer;filter:var(--yarl__button_filter,drop-shadow(2px 2px 2px rgba(0,0,0,.8)));line-height:0;margin:var(--yarl__button_margin,0);outline:none;padding:var(--yarl__button_padding,8px)}.yarl__button:focus{color:var(--yarl__color_button_active,#fff)}.yarl__button:focus:not(:focus-visible){color:var(--yarl__color_button,hsla(0,0%,100%,.8))}.yarl__button:focus-visible{color:var(--yarl__color_button_active,#fff)}@media (hover:hover){.yarl__button:focus-visible:hover,.yarl__button:focus:hover,.yarl__button:hover{color:var(--yarl__color_button_active,#fff)}}.yarl__button:disabled{color:var(--yarl__color_button_disabled,hsla(0,0%,100%,.4));cursor:default}.yarl__navigation_next,.yarl__navigation_prev{padding:var(--yarl__navigation_button_padding,24px 16px);position:absolute;top:50%;transform:translateY(-50%)}.yarl__navigation_prev{left:0}[dir=rtl] .yarl__navigation_prev{left:unset;right:0;transform:translateY(-50%) rotate(180deg)}.yarl__navigation_next{right:0}[dir=rtl] .yarl__navigation_next{left:0;right:unset;transform:translateY(-50%) rotate(180deg)}.yarl__no_scroll{height:100%;overflow:hidden;overscroll-behavior:none}@keyframes yarl__delayed_fadein{0%{opacity:0}80%{opacity:0}to{opacity:1}}@keyframes yarl__stroke_opacity{0%{stroke-opacity:1}to{stroke-opacity:.125}}.yarl__slide_captions_container{background:var(--yarl__slide_captions_container_background,rgba(0,0,0,.5));left:var(--yarl__slide_captions_container_left,0);padding:var(--yarl__slide_captions_container_padding,16px);position:absolute;right:var(--yarl__slide_captions_container_right,0);-webkit-transform:translateZ(0)}.yarl__slide_title{color:var(--yarl__slide_title_color,#fff);font-size:var(--yarl__slide_title_font_size,125%);font-weight:var(--yarl__slide_title_font_weight,bolder);max-width:calc(100% - var(--yarl__toolbar_width, 0px));overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.yarl__slide_title_container{top:var(--yarl__slide_title_container_top,0)}.yarl__slide_description{-webkit-box-orient:vertical;-webkit-line-clamp:var(--yarl__slide_description_max_lines,3);color:var(--yarl__slide_description_color,#fff);display:-webkit-box;-webkit-hyphens:auto;hyphens:auto;overflow:hidden;text-align:var(--yarl__slide_description_text_align,start)}.yarl__slide_description_container{bottom:var(--yarl__slide_description_container_bottom,0)}.yarl__thumbnails{display:flex;height:100%}.yarl__thumbnails_bottom,.yarl__thumbnails_end .yarl__thumbnails_track,.yarl__thumbnails_start .yarl__thumbnails_track,.yarl__thumbnails_top{flex-direction:column}.yarl__thumbnails_wrapper{flex:1;position:relative}.yarl__thumbnails_container{-webkit-touch-callout:none;background-color:var(--yarl__thumbnails_container_background_color,var(--yarl__color_backdrop,#000));flex:0 0 auto;overflow:hidden;padding:var(--yarl__thumbnails_container_padding,16px);position:relative;-webkit-user-select:none;-moz-user-select:none;user-select:none}.yarl__thumbnails_vignette{--yarl__thumbnails_vignette_size:12%;pointer-events:none;position:absolute}@media (min-width:1200px){.yarl__thumbnails_vignette{--yarl__thumbnails_vignette_size:8%}}@media (min-width:2000px){.yarl__thumbnails_vignette{--yarl__thumbnails_vignette_size:5%}}.yarl__thumbnails_bottom .yarl__thumbnails_vignette,.yarl__thumbnails_top .yarl__thumbnails_vignette{background:linear-gradient(to right,var(--yarl__color_backdrop,#000) 0,transparent var(--yarl__thumbnails_vignette_size,12%) calc(100% - var(--yarl__thumbnails_vignette_size, 12%)),var(--yarl__color_backdrop,#000) 100%);height:100%;left:0;right:0}.yarl__thumbnails_end .yarl__thumbnails_vignette,.yarl__thumbnails_start .yarl__thumbnails_vignette{background:linear-gradient(to bottom,var(--yarl__color_backdrop,#000) 0,transparent var(--yarl__thumbnails_vignette_size,12%) calc(100% - var(--yarl__thumbnails_vignette_size, 12%)),var(--yarl__color_backdrop,#000) 100%);bottom:0;top:0;width:100%}.yarl__thumbnails_track{gap:var(--yarl__thumbnails_thumbnail_gap,16px);outline:none}.yarl__thumbnails_thumbnail{-webkit-tap-highlight-color:transparent;-webkit-appearance:none;-moz-appearance:none;appearance:none;background:var(--yarl__thumbnails_thumbnail_background,#000);border-color:var(--yarl__thumbnails_thumbnail_border_color,var(--yarl__color_button,hsla(0,0%,100%,.8)));border-radius:var(--yarl__thumbnails_thumbnail_border_radius,4px);border-style:var(--yarl__thumbnails_thumbnail_border_style,solid);border-width:var(--yarl__thumbnails_thumbnail_border,1px);box-sizing:content-box;cursor:pointer;flex:0 0 auto;height:var(--yarl__thumbnails_thumbnail_height,80px);outline:none;overflow:hidden;padding:var(--yarl__thumbnails_thumbnail_padding,4px);position:relative;width:var(--yarl__thumbnails_thumbnail_width,120px)}.yarl__thumbnails_thumbnail_active{border-color:var(--yarl__thumbnails_thumbnail_active_border_color,var(--yarl__color_button_active,#fff))}.yarl__thumbnails_thumbnail_fadein{animation:yarl__thumbnails_thumbnail_fadein var(--yarl__thumbnails_thumbnail_fadein_duration,.5s) ease-in-out var(--yarl__thumbnails_thumbnail_fadein_delay,0s) forwards;opacity:0}.yarl__thumbnails_thumbnail_fadeout{animation:yarl__thumbnails_thumbnail_fadeout var(--yarl__thumbnails_thumbnail_fadeout_duration,.5s) ease-in-out var(--yarl__thumbnails_thumbnail_fadeout_delay,0s) forwards;cursor:unset}.yarl__thumbnails_thumbnail_placeholder{cursor:unset;visibility:hidden}.yarl__thumbnails_thumbnail:focus{box-shadow:var(--yarl__thumbnails_thumbnail_focus_box_shadow,#000 0 0 0 2px,var(--yarl__color_button,hsla(0,0%,100%,.8)) 0 0 0 4px)}.yarl__thumbnails_thumbnail:focus:not(:focus-visible){box-shadow:unset}.yarl__thumbnails_thumbnail:focus-visible{box-shadow:var(--yarl__thumbnails_thumbnail_focus_box_shadow,#000 0 0 0 2px,var(--yarl__color_button,hsla(0,0%,100%,.8)) 0 0 0 4px)}.yarl__thumbnails_thumbnail_icon{color:var(--yarl__thumbnails_thumbnail_icon_color,var(--yarl__color_button,hsla(0,0%,100%,.8)));filter:var(--yarl__thumbnails_thumbnail_icon_filter,drop-shadow(2px 2px 2px rgba(0,0,0,.8)));height:var(--yarl__thumbnails_thumbnail_icon_size,32px);left:50%;position:absolute;top:50%;transform:translateX(-50%) translateY(-50%);width:var(--yarl__thumbnails_thumbnail_icon_size,32px)}@keyframes yarl__thumbnails_thumbnail_fadein{0%{opacity:0}to{opacity:1}}@keyframes yarl__thumbnails_thumbnail_fadeout{0%{opacity:1}to{opacity:0}}404

404

Nothing to see here, page is under construction

But our blog is always there for you

CONTACTS

EIN: 35-2654711, Company Code: 7296176

8 The Green STE B

Dover, DE 19901-3618, United States

+1 302 364 0193

Privacy PolicyCookie Policy

Leave your contact to get our portfolio

- \ No newline at end of file + \ No newline at end of file diff --git a/404/index.html b/404/index.html index e6b29350..cc0caf40 100644 --- a/404/index.html +++ b/404/index.html @@ -2,10 +2,10 @@ window.hsConversationsSettings = { loadImmediately: false }; 404

404

Nothing to see here, page is under construction

But our blog is always there for you

CONTACTS

EIN: 35-2654711, Company Code: 7296176

8 The Green STE B

Dover, DE 19901-3618, United States

+1 302 364 0193

Privacy PolicyCookie Policy

Leave your contact to get our portfolio

+*/*,:after,:before{border:0 solid}:after,:before{--tw-content:""}html{-webkit-text-size-adjust:100%;font-feature-settings:normal;font-family:ui-sans-serif,system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica Neue,Arial,Noto Sans,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol,Noto Color Emoji;font-variation-settings:normal;line-height:1.5;-moz-tab-size:4;-o-tab-size:4;tab-size:4}body{line-height:inherit;margin:0}hr{border-top-width:1px;color:inherit;height:0}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-weight:inherit}a{color:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,pre,samp{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace;font-size:1em}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}table{border-collapse:collapse;border-color:inherit;text-indent:0}button,input,optgroup,select,textarea{color:inherit;font-family:inherit;font-size:100%;font-weight:inherit;line-height:inherit;margin:0;padding:0}button,select{text-transform:none}[type=button],[type=reset],[type=submit],button{-webkit-appearance:button;background-color:transparent;background-image:none}:-moz-focusring{outline:auto}:-moz-ui-invalid{box-shadow:none}progress{vertical-align:baseline}::-webkit-inner-spin-button,::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}summary{display:list-item}blockquote,dd,dl,figure,h1,h2,h3,h4,h5,h6,hr,p,pre{margin:0}fieldset{margin:0}fieldset,legend{padding:0}menu,ol,ul{list-style:none;margin:0;padding:0}textarea{resize:vertical}input::-moz-placeholder,textarea::-moz-placeholder{color:#9ca3af;opacity:1}input::placeholder,textarea::placeholder{color:#9ca3af;opacity:1}[role=button],button{cursor:pointer}:disabled{cursor:default}audio,canvas,embed,iframe,img,object,svg,video{display:block;vertical-align:middle}img,video{height:auto;max-width:100%}[hidden]{display:none}*,:after,:before{--tw-border-spacing-x:0;--tw-border-spacing-y:0;--tw-translate-x:0;--tw-translate-y:0;--tw-rotate:0;--tw-skew-x:0;--tw-skew-y:0;--tw-scale-x:1;--tw-scale-y:1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness:proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-color:rgba(59,130,246,.5);--tw-ring-offset-shadow:0 0 #0000;--tw-ring-shadow:0 0 #0000;--tw-shadow:0 0 #0000;--tw-shadow-colored:0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: }::backdrop{--tw-border-spacing-x:0;--tw-border-spacing-y:0;--tw-translate-x:0;--tw-translate-y:0;--tw-rotate:0;--tw-skew-x:0;--tw-skew-y:0;--tw-scale-x:1;--tw-scale-y:1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness:proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-color:rgba(59,130,246,.5);--tw-ring-offset-shadow:0 0 #0000;--tw-ring-shadow:0 0 #0000;--tw-shadow:0 0 #0000;--tw-shadow-colored:0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: }.container{width:100%}@media (min-width:640px){.container{max-width:640px}}@media (min-width:768px){.container{max-width:768px}}@media (min-width:1024px){.container{max-width:1024px}}@media (min-width:1280px){.container{max-width:1280px}}@media (min-width:1440px){.container{max-width:1440px}}@media (min-width:1900px){.container{max-width:1900px}}@media (min-width:2200px){.container{max-width:2200px}}.pointer-events-none{pointer-events:none}.invisible{visibility:hidden}.fixed{position:fixed}.absolute{position:absolute}.relative{position:relative}.sticky{position:sticky}.-bottom-1{bottom:-.25rem}.-bottom-2{bottom:-.5rem}.-left-2{left:-.5rem}.-left-5{left:-1.25rem}.-right-2{right:-.5rem}.-top-16{top:-4rem}.-top-2{top:-.5rem}.bottom-0{bottom:0}.bottom-1{bottom:.25rem}.bottom-2{bottom:.5rem}.bottom-\[5\%\]{bottom:5%}.left-0{left:0}.left-2{left:.5rem}.left-\[2\%\]{left:2%}.right-0{right:0}.top-0{top:0}.top-1\/2{top:50%}.top-full{top:100%}.z-10{z-index:10}.z-20{z-index:20}.z-50{z-index:50}.-order-1{order:-1}.float-right{float:right}.mx-0{margin-left:0;margin-right:0}.mx-1{margin-left:.25rem;margin-right:.25rem}.mx-1\.5{margin-left:.375rem;margin-right:.375rem}.mx-12{margin-left:3rem;margin-right:3rem}.mx-5{margin-left:1.25rem;margin-right:1.25rem}.mx-auto{margin-left:auto;margin-right:auto}.-ml-2{margin-left:-.5rem}.mb-2{margin-bottom:.5rem}.mb-2\.5{margin-bottom:.625rem}.mb-5{margin-bottom:1.25rem}.mb-6{margin-bottom:1.5rem}.mb-8{margin-bottom:2rem}.ml-3{margin-left:.75rem}.mr-10{margin-right:2.5rem}.mr-2{margin-right:.5rem}.mr-3{margin-right:.75rem}.mr-3\.5{margin-right:.875rem}.mt-3{margin-top:.75rem}.mt-auto{margin-top:auto}.block{display:block}.inline-block{display:inline-block}.inline{display:inline}.flex{display:flex}.inline-flex{display:inline-flex}.grid{display:grid}.hidden{display:none}.aspect-square{aspect-ratio:1/1}.h-0{height:0}.h-1{height:.25rem}.h-10{height:2.5rem}.h-12{height:3rem}.h-14{height:3.5rem}.h-16{height:4rem}.h-2\/3{height:66.666667%}.h-28{height:7rem}.h-32{height:8rem}.h-40{height:10rem}.h-7{height:1.75rem}.h-8{height:2rem}.h-91{height:22.75rem}.h-\[1000px\]{height:1000px}.h-\[30rem\]{height:30rem}.h-\[72px\]{height:72px}.h-full{height:100%}.h-max{height:-moz-max-content;height:max-content}.max-h-\[424px\]{max-height:424px}.max-h-full{max-height:100%}.min-h-0{min-height:0}.min-h-\[400px\]{min-height:400px}.min-h-full{min-height:100%}.min-h-max{min-height:-moz-max-content;min-height:max-content}.min-h-screen{min-height:100vh}.w-0{width:0}.w-1{width:.25rem}.w-10{width:2.5rem}.w-12{width:3rem}.w-14{width:3.5rem}.w-16{width:4rem}.w-2\/3{width:66.666667%}.w-28{width:7rem}.w-32{width:8rem}.w-40{width:10rem}.w-7{width:1.75rem}.w-8{width:2rem}.w-\[100\%\]{width:100%}.w-\[118px\]{width:118px}.w-\[192px\]{width:192px}.w-\[220px\]{width:220px}.w-\[72px\]{width:72px}.w-\[85\%\]{width:85%}.w-full{width:100%}.w-max{width:-moz-max-content;width:max-content}.min-w-0{min-width:0}.min-w-10{min-width:2.5rem}.max-w-2xl{max-width:680px}.max-w-4\.5xl{max-width:1038px}.max-w-7xl{max-width:80rem}.max-w-\[1280px\]{max-width:1280px}.max-w-\[320px\]{max-width:320px}.max-w-\[400px\]{max-width:400px}.max-w-\[500px\]{max-width:500px}.max-w-\[544px\]{max-width:544px}.max-w-full{max-width:100%}.flex-1{flex:1 1 0%}.shrink{flex-shrink:1}.shrink-0{flex-shrink:0}.flex-grow,.grow{flex-grow:1}.grow-0{flex-grow:0}.basis-1\/3{flex-basis:33.333333%}.basis-full{flex-basis:100%}.origin-\[5\%_50\%\]{transform-origin:5% 50%}.-translate-y-1\/2{--tw-translate-y:-50%}.-translate-y-1\/2,.translate-y-0{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.translate-y-0{--tw-translate-y:0px}.translate-y-full{--tw-translate-y:100%}.transform,.translate-y-full{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}@keyframes spin{to{transform:rotate(1turn)}}.animate-spin{animation:spin 1s linear infinite}.cursor-pointer{cursor:pointer}.touch-pan-x{--tw-pan-x:pan-x;touch-action:var(--tw-pan-x) var(--tw-pan-y) var(--tw-pinch-zoom)}.touch-manipulation{touch-action:manipulation}.select-none{-webkit-user-select:none;-moz-user-select:none;user-select:none}.resize{resize:both}.break-inside-avoid{-moz-column-break-inside:avoid;break-inside:avoid}.grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.flex-col{flex-direction:column}.flex-col-reverse{flex-direction:column-reverse}.flex-wrap{flex-wrap:wrap}.flex-nowrap{flex-wrap:nowrap}.content-center{align-content:center}.items-start{align-items:flex-start}.items-end{align-items:flex-end}.items-center{align-items:center}.items-stretch{align-items:stretch}.justify-start{justify-content:flex-start}.justify-center{justify-content:center}.justify-between{justify-content:space-between}.justify-around{justify-content:space-around}.justify-evenly{justify-content:space-evenly}.gap-0{gap:0}.gap-10{gap:2.5rem}.gap-14{gap:3.5rem}.gap-2{gap:.5rem}.gap-2\.5{gap:.625rem}.gap-3{gap:.75rem}.gap-3\.5{gap:.875rem}.gap-4{gap:1rem}.gap-5{gap:1.25rem}.gap-6{gap:1.5rem}.gap-7{gap:1.75rem}.gap-8{gap:2rem}.gap-x-14{-moz-column-gap:3.5rem;column-gap:3.5rem}.gap-x-16{-moz-column-gap:4rem;column-gap:4rem}.gap-x-24{-moz-column-gap:6rem;column-gap:6rem}.gap-x-28{-moz-column-gap:7rem;column-gap:7rem}.gap-x-5{-moz-column-gap:1.25rem;column-gap:1.25rem}.gap-y-2{row-gap:.5rem}.gap-y-2\.5{row-gap:.625rem}.gap-y-5{row-gap:1.25rem}.gap-y-8{row-gap:2rem}.space-x-10>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-left:calc(2.5rem*(1 - var(--tw-space-x-reverse)));margin-right:calc(2.5rem*var(--tw-space-x-reverse))}.overflow-hidden{overflow:hidden}.whitespace-normal{white-space:normal}.whitespace-nowrap{white-space:nowrap}.whitespace-pre{white-space:pre}.rounded{border-radius:.25rem}.rounded-2\.5xl{border-radius:20px}.rounded-2xl{border-radius:1rem}.rounded-\[10px\]{border-radius:10px}.rounded-full{border-radius:9999px}.rounded-lg{border-radius:.5rem}.rounded-md{border-radius:.375rem}.rounded-xl{border-radius:.75rem}.rounded-b-2xl{border-bottom-left-radius:1rem;border-bottom-right-radius:1rem}.border{border-width:1px}.border-b{border-bottom-width:1px}.border-b-2{border-bottom-width:2px}.border-b-\[4px\]{border-bottom-width:4px}.border-t-2{border-top-width:2px}.border-solid{border-style:solid}.border-dashed{border-style:dashed}.border-main-10{--tw-border-opacity:1;border-color:rgb(143 143 143/var(--tw-border-opacity))}.border-main-100{--tw-border-opacity:1;border-color:rgb(17 17 17/var(--tw-border-opacity))}.border-secondary-10{--tw-border-opacity:1;border-color:rgb(209 209 209/var(--tw-border-opacity))}.border-secondary-100{--tw-border-opacity:1;border-color:rgb(249 249 249/var(--tw-border-opacity))}.border-secondary-70{--tw-border-opacity:1;border-color:rgb(189 189 189/var(--tw-border-opacity))}.bg-main-100{--tw-bg-opacity:1;background-color:rgb(17 17 17/var(--tw-bg-opacity))}.bg-main-70{--tw-bg-opacity:1;background-color:rgb(45 45 45/var(--tw-bg-opacity))}.bg-secondary-10{--tw-bg-opacity:1;background-color:rgb(209 209 209/var(--tw-bg-opacity))}.bg-secondary-100{--tw-bg-opacity:1;background-color:rgb(249 249 249/var(--tw-bg-opacity))}.fill-main-100{fill:#111}.object-contain{-o-object-fit:contain;object-fit:contain}.object-cover{-o-object-fit:cover;object-fit:cover}.p-2{padding:.5rem}.p-2\.5{padding:.625rem}.p-6{padding:1.5rem}.p-8{padding:2rem}.px-0{padding-left:0;padding-right:0}.px-12{padding-left:3rem;padding-right:3rem}.px-2{padding-left:.5rem;padding-right:.5rem}.px-2\.5{padding-left:.625rem;padding-right:.625rem}.px-4{padding-left:1rem;padding-right:1rem}.px-5{padding-left:1.25rem;padding-right:1.25rem}.px-6{padding-left:1.5rem;padding-right:1.5rem}.px-8{padding-left:2rem;padding-right:2rem}.py-1{padding-bottom:.25rem;padding-top:.25rem}.py-1\.5{padding-bottom:.375rem;padding-top:.375rem}.py-10{padding-bottom:2.5rem;padding-top:2.5rem}.py-12{padding-bottom:3rem;padding-top:3rem}.py-16{padding-bottom:4rem;padding-top:4rem}.py-2{padding-bottom:.5rem;padding-top:.5rem}.py-2\.5{padding-bottom:.625rem;padding-top:.625rem}.py-4{padding-bottom:1rem;padding-top:1rem}.py-5{padding-bottom:1.25rem;padding-top:1.25rem}.py-6{padding-bottom:1.5rem;padding-top:1.5rem}.py-8{padding-bottom:2rem;padding-top:2rem}.pb-10{padding-bottom:2.5rem}.pb-8{padding-bottom:2rem}.pt-2{padding-top:.5rem}.pt-2\.5{padding-top:.625rem}.pt-5{padding-top:1.25rem}.pt-8{padding-top:2rem}.text-center{text-align:center}.text-start{text-align:start}.text-2xl{font-size:1.5rem;line-height:2rem}.text-3xl{font-size:1.875rem;line-height:2.25rem}.text-4xl{font-size:2.25rem;line-height:2.5rem}.text-\[10\.5px\]{font-size:10.5px}.text-\[24px\]{font-size:24px}.text-\[72px\]{font-size:72px}.text-\[88px\]{font-size:88px}.text-base{font-size:1rem;line-height:1.5rem}.text-lg{font-size:1.125rem;line-height:1.75rem}.text-sm{font-size:.875rem;line-height:1.25rem}.text-xl{font-size:1.25rem;line-height:1.75rem}.text-xs{font-size:.75rem;line-height:1rem}.font-bold{font-weight:700}.font-extrabold{font-weight:800}.font-light{font-weight:300}.font-medium{font-weight:500}.font-normal{font-weight:400}.font-semibold{font-weight:600}.uppercase{text-transform:uppercase}.leading-5{line-height:1.25rem}.tracking-wide{letter-spacing:.025em}.text-\[\#D32F2F\]{--tw-text-opacity:1;color:rgb(211 47 47/var(--tw-text-opacity))}.text-main-10{--tw-text-opacity:1;color:rgb(143 143 143/var(--tw-text-opacity))}.text-main-100{--tw-text-opacity:1;color:rgb(17 17 17/var(--tw-text-opacity))}.text-main-70{--tw-text-opacity:1;color:rgb(45 45 45/var(--tw-text-opacity))}.text-secondary-10{--tw-text-opacity:1;color:rgb(209 209 209/var(--tw-text-opacity))}.text-secondary-100{--tw-text-opacity:1;color:rgb(249 249 249/var(--tw-text-opacity))}.text-secondary-30{--tw-text-opacity:1;color:rgb(228 228 228/var(--tw-text-opacity))}.text-secondary-70{--tw-text-opacity:1;color:rgb(189 189 189/var(--tw-text-opacity))}.underline{text-decoration-line:underline}.opacity-0{opacity:0}.opacity-50{opacity:.5}.shadow-\[0px_2px_8px_rgba\(68\2c 68\2c 68\2c 0\.1\)\]{--tw-shadow:0px 2px 8px rgba(68,68,68,.1);--tw-shadow-colored:0px 2px 8px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.brightness-\[0\.4\]{--tw-brightness:brightness(0.4)}.brightness-\[0\.4\],.brightness-\[1\.4\]{filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.brightness-\[1\.4\]{--tw-brightness:brightness(1.4)}.grayscale{--tw-grayscale:grayscale(100%)}.grayscale,.invert{filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.invert{--tw-invert:invert(100%)}.filter{filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.backdrop-blur-sm{--tw-backdrop-blur:blur(4px)}.backdrop-blur-sm,.backdrop-brightness-75{-webkit-backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia);backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia)}.backdrop-brightness-75{--tw-backdrop-brightness:brightness(.75)}.transition-all{transition-duration:.15s;transition-property:all;transition-timing-function:cubic-bezier(.4,0,.2,1)}.duration-1000{transition-duration:1s}.duration-300{transition-duration:.3s}.duration-500{transition-duration:.5s}.ease-linear{transition-timing-function:linear}.after\:h-1:after{content:var(--tw-content);height:.25rem}.after\:h-1\.5:after{content:var(--tw-content);height:.375rem}.after\:w-full:after{content:var(--tw-content);width:100%}.after\:rounded-sm:after{border-radius:.125rem;content:var(--tw-content)}.after\:bg-main-10:after{--tw-bg-opacity:1;background-color:rgb(143 143 143/var(--tw-bg-opacity));content:var(--tw-content)}.after\:bg-secondary-100:after{--tw-bg-opacity:1;background-color:rgb(249 249 249/var(--tw-bg-opacity));content:var(--tw-content)}.after\:content-\[\'\'\]:after{--tw-content:"";content:var(--tw-content)}.even\:flex-row-reverse:nth-child(2n){flex-direction:row-reverse}.hover\:border-secondary-100:hover{--tw-border-opacity:1;border-color:rgb(249 249 249/var(--tw-border-opacity))}.hover\:bg-main-100:hover{--tw-bg-opacity:1;background-color:rgb(17 17 17/var(--tw-bg-opacity))}.hover\:bg-main-70:hover{--tw-bg-opacity:1;background-color:rgb(45 45 45/var(--tw-bg-opacity))}.hover\:bg-secondary-100:hover{--tw-bg-opacity:1;background-color:rgb(249 249 249/var(--tw-bg-opacity))}.hover\:bg-secondary-30:hover{--tw-bg-opacity:1;background-color:rgb(228 228 228/var(--tw-bg-opacity))}.hover\:text-main-10:hover{--tw-text-opacity:1;color:rgb(143 143 143/var(--tw-text-opacity))}.hover\:text-secondary-10:hover{--tw-text-opacity:1;color:rgb(209 209 209/var(--tw-text-opacity))}.hover\:text-secondary-100:hover{--tw-text-opacity:1;color:rgb(249 249 249/var(--tw-text-opacity))}.hover\:text-secondary-70:hover{--tw-text-opacity:1;color:rgb(189 189 189/var(--tw-text-opacity))}.hover\:shadow-\[0px_2px_14px_rgba\(68\2c 68\2c 68\2c 0\.25\)\]:hover{--tw-shadow:0px 2px 14px rgba(68,68,68,.25);--tw-shadow-colored:0px 2px 14px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.hover\:brightness-100:hover{--tw-brightness:brightness(1)}.hover\:brightness-100:hover,.hover\:brightness-75:hover{filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.hover\:brightness-75:hover{--tw-brightness:brightness(.75)}.disabled\:bg-main-70:disabled{--tw-bg-opacity:1;background-color:rgb(45 45 45/var(--tw-bg-opacity))}.disabled\:opacity-30:disabled{opacity:.3}.group:hover .group-hover\:h-full{height:100%}.group:hover .group-hover\:scale-\[1\.05\]{--tw-scale-x:1.05;--tw-scale-y:1.05;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.group:hover .group-hover\:border-main-10{--tw-border-opacity:1;border-color:rgb(143 143 143/var(--tw-border-opacity))}@media (prefers-color-scheme:dark){.dark\:text-secondary-10{--tw-text-opacity:1;color:rgb(209 209 209/var(--tw-text-opacity))}}@media (min-width:640px){.sm\:mb-12{margin-bottom:3rem}.sm\:mb-5{margin-bottom:1.25rem}.sm\:block{display:block}.sm\:flex{display:flex}.sm\:hidden{display:none}.sm\:h-\[900px\]{height:900px}.sm\:w-64{width:16rem}.sm\:w-auto{width:auto}.sm\:w-max{width:-moz-max-content;width:max-content}.sm\:shrink-0{flex-shrink:0}.sm\:basis-5\/6{flex-basis:83.333333%}.sm\:basis-52{flex-basis:13rem}.sm\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.sm\:flex-row{flex-direction:row}.sm\:items-center{align-items:center}.sm\:justify-start{justify-content:flex-start}.sm\:justify-end{justify-content:flex-end}.sm\:justify-between{justify-content:space-between}.sm\:gap-0{gap:0}.sm\:gap-5{gap:1.25rem}.sm\:gap-x-10{-moz-column-gap:2.5rem;column-gap:2.5rem}.sm\:px-12{padding-left:3rem;padding-right:3rem}.sm\:px-5{padding-left:1.25rem;padding-right:1.25rem}.sm\:px-8{padding-left:2rem;padding-right:2rem}.sm\:py-10{padding-bottom:2.5rem;padding-top:2.5rem}.sm\:pb-14{padding-bottom:3.5rem}.sm\:pt-16{padding-top:4rem}.sm\:text-end{text-align:end}.sm\:text-3xl{font-size:1.875rem;line-height:2.25rem}.sm\:text-4xl{font-size:2.25rem;line-height:2.5rem}.sm\:text-\[148px\]{font-size:148px}.sm\:text-base{font-size:1rem;line-height:1.5rem}.sm\:text-lg{font-size:1.125rem;line-height:1.75rem}.sm\:last\:hidden:last-child{display:none}}@media (min-width:768px){.md\:mx-3{margin-left:.75rem;margin-right:.75rem}.md\:mb-12{margin-bottom:3rem}.md\:block{display:block}.md\:flex{display:flex}.md\:hidden{display:none}.md\:h-16{height:4rem}.md\:h-48{height:12rem}.md\:h-\[750px\]{height:750px}.md\:w-16{width:4rem}.md\:w-48{width:12rem}.md\:w-\[256px\]{width:256px}.md\:max-w-\[528px\]{max-width:528px}.md\:basis-4\/6{flex-basis:66.666667%}.md\:flex-row{flex-direction:row}.md\:items-start{align-items:flex-start}.md\:justify-start{justify-content:flex-start}.md\:justify-between{justify-content:space-between}.md\:gap-14{gap:3.5rem}.md\:gap-28{gap:7rem}.md\:gap-5{gap:1.25rem}.md\:gap-8{gap:2rem}.md\:gap-y-14{row-gap:3.5rem}.md\:gap-y-5{row-gap:1.25rem}.md\:p-12{padding:3rem}.md\:\!px-0{padding-left:0!important;padding-right:0!important}.md\:px-20{padding-left:5rem;padding-right:5rem}.md\:px-3{padding-left:.75rem;padding-right:.75rem}.md\:px-6{padding-left:1.5rem;padding-right:1.5rem}.md\:py-16{padding-bottom:4rem;padding-top:4rem}.md\:py-8{padding-bottom:2rem;padding-top:2rem}.md\:pt-0{padding-top:0}.md\:text-4xl{font-size:2.25rem;line-height:2.5rem}.md\:text-\[100px\]{font-size:100px}.md\:text-lg{font-size:1.125rem;line-height:1.75rem}.md\:text-xl{font-size:1.25rem;line-height:1.75rem}}@media (min-width:1024px){.lg\:order-none{order:0}.lg\:mr-28{margin-right:7rem}.lg\:block{display:block}.lg\:h-99{height:396px}.lg\:h-full{height:100%}.lg\:min-h-\[396px\]{min-height:396px}.lg\:w-1\/2{width:50%}.lg\:w-72{width:18rem}.lg\:w-80{width:20rem}.lg\:w-full{width:100%}.lg\:w-max{width:-moz-max-content;width:max-content}.lg\:max-w-\[222px\]{max-width:222px}.lg\:basis-1\/2{flex-basis:50%}.lg\:basis-\[410px\]{flex-basis:410px}.lg\:flex-row{flex-direction:row}.lg\:justify-start{justify-content:flex-start}.lg\:justify-end{justify-content:flex-end}.lg\:gap-10{gap:2.5rem}.lg\:gap-16{gap:4rem}.lg\:gap-28{gap:7rem}.lg\:gap-\[48px\]{gap:48px}.lg\:gap-x-12{-moz-column-gap:3rem;column-gap:3rem}.lg\:\!px-0{padding-left:0!important;padding-right:0!important}.lg\:\!px-20{padding-left:5rem!important;padding-right:5rem!important}.lg\:px-10{padding-left:2.5rem;padding-right:2.5rem}.lg\:px-8{padding-left:2rem;padding-right:2rem}.lg\:py-0{padding-bottom:0;padding-top:0}.lg\:py-5{padding-bottom:1.25rem;padding-top:1.25rem}.lg\:text-start{text-align:start}.lg\:text-3xl{font-size:1.875rem;line-height:2.25rem}.lg\:text-4xl{font-size:2.25rem;line-height:2.5rem}.lg\:last\:flex:last-child{display:flex}}@media (min-width:1280px){.xl\:w-\[256px\]{width:256px}.xl\:basis-2\/5{flex-basis:40%}}@media (min-width:1900px){.\33xl\:w-\[400px\]{width:400px}.\33xl\:basis-1\/3{flex-basis:33.333333%}}@media (min-width:2200px){.\34xl\:basis-1\/4{flex-basis:25%}}@font-face{font-display:swap;font-family:Rubik Glitch;font-style:normal;font-weight:400;src:url(/static/rubik-glitch-cyrillic-ext-400-normal-caa98a3bc11105fffcfef482abfb2c37.woff2) format("woff2"),url(/static/rubik-glitch-cyrillic-ext-400-normal-54f97c66997053ace86c1d9f1bdef3fd.woff) format("woff");unicode-range:u+0460-052f,u+1c80-1c88,u+20b4,u+2de0-2dff,u+a640-a69f,u+fe2e-fe2f}@font-face{font-display:swap;font-family:Rubik Glitch;font-style:normal;font-weight:400;src:url(/static/rubik-glitch-cyrillic-400-normal-b32f20a71003e8bb78b28eec73c0385b.woff2) format("woff2"),url(/static/rubik-glitch-cyrillic-400-normal-3fd27e06a8bdf8edbd455443d0854c3f.woff) format("woff");unicode-range:u+0301,u+0400-045f,u+0490-0491,u+04b0-04b1,u+2116}@font-face{font-display:swap;font-family:Rubik Glitch;font-style:normal;font-weight:400;src:url(/static/rubik-glitch-hebrew-400-normal-776cad11325d90d9061faad0b7107953.woff2) format("woff2"),url(/static/rubik-glitch-hebrew-400-normal-c8cefe9973692c5d21bdd5bb11616cc4.woff) format("woff");unicode-range:u+0590-05ff,u+200c-2010,u+20aa,u+25cc,u+fb1d-fb4f}@font-face{font-display:swap;font-family:Rubik Glitch;font-style:normal;font-weight:400;src:url(/static/rubik-glitch-latin-ext-400-normal-8ae808a02973fec508af9c0959fbbade.woff2) format("woff2"),url(/static/rubik-glitch-latin-ext-400-normal-16c59f7d884842f113e8ff185c8656c9.woff) format("woff");unicode-range:u+0100-02af,u+0304,u+0308,u+0329,u+1e00-1e9f,u+1ef2-1eff,u+2020,u+20a0-20ab,u+20ad-20c0,u+2113,u+2c60-2c7f,u+a720-a7ff}@font-face{font-display:swap;font-family:Rubik Glitch;font-style:normal;font-weight:400;src:url(/static/rubik-glitch-latin-400-normal-7a5b5bac6b066d71b0cae06ed087b905.woff2) format("woff2"),url(/static/rubik-glitch-latin-400-normal-3fb89918ce49908f5350076807cf1bef.woff) format("woff");unicode-range:u+00??,u+0131,u+0152-0153,u+02bb-02bc,u+02c6,u+02da,u+02dc,u+0304,u+0308,u+0329,u+2000-206f,u+2074,u+20ac,u+2122,u+2191,u+2193,u+2212,u+2215,u+feff,u+fffd}@font-face{font-display:swap;font-family:Montserrat Variable;font-style:normal;font-weight:100 900;src:url(/static/montserrat-cyrillic-ext-wght-normal-e84e812b71d18e04e6928fb272665c53.woff2) format("woff2-variations");unicode-range:u+0460-052f,u+1c80-1c88,u+20b4,u+2de0-2dff,u+a640-a69f,u+fe2e-fe2f}@font-face{font-display:swap;font-family:Montserrat Variable;font-style:normal;font-weight:100 900;src:url(/static/montserrat-cyrillic-wght-normal-eb1783eb42487132539645641f761eb2.woff2) format("woff2-variations");unicode-range:u+0301,u+0400-045f,u+0490-0491,u+04b0-04b1,u+2116}@font-face{font-display:swap;font-family:Montserrat Variable;font-style:normal;font-weight:100 900;src:url(data:font/woff2;base64,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) format("woff2-variations");unicode-range:u+0102-0103,u+0110-0111,u+0128-0129,u+0168-0169,u+01a0-01a1,u+01af-01b0,u+0300-0301,u+0303-0304,u+0308-0309,u+0323,u+0329,u+1ea0-1ef9,u+20ab}@font-face{font-display:swap;font-family:Montserrat Variable;font-style:normal;font-weight:100 900;src:url(/static/montserrat-latin-ext-wght-normal-82d636d9375dd92118fd22c818a99c24.woff2) format("woff2-variations");unicode-range:u+0100-02af,u+0304,u+0308,u+0329,u+1e00-1e9f,u+1ef2-1eff,u+2020,u+20a0-20ab,u+20ad-20c0,u+2113,u+2c60-2c7f,u+a720-a7ff}@font-face{font-display:swap;font-family:Montserrat Variable;font-style:normal;font-weight:100 900;src:url(/static/montserrat-latin-wght-normal-5028c63f6a70ab0cf7cba9015ae04154.woff2) format("woff2-variations");unicode-range:u+00??,u+0131,u+0152-0153,u+02bb-02bc,u+02c6,u+02da,u+02dc,u+0304,u+0308,u+0329,u+2000-206f,u+2074,u+20ac,u+2122,u+2191,u+2193,u+2212,u+2215,u+feff,u+fffd}code[class*=language-],pre[class*=language-]{word-wrap:normal;background:none;color:#ccc;font-family:Consolas,Monaco,Andale Mono,Ubuntu Mono,monospace;font-size:1em;-webkit-hyphens:none;-moz-hyphens:none;-ms-hyphens:none;hyphens:none;line-height:1.5;-moz-tab-size:4;-o-tab-size:4;tab-size:4;text-align:left;white-space:pre;word-break:normal;word-spacing:normal}pre[class*=language-]{margin:.5em 0;overflow:auto;padding:1em}:not(pre)>code[class*=language-],pre[class*=language-]{background:#2d2d2d}:not(pre)>code[class*=language-]{border-radius:.3em;padding:.1em;white-space:normal}.token.block-comment,.token.cdata,.token.comment,.token.doctype,.token.prolog{color:#999}.token.punctuation{color:#ccc}.token.attr-name,.token.deleted,.token.namespace,.token.tag{color:#e2777a}.token.function-name{color:#6196cc}.token.boolean,.token.function,.token.number{color:#f08d49}.token.class-name,.token.constant,.token.property,.token.symbol{color:#f8c555}.token.atrule,.token.builtin,.token.important,.token.keyword,.token.selector{color:#cc99cd}.token.attr-value,.token.char,.token.regex,.token.string,.token.variable{color:#7ec699}.token.entity,.token.operator,.token.url{color:#67cdcc}.token.bold,.token.important{font-weight:700}.token.italic{font-style:italic}.token.entity{cursor:help}.token.inserted{color:green}*{border:0;margin:0;padding:0}*,:after,:before{-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box}:active,:focus,a:active,a:focus{outline:none}aside,footer,header,nav{display:block}body,html{-ms-text-size-adjust:100%;-moz-text-size-adjust:100%;-webkit-text-size-adjust:100%;font-size:100%;font-size:14px;line-height:1;min-height:100vh}button,input,textarea{font-family:inherit}input::-ms-clear{display:none}button{cursor:pointer}button::-moz-focus-inner{border:0;padding:0}a,a:hover,a:visited{text-decoration:none}ul li{list-style:none}img{vertical-align:top}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:400}*{font-family:Montserrat Variable,Helvetica,Arial,sans-serif}input:-webkit-autofill,input:-webkit-autofill:active,input:-webkit-autofill:focus,input:-webkit-autofill:hover{-webkit-text-fill-color:#f9f9f9;-webkit-background-clip:text;box-shadow:inset 0 0 20px 20px #fa070700;-webkit-transition:background-color 5000s ease-in-out 0s;transition:background-color 5000s ease-in-out 0s}#contact-form input:-webkit-autofill,#contact-form input:-webkit-autofill:active,#contact-form input:-webkit-autofill:focus,#contact-form input:-webkit-autofill:hover{-webkit-text-fill-color:#111}@media (min-width:640px){.banner-title{line-height:1.5!important}}.banner-title{font-family:Montserrat Variable,Helvetica,Arial,sans-serif;b{display:block;font-weight:700}}.rubik-font{font-family:Rubik Glitch,Helvetica,Arial,sans-serif}@media screen and (max-width:640px){div#hubspot-messages-iframe-container{display:none!important}}#hubspot-messages-iframe-container{z-index:200!important}#hs-banner-parent{--hs-banner-font-family:"Montserrat Variable",Helvetica,Arial,sans-serif!important;--hs-banner-inset:auto 0px 10px 10px!important;--hs-banner-translate-x:0!important}#hs-eu-cookie-settings-button{font-weight:400!important;text-decoration:none!important}#hs-eu-cookie-confirmation{max-width:calc(100% - 20px)!important}div.privacy-policy h1{font-size:1.875rem;font-weight:600;line-height:2.25rem;text-align:center;width:100%}div.privacy-policy h2{font-size:1.5rem;font-weight:600;line-height:2rem;padding-top:1rem}div.privacy-policy h3{font-size:1.25rem;font-weight:600;line-height:1.75rem;padding-top:1rem}div.privacy-policy h4{font-weight:600;padding-top:.5rem}div.privacy-policy ul li{list-style-position:inside;list-style-type:disc;padding-top:1rem}div.privacy-policy ul li>h3{display:inline;font-weight:500;padding-top:0}div.privacy-policy a{text-decoration-line:underline}article.single-post{font-size:1rem;line-height:1.5rem}@media (min-width:640px){article.single-post{font-size:1.125rem;line-height:1.75rem}}article.single-post :is(h2,h3,h4){--tw-text-opacity:1;color:rgb(249 249 249/var(--tw-text-opacity));font-size:1.125rem;font-weight:700;line-height:1.75rem;margin-bottom:.625rem;margin-top:2rem}@media (min-width:640px){article.single-post :is(h2,h3,h4){font-size:1.25rem;line-height:1.75rem}}article.single-post h4{margin-top:1rem}article.single-post p{margin-bottom:1rem}@media (min-width:640px){article.single-post p{margin-bottom:2rem}}article.single-post span.gatsby-resp-image-wrapper{border-radius:20px!important;margin-bottom:1rem!important;margin-left:auto!important;margin-right:auto!important;max-width:444px!important;width:100%!important}@media (min-width:640px){article.single-post span.gatsby-resp-image-wrapper{margin-bottom:1.25rem!important}}article.single-post img{--tw-shadow:0 0 #0000!important;--tw-shadow-colored:0 0 #0000!important;border-radius:20px!important;box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)!important}article.single-post figcaption.gatsby-resp-image-figcaption,article.single-post span.gatsby-resp-image-wrapper+em{display:block;font-size:.875rem!important;font-style:normal;line-height:1.25rem!important;text-align:center!important;width:100%}article.single-post :is(ul,ol){margin-bottom:1rem;margin-top:1rem}@media (min-width:640px){article.single-post :is(ul,ol){margin-bottom:2rem;margin-top:2rem}}article.single-post ul li{list-style-position:inside;list-style-type:disc}article.single-post ol li{list-style-position:inside;list-style-type:decimal}article.single-post pre{--tw-bg-opacity:1;background-color:rgb(45 45 45/var(--tw-bg-opacity));border-radius:20px;font-size:.875rem;line-height:1.25rem;margin-bottom:1rem;margin-top:1rem;padding:1rem;white-space:pre-wrap}@media (min-width:640px){article.single-post pre{font-size:1rem;line-height:1.5rem;margin-bottom:2rem;margin-top:2rem;padding:2rem}}article.single-post pre code{white-space:pre-wrap}.gradient-border{-o-border-image:linear-gradient(90deg,#bdbdbd,#111) 30;border-image:linear-gradient(90deg,#bdbdbd,#111) 30}div.team-member:hover div.line{width:100%}div.applied-tech:hover div.line{height:100%}div.review-body p{padding-top:.5rem}div.review-body p:first-child{padding-top:0}div.workflow-step:nth-child(odd) div.cover{right:-.5rem}div.workflow-step:nth-child(2n) div.cover{left:-.5rem}div.why-us-card p{text-align:justify}div.contact-form-description span{display:block;padding-bottom:.5rem;padding-top:.5rem}div.contact-form-description strong{font-weight:600}ul.MuiMenu-list{--tw-bg-opacity:1;background-color:rgb(249 249 249/var(--tw-bg-opacity))}div.project-solution :is(ul,ol){margin-bottom:1rem;margin-top:1rem}@media (min-width:640px){div.project-solution :is(ul,ol){margin-bottom:1rem;margin-top:1rem}}div.project-solution ul li{list-style-type:disc}div.project-solution ol li,div.project-solution ul li{list-style-position:inside;margin-bottom:1rem;margin-top:1rem}div.project-solution ol li{list-style-type:decimal}div.project-solution p:has(+ol),div.project-solution p:has(+ul){margin-bottom:1rem;margin-top:1rem}div.project-solution p{margin-bottom:1rem}.yarl__fullsize{height:100%;width:100%}.yarl__relative{position:relative}.yarl__portal{bottom:0;left:0;opacity:0;overflow:hidden;position:fixed;right:0;top:0;transition:opacity var(--yarl__fade_animation_duration,.25s) var(--yarl__fade_animation_timing_function,ease);z-index:var(--yarl__portal_zindex,9999)}.yarl__portal_open{opacity:1}.yarl__container{background-color:var(--yarl__container_background_color,var(--yarl__color_backdrop,#000));bottom:0;left:0;outline:none;overflow:hidden;overscroll-behavior:var(--yarl__controller_overscroll_behavior,contain);position:absolute;right:0;top:0;touch-action:var(--yarl__controller_touch_action,none);-webkit-user-select:none;-moz-user-select:none;user-select:none}.yarl__carousel{align-content:center;align-items:stretch;display:flex;flex:0 0 auto;height:100%;justify-content:center;opacity:var(--yarl__pull_opacity,1);transform:translate(var(--yarl__swipe_offset,0),var(--yarl__pull_offset,0));width:calc(100% + (var(--yarl__carousel_slides_count) - 1)*(100% + var(--yarl__carousel_spacing_px, 0)*1px + var(--yarl__carousel_spacing_percent, 0)*1%))}.yarl__carousel_with_slides{-moz-column-gap:calc(var(--yarl__carousel_spacing_px, 0)*1px + 100/(var(--yarl__carousel_slides_count)*100 + (var(--yarl__carousel_slides_count) - 1)*var(--yarl__carousel_spacing_percent, 0))*var(--yarl__carousel_spacing_percent, 0)*1%);column-gap:calc(var(--yarl__carousel_spacing_px, 0)*1px + 100/(var(--yarl__carousel_slides_count)*100 + (var(--yarl__carousel_slides_count) - 1)*var(--yarl__carousel_spacing_percent, 0))*var(--yarl__carousel_spacing_percent, 0)*1%)}.yarl__flex_center{align-content:center;align-items:center;display:flex;justify-content:center}.yarl__slide{flex:1;overflow:hidden;padding:calc(var(--yarl__carousel_padding_px, 0)*1px + 100/(var(--yarl__carousel_slides_count)*100 + (var(--yarl__carousel_slides_count) - 1)*var(--yarl__carousel_spacing_percent, 0))*var(--yarl__carousel_padding_percent, 0)*1%);position:relative}[dir=rtl] .yarl__slide{--yarl__direction:-1}.yarl__slide_image{-webkit-touch-callout:none;max-height:100%;max-width:100%;-o-object-fit:contain;object-fit:contain;touch-action:var(--yarl__controller_touch_action,none);-moz-user-select:none;user-select:none;-webkit-user-select:none}.yarl__slide_image_cover{height:100%;-o-object-fit:cover;object-fit:cover;width:100%}.yarl__slide_image_loading{opacity:0}@media screen and (min-width:800px){.yarl__slide_wrapper:not(.yarl__slide_wrapper_interactive) .yarl__slide_image{-webkit-backface-visibility:hidden;-webkit-transform:translateZ(0);-webkit-transform-style:preserve-3d}}.yarl__slide_placeholder{left:50%;line-height:0;position:absolute;top:50%;transform:translateX(-50%) translateY(-50%)}.yarl__slide_loading{animation:yarl__delayed_fadein 1s linear;color:var(--yarl__slide_icon_loading_color,var(--yarl__color_button,hsla(0,0%,100%,.8)))}.yarl__slide_loading line{animation:yarl__stroke_opacity 1s linear infinite}.yarl__slide_loading line:first-of-type{animation-delay:-1.875s}.yarl__slide_loading line:nth-of-type(2){animation-delay:-1.75s}.yarl__slide_loading line:nth-of-type(3){animation-delay:-1.625s}.yarl__slide_loading line:nth-of-type(4){animation-delay:-1.5s}.yarl__slide_loading line:nth-of-type(5){animation-delay:-1.375s}.yarl__slide_loading line:nth-of-type(6){animation-delay:-1.25s}.yarl__slide_loading line:nth-of-type(7){animation-delay:-1.125s}.yarl__slide_loading line:nth-of-type(8){animation-delay:-1s}.yarl__slide_error{color:var(--yarl__slide_icon_error_color,red);height:var(--yarl__slide_icon_error_size,48px);width:var(--yarl__slide_icon_error_size,48px)}@media (prefers-reduced-motion){.yarl__portal,.yarl__slide{transition:unset}.yarl__slide_loading,.yarl__slide_loading line{animation:unset}}.yarl__toolbar{bottom:auto;display:flex;justify-content:flex-end;left:auto;padding:var(--yarl__toolbar_padding,8px);position:absolute;right:0;top:0}[dir=rtl] .yarl__toolbar{bottom:auto;left:0;right:auto;top:0}.yarl__icon{height:var(--yarl__icon_size,32px);width:var(--yarl__icon_size,32px)}.yarl__button{-webkit-tap-highlight-color:transparent;-webkit-appearance:none;-moz-appearance:none;appearance:none;background-color:var(--yarl__button_background_color,transparent);border:var(--yarl__button_border,0);color:var(--yarl__color_button,hsla(0,0%,100%,.8));cursor:pointer;filter:var(--yarl__button_filter,drop-shadow(2px 2px 2px rgba(0,0,0,.8)));line-height:0;margin:var(--yarl__button_margin,0);outline:none;padding:var(--yarl__button_padding,8px)}.yarl__button:focus{color:var(--yarl__color_button_active,#fff)}.yarl__button:focus:not(:focus-visible){color:var(--yarl__color_button,hsla(0,0%,100%,.8))}.yarl__button:focus-visible{color:var(--yarl__color_button_active,#fff)}@media (hover:hover){.yarl__button:focus-visible:hover,.yarl__button:focus:hover,.yarl__button:hover{color:var(--yarl__color_button_active,#fff)}}.yarl__button:disabled{color:var(--yarl__color_button_disabled,hsla(0,0%,100%,.4));cursor:default}.yarl__navigation_next,.yarl__navigation_prev{padding:var(--yarl__navigation_button_padding,24px 16px);position:absolute;top:50%;transform:translateY(-50%)}.yarl__navigation_prev{left:0}[dir=rtl] .yarl__navigation_prev{left:unset;right:0;transform:translateY(-50%) rotate(180deg)}.yarl__navigation_next{right:0}[dir=rtl] .yarl__navigation_next{left:0;right:unset;transform:translateY(-50%) rotate(180deg)}.yarl__no_scroll{height:100%;overflow:hidden;overscroll-behavior:none}@keyframes yarl__delayed_fadein{0%{opacity:0}80%{opacity:0}to{opacity:1}}@keyframes yarl__stroke_opacity{0%{stroke-opacity:1}to{stroke-opacity:.125}}.yarl__slide_captions_container{background:var(--yarl__slide_captions_container_background,rgba(0,0,0,.5));left:var(--yarl__slide_captions_container_left,0);padding:var(--yarl__slide_captions_container_padding,16px);position:absolute;right:var(--yarl__slide_captions_container_right,0);-webkit-transform:translateZ(0)}.yarl__slide_title{color:var(--yarl__slide_title_color,#fff);font-size:var(--yarl__slide_title_font_size,125%);font-weight:var(--yarl__slide_title_font_weight,bolder);max-width:calc(100% - var(--yarl__toolbar_width, 0px));overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.yarl__slide_title_container{top:var(--yarl__slide_title_container_top,0)}.yarl__slide_description{-webkit-box-orient:vertical;-webkit-line-clamp:var(--yarl__slide_description_max_lines,3);color:var(--yarl__slide_description_color,#fff);display:-webkit-box;-webkit-hyphens:auto;hyphens:auto;overflow:hidden;text-align:var(--yarl__slide_description_text_align,start)}.yarl__slide_description_container{bottom:var(--yarl__slide_description_container_bottom,0)}.yarl__thumbnails{display:flex;height:100%}.yarl__thumbnails_bottom,.yarl__thumbnails_end .yarl__thumbnails_track,.yarl__thumbnails_start .yarl__thumbnails_track,.yarl__thumbnails_top{flex-direction:column}.yarl__thumbnails_wrapper{flex:1;position:relative}.yarl__thumbnails_container{-webkit-touch-callout:none;background-color:var(--yarl__thumbnails_container_background_color,var(--yarl__color_backdrop,#000));flex:0 0 auto;overflow:hidden;padding:var(--yarl__thumbnails_container_padding,16px);position:relative;-webkit-user-select:none;-moz-user-select:none;user-select:none}.yarl__thumbnails_vignette{--yarl__thumbnails_vignette_size:12%;pointer-events:none;position:absolute}@media (min-width:1200px){.yarl__thumbnails_vignette{--yarl__thumbnails_vignette_size:8%}}@media (min-width:2000px){.yarl__thumbnails_vignette{--yarl__thumbnails_vignette_size:5%}}.yarl__thumbnails_bottom .yarl__thumbnails_vignette,.yarl__thumbnails_top .yarl__thumbnails_vignette{background:linear-gradient(to right,var(--yarl__color_backdrop,#000) 0,transparent var(--yarl__thumbnails_vignette_size,12%) calc(100% - var(--yarl__thumbnails_vignette_size, 12%)),var(--yarl__color_backdrop,#000) 100%);height:100%;left:0;right:0}.yarl__thumbnails_end .yarl__thumbnails_vignette,.yarl__thumbnails_start .yarl__thumbnails_vignette{background:linear-gradient(to bottom,var(--yarl__color_backdrop,#000) 0,transparent var(--yarl__thumbnails_vignette_size,12%) calc(100% - var(--yarl__thumbnails_vignette_size, 12%)),var(--yarl__color_backdrop,#000) 100%);bottom:0;top:0;width:100%}.yarl__thumbnails_track{gap:var(--yarl__thumbnails_thumbnail_gap,16px);outline:none}.yarl__thumbnails_thumbnail{-webkit-tap-highlight-color:transparent;-webkit-appearance:none;-moz-appearance:none;appearance:none;background:var(--yarl__thumbnails_thumbnail_background,#000);border-color:var(--yarl__thumbnails_thumbnail_border_color,var(--yarl__color_button,hsla(0,0%,100%,.8)));border-radius:var(--yarl__thumbnails_thumbnail_border_radius,4px);border-style:var(--yarl__thumbnails_thumbnail_border_style,solid);border-width:var(--yarl__thumbnails_thumbnail_border,1px);box-sizing:content-box;cursor:pointer;flex:0 0 auto;height:var(--yarl__thumbnails_thumbnail_height,80px);outline:none;overflow:hidden;padding:var(--yarl__thumbnails_thumbnail_padding,4px);position:relative;width:var(--yarl__thumbnails_thumbnail_width,120px)}.yarl__thumbnails_thumbnail_active{border-color:var(--yarl__thumbnails_thumbnail_active_border_color,var(--yarl__color_button_active,#fff))}.yarl__thumbnails_thumbnail_fadein{animation:yarl__thumbnails_thumbnail_fadein var(--yarl__thumbnails_thumbnail_fadein_duration,.5s) ease-in-out var(--yarl__thumbnails_thumbnail_fadein_delay,0s) forwards;opacity:0}.yarl__thumbnails_thumbnail_fadeout{animation:yarl__thumbnails_thumbnail_fadeout var(--yarl__thumbnails_thumbnail_fadeout_duration,.5s) ease-in-out var(--yarl__thumbnails_thumbnail_fadeout_delay,0s) forwards;cursor:unset}.yarl__thumbnails_thumbnail_placeholder{cursor:unset;visibility:hidden}.yarl__thumbnails_thumbnail:focus{box-shadow:var(--yarl__thumbnails_thumbnail_focus_box_shadow,#000 0 0 0 2px,var(--yarl__color_button,hsla(0,0%,100%,.8)) 0 0 0 4px)}.yarl__thumbnails_thumbnail:focus:not(:focus-visible){box-shadow:unset}.yarl__thumbnails_thumbnail:focus-visible{box-shadow:var(--yarl__thumbnails_thumbnail_focus_box_shadow,#000 0 0 0 2px,var(--yarl__color_button,hsla(0,0%,100%,.8)) 0 0 0 4px)}.yarl__thumbnails_thumbnail_icon{color:var(--yarl__thumbnails_thumbnail_icon_color,var(--yarl__color_button,hsla(0,0%,100%,.8)));filter:var(--yarl__thumbnails_thumbnail_icon_filter,drop-shadow(2px 2px 2px rgba(0,0,0,.8)));height:var(--yarl__thumbnails_thumbnail_icon_size,32px);left:50%;position:absolute;top:50%;transform:translateX(-50%) translateY(-50%);width:var(--yarl__thumbnails_thumbnail_icon_size,32px)}@keyframes yarl__thumbnails_thumbnail_fadein{0%{opacity:0}to{opacity:1}}@keyframes yarl__thumbnails_thumbnail_fadeout{0%{opacity:1}to{opacity:0}}404

404

Nothing to see here, page is under construction

But our blog is always there for you

CONTACTS

EIN: 35-2654711, Company Code: 7296176

8 The Green STE B

Dover, DE 19901-3618, United States

+1 302 364 0193

Privacy PolicyCookie Policy

Leave your contact to get our portfolio

- \ No newline at end of file + \ No newline at end of file diff --git a/_gatsby/slices/_gatsby-scripts-1.html b/_gatsby/slices/_gatsby-scripts-1.html index c9df0785..50fcd86c 100644 --- a/_gatsby/slices/_gatsby-scripts-1.html +++ b/_gatsby/slices/_gatsby-scripts-1.html @@ -2,6 +2,6 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/blog/10582553-73a2-569f-8bdd-980e1f77c10a/index.html b/blog/10582553-73a2-569f-8bdd-980e1f77c10a/index.html index 4da6a362..e7fae0c8 100644 --- a/blog/10582553-73a2-569f-8bdd-980e1f77c10a/index.html +++ b/blog/10582553-73a2-569f-8bdd-980e1f77c10a/index.html @@ -1,6 +1,6 @@ CodeCave Insights | STREAMLINING CHANGELOG CREATION WITH AZURE DEVOPS AND CONFLUENCE
3 min read

Streamlining Changelog Creation with Azure DevOps and Confluence

Streamlining Changelog Creation with Azure DevOps and Confluence

In the fast-paced world of software development, maintaining a detailed record of changes is crucial. Changelogs serve as a vital tool, tracking every update, fix, or feature added to a project. Integrating Azure DevOps with Confluence can create a seamless changelog management system that enhances transparency and efficiency. This blog post explores how to automate changelog creation in Confluence using a PowerShell script that extracts release information from an Azure DevOps repository.

@@ -150,6 +150,6 @@

Conclusion

- \ No newline at end of file + \ No newline at end of file diff --git a/blog/azure-devops/index.html b/blog/azure-devops/index.html index ef4c181d..bcbc92ff 100644 --- a/blog/azure-devops/index.html +++ b/blog/azure-devops/index.html @@ -6,6 +6,6 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/blog/azure-devops/page/1/index.html b/blog/azure-devops/page/1/index.html index 7115b968..907ea504 100644 --- a/blog/azure-devops/page/1/index.html +++ b/blog/azure-devops/page/1/index.html @@ -6,6 +6,6 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/blog/azure/index.html b/blog/azure/index.html index 59e54e37..7b95d1cd 100644 --- a/blog/azure/index.html +++ b/blog/azure/index.html @@ -6,6 +6,6 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/blog/azure/page/1/index.html b/blog/azure/page/1/index.html index 5793b0e8..02608814 100644 --- a/blog/azure/page/1/index.html +++ b/blog/azure/page/1/index.html @@ -6,6 +6,6 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/blog/c924c93c-fac0-517e-92e7-c5b5aaa083c2/index.html b/blog/c924c93c-fac0-517e-92e7-c5b5aaa083c2/index.html index d529e781..37ceb796 100644 --- a/blog/c924c93c-fac0-517e-92e7-c5b5aaa083c2/index.html +++ b/blog/c924c93c-fac0-517e-92e7-c5b5aaa083c2/index.html @@ -1,6 +1,6 @@ CodeCave Insights | PROXMOX VM TEMPLATES AND CLOUD-INIT
3 min read

Proxmox VM Templates and Cloud-Init

Proxmox and Cloud-Init virtual machine templates

In the world of virtualization, efficiency and automation are key. This is where Proxmox Virtual Environment (VE) comes into play, offering a robust solution for easily managing virtual machines (VMs). One of the most interesting features of Proxmox is the ability to use virtual machine templates in combination with Cloud-Init, which simplifies the deployment process and makes it as smooth as in the cloud. @@ -128,6 +128,6 @@

Conclusion

- \ No newline at end of file + \ No newline at end of file diff --git a/blog/changelog/index.html b/blog/changelog/index.html index be1b65f6..83731e5c 100644 --- a/blog/changelog/index.html +++ b/blog/changelog/index.html @@ -6,6 +6,6 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/blog/changelog/page/1/index.html b/blog/changelog/page/1/index.html index 68068d31..ea432b55 100644 --- a/blog/changelog/page/1/index.html +++ b/blog/changelog/page/1/index.html @@ -6,6 +6,6 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/blog/cloud-init/index.html b/blog/cloud-init/index.html index 6237dce5..94faa784 100644 --- a/blog/cloud-init/index.html +++ b/blog/cloud-init/index.html @@ -6,6 +6,6 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/blog/cloud-init/page/1/index.html b/blog/cloud-init/page/1/index.html index 3427d30b..f0e79c4f 100644 --- a/blog/cloud-init/page/1/index.html +++ b/blog/cloud-init/page/1/index.html @@ -6,6 +6,6 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/blog/confluence/index.html b/blog/confluence/index.html index e18ffdea..5fba5e1b 100644 --- a/blog/confluence/index.html +++ b/blog/confluence/index.html @@ -6,6 +6,6 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/blog/confluence/page/1/index.html b/blog/confluence/page/1/index.html index c305d317..41b457b2 100644 --- a/blog/confluence/page/1/index.html +++ b/blog/confluence/page/1/index.html @@ -6,6 +6,6 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/blog/devops/index.html b/blog/devops/index.html index 031cfec1..f4464778 100644 --- a/blog/devops/index.html +++ b/blog/devops/index.html @@ -6,6 +6,6 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/blog/devops/page/1/index.html b/blog/devops/page/1/index.html index 9c25a77a..2ce027c4 100644 --- a/blog/devops/page/1/index.html +++ b/blog/devops/page/1/index.html @@ -6,6 +6,6 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/blog/e173a2ae-ebb5-5219-9479-035dde5fe8c8/index.html b/blog/e173a2ae-ebb5-5219-9479-035dde5fe8c8/index.html index 7d46b18f..67a121bc 100644 --- a/blog/e173a2ae-ebb5-5219-9479-035dde5fe8c8/index.html +++ b/blog/e173a2ae-ebb5-5219-9479-035dde5fe8c8/index.html @@ -1,6 +1,6 @@ CodeCave Insights | SELF-HOSTED BUILD AGENT FOR AZURE PIPELINES
3 min read

Self-Hosted build Agent for Azure Pipelines

Self-Hosted build Agent for Azure Pipelines

Welcome to our guide to installing the Azure Agent @@ -402,6 +402,6 @@

Final Thoughts

- \ No newline at end of file + \ No newline at end of file diff --git a/blog/eced1a19-65cd-58b2-a9e4-e06c8bb532fb/index.html b/blog/eced1a19-65cd-58b2-a9e4-e06c8bb532fb/index.html index dc3b37f5..6a030656 100644 --- a/blog/eced1a19-65cd-58b2-a9e4-e06c8bb532fb/index.html +++ b/blog/eced1a19-65cd-58b2-a9e4-e06c8bb532fb/index.html @@ -1,6 +1,6 @@ CodeCave Insights | USING BOTH TWINGATE AND WIREGUARD ON A WINDOWS PC
1 min read

Using both Twingate and Wireguard on a Windows PC

Twingate is a fantastic alternative to traditional VPNs like WireGuard because it offers superior security with Zero Trust principles and is incredibly easy to deploy, ensuring seamless and secure access to your resources without the hassle of complex configurations.

However, in order to use Twingate only you must own the infrastructure behind it (I’m talking about Twingate connectors here).
@@ -26,6 +26,6 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/blog/index.html b/blog/index.html index 8b5aeecd..12364646 100644 --- a/blog/index.html +++ b/blog/index.html @@ -6,6 +6,6 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/blog/page/1/index.html b/blog/page/1/index.html index 5bb1f93e..38c8750f 100644 --- a/blog/page/1/index.html +++ b/blog/page/1/index.html @@ -6,6 +6,6 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/blog/podryabinkina/index.html b/blog/podryabinkina/index.html index 4f8ad4f6..fb3673bc 100644 --- a/blog/podryabinkina/index.html +++ b/blog/podryabinkina/index.html @@ -6,6 +6,6 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/blog/podryabinkina/page/1/index.html b/blog/podryabinkina/page/1/index.html index c677eff7..8a4ab44e 100644 --- a/blog/podryabinkina/page/1/index.html +++ b/blog/podryabinkina/page/1/index.html @@ -6,6 +6,6 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/blog/proxmox/index.html b/blog/proxmox/index.html index 7db3c48b..4b0ba093 100644 --- a/blog/proxmox/index.html +++ b/blog/proxmox/index.html @@ -6,6 +6,6 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/blog/proxmox/page/1/index.html b/blog/proxmox/page/1/index.html index 8be82251..70508996 100644 --- a/blog/proxmox/page/1/index.html +++ b/blog/proxmox/page/1/index.html @@ -6,6 +6,6 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/blog/self-hosted-build-agent/index.html b/blog/self-hosted-build-agent/index.html index 03e5c76d..989500c0 100644 --- a/blog/self-hosted-build-agent/index.html +++ b/blog/self-hosted-build-agent/index.html @@ -6,6 +6,6 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/blog/self-hosted-build-agent/page/1/index.html b/blog/self-hosted-build-agent/page/1/index.html index 5f0ec818..0a44c58c 100644 --- a/blog/self-hosted-build-agent/page/1/index.html +++ b/blog/self-hosted-build-agent/page/1/index.html @@ -6,6 +6,6 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/blog/twingate/index.html b/blog/twingate/index.html index fdac4944..a6ae38c6 100644 --- a/blog/twingate/index.html +++ b/blog/twingate/index.html @@ -6,6 +6,6 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/blog/twingate/page/1/index.html b/blog/twingate/page/1/index.html index 4582d1ee..2dd50ed6 100644 --- a/blog/twingate/page/1/index.html +++ b/blog/twingate/page/1/index.html @@ -6,6 +6,6 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/blog/virtualization/index.html b/blog/virtualization/index.html index a0ca8176..e16dc2af 100644 --- a/blog/virtualization/index.html +++ b/blog/virtualization/index.html @@ -6,6 +6,6 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/blog/virtualization/page/1/index.html b/blog/virtualization/page/1/index.html index e0ef6219..808a7e7a 100644 --- a/blog/virtualization/page/1/index.html +++ b/blog/virtualization/page/1/index.html @@ -6,6 +6,6 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/blog/vm/index.html b/blog/vm/index.html index 04c1016d..db5b4c41 100644 --- a/blog/vm/index.html +++ b/blog/vm/index.html @@ -6,6 +6,6 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/blog/vm/page/1/index.html b/blog/vm/page/1/index.html index a6c6edb2..cf2ff2fd 100644 --- a/blog/vm/page/1/index.html +++ b/blog/vm/page/1/index.html @@ -6,6 +6,6 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/blog/vpn/index.html b/blog/vpn/index.html index a8028999..3e64e260 100644 --- a/blog/vpn/index.html +++ b/blog/vpn/index.html @@ -6,6 +6,6 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/blog/vpn/page/1/index.html b/blog/vpn/page/1/index.html index bf2dfe4b..e97f8ab0 100644 --- a/blog/vpn/page/1/index.html +++ b/blog/vpn/page/1/index.html @@ -6,6 +6,6 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/blog/wireguard/index.html b/blog/wireguard/index.html index 67159966..adb41b0f 100644 --- a/blog/wireguard/index.html +++ b/blog/wireguard/index.html @@ -6,6 +6,6 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/blog/wireguard/page/1/index.html b/blog/wireguard/page/1/index.html index 70efb968..85b6c5b8 100644 --- a/blog/wireguard/page/1/index.html +++ b/blog/wireguard/page/1/index.html @@ -6,6 +6,6 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/blog/zero-trust/index.html b/blog/zero-trust/index.html index 33a184f5..97286bb4 100644 --- a/blog/zero-trust/index.html +++ b/blog/zero-trust/index.html @@ -6,6 +6,6 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/blog/zero-trust/page/1/index.html b/blog/zero-trust/page/1/index.html index 1bf24a2c..c25c1460 100644 --- a/blog/zero-trust/page/1/index.html +++ b/blog/zero-trust/page/1/index.html @@ -6,6 +6,6 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/blog/zhmayev/index.html b/blog/zhmayev/index.html index b0b367de..ff8986f5 100644 --- a/blog/zhmayev/index.html +++ b/blog/zhmayev/index.html @@ -6,6 +6,6 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/blog/zhmayev/page/1/index.html b/blog/zhmayev/page/1/index.html index c12570c1..481dafda 100644 --- a/blog/zhmayev/page/1/index.html +++ b/blog/zhmayev/page/1/index.html @@ -6,6 +6,6 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/chunk-map.json b/chunk-map.json index e3275242..671b0155 100644 --- a/chunk-map.json +++ b/chunk-map.json @@ -1 +1 @@ -{"app":["/app-482697764f835926dc92.js"],"component---src-pages-templates-404-tsx":["/component---src-pages-templates-404-tsx-1ec7dcfded6e73efef91.js"],"component---src-pages-templates-blog-by-author-tsx":["/component---src-pages-templates-blog-by-author-tsx-fb7314d489c2682e7da0.js"],"component---src-pages-templates-blog-by-hashtag-tsx":["/component---src-pages-templates-blog-by-hashtag-tsx-2076682d0e3e44045f00.js"],"component---src-pages-templates-blog-tsx":["/component---src-pages-templates-blog-tsx-ae37a37910d4ce46256c.js"],"component---src-pages-templates-index-tsx":["/component---src-pages-templates-index-tsx-c79944ee44040195a3eb.js"],"component---src-pages-templates-policies-tsx":["/component---src-pages-templates-policies-tsx-359925d45492160d5e8b.js"],"component---src-pages-templates-post-tsx":["/component---src-pages-templates-post-tsx-4f0b1db8f77b105dfb25.js"],"component---src-pages-templates-project-tsx":["/component---src-pages-templates-project-tsx-0f155fa91f86221dfd2e.js"],"component---src-pages-templates-projects-tsx":["/component---src-pages-templates-projects-tsx-05e1354e259380d8d7ed.js"],"component---src-pages-templates-services-tsx":["/component---src-pages-templates-services-tsx-e4d2d12096012ba30740.js"],"component---src-pages-templates-workflow-tsx":["/component---src-pages-templates-workflow-tsx-10c8768c64c0db9f80c2.js"]} \ No newline at end of file +{"app":["/app-482697764f835926dc92.js"],"component---src-pages-templates-404-tsx":["/component---src-pages-templates-404-tsx-1ec7dcfded6e73efef91.js"],"component---src-pages-templates-blog-by-author-tsx":["/component---src-pages-templates-blog-by-author-tsx-fb7314d489c2682e7da0.js"],"component---src-pages-templates-blog-by-hashtag-tsx":["/component---src-pages-templates-blog-by-hashtag-tsx-2076682d0e3e44045f00.js"],"component---src-pages-templates-blog-tsx":["/component---src-pages-templates-blog-tsx-ae37a37910d4ce46256c.js"],"component---src-pages-templates-index-tsx":["/component---src-pages-templates-index-tsx-c79944ee44040195a3eb.js"],"component---src-pages-templates-policies-tsx":["/component---src-pages-templates-policies-tsx-359925d45492160d5e8b.js"],"component---src-pages-templates-post-tsx":["/component---src-pages-templates-post-tsx-f41bd2e7c5e393acf3b9.js"],"component---src-pages-templates-project-tsx":["/component---src-pages-templates-project-tsx-0f155fa91f86221dfd2e.js"],"component---src-pages-templates-projects-tsx":["/component---src-pages-templates-projects-tsx-05e1354e259380d8d7ed.js"],"component---src-pages-templates-services-tsx":["/component---src-pages-templates-services-tsx-e4d2d12096012ba30740.js"],"component---src-pages-templates-workflow-tsx":["/component---src-pages-templates-workflow-tsx-10c8768c64c0db9f80c2.js"]} \ No newline at end of file diff --git a/component---src-pages-templates-post-tsx-4f0b1db8f77b105dfb25.js.map b/component---src-pages-templates-post-tsx-4f0b1db8f77b105dfb25.js.map deleted file mode 100644 index 9c66c7b5..00000000 --- a/component---src-pages-templates-post-tsx-4f0b1db8f77b105dfb25.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"component---src-pages-templates-post-tsx-4f0b1db8f77b105dfb25.js","mappings":"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","sources":["webpack://code-cave/./node_modules/@react-icons/all-files/fa/FaFacebook.js","webpack://code-cave/./node_modules/@react-icons/all-files/fa/FaGoogle.js","webpack://code-cave/./node_modules/@react-icons/all-files/fa/FaPinterest.js","webpack://code-cave/./src/components/posts/postAuthorCard.tsx","webpack://code-cave/./src/components/posts/shareButtons.tsx","webpack://code-cave/./src/components/posts/postFooter.tsx","webpack://code-cave/./src/components/posts/postHashtags.tsx","webpack://code-cave/./node_modules/@giscus/react/dist/index.js","webpack://code-cave/./src/components/posts/comments.tsx","webpack://code-cave/./src/pagesTemplates/post.tsx","webpack://code-cave/./src/assets/posts/X.svg"],"sourcesContent":["// THIS FILE IS AUTO GENERATED\nvar GenIcon = require('../lib').GenIcon\nmodule.exports.FaFacebook = function FaFacebook (props) {\n return GenIcon({\"tag\":\"svg\",\"attr\":{\"viewBox\":\"0 0 512 512\"},\"child\":[{\"tag\":\"path\",\"attr\":{\"d\":\"M504 256C504 119 393 8 256 8S8 119 8 256c0 123.78 90.69 226.38 209.25 245V327.69h-63V256h63v-54.64c0-62.15 37-96.48 93.67-96.48 27.14 0 55.52 4.84 55.52 4.84v61h-31.28c-30.8 0-40.41 19.12-40.41 38.73V256h68.78l-11 71.69h-57.78V501C413.31 482.38 504 379.78 504 256z\"}}]})(props);\n};\n","// THIS FILE IS AUTO GENERATED\nvar GenIcon = require('../lib').GenIcon\nmodule.exports.FaGoogle = function FaGoogle (props) {\n return GenIcon({\"tag\":\"svg\",\"attr\":{\"viewBox\":\"0 0 488 512\"},\"child\":[{\"tag\":\"path\",\"attr\":{\"d\":\"M488 261.8C488 403.3 391.1 504 248 504 110.8 504 0 393.2 0 256S110.8 8 248 8c66.8 0 123 24.5 166.3 64.9l-67.5 64.9C258.5 52.6 94.3 116.6 94.3 256c0 86.5 69.1 156.6 153.7 156.6 98.2 0 135-70.4 140.8-106.9H248v-85.3h236.1c2.3 12.7 3.9 24.9 3.9 41.4z\"}}]})(props);\n};\n","// THIS FILE IS AUTO GENERATED\nvar GenIcon = require('../lib').GenIcon\nmodule.exports.FaPinterest = function FaPinterest (props) {\n return GenIcon({\"tag\":\"svg\",\"attr\":{\"viewBox\":\"0 0 496 512\"},\"child\":[{\"tag\":\"path\",\"attr\":{\"d\":\"M496 256c0 137-111 248-248 248-25.6 0-50.2-3.9-73.4-11.1 10.1-16.5 25.2-43.5 30.8-65 3-11.6 15.4-59 15.4-59 8.1 15.4 31.7 28.5 56.8 28.5 74.8 0 128.7-68.8 128.7-154.3 0-81.9-66.9-143.2-152.9-143.2-107 0-163.9 71.8-163.9 150.1 0 36.4 19.4 81.7 50.3 96.1 4.7 2.2 7.2 1.2 8.3-3.3.8-3.4 5-20.3 6.9-28.1.6-2.5.3-4.7-1.7-7.1-10.1-12.5-18.3-35.3-18.3-56.6 0-54.7 41.4-107.6 112-107.6 60.9 0 103.6 41.5 103.6 100.9 0 67.1-33.9 113.6-78 113.6-24.3 0-42.6-20.1-36.7-44.8 7-29.5 20.5-61.3 20.5-82.6 0-19-10.2-34.9-31.4-34.9-24.9 0-44.9 25.7-44.9 60.2 0 22 7.4 36.8 7.4 36.8s-24.5 103.8-29 123.2c-5 21.4-3 51.6-.9 71.2C65.4 450.9 0 361.1 0 256 0 119 111 8 248 8s248 111 248 248z\"}}]})(props);\n};\n","import React from \"react\";\nimport { Link } from \"gatsby\";\nimport { GatsbyImage, getImage } from \"gatsby-plugin-image\";\n\nimport { IPostAuthor } from \"../../types/post.type\";\n\nconst PostAuthorCard = ({\n authorAlias,\n author,\n authorPosition,\n authorPhoto,\n}: IPostAuthor) => {\n const avatar = getImage(authorPhoto);\n\n return (\n \n {avatar ? (\n \n ) : null}\n

\n

\n {author}\n

\n

\n {authorPosition}\n

\n
\n \n );\n};\n\nexport default PostAuthorCard;\n","import React from \"react\";\n\nimport X from \"../../assets/posts/X.svg\";\nimport { FaPinterest } from \"@react-icons/all-files/fa/FaPinterest\";\nimport { FaLinkedin } from \"@react-icons/all-files/fa/FaLinkedin\";\nimport { FaGoogle } from \"@react-icons/all-files/fa/FaGoogle\";\nimport { FaFacebook } from \"@react-icons/all-files/fa/FaFacebook\";\n\nconst ShareButtons = ({\n url,\n postTitle,\n shareTitle,\n}: {\n url: string;\n postTitle: string;\n shareTitle: string;\n}) => {\n return (\n
\n

{shareTitle}

\n\n
\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
\n
\n );\n};\n\nexport const ShareButton = ({\n url,\n media,\n children,\n}: React.PropsWithChildren<{ url: string; media: string }>) => {\n return (\n \n {children}\n \n );\n};\n\nexport default ShareButtons;\n","import React from \"react\";\nimport { graphql, useStaticQuery } from \"gatsby\";\nimport { GatsbyImage, ImageDataLike, getImage } from \"gatsby-plugin-image\";\n\nconst PostFooter = ({ title, text }: { title: string; text: string }) => {\n const fileData = useStaticQuery(query) as { file: ImageDataLike | null };\n const image = getImage(fileData?.file);\n\n return (\n
\n {image ? (\n \n ) : null}\n
\n

{title}

\n

{text}

\n
\n
\n );\n};\n\nexport default PostFooter;\n\nexport const query = graphql`\n query {\n file(name: { eq: \"postFooterImage\" }) {\n childImageSharp {\n gatsbyImageData(\n formats: [AUTO, WEBP, AVIF]\n placeholder: BLURRED\n width: 160\n )\n }\n }\n }\n`;\n","import { Link } from \"gatsby\";\nimport React from \"react\";\n\nconst PostHashtags = ({\n keywords,\n readMoreTitle,\n}: {\n keywords: string[];\n readMoreTitle: string;\n}) => {\n return (\n
\n

{readMoreTitle}

\n
\n {keywords.map((hashtag) => (\n \n #{hashtag}\n \n ))}\n
\n
\n );\n};\n\nexport default PostHashtags;\n","import { jsx as b } from \"react/jsx-runtime\";\nimport { useState as j, useEffect as w } from \"react\";\nfunction G({ id: e, host: i, repo: r, repoId: o, category: u, categoryId: n, mapping: s, term: a, strict: f, reactionsEnabled: d, emitMetadata: m, inputPosition: c, theme: p, lang: l, loading: g }) {\n const [t, x] = j(!1);\n return w(() => {\n t || (import(\"./giscus-BNK3dBIH.js\"), x(!0));\n }, []), t ? b(\"giscus-widget\", { id: e, host: i, repo: r, repoid: o, category: u, categoryid: n, mapping: s, term: a, strict: f, reactionsenabled: d, emitmetadata: m, inputposition: c, theme: p, lang: l, loading: g }) : null;\n}\nexport {\n G as default\n};\n","import React, { useEffect, useState } from \"react\";\nimport Giscus from \"@giscus/react\";\n\nimport { ICommentsSetup, TLang } from \"../../types/common.type\";\n\nconst Comments = ({ setup, lang }: { setup: ICommentsSetup; lang: TLang }) => {\n const [_, updComponent] = useState();\n\n useEffect(() => {\n if (typeof window == undefined) return;\n\n const handleMessage = (event: MessageEvent) => {\n if (event.origin !== \"https://giscus.app\") return;\n if (!(typeof event.data === \"object\" && event.data.giscus)) return;\n\n updComponent({});\n };\n\n window.addEventListener(\"message\", handleMessage);\n\n return () => window.removeEventListener(\"message\", handleMessage);\n }, []);\n\n return (\n
\n \n
\n );\n};\n\nexport default Comments;\n","import React from \"react\";\nimport { HeadFC, Link, PageProps, graphql } from \"gatsby\";\nimport { useLocation } from \"@reach/router\";\n\nimport { IPostPageContext, IPostQueryResult } from \"../types/post.type\";\n\nimport { HeadSeo, LocalBusinessMetadata } from \"../components/common/metadata\";\nimport ContentContainer from \"../components/common/contentContainer\";\nimport ShareButtons from \"../components/posts/shareButtons\";\nimport PostFooter from \"../components/posts/postFooter\";\nimport PostHashtags from \"../components/posts/postHashtags\";\nimport PostAuthorCard from \"../components/posts/postAuthorCard\";\nimport Comments from \"../components/posts/comments\";\n\nconst Post = ({\n data: {\n post: {\n frontmatter,\n html,\n wordCount: { words },\n },\n author: authorData,\n },\n pageContext: { markupData, lang, site },\n}: PageProps) => {\n const { href: currentUrl } = useLocation();\n\n const { date, title, keywords } = frontmatter;\n const { authorAlias, author, authorPosition, authorPhoto } =\n authorData.frontmatter;\n\n const minutes = Math.floor(words / 200);\n const readingTime = minutes ? minutes : 1;\n\n return (\n <>\n \n \n \n\n
\n {date}\n\n \n {`${readingTime} ${markupData?.readingTimeUnits} ${markupData?.readingTimeTitle}`}\n \n
\n\n \n {title}\n \n\n \n\n
\n {keywords ? (\n \n ) : null}\n\n \n
\n\n \n\n \n \n \n
\n \n );\n};\n\nexport default Post;\n\nexport const Head: HeadFC = ({\n data: {\n post: {\n frontmatter: { title, text },\n },\n },\n pageContext,\n location,\n}) => (\n \n);\n\nexport const query = graphql`\n query ($id: String, $lang: String, $authorId: String) {\n post: markdownRemark(id: { eq: $id }) {\n frontmatter {\n date(formatString: \"DD MMM YYYY\", locale: $lang)\n title\n text\n keywords\n }\n html\n wordCount {\n words\n }\n }\n author: markdownRemark(id: { eq: $authorId }) {\n frontmatter {\n authorAlias\n author\n authorPosition\n authorPhoto {\n childImageSharp {\n gatsbyImageData(\n width: 64\n formats: [AUTO, WEBP, AVIF]\n placeholder: BLURRED\n )\n }\n }\n }\n }\n }\n`;\n","var React = require('react');\n\nfunction X (props) {\n return React.createElement(\"svg\",props,[React.createElement(\"g\",{\"clipPath\":\"url(#clip0_1390_2975)\",\"key\":0},React.createElement(\"path\",{\"d\":\"M15.7511 0H18.8178L12.1179 8.47193L20 20H13.8282L8.99457 13.0081L3.46363 20H0.394883L7.56109 10.9385L0 0H6.32809L10.6975 6.39068L15.7511 0ZM14.6747 17.9691H16.3741L5.40481 1.92425H3.58137L14.6747 17.9691Z\",\"fill\":\"#E4E4E4\"})),React.createElement(\"defs\",{\"key\":1},React.createElement(\"clipPath\",{\"id\":\"clip0_1390_2975\"},React.createElement(\"rect\",{\"width\":\"20\",\"height\":\"20\",\"fill\":\"white\"})))]);\n}\n\nX.defaultProps = {\"width\":\"20\",\"height\":\"20\",\"viewBox\":\"0 0 20 20\",\"fill\":\"none\"};\n\nmodule.exports = X;\n\nX.default = X;\n"],"names":["GenIcon","module","exports","props","_ref","authorAlias","author","authorPosition","authorPhoto","avatar","getImage","___EmotionJSX","Link","to","split","join","toLowerCase","title","itemProp","itemScope","itemType","className","GatsbyImage","image","alt","ShareButton","_ref2","url","media","children","href","rel","target","postTitle","shareTitle","X","FaPinterest","size","FaLinkedin","FaGoogle","FaFacebook","text","fileData","useStaticQuery","query","file","keywords","readMoreTitle","map","hashtag","key","G","id","e","host","i","repo","r","repoId","o","category","u","categoryId","n","mapping","s","term","a","strict","f","reactionsEnabled","d","emitMetadata","m","inputPosition","c","theme","p","lang","l","loading","g","t","x","repoid","categoryid","reactionsenabled","emitmetadata","inputposition","setup","_","updComponent","useState","useEffect","undefined","window","handleMessage","event","origin","data","giscus","addEventListener","removeEventListener","Giscus","post","frontmatter","html","wordCount","words","authorData","pageContext","markupData","site","currentUrl","useLocation","date","minutes","Math","floor","readingTime","React","ContentContainer","maxWidthClass","PostAuthorCard","readingTimeUnits","readingTimeTitle","dangerouslySetInnerHTML","__html","PostHashtags","readMoreOnTopicTitle","ShareButtons","sharePostTitle","PostFooter","postFooterTitle","postFooterText","Comments","commentsSetup","LocalBusinessMetadata","Head","location","HeadSeo","head","toUpperCase","siteUrl","description","slice","path","pathname","createElement","defaultProps","default"],"sourceRoot":""} \ No newline at end of file diff --git a/component---src-pages-templates-post-tsx-4f0b1db8f77b105dfb25.js b/component---src-pages-templates-post-tsx-f41bd2e7c5e393acf3b9.js similarity index 68% rename from component---src-pages-templates-post-tsx-4f0b1db8f77b105dfb25.js rename to component---src-pages-templates-post-tsx-f41bd2e7c5e393acf3b9.js index be11070b..5a41ff86 100644 --- a/component---src-pages-templates-post-tsx-4f0b1db8f77b105dfb25.js +++ b/component---src-pages-templates-post-tsx-f41bd2e7c5e393acf3b9.js @@ -1,2 +1,2 @@ -(self.webpackChunkcode_cave=self.webpackChunkcode_cave||[]).push([[354],{1237:function(t,e,a){var r=a(9720).w_;t.exports.A=function(t){return r({tag:"svg",attr:{viewBox:"0 0 512 512"},child:[{tag:"path",attr:{d:"M504 256C504 119 393 8 256 8S8 119 8 256c0 123.78 90.69 226.38 209.25 245V327.69h-63V256h63v-54.64c0-62.15 37-96.48 93.67-96.48 27.14 0 55.52 4.84 55.52 4.84v61h-31.28c-30.8 0-40.41 19.12-40.41 38.73V256h68.78l-11 71.69h-57.78V501C413.31 482.38 504 379.78 504 256z"}}]})(t)}},2651:function(t,e,a){var r=a(9720).w_;t.exports.l=function(t){return r({tag:"svg",attr:{viewBox:"0 0 488 512"},child:[{tag:"path",attr:{d:"M488 261.8C488 403.3 391.1 504 248 504 110.8 504 0 393.2 0 256S110.8 8 248 8c66.8 0 123 24.5 166.3 64.9l-67.5 64.9C258.5 52.6 94.3 116.6 94.3 256c0 86.5 69.1 156.6 153.7 156.6 98.2 0 135-70.4 140.8-106.9H248v-85.3h236.1c2.3 12.7 3.9 24.9 3.9 41.4z"}}]})(t)}},1112:function(t,e,a){var r=a(9720).w_;t.exports.o=function(t){return r({tag:"svg",attr:{viewBox:"0 0 496 512"},child:[{tag:"path",attr:{d:"M496 256c0 137-111 248-248 248-25.6 0-50.2-3.9-73.4-11.1 10.1-16.5 25.2-43.5 30.8-65 3-11.6 15.4-59 15.4-59 8.1 15.4 31.7 28.5 56.8 28.5 74.8 0 128.7-68.8 128.7-154.3 0-81.9-66.9-143.2-152.9-143.2-107 0-163.9 71.8-163.9 150.1 0 36.4 19.4 81.7 50.3 96.1 4.7 2.2 7.2 1.2 8.3-3.3.8-3.4 5-20.3 6.9-28.1.6-2.5.3-4.7-1.7-7.1-10.1-12.5-18.3-35.3-18.3-56.6 0-54.7 41.4-107.6 112-107.6 60.9 0 103.6 41.5 103.6 100.9 0 67.1-33.9 113.6-78 113.6-24.3 0-42.6-20.1-36.7-44.8 7-29.5 20.5-61.3 20.5-82.6 0-19-10.2-34.9-31.4-34.9-24.9 0-44.9 25.7-44.9 60.2 0 22 7.4 36.8 7.4 36.8s-24.5 103.8-29 123.2c-5 21.4-3 51.6-.9 71.2C65.4 450.9 0 361.1 0 256 0 119 111 8 248 8s248 111 248 248z"}}]})(t)}},4404:function(t,e,a){"use strict";var r=a(4160),o=a(8032),s=a(917);e.Z=t=>{let{authorAlias:e,author:a,authorPosition:l,authorPhoto:i}=t;const n=(0,o.c)(i);return(0,s.tZ)(r.rU,{to:`/blog/${e.split(" ").join("-").toLowerCase()}`,title:`${a}'s blog`,itemProp:"author",itemScope:!0,itemType:"https://schema.org/Person",className:"flex items-center gap-4 mb-8 sm:mb-12 text-secondary-100 text-lg"},n?(0,s.tZ)(o.G,{image:n,alt:"avatar",itemProp:"image",className:"object-contain aspect-square rounded-full w-16 grayscale"}):null,(0,s.tZ)("div",{className:"flex-1 w-max"},(0,s.tZ)("p",{itemProp:"name",className:"font-semibold whitespace-nowrap"},a),(0,s.tZ)("p",{itemProp:"jobTitle",className:"text-secondary-30"},l)))}},7724:function(t,e,a){"use strict";a.r(e),a.d(e,{Head:function(){return $},default:function(){return k}});var r=a(7294),o=a(7896),s=a(9165),l=a(1164),i=a(4528),n=a.n(i),c=a(1112),m=a(5337),p=a(2651),d=a(1237),u=a(917);const h=t=>{let{url:e,media:a,children:r}=t;return(0,u.tZ)("a",{href:e,rel:"noopener noreferrer",target:"_blank",title:`Share on ${a}`,className:"hover:brightness-75"},r)};var g=t=>{let{url:e,postTitle:a,shareTitle:r}=t;return(0,u.tZ)("div",{className:"sm:basis-52 sm:shrink-0"},(0,u.tZ)("p",{className:"text-lg font-bold mb-5"},r),(0,u.tZ)("div",{className:"flex w-full items-center justify-evenly sm:justify-between py-2.5"},(0,u.tZ)(h,{media:"Twitter",url:`http://twitter.com/share?text=${a}&url=${e}`},(0,u.tZ)(n(),null)),(0,u.tZ)(h,{media:"Pinterest",url:`http://pinterest.com/pin/create/button/?url=${e}&description=${a}`},(0,u.tZ)(c.o,{size:"20px"})),(0,u.tZ)(h,{media:"Linkedin",url:`http://www.linkedin.com/shareArticle?mini=true&url=${e}&title=${a}&source=CodeCave`},(0,u.tZ)(m.l,{size:"20px"})),(0,u.tZ)(h,{media:"Google+",url:`https://plus.google.com/share?url=${e}`},(0,u.tZ)(p.l,{size:"20px"})),(0,u.tZ)(h,{media:"Facebook",url:`https://www.facebook.com/sharer/sharer.php?u=${e}&p[title]=${a}`},(0,u.tZ)(d.A,{size:"20px"}))))},f=a(4160),x=a(8032);var Z=t=>{let{title:e,text:a}=t;const r=(0,f.K2)(w),o=(0,x.c)(null==r?void 0:r.file);return(0,u.tZ)("div",{className:"flex flex-col sm:flex-row items-center w-full sm:px-12 mb-8 gap-5 justify-center"},o?(0,u.tZ)(x.G,{image:o,alt:"like",className:"object-contain aspect-square h-40"}):null,(0,u.tZ)("div",{className:"flex-1"},(0,u.tZ)("p",{className:"text-lg font-bold mb-5"},e),(0,u.tZ)("p",{className:"text-base"},a)))};const w="639074693";var b=t=>{let{keywords:e,readMoreTitle:a}=t;return(0,u.tZ)("div",{className:"w-full"},(0,u.tZ)("p",{className:"text-lg font-bold mb-5"},a),(0,u.tZ)("div",{className:"flex flex-wrap gap-2"},e.map((t=>(0,u.tZ)(f.rU,{key:t,to:`/blog/${t.split(" ").join("-").toLowerCase()}`,title:`blog about ${t}`,className:"text-sm text-secondary-10 border border-solid border-secondary-10 rounded-full px-5 py-2.5 hover:border-secondary-100 hover:text-secondary-100 hover:bg-main-70"},"#",(0,u.tZ)("span",{itemProp:"keywords"},t))))))},v=a(4404),y=a(5893);function N({id:t,host:e,repo:o,repoId:s,category:l,categoryId:i,mapping:n,term:c,strict:m,reactionsEnabled:p,emitMetadata:d,inputPosition:u,theme:h,lang:g,loading:f}){const[x,Z]=(0,r.useState)(!1);return(0,r.useEffect)((()=>{x||(a.e(355).then(a.bind(a,4355)),Z(!0))}),[]),x?(0,y.jsx)("giscus-widget",{id:t,host:e,repo:o,repoid:s,category:l,categoryid:i,mapping:n,term:c,strict:m,reactionsenabled:p,emitmetadata:d,inputposition:u,theme:h,lang:g,loading:f}):null}var P=t=>{let{setup:e,lang:a}=t;const{0:o,1:s}=(0,r.useState)();return(0,r.useEffect)((()=>{if(null==typeof window)return;const t=t=>{"https://giscus.app"===t.origin&&"object"==typeof t.data&&t.data.giscus&&s({})};return window.addEventListener("message",t),()=>window.removeEventListener("message",t)}),[]),(0,u.tZ)("div",{className:"w-full mb-8 grayscale brightness-[1.4]"},(0,u.tZ)(N,{id:"comments",repo:e.repo,repoId:e.repoId,category:"Announcements",categoryId:e.categoryId,mapping:"pathname",reactionsEnabled:"0",emitMetadata:"0",inputPosition:"top",theme:"transparent_dark",lang:a,loading:"lazy"}))};var k=t=>{let{data:{post:{frontmatter:e,html:a,wordCount:{words:i}},author:n},pageContext:{markupData:c,lang:m,site:p}}=t;const{href:d}=(0,o.useLocation)(),{date:h,title:f,keywords:x}=e,{authorAlias:w,author:y,authorPosition:N,authorPhoto:k}=n.frontmatter,$=Math.floor(i/200),T=$||1;return(0,u.tZ)(r.Fragment,null,(0,u.tZ)("div",{itemScope:!0,itemType:"https://schema.org/Article",className:"flex bg-main-100"},(0,u.tZ)(l.Z,{maxWidthClass:"max-w-2xl",className:"flex-col text-secondary-100 text-lg md:!px-0 pt-8 sm:pt-16"},(0,u.tZ)(v.Z,{authorAlias:w,author:y,authorPhoto:k,authorPosition:N}),(0,u.tZ)("div",{className:"w-full flex items-center justify-between mb-2.5 sm:mb-5 text-sm sm:text-base"},(0,u.tZ)("span",{itemProp:"datePublished"},h),(0,u.tZ)("span",null,`${T} ${null==c?void 0:c.readingTimeUnits} ${null==c?void 0:c.readingTimeTitle}`)),(0,u.tZ)("h1",{className:"text-[24px] sm:text-4xl font-semibold mb-8",itemProp:"headline"},f),(0,u.tZ)("article",{className:"single-post",dangerouslySetInnerHTML:{__html:a},itemProp:"articleBody"}),(0,u.tZ)("div",{className:"flex flex-col sm:flex-row w-full gap-8 lg:gap-16 mb-8 md:mb-12"},x?(0,u.tZ)(b,{keywords:x,readMoreTitle:c.readMoreOnTopicTitle}):null,(0,u.tZ)(g,{url:d,postTitle:f,shareTitle:c.sharePostTitle})),(0,u.tZ)(Z,{title:c.postFooterTitle,text:c.postFooterText}),(0,u.tZ)(P,{setup:p.commentsSetup,lang:m})),(0,u.tZ)(s.Lx,{itemProp:"copyrightHolder",lang:m})))};const $=t=>{let{data:{post:{frontmatter:{title:e,text:a}}},pageContext:r,location:o}=t;return(0,u.tZ)(s.Ag,{title:`${r.markupData.head} | ${e.toUpperCase()}`,siteUrl:r.site.siteUrl,description:`${a.split(" ").slice(0,22).join(" ")}...`,path:o.pathname,lang:r.lang})}},4528:function(t,e,a){var r=a(7294);function o(t){return r.createElement("svg",t,[r.createElement("g",{clipPath:"url(#clip0_1390_2975)",key:0},r.createElement("path",{d:"M15.7511 0H18.8178L12.1179 8.47193L20 20H13.8282L8.99457 13.0081L3.46363 20H0.394883L7.56109 10.9385L0 0H6.32809L10.6975 6.39068L15.7511 0ZM14.6747 17.9691H16.3741L5.40481 1.92425H3.58137L14.6747 17.9691Z",fill:"#E4E4E4"})),r.createElement("defs",{key:1},r.createElement("clipPath",{id:"clip0_1390_2975"},r.createElement("rect",{width:"20",height:"20",fill:"white"})))])}o.defaultProps={width:"20",height:"20",viewBox:"0 0 20 20",fill:"none"},t.exports=o,o.default=o}}]); -//# sourceMappingURL=component---src-pages-templates-post-tsx-4f0b1db8f77b105dfb25.js.map \ No newline at end of file +(self.webpackChunkcode_cave=self.webpackChunkcode_cave||[]).push([[354],{1237:function(t,e,a){var r=a(9720).w_;t.exports.A=function(t){return r({tag:"svg",attr:{viewBox:"0 0 512 512"},child:[{tag:"path",attr:{d:"M504 256C504 119 393 8 256 8S8 119 8 256c0 123.78 90.69 226.38 209.25 245V327.69h-63V256h63v-54.64c0-62.15 37-96.48 93.67-96.48 27.14 0 55.52 4.84 55.52 4.84v61h-31.28c-30.8 0-40.41 19.12-40.41 38.73V256h68.78l-11 71.69h-57.78V501C413.31 482.38 504 379.78 504 256z"}}]})(t)}},2651:function(t,e,a){var r=a(9720).w_;t.exports.l=function(t){return r({tag:"svg",attr:{viewBox:"0 0 488 512"},child:[{tag:"path",attr:{d:"M488 261.8C488 403.3 391.1 504 248 504 110.8 504 0 393.2 0 256S110.8 8 248 8c66.8 0 123 24.5 166.3 64.9l-67.5 64.9C258.5 52.6 94.3 116.6 94.3 256c0 86.5 69.1 156.6 153.7 156.6 98.2 0 135-70.4 140.8-106.9H248v-85.3h236.1c2.3 12.7 3.9 24.9 3.9 41.4z"}}]})(t)}},1112:function(t,e,a){var r=a(9720).w_;t.exports.o=function(t){return r({tag:"svg",attr:{viewBox:"0 0 496 512"},child:[{tag:"path",attr:{d:"M496 256c0 137-111 248-248 248-25.6 0-50.2-3.9-73.4-11.1 10.1-16.5 25.2-43.5 30.8-65 3-11.6 15.4-59 15.4-59 8.1 15.4 31.7 28.5 56.8 28.5 74.8 0 128.7-68.8 128.7-154.3 0-81.9-66.9-143.2-152.9-143.2-107 0-163.9 71.8-163.9 150.1 0 36.4 19.4 81.7 50.3 96.1 4.7 2.2 7.2 1.2 8.3-3.3.8-3.4 5-20.3 6.9-28.1.6-2.5.3-4.7-1.7-7.1-10.1-12.5-18.3-35.3-18.3-56.6 0-54.7 41.4-107.6 112-107.6 60.9 0 103.6 41.5 103.6 100.9 0 67.1-33.9 113.6-78 113.6-24.3 0-42.6-20.1-36.7-44.8 7-29.5 20.5-61.3 20.5-82.6 0-19-10.2-34.9-31.4-34.9-24.9 0-44.9 25.7-44.9 60.2 0 22 7.4 36.8 7.4 36.8s-24.5 103.8-29 123.2c-5 21.4-3 51.6-.9 71.2C65.4 450.9 0 361.1 0 256 0 119 111 8 248 8s248 111 248 248z"}}]})(t)}},4404:function(t,e,a){"use strict";var r=a(4160),o=a(8032),l=a(917);e.Z=t=>{let{authorAlias:e,author:a,authorPosition:s,authorPhoto:i}=t;const n=(0,o.c)(i);return(0,l.tZ)(r.rU,{to:`/blog/${e.split(" ").join("-").toLowerCase()}`,title:`${a}'s blog`,itemProp:"author",itemScope:!0,itemType:"https://schema.org/Person",className:"flex items-center gap-4 mb-8 sm:mb-12 text-secondary-100 text-lg"},n?(0,l.tZ)(o.G,{image:n,alt:"avatar",itemProp:"image",className:"object-contain aspect-square rounded-full w-16 grayscale"}):null,(0,l.tZ)("div",{className:"flex-1 w-max"},(0,l.tZ)("p",{itemProp:"name",className:"font-semibold whitespace-nowrap"},a),(0,l.tZ)("p",{itemProp:"jobTitle",className:"text-secondary-30"},s)))}},7724:function(t,e,a){"use strict";a.r(e),a.d(e,{Head:function(){return $},default:function(){return k}});var r=a(7294),o=a(7896),l=a(9165),s=a(1164),i=a(4528),n=a.n(i),c=a(1112),m=a(5337),p=a(2651),d=a(1237),u=a(917);const h=t=>{let{url:e,media:a,children:r}=t;return(0,u.tZ)("a",{href:e,rel:"noopener noreferrer",target:"_blank",title:`Share on ${a}`,className:"hover:brightness-75"},r)};var g=t=>{let{url:e,postTitle:a,shareTitle:r}=t;return(0,u.tZ)("div",{className:"sm:basis-52 sm:shrink-0"},(0,u.tZ)("p",{className:"text-lg font-bold mb-5"},r),(0,u.tZ)("div",{className:"flex w-full items-center justify-evenly sm:justify-between py-2.5"},(0,u.tZ)(h,{media:"Twitter",url:`http://twitter.com/share?text=${a}&url=${e}`},(0,u.tZ)(n(),null)),(0,u.tZ)(h,{media:"Pinterest",url:`http://pinterest.com/pin/create/button/?url=${e}&description=${a}`},(0,u.tZ)(c.o,{size:"20px"})),(0,u.tZ)(h,{media:"Linkedin",url:`http://www.linkedin.com/shareArticle?mini=true&url=${e}&title=${a}&source=CodeCave`},(0,u.tZ)(m.l,{size:"20px"})),(0,u.tZ)(h,{media:"Google+",url:`https://plus.google.com/share?url=${e}`},(0,u.tZ)(p.l,{size:"20px"})),(0,u.tZ)(h,{media:"Facebook",url:`https://www.facebook.com/sharer/sharer.php?u=${e}&p[title]=${a}`},(0,u.tZ)(d.A,{size:"20px"}))))},f=a(4160),x=a(8032);var v=t=>{let{title:e,text:a}=t;const r=(0,f.K2)(Z),o=(0,x.c)(null==r?void 0:r.file);return(0,u.tZ)("div",{className:"flex flex-col sm:flex-row items-center w-full sm:px-12 mb-8 gap-5 justify-center"},o?(0,u.tZ)(x.G,{image:o,alt:"like",className:"object-contain aspect-square h-40"}):null,(0,u.tZ)("div",{className:"flex-1"},(0,u.tZ)("p",{className:"text-lg font-bold mb-5"},e),(0,u.tZ)("p",{className:"text-base"},a)))};const Z="639074693";var b=t=>{let{keywords:e,readMoreTitle:a}=t;return(0,u.tZ)("div",{className:"w-full"},(0,u.tZ)("p",{className:"text-lg font-bold mb-5"},a),(0,u.tZ)("div",{className:"flex flex-wrap gap-2"},e.map((t=>(0,u.tZ)(f.rU,{key:t,to:`/blog/${t.split(" ").join("-").toLowerCase()}`,title:`blog about ${t}`,className:"text-sm text-secondary-10 border border-solid border-secondary-10 rounded-full px-5 py-2.5 hover:border-secondary-100 hover:text-secondary-100 hover:bg-main-70"},"#",(0,u.tZ)("span",{itemProp:"keywords"},t))))))},w=a(4404),y=a(5893);function N({id:t,host:e,repo:o,repoId:l,category:s,categoryId:i,mapping:n,term:c,strict:m,reactionsEnabled:p,emitMetadata:d,inputPosition:u,theme:h,lang:g,loading:f}){const[x,v]=(0,r.useState)(!1);return(0,r.useEffect)((()=>{x||(a.e(355).then(a.bind(a,4355)),v(!0))}),[]),x?(0,y.jsx)("giscus-widget",{id:t,host:e,repo:o,repoid:l,category:s,categoryid:i,mapping:n,term:c,strict:m,reactionsenabled:p,emitmetadata:d,inputposition:u,theme:h,lang:g,loading:f}):null}var P=t=>{let{setup:e,lang:a}=t;const{0:o,1:l}=(0,r.useState)();return(0,r.useEffect)((()=>{if(null==typeof window)return;const t=t=>{"https://giscus.app"===t.origin&&"object"==typeof t.data&&t.data.giscus&&l({})};return window.addEventListener("message",t),()=>window.removeEventListener("message",t)}),[]),(0,u.tZ)("div",{className:"w-full mb-8 grayscale brightness-[1.4]"},(0,u.tZ)(N,{id:"comments",repo:e.repo,repoId:e.repoId,category:"Announcements",categoryId:e.categoryId,mapping:"pathname",reactionsEnabled:"0",emitMetadata:"0",inputPosition:"top",theme:"transparent_dark",lang:a,loading:"lazy"}))};var k=t=>{let{data:{post:{frontmatter:e,html:a,wordCount:{words:i}},author:n},pageContext:{markupData:c,lang:m,site:p}}=t;const{href:d}=(0,o.useLocation)(),{date:h,title:f,keywords:x}=e,{authorAlias:Z,author:y,authorPosition:N,authorPhoto:k}=n.frontmatter,$=Math.floor(i/200),T=$||1;return(0,u.tZ)(r.Fragment,null,(0,u.tZ)("div",{itemScope:!0,itemType:"https://schema.org/Article",className:"flex bg-main-100"},(0,u.tZ)(s.Z,{maxWidthClass:"max-w-2xl",className:"flex-col text-secondary-100 text-lg md:!px-0 pt-8 sm:pt-16"},(0,u.tZ)(w.Z,{authorAlias:Z,author:y,authorPhoto:k,authorPosition:N}),(0,u.tZ)("div",{className:"w-full flex items-center justify-between mb-2.5 sm:mb-5 text-sm sm:text-base"},(0,u.tZ)("span",{itemProp:"datePublished"},h),(0,u.tZ)("span",null,`${T} ${null==c?void 0:c.readingTimeUnits} ${null==c?void 0:c.readingTimeTitle}`)),(0,u.tZ)("h1",{className:"text-[24px] sm:text-4xl font-semibold mb-8",itemProp:"headline"},f),(0,u.tZ)("article",{className:"single-post",dangerouslySetInnerHTML:{__html:a},itemProp:"articleBody"}),(0,u.tZ)("div",{className:"flex flex-col sm:flex-row w-full gap-8 lg:gap-16 mb-8 md:mb-12"},x?(0,u.tZ)(b,{keywords:x,readMoreTitle:c.readMoreOnTopicTitle}):null,(0,u.tZ)(g,{url:d,postTitle:f,shareTitle:c.sharePostTitle})),(0,u.tZ)(v,{title:c.postFooterTitle,text:c.postFooterText}),(0,u.tZ)(P,{setup:p.commentsSetup,lang:m})),(0,u.tZ)(l.Lx,{itemProp:"copyrightHolder",lang:m})))};const $=t=>{var e;let{data:{post:{frontmatter:{title:a,text:r,cover:o}}},pageContext:s,location:i}=t;var n=(0,x.c)(o);return(0,u.tZ)(l.Ag,{title:`${s.markupData.head} | ${a.toUpperCase()}`,siteUrl:s.site.siteUrl,description:`${r.split(" ").slice(0,22).join(" ")}...`,path:i.pathname,img:null==n||null===(e=n.images.fallback)||void 0===e?void 0:e.src,lang:s.lang})}},4528:function(t,e,a){var r=a(7294);function o(t){return r.createElement("svg",t,[r.createElement("g",{clipPath:"url(#clip0_1390_2975)",key:0},r.createElement("path",{d:"M15.7511 0H18.8178L12.1179 8.47193L20 20H13.8282L8.99457 13.0081L3.46363 20H0.394883L7.56109 10.9385L0 0H6.32809L10.6975 6.39068L15.7511 0ZM14.6747 17.9691H16.3741L5.40481 1.92425H3.58137L14.6747 17.9691Z",fill:"#E4E4E4"})),r.createElement("defs",{key:1},r.createElement("clipPath",{id:"clip0_1390_2975"},r.createElement("rect",{width:"20",height:"20",fill:"white"})))])}o.defaultProps={width:"20",height:"20",viewBox:"0 0 20 20",fill:"none"},t.exports=o,o.default=o}}]); +//# sourceMappingURL=component---src-pages-templates-post-tsx-f41bd2e7c5e393acf3b9.js.map \ No newline at end of file diff --git a/component---src-pages-templates-post-tsx-f41bd2e7c5e393acf3b9.js.map b/component---src-pages-templates-post-tsx-f41bd2e7c5e393acf3b9.js.map new file mode 100644 index 00000000..9d635d5d --- /dev/null +++ b/component---src-pages-templates-post-tsx-f41bd2e7c5e393acf3b9.js.map @@ -0,0 +1 @@ +{"version":3,"file":"component---src-pages-templates-post-tsx-f41bd2e7c5e393acf3b9.js","mappings":"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","sources":["webpack://code-cave/./node_modules/@react-icons/all-files/fa/FaFacebook.js","webpack://code-cave/./node_modules/@react-icons/all-files/fa/FaGoogle.js","webpack://code-cave/./node_modules/@react-icons/all-files/fa/FaPinterest.js","webpack://code-cave/./src/components/posts/postAuthorCard.tsx","webpack://code-cave/./src/components/posts/shareButtons.tsx","webpack://code-cave/./src/components/posts/postFooter.tsx","webpack://code-cave/./src/components/posts/postHashtags.tsx","webpack://code-cave/./node_modules/@giscus/react/dist/index.js","webpack://code-cave/./src/components/posts/comments.tsx","webpack://code-cave/./src/pagesTemplates/post.tsx","webpack://code-cave/./src/assets/posts/X.svg"],"sourcesContent":["// THIS FILE IS AUTO GENERATED\nvar GenIcon = require('../lib').GenIcon\nmodule.exports.FaFacebook = function FaFacebook (props) {\n return GenIcon({\"tag\":\"svg\",\"attr\":{\"viewBox\":\"0 0 512 512\"},\"child\":[{\"tag\":\"path\",\"attr\":{\"d\":\"M504 256C504 119 393 8 256 8S8 119 8 256c0 123.78 90.69 226.38 209.25 245V327.69h-63V256h63v-54.64c0-62.15 37-96.48 93.67-96.48 27.14 0 55.52 4.84 55.52 4.84v61h-31.28c-30.8 0-40.41 19.12-40.41 38.73V256h68.78l-11 71.69h-57.78V501C413.31 482.38 504 379.78 504 256z\"}}]})(props);\n};\n","// THIS FILE IS AUTO GENERATED\nvar GenIcon = require('../lib').GenIcon\nmodule.exports.FaGoogle = function FaGoogle (props) {\n return GenIcon({\"tag\":\"svg\",\"attr\":{\"viewBox\":\"0 0 488 512\"},\"child\":[{\"tag\":\"path\",\"attr\":{\"d\":\"M488 261.8C488 403.3 391.1 504 248 504 110.8 504 0 393.2 0 256S110.8 8 248 8c66.8 0 123 24.5 166.3 64.9l-67.5 64.9C258.5 52.6 94.3 116.6 94.3 256c0 86.5 69.1 156.6 153.7 156.6 98.2 0 135-70.4 140.8-106.9H248v-85.3h236.1c2.3 12.7 3.9 24.9 3.9 41.4z\"}}]})(props);\n};\n","// THIS FILE IS AUTO GENERATED\nvar GenIcon = require('../lib').GenIcon\nmodule.exports.FaPinterest = function FaPinterest (props) {\n return GenIcon({\"tag\":\"svg\",\"attr\":{\"viewBox\":\"0 0 496 512\"},\"child\":[{\"tag\":\"path\",\"attr\":{\"d\":\"M496 256c0 137-111 248-248 248-25.6 0-50.2-3.9-73.4-11.1 10.1-16.5 25.2-43.5 30.8-65 3-11.6 15.4-59 15.4-59 8.1 15.4 31.7 28.5 56.8 28.5 74.8 0 128.7-68.8 128.7-154.3 0-81.9-66.9-143.2-152.9-143.2-107 0-163.9 71.8-163.9 150.1 0 36.4 19.4 81.7 50.3 96.1 4.7 2.2 7.2 1.2 8.3-3.3.8-3.4 5-20.3 6.9-28.1.6-2.5.3-4.7-1.7-7.1-10.1-12.5-18.3-35.3-18.3-56.6 0-54.7 41.4-107.6 112-107.6 60.9 0 103.6 41.5 103.6 100.9 0 67.1-33.9 113.6-78 113.6-24.3 0-42.6-20.1-36.7-44.8 7-29.5 20.5-61.3 20.5-82.6 0-19-10.2-34.9-31.4-34.9-24.9 0-44.9 25.7-44.9 60.2 0 22 7.4 36.8 7.4 36.8s-24.5 103.8-29 123.2c-5 21.4-3 51.6-.9 71.2C65.4 450.9 0 361.1 0 256 0 119 111 8 248 8s248 111 248 248z\"}}]})(props);\n};\n","import React from \"react\";\nimport { Link } from \"gatsby\";\nimport { GatsbyImage, getImage } from \"gatsby-plugin-image\";\n\nimport { IPostAuthor } from \"../../types/post.type\";\n\nconst PostAuthorCard = ({\n authorAlias,\n author,\n authorPosition,\n authorPhoto,\n}: IPostAuthor) => {\n const avatar = getImage(authorPhoto);\n\n return (\n \n {avatar ? (\n \n ) : null}\n
\n

\n {author}\n

\n

\n {authorPosition}\n

\n
\n \n );\n};\n\nexport default PostAuthorCard;\n","import React from \"react\";\n\nimport X from \"../../assets/posts/X.svg\";\nimport { FaPinterest } from \"@react-icons/all-files/fa/FaPinterest\";\nimport { FaLinkedin } from \"@react-icons/all-files/fa/FaLinkedin\";\nimport { FaGoogle } from \"@react-icons/all-files/fa/FaGoogle\";\nimport { FaFacebook } from \"@react-icons/all-files/fa/FaFacebook\";\n\nconst ShareButtons = ({\n url,\n postTitle,\n shareTitle,\n}: {\n url: string;\n postTitle: string;\n shareTitle: string;\n}) => {\n return (\n
\n

{shareTitle}

\n\n
\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
\n
\n );\n};\n\nexport const ShareButton = ({\n url,\n media,\n children,\n}: React.PropsWithChildren<{ url: string; media: string }>) => {\n return (\n \n {children}\n \n );\n};\n\nexport default ShareButtons;\n","import React from \"react\";\nimport { graphql, useStaticQuery } from \"gatsby\";\nimport { GatsbyImage, ImageDataLike, getImage } from \"gatsby-plugin-image\";\n\nconst PostFooter = ({ title, text }: { title: string; text: string }) => {\n const fileData = useStaticQuery(query) as { file: ImageDataLike | null };\n const image = getImage(fileData?.file);\n\n return (\n
\n {image ? (\n \n ) : null}\n
\n

{title}

\n

{text}

\n
\n
\n );\n};\n\nexport default PostFooter;\n\nexport const query = graphql`\n query {\n file(name: { eq: \"postFooterImage\" }) {\n childImageSharp {\n gatsbyImageData(\n formats: [AUTO, WEBP, AVIF]\n placeholder: BLURRED\n width: 160\n )\n }\n }\n }\n`;\n","import { Link } from \"gatsby\";\nimport React from \"react\";\n\nconst PostHashtags = ({\n keywords,\n readMoreTitle,\n}: {\n keywords: string[];\n readMoreTitle: string;\n}) => {\n return (\n
\n

{readMoreTitle}

\n
\n {keywords.map((hashtag) => (\n \n #{hashtag}\n \n ))}\n
\n
\n );\n};\n\nexport default PostHashtags;\n","import { jsx as b } from \"react/jsx-runtime\";\nimport { useState as j, useEffect as w } from \"react\";\nfunction G({ id: e, host: i, repo: r, repoId: o, category: u, categoryId: n, mapping: s, term: a, strict: f, reactionsEnabled: d, emitMetadata: m, inputPosition: c, theme: p, lang: l, loading: g }) {\n const [t, x] = j(!1);\n return w(() => {\n t || (import(\"./giscus-BNK3dBIH.js\"), x(!0));\n }, []), t ? b(\"giscus-widget\", { id: e, host: i, repo: r, repoid: o, category: u, categoryid: n, mapping: s, term: a, strict: f, reactionsenabled: d, emitmetadata: m, inputposition: c, theme: p, lang: l, loading: g }) : null;\n}\nexport {\n G as default\n};\n","import React, { useEffect, useState } from \"react\";\nimport Giscus from \"@giscus/react\";\n\nimport { ICommentsSetup, TLang } from \"../../types/common.type\";\n\nconst Comments = ({ setup, lang }: { setup: ICommentsSetup; lang: TLang }) => {\n const [_, updComponent] = useState();\n\n useEffect(() => {\n if (typeof window == undefined) return;\n\n const handleMessage = (event: MessageEvent) => {\n if (event.origin !== \"https://giscus.app\") return;\n if (!(typeof event.data === \"object\" && event.data.giscus)) return;\n\n updComponent({});\n };\n\n window.addEventListener(\"message\", handleMessage);\n\n return () => window.removeEventListener(\"message\", handleMessage);\n }, []);\n\n return (\n
\n \n
\n );\n};\n\nexport default Comments;\n","import React from \"react\";\nimport { HeadFC, Link, PageProps, graphql } from \"gatsby\";\nimport { useLocation } from \"@reach/router\";\n\nimport { IPostPageContext, IPostQueryResult } from \"../types/post.type\";\n\nimport { HeadSeo, LocalBusinessMetadata } from \"../components/common/metadata\";\nimport ContentContainer from \"../components/common/contentContainer\";\nimport ShareButtons from \"../components/posts/shareButtons\";\nimport PostFooter from \"../components/posts/postFooter\";\nimport PostHashtags from \"../components/posts/postHashtags\";\nimport PostAuthorCard from \"../components/posts/postAuthorCard\";\nimport Comments from \"../components/posts/comments\";\nimport { getImage } from \"gatsby-plugin-image\";\n\nconst Post = ({\n data: {\n post: {\n frontmatter,\n html,\n wordCount: { words },\n },\n author: authorData,\n },\n pageContext: { markupData, lang, site },\n}: PageProps) => {\n const { href: currentUrl } = useLocation();\n\n const { date, title, keywords } = frontmatter;\n const { authorAlias, author, authorPosition, authorPhoto } =\n authorData.frontmatter;\n\n const minutes = Math.floor(words / 200);\n const readingTime = minutes ? minutes : 1;\n\n return (\n <>\n \n \n \n\n
\n {date}\n\n \n {`${readingTime} ${markupData?.readingTimeUnits} ${markupData?.readingTimeTitle}`}\n \n
\n\n \n {title}\n \n\n \n\n
\n {keywords ? (\n \n ) : null}\n\n \n
\n\n \n\n \n \n \n
\n \n );\n};\n\nexport default Post;\n\nexport const Head: HeadFC = ({\n data: {\n post: {\n frontmatter: { title, text, cover },\n },\n },\n pageContext,\n location,\n}) => {\n var image = getImage(cover);\n return \n};\n\nexport const query = graphql`\n query ($id: String, $lang: String, $authorId: String) {\n post: markdownRemark(id: { eq: $id }) {\n frontmatter {\n date(formatString: \"DD MMM YYYY\", locale: $lang)\n title\n text\n cover {\n childImageSharp {\n gatsbyImageData(\n formats: [AUTO, WEBP, AVIF]\n placeholder: BLURRED\n width: 600\n )\n }\n }\n keywords\n }\n html\n wordCount {\n words\n }\n }\n author: markdownRemark(id: { eq: $authorId }) {\n frontmatter {\n authorAlias\n author\n authorPosition\n authorPhoto {\n childImageSharp {\n gatsbyImageData(\n width: 64\n formats: [AUTO, WEBP, AVIF]\n placeholder: BLURRED\n )\n }\n }\n }\n }\n }\n`;\n","var React = require('react');\n\nfunction X (props) {\n return React.createElement(\"svg\",props,[React.createElement(\"g\",{\"clipPath\":\"url(#clip0_1390_2975)\",\"key\":0},React.createElement(\"path\",{\"d\":\"M15.7511 0H18.8178L12.1179 8.47193L20 20H13.8282L8.99457 13.0081L3.46363 20H0.394883L7.56109 10.9385L0 0H6.32809L10.6975 6.39068L15.7511 0ZM14.6747 17.9691H16.3741L5.40481 1.92425H3.58137L14.6747 17.9691Z\",\"fill\":\"#E4E4E4\"})),React.createElement(\"defs\",{\"key\":1},React.createElement(\"clipPath\",{\"id\":\"clip0_1390_2975\"},React.createElement(\"rect\",{\"width\":\"20\",\"height\":\"20\",\"fill\":\"white\"})))]);\n}\n\nX.defaultProps = {\"width\":\"20\",\"height\":\"20\",\"viewBox\":\"0 0 20 20\",\"fill\":\"none\"};\n\nmodule.exports = X;\n\nX.default = X;\n"],"names":["GenIcon","module","exports","props","_ref","authorAlias","author","authorPosition","authorPhoto","avatar","getImage","___EmotionJSX","Link","to","split","join","toLowerCase","title","itemProp","itemScope","itemType","className","GatsbyImage","image","alt","ShareButton","_ref2","url","media","children","href","rel","target","postTitle","shareTitle","X","FaPinterest","size","FaLinkedin","FaGoogle","FaFacebook","text","fileData","useStaticQuery","query","file","keywords","readMoreTitle","map","hashtag","key","G","id","e","host","i","repo","r","repoId","o","category","u","categoryId","n","mapping","s","term","a","strict","f","reactionsEnabled","d","emitMetadata","m","inputPosition","c","theme","p","lang","l","loading","g","t","x","repoid","categoryid","reactionsenabled","emitmetadata","inputposition","setup","_","updComponent","useState","useEffect","undefined","window","handleMessage","event","origin","data","giscus","addEventListener","removeEventListener","Giscus","post","frontmatter","html","wordCount","words","authorData","pageContext","markupData","site","currentUrl","useLocation","date","minutes","Math","floor","readingTime","React","ContentContainer","maxWidthClass","PostAuthorCard","readingTimeUnits","readingTimeTitle","dangerouslySetInnerHTML","__html","PostHashtags","readMoreOnTopicTitle","ShareButtons","sharePostTitle","PostFooter","postFooterTitle","postFooterText","Comments","commentsSetup","LocalBusinessMetadata","Head","_image$images$fallbac","cover","location","HeadSeo","head","toUpperCase","siteUrl","description","slice","path","pathname","img","images","fallback","src","createElement","defaultProps","default"],"sourceRoot":""} \ No newline at end of file diff --git a/cookie-policy/index.html b/cookie-policy/index.html index a691ed52..1d01bb65 100644 --- a/cookie-policy/index.html +++ b/cookie-policy/index.html @@ -108,6 +108,6 @@

Contacts

- \ No newline at end of file + \ No newline at end of file diff --git a/index.html b/index.html index 4cd720f7..63461b3c 100644 --- a/index.html +++ b/index.html @@ -12,6 +12,6 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/page-data/app-data.json b/page-data/app-data.json index 69272e74..369aa4bd 100644 --- a/page-data/app-data.json +++ b/page-data/app-data.json @@ -1 +1 @@ -{"webpackCompilationHash":"8cb2e090dcb1d7095def"} +{"webpackCompilationHash":"f7bc09f2991415be29d8"} diff --git a/page-data/blog/10582553-73a2-569f-8bdd-980e1f77c10a/page-data.json b/page-data/blog/10582553-73a2-569f-8bdd-980e1f77c10a/page-data.json index 659bdf86..f41329cd 100644 --- a/page-data/blog/10582553-73a2-569f-8bdd-980e1f77c10a/page-data.json +++ b/page-data/blog/10582553-73a2-569f-8bdd-980e1f77c10a/page-data.json @@ -1 +1 @@ -{"componentChunkName":"component---src-pages-templates-post-tsx","path":"/blog/10582553-73a2-569f-8bdd-980e1f77c10a/","result":{"data":{"post":{"frontmatter":{"date":"02 Dec 2023","title":"Streamlining Changelog Creation with Azure DevOps and Confluence","text":"In the fast-paced world of software development, maintaining a detailed record of changes is crucial. Changelogs serve as a vital tool, tracking every update, fix, or feature added to a project. Integrating Azure DevOps with Confluence can create a seamless changelog management system that enhances transparency and efficiency. This blog post explores how to automate changelog creation in Confluence using a PowerShell script that extracts release information from an Azure DevOps repository.","keywords":["devops","azure devops","confluence","changelog"]},"html":"

Streamlining Changelog Creation with Azure DevOps and Confluence

\n

In the fast-paced world of software development, maintaining a detailed record of changes is crucial. Changelogs serve as a vital tool, tracking every update, fix, or feature added to a project. Integrating Azure DevOps with Confluence can create a seamless changelog management system that enhances transparency and efficiency. This blog post explores how to automate changelog creation in Confluence using a PowerShell script that extracts release information from an Azure DevOps repository.

\n

\n \n \n \n

Step 1: Creating a Parent Page:

\n
    \n
  • Sign in to your Confluence account.
  • \n
  • Go to the Space where you want to create the changelogs folder.
  • \n
  • Create a new page that will serve as the parent page for all future changelogs pages. This can be done by selecting \"Create\" and following the instructions to create a page.
  • \n
\n

Step 2: Getting SpaceKey:

\n
    \n
  • The SpaceKey is usually shown in the URL when you are in a Confluence space.
  • \n
  • If the key does not appear in the URL, you can find it by going to Space tools > Overview > Space details.
  • \n
\n

Step 3: Getting Parent Page ID:

\n
    \n
  • The Parent Page ID (ParentID) can be found in the URL when you are on the page that will serve as the parent of changelogs. In the page URL, look at the pageId parameter, this will be the ParentID.
  • \n
\n

Step 4: Confluence Site URL entry:

\n\n

You now have all the information you need to create new changelogs pages using the script.

\n
\n

[⚠️ Warning:]Make sure you have the appropriate permissions to create and edit pages in your chosen Confluence space.

\n
\n

Step 5: Creating PowerShell Script

\n

Now we create a file confluence.ps1 in the root of our repository.

\n

Firstly our script gets a list of changes between these versions. (Line 1-11)

\n

Next the script creates a new Confluence page that displays the change log, using the ConfluencePS module, passes it to the environment variable for our pipeline. (Line 13-33)

\n
Param ([String]$username, [String]$password) # Get username and password options from Azure Pipeline\n$repoPath = \".\" # Set the repository path as the current directory\n$currentVersion = git describe --abbrev=0 HEAD  # Get the latest version of the repository using git\n# Write-Host $currentVersion\n$prevVersion = git describe --abbrev=0 $currentVersion^  #Get the previous version of the repository using git\n# Write-Host $prevVersion\n$changelog = git log --no-merges --pretty=\"- %s<br />\" \"$prevVersion..$currentVersion\"  #Get the list of changes between the two versions using git\n# Write-Host $changelog\n# exit -0\n$confluenceUrl = \"https://your.atlassian.net/wiki\"  #Set the Confluence URL\n$securePassword = $password | ConvertTo-SecureString -AsPlainText -Force #Convert the password to a secure string\n$credentials = New-Object System.Management.Automation.PSCredential `\n     -ArgumentList $username, $securePassword   #Create a credential object for Confluence\n#Check if the module ConfluencePS is installed\nif (-not (Get-Module -Name ConfluencePS -ListAvailable)) {\n    Install-Module -Name ConfluencePS -Scope CurrentUser -Force\n}\nImport-Module ConfluencePS # Import the module ConfluencePS\nSet-ConfluenceInfo -BaseURI $confluenceUrl -Credential $credentials   #Set the information about Confluence using the URL and credentials\n$body = @\"\n<h2>What's new in comparison with version $prevVersion</h2>\n<pre>$changelog</pre>\n\"@\n$page = New-ConfluencePage -Title \"What's new in $currentVersion\" -SpaceKey YOURSPACEKEY -ParentID YOUR_PARENT_ID -Body $body  #Create a new Confluence page with the given title, space key and body\n$pageObj = Get-ConfluencePage -PageID $page.ID     # Get the Confluence page object by ID\nWrite-Output $pageObj.URL     #Print the page URL to the screen\nWrite-Host \"##vso[task.setvariable variable=confluenceUrl]$($pageObj.URL)\"    #Set the variable confluenceUrl for Azure Pipeline using the page URL
\n
\n

[⚠️ Warning:] To use this script, you need to change the following:
> $confluenceUrl to your Confluence site URL. (line 13)

\n
\n

YOURSPACEKEY on the key of your space in Confluence. (line 30)
\nYOUR_PARENT_ID on the ID of the parent page where the new page is to be created. (line 30)
\n• Make sure you have Git installed and available in your script path.
\n• Make sure you have rights to create pages in the specified Confluence space.
\n• If you are not using Azure Pipeline, remove or modify the lines associated with Write-Host \"##vso[task.setvariable variable=confluenceUrl]$($pageObj.URL)\" to suit your runtime environment.

\n

In the script, you can experiment with the body of the page and the list of data that you want to send to the changelog.

\n

Step 6: Integration with Azure pipelines.

\n

The task is configured to run in Azure Pipelines and only runs under certain conditions, such as when a new tag is created in the repository.\n$USERNAME and $PASSWORD variables are stored in pipeline secrets and are passed during pipeline startup. The task causes our script to run.

\n
Azure Pipeline Task\n\n- task: PowerShell@2\n  condition: and(not(eq(variables['Build.Reason'], 'PullRequest')), BeginsWith(variables['Build.SourceBranch'], 'refs/tags/'))\n  displayName: Create a changelog and create a page in Confluence.\n  inputs:\n    file path: .\\confluence.ps1\n    arguments: '-username $(USERNAME) -password $(PASSWORD)'
\n

Add it to your Azure pipeline. As a result, we have a page with changes!

\n

Conclusion

\n

Automating change logs with Azure DevOps and Confluence simplifies the documentation process and keeps information up to date. This approach allows teams to focus on development, leaving the routine work of documenting changes.

\n

This blog provides a high-level overview of the integration process and can serve as a starting point for teams looking to improve their change management processes. We hope it was useful.

\n

We wish you a great mood and interesting tasks!

","wordCount":{"words":722}},"author":{"frontmatter":{"authorAlias":"Podryabinkina","author":"Alina Podryabinkina","authorPosition":"DevOps Engineer","authorPhoto":{"childImageSharp":{"gatsbyImageData":{"layout":"constrained","placeholder":{"fallback":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAZCAIAAAC+dZmEAAAACXBIWXMAAAsTAAALEwEAmpwYAAAFbElEQVR42lWSiVPSaRjHf2ur8Du4BDVFVBRFKwhQDm/EEvFC8wKtPKFMbb0qNa0pa7dZK9NJrbTNjMQDvEIRFfHWwANrdmd3/5p90cmZnXnmnWfeeT7P9zvf94W2F/S7llG71bi/ajxYnfq2teDcMn/fnt+xjD6oLlKIwqVcZgSdFhXKyI7nNWtVzo0vf35dPNqaP9qagwC5uzjqWAHw1MHqtHPDDPhdy8i9UuVlfog8MjQ2IlAli72RlawQc/wphOJM2dflib8cy86NY9i+NL5nNRzYDIerkwerM0ebpu62G1mSiDxZZHbshfay3L0ZnU3XP/b8YVNJbiCNXJGv+LY9v79ugoCsfWnMsQz4cefa9NHmnG1qUJMRXZAcVZoZXyIXfuho+LY6t2cet09/WtX1lytTRGzGl+GXdusUUNYD0mGd2FsxHK5NH26Y+h/VZonCSjLitXmyluIUq67/X/um0zqzM/NpTf/utzqNJDzgj87mLfMotLvkUgbk/orBuTm7bhquzU/KFIaVZcbdLpB21V93Wk1/79gOlyftJr1V1/dAoxYE+rxs0W6a9ZB9eQzI7ruUJ452TLqedrWMV5jAqVMladNFpZdiOirU62MDh4vG7anhhcGu2vw0Mcv3WZ162TgIOZbH9q1AFqQ9aV8xPL5VcCU6ouZKbEdlelO+vDontfeXsjX9W+OrDo1CWiJPSLwYrohiv2ouN+v7oOOoJlye16ct4723smIq04S3M4Rv60u+z4/vzY5sTw475sYG2xvVSTFyTiifFSAXsF61li8aBqBjzwbHysTB+sybjtrKVEGjKlGTxJ3vevSPbeFoaXbPNLpj/GR+37P45kV3vYbD9Eu5GNTdVmmb/eiyDZQP1qbWvwzdLUq+nRffmB9XIeOPP2u1fXxt072xDfWujQzMvP593zDce6cmzJemFLJeP9Cumj6DwPQgs4ONmeHnd7SpvKai5NocSZmUO9n31DLUszLQYxnsGrxf8/lpy0LvswwxP4xOzYtmPdTmbC2MQl8X9Y4Vw7pp6Nfq7KoMYZNaWqMUpZzz62mtso0OTNfVW+qahrTlEz2PmkquYB7unCCvVB6jMl2ybRmDdiyfwcce6my8o0poUCVWZYk0qXw+w7Mgjmse7t6d1c8+eaBrqbt/s/gc0+8c0zfcjyIO8UrjBS2AtMEnmf7Q+bAy/V7J5XpV4nXZhauy86yzZAGLUadKN77rmhvp06iVVALK8CLTKQQGBePQKZJgb+NgJwRyetFY3KrJvFsmv6UU54hDc+PYdCoRQzEYD3sSMLoXze0nNwqZSKeRfQgonUzww/Ayfph18j3U3aYtlIvz5ZLGq7LSyxcVAmZKZLA3lUQhe8Iw9rM7zu2MO4ygBAwlIngiHkcjIAFUQjIvuLk8G+KFh1xgBxelRTcUSvNjwrPELCHbD4ExIpEMw+hJ4fEIgqCgA2aoGMI86wky5wbQoOCggEuxgsbrqTVKSY4oNCeG7e9FxsMoihIQBDshf6yAQVFQ2IuE+VJJ/jQKFMmNuJaV0K7NqJALipM4SfwQnAslAPH/k64Gh0dJKOpFxKgkAoVIgERcdnWxvK0sRaOILFFE+Xp5euBgMHcMY/Cx+Al8XCgRw8LoNLq3J9OPBkl47LabGfeK4huuJvEjmO4eMHB7MgpgcOJwMM5l2HWDwCA4LJxOpdMoPp5kKDdF+KQqtfmaVCo+jz91iD+VcvVgC8AQmIgiRLD6fKA3iofdPfBQvTrhcXmCMoGDYkTwJMdSP7DTqI9JF4wS8HhMEOZPIxGAR6ilUFyWygv090UQEoaQwBwMCg8Mn6Z1kpyrUATzwCHcUEagD9XtjMd/4LIQtzGUCroAAAAASUVORK5CYII="},"images":{"fallback":{"src":"/static/20f2a8d8398e868f0d50bd7fb356ffdb/c032f/author.jpg","srcSet":"/static/20f2a8d8398e868f0d50bd7fb356ffdb/1f64c/author.jpg 16w,\n/static/20f2a8d8398e868f0d50bd7fb356ffdb/af0fe/author.jpg 32w,\n/static/20f2a8d8398e868f0d50bd7fb356ffdb/c032f/author.jpg 64w,\n/static/20f2a8d8398e868f0d50bd7fb356ffdb/464e8/author.jpg 128w","sizes":"(min-width: 64px) 64px, 100vw"},"sources":[{"srcSet":"/static/20f2a8d8398e868f0d50bd7fb356ffdb/8cd5f/author.avif 16w,\n/static/20f2a8d8398e868f0d50bd7fb356ffdb/34a4f/author.avif 32w,\n/static/20f2a8d8398e868f0d50bd7fb356ffdb/d6ed5/author.avif 64w,\n/static/20f2a8d8398e868f0d50bd7fb356ffdb/8b866/author.avif 128w","type":"image/avif","sizes":"(min-width: 64px) 64px, 100vw"},{"srcSet":"/static/20f2a8d8398e868f0d50bd7fb356ffdb/94d43/author.webp 16w,\n/static/20f2a8d8398e868f0d50bd7fb356ffdb/6c901/author.webp 32w,\n/static/20f2a8d8398e868f0d50bd7fb356ffdb/aa76d/author.webp 64w,\n/static/20f2a8d8398e868f0d50bd7fb356ffdb/5e01a/author.webp 128w","type":"image/webp","sizes":"(min-width: 64px) 64px, 100vw"}]},"width":64,"height":80}}}}}},"pageContext":{"id":"10582553-73a2-569f-8bdd-980e1f77c10a","lang":"en","markupData":{"bannerTitle":"Well unknown facts","blogByAuthorBannerTitle":"Articles by the author","blogByHashtagBannerTitle":"Articles Featuring","head":"CodeCave Insights","readPostLink":"Open article","readingTimeTitle":"read","readingTimeUnits":"min","postFooterTitle":"Congratulations! Now you can show off with your new knowledge!","postFooterText":"If you want us to uncover some other Well unknown facts, you can contact us via the socials or e-mail below. See you!","sharePostTitle":"Share this post","readMoreOnTopicTitle":"Read more on","blogSectionTitle":"new in our blog","blogSectionLinkTitle":"all posts","image":{"childImageSharp":{"gatsbyImageData":{"layout":"constrained","placeholder":{"fallback":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAACXBIWXMAAAsTAAALEwEAmpwYAAAD1UlEQVR42pWUX0zTVxTHCwT501JKaWmBrsUV5N9gIixsuqgwlDCge7Hooli0yp9ZRR+0BdryxxU7oVCQgC3Kn1IMf0S3xLlMI2Mapw+a6JMGX9yMe3EPbvoimHw99xJJnIPpw82vub33ez7nnO89gqioKLzLkkqlkMvliI6O5r+XOid4FzEmFBkZiaCgIISFhSEiIoKLMvH3EnxNFRwcDI1GA4vFgry8PHyo1UIsFkMoFEImk71BvKQgOygSibiYXl+Ge/fu4+X8PC5f+hkOhwOmfSZkrc7ixOHh4Yu0gv+iYt+AgABotYnw+/2Ym5vDo0e/49zUJI47nejr7cXQ4BDcnW7UVNcgOzsbK1aEcGrBv6lYtNDQUOytrMTjx3/i+fNnuHv3DsbHx+AbHibRKTTa7XC1tWNsbAxdbjfG6Wsxm6GKVy0IMiGGHBgYiKysNbh48SeieoHZ2fu4dvVXDA0MwNXeDk9fH/wjI7h58wbOjI7CcsSMbncXBgdOw+v1ID09HQKWIqsD66KZojx58hf++fspZn6ZRmdHB4YHB9F+vA1ej4eo2jjZMUcrJscniK6LU/d0d6PJ3rggyCyQm5uLW7duY36eavXHQ/zw/Xn0e7041d/Pa+Y96eE0vmEfJicmUF1ZBVPNN+jt6eGp7qqoQN6GjdwJnDAjI4NHYh1sqKuDo+UoRkf8sFutOEkNsFlt2GUwoKW5mUjsGDh9Ctd/u4ZOlwtlej0+ycmBtb4BO7Zvh4DVLiQkBPFxcWhqbKRauehyBewNVkydPcvJeohk+so0Dpj2o+07J2ZmpvFgdhaObx3YuH49mumeTqdb6LJEIqHuxEOjVnPL6LdswYkT3TAfPgLDjnK0kud+vHAB9XX1VAIvX9VVVbyue4xGnhGzDXMGu79om5UJCUhOToaYapqelkYCdXAec2KvcQ8tI5ytrWhpaoKupBRRBJFDIpsKNkFNIEzsLWOLqcuMNjMjE6XFJRCSH4uKiqhuLZzyYG0t1n62Fh9RJ5kjNhcU4PN167hvme3eenrszUrooMGwE1/pSpFEr0ROB9UaNfabTCjcXEj12oBDtQfxRX4+PiVnlBQXLw6KNwTZBouUTw9/xOfj6bP91ZkfIykxkYgk2Fa2FUeJ1mazwWjcDZFQxJuw5LRh6SoUCqKSQ6P6AAlqDd9TqVT4eus2lJeXIzU1FV8WFiJOGcvT/t/xxQRer/jYOEpbC6VCSeWIgTJGgZSkVVDExCCS/pe+z4BlhxmBTBYNbcJKJCcmIS0lBbFKJQ+23AxddsCyywvCMkhYEE4mXVbwFQflxPovnsZUAAAAAElFTkSuQmCC"},"images":{"fallback":{"src":"/static/b358397f973ed74732db29698c1773d1/30cdc/blog.png","srcSet":"/static/b358397f973ed74732db29698c1773d1/7458e/blog.png 75w,\n/static/b358397f973ed74732db29698c1773d1/de3a1/blog.png 150w,\n/static/b358397f973ed74732db29698c1773d1/30cdc/blog.png 300w","sizes":"(min-width: 300px) 300px, 100vw"},"sources":[{"srcSet":"/static/b358397f973ed74732db29698c1773d1/eb54c/blog.avif 75w,\n/static/b358397f973ed74732db29698c1773d1/81307/blog.avif 150w,\n/static/b358397f973ed74732db29698c1773d1/aa5b9/blog.avif 300w","type":"image/avif","sizes":"(min-width: 300px) 300px, 100vw"},{"srcSet":"/static/b358397f973ed74732db29698c1773d1/18188/blog.webp 75w,\n/static/b358397f973ed74732db29698c1773d1/c65bc/blog.webp 150w,\n/static/b358397f973ed74732db29698c1773d1/078c3/blog.webp 300w","type":"image/webp","sizes":"(min-width: 300px) 300px, 100vw"}]},"width":300,"height":300}}}},"site":{"siteUrl":"https://www.codecave.it","analytics":{"gtagId":"G-HPEX5BHBSJ","clarityId":"mrqkdfooez"},"commentsSetup":{"repo":"CodeCavePro/www.codecave.pro-new","repoId":"R_kgDOJv3s3g","categoryId":"DIC_kwDOJv3s3s4CgqzO"}},"authorAlias":"Podryabinkina","authorId":"b52b7674-8be1-5af8-b32b-a7bb5f1b4ac9"}},"staticQueryHashes":["1512817958","2595676272","639074693"],"slicesMap":{}} \ No newline at end of file +{"componentChunkName":"component---src-pages-templates-post-tsx","path":"/blog/10582553-73a2-569f-8bdd-980e1f77c10a/","result":{"data":{"post":{"frontmatter":{"date":"02 Dec 2023","title":"Streamlining Changelog Creation with Azure DevOps and Confluence","text":"In the fast-paced world of software development, maintaining a detailed record of changes is crucial. Changelogs serve as a vital tool, tracking every update, fix, or feature added to a project. Integrating Azure DevOps with Confluence can create a seamless changelog management system that enhances transparency and efficiency. This blog post explores how to automate changelog creation in Confluence using a PowerShell script that extracts release information from an Azure DevOps repository.","cover":{"childImageSharp":{"gatsbyImageData":{"layout":"constrained","placeholder":{"fallback":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAACXBIWXMAAAsTAAALEwEAmpwYAAAFZklEQVR42h2Ue1CUVRjGv5p0d7/zfXtj2XWXZZfLAsvVCyCooOJd8S6OOV5CkjGkqbzVeI3ULB1GLW3U1EZNTbRCy0knKxVGU0wrLfIaaIB4q5xSFN39daY/3vnmO3PO7zzvc955FKseg0WLRqgJ9Iuax6yk/TgMw4jRB+PRxuMWM/EZluM1LqGTVkyUXIsWwwiapzIzsAu3mifP+7DoPmxaIopNS8OhdscigjhN+SzOOEYv2xKijWPwiYm41DKiOywnylCBS0zDr0/B23E8Y6PXMcG3mgRDIXYtAU040YULxaLFYROpRIosVGOQEVGreCP9OP4OpfLwcLk+ik7GGbhNJRI+FqdWQLyxmFdTDtLPspRelrclKF6WHbPqR3FKJZrqkNBkKTtZttiX8uA+eohKEg1z8BmXke+qJzviJF7TIhLEInpoKxjoWkySmIBftm9XM7AKH3ZjHoq/4+tEaN3wSs/8UkGEyCTTXM4oWxU93VUEIrYwzvuAoZ7bxBo30EevYaxjL+nmEmlTMkLYpKdDpD3DiDQNRumq7iROlFGStYcxsftxmSaRaVvKgmENFKQdJCV9G3n+S+Q666WibQy2HqGydwu5ljXEGsqJN02jt3UTnWRnMWo5Sr7lKLHS9Pl9T1Hx7kMGrbhBoOwaPRffJe2lFiKLf8b64jE6jD6DO1jFa/46KjKbSHtuPaNdR3k9u4me9u14DKX0sdah9LPWkmzcwTuDGvj6EOyrhw9PhGW1s/JIG5O3tjFicwuFG2/Tr/gKE/Jayc88T1Lwe54vaOHAjDD53m/oq//IcMcdlL7Wmv+Bqwc2cfkE3Hkc5u8H8M8jOPE7vPxpmJGbntB/7UMKKu+TtvAWzpmN6C9eJFD8K1+93Mbo+OsMsjaSZd6BkqMfJspUSq62ls8/aqdRwq60wuXbYequw5c//cW5q/f44UaYMw1POH31MaevPeXM9afUnm1j9Zib9LCdp7etjjT1XZR003Yitf7YlALWr2rkj4cSdjPE5dYw5yTwm4tP+f3mA67efMSllnZ+bnzIhaYw9behti5EjmsDScZPyLEcIlurRok3LsSud8H6TD7rNl3hLtD0b4gmqbRe/hy9FOb8jUf8+IdU1Rji5LUwp66F+KnpKXur75JlX0esOpsMsZNscRglWczCosYhHIm89kYNX3x2j6rdN9i5o4H9+9uokcBzDe380IiEwXcX4fjlELXn2zlw8DEDvFuwGrJIF7tkbUZJNS0ksmMvRIwTX6BEDvMREt1vkqJXMan/b9RK0IXmfznX/Ji65hDfN0PN1RDHL7TzRe0tomwDsKk9SNHWy+F+ASVSpJNqWkCqWoHXO5pgYBnB2Eq6+LcxMvUUhxc94dOlsG1JmG+XhXhv+i3mFp/llcmnKRq5CpvemWi1hM5iDZnaxygRajZOeUOO2EA30/v4DYtIM3xAtmEteR2rWeBvpST6PlM8f7IioZkx+jHyZGtBZRVRz5bhFc/TVWwlT91NklqKkiQWSKmT5UsPwauVkGDZSorlAFliGbmimnGe+0xNgCL5LXWdZbhrj3zNt+mtbZaqVsp8nEKcNl+Ci2TIRKB0khHl0QoJiPE4dBlN5kqClp2kiOlkmNYxxH2J8s73ZOL8Qo66VSp/k87GOXQ1LpY2zcZtLpTBWyhTqkgmTxGK3ZwpfcgjWRtFnDqQdGsFufbVxJqGEjDNY7jnLNOSWknUD8jBnU9QFNNTm8E463RipAin6I9PHSF9nIhDZKM49O6Y9Sy6iLFkGKbSK3Ij492H8BgHkqC+RVngATOSkIlUTYo6V15STKo2mYnaLLqZS/GIceTKffHSS5vWhf8Az3VTErlmA5gAAAAASUVORK5CYII="},"images":{"fallback":{"src":"/static/b76f2ab05112bd14afd46d66f93eaa97/c7240/intro.png","srcSet":"/static/b76f2ab05112bd14afd46d66f93eaa97/de3a1/intro.png 150w,\n/static/b76f2ab05112bd14afd46d66f93eaa97/30cdc/intro.png 300w,\n/static/b76f2ab05112bd14afd46d66f93eaa97/c7240/intro.png 600w","sizes":"(min-width: 600px) 600px, 100vw"},"sources":[{"srcSet":"/static/b76f2ab05112bd14afd46d66f93eaa97/81307/intro.avif 150w,\n/static/b76f2ab05112bd14afd46d66f93eaa97/aa5b9/intro.avif 300w,\n/static/b76f2ab05112bd14afd46d66f93eaa97/0c8d0/intro.avif 600w","type":"image/avif","sizes":"(min-width: 600px) 600px, 100vw"},{"srcSet":"/static/b76f2ab05112bd14afd46d66f93eaa97/c65bc/intro.webp 150w,\n/static/b76f2ab05112bd14afd46d66f93eaa97/078c3/intro.webp 300w,\n/static/b76f2ab05112bd14afd46d66f93eaa97/6d09e/intro.webp 600w","type":"image/webp","sizes":"(min-width: 600px) 600px, 100vw"}]},"width":600,"height":600}}},"keywords":["devops","azure devops","confluence","changelog"]},"html":"

Streamlining Changelog Creation with Azure DevOps and Confluence

\n

In the fast-paced world of software development, maintaining a detailed record of changes is crucial. Changelogs serve as a vital tool, tracking every update, fix, or feature added to a project. Integrating Azure DevOps with Confluence can create a seamless changelog management system that enhances transparency and efficiency. This blog post explores how to automate changelog creation in Confluence using a PowerShell script that extracts release information from an Azure DevOps repository.

\n

\n \n \n \n

Step 1: Creating a Parent Page:

\n
    \n
  • Sign in to your Confluence account.
  • \n
  • Go to the Space where you want to create the changelogs folder.
  • \n
  • Create a new page that will serve as the parent page for all future changelogs pages. This can be done by selecting \"Create\" and following the instructions to create a page.
  • \n
\n

Step 2: Getting SpaceKey:

\n
    \n
  • The SpaceKey is usually shown in the URL when you are in a Confluence space.
  • \n
  • If the key does not appear in the URL, you can find it by going to Space tools > Overview > Space details.
  • \n
\n

Step 3: Getting Parent Page ID:

\n
    \n
  • The Parent Page ID (ParentID) can be found in the URL when you are on the page that will serve as the parent of changelogs. In the page URL, look at the pageId parameter, this will be the ParentID.
  • \n
\n

Step 4: Confluence Site URL entry:

\n\n

You now have all the information you need to create new changelogs pages using the script.

\n
\n

[⚠️ Warning:]Make sure you have the appropriate permissions to create and edit pages in your chosen Confluence space.

\n
\n

Step 5: Creating PowerShell Script

\n

Now we create a file confluence.ps1 in the root of our repository.

\n

Firstly our script gets a list of changes between these versions. (Line 1-11)

\n

Next the script creates a new Confluence page that displays the change log, using the ConfluencePS module, passes it to the environment variable for our pipeline. (Line 13-33)

\n
Param ([String]$username, [String]$password) # Get username and password options from Azure Pipeline\n$repoPath = \".\" # Set the repository path as the current directory\n$currentVersion = git describe --abbrev=0 HEAD  # Get the latest version of the repository using git\n# Write-Host $currentVersion\n$prevVersion = git describe --abbrev=0 $currentVersion^  #Get the previous version of the repository using git\n# Write-Host $prevVersion\n$changelog = git log --no-merges --pretty=\"- %s<br />\" \"$prevVersion..$currentVersion\"  #Get the list of changes between the two versions using git\n# Write-Host $changelog\n# exit -0\n$confluenceUrl = \"https://your.atlassian.net/wiki\"  #Set the Confluence URL\n$securePassword = $password | ConvertTo-SecureString -AsPlainText -Force #Convert the password to a secure string\n$credentials = New-Object System.Management.Automation.PSCredential `\n     -ArgumentList $username, $securePassword   #Create a credential object for Confluence\n#Check if the module ConfluencePS is installed\nif (-not (Get-Module -Name ConfluencePS -ListAvailable)) {\n    Install-Module -Name ConfluencePS -Scope CurrentUser -Force\n}\nImport-Module ConfluencePS # Import the module ConfluencePS\nSet-ConfluenceInfo -BaseURI $confluenceUrl -Credential $credentials   #Set the information about Confluence using the URL and credentials\n$body = @\"\n<h2>What's new in comparison with version $prevVersion</h2>\n<pre>$changelog</pre>\n\"@\n$page = New-ConfluencePage -Title \"What's new in $currentVersion\" -SpaceKey YOURSPACEKEY -ParentID YOUR_PARENT_ID -Body $body  #Create a new Confluence page with the given title, space key and body\n$pageObj = Get-ConfluencePage -PageID $page.ID     # Get the Confluence page object by ID\nWrite-Output $pageObj.URL     #Print the page URL to the screen\nWrite-Host \"##vso[task.setvariable variable=confluenceUrl]$($pageObj.URL)\"    #Set the variable confluenceUrl for Azure Pipeline using the page URL
\n
\n

[⚠️ Warning:] To use this script, you need to change the following:
> $confluenceUrl to your Confluence site URL. (line 13)

\n
\n

YOURSPACEKEY on the key of your space in Confluence. (line 30)
\nYOUR_PARENT_ID on the ID of the parent page where the new page is to be created. (line 30)
\n• Make sure you have Git installed and available in your script path.
\n• Make sure you have rights to create pages in the specified Confluence space.
\n• If you are not using Azure Pipeline, remove or modify the lines associated with Write-Host \"##vso[task.setvariable variable=confluenceUrl]$($pageObj.URL)\" to suit your runtime environment.

\n

In the script, you can experiment with the body of the page and the list of data that you want to send to the changelog.

\n

Step 6: Integration with Azure pipelines.

\n

The task is configured to run in Azure Pipelines and only runs under certain conditions, such as when a new tag is created in the repository.\n$USERNAME and $PASSWORD variables are stored in pipeline secrets and are passed during pipeline startup. The task causes our script to run.

\n
Azure Pipeline Task\n\n- task: PowerShell@2\n  condition: and(not(eq(variables['Build.Reason'], 'PullRequest')), BeginsWith(variables['Build.SourceBranch'], 'refs/tags/'))\n  displayName: Create a changelog and create a page in Confluence.\n  inputs:\n    file path: .\\confluence.ps1\n    arguments: '-username $(USERNAME) -password $(PASSWORD)'
\n

Add it to your Azure pipeline. As a result, we have a page with changes!

\n

Conclusion

\n

Automating change logs with Azure DevOps and Confluence simplifies the documentation process and keeps information up to date. This approach allows teams to focus on development, leaving the routine work of documenting changes.

\n

This blog provides a high-level overview of the integration process and can serve as a starting point for teams looking to improve their change management processes. We hope it was useful.

\n

We wish you a great mood and interesting tasks!

","wordCount":{"words":722}},"author":{"frontmatter":{"authorAlias":"Podryabinkina","author":"Alina Podryabinkina","authorPosition":"DevOps Engineer","authorPhoto":{"childImageSharp":{"gatsbyImageData":{"layout":"constrained","placeholder":{"fallback":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAZCAIAAAC+dZmEAAAACXBIWXMAAAsTAAALEwEAmpwYAAAFbElEQVR42lWSiVPSaRjHf2ur8Du4BDVFVBRFKwhQDm/EEvFC8wKtPKFMbb0qNa0pa7dZK9NJrbTNjMQDvEIRFfHWwANrdmd3/5p90cmZnXnmnWfeeT7P9zvf94W2F/S7llG71bi/ajxYnfq2teDcMn/fnt+xjD6oLlKIwqVcZgSdFhXKyI7nNWtVzo0vf35dPNqaP9qagwC5uzjqWAHw1MHqtHPDDPhdy8i9UuVlfog8MjQ2IlAli72RlawQc/wphOJM2dflib8cy86NY9i+NL5nNRzYDIerkwerM0ebpu62G1mSiDxZZHbshfay3L0ZnU3XP/b8YVNJbiCNXJGv+LY9v79ugoCsfWnMsQz4cefa9NHmnG1qUJMRXZAcVZoZXyIXfuho+LY6t2cet09/WtX1lytTRGzGl+GXdusUUNYD0mGd2FsxHK5NH26Y+h/VZonCSjLitXmyluIUq67/X/um0zqzM/NpTf/utzqNJDzgj87mLfMotLvkUgbk/orBuTm7bhquzU/KFIaVZcbdLpB21V93Wk1/79gOlyftJr1V1/dAoxYE+rxs0W6a9ZB9eQzI7ruUJ452TLqedrWMV5jAqVMladNFpZdiOirU62MDh4vG7anhhcGu2vw0Mcv3WZ162TgIOZbH9q1AFqQ9aV8xPL5VcCU6ouZKbEdlelO+vDontfeXsjX9W+OrDo1CWiJPSLwYrohiv2ouN+v7oOOoJlye16ct4723smIq04S3M4Rv60u+z4/vzY5sTw475sYG2xvVSTFyTiifFSAXsF61li8aBqBjzwbHysTB+sybjtrKVEGjKlGTxJ3vevSPbeFoaXbPNLpj/GR+37P45kV3vYbD9Eu5GNTdVmmb/eiyDZQP1qbWvwzdLUq+nRffmB9XIeOPP2u1fXxt072xDfWujQzMvP593zDce6cmzJemFLJeP9Cumj6DwPQgs4ONmeHnd7SpvKai5NocSZmUO9n31DLUszLQYxnsGrxf8/lpy0LvswwxP4xOzYtmPdTmbC2MQl8X9Y4Vw7pp6Nfq7KoMYZNaWqMUpZzz62mtso0OTNfVW+qahrTlEz2PmkquYB7unCCvVB6jMl2ybRmDdiyfwcce6my8o0poUCVWZYk0qXw+w7Mgjmse7t6d1c8+eaBrqbt/s/gc0+8c0zfcjyIO8UrjBS2AtMEnmf7Q+bAy/V7J5XpV4nXZhauy86yzZAGLUadKN77rmhvp06iVVALK8CLTKQQGBePQKZJgb+NgJwRyetFY3KrJvFsmv6UU54hDc+PYdCoRQzEYD3sSMLoXze0nNwqZSKeRfQgonUzww/Ayfph18j3U3aYtlIvz5ZLGq7LSyxcVAmZKZLA3lUQhe8Iw9rM7zu2MO4ygBAwlIngiHkcjIAFUQjIvuLk8G+KFh1xgBxelRTcUSvNjwrPELCHbD4ExIpEMw+hJ4fEIgqCgA2aoGMI86wky5wbQoOCggEuxgsbrqTVKSY4oNCeG7e9FxsMoihIQBDshf6yAQVFQ2IuE+VJJ/jQKFMmNuJaV0K7NqJALipM4SfwQnAslAPH/k64Gh0dJKOpFxKgkAoVIgERcdnWxvK0sRaOILFFE+Xp5euBgMHcMY/Cx+Al8XCgRw8LoNLq3J9OPBkl47LabGfeK4huuJvEjmO4eMHB7MgpgcOJwMM5l2HWDwCA4LJxOpdMoPp5kKDdF+KQqtfmaVCo+jz91iD+VcvVgC8AQmIgiRLD6fKA3iofdPfBQvTrhcXmCMoGDYkTwJMdSP7DTqI9JF4wS8HhMEOZPIxGAR6ilUFyWygv090UQEoaQwBwMCg8Mn6Z1kpyrUATzwCHcUEagD9XtjMd/4LIQtzGUCroAAAAASUVORK5CYII="},"images":{"fallback":{"src":"/static/20f2a8d8398e868f0d50bd7fb356ffdb/c032f/author.jpg","srcSet":"/static/20f2a8d8398e868f0d50bd7fb356ffdb/1f64c/author.jpg 16w,\n/static/20f2a8d8398e868f0d50bd7fb356ffdb/af0fe/author.jpg 32w,\n/static/20f2a8d8398e868f0d50bd7fb356ffdb/c032f/author.jpg 64w,\n/static/20f2a8d8398e868f0d50bd7fb356ffdb/464e8/author.jpg 128w","sizes":"(min-width: 64px) 64px, 100vw"},"sources":[{"srcSet":"/static/20f2a8d8398e868f0d50bd7fb356ffdb/8cd5f/author.avif 16w,\n/static/20f2a8d8398e868f0d50bd7fb356ffdb/34a4f/author.avif 32w,\n/static/20f2a8d8398e868f0d50bd7fb356ffdb/d6ed5/author.avif 64w,\n/static/20f2a8d8398e868f0d50bd7fb356ffdb/8b866/author.avif 128w","type":"image/avif","sizes":"(min-width: 64px) 64px, 100vw"},{"srcSet":"/static/20f2a8d8398e868f0d50bd7fb356ffdb/94d43/author.webp 16w,\n/static/20f2a8d8398e868f0d50bd7fb356ffdb/6c901/author.webp 32w,\n/static/20f2a8d8398e868f0d50bd7fb356ffdb/aa76d/author.webp 64w,\n/static/20f2a8d8398e868f0d50bd7fb356ffdb/5e01a/author.webp 128w","type":"image/webp","sizes":"(min-width: 64px) 64px, 100vw"}]},"width":64,"height":80}}}}}},"pageContext":{"id":"10582553-73a2-569f-8bdd-980e1f77c10a","lang":"en","markupData":{"bannerTitle":"Well unknown facts","blogByAuthorBannerTitle":"Articles by the author","blogByHashtagBannerTitle":"Articles Featuring","head":"CodeCave Insights","readPostLink":"Open article","readingTimeTitle":"read","readingTimeUnits":"min","postFooterTitle":"Congratulations! Now you can show off with your new knowledge!","postFooterText":"If you want us to uncover some other Well unknown facts, you can contact us via the socials or e-mail below. See you!","sharePostTitle":"Share this post","readMoreOnTopicTitle":"Read more on","blogSectionTitle":"new in our blog","blogSectionLinkTitle":"all posts","image":{"childImageSharp":{"gatsbyImageData":{"layout":"constrained","placeholder":{"fallback":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAACXBIWXMAAAsTAAALEwEAmpwYAAAD1UlEQVR42pWUX0zTVxTHCwT501JKaWmBrsUV5N9gIixsuqgwlDCge7Hooli0yp9ZRR+0BdryxxU7oVCQgC3Kn1IMf0S3xLlMI2Mapw+a6JMGX9yMe3EPbvoimHw99xJJnIPpw82vub33ez7nnO89gqioKLzLkkqlkMvliI6O5r+XOid4FzEmFBkZiaCgIISFhSEiIoKLMvH3EnxNFRwcDI1GA4vFgry8PHyo1UIsFkMoFEImk71BvKQgOygSibiYXl+Ge/fu4+X8PC5f+hkOhwOmfSZkrc7ixOHh4Yu0gv+iYt+AgABotYnw+/2Ym5vDo0e/49zUJI47nejr7cXQ4BDcnW7UVNcgOzsbK1aEcGrBv6lYtNDQUOytrMTjx3/i+fNnuHv3DsbHx+AbHibRKTTa7XC1tWNsbAxdbjfG6Wsxm6GKVy0IMiGGHBgYiKysNbh48SeieoHZ2fu4dvVXDA0MwNXeDk9fH/wjI7h58wbOjI7CcsSMbncXBgdOw+v1ID09HQKWIqsD66KZojx58hf++fspZn6ZRmdHB4YHB9F+vA1ej4eo2jjZMUcrJscniK6LU/d0d6PJ3rggyCyQm5uLW7duY36eavXHQ/zw/Xn0e7041d/Pa+Y96eE0vmEfJicmUF1ZBVPNN+jt6eGp7qqoQN6GjdwJnDAjI4NHYh1sqKuDo+UoRkf8sFutOEkNsFlt2GUwoKW5mUjsGDh9Ctd/u4ZOlwtlej0+ycmBtb4BO7Zvh4DVLiQkBPFxcWhqbKRauehyBewNVkydPcvJeohk+so0Dpj2o+07J2ZmpvFgdhaObx3YuH49mumeTqdb6LJEIqHuxEOjVnPL6LdswYkT3TAfPgLDjnK0kud+vHAB9XX1VAIvX9VVVbyue4xGnhGzDXMGu79om5UJCUhOToaYapqelkYCdXAec2KvcQ8tI5ytrWhpaoKupBRRBJFDIpsKNkFNIEzsLWOLqcuMNjMjE6XFJRCSH4uKiqhuLZzyYG0t1n62Fh9RJ5kjNhcU4PN167hvme3eenrszUrooMGwE1/pSpFEr0ROB9UaNfabTCjcXEj12oBDtQfxRX4+PiVnlBQXLw6KNwTZBouUTw9/xOfj6bP91ZkfIykxkYgk2Fa2FUeJ1mazwWjcDZFQxJuw5LRh6SoUCqKSQ6P6AAlqDd9TqVT4eus2lJeXIzU1FV8WFiJOGcvT/t/xxQRer/jYOEpbC6VCSeWIgTJGgZSkVVDExCCS/pe+z4BlhxmBTBYNbcJKJCcmIS0lBbFKJQ+23AxddsCyywvCMkhYEE4mXVbwFQflxPovnsZUAAAAAElFTkSuQmCC"},"images":{"fallback":{"src":"/static/b358397f973ed74732db29698c1773d1/30cdc/blog.png","srcSet":"/static/b358397f973ed74732db29698c1773d1/7458e/blog.png 75w,\n/static/b358397f973ed74732db29698c1773d1/de3a1/blog.png 150w,\n/static/b358397f973ed74732db29698c1773d1/30cdc/blog.png 300w","sizes":"(min-width: 300px) 300px, 100vw"},"sources":[{"srcSet":"/static/b358397f973ed74732db29698c1773d1/eb54c/blog.avif 75w,\n/static/b358397f973ed74732db29698c1773d1/81307/blog.avif 150w,\n/static/b358397f973ed74732db29698c1773d1/aa5b9/blog.avif 300w","type":"image/avif","sizes":"(min-width: 300px) 300px, 100vw"},{"srcSet":"/static/b358397f973ed74732db29698c1773d1/18188/blog.webp 75w,\n/static/b358397f973ed74732db29698c1773d1/c65bc/blog.webp 150w,\n/static/b358397f973ed74732db29698c1773d1/078c3/blog.webp 300w","type":"image/webp","sizes":"(min-width: 300px) 300px, 100vw"}]},"width":300,"height":300}}}},"site":{"siteUrl":"https://www.codecave.it","analytics":{"gtagId":"G-HPEX5BHBSJ","clarityId":"mrqkdfooez"},"commentsSetup":{"repo":"CodeCavePro/www.codecave.pro-new","repoId":"R_kgDOJv3s3g","categoryId":"DIC_kwDOJv3s3s4CgqzO"}},"authorAlias":"Podryabinkina","authorId":"b52b7674-8be1-5af8-b32b-a7bb5f1b4ac9"}},"staticQueryHashes":["1512817958","2595676272","639074693"],"slicesMap":{}} \ No newline at end of file diff --git a/page-data/blog/c924c93c-fac0-517e-92e7-c5b5aaa083c2/page-data.json b/page-data/blog/c924c93c-fac0-517e-92e7-c5b5aaa083c2/page-data.json index 45a69543..c0b54a9f 100644 --- a/page-data/blog/c924c93c-fac0-517e-92e7-c5b5aaa083c2/page-data.json +++ b/page-data/blog/c924c93c-fac0-517e-92e7-c5b5aaa083c2/page-data.json @@ -1 +1 @@ -{"componentChunkName":"component---src-pages-templates-post-tsx","path":"/blog/c924c93c-fac0-517e-92e7-c5b5aaa083c2/","result":{"data":{"post":{"frontmatter":{"date":"21 Jul 2023","title":"Proxmox VM Templates and Cloud-Init","text":"In the world of virtualization, efficiency and automation are key. That's where Proxmox Virtual Environment (VE) comes into play, offering a robust solution for managing virtual machines (VMs) with ease. One of the most powerful features of Proxmox is its ability to use VM templates in conjunction with Cloud-Init, streamlining the deployment process and making it as smooth as a cloud","keywords":["devops","cloud-init","proxmox","VM","virtualization"]},"html":"

Proxmox and Cloud-Init virtual machine templates

\n

In the world of virtualization, efficiency and automation are key. This is where Proxmox Virtual Environment (VE) comes into play, offering a robust solution for easily managing virtual machines (VMs). One of the most interesting features of Proxmox is the ability to use virtual machine templates in combination with Cloud-Init, which simplifies the deployment process and makes it as smooth as in the cloud.\nLet's figure it out.

\n

\n \n \n \n \n \n \n \n \n \n \n
Proxmox VM Templates and Cloud-Init
\n

\n

What is Proxmox?

\n

Proxmox is a free and open source virtualization platform, which means anyone can use or modify it at no cost. It's like a set of tools that allows you to create multiple isolated computers (virtual machines) on a single physical machine. These virtual machines can simultaneously run multiple operating systems such as Windows or Linux, making them versatile for testing, development, or even production environments.

\n

Proxmox is the manager of these virtual environments. It uses a technology called KVM (kernel-based virtual machine), which ensures that each virtual machine runs smoothly without interfering with others. In addition, Proxmox can handle so-called containers via LXC (Linux Containers), which are even lighter than VMs and great for running individual applications with minimal overhead.

\n

You also can manage your VMs and containers from a browser. Web-based interface designed to be user-friendly, so even those new to virtualization can get started without too much trouble.

\n

What are Proxmox VM Templates?

\n

Proxmox VM templates are essentially pre-configured VMs that serve as blueprints for creating new instances. They include the operating system, installed software, and system configurations. The beauty of templates is that they save time and ensure consistency across deployments. You can quickly spin up new VMs without going through the entire installation and configuration process each time.

\n

The Role of Cloud-Init

\n

Cloud-Init is a versatile package that supports various distributions and handles the initial setup of a VM instance, such as network configuration and SSH key distribution. When a VM boots for the first time, Cloud-Init applies the predefined settings, allowing for a hands-off approach to VM provisioning https://pve.proxmox.com/wiki/Cloud-Init_Support.

\n

Combining Proxmox Templates with Cloud-Init

\n

Integrating Cloud-Init with Proxmox VM templates brings the best of both worlds. Here's how you can leverage this combination to your advantage:

\n

Step 1: Preparing Your Template

\n

Start by preparing your VM with the desired configuration. Install the operating system and all necessary packages, including Cloud-Init. Once your VM is ready, convert it into a template to serve as the foundation for future VMs.

\n

Below is the script we use to create the template:

\n
#! /bin/bash\n\n# Install Cloud-Init enabled Ubuntu VM in Proxmox\n\n# Download Ubuntu Cloud Image (Ubuntu 22.04 cloudimg)\nwget https://cloud-images.ubuntu.com/jammy/current/jammy-server-cloudimg-amd64.img\n\n# Install qemu-guest-agent on Ubuntu Cloud Image\n# The libguestfs-tools package must be installed on the system where the ubuntu cloudimg will be modified.\napt-get update\napt-get install libguestfs-tools\n\n# This step will install qemu-guest-agent on the Ubuntu cloud image via virt-customize.\nvirt-customize -a jammy-server-cloudimg-amd64.img --install qemu-guest-agent\n\n# Install git\nvirt-customize -a jammy-server-cloudimg-amd64.img --install git\n\n# Set environment variables. Change these as necessary.\nexport STORAGE_POOL=\"DATA\"\nexport VM_ID=\"1000\"\nexport VM_NAME=\"jammy-template\"\n\n# Create Proxmox VM image from Ubuntu Cloud Image.\nqm create $VM_ID --name $VM_NAME --memory 2048 --net0 virtio,bridge=vmbr2 --scsihw virtio-scsi-pci\nqm set $VM_ID --scsi0 $STORAGE_POOL:0,import-from=/root/jammy-server-cloudimg-amd64.img\n\n# Create Cloud-Init Disk and configure boot.\nqm set $VM_ID --ide2 $STORAGE_POOL:cloudinit\nqm set $VM_ID --boot order=scsi0\nqm set $VM_ID --serial0 socket --vga serial0\n# qm resize $VM_ID scsi0 +20G\n\n# Convert VM to Template\nqm template $VM_ID\n\n# Clean Up\nrm jammy-server-cloudimg-amd64.img
\n

Step 2: Deploying VMs from the Template

\n

With your template in place, you can create linked clones quickly. These clones are lightweight and share the base image with the template, which means rapid deployment. Before starting the new VM, configure the network and SSH keys through the Proxmox interface.

\n

Step 3: Customizing with Cloud-Init

\n

When you start a VM from the template, Cloud-Init kicks in. It reads the configuration data from an ISO image attached to the VM as a CD-ROM. This data includes network settings, user accounts, and SSH keys. Proxmox automatically generates this ISO image, and Cloud-Init applies the settings on the first boot.

\n

We go through steps 2 and 3 via Terraform. This significantly speeds up the process when you need to change some template parameters and create several identical machines at the same time.

\n

Best Practices

\n
    \n
  • SSH Key Authentication: It's recommended to use SSH keys for authentication rather than passwords for security reasons. Proxmox can store encrypted passwords, but keys are a safer alternative.
  • \n
  • Serial Console: Many Cloud-Init images rely on a serial console, which is a requirement for OpenStack. Ensure that your template is configured to use a serial console as the display.
  • \n
  • Custom Configuration: While many distributions offer ready-to-use Cloud-Init images, creating your own ensures that you know exactly what's installed, making it easier to customize later.
  • \n
\n

Conclusion

\n

Proxmox VM templates combined with Cloud-Init provide a powerful, efficient, and automated way to manage VM deployments. This synergy not only saves time but also ensures that each VM is configured consistently according to your standards.

\n

If you want to learn more, I suggest you start by exploring the official Proxmox documentation and community forums for detailed guides and support

\n

Happy virtualizing!

","wordCount":{"words":714}},"author":{"frontmatter":{"authorAlias":"Podryabinkina","author":"Alina Podryabinkina","authorPosition":"DevOps Engineer","authorPhoto":{"childImageSharp":{"gatsbyImageData":{"layout":"constrained","placeholder":{"fallback":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAZCAIAAAC+dZmEAAAACXBIWXMAAAsTAAALEwEAmpwYAAAFbElEQVR42lWSiVPSaRjHf2ur8Du4BDVFVBRFKwhQDm/EEvFC8wKtPKFMbb0qNa0pa7dZK9NJrbTNjMQDvEIRFfHWwANrdmd3/5p90cmZnXnmnWfeeT7P9zvf94W2F/S7llG71bi/ajxYnfq2teDcMn/fnt+xjD6oLlKIwqVcZgSdFhXKyI7nNWtVzo0vf35dPNqaP9qagwC5uzjqWAHw1MHqtHPDDPhdy8i9UuVlfog8MjQ2IlAli72RlawQc/wphOJM2dflib8cy86NY9i+NL5nNRzYDIerkwerM0ebpu62G1mSiDxZZHbshfay3L0ZnU3XP/b8YVNJbiCNXJGv+LY9v79ugoCsfWnMsQz4cefa9NHmnG1qUJMRXZAcVZoZXyIXfuho+LY6t2cet09/WtX1lytTRGzGl+GXdusUUNYD0mGd2FsxHK5NH26Y+h/VZonCSjLitXmyluIUq67/X/um0zqzM/NpTf/utzqNJDzgj87mLfMotLvkUgbk/orBuTm7bhquzU/KFIaVZcbdLpB21V93Wk1/79gOlyftJr1V1/dAoxYE+rxs0W6a9ZB9eQzI7ruUJ452TLqedrWMV5jAqVMladNFpZdiOirU62MDh4vG7anhhcGu2vw0Mcv3WZ162TgIOZbH9q1AFqQ9aV8xPL5VcCU6ouZKbEdlelO+vDontfeXsjX9W+OrDo1CWiJPSLwYrohiv2ouN+v7oOOoJlye16ct4723smIq04S3M4Rv60u+z4/vzY5sTw475sYG2xvVSTFyTiifFSAXsF61li8aBqBjzwbHysTB+sybjtrKVEGjKlGTxJ3vevSPbeFoaXbPNLpj/GR+37P45kV3vYbD9Eu5GNTdVmmb/eiyDZQP1qbWvwzdLUq+nRffmB9XIeOPP2u1fXxt072xDfWujQzMvP593zDce6cmzJemFLJeP9Cumj6DwPQgs4ONmeHnd7SpvKai5NocSZmUO9n31DLUszLQYxnsGrxf8/lpy0LvswwxP4xOzYtmPdTmbC2MQl8X9Y4Vw7pp6Nfq7KoMYZNaWqMUpZzz62mtso0OTNfVW+qahrTlEz2PmkquYB7unCCvVB6jMl2ybRmDdiyfwcce6my8o0poUCVWZYk0qXw+w7Mgjmse7t6d1c8+eaBrqbt/s/gc0+8c0zfcjyIO8UrjBS2AtMEnmf7Q+bAy/V7J5XpV4nXZhauy86yzZAGLUadKN77rmhvp06iVVALK8CLTKQQGBePQKZJgb+NgJwRyetFY3KrJvFsmv6UU54hDc+PYdCoRQzEYD3sSMLoXze0nNwqZSKeRfQgonUzww/Ayfph18j3U3aYtlIvz5ZLGq7LSyxcVAmZKZLA3lUQhe8Iw9rM7zu2MO4ygBAwlIngiHkcjIAFUQjIvuLk8G+KFh1xgBxelRTcUSvNjwrPELCHbD4ExIpEMw+hJ4fEIgqCgA2aoGMI86wky5wbQoOCggEuxgsbrqTVKSY4oNCeG7e9FxsMoihIQBDshf6yAQVFQ2IuE+VJJ/jQKFMmNuJaV0K7NqJALipM4SfwQnAslAPH/k64Gh0dJKOpFxKgkAoVIgERcdnWxvK0sRaOILFFE+Xp5euBgMHcMY/Cx+Al8XCgRw8LoNLq3J9OPBkl47LabGfeK4huuJvEjmO4eMHB7MgpgcOJwMM5l2HWDwCA4LJxOpdMoPp5kKDdF+KQqtfmaVCo+jz91iD+VcvVgC8AQmIgiRLD6fKA3iofdPfBQvTrhcXmCMoGDYkTwJMdSP7DTqI9JF4wS8HhMEOZPIxGAR6ilUFyWygv090UQEoaQwBwMCg8Mn6Z1kpyrUATzwCHcUEagD9XtjMd/4LIQtzGUCroAAAAASUVORK5CYII="},"images":{"fallback":{"src":"/static/20f2a8d8398e868f0d50bd7fb356ffdb/c032f/author.jpg","srcSet":"/static/20f2a8d8398e868f0d50bd7fb356ffdb/1f64c/author.jpg 16w,\n/static/20f2a8d8398e868f0d50bd7fb356ffdb/af0fe/author.jpg 32w,\n/static/20f2a8d8398e868f0d50bd7fb356ffdb/c032f/author.jpg 64w,\n/static/20f2a8d8398e868f0d50bd7fb356ffdb/464e8/author.jpg 128w","sizes":"(min-width: 64px) 64px, 100vw"},"sources":[{"srcSet":"/static/20f2a8d8398e868f0d50bd7fb356ffdb/8cd5f/author.avif 16w,\n/static/20f2a8d8398e868f0d50bd7fb356ffdb/34a4f/author.avif 32w,\n/static/20f2a8d8398e868f0d50bd7fb356ffdb/d6ed5/author.avif 64w,\n/static/20f2a8d8398e868f0d50bd7fb356ffdb/8b866/author.avif 128w","type":"image/avif","sizes":"(min-width: 64px) 64px, 100vw"},{"srcSet":"/static/20f2a8d8398e868f0d50bd7fb356ffdb/94d43/author.webp 16w,\n/static/20f2a8d8398e868f0d50bd7fb356ffdb/6c901/author.webp 32w,\n/static/20f2a8d8398e868f0d50bd7fb356ffdb/aa76d/author.webp 64w,\n/static/20f2a8d8398e868f0d50bd7fb356ffdb/5e01a/author.webp 128w","type":"image/webp","sizes":"(min-width: 64px) 64px, 100vw"}]},"width":64,"height":80}}}}}},"pageContext":{"id":"c924c93c-fac0-517e-92e7-c5b5aaa083c2","lang":"en","markupData":{"bannerTitle":"Well unknown facts","blogByAuthorBannerTitle":"Articles by the author","blogByHashtagBannerTitle":"Articles Featuring","head":"CodeCave Insights","readPostLink":"Open article","readingTimeTitle":"read","readingTimeUnits":"min","postFooterTitle":"Congratulations! Now you can show off with your new knowledge!","postFooterText":"If you want us to uncover some other Well unknown facts, you can contact us via the socials or e-mail below. See you!","sharePostTitle":"Share this post","readMoreOnTopicTitle":"Read more on","blogSectionTitle":"new in our blog","blogSectionLinkTitle":"all posts","image":{"childImageSharp":{"gatsbyImageData":{"layout":"constrained","placeholder":{"fallback":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAACXBIWXMAAAsTAAALEwEAmpwYAAAD1UlEQVR42pWUX0zTVxTHCwT501JKaWmBrsUV5N9gIixsuqgwlDCge7Hooli0yp9ZRR+0BdryxxU7oVCQgC3Kn1IMf0S3xLlMI2Mapw+a6JMGX9yMe3EPbvoimHw99xJJnIPpw82vub33ez7nnO89gqioKLzLkkqlkMvliI6O5r+XOid4FzEmFBkZiaCgIISFhSEiIoKLMvH3EnxNFRwcDI1GA4vFgry8PHyo1UIsFkMoFEImk71BvKQgOygSibiYXl+Ge/fu4+X8PC5f+hkOhwOmfSZkrc7ixOHh4Yu0gv+iYt+AgABotYnw+/2Ym5vDo0e/49zUJI47nejr7cXQ4BDcnW7UVNcgOzsbK1aEcGrBv6lYtNDQUOytrMTjx3/i+fNnuHv3DsbHx+AbHibRKTTa7XC1tWNsbAxdbjfG6Wsxm6GKVy0IMiGGHBgYiKysNbh48SeieoHZ2fu4dvVXDA0MwNXeDk9fH/wjI7h58wbOjI7CcsSMbncXBgdOw+v1ID09HQKWIqsD66KZojx58hf++fspZn6ZRmdHB4YHB9F+vA1ej4eo2jjZMUcrJscniK6LU/d0d6PJ3rggyCyQm5uLW7duY36eavXHQ/zw/Xn0e7041d/Pa+Y96eE0vmEfJicmUF1ZBVPNN+jt6eGp7qqoQN6GjdwJnDAjI4NHYh1sqKuDo+UoRkf8sFutOEkNsFlt2GUwoKW5mUjsGDh9Ctd/u4ZOlwtlej0+ycmBtb4BO7Zvh4DVLiQkBPFxcWhqbKRauehyBewNVkydPcvJeohk+so0Dpj2o+07J2ZmpvFgdhaObx3YuH49mumeTqdb6LJEIqHuxEOjVnPL6LdswYkT3TAfPgLDjnK0kud+vHAB9XX1VAIvX9VVVbyue4xGnhGzDXMGu79om5UJCUhOToaYapqelkYCdXAec2KvcQ8tI5ytrWhpaoKupBRRBJFDIpsKNkFNIEzsLWOLqcuMNjMjE6XFJRCSH4uKiqhuLZzyYG0t1n62Fh9RJ5kjNhcU4PN167hvme3eenrszUrooMGwE1/pSpFEr0ROB9UaNfabTCjcXEj12oBDtQfxRX4+PiVnlBQXLw6KNwTZBouUTw9/xOfj6bP91ZkfIykxkYgk2Fa2FUeJ1mazwWjcDZFQxJuw5LRh6SoUCqKSQ6P6AAlqDd9TqVT4eus2lJeXIzU1FV8WFiJOGcvT/t/xxQRer/jYOEpbC6VCSeWIgTJGgZSkVVDExCCS/pe+z4BlhxmBTBYNbcJKJCcmIS0lBbFKJQ+23AxddsCyywvCMkhYEE4mXVbwFQflxPovnsZUAAAAAElFTkSuQmCC"},"images":{"fallback":{"src":"/static/b358397f973ed74732db29698c1773d1/30cdc/blog.png","srcSet":"/static/b358397f973ed74732db29698c1773d1/7458e/blog.png 75w,\n/static/b358397f973ed74732db29698c1773d1/de3a1/blog.png 150w,\n/static/b358397f973ed74732db29698c1773d1/30cdc/blog.png 300w","sizes":"(min-width: 300px) 300px, 100vw"},"sources":[{"srcSet":"/static/b358397f973ed74732db29698c1773d1/eb54c/blog.avif 75w,\n/static/b358397f973ed74732db29698c1773d1/81307/blog.avif 150w,\n/static/b358397f973ed74732db29698c1773d1/aa5b9/blog.avif 300w","type":"image/avif","sizes":"(min-width: 300px) 300px, 100vw"},{"srcSet":"/static/b358397f973ed74732db29698c1773d1/18188/blog.webp 75w,\n/static/b358397f973ed74732db29698c1773d1/c65bc/blog.webp 150w,\n/static/b358397f973ed74732db29698c1773d1/078c3/blog.webp 300w","type":"image/webp","sizes":"(min-width: 300px) 300px, 100vw"}]},"width":300,"height":300}}}},"site":{"siteUrl":"https://www.codecave.it","analytics":{"gtagId":"G-HPEX5BHBSJ","clarityId":"mrqkdfooez"},"commentsSetup":{"repo":"CodeCavePro/www.codecave.pro-new","repoId":"R_kgDOJv3s3g","categoryId":"DIC_kwDOJv3s3s4CgqzO"}},"authorAlias":"Podryabinkina","authorId":"b52b7674-8be1-5af8-b32b-a7bb5f1b4ac9"}},"staticQueryHashes":["1512817958","2595676272","639074693"],"slicesMap":{}} \ No newline at end of file +{"componentChunkName":"component---src-pages-templates-post-tsx","path":"/blog/c924c93c-fac0-517e-92e7-c5b5aaa083c2/","result":{"data":{"post":{"frontmatter":{"date":"21 Jul 2023","title":"Proxmox VM Templates and Cloud-Init","text":"In the world of virtualization, efficiency and automation are key. That's where Proxmox Virtual Environment (VE) comes into play, offering a robust solution for managing virtual machines (VMs) with ease. One of the most powerful features of Proxmox is its ability to use VM templates in conjunction with Cloud-Init, streamlining the deployment process and making it as smooth as a cloud","cover":{"childImageSharp":{"gatsbyImageData":{"layout":"constrained","placeholder":{"fallback":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAACXBIWXMAAAsTAAALEwEAmpwYAAAEyUlEQVR42jWUyW8bZRiHp6Qli2LH9njGu+PEcRLH8RY7XrM4e+KQxUnduG1Cm71JcUJZqhZFrVpQqx4oSwWinFBB4gACcUCISpw5tBzKgX+AP+ThtVsOP9kz3/s97z6KYujjtCGEwRDBItKMEewip8htjOJpeym3yCXPDnlvM4ZRxdYoajb0c0oYyv9qkBcGQ7gO0+ugl5e9Il9bjA5R56vfdpGnDq5BI3WoSe42CUORoOpqNkSxCKRm4JQL3leXu0xReuqKCDBEQH67TTH8opojt8gh91SRQdRQh4rMdVgtqnjdMCAX+swDRCwJ+s1R0tYUb3qXGdWH6BNo2JyQ84Q4jIvzOA6RaozTaozRIKVQ9HoacTrEoEcUtiSJCixhGWDJOc29YJVvI7f5pO89Kp5lkmqSiDgMiV1AwF5TAntbQrIcoFmgikseOgXYK4cRMRoQWEEfZsdX4W5PlVv+K9wOHXHSe8St4HV2/fuM2aZIiH3YkhLoIB7ToDQyiUmgis80UIdF5TBtTTPvLLLVsc1h5z4Hok9nnvD72r98N/kHh+ETNnquU+m9wXjnFgktL9A0XeY0boFqbYMoAXOSmJoiY80yIXUqS5olzznRBhf77rAz8pzhnm/YSvzJdvwJk93HpELvYOhaJ2wrkFPzkn4OvzkjqadR+s0vYWOS5rwYZC0xom0B0lqWEfdFYu4Dkt5NYp4rJALXULsuSeEnOeOcISPOJ7RREtYhegXqNWVR4pLqsDbEon2Ckn2ctdh9lrpv0Gnsw9XqISiO4h17uAO7KI4Fmp0L7Mzd48vdH1nwrVDUJ8hpY4TVYTrNeZSUNcO0Psp5V5EN5xSZ8AMOx19QTf1AzrWBodlFg8zhGecqc5mbfH/wlL+rz3g4+ZhlzwoV5xuM15pkLRCwjKDkrHkWJLIdzyLV9hJtUmRr+zXmUr9yvfCcy+GvSPo3eVj+mb8O/uGX4m9cDX+I071A2bvKvrdM0TFHRpuQtMdQRqVTK45Jga1ys7NCa4sLpVGXqDL4/CeU0095tPCCn0rPqMYeM5q/T5N3FsUUkmmocK1jnWUpw5A+TUidQBkR4FkBHkt0JfswyusWTjVqIhWlyU6jZYJ86AHx4AndY3fxDF/lNbsUX88wJBEe+dYpOZfI22YJWadQ8tLhZbvU0FmQeZLBbMvJ1yMuS+4VqI5yxojS0i41HKPRN0eLdZIBzx659kMS7oqMV1lmd4lBvUjAOoNSG+YpPc+YlqHTUsChraNrmzSpJRRjSqJ0o7R20KiPk3Ttcdz9iDs9X1D1f8Cs5xIFadaofZGoPku7dRolqg6Sl06n1Qx96rQcbBK3HxO0vY1d3+W0pchp8wgF9z63uz/j8+DXPOj5mCP/uxTd6+QcK6Rs8wS1GWyqpByQlYmpaVm9LGEJOalfIGu/QtZxTELAfnHQr6/JF0f2uusOHwXucsP/Ptvte8w41xi0LRDWZvEJzFDrsteUokd2sbY+YXVc9nOJrK3CkP0yGfsWcX2DEfsFNjzb0oC3qPoO2fJuseK6IO9LRLU5uiQzTZr3em0OzaY8XnNWGpIhaBmWKGVItXlS+rLorERcZsS2yqLzHOdc5ymLFuR/QWAJfb7eCIdlkhapv2Ie4j/aRoA3VxcCbwAAAABJRU5ErkJggg=="},"images":{"fallback":{"src":"/static/2a66f8f918e3a764dcda91e208bf722d/c7240/intro.png","srcSet":"/static/2a66f8f918e3a764dcda91e208bf722d/de3a1/intro.png 150w,\n/static/2a66f8f918e3a764dcda91e208bf722d/30cdc/intro.png 300w,\n/static/2a66f8f918e3a764dcda91e208bf722d/c7240/intro.png 600w","sizes":"(min-width: 600px) 600px, 100vw"},"sources":[{"srcSet":"/static/2a66f8f918e3a764dcda91e208bf722d/81307/intro.avif 150w,\n/static/2a66f8f918e3a764dcda91e208bf722d/aa5b9/intro.avif 300w,\n/static/2a66f8f918e3a764dcda91e208bf722d/0c8d0/intro.avif 600w","type":"image/avif","sizes":"(min-width: 600px) 600px, 100vw"},{"srcSet":"/static/2a66f8f918e3a764dcda91e208bf722d/c65bc/intro.webp 150w,\n/static/2a66f8f918e3a764dcda91e208bf722d/078c3/intro.webp 300w,\n/static/2a66f8f918e3a764dcda91e208bf722d/6d09e/intro.webp 600w","type":"image/webp","sizes":"(min-width: 600px) 600px, 100vw"}]},"width":600,"height":600}}},"keywords":["devops","cloud-init","proxmox","VM","virtualization"]},"html":"

Proxmox and Cloud-Init virtual machine templates

\n

In the world of virtualization, efficiency and automation are key. This is where Proxmox Virtual Environment (VE) comes into play, offering a robust solution for easily managing virtual machines (VMs). One of the most interesting features of Proxmox is the ability to use virtual machine templates in combination with Cloud-Init, which simplifies the deployment process and makes it as smooth as in the cloud.\nLet's figure it out.

\n

\n \n \n \n \n \n \n \n \n \n \n
Proxmox VM Templates and Cloud-Init
\n

\n

What is Proxmox?

\n

Proxmox is a free and open source virtualization platform, which means anyone can use or modify it at no cost. It's like a set of tools that allows you to create multiple isolated computers (virtual machines) on a single physical machine. These virtual machines can simultaneously run multiple operating systems such as Windows or Linux, making them versatile for testing, development, or even production environments.

\n

Proxmox is the manager of these virtual environments. It uses a technology called KVM (kernel-based virtual machine), which ensures that each virtual machine runs smoothly without interfering with others. In addition, Proxmox can handle so-called containers via LXC (Linux Containers), which are even lighter than VMs and great for running individual applications with minimal overhead.

\n

You also can manage your VMs and containers from a browser. Web-based interface designed to be user-friendly, so even those new to virtualization can get started without too much trouble.

\n

What are Proxmox VM Templates?

\n

Proxmox VM templates are essentially pre-configured VMs that serve as blueprints for creating new instances. They include the operating system, installed software, and system configurations. The beauty of templates is that they save time and ensure consistency across deployments. You can quickly spin up new VMs without going through the entire installation and configuration process each time.

\n

The Role of Cloud-Init

\n

Cloud-Init is a versatile package that supports various distributions and handles the initial setup of a VM instance, such as network configuration and SSH key distribution. When a VM boots for the first time, Cloud-Init applies the predefined settings, allowing for a hands-off approach to VM provisioning https://pve.proxmox.com/wiki/Cloud-Init_Support.

\n

Combining Proxmox Templates with Cloud-Init

\n

Integrating Cloud-Init with Proxmox VM templates brings the best of both worlds. Here's how you can leverage this combination to your advantage:

\n

Step 1: Preparing Your Template

\n

Start by preparing your VM with the desired configuration. Install the operating system and all necessary packages, including Cloud-Init. Once your VM is ready, convert it into a template to serve as the foundation for future VMs.

\n

Below is the script we use to create the template:

\n
#! /bin/bash\n\n# Install Cloud-Init enabled Ubuntu VM in Proxmox\n\n# Download Ubuntu Cloud Image (Ubuntu 22.04 cloudimg)\nwget https://cloud-images.ubuntu.com/jammy/current/jammy-server-cloudimg-amd64.img\n\n# Install qemu-guest-agent on Ubuntu Cloud Image\n# The libguestfs-tools package must be installed on the system where the ubuntu cloudimg will be modified.\napt-get update\napt-get install libguestfs-tools\n\n# This step will install qemu-guest-agent on the Ubuntu cloud image via virt-customize.\nvirt-customize -a jammy-server-cloudimg-amd64.img --install qemu-guest-agent\n\n# Install git\nvirt-customize -a jammy-server-cloudimg-amd64.img --install git\n\n# Set environment variables. Change these as necessary.\nexport STORAGE_POOL=\"DATA\"\nexport VM_ID=\"1000\"\nexport VM_NAME=\"jammy-template\"\n\n# Create Proxmox VM image from Ubuntu Cloud Image.\nqm create $VM_ID --name $VM_NAME --memory 2048 --net0 virtio,bridge=vmbr2 --scsihw virtio-scsi-pci\nqm set $VM_ID --scsi0 $STORAGE_POOL:0,import-from=/root/jammy-server-cloudimg-amd64.img\n\n# Create Cloud-Init Disk and configure boot.\nqm set $VM_ID --ide2 $STORAGE_POOL:cloudinit\nqm set $VM_ID --boot order=scsi0\nqm set $VM_ID --serial0 socket --vga serial0\n# qm resize $VM_ID scsi0 +20G\n\n# Convert VM to Template\nqm template $VM_ID\n\n# Clean Up\nrm jammy-server-cloudimg-amd64.img
\n

Step 2: Deploying VMs from the Template

\n

With your template in place, you can create linked clones quickly. These clones are lightweight and share the base image with the template, which means rapid deployment. Before starting the new VM, configure the network and SSH keys through the Proxmox interface.

\n

Step 3: Customizing with Cloud-Init

\n

When you start a VM from the template, Cloud-Init kicks in. It reads the configuration data from an ISO image attached to the VM as a CD-ROM. This data includes network settings, user accounts, and SSH keys. Proxmox automatically generates this ISO image, and Cloud-Init applies the settings on the first boot.

\n

We go through steps 2 and 3 via Terraform. This significantly speeds up the process when you need to change some template parameters and create several identical machines at the same time.

\n

Best Practices

\n
    \n
  • SSH Key Authentication: It's recommended to use SSH keys for authentication rather than passwords for security reasons. Proxmox can store encrypted passwords, but keys are a safer alternative.
  • \n
  • Serial Console: Many Cloud-Init images rely on a serial console, which is a requirement for OpenStack. Ensure that your template is configured to use a serial console as the display.
  • \n
  • Custom Configuration: While many distributions offer ready-to-use Cloud-Init images, creating your own ensures that you know exactly what's installed, making it easier to customize later.
  • \n
\n

Conclusion

\n

Proxmox VM templates combined with Cloud-Init provide a powerful, efficient, and automated way to manage VM deployments. This synergy not only saves time but also ensures that each VM is configured consistently according to your standards.

\n

If you want to learn more, I suggest you start by exploring the official Proxmox documentation and community forums for detailed guides and support

\n

Happy virtualizing!

","wordCount":{"words":714}},"author":{"frontmatter":{"authorAlias":"Podryabinkina","author":"Alina Podryabinkina","authorPosition":"DevOps Engineer","authorPhoto":{"childImageSharp":{"gatsbyImageData":{"layout":"constrained","placeholder":{"fallback":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAZCAIAAAC+dZmEAAAACXBIWXMAAAsTAAALEwEAmpwYAAAFbElEQVR42lWSiVPSaRjHf2ur8Du4BDVFVBRFKwhQDm/EEvFC8wKtPKFMbb0qNa0pa7dZK9NJrbTNjMQDvEIRFfHWwANrdmd3/5p90cmZnXnmnWfeeT7P9zvf94W2F/S7llG71bi/ajxYnfq2teDcMn/fnt+xjD6oLlKIwqVcZgSdFhXKyI7nNWtVzo0vf35dPNqaP9qagwC5uzjqWAHw1MHqtHPDDPhdy8i9UuVlfog8MjQ2IlAli72RlawQc/wphOJM2dflib8cy86NY9i+NL5nNRzYDIerkwerM0ebpu62G1mSiDxZZHbshfay3L0ZnU3XP/b8YVNJbiCNXJGv+LY9v79ugoCsfWnMsQz4cefa9NHmnG1qUJMRXZAcVZoZXyIXfuho+LY6t2cet09/WtX1lytTRGzGl+GXdusUUNYD0mGd2FsxHK5NH26Y+h/VZonCSjLitXmyluIUq67/X/um0zqzM/NpTf/utzqNJDzgj87mLfMotLvkUgbk/orBuTm7bhquzU/KFIaVZcbdLpB21V93Wk1/79gOlyftJr1V1/dAoxYE+rxs0W6a9ZB9eQzI7ruUJ452TLqedrWMV5jAqVMladNFpZdiOirU62MDh4vG7anhhcGu2vw0Mcv3WZ162TgIOZbH9q1AFqQ9aV8xPL5VcCU6ouZKbEdlelO+vDontfeXsjX9W+OrDo1CWiJPSLwYrohiv2ouN+v7oOOoJlye16ct4723smIq04S3M4Rv60u+z4/vzY5sTw475sYG2xvVSTFyTiifFSAXsF61li8aBqBjzwbHysTB+sybjtrKVEGjKlGTxJ3vevSPbeFoaXbPNLpj/GR+37P45kV3vYbD9Eu5GNTdVmmb/eiyDZQP1qbWvwzdLUq+nRffmB9XIeOPP2u1fXxt072xDfWujQzMvP593zDce6cmzJemFLJeP9Cumj6DwPQgs4ONmeHnd7SpvKai5NocSZmUO9n31DLUszLQYxnsGrxf8/lpy0LvswwxP4xOzYtmPdTmbC2MQl8X9Y4Vw7pp6Nfq7KoMYZNaWqMUpZzz62mtso0OTNfVW+qahrTlEz2PmkquYB7unCCvVB6jMl2ybRmDdiyfwcce6my8o0poUCVWZYk0qXw+w7Mgjmse7t6d1c8+eaBrqbt/s/gc0+8c0zfcjyIO8UrjBS2AtMEnmf7Q+bAy/V7J5XpV4nXZhauy86yzZAGLUadKN77rmhvp06iVVALK8CLTKQQGBePQKZJgb+NgJwRyetFY3KrJvFsmv6UU54hDc+PYdCoRQzEYD3sSMLoXze0nNwqZSKeRfQgonUzww/Ayfph18j3U3aYtlIvz5ZLGq7LSyxcVAmZKZLA3lUQhe8Iw9rM7zu2MO4ygBAwlIngiHkcjIAFUQjIvuLk8G+KFh1xgBxelRTcUSvNjwrPELCHbD4ExIpEMw+hJ4fEIgqCgA2aoGMI86wky5wbQoOCggEuxgsbrqTVKSY4oNCeG7e9FxsMoihIQBDshf6yAQVFQ2IuE+VJJ/jQKFMmNuJaV0K7NqJALipM4SfwQnAslAPH/k64Gh0dJKOpFxKgkAoVIgERcdnWxvK0sRaOILFFE+Xp5euBgMHcMY/Cx+Al8XCgRw8LoNLq3J9OPBkl47LabGfeK4huuJvEjmO4eMHB7MgpgcOJwMM5l2HWDwCA4LJxOpdMoPp5kKDdF+KQqtfmaVCo+jz91iD+VcvVgC8AQmIgiRLD6fKA3iofdPfBQvTrhcXmCMoGDYkTwJMdSP7DTqI9JF4wS8HhMEOZPIxGAR6ilUFyWygv090UQEoaQwBwMCg8Mn6Z1kpyrUATzwCHcUEagD9XtjMd/4LIQtzGUCroAAAAASUVORK5CYII="},"images":{"fallback":{"src":"/static/20f2a8d8398e868f0d50bd7fb356ffdb/c032f/author.jpg","srcSet":"/static/20f2a8d8398e868f0d50bd7fb356ffdb/1f64c/author.jpg 16w,\n/static/20f2a8d8398e868f0d50bd7fb356ffdb/af0fe/author.jpg 32w,\n/static/20f2a8d8398e868f0d50bd7fb356ffdb/c032f/author.jpg 64w,\n/static/20f2a8d8398e868f0d50bd7fb356ffdb/464e8/author.jpg 128w","sizes":"(min-width: 64px) 64px, 100vw"},"sources":[{"srcSet":"/static/20f2a8d8398e868f0d50bd7fb356ffdb/8cd5f/author.avif 16w,\n/static/20f2a8d8398e868f0d50bd7fb356ffdb/34a4f/author.avif 32w,\n/static/20f2a8d8398e868f0d50bd7fb356ffdb/d6ed5/author.avif 64w,\n/static/20f2a8d8398e868f0d50bd7fb356ffdb/8b866/author.avif 128w","type":"image/avif","sizes":"(min-width: 64px) 64px, 100vw"},{"srcSet":"/static/20f2a8d8398e868f0d50bd7fb356ffdb/94d43/author.webp 16w,\n/static/20f2a8d8398e868f0d50bd7fb356ffdb/6c901/author.webp 32w,\n/static/20f2a8d8398e868f0d50bd7fb356ffdb/aa76d/author.webp 64w,\n/static/20f2a8d8398e868f0d50bd7fb356ffdb/5e01a/author.webp 128w","type":"image/webp","sizes":"(min-width: 64px) 64px, 100vw"}]},"width":64,"height":80}}}}}},"pageContext":{"id":"c924c93c-fac0-517e-92e7-c5b5aaa083c2","lang":"en","markupData":{"bannerTitle":"Well unknown facts","blogByAuthorBannerTitle":"Articles by the author","blogByHashtagBannerTitle":"Articles Featuring","head":"CodeCave Insights","readPostLink":"Open article","readingTimeTitle":"read","readingTimeUnits":"min","postFooterTitle":"Congratulations! Now you can show off with your new knowledge!","postFooterText":"If you want us to uncover some other Well unknown facts, you can contact us via the socials or e-mail below. See you!","sharePostTitle":"Share this post","readMoreOnTopicTitle":"Read more on","blogSectionTitle":"new in our blog","blogSectionLinkTitle":"all posts","image":{"childImageSharp":{"gatsbyImageData":{"layout":"constrained","placeholder":{"fallback":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAACXBIWXMAAAsTAAALEwEAmpwYAAAD1UlEQVR42pWUX0zTVxTHCwT501JKaWmBrsUV5N9gIixsuqgwlDCge7Hooli0yp9ZRR+0BdryxxU7oVCQgC3Kn1IMf0S3xLlMI2Mapw+a6JMGX9yMe3EPbvoimHw99xJJnIPpw82vub33ez7nnO89gqioKLzLkkqlkMvliI6O5r+XOid4FzEmFBkZiaCgIISFhSEiIoKLMvH3EnxNFRwcDI1GA4vFgry8PHyo1UIsFkMoFEImk71BvKQgOygSibiYXl+Ge/fu4+X8PC5f+hkOhwOmfSZkrc7ixOHh4Yu0gv+iYt+AgABotYnw+/2Ym5vDo0e/49zUJI47nejr7cXQ4BDcnW7UVNcgOzsbK1aEcGrBv6lYtNDQUOytrMTjx3/i+fNnuHv3DsbHx+AbHibRKTTa7XC1tWNsbAxdbjfG6Wsxm6GKVy0IMiGGHBgYiKysNbh48SeieoHZ2fu4dvVXDA0MwNXeDk9fH/wjI7h58wbOjI7CcsSMbncXBgdOw+v1ID09HQKWIqsD66KZojx58hf++fspZn6ZRmdHB4YHB9F+vA1ej4eo2jjZMUcrJscniK6LU/d0d6PJ3rggyCyQm5uLW7duY36eavXHQ/zw/Xn0e7041d/Pa+Y96eE0vmEfJicmUF1ZBVPNN+jt6eGp7qqoQN6GjdwJnDAjI4NHYh1sqKuDo+UoRkf8sFutOEkNsFlt2GUwoKW5mUjsGDh9Ctd/u4ZOlwtlej0+ycmBtb4BO7Zvh4DVLiQkBPFxcWhqbKRauehyBewNVkydPcvJeohk+so0Dpj2o+07J2ZmpvFgdhaObx3YuH49mumeTqdb6LJEIqHuxEOjVnPL6LdswYkT3TAfPgLDjnK0kud+vHAB9XX1VAIvX9VVVbyue4xGnhGzDXMGu79om5UJCUhOToaYapqelkYCdXAec2KvcQ8tI5ytrWhpaoKupBRRBJFDIpsKNkFNIEzsLWOLqcuMNjMjE6XFJRCSH4uKiqhuLZzyYG0t1n62Fh9RJ5kjNhcU4PN167hvme3eenrszUrooMGwE1/pSpFEr0ROB9UaNfabTCjcXEj12oBDtQfxRX4+PiVnlBQXLw6KNwTZBouUTw9/xOfj6bP91ZkfIykxkYgk2Fa2FUeJ1mazwWjcDZFQxJuw5LRh6SoUCqKSQ6P6AAlqDd9TqVT4eus2lJeXIzU1FV8WFiJOGcvT/t/xxQRer/jYOEpbC6VCSeWIgTJGgZSkVVDExCCS/pe+z4BlhxmBTBYNbcJKJCcmIS0lBbFKJQ+23AxddsCyywvCMkhYEE4mXVbwFQflxPovnsZUAAAAAElFTkSuQmCC"},"images":{"fallback":{"src":"/static/b358397f973ed74732db29698c1773d1/30cdc/blog.png","srcSet":"/static/b358397f973ed74732db29698c1773d1/7458e/blog.png 75w,\n/static/b358397f973ed74732db29698c1773d1/de3a1/blog.png 150w,\n/static/b358397f973ed74732db29698c1773d1/30cdc/blog.png 300w","sizes":"(min-width: 300px) 300px, 100vw"},"sources":[{"srcSet":"/static/b358397f973ed74732db29698c1773d1/eb54c/blog.avif 75w,\n/static/b358397f973ed74732db29698c1773d1/81307/blog.avif 150w,\n/static/b358397f973ed74732db29698c1773d1/aa5b9/blog.avif 300w","type":"image/avif","sizes":"(min-width: 300px) 300px, 100vw"},{"srcSet":"/static/b358397f973ed74732db29698c1773d1/18188/blog.webp 75w,\n/static/b358397f973ed74732db29698c1773d1/c65bc/blog.webp 150w,\n/static/b358397f973ed74732db29698c1773d1/078c3/blog.webp 300w","type":"image/webp","sizes":"(min-width: 300px) 300px, 100vw"}]},"width":300,"height":300}}}},"site":{"siteUrl":"https://www.codecave.it","analytics":{"gtagId":"G-HPEX5BHBSJ","clarityId":"mrqkdfooez"},"commentsSetup":{"repo":"CodeCavePro/www.codecave.pro-new","repoId":"R_kgDOJv3s3g","categoryId":"DIC_kwDOJv3s3s4CgqzO"}},"authorAlias":"Podryabinkina","authorId":"b52b7674-8be1-5af8-b32b-a7bb5f1b4ac9"}},"staticQueryHashes":["1512817958","2595676272","639074693"],"slicesMap":{}} \ No newline at end of file diff --git a/page-data/blog/e173a2ae-ebb5-5219-9479-035dde5fe8c8/page-data.json b/page-data/blog/e173a2ae-ebb5-5219-9479-035dde5fe8c8/page-data.json index f92d9ef5..7030d462 100644 --- a/page-data/blog/e173a2ae-ebb5-5219-9479-035dde5fe8c8/page-data.json +++ b/page-data/blog/e173a2ae-ebb5-5219-9479-035dde5fe8c8/page-data.json @@ -1 +1 @@ -{"componentChunkName":"component---src-pages-templates-post-tsx","path":"/blog/e173a2ae-ebb5-5219-9479-035dde5fe8c8/","result":{"data":{"post":{"frontmatter":{"date":"15 Mar 2024","title":"Self-Hosted build Agent for Azure Pipelines","text":"Welcome to our guide to installing the Azure Agent In this post, we'll cover the installation process, whether you're setting up a self-hosted agent for Azure Pipelines","keywords":["devops","azure","self-hosted build agent"]},"html":"

Self-Hosted build Agent for Azure Pipelines

\n

Welcome to our guide to installing the Azure Agent\nIn this post, we'll cover the installation process, whether you're setting up a self-hosted agent for Azure Pipelines.

\n

\n \n \n \n\n

Configuring a self-hosted Agent might seem complicated but by following the below steps we can easily configure an agent in our Agent Pool.

\n

So, let's move step by step

\n

Step 1: Creating Agent Pool

\n
    \n
  • Sign in to Microsoft Azure
  • \n
  • Log in to your development project in DevOps (https://dev.azure.com/<your project name>).
  • \n
  • Go to Project Settings -> Pipelines -> Agent Pools and click New Agent Pool.
  • \n
  • Choose self-hosted Agent
  • \n
  • Enter the agent name and click Create
  • \n
\n

\n \n \n \n \n \n \n \n \n \n \n
Self-Hosted build Agent for Azure Pipelines
\n

\n

Step 2: Generate Personal Access Token (PAT)

\n

You need to go to the Personal Access Tokens section under User Settings located in the top right corner of your screen. Name it accordingly and grant permissions as per your requirements.

\n

\n \n \n \n \n \n \n \n \n \n \n
Self-Hosted build Agent for Azure Pipelines
\n

\n

\n \n \n \n \n \n \n \n \n \n \n
Self-Hosted build Agent for Azure Pipelines
\n

\n

If you have any questions, try following the instructions in this link - PAT key.

\n

Step 3: Check prerequisites

\n

Before you begin the installation process, please ensure that your system meets the requirements; links to official documentation are provided below.

\n\n

When it comes to safety, here are the basic principles:

\n
    \n
  • Secure agent folders as they contain sensitive information.
  • \n
  • Use the least required permissions for agent functionality.
  • \n
\n

Step 4: Get The Agent

\n

Once the agent pool is created and PAT is generated, select the pool and click New Agent. In the new pop-up window, choose the operating system which you need and move forward accordingly.

\n

\n \n \n \n \n \n \n \n \n \n \n
Self-Hosted build Agent for Azure Pipelines
\n

\n

Step 5: Configure Agent

\n

We'll look at the Linux configuration as a guide; with other operating systems the steps will be similar.

\n

Once you've clicked \"Download\" or copied the URL, you'll need to log into your virtual machine.

\n

Create an agent folder and navigate to it using the following command:

\n
mkdir myagent && cd myagent
\n

Download the agent using the following command in case of Linux:

\n
wget https://vstsagentpackage.azureedge.net/agent/3.240.1/vsts-agent-linux-x64-3.240.1.tar.gz
\n

Unzip the contents using the following command:

\n
tar zxvf ./vsts-agent-linux-x64-3.240.1.tar.gz
\n

After extracting the contents, configure the agent using the command:

\n
./config.sh
\n

\n \n \n \n \n \n \n \n \n \n \n
Self-Hosted build Agent for Azure Pipelines
\n

\n

Provide the server URL: (https://dev.azure.com/<your project name>), PAT key and the agent pool name you created earlier, agent name and work folder.

\n

Once the agent is configured, it will show as below under your agent pool in Azure DevOps with red mark - Offline.

\n

You can run the agent interactively using this script:

\n
./run.sh
\n

it will bring your agent from Offline to Online.

\n

Once ./run.sh ends, our agent will go offline again and will not be available for deployments until we run it again.

\n

To eliminate unnecessary routine steps and have an agent that is always listening, we will configure it as a service.

\n

We can create a service using this script in your agent folder:

\n
./svc.sh install && ./svc.sh start
\n

Or create a service configuration file

\n
sudo nano /etc/systemd/system/agent.service
\n

Paste the following content into the file:

\n
[Unit]\nDescription=Azure-devops-agent-ubuntu service\n\n[Service]\nUser=<your username>\nExecStart=/path/to/your/agent/run.sh\nRestart=always\n\n[Install]\nWantedBy=multi-user.target
\n

Replace <your username> and /path/to/your/agent/run.sh with your details.

\n

After saving the file, activate and start the service:

\n
sudo systemctl daemon-reload\nsudo systemctl enable agent.service\nsudo systemctl start agent.service\nsudo systemctl status agent.service
\n

The service for your Azure agent is now activated and will run continuously and will be available to take build tasks now!

\n

Final Thoughts

\n

Whether you are using Windows, Linux or MacOS, installing the Azure Agent is an important step in automating your build and deployment processes. By following detailed instructions for each operating system, you can ensure seamless and secure integration with Azure services.

\n

We hope this detailed guide was helpful to you. If you have questions or need more help, please refer to the official Azure documentation.

","wordCount":{"words":763}},"author":{"frontmatter":{"authorAlias":"Podryabinkina","author":"Alina Podryabinkina","authorPosition":"DevOps Engineer","authorPhoto":{"childImageSharp":{"gatsbyImageData":{"layout":"constrained","placeholder":{"fallback":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAZCAIAAAC+dZmEAAAACXBIWXMAAAsTAAALEwEAmpwYAAAFbElEQVR42lWSiVPSaRjHf2ur8Du4BDVFVBRFKwhQDm/EEvFC8wKtPKFMbb0qNa0pa7dZK9NJrbTNjMQDvEIRFfHWwANrdmd3/5p90cmZnXnmnWfeeT7P9zvf94W2F/S7llG71bi/ajxYnfq2teDcMn/fnt+xjD6oLlKIwqVcZgSdFhXKyI7nNWtVzo0vf35dPNqaP9qagwC5uzjqWAHw1MHqtHPDDPhdy8i9UuVlfog8MjQ2IlAli72RlawQc/wphOJM2dflib8cy86NY9i+NL5nNRzYDIerkwerM0ebpu62G1mSiDxZZHbshfay3L0ZnU3XP/b8YVNJbiCNXJGv+LY9v79ugoCsfWnMsQz4cefa9NHmnG1qUJMRXZAcVZoZXyIXfuho+LY6t2cet09/WtX1lytTRGzGl+GXdusUUNYD0mGd2FsxHK5NH26Y+h/VZonCSjLitXmyluIUq67/X/um0zqzM/NpTf/utzqNJDzgj87mLfMotLvkUgbk/orBuTm7bhquzU/KFIaVZcbdLpB21V93Wk1/79gOlyftJr1V1/dAoxYE+rxs0W6a9ZB9eQzI7ruUJ452TLqedrWMV5jAqVMladNFpZdiOirU62MDh4vG7anhhcGu2vw0Mcv3WZ162TgIOZbH9q1AFqQ9aV8xPL5VcCU6ouZKbEdlelO+vDontfeXsjX9W+OrDo1CWiJPSLwYrohiv2ouN+v7oOOoJlye16ct4723smIq04S3M4Rv60u+z4/vzY5sTw475sYG2xvVSTFyTiifFSAXsF61li8aBqBjzwbHysTB+sybjtrKVEGjKlGTxJ3vevSPbeFoaXbPNLpj/GR+37P45kV3vYbD9Eu5GNTdVmmb/eiyDZQP1qbWvwzdLUq+nRffmB9XIeOPP2u1fXxt072xDfWujQzMvP593zDce6cmzJemFLJeP9Cumj6DwPQgs4ONmeHnd7SpvKai5NocSZmUO9n31DLUszLQYxnsGrxf8/lpy0LvswwxP4xOzYtmPdTmbC2MQl8X9Y4Vw7pp6Nfq7KoMYZNaWqMUpZzz62mtso0OTNfVW+qahrTlEz2PmkquYB7unCCvVB6jMl2ybRmDdiyfwcce6my8o0poUCVWZYk0qXw+w7Mgjmse7t6d1c8+eaBrqbt/s/gc0+8c0zfcjyIO8UrjBS2AtMEnmf7Q+bAy/V7J5XpV4nXZhauy86yzZAGLUadKN77rmhvp06iVVALK8CLTKQQGBePQKZJgb+NgJwRyetFY3KrJvFsmv6UU54hDc+PYdCoRQzEYD3sSMLoXze0nNwqZSKeRfQgonUzww/Ayfph18j3U3aYtlIvz5ZLGq7LSyxcVAmZKZLA3lUQhe8Iw9rM7zu2MO4ygBAwlIngiHkcjIAFUQjIvuLk8G+KFh1xgBxelRTcUSvNjwrPELCHbD4ExIpEMw+hJ4fEIgqCgA2aoGMI86wky5wbQoOCggEuxgsbrqTVKSY4oNCeG7e9FxsMoihIQBDshf6yAQVFQ2IuE+VJJ/jQKFMmNuJaV0K7NqJALipM4SfwQnAslAPH/k64Gh0dJKOpFxKgkAoVIgERcdnWxvK0sRaOILFFE+Xp5euBgMHcMY/Cx+Al8XCgRw8LoNLq3J9OPBkl47LabGfeK4huuJvEjmO4eMHB7MgpgcOJwMM5l2HWDwCA4LJxOpdMoPp5kKDdF+KQqtfmaVCo+jz91iD+VcvVgC8AQmIgiRLD6fKA3iofdPfBQvTrhcXmCMoGDYkTwJMdSP7DTqI9JF4wS8HhMEOZPIxGAR6ilUFyWygv090UQEoaQwBwMCg8Mn6Z1kpyrUATzwCHcUEagD9XtjMd/4LIQtzGUCroAAAAASUVORK5CYII="},"images":{"fallback":{"src":"/static/20f2a8d8398e868f0d50bd7fb356ffdb/c032f/author.jpg","srcSet":"/static/20f2a8d8398e868f0d50bd7fb356ffdb/1f64c/author.jpg 16w,\n/static/20f2a8d8398e868f0d50bd7fb356ffdb/af0fe/author.jpg 32w,\n/static/20f2a8d8398e868f0d50bd7fb356ffdb/c032f/author.jpg 64w,\n/static/20f2a8d8398e868f0d50bd7fb356ffdb/464e8/author.jpg 128w","sizes":"(min-width: 64px) 64px, 100vw"},"sources":[{"srcSet":"/static/20f2a8d8398e868f0d50bd7fb356ffdb/8cd5f/author.avif 16w,\n/static/20f2a8d8398e868f0d50bd7fb356ffdb/34a4f/author.avif 32w,\n/static/20f2a8d8398e868f0d50bd7fb356ffdb/d6ed5/author.avif 64w,\n/static/20f2a8d8398e868f0d50bd7fb356ffdb/8b866/author.avif 128w","type":"image/avif","sizes":"(min-width: 64px) 64px, 100vw"},{"srcSet":"/static/20f2a8d8398e868f0d50bd7fb356ffdb/94d43/author.webp 16w,\n/static/20f2a8d8398e868f0d50bd7fb356ffdb/6c901/author.webp 32w,\n/static/20f2a8d8398e868f0d50bd7fb356ffdb/aa76d/author.webp 64w,\n/static/20f2a8d8398e868f0d50bd7fb356ffdb/5e01a/author.webp 128w","type":"image/webp","sizes":"(min-width: 64px) 64px, 100vw"}]},"width":64,"height":80}}}}}},"pageContext":{"id":"e173a2ae-ebb5-5219-9479-035dde5fe8c8","lang":"en","markupData":{"bannerTitle":"Well unknown facts","blogByAuthorBannerTitle":"Articles by the author","blogByHashtagBannerTitle":"Articles Featuring","head":"CodeCave Insights","readPostLink":"Open article","readingTimeTitle":"read","readingTimeUnits":"min","postFooterTitle":"Congratulations! Now you can show off with your new knowledge!","postFooterText":"If you want us to uncover some other Well unknown facts, you can contact us via the socials or e-mail below. See you!","sharePostTitle":"Share this post","readMoreOnTopicTitle":"Read more on","blogSectionTitle":"new in our blog","blogSectionLinkTitle":"all posts","image":{"childImageSharp":{"gatsbyImageData":{"layout":"constrained","placeholder":{"fallback":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAACXBIWXMAAAsTAAALEwEAmpwYAAAD1UlEQVR42pWUX0zTVxTHCwT501JKaWmBrsUV5N9gIixsuqgwlDCge7Hooli0yp9ZRR+0BdryxxU7oVCQgC3Kn1IMf0S3xLlMI2Mapw+a6JMGX9yMe3EPbvoimHw99xJJnIPpw82vub33ez7nnO89gqioKLzLkkqlkMvliI6O5r+XOid4FzEmFBkZiaCgIISFhSEiIoKLMvH3EnxNFRwcDI1GA4vFgry8PHyo1UIsFkMoFEImk71BvKQgOygSibiYXl+Ge/fu4+X8PC5f+hkOhwOmfSZkrc7ixOHh4Yu0gv+iYt+AgABotYnw+/2Ym5vDo0e/49zUJI47nejr7cXQ4BDcnW7UVNcgOzsbK1aEcGrBv6lYtNDQUOytrMTjx3/i+fNnuHv3DsbHx+AbHibRKTTa7XC1tWNsbAxdbjfG6Wsxm6GKVy0IMiGGHBgYiKysNbh48SeieoHZ2fu4dvVXDA0MwNXeDk9fH/wjI7h58wbOjI7CcsSMbncXBgdOw+v1ID09HQKWIqsD66KZojx58hf++fspZn6ZRmdHB4YHB9F+vA1ej4eo2jjZMUcrJscniK6LU/d0d6PJ3rggyCyQm5uLW7duY36eavXHQ/zw/Xn0e7041d/Pa+Y96eE0vmEfJicmUF1ZBVPNN+jt6eGp7qqoQN6GjdwJnDAjI4NHYh1sqKuDo+UoRkf8sFutOEkNsFlt2GUwoKW5mUjsGDh9Ctd/u4ZOlwtlej0+ycmBtb4BO7Zvh4DVLiQkBPFxcWhqbKRauehyBewNVkydPcvJeohk+so0Dpj2o+07J2ZmpvFgdhaObx3YuH49mumeTqdb6LJEIqHuxEOjVnPL6LdswYkT3TAfPgLDjnK0kud+vHAB9XX1VAIvX9VVVbyue4xGnhGzDXMGu79om5UJCUhOToaYapqelkYCdXAec2KvcQ8tI5ytrWhpaoKupBRRBJFDIpsKNkFNIEzsLWOLqcuMNjMjE6XFJRCSH4uKiqhuLZzyYG0t1n62Fh9RJ5kjNhcU4PN167hvme3eenrszUrooMGwE1/pSpFEr0ROB9UaNfabTCjcXEj12oBDtQfxRX4+PiVnlBQXLw6KNwTZBouUTw9/xOfj6bP91ZkfIykxkYgk2Fa2FUeJ1mazwWjcDZFQxJuw5LRh6SoUCqKSQ6P6AAlqDd9TqVT4eus2lJeXIzU1FV8WFiJOGcvT/t/xxQRer/jYOEpbC6VCSeWIgTJGgZSkVVDExCCS/pe+z4BlhxmBTBYNbcJKJCcmIS0lBbFKJQ+23AxddsCyywvCMkhYEE4mXVbwFQflxPovnsZUAAAAAElFTkSuQmCC"},"images":{"fallback":{"src":"/static/b358397f973ed74732db29698c1773d1/30cdc/blog.png","srcSet":"/static/b358397f973ed74732db29698c1773d1/7458e/blog.png 75w,\n/static/b358397f973ed74732db29698c1773d1/de3a1/blog.png 150w,\n/static/b358397f973ed74732db29698c1773d1/30cdc/blog.png 300w","sizes":"(min-width: 300px) 300px, 100vw"},"sources":[{"srcSet":"/static/b358397f973ed74732db29698c1773d1/eb54c/blog.avif 75w,\n/static/b358397f973ed74732db29698c1773d1/81307/blog.avif 150w,\n/static/b358397f973ed74732db29698c1773d1/aa5b9/blog.avif 300w","type":"image/avif","sizes":"(min-width: 300px) 300px, 100vw"},{"srcSet":"/static/b358397f973ed74732db29698c1773d1/18188/blog.webp 75w,\n/static/b358397f973ed74732db29698c1773d1/c65bc/blog.webp 150w,\n/static/b358397f973ed74732db29698c1773d1/078c3/blog.webp 300w","type":"image/webp","sizes":"(min-width: 300px) 300px, 100vw"}]},"width":300,"height":300}}}},"site":{"siteUrl":"https://www.codecave.it","analytics":{"gtagId":"G-HPEX5BHBSJ","clarityId":"mrqkdfooez"},"commentsSetup":{"repo":"CodeCavePro/www.codecave.pro-new","repoId":"R_kgDOJv3s3g","categoryId":"DIC_kwDOJv3s3s4CgqzO"}},"authorAlias":"Podryabinkina","authorId":"b52b7674-8be1-5af8-b32b-a7bb5f1b4ac9"}},"staticQueryHashes":["1512817958","2595676272","639074693"],"slicesMap":{}} \ No newline at end of file +{"componentChunkName":"component---src-pages-templates-post-tsx","path":"/blog/e173a2ae-ebb5-5219-9479-035dde5fe8c8/","result":{"data":{"post":{"frontmatter":{"date":"15 Mar 2024","title":"Self-Hosted build Agent for Azure Pipelines","text":"Welcome to our guide to installing the Azure Agent In this post, we'll cover the installation process, whether you're setting up a self-hosted agent for Azure Pipelines","cover":{"childImageSharp":{"gatsbyImageData":{"layout":"constrained","placeholder":{"fallback":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAACXBIWXMAAAsTAAALEwEAmpwYAAAFZklEQVR42iWUe1DU1xXH7+/BD3Z5IwR5P7JENMKy8l5cMDy2BJGgvFlAICKLAiIKQUHQBGPEWKIRJUyIEndstRPHatVqTCJJRtKx5jFJnbS1f2RsJ5nM9GE60zbOJJ9eyR9n7j/3fM73e865VzjUAZ7xnaA15iTbV11ir/NDDtV9wlTHl5zc8RVn933LxcMPuDH9X255HvLF5R+5vwAPvoTvv4K/3YHzP/+Gya13GK66jnjaGGdj9CyDuVeZqL7DzJZ7nBn5hksvP+Dm7H/47OIP3L8F3/1RAu5L0D24+/7f+eWxWwx3zFK+qgd3xRTTO//Anrq3EdVBR9hmu8Bk42e89cK3LJz+nr+8C/+6Cw8l4J9/+pG78//g3NQdhtpP47TtZNUSF9H6GmKNPKK1lawvGGSq9xHwGqJx6QlGi29y+8z/+Pef4etPH/L7K3/ljZdusqVuGntKH6G+ZegiA0UkIEQwcX75/CzOTUZ4HYWxLuoL9jLp/pjd1VcRrqjX2LH61xzsOU+v6zAO62YSI6tJeryelNRnMZuzJMQiw0qYz2p25c9ypPwy+53n6Fw9SUbYOqrsu5lov81g5SUJDJ8hP6gHL9Wf5IhS7GmbcKY8R3vGUXrT5gjWnaTaD9C173c8aRmjMnEPjqVt2ILrcGWOEWvOZG36NsYbbtFfdh5R6zdFptGKl27GbT3I0Zx3eCnpKvviLtIeNE2u/QQz73zHwg/Qe2CBJwJbaUgfZWPWOKVPuPHXIilN28rY+nl6is5KoPcJsvUODN2PtmVj1MUOkR1UjzWsFFXE4Sg5yJTna7YMfEhh1stUWfeSGlpJcWQ7eSGNi8DCFZvYVXadLocH0aC9zmqtG1UzsC4ppkla6o8/RXHYVmID89lsP8xAmYeshB4GnDMUJLQSY87BGlxOfpQLZ2Ij9vhmdhRepCP7JKJFP0W+1oeu+/Jc2nEmss6zKfoVyh8foWzFEDnycm36Lpwr3DSkjNJvmWEk/gKdUTM4IprIWbqOnBgXPfZf0SLzRZvuYY22A0038UxMN53Jxxl84Qbu+jlsETU4Ld3UpY9hjd5AS8o+9lvPUR89Qk5AEx1yWA3ZvdiW1NC56k1qlx+SQPUMa9SdeHmZ2BC/nfqk/VQXvcgG2/NYwyuxx9TSaBulLW2corhm/ESs7G0wkaZ09pScpiK5E1tQDW3LX6cq8QCiWXkTh9one+iFI7GeZ20H2bbyGCOpHtzRU4QYFtZa2nk6ppOV5lLS/MtoTt3NaMEck2uvMOyYIz2gjqLwPtnXSvlSlFlyFTe6VNhpmWBkmYeWiHHKArvJDXBh869gXUI3/dlTHKm4yqkNtzle/BFvdX7OQIoHu6mVUFnUrD+GWQlHVCqvkqY0SaA3qcFPkRlYRWniZrbaD3Gg7Bxv1C5wofEel7vu0S+LZXu3s8ynhEgjFZMWLJ1pKF4Ckx5KiJaEKFCGSFRLEKogKSSLo5XXmKv8mCOF8/JLO0aevoVs30YSfHIxiTA5PC+ELhZD1Y1F0KMd9tOiCFaXIZaLagK1eBRDxV+PxKq5yPVtJl7PI0CNxsfw+wkgVSiGtmgtSE8gSS2lXHmREvE8EUoeoYqVJeqTCJMWIu36LFrWDQPD2yQtqAhvqcBbwfDyJUxfQbK2jiIxjEvMUiFeoU2cYVh8QLs4y0rRSpTiIEyxycK6j1yZR0BD2vFBlae/FotFKkhTWkhVNtIk5tgmrjMk5iVknl5xhT4Zg+IGreIXZIge4kUp4SL7J+AjmKEHkCxqyFS6qBHTEnCDLvEbaqWi7cpvGdbfY7f5XYZ93mNQe5sB5Tr94hrNwkOu2IlFrCdC5PF/W0wRt68x0gQAAAAASUVORK5CYII="},"images":{"fallback":{"src":"/static/3fca93d2586705496a1e6caa1caeaf98/c7240/intro.png","srcSet":"/static/3fca93d2586705496a1e6caa1caeaf98/de3a1/intro.png 150w,\n/static/3fca93d2586705496a1e6caa1caeaf98/30cdc/intro.png 300w,\n/static/3fca93d2586705496a1e6caa1caeaf98/c7240/intro.png 600w","sizes":"(min-width: 600px) 600px, 100vw"},"sources":[{"srcSet":"/static/3fca93d2586705496a1e6caa1caeaf98/81307/intro.avif 150w,\n/static/3fca93d2586705496a1e6caa1caeaf98/aa5b9/intro.avif 300w,\n/static/3fca93d2586705496a1e6caa1caeaf98/0c8d0/intro.avif 600w","type":"image/avif","sizes":"(min-width: 600px) 600px, 100vw"},{"srcSet":"/static/3fca93d2586705496a1e6caa1caeaf98/c65bc/intro.webp 150w,\n/static/3fca93d2586705496a1e6caa1caeaf98/078c3/intro.webp 300w,\n/static/3fca93d2586705496a1e6caa1caeaf98/6d09e/intro.webp 600w","type":"image/webp","sizes":"(min-width: 600px) 600px, 100vw"}]},"width":600,"height":600}}},"keywords":["devops","azure","self-hosted build agent"]},"html":"

Self-Hosted build Agent for Azure Pipelines

\n

Welcome to our guide to installing the Azure Agent\nIn this post, we'll cover the installation process, whether you're setting up a self-hosted agent for Azure Pipelines.

\n

\n \n \n \n\n

Configuring a self-hosted Agent might seem complicated but by following the below steps we can easily configure an agent in our Agent Pool.

\n

So, let's move step by step

\n

Step 1: Creating Agent Pool

\n
    \n
  • Sign in to Microsoft Azure
  • \n
  • Log in to your development project in DevOps (https://dev.azure.com/<your project name>).
  • \n
  • Go to Project Settings -> Pipelines -> Agent Pools and click New Agent Pool.
  • \n
  • Choose self-hosted Agent
  • \n
  • Enter the agent name and click Create
  • \n
\n

\n \n \n \n \n \n \n \n \n \n \n
Self-Hosted build Agent for Azure Pipelines
\n

\n

Step 2: Generate Personal Access Token (PAT)

\n

You need to go to the Personal Access Tokens section under User Settings located in the top right corner of your screen. Name it accordingly and grant permissions as per your requirements.

\n

\n \n \n \n \n \n \n \n \n \n \n
Self-Hosted build Agent for Azure Pipelines
\n

\n

\n \n \n \n \n \n \n \n \n \n \n
Self-Hosted build Agent for Azure Pipelines
\n

\n

If you have any questions, try following the instructions in this link - PAT key.

\n

Step 3: Check prerequisites

\n

Before you begin the installation process, please ensure that your system meets the requirements; links to official documentation are provided below.

\n\n

When it comes to safety, here are the basic principles:

\n
    \n
  • Secure agent folders as they contain sensitive information.
  • \n
  • Use the least required permissions for agent functionality.
  • \n
\n

Step 4: Get The Agent

\n

Once the agent pool is created and PAT is generated, select the pool and click New Agent. In the new pop-up window, choose the operating system which you need and move forward accordingly.

\n

\n \n \n \n \n \n \n \n \n \n \n
Self-Hosted build Agent for Azure Pipelines
\n

\n

Step 5: Configure Agent

\n

We'll look at the Linux configuration as a guide; with other operating systems the steps will be similar.

\n

Once you've clicked \"Download\" or copied the URL, you'll need to log into your virtual machine.

\n

Create an agent folder and navigate to it using the following command:

\n
mkdir myagent && cd myagent
\n

Download the agent using the following command in case of Linux:

\n
wget https://vstsagentpackage.azureedge.net/agent/3.240.1/vsts-agent-linux-x64-3.240.1.tar.gz
\n

Unzip the contents using the following command:

\n
tar zxvf ./vsts-agent-linux-x64-3.240.1.tar.gz
\n

After extracting the contents, configure the agent using the command:

\n
./config.sh
\n

\n \n \n \n \n \n \n \n \n \n \n
Self-Hosted build Agent for Azure Pipelines
\n

\n

Provide the server URL: (https://dev.azure.com/<your project name>), PAT key and the agent pool name you created earlier, agent name and work folder.

\n

Once the agent is configured, it will show as below under your agent pool in Azure DevOps with red mark - Offline.

\n

You can run the agent interactively using this script:

\n
./run.sh
\n

it will bring your agent from Offline to Online.

\n

Once ./run.sh ends, our agent will go offline again and will not be available for deployments until we run it again.

\n

To eliminate unnecessary routine steps and have an agent that is always listening, we will configure it as a service.

\n

We can create a service using this script in your agent folder:

\n
./svc.sh install && ./svc.sh start
\n

Or create a service configuration file

\n
sudo nano /etc/systemd/system/agent.service
\n

Paste the following content into the file:

\n
[Unit]\nDescription=Azure-devops-agent-ubuntu service\n\n[Service]\nUser=<your username>\nExecStart=/path/to/your/agent/run.sh\nRestart=always\n\n[Install]\nWantedBy=multi-user.target
\n

Replace <your username> and /path/to/your/agent/run.sh with your details.

\n

After saving the file, activate and start the service:

\n
sudo systemctl daemon-reload\nsudo systemctl enable agent.service\nsudo systemctl start agent.service\nsudo systemctl status agent.service
\n

The service for your Azure agent is now activated and will run continuously and will be available to take build tasks now!

\n

Final Thoughts

\n

Whether you are using Windows, Linux or MacOS, installing the Azure Agent is an important step in automating your build and deployment processes. By following detailed instructions for each operating system, you can ensure seamless and secure integration with Azure services.

\n

We hope this detailed guide was helpful to you. If you have questions or need more help, please refer to the official Azure documentation.

","wordCount":{"words":763}},"author":{"frontmatter":{"authorAlias":"Podryabinkina","author":"Alina Podryabinkina","authorPosition":"DevOps Engineer","authorPhoto":{"childImageSharp":{"gatsbyImageData":{"layout":"constrained","placeholder":{"fallback":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAZCAIAAAC+dZmEAAAACXBIWXMAAAsTAAALEwEAmpwYAAAFbElEQVR42lWSiVPSaRjHf2ur8Du4BDVFVBRFKwhQDm/EEvFC8wKtPKFMbb0qNa0pa7dZK9NJrbTNjMQDvEIRFfHWwANrdmd3/5p90cmZnXnmnWfeeT7P9zvf94W2F/S7llG71bi/ajxYnfq2teDcMn/fnt+xjD6oLlKIwqVcZgSdFhXKyI7nNWtVzo0vf35dPNqaP9qagwC5uzjqWAHw1MHqtHPDDPhdy8i9UuVlfog8MjQ2IlAli72RlawQc/wphOJM2dflib8cy86NY9i+NL5nNRzYDIerkwerM0ebpu62G1mSiDxZZHbshfay3L0ZnU3XP/b8YVNJbiCNXJGv+LY9v79ugoCsfWnMsQz4cefa9NHmnG1qUJMRXZAcVZoZXyIXfuho+LY6t2cet09/WtX1lytTRGzGl+GXdusUUNYD0mGd2FsxHK5NH26Y+h/VZonCSjLitXmyluIUq67/X/um0zqzM/NpTf/utzqNJDzgj87mLfMotLvkUgbk/orBuTm7bhquzU/KFIaVZcbdLpB21V93Wk1/79gOlyftJr1V1/dAoxYE+rxs0W6a9ZB9eQzI7ruUJ452TLqedrWMV5jAqVMladNFpZdiOirU62MDh4vG7anhhcGu2vw0Mcv3WZ162TgIOZbH9q1AFqQ9aV8xPL5VcCU6ouZKbEdlelO+vDontfeXsjX9W+OrDo1CWiJPSLwYrohiv2ouN+v7oOOoJlye16ct4723smIq04S3M4Rv60u+z4/vzY5sTw475sYG2xvVSTFyTiifFSAXsF61li8aBqBjzwbHysTB+sybjtrKVEGjKlGTxJ3vevSPbeFoaXbPNLpj/GR+37P45kV3vYbD9Eu5GNTdVmmb/eiyDZQP1qbWvwzdLUq+nRffmB9XIeOPP2u1fXxt072xDfWujQzMvP593zDce6cmzJemFLJeP9Cumj6DwPQgs4ONmeHnd7SpvKai5NocSZmUO9n31DLUszLQYxnsGrxf8/lpy0LvswwxP4xOzYtmPdTmbC2MQl8X9Y4Vw7pp6Nfq7KoMYZNaWqMUpZzz62mtso0OTNfVW+qahrTlEz2PmkquYB7unCCvVB6jMl2ybRmDdiyfwcce6my8o0poUCVWZYk0qXw+w7Mgjmse7t6d1c8+eaBrqbt/s/gc0+8c0zfcjyIO8UrjBS2AtMEnmf7Q+bAy/V7J5XpV4nXZhauy86yzZAGLUadKN77rmhvp06iVVALK8CLTKQQGBePQKZJgb+NgJwRyetFY3KrJvFsmv6UU54hDc+PYdCoRQzEYD3sSMLoXze0nNwqZSKeRfQgonUzww/Ayfph18j3U3aYtlIvz5ZLGq7LSyxcVAmZKZLA3lUQhe8Iw9rM7zu2MO4ygBAwlIngiHkcjIAFUQjIvuLk8G+KFh1xgBxelRTcUSvNjwrPELCHbD4ExIpEMw+hJ4fEIgqCgA2aoGMI86wky5wbQoOCggEuxgsbrqTVKSY4oNCeG7e9FxsMoihIQBDshf6yAQVFQ2IuE+VJJ/jQKFMmNuJaV0K7NqJALipM4SfwQnAslAPH/k64Gh0dJKOpFxKgkAoVIgERcdnWxvK0sRaOILFFE+Xp5euBgMHcMY/Cx+Al8XCgRw8LoNLq3J9OPBkl47LabGfeK4huuJvEjmO4eMHB7MgpgcOJwMM5l2HWDwCA4LJxOpdMoPp5kKDdF+KQqtfmaVCo+jz91iD+VcvVgC8AQmIgiRLD6fKA3iofdPfBQvTrhcXmCMoGDYkTwJMdSP7DTqI9JF4wS8HhMEOZPIxGAR6ilUFyWygv090UQEoaQwBwMCg8Mn6Z1kpyrUATzwCHcUEagD9XtjMd/4LIQtzGUCroAAAAASUVORK5CYII="},"images":{"fallback":{"src":"/static/20f2a8d8398e868f0d50bd7fb356ffdb/c032f/author.jpg","srcSet":"/static/20f2a8d8398e868f0d50bd7fb356ffdb/1f64c/author.jpg 16w,\n/static/20f2a8d8398e868f0d50bd7fb356ffdb/af0fe/author.jpg 32w,\n/static/20f2a8d8398e868f0d50bd7fb356ffdb/c032f/author.jpg 64w,\n/static/20f2a8d8398e868f0d50bd7fb356ffdb/464e8/author.jpg 128w","sizes":"(min-width: 64px) 64px, 100vw"},"sources":[{"srcSet":"/static/20f2a8d8398e868f0d50bd7fb356ffdb/8cd5f/author.avif 16w,\n/static/20f2a8d8398e868f0d50bd7fb356ffdb/34a4f/author.avif 32w,\n/static/20f2a8d8398e868f0d50bd7fb356ffdb/d6ed5/author.avif 64w,\n/static/20f2a8d8398e868f0d50bd7fb356ffdb/8b866/author.avif 128w","type":"image/avif","sizes":"(min-width: 64px) 64px, 100vw"},{"srcSet":"/static/20f2a8d8398e868f0d50bd7fb356ffdb/94d43/author.webp 16w,\n/static/20f2a8d8398e868f0d50bd7fb356ffdb/6c901/author.webp 32w,\n/static/20f2a8d8398e868f0d50bd7fb356ffdb/aa76d/author.webp 64w,\n/static/20f2a8d8398e868f0d50bd7fb356ffdb/5e01a/author.webp 128w","type":"image/webp","sizes":"(min-width: 64px) 64px, 100vw"}]},"width":64,"height":80}}}}}},"pageContext":{"id":"e173a2ae-ebb5-5219-9479-035dde5fe8c8","lang":"en","markupData":{"bannerTitle":"Well unknown facts","blogByAuthorBannerTitle":"Articles by the author","blogByHashtagBannerTitle":"Articles Featuring","head":"CodeCave Insights","readPostLink":"Open article","readingTimeTitle":"read","readingTimeUnits":"min","postFooterTitle":"Congratulations! Now you can show off with your new knowledge!","postFooterText":"If you want us to uncover some other Well unknown facts, you can contact us via the socials or e-mail below. See you!","sharePostTitle":"Share this post","readMoreOnTopicTitle":"Read more on","blogSectionTitle":"new in our blog","blogSectionLinkTitle":"all posts","image":{"childImageSharp":{"gatsbyImageData":{"layout":"constrained","placeholder":{"fallback":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAACXBIWXMAAAsTAAALEwEAmpwYAAAD1UlEQVR42pWUX0zTVxTHCwT501JKaWmBrsUV5N9gIixsuqgwlDCge7Hooli0yp9ZRR+0BdryxxU7oVCQgC3Kn1IMf0S3xLlMI2Mapw+a6JMGX9yMe3EPbvoimHw99xJJnIPpw82vub33ez7nnO89gqioKLzLkkqlkMvliI6O5r+XOid4FzEmFBkZiaCgIISFhSEiIoKLMvH3EnxNFRwcDI1GA4vFgry8PHyo1UIsFkMoFEImk71BvKQgOygSibiYXl+Ge/fu4+X8PC5f+hkOhwOmfSZkrc7ixOHh4Yu0gv+iYt+AgABotYnw+/2Ym5vDo0e/49zUJI47nejr7cXQ4BDcnW7UVNcgOzsbK1aEcGrBv6lYtNDQUOytrMTjx3/i+fNnuHv3DsbHx+AbHibRKTTa7XC1tWNsbAxdbjfG6Wsxm6GKVy0IMiGGHBgYiKysNbh48SeieoHZ2fu4dvVXDA0MwNXeDk9fH/wjI7h58wbOjI7CcsSMbncXBgdOw+v1ID09HQKWIqsD66KZojx58hf++fspZn6ZRmdHB4YHB9F+vA1ej4eo2jjZMUcrJscniK6LU/d0d6PJ3rggyCyQm5uLW7duY36eavXHQ/zw/Xn0e7041d/Pa+Y96eE0vmEfJicmUF1ZBVPNN+jt6eGp7qqoQN6GjdwJnDAjI4NHYh1sqKuDo+UoRkf8sFutOEkNsFlt2GUwoKW5mUjsGDh9Ctd/u4ZOlwtlej0+ycmBtb4BO7Zvh4DVLiQkBPFxcWhqbKRauehyBewNVkydPcvJeohk+so0Dpj2o+07J2ZmpvFgdhaObx3YuH49mumeTqdb6LJEIqHuxEOjVnPL6LdswYkT3TAfPgLDjnK0kud+vHAB9XX1VAIvX9VVVbyue4xGnhGzDXMGu79om5UJCUhOToaYapqelkYCdXAec2KvcQ8tI5ytrWhpaoKupBRRBJFDIpsKNkFNIEzsLWOLqcuMNjMjE6XFJRCSH4uKiqhuLZzyYG0t1n62Fh9RJ5kjNhcU4PN167hvme3eenrszUrooMGwE1/pSpFEr0ROB9UaNfabTCjcXEj12oBDtQfxRX4+PiVnlBQXLw6KNwTZBouUTw9/xOfj6bP91ZkfIykxkYgk2Fa2FUeJ1mazwWjcDZFQxJuw5LRh6SoUCqKSQ6P6AAlqDd9TqVT4eus2lJeXIzU1FV8WFiJOGcvT/t/xxQRer/jYOEpbC6VCSeWIgTJGgZSkVVDExCCS/pe+z4BlhxmBTBYNbcJKJCcmIS0lBbFKJQ+23AxddsCyywvCMkhYEE4mXVbwFQflxPovnsZUAAAAAElFTkSuQmCC"},"images":{"fallback":{"src":"/static/b358397f973ed74732db29698c1773d1/30cdc/blog.png","srcSet":"/static/b358397f973ed74732db29698c1773d1/7458e/blog.png 75w,\n/static/b358397f973ed74732db29698c1773d1/de3a1/blog.png 150w,\n/static/b358397f973ed74732db29698c1773d1/30cdc/blog.png 300w","sizes":"(min-width: 300px) 300px, 100vw"},"sources":[{"srcSet":"/static/b358397f973ed74732db29698c1773d1/eb54c/blog.avif 75w,\n/static/b358397f973ed74732db29698c1773d1/81307/blog.avif 150w,\n/static/b358397f973ed74732db29698c1773d1/aa5b9/blog.avif 300w","type":"image/avif","sizes":"(min-width: 300px) 300px, 100vw"},{"srcSet":"/static/b358397f973ed74732db29698c1773d1/18188/blog.webp 75w,\n/static/b358397f973ed74732db29698c1773d1/c65bc/blog.webp 150w,\n/static/b358397f973ed74732db29698c1773d1/078c3/blog.webp 300w","type":"image/webp","sizes":"(min-width: 300px) 300px, 100vw"}]},"width":300,"height":300}}}},"site":{"siteUrl":"https://www.codecave.it","analytics":{"gtagId":"G-HPEX5BHBSJ","clarityId":"mrqkdfooez"},"commentsSetup":{"repo":"CodeCavePro/www.codecave.pro-new","repoId":"R_kgDOJv3s3g","categoryId":"DIC_kwDOJv3s3s4CgqzO"}},"authorAlias":"Podryabinkina","authorId":"b52b7674-8be1-5af8-b32b-a7bb5f1b4ac9"}},"staticQueryHashes":["1512817958","2595676272","639074693"],"slicesMap":{}} \ No newline at end of file diff --git a/page-data/blog/eced1a19-65cd-58b2-a9e4-e06c8bb532fb/page-data.json b/page-data/blog/eced1a19-65cd-58b2-a9e4-e06c8bb532fb/page-data.json index 27b9fa99..3e871668 100644 --- a/page-data/blog/eced1a19-65cd-58b2-a9e4-e06c8bb532fb/page-data.json +++ b/page-data/blog/eced1a19-65cd-58b2-a9e4-e06c8bb532fb/page-data.json @@ -1 +1 @@ -{"componentChunkName":"component---src-pages-templates-post-tsx","path":"/blog/eced1a19-65cd-58b2-a9e4-e06c8bb532fb/","result":{"data":{"post":{"frontmatter":{"date":"02 Aug 2023","title":"Using both Twingate and Wireguard on a Windows PC","text":"Twingate is a fantastic alternative to traditional VPNs like WireGuard because it offers superior security with Zero Trust principles and is incredibly easy to deploy, ensuring seamless and secure access to your resources without the hassle of complex configurations. However, in order to use Twingate only you must own the infrastructure behind it (I’m talking about Twingate connectors here). What if one of your customers is using Wireguard to access the company’s cloud-based servers and databases?","keywords":["devops","zero trust","twingate","wireguard","vpn"]},"html":"

Twingate is a fantastic alternative to traditional VPNs like WireGuard because it offers superior security with Zero Trust principles and is incredibly easy to deploy, ensuring seamless and secure access to your resources without the hassle of complex configurations.

\n

However, in order to use Twingate only you must own the infrastructure behind it (I’m talking about Twingate connectors here).
\nWhat if one of your customers is using Wireguard to access the company’s cloud-based servers and databases?

\n

You can’t use both solutions at the same time: if your Twingate client is active and you try to open a Wireguard tunnel connection your Windows PC will freak out. Most likely, you are going to completely lose your Internet connection.

\n

So how can you use both? Is it even possible? Yes, it is!

\n

There is a secret feature in Wireguard, it allows Windows clients to execute commands before or right after establishing a Wireguard connection or closing one.

\n

You could even spice up your script a little bit more, by using WIREGUARD_TUNNEL_NAME variable to conditionally execute or not execute certain statements, based on which Wireguard connection is being established.

\n

The only caveat is that these commands will be executed under SYSTEM user, which is a big deal, because it might make you an easy target for malware.
\nBut we know what we are up to, don't we?

\n

You can activate this PreUp-PostDown magic by running enabling it via registry

\n
reg add HKLM\\Software\\WireGuard /v LimitedOperatorUI /t REG_DWORD /d 1 /f
\n

Then you can start adding the PreUp, PostUp, PreDown, and PostDown options to your tunnel configurations.

\n

I will add

\n
PreUp = net stop Twingate.Service\nPostDown = net start Twingate.Service
\n

to the [Interface] section in all my tunnel configs.

\n

\"Just

\n

Now, every time I activate Wireguard it stops Twingate and re-starts the service, when I close my Wireguard connection. It’s super convenient!

\n

\"Twingate

\n

\"Wireguard

\n

You are welcome! 😊 Subscribe for more valuable tech tips and insights!

","wordCount":{"words":316}},"author":{"frontmatter":{"authorAlias":"Zhmayev","author":"Yaroslav Zhmayev","authorPosition":"Solution Architect, CEO","authorPhoto":{"childImageSharp":{"gatsbyImageData":{"layout":"constrained","placeholder":{"fallback":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAACXBIWXMAAAsTAAALEwEAmpwYAAADMElEQVR42m2UuUsrURTGJ4kLLoOilSCCS2+jaCMIgqBoISgmaLAQFFwQFEQLQRQEl0IwphUbC9NoZ2Ej+he4b0lU3F/U3pnJ98453BsmeW/g496Ze87vLPfeMYz0x6dGMzs7eyArK2ufFCMlfD7fH1Lc6/Xuk4JkU5jhk/Z4SF6ekLGfHB8IAlKSwDyCvmkl1RhjW+XvVYw0oIeMQhpEsujdpu8pmALbJEvZ8Pum9jdcdIMWwgr2S3IoOgoKClBTU4OKigoUFRXB4/FA2bAcZauhKRaX2aeMODK4TM6so6MDa2trWFlZwfT0NGpra+W7C5ryIUZAZ2hShKiOyjDOzjRNzM/PY3t7Gzs7O9jY2MDY2BjKy8szgY7KMsYsgwA6O1tnx6WVlpZicHBQMuzp6UFvby9GRkbQ1NQkaxz0P1n2GzSJZALZuKSkBI2NjZiZmUEgEBDNzs6itbUVbW1tKC4ulsDqFNiKsWu4joiknpOTI33ifnHvGLi8vIytrS0sLCygq6sLfr8f+fn5qZ13lf1guOjIBA4PD6OzsxPd3d0YHR3F4uKiZFpVVSU2+oy6+2loupbe4erqakxMTGBqagpLS0upTNvb26UVbJOXl5cJdf4pOTc3V7Lksbm5WTKbnJxES0sL6urqEAwGMT4+LkDuNY8kR4Gl5F2VGd8AbSDAyspKaT6vl5WVCezg4ACHh4cIhUJyChoaGngDbRUgwoe6X+2sxTejvr4eQ0NDiEQiOD4+xvr6Oubm5rC3t4fz83PRzc0NotEo4vE4zs7OcHR0ZK+urnICfQadKVNddITDYScWi+Hx8VGMLy8vcX9/L853d3e4vb0VMfD6+hoXFxc4PT11np6e8PLyEj05OTH1bQnwBnx+flrswM4M0mIgi+e85p4T3Hp7e2Nwn5AAyIWmaJs/Pz9s/EvGjhviHllchbL5/f7+ZnDYzZLfF714KNrm19cXXl9fk2RskWwNcckmmEUlJhOJBJcdYl9W2v9Q06l3fnKKfXx8gJR8fn6WnrJ4/v7+nuQ1snlgW51ZJlCXL79z2slCKitITvukOOkPKcGB+ButDVxdXZluH/38BXl3pMODFsoqAAAAAElFTkSuQmCC"},"images":{"fallback":{"src":"/static/36d76e77f734df007af98d1cabd833d8/b18f9/author.png","srcSet":"/static/36d76e77f734df007af98d1cabd833d8/fbc98/author.png 16w,\n/static/36d76e77f734df007af98d1cabd833d8/914ee/author.png 32w,\n/static/36d76e77f734df007af98d1cabd833d8/b18f9/author.png 64w","sizes":"(min-width: 64px) 64px, 100vw"},"sources":[{"srcSet":"/static/36d76e77f734df007af98d1cabd833d8/e8e20/author.avif 16w,\n/static/36d76e77f734df007af98d1cabd833d8/b6d61/author.avif 32w,\n/static/36d76e77f734df007af98d1cabd833d8/4f4ab/author.avif 64w","type":"image/avif","sizes":"(min-width: 64px) 64px, 100vw"},{"srcSet":"/static/36d76e77f734df007af98d1cabd833d8/e789a/author.webp 16w,\n/static/36d76e77f734df007af98d1cabd833d8/ef6ff/author.webp 32w,\n/static/36d76e77f734df007af98d1cabd833d8/a9ea7/author.webp 64w","type":"image/webp","sizes":"(min-width: 64px) 64px, 100vw"}]},"width":64,"height":65}}}}}},"pageContext":{"id":"eced1a19-65cd-58b2-a9e4-e06c8bb532fb","lang":"en","markupData":{"bannerTitle":"Well unknown facts","blogByAuthorBannerTitle":"Articles by the author","blogByHashtagBannerTitle":"Articles Featuring","head":"CodeCave Insights","readPostLink":"Open article","readingTimeTitle":"read","readingTimeUnits":"min","postFooterTitle":"Congratulations! Now you can show off with your new knowledge!","postFooterText":"If you want us to uncover some other Well unknown facts, you can contact us via the socials or e-mail below. See you!","sharePostTitle":"Share this post","readMoreOnTopicTitle":"Read more on","blogSectionTitle":"new in our blog","blogSectionLinkTitle":"all posts","image":{"childImageSharp":{"gatsbyImageData":{"layout":"constrained","placeholder":{"fallback":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAACXBIWXMAAAsTAAALEwEAmpwYAAAD1UlEQVR42pWUX0zTVxTHCwT501JKaWmBrsUV5N9gIixsuqgwlDCge7Hooli0yp9ZRR+0BdryxxU7oVCQgC3Kn1IMf0S3xLlMI2Mapw+a6JMGX9yMe3EPbvoimHw99xJJnIPpw82vub33ez7nnO89gqioKLzLkkqlkMvliI6O5r+XOid4FzEmFBkZiaCgIISFhSEiIoKLMvH3EnxNFRwcDI1GA4vFgry8PHyo1UIsFkMoFEImk71BvKQgOygSibiYXl+Ge/fu4+X8PC5f+hkOhwOmfSZkrc7ixOHh4Yu0gv+iYt+AgABotYnw+/2Ym5vDo0e/49zUJI47nejr7cXQ4BDcnW7UVNcgOzsbK1aEcGrBv6lYtNDQUOytrMTjx3/i+fNnuHv3DsbHx+AbHibRKTTa7XC1tWNsbAxdbjfG6Wsxm6GKVy0IMiGGHBgYiKysNbh48SeieoHZ2fu4dvVXDA0MwNXeDk9fH/wjI7h58wbOjI7CcsSMbncXBgdOw+v1ID09HQKWIqsD66KZojx58hf++fspZn6ZRmdHB4YHB9F+vA1ej4eo2jjZMUcrJscniK6LU/d0d6PJ3rggyCyQm5uLW7duY36eavXHQ/zw/Xn0e7041d/Pa+Y96eE0vmEfJicmUF1ZBVPNN+jt6eGp7qqoQN6GjdwJnDAjI4NHYh1sqKuDo+UoRkf8sFutOEkNsFlt2GUwoKW5mUjsGDh9Ctd/u4ZOlwtlej0+ycmBtb4BO7Zvh4DVLiQkBPFxcWhqbKRauehyBewNVkydPcvJeohk+so0Dpj2o+07J2ZmpvFgdhaObx3YuH49mumeTqdb6LJEIqHuxEOjVnPL6LdswYkT3TAfPgLDjnK0kud+vHAB9XX1VAIvX9VVVbyue4xGnhGzDXMGu79om5UJCUhOToaYapqelkYCdXAec2KvcQ8tI5ytrWhpaoKupBRRBJFDIpsKNkFNIEzsLWOLqcuMNjMjE6XFJRCSH4uKiqhuLZzyYG0t1n62Fh9RJ5kjNhcU4PN167hvme3eenrszUrooMGwE1/pSpFEr0ROB9UaNfabTCjcXEj12oBDtQfxRX4+PiVnlBQXLw6KNwTZBouUTw9/xOfj6bP91ZkfIykxkYgk2Fa2FUeJ1mazwWjcDZFQxJuw5LRh6SoUCqKSQ6P6AAlqDd9TqVT4eus2lJeXIzU1FV8WFiJOGcvT/t/xxQRer/jYOEpbC6VCSeWIgTJGgZSkVVDExCCS/pe+z4BlhxmBTBYNbcJKJCcmIS0lBbFKJQ+23AxddsCyywvCMkhYEE4mXVbwFQflxPovnsZUAAAAAElFTkSuQmCC"},"images":{"fallback":{"src":"/static/b358397f973ed74732db29698c1773d1/30cdc/blog.png","srcSet":"/static/b358397f973ed74732db29698c1773d1/7458e/blog.png 75w,\n/static/b358397f973ed74732db29698c1773d1/de3a1/blog.png 150w,\n/static/b358397f973ed74732db29698c1773d1/30cdc/blog.png 300w","sizes":"(min-width: 300px) 300px, 100vw"},"sources":[{"srcSet":"/static/b358397f973ed74732db29698c1773d1/eb54c/blog.avif 75w,\n/static/b358397f973ed74732db29698c1773d1/81307/blog.avif 150w,\n/static/b358397f973ed74732db29698c1773d1/aa5b9/blog.avif 300w","type":"image/avif","sizes":"(min-width: 300px) 300px, 100vw"},{"srcSet":"/static/b358397f973ed74732db29698c1773d1/18188/blog.webp 75w,\n/static/b358397f973ed74732db29698c1773d1/c65bc/blog.webp 150w,\n/static/b358397f973ed74732db29698c1773d1/078c3/blog.webp 300w","type":"image/webp","sizes":"(min-width: 300px) 300px, 100vw"}]},"width":300,"height":300}}}},"site":{"siteUrl":"https://www.codecave.it","analytics":{"gtagId":"G-HPEX5BHBSJ","clarityId":"mrqkdfooez"},"commentsSetup":{"repo":"CodeCavePro/www.codecave.pro-new","repoId":"R_kgDOJv3s3g","categoryId":"DIC_kwDOJv3s3s4CgqzO"}},"authorAlias":"Zhmayev","authorId":"23a05467-9e8e-55ae-a8e5-1eb92b1c807d"}},"staticQueryHashes":["1512817958","2595676272","639074693"],"slicesMap":{}} \ No newline at end of file +{"componentChunkName":"component---src-pages-templates-post-tsx","path":"/blog/eced1a19-65cd-58b2-a9e4-e06c8bb532fb/","result":{"data":{"post":{"frontmatter":{"date":"02 Aug 2023","title":"Using both Twingate and Wireguard on a Windows PC","text":"Twingate is a fantastic alternative to traditional VPNs like WireGuard because it offers superior security with Zero Trust principles and is incredibly easy to deploy, ensuring seamless and secure access to your resources without the hassle of complex configurations. However, in order to use Twingate only you must own the infrastructure behind it (I’m talking about Twingate connectors here). What if one of your customers is using Wireguard to access the company’s cloud-based servers and databases?","cover":{"childImageSharp":{"gatsbyImageData":{"layout":"constrained","placeholder":{"fallback":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAACXBIWXMAAAsTAAALEwEAmpwYAAAFcUlEQVR42i2U21OTdxrHX96czyGrgQQCAllIQsiBoAQFCWCFJJwCNpgEkYPKobhVQAELWlBbQSm2allZ7FJX12112orbjtt2p+26nXGc2W3dHmY63dm926v9Hz77XuzFM7+b33y+z/N9DoJVdGFQ+ygwRMizttJrP0+j6xy+4BxNe9ZZq/s3m3v+Q7R2E79/Hk/ZCZyOw9QbBilXxYjIOtgu96GSF6LKykGoFhvI11Tj1O0jbEpxIH+OLucFKvynqK1eIVP3kIN7t9gdXiVQMYvLOUYk7wStll+xwxjFqdyLUVmOTlGCVrQj7BM76VQMUmnsJm04Ra/lVU7Yr9NdtEyLZ4VD/ncY8f+ejvJrxItfpzdvidncDV6wTFKhS1Kp7KBC0UyRLIxJ3IEwITvLpOEyR43nuVr0AZ/sec6n+37kcdMPfNT6D7bav+fL9p/5/MBPfBj9ltuuJzzyfsPHnue8WbjFpdx7LJk3WDTdIK0eR1iz36dfMcUp8zXee+EZtyNfcbPuU94/8Hd+m3jGg57n/GnwJ77o/Rfvx77hvaa/8Unrd9wNP2Wr5TtuVz5h0XqXs9tucVQzizBkl0p0XObt+sfMlb7LafMaS84tVg9/wVz0HquhzySRpyw3/JFb7X/lXuszFv0PeMlxk/mCO0xLb1p/jjbdy+zVZhBajROMld8gUXqGKlU75UILp4M3uT/yIzeGn3Ch4xHN9ll63BcZ8F5hPfU5m4mvmXXf4XjRGkPGy2RMZ6lVZqjR9yPEtOPELFPU6PrxqlsJm5MsDXzAet/X9JRcYbL5Lt3uBZzGOAFdirTtNVabP2POf4vpwBoz2e/Qs32BkLqXnaq0lKFmnM6cUxzOP89AwSqnq//AdN27xAunaCwa42rXVwyGljELLkpUEaqzM5yrfEDCOk+l6SAz/nXqNAPUGYcJqLoRRi2v0S/5OBO6xUjhNWKSQIVUtlsb41Jii83UU5KuRQK2JDtNCRI50wzkrVCVnWS7OsDppg3c0jyGLSkOWS4iBLVRMnlTzJStM1ywwv6CY+wuSJH0LTJTc4cJSWis/tf073qDdOlFatQp9pv7mA3+hpCpm/7cJXYaDhLQJ9il7UFwyINYRS+/EMvw6hupMnfhMbfhNXVQYxuiofg4I5ErTO9fZ7xxg0z1srSeF+jLWSCVv0SL/jjp7AukzdJ2aZoRSnX15Cg9KEULaiEXs/hLDEIhdl2A9ooFFlIf8u29//J46Z+sdP2ZhcBDqasSSHuSiHqUsCaF1xCjQttC0JhAsCrKcWrqKVFHyJY50UtQi8xBoKCNZOAsl158yNXkx0xWb9JhWiQqTtOgGqFeNcR+9Uu0qiawZpUhinpKlLsQGvOPsNuWwWUNSyaXUZt3gHjFMIeqFiTITV5tlIa3cpOhguvEVK/gE7txy+NElCMcUa7wiv02R3zzuE31UjLFCPHgOC+GpjgWWqRh21GabScY9q4yGnqL8arrHLYvE1WexCd04pAOgE0ewiJ3Sacql3zRR1L7Muvuj/gy9QNvRR8g+IR26XMHLiFOvXWUtOciiZIzNBhH8UuQInE3WrkNrdKGXumQPC6WYFbkWRaUEjRb4cEra2NMv8Cj6F8QPLJm3GKcsGGIKkuGYsU+igXJT6EIQcj6f5iRCztQCU40WW4pw52S335MMje58gA2VQ2FmiaqsroQXBIsX6xFm7UDneAgVwxiVhdh3+alyddHOjLHWNt1Jnt+x7HWt4mXzhJSDkoxQECexC/vYpc8TUQxQrvqDIJaurLKrGxMQh4OSanFPcFUfJPF3vucyWww3r1MX3yezsaTNIaOELQfpFgWo0SKMoVklSKBR95NuTyBU9HM/wBTaOrykhdwIgAAAABJRU5ErkJggg=="},"images":{"fallback":{"src":"/static/582347aa42d4d97edab79d0a2bc9b1e3/c7240/intro.png","srcSet":"/static/582347aa42d4d97edab79d0a2bc9b1e3/de3a1/intro.png 150w,\n/static/582347aa42d4d97edab79d0a2bc9b1e3/30cdc/intro.png 300w,\n/static/582347aa42d4d97edab79d0a2bc9b1e3/c7240/intro.png 600w","sizes":"(min-width: 600px) 600px, 100vw"},"sources":[{"srcSet":"/static/582347aa42d4d97edab79d0a2bc9b1e3/81307/intro.avif 150w,\n/static/582347aa42d4d97edab79d0a2bc9b1e3/aa5b9/intro.avif 300w,\n/static/582347aa42d4d97edab79d0a2bc9b1e3/0c8d0/intro.avif 600w","type":"image/avif","sizes":"(min-width: 600px) 600px, 100vw"},{"srcSet":"/static/582347aa42d4d97edab79d0a2bc9b1e3/c65bc/intro.webp 150w,\n/static/582347aa42d4d97edab79d0a2bc9b1e3/078c3/intro.webp 300w,\n/static/582347aa42d4d97edab79d0a2bc9b1e3/6d09e/intro.webp 600w","type":"image/webp","sizes":"(min-width: 600px) 600px, 100vw"}]},"width":600,"height":600}}},"keywords":["devops","zero trust","twingate","wireguard","vpn"]},"html":"

Twingate is a fantastic alternative to traditional VPNs like WireGuard because it offers superior security with Zero Trust principles and is incredibly easy to deploy, ensuring seamless and secure access to your resources without the hassle of complex configurations.

\n

However, in order to use Twingate only you must own the infrastructure behind it (I’m talking about Twingate connectors here).
\nWhat if one of your customers is using Wireguard to access the company’s cloud-based servers and databases?

\n

You can’t use both solutions at the same time: if your Twingate client is active and you try to open a Wireguard tunnel connection your Windows PC will freak out. Most likely, you are going to completely lose your Internet connection.

\n

So how can you use both? Is it even possible? Yes, it is!

\n

There is a secret feature in Wireguard, it allows Windows clients to execute commands before or right after establishing a Wireguard connection or closing one.

\n

You could even spice up your script a little bit more, by using WIREGUARD_TUNNEL_NAME variable to conditionally execute or not execute certain statements, based on which Wireguard connection is being established.

\n

The only caveat is that these commands will be executed under SYSTEM user, which is a big deal, because it might make you an easy target for malware.
\nBut we know what we are up to, don't we?

\n

You can activate this PreUp-PostDown magic by running enabling it via registry

\n
reg add HKLM\\Software\\WireGuard /v LimitedOperatorUI /t REG_DWORD /d 1 /f
\n

Then you can start adding the PreUp, PostUp, PreDown, and PostDown options to your tunnel configurations.

\n

I will add

\n
PreUp = net stop Twingate.Service\nPostDown = net start Twingate.Service
\n

to the [Interface] section in all my tunnel configs.

\n

\"Just

\n

Now, every time I activate Wireguard it stops Twingate and re-starts the service, when I close my Wireguard connection. It’s super convenient!

\n

\"Twingate

\n

\"Wireguard

\n

You are welcome! 😊 Subscribe for more valuable tech tips and insights!

","wordCount":{"words":316}},"author":{"frontmatter":{"authorAlias":"Zhmayev","author":"Yaroslav Zhmayev","authorPosition":"Solution Architect, CEO","authorPhoto":{"childImageSharp":{"gatsbyImageData":{"layout":"constrained","placeholder":{"fallback":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAACXBIWXMAAAsTAAALEwEAmpwYAAADMElEQVR42m2UuUsrURTGJ4kLLoOilSCCS2+jaCMIgqBoISgmaLAQFFwQFEQLQRQEl0IwphUbC9NoZ2Ej+he4b0lU3F/U3pnJ98453BsmeW/g496Ze87vLPfeMYz0x6dGMzs7eyArK2ufFCMlfD7fH1Lc6/Xuk4JkU5jhk/Z4SF6ekLGfHB8IAlKSwDyCvmkl1RhjW+XvVYw0oIeMQhpEsujdpu8pmALbJEvZ8Pum9jdcdIMWwgr2S3IoOgoKClBTU4OKigoUFRXB4/FA2bAcZauhKRaX2aeMODK4TM6so6MDa2trWFlZwfT0NGpra+W7C5ryIUZAZ2hShKiOyjDOzjRNzM/PY3t7Gzs7O9jY2MDY2BjKy8szgY7KMsYsgwA6O1tnx6WVlpZicHBQMuzp6UFvby9GRkbQ1NQkaxz0P1n2GzSJZALZuKSkBI2NjZiZmUEgEBDNzs6itbUVbW1tKC4ulsDqFNiKsWu4joiknpOTI33ifnHvGLi8vIytrS0sLCygq6sLfr8f+fn5qZ13lf1guOjIBA4PD6OzsxPd3d0YHR3F4uKiZFpVVSU2+oy6+2loupbe4erqakxMTGBqagpLS0upTNvb26UVbJOXl5cJdf4pOTc3V7Lksbm5WTKbnJxES0sL6urqEAwGMT4+LkDuNY8kR4Gl5F2VGd8AbSDAyspKaT6vl5WVCezg4ACHh4cIhUJyChoaGngDbRUgwoe6X+2sxTejvr4eQ0NDiEQiOD4+xvr6Oubm5rC3t4fz83PRzc0NotEo4vE4zs7OcHR0ZK+urnICfQadKVNddITDYScWi+Hx8VGMLy8vcX9/L853d3e4vb0VMfD6+hoXFxc4PT11np6e8PLyEj05OTH1bQnwBnx+flrswM4M0mIgi+e85p4T3Hp7e2Nwn5AAyIWmaJs/Pz9s/EvGjhviHllchbL5/f7+ZnDYzZLfF714KNrm19cXXl9fk2RskWwNcckmmEUlJhOJBJcdYl9W2v9Q06l3fnKKfXx8gJR8fn6WnrJ4/v7+nuQ1snlgW51ZJlCXL79z2slCKitITvukOOkPKcGB+ButDVxdXZluH/38BXl3pMODFsoqAAAAAElFTkSuQmCC"},"images":{"fallback":{"src":"/static/36d76e77f734df007af98d1cabd833d8/b18f9/author.png","srcSet":"/static/36d76e77f734df007af98d1cabd833d8/fbc98/author.png 16w,\n/static/36d76e77f734df007af98d1cabd833d8/914ee/author.png 32w,\n/static/36d76e77f734df007af98d1cabd833d8/b18f9/author.png 64w","sizes":"(min-width: 64px) 64px, 100vw"},"sources":[{"srcSet":"/static/36d76e77f734df007af98d1cabd833d8/e8e20/author.avif 16w,\n/static/36d76e77f734df007af98d1cabd833d8/b6d61/author.avif 32w,\n/static/36d76e77f734df007af98d1cabd833d8/4f4ab/author.avif 64w","type":"image/avif","sizes":"(min-width: 64px) 64px, 100vw"},{"srcSet":"/static/36d76e77f734df007af98d1cabd833d8/e789a/author.webp 16w,\n/static/36d76e77f734df007af98d1cabd833d8/ef6ff/author.webp 32w,\n/static/36d76e77f734df007af98d1cabd833d8/a9ea7/author.webp 64w","type":"image/webp","sizes":"(min-width: 64px) 64px, 100vw"}]},"width":64,"height":65}}}}}},"pageContext":{"id":"eced1a19-65cd-58b2-a9e4-e06c8bb532fb","lang":"en","markupData":{"bannerTitle":"Well unknown facts","blogByAuthorBannerTitle":"Articles by the author","blogByHashtagBannerTitle":"Articles Featuring","head":"CodeCave Insights","readPostLink":"Open article","readingTimeTitle":"read","readingTimeUnits":"min","postFooterTitle":"Congratulations! Now you can show off with your new knowledge!","postFooterText":"If you want us to uncover some other Well unknown facts, you can contact us via the socials or e-mail below. See you!","sharePostTitle":"Share this post","readMoreOnTopicTitle":"Read more on","blogSectionTitle":"new in our blog","blogSectionLinkTitle":"all posts","image":{"childImageSharp":{"gatsbyImageData":{"layout":"constrained","placeholder":{"fallback":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAACXBIWXMAAAsTAAALEwEAmpwYAAAD1UlEQVR42pWUX0zTVxTHCwT501JKaWmBrsUV5N9gIixsuqgwlDCge7Hooli0yp9ZRR+0BdryxxU7oVCQgC3Kn1IMf0S3xLlMI2Mapw+a6JMGX9yMe3EPbvoimHw99xJJnIPpw82vub33ez7nnO89gqioKLzLkkqlkMvliI6O5r+XOid4FzEmFBkZiaCgIISFhSEiIoKLMvH3EnxNFRwcDI1GA4vFgry8PHyo1UIsFkMoFEImk71BvKQgOygSibiYXl+Ge/fu4+X8PC5f+hkOhwOmfSZkrc7ixOHh4Yu0gv+iYt+AgABotYnw+/2Ym5vDo0e/49zUJI47nejr7cXQ4BDcnW7UVNcgOzsbK1aEcGrBv6lYtNDQUOytrMTjx3/i+fNnuHv3DsbHx+AbHibRKTTa7XC1tWNsbAxdbjfG6Wsxm6GKVy0IMiGGHBgYiKysNbh48SeieoHZ2fu4dvVXDA0MwNXeDk9fH/wjI7h58wbOjI7CcsSMbncXBgdOw+v1ID09HQKWIqsD66KZojx58hf++fspZn6ZRmdHB4YHB9F+vA1ej4eo2jjZMUcrJscniK6LU/d0d6PJ3rggyCyQm5uLW7duY36eavXHQ/zw/Xn0e7041d/Pa+Y96eE0vmEfJicmUF1ZBVPNN+jt6eGp7qqoQN6GjdwJnDAjI4NHYh1sqKuDo+UoRkf8sFutOEkNsFlt2GUwoKW5mUjsGDh9Ctd/u4ZOlwtlej0+ycmBtb4BO7Zvh4DVLiQkBPFxcWhqbKRauehyBewNVkydPcvJeohk+so0Dpj2o+07J2ZmpvFgdhaObx3YuH49mumeTqdb6LJEIqHuxEOjVnPL6LdswYkT3TAfPgLDjnK0kud+vHAB9XX1VAIvX9VVVbyue4xGnhGzDXMGu79om5UJCUhOToaYapqelkYCdXAec2KvcQ8tI5ytrWhpaoKupBRRBJFDIpsKNkFNIEzsLWOLqcuMNjMjE6XFJRCSH4uKiqhuLZzyYG0t1n62Fh9RJ5kjNhcU4PN167hvme3eenrszUrooMGwE1/pSpFEr0ROB9UaNfabTCjcXEj12oBDtQfxRX4+PiVnlBQXLw6KNwTZBouUTw9/xOfj6bP91ZkfIykxkYgk2Fa2FUeJ1mazwWjcDZFQxJuw5LRh6SoUCqKSQ6P6AAlqDd9TqVT4eus2lJeXIzU1FV8WFiJOGcvT/t/xxQRer/jYOEpbC6VCSeWIgTJGgZSkVVDExCCS/pe+z4BlhxmBTBYNbcJKJCcmIS0lBbFKJQ+23AxddsCyywvCMkhYEE4mXVbwFQflxPovnsZUAAAAAElFTkSuQmCC"},"images":{"fallback":{"src":"/static/b358397f973ed74732db29698c1773d1/30cdc/blog.png","srcSet":"/static/b358397f973ed74732db29698c1773d1/7458e/blog.png 75w,\n/static/b358397f973ed74732db29698c1773d1/de3a1/blog.png 150w,\n/static/b358397f973ed74732db29698c1773d1/30cdc/blog.png 300w","sizes":"(min-width: 300px) 300px, 100vw"},"sources":[{"srcSet":"/static/b358397f973ed74732db29698c1773d1/eb54c/blog.avif 75w,\n/static/b358397f973ed74732db29698c1773d1/81307/blog.avif 150w,\n/static/b358397f973ed74732db29698c1773d1/aa5b9/blog.avif 300w","type":"image/avif","sizes":"(min-width: 300px) 300px, 100vw"},{"srcSet":"/static/b358397f973ed74732db29698c1773d1/18188/blog.webp 75w,\n/static/b358397f973ed74732db29698c1773d1/c65bc/blog.webp 150w,\n/static/b358397f973ed74732db29698c1773d1/078c3/blog.webp 300w","type":"image/webp","sizes":"(min-width: 300px) 300px, 100vw"}]},"width":300,"height":300}}}},"site":{"siteUrl":"https://www.codecave.it","analytics":{"gtagId":"G-HPEX5BHBSJ","clarityId":"mrqkdfooez"},"commentsSetup":{"repo":"CodeCavePro/www.codecave.pro-new","repoId":"R_kgDOJv3s3g","categoryId":"DIC_kwDOJv3s3s4CgqzO"}},"authorAlias":"Zhmayev","authorId":"23a05467-9e8e-55ae-a8e5-1eb92b1c807d"}},"staticQueryHashes":["1512817958","2595676272","639074693"],"slicesMap":{}} \ No newline at end of file diff --git a/posts.xml b/posts.xml index 486b224f..ca505c7a 100644 --- a/posts.xml +++ b/posts.xml @@ -1,2 +1,2 @@ -<![CDATA[CodeCave]]>https://www.codecave.itRSS for NodeWed, 08 Jan 2025 09:14:59 GMT<![CDATA[Proxmox VM Templates and Cloud-Init]]>https://www.codecave.it/blog/c924c93c-fac0-517e-92e7-c5b5aaa083c2c924c93c-fac0-517e-92e7-c5b5aaa083c2Fri, 21 Jul 2023 00:00:00 GMT<![CDATA[Self-Hosted build Agent for Azure Pipelines]]><![CDATA[CodeCave]]>https://www.codecave.itRSS for NodeWed, 08 Jan 2025 14:33:16 GMT<![CDATA[Proxmox VM Templates and Cloud-Init]]>https://www.codecave.it/blog/c924c93c-fac0-517e-92e7-c5b5aaa083c2c924c93c-fac0-517e-92e7-c5b5aaa083c2Fri, 21 Jul 2023 00:00:00 GMT<![CDATA[Self-Hosted build Agent for Azure Pipelines]]>https://www.codecave.it/blog/e173a2ae-ebb5-5219-9479-035dde5fe8c8e173a2ae-ebb5-5219-9479-035dde5fe8c8Fri, 15 Mar 2024 00:00:00 GMT<![CDATA[Streamlining Changelog Creation with Azure DevOps and Confluence]]>https://www.codecave.it/blog/10582553-73a2-569f-8bdd-980e1f77c10a10582553-73a2-569f-8bdd-980e1f77c10aSat, 02 Dec 2023 00:00:00 GMT<![CDATA[Using both Twingate and Wireguard on a Windows PC]]>https://www.codecave.it/blog/eced1a19-65cd-58b2-a9e4-e06c8bb532fbeced1a19-65cd-58b2-a9e4-e06c8bb532fbWed, 02 Aug 2023 00:00:00 GMT \ No newline at end of file diff --git a/privacy-policy/index.html b/privacy-policy/index.html index 135c56e3..ab72da05 100644 --- a/privacy-policy/index.html +++ b/privacy-policy/index.html @@ -180,6 +180,6 @@

Legal information

- \ No newline at end of file + \ No newline at end of file diff --git a/projects/08716ab8-fc5f-5f90-9fc0-a8218ec51923/index.html b/projects/08716ab8-fc5f-5f90-9fc0-a8218ec51923/index.html index 0974fc7a..7ba44710 100644 --- a/projects/08716ab8-fc5f-5f90-9fc0-a8218ec51923/index.html +++ b/projects/08716ab8-fc5f-5f90-9fc0-a8218ec51923/index.html @@ -6,6 +6,6 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/projects/4010b091-889b-5be1-ab5a-bde195aa7729/index.html b/projects/4010b091-889b-5be1-ab5a-bde195aa7729/index.html index f72b27b2..a94c6728 100644 --- a/projects/4010b091-889b-5be1-ab5a-bde195aa7729/index.html +++ b/projects/4010b091-889b-5be1-ab5a-bde195aa7729/index.html @@ -6,6 +6,6 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/projects/4057e0b3-692b-5512-a1fc-cb93bd81fe0e/index.html b/projects/4057e0b3-692b-5512-a1fc-cb93bd81fe0e/index.html index 3625186c..0db30cfa 100644 --- a/projects/4057e0b3-692b-5512-a1fc-cb93bd81fe0e/index.html +++ b/projects/4057e0b3-692b-5512-a1fc-cb93bd81fe0e/index.html @@ -7,6 +7,6 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/projects/45987eea-191f-531c-b854-25e3d60decff/index.html b/projects/45987eea-191f-531c-b854-25e3d60decff/index.html index 260efaa0..0202e8df 100644 --- a/projects/45987eea-191f-531c-b854-25e3d60decff/index.html +++ b/projects/45987eea-191f-531c-b854-25e3d60decff/index.html @@ -6,6 +6,6 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/projects/9f63d17d-6164-509e-b2c7-4c655ab9ad7a/index.html b/projects/9f63d17d-6164-509e-b2c7-4c655ab9ad7a/index.html index 84ddad62..d569e352 100644 --- a/projects/9f63d17d-6164-509e-b2c7-4c655ab9ad7a/index.html +++ b/projects/9f63d17d-6164-509e-b2c7-4c655ab9ad7a/index.html @@ -8,6 +8,6 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/projects/f17de1e3-0a73-5f92-bf66-1e12d5fdc0fb/index.html b/projects/f17de1e3-0a73-5f92-bf66-1e12d5fdc0fb/index.html index b7d8f953..81a1f75a 100644 --- a/projects/f17de1e3-0a73-5f92-bf66-1e12d5fdc0fb/index.html +++ b/projects/f17de1e3-0a73-5f92-bf66-1e12d5fdc0fb/index.html @@ -13,6 +13,6 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/projects/ff9598a3-3fad-5a4e-a8a8-a8858b3a27e7/index.html b/projects/ff9598a3-3fad-5a4e-a8a8-a8858b3a27e7/index.html index 73474388..9cd16420 100644 --- a/projects/ff9598a3-3fad-5a4e-a8a8-a8858b3a27e7/index.html +++ b/projects/ff9598a3-3fad-5a4e-a8a8-a8858b3a27e7/index.html @@ -6,6 +6,6 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/projects/index.html b/projects/index.html index 3e283232..af33f48b 100644 --- a/projects/index.html +++ b/projects/index.html @@ -6,6 +6,6 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/projects/page/1/index.html b/projects/page/1/index.html index 2f7e7462..03e6fd1f 100644 --- a/projects/page/1/index.html +++ b/projects/page/1/index.html @@ -6,6 +6,6 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/services/index.html b/services/index.html index 9e06bcfc..8fe53aeb 100644 --- a/services/index.html +++ b/services/index.html @@ -13,6 +13,6 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/webpack-runtime-3ace51124175e41a6bdb.js b/webpack-runtime-58c7cdd0abc723b6d241.js similarity index 97% rename from webpack-runtime-3ace51124175e41a6bdb.js rename to webpack-runtime-58c7cdd0abc723b6d241.js index 445b97e1..a3b682ac 100644 --- a/webpack-runtime-3ace51124175e41a6bdb.js +++ b/webpack-runtime-58c7cdd0abc723b6d241.js @@ -1,2 +1,2 @@ -!function(){"use strict";var e,t,n,r,o,c={},a={};function f(e){var t=a[e];if(void 0!==t)return t.exports;var n=a[e]={id:e,loaded:!1,exports:{}};return c[e](n,n.exports,f),n.loaded=!0,n.exports}f.m=c,e=[],f.O=function(t,n,r,o){if(!n){var c=1/0;for(s=0;s=o)&&Object.keys(f.O).every((function(e){return f.O[e](n[i])}))?n.splice(i--,1):(a=!1,o0&&e[s-1][2]>o;s--)e[s]=e[s-1];e[s]=[n,r,o]},f.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return f.d(t,{a:t}),t},n=Object.getPrototypeOf?function(e){return Object.getPrototypeOf(e)}:function(e){return e.__proto__},f.t=function(e,r){if(1&r&&(e=this(e)),8&r)return e;if("object"==typeof e&&e){if(4&r&&e.__esModule)return e;if(16&r&&"function"==typeof e.then)return e}var o=Object.create(null);f.r(o);var c={};t=t||[null,n({}),n([]),n(n)];for(var a=2&r&&e;"object"==typeof a&&!~t.indexOf(a);a=n(a))Object.getOwnPropertyNames(a).forEach((function(t){c[t]=function(){return e[t]}}));return c.default=function(){return e},f.d(o,c),o},f.d=function(e,t){for(var n in t)f.o(t,n)&&!f.o(e,n)&&Object.defineProperty(e,n,{enumerable:!0,get:t[n]})},f.f={},f.e=function(e){return Promise.all(Object.keys(f.f).reduce((function(t,n){return f.f[n](e,t),t}),[]))},f.u=function(e){return({147:"component---src-pages-templates-project-tsx",149:"component---src-pages-templates-policies-tsx",354:"component---src-pages-templates-post-tsx",403:"c294adedbbc0a5c4b071b27a5ffb97a116928d98",417:"component---src-pages-templates-services-tsx",514:"component---src-pages-templates-404-tsx",548:"component---src-pages-templates-workflow-tsx",577:"71598b7b9331211c5dc2cdd9e7a07dc39cf581bb",602:"dbbdfb320c5007a40fa91453221d77dae72f3b83",650:"component---src-pages-templates-projects-tsx",748:"component---src-pages-templates-blog-by-author-tsx",832:"component---src-pages-templates-index-tsx",899:"component---src-pages-templates-blog-by-hashtag-tsx",926:"component---src-pages-templates-blog-tsx"}[e]||e)+"-"+{147:"0f155fa91f86221dfd2e",149:"359925d45492160d5e8b",354:"4f0b1db8f77b105dfb25",355:"8ec9d1cf4562de9fd523",403:"999e28291726a2c54e70",417:"e4d2d12096012ba30740",475:"26f23024f1c06ad5b4f6",514:"1ec7dcfded6e73efef91",548:"10c8768c64c0db9f80c2",577:"3558ad62e70f9f6bfcfc",602:"00be99e431fb904367c1",650:"05e1354e259380d8d7ed",731:"fc2222e8bcbd3a323b37",748:"fb7314d489c2682e7da0",832:"c79944ee44040195a3eb",843:"82fd7f798c0dd9a6f67b",899:"2076682d0e3e44045f00",926:"ae37a37910d4ce46256c"}[e]+".js"},f.miniCssF=function(e){return"styles.78a6e0759546d778358c.css"},f.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(e){if("object"==typeof window)return window}}(),f.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},r={},o="code-cave:",f.l=function(e,t,n,c){if(r[e])r[e].push(t);else{var a,i;if(void 0!==n)for(var u=document.getElementsByTagName("script"),s=0;s=o)&&Object.keys(f.O).every((function(e){return f.O[e](n[i])}))?n.splice(i--,1):(a=!1,o0&&e[s-1][2]>o;s--)e[s]=e[s-1];e[s]=[n,r,o]},f.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return f.d(t,{a:t}),t},n=Object.getPrototypeOf?function(e){return Object.getPrototypeOf(e)}:function(e){return e.__proto__},f.t=function(e,r){if(1&r&&(e=this(e)),8&r)return e;if("object"==typeof e&&e){if(4&r&&e.__esModule)return e;if(16&r&&"function"==typeof e.then)return e}var o=Object.create(null);f.r(o);var c={};t=t||[null,n({}),n([]),n(n)];for(var a=2&r&&e;"object"==typeof a&&!~t.indexOf(a);a=n(a))Object.getOwnPropertyNames(a).forEach((function(t){c[t]=function(){return e[t]}}));return c.default=function(){return e},f.d(o,c),o},f.d=function(e,t){for(var n in t)f.o(t,n)&&!f.o(e,n)&&Object.defineProperty(e,n,{enumerable:!0,get:t[n]})},f.f={},f.e=function(e){return Promise.all(Object.keys(f.f).reduce((function(t,n){return f.f[n](e,t),t}),[]))},f.u=function(e){return({147:"component---src-pages-templates-project-tsx",149:"component---src-pages-templates-policies-tsx",354:"component---src-pages-templates-post-tsx",403:"c294adedbbc0a5c4b071b27a5ffb97a116928d98",417:"component---src-pages-templates-services-tsx",514:"component---src-pages-templates-404-tsx",548:"component---src-pages-templates-workflow-tsx",577:"71598b7b9331211c5dc2cdd9e7a07dc39cf581bb",602:"dbbdfb320c5007a40fa91453221d77dae72f3b83",650:"component---src-pages-templates-projects-tsx",748:"component---src-pages-templates-blog-by-author-tsx",832:"component---src-pages-templates-index-tsx",899:"component---src-pages-templates-blog-by-hashtag-tsx",926:"component---src-pages-templates-blog-tsx"}[e]||e)+"-"+{147:"0f155fa91f86221dfd2e",149:"359925d45492160d5e8b",354:"f41bd2e7c5e393acf3b9",355:"8ec9d1cf4562de9fd523",403:"999e28291726a2c54e70",417:"e4d2d12096012ba30740",475:"26f23024f1c06ad5b4f6",514:"1ec7dcfded6e73efef91",548:"10c8768c64c0db9f80c2",577:"3558ad62e70f9f6bfcfc",602:"00be99e431fb904367c1",650:"05e1354e259380d8d7ed",731:"fc2222e8bcbd3a323b37",748:"fb7314d489c2682e7da0",832:"c79944ee44040195a3eb",843:"82fd7f798c0dd9a6f67b",899:"2076682d0e3e44045f00",926:"ae37a37910d4ce46256c"}[e]+".js"},f.miniCssF=function(e){return"styles.78a6e0759546d778358c.css"},f.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(e){if("object"==typeof window)return window}}(),f.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},r={},o="code-cave:",f.l=function(e,t,n,c){if(r[e])r[e].push(t);else{var a,i;if(void 0!==n)for(var u=document.getElementsByTagName("script"),s=0;s 0 && deferred[i - 1][2] > priority; i--) deferred[i] = deferred[i - 1];\n\t\tdeferred[i] = [chunkIds, fn, priority];\n\t\treturn;\n\t}\n\tvar notFulfilled = Infinity;\n\tfor (var i = 0; i < deferred.length; i++) {\n\t\tvar chunkIds = deferred[i][0];\n\t\tvar fn = deferred[i][1];\n\t\tvar priority = deferred[i][2];\n\t\tvar fulfilled = true;\n\t\tfor (var j = 0; j < chunkIds.length; j++) {\n\t\t\tif ((priority & 1 === 0 || notFulfilled >= priority) && Object.keys(__webpack_require__.O).every(function(key) { return __webpack_require__.O[key](chunkIds[j]); })) {\n\t\t\t\tchunkIds.splice(j--, 1);\n\t\t\t} else {\n\t\t\t\tfulfilled = false;\n\t\t\t\tif(priority < notFulfilled) notFulfilled = priority;\n\t\t\t}\n\t\t}\n\t\tif(fulfilled) {\n\t\t\tdeferred.splice(i--, 1)\n\t\t\tvar r = fn();\n\t\t\tif (r !== undefined) result = r;\n\t\t}\n\t}\n\treturn result;\n};","var getProto = Object.getPrototypeOf ? function(obj) { return Object.getPrototypeOf(obj); } : function(obj) { return obj.__proto__; };\nvar leafPrototypes;\n// create a fake namespace object\n// mode & 1: value is a module id, require it\n// mode & 2: merge all properties of value into the ns\n// mode & 4: return value when already ns object\n// mode & 16: return value when it's Promise-like\n// mode & 8|1: behave like require\n__webpack_require__.t = function(value, mode) {\n\tif(mode & 1) value = this(value);\n\tif(mode & 8) return value;\n\tif(typeof value === 'object' && value) {\n\t\tif((mode & 4) && value.__esModule) return value;\n\t\tif((mode & 16) && typeof value.then === 'function') return value;\n\t}\n\tvar ns = Object.create(null);\n\t__webpack_require__.r(ns);\n\tvar def = {};\n\tleafPrototypes = leafPrototypes || [null, getProto({}), getProto([]), getProto(getProto)];\n\tfor(var current = mode & 2 && value; typeof current == 'object' && !~leafPrototypes.indexOf(current); current = getProto(current)) {\n\t\tObject.getOwnPropertyNames(current).forEach(function(key) { def[key] = function() { return value[key]; }; });\n\t}\n\tdef['default'] = function() { return value; };\n\t__webpack_require__.d(ns, def);\n\treturn ns;\n};","var inProgress = {};\nvar dataWebpackPrefix = \"code-cave:\";\n// loadScript function to load a script via script tag\n__webpack_require__.l = function(url, done, key, chunkId) {\n\tif(inProgress[url]) { inProgress[url].push(done); return; }\n\tvar script, needAttach;\n\tif(key !== undefined) {\n\t\tvar scripts = document.getElementsByTagName(\"script\");\n\t\tfor(var i = 0; i < scripts.length; i++) {\n\t\t\tvar s = scripts[i];\n\t\t\tif(s.getAttribute(\"src\") == url || s.getAttribute(\"data-webpack\") == dataWebpackPrefix + key) { script = s; break; }\n\t\t}\n\t}\n\tif(!script) {\n\t\tneedAttach = true;\n\t\tscript = document.createElement('script');\n\n\t\tscript.charset = 'utf-8';\n\t\tscript.timeout = 120;\n\t\tif (__webpack_require__.nc) {\n\t\t\tscript.setAttribute(\"nonce\", __webpack_require__.nc);\n\t\t}\n\t\tscript.setAttribute(\"data-webpack\", dataWebpackPrefix + key);\n\n\t\tscript.src = url;\n\t}\n\tinProgress[url] = [done];\n\tvar onScriptComplete = function(prev, event) {\n\t\t// avoid mem leaks in IE.\n\t\tscript.onerror = script.onload = null;\n\t\tclearTimeout(timeout);\n\t\tvar doneFns = inProgress[url];\n\t\tdelete inProgress[url];\n\t\tscript.parentNode && script.parentNode.removeChild(script);\n\t\tdoneFns && doneFns.forEach(function(fn) { return fn(event); });\n\t\tif(prev) return prev(event);\n\t}\n\tvar timeout = setTimeout(onScriptComplete.bind(null, undefined, { type: 'timeout', target: script }), 120000);\n\tscript.onerror = onScriptComplete.bind(null, script.onerror);\n\tscript.onload = onScriptComplete.bind(null, script.onload);\n\tneedAttach && document.head.appendChild(script);\n};","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\tid: moduleId,\n\t\tloaded: false,\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId](module, module.exports, __webpack_require__);\n\n\t// Flag the module as loaded\n\tmodule.loaded = true;\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n// expose the modules object (__webpack_modules__)\n__webpack_require__.m = __webpack_modules__;\n\n","// getDefaultExport function for compatibility with non-harmony modules\n__webpack_require__.n = function(module) {\n\tvar getter = module && module.__esModule ?\n\t\tfunction() { return module['default']; } :\n\t\tfunction() { return module; };\n\t__webpack_require__.d(getter, { a: getter });\n\treturn getter;\n};","// define getter functions for harmony exports\n__webpack_require__.d = function(exports, definition) {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.f = {};\n// This file contains only the entry chunk.\n// The chunk loading function for additional chunks\n__webpack_require__.e = function(chunkId) {\n\treturn Promise.all(Object.keys(__webpack_require__.f).reduce(function(promises, key) {\n\t\t__webpack_require__.f[key](chunkId, promises);\n\t\treturn promises;\n\t}, []));\n};","// This function allow to reference async chunks\n__webpack_require__.u = function(chunkId) {\n\t// return url for filenames based on template\n\treturn \"\" + ({\"147\":\"component---src-pages-templates-project-tsx\",\"149\":\"component---src-pages-templates-policies-tsx\",\"354\":\"component---src-pages-templates-post-tsx\",\"403\":\"c294adedbbc0a5c4b071b27a5ffb97a116928d98\",\"417\":\"component---src-pages-templates-services-tsx\",\"514\":\"component---src-pages-templates-404-tsx\",\"548\":\"component---src-pages-templates-workflow-tsx\",\"577\":\"71598b7b9331211c5dc2cdd9e7a07dc39cf581bb\",\"602\":\"dbbdfb320c5007a40fa91453221d77dae72f3b83\",\"650\":\"component---src-pages-templates-projects-tsx\",\"748\":\"component---src-pages-templates-blog-by-author-tsx\",\"832\":\"component---src-pages-templates-index-tsx\",\"899\":\"component---src-pages-templates-blog-by-hashtag-tsx\",\"926\":\"component---src-pages-templates-blog-tsx\"}[chunkId] || chunkId) + \"-\" + {\"147\":\"0f155fa91f86221dfd2e\",\"149\":\"359925d45492160d5e8b\",\"354\":\"4f0b1db8f77b105dfb25\",\"355\":\"8ec9d1cf4562de9fd523\",\"403\":\"999e28291726a2c54e70\",\"417\":\"e4d2d12096012ba30740\",\"475\":\"26f23024f1c06ad5b4f6\",\"514\":\"1ec7dcfded6e73efef91\",\"548\":\"10c8768c64c0db9f80c2\",\"577\":\"3558ad62e70f9f6bfcfc\",\"602\":\"00be99e431fb904367c1\",\"650\":\"05e1354e259380d8d7ed\",\"731\":\"fc2222e8bcbd3a323b37\",\"748\":\"fb7314d489c2682e7da0\",\"832\":\"c79944ee44040195a3eb\",\"843\":\"82fd7f798c0dd9a6f67b\",\"899\":\"2076682d0e3e44045f00\",\"926\":\"ae37a37910d4ce46256c\"}[chunkId] + \".js\";\n};","// This function allow to reference all chunks\n__webpack_require__.miniCssF = function(chunkId) {\n\t// return url for filenames based on template\n\treturn \"\" + \"styles\" + \".\" + \"78a6e0759546d778358c\" + \".css\";\n};","__webpack_require__.g = (function() {\n\tif (typeof globalThis === 'object') return globalThis;\n\ttry {\n\t\treturn this || new Function('return this')();\n\t} catch (e) {\n\t\tif (typeof window === 'object') return window;\n\t}\n})();","__webpack_require__.o = function(obj, prop) { return Object.prototype.hasOwnProperty.call(obj, prop); }","// define __esModule on exports\n__webpack_require__.r = function(exports) {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","__webpack_require__.nmd = function(module) {\n\tmodule.paths = [];\n\tif (!module.children) module.children = [];\n\treturn module;\n};","__webpack_require__.p = \"/\";","__webpack_require__.b = document.baseURI || self.location.href;\n\n// object to store loaded and loading chunks\n// undefined = chunk not loaded, null = chunk preloaded/prefetched\n// [resolve, reject, Promise] = chunk loading, 0 = chunk loaded\nvar installedChunks = {\n\t658: 0,\n\t532: 0\n};\n\n__webpack_require__.f.j = function(chunkId, promises) {\n\t\t// JSONP chunk loading for javascript\n\t\tvar installedChunkData = __webpack_require__.o(installedChunks, chunkId) ? installedChunks[chunkId] : undefined;\n\t\tif(installedChunkData !== 0) { // 0 means \"already installed\".\n\n\t\t\t// a Promise means \"currently loading\".\n\t\t\tif(installedChunkData) {\n\t\t\t\tpromises.push(installedChunkData[2]);\n\t\t\t} else {\n\t\t\t\tif(!/^(532|658)$/.test(chunkId)) {\n\t\t\t\t\t// setup Promise in chunk cache\n\t\t\t\t\tvar promise = new Promise(function(resolve, reject) { installedChunkData = installedChunks[chunkId] = [resolve, reject]; });\n\t\t\t\t\tpromises.push(installedChunkData[2] = promise);\n\n\t\t\t\t\t// start chunk loading\n\t\t\t\t\tvar url = __webpack_require__.p + __webpack_require__.u(chunkId);\n\t\t\t\t\t// create error before stack unwound to get useful stacktrace later\n\t\t\t\t\tvar error = new Error();\n\t\t\t\t\tvar loadingEnded = function(event) {\n\t\t\t\t\t\tif(__webpack_require__.o(installedChunks, chunkId)) {\n\t\t\t\t\t\t\tinstalledChunkData = installedChunks[chunkId];\n\t\t\t\t\t\t\tif(installedChunkData !== 0) installedChunks[chunkId] = undefined;\n\t\t\t\t\t\t\tif(installedChunkData) {\n\t\t\t\t\t\t\t\tvar errorType = event && (event.type === 'load' ? 'missing' : event.type);\n\t\t\t\t\t\t\t\tvar realSrc = event && event.target && event.target.src;\n\t\t\t\t\t\t\t\terror.message = 'Loading chunk ' + chunkId + ' failed.\\n(' + errorType + ': ' + realSrc + ')';\n\t\t\t\t\t\t\t\terror.name = 'ChunkLoadError';\n\t\t\t\t\t\t\t\terror.type = errorType;\n\t\t\t\t\t\t\t\terror.request = realSrc;\n\t\t\t\t\t\t\t\tinstalledChunkData[1](error);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t};\n\t\t\t\t\t__webpack_require__.l(url, loadingEnded, \"chunk-\" + chunkId, chunkId);\n\t\t\t\t} else installedChunks[chunkId] = 0;\n\t\t\t}\n\t\t}\n};\n\n// no prefetching\n\n// no preloaded\n\n// no HMR\n\n// no HMR manifest\n\n__webpack_require__.O.j = function(chunkId) { return installedChunks[chunkId] === 0; };\n\n// install a JSONP callback for chunk loading\nvar webpackJsonpCallback = function(parentChunkLoadingFunction, data) {\n\tvar chunkIds = data[0];\n\tvar moreModules = data[1];\n\tvar runtime = data[2];\n\t// add \"moreModules\" to the modules object,\n\t// then flag all \"chunkIds\" as loaded and fire callback\n\tvar moduleId, chunkId, i = 0;\n\tif(chunkIds.some(function(id) { return installedChunks[id] !== 0; })) {\n\t\tfor(moduleId in moreModules) {\n\t\t\tif(__webpack_require__.o(moreModules, moduleId)) {\n\t\t\t\t__webpack_require__.m[moduleId] = moreModules[moduleId];\n\t\t\t}\n\t\t}\n\t\tif(runtime) var result = runtime(__webpack_require__);\n\t}\n\tif(parentChunkLoadingFunction) parentChunkLoadingFunction(data);\n\tfor(;i < chunkIds.length; i++) {\n\t\tchunkId = chunkIds[i];\n\t\tif(__webpack_require__.o(installedChunks, chunkId) && installedChunks[chunkId]) {\n\t\t\tinstalledChunks[chunkId][0]();\n\t\t}\n\t\tinstalledChunks[chunkId] = 0;\n\t}\n\treturn __webpack_require__.O(result);\n}\n\nvar chunkLoadingGlobal = self[\"webpackChunkcode_cave\"] = self[\"webpackChunkcode_cave\"] || [];\nchunkLoadingGlobal.forEach(webpackJsonpCallback.bind(null, 0));\nchunkLoadingGlobal.push = webpackJsonpCallback.bind(null, chunkLoadingGlobal.push.bind(chunkLoadingGlobal));"],"names":["deferred","leafPrototypes","getProto","inProgress","dataWebpackPrefix","__webpack_module_cache__","__webpack_require__","moduleId","cachedModule","undefined","exports","module","id","loaded","__webpack_modules__","m","O","result","chunkIds","fn","priority","notFulfilled","Infinity","i","length","fulfilled","j","Object","keys","every","key","splice","r","n","getter","__esModule","d","a","getPrototypeOf","obj","__proto__","t","value","mode","this","then","ns","create","def","current","indexOf","getOwnPropertyNames","forEach","definition","o","defineProperty","enumerable","get","f","e","chunkId","Promise","all","reduce","promises","u","miniCssF","g","globalThis","Function","window","prop","prototype","hasOwnProperty","call","l","url","done","push","script","needAttach","scripts","document","getElementsByTagName","s","getAttribute","createElement","charset","timeout","nc","setAttribute","src","onScriptComplete","prev","event","onerror","onload","clearTimeout","doneFns","parentNode","removeChild","setTimeout","bind","type","target","head","appendChild","Symbol","toStringTag","nmd","paths","children","p","b","baseURI","self","location","href","installedChunks","installedChunkData","test","promise","resolve","reject","error","Error","errorType","realSrc","message","name","request","webpackJsonpCallback","parentChunkLoadingFunction","data","moreModules","runtime","some","chunkLoadingGlobal"],"sourceRoot":""} \ No newline at end of file +{"version":3,"file":"webpack-runtime-58c7cdd0abc723b6d241.js","mappings":"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","sources":["webpack://code-cave/webpack/runtime/chunk loaded","webpack://code-cave/webpack/runtime/create fake namespace object","webpack://code-cave/webpack/runtime/load script","webpack://code-cave/webpack/bootstrap","webpack://code-cave/webpack/runtime/compat get default export","webpack://code-cave/webpack/runtime/define property getters","webpack://code-cave/webpack/runtime/ensure chunk","webpack://code-cave/webpack/runtime/get javascript chunk filename","webpack://code-cave/webpack/runtime/get mini-css chunk filename","webpack://code-cave/webpack/runtime/global","webpack://code-cave/webpack/runtime/hasOwnProperty shorthand","webpack://code-cave/webpack/runtime/make namespace object","webpack://code-cave/webpack/runtime/node module decorator","webpack://code-cave/webpack/runtime/publicPath","webpack://code-cave/webpack/runtime/jsonp chunk loading"],"sourcesContent":["var deferred = [];\n__webpack_require__.O = function(result, chunkIds, fn, priority) {\n\tif(chunkIds) {\n\t\tpriority = priority || 0;\n\t\tfor(var i = deferred.length; i > 0 && deferred[i - 1][2] > priority; i--) deferred[i] = deferred[i - 1];\n\t\tdeferred[i] = [chunkIds, fn, priority];\n\t\treturn;\n\t}\n\tvar notFulfilled = Infinity;\n\tfor (var i = 0; i < deferred.length; i++) {\n\t\tvar chunkIds = deferred[i][0];\n\t\tvar fn = deferred[i][1];\n\t\tvar priority = deferred[i][2];\n\t\tvar fulfilled = true;\n\t\tfor (var j = 0; j < chunkIds.length; j++) {\n\t\t\tif ((priority & 1 === 0 || notFulfilled >= priority) && Object.keys(__webpack_require__.O).every(function(key) { return __webpack_require__.O[key](chunkIds[j]); })) {\n\t\t\t\tchunkIds.splice(j--, 1);\n\t\t\t} else {\n\t\t\t\tfulfilled = false;\n\t\t\t\tif(priority < notFulfilled) notFulfilled = priority;\n\t\t\t}\n\t\t}\n\t\tif(fulfilled) {\n\t\t\tdeferred.splice(i--, 1)\n\t\t\tvar r = fn();\n\t\t\tif (r !== undefined) result = r;\n\t\t}\n\t}\n\treturn result;\n};","var getProto = Object.getPrototypeOf ? function(obj) { return Object.getPrototypeOf(obj); } : function(obj) { return obj.__proto__; };\nvar leafPrototypes;\n// create a fake namespace object\n// mode & 1: value is a module id, require it\n// mode & 2: merge all properties of value into the ns\n// mode & 4: return value when already ns object\n// mode & 16: return value when it's Promise-like\n// mode & 8|1: behave like require\n__webpack_require__.t = function(value, mode) {\n\tif(mode & 1) value = this(value);\n\tif(mode & 8) return value;\n\tif(typeof value === 'object' && value) {\n\t\tif((mode & 4) && value.__esModule) return value;\n\t\tif((mode & 16) && typeof value.then === 'function') return value;\n\t}\n\tvar ns = Object.create(null);\n\t__webpack_require__.r(ns);\n\tvar def = {};\n\tleafPrototypes = leafPrototypes || [null, getProto({}), getProto([]), getProto(getProto)];\n\tfor(var current = mode & 2 && value; typeof current == 'object' && !~leafPrototypes.indexOf(current); current = getProto(current)) {\n\t\tObject.getOwnPropertyNames(current).forEach(function(key) { def[key] = function() { return value[key]; }; });\n\t}\n\tdef['default'] = function() { return value; };\n\t__webpack_require__.d(ns, def);\n\treturn ns;\n};","var inProgress = {};\nvar dataWebpackPrefix = \"code-cave:\";\n// loadScript function to load a script via script tag\n__webpack_require__.l = function(url, done, key, chunkId) {\n\tif(inProgress[url]) { inProgress[url].push(done); return; }\n\tvar script, needAttach;\n\tif(key !== undefined) {\n\t\tvar scripts = document.getElementsByTagName(\"script\");\n\t\tfor(var i = 0; i < scripts.length; i++) {\n\t\t\tvar s = scripts[i];\n\t\t\tif(s.getAttribute(\"src\") == url || s.getAttribute(\"data-webpack\") == dataWebpackPrefix + key) { script = s; break; }\n\t\t}\n\t}\n\tif(!script) {\n\t\tneedAttach = true;\n\t\tscript = document.createElement('script');\n\n\t\tscript.charset = 'utf-8';\n\t\tscript.timeout = 120;\n\t\tif (__webpack_require__.nc) {\n\t\t\tscript.setAttribute(\"nonce\", __webpack_require__.nc);\n\t\t}\n\t\tscript.setAttribute(\"data-webpack\", dataWebpackPrefix + key);\n\n\t\tscript.src = url;\n\t}\n\tinProgress[url] = [done];\n\tvar onScriptComplete = function(prev, event) {\n\t\t// avoid mem leaks in IE.\n\t\tscript.onerror = script.onload = null;\n\t\tclearTimeout(timeout);\n\t\tvar doneFns = inProgress[url];\n\t\tdelete inProgress[url];\n\t\tscript.parentNode && script.parentNode.removeChild(script);\n\t\tdoneFns && doneFns.forEach(function(fn) { return fn(event); });\n\t\tif(prev) return prev(event);\n\t}\n\tvar timeout = setTimeout(onScriptComplete.bind(null, undefined, { type: 'timeout', target: script }), 120000);\n\tscript.onerror = onScriptComplete.bind(null, script.onerror);\n\tscript.onload = onScriptComplete.bind(null, script.onload);\n\tneedAttach && document.head.appendChild(script);\n};","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\tid: moduleId,\n\t\tloaded: false,\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId](module, module.exports, __webpack_require__);\n\n\t// Flag the module as loaded\n\tmodule.loaded = true;\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n// expose the modules object (__webpack_modules__)\n__webpack_require__.m = __webpack_modules__;\n\n","// getDefaultExport function for compatibility with non-harmony modules\n__webpack_require__.n = function(module) {\n\tvar getter = module && module.__esModule ?\n\t\tfunction() { return module['default']; } :\n\t\tfunction() { return module; };\n\t__webpack_require__.d(getter, { a: getter });\n\treturn getter;\n};","// define getter functions for harmony exports\n__webpack_require__.d = function(exports, definition) {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.f = {};\n// This file contains only the entry chunk.\n// The chunk loading function for additional chunks\n__webpack_require__.e = function(chunkId) {\n\treturn Promise.all(Object.keys(__webpack_require__.f).reduce(function(promises, key) {\n\t\t__webpack_require__.f[key](chunkId, promises);\n\t\treturn promises;\n\t}, []));\n};","// This function allow to reference async chunks\n__webpack_require__.u = function(chunkId) {\n\t// return url for filenames based on template\n\treturn \"\" + ({\"147\":\"component---src-pages-templates-project-tsx\",\"149\":\"component---src-pages-templates-policies-tsx\",\"354\":\"component---src-pages-templates-post-tsx\",\"403\":\"c294adedbbc0a5c4b071b27a5ffb97a116928d98\",\"417\":\"component---src-pages-templates-services-tsx\",\"514\":\"component---src-pages-templates-404-tsx\",\"548\":\"component---src-pages-templates-workflow-tsx\",\"577\":\"71598b7b9331211c5dc2cdd9e7a07dc39cf581bb\",\"602\":\"dbbdfb320c5007a40fa91453221d77dae72f3b83\",\"650\":\"component---src-pages-templates-projects-tsx\",\"748\":\"component---src-pages-templates-blog-by-author-tsx\",\"832\":\"component---src-pages-templates-index-tsx\",\"899\":\"component---src-pages-templates-blog-by-hashtag-tsx\",\"926\":\"component---src-pages-templates-blog-tsx\"}[chunkId] || chunkId) + \"-\" + {\"147\":\"0f155fa91f86221dfd2e\",\"149\":\"359925d45492160d5e8b\",\"354\":\"f41bd2e7c5e393acf3b9\",\"355\":\"8ec9d1cf4562de9fd523\",\"403\":\"999e28291726a2c54e70\",\"417\":\"e4d2d12096012ba30740\",\"475\":\"26f23024f1c06ad5b4f6\",\"514\":\"1ec7dcfded6e73efef91\",\"548\":\"10c8768c64c0db9f80c2\",\"577\":\"3558ad62e70f9f6bfcfc\",\"602\":\"00be99e431fb904367c1\",\"650\":\"05e1354e259380d8d7ed\",\"731\":\"fc2222e8bcbd3a323b37\",\"748\":\"fb7314d489c2682e7da0\",\"832\":\"c79944ee44040195a3eb\",\"843\":\"82fd7f798c0dd9a6f67b\",\"899\":\"2076682d0e3e44045f00\",\"926\":\"ae37a37910d4ce46256c\"}[chunkId] + \".js\";\n};","// This function allow to reference all chunks\n__webpack_require__.miniCssF = function(chunkId) {\n\t// return url for filenames based on template\n\treturn \"\" + \"styles\" + \".\" + \"78a6e0759546d778358c\" + \".css\";\n};","__webpack_require__.g = (function() {\n\tif (typeof globalThis === 'object') return globalThis;\n\ttry {\n\t\treturn this || new Function('return this')();\n\t} catch (e) {\n\t\tif (typeof window === 'object') return window;\n\t}\n})();","__webpack_require__.o = function(obj, prop) { return Object.prototype.hasOwnProperty.call(obj, prop); }","// define __esModule on exports\n__webpack_require__.r = function(exports) {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","__webpack_require__.nmd = function(module) {\n\tmodule.paths = [];\n\tif (!module.children) module.children = [];\n\treturn module;\n};","__webpack_require__.p = \"/\";","__webpack_require__.b = document.baseURI || self.location.href;\n\n// object to store loaded and loading chunks\n// undefined = chunk not loaded, null = chunk preloaded/prefetched\n// [resolve, reject, Promise] = chunk loading, 0 = chunk loaded\nvar installedChunks = {\n\t658: 0,\n\t532: 0\n};\n\n__webpack_require__.f.j = function(chunkId, promises) {\n\t\t// JSONP chunk loading for javascript\n\t\tvar installedChunkData = __webpack_require__.o(installedChunks, chunkId) ? installedChunks[chunkId] : undefined;\n\t\tif(installedChunkData !== 0) { // 0 means \"already installed\".\n\n\t\t\t// a Promise means \"currently loading\".\n\t\t\tif(installedChunkData) {\n\t\t\t\tpromises.push(installedChunkData[2]);\n\t\t\t} else {\n\t\t\t\tif(!/^(532|658)$/.test(chunkId)) {\n\t\t\t\t\t// setup Promise in chunk cache\n\t\t\t\t\tvar promise = new Promise(function(resolve, reject) { installedChunkData = installedChunks[chunkId] = [resolve, reject]; });\n\t\t\t\t\tpromises.push(installedChunkData[2] = promise);\n\n\t\t\t\t\t// start chunk loading\n\t\t\t\t\tvar url = __webpack_require__.p + __webpack_require__.u(chunkId);\n\t\t\t\t\t// create error before stack unwound to get useful stacktrace later\n\t\t\t\t\tvar error = new Error();\n\t\t\t\t\tvar loadingEnded = function(event) {\n\t\t\t\t\t\tif(__webpack_require__.o(installedChunks, chunkId)) {\n\t\t\t\t\t\t\tinstalledChunkData = installedChunks[chunkId];\n\t\t\t\t\t\t\tif(installedChunkData !== 0) installedChunks[chunkId] = undefined;\n\t\t\t\t\t\t\tif(installedChunkData) {\n\t\t\t\t\t\t\t\tvar errorType = event && (event.type === 'load' ? 'missing' : event.type);\n\t\t\t\t\t\t\t\tvar realSrc = event && event.target && event.target.src;\n\t\t\t\t\t\t\t\terror.message = 'Loading chunk ' + chunkId + ' failed.\\n(' + errorType + ': ' + realSrc + ')';\n\t\t\t\t\t\t\t\terror.name = 'ChunkLoadError';\n\t\t\t\t\t\t\t\terror.type = errorType;\n\t\t\t\t\t\t\t\terror.request = realSrc;\n\t\t\t\t\t\t\t\tinstalledChunkData[1](error);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t};\n\t\t\t\t\t__webpack_require__.l(url, loadingEnded, \"chunk-\" + chunkId, chunkId);\n\t\t\t\t} else installedChunks[chunkId] = 0;\n\t\t\t}\n\t\t}\n};\n\n// no prefetching\n\n// no preloaded\n\n// no HMR\n\n// no HMR manifest\n\n__webpack_require__.O.j = function(chunkId) { return installedChunks[chunkId] === 0; };\n\n// install a JSONP callback for chunk loading\nvar webpackJsonpCallback = function(parentChunkLoadingFunction, data) {\n\tvar chunkIds = data[0];\n\tvar moreModules = data[1];\n\tvar runtime = data[2];\n\t// add \"moreModules\" to the modules object,\n\t// then flag all \"chunkIds\" as loaded and fire callback\n\tvar moduleId, chunkId, i = 0;\n\tif(chunkIds.some(function(id) { return installedChunks[id] !== 0; })) {\n\t\tfor(moduleId in moreModules) {\n\t\t\tif(__webpack_require__.o(moreModules, moduleId)) {\n\t\t\t\t__webpack_require__.m[moduleId] = moreModules[moduleId];\n\t\t\t}\n\t\t}\n\t\tif(runtime) var result = runtime(__webpack_require__);\n\t}\n\tif(parentChunkLoadingFunction) parentChunkLoadingFunction(data);\n\tfor(;i < chunkIds.length; i++) {\n\t\tchunkId = chunkIds[i];\n\t\tif(__webpack_require__.o(installedChunks, chunkId) && installedChunks[chunkId]) {\n\t\t\tinstalledChunks[chunkId][0]();\n\t\t}\n\t\tinstalledChunks[chunkId] = 0;\n\t}\n\treturn __webpack_require__.O(result);\n}\n\nvar chunkLoadingGlobal = self[\"webpackChunkcode_cave\"] = self[\"webpackChunkcode_cave\"] || [];\nchunkLoadingGlobal.forEach(webpackJsonpCallback.bind(null, 0));\nchunkLoadingGlobal.push = webpackJsonpCallback.bind(null, chunkLoadingGlobal.push.bind(chunkLoadingGlobal));"],"names":["deferred","leafPrototypes","getProto","inProgress","dataWebpackPrefix","__webpack_module_cache__","__webpack_require__","moduleId","cachedModule","undefined","exports","module","id","loaded","__webpack_modules__","m","O","result","chunkIds","fn","priority","notFulfilled","Infinity","i","length","fulfilled","j","Object","keys","every","key","splice","r","n","getter","__esModule","d","a","getPrototypeOf","obj","__proto__","t","value","mode","this","then","ns","create","def","current","indexOf","getOwnPropertyNames","forEach","definition","o","defineProperty","enumerable","get","f","e","chunkId","Promise","all","reduce","promises","u","miniCssF","g","globalThis","Function","window","prop","prototype","hasOwnProperty","call","l","url","done","push","script","needAttach","scripts","document","getElementsByTagName","s","getAttribute","createElement","charset","timeout","nc","setAttribute","src","onScriptComplete","prev","event","onerror","onload","clearTimeout","doneFns","parentNode","removeChild","setTimeout","bind","type","target","head","appendChild","Symbol","toStringTag","nmd","paths","children","p","b","baseURI","self","location","href","installedChunks","installedChunkData","test","promise","resolve","reject","error","Error","errorType","realSrc","message","name","request","webpackJsonpCallback","parentChunkLoadingFunction","data","moreModules","runtime","some","chunkLoadingGlobal"],"sourceRoot":""} \ No newline at end of file diff --git a/webpack.stats.json b/webpack.stats.json index 286037a2..5f461231 100644 --- a/webpack.stats.json +++ b/webpack.stats.json @@ -1 +1 @@ -{"name":"build-javascript","namedChunkGroups":{"app":{"name":"app","assets":[{"name":"webpack-runtime-3ace51124175e41a6bdb.js","size":4952},{"name":"styles.78a6e0759546d778358c.css","size":57446},{"name":"framework-2f7a9a83fd6996cb764f.js","size":141400},{"name":"app-482697764f835926dc92.js","size":359176}],"filteredAssets":0,"assetsSize":562974,"filteredAuxiliaryAssets":17,"auxiliaryAssetsSize":2531769},"component---src-pages-templates-404-tsx":{"name":"component---src-pages-templates-404-tsx","assets":[{"name":"component---src-pages-templates-404-tsx-1ec7dcfded6e73efef91.js","size":5869}],"filteredAssets":0,"assetsSize":5869,"filteredAuxiliaryAssets":1,"auxiliaryAssetsSize":33408},"component---src-pages-templates-blog-by-author-tsx":{"name":"component---src-pages-templates-blog-by-author-tsx","assets":[{"name":"c294adedbbc0a5c4b071b27a5ffb97a116928d98-999e28291726a2c54e70.js","size":10543},{"name":"component---src-pages-templates-blog-by-author-tsx-fb7314d489c2682e7da0.js","size":10739}],"filteredAssets":0,"assetsSize":21282,"filteredAuxiliaryAssets":2,"auxiliaryAssetsSize":101311},"component---src-pages-templates-blog-by-hashtag-tsx":{"name":"component---src-pages-templates-blog-by-hashtag-tsx","assets":[{"name":"c294adedbbc0a5c4b071b27a5ffb97a116928d98-999e28291726a2c54e70.js","size":10543},{"name":"component---src-pages-templates-blog-by-hashtag-tsx-2076682d0e3e44045f00.js","size":9896}],"filteredAssets":0,"assetsSize":20439,"filteredAuxiliaryAssets":2,"auxiliaryAssetsSize":98343},"component---src-pages-templates-blog-tsx":{"name":"component---src-pages-templates-blog-tsx","assets":[{"name":"c294adedbbc0a5c4b071b27a5ffb97a116928d98-999e28291726a2c54e70.js","size":10543},{"name":"component---src-pages-templates-blog-tsx-ae37a37910d4ce46256c.js","size":9680}],"filteredAssets":0,"assetsSize":20223,"filteredAuxiliaryAssets":2,"auxiliaryAssetsSize":97981},"component---src-pages-templates-index-tsx":{"name":"component---src-pages-templates-index-tsx","assets":[{"name":"styles.78a6e0759546d778358c.css","size":57446},{"name":"c294adedbbc0a5c4b071b27a5ffb97a116928d98-999e28291726a2c54e70.js","size":10543},{"name":"71598b7b9331211c5dc2cdd9e7a07dc39cf581bb-3558ad62e70f9f6bfcfc.js","size":31236},{"name":"dbbdfb320c5007a40fa91453221d77dae72f3b83-00be99e431fb904367c1.js","size":18834},{"name":"component---src-pages-templates-index-tsx-c79944ee44040195a3eb.js","size":13615}],"filteredAssets":0,"assetsSize":131674,"filteredAuxiliaryAssets":18,"auxiliaryAssetsSize":853408},"component---src-pages-templates-policies-tsx":{"name":"component---src-pages-templates-policies-tsx","assets":[{"name":"component---src-pages-templates-policies-tsx-359925d45492160d5e8b.js","size":816}],"filteredAssets":0,"assetsSize":816,"filteredAuxiliaryAssets":1,"auxiliaryAssetsSize":2133},"component---src-pages-templates-post-tsx":{"name":"component---src-pages-templates-post-tsx","assets":[{"name":"c294adedbbc0a5c4b071b27a5ffb97a116928d98-999e28291726a2c54e70.js","size":10543},{"name":"component---src-pages-templates-post-tsx-4f0b1db8f77b105dfb25.js","size":8169}],"filteredAssets":0,"assetsSize":18712,"filteredAuxiliaryAssets":2,"auxiliaryAssetsSize":90937},"component---src-pages-templates-project-tsx":{"name":"component---src-pages-templates-project-tsx","assets":[{"name":"styles.78a6e0759546d778358c.css","size":57446},{"name":"c294adedbbc0a5c4b071b27a5ffb97a116928d98-999e28291726a2c54e70.js","size":10543},{"name":"dbbdfb320c5007a40fa91453221d77dae72f3b83-00be99e431fb904367c1.js","size":18834},{"name":"component---src-pages-templates-project-tsx-0f155fa91f86221dfd2e.js","size":55716}],"filteredAssets":0,"assetsSize":142539,"filteredAuxiliaryAssets":17,"auxiliaryAssetsSize":887074},"component---src-pages-templates-projects-tsx":{"name":"component---src-pages-templates-projects-tsx","assets":[{"name":"c294adedbbc0a5c4b071b27a5ffb97a116928d98-999e28291726a2c54e70.js","size":10543},{"name":"component---src-pages-templates-projects-tsx-05e1354e259380d8d7ed.js","size":4267}],"filteredAssets":0,"assetsSize":14810,"filteredAuxiliaryAssets":2,"auxiliaryAssetsSize":82293},"component---src-pages-templates-services-tsx":{"name":"component---src-pages-templates-services-tsx","assets":[{"name":"c294adedbbc0a5c4b071b27a5ffb97a116928d98-999e28291726a2c54e70.js","size":10543},{"name":"71598b7b9331211c5dc2cdd9e7a07dc39cf581bb-3558ad62e70f9f6bfcfc.js","size":31236},{"name":"dbbdfb320c5007a40fa91453221d77dae72f3b83-00be99e431fb904367c1.js","size":18834},{"name":"component---src-pages-templates-services-tsx-e4d2d12096012ba30740.js","size":4499}],"filteredAssets":0,"assetsSize":65112,"filteredAuxiliaryAssets":4,"auxiliaryAssetsSize":311567},"component---src-pages-templates-workflow-tsx":{"name":"component---src-pages-templates-workflow-tsx","assets":[{"name":"c294adedbbc0a5c4b071b27a5ffb97a116928d98-999e28291726a2c54e70.js","size":10543},{"name":"71598b7b9331211c5dc2cdd9e7a07dc39cf581bb-3558ad62e70f9f6bfcfc.js","size":31236},{"name":"component---src-pages-templates-workflow-tsx-10c8768c64c0db9f80c2.js","size":5141}],"filteredAssets":0,"assetsSize":46920,"filteredAuxiliaryAssets":3,"auxiliaryAssetsSize":225224}},"assetsByChunkName":{"app":["webpack-runtime-3ace51124175e41a6bdb.js","styles.78a6e0759546d778358c.css","framework-2f7a9a83fd6996cb764f.js","app-482697764f835926dc92.js"],"component---src-pages-templates-404-tsx":["component---src-pages-templates-404-tsx-1ec7dcfded6e73efef91.js"],"component---src-pages-templates-blog-by-author-tsx":["c294adedbbc0a5c4b071b27a5ffb97a116928d98-999e28291726a2c54e70.js","component---src-pages-templates-blog-by-author-tsx-fb7314d489c2682e7da0.js"],"component---src-pages-templates-blog-by-hashtag-tsx":["c294adedbbc0a5c4b071b27a5ffb97a116928d98-999e28291726a2c54e70.js","component---src-pages-templates-blog-by-hashtag-tsx-2076682d0e3e44045f00.js"],"component---src-pages-templates-blog-tsx":["c294adedbbc0a5c4b071b27a5ffb97a116928d98-999e28291726a2c54e70.js","component---src-pages-templates-blog-tsx-ae37a37910d4ce46256c.js"],"component---src-pages-templates-index-tsx":["styles.78a6e0759546d778358c.css","c294adedbbc0a5c4b071b27a5ffb97a116928d98-999e28291726a2c54e70.js","71598b7b9331211c5dc2cdd9e7a07dc39cf581bb-3558ad62e70f9f6bfcfc.js","dbbdfb320c5007a40fa91453221d77dae72f3b83-00be99e431fb904367c1.js","component---src-pages-templates-index-tsx-c79944ee44040195a3eb.js"],"component---src-pages-templates-policies-tsx":["component---src-pages-templates-policies-tsx-359925d45492160d5e8b.js"],"component---src-pages-templates-post-tsx":["c294adedbbc0a5c4b071b27a5ffb97a116928d98-999e28291726a2c54e70.js","component---src-pages-templates-post-tsx-4f0b1db8f77b105dfb25.js"],"component---src-pages-templates-project-tsx":["styles.78a6e0759546d778358c.css","c294adedbbc0a5c4b071b27a5ffb97a116928d98-999e28291726a2c54e70.js","dbbdfb320c5007a40fa91453221d77dae72f3b83-00be99e431fb904367c1.js","component---src-pages-templates-project-tsx-0f155fa91f86221dfd2e.js"],"component---src-pages-templates-projects-tsx":["c294adedbbc0a5c4b071b27a5ffb97a116928d98-999e28291726a2c54e70.js","component---src-pages-templates-projects-tsx-05e1354e259380d8d7ed.js"],"component---src-pages-templates-services-tsx":["c294adedbbc0a5c4b071b27a5ffb97a116928d98-999e28291726a2c54e70.js","71598b7b9331211c5dc2cdd9e7a07dc39cf581bb-3558ad62e70f9f6bfcfc.js","dbbdfb320c5007a40fa91453221d77dae72f3b83-00be99e431fb904367c1.js","component---src-pages-templates-services-tsx-e4d2d12096012ba30740.js"],"component---src-pages-templates-workflow-tsx":["c294adedbbc0a5c4b071b27a5ffb97a116928d98-999e28291726a2c54e70.js","71598b7b9331211c5dc2cdd9e7a07dc39cf581bb-3558ad62e70f9f6bfcfc.js","component---src-pages-templates-workflow-tsx-10c8768c64c0db9f80c2.js"]},"childAssetsByChunkName":{}} \ No newline at end of file +{"name":"build-javascript","namedChunkGroups":{"app":{"name":"app","assets":[{"name":"webpack-runtime-58c7cdd0abc723b6d241.js","size":4952},{"name":"styles.78a6e0759546d778358c.css","size":57446},{"name":"framework-2f7a9a83fd6996cb764f.js","size":141400},{"name":"app-482697764f835926dc92.js","size":359176}],"filteredAssets":0,"assetsSize":562974,"filteredAuxiliaryAssets":17,"auxiliaryAssetsSize":2531769},"component---src-pages-templates-404-tsx":{"name":"component---src-pages-templates-404-tsx","assets":[{"name":"component---src-pages-templates-404-tsx-1ec7dcfded6e73efef91.js","size":5869}],"filteredAssets":0,"assetsSize":5869,"filteredAuxiliaryAssets":1,"auxiliaryAssetsSize":33408},"component---src-pages-templates-blog-by-author-tsx":{"name":"component---src-pages-templates-blog-by-author-tsx","assets":[{"name":"c294adedbbc0a5c4b071b27a5ffb97a116928d98-999e28291726a2c54e70.js","size":10543},{"name":"component---src-pages-templates-blog-by-author-tsx-fb7314d489c2682e7da0.js","size":10739}],"filteredAssets":0,"assetsSize":21282,"filteredAuxiliaryAssets":2,"auxiliaryAssetsSize":101311},"component---src-pages-templates-blog-by-hashtag-tsx":{"name":"component---src-pages-templates-blog-by-hashtag-tsx","assets":[{"name":"c294adedbbc0a5c4b071b27a5ffb97a116928d98-999e28291726a2c54e70.js","size":10543},{"name":"component---src-pages-templates-blog-by-hashtag-tsx-2076682d0e3e44045f00.js","size":9896}],"filteredAssets":0,"assetsSize":20439,"filteredAuxiliaryAssets":2,"auxiliaryAssetsSize":98343},"component---src-pages-templates-blog-tsx":{"name":"component---src-pages-templates-blog-tsx","assets":[{"name":"c294adedbbc0a5c4b071b27a5ffb97a116928d98-999e28291726a2c54e70.js","size":10543},{"name":"component---src-pages-templates-blog-tsx-ae37a37910d4ce46256c.js","size":9680}],"filteredAssets":0,"assetsSize":20223,"filteredAuxiliaryAssets":2,"auxiliaryAssetsSize":97981},"component---src-pages-templates-index-tsx":{"name":"component---src-pages-templates-index-tsx","assets":[{"name":"styles.78a6e0759546d778358c.css","size":57446},{"name":"c294adedbbc0a5c4b071b27a5ffb97a116928d98-999e28291726a2c54e70.js","size":10543},{"name":"71598b7b9331211c5dc2cdd9e7a07dc39cf581bb-3558ad62e70f9f6bfcfc.js","size":31236},{"name":"dbbdfb320c5007a40fa91453221d77dae72f3b83-00be99e431fb904367c1.js","size":18834},{"name":"component---src-pages-templates-index-tsx-c79944ee44040195a3eb.js","size":13615}],"filteredAssets":0,"assetsSize":131674,"filteredAuxiliaryAssets":18,"auxiliaryAssetsSize":853408},"component---src-pages-templates-policies-tsx":{"name":"component---src-pages-templates-policies-tsx","assets":[{"name":"component---src-pages-templates-policies-tsx-359925d45492160d5e8b.js","size":816}],"filteredAssets":0,"assetsSize":816,"filteredAuxiliaryAssets":1,"auxiliaryAssetsSize":2133},"component---src-pages-templates-post-tsx":{"name":"component---src-pages-templates-post-tsx","assets":[{"name":"c294adedbbc0a5c4b071b27a5ffb97a116928d98-999e28291726a2c54e70.js","size":10543},{"name":"component---src-pages-templates-post-tsx-f41bd2e7c5e393acf3b9.js","size":8267}],"filteredAssets":0,"assetsSize":18810,"filteredAuxiliaryAssets":2,"auxiliaryAssetsSize":91514},"component---src-pages-templates-project-tsx":{"name":"component---src-pages-templates-project-tsx","assets":[{"name":"styles.78a6e0759546d778358c.css","size":57446},{"name":"c294adedbbc0a5c4b071b27a5ffb97a116928d98-999e28291726a2c54e70.js","size":10543},{"name":"dbbdfb320c5007a40fa91453221d77dae72f3b83-00be99e431fb904367c1.js","size":18834},{"name":"component---src-pages-templates-project-tsx-0f155fa91f86221dfd2e.js","size":55716}],"filteredAssets":0,"assetsSize":142539,"filteredAuxiliaryAssets":17,"auxiliaryAssetsSize":887074},"component---src-pages-templates-projects-tsx":{"name":"component---src-pages-templates-projects-tsx","assets":[{"name":"c294adedbbc0a5c4b071b27a5ffb97a116928d98-999e28291726a2c54e70.js","size":10543},{"name":"component---src-pages-templates-projects-tsx-05e1354e259380d8d7ed.js","size":4267}],"filteredAssets":0,"assetsSize":14810,"filteredAuxiliaryAssets":2,"auxiliaryAssetsSize":82293},"component---src-pages-templates-services-tsx":{"name":"component---src-pages-templates-services-tsx","assets":[{"name":"c294adedbbc0a5c4b071b27a5ffb97a116928d98-999e28291726a2c54e70.js","size":10543},{"name":"71598b7b9331211c5dc2cdd9e7a07dc39cf581bb-3558ad62e70f9f6bfcfc.js","size":31236},{"name":"dbbdfb320c5007a40fa91453221d77dae72f3b83-00be99e431fb904367c1.js","size":18834},{"name":"component---src-pages-templates-services-tsx-e4d2d12096012ba30740.js","size":4499}],"filteredAssets":0,"assetsSize":65112,"filteredAuxiliaryAssets":4,"auxiliaryAssetsSize":311567},"component---src-pages-templates-workflow-tsx":{"name":"component---src-pages-templates-workflow-tsx","assets":[{"name":"c294adedbbc0a5c4b071b27a5ffb97a116928d98-999e28291726a2c54e70.js","size":10543},{"name":"71598b7b9331211c5dc2cdd9e7a07dc39cf581bb-3558ad62e70f9f6bfcfc.js","size":31236},{"name":"component---src-pages-templates-workflow-tsx-10c8768c64c0db9f80c2.js","size":5141}],"filteredAssets":0,"assetsSize":46920,"filteredAuxiliaryAssets":3,"auxiliaryAssetsSize":225224}},"assetsByChunkName":{"app":["webpack-runtime-58c7cdd0abc723b6d241.js","styles.78a6e0759546d778358c.css","framework-2f7a9a83fd6996cb764f.js","app-482697764f835926dc92.js"],"component---src-pages-templates-404-tsx":["component---src-pages-templates-404-tsx-1ec7dcfded6e73efef91.js"],"component---src-pages-templates-blog-by-author-tsx":["c294adedbbc0a5c4b071b27a5ffb97a116928d98-999e28291726a2c54e70.js","component---src-pages-templates-blog-by-author-tsx-fb7314d489c2682e7da0.js"],"component---src-pages-templates-blog-by-hashtag-tsx":["c294adedbbc0a5c4b071b27a5ffb97a116928d98-999e28291726a2c54e70.js","component---src-pages-templates-blog-by-hashtag-tsx-2076682d0e3e44045f00.js"],"component---src-pages-templates-blog-tsx":["c294adedbbc0a5c4b071b27a5ffb97a116928d98-999e28291726a2c54e70.js","component---src-pages-templates-blog-tsx-ae37a37910d4ce46256c.js"],"component---src-pages-templates-index-tsx":["styles.78a6e0759546d778358c.css","c294adedbbc0a5c4b071b27a5ffb97a116928d98-999e28291726a2c54e70.js","71598b7b9331211c5dc2cdd9e7a07dc39cf581bb-3558ad62e70f9f6bfcfc.js","dbbdfb320c5007a40fa91453221d77dae72f3b83-00be99e431fb904367c1.js","component---src-pages-templates-index-tsx-c79944ee44040195a3eb.js"],"component---src-pages-templates-policies-tsx":["component---src-pages-templates-policies-tsx-359925d45492160d5e8b.js"],"component---src-pages-templates-post-tsx":["c294adedbbc0a5c4b071b27a5ffb97a116928d98-999e28291726a2c54e70.js","component---src-pages-templates-post-tsx-f41bd2e7c5e393acf3b9.js"],"component---src-pages-templates-project-tsx":["styles.78a6e0759546d778358c.css","c294adedbbc0a5c4b071b27a5ffb97a116928d98-999e28291726a2c54e70.js","dbbdfb320c5007a40fa91453221d77dae72f3b83-00be99e431fb904367c1.js","component---src-pages-templates-project-tsx-0f155fa91f86221dfd2e.js"],"component---src-pages-templates-projects-tsx":["c294adedbbc0a5c4b071b27a5ffb97a116928d98-999e28291726a2c54e70.js","component---src-pages-templates-projects-tsx-05e1354e259380d8d7ed.js"],"component---src-pages-templates-services-tsx":["c294adedbbc0a5c4b071b27a5ffb97a116928d98-999e28291726a2c54e70.js","71598b7b9331211c5dc2cdd9e7a07dc39cf581bb-3558ad62e70f9f6bfcfc.js","dbbdfb320c5007a40fa91453221d77dae72f3b83-00be99e431fb904367c1.js","component---src-pages-templates-services-tsx-e4d2d12096012ba30740.js"],"component---src-pages-templates-workflow-tsx":["c294adedbbc0a5c4b071b27a5ffb97a116928d98-999e28291726a2c54e70.js","71598b7b9331211c5dc2cdd9e7a07dc39cf581bb-3558ad62e70f9f6bfcfc.js","component---src-pages-templates-workflow-tsx-10c8768c64c0db9f80c2.js"]},"childAssetsByChunkName":{}} \ No newline at end of file diff --git a/workflow/index.html b/workflow/index.html index cafcc589..77118b0e 100644 --- a/workflow/index.html +++ b/workflow/index.html @@ -9,6 +9,6 @@ - \ No newline at end of file + \ No newline at end of file